diff --git a/.github/workflows/ci-actions.yml b/.github/workflows/ci-actions.yml index 96a78071..b67e2834 100644 --- a/.github/workflows/ci-actions.yml +++ b/.github/workflows/ci-actions.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - GOVER: ['1.24', '1.23'] + GOVER: ['1.26'] steps: - name: Checkout uses: actions/checkout@v4 @@ -47,7 +47,7 @@ jobs: runs-on: ubuntu-24.04-arm strategy: matrix: - GOVER: ['1.24', '1.23'] + GOVER: ['1.26'] steps: - uses: actions/checkout@v4 - name: Setup Go-${{ matrix.GOVER }} @@ -68,7 +68,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.24' + go-version: '1.26' - name: Build as Static run: make circl_static - name: Build as Plugin @@ -84,7 +84,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.24' + go-version: '1.26' - name: Produce Coverage run: go test -coverprofile=./coverage.txt ./... - name: Upload Codecov @@ -106,7 +106,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.24' + go-version: '1.26' - name: Building run: go build -v ./... - name: Testing @@ -125,7 +125,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.24' + go-version: '1.26' - name: Initialize CodeQL uses: github/codeql-action/init@v3 with: diff --git a/.github/workflows/webassembly-library-release.yaml b/.github/workflows/webassembly-library-release.yaml index b8b1822e..51c6da48 100644 --- a/.github/workflows/webassembly-library-release.yaml +++ b/.github/workflows/webassembly-library-release.yaml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 with: - go-version: '1.25.3' + go-version: '1.26.3' - name: Create build folder run: | mkdir ${{ github.workspace }}/build diff --git a/README.md b/README.md index 86dcc271..8cbcc941 100644 --- a/README.md +++ b/README.md @@ -56,19 +56,11 @@ Alternatively, look at the [Cloudflare Go](https://github.com/quantumcoinproject [RFC-7748]: https://doi.org/10.17487/RFC7748 [RFC-8032]: https://doi.org/10.17487/RFC8032 -[RFC-8235]: https://doi.org/10.17487/RFC8235 [RFC-9180]: https://doi.org/10.17487/RFC9180 -[RFC-9380]: https://doi.org/10.17487/RFC9380 -[RFC-9474]: https://doi.org/10.17487/RFC9474 -[RFC-9496]: https://doi.org/10.17487/RFC9496 -[RFC-9497]: https://doi.org/10.17487/RFC9497 [FIPS 202]: https://doi.org/10.6028/NIST.FIPS.202 [FIPS 204]: https://doi.org/10.6028/NIST.FIPS.204 [FIPS 205]: https://doi.org/10.6028/NIST.FIPS.205 [FIPS 186-5]: https://doi.org/10.6028/NIST.FIPS.186-5 -[BLS12-381]: https://electriccoin.co/blog/new-snark-curve/ -[ia.cr/2015/267]: https://ia.cr/2015/267 -[ia.cr/2019/966]: https://ia.cr/2019/966 ### Elliptic Curve Cryptography @@ -76,33 +68,16 @@ Alternatively, look at the [Cloudflare Go](https://github.com/quantumcoinproject |:---:| - [X25519](./dh/x25519) and [X448](./dh/x448) functions. ([RFC-7748]) -- [Curve4Q](./dh/curve4q) function based on FourQ curve. ([draft-ladd-cfrg-4q](https://datatracker.ietf.org/doc/draft-ladd-cfrg-4q/)) | Digital Signature Schemes | |:---:| -- [Ed25519](./sign/ed25519) and [Ed448](./sign/ed448) signatures. ([RFC-8032]) -- [BLS](./sign/bls) signatures. ([draft-irtf-cfrg-bls-signature](https://datatracker.ietf.org/doc/draft-irtf-cfrg-bls-signature/)) - -| Prime Groups | -|:---:| - - - [P-256, P-384, P-521](./group). ([FIPS 186-5]) - - [Ristretto](./group) group. ([RFC-9496]) - - [Bilinear pairings](./ecc/bls12381): with the [BLS12-381] curve, and hash to G1 and G2. - - [Hash to curve](./group), hash to field, XMD and XOF [expanders](./expander). ([RFC-9380]) +- [Ed25519](./sign/ed25519) signatures. ([RFC-8032]) | High-Level Protocols | |:---:| - [HPKE](./hpke): Hybrid Public-Key Encryption ([RFC-9180]) - - [VOPRF](./oprf): Verifiable Oblivious Pseudorandom functions. ([RFC-9497]) - - [RSA Blind Signatures](./blindsign/blindrsa). ([RFC-9474]) - - [Partially-blind](./blindsign/blindrsa/partiallyblindrsa/) RSA Signatures. ([draft-cfrg-partially-blind-rsa](https://datatracker.ietf.org/doc/draft-amjad-cfrg-partially-blind-rsa/)) - - [CPABE](./abe/cpabe): Ciphertext-Policy Attribute-Based Encryption. ([ia.cr/2019/966]) - - [OT](./ot/simot): Simplest Oblivious Transfer ([ia.cr/2015/267]). - - [Threshold RSA](./tss/rsa) Signatures ([Shoup Eurocrypt 2000](https://www.iacr.org/archive/eurocrypt2000/1807/18070209-new.pdf)). - - [Prio3](./vdaf/prio3) Verifiable Distributed Aggregation Function ([draft-irtf-cfrg-vdaf](https://datatracker.ietf.org/doc/draft-irtf-cfrg-vdaf/)). ### Post-Quantum Cryptography @@ -112,9 +87,6 @@ Alternatively, look at the [Cloudflare Go](https://github.com/quantumcoinproject - [ML-KEM](./kem/mlkem): modes 512, 768, 1024 ([FIPS-203](https://doi.org/10.6028/NIST.FIPS.203)). - [X-Wing](./kem/xwing) ([draft-connolly-cfrg-xwing-kem](https://datatracker.ietf.org/doc/draft-connolly-cfrg-xwing-kem/)). - [Kyber KEM](./kem/kyber): modes 512, 768, 1024 ([KYBER](https://pq-crystals.org/kyber/)). - - [FrodoKEM](./kem/frodo): modes 640-SHAKE. ([FrodoKEM](https://frodokem.org/)) - - [CSIDH](./dh/csidh): Post-Quantum Commutative Group Action ([CSIDH](https://csidh.isogeny.org/)). - - (**insecure, deprecated**) ~~[SIDH/SIKE](./kem/sike)~~: Supersingular Key Encapsulation with primes p434, p503, p751 ([SIKE](https://sike.org/)). | Digital Signature Schemes | |:---:| @@ -123,12 +95,6 @@ Alternatively, look at the [Cloudflare Go](https://github.com/quantumcoinproject - [ML-DSA](./sign/mldsa): modes 44, 65, 87 ([FIPS 204]). - [SLH-DSA](./sign/slhdsa): twelve parameter sets, pure and pre-hash signing ([FIPS 205]). -### Zero-knowledge Proofs - - - [Schnorr](./zk/dl): Prove knowledge of the Discrete Logarithm. ([RFC-8235]) - - [DLEQ](./zk/dleq): Prove knowledge of the Discrete Logarithm Equality. ([RFC-9497]) - - [DLEQ in Qn](./zk/qndleq): Prove knowledge of the Discrete Logarithm Equality for subgroup of squares in (Z/nZ)\*. - ### Symmetric Cryptography | XOF: eXtendable Output Functions | @@ -139,11 +105,6 @@ Alternatively, look at the [Cloudflare Go](https://github.com/quantumcoinproject - [KangarooTwelve](./xof/k12): fast hashing based on Keccak-p. ([KangarooTwelve](https://keccak.team/kangarootwelve.html)). - SIMD [Keccak](https://keccak.team/keccak_specs_summary.html) f1600 Permutation. -| LWC: Lightweight Cryptography | -|:---:| - -- [Ascon v1.2](./cipher/ascon): Family of AEAD block ciphers ([ASCON](https://ascon.iaik.tugraz.at/index.html)) - ### Misc | Integers | @@ -155,17 +116,7 @@ Alternatively, look at the [Cloudflare Go](https://github.com/quantumcoinproject | Finite Fields | |:---:| - - Fp25519, Fp448, Fp511, Fp434, Fp503, Fp751. - - Fp381, and its quadratic, sextic and twelveth extensions. - - Polynomials in monomial and Lagrange basis. - -| Elliptic Curves | -|:---:| - - - P-384 Curve - - [FourQ](https://eprint.iacr.org/2015/565) - - [Goldilocks](https://eprint.iacr.org/2015/625) - - [BLS12-381](https://electriccoin.co/blog/new-snark-curve/) + - Fp25519, Fp448. ## Testing and Benchmarking diff --git a/abe/cpabe/doc.go b/abe/cpabe/doc.go deleted file mode 100644 index c73b86da..00000000 --- a/abe/cpabe/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package cpabe provides Ciphertext-Policy Attribute-based Encryption algorithms. -package cpabe diff --git a/abe/cpabe/tkn20/bench_test.go b/abe/cpabe/tkn20/bench_test.go deleted file mode 100644 index 11a43f1d..00000000 --- a/abe/cpabe/tkn20/bench_test.go +++ /dev/null @@ -1,265 +0,0 @@ -package tkn20 - -import ( - "crypto/rand" - "crypto/rsa" - "crypto/x509" - "fmt" - "strconv" - "strings" - "testing" - - "golang.org/x/crypto/nacl/box" -) - -type abeTestCase struct { - desc string - attrs Attributes - policy Policy - msk SystemSecretKey - pk PublicKey -} - -var testCases []abeTestCase - -var ( - msg = []byte("drink your ovaltine now") - longMsg = []byte(strings.Repeat("a", 10000)) -) - -func generateAttrs() Attributes { - benchableAttrs := make(map[string]string, 50) - for i := 0; i < 50; i++ { - benchableAttrs["k"+strconv.Itoa(i)] = "v" + strconv.Itoa(i) - } - attrs := Attributes{} - attrs.FromMap(benchableAttrs) - return attrs -} - -func generatePolicy() string { - var policyBuilder strings.Builder - for i := 0; i < 50; i++ { - policyBuilder.WriteString("k") - policyBuilder.WriteString(strconv.Itoa(i)) - policyBuilder.WriteString(":v") - policyBuilder.WriteString(strconv.Itoa(i)) - if i != 49 { - if i%2 == 0 { - policyBuilder.WriteString(" and ") - } else { - policyBuilder.WriteString(" or ") - } - } - } - return policyBuilder.String() -} - -func init() { - smallPolicy := Policy{} - _ = smallPolicy.FromString("(k1:v1 or k1:v2) and not k2:v3") - smallAttrs := Attributes{} - smallAttrs.FromMap(map[string]string{"k1": "v2", "k2": "v4"}) - longPolicy := Policy{} - _ = longPolicy.FromString(generatePolicy()) - testCases = []abeTestCase{ - { - desc: "smallPolicy/Attrs", - attrs: smallAttrs, - policy: smallPolicy, - }, - { - desc: "longPolicy/Attrs", - attrs: generateAttrs(), - policy: longPolicy, - }, - } - var err error - for i := range testCases { - testCases[i].pk, testCases[i].msk, err = Setup(rand.Reader) - if err != nil { - panic(err) - } - } -} - -func BenchmarkTKN20KeyGen(b *testing.B) { - for _, tc := range testCases { - b.Run(fmt.Sprintf("keygen:%s", tc.desc), func(b *testing.B) { - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := tc.msk.KeyGen(rand.Reader, tc.attrs) - if err != nil { - b.Fatal(err) - } - } - }) - } -} - -func BenchmarkRSAKeyGen(b *testing.B) { - for i := 0; i < b.N; i++ { - _, err := rsa.GenerateKey(rand.Reader, 2048) - if err != nil { - b.Fatal(err) - } - } -} - -func BenchmarkX25519KeyGen(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _, err := box.GenerateKey(rand.Reader) - if err != nil { - b.Fatal(err) - } - } -} - -func BenchmarkTKN20Encrypt(b *testing.B) { - for _, tc := range testCases { - b.Run(fmt.Sprintf("encrypt:%s", tc.desc), func(b *testing.B) { - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := tc.pk.Encrypt(rand.Reader, tc.policy, msg) - if err != nil { - b.Fatal(err) - } - } - }) - } -} - -func BenchmarkRSAEncrypt(b *testing.B) { - privKey, err := rsa.GenerateKey(rand.Reader, 2048) - if err != nil { - b.Fatal(err) - } - pubKey := privKey.PublicKey - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := rsa.EncryptPKCS1v15(rand.Reader, &pubKey, msg) - if err != nil { - b.Fatal(err) - } - } -} - -func BenchmarkX25519Encrypt(b *testing.B) { - pubKey, _, err := box.GenerateKey(rand.Reader) - if err != nil { - b.Fatal(err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := box.SealAnonymous(nil, msg, pubKey, rand.Reader) - if err != nil { - b.Fatal(err) - } - } -} - -func BenchmarkTKN20Decrypt(b *testing.B) { - for _, tc := range testCases { - b.Run(fmt.Sprintf("decrypt:%s", tc.desc), func(b *testing.B) { - userKey, err := tc.msk.KeyGen(rand.Reader, tc.attrs) - if err != nil { - b.Fatal(err) - } - ciphertext, err := tc.pk.Encrypt(rand.Reader, tc.policy, msg) - if err != nil { - b.Fatal(err) - } - keyBytes, _ := userKey.MarshalBinary() - pubKeyBytes, _ := tc.pk.MarshalBinary() - // longCt is only benchmarked to measure size overhead - longCt, err := tc.pk.Encrypt(rand.Reader, tc.policy, longMsg) - if err != nil { - b.Fatal(err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err = userKey.Decrypt(ciphertext) - if err != nil { - b.Fatal(err) - } - } - b.ReportMetric(float64(len(pubKeyBytes)), "public_key_size") - b.ReportMetric(float64(len(keyBytes)), "attribute_secret_key_size") - b.ReportMetric(float64(len(ciphertext)-len(msg)), "ciphertext_bytes_overhead_32b_msg") - b.ReportMetric(float64(len(longCt)-len(longMsg)), "ciphertext_bytes_overhead_10kb_msg") - }) - } -} - -func BenchmarkRSADecrypt(b *testing.B) { - privKey, err := rsa.GenerateKey(rand.Reader, 2048) - if err != nil { - b.Fatal(err) - } - pubKey := privKey.PublicKey - ct, err := rsa.EncryptPKCS1v15(rand.Reader, &pubKey, msg) - if err != nil { - b.Fatal(err) - } - // longCt is only benchmarked to measure size overhead - longCt, err := rsaEncrypt(longMsg, &privKey.PublicKey) - if err != nil { - b.Fatal(err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := rsa.DecryptPKCS1v15(rand.Reader, privKey, ct) - if err != nil { - b.Fatal(err) - } - } - b.ReportMetric(float64(privKey.PublicKey.Size()), "public_key_size") - b.ReportMetric(float64(len(x509.MarshalPKCS1PrivateKey(privKey))), "secret_key_size") - b.ReportMetric(float64(len(ct)-len(msg)), "ciphertext_bytes_overhead") - b.ReportMetric(float64(len(longCt)-len(longMsg)), "ciphertext_bytes_overhead_10kb_msg") -} - -func BenchmarkX25519Decrypt(b *testing.B) { - pubKey, privKey, err := box.GenerateKey(rand.Reader) - if err != nil { - b.Fatal(err) - } - ct, err := box.SealAnonymous(nil, msg, pubKey, rand.Reader) - if err != nil { - b.Fatal(err) - } - // longCt is only benchmarked to measure size overhead - longCt, err := box.SealAnonymous(nil, longMsg, pubKey, rand.Reader) - if err != nil { - b.Fatal(err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, ok := box.OpenAnonymous(nil, ct, pubKey, privKey) - if !ok { - b.Fatal(err) - } - } - b.ReportMetric(float64(len(pubKey)), "public_key_size") - b.ReportMetric(float64(len(privKey)), "secret_key_size") - b.ReportMetric(float64(len(ct)-len(msg)), "ciphertext_bytes_overhead_32b_msg") - b.ReportMetric(float64(len(longCt)-len(longMsg)), "ciphertext_bytes_overhead_10kb_msg") -} - -func rsaEncrypt(data []byte, pubKey *rsa.PublicKey) ([]byte, error) { - chunkSize := 245 // Max chunk size for 2048 bit key with PKCS1v15 padding - var ct []byte - for len(data) > 0 { - if len(data) < chunkSize { - chunkSize = len(data) - } - chunk := data[:chunkSize] - data = data[chunkSize:] - encryptedChunk, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey, chunk) - if err != nil { - return nil, err - } - ct = append(ct, encryptedChunk...) - } - return ct, nil -} diff --git a/abe/cpabe/tkn20/example_test.go b/abe/cpabe/tkn20/example_test.go deleted file mode 100644 index e2a339f3..00000000 --- a/abe/cpabe/tkn20/example_test.go +++ /dev/null @@ -1,137 +0,0 @@ -package tkn20_test - -import ( - "bytes" - "crypto/rand" - "fmt" - "log" - "strconv" - - cpabe "github.com/quantumcoinproject/circl/abe/cpabe/tkn20" -) - -func checkPolicy(in map[string][]string) bool { - possiblePairs := map[string][]string{ - "occupation": {"wizard", "doctor", "ghost"}, - "country": {"US", "croatia"}, - "age": {}, - } - isValid := func(key string, value string) bool { - vs, ok := possiblePairs[key] - if !ok { - return false - } - if key == "age" { - age, err := strconv.Atoi(value) - if err != nil { - return false - } - if age < 13 || age > 100 { - return false - } - } else { - for _, v := range vs { - if value == v { - return true - } - } - } - return false - } - for k, v := range in { - for _, value := range v { - if !isValid(k, value) { - return false - } - } - } - return true -} - -func Example() { - policyStr := `(occupation: doctor) and (country: US)` - invalidPolicyStr := `(title: doctor) and (country: pacific)` - msgStr := `must have the precious 🎃` - wrongAttrsMap := map[string]string{"occupation": "doctor", "country": "croatia"} - rightAttrsMap := map[string]string{"occupation": "doctor", "country": "US", "age": "16"} - - publicKey, systemSecretKey, err := cpabe.Setup(rand.Reader) - if err != nil { - log.Fatalf("%s", err) - } - - policy := cpabe.Policy{} - err = policy.FromString(policyStr) - if err != nil { - log.Fatal(err) - } - if !checkPolicy(policy.ExtractAttributeValuePairs()) { - log.Fatalf("policy check failed for valid policy") - } - - fmt.Println(policy.String()) - invalidPolicy := cpabe.Policy{} - err = invalidPolicy.FromString(invalidPolicyStr) - if err != nil { - log.Fatal(err) - } - if checkPolicy(invalidPolicy.ExtractAttributeValuePairs()) { - log.Fatalf("policy check should fail for invalid policy") - } - - // encrypt the secret message for a given policy - ct, err := publicKey.Encrypt(rand.Reader, policy, []byte(msgStr)) - if err != nil { - log.Fatalf("%s", err) - } - fmt.Printf("plaintext size: %v bytes\n", len(msgStr)) - fmt.Printf("ciphertext size: %v bytes\n", len(ct)) - - // generate secret key for certain set of attributes - wrongAttrs := cpabe.Attributes{} - wrongAttrs.FromMap(wrongAttrsMap) - rightAttrs := cpabe.Attributes{} - rightAttrs.FromMap(rightAttrsMap) - - wrongSecretKey, _ := systemSecretKey.KeyGen(rand.Reader, wrongAttrs) - rightSecretKey, _ := systemSecretKey.KeyGen(rand.Reader, rightAttrs) - - wrongSat := policy.Satisfaction(wrongAttrs) - if wrongSat { - log.Fatalf("wrong attributes should not satisfy policy") - } - rightSat := policy.Satisfaction(rightAttrs) - if !rightSat { - log.Fatalf("right attributes should satisfy policy") - } - - // wrong attrs should not satisfy ciphertext - wrongCtSat := wrongAttrs.CouldDecrypt(ct) - if wrongCtSat { - log.Fatalf("wrong attrs should not satisfy ciphertext") - } - rightCtSat := rightAttrs.CouldDecrypt(ct) - if rightCtSat == false { - log.Fatalf("right attrs should satisfy ciphertext") - } - - // attempt to decrypt with wrong attributes should fail - pt, err := wrongSecretKey.Decrypt(ct) - if err == nil { - log.Fatalf("decryption using wrong attrs should have failed, plaintext: %s", pt) - } - - pt, err = rightSecretKey.Decrypt(ct) - if err != nil { - log.Fatalf("decryption using right attrs should have succeeded, plaintext: %s", pt) - } - if !bytes.Equal(pt, []byte(msgStr)) { - log.Fatalf("recovered plaintext: %s is not equal to original msg: %s", pt, msgStr) - } - fmt.Println("Successfully recovered plaintext") - // Output: - // (occupation:doctor and country:US) - // plaintext size: 27 bytes - // ciphertext size: 2747 bytes - // Successfully recovered plaintext -} diff --git a/abe/cpabe/tkn20/format_test.go b/abe/cpabe/tkn20/format_test.go deleted file mode 100644 index 35b64e74..00000000 --- a/abe/cpabe/tkn20/format_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package tkn20 - -import ( - "os" - "testing" -) - -func TestPublicKeyFormat(t *testing.T) { - paramsData, err := os.ReadFile("testdata/publicKey") - if err != nil { - t.Fatalf("Unable to read public key") - } - pp := &PublicKey{} - err = pp.UnmarshalBinary(paramsData) - if err != nil { - t.Fatalf("unable to parse public key") - } -} - -func TestSystemSecretKeyFormat(t *testing.T) { - secret, err := os.ReadFile("testdata/secretKey") - if err != nil { - t.Fatalf("Unable to read secret key") - } - sk := &SystemSecretKey{} - err = sk.UnmarshalBinary(secret) - if err != nil { - t.Fatalf("unable to parse system secret key") - } -} - -func TestAttributeKeyFormat(t *testing.T) { - attributeKey, err := os.ReadFile("testdata/attributeKey") - if err != nil { - t.Fatalf("Unable to read secret key") - } - sk := &AttributeKey{} - err = sk.UnmarshalBinary(attributeKey) - if err != nil { - t.Fatalf("unable to parse secret key") - } -} - -func TestCiphertext_v137(t *testing.T) { - // As of v1.3.8 ciphertext format changed to use wider prefixes. - // Ciphertexts in the previous format are still decryptable. - // The following functions are backwards-compatible: - // - AttributeKey.Decrypt - // - Attributes.CouldDecrypt - // - Policy.ExtractFromCiphertext - testCiphertext(t, "testdata/ciphertext_v137") -} - -func TestCiphertext(t *testing.T) { - testCiphertext(t, "testdata/ciphertext") -} - -func testCiphertext(t *testing.T, ctName string) { - t.Logf("Checking ciphertext: %v\n", ctName) - ciphertext, err := os.ReadFile(ctName) - if err != nil { - t.Fatalf("Unable to read ciphertext data") - } - attributeKey, err := os.ReadFile("testdata/attributeKey") - if err != nil { - t.Fatalf("Unable to read secret key") - } - sk := AttributeKey{} - err = sk.UnmarshalBinary(attributeKey) - if err != nil { - t.Fatalf("unable to parse secret key") - } - attrs := Attributes{} - attrs.FromMap(map[string]string{"country": "NL", "EU": "true"}) - if !attrs.CouldDecrypt(ciphertext) { - t.Fatal("these attributes will be unable to decrypt message") - } - policy := Policy{} - err = policy.FromString("EU: true") - if err != nil { - t.Fatal("error creating policy from string") - } - gotPolicy := new(Policy) - err = gotPolicy.ExtractFromCiphertext(ciphertext) - if err != nil { - t.Fatal("error extracting policy from ciphertext") - } - if !policy.Equal(gotPolicy) { - t.Fatal("ciphertext's policy mismatches the original policy") - } - msg, err := sk.Decrypt(ciphertext) - if err != nil { - t.Fatal("unable to decrypt message") - } - if string(msg) != "Be sure to drink your ovaltine!" { - t.Fatal("message incorrect") - } -} diff --git a/abe/cpabe/tkn20/gen_testdata.go b/abe/cpabe/tkn20/gen_testdata.go deleted file mode 100644 index fc79bed8..00000000 --- a/abe/cpabe/tkn20/gen_testdata.go +++ /dev/null @@ -1,67 +0,0 @@ -//go:build ignore -// +build ignore - -// Generates golden files for tests. -package main - -import ( - "encoding" - "os" - - cpabe "github.com/quantumcoinproject/circl/abe/cpabe/tkn20" - "github.com/quantumcoinproject/circl/xof" -) - -func writeToFile(name string, data []byte) { - err := os.WriteFile("testdata/"+name, data, 0o644) - if err != nil { - panic(err) - } -} - -func dumpToFile(name string, m encoding.BinaryMarshaler) { - data, err := m.MarshalBinary() - if err != nil { - panic(err) - } - writeToFile(name, data) -} - -func main() { - // Using fixed PRNG for reproducibility, - prng := xof.SHAKE128.New() - - err := os.MkdirAll("testdata", 0o755) - if err != nil { - panic(err) - } - - publicParams, secretParams, err := cpabe.Setup(prng) - if err != nil { - panic(err) - } - - dumpToFile("publicKey", &publicParams) - dumpToFile("secretKey", &secretParams) - - attrs := cpabe.Attributes{} - attrs.FromMap(map[string]string{"country": "NL", "EU": "true"}) - - policy := cpabe.Policy{} - err = policy.FromString("EU: true") - if err != nil { - panic(err) - } - msg := []byte("Be sure to drink your ovaltine!") - ciphertext, err := publicParams.Encrypt(prng, policy, msg) - if err != nil { - panic(err) - } - writeToFile("ciphertext", ciphertext) - - key, err := secretParams.KeyGen(prng, attrs) - if err != nil { - panic(err) - } - dumpToFile("attributeKey", &key) -} diff --git a/abe/cpabe/tkn20/internal/dsl/ast.go b/abe/cpabe/tkn20/internal/dsl/ast.go deleted file mode 100644 index 92ba92ab..00000000 --- a/abe/cpabe/tkn20/internal/dsl/ast.go +++ /dev/null @@ -1,94 +0,0 @@ -package dsl - -import ( - "fmt" - - "github.com/quantumcoinproject/circl/abe/cpabe/tkn20/internal/tkn" -) - -var operators = map[string]int{ - "and": tkn.Andgate, - "or": tkn.Orgate, -} - -type attrValue struct { - value string - positive bool -} - -type attr struct { - key string - id int -} - -type gate struct { - op string - in1 attr - in2 attr - out attr -} - -type Ast struct { - wires map[attr]attrValue - gates []gate -} - -func (t *Ast) RunPasses() (*tkn.Policy, error) { - inputs, err := t.hashAttrValues() - if err != nil { - return nil, fmt.Errorf("attribute values could not be hashed: %s", err) - } - - gates, err := t.transformGates() - if err != nil { - return nil, fmt.Errorf("gates could not be converted into a formula: %s", err) - } - - return &tkn.Policy{ - Inputs: inputs, - F: tkn.Formula{Gates: gates}, - }, nil -} - -func (t *Ast) hashAttrValues() ([]tkn.Wire, error) { - wires := make([]tkn.Wire, len(t.wires)) - for k, v := range t.wires { - value := tkn.HashStringToScalar(AttrHashKey, v.value) - if value == nil { - return nil, fmt.Errorf("error on hashing") - } - wire := tkn.Wire{ - Label: k.key, - RawValue: v.value, - Value: value, - Positive: v.positive, - } - wires[k.id] = wire - } - return wires, nil -} - -func (t *Ast) transformGates() ([]tkn.Gate, error) { - lenGates := len(t.gates) - gates := make([]tkn.Gate, lenGates) - for i, g := range t.gates { - class, ok := operators[g.op] - if !ok { - return nil, fmt.Errorf("invalid operator %s", g.op) - } - wireIDs := [3]int{g.in1.id, g.in2.id, g.out.id} - for j, wireID := range wireIDs { - if wireID < 0 { - wireIDs[j] = -1*wireID + lenGates - } - } - gate := tkn.Gate{ - Class: class, - In0: wireIDs[0], - In1: wireIDs[1], - Out: wireIDs[2], - } - gates[i] = gate - } - return gates, nil -} diff --git a/abe/cpabe/tkn20/internal/dsl/dsl.go b/abe/cpabe/tkn20/internal/dsl/dsl.go deleted file mode 100644 index 9a988032..00000000 --- a/abe/cpabe/tkn20/internal/dsl/dsl.go +++ /dev/null @@ -1,19 +0,0 @@ -package dsl - -import "github.com/quantumcoinproject/circl/abe/cpabe/tkn20/internal/tkn" - -var AttrHashKey = []byte("attribute value hashing") - -func Run(source string) (*tkn.Policy, error) { - l := newLexer(source) - err := l.scanTokens() - if err != nil { - return nil, err - } - p := newParser(l.tokens) - ast, err := p.parse() - if err != nil { - return nil, err - } - return ast.RunPasses() -} diff --git a/abe/cpabe/tkn20/internal/dsl/dsl_test.go b/abe/cpabe/tkn20/internal/dsl/dsl_test.go deleted file mode 100644 index e29038a9..00000000 --- a/abe/cpabe/tkn20/internal/dsl/dsl_test.go +++ /dev/null @@ -1,144 +0,0 @@ -package dsl_test - -import ( - "errors" - "testing" - - "github.com/quantumcoinproject/circl/abe/cpabe/tkn20/internal/dsl" - "github.com/quantumcoinproject/circl/abe/cpabe/tkn20/internal/tkn" -) - -var testCases = []struct { - input string - output *tkn.Policy - err error -}{ - { - input: "", - err: errors.New("expected parentheses or literal"), - }, - { - input: "&", - err: errors.New("unexpected character(s): '&'"), - }, - { - input: "country: north korea", - err: errors.New("unexpected token korea, expected logical operator \"and\" or \"or\""), - }, - { - input: "(country: congo", - err: errors.New("expected ')' after expression"), - }, - { - input: "(country: china or taiwan)", - err: errors.New("expected parentheses or literal"), - }, - { - input: "not (planet: arakis", - err: errors.New("expected ')' after expression"), - }, - { - input: "ocean: indian and ship: rms titanic", - err: errors.New("unexpected token titanic, expected logical operator \"and\" or \"or\""), - }, - { - input: "not (spice: saffron and region: persia)", - output: &tkn.Policy{ - Inputs: []tkn.Wire{ - {Label: "spice", RawValue: "saffron", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "saffron"), Positive: false}, - {Label: "region", RawValue: "persia", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "persia"), Positive: false}, - }, - F: tkn.Formula{ - Gates: []tkn.Gate{ - {Class: tkn.Orgate, In0: 0, In1: 1, Out: 2}, - }, - }, - }, - }, - { - input: "not (spice: mace or spice: nutmeg)", - output: &tkn.Policy{ - Inputs: []tkn.Wire{ - {Label: "spice", RawValue: "mace", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "mace"), Positive: false}, - {Label: "spice", RawValue: "nutmeg", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "nutmeg"), Positive: false}, - }, - F: tkn.Formula{ - Gates: []tkn.Gate{ - {Class: tkn.Andgate, In0: 0, In1: 1, Out: 2}, - }, - }, - }, - }, - { - input: "((region: caribean)) or (not (((fruit: stonefruit and not flower: hibiscus) or spice: mace) and not (family: extracts or family: chilis)))", - output: &tkn.Policy{ - Inputs: []tkn.Wire{ - {Label: "region", RawValue: "caribean", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "caribean"), Positive: true}, - {Label: "fruit", RawValue: "stonefruit", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "stonefruit"), Positive: false}, - {Label: "flower", RawValue: "hibiscus", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "hibiscus"), Positive: true}, - {Label: "spice", RawValue: "mace", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "mace"), Positive: false}, - {Label: "family", RawValue: "extracts", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "extracts"), Positive: true}, - {Label: "family", RawValue: "chilis", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "chilis"), Positive: true}, - }, - F: tkn.Formula{ - Gates: []tkn.Gate{ - {Class: tkn.Orgate, In0: 1, In1: 2, Out: 6}, - {Class: tkn.Andgate, In0: 3, In1: 6, Out: 7}, - {Class: tkn.Orgate, In0: 4, In1: 5, Out: 8}, - {Class: tkn.Orgate, In0: 7, In1: 8, Out: 9}, - {Class: tkn.Orgate, In0: 0, In1: 9, Out: 10}, - }, - }, - }, - }, - { - input: "(9country8: france)", - output: &tkn.Policy{ - Inputs: []tkn.Wire{ - {Label: "9country8", RawValue: "france", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "france"), Positive: true}, - }, - F: tkn.Formula{ - Gates: []tkn.Gate{}, - }, - }, - }, - { - input: "((country : afghanistan) or (country: bactria)) and (not (king: alexander))", - output: &tkn.Policy{ - Inputs: []tkn.Wire{ - {Label: "country", RawValue: "afghanistan", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "afghanistan"), Positive: true}, - {Label: "country", RawValue: "bactria", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "bactria"), Positive: true}, - {Label: "king", RawValue: "alexander", Value: tkn.HashStringToScalar(dsl.AttrHashKey, "alexander"), Positive: false}, - }, - F: tkn.Formula{ - Gates: []tkn.Gate{ - {Class: tkn.Orgate, In0: 0, In1: 1, Out: 3}, - {Class: tkn.Andgate, In0: 3, In1: 2, Out: 4}, - }, - }, - }, - }, -} - -func TestDsl(t *testing.T) { - for _, test := range testCases { - t.Run("TestDsl:"+test.input, func(t *testing.T) { - a, err := dsl.Run(test.input) - if test.err == nil { - if err != nil { - t.Fatal(err) - } - if !a.Equal(test.output) { - t.Fatalf("incorrect attributes: expected %v, received: %v", test.output, a) - } - } else { - if err == nil { - t.Fatalf("this should fail") - } - if test.err.Error() != err.Error() { - t.Fatalf("incorrect error: expected: %v, received: %v", test.err, err) - } - } - }) - } -} diff --git a/abe/cpabe/tkn20/internal/dsl/expr.go b/abe/cpabe/tkn20/internal/dsl/expr.go deleted file mode 100644 index 4ba46aec..00000000 --- a/abe/cpabe/tkn20/internal/dsl/expr.go +++ /dev/null @@ -1,52 +0,0 @@ -package dsl - -type Expr interface { - Accept(ExprVisitor) -} - -type ExprVisitor interface { - visitBinary(binary Binary) - visitUnary(unary Unary) - visitGrouping(grouping Grouping) - visitLiteral(literal Literal) -} - -// Binary is used for And, Or -type Binary struct { - Left Expr - Operator Token - Right Expr - Output attr -} - -func (b Binary) Accept(visitor ExprVisitor) { - visitor.visitBinary(b) -} - -// Unary is used for Not -type Unary struct { - Operator Token - Right Expr -} - -func (u Unary) Accept(visitor ExprVisitor) { - visitor.visitUnary(u) -} - -// Grouping is used for LeftParen, RightParen -type Grouping struct { - Expr Expr -} - -func (g Grouping) Accept(visitor ExprVisitor) { - visitor.visitGrouping(g) -} - -type Literal struct { - Key attr - Value attrValue -} - -func (l Literal) Accept(visitor ExprVisitor) { - visitor.visitLiteral(l) -} diff --git a/abe/cpabe/tkn20/internal/dsl/interpreter.go b/abe/cpabe/tkn20/internal/dsl/interpreter.go deleted file mode 100644 index faf84124..00000000 --- a/abe/cpabe/tkn20/internal/dsl/interpreter.go +++ /dev/null @@ -1,26 +0,0 @@ -package dsl - -type Interpreter struct { - Literal -} - -func (i *Interpreter) Evaluate(expr Expr) Literal { - expr.Accept(i) - return i.Literal -} - -func (i *Interpreter) visitBinary(b Binary) { - i.Literal.Key = b.Output -} - -func (i *Interpreter) visitUnary(u Unary) { - i.Evaluate(u.Right) -} - -func (i *Interpreter) visitGrouping(g Grouping) { - g.Expr.Accept(i) -} - -func (i *Interpreter) visitLiteral(at Literal) { - i.Literal = at -} diff --git a/abe/cpabe/tkn20/internal/dsl/lexer.go b/abe/cpabe/tkn20/internal/dsl/lexer.go deleted file mode 100644 index be648ef7..00000000 --- a/abe/cpabe/tkn20/internal/dsl/lexer.go +++ /dev/null @@ -1,89 +0,0 @@ -package dsl - -import ( - "errors" - "fmt" - "strings" -) - -var keywords = map[string]string{ - "and": And, - "or": Or, - "not": Not, -} - -type Lexer struct { - source string - tokens []Token - start int - curr int - line int - hadError bool -} - -func newLexer(source string) Lexer { - return Lexer{ - source: source, - tokens: nil, - start: 0, - curr: 0, - line: 1, - hadError: false, - } -} - -func (l *Lexer) scanTokens() error { - errMsg := "unexpected character(s): " - for l.curr < len(l.source) { - l.start = l.curr - c := l.source[l.curr] - l.curr++ - switch c { - case '(': - l.addToken(LeftParen) - case ')': - l.addToken(RightParen) - case ':': - l.addToken(Colon) - case ' ', '\r', '\t': - case '\n': - l.line++ - default: - if isAlphaNumeric(c) { - l.identifier() - } else { - errMsg += fmt.Sprintf("'%s' ", string(c)) - l.hadError = true - } - } - } - l.addToken(EOF) - if l.hadError { - return errors.New(strings.TrimSpace(errMsg)) - } - return nil -} - -func (l *Lexer) addToken(tokenType string) { - token := Token{ - tokenType, - l.source[l.start:l.curr], - l.line, - } - l.tokens = append(l.tokens, token) -} - -func (l *Lexer) identifier() { - for l.curr < len(l.source) { - if isAlphaNumeric(l.source[l.curr]) { - l.curr++ - } else { - break - } - } - tokenType, ok := keywords[l.source[l.start:l.curr]] - if !ok { - tokenType = Identifier - } - l.addToken(tokenType) -} diff --git a/abe/cpabe/tkn20/internal/dsl/lexer_test.go b/abe/cpabe/tkn20/internal/dsl/lexer_test.go deleted file mode 100644 index 6bbf5c4d..00000000 --- a/abe/cpabe/tkn20/internal/dsl/lexer_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package dsl - -import ( - "errors" - "testing" -) - -func TestLexerErr(t *testing.T) { - l := newLexer("sleep: @)") - err := l.scanTokens() - expectedErr := errors.New("unexpected character(s): '@'") - if err == nil { - t.Fatalf("missing expected err %v", expectedErr) - } - if expectedErr.Error() != err.Error() { - t.Fatalf("incorrect error: expected %v, received %v", expectedErr, err) - } -} - -func TestLexer(t *testing.T) { - l := newLexer("(sleep \n: \nnice\n)") - err := l.scanTokens() - if err != nil { - t.Fatal(err) - } - - types := []string{LeftParen, Identifier, Colon, Identifier, RightParen, EOF} - - if len(l.tokens) != len(types) { - t.Fatalf("expected %d tokens, received: %v", len(types), len(l.tokens)) - } - for i, typ := range types { - if typ != l.tokens[i].Type { - t.Fatalf("expected token %s, received: %s", typ, l.tokens[i].Type) - } - } - - if l.tokens[2].Line != 2 { - t.Fatalf("expected line 2, received: %d", l.tokens[2].Line) - } - if l.tokens[3].Line != 3 { - t.Fatalf("expected line 3, received: %d", l.tokens[3].Line) - } -} diff --git a/abe/cpabe/tkn20/internal/dsl/parser.go b/abe/cpabe/tkn20/internal/dsl/parser.go deleted file mode 100644 index e1e72758..00000000 --- a/abe/cpabe/tkn20/internal/dsl/parser.go +++ /dev/null @@ -1,201 +0,0 @@ -package dsl - -import ( - "fmt" -) - -type Parser struct { - tokens []Token - curr int - wires map[attr]attrValue - gates []gate - negative bool -} - -func newParser(tokens []Token) Parser { - return Parser{ - tokens: tokens, - curr: 0, - wires: make(map[attr]attrValue), - gates: make([]gate, 0), - negative: false, - } -} - -func (p *Parser) parse() (Ast, error) { - _, err := p.expression() - if err != nil { - return Ast{}, err - } - return Ast{ - wires: p.wires, - gates: p.gates, - }, nil -} - -func (p *Parser) expression() (Expr, error) { - return p.or() -} - -func (p *Parser) or() (Expr, error) { - expr, err := p.and() - if err != nil { - return nil, err - } - - for p.tokens[p.curr].Type == Or { - orToken := p.tokens[p.curr] - p.curr++ - right, err := p.and() - if err != nil { - return nil, err - } - in1 := extractAttr(expr) - in2 := extractAttr(right) - newGate := gate{ - op: Or, - in1: in1, - in2: in2, - out: attr{ - key: "", - id: -(len(p.gates) + 1), - }, - } - if p.negative { - newGate.op = And - } - p.gates = append(p.gates, newGate) - - expr = Binary{ - Left: expr, - Operator: orToken, - Right: right, - Output: p.gates[len(p.gates)-1].out, - } - } - return expr, nil -} - -func (p *Parser) and() (Expr, error) { - expr, err := p.not() - if err != nil { - return nil, err - } - - for p.tokens[p.curr].Type == And { - andToken := p.tokens[p.curr] - p.curr++ - right, err := p.not() - if err != nil { - return nil, err - } - in1 := extractAttr(expr) - in2 := extractAttr(right) - newGate := gate{ - op: And, - in1: in1, - in2: in2, - out: attr{ - key: "", - id: -(len(p.gates) + 1), - }, - } - if p.negative { - newGate.op = Or - } - p.gates = append(p.gates, newGate) - - expr = Binary{ - Left: expr, - Operator: andToken, - Right: right, - Output: p.gates[len(p.gates)-1].out, - } - } - return expr, nil -} - -func (p *Parser) not() (Expr, error) { - if p.tokens[p.curr].Type == Not { - p.curr++ - currWires := make(map[attr]int) - for wire := range p.wires { - currWires[wire] = 1 - } - p.negative = !p.negative - right, err := p.not() - p.negative = !p.negative - if err != nil { - return nil, err - } - for k, v := range p.wires { - _, ok := currWires[k] - if !ok { - v.positive = !v.positive - p.wires[k] = v - } - } - return Unary{ - Operator: p.tokens[p.curr-1], - Right: right, - }, nil - } - - return p.primary() -} - -func (p *Parser) primary() (Expr, error) { - if p.tokens[p.curr].Type == LeftParen { - p.curr++ - expr, err := p.expression() - if err != nil { - return nil, err - } - if !(p.tokens[p.curr].Type == RightParen) { - return nil, fmt.Errorf("expected ')' after expression") - } - p.curr++ - return Grouping{ - Expr: expr, - }, nil - } - - if p.tokens[p.curr].Type == Identifier { - if p.tokens[p.curr+1].Type == Colon { - if p.tokens[p.curr+2].Type == Identifier { - nextToken := p.tokens[p.curr+3].Type - if (nextToken == Identifier) || - (nextToken == Colon) || - (nextToken == LeftParen) || - (nextToken == Not) { - return nil, fmt.Errorf( - "unexpected token %s, expected logical operator \"and\" or \"or\"", - p.tokens[p.curr+3].Lexeme) - } - key := p.tokens[p.curr] - value := p.tokens[p.curr+2] - currAttr := attr{ - key: key.Lexeme, - id: len(p.wires), - } - attrVal := attrValue{ - value: value.Lexeme, - positive: true, - } - p.wires[currAttr] = attrVal - p.curr += 3 - return Literal{ - Key: currAttr, - Value: attrVal, - }, nil - } - } - } - return nil, fmt.Errorf("expected parentheses or literal") -} - -func extractAttr(expr Expr) attr { - i := Interpreter{} - expr.Accept(&i) - return i.Literal.Key -} diff --git a/abe/cpabe/tkn20/internal/dsl/tokens.go b/abe/cpabe/tkn20/internal/dsl/tokens.go deleted file mode 100644 index 278451d1..00000000 --- a/abe/cpabe/tkn20/internal/dsl/tokens.go +++ /dev/null @@ -1,18 +0,0 @@ -package dsl - -const ( - LeftParen = "(" - RightParen = ")" - Colon = ":" - And = "and" - Or = "or" - Not = "not" - Identifier = "identifier" - EOF = "eof" -) - -type Token struct { - Type string - Lexeme string - Line int -} diff --git a/abe/cpabe/tkn20/internal/dsl/util.go b/abe/cpabe/tkn20/internal/dsl/util.go deleted file mode 100644 index 60f8bfc9..00000000 --- a/abe/cpabe/tkn20/internal/dsl/util.go +++ /dev/null @@ -1,15 +0,0 @@ -package dsl - -func isDigit(c uint8) bool { - return c >= '0' && c <= '9' -} - -func isAlpha(c uint8) bool { - return (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - c == '_' -} - -func isAlphaNumeric(c uint8) bool { - return isAlpha(c) || isDigit(c) -} diff --git a/abe/cpabe/tkn20/internal/tkn/bk.go b/abe/cpabe/tkn20/internal/tkn/bk.go deleted file mode 100644 index 501e9974..00000000 --- a/abe/cpabe/tkn20/internal/tkn/bk.go +++ /dev/null @@ -1,278 +0,0 @@ -package tkn - -import ( - "bytes" - "crypto/subtle" - "fmt" - "io" - - pairing "github.com/quantumcoinproject/circl/ecc/bls12381" - "golang.org/x/crypto/blake2b" -) - -// This file is based on the techniques in -// https://www.iacr.org/archive/pkc2011/65710074/65710074.pdf that -// apply the Boneh-Katz transform to Attribute based encryption. - -// Seed size is chosen based on the proof for BK transform -// (https://eprint.iacr.org/2004/261.pdf - page 12, theorem 2) to maintain the -// statistical hiding property. Their input is 448 bits -> 128 bits, -// whereas we require a seed size of 576 bits to ensure a 2^(-65) statistical difference -// for our output size of 256 bits. -const macKeySeedSize = 72 - -// As of v1.3.8, ciphertexts are prefixed with this string. -const CiphertextVersion = "v1.3.8" - -func blakeEncrypt(key []byte, msg []byte) ([]byte, error) { - xof, err := blake2b.NewXOF(blake2b.OutputLengthUnknown, key) - if err != nil { - return nil, err - } - keystream := make([]byte, len(msg)) - _, err = io.ReadFull(xof, keystream) - if err != nil { - return nil, err - } - - for i := 0; i < len(msg); i++ { - keystream[i] ^= msg[i] - } - return keystream, nil -} - -func blakeDecrypt(key []byte, msg []byte) ([]byte, error) { - return blakeEncrypt(key, msg) -} - -func blakeMac(key []byte, msg []byte) (tag []byte, err error) { - mac, err := blake2b.New256(key) - if err != nil { - return nil, err - } - mac.Write(msg) - tag = mac.Sum(nil) - return -} - -func expandSeed(seed []byte) (id []byte, macKey []byte, err error) { - h1, err := blake2b.New256(nil) - if err != nil { - return nil, nil, err - } - h1.Write([]byte("id computation hash")) - - h2, err := blake2b.New256(nil) - if err != nil { - return nil, nil, err - } - h2.Write([]byte("key computation hash")) - - h1.Write(seed) - h2.Write(seed) - id = h1.Sum(nil) - macKey = h2.Sum(nil) - return -} - -func DeriveAttributeKeysCCA(rand io.Reader, sp *SecretParams, attrs *Attributes) (*AttributesKey, error) { - realAttrs := transformAttrsBK(attrs) - return deriveAttributeKeys(rand, sp, realAttrs) -} - -func EncryptCCA(rand io.Reader, public *PublicParams, policy *Policy, msg []byte) ([]byte, error) { - seed := make([]byte, macKeySeedSize) - _, err := io.ReadFull(rand, seed) - if err != nil { - return nil, err - } - id, macKey, err := expandSeed(seed) - if err != nil { - return nil, err - } - - numid := &pairing.Scalar{} - numid.SetBytes(id) - - encPolicy := policy.transformBK(numid) - - header, encPoint, err := encapsulate(rand, public, encPolicy) - if err != nil { - return nil, err - } - // Send the policy that was not enhanced. The receiver will recover with the ID. - // This avoids a bug where we omit the check that the ID is correct - header.p = policy - C1, err := header.marshalBinary() - if err != nil { - return nil, err - } - env := make([]byte, len(seed)+len(msg)) - copy(env[0:len(seed)], seed) - copy(env[len(seed):], msg) - - encKey, err := encPoint.MarshalBinary() - if err != nil { - return nil, err - } - hashedEncKey := blake2b.Sum256(encKey) - - env, err = blakeEncrypt(hashedEncKey[:], env) - if err != nil { - return nil, err - } - macData := appendLen32Prefixed(nil, C1) - macData = appendLen32Prefixed(macData, env) - - tag, err := blakeMac(macKey, macData) - if err != nil { - return nil, err - } - - ret := append([]byte{}, []byte(CiphertextVersion)...) - ret = appendLenPrefixed(ret, id) - ret = appendLen32Prefixed(ret, macData) - ret = appendLenPrefixed(ret, tag) - - return ret, nil -} - -type rmLenPref = func([]byte) ([]byte, []byte, error) - -func checkCiphertextFormat(ciphertext []byte) (ct []byte, fn rmLenPref) { - const N = len(CiphertextVersion) - if bytes.Equal(ciphertext[0:N], []byte(CiphertextVersion)) { - return ciphertext[N:], removeLen32Prefixed - } - return ciphertext, removeLenPrefixed -} - -func DecryptCCA(ciphertext []byte, key *AttributesKey) ([]byte, error) { - rest, removeLenPrefixedVar := checkCiphertextFormat(ciphertext) - id, rest, err := removeLenPrefixed(rest) - if err != nil { - return nil, err - } - macData, rest, err := removeLenPrefixedVar(rest) - if err != nil { - return nil, err - } - tag, _, err := removeLenPrefixed(rest) - if err != nil { - return nil, err - } - C1, envRaw, err := removeLenPrefixedVar(macData) - if err != nil { - return nil, err - } - env, _, err := removeLenPrefixedVar(envRaw) - if err != nil { - return nil, err - } - - header := &ciphertextHeader{} - err = header.unmarshalBinary(C1) - if err != nil { - return nil, err - } - - numid := &pairing.Scalar{} - numid.SetBytes(id) - - header.p = header.p.transformBK(numid) - - encPoint, err := decapsulate(header, key) - if err != nil { - return nil, fmt.Errorf("error in decryption: %w", err) - } - encKey, err := encPoint.MarshalBinary() - if err != nil { - return nil, err - } - hashedEncKey := blake2b.Sum256(encKey) - - // Decrypt the envelope - decEnv, err := blakeDecrypt(hashedEncKey[:], env) - if err != nil { - return nil, err - } - if len(decEnv) < macKeySeedSize { - return nil, fmt.Errorf("envelope too short") - } - - seed := decEnv[0:macKeySeedSize] - ptx := make([]byte, len(decEnv)-macKeySeedSize) - compID, macKey, err := expandSeed(seed) - if err != nil { - return nil, err - } - compTag, err := blakeMac(macKey, macData) - if err != nil { - return nil, err - } - - // Now check that compTag = tag and compID = id - // We don't want to distinguish which fails. - tagMatch := subtle.ConstantTimeCompare(compTag, tag) - idMatch := subtle.ConstantTimeCompare(compID, id) - check := tagMatch & idMatch - if check == 1 { - copy(ptx, decEnv[macKeySeedSize:]) - return ptx, nil - } - return nil, fmt.Errorf("failure of decryption") -} - -func CouldDecrypt(ciphertext []byte, a *Attributes) bool { - rest, removeLenPrefixedVar := checkCiphertextFormat(ciphertext) - id, rest, err := removeLenPrefixed(rest) - if err != nil { - return false - } - macData, _, err := removeLenPrefixedVar(rest) - if err != nil { - return false - } - C1, _, err := removeLenPrefixedVar(macData) - if err != nil { - return false - } - - header := &ciphertextHeader{} - err = header.unmarshalBinary(C1) - if err != nil { - return false - } - - numid := &pairing.Scalar{} - numid.SetBytes(id) - - header.p = header.p.transformBK(numid) - realAttrs := transformAttrsBK(a) - _, err = header.p.Satisfaction(realAttrs) - return err == nil -} - -func (p *Policy) ExtractFromCiphertext(ct []byte) error { - rest, removeLenPrefixedVar := checkCiphertextFormat(ct) - _, rest, err := removeLenPrefixed(rest) - if err != nil { - return fmt.Errorf("invalid ciphertext") - } - macData, _, err := removeLenPrefixedVar(rest) - if err != nil { - return fmt.Errorf("invalid ciphertext") - } - C1, _, err := removeLenPrefixedVar(macData) - if err != nil { - return fmt.Errorf("invalid ciphertext") - } - - header := &ciphertextHeader{} - err = header.unmarshalBinary(C1) - if err != nil { - return fmt.Errorf("invalid ciphertext") - } - *p = *header.p - return nil -} diff --git a/abe/cpabe/tkn20/internal/tkn/bk_test.go b/abe/cpabe/tkn20/internal/tkn/bk_test.go deleted file mode 100644 index eda449e4..00000000 --- a/abe/cpabe/tkn20/internal/tkn/bk_test.go +++ /dev/null @@ -1,344 +0,0 @@ -package tkn - -import ( - "crypto/rand" - "testing" -) - -var encTestCases = []TestCase{ - { - &Policy{ - Inputs: []Wire{ - {"a", "", ToScalar(0), true}, - }, - F: Formula{ - Gates: []Gate{}, - }, - }, - &Attributes{ - "a": { - wild: false, - Value: ToScalar(0), - }, - }, - }, - { - &Policy{ - Inputs: []Wire{ - {"a", "", ToScalar(1), true}, - {"b", "", ToScalar(2), true}, - {"c", "", ToScalar(3), true}, - }, - F: Formula{ - Gates: []Gate{ - {Andgate, 0, 1, 3}, - {Andgate, 2, 3, 4}, - }, - }, - }, - &Attributes{ - "d": { - wild: false, - Value: ToScalar(4), - }, - "c": { - wild: false, - Value: ToScalar(3), - }, - "b": { - wild: false, - Value: ToScalar(2), - }, - "a": { - wild: false, - Value: ToScalar(1), - }, - }, - }, - { - &Policy{ - Inputs: []Wire{ - {"a", "", ToScalar(1), false}, - {"b", "", ToScalar(2), true}, - {"c", "", ToScalar(3), true}, - }, - F: Formula{ - Gates: []Gate{ - {Andgate, 0, 1, 3}, - {Andgate, 2, 3, 4}, - }, - }, - }, - &Attributes{ - "d": { - wild: false, - Value: ToScalar(4), - }, - "c": { - wild: false, - Value: ToScalar(3), - }, - "b": { - wild: false, - Value: ToScalar(2), - }, - "a": { - wild: false, - Value: ToScalar(2), - }, - }, - }, - { - &Policy{ - Inputs: []Wire{ - {"a", "", ToScalar(1), false}, - {"c", "", ToScalar(4), true}, - }, - F: Formula{ - Gates: []Gate{ - {Andgate, 0, 1, 2}, - }, - }, - }, - &Attributes{ - "d": { - wild: false, - Value: ToScalar(4), - }, - "c": { - wild: true, - Value: ToScalar(3), - }, - "b": { - wild: false, - Value: ToScalar(2), - }, - "a": { - wild: true, - Value: ToScalar(2), - }, - }, - }, - { - &Policy{ - Inputs: []Wire{ - {"a", "", ToScalar(1), true}, - {"b", "", ToScalar(2), true}, - {"c", "", ToScalar(3), true}, - }, - F: Formula{ - Gates: []Gate{ - {Andgate, 0, 1, 3}, - {Orgate, 2, 3, 4}, - }, - }, - }, - &Attributes{ - "d": { - wild: false, - Value: ToScalar(4), - }, - "c": { - wild: false, - Value: ToScalar(3), - }, - "b": { - wild: false, - Value: ToScalar(2), - }, - "a": { - wild: false, - Value: ToScalar(1), - }, - }, - }, - { - &Policy{ - Inputs: []Wire{ - {"blocked", "", ToScalar(1), false}, - {"secure", "", ToScalar(1), true}, - {"eu", "", ToScalar(1), true}, - {"us", "", ToScalar(1), true}, - }, - F: Formula{ - Gates: []Gate{ - {Orgate, 2, 3, 4}, - {Andgate, 0, 4, 5}, - {Andgate, 1, 5, 6}, - }, - }, - }, - &Attributes{ - "blocked": { - wild: false, - Value: ToScalar(0), - }, - "secure": { - wild: false, - Value: ToScalar(1), - }, - "us": { - wild: false, - Value: ToScalar(1), - }, - "irrelevantAttr": { - wild: false, - Value: ToScalar(1), - }, - }, - }, - { - &Policy{ - Inputs: []Wire{ - {"a", "", ToScalar(1), true}, - {"a", "", ToScalar(2), true}, - }, - F: Formula{ - Gates: []Gate{ - {Orgate, 0, 1, 2}, - }, - }, - }, - &Attributes{ - "a": { - false, - ToScalar(1), - }, - }, - }, - { - &Policy{ - Inputs: []Wire{ - {"a", "", ToScalar(1), true}, - {"a", "", ToScalar(2), true}, - }, - F: Formula{ - Gates: []Gate{ - {Orgate, 0, 1, 2}, - }, - }, - }, - &Attributes{ - "a": { - false, - ToScalar(2), - }, - }, - }, -} - -func TestEncryptionBk(t *testing.T) { - msg := []byte("drink your ovaltine") - - for _, suite := range encTestCases { - public, secret, err := GenerateParams(rand.Reader) - if err != nil { - t.Fatalf("error generating parameters: %s", err) - } - userKey, err := DeriveAttributeKeysCCA(rand.Reader, secret, suite.a) - if err != nil { - t.Fatalf("error generating Attribute keys: %s", err) - } - - ciphertext, err := EncryptCCA(rand.Reader, public, suite.p, msg) - if err != nil { - t.Fatalf("error encrypting: %s", err) - } - recovered, err := DecryptCCA(ciphertext, userKey) - if err != nil { - t.Fatalf("error decrypting: %s", err) - } - if string(recovered) != string(msg) { - t.Fatalf("expected: %s, got %s", string(recovered), string(msg)) - } - } -} - -var benchPolicy = &Policy{ - Inputs: []Wire{ - {"blocked", "", ToScalar(1), false}, - {"secure", "", ToScalar(1), true}, - {"eu", "", ToScalar(1), true}, - {"us", "", ToScalar(1), true}, - }, - F: Formula{ - Gates: []Gate{ - {Orgate, 2, 3, 4}, - {Andgate, 0, 4, 5}, - {Andgate, 1, 5, 6}, - }, - }, -} - -var benchAttrs = &Attributes{ - "blocked": { - wild: false, - Value: ToScalar(0), - }, - "secure": { - wild: false, - Value: ToScalar(1), - }, - "us": { - wild: false, - Value: ToScalar(1), - }, - "irrelevantAttr": { - wild: false, - Value: ToScalar(1), - }, -} - -func BenchmarkTkDecryption(b *testing.B) { - msg := []byte("drink your ovaltine") - - public, secret, err := GenerateParams(rand.Reader) - if err != nil { - b.Fatalf("error generating parameters: %s", err) - } - userKey, err := DeriveAttributeKeysCCA(rand.Reader, secret, benchAttrs) - if err != nil { - b.Fatalf("error generating Attribute keys: %s", err) - } - - ciphertext, err := EncryptCCA(rand.Reader, public, benchPolicy, msg) - if err != nil { - b.Fatalf("error encrypting: %s", err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err = DecryptCCA(ciphertext, userKey) - if err != nil { - b.Fatalf("mismatch: %s", err) - } - } -} - -func BenchmarkTkEncryption(b *testing.B) { - msg := []byte("drink your ovaltine") - public, _, err := GenerateParams(rand.Reader) - if err != nil { - b.Fatalf("error generating parameters: %s", err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := EncryptCCA(rand.Reader, public, benchPolicy, msg) - if err != nil { - b.Fatalf("error encrypting: %s", err) - } - } -} - -func BenchmarkTkDerivation(b *testing.B) { - _, secret, err := GenerateParams(rand.Reader) - if err != nil { - b.Fatalf("error generating parameters: %s", err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := DeriveAttributeKeysCCA(rand.Reader, secret, benchAttrs) - if err != nil { - b.Fatalf("error generating Attribute keys: %s", err) - } - } -} diff --git a/abe/cpabe/tkn20/internal/tkn/formula.go b/abe/cpabe/tkn20/internal/tkn/formula.go deleted file mode 100644 index fc6a1c86..00000000 --- a/abe/cpabe/tkn20/internal/tkn/formula.go +++ /dev/null @@ -1,318 +0,0 @@ -package tkn - -import ( - "encoding/binary" - "fmt" - "io" -) - -const ( - Andgate = iota - Orgate -) - -// Gate is a Gate in a monotone boolean formula. -type Gate struct { - Class int // either Andgate or Orgate - In0 int // numbering of wires - In1 int - Out int -} - -func (g Gate) operator() string { - switch g.Class { - case Andgate: - return "and" - case Orgate: - return "or" - default: - return "unknown" - } -} - -// Formula represents a monotone boolean circuit with Inputs not -// repeated. The representation is as follows: for n Gates there n+1 -// input wires, 1 output Wire, and n-1 intermediate wires. That's -// because there are 2n Inputs to all Gates and n outputs since every -// Gate is 2:1. -// -// The wires are conceptually in an array. Wires 0 through n are -// the input wires, and Wire 2n is the output Wire. If there are wires -// between n and 2n they are intermediate wires. -// -// All intermediate and input wires must be used exactly once as Inputs. -type Formula struct { - Gates []Gate -} - -func (g Gate) Equal(g2 Gate) bool { - if (g.Class != g2.Class) || (g.Out != g2.Out) { - return false - } - if g.In0 == g2.In0 && g.In1 == g2.In1 { - return true - } - if g.In0 == g2.In1 && g.In1 == g2.In0 { - return true - } - return false -} - -func (f *Formula) MarshalBinary() ([]byte, error) { - n := len(f.Gates) - ret := make([]byte, 2+7*n) - binary.LittleEndian.PutUint16(ret, uint16(len(f.Gates))) - for i := 0; i < n; i++ { - ret[7*i+2] = byte(f.Gates[i].Class) - binary.LittleEndian.PutUint16(ret[7*i+2+1:], uint16(f.Gates[i].In0)) - binary.LittleEndian.PutUint16(ret[7*i+2+3:], uint16(f.Gates[i].In1)) - binary.LittleEndian.PutUint16(ret[7*i+2+5:], uint16(f.Gates[i].Out)) - } - return ret, nil -} - -func (f *Formula) UnmarshalBinary(data []byte) error { - if len(data) < 2 { - return fmt.Errorf("too short data") - } - n := int(binary.LittleEndian.Uint16(data[0:2])) - f.Gates = make([]Gate, n) - for i := 0; i < n; i++ { - f.Gates[i].Class = int(data[7*i+2]) - f.Gates[i].In0 = int(binary.LittleEndian.Uint16(data[7*i+2+1:])) - f.Gates[i].In1 = int(binary.LittleEndian.Uint16(data[7*i+2+3:])) - f.Gates[i].Out = int(binary.LittleEndian.Uint16(data[7*i+2+5:])) - } - return nil -} - -func (f *Formula) wellformed() error { - // Check every Wire used once - n := len(f.Gates) - inputs := make([]bool, 2*n) // n+1 already, n-1 intermediates - outputs := make([]bool, n) - for i, gate := range f.Gates { - if gate.In0 > 2*n-1 || gate.In0 < 0 { - return fmt.Errorf("Gate %d has an Out of range In0", i) - } - if inputs[gate.In0] { - return fmt.Errorf("Gate %d has In0 that is already used", i) - } - inputs[gate.In0] = true - if gate.In1 > 2*n-1 || gate.In1 < 0 { - return fmt.Errorf("Gate %d has an Out of range In1", i) - } - if inputs[gate.In1] { - return fmt.Errorf("Gate %d has In1 that is already used", i) - } - inputs[gate.In1] = true - if gate.Out > 2*n || gate.Out < n+1 { - return fmt.Errorf("Gate %d has an Out of range Out", i) - } - outputs[gate.Out-(n+1)] = true - } - for i, wire := range inputs { - if !wire { - return fmt.Errorf("unused input Wire %d", i) - } - } - for i, wire := range outputs { - if !wire { - return fmt.Errorf("unused output Wire %d", i+(n+1)) - } - } - return nil -} - -// Sort the Gates so that Inputs are set before outputs. -func (f *Formula) toposort() error { - err := f.wellformed() - if err != nil { - return err - } - n := len(f.Gates) - if n == 0 { - return nil - } - // Intermediate wires are indexed after subtracting n+1 - outputGate := make([]int, n) // the Gate that sets this Wire - inputGate := make([]int, n) // the Gate that uses this intermediate Wire. - counts := make([]int, n) // the number of Inputs no yet output - queue := make([]int, 0, n) - reordered := make([]Gate, 0, n) - inputGate[n-1] = -1 // No Gate uses the output as input - - for i, gate := range f.Gates { - outputGate[gate.Out-(n+1)] = i - if gate.In0 > n { - inputGate[gate.In0-(n+1)] = i - counts[i]++ - } - if gate.In1 > n { - inputGate[gate.In1-(n+1)] = i - counts[i]++ - } - } - for i := 0; i < n; i++ { - if counts[i] == 0 { - queue = append(queue, i) - } - } - if len(queue) == 0 { - return fmt.Errorf("no starting gates") - } - for len(queue) > 0 { - reordered = append(reordered, f.Gates[queue[0]]) - next := inputGate[f.Gates[queue[0]].Out-(n+1)] - if next >= 0 { - counts[next]-- - if counts[next] == 0 { - queue = append(queue, next) - } - } - queue = queue[1:] - } - if len(reordered) != n { - return fmt.Errorf("not all gates were extracted. check for loops") - } - - f.Gates = reordered - return nil -} - -// Given a set of possible Inputs (not necessarily in order!) -// return a subset that satisfy the formula with no extras. -func (f *Formula) satisfaction(available []match) ([]match, error) { - err := f.toposort() - if err != nil { - return nil, err - } - n := len(f.Gates) - assignments := make([][]int, 2*n+1) - for _, match := range available { - assignments[match.wire] = []int{match.wire} - } - for _, gate := range f.Gates { - switch gate.Class { - case Andgate: - if assignments[gate.In0] == nil || assignments[gate.In1] == nil { - assignments[gate.Out] = nil - } else { - assignments[gate.Out] = make([]int, 0, len(assignments[gate.In0])+len(assignments[gate.In1])) - assignments[gate.Out] = append(assignments[gate.Out], assignments[gate.In0]...) - assignments[gate.Out] = append(assignments[gate.Out], assignments[gate.In1]...) - } - case Orgate: - if assignments[gate.In0] == nil && assignments[gate.In1] == nil { - assignments[gate.Out] = nil - } else { - assignments[gate.Out] = assignments[gate.In0] - if assignments[gate.Out] == nil { - assignments[gate.Out] = assignments[gate.In1] - } - if (len(assignments[gate.In1]) < len(assignments[gate.Out])) && assignments[gate.In1] != nil { - assignments[gate.Out] = assignments[gate.In1] - } - } - default: - return nil, fmt.Errorf("unmatched case") - } - } - if assignments[2*n] == nil { - return nil, fmt.Errorf("no satisfying assignment") - } - ret := make([]match, 0) - for _, wire := range assignments[2*n] { - for _, match := range available { - if match.wire == wire { - ret = append(ret, match) - } - } - } - return ret, nil -} - -// share distributes an input into shares for a secret sharing system -// for the formula: the original vector can be recovered from shares -// that satisfy the formula, by adding them all up. -func (f *Formula) share(rand io.Reader, k *matrixZp) ([]*matrixZp, error) { - err := f.toposort() - if err != nil { - return nil, err - } - n := len(f.Gates) - shares := make([]*matrixZp, 2*n+1) - // Reverse order: we want to set the share of the output ahead of the Inputs - shares[2*n] = k - for i := len(f.Gates) - 1; i >= 0; i-- { - gate := f.Gates[i] - switch gate.Class { - case Andgate: - shares[gate.In0], err = randomMatrixZp(rand, k.rows, k.cols) - if err != nil { - return nil, err - } - shares[gate.In1] = newMatrixZp(k.rows, k.cols) - shares[gate.In0].sub(shares[gate.Out], shares[gate.In1]) - - case Orgate: - shares[gate.In0] = newMatrixZp(k.rows, k.cols) - shares[gate.In0].set(shares[gate.Out]) - shares[gate.In1] = newMatrixZp(k.rows, k.cols) - shares[gate.In1].set(shares[gate.Out]) - } - } - return shares[0 : n+1], nil -} - -// insertAnd adds and Gate for a new input -func (f *Formula) insertAnd() Formula { - // Let n=3 - // The old Inputs are 0, 1, 2, 3. - // Old intermediates 4, 5, - // Old output 6. - // The old Inputs are Inputs 0,1,2,3 and new input 4 - // Intermediates are all shifted up by 1: 5, 6 - // Old output is also shifted up but is the intermediate 7 - // New output 8. - n := len(f.Gates) - gates := make([]Gate, len(f.Gates)+1) - newInput := func(in int) int { - if in > n { - return in + 1 - } else { - return in - } - } - - for i := 0; i < n; i++ { - gates[i].Class = f.Gates[i].Class - gates[i].In0 = newInput(f.Gates[i].In0) - gates[i].In1 = newInput(f.Gates[i].In1) - gates[i].Out = f.Gates[i].Out + 1 - } - gates[n].Class = Andgate - // if there were zero gates, then In0 = 0, In1 = 1, Out = 2 - if n == 0 { - gates[n].In0 = n - } else { - gates[n].In0 = n + 1 - } - gates[n].In1 = 2*n + 1 - gates[n].Out = 2*n + 2 - return Formula{ - Gates: gates, - } -} - -func (f *Formula) Equal(g Formula) bool { - if len(f.Gates) != len(g.Gates) { - return false - } - for i := 0; i < len(f.Gates); i++ { - if !f.Gates[i].Equal(g.Gates[i]) { - return false - } - } - return true -} diff --git a/abe/cpabe/tkn20/internal/tkn/formula_test.go b/abe/cpabe/tkn20/internal/tkn/formula_test.go deleted file mode 100644 index 98d20f74..00000000 --- a/abe/cpabe/tkn20/internal/tkn/formula_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package tkn - -import ( - "crypto/rand" - "testing" -) - -func TestShare(t *testing.T) { - f := Formula{ - Gates: []Gate{ - {Andgate, 2, 3, 4}, - {Andgate, 0, 1, 3}, - }, - } - k, err := randomMatrixZp(rand.Reader, 1, 17) - if err != nil { - t.Fatalf("error generating vector: %s", err) - } - res, err := f.share(rand.Reader, k) - if err != nil { - t.Fatalf("error sharing: %s", err) - } - if len(res) != 3 { - t.Errorf("res wrong size") - } - acc := newMatrixZp(1, 17) - for i := 0; i < len(res); i++ { - acc.add(acc, res[i]) - } - if !acc.Equal(k) { - t.Errorf("incorrect share") - } -} - -func TestFormulaMarshal(t *testing.T) { - f := Formula{ - Gates: []Gate{ - {Andgate, 0, 1, 3}, - {Andgate, 2, 3, 4}, - }, - } - data, err := f.MarshalBinary() - if err != nil { - t.Fatalf("error marshalling: %s", err) - } - g := &Formula{} - err = g.UnmarshalBinary(data) - if err != nil { - t.Fatalf("error unmarshalling: %s", err) - } - if !f.Equal(*g) { - t.Fatal("failure to recover formula") - } -} diff --git a/abe/cpabe/tkn20/internal/tkn/matrixG1.go b/abe/cpabe/tkn20/internal/tkn/matrixG1.go deleted file mode 100644 index e8f3c51f..00000000 --- a/abe/cpabe/tkn20/internal/tkn/matrixG1.go +++ /dev/null @@ -1,251 +0,0 @@ -package tkn - -import ( - "encoding/binary" - "fmt" - "io" - - pairing "github.com/quantumcoinproject/circl/ecc/bls12381" -) - -// matrixG1 represents a matrix of G1 elements. They are stored in row-major order. -type matrixG1 struct { - rows int - cols int - entries []pairing.G1 -} - -func (m *matrixG1) marshalBinary() ([]byte, error) { - ret := make([]byte, 4+pairing.G1Size*m.rows*m.cols) - binary.LittleEndian.PutUint16(ret[0:], uint16(m.rows)) - binary.LittleEndian.PutUint16(ret[2:], uint16(m.cols)) - for i := 0; i < m.rows*m.cols; i++ { - pt := m.entries[i].Bytes() - if !m.entries[i].IsOnG1() { - return nil, fmt.Errorf("matrixG1: illegal serialization attempt") - } - if len(pt) != pairing.G1Size { - panic("matrixG1: incorrect assumption of size") - } - copy(ret[pairing.G1Size*i+4:], pt) - } - return ret, nil -} - -func (m *matrixG1) unmarshalBinary(data []byte) error { - if len(data) < 4 { - return fmt.Errorf("matrixG1 deserialization failure: input too short") - } - m.rows = int(binary.LittleEndian.Uint16(data[0:])) - m.cols = int(binary.LittleEndian.Uint16(data[2:])) - data = data[4:] - if len(data) != pairing.G1Size*m.rows*m.cols { - return fmt.Errorf("matrixG1 deserialization failure: invalid entries length: expected %d, actual %d", - pairing.G1Size*m.cols*m.rows, - len(data)) - } - m.entries = make([]pairing.G1, m.rows*m.cols) - var err error - for i := 0; i < m.rows*m.cols; i++ { - err = m.entries[i].SetBytes(data[pairing.G1Size*i : pairing.G1Size*(i+1)]) - if err != nil { - return fmt.Errorf("matrixG1 deserialization failure: error from bytes %v: %w", - data[pairing.G1Size*i:pairing.G1Size*(i+1)], - err) - } - } - return nil -} - -// We write addition for each of these, multiplication by scalars, and action on both -// sides? - -// exp computes the naive matrix exponential of a with respect to the basepoint. -func (m *matrixG1) exp(a *matrixZp) { - basepoint := pairing.G1Generator() - m.resize(a.rows, a.cols) - for i := 0; i < m.rows*m.cols; i++ { - m.entries[i].ScalarMult(&a.entries[i], basepoint) - } -} - -// resize only changes the matrix if we have to -func (m *matrixG1) resize(r int, c int) { - if m.rows != r || m.cols != c { - m.rows = r - m.cols = c - m.entries = make([]pairing.G1, m.rows*m.cols) - } -} - -// clear sets a matrix to the all zero matrix -func (m *matrixG1) clear() { - for i := 0; i < len(m.entries); i++ { - m.entries[i].SetIdentity() - } -} - -// conformal returns true iff m and a have the same dimensions. -func (m *matrixG1) conformal(a *matrixG1) bool { - return a.rows == m.rows && a.cols == m.cols -} - -// Equal returns true if m == b. -func (m *matrixG1) Equal(b *matrixG1) bool { - if !m.conformal(b) { - return false - } - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - if !m.entries[i*m.cols+j].IsEqual(&b.entries[i*b.cols+j]) { - return false - } - } - } - return true -} - -// set sets m to a. -func (m *matrixG1) set(a *matrixG1) { - m.resize(a.rows, a.cols) - for i := 0; i < m.rows*m.cols; i++ { - m.entries[i] = a.entries[i] - } -} - -// add sets m to a+b. -func (m *matrixG1) add(a *matrixG1, b *matrixG1) { - if !a.conformal(b) { - panic(errBadMatrixSize) - } - m.resize(a.rows, a.cols) - for i := 0; i < m.rows*m.cols; i++ { - m.entries[i].Add(&a.entries[i], &b.entries[i]) - } -} - -// sub sets m to a-b. -func (m *matrixG1) sub(a *matrixG1, b *matrixG1) { - if !a.conformal(b) { - panic(errBadMatrixSize) - } - m.resize(a.rows, a.cols) - for i := 0; i < m.rows*m.cols; i++ { - t := b.entries[i] - t.Neg() - m.entries[i].Add(&a.entries[i], &t) - } -} - -// leftMult multiples a*b with a matrixZp, b matrixG1. -func (m *matrixG1) leftMult(a *matrixZp, b *matrixG1) { - if a.cols != b.rows { - panic(errBadMatrixSize) - } - if b == m { - c := newMatrixG1(0, 0) - c.set(b) - b = c - } - m.resize(a.rows, b.cols) - m.clear() - var t pairing.G1 - t.SetIdentity() - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - for k := 0; k < a.cols; k++ { - t.ScalarMult(&a.entries[i*a.cols+k], &b.entries[k*b.cols+j]) - m.entries[i*m.cols+j].Add(&m.entries[i*m.cols+j], &t) - } - } - } -} - -// rightMult multiplies a*b with a matrixG1, b matrixZp. -func (m *matrixG1) rightMult(a *matrixG1, b *matrixZp) { - if a.cols != b.rows { - panic(errBadMatrixSize) - } - if a == m { - c := newMatrixG1(0, 0) - c.set(a) - a = c - } - m.resize(a.rows, b.cols) - m.clear() - var t pairing.G1 - t.SetIdentity() - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - for k := 0; k < a.cols; k++ { - t.ScalarMult(&b.entries[k*b.cols+j], &a.entries[i*a.cols+k]) - m.entries[i*m.cols+j].Add(&m.entries[i*m.cols+j], &t) - } - } - } -} - -// scalarMult sets m to c*a where c is a Scalar, -func (m *matrixG1) scalarMult(c *pairing.Scalar, a *matrixG1) { - m.resize(a.rows, a.cols) - for i := 0; i < len(a.entries); i++ { - m.entries[i].ScalarMult(c, &a.entries[i]) - } -} - -// copy creates and returns a new matrix that shares no storage with m -func (m *matrixG1) copy() *matrixG1 { - ret := new(matrixG1) - ret.resize(m.rows, m.cols) - for i := 0; i < m.rows*m.cols; i++ { - ret.entries[i] = m.entries[i] - } - return ret -} - -func newMatrixG1(r int, c int) *matrixG1 { - ret := new(matrixG1) - ret.resize(r, c) - ret.clear() - return ret -} - -func randomMatrixG1(rand io.Reader, r int, c int) (*matrixG1, error) { - a, err := randomMatrixZp(rand, r, c) - if err != nil { - return nil, err - } - ret := newMatrixG1(r, c) - ret.exp(a) - return ret, nil -} - -// oracle generates 3x2 matrices via the random oracle -func oracle(input []byte) (*matrixG1, *matrixG1) { - a := newMatrixG1(3, 2) - b := newMatrixG1(3, 2) - for i := 0; i < 3; i++ { - for j := 0; j < 2; j++ { - a.entries[i*a.cols+j].Hash(input, []byte(fmt.Sprintf("a matrix entry [%d, %d]", i, j))) - b.entries[i*b.cols+j].Hash(input, []byte(fmt.Sprintf("b matrix entry [%d, %d]", i, j))) - } - } - return a, b -} - -// transpose sets m to the transpose of a. -// Not aliasing safe -func (m *matrixG1) transpose(a *matrixG1) { - if m == a { - c := newMatrixG1(0, 0) - c.set(a) - a = c - } - m.resize(a.cols, a.rows) - - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - m.entries[i*m.cols+j] = a.entries[j*a.cols+i] - } - } -} diff --git a/abe/cpabe/tkn20/internal/tkn/matrixG1_test.go b/abe/cpabe/tkn20/internal/tkn/matrixG1_test.go deleted file mode 100644 index 17ba970a..00000000 --- a/abe/cpabe/tkn20/internal/tkn/matrixG1_test.go +++ /dev/null @@ -1,274 +0,0 @@ -package tkn - -import ( - "crypto/rand" - "testing" -) - -func TestRightMultLinearityG1(t *testing.T) { - zpMat1, err := randomMatrixZp(rand.Reader, 2, 3) - if err != nil { - t.Fatal(err) - } - zpMat2, err := randomMatrixZp(rand.Reader, 2, 3) - if err != nil { - t.Fatal(err) - } - zpMat1p2 := newMatrixZp(2, 3) - zpMat1p2.add(zpMat1, zpMat2) - a, err := randomMatrixG1(rand.Reader, 3, 2) - if err != nil { - t.Fatal(err) - } - s := newMatrixG1(3, 3) - u := newMatrixG1(3, 3) - r := newMatrixG1(3, 3) - tmp := newMatrixG1(3, 3) - r.rightMult(a, zpMat1) - s.rightMult(a, zpMat2) - u.rightMult(a, zpMat1p2) - tmp.add(r, s) - if !tmp.Equal(u) { - t.Fatal("failure of linearity") - } -} - -func TestLeftMultLinearityG1(t *testing.T) { - zpMat1, err := randomMatrixZp(rand.Reader, 3, 3) - if err != nil { - t.Fatal(err) - } - zpMat2, err := randomMatrixZp(rand.Reader, 3, 3) - if err != nil { - t.Fatal(err) - } - zpMat1p2 := newMatrixZp(3, 3) - zpMat1p2.add(zpMat1, zpMat2) - a, err := randomMatrixG1(rand.Reader, 3, 2) - if err != nil { - t.Fatal(err) - } - - s := newMatrixG1(0, 0) - u := newMatrixG1(0, 0) - r := newMatrixG1(0, 0) - tmp := newMatrixG1(0, 0) - r.leftMult(zpMat1, a) - s.leftMult(zpMat2, a) - u.leftMult(zpMat1p2, a) - tmp.add(r, s) - if !tmp.Equal(u) { - t.Fatal("failure of linearity") - } -} - -func TestLeftMultActionG1(t *testing.T) { - zpMat1, err := randomMatrixZp(rand.Reader, 3, 3) - if err != nil { - t.Fatal(err) - } - zpMat2, err := randomMatrixZp(rand.Reader, 3, 3) - if err != nil { - t.Fatal(err) - } - zpMat2m1 := newMatrixZp(3, 3) - zpMat2m1.mul(zpMat2, zpMat1) - a, err := randomMatrixG1(rand.Reader, 3, 2) - if err != nil { - t.Fatal(err) - } - s := newMatrixG1(0, 0) - u := newMatrixG1(0, 0) - r := newMatrixG1(0, 0) - r.leftMult(zpMat1, a) - s.leftMult(zpMat2, r) - u.leftMult(zpMat2m1, a) - if !s.Equal(u) { - t.Fatal("failure of action") - } -} - -func TestRightMultActionG1(t *testing.T) { - zpMat1, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - zpMat2, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - zpMat1m2 := newMatrixZp(2, 2) - zpMat1m2.mul(zpMat1, zpMat2) - a, err := randomMatrixG1(rand.Reader, 3, 2) - if err != nil { - t.Fatal(err) - } - s := newMatrixG1(0, 0) - u := newMatrixG1(0, 0) - r := newMatrixG1(0, 0) - r.rightMult(a, zpMat1) - s.rightMult(r, zpMat2) - u.rightMult(a, zpMat1m2) - if !s.Equal(u) { - t.Fatal("failure of action") - } -} - -func TestExpG1(t *testing.T) { - a, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - b, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - ab := newMatrixZp(2, 2) - ab.mul(a, b) - aexp := newMatrixG1(0, 0) - aexp.exp(a) - abexp := newMatrixG1(0, 0) - abexp.exp(ab) - bexp := newMatrixG1(0, 0) - bexp.exp(b) - - abres := newMatrixG1(0, 0) - abres.rightMult(aexp, b) - if !abres.Equal(abexp) { - t.Fatal("action and exp failure") - } - abres.leftMult(a, bexp) - if !abres.Equal(abexp) { - t.Fatal("left action and exp failure") - } -} - -func TestMarshalG1(t *testing.T) { - a, err := randomMatrixG1(rand.Reader, 7, 9) - if err != nil { - t.Fatal(err) - } - data, err := a.marshalBinary() - if err != nil { - t.Fatalf("failure to serialize: %s", err) - } - b := newMatrixG1(0, 0) - err = b.unmarshalBinary(data) - if err != nil { - t.Fatalf("failure to deserialize: %s", err) - } - if !a.Equal(b) { - t.Fatal("failure to roundtrip") - } - - // deserialize into non-empty struct - c, err := randomMatrixG1(rand.Reader, 1, 2) - if err != nil { - t.Fatal(err) - } - err = c.unmarshalBinary(data) - if err != nil { - t.Fatalf("failure to deserialize: %s", err) - } - if !a.Equal(c) { - t.Fatal("failure to roundtrip") - } -} - -func TestOracle(t *testing.T) { - a, b := oracle([]byte("kalliste")) - for i := 0; i < len(a.entries); i++ { - if !a.entries[i].IsOnG1() { - t.Fatalf("failure to be in group from oracle") - } - } - for i := 0; i < len(a.entries); i++ { - if !b.entries[i].IsOnG1() { - t.Fatalf("failure to be in group from oracle") - } - } -} - -func TestAliasLeftMult(t *testing.T) { - a, err := randomMatrixG1(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixZp(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixG1(4, 4) - aCopy.set(a) - bCopy := newMatrixZp(4, 4) - bCopy.set(b) - a.leftMult(b, a) - res := newMatrixG1(0, 0) - res.leftMult(bCopy, aCopy) - if !res.Equal(a) { - t.Fatalf("failure of leftMult to be alias safe") - } -} - -func TestAliasRightMult(t *testing.T) { - a, err := randomMatrixG1(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixZp(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixG1(4, 4) - aCopy.set(a) - bCopy := newMatrixZp(4, 4) - bCopy.set(b) - a.rightMult(a, b) - res := newMatrixG1(0, 0) - res.rightMult(aCopy, bCopy) - if !res.Equal(a) { - t.Fatalf("failure of rightMult to be alias safe") - } -} - -func TestAliasAdd(t *testing.T) { - a, err := randomMatrixG1(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixG1(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixG1(4, 4) - aCopy.set(a) - bCopy := newMatrixG1(4, 4) - bCopy.set(b) - a.add(b, a) - res := newMatrixG1(0, 0) - res.add(bCopy, aCopy) - if !res.Equal(a) { - t.Fatalf("failure of add to be alias safe") - } -} - -func TestAliasSub(t *testing.T) { - a, err := randomMatrixG1(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixG1(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixG1(4, 4) - aCopy.set(a) - bCopy := newMatrixG1(4, 4) - bCopy.set(b) - a.sub(b, a) - res := newMatrixG1(0, 0) - res.sub(bCopy, aCopy) - if !res.Equal(a) { - t.Fatalf("failure of sub to be alias safe") - } -} diff --git a/abe/cpabe/tkn20/internal/tkn/matrixG2.go b/abe/cpabe/tkn20/internal/tkn/matrixG2.go deleted file mode 100644 index 4ee34383..00000000 --- a/abe/cpabe/tkn20/internal/tkn/matrixG2.go +++ /dev/null @@ -1,182 +0,0 @@ -package tkn - -import ( - "encoding/binary" - "fmt" - "io" - - pairing "github.com/quantumcoinproject/circl/ecc/bls12381" -) - -// matrixG2 represents a matrix of G2 elements. They are stored in row-major order. -type matrixG2 struct { - rows int - cols int - entries []pairing.G2 -} - -func (m *matrixG2) marshalBinary() ([]byte, error) { - ret := make([]byte, 4+pairing.G2Size*m.rows*m.cols) - binary.LittleEndian.PutUint16(ret[0:], uint16(m.rows)) - binary.LittleEndian.PutUint16(ret[2:], uint16(m.cols)) - for i := 0; i < m.rows*m.cols; i++ { - pt := m.entries[i].Bytes() - if len(pt) != pairing.G2Size { - return nil, errBadMatrixSize - } - copy(ret[pairing.G2Size*i+4:], pt) - } - return ret, nil -} - -func (m *matrixG2) unmarshalBinary(data []byte) error { - if len(data) < 4 { - return fmt.Errorf("matrixG2 deserialization failure: input too short") - } - m.rows = int(binary.LittleEndian.Uint16(data[0:])) - m.cols = int(binary.LittleEndian.Uint16(data[2:])) - data = data[4:] - if len(data) != pairing.G2Size*m.rows*m.cols { - return fmt.Errorf("matrixG2 deserialization failure: invalid entries length: expected %d, actual %d", - pairing.G2Size*m.cols*m.rows, - len(data)) - } - m.entries = make([]pairing.G2, m.rows*m.cols) - var err error - for i := 0; i < m.rows*m.cols; i++ { - err = m.entries[i].SetBytes(data[pairing.G2Size*i : pairing.G2Size*(i+1)]) - if err != nil { - return fmt.Errorf("matrixG2 deserialization failure: error from bytes %v: %w", - data[pairing.G2Size*i:pairing.G2Size*(i+1)], - err) - } - } - return nil -} - -// exp computes the naive matrix exponential of a with respect to the basepoint. -func (m *matrixG2) exp(a *matrixZp) { - basepoint := pairing.G2Generator() - m.resize(a.rows, a.cols) - for i := 0; i < m.rows*m.cols; i++ { - m.entries[i].ScalarMult(&a.entries[i], basepoint) - } -} - -// clear sets m to the zero matrix -func (m *matrixG2) clear() { - for i := 0; i < len(m.entries); i++ { - m.entries[i].SetIdentity() - } -} - -// resize only changes the matrix if we have to -func (m *matrixG2) resize(r int, c int) { - if m.rows != r || m.cols != c { - m.rows = r - m.cols = c - m.entries = make([]pairing.G2, m.rows*m.cols) - } -} - -// conformal returns true iff m and a have the same dimensions. -func (m *matrixG2) conformal(a *matrixG2) bool { - return a.rows == m.rows && a.cols == m.cols -} - -// Equal returns true if m == b. -func (m *matrixG2) Equal(b *matrixG2) bool { - if !m.conformal(b) { - return false - } - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - if !m.entries[i*m.cols+j].IsEqual(&b.entries[i*b.cols+j]) { - return false - } - } - } - return true -} - -// set sets m to a. -func (m *matrixG2) set(a *matrixG2) { - m.resize(a.rows, a.cols) - for i := 0; i < m.rows*m.cols; i++ { - m.entries[i] = a.entries[i] - } -} - -// add sets m to a+b. -func (m *matrixG2) add(a *matrixG2, b *matrixG2) { - if !a.conformal(b) { - panic(errBadMatrixSize) - } - m.resize(a.rows, a.cols) - for i := 0; i < m.rows*m.cols; i++ { - m.entries[i].Add(&a.entries[i], &b.entries[i]) - } -} - -// leftMult multiples a*b with a matrixZp, b matrixG2. -func (m *matrixG2) leftMult(a *matrixZp, b *matrixG2) { - if a.cols != b.rows { - panic(errBadMatrixSize) - } - if m == b { - c := newMatrixG2(b.rows, b.cols) - c.set(b) - b = c - } - m.resize(a.rows, b.cols) - m.clear() - var tmp pairing.G2 - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - for k := 0; k < a.cols; k++ { - tmp.ScalarMult(&a.entries[i*a.cols+k], &b.entries[k*b.cols+j]) - m.entries[i*m.cols+j].Add(&m.entries[i*m.cols+j], &tmp) - } - } - } -} - -// rightMult multiplies a*b with a matrixG1, b matrixZp. -func (m *matrixG2) rightMult(a *matrixG2, b *matrixZp) { - if a.cols != b.rows { - panic(errBadMatrixSize) - } - if m == a { - c := newMatrixG2(a.rows, a.cols) - c.set(a) - a = c - } - m.resize(a.rows, b.cols) - m.clear() - var tmp pairing.G2 - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - for k := 0; k < a.cols; k++ { - tmp.ScalarMult(&b.entries[k*b.cols+j], &a.entries[i*a.cols+k]) - m.entries[i*m.cols+j].Add(&m.entries[i*m.cols+j], &tmp) - } - } - } -} - -func newMatrixG2(r int, c int) *matrixG2 { - ret := new(matrixG2) - ret.resize(r, c) - ret.clear() - return ret -} - -func randomMatrixG2(rand io.Reader, r int, c int) (*matrixG2, error) { - a, err := randomMatrixZp(rand, r, c) - if err != nil { - return nil, err - } - ret := newMatrixG2(r, c) - ret.exp(a) - return ret, nil -} diff --git a/abe/cpabe/tkn20/internal/tkn/matrixG2_test.go b/abe/cpabe/tkn20/internal/tkn/matrixG2_test.go deleted file mode 100644 index cc010411..00000000 --- a/abe/cpabe/tkn20/internal/tkn/matrixG2_test.go +++ /dev/null @@ -1,223 +0,0 @@ -package tkn - -import ( - "crypto/rand" - "testing" -) - -func TestRightMultLinearityG2(t *testing.T) { - zpMat1, err := randomMatrixZp(rand.Reader, 2, 3) - if err != nil { - t.Fatal(err) - } - zpMat2, err := randomMatrixZp(rand.Reader, 2, 3) - if err != nil { - t.Fatal(err) - } - zpMat1p2 := newMatrixZp(2, 3) - zpMat1p2.add(zpMat1, zpMat2) - a, err := randomMatrixG2(rand.Reader, 3, 2) - if err != nil { - t.Fatal(err) - } - s := newMatrixG2(3, 3) - u := newMatrixG2(3, 3) - r := newMatrixG2(3, 3) - tmp := newMatrixG2(3, 3) - r.rightMult(a, zpMat1) - s.rightMult(a, zpMat2) - u.rightMult(a, zpMat1p2) - tmp.add(r, s) - if !tmp.Equal(u) { - t.Fatal("failure of linearity") - } -} - -func TestLeftMultLinearityG2(t *testing.T) { - zpMat1, err := randomMatrixZp(rand.Reader, 3, 3) - if err != nil { - t.Fatal(err) - } - zpMat2, err := randomMatrixZp(rand.Reader, 3, 3) - if err != nil { - t.Fatal(err) - } - zpMat1p2 := newMatrixZp(3, 3) - zpMat1p2.add(zpMat1, zpMat2) - a, err := randomMatrixG2(rand.Reader, 3, 2) - if err != nil { - t.Fatal(err) - } - s := newMatrixG2(0, 0) - u := newMatrixG2(0, 0) - r := newMatrixG2(0, 0) - tmp := newMatrixG2(0, 0) - r.leftMult(zpMat1, a) - s.leftMult(zpMat2, a) - u.leftMult(zpMat1p2, a) - tmp.add(r, s) - if !tmp.Equal(u) { - t.Fatal("failure of linearity") - } -} - -func TestLeftMultActionG2(t *testing.T) { - zpMat1, err := randomMatrixZp(rand.Reader, 3, 3) - if err != nil { - t.Fatal(err) - } - zpMat2, err := randomMatrixZp(rand.Reader, 3, 3) - if err != nil { - t.Fatal(err) - } - zpMat2m1 := newMatrixZp(3, 3) - zpMat2m1.mul(zpMat2, zpMat1) - a, err := randomMatrixG2(rand.Reader, 3, 2) - if err != nil { - t.Fatal(err) - } - s := newMatrixG2(0, 0) - u := newMatrixG2(0, 0) - r := newMatrixG2(0, 0) - r.leftMult(zpMat1, a) - s.leftMult(zpMat2, r) - u.leftMult(zpMat2m1, a) - if !s.Equal(u) { - t.Fatal("failure of action") - } -} - -func TestRightMultActionG2(t *testing.T) { - zpMat1, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - zpMat2, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - zpMat1m2 := newMatrixZp(2, 2) - zpMat1m2.mul(zpMat1, zpMat2) - a, err := randomMatrixG2(rand.Reader, 3, 2) - if err != nil { - t.Fatal(err) - } - s := newMatrixG2(0, 0) - u := newMatrixG2(0, 0) - r := newMatrixG2(0, 0) - r.rightMult(a, zpMat1) - s.rightMult(r, zpMat2) - u.rightMult(a, zpMat1m2) - if !s.Equal(u) { - t.Fatal("failure of action") - } -} - -func TestExpG2(t *testing.T) { - a, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - b, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - ab := newMatrixZp(2, 2) - ab.mul(a, b) - aexp := newMatrixG2(0, 0) - aexp.exp(a) - abexp := newMatrixG2(0, 0) - abexp.exp(ab) - abres := newMatrixG2(0, 0) - abres.rightMult(aexp, b) - if !abres.Equal(abexp) { - t.Fatal("action and exp failure") - } -} - -func TestMarshalG2(t *testing.T) { - a, err := randomMatrixG2(rand.Reader, 7, 9) - if err != nil { - t.Fatal(err) - } - data, err := a.marshalBinary() - if err != nil { - t.Fatalf("failure to serialize: %s", err) - } - b := newMatrixG2(0, 0) - err = b.unmarshalBinary(data) - if err != nil { - t.Fatalf("failure to deserialize: %s", err) - } - if !a.Equal(b) { - t.Fatal("failure to roundtrip") - } - c := newMatrixG2(0, 0) - err = c.unmarshalBinary(append(data, 0)) - if err == nil { - t.Fatalf("data has excess bytes, deserialization should fail") - } -} - -func TestAliasLeftMultG2(t *testing.T) { - a, err := randomMatrixG2(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixZp(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixG2(4, 4) - aCopy.set(a) - bCopy := newMatrixZp(4, 4) - bCopy.set(b) - a.leftMult(b, a) - res := newMatrixG2(0, 0) - res.leftMult(bCopy, aCopy) - if !res.Equal(a) { - t.Fatalf("failure of leftMult to be alias safe") - } -} - -func TestAliasRightMultG2(t *testing.T) { - a, err := randomMatrixG2(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixZp(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixG2(4, 4) - aCopy.set(a) - bCopy := newMatrixZp(4, 4) - bCopy.set(b) - a.rightMult(a, b) - res := newMatrixG2(0, 0) - res.rightMult(aCopy, bCopy) - if !res.Equal(a) { - t.Fatalf("failure of rightMult to be alias safe") - } -} - -func TestAliasAddG2(t *testing.T) { - a, err := randomMatrixG2(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixG2(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixG2(4, 4) - aCopy.set(a) - bCopy := newMatrixG2(4, 4) - bCopy.set(b) - a.add(b, a) - res := newMatrixG2(0, 0) - res.add(bCopy, aCopy) - if !res.Equal(a) { - t.Fatalf("failure of add to be alias safe") - } -} diff --git a/abe/cpabe/tkn20/internal/tkn/matrixGT.go b/abe/cpabe/tkn20/internal/tkn/matrixGT.go deleted file mode 100644 index 1223c0f8..00000000 --- a/abe/cpabe/tkn20/internal/tkn/matrixGT.go +++ /dev/null @@ -1,184 +0,0 @@ -package tkn - -import ( - "encoding/binary" - "fmt" - "io" - - pairing "github.com/quantumcoinproject/circl/ecc/bls12381" -) - -// matrixGT represents a matrix of GT elements. They are stored in row-major order. -type matrixGT struct { - rows int - cols int - entries []pairing.Gt -} - -func (m *matrixGT) marshalBinary() ([]byte, error) { - ret := make([]byte, 4+pairing.GtSize*m.rows*m.cols) - binary.LittleEndian.PutUint16(ret[0:], uint16(m.rows)) - binary.LittleEndian.PutUint16(ret[2:], uint16(m.cols)) - for i := 0; i < m.rows*m.cols; i++ { - pt, err := m.entries[i].MarshalBinary() - if err != nil { - return nil, err - } - if len(pt) != pairing.GtSize { - panic("matrixGT: incorrect assumption of size") - } - copy(ret[pairing.GtSize*i+4:], pt) - } - return ret, nil -} - -func (m *matrixGT) unmarshalBinary(data []byte) error { - if len(data) < 4 { - return fmt.Errorf("matrixGT deserialization failure: input too short") - } - m.rows = int(binary.LittleEndian.Uint16(data[0:])) - m.cols = int(binary.LittleEndian.Uint16(data[2:])) - data = data[4:] - if len(data) != pairing.GtSize*m.rows*m.cols { - return fmt.Errorf("matrixGT deserialization failure: invalid entries length: expected %d, actual %d", - pairing.GtSize*m.cols*m.rows, - len(data)) - } - m.entries = make([]pairing.Gt, m.rows*m.cols) - var err error - for i := 0; i < m.rows*m.cols; i++ { - err = m.entries[i].UnmarshalBinary(data[pairing.GtSize*i : pairing.GtSize*(i+1)]) - if err != nil { - return fmt.Errorf("matrixGT deserialization failure: error from bytes %v: %w", - data[pairing.GtSize*i:pairing.GtSize*(i+1)], - err) - } - } - return nil -} - -// exp computes the naive matrix exponential of a with respect to the basepoint. -func (m *matrixGT) exp(a *matrixZp) { - basepoint := gtBaseVal - m.resize(a.rows, a.cols) - for i := 0; i < m.rows*m.cols; i++ { - m.entries[i].Exp(basepoint, &a.entries[i]) - } -} - -// resize sets up m to be r x c -func (m *matrixGT) resize(r int, c int) { - if m.rows != r || m.cols != c { - m.rows = r - m.cols = c - m.entries = make([]pairing.Gt, m.rows*m.cols) - } -} - -// clear sets m to be the "zero" matrix -func (m *matrixGT) clear() { - for i := 0; i < len(m.entries); i++ { - m.entries[i].SetIdentity() - } -} - -// conformal returns true iff m and a have the same dimensions. -func (m *matrixGT) conformal(a *matrixGT) bool { - return a.rows == m.rows && a.cols == m.cols -} - -// Equal returns true if m == b. -func (m *matrixGT) Equal(b *matrixGT) bool { - if !m.conformal(b) { - return false - } - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - if !m.entries[i*m.cols+j].IsEqual(&b.entries[i*b.cols+j]) { - return false - } - } - } - return true -} - -// set sets m to b. -func (m *matrixGT) set(b *matrixGT) { - m.resize(b.rows, b.cols) - copy(m.entries, b.entries) -} - -// add sets m to a+b. -func (m *matrixGT) add(a *matrixGT, b *matrixGT) { - if !a.conformal(b) { - panic(errBadMatrixSize) - } - m.resize(a.rows, a.cols) - for i := 0; i < m.rows*m.cols; i++ { - m.entries[i].Mul(&a.entries[i], &b.entries[i]) - } -} - -// leftMult multiples a*b with a matrixZp, b matrixGT. -func (m *matrixGT) leftMult(a *matrixZp, b *matrixGT) { - if a.cols != b.rows { - panic(errBadMatrixSize) - } - if m == b { - c := newMatrixGT(a.rows, a.cols) - c.set(b) - b = c - } - m.resize(a.rows, b.cols) - m.clear() - tmp := &pairing.Gt{} - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - for k := 0; k < a.cols; k++ { - tmp.Exp(&b.entries[k*b.cols+j], &a.entries[i*a.cols+k]) - m.entries[i*m.cols+j].Mul(&m.entries[i*m.cols+j], tmp) - } - } - } -} - -// rightMult multiplies a*b with a matrixG1, b matrixZp. -func (m *matrixGT) rightMult(a *matrixGT, b *matrixZp) { - if a.cols != b.rows { - panic(errBadMatrixSize) - } - if m == a { - c := newMatrixGT(a.rows, a.cols) - c.set(a) - a = c - } - m.resize(a.rows, b.cols) - m.clear() - tmp := &pairing.Gt{} - // to transpose can index bt[i,j] as b.entries[j*b.rows+i] - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - for k := 0; k < a.cols; k++ { - tmp.Exp(&a.entries[i*a.cols+k], &b.entries[k*b.cols+j]) - m.entries[i*m.cols+j].Mul(&m.entries[i*m.cols+j], tmp) - } - } - } -} - -func newMatrixGT(r int, c int) *matrixGT { - ret := new(matrixGT) - ret.resize(r, c) - ret.clear() - return ret -} - -func randomMatrixGT(rand io.Reader, r int, c int) (*matrixGT, error) { - a, err := randomMatrixZp(rand, r, c) - if err != nil { - return nil, err - } - ret := newMatrixGT(r, c) - ret.exp(a) - return ret, nil -} diff --git a/abe/cpabe/tkn20/internal/tkn/matrixGT_test.go b/abe/cpabe/tkn20/internal/tkn/matrixGT_test.go deleted file mode 100644 index c7db1ac7..00000000 --- a/abe/cpabe/tkn20/internal/tkn/matrixGT_test.go +++ /dev/null @@ -1,269 +0,0 @@ -package tkn - -import ( - "crypto/rand" - "testing" - - pairing "github.com/quantumcoinproject/circl/ecc/bls12381" -) - -func TestRightMultLinearityGT(t *testing.T) { - zpMat1, err := randomMatrixZp(rand.Reader, 2, 3) - if err != nil { - t.Fatal(err) - } - zpMat2, err := randomMatrixZp(rand.Reader, 2, 3) - if err != nil { - t.Fatal(err) - } - zpMat1p2 := newMatrixZp(3, 2) - zpMat1p2.add(zpMat1, zpMat2) - a, err := randomMatrixGT(rand.Reader, 3, 2) - if err != nil { - t.Fatal(err) - } - s := newMatrixGT(3, 3) - u := newMatrixGT(3, 3) - r := newMatrixGT(3, 3) - tmp := newMatrixGT(3, 3) - r.rightMult(a, zpMat1) - s.rightMult(a, zpMat2) - u.rightMult(a, zpMat1p2) - tmp.add(r, s) - if !tmp.Equal(u) { - t.Fatal("failure of linearity") - } -} - -func TestLeftMultLinearityGT(t *testing.T) { - zpMat1, err := randomMatrixZp(rand.Reader, 3, 3) - if err != nil { - t.Fatal(err) - } - zpMat2, err := randomMatrixZp(rand.Reader, 3, 3) - if err != nil { - t.Fatal(err) - } - zpMat1p2 := newMatrixZp(3, 3) - zpMat1p2.add(zpMat1, zpMat2) - a, err := randomMatrixGT(rand.Reader, 3, 2) - if err != nil { - t.Fatal(err) - } - s := newMatrixGT(0, 0) - u := newMatrixGT(0, 0) - r := newMatrixGT(0, 0) - tmp := newMatrixGT(0, 0) - r.leftMult(zpMat1, a) - s.leftMult(zpMat2, a) - u.leftMult(zpMat1p2, a) - tmp.add(r, s) - if !tmp.Equal(u) { - t.Fatal("failure of linearity") - } -} - -func TestLeftMultActionGT(t *testing.T) { - zpMat1, err := randomMatrixZp(rand.Reader, 3, 3) - if err != nil { - t.Fatal(err) - } - zpMat2, err := randomMatrixZp(rand.Reader, 3, 3) - if err != nil { - t.Fatal(err) - } - zpMat2m1 := newMatrixZp(3, 3) - zpMat2m1.mul(zpMat2, zpMat1) - a, err := randomMatrixGT(rand.Reader, 3, 2) - if err != nil { - t.Fatal(err) - } - s := newMatrixGT(0, 0) - u := newMatrixGT(0, 0) - r := newMatrixGT(0, 0) - r.leftMult(zpMat1, a) - s.leftMult(zpMat2, r) - u.leftMult(zpMat2m1, a) - if !s.Equal(u) { - t.Fatal("failure of action") - } -} - -func TestRightMultActionGT(t *testing.T) { - zpMat1, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - zpMat2, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - zpMat1m2 := newMatrixZp(2, 2) - zpMat1m2.mul(zpMat1, zpMat2) - a, err := randomMatrixGT(rand.Reader, 3, 2) - if err != nil { - t.Fatal(err) - } - s := newMatrixGT(0, 0) - u := newMatrixGT(0, 0) - r := newMatrixGT(0, 0) - r.rightMult(a, zpMat1) - s.rightMult(r, zpMat2) - u.rightMult(a, zpMat1m2) - if !s.Equal(u) { - t.Fatal("failure of action") - } -} - -func TestExpGT(t *testing.T) { - a, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - b, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - ab := newMatrixZp(2, 2) - ab.mul(a, b) - aexp := newMatrixGT(0, 0) - aexp.exp(a) - abexp := newMatrixGT(0, 0) - abexp.exp(ab) - abres := newMatrixGT(0, 0) - abres.rightMult(aexp, b) - if !abres.Equal(abexp) { - t.Fatal("action and exp failure") - } -} - -func TestExpGTLinearity(t *testing.T) { - a, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - b, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatal(err) - } - ab := newMatrixZp(2, 2) - ab.add(a, b) - aexp := newMatrixGT(0, 0) - aexp.exp(a) - bexp := newMatrixGT(0, 0) - bexp.exp(b) - abexp := newMatrixGT(0, 0) - absum := newMatrixGT(0, 0) - absum.add(aexp, bexp) - abexp.exp(ab) - if !abexp.Equal(absum) { - t.Fatal("linearity of exponentiation broken") - } -} - -func TestExpKnownAnswer(t *testing.T) { - a := eye(2) - b := newMatrixGT(0, 0) - b.exp(a) - one := &pairing.Gt{} - one.SetIdentity() - if !b.entries[0].IsEqual(gtBaseVal) { - t.Fatal("failure of 0") - } - if !b.entries[1].IsEqual(one) { - t.Fatal("failure of 1") - } - if !b.entries[2].IsEqual(one) { - t.Fatal("failure of 2") - } - if !b.entries[3].IsEqual(gtBaseVal) { - t.Fatal("failure of 3") - } -} - -func TestMarshalGt(t *testing.T) { - a, err := randomMatrixGT(rand.Reader, 7, 9) - if err != nil { - t.Fatal(err) - } - data, err := a.marshalBinary() - if err != nil { - t.Fatalf("failure to serialize: %s", err) - } - b := newMatrixGT(0, 0) - err = b.unmarshalBinary(data) - if err != nil { - t.Fatalf("failure to deserialize: %s", err) - } - if !a.Equal(b) { - t.Fatal("failure to roundtrip") - } - c := newMatrixGT(0, 0) - err = c.unmarshalBinary(data[0 : len(data)-2]) - if err == nil { - t.Fatalf("data is too short, deserialization should fail") - } -} - -func TestAliasLeftMultGT(t *testing.T) { - a, err := randomMatrixGT(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixZp(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixGT(4, 4) - aCopy.set(a) - bCopy := newMatrixZp(4, 4) - bCopy.set(b) - a.leftMult(b, a) - res := newMatrixGT(0, 0) - res.leftMult(bCopy, aCopy) - if !res.Equal(a) { - t.Fatalf("failure of leftMult to be alias safe") - } -} - -func TestAliasRightMultGT(t *testing.T) { - a, err := randomMatrixGT(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixZp(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixGT(4, 4) - aCopy.set(a) - bCopy := newMatrixZp(4, 4) - bCopy.set(b) - a.rightMult(a, b) - res := newMatrixGT(0, 0) - res.rightMult(aCopy, bCopy) - if !res.Equal(a) { - t.Fatalf("failure of rightMult to be alias safe") - } -} - -func TestAliasAddGt(t *testing.T) { - a, err := randomMatrixG1(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixG1(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixG1(4, 4) - aCopy.set(a) - bCopy := newMatrixG1(4, 4) - bCopy.set(b) - a.add(b, a) - res := newMatrixG1(0, 0) - res.add(bCopy, aCopy) - if !res.Equal(a) { - t.Fatalf("failure of add to be alias safe") - } -} diff --git a/abe/cpabe/tkn20/internal/tkn/matrixZp.go b/abe/cpabe/tkn20/internal/tkn/matrixZp.go deleted file mode 100644 index a686b3b4..00000000 --- a/abe/cpabe/tkn20/internal/tkn/matrixZp.go +++ /dev/null @@ -1,381 +0,0 @@ -package tkn - -import ( - "encoding/binary" - "fmt" - "io" - - pairing "github.com/quantumcoinproject/circl/ecc/bls12381" - "golang.org/x/crypto/blake2b" -) - -// matrixZp represents a matrix of mod grouporder elements. They are stored in row-major order. -// The name is a gesture toward the paper. -type matrixZp struct { - rows int - cols int - entries []pairing.Scalar -} - -func (m *matrixZp) marshalBinary() ([]byte, error) { - ret := make([]byte, 4+pairing.ScalarSize*m.rows*m.cols) - binary.LittleEndian.PutUint16(ret[0:], uint16(m.rows)) - binary.LittleEndian.PutUint16(ret[2:], uint16(m.cols)) - for i := 0; i < m.rows*m.cols; i++ { - pt, err := m.entries[i].MarshalBinary() - if err != nil { - return nil, err - } - if len(pt) != pairing.ScalarSize { - panic("matrixZp: incorrect assumption of size") - } - copy(ret[pairing.ScalarSize*i+4:], pt) - } - return ret, nil -} - -func (m *matrixZp) unmarshalBinary(data []byte) error { - if len(data) < 4 { - return fmt.Errorf("matrixZp deserialization failure: input too short") - } - m.rows = int(binary.LittleEndian.Uint16(data[0:])) - m.cols = int(binary.LittleEndian.Uint16(data[2:])) - data = data[4:] - if len(data) != pairing.ScalarSize*m.rows*m.cols { - return fmt.Errorf("matrixZp deserialization failure: invalid entries length: expected %d, actual %d", - pairing.ScalarSize*m.cols*m.rows, - len(data)) - } - m.entries = make([]pairing.Scalar, m.rows*m.cols) - var err error - for i := 0; i < m.rows*m.cols; i++ { - err = m.entries[i].UnmarshalBinary(data[pairing.ScalarSize*i : pairing.ScalarSize*(i+1)]) - if err != nil { - return fmt.Errorf("matrixZp deserialization failure: error from bytes %v: %w", - data[pairing.ScalarSize*i:pairing.ScalarSize*(i+1)], - err) - } - } - return nil -} - -// sampleDlin samples from the distribution Dk. -// See section 3.2 of the paper for details. -func sampleDlin(rand io.Reader) (*matrixZp, error) { - var ret matrixZp - ret.rows = 3 - ret.cols = 2 - ret.entries = make([]pairing.Scalar, 6) - err := ret.entries[0].Random(rand) - if err != nil { - return nil, err - } - ret.entries[1].SetUint64(0) - ret.entries[2].SetUint64(0) - err = ret.entries[3].Random(rand) - if err != nil { - return nil, err - } - ret.entries[4].SetOne() - ret.entries[5].SetOne() - - return &ret, nil -} - -func randomMatrixZp(rand io.Reader, r int, c int) (*matrixZp, error) { - ret := newMatrixZp(r, c) - for i := 0; i < r*c; i++ { - err := ret.entries[i].Random(rand) - if err != nil { - return nil, err - } - } - return ret, nil -} - -// We adopt the interface that math.Big uses -// Receivers get set to the results of operations, and return themselves. -// All aliases are allowed. - -// Now recall that G1, G2, GT are acted on by Zp. -// So we don't have all products, just left and right with Zp. -// Zp doesn't need this distinction. - -// Errors are signalled by returning nil, which propagates. - -// initialize sets up m to be r x c -func (m *matrixZp) resize(r int, c int) { - if m.rows != r || m.cols != c { - m.rows = r - m.cols = c - m.entries = make([]pairing.Scalar, m.rows*m.cols) - } -} - -// clear makes m an all 0 -func (m *matrixZp) clear() { - for i := 0; i < len(m.entries); i++ { - m.entries[i] = pairing.Scalar{} - } -} - -func newMatrixZp(r int, c int) *matrixZp { - ret := new(matrixZp) - ret.resize(r, c) - ret.clear() - return ret -} - -// eye returns the k by k identity matrix. -func eye(k int) *matrixZp { - ret := newMatrixZp(k, k) - for i := 0; i < k; i++ { - ret.entries[i*k+i].SetUint64(1) - } - return ret -} - -// conformal returns true iff m and a have the same dimensions. -func (m *matrixZp) conformal(a *matrixZp) bool { - return a.rows == m.rows && a.cols == m.cols -} - -// Equal returns true iff m == a. -func (m *matrixZp) Equal(a *matrixZp) bool { - if !m.conformal(a) { - return false - } - for i := 0; i < m.rows*m.cols; i++ { - if m.entries[i].IsEqual(&a.entries[i]) == 0 { - return false - } - } - return true -} - -// set sets m to a. -func (m *matrixZp) set(a *matrixZp) { - m.resize(a.rows, a.cols) - for i := 0; i < m.rows*m.cols; i++ { - m.entries[i].Set(&a.entries[i]) - } -} - -// add sets m to a+b. -func (m *matrixZp) add(a *matrixZp, b *matrixZp) { - if !a.conformal(b) { - panic(errBadMatrixSize) - } - m.resize(a.rows, a.cols) - for i := 0; i < m.rows*m.cols; i++ { - m.entries[i].Add(&a.entries[i], &b.entries[i]) - } -} - -// sub sets m to a-b. -func (m *matrixZp) sub(a *matrixZp, b *matrixZp) { - if !a.conformal(b) { - panic(errBadMatrixSize) - } - m.resize(a.rows, a.cols) - for i := 0; i < m.rows*m.cols; i++ { - m.entries[i].Sub(&a.entries[i], &b.entries[i]) - } -} - -// mul sets m to a*b. -func (m *matrixZp) mul(a *matrixZp, b *matrixZp) { - if a.cols != b.rows { - panic(errBadMatrixSize) - } - if m == a { - c := newMatrixZp(a.rows, a.cols) - c.set(a) - a = c - } - if m == b { - c := newMatrixZp(b.rows, b.cols) - c.set(b) - b = c - } - m.resize(a.rows, b.cols) - m.clear() - t := &pairing.Scalar{} - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - for k := 0; k < a.cols; k++ { - t.Mul(&a.entries[i*a.cols+k], &b.entries[k*b.cols+j]) - m.entries[i*m.cols+j].Add(&m.entries[i*m.cols+j], t) - } - } - } -} - -// transpose sets m to the transpose of a. -func (m *matrixZp) transpose(a *matrixZp) { - if m == a { - c := newMatrixZp(a.rows, a.cols) - c.set(a) - a = c - } - m.resize(a.cols, a.rows) - - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - m.entries[i*m.cols+j].Set(&a.entries[j*a.cols+i]) - } - } -} - -// swaprows swaps two rows. -func (m *matrixZp) swapRows(i int, j int) { - t := &pairing.Scalar{} - for k := 0; k < m.cols; k++ { - t.Set(&m.entries[i*m.cols+k]) - m.entries[i*m.cols+k].Set(&m.entries[j*m.cols+k]) - m.entries[j*m.cols+k].Set(t) - } -} - -// scalerow scales a row. -func (m *matrixZp) scaleRow(alpha *pairing.Scalar, i int) { - for k := 0; k < m.cols; k++ { - m.entries[i*m.cols+k].Mul(&m.entries[i*m.cols+k], alpha) - } -} - -// addscaledrow takes alpha * row i and adds it to row j. -func (m *matrixZp) addScaledRow(alpha *pairing.Scalar, i int, j int) { - tmp := &pairing.Scalar{} - for k := 0; k < m.cols; k++ { - tmp.Mul(alpha, &m.entries[i*m.cols+k]) - m.entries[j*m.cols+k].Add(tmp, &m.entries[j*m.cols+k]) - } -} - -// inverse sets m to the inverse of a. If a is not invertible, -// the result is undefined and an error is returned. -// Aliasing safe -func (m *matrixZp) inverse(a *matrixZp) error { - if a.rows != a.cols { - panic(errBadMatrixSize) - } - // Any way we slice it we need additional storage. - y := newMatrixZp(a.rows, 2*a.cols) - for i := 0; i < a.rows; i++ { - for j := 0; j < a.cols; j++ { - y.entries[i*y.cols+j].Set(&a.entries[i*a.cols+j]) - } - y.entries[i*y.cols+y.rows+i].SetUint64(1) - } - - tmp := &pairing.Scalar{} - // Gaussian elimination with pivoting begins here. - for i := 0; i < y.rows; i++ { - pivoted := false - pivot: - for j := i; j < y.rows; j++ { - if y.entries[i*y.cols+j].IsZero() == 0 { - y.swapRows(i, j) - pivoted = true - break pivot - } - } - if !pivoted { - return errMatrixNonInvertible - } - tmp.Inv(&y.entries[i*y.cols+i]) - y.scaleRow(tmp, i) - - for j := i + 1; j < y.rows; j++ { - tmp.Set(&y.entries[j*y.cols+i]) - tmp.Neg() - y.addScaledRow(tmp, i, j) - } - } - // At this point the matrix is in reduced row echelon form. - // The next step is to substitute back. - - for i := y.rows - 1; i >= 0; i-- { - for j := i - 1; j >= 0; j-- { - tmp.Set(&y.entries[j*y.cols+i]) - tmp.Neg() - y.addScaledRow(tmp, i, j) - } - } - m.resize(a.rows, a.cols) - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - m.entries[i*m.cols+j].Set(&y.entries[i*y.cols+m.cols+j]) - } - } - return nil -} - -// prf computes a prf with output in pairs of 3x2 matrices -func prf(key []byte, input []byte) (*matrixZp, *matrixZp, error) { - xof, err := blake2b.NewXOF(blake2b.OutputLengthUnknown, key) - if err != nil { - return nil, nil, err - } - if _, err = xof.Write(input); err != nil { - return nil, nil, err - } - m1 := newMatrixZp(3, 2) - m2 := newMatrixZp(3, 2) - for i := 0; i < m1.rows; i++ { - for j := 0; j < m1.cols; j++ { - local := xof.Clone() - if _, err = local.Write([]byte(fmt.Sprintf("m1 matrix entry (%d, %d)", i, j))); err != nil { - return nil, nil, err - } - err = m1.entries[i*m1.cols+j].Random(local) - if err != nil { - return nil, nil, err - } - local = xof.Clone() - if _, err = local.Write([]byte(fmt.Sprintf("m2 matrix entry (%d, %d)", i, j))); err != nil { - return nil, nil, err - } - err = m2.entries[i*m2.cols+j].Random(local) - if err != nil { - return nil, nil, err - } - } - } - return m1, m2, nil -} - -// scalarmul sets m to a matrix a*B -func (m *matrixZp) scalarmul(a *pairing.Scalar, b *matrixZp) { - m.resize(b.rows, b.cols) - for i := 0; i < b.rows*b.cols; i++ { - m.entries[i].Mul(a, &b.entries[i]) - } -} - -// colsel sets m to a matrix with the selected columns. -func (m *matrixZp) colsel(a *matrixZp, cols []int) { - if m == a { - c := newMatrixZp(a.rows, a.cols) - c.set(a) - a = c - } - m.resize(a.rows, len(cols)) - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - m.entries[i*m.cols+j].Set(&a.entries[i*a.cols+cols[j]]) - } - } -} - -func (m *matrixZp) String() string { - var s string - for i := 0; i < m.rows; i++ { - for j := 0; j < m.cols; j++ { - s += fmt.Sprintf("%v ", m.entries[i*m.cols+j].String()) - } - s += "\n" - } - return s -} diff --git a/abe/cpabe/tkn20/internal/tkn/matrixZp_test.go b/abe/cpabe/tkn20/internal/tkn/matrixZp_test.go deleted file mode 100644 index 369556dc..00000000 --- a/abe/cpabe/tkn20/internal/tkn/matrixZp_test.go +++ /dev/null @@ -1,267 +0,0 @@ -package tkn - -import ( - "crypto/rand" - "testing" - - pairing "github.com/quantumcoinproject/circl/ecc/bls12381" - "github.com/quantumcoinproject/circl/ecc/bls12381/ff" -) - -func TestSampleDlin(t *testing.T) { - _, err := sampleDlin(rand.Reader) - if err != nil { - t.Errorf("failure of dlin: %s", err) - } -} - -func TestAdditionAndTranspose(t *testing.T) { - a, err := sampleDlin(rand.Reader) - if err != nil { - t.Errorf("failure of dlin: %s", err) - } - b, err := sampleDlin(rand.Reader) - if err != nil { - t.Errorf("failure of dlin: %s", err) - } - at := new(matrixZp) - bt := new(matrixZp) - aplusb := new(matrixZp) - atplusbt := new(matrixZp) - lhs := new(matrixZp) - - at.transpose(a) - bt.transpose(b) - aplusb.add(a, b) - atplusbt.add(at, bt) - - lhs.transpose(atplusbt) - if !aplusb.Equal(lhs) { - t.Errorf("failure of equality") - } -} - -func TestMultiplication(t *testing.T) { - a, err := sampleDlin(rand.Reader) - if err != nil { - t.Errorf("failure of diln: %s", err) - } - b, err := sampleDlin(rand.Reader) - if err != nil { - t.Errorf("failure of diln: %s", err) - } - bta := new(matrixZp) - atb := new(matrixZp) - tmp := new(matrixZp) - tmp.transpose(b) - bta.mul(tmp, a) - tmp.transpose(a) - atb.mul(tmp, b) - tmp.transpose(atb) - if !tmp.Equal(bta) { - t.Errorf("failure of multiplication") - } -} - -func TestInverse(t *testing.T) { - a, err := sampleDlin(rand.Reader) - if err != nil { - t.Errorf("failure of diln: %s", err) - } - aa := new(matrixZp) - at := new(matrixZp) - ainv := new(matrixZp) - res := new(matrixZp) - at.transpose(a) - aa.mul(at, a) - err = ainv.inverse(aa) - if err != nil { - t.Errorf("failure to compute inverse") - } - res.mul(ainv, aa) - expected := eye(res.cols) - if !expected.Equal(res) { - t.Errorf("failure of inverse value: expected:\n%v\n got:\n%v", expected, res) - t.Errorf("inversion was of %v\n", aa) - } - res.mul(aa, ainv) - if !expected.Equal(res) { - t.Errorf("failure of reversed mult: got\n%v\n", res) - } -} - -func TestInverse2x2(t *testing.T) { - A, err := randomMatrixZp(rand.Reader, 2, 2) - if err != nil { - t.Fatalf("failure of random: %v", err) - } - - B := newMatrixZp(2, 2) - C := newMatrixZp(2, 2) - err = C.inverse(A) - if err != nil { - t.Fatalf("ah, we have a problem: try again") - } - var a pairing.Scalar - var b pairing.Scalar - var c pairing.Scalar - var d pairing.Scalar - var det pairing.Scalar - var tmp pairing.Scalar - a.Set(&A.entries[0]) - b.Set(&A.entries[1]) - c.Set(&A.entries[2]) - d.Set(&A.entries[3]) - det.Mul(&a, &d) - tmp.Mul(&b, &c) - det.Sub(&det, &tmp) - tmp.Inv(&det) - B.entries[0].Set(&d) - B.entries[1].Set(&b) - B.entries[1].Neg() - B.entries[2].Set(&c) - B.entries[2].Neg() - B.entries[3].Set(&a) - B.scalarmul(&tmp, B) - if !C.Equal(B) { - t.Errorf("failure to agree with explicit formula: got:\n%v, wanted\n%v\n", B, C) - } - expected := eye(2) - res := newMatrixZp(0, 0) - res.mul(B, A) - if !res.Equal(expected) { - t.Errorf("explicit formula wrong: got:\n%v\n as inverse of\n%v\n", B, A) - } -} - -func TestPRF(t *testing.T) { - m1, m2, err := prf([]byte("test key do not use"), []byte("some input")) - if err != nil { - t.Errorf("failure of prf: %s", err) - } - if m1.Equal(m2) { - t.Errorf("prf fails to have distinct outputs") - } - m3, _, err := prf([]byte("test key do not use"), []byte("some other input")) - if err != nil { - t.Errorf("failure of prf: %s", err) - } - - if m1.Equal(m3) { - t.Errorf("prf ignores input Value") - } - m4, _, err := prf([]byte("test key"), []byte("some input")) - if err != nil { - t.Errorf("failure of prf: %s", err) - } - if m1.Equal(m4) { - t.Errorf("prf ignores key") - } -} - -func TestColsel(t *testing.T) { - m1, err := randomMatrixZp(rand.Reader, 17, 17) - if err != nil { - t.Fatal(err) - } - res := new(matrixZp) - res.colsel(m1, []int{0, 1, 2}) - if res.rows != m1.rows { - t.Errorf("wrong number of rows") - } - if res.cols != 3 { - t.Errorf("wrong number of columns") - } -} - -func TestAliasMul(t *testing.T) { - a, err := randomMatrixZp(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixZp(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixZp(4, 4) - aCopy.set(a) - bCopy := newMatrixZp(4, 4) - bCopy.set(b) - a.mul(b, a) - res := newMatrixZp(0, 0) - res.mul(bCopy, aCopy) - if !res.Equal(a) { - t.Fatalf("failure of mul to be alias safe") - } -} - -func TestAliasAddZp(t *testing.T) { - a, err := randomMatrixZp(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixZp(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixZp(4, 4) - aCopy.set(a) - bCopy := newMatrixZp(4, 4) - bCopy.set(b) - a.add(b, a) - res := newMatrixZp(0, 0) - res.add(bCopy, aCopy) - if !res.Equal(a) { - t.Fatalf("failure of add to be alias safe") - } -} - -func TestAliasSubZp(t *testing.T) { - a, err := randomMatrixZp(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - b, err := randomMatrixZp(rand.Reader, 4, 4) - if err != nil { - t.Fatalf("error: %v", err) - } - aCopy := newMatrixZp(4, 4) - aCopy.set(a) - bCopy := newMatrixZp(4, 4) - bCopy.set(b) - a.sub(b, a) - res := newMatrixZp(0, 0) - res.sub(bCopy, aCopy) - if !res.Equal(a) { - t.Fatalf("failure of sub to be alias safe") - } -} - -func TestMarshalZp(t *testing.T) { - a, err := randomMatrixZp(rand.Reader, 7, 9) - if err != nil { - t.Fatal(err) - } - data, err := a.marshalBinary() - if err != nil { - t.Fatalf("failure to serialize: %s", err) - } - b := newMatrixZp(0, 0) - err = b.unmarshalBinary(data) - if err != nil { - t.Fatalf("failure to deserialize: %s", err) - } - if !a.Equal(b) { - t.Fatal("failure to roundtrip") - } - - // test failure to set entry bytes - scOrder := ff.ScalarOrder() - scOrder[len(scOrder)-1] += 1 - copy(data[4:pairing.ScalarSize+4], scOrder[:]) - d := newMatrixZp(0, 0) - err = d.unmarshalBinary(data) - if err == nil { - t.Fatal("deserialization of matrixZp with entry larger than scalar order must fail") - } -} diff --git a/abe/cpabe/tkn20/internal/tkn/pairAccum.go b/abe/cpabe/tkn20/internal/tkn/pairAccum.go deleted file mode 100644 index 74ab50ca..00000000 --- a/abe/cpabe/tkn20/internal/tkn/pairAccum.go +++ /dev/null @@ -1,28 +0,0 @@ -package tkn - -import ( - "fmt" - - pairing "github.com/quantumcoinproject/circl/ecc/bls12381" -) - -type pairAccum struct { - as []*pairing.G1 - bs []*pairing.G2 - scalars []int -} - -func (pairs *pairAccum) addDuals(m1 *matrixG1, m2 *matrixG2, n int) { - if m1.cols != 1 || m2.cols != 1 { - panic(fmt.Sprintf("misuse of addDuals: m1: %d x %d m2: %d x %d\n", m1.rows, m1.cols, m2.rows, m2.cols)) - } - for k := 0; k < m1.rows; k++ { - pairs.as = append(pairs.as, &m1.entries[k]) - pairs.bs = append(pairs.bs, &m2.entries[k]) - pairs.scalars = append(pairs.scalars, n) - } -} - -func (pairs *pairAccum) eval() *pairing.Gt { - return pairing.ProdPairFrac(pairs.as, pairs.bs, pairs.scalars) -} diff --git a/abe/cpabe/tkn20/internal/tkn/policy.go b/abe/cpabe/tkn20/internal/tkn/policy.go deleted file mode 100644 index 4739b845..00000000 --- a/abe/cpabe/tkn20/internal/tkn/policy.go +++ /dev/null @@ -1,371 +0,0 @@ -package tkn - -import ( - "encoding/binary" - "fmt" - - pairing "github.com/quantumcoinproject/circl/ecc/bls12381" -) - -const ( - bkAttribute = "internal-boneh-katz-transform-attribute" - attributeSize = pairing.ScalarSize + 1 -) - -type Wire struct { - Label string - RawValue string - Value *pairing.Scalar - Positive bool -} - -func (w *Wire) String() string { - if w.Positive { - return fmt.Sprintf("%s:%s", w.Label, w.RawValue) - } - return fmt.Sprintf("not %s:%s", w.Label, w.RawValue) -} - -type Policy struct { - Inputs []Wire - F Formula // monotonic boolean formula -} - -type Attribute struct { - wild bool // false if tame - Value *pairing.Scalar -} - -func (a *Attribute) marshalBinary() ([]byte, error) { - ret := make([]byte, 1) - if a.wild { - ret[0] = 1 - } - aBytes, err := a.Value.MarshalBinary() - if err != nil { - return nil, err - } - - return append(ret, aBytes...), nil -} - -func (a *Attribute) unmarshalBinary(data []byte) error { - if len(data) != attributeSize { - return fmt.Errorf("unmarshalling Attribute failed: invalid input length, expected: %d, received: %d", - attributeSize, - len(data)) - } - a.wild = false - if data[0] == 1 { - a.wild = true - } - a.Value = &pairing.Scalar{} - err := a.Value.UnmarshalBinary(data[1:]) - if err != nil { - return fmt.Errorf("unmarshalling Attribute failed: %w", err) - } - return nil -} - -func (a *Attribute) Equal(b *Attribute) bool { - return a.wild == b.wild && a.Value.IsEqual(b.Value) == 1 -} - -type Attributes map[string]Attribute - -func (a *Attributes) marshalBinary() ([]byte, error) { - ret := make([]byte, 2) - binary.LittleEndian.PutUint16(ret[0:], uint16(len(*a))) - - aBytes, err := marshalBinarySortedMapAttribute(*a) - if err != nil { - return nil, fmt.Errorf("marshalling Attributes failed: %w", err) - } - ret = append(ret, aBytes...) - - return ret, nil -} - -func (a *Attributes) unmarshalBinary(data []byte) error { - if len(data) < 2 { - return fmt.Errorf("unmarshalling Attributes failed: data too short") - } - n := int(binary.LittleEndian.Uint16(data)) - data = data[2:] - *a = make(map[string]Attribute, n) - for i := 0; i < n; i++ { - labelBytes, rem, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("unmarshalling Attributes failed: %w", err) - } - if len(rem) < attributeSize { - return fmt.Errorf("unmarshalling Attributes failed: data too short") - } - attr := Attribute{} - err = attr.unmarshalBinary(rem[:attributeSize]) - if err != nil { - return fmt.Errorf("unmarshalling Attributes failed: %w", err) - } - (*a)[string(labelBytes)] = attr - data = rem[attributeSize:] - } - if len(data) != 0 { - return fmt.Errorf("unmarshalling Attributes failed: excess bytes remain in data") - } - return nil -} - -func (a *Attributes) Equal(b *Attributes) bool { - if len(*a) != len(*b) { - return false - } - for k := range *a { - v := (*a)[k] - if v2, ok := (*b)[k]; !(ok && v2.Equal(&v)) { - return false - } - } - return true -} - -func (w *Wire) MarshalBinary() ([]byte, error) { - strBytes := []byte(w.Label) - valBytes := []byte(w.RawValue) - intBytes, err := w.Value.MarshalBinary() - if err != nil { - return nil, err - } - totalLen := len(strBytes) + len(valBytes) + len(intBytes) + 2 + 2 + 2 + 1 - ret := make([]byte, totalLen) - where := 0 - binary.LittleEndian.PutUint16(ret[where:], uint16(len(strBytes))) - where += 2 - where += copy(ret[where:], strBytes) - binary.LittleEndian.PutUint16(ret[where:], uint16(len(valBytes))) - where += 2 - where += copy(ret[where:], valBytes) - binary.LittleEndian.PutUint16(ret[where:], uint16(len(intBytes))) - where += 2 - where += copy(ret[where:], intBytes) - if w.Positive { - ret[where] = 1 - } else { - ret[where] = 0 - } - return ret, nil -} - -func (w *Wire) UnmarshalBinary(data []byte) error { - where := 0 - if len(data) < 2 { - return fmt.Errorf("data not long enough") - } - strLen := int(binary.LittleEndian.Uint16(data[where:])) - where += 2 - if len(data[where:]) < strLen { - return fmt.Errorf("data not long enough") - } - w.Label = string(data[where : where+strLen]) - where += strLen - - if len(data[where:]) < 2 { - return fmt.Errorf("data not long enough") - } - valLen := int(binary.LittleEndian.Uint16(data[where:])) - where += 2 - if len(data[where:]) < valLen { - return fmt.Errorf("data not long enough") - } - w.RawValue = string(data[where : where+valLen]) - where += valLen - - if len(data[where:]) < 2 { - return fmt.Errorf("data not long enough") - } - intLen := int(binary.LittleEndian.Uint16(data[where:])) - where += 2 - if len(data[where:]) < intLen { - return fmt.Errorf("data not long enough") - } - w.Value = &pairing.Scalar{} - w.Value.SetBytes(data[where : where+intLen]) - where += intLen - if len(data[where:]) < 1 { - return fmt.Errorf("data not long enough") - } - if data[where] == 1 { - w.Positive = true - } else { - w.Positive = false - } - return nil -} - -func (w *Wire) Equal(w2 *Wire) bool { - return w.Label == w2.Label && w.RawValue == w2.RawValue && w.Positive == w2.Positive && w.Value.IsEqual(w2.Value) == 1 -} - -func (p *Policy) MarshalBinary() ([]byte, error) { - ret := make([]byte, 2) - fBytes, err := p.F.MarshalBinary() - if err != nil { - return nil, err - } - binary.LittleEndian.PutUint16(ret[0:2], uint16(len(fBytes))) - ret = append(ret, fBytes...) - ret = append(ret, 0, 0) - binary.LittleEndian.PutUint16(ret[len(ret)-2:], uint16(len(p.Inputs))) - for i := 0; i < len(p.Inputs); i++ { - input, err := p.Inputs[i].MarshalBinary() - if err != nil { - return nil, err - } - ret = append(ret, 0, 0) - binary.LittleEndian.PutUint16(ret[len(ret)-2:], uint16(len(input))) - ret = append(ret, input...) - } - return ret, nil -} - -func (p *Policy) UnmarshalBinary(data []byte) error { - // Extract formula - if len(data) < 2 { - return fmt.Errorf("data not long enough") - } - fLen := uint(binary.LittleEndian.Uint16(data)) - data = data[2:] - err := p.F.UnmarshalBinary(data) - if err != nil { - return err - } - data = data[fLen:] - // Extract wires - if len(data) < 2 { - return fmt.Errorf("data not long enough") - } - nWires := int(binary.LittleEndian.Uint16(data)) - data = data[2:] - p.Inputs = make([]Wire, nWires) - for i := 0; i < nWires; i++ { - wireLen := uint(binary.LittleEndian.Uint16(data)) - data = data[2:] - err = p.Inputs[i].UnmarshalBinary(data) - data = data[wireLen:] - if err != nil { - return fmt.Errorf("data not long enough") - } - } - return nil -} - -func (p *Policy) Equal(p2 *Policy) bool { - if len(p.Inputs) != len(p2.Inputs) { - return false - } - if !p.F.Equal(p2.F) { - return false - } - for i := range p.Inputs { - if !p.Inputs[i].Equal(&p2.Inputs[i]) { - return false - } - } - return true -} - -func (p *Policy) String() string { - // gateAssign takes n wires (intermediates and outputs) and maps to the gate - // that set them. For details, refer to [Formula]. - offset := len(p.F.Gates) + 1 - gateAssign := make([]int, len(p.F.Gates)) - for i, gate := range p.F.Gates { - gateAssign[gate.Out-offset] = i - } - return p.printWire(gateAssign, 2*len(p.F.Gates)) -} - -func (p *Policy) printWire(gateAssign []int, wire int) string { - n := len(p.F.Gates) - if wire < n+1 { - return p.Inputs[wire].String() - } - gate := p.F.Gates[gateAssign[wire-n-1]] - return fmt.Sprintf("(%s %s %s)", p.printWire(gateAssign, gate.In0), gate.operator(), p.printWire(gateAssign, gate.In1)) -} - -type match struct { - wire int - label string -} - -type Satisfaction struct { - matches []match -} - -func (p *Policy) pi() []int { - ret := make([]int, len(p.Inputs)) - counts := make(map[string]int) - for i := 0; i < len(p.Inputs); i++ { - // Paper would have us put a +1 here - // we change the indexing instead - ret[i] = counts[p.Inputs[i].Label] - counts[p.Inputs[i].Label]++ - } - return ret -} - -func (p *Policy) Satisfaction(attr *Attributes) (*Satisfaction, error) { - // For now its all of the wires, so we don't need to look at the formula. - var matches []match - for i := 0; i < len(p.Inputs); i++ { - wire := p.Inputs[i] - at, ok := (*attr)[wire.Label] - if !ok { - continue // missing Attribute might not be needed - } - if wire.Positive { - if (wire.Value.IsEqual(at.Value) == 1) || at.wild { - matches = append(matches, match{i, wire.Label}) - } - } else { - if (wire.Value.IsEqual(at.Value) == 0) || at.wild { - matches = append(matches, match{i, wire.Label}) - } - } - } - matches, err := p.F.satisfaction(matches) - if err != nil { - return nil, err - } - - return &Satisfaction{ - matches, - }, nil -} - -// Carry Out the augmentation under the BK transform -func (p *Policy) transformBK(val *pairing.Scalar) *Policy { - ret := new(Policy) - for i := 0; i < len(p.Inputs); i++ { - ret.Inputs = append(ret.Inputs, p.Inputs[i]) - } - ret.Inputs = append(ret.Inputs, Wire{ - Label: bkAttribute, - Value: val, - Positive: true, - }) - ret.F = p.F.insertAnd() - return ret -} - -func transformAttrsBK(attr *Attributes) *Attributes { - ret := make(map[string]Attribute) - for name, val := range *attr { - ret[name] = val - } - ret[bkAttribute] = Attribute{ - wild: true, - Value: &pairing.Scalar{}, - } - return (*Attributes)(&ret) -} diff --git a/abe/cpabe/tkn20/internal/tkn/policy_test.go b/abe/cpabe/tkn20/internal/tkn/policy_test.go deleted file mode 100644 index db8fe6ba..00000000 --- a/abe/cpabe/tkn20/internal/tkn/policy_test.go +++ /dev/null @@ -1,235 +0,0 @@ -package tkn - -import ( - "testing" -) - -var AttrHashKey = []byte("attribute value hashing") - -func TestWireSerialization(t *testing.T) { - in := &Wire{"a", "0", HashStringToScalar(AttrHashKey, "0"), true} - data, err := in.MarshalBinary() - if err != nil { - t.Fatalf("error in marshaling: %s", err) - } - out := &Wire{} - err = out.UnmarshalBinary(data) - if err != nil { - t.Fatalf("error in unmarshaling: %s", err) - } - if !in.Equal(out) { - t.Fatalf("failure to round trip") - } -} - -func TestPolicySerialization(t *testing.T) { - in := Policy{ - Inputs: []Wire{ - {"a", "1", HashStringToScalar(AttrHashKey, "1"), true}, - {"b", "xx", HashStringToScalar(AttrHashKey, "xx"), true}, - {"c", "3", HashStringToScalar(AttrHashKey, "3"), true}, - }, - F: Formula{ - Gates: []Gate{ - {Andgate, 0, 1, 3}, - {Andgate, 2, 3, 4}, - }, - }, - } - data, err := in.MarshalBinary() - if err != nil { - t.Fatalf("error in marshalling: %s", err) - } - out := Policy{} - err = out.UnmarshalBinary(data) - if err != nil { - t.Fatalf("error in unmarshaling: %s", err) - } - if !in.F.Equal(out.F) { - t.Fatalf("formulas do not match") - } - for i, input := range in.Inputs { - if !input.Equal(&out.Inputs[i]) { - t.Fatal("failure to round trip: inputs do not match") - } - } -} - -type TestCase struct { - p *Policy - a *Attributes -} - -func TestSatisfaction(t *testing.T) { - testCases := []TestCase{ - { - &Policy{ - Inputs: []Wire{ - {"a", "0", ToScalar(0), true}, - }, - F: Formula{ - Gates: []Gate{}, - }, - }, - &Attributes{ - "a": { - wild: false, - Value: ToScalar(0), - }, - }, - }, - { - &Policy{ - Inputs: []Wire{ - {"a", "1", ToScalar(1), true}, - {"b", "2", ToScalar(2), true}, - {"c", "3", ToScalar(3), true}, - }, - F: Formula{ - Gates: []Gate{ - {Andgate, 0, 1, 3}, - {Andgate, 2, 3, 4}, - }, - }, - }, - &Attributes{ - "d": { - wild: false, - Value: ToScalar(4), - }, - "c": { - wild: false, - Value: ToScalar(3), - }, - "b": { - wild: false, - Value: ToScalar(2), - }, - "a": { - wild: false, - Value: ToScalar(1), - }, - }, - }, - { - &Policy{ - Inputs: []Wire{ - {"a", "1", ToScalar(1), false}, - {"b", "2", ToScalar(2), true}, - {"c", "3", ToScalar(3), true}, - }, - F: Formula{ - Gates: []Gate{ - {Andgate, 0, 1, 3}, - {Andgate, 2, 3, 4}, - }, - }, - }, - &Attributes{ - "d": { - wild: false, - Value: ToScalar(4), - }, - "c": { - wild: false, - Value: ToScalar(3), - }, - "b": { - wild: false, - Value: ToScalar(2), - }, - "a": { - wild: false, - Value: ToScalar(2), - }, - }, - }, - } - - for _, args := range testCases { - sat, err := args.p.Satisfaction(args.a) - if err != nil { - t.Fatalf("no satisfaction found for valid program: %s", err) - } - for i := 0; i < len(sat.matches); i++ { - match := sat.matches[i] - if args.p.Inputs[match.wire].Positive { - if args.p.Inputs[match.wire].Value.IsEqual((*args.a)[match.label].Value) == 0 || match.label != args.p.Inputs[match.wire].Label { - t.Errorf("mismatch of Attribute name or Value") - } - } else { - if match.label != args.p.Inputs[match.wire].Label { - t.Errorf("mismatch of Attribute name") - } - } - } - } -} - -func TestMarshalAttribute(t *testing.T) { - in := Attribute{true, ToScalar(1)} - data, err := in.marshalBinary() - if err != nil { - t.Fatalf("error in marshaling: %s", err) - } - out := Attribute{} - err = out.unmarshalBinary(data) - if err != nil { - t.Fatalf("error in unmarshaling: %s", err) - } - if !in.Equal(&out) { - t.Fatal("failure to roundtrip") - } -} - -func TestMarshalAttributes(t *testing.T) { - in := Attributes{ - "cat": { - wild: true, - Value: ToScalar(0), - }, - "bree": { - wild: false, - Value: ToScalar(2), - }, - "a": { - wild: true, - Value: ToScalar(2), - }, - } - data, err := in.marshalBinary() - if err != nil { - t.Fatalf("error in marshaling: %s", err) - } - - // check if deserializing into non-empty struct works - out := &Attributes{ - "evil": { - wild: true, - Value: ToScalar(0), - }, - "bree": { - wild: false, - Value: ToScalar(2), - }, - "a": { - wild: true, - Value: ToScalar(2), - }, - } - if in.Equal(out) { - t.Fatalf("shouldn't be equal") - } - err = out.unmarshalBinary(data) - if err != nil { - t.Fatalf("error in unmarshaling: %s", err) - } - if !in.Equal(out) { - t.Fatal("failure to roundtrip") - } - - err = out.unmarshalBinary(append(data, 0)) - if err == nil { - t.Fatalf("data has excess bytes, deserialization should fail") - } -} diff --git a/abe/cpabe/tkn20/internal/tkn/tk.go b/abe/cpabe/tkn20/internal/tkn/tk.go deleted file mode 100644 index e9261423..00000000 --- a/abe/cpabe/tkn20/internal/tkn/tk.go +++ /dev/null @@ -1,802 +0,0 @@ -// Implements the scheme of https://eprint.iacr.org/2019/966 - -package tkn - -import ( - "crypto/subtle" - "encoding/binary" - "fmt" - "io" - - pairing "github.com/quantumcoinproject/circl/ecc/bls12381" -) - -type PublicParams struct { - b2 *matrixG2 - wb1 *matrixG1 - btk *matrixGT -} - -func (p *PublicParams) MarshalBinary() ([]byte, error) { - b2Bytes, err := p.b2.marshalBinary() - if err != nil { - return nil, fmt.Errorf("PublicParams serializing failed: %w", err) - } - ret := appendLenPrefixed(nil, b2Bytes) - - wb1Bytes, err := p.wb1.marshalBinary() - if err != nil { - return nil, fmt.Errorf("PublicParams serializing failed: %w", err) - } - ret = appendLenPrefixed(ret, wb1Bytes) - - btkBytes, err := p.btk.marshalBinary() - if err != nil { - return nil, fmt.Errorf("PublicParams serializing failed: %w", err) - } - ret = appendLenPrefixed(ret, btkBytes) - - return ret, nil -} - -func (p *PublicParams) UnmarshalBinary(data []byte) error { - b2Bytes, data, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("PublicParams deserialization failure: %w", err) - } - p.b2 = newMatrixG2(0, 0) - err = p.b2.unmarshalBinary(b2Bytes) - if err != nil { - return fmt.Errorf("PublicParams deserialization failure: %w", err) - } - - wb1Bytes, data, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("PublicParams deserialization failure: %w", err) - } - p.wb1 = newMatrixG1(0, 0) - err = p.wb1.unmarshalBinary(wb1Bytes) - if err != nil { - return fmt.Errorf("PublicParams deserialization failure: %w", err) - } - - btkBytes, data, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("PublicParams deserialization failure: %w", err) - } - p.btk = newMatrixGT(0, 0) - err = p.btk.unmarshalBinary(btkBytes) - if err != nil { - return fmt.Errorf("PublicParams deserialization failure: %w", err) - } - - if len(data) != 0 { - return fmt.Errorf("PublicParams deserialization failed: excess bytes remain in data") - } - return nil -} - -func (p *PublicParams) Equal(p2 *PublicParams) bool { - return p.b2.Equal(p2.b2) && p.wb1.Equal(p2.wb1) && p.btk.Equal(p2.btk) -} - -type SecretParams struct { - a *matrixZp - wtA *matrixZp - bstar *matrixZp - bstar12 *matrixZp - k *matrixZp // vectors are represented as 1 x n matrices - prfKey []byte -} - -func (s *SecretParams) MarshalBinary() ([]byte, error) { - aBytes, err := s.a.marshalBinary() - if err != nil { - return nil, fmt.Errorf("SecretParams serializing failed: %w", err) - } - wtABytes, err := s.wtA.marshalBinary() - if err != nil { - return nil, fmt.Errorf("SecretParams serializing failed: %w", err) - } - bstarBytes, err := s.bstar.marshalBinary() - if err != nil { - return nil, fmt.Errorf("SecretParams serializing failed: %w", err) - } - bstar12Bytes, err := s.bstar12.marshalBinary() - if err != nil { - return nil, fmt.Errorf("SecretParams serializing failed: %w", err) - } - kBytes, err := s.k.marshalBinary() - if err != nil { - return nil, fmt.Errorf("SecretParams serializing failed: %w", err) - } - bufs := [][]byte{ - aBytes, wtABytes, bstarBytes, bstar12Bytes, kBytes, s.prfKey, - } - - ret := appendLenPrefixed(nil, bufs[0]) - for _, buf := range bufs[1:] { - ret = appendLenPrefixed(ret, buf) - } - return ret, nil -} - -func (s *SecretParams) UnmarshalBinary(data []byte) error { - aBytes, data, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("SecretParams deserialization failure: %w", err) - } - s.a = newMatrixZp(0, 0) - err = s.a.unmarshalBinary(aBytes) - if err != nil { - return fmt.Errorf("SecretParams deserialization failure: %w", err) - } - wtABytes, data, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("SecretParams deserialization failure: %w", err) - } - s.wtA = newMatrixZp(0, 0) - err = s.wtA.unmarshalBinary(wtABytes) - if err != nil { - return fmt.Errorf("SecretParams deserialization failure: %w", err) - } - bstarBytes, data, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("SecretParams deserialization failure: %w", err) - } - s.bstar = newMatrixZp(0, 0) - err = s.bstar.unmarshalBinary(bstarBytes) - if err != nil { - return fmt.Errorf("SecretParams deserialization failure: %w", err) - } - bstar12Bytes, data, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("SecretParams deserialization failure: %w", err) - } - s.bstar12 = newMatrixZp(0, 0) - err = s.bstar12.unmarshalBinary(bstar12Bytes) - if err != nil { - return fmt.Errorf("SecretParams deserialization failure: %w", err) - } - kBytes, data, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("SecretParams deserialization failure: %w", err) - } - s.k = newMatrixZp(0, 0) - err = s.k.unmarshalBinary(kBytes) - if err != nil { - return fmt.Errorf("SecretParams deserialization failure: %w", err) - } - prfBytes, data, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("SecretParams deserialization failure: %w", err) - } - s.prfKey = prfBytes - - if len(data) != 0 { - return fmt.Errorf("SecretParams deserialization failed: excess bytes remain in data") - } - return nil -} - -func (s *SecretParams) Equal(s2 *SecretParams) bool { - return s.a.Equal(s2.a) && s.wtA.Equal(s2.wtA) && s.bstar.Equal(s2.bstar) && - s.bstar12.Equal(s2.bstar12) && s.k.Equal(s2.k) && - subtle.ConstantTimeCompare(s.prfKey, s2.prfKey) == 1 -} - -type AttributesKey struct { - a *Attributes - k1 *matrixG2 - k2 *matrixG1 - k3 map[string]*matrixG1 - k3wild map[string]*matrixG1 // only contains wildcards -} - -func (a *AttributesKey) MarshalBinary() ([]byte, error) { - aBytes, err := a.a.marshalBinary() - if err != nil { - return nil, fmt.Errorf("AttributesKey serializing failed: %w", err) - } - ret := appendLenPrefixed(nil, aBytes) - k1Bytes, err := a.k1.marshalBinary() - if err != nil { - return nil, fmt.Errorf("AttributesKey serializing failed: %w", err) - } - ret = appendLenPrefixed(ret, k1Bytes) - k2Bytes, err := a.k2.marshalBinary() - if err != nil { - return nil, fmt.Errorf("AttributesKey serializing failed: %w", err) - } - ret = appendLenPrefixed(ret, k2Bytes) - ret = append(ret, 0, 0) - binary.LittleEndian.PutUint16(ret[len(ret)-2:], uint16(len(a.k3))) - k3Bytes, err := marshalBinarySortedMapMatrixG1(a.k3) - if err != nil { - return nil, fmt.Errorf("AttributesKey serializing failed: %w", err) - } - ret = append(ret, k3Bytes...) - - ret = append(ret, 0, 0) - binary.LittleEndian.PutUint16(ret[len(ret)-2:], uint16(len(a.k3wild))) - k3wildBytes, err := marshalBinarySortedMapMatrixG1(a.k3wild) - if err != nil { - return nil, fmt.Errorf("AttributesKey serializing failed: %w", err) - } - ret = append(ret, k3wildBytes...) - - return ret, nil -} - -func (a *AttributesKey) UnmarshalBinary(data []byte) error { - aBytes, data, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("AttributesKey deserialization failure: %w", err) - } - a.a = &Attributes{} - err = a.a.unmarshalBinary(aBytes) - if err != nil { - return fmt.Errorf("AttributesKey deserialization failure: %w", err) - } - k1Bytes, data, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("AttributesKey deserialization failure: %w", err) - } - a.k1 = newMatrixG2(0, 0) - err = a.k1.unmarshalBinary(k1Bytes) - if err != nil { - return fmt.Errorf("AttributesKey deserialization failure: %w", err) - } - k2Bytes, data, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("AttributesKey deserialization failure: %w", err) - } - a.k2 = newMatrixG1(0, 0) - err = a.k2.unmarshalBinary(k2Bytes) - if err != nil { - return fmt.Errorf("AttributesKey deserialization failure: %w", err) - } - - if len(data) < 2 { - return fmt.Errorf("AttributesKey deserialization failure: data too short") - } - n := int(binary.LittleEndian.Uint16(data)) - data = data[2:] - a.k3 = make(map[string]*matrixG1, n) - for i := 0; i < n; i++ { - sBytes, rem, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("AttributesKey deserialization failure: %w", err) - } - mBytes, rem, err := removeLenPrefixed(rem) - if err != nil { - return fmt.Errorf("AttributesKey deserialization failure: %w", err) - } - m := newMatrixG1(0, 0) - err = m.unmarshalBinary(mBytes) - if err != nil { - return fmt.Errorf("AttributesKey deserialization failure: %w", err) - } - a.k3[string(sBytes)] = m - data = rem - } - - if len(data) < 2 { - return fmt.Errorf("AttributesKey deserialization failure: data too short") - } - n = int(binary.LittleEndian.Uint16(data)) - data = data[2:] - a.k3wild = make(map[string]*matrixG1, n) - for i := 0; i < n; i++ { - sBytes, rem, err := removeLenPrefixed(data) - if err != nil { - return fmt.Errorf("AttributesKey deserialization failure: %w", err) - } - mBytes, rem, err := removeLenPrefixed(rem) - if err != nil { - return fmt.Errorf("AttributesKey deserialization failure: %w", err) - } - m := newMatrixG1(0, 0) - err = m.unmarshalBinary(mBytes) - if err != nil { - return fmt.Errorf("AttributesKey deserialization failure: %w", err) - } - a.k3wild[string(sBytes)] = m - data = rem - } - if len(data) != 0 { - return fmt.Errorf("AttributesKey deserialization failed: excess bytes remain in data") - } - return nil -} - -func (a *AttributesKey) Equal(b *AttributesKey) bool { - if !a.a.Equal(b.a) || !a.k1.Equal(b.k1) || !a.k2.Equal(b.k2) { - return false - } - if len(a.k3) != len(b.k3) || len(a.k3wild) != len(b.k3wild) { - return false - } - for k, v := range a.k3 { - if !b.k3[k].Equal(v) { - return false - } - } - for k, v := range a.k3wild { - if !b.k3wild[k].Equal(v) { - return false - } - } - return true -} - -type ciphertextHeader struct { - p *Policy - c1 *matrixG2 - c2 []*matrixG2 - c3 []*matrixG1 - c3neg []*matrixG1 // additional vector for negated attributes -} - -func (hdr *ciphertextHeader) marshalBinary() ([]byte, error) { - pBytes, err := hdr.p.MarshalBinary() - if err != nil { - return nil, err - } - ret := appendLenPrefixed(nil, pBytes) - - c1Bytes, err := hdr.c1.marshalBinary() - if err != nil { - return nil, fmt.Errorf("c1 serializing: %w", err) - } - ret = appendLenPrefixed(ret, c1Bytes) - - // Now we need to indicate how long c2, c3, c3neg are. - // Each array will be the same size (or nil), so with more work we can specialize - // but for now we will ignore that. - - c2Len := len(hdr.c2) - - ret = append(ret, 0, 0) - binary.LittleEndian.PutUint16(ret[len(ret)-2:], uint16(c2Len)) - for i := 0; i < c2Len; i++ { - c2dat, errM := hdr.c2[i].marshalBinary() - if errM != nil { - return nil, fmt.Errorf("c2 serializing %d: %w", i, errM) - } - ret = appendLenPrefixed(ret, c2dat) - } - c3Len := len(hdr.c3) - ret = append(ret, 0, 0) - binary.LittleEndian.PutUint16(ret[len(ret)-2:], uint16(c3Len)) - for i := 0; i < c3Len; i++ { - c3dat, errM := hdr.c3[i].marshalBinary() - if errM != nil { - return nil, fmt.Errorf("c3 serializing %d: %w", i, errM) - } - ret = appendLenPrefixed(ret, c3dat) - } - for i := 0; i < c3Len; i++ { - var c3negdat []byte - if hdr.c3neg[i] != nil { - c3negdat, err = hdr.c3neg[i].marshalBinary() - if err != nil { - return nil, fmt.Errorf("c3neg serializing %d: %w", i, err) - } - } else { - c3negdat = nil - } - ret = appendLenPrefixed(ret, c3negdat) - } - return ret, nil -} - -func (hdr *ciphertextHeader) unmarshalBinary(data []byte) error { - pBytes, data, err := removeLenPrefixed(data) - if err != nil { - return err - } - hdr.p = new(Policy) - err = hdr.p.UnmarshalBinary(pBytes) - if err != nil { - return err - } - c1Bytes, data, err := removeLenPrefixed(data) - if err != nil { - return err - } - hdr.c1 = newMatrixG2(0, 0) - err = hdr.c1.unmarshalBinary(c1Bytes) - if err != nil { - return err - } - c2Len := int(binary.LittleEndian.Uint16(data)) - hdr.c2 = make([]*matrixG2, c2Len) - data = data[2:] - var c2data []byte - var c3data []byte - var c3negdata []byte - - for i := 0; i < c2Len; i++ { - c2data, data, err = removeLenPrefixed(data) - if err != nil { - return err - } - hdr.c2[i] = newMatrixG2(0, 0) - err = hdr.c2[i].unmarshalBinary(c2data) - if err != nil { - return err - } - } - - c3Len := int(binary.LittleEndian.Uint16(data)) - hdr.c3 = make([]*matrixG1, c3Len) - hdr.c3neg = make([]*matrixG1, c3Len) - data = data[2:] - - for i := 0; i < c3Len; i++ { - c3data, data, err = removeLenPrefixed(data) - if err != nil { - return err - } - hdr.c3[i] = newMatrixG1(0, 0) - err = hdr.c3[i].unmarshalBinary(c3data) - if err != nil { - return err - } - } - - for i := 0; i < c3Len; i++ { - c3negdata, data, err = removeLenPrefixed(data) - if err != nil { - return err - } - - if len(c3negdata) != 0 { - hdr.c3neg[i] = newMatrixG1(0, 0) - err = hdr.c3neg[i].unmarshalBinary(c3negdata) - if err != nil { - return err - } - } - } - - return nil -} - -func GenerateParams(rand io.Reader) (*PublicParams, *SecretParams, error) { - A, err := sampleDlin(rand) - if err != nil { - return nil, nil, err - } - Bbar, err := randomMatrixZp(rand, 4, 4) - if err != nil { - return nil, nil, err - } - W, err := randomMatrixZp(rand, 3, 4) - if err != nil { - return nil, nil, err - } - k, err := randomMatrixZp(rand, 4, 1) - if err != nil { - return nil, nil, err - } - prfKey := make([]byte, 16) - _, err = io.ReadFull(rand, prfKey) - if err != nil { - return nil, nil, err - } - - B := newMatrixZp(0, 0) - B.colsel(Bbar, []int{0, 1}) - wb := newMatrixZp(0, 0) - wb.mul(W, B) - - Bt := newMatrixZp(0, 0) - Bt.transpose(B) - BtKp := newMatrixZp(0, 0) - BtKp.mul(Bt, k) - - pp := PublicParams{} - pp.b2 = newMatrixG2(0, 0) - pp.b2.exp(B) - pp.wb1 = newMatrixG1(0, 0) - pp.wb1.exp(wb) - pp.btk = newMatrixGT(0, 0) - pp.btk.exp(BtKp) - - sp := SecretParams{} - sp.a = A - sp.wtA = newMatrixZp(0, 0) - wt := newMatrixZp(0, 0) - wt.transpose(W) - sp.wtA.mul(wt, A) - - BbarTinv := newMatrixZp(0, 0) - BbarT := newMatrixZp(0, 0) - BbarT.transpose(Bbar) - err = BbarTinv.inverse(BbarT) - if err != nil { - return nil, nil, err - } - - sp.bstar = newMatrixZp(0, 0) - sp.bstar.colsel(BbarTinv, []int{0, 1}) - - sp.bstar12 = newMatrixZp(0, 0) - sp.bstar12.colsel(BbarTinv, []int{2, 3}) - - sp.k = k - sp.prfKey = prfKey - - return &pp, &sp, nil -} - -func max(in []int) int { - max := 0 - for i := 0; i < len(in); i++ { - if in[i] > max { - max = in[i] - } - } - return max -} - -// encapsulate creates a new ephemeral key and header that can be opened to it. This is -// the transformation of an Elgamal like scheme to a KEM. -func encapsulate(rand io.Reader, pp *PublicParams, policy *Policy) (*ciphertextHeader, *pairing.Gt, error) { - pi := policy.pi() - d := max(pi) + 1 - ri := make([]*matrixZp, d) - r, err := randomMatrixZp(rand, 2, 1) - if err != nil { - return nil, nil, err - } - for i := 0; i < d; i++ { - ri[i], err = randomMatrixZp(rand, 2, 1) - if err != nil { - return nil, nil, err - } - } - rshares, err := policy.F.share(rand, r) - if err != nil { - return nil, nil, err - } - tmp := newMatrixZp(2, 1) - wshares := make([]*matrixG1, len(rshares)) - for i := 0; i < len(rshares); i++ { - wshares[i] = newMatrixG1(0, 0) - wshares[i].rightMult(pp.wb1, rshares[i]) - } - - c1 := newMatrixG2(0, 0) - c1.rightMult(pp.b2, r) - - c2 := make([]*matrixG2, d) - for i := 0; i < d; i++ { - c2[i] = newMatrixG2(0, 0) - c2[i].rightMult(pp.b2, ri[i]) - } - - c4mat := newMatrixGT(1, 1) - tmp.transpose(r) - c4mat.leftMult(tmp, pp.btk) - if c4mat.rows != 1 || c4mat.cols != 1 { - panic("failure to get the encryption right") - } - - c3 := make([]*matrixG1, len(policy.Inputs)) - c3neg := make([]*matrixG1, len(policy.Inputs)) - for i := 0; i < len(policy.Inputs); i++ { - U0, U1 := oracle([]byte(policy.Inputs[i].Label)) - if policy.Inputs[i].Positive { - c3[i] = newMatrixG1(0, 0) - - c3[i].scalarMult(policy.Inputs[i].Value, U0) - c3[i].add(c3[i], U1) - c3[i].rightMult(c3[i], ri[pi[i]]) - c3[i].add(c3[i], wshares[i]) - c3neg[i] = nil - } else { - c3[i] = newMatrixG1(0, 0) - c3[i].rightMult(U0, ri[pi[i]]) - c3[i].sub(c3[i], wshares[i]) - - c3neg[i] = newMatrixG1(0, 0) - c3neg[i].rightMult(U1, ri[pi[i]]) - tmpmat := newMatrixG1(0, 0) - tmpmat.scalarMult(policy.Inputs[i].Value, wshares[i]) - c3neg[i].add(c3neg[i], tmpmat) - } - } - return &ciphertextHeader{ - p: policy, - c1: c1, - c2: c2, - c3: c3, - c3neg: c3neg, - }, &c4mat.entries[0], nil -} - -func deriveAttributeKeys(rand io.Reader, sp *SecretParams, attrs *Attributes) (*AttributesKey, error) { - s, err := randomMatrixZp(rand, 2, 1) - if err != nil { - return nil, err - } - As := newMatrixZp(0, 0) - - k1 := newMatrixG2(0, 0) - As.mul(sp.a, s) - k1.exp(As) - Ast := newMatrixZp(0, 0) - Ast.transpose(As) - - k2 := newMatrixG1(0, 0) - tmp := newMatrixZp(0, 0) - tmp.mul(sp.wtA, s) - tmp.add(tmp, sp.k) - k2.exp(tmp) - - k3 := make(map[string]*matrixG1) - k3wild := make(map[string]*matrixG1) - for label, attr := range *attrs { - if attr.wild { - // For wild k3 is y term, k3wild is constant term - U0, U1 := oracle([]byte(label)) - V0, V1, err := prf(sp.prfKey, []byte(label)) - if err != nil { - return nil, err - } - k3[label] = newMatrixG1(0, 0) - k3wild[label] = newMatrixG1(0, 0) - left := newMatrixG1(0, 0) - right := newMatrixG1(0, 0) - - left.transpose(U0) - left.leftMult(sp.bstar, left) - left.rightMult(left, As) - - tmp.transpose(V0) - tmp.mul(sp.bstar12, tmp) - tmp.mul(tmp, As) - - right.exp(tmp) - - k3[label].add(left, right) - - left.transpose(U1) - left.leftMult(sp.bstar, left) - left.rightMult(left, As) - - tmp.transpose(V1) - tmp.mul(sp.bstar12, tmp) - tmp.mul(tmp, As) - - right.exp(tmp) - - k3wild[label].add(left, right) - } else { - U0, U1 := oracle([]byte(label)) - V0, V1, err := prf(sp.prfKey, []byte(label)) - if err != nil { - return nil, err - } - - k3[label] = newMatrixG1(0, 0) - left := newMatrixG1(0, 0) - right := newMatrixG1(0, 0) - - left.scalarMult(attr.Value, U0) - left.add(U1, left) - left.transpose(left) - left.leftMult(sp.bstar, left) - left.rightMult(left, As) - - tmp.scalarmul(attr.Value, V0) - tmp.add(tmp, V1) - tmp.transpose(tmp) - tmp.mul(sp.bstar12, tmp) - tmp.mul(tmp, As) - - right.exp(tmp) - - k3[label].add(left, right) - } - } - - return &AttributesKey{ - a: attrs, - k1: k1, - k2: k2, - k3: k3, - k3wild: k3wild, - }, nil -} - -// Decapsulate decapsulates -func decapsulate(header *ciphertextHeader, key *AttributesKey) (*pairing.Gt, error) { - // First we need to determine the satisfying assignment: which attributes in attr - // are needed. - - // We use pi to determine which D to sum into - pi := header.p.pi() - d := max(pi) + 1 - // p1, p2 are the left halves of the pairings. - p1 := make([]*matrixG1, d) - p2 := make([]*matrixG1, d) - - sat, err := header.p.Satisfaction(key.a) - if err != nil { - return nil, err - } - for k := 0; k < len(sat.matches); k++ { - match := sat.matches[k] - j := pi[match.wire] - - if p1[j] == nil { - p1[j] = newMatrixG1(header.c3[match.wire].rows, header.c3[match.wire].cols) - } - if p2[j] == nil { - p2[j] = newMatrixG1(key.k3[match.label].rows, key.k3[match.label].cols) - } - if header.p.Inputs[match.wire].Positive { - p1[j].add(p1[j], header.c3[match.wire]) - - if (*key.a)[match.label].wild { - if key.k3wild[match.label] == nil { - return nil, fmt.Errorf("missing wildcard data for Label %s", match.label) - } - y := header.p.Inputs[match.wire].Value - tmp1 := newMatrixG1(0, 0) - tmp1.scalarMult(y, key.k3[match.label]) - tmp1.add(tmp1, key.k3wild[match.label]) - p2[j].add(p2[j], tmp1) - } else { - p2[j].add(p2[j], key.k3[match.label]) - } - } else { - keymat := newMatrixG1(0, 0) - y := &pairing.Scalar{} - - if (*key.a)[match.label].wild { - y.Add(header.p.Inputs[match.wire].Value, ToScalar(1)) - keymat.scalarMult(y, key.k3[match.label]) - keymat.add(keymat, key.k3wild[match.label]) - } else { - y.Set((*(key.a))[match.label].Value) - keymat.set(key.k3[match.label]) - } - diff := &pairing.Scalar{} - - diff.Sub(header.p.Inputs[match.wire].Value, y) - diff.Inv(diff) - p1add := newMatrixG1(0, 0) - p1add.scalarMult(y, header.c3[match.wire]) - p1add.add(p1add, header.c3neg[match.wire]) - p1add.scalarMult(diff, p1add) - - p2add := newMatrixG1(0, 0) - p2add.scalarMult(diff, keymat) - - p1[j].add(p1[j], p1add) - p2[j].add(p2[j], p2add) - } - } - - pairs := &pairAccum{} - - var pTot *matrixG1 - for i := 0; i < d; i++ { - if p1[i] != nil { - if pTot == nil { - pTot = newMatrixG1(p1[i].rows, p1[i].cols) - } - pTot.add(pTot, p1[i]) - pairs.addDuals(p2[i], header.c2[i], 1) - } - } - pairs.addDuals(pTot, key.k1, -1) - pairs.addDuals(key.k2.copy(), header.c1, 1) - - return pairs.eval(), nil -} diff --git a/abe/cpabe/tkn20/internal/tkn/tk_test.go b/abe/cpabe/tkn20/internal/tkn/tk_test.go deleted file mode 100644 index 6d3395ec..00000000 --- a/abe/cpabe/tkn20/internal/tkn/tk_test.go +++ /dev/null @@ -1,202 +0,0 @@ -package tkn - -import ( - "crypto/rand" - "fmt" - "testing" -) - -func TestEncryptionSimple(t *testing.T) { - for i, suite := range encTestCases { - t.Run(fmt.Sprintf("test %d", i), func(t *testing.T) { - public, secret, err := GenerateParams(rand.Reader) - if err != nil { - t.Fatalf("error generating parameters: %s", err) - } - userKey, err := deriveAttributeKeys(rand.Reader, secret, suite.a) - if err != nil { - t.Fatalf("error generating attribute keys: %s", err) - } - - header, shared, err := encapsulate(rand.Reader, public, suite.p) - if err != nil { - t.Fatalf("error encrypting message: %s", err) - } - headerSerialized, err := header.marshalBinary() - if err != nil { - t.Fatalf("cannot serialize: %s", err) - } - newHeader := &ciphertextHeader{} - err = newHeader.unmarshalBinary(headerSerialized) - if err != nil { - t.Fatalf("unmarshaling failed: %s", err) - } - - recovered, err := decapsulate(newHeader, userKey) - if err != nil { - t.Fatalf("error decrypting message: %s", err) - } - if !recovered.IsEqual(shared) { - t.Fatalf("decryption is incorrect") - } - }) - } -} - -func TestMarshalPublicParams(t *testing.T) { - a, _, err := GenerateParams(rand.Reader) - if err != nil { - t.Fatal(err) - } - data, err := a.MarshalBinary() - if err != nil { - t.Fatalf("failure to serialize: %s", err) - } - b := &PublicParams{} - err = b.UnmarshalBinary(data) - if err != nil { - t.Fatalf("failure to deserialize: %s", err) - } - if !a.Equal(b) { - t.Fatal("failure to roundtrip") - } -} - -func TestMarshalSecretParams(t *testing.T) { - _, a, err := GenerateParams(rand.Reader) - if err != nil { - t.Fatal(err) - } - data, err := a.MarshalBinary() - if err != nil { - t.Fatalf("failure to serialize: %s", err) - } - b := &SecretParams{} - err = b.UnmarshalBinary(data) - if err != nil { - t.Fatalf("failure to deserialize: %s", err) - } - if !a.Equal(b) { - t.Fatal("failure to roundtrip") - } -} - -func TestMarshalAttributesKey(t *testing.T) { - _, sp, err := GenerateParams(rand.Reader) - if err != nil { - t.Fatal(err) - } - attrs := &Attributes{ - "d": { - wild: false, - Value: ToScalar(4), - }, - "c": { - wild: true, - Value: ToScalar(3), - }, - "b": { - wild: false, - Value: ToScalar(2), - }, - "a": { - wild: true, - Value: ToScalar(2), - }, - } - a, err := deriveAttributeKeys(rand.Reader, sp, attrs) - if err != nil { - t.Fatalf("error generating attribute keys: %s", err) - } - data, err := a.MarshalBinary() - if err != nil { - t.Fatalf("failure to serialize: %s", err) - } - b := &AttributesKey{} - err = b.UnmarshalBinary(data) - if err != nil { - t.Fatalf("failure to deserialize: %s", err) - } - if !a.Equal(b) { - t.Fatal("failure to roundtrip") - } - - // ensure we can deserialize into non-empty struct - cAttrs := &Attributes{ - "evil": { - wild: false, - Value: ToScalar(0), - }, - } - c, err := deriveAttributeKeys(rand.Reader, sp, cAttrs) - if err != nil { - t.Fatalf("error generating attribute keys: %s", err) - } - err = c.UnmarshalBinary(data) - if err != nil { - t.Fatalf("failure to deserialize into non-empty struct: %s", err) - } - if !a.Equal(c) { - t.Fatal("failure to roundtrip") - } -} - -func TestEqualAttributesKey(t *testing.T) { - _, sp, err := GenerateParams(rand.Reader) - if err != nil { - t.Fatal(err) - } - attrs := &Attributes{ - "d": { - wild: false, - Value: ToScalar(4), - }, - } - a, err := deriveAttributeKeys(rand.Reader, sp, attrs) - if err != nil { - t.Fatalf("error generating attribute keys: %s", err) - } - - _, sp2, err := GenerateParams(rand.Reader) - if err != nil { - t.Fatal(err) - } - attrs2 := &Attributes{ - "k": { - wild: false, - Value: ToScalar(4), - }, - } - b, err := deriveAttributeKeys(rand.Reader, sp2, attrs2) - if err != nil { - t.Fatalf("error generating attribute keys: %s", err) - } - if a.Equal(b) { - t.Fatalf("shouldnt be equal") - } - - // deep copy - data, err := a.MarshalBinary() - if err != nil { - t.Fatalf("failure to serialize: %s", err) - } - c := &AttributesKey{} - err = c.UnmarshalBinary(data) - if err != nil { - t.Fatalf("failure to deserialize: %s", err) - } - if !a.Equal(c) { - t.Fatalf("failure to roundtrip") - } - - for k, v := range a.k3 { - c.k3[k], err = randomMatrixG1(rand.Reader, v.rows, v.cols) - if err != nil { - t.Fatal(err) - } - break - } - if a.Equal(c) { - t.Fatalf("shouldnt be equal") - } -} diff --git a/abe/cpabe/tkn20/internal/tkn/util.go b/abe/cpabe/tkn20/internal/tkn/util.go deleted file mode 100644 index 78d27b8c..00000000 --- a/abe/cpabe/tkn20/internal/tkn/util.go +++ /dev/null @@ -1,132 +0,0 @@ -package tkn - -import ( - "encoding/binary" - "errors" - "fmt" - "sort" - - pairing "github.com/quantumcoinproject/circl/ecc/bls12381" - "golang.org/x/crypto/blake2b" -) - -var gtBaseVal *pairing.Gt - -func init() { - // This should really be a constant, but what can I do? - g1 := pairing.G1Generator() - g2 := pairing.G2Generator() - gtBaseVal = pairing.Pair(g1, g2) -} - -func ToScalar(n int) *pairing.Scalar { - ret := &pairing.Scalar{} - ret.SetUint64(uint64(n)) - return ret -} - -func HashStringToScalar(key []byte, value string) *pairing.Scalar { - xof, err := blake2b.NewXOF(blake2b.OutputLengthUnknown, key) - if err != nil { - return nil - } - _, err = xof.Write([]byte(value)) - if err != nil { - return nil - } - s := &pairing.Scalar{} - err = s.Random(xof) - if err != nil { - return nil - } - return s -} - -func appendLen16Prefixed(a []byte, b []byte) []byte { - a = append(a, 0, 0) - binary.LittleEndian.PutUint16(a[len(a)-2:], uint16(len(b))) - a = append(a, b...) - return a -} - -func removeLen16Prefixed(data []byte) (next []byte, remainder []byte, err error) { - if len(data) < 2 { - return nil, nil, fmt.Errorf("data too short") - } - itemLen := int(binary.LittleEndian.Uint16(data)) - if (2 + itemLen) > len(data) { - return nil, nil, fmt.Errorf("data too short") - } - return data[2 : 2+itemLen], data[2+itemLen:], nil -} - -var ( - appendLenPrefixed = appendLen16Prefixed - removeLenPrefixed = removeLen16Prefixed -) - -func appendLen32Prefixed(a []byte, b []byte) []byte { - a = append(a, 0, 0, 0, 0) - binary.LittleEndian.PutUint32(a[len(a)-4:], uint32(len(b))) - a = append(a, b...) - return a -} - -func removeLen32Prefixed(data []byte) (next []byte, remainder []byte, err error) { - if len(data) < 4 { - return nil, nil, fmt.Errorf("data too short") - } - itemLen := int(binary.LittleEndian.Uint32(data)) - if (4 + itemLen) > len(data) { - return nil, nil, fmt.Errorf("data too short") - } - return data[4 : 4+itemLen], data[4+itemLen:], nil -} - -func marshalBinarySortedMapMatrixG1(m map[string]*matrixG1) ([]byte, error) { - sortedKeys := make([]string, 0, len(m)) - for key := range m { - sortedKeys = append(sortedKeys, key) - } - sort.Strings(sortedKeys) - - ret := []byte{} - for _, key := range sortedKeys { - b, err := m[key].marshalBinary() - if err != nil { - return nil, err - } - - ret = appendLenPrefixed(ret, []byte(key)) - ret = appendLenPrefixed(ret, b) - } - - return ret, nil -} - -func marshalBinarySortedMapAttribute(m map[string]Attribute) ([]byte, error) { - sortedKeys := make([]string, 0, len(m)) - for key := range m { - sortedKeys = append(sortedKeys, key) - } - sort.Strings(sortedKeys) - - ret := []byte{} - for _, key := range sortedKeys { - a := m[key] - b, err := a.marshalBinary() - if err != nil { - return nil, err - } - - ret = appendLenPrefixed(ret, []byte(key)) - ret = append(ret, b...) - } - - return ret, nil -} - -var ( - errBadMatrixSize = errors.New("matrix inputs do not conform") - errMatrixNonInvertible = errors.New("matrix has no inverse") -) diff --git a/abe/cpabe/tkn20/longpt_test.go b/abe/cpabe/tkn20/longpt_test.go deleted file mode 100644 index a07a749b..00000000 --- a/abe/cpabe/tkn20/longpt_test.go +++ /dev/null @@ -1,60 +0,0 @@ -package tkn20_test - -import ( - "bytes" - "crypto/sha256" - "fmt" - "io" - "testing" - - cpabe "github.com/quantumcoinproject/circl/abe/cpabe/tkn20" - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/xof" -) - -func TestLongPlaintext(t *testing.T) { - // Fixed PRNG for test reproducibility. - prng := xof.SHAKE128.New() - - pk, msk, err := cpabe.Setup(prng) - test.CheckNoErr(t, err, "setup failed") - - attrs := cpabe.Attributes{} - attrs.FromMap(map[string]string{ - "occupation": "doctor", - "country": "US", - "age": "16", - }) - - sk, err := msk.KeyGen(prng, attrs) - test.CheckNoErr(t, err, "master key generation failed") - - policy := cpabe.Policy{} - err = policy.FromString(`(occupation: doctor) and (country: US)`) - test.CheckNoErr(t, err, "policy parsing failed") - - const N = 20 // 2^N bytes of plaintext - buffer := make([]byte, 1< 0 { - return nil, common.ErrInvalidMessageLength - } - - s, err := common.DecryptAndCheck(rand.Reader, keys.NewBigPrivateKey(signer.sk), m) - if err != nil { - return nil, err - } - - blindSig := make([]byte, kLen) - s.FillBytes(blindSig) - - return blindSig, nil -} - -var ( - ErrInvalidVariant = common.ErrInvalidVariant - ErrUnexpectedSize = common.ErrUnexpectedSize - ErrInvalidMessageLength = common.ErrInvalidMessageLength - ErrInvalidBlind = common.ErrInvalidBlind - ErrInvalidRandomness = common.ErrInvalidRandomness - ErrUnsupportedHashFunction = common.ErrUnsupportedHashFunction -) diff --git a/blindsign/blindrsa/brsa_test.go b/blindsign/blindrsa/brsa_test.go deleted file mode 100644 index dd767bfe..00000000 --- a/blindsign/blindrsa/brsa_test.go +++ /dev/null @@ -1,583 +0,0 @@ -package blindrsa - -import ( - "bytes" - "crypto/rand" - "crypto/rsa" - "crypto/x509" - "encoding/hex" - "encoding/json" - "encoding/pem" - "fmt" - "io" - "math/big" - "os" - "strings" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func loadPrivateKey() (*rsa.PrivateKey, error) { - file, err := os.ReadFile("./testdata/testRSA2048.rfc9500.pem") - if err != nil { - return nil, err - } - - block, _ := pem.Decode(file) - if block == nil || block.Type != "RSA TESTING KEY" { - return nil, fmt.Errorf("PEM private key decoding failed") - } - - privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) - if err != nil { - return nil, err - } - - return privateKey, nil -} - -func mustDecodeHex(h string) []byte { - b, err := hex.DecodeString(h) - if err != nil { - panic(err) - } - return b -} - -func loadStrongRSAKey() *rsa.PrivateKey { - // https://gist.github.com/chris-wood/b77536febb25a5a11af428afff77820a - pEnc := "dcd90af1be463632c0d5ea555256a20605af3db667475e190e3af12a34a3324c46a3094062c59fb4b249e0ee6afba8bee14e0276d126c99f4784b23009bf6168ff628ac1486e5ae8e23ce4d362889de4df63109cbd90ef93db5ae64372bfe1c55f832766f21e94ea3322eb2182f10a891546536ba907ad74b8d72469bea396f3" - qEnc := "f8ba5c89bd068f57234a3cf54a1c89d5b4cd0194f2633ca7c60b91a795a56fa8c8686c0e37b1c4498b851e3420d08bea29f71d195cfbd3671c6ddc49cf4c1db5b478231ea9d91377ffa98fe95685fca20ba4623212b2f2def4da5b281ed0100b651f6db32112e4017d831c0da668768afa7141d45bbc279f1e0f8735d74395b3" - NEnc := "d6930820f71fe517bf3259d14d40209b02a5c0d3d61991c731dd7da39f8d69821552e2318d6c9ad897e603887a476ea3162c1205da9ac96f02edf31df049bd55f142134c17d4382a0e78e275345f165fbe8e49cdca6cf5c726c599dd39e09e75e0f330a33121e73976e4facba9cfa001c28b7c96f8134f9981db6750b43a41710f51da4240fe03106c12acb1e7bb53d75ec7256da3fddd0718b89c365410fce61bc7c99b115fb4c3c318081fa7e1b65a37774e8e50c96e8ce2b2cc6b3b367982366a2bf9924c4bafdb3ff5e722258ab705c76d43e5f1f121b984814e98ea2b2b8725cd9bc905c0bc3d75c2a8db70a7153213c39ae371b2b5dc1dafcb19d6fae9" - eEnc := "010001" - dEnc := "4e21356983722aa1adedb084a483401c1127b781aac89eab103e1cfc52215494981d18dd8028566d9d499469c25476358de23821c78a6ae43005e26b394e3051b5ca206aa9968d68cae23b5affd9cbb4cb16d64ac7754b3cdba241b72ad6ddfc000facdb0f0dd03abd4efcfee1730748fcc47b7621182ef8af2eeb7c985349f62ce96ab373d2689baeaea0e28ea7d45f2d605451920ca4ea1f0c08b0f1f6711eaa4b7cca66d58a6b916f9985480f90aca97210685ac7b12d2ec3e30a1c7b97b65a18d38a93189258aa346bf2bc572cd7e7359605c20221b8909d599ed9d38164c9c4abf396f897b9993c1e805e574d704649985b600fa0ced8e5427071d7049d" - - p := new(big.Int).SetBytes(mustDecodeHex(pEnc)) - q := new(big.Int).SetBytes(mustDecodeHex(qEnc)) - N := new(big.Int).SetBytes(mustDecodeHex(NEnc)) - e := new(big.Int).SetBytes(mustDecodeHex(eEnc)) - d := new(big.Int).SetBytes(mustDecodeHex(dEnc)) - - primes := make([]*big.Int, 2) - primes[0] = p - primes[1] = q - - key := &rsa.PrivateKey{ - PublicKey: rsa.PublicKey{ - N: N, - E: int(e.Int64()), - }, - D: d, - Primes: primes, - } - - return key -} - -func runSignatureProtocol(signer Signer, client Client, message []byte, random io.Reader) ([]byte, error) { - inputMsg, err := client.Prepare(random, message) - if err != nil { - return nil, fmt.Errorf("prepare failed: %w", err) - } - - blindedMsg, state, err := client.Blind(random, inputMsg) - if err != nil { - return nil, fmt.Errorf("blind failed: %w", err) - } - - kLen := (signer.sk.N.BitLen() + 7) / 8 - if len(blindedMsg) != kLen { - return nil, fmt.Errorf("Protocol message (blind message) length mismatch, expected %d, got %d", kLen, len(blindedMsg)) - } - - blindedSig, err := signer.BlindSign(blindedMsg) - if err != nil { - return nil, fmt.Errorf("blindSign failed: %w", err) - } - - if len(blindedSig) != kLen { - return nil, fmt.Errorf("Protocol message (blind signature) length mismatch, expected %d, got %d", kLen, len(blindedMsg)) - } - - sig, err := client.Finalize(state, blindedSig) - if err != nil { - return nil, fmt.Errorf("finalize failed: %w", err) - } - - err = client.Verify(inputMsg, sig) - if err != nil { - return nil, fmt.Errorf("verification failed: %w", err) - } - - return sig, nil -} - -func TestRoundTrip(t *testing.T) { - message := []byte("hello world") - key, err := loadPrivateKey() - if err != nil { - t.Fatal(err) - } - - for _, variant := range []Variant{ - SHA384PSSDeterministic, - SHA384PSSZeroDeterministic, - SHA384PSSRandomized, - SHA384PSSZeroRandomized, - } { - t.Run(variant.String(), func(tt *testing.T) { - client, err := NewClient(variant, &key.PublicKey) - if err != nil { - t.Fatal(err) - } - signer := NewSigner(key) - - sig, err := runSignatureProtocol(signer, client, message, rand.Reader) - if err != nil { - t.Fatal(err) - } - if sig == nil { - t.Fatal("nil signature output") - } - }) - } -} - -func TestDeterministicRoundTrip(t *testing.T) { - message := []byte("hello world") - key, err := loadPrivateKey() - if err != nil { - t.Fatal(err) - } - - client, err := NewClient(SHA384PSSDeterministic, &key.PublicKey) - if err != nil { - t.Fatal(err) - } - signer := NewSigner(key) - - sig, err := runSignatureProtocol(signer, client, message, rand.Reader) - if err != nil { - t.Fatal(err) - } - if sig == nil { - t.Fatal("nil signature output") - } -} - -func TestDeterministicBlindFailure(t *testing.T) { - message := []byte("hello world") - key, err := loadPrivateKey() - if err != nil { - t.Fatal(err) - } - - client, err := NewClient(SHA384PSSDeterministic, &key.PublicKey) - if err != nil { - t.Fatal(err) - } - signer := NewSigner(key) - - _, err = runSignatureProtocol(signer, client, message, nil) - if err == nil { - t.Fatal("Expected signature generation to fail with empty randomness") - } -} - -func TestRandomSignVerify(t *testing.T) { - message := []byte("hello world") - key, err := loadPrivateKey() - if err != nil { - t.Fatal(err) - } - - client, err := NewClient(SHA384PSSRandomized, &key.PublicKey) - if err != nil { - t.Fatal(err) - } - signer := NewSigner(key) - - sig1, err := runSignatureProtocol(signer, client, message, rand.Reader) - if err != nil { - t.Fatal(err) - } - sig2, err := runSignatureProtocol(signer, client, message, rand.Reader) - if err != nil { - t.Fatal(err) - } - - if sig1 == nil || sig2 == nil { - t.Fatal("nil signature output") - } - if bytes.Equal(sig1, sig2) { - t.Fatal("random signatures matched when they should differ") - } -} - -type mockRandom struct { - counter uint8 -} - -func (r *mockRandom) Read(p []byte) (n int, err error) { - for i := range p { - p[i] = r.counter - r.counter = r.counter + 1 - } - return len(p), nil -} - -func TestFixedRandomSignVerify(t *testing.T) { - message := []byte("hello world") - key, err := loadPrivateKey() - if err != nil { - t.Fatal(err) - } - - client, err := NewClient(SHA384PSSRandomized, &key.PublicKey) - if err != nil { - t.Fatal(err) - } - signer := NewSigner(key) - - mockRand := &mockRandom{0} - sig1, err := runSignatureProtocol(signer, client, message, mockRand) - if err != nil { - t.Fatal(err) - } - mockRand = &mockRandom{0} - sig2, err := runSignatureProtocol(signer, client, message, mockRand) - if err != nil { - t.Fatal(err) - } - - if sig1 == nil || sig2 == nil { - t.Fatal("nil signature output") - } - if !bytes.Equal(sig1, sig2) { - t.Fatal("random signatures with fixed random seeds differ when they should be equal") - } -} - -type rawTestVector struct { - Name string `json:"name"` - P string `json:"p"` - Q string `json:"q"` - N string `json:"n"` - E string `json:"e"` - D string `json:"d"` - Msg string `json:"msg"` - MsgPrefix string `json:"msg_prefix"` - InputMsg string `json:"input_msg"` - Salt string `json:"salt"` - SaltLen string `json:"sLen"` - IsRandomized string `json:"is_randomized"` - Inv string `json:"inv"` - BlindedMessage string `json:"blinded_msg"` - BlindSig string `json:"blind_sig"` - Sig string `json:"sig"` -} - -type testVector struct { - t *testing.T - name string - p *big.Int - q *big.Int - n *big.Int - e int - d *big.Int - msg []byte - msgPrefix []byte - inputMsg []byte - salt []byte - saltLen int - isRandomized bool - blindInverse *big.Int - blindedMessage []byte - blindSig []byte - sig []byte -} - -type testVectorList struct { - t *testing.T - vectors []testVector -} - -func mustUnhexBigInt(number string) *big.Int { - data := mustUnhex(number) - value := new(big.Int) - value.SetBytes(data) - return value -} - -func mustUnhex(value string) []byte { - value = strings.TrimPrefix(value, "0x") - data, err := hex.DecodeString(value) - if err != nil { - panic(err) - } - - return data -} - -func mustUnhexInt(value string) int { - number := mustUnhexBigInt(value) - result := int(number.Int64()) - return result -} - -func (tv *testVector) UnmarshalJSON(data []byte) error { - raw := rawTestVector{} - err := json.Unmarshal(data, &raw) - if err != nil { - return err - } - - tv.name = raw.Name - tv.p = mustUnhexBigInt(raw.P) - tv.q = mustUnhexBigInt(raw.Q) - tv.n = mustUnhexBigInt(raw.N) - tv.e = mustUnhexInt(raw.E) - tv.d = mustUnhexBigInt(raw.D) - tv.msg = mustUnhex(raw.Msg) - tv.msgPrefix = mustUnhex(raw.MsgPrefix) - tv.inputMsg = mustUnhex(raw.InputMsg) - tv.salt = mustUnhex(raw.Salt) - tv.saltLen = mustUnhexInt(raw.SaltLen) - tv.isRandomized = mustUnhexInt(raw.IsRandomized) != 0 - tv.blindedMessage = mustUnhex(raw.BlindedMessage) - tv.blindInverse = mustUnhexBigInt(raw.Inv) - tv.blindSig = mustUnhex(raw.BlindSig) - tv.sig = mustUnhex(raw.Sig) - - return nil -} - -func (tvl testVectorList) MarshalJSON() ([]byte, error) { - return json.Marshal(tvl.vectors) -} - -func (tvl *testVectorList) UnmarshalJSON(data []byte) error { - err := json.Unmarshal(data, &tvl.vectors) - if err != nil { - return err - } - - for i := range tvl.vectors { - tvl.vectors[i].t = tvl.t - } - - return nil -} - -func verifyTestVector(t *testing.T, vector testVector) { - key := new(rsa.PrivateKey) - key.PublicKey.N = vector.n - key.PublicKey.E = vector.e - key.D = vector.d - key.Primes = []*big.Int{vector.p, vector.q} - key.Precomputed.Dp = nil // Remove precomputed CRT values - - // Recompute the original blind - rInv := new(big.Int).Set(vector.blindInverse) - r := new(big.Int).ModInverse(rInv, key.N) - if r == nil { - t.Fatal("Failed to compute blind inverse") - } - - var variant Variant - switch vector.name { - case "RSABSSA-SHA384-PSS-Deterministic": - variant = SHA384PSSDeterministic - case "RSABSSA-SHA384-PSSZERO-Deterministic": - variant = SHA384PSSZeroDeterministic - case "RSABSSA-SHA384-PSS-Randomized": - variant = SHA384PSSRandomized - case "RSABSSA-SHA384-PSSZERO-Randomized": - variant = SHA384PSSZeroRandomized - default: - t.Fatal("variant not supported") - } - - signer := NewSigner(key) - - client, err := NewClient(variant, &key.PublicKey) - test.CheckNoErr(t, err, "new client failed") - - blindedMsg, state, err := client.fixedBlind(vector.inputMsg, vector.salt, r, rInv) - test.CheckNoErr(t, err, "fixedBlind failed") - got := hex.EncodeToString(blindedMsg) - want := hex.EncodeToString(vector.blindedMessage) - if got != want { - test.ReportError(t, got, want) - } - - blindSig, err := signer.BlindSign(blindedMsg) - test.CheckNoErr(t, err, "blindSign failed") - got = hex.EncodeToString(blindSig) - want = hex.EncodeToString(vector.blindSig) - if got != want { - test.ReportError(t, got, want) - } - - sig, err := client.Finalize(state, blindSig) - test.CheckNoErr(t, err, "finalize failed") - got = hex.EncodeToString(sig) - want = hex.EncodeToString(vector.sig) - if got != want { - test.ReportError(t, got, want) - } - - verifier, err := NewVerifier(variant, &key.PublicKey) - test.CheckNoErr(t, err, "new verifier failed") - - test.CheckNoErr(t, verifier.Verify(vector.inputMsg, sig), "verification failed") -} - -func TestVectors(t *testing.T) { - data, err := os.ReadFile("testdata/test_vectors_rfc9474.json") - if err != nil { - t.Fatal("Failed reading test vectors:", err) - } - - tvl := &testVectorList{} - err = tvl.UnmarshalJSON(data) - if err != nil { - t.Fatal("Failed deserializing test vectors:", err) - } - - for _, vector := range tvl.vectors { - t.Run(vector.name, func(tt *testing.T) { - verifyTestVector(tt, vector) - }) - } -} - -func BenchmarkBRSA(b *testing.B) { - message := []byte("hello world") - key := loadStrongRSAKey() - server := NewSigner(key) - - client, err := NewClient(SHA384PSSRandomized, &key.PublicKey) - if err != nil { - b.Fatal(err) - } - - inputMsg, err := client.Prepare(rand.Reader, message) - if err != nil { - b.Errorf("prepare failed: %v", err) - } - - blindedMsg, state, err := client.Blind(rand.Reader, inputMsg) - if err != nil { - b.Errorf("blind failed: %v", err) - } - - blindedSig, err := server.BlindSign(blindedMsg) - if err != nil { - b.Errorf("blindSign failed: %v", err) - } - - sig, err := client.Finalize(state, blindedSig) - if err != nil { - b.Errorf("finalize failed: %v", err) - } - - err = client.Verify(inputMsg, sig) - if err != nil { - b.Errorf("verification failed: %v", err) - } - - b.Run("Blind", func(b *testing.B) { - for n := 0; n < b.N; n++ { - _, _, err := client.Blind(rand.Reader, inputMsg) - if err != nil { - b.Fatal(err) - } - } - }) - - b.Run("BlindSign", func(b *testing.B) { - for n := 0; n < b.N; n++ { - _, err := server.BlindSign(blindedMsg) - if err != nil { - b.Fatal(err) - } - } - }) - - b.Run("Finalize", func(b *testing.B) { - for n := 0; n < b.N; n++ { - _, err := client.Finalize(state, blindedSig) - if err != nil { - b.Fatal(err) - } - } - }) - - b.Run("Verify", func(b *testing.B) { - for n := 0; n < b.N; n++ { - err := client.Verify(inputMsg, sig) - if err != nil { - b.Fatal(err) - } - } - }) -} - -func Example_blindrsa() { - // Setup (offline) - - // Server: generate an RSA keypair. - sk, err := rsa.GenerateKey(rand.Reader, 2048) - if err != nil { - fmt.Printf("failed to generate RSA key: %v", err) - return - } - pk := &sk.PublicKey - server := NewSigner(sk) - - // Client: stores Server's public key. - client, err := NewClient(SHA384PSSRandomized, pk) - if err != nil { - fmt.Printf("failed to invoke a client: %v", err) - return - } - - // Protocol (online) - - // Client prepares the message to be signed. - msg := []byte("alice and bob") - preparedMessage, err := client.Prepare(rand.Reader, msg) - if err != nil { - fmt.Printf("client failed to prepare the message: %v", err) - return - } - - // Client blinds a message. - blindedMsg, state, err := client.Blind(rand.Reader, preparedMessage) - if err != nil { - fmt.Printf("client failed to generate blinded message: %v", err) - return - } - - // Server signs a blinded message, and produces a blinded signature. - blindedSignature, err := server.BlindSign(blindedMsg) - if err != nil { - fmt.Printf("server failed to sign: %v", err) - return - } - - // Client build a signature from the previous state and blinded signature. - signature, err := client.Finalize(state, blindedSignature) - if err != nil { - fmt.Printf("client failed to obtain signature: %v", err) - return - } - - // Client build a signature from the previous state and blinded signature. - ok := client.Verify(preparedMessage, signature) - - fmt.Printf("Valid signature: %v", ok == nil) - // Output: Valid signature: true -} diff --git a/blindsign/blindrsa/internal/common/common.go b/blindsign/blindrsa/internal/common/common.go deleted file mode 100644 index 97e55bd8..00000000 --- a/blindsign/blindrsa/internal/common/common.go +++ /dev/null @@ -1,148 +0,0 @@ -package common - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" - "crypto/sha256" - "crypto/sha512" - "crypto/subtle" - "errors" - "hash" - "io" - "math/big" - - "github.com/quantumcoinproject/circl/blindsign/blindrsa/internal/keys" -) - -// ConvertHashFunction converts a crypto.Hash function to an equivalent hash.Hash type. -func ConvertHashFunction(hash crypto.Hash) hash.Hash { - switch hash { - case crypto.SHA256: - return sha256.New() - case crypto.SHA384: - return sha512.New384() - case crypto.SHA512: - return sha512.New() - default: - panic(ErrUnsupportedHashFunction) - } -} - -// EncodeMessageEMSAPSS hashes the input message and then encodes it using PSS encoding. -func EncodeMessageEMSAPSS(message []byte, N *big.Int, hash hash.Hash, salt []byte) ([]byte, error) { - hash.Reset() // Ensure the hash state is cleared - hash.Write(message) - digest := hash.Sum(nil) - hash.Reset() - emBits := N.BitLen() - 1 - encodedMsg, err := emsaPSSEncode(digest[:], emBits, salt, hash) - return encodedMsg, err -} - -// GenerateBlindingFactor generates a blinding factor and its multiplicative inverse -// to use for RSA blinding. -func GenerateBlindingFactor(random io.Reader, N *big.Int) (*big.Int, *big.Int, error) { - randReader := random - if randReader == nil { - randReader = rand.Reader - } - r, err := rand.Int(randReader, N) - if err != nil { - return nil, nil, err - } - - if r.Sign() == 0 { - r.SetInt64(1) - } - rInv := new(big.Int).ModInverse(r, N) - if rInv == nil { - return nil, nil, ErrInvalidBlind - } - - return r, rInv, nil -} - -// VerifyMessageSignature verifies the input message signature against the expected public key -func VerifyMessageSignature(message, signature []byte, saltLength int, pk *keys.BigPublicKey, hash crypto.Hash) error { - h := ConvertHashFunction(hash) - h.Write(message) - digest := h.Sum(nil) - - err := verifyPSS(pk, hash, digest, signature, &rsa.PSSOptions{ - Hash: hash, - SaltLength: saltLength, - }) - return err -} - -// DecryptAndCheck checks that the private key operation is consistent (fault attack detection). -func DecryptAndCheck(random io.Reader, priv *keys.BigPrivateKey, c *big.Int) (m *big.Int, err error) { - m, err = decrypt(random, priv, c) - if err != nil { - return nil, err - } - - // In order to defend against errors in the CRT computation, m^e is - // calculated, which should match the original ciphertext. - check := encrypt(new(big.Int), priv.Pk.N, priv.Pk.E, m) - if c.Cmp(check) != 0 { - return nil, errors.New("rsa: internal error") - } - return m, nil -} - -// VerifyBlindSignature verifies the signature of the hashed and encoded message against the input public key. -func VerifyBlindSignature(pub *keys.BigPublicKey, hashed, sig []byte) error { - m := new(big.Int).SetBytes(hashed) - bigSig := new(big.Int).SetBytes(sig) - - c := encrypt(new(big.Int), pub.N, pub.E, bigSig) - if subtle.ConstantTimeCompare(m.Bytes(), c.Bytes()) == 1 { - return nil - } else { - return rsa.ErrVerification - } -} - -func saltLength(opts *rsa.PSSOptions) int { - if opts == nil { - return rsa.PSSSaltLengthAuto - } - return opts.SaltLength -} - -func verifyPSS(pub *keys.BigPublicKey, hash crypto.Hash, digest []byte, sig []byte, opts *rsa.PSSOptions) error { - if len(sig) != pub.Size() { - return rsa.ErrVerification - } - s := new(big.Int).SetBytes(sig) - m := encrypt(new(big.Int), pub.N, pub.E, s) - emBits := pub.N.BitLen() - 1 - emLen := (emBits + 7) / 8 - if m.BitLen() > emLen*8 { - return rsa.ErrVerification - } - em := m.FillBytes(make([]byte, emLen)) - return emsaPSSVerify(digest, em, emBits, saltLength(opts), hash.New()) -} - -var ( - // ErrInvalidVariant is the error used if the variant request does not exist. - ErrInvalidVariant = errors.New("blindsign/blindrsa: invalid variant requested") - - // ErrUnexpectedSize is the error used if the size of a parameter does not match its expected value. - ErrUnexpectedSize = errors.New("blindsign/blindrsa: unexpected input size") - - // ErrInvalidMessageLength is the error used if the size of a protocol message does not match its expected value. - ErrInvalidMessageLength = errors.New("blindsign/blindrsa: invalid message length") - - // ErrInvalidBlind is the error used if the blind generated by the Verifier fails. - ErrInvalidBlind = errors.New("blindsign/blindrsa: invalid blind") - - // ErrInvalidRandomness is the error used if caller did not provide randomness to the Blind() function. - ErrInvalidRandomness = errors.New("blindsign/blindrsa: invalid random parameter") - - // ErrUnsupportedHashFunction is the error used if the specified hash is not supported. - ErrUnsupportedHashFunction = errors.New("blindsign/blindrsa: unsupported hash function") -) diff --git a/blindsign/blindrsa/internal/common/pss.go b/blindsign/blindrsa/internal/common/pss.go deleted file mode 100644 index 000b1664..00000000 --- a/blindsign/blindrsa/internal/common/pss.go +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright (c) 2009 The Go Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package common - -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements the RSASSA-PSS signature scheme according to RFC 8017. - -import ( - "bytes" - "crypto/rsa" - "errors" - "hash" -) - -// Per RFC 8017, Section 9.1 -// -// EM = MGF1 xor DB || H( 8*0x00 || mHash || salt ) || 0xbc -// -// where -// -// DB = PS || 0x01 || salt -// -// and PS can be empty so -// -// emLen = dbLen + hLen + 1 = psLen + sLen + hLen + 2 -// - -func emsaPSSEncode(mHash []byte, emBits int, salt []byte, hash hash.Hash) ([]byte, error) { - // See RFC 8017, Section 9.1.1. - - hLen := hash.Size() - sLen := len(salt) - emLen := (emBits + 7) / 8 - - // 1. If the length of M is greater than the input limitation for the - // hash function (2^61 - 1 octets for SHA-1), output "message too - // long" and stop. - // - // 2. Let mHash = Hash(M), an octet string of length hLen. - - if len(mHash) != hLen { - return nil, errors.New("crypto/rsa: input must be hashed with given hash") - } - - // 3. If emLen < hLen + sLen + 2, output "encoding error" and stop. - - if emLen < hLen+sLen+2 { - return nil, errors.New("crypto/rsa: key size too small for PSS signature") - } - - em := make([]byte, emLen) - psLen := emLen - sLen - hLen - 2 - db := em[:psLen+1+sLen] - h := em[psLen+1+sLen : emLen-1] - - // 4. Generate a random octet string salt of length sLen; if sLen = 0, - // then salt is the empty string. - // - // 5. Let - // M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt; - // - // M' is an octet string of length 8 + hLen + sLen with eight - // initial zero octets. - // - // 6. Let H = Hash(M'), an octet string of length hLen. - - var prefix [8]byte - - hash.Write(prefix[:]) - hash.Write(mHash) - hash.Write(salt) - - h = hash.Sum(h[:0]) - hash.Reset() - - // 7. Generate an octet string PS consisting of emLen - sLen - hLen - 2 - // zero octets. The length of PS may be 0. - // - // 8. Let DB = PS || 0x01 || salt; DB is an octet string of length - // emLen - hLen - 1. - - db[psLen] = 0x01 - copy(db[psLen+1:], salt) - - // 9. Let dbMask = MGF(H, emLen - hLen - 1). - // - // 10. Let maskedDB = DB \xor dbMask. - - mgf1XOR(db, hash, h) - - // 11. Set the leftmost 8 * emLen - emBits bits of the leftmost octet in - // maskedDB to zero. - - db[0] &= 0xff >> (8*emLen - emBits) - - // 12. Let EM = maskedDB || H || 0xbc. - em[emLen-1] = 0xbc - - // 13. Output EM. - return em, nil -} - -func emsaPSSVerify(mHash, em []byte, emBits, sLen int, hash hash.Hash) error { - // See RFC 8017, Section 9.1.2. - - hLen := hash.Size() - if sLen == rsa.PSSSaltLengthEqualsHash { - sLen = hLen - } - emLen := (emBits + 7) / 8 - if emLen != len(em) { - return errors.New("rsa: internal error: inconsistent length") - } - - // 1. If the length of M is greater than the input limitation for the - // hash function (2^61 - 1 octets for SHA-1), output "inconsistent" - // and stop. - // - // 2. Let mHash = Hash(M), an octet string of length hLen. - if hLen != len(mHash) { - return rsa.ErrVerification - } - - // 3. If emLen < hLen + sLen + 2, output "inconsistent" and stop. - if emLen < hLen+sLen+2 { - return rsa.ErrVerification - } - - // 4. If the rightmost octet of EM does not have hexadecimal value - // 0xbc, output "inconsistent" and stop. - if em[emLen-1] != 0xbc { - return rsa.ErrVerification - } - - // 5. Let maskedDB be the leftmost emLen - hLen - 1 octets of EM, and - // let H be the next hLen octets. - db := em[:emLen-hLen-1] - h := em[emLen-hLen-1 : emLen-1] - - // 6. If the leftmost 8 * emLen - emBits bits of the leftmost octet in - // maskedDB are not all equal to zero, output "inconsistent" and - // stop. - var bitMask byte = 0xff >> (8*emLen - emBits) - if em[0] & ^bitMask != 0 { - return rsa.ErrVerification - } - - // 7. Let dbMask = MGF(H, emLen - hLen - 1). - // - // 8. Let DB = maskedDB \xor dbMask. - mgf1XOR(db, hash, h) - - // 9. Set the leftmost 8 * emLen - emBits bits of the leftmost octet in DB - // to zero. - db[0] &= bitMask - - // If we don't know the salt length, look for the 0x01 delimiter. - if sLen == rsa.PSSSaltLengthAuto { - psLen := bytes.IndexByte(db, 0x01) - if psLen < 0 { - return rsa.ErrVerification - } - sLen = len(db) - psLen - 1 - } - - // 10. If the emLen - hLen - sLen - 2 leftmost octets of DB are not zero - // or if the octet at position emLen - hLen - sLen - 1 (the leftmost - // position is "position 1") does not have hexadecimal value 0x01, - // output "inconsistent" and stop. - psLen := emLen - hLen - sLen - 2 - for _, e := range db[:psLen] { - if e != 0x00 { - return rsa.ErrVerification - } - } - if db[psLen] != 0x01 { - return rsa.ErrVerification - } - - // 11. Let salt be the last sLen octets of DB. - salt := db[len(db)-sLen:] - - // 12. Let - // M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt ; - // M' is an octet string of length 8 + hLen + sLen with eight - // initial zero octets. - // - // 13. Let H' = Hash(M'), an octet string of length hLen. - var prefix [8]byte - hash.Write(prefix[:]) - hash.Write(mHash) - hash.Write(salt) - - h0 := hash.Sum(nil) - - // 14. If H = H', output "consistent." Otherwise, output "inconsistent." - if !bytes.Equal(h0, h) { // TODO: constant time? - return rsa.ErrVerification - } - return nil -} diff --git a/blindsign/blindrsa/internal/common/rsa.go b/blindsign/blindrsa/internal/common/rsa.go deleted file mode 100644 index 2510680a..00000000 --- a/blindsign/blindrsa/internal/common/rsa.go +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright (c) 2009 The Go Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package common - -import ( - "crypto/rand" - "crypto/rsa" - "hash" - "io" - "math/big" - - "github.com/quantumcoinproject/circl/blindsign/blindrsa/internal/keys" -) - -var ( - bigZero = big.NewInt(0) - bigOne = big.NewInt(1) -) - -// incCounter increments a four byte, big-endian counter. -func incCounter(c *[4]byte) { - if c[3]++; c[3] != 0 { - return - } - if c[2]++; c[2] != 0 { - return - } - if c[1]++; c[1] != 0 { - return - } - c[0]++ -} - -// mgf1XOR XORs the bytes in out with a mask generated using the MGF1 function -// specified in PKCS #1 v2.1. -func mgf1XOR(out []byte, hash hash.Hash, seed []byte) { - var counter [4]byte - var digest []byte - - done := 0 - for done < len(out) { - hash.Write(seed) - hash.Write(counter[0:4]) - digest = hash.Sum(digest[:0]) - hash.Reset() - - for i := 0; i < len(digest) && done < len(out); i++ { - out[done] ^= digest[i] - done++ - } - incCounter(&counter) - } -} - -func encrypt(c *big.Int, N *big.Int, e *big.Int, m *big.Int) *big.Int { - c.Exp(m, e, N) - return c -} - -// decrypt performs an RSA decryption, resulting in a plaintext integer. If a -// random source is given, RSA blinding is used. -func decrypt(random io.Reader, priv *keys.BigPrivateKey, c *big.Int) (m *big.Int, err error) { - // TODO(agl): can we get away with reusing blinds? - if c.Cmp(priv.Pk.N) > 0 { - return nil, rsa.ErrDecryption - } - if priv.Pk.N.Sign() == 0 { - return nil, rsa.ErrDecryption - } - - var ir *big.Int - if random != nil { - // Blinding enabled. Blinding involves multiplying c by r^e. - // Then the decryption operation performs (m^e * r^e)^d mod n - // which equals mr mod n. The factor of r can then be removed - // by multiplying by the multiplicative inverse of r. - - var r *big.Int - ir = new(big.Int) - for { - r, err = rand.Int(random, priv.Pk.N) - if err != nil { - return nil, err - } - if r.Cmp(bigZero) == 0 { - r = bigOne - } - ok := ir.ModInverse(r, priv.Pk.N) - if ok != nil { - break - } - } - rpowe := new(big.Int).Exp(r, priv.Pk.E, priv.Pk.N) // N != 0 - cCopy := new(big.Int).Set(c) - cCopy.Mul(cCopy, rpowe) - cCopy.Mod(cCopy, priv.Pk.N) - c = cCopy - } - - m = new(big.Int).Exp(c, priv.D, priv.Pk.N) - - if ir != nil { - // Unblind. - m.Mul(m, ir) - m.Mod(m, priv.Pk.N) - } - - return m, nil -} diff --git a/blindsign/blindrsa/internal/keys/big_keys.go b/blindsign/blindrsa/internal/keys/big_keys.go deleted file mode 100644 index f6ab4298..00000000 --- a/blindsign/blindrsa/internal/keys/big_keys.go +++ /dev/null @@ -1,57 +0,0 @@ -package keys - -import ( - "crypto/rsa" - "math/big" -) - -// BigPublicKey is the same as an rsa.PublicKey struct, except the public -// key is represented as a big integer as opposed to an int. For the partially -// blind scheme, this is required since the public key will typically be -// any value in the RSA group. -type BigPublicKey struct { - N *big.Int - E *big.Int -} - -// Size returns the size of the public key. -func (pub *BigPublicKey) Size() int { - return (pub.N.BitLen() + 7) / 8 -} - -// Marshal encodes the public key exponent (e). -func (pub *BigPublicKey) Marshal() []byte { - buf := make([]byte, (pub.E.BitLen()+7)/8) - pub.E.FillBytes(buf) - return buf -} - -// NewBigPublicKey creates a BigPublicKey from a rsa.PublicKey. -func NewBigPublicKey(pk *rsa.PublicKey) *BigPublicKey { - return &BigPublicKey{ - N: pk.N, - E: new(big.Int).SetInt64(int64(pk.E)), - } -} - -// CustomPublicKey is similar to rsa.PrivateKey, containing information needed -// for a private key used in the partially blind signature protocol. -type BigPrivateKey struct { - Pk *BigPublicKey - D *big.Int - P *big.Int - Q *big.Int -} - -// NewBigPrivateKey creates a BigPrivateKey from a rsa.PrivateKey. -func NewBigPrivateKey(sk *rsa.PrivateKey) *BigPrivateKey { - return &BigPrivateKey{ - Pk: &BigPublicKey{ - N: sk.N, - E: new(big.Int).SetInt64(int64(sk.PublicKey.E)), - }, - D: sk.D, - P: sk.Primes[0], - Q: sk.Primes[1], - } -} diff --git a/blindsign/blindrsa/partiallyblindrsa/pbrsa.go b/blindsign/blindrsa/partiallyblindrsa/pbrsa.go deleted file mode 100644 index 49f8c64f..00000000 --- a/blindsign/blindrsa/partiallyblindrsa/pbrsa.go +++ /dev/null @@ -1,334 +0,0 @@ -// Package partiallyblindrsa implements a partially blind RSA protocol. -package partiallyblindrsa - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" - "encoding/binary" - "errors" - "hash" - "io" - "math/big" - - "github.com/quantumcoinproject/circl/blindsign/blindrsa/internal/common" - "github.com/quantumcoinproject/circl/blindsign/blindrsa/internal/keys" - "golang.org/x/crypto/hkdf" -) - -func encodeMessageMetadata(message, metadata []byte) []byte { - lenBuffer := []byte{'m', 's', 'g', 0, 0, 0, 0} - - binary.BigEndian.PutUint32(lenBuffer[3:], uint32(len(metadata))) - framedMetadata := append(lenBuffer, metadata...) - return append(framedMetadata, message...) -} - -// A randomizedVerifier represents a Verifier in the partially blind RSA signature protocol. -// It carries state needed to produce and validate an RSA signature produced -// using the blind RSA protocol. -type randomizedVerifier struct { - // Public key of the Signer - pk *keys.BigPublicKey - - // Identifier of the cryptographic hash function used in producing the message signature - cryptoHash crypto.Hash - - // Hash function used in producing the message signature - hash hash.Hash -} - -// NewVerifier creates a new PBRSAVerifier using the corresponding Signer parameters. -// This corresponds to the RSAPBSSA-SHA384-PSS-Deterministic variant. See the specification for more details: -// https://datatracker.ietf.org/doc/html/draft-amjad-cfrg-partially-blind-rsa#name-rsapbssa-variants -func NewVerifier(pk *rsa.PublicKey, hash crypto.Hash) Verifier { - h := common.ConvertHashFunction(hash) - return randomizedVerifier{ - pk: keys.NewBigPublicKey(pk), - cryptoHash: hash, - hash: h, - } -} - -// derivePublicKey tweaks the public key based on the input metadata. -// -// See the specification for more details: -// https://datatracker.ietf.org/doc/html/draft-amjad-cfrg-partially-blind-rsa-00#name-public-key-augmentation -// -// See the following issue for more discussion on HKDF vs hash-to-field: -// https://github.com/cfrg/draft-irtf-cfrg-hash-to-curve/issues/202 -func derivePublicKey(h crypto.Hash, pk *keys.BigPublicKey, metadata []byte) *keys.BigPublicKey { - // expandLen = ceil((ceil(log2(\lambda)/2) + k) / 8), where k is the security parameter of the suite (e.g., k = 128). - // We stretch the input metadata beyond \lambda bits s.t. the output bytes are indifferentiable from truly random bytes - lambda := pk.N.BitLen() / 2 - expandLen := uint((lambda + 128) / 8) - - hkdfSalt := make([]byte, (pk.N.BitLen()+7)/8) - pk.N.FillBytes(hkdfSalt) - hkdfInput := append([]byte("key"), append(metadata, 0x00)...) - - hkdf := hkdf.New(h.New, hkdfInput, hkdfSalt, []byte("PBRSA")) - bytes := make([]byte, expandLen) - _, err := hkdf.Read(bytes) - if err != nil { - panic(err) - } - - // H_MD(D) = 1 || G(x), where G(x) is output of length \lambda-2 bits - // We do this by sampling \lambda bits, clearing the top two bits (so the output is \lambda-2 bits) - // and setting the bottom bit (so the result is odd). - newE := new(big.Int).SetBytes(bytes[:lambda/8]) - newE.SetBit(newE, 0, 1) - newE.SetBit(newE, lambda-1, 0) - newE.SetBit(newE, lambda-2, 0) - - // Compute e_MD = e * H_MD(D) - return &keys.BigPublicKey{ - N: pk.N, - E: newE, - } -} - -// deriveKeyPair tweaks the private key using the metadata as input. -// -// See the specification for more details: -// https://datatracker.ietf.org/doc/html/draft-amjad-cfrg-partially-blind-rsa-00#name-private-key-augmentation -func deriveKeyPair(h crypto.Hash, sk *keys.BigPrivateKey, metadata []byte) *keys.BigPrivateKey { - // pih(N) = (p-1)(q-1) - pm1 := new(big.Int).Set(sk.P) - pm1.Sub(pm1, new(big.Int).SetInt64(int64(1))) - qm1 := new(big.Int).Set(sk.Q) - qm1.Sub(qm1, new(big.Int).SetInt64(int64(1))) - phi := new(big.Int).Mul(pm1, qm1) - - // d = e^-1 mod phi(N) - pk := derivePublicKey(h, sk.Pk, metadata) - bigE := new(big.Int).Mod(pk.E, phi) - d := new(big.Int).ModInverse(bigE, phi) - return &keys.BigPrivateKey{ - Pk: pk, - D: d, - P: sk.P, - Q: sk.Q, - } -} - -func fixedPartiallyBlind(message, salt []byte, r, rInv *big.Int, pk *keys.BigPublicKey, hash hash.Hash) ([]byte, VerifierState, error) { - encodedMsg, err := common.EncodeMessageEMSAPSS(message, pk.N, hash, salt) - if err != nil { - return nil, VerifierState{}, err - } - - m := new(big.Int).SetBytes(encodedMsg) - - bigE := pk.E - x := new(big.Int).Exp(r, bigE, pk.N) - z := new(big.Int).Set(m) - z.Mul(z, x) - z.Mod(z, pk.N) - - kLen := (pk.N.BitLen() + 7) / 8 - blindedMsg := make([]byte, kLen) - z.FillBytes(blindedMsg) - - return blindedMsg, VerifierState{ - encodedMsg: encodedMsg, - pk: pk, - hash: hash, - salt: salt, - rInv: rInv, - }, nil -} - -// Verifier is a type that implements the client side of the partially blind RSA -// protocol, described in https://datatracker.ietf.org/doc/html/draft-amjad-cfrg-partially-blind-rsa-00 -type Verifier interface { - // Blind initializes the partially blind RSA protocol using an input message and source of - // randomness. The signature includes a randomly generated PSS salt whose length equals the - // size of the underlying hash function. This function fails if randomness was not provided. - Blind(random io.Reader, message, metadata []byte) ([]byte, VerifierState, error) - - // FixedBlind initializes the partially blind RSA protocol using an input message, metadata, and randomness values. - FixedBlind(message, metadata, salt, blind, blindInv []byte) ([]byte, VerifierState, error) - - // Verify verifies the input (message, signature) pair using the augmented public key - // and produces an error upon failure. - Verify(message, signature, metadata []byte) error - - // Hash returns the hash function associated with the Verifier. - Hash() hash.Hash -} - -// Blind initializes the partially blind RSA protocol using an input message and source of randomness. The -// signature includes a randomly generated PSS salt whose length equals the size of the underlying -// hash function. This function fails if randomness was not provided. -// -// See the specification for more details: -// https://datatracker.ietf.org/doc/html/draft-amjad-cfrg-partially-blind-rsa-00#name-blind -func (v randomizedVerifier) Blind(random io.Reader, message, metadata []byte) ([]byte, VerifierState, error) { - if random == nil { - return nil, VerifierState{}, common.ErrInvalidRandomness - } - - salt := make([]byte, v.hash.Size()) - _, err := io.ReadFull(rand.Reader, salt) - if err != nil { - return nil, VerifierState{}, err - } - - r, rInv, err := common.GenerateBlindingFactor(random, v.pk.N) - if err != nil { - return nil, VerifierState{}, err - } - - return v.FixedBlind(message, metadata, salt, r.Bytes(), rInv.Bytes()) -} - -// FixedBlind initializes the partially blind RSA using fixed randomness as input. -func (v randomizedVerifier) FixedBlind(message, metadata, salt, blind, blindInv []byte) ([]byte, VerifierState, error) { - r := new(big.Int).SetBytes(blind) - rInv := new(big.Int).SetBytes(blindInv) - metadataKey := derivePublicKey(v.cryptoHash, v.pk, metadata) - inputMsg := encodeMessageMetadata(message, metadata) - return fixedPartiallyBlind(inputMsg, salt, r, rInv, metadataKey, v.hash) -} - -// Verify verifies the input (message, signature) pair using the augmented public key -// and produces an error upon failure. -// -// See the specification for more details: -// https://datatracker.ietf.org/doc/html/draft-amjad-cfrg-partially-blind-rsa-00#name-verification-2 -func (v randomizedVerifier) Verify(message, metadata, signature []byte) error { - metadataKey := derivePublicKey(v.cryptoHash, v.pk, metadata) - inputMsg := encodeMessageMetadata(message, metadata) - return common.VerifyMessageSignature(inputMsg, signature, v.hash.Size(), metadataKey, v.cryptoHash) -} - -// Hash returns the hash function associated with the Verifier. -func (v randomizedVerifier) Hash() hash.Hash { - return v.hash -} - -// A VerifierState carries state needed to complete the blind signature protocol -// as a verifier. -type VerifierState struct { - // Public key of the Signer - pk *keys.BigPublicKey - - // Hash function used in producing the message signature - hash hash.Hash - - // The hashed and encoded message being signed - encodedMsg []byte - - // The salt used when encoding the message - salt []byte - - // Inverse of the blinding factor produced by the Verifier - rInv *big.Int -} - -// Finalize computes and outputs the final signature, if it's valid. Otherwise, it returns an error. -// -// See the specification for more details: -// https://datatracker.ietf.org/doc/html/draft-amjad-cfrg-partially-blind-rsa-00#name-finalize -func (state VerifierState) Finalize(data []byte) ([]byte, error) { - kLen := (state.pk.N.BitLen() + 7) / 8 - if len(data) != kLen { - return nil, common.ErrUnexpectedSize - } - - z := new(big.Int).SetBytes(data) - s := new(big.Int).Set(state.rInv) - s.Mul(s, z) - s.Mod(s, state.pk.N) - - sig := make([]byte, kLen) - s.FillBytes(sig) - - err := common.VerifyBlindSignature(state.pk, state.encodedMsg, sig) - if err != nil { - return nil, err - } - - return sig, nil -} - -// CopyBlind returns an encoding of the blind value used in the protocol. -func (state VerifierState) CopyBlind() []byte { - r := new(big.Int).ModInverse(state.rInv, state.pk.N) - return r.Bytes() -} - -// CopySalt returns an encoding of the per-message salt used in the protocol. -func (state VerifierState) CopySalt() []byte { - salt := make([]byte, len(state.salt)) - copy(salt, state.salt) - return salt -} - -// An Signer represents the Signer in the blind RSA protocol. -// It carries the raw RSA private key used for signing blinded messages. -type Signer struct { - // An RSA private key - sk *keys.BigPrivateKey - h crypto.Hash -} - -// isSafePrime returns true if the input prime p is safe, i.e., p = (2 * q) + 1 for some prime q -func isSafePrime(p *big.Int) bool { - q := new(big.Int).Set(p) - q.Sub(q, big.NewInt(1)) - q.Div(q, big.NewInt(2)) - return q.ProbablyPrime(20) -} - -// NewSigner creates a new Signer for the blind RSA protocol using an RSA private key. -func NewSigner(sk *rsa.PrivateKey, h crypto.Hash) (Signer, error) { - bigSk := keys.NewBigPrivateKey(sk) - if !(isSafePrime(bigSk.P) && isSafePrime(bigSk.Q)) { - return Signer{}, ErrInvalidPrivateKey - } - - return Signer{ - sk: bigSk, - h: h, - }, nil -} - -// BlindSign blindly computes the RSA operation using the Signer's private key on the blinded -// message input, if it's of valid length, and returns an error should the function fail. -// -// See the specification for more details: -// https://datatracker.ietf.org/doc/html/draft-amjad-cfrg-partially-blind-rsa-00#name-blindsign -func (signer Signer) BlindSign(data, metadata []byte) ([]byte, error) { - kLen := (signer.sk.Pk.N.BitLen() + 7) / 8 - if len(data) != kLen { - return nil, common.ErrUnexpectedSize - } - - m := new(big.Int).SetBytes(data) - if m.Cmp(signer.sk.Pk.N) > 0 { - return nil, common.ErrInvalidMessageLength - } - - skPrime := deriveKeyPair(signer.h, signer.sk, metadata) - - s, err := common.DecryptAndCheck(rand.Reader, skPrime, m) - if err != nil { - return nil, err - } - - blindSig := make([]byte, kLen) - s.FillBytes(blindSig) - - return blindSig, nil -} - -var ( - // ErrInvalidPrivateKey is the error used if a private key is invalid - ErrInvalidPrivateKey = errors.New("blindsign/blindrsa/partiallyblindrsa: invalid private key") - ErrUnexpectedSize = common.ErrUnexpectedSize - ErrInvalidMessageLength = common.ErrInvalidMessageLength - ErrInvalidRandomness = common.ErrInvalidRandomness -) diff --git a/blindsign/blindrsa/partiallyblindrsa/pbrsa_test.go b/blindsign/blindrsa/partiallyblindrsa/pbrsa_test.go deleted file mode 100644 index ba8a8cb2..00000000 --- a/blindsign/blindrsa/partiallyblindrsa/pbrsa_test.go +++ /dev/null @@ -1,356 +0,0 @@ -package partiallyblindrsa - -import ( - "bytes" - "crypto" - "crypto/rand" - "crypto/rsa" - "encoding/hex" - "encoding/json" - "fmt" - "io" - "math/big" - "os" - "testing" - - "github.com/quantumcoinproject/circl/blindsign/blindrsa/internal/keys" -) - -const ( - pbrsaTestVectorOutEnvironmentKey = "PBRSA_TEST_VECTORS_OUT" - pbrsaTestVectorInEnvironmentKey = "PBRSA_TEST_VECTORS_IN" -) - -func loadStrongRSAKey() *rsa.PrivateKey { - // https://gist.github.com/chris-wood/b77536febb25a5a11af428afff77820a - pEnc := "dcd90af1be463632c0d5ea555256a20605af3db667475e190e3af12a34a3324c46a3094062c59fb4b249e0ee6afba8bee14e0276d126c99f4784b23009bf6168ff628ac1486e5ae8e23ce4d362889de4df63109cbd90ef93db5ae64372bfe1c55f832766f21e94ea3322eb2182f10a891546536ba907ad74b8d72469bea396f3" - qEnc := "f8ba5c89bd068f57234a3cf54a1c89d5b4cd0194f2633ca7c60b91a795a56fa8c8686c0e37b1c4498b851e3420d08bea29f71d195cfbd3671c6ddc49cf4c1db5b478231ea9d91377ffa98fe95685fca20ba4623212b2f2def4da5b281ed0100b651f6db32112e4017d831c0da668768afa7141d45bbc279f1e0f8735d74395b3" - NEnc := "d6930820f71fe517bf3259d14d40209b02a5c0d3d61991c731dd7da39f8d69821552e2318d6c9ad897e603887a476ea3162c1205da9ac96f02edf31df049bd55f142134c17d4382a0e78e275345f165fbe8e49cdca6cf5c726c599dd39e09e75e0f330a33121e73976e4facba9cfa001c28b7c96f8134f9981db6750b43a41710f51da4240fe03106c12acb1e7bb53d75ec7256da3fddd0718b89c365410fce61bc7c99b115fb4c3c318081fa7e1b65a37774e8e50c96e8ce2b2cc6b3b367982366a2bf9924c4bafdb3ff5e722258ab705c76d43e5f1f121b984814e98ea2b2b8725cd9bc905c0bc3d75c2a8db70a7153213c39ae371b2b5dc1dafcb19d6fae9" - eEnc := "010001" - dEnc := "4e21356983722aa1adedb084a483401c1127b781aac89eab103e1cfc52215494981d18dd8028566d9d499469c25476358de23821c78a6ae43005e26b394e3051b5ca206aa9968d68cae23b5affd9cbb4cb16d64ac7754b3cdba241b72ad6ddfc000facdb0f0dd03abd4efcfee1730748fcc47b7621182ef8af2eeb7c985349f62ce96ab373d2689baeaea0e28ea7d45f2d605451920ca4ea1f0c08b0f1f6711eaa4b7cca66d58a6b916f9985480f90aca97210685ac7b12d2ec3e30a1c7b97b65a18d38a93189258aa346bf2bc572cd7e7359605c20221b8909d599ed9d38164c9c4abf396f897b9993c1e805e574d704649985b600fa0ced8e5427071d7049d" - - p := new(big.Int).SetBytes(mustDecodeHex(pEnc)) - q := new(big.Int).SetBytes(mustDecodeHex(qEnc)) - N := new(big.Int).SetBytes(mustDecodeHex(NEnc)) - e := new(big.Int).SetBytes(mustDecodeHex(eEnc)) - d := new(big.Int).SetBytes(mustDecodeHex(dEnc)) - - primes := make([]*big.Int, 2) - primes[0] = p - primes[1] = q - - key := &rsa.PrivateKey{ - PublicKey: rsa.PublicKey{ - N: N, - E: int(e.Int64()), - }, - D: d, - Primes: primes, - } - - return key -} - -func runPBRSA(signer Signer, verifier Verifier, message, metadata []byte, random io.Reader) ([]byte, error) { - blindedMsg, state, err := verifier.Blind(random, message, metadata) - if err != nil { - return nil, err - } - - kLen := (signer.sk.Pk.N.BitLen() + 7) / 8 - if len(blindedMsg) != kLen { - return nil, fmt.Errorf("Protocol message (blind message) length mismatch, expected %d, got %d", kLen, len(blindedMsg)) - } - - blindedSig, err := signer.BlindSign(blindedMsg, metadata) - if err != nil { - return nil, err - } - - if len(blindedSig) != kLen { - return nil, fmt.Errorf("Protocol message (blind signature) length mismatch, expected %d, got %d", kLen, len(blindedMsg)) - } - - sig, err := state.Finalize(blindedSig) - if err != nil { - return nil, err - } - - err = verifier.Verify(message, metadata, sig) - if err != nil { - return nil, err - } - - return sig, nil -} - -func mustDecodeHex(h string) []byte { - b, err := hex.DecodeString(h) - if err != nil { - panic(err) - } - return b -} - -func TestPBRSARoundTrip(t *testing.T) { - message := []byte("hello world") - metadata := []byte("metadata") - key := loadStrongRSAKey() - - hash := crypto.SHA384 - verifier := NewVerifier(&key.PublicKey, hash) - signer, err := NewSigner(key, hash) - if err != nil { - t.Fatal(err) - } - - sig, err := runPBRSA(signer, verifier, message, metadata, rand.Reader) - if err != nil { - t.Fatal(err) - } - if sig == nil { - t.Fatal("nil signature output") - } -} - -type encodedPBRSATestVector struct { - Message string `json:"msg"` - Info string `json:"info"` - P string `json:"p"` - Q string `json:"q"` - D string `json:"d"` - E string `json:"e"` - N string `json:"N"` - Eprime string `json:"eprime"` - Blind string `json:"blind"` - Salt string `json:"salt"` - Request string `json:"blinded_msg"` - Response string `json:"blinded_sig"` - Signature string `json:"sig"` -} - -type rawPBRSATestVector struct { - privateKey *rsa.PrivateKey - message []byte - info []byte - infoKey []byte - blind []byte - salt []byte - request []byte - response []byte - signature []byte -} - -func mustHex(d []byte) string { - return hex.EncodeToString(d) -} - -func (tv rawPBRSATestVector) MarshalJSON() ([]byte, error) { - pEnc := mustHex(tv.privateKey.Primes[0].Bytes()) - qEnc := mustHex(tv.privateKey.Primes[1].Bytes()) - nEnc := mustHex(tv.privateKey.N.Bytes()) - e := new(big.Int).SetInt64(int64(tv.privateKey.PublicKey.E)) - eEnc := mustHex(e.Bytes()) - dEnc := mustHex(tv.privateKey.D.Bytes()) - ePrimeEnc := mustHex(tv.infoKey) - return json.Marshal(encodedPBRSATestVector{ - P: pEnc, - Q: qEnc, - D: dEnc, - E: eEnc, - N: nEnc, - Eprime: ePrimeEnc, - Message: mustHex(tv.message), - Info: mustHex(tv.info), - Blind: mustHex(tv.blind), - Salt: mustHex(tv.salt), - Request: mustHex(tv.request), - Response: mustHex(tv.response), - Signature: mustHex(tv.signature), - }) -} - -func generatePBRSATestVector(t *testing.T, msg, metadata []byte) rawPBRSATestVector { - key := loadStrongRSAKey() - - hash := crypto.SHA384 - verifier := NewVerifier(&key.PublicKey, hash) - signer, err := NewSigner(key, hash) - if err != nil { - t.Fatal(err) - } - - publicKey := keys.NewBigPublicKey(&key.PublicKey) - metadataKey := derivePublicKey(hash, publicKey, metadata) - - blindedMsg, state, err := verifier.Blind(rand.Reader, msg, metadata) - if err != nil { - t.Fatal(err) - } - - blindedSig, err := signer.BlindSign(blindedMsg, metadata) - if err != nil { - t.Fatal(err) - } - - sig, err := state.Finalize(blindedSig) - if err != nil { - t.Fatal(err) - } - - err = verifier.Verify(msg, metadata, sig) - if err != nil { - t.Fatal(err) - } - - return rawPBRSATestVector{ - message: msg, - info: metadata, - privateKey: key, - infoKey: metadataKey.Marshal(), - salt: state.CopySalt(), - blind: state.CopyBlind(), - request: blindedMsg, - response: blindedSig, - signature: sig, - } -} - -func verifyTestVector(t *testing.T, vector rawPBRSATestVector) { - key := loadStrongRSAKey() - - key.PublicKey.N = vector.privateKey.N - key.PublicKey.E = vector.privateKey.E - key.D = vector.privateKey.D - key.Primes[0] = vector.privateKey.Primes[0] - key.Primes[1] = vector.privateKey.Primes[1] - key.Precomputed.Dp = nil // Remove precomputed CRT values - - hash := crypto.SHA384 - signer, err := NewSigner(key, hash) - if err != nil { - t.Fatal(err) - } - verifier := NewVerifier(&key.PublicKey, crypto.SHA384) - - r := new(big.Int).SetBytes(vector.blind) - rInv := new(big.Int).ModInverse(r, key.N) - if r == nil { - t.Fatal("Failed to compute blind inverse") - } - - blindedMsg, state, err := verifier.FixedBlind(vector.message, vector.info, vector.salt, r.Bytes(), rInv.Bytes()) - if err != nil { - t.Fatal(err) - } - - blindSig, err := signer.BlindSign(blindedMsg, vector.info) - if err != nil { - t.Fatal(err) - } - - sig, err := state.Finalize(blindSig) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(sig, vector.signature) { - t.Errorf("Signature mismatch: expected %x, got %x", sig, vector.signature) - } -} - -func TestPBRSAGenerateTestVector(t *testing.T) { - testCases := []struct { - msg []byte - metadata []byte - }{ - { - []byte("hello world"), - []byte("metadata"), - }, - { - []byte("hello world"), - []byte(""), - }, - { - []byte(""), - []byte("metadata"), - }, - { - []byte(""), - []byte(""), - }, - } - - vectors := []rawPBRSATestVector{} - for _, testCase := range testCases { - vectors = append(vectors, generatePBRSATestVector(t, testCase.msg, testCase.metadata)) - } - - for _, vector := range vectors { - verifyTestVector(t, vector) - } - - // Encode the test vectors - encoded, err := json.Marshal(vectors) - if err != nil { - t.Fatalf("Error producing test vectors: %v", err) - } - - var outputFile string - if outputFile = os.Getenv(pbrsaTestVectorOutEnvironmentKey); len(outputFile) > 0 { - err := os.WriteFile(outputFile, encoded, 0o600) - if err != nil { - t.Fatalf("Error writing test vectors: %v", err) - } - } -} - -func BenchmarkPBRSA(b *testing.B) { - message := []byte("hello world") - metadata := []byte("good doggo") - key := loadStrongRSAKey() - - hash := crypto.SHA384 - verifier := NewVerifier(&key.PublicKey, hash) - signer, err := NewSigner(key, hash) - if err != nil { - b.Fatal(err) - } - - var blindedMsg []byte - var state VerifierState - b.Run("Blind", func(b *testing.B) { - for n := 0; n < b.N; n++ { - blindedMsg, state, err = verifier.Blind(rand.Reader, message, metadata) - if err != nil { - b.Fatal(err) - } - } - }) - - var blindedSig []byte - b.Run("BlindSign", func(b *testing.B) { - for n := 0; n < b.N; n++ { - blindedSig, err = signer.BlindSign(blindedMsg, metadata) - if err != nil { - b.Fatal(err) - } - } - }) - - var sig []byte - b.Run("Finalize", func(b *testing.B) { - for n := 0; n < b.N; n++ { - sig, err = state.Finalize(blindedSig) - if err != nil { - b.Fatal(err) - } - } - }) - - err = verifier.Verify(message, metadata, sig) - if err != nil { - b.Fatal(err) - } -} diff --git a/blindsign/blindrsa/testdata/testRSA2048.rfc9500.pem b/blindsign/blindrsa/testdata/testRSA2048.rfc9500.pem deleted file mode 100644 index f5c79faf..00000000 --- a/blindsign/blindrsa/testdata/testRSA2048.rfc9500.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA TESTING KEY----- -MIIEowIBAAKCAQEAsPnoGUOnrpiSqt4XynxA+HRP7S+BSObI6qJ7fQAVSPtRkqso -tWxQYLEYzNEx5ZSHTGypibVsJylvCfuToDTfMul8b/CZjP2Ob0LdpYrNH6l5hvFE -89FU1nZQF15oVLOpUgA7wGiHuEVawrGfey92UE68mOyUVXGweJIVDdxqdMoPvNNU -l86BU02vlBiESxOuox+dWmuVV7vfYZ79Toh/LUK43YvJh+rhv4nKuF7iHjVjBd9s -B6iDjj70HFldzOQ9r8SRI+9NirupPTkF5AKNe6kUhKJ1luB7S27ZkvB3tSTT3P59 -3VVJvnzOjaA1z6Cz+4+eRvcysqhrRgFlwI9TEwIDAQABAoIBAEEYiyDP29vCzx/+ -dS3LqnI5BjUuJhXUnc6AWX/PCgVAO+8A+gZRgvct7PtZb0sM6P9ZcLrweomlGezI -FrL0/6xQaa8bBr/ve/a8155OgcjFo6fZEw3Dz7ra5fbSiPmu4/b/kvrg+Br1l77J -aun6uUAs1f5B9wW+vbR7tzbT/mxaUeDiBzKpe15GwcvbJtdIVMa2YErtRjc1/5B2 -BGVXyvlJv0SIlcIEMsHgnAFOp1ZgQ08aDzvilLq8XVMOahAhP1O2A3X8hKdXPyrx -IVWE9bS9ptTo+eF6eNl+d7htpKGEZHUxinoQpWEBTv+iOoHsVunkEJ3vjLP3lyI/ -fY0NQ1ECgYEA3RBXAjgvIys2gfU3keImF8e/TprLge1I2vbWmV2j6rZCg5r/AS0u -pii5CvJ5/T5vfJPNgPBy8B/yRDs+6PJO1GmnlhOkG9JAIPkv0RBZvR0PMBtbp6nT -Y3yo1lwamBVBfY6rc0sLTzosZh2aGoLzrHNMQFMGaauORzBFpY5lU50CgYEAzPHl -u5DI6Xgep1vr8QvCUuEesCOgJg8Yh1UqVoY/SmQh6MYAv1I9bLGwrb3WW/7kqIoD -fj0aQV5buVZI2loMomtU9KY5SFIsPV+JuUpy7/+VE01ZQM5FdY8wiYCQiVZYju9X -Wz5LxMNoz+gT7pwlLCsC4N+R8aoBk404aF1gum8CgYAJ7VTq7Zj4TFV7Soa/T1eE -k9y8a+kdoYk3BASpCHJ29M5R2KEA7YV9wrBklHTz8VzSTFTbKHEQ5W5csAhoL5Fo -qoHzFFi3Qx7MHESQb9qHyolHEMNx6QdsHUn7rlEnaTTyrXh3ifQtD6C0yTmFXUIS -CW9wKApOrnyKJ9nI0HcuZQKBgQCMtoV6e9VGX4AEfpuHvAAnMYQFgeBiYTkBKltQ -XwozhH63uMMomUmtSG87Sz1TmrXadjAhy8gsG6I0pWaN7QgBuFnzQ/HOkwTm+qKw -AsrZt4zeXNwsH7QXHEJCFnCmqw9QzEoZTrNtHJHpNboBuVnYcoueZEJrP8OnUG3r -UjmopwKBgAqB2KYYMUqAOvYcBnEfLDmyZv9BTVNHbR2lKkMYqv5LlvDaBxVfilE0 -2riO4p6BaAdvzXjKeRrGNEKoHNBpOSfYCOM16NjL8hIZB1CaV3WbT5oY+jp7Mzd5 -7d56RZOE+ERK2uz/7JX9VSsM/LbH9pJibd4e8mikDS9ntciqOH/3 ------END RSA TESTING KEY----- diff --git a/blindsign/blindrsa/testdata/test_vectors_rfc9474.json b/blindsign/blindrsa/testdata/test_vectors_rfc9474.json deleted file mode 100644 index bbde82ef..00000000 --- a/blindsign/blindrsa/testdata/test_vectors_rfc9474.json +++ /dev/null @@ -1,77 +0,0 @@ -[ - { - "name": "RSABSSA-SHA384-PSS-Randomized", - "p": "0xe1f4d7a34802e27c7392a3cea32a262a34dc3691bd87f3f310dc75673488930559c120fd0410194fb8a0da55bd0b81227e843fdca6692ae80e5a5d414116d4803fca7d8c30eaaae57e44a1816ebb5c5b0606c536246c7f11985d731684150b63c9a3ad9e41b04c0b5b27cb188a692c84696b742a80d3cd00ab891f2457443dadfeba6d6daf108602be26d7071803c67105a5426838e6889d77e8474b29244cefaf418e381b312048b457d73419213063c60ee7b0d81820165864fef93523c9635c22210956e53a8d96322493ffc58d845368e2416e078e5bcb5d2fd68ae6acfa54f9627c42e84a9d3f2774017e32ebca06308a12ecc290c7cd1156dcccfb2311", - "q": "0xc601a9caea66dc3835827b539db9df6f6f5ae77244692780cd334a006ab353c806426b60718c05245650821d39445d3ab591ed10a7339f15d83fe13f6a3dfb20b9452c6a9b42eaa62a68c970df3cadb2139f804ad8223d56108dfde30ba7d367e9b0a7a80c4fdba2fd9dde6661fc73fc2947569d2029f2870fc02d8325acf28c9afa19ecf962daa7916e21afad09eb62fe9f1cf91b77dc879b7974b490d3ebd2e95426057f35d0a3c9f45f79ac727ab81a519a8b9285932d9b2e5ccd347e59f3f32ad9ca359115e7da008ab7406707bd0e8e185a5ed8758b5ba266e8828f8d863ae133846304a2936ad7bc7c9803879d2fc4a28e69291d73dbd799f8bc238385", - "n": "0xaec4d69addc70b990ea66a5e70603b6fee27aafebd08f2d94cbe1250c556e047a928d635c3f45ee9b66d1bc628a03bac9b7c3f416fe20dabea8f3d7b4bbf7f963be335d2328d67e6c13ee4a8f955e05a3283720d3e1f139c38e43e0338ad058a9495c53377fc35be64d208f89b4aa721bf7f7d3fef837be2a80e0f8adf0bcd1eec5bb040443a2b2792fdca522a7472aed74f31a1ebe1eebc1f408660a0543dfe2a850f106a617ec6685573702eaaa21a5640a5dcaf9b74e397fa3af18a2f1b7c03ba91a6336158de420d63188ee143866ee415735d155b7c2d854d795b7bc236cffd71542df34234221a0413e142d8c61355cc44d45bda94204974557ac2704cd8b593f035a5724b1adf442e78c542cd4414fce6f1298182fb6d8e53cef1adfd2e90e1e4deec52999bdc6c29144e8d52a125232c8c6d75c706ea3cc06841c7bda33568c63a6c03817f722b50fcf898237d788a4400869e44d90a3020923dc646388abcc914315215fcd1bae11b1c751fd52443aac8f601087d8d42737c18a3fa11ecd4131ecae017ae0a14acfc4ef85b83c19fed33cfd1cd629da2c4c09e222b398e18d822f77bb378dea3cb360b605e5aa58b20edc29d000a66bd177c682a17e7eb12a63ef7c2e4183e0d898f3d6bf567ba8ae84f84f1d23bf8b8e261c3729e2fa6d07b832e07cddd1d14f55325c6f924267957121902dc19b3b32948bdead5", - "e": "0x010001", - "d": "0x0d43242aefe1fb2c13fbc66e20b678c4336d20b1808c558b6e62ad16a287077180b177e1f01b12f9c6cd6c52630257ccef26a45135a990928773f3bd2fc01a313f1dac97a51cec71cb1fd7efc7adffdeb05f1fb04812c924ed7f4a8269925dad88bd7dcfbc4ef01020ebfc60cb3e04c54f981fdbd273e69a8a58b8ceb7c2d83fbcbd6f784d052201b88a9848186f2a45c0d2826870733e6fd9aa46983e0a6e82e35ca20a439c5ee7b502a9062e1066493bdadf8b49eb30d9558ed85abc7afb29b3c9bc644199654a4676681af4babcea4e6f71fe4565c9c1b85d9985b84ec1abf1a820a9bbebee0df1398aae2c85ab580a9f13e7743afd3108eb32100b870648fa6bc17e8abac4d3c99246b1f0ea9f7f93a5dd5458c56d9f3f81ff2216b3c3680a13591673c43194d8e6fc93fc1e37ce2986bd628ac48088bc723d8fbe293861ca7a9f4a73e9fa63b1b6d0074f5dea2a624c5249ff3ad811b6255b299d6bc5451ba7477f19c5a0db690c3e6476398b1483d10314afd38bbaf6e2fbdbcd62c3ca9797a420ca6034ec0a83360a3ee2adf4b9d4ba29731d131b099a38d6a23cc463db754603211260e99d19affc902c915d7854554aabf608e3ac52c19b8aa26ae042249b17b2d29669b5c859103ee53ef9bdc73ba3c6b537d5c34b6d8f034671d7f3a8a6966cc4543df223565343154140fd7391c7e7be03e241f4ecfeb877a051", - "msg": "8f3dc6fb8c4a02f4d6352edf0907822c1210a9b32f9bdda4c45a698c80023aa6b59f8cfec5fdbb36331372ebefedae7d", - "msg_prefix": "8417e699b219d583fb6216ae0c53ca0e9723442d02f1d1a34295527e7d929e8b", - "input_msg": "8417e699b219d583fb6216ae0c53ca0e9723442d02f1d1a34295527e7d929e8b8f3dc6fb8c4a02f4d6352edf0907822c1210a9b32f9bdda4c45a698c80023aa6b59f8cfec5fdbb36331372ebefedae7d", - "sLen": "0x30", - "salt": "051722b35f458781397c3a671a7d3bd3096503940e4c4f1aaa269d60300ce449555cd7340100df9d46944c5356825abf", - "is_randomized": "0x01", - "inv": "0x80682c48982407b489d53d1261b19ec8627d02b8cda5336750b8cee332ae260de57b02d72609c1e0e9f28e2040fc65b6f02d56dbd6aa9af8fde656f70495dfb723ba01173d4707a12fddac628ca29f3e32340bd8f7ddb557cf819f6b01e445ad96f874ba235584ee71f6581f62d4f43bf03f910f6510deb85e8ef06c7f09d9794a008be7ff2529f0ebb69decef646387dc767b74939265fec0223aa6d84d2a8a1cc912d5ca25b4e144ab8f6ba054b54910176d5737a2cff011da431bd5f2a0d2d66b9e70b39f4b050e45c0d9c16f02deda9ddf2d00f3e4b01037d7029cd49c2d46a8e1fc2c0c17520af1f4b5e25ba396afc4cd60c494a4c426448b35b49635b337cfb08e7c22a39b256dd032c00adddafb51a627f99a0e1704170ac1f1912e49d9db10ec04c19c58f420212973e0cb329524223a6aa56c7937c5dffdb5d966b6cd4cbc26f3201dd25c80960a1a111b32947bb78973d269fac7f5186530930ed19f68507540eed9e1bab8b00f00d8ca09b3f099aae46180e04e3584bd7ca054df18a1504b89d1d1675d0966c4ae1407be325cdf623cf13ff13e4a28b594d59e3eadbadf6136eee7a59d6a444c9eb4e2198e8a974f27a39eb63af2c9af3870488b8adaad444674f512133ad80b9220e09158521614f1faadfe8505ef57b7df6813048603f0dd04f4280177a11380fbfc861dbcbd7418d62155248dad5fdec0991f", - "blinded_msg": "aa3ee045138d874669685ffaef962c7694a9450aa9b4fd6465db9b3b75a522bb921c4c0fdcdfae9667593255099cff51f5d3fd65e8ffb9d3b3036252a6b51b6edfb3f40382b2bbf34c0055e4cbcc422850e586d84f190cd449af11dc65545f5fe26fd89796eb87da4bda0c545f397cddfeeb56f06e28135ec74fd477949e7677f6f36cfae8fd5c1c5898b03b9c244cf6d1a4fb7ad1cb43aff5e80cb462fac541e72f67f0a50f1843d1759edfaae92d1a916d3f0efaf4d650db416c3bf8abdb5414a78cebc97de676723cb119e77aea489f2bbf530c440ebc5a75dccd3ebf5a412a5f346badd61bee588e5917bdcce9dc33c882e39826951b0b8276c6203971947072b726e935816056ff5cb11a71ca2946478584126bb877acdf87255f26e6cca4e0878801307485d3b7bb89b289551a8b65a7a6b93db010423d1406e149c87731910306e5e410b41d4da3234624e74f92845183e323cf7eb244f212a695f8856c675fbc3a021ce649e22c6f0d053a9d238841cf3afdc2739f99672a419ae13c17f1f8a3bc302ec2e7b98e8c353898b7150ad8877ec841ea6e4b288064c254fefd0d049c3ad196bf7ffa535e74585d0120ce728036ed500942fbd5e6332c298f1ffebe9ff60c1e117b274cf0cb9d70c36ee4891528996ec1ed0b178e9f3c0c0e6120885f39e8ccaadbb20f3196378c07b1ff22d10049d3039a7a92fe7efdd95d", - "blind_sig": "3f4a79eacd4445fca628a310d41e12fcd813c4d43aa4ef2b81226953248d6d00adfee6b79cb88bfa1f99270369fd063c023e5ed546719b0b2d143dd1bca46b0e0e615fe5c63d95c5a6b873b8b50bc52487354e69c3dfbf416e7aca18d5842c89b676efdd38087008fa5a810161fcdec26f20ccf2f1e6ab0f9d2bb93e051cb9e86a9b28c5bb62fd5f5391379f887c0f706a08bcc3b9e7506aaf02485d688198f5e22eefdf837b2dd919320b17482c5cc54271b4ccb41d267629b3f844fd63750b01f5276c79e33718bb561a152acb2eb36d8be75bce05c9d1b94eb609106f38226fb2e0f5cd5c5c39c59dda166862de498b8d92f6bcb41af433d65a2ac23da87f39764cb64e79e74a8f4ce4dd567480d967cefac46b6e9c06434c3715635834357edd2ce6f105eea854ac126ccfa3de2aac5607565a4e5efaac5eed491c335f6fc97e6eb7e9cea3e12de38dfb315220c0a3f84536abb2fdd722813e083feda010391ac3d8fd1cd9212b5d94e634e69ebcc800c4d5c4c1091c64afc37acf563c7fc0a6e4c082bc55544f50a7971f3fb97d5853d72c3af34ffd5ce123998be5360d1059820c66a81e1ee6d9c1803b5b62af6bc877526df255b6d1d835d8c840bebbcd6cc0ee910f17da37caf8488afbc08397a1941fcc79e76a5888a95b3d5405e13f737bea5c78d716a48eb9dc0aec8de39c4b45c6914ad4a8185969f70b1adf46", - "sig": "191e941c57510e22d29afad257de5ca436d2316221fe870c7cb75205a6c071c2735aed0bc24c37f3d5bd960ab97a829a508f966bbaed7a82645e65eadaf24ab5e6d9421392c5b15b7f9b640d34fec512846a3100b80f75ef51064602118c1a77d28d938f6efc22041d60159a518d3de7c4d840c9c68109672d743d299d8d2577ef60c19ab463c716b3fa75fa56f5735349d414a44df12bf0dd44aa3e10822a651ed4cb0eb6f47c9bd0ef14a034a7ac2451e30434d513eb22e68b7587a8de9b4e63a059d05c8b22c7c51e2cfee2d8bef511412e93c859a13726d87c57d1bc4c2e68ab121562f839c3a3d233e87ed63c69b7e57525367753fbebcc2a9805a2802659f5888b2c69115bf865559f10d906c09d048a0d71bfee4b33857393ec2b69e451433496d02c9a7910abb954317720bbde9e69108eafc3e90bad3d5ca4066d7b1e49013fa04e948104a1dd82b12509ecb146e948c54bd8bfb5e6d18127cd1f7a93c3cf9f2d869d5a78878c03fe808a0d799e910be6f26d18db61c485b303631d3568368fc41986d08a95ea6ac0592240c19d7b22416b9c82ae6241e211dd5610d0baaa9823158f9c32b66318f5529491b7eeadcaa71898a63bac9d95f4aa548d5e97568d744fc429104e32edd9c87519892a198a30d333d427739ffb9607b092e910ae37771abf2adb9f63bc058bf58062ad456cb934679795bbdfcdfad5e0f2" - }, - { - "name": "RSABSSA-SHA384-PSSZERO-Randomized", - "p": "0xe1f4d7a34802e27c7392a3cea32a262a34dc3691bd87f3f310dc75673488930559c120fd0410194fb8a0da55bd0b81227e843fdca6692ae80e5a5d414116d4803fca7d8c30eaaae57e44a1816ebb5c5b0606c536246c7f11985d731684150b63c9a3ad9e41b04c0b5b27cb188a692c84696b742a80d3cd00ab891f2457443dadfeba6d6daf108602be26d7071803c67105a5426838e6889d77e8474b29244cefaf418e381b312048b457d73419213063c60ee7b0d81820165864fef93523c9635c22210956e53a8d96322493ffc58d845368e2416e078e5bcb5d2fd68ae6acfa54f9627c42e84a9d3f2774017e32ebca06308a12ecc290c7cd1156dcccfb2311", - "q": "0xc601a9caea66dc3835827b539db9df6f6f5ae77244692780cd334a006ab353c806426b60718c05245650821d39445d3ab591ed10a7339f15d83fe13f6a3dfb20b9452c6a9b42eaa62a68c970df3cadb2139f804ad8223d56108dfde30ba7d367e9b0a7a80c4fdba2fd9dde6661fc73fc2947569d2029f2870fc02d8325acf28c9afa19ecf962daa7916e21afad09eb62fe9f1cf91b77dc879b7974b490d3ebd2e95426057f35d0a3c9f45f79ac727ab81a519a8b9285932d9b2e5ccd347e59f3f32ad9ca359115e7da008ab7406707bd0e8e185a5ed8758b5ba266e8828f8d863ae133846304a2936ad7bc7c9803879d2fc4a28e69291d73dbd799f8bc238385", - "n": "0xaec4d69addc70b990ea66a5e70603b6fee27aafebd08f2d94cbe1250c556e047a928d635c3f45ee9b66d1bc628a03bac9b7c3f416fe20dabea8f3d7b4bbf7f963be335d2328d67e6c13ee4a8f955e05a3283720d3e1f139c38e43e0338ad058a9495c53377fc35be64d208f89b4aa721bf7f7d3fef837be2a80e0f8adf0bcd1eec5bb040443a2b2792fdca522a7472aed74f31a1ebe1eebc1f408660a0543dfe2a850f106a617ec6685573702eaaa21a5640a5dcaf9b74e397fa3af18a2f1b7c03ba91a6336158de420d63188ee143866ee415735d155b7c2d854d795b7bc236cffd71542df34234221a0413e142d8c61355cc44d45bda94204974557ac2704cd8b593f035a5724b1adf442e78c542cd4414fce6f1298182fb6d8e53cef1adfd2e90e1e4deec52999bdc6c29144e8d52a125232c8c6d75c706ea3cc06841c7bda33568c63a6c03817f722b50fcf898237d788a4400869e44d90a3020923dc646388abcc914315215fcd1bae11b1c751fd52443aac8f601087d8d42737c18a3fa11ecd4131ecae017ae0a14acfc4ef85b83c19fed33cfd1cd629da2c4c09e222b398e18d822f77bb378dea3cb360b605e5aa58b20edc29d000a66bd177c682a17e7eb12a63ef7c2e4183e0d898f3d6bf567ba8ae84f84f1d23bf8b8e261c3729e2fa6d07b832e07cddd1d14f55325c6f924267957121902dc19b3b32948bdead5", - "e": "0x010001", - "d": "0x0d43242aefe1fb2c13fbc66e20b678c4336d20b1808c558b6e62ad16a287077180b177e1f01b12f9c6cd6c52630257ccef26a45135a990928773f3bd2fc01a313f1dac97a51cec71cb1fd7efc7adffdeb05f1fb04812c924ed7f4a8269925dad88bd7dcfbc4ef01020ebfc60cb3e04c54f981fdbd273e69a8a58b8ceb7c2d83fbcbd6f784d052201b88a9848186f2a45c0d2826870733e6fd9aa46983e0a6e82e35ca20a439c5ee7b502a9062e1066493bdadf8b49eb30d9558ed85abc7afb29b3c9bc644199654a4676681af4babcea4e6f71fe4565c9c1b85d9985b84ec1abf1a820a9bbebee0df1398aae2c85ab580a9f13e7743afd3108eb32100b870648fa6bc17e8abac4d3c99246b1f0ea9f7f93a5dd5458c56d9f3f81ff2216b3c3680a13591673c43194d8e6fc93fc1e37ce2986bd628ac48088bc723d8fbe293861ca7a9f4a73e9fa63b1b6d0074f5dea2a624c5249ff3ad811b6255b299d6bc5451ba7477f19c5a0db690c3e6476398b1483d10314afd38bbaf6e2fbdbcd62c3ca9797a420ca6034ec0a83360a3ee2adf4b9d4ba29731d131b099a38d6a23cc463db754603211260e99d19affc902c915d7854554aabf608e3ac52c19b8aa26ae042249b17b2d29669b5c859103ee53ef9bdc73ba3c6b537d5c34b6d8f034671d7f3a8a6966cc4543df223565343154140fd7391c7e7be03e241f4ecfeb877a051", - "msg": "8f3dc6fb8c4a02f4d6352edf0907822c1210a9b32f9bdda4c45a698c80023aa6b59f8cfec5fdbb36331372ebefedae7d", - "msg_prefix": "84ea86c8cf3beedfed73beceabd792027c609d1100bf041fdd60d826a718130d", - "input_msg": "84ea86c8cf3beedfed73beceabd792027c609d1100bf041fdd60d826a718130d8f3dc6fb8c4a02f4d6352edf0907822c1210a9b32f9bdda4c45a698c80023aa6b59f8cfec5fdbb36331372ebefedae7d", - "sLen": "0x00", - "salt": "", - "encoded_msg": "37f4ea66054b3570f2c46f43125a8df8d751a81db1003edcc70e9888cb3d0fa71bb7634437a779c1bf9e84e88b3479894490ee41cd69fc8e911478326fe8460d1699f96abedde22ba0ba25a02f78bae77eb039decd41e6cd40fecc28f301c94d5644eb3e55b316569e2bec3ccf8e33b06eb6defca5fe672613d33ea60f84daa560ded4c1c5e65613fb19e090d0fc96a1394e29dfad6a7644362bf30bdc90c7ca0a065190f5a099b5c33ae787b872518a724d9aa139229656eb21053bbe86c38f6d03b4c6fa37a900935d9b8d19e0c394be4af6af028680996e3fd533b6698ce9e2ed6a9f96d4d3a682027ae5240040e55d75017dc303b7142c1f7e17b79778a94431398d21dc0cc7ae454cc0d6cf4db4d588d3fd15fd7f71576052fd2a52d688f99790dfb13808ecb24b6b9e9a43a8c0105670ec3ad8d6318a9c6a9cef9eb99b36d74b8e83dbacf6e8100e135b609850b34a4b01091b263678d7cd9905af2ffda801a2888d863a25211903b43cb5e59f5dba6bc18713ce4f028f1774c593664912f1d181d4544a13a1da354332d8595f59cf5af260a8aaf21a6bc948b5d5d4a520c1f72c216259dc12a33c2a3bd4d32ff2bf3de2ffe76e51f8af030b40fadc5899e740da20be1dd5a50f701292ceaee51fa35d9a047f3efc6543dc583fb3f23abeade39c2a5b5b352de26d7a11267435be7bffa8f2292e139fad923dbaf863bc", - "is_randomized": "0x01", - "inv": "0x80682c48982407b489d53d1261b19ec8627d02b8cda5336750b8cee332ae260de57b02d72609c1e0e9f28e2040fc65b6f02d56dbd6aa9af8fde656f70495dfb723ba01173d4707a12fddac628ca29f3e32340bd8f7ddb557cf819f6b01e445ad96f874ba235584ee71f6581f62d4f43bf03f910f6510deb85e8ef06c7f09d9794a008be7ff2529f0ebb69decef646387dc767b74939265fec0223aa6d84d2a8a1cc912d5ca25b4e144ab8f6ba054b54910176d5737a2cff011da431bd5f2a0d2d66b9e70b39f4b050e45c0d9c16f02deda9ddf2d00f3e4b01037d7029cd49c2d46a8e1fc2c0c17520af1f4b5e25ba396afc4cd60c494a4c426448b35b49635b337cfb08e7c22a39b256dd032c00adddafb51a627f99a0e1704170ac1f1912e49d9db10ec04c19c58f420212973e0cb329524223a6aa56c7937c5dffdb5d966b6cd4cbc26f3201dd25c80960a1a111b32947bb78973d269fac7f5186530930ed19f68507540eed9e1bab8b00f00d8ca09b3f099aae46180e04e3584bd7ca054df18a1504b89d1d1675d0966c4ae1407be325cdf623cf13ff13e4a28b594d59e3eadbadf6136eee7a59d6a444c9eb4e2198e8a974f27a39eb63af2c9af3870488b8adaad444674f512133ad80b9220e09158521614f1faadfe8505ef57b7df6813048603f0dd04f4280177a11380fbfc861dbcbd7418d62155248dad5fdec0991f", - "blinded_msg": "4c1b82d9b97b968b2ce0754e326abd49e3d723ed937d84bead34b6a834483b43d510bf62ca47683ed366d94d3d357b270a85cf2cc2ddd171141b45d7549d5373cf67d14f6f462c14ebded906793144faba37f129c0f3172854ec0f854e555552eec5a30c87788f1039814594f04348709e26a883be82affff207b1886b75c037f43f847f45d89bcbf210c22ffcdf8118ce8a526b3723e6209c26319f8f5d2adcf0b637031c9fdf53470a915c587e30287ba88ed4f1cd5e93cf3d4990acf31fffdbfddec80ae0b728d5b4c612a396fd81acaa65566a4dc1c24624f44fd10cdba05f3d0bed2e69bb0d13d41a9f1b4e67aa566520778733ced5e6260f4d1982f63bb835442acffe3cb87f5f8ec6bb84226e0eab787159d08e57604b13557ceea97f2c4ad0631accf898f302df86f0b64354ec0b3bdf1b4e2a4deb4d38f655ea8d80de4cc19aa06ffcd56e348faf894c8774c53235ddcc152d80cf66b417eee4d182781bab8c979937a3c7502d8f39c57c4f09884de5a7247f2539910a96e4b15f9a3df88edc21a13030af357467a99dca50dba4afe4a6185a240ac8f1d8aab2e83443025f94e1af930f56f78661369cc6790701f31b83aec40f96a72c7f7ba13b4ebdd8e24e7351f4ffba0a7c072cb28f13aff06cd02368491044fcc536213b2e3b1cf6ca81cf2097b7b19d2b36bd246f390f53768f1c2e56113ea91b33c7cfa647", - "blind_sig": "4894f64d7214c216282d9842cbf7e7cccd9c0dcb1f4294a6bdeccd4c4c2446160d7cac7892f01b70dfa69f533891d2fbb447f7cf7541d1b504a2d46fc1bb6de26b345972aada8ebce280b906f3a10a13208f77ef896fbe6bc4504327fd4c5c8f03211d45ae9672e9f4be0f4900762ba2a7177a58b90d6dd1263faf2b7a5f15d50a7b00e733742c1b6a1ea4eb5fbfb407abf14496ab26b50cf1a5a56dea616b7a6a5595777400571a751c682b9fdd6badb3f72292f314f4ba2ba0f394f91676a4bb12e60ea08c977f7082be6357c1ca82fe3301fe5fb4128609bee2410db0481aea3a5737fb0bce9381272c2202644f662e99f64bf1190d66e230cc0371ec33fe32fe725dfd872041914d39462a909414a780c9aab394af443199eba56c83986d22d57d4421b41ff8e5bec537d271223adb34d26c64989048a88d8f352a06a7cc153e216a6bed9548bb38d2a1600b2f3403289df6df74aec525ef9e413b7140a7c1a914dedd74a336f1beed39a8e5e2cef76cac094df0dbb3fa55d4b7ee781c74bed3bd8bc7aa6ef3f1dbfa4674945720ec93dafa6d0650229ab75e3fae687327fac081cf4bb376e02a2b73314c54c12f88572c28980f13aba5731bc5a3a60575ea116c8ea2fe5009168deb1255026c9310783ff7f644255d3e1691e194db1babd7780b9a5dc0cb3de2b700d12f49cbe4db51ca2f3c8a58b09e854cc71e8070ab", - "sig": "195363ba25e4bf763f6538c86865785f93f4ea6092da3ad200d41b99eb0eb0869fa792df619fd8fa5923d5d03d5882faae6d25054118deef5e4a6a252dd5afb0dac262b74c391090b1575fbafd959d26bc294f47fb45a2c1c209932c4f94b24394eded91fbdd015e1a85dde63c9e77a0283f812cad1192d86432c51331e46fd4f3771bbafb929f847a19cb05e5f79b6b519d67e8f005951e53656be97cb612d2f506618b366403b34648451d6fbc7318c2f3f583cc6fa17bf2108398f9284e0602187904406a9322f1e7b8016ca9ad11b835756df862c465c420535e25faa48bf341f7ee8192be47fa875791f32f56d5e631d237060688f052426dee5b0b2b74ca5f830e82a453379eedb541fa4fcdaa19dae6509401e3cdd4c40f5c9243db3f6d7115c4e8cd6db8290723ab01d9d0d7e355a97a01547800e43f11736668c3f8908848d759c33a67a2f506abc3f6871cbe625b1bc71eb06d785a59501396712c581a60d6ccc450d2f4eb4cf08ae0dbfa45c2860425be90cc4cd4c989495bbd2963e19c59ae5d90d1ca884e80d654b5f2cd6a80c3588b514ee91c802736f594c340397b316a97e9c70b0609955b6c3ee06f4760d9377f0797a0411a244db395bb8b711ef79fbcb5589226174029be79a72dcd6f4ca566b7b1b9a27e43b5c02a9a579d60bdda183398d66d76e0e8eceb1af2f27633589d043bcdc041683b31f7f1" - }, - { - "name": "RSABSSA-SHA384-PSS-Deterministic", - "p": "0xe1f4d7a34802e27c7392a3cea32a262a34dc3691bd87f3f310dc75673488930559c120fd0410194fb8a0da55bd0b81227e843fdca6692ae80e5a5d414116d4803fca7d8c30eaaae57e44a1816ebb5c5b0606c536246c7f11985d731684150b63c9a3ad9e41b04c0b5b27cb188a692c84696b742a80d3cd00ab891f2457443dadfeba6d6daf108602be26d7071803c67105a5426838e6889d77e8474b29244cefaf418e381b312048b457d73419213063c60ee7b0d81820165864fef93523c9635c22210956e53a8d96322493ffc58d845368e2416e078e5bcb5d2fd68ae6acfa54f9627c42e84a9d3f2774017e32ebca06308a12ecc290c7cd1156dcccfb2311", - "q": "0xc601a9caea66dc3835827b539db9df6f6f5ae77244692780cd334a006ab353c806426b60718c05245650821d39445d3ab591ed10a7339f15d83fe13f6a3dfb20b9452c6a9b42eaa62a68c970df3cadb2139f804ad8223d56108dfde30ba7d367e9b0a7a80c4fdba2fd9dde6661fc73fc2947569d2029f2870fc02d8325acf28c9afa19ecf962daa7916e21afad09eb62fe9f1cf91b77dc879b7974b490d3ebd2e95426057f35d0a3c9f45f79ac727ab81a519a8b9285932d9b2e5ccd347e59f3f32ad9ca359115e7da008ab7406707bd0e8e185a5ed8758b5ba266e8828f8d863ae133846304a2936ad7bc7c9803879d2fc4a28e69291d73dbd799f8bc238385", - "n": "0xaec4d69addc70b990ea66a5e70603b6fee27aafebd08f2d94cbe1250c556e047a928d635c3f45ee9b66d1bc628a03bac9b7c3f416fe20dabea8f3d7b4bbf7f963be335d2328d67e6c13ee4a8f955e05a3283720d3e1f139c38e43e0338ad058a9495c53377fc35be64d208f89b4aa721bf7f7d3fef837be2a80e0f8adf0bcd1eec5bb040443a2b2792fdca522a7472aed74f31a1ebe1eebc1f408660a0543dfe2a850f106a617ec6685573702eaaa21a5640a5dcaf9b74e397fa3af18a2f1b7c03ba91a6336158de420d63188ee143866ee415735d155b7c2d854d795b7bc236cffd71542df34234221a0413e142d8c61355cc44d45bda94204974557ac2704cd8b593f035a5724b1adf442e78c542cd4414fce6f1298182fb6d8e53cef1adfd2e90e1e4deec52999bdc6c29144e8d52a125232c8c6d75c706ea3cc06841c7bda33568c63a6c03817f722b50fcf898237d788a4400869e44d90a3020923dc646388abcc914315215fcd1bae11b1c751fd52443aac8f601087d8d42737c18a3fa11ecd4131ecae017ae0a14acfc4ef85b83c19fed33cfd1cd629da2c4c09e222b398e18d822f77bb378dea3cb360b605e5aa58b20edc29d000a66bd177c682a17e7eb12a63ef7c2e4183e0d898f3d6bf567ba8ae84f84f1d23bf8b8e261c3729e2fa6d07b832e07cddd1d14f55325c6f924267957121902dc19b3b32948bdead5", - "e": "0x010001", - "d": "0x0d43242aefe1fb2c13fbc66e20b678c4336d20b1808c558b6e62ad16a287077180b177e1f01b12f9c6cd6c52630257ccef26a45135a990928773f3bd2fc01a313f1dac97a51cec71cb1fd7efc7adffdeb05f1fb04812c924ed7f4a8269925dad88bd7dcfbc4ef01020ebfc60cb3e04c54f981fdbd273e69a8a58b8ceb7c2d83fbcbd6f784d052201b88a9848186f2a45c0d2826870733e6fd9aa46983e0a6e82e35ca20a439c5ee7b502a9062e1066493bdadf8b49eb30d9558ed85abc7afb29b3c9bc644199654a4676681af4babcea4e6f71fe4565c9c1b85d9985b84ec1abf1a820a9bbebee0df1398aae2c85ab580a9f13e7743afd3108eb32100b870648fa6bc17e8abac4d3c99246b1f0ea9f7f93a5dd5458c56d9f3f81ff2216b3c3680a13591673c43194d8e6fc93fc1e37ce2986bd628ac48088bc723d8fbe293861ca7a9f4a73e9fa63b1b6d0074f5dea2a624c5249ff3ad811b6255b299d6bc5451ba7477f19c5a0db690c3e6476398b1483d10314afd38bbaf6e2fbdbcd62c3ca9797a420ca6034ec0a83360a3ee2adf4b9d4ba29731d131b099a38d6a23cc463db754603211260e99d19affc902c915d7854554aabf608e3ac52c19b8aa26ae042249b17b2d29669b5c859103ee53ef9bdc73ba3c6b537d5c34b6d8f034671d7f3a8a6966cc4543df223565343154140fd7391c7e7be03e241f4ecfeb877a051", - "msg": "8f3dc6fb8c4a02f4d6352edf0907822c1210a9b32f9bdda4c45a698c80023aa6b59f8cfec5fdbb36331372ebefedae7d", - "msg_prefix": "", - "input_msg": "8f3dc6fb8c4a02f4d6352edf0907822c1210a9b32f9bdda4c45a698c80023aa6b59f8cfec5fdbb36331372ebefedae7d", - "sLen": "0x30", - "salt": "051722b35f458781397c3a671a7d3bd3096503940e4c4f1aaa269d60300ce449555cd7340100df9d46944c5356825abf", - "encoded_msg": "6e0c464d9c2f9fbc147b43570fc4f238e0d0b38870b3addcf7a4217df912ccef17a7f629aa850f63a063925f312d61d6437be954b45025e8282f9c0b1131bc8ff19a8a928d859b37113db1064f92a27f64761c181c1e1f9b251ae5a2f8a4047573b67a270584e089beadcb13e7c82337797119712e9b849ff56e04385d144d3ca9d8d92bf78adb20b5bbeb3685f17038ec6afade3ef354429c51c687b45a7018ee3a6966b3af15c9ba8f40e6461ba0a17ef5a799672ad882bab02b518f9da7c1a962945c2e9b0f02f29b31b9cdf3e633f9d9d2a22e96e1de28e25241ca7dd04147112f578973403e0f4fd80865965475d22294f065e17a1c4a201de93bd14223e6b1b999fd548f2f759f52db71964528b6f15b9c2d7811f2a0a35d534b8216301c47f4f04f412cae142b48c4cdff78bc54df690fd43142d750c671dd8e2e938e6a440b2f825b6dbb3e19f1d7a3c0150428a47948037c322365b7fe6fe57ac88d8f80889e9ff38177bad8c8d8d98db42908b389cb59692a58ce275aa15acb032ca951b3e0a3404b7f33f655b7c7d83a2f8d1b6bbff49d5fcedf2e030e80881aa436db27a5c0dea13f32e7d460dbf01240c2320c2bb5b3225b17145c72d61d47c8f84d1e19417ebd8ce3638a82d395cc6f7050b6209d9283dc7b93fecc04f3f9e7f566829ac41568ef799480c733c09759aa9734e2013d7640dc6151018ea902bc", - "is_randomized": "0x00", - "inv": "0x80682c48982407b489d53d1261b19ec8627d02b8cda5336750b8cee332ae260de57b02d72609c1e0e9f28e2040fc65b6f02d56dbd6aa9af8fde656f70495dfb723ba01173d4707a12fddac628ca29f3e32340bd8f7ddb557cf819f6b01e445ad96f874ba235584ee71f6581f62d4f43bf03f910f6510deb85e8ef06c7f09d9794a008be7ff2529f0ebb69decef646387dc767b74939265fec0223aa6d84d2a8a1cc912d5ca25b4e144ab8f6ba054b54910176d5737a2cff011da431bd5f2a0d2d66b9e70b39f4b050e45c0d9c16f02deda9ddf2d00f3e4b01037d7029cd49c2d46a8e1fc2c0c17520af1f4b5e25ba396afc4cd60c494a4c426448b35b49635b337cfb08e7c22a39b256dd032c00adddafb51a627f99a0e1704170ac1f1912e49d9db10ec04c19c58f420212973e0cb329524223a6aa56c7937c5dffdb5d966b6cd4cbc26f3201dd25c80960a1a111b32947bb78973d269fac7f5186530930ed19f68507540eed9e1bab8b00f00d8ca09b3f099aae46180e04e3584bd7ca054df18a1504b89d1d1675d0966c4ae1407be325cdf623cf13ff13e4a28b594d59e3eadbadf6136eee7a59d6a444c9eb4e2198e8a974f27a39eb63af2c9af3870488b8adaad444674f512133ad80b9220e09158521614f1faadfe8505ef57b7df6813048603f0dd04f4280177a11380fbfc861dbcbd7418d62155248dad5fdec0991f", - "blinded_msg": "10c166c6a711e81c46f45b18e5873cc4f494f003180dd7f115585d871a28930259654fe28a54dab319cc5011204c8373b50a57b0fdc7a678bd74c523259dfe4fd5ea9f52f170e19dfa332930ad1609fc8a00902d725cfe50685c95e5b2968c9a2828a21207fcf393d15f849769e2af34ac4259d91dfd98c3a707c509e1af55647efaa31290ddf48e0133b798562af5eabd327270ac2fb6c594734ce339a14ea4fe1b9a2f81c0bc230ca523bda17ff42a377266bc2778a274c0ae5ec5a8cbbe364fcf0d2403f7ee178d77ff28b67a20c7ceec009182dbcaa9bc99b51ebbf13b7d542be337172c6474f2cd3561219fe0dfa3fb207cff89632091ab841cf38d8aa88af6891539f263adb8eac6402c41b6ebd72984e43666e537f5f5fe27b2b5aa114957e9a580730308a5f5a9c63a1eb599f093ab401d0c6003a451931b6d124180305705845060ebba6b0036154fcef3e5e9f9e4b87e8f084542fd1dd67e7782a5585150181c01eb6d90cb95883837384a5b91dbb606f266059ecc51b5acbaa280e45cfd2eec8cc1cdb1b7211c8e14805ba683f9b78824b2eb005bc8a7d7179a36c152cb87c8219e5569bba911bb32a1b923ca83de0e03fb10fba75d85c55907dda5a2606bf918b056c3808ba496a4d95532212040a5f44f37e1097f26dc27b98a51837daa78f23e532156296b64352669c94a8a855acf30533d8e0594ace7c442", - "blind_sig": "364f6a40dbfbc3bbb257943337eeff791a0f290898a6791283bba581d9eac90a6376a837241f5f73a78a5c6746e1306ba3adab6067c32ff69115734ce014d354e2f259d4cbfb890244fd451a497fe6ecf9aa90d19a2d441162f7eaa7ce3fc4e89fd4e76b7ae585be2a2c0fd6fb246b8ac8d58bcb585634e30c9168a434786fe5e0b74bfe8187b47ac091aa571ffea0a864cb906d0e28c77a00e8cd8f6aba4317a8cc7bf32ce566bd1ef80c64de041728abe087bee6cadd0b7062bde5ceef308a23bd1ccc154fd0c3a26110df6193464fc0d24ee189aea8979d722170ba945fdcce9b1b4b63349980f3a92dc2e5418c54d38a862916926b3f9ca270a8cf40dfb9772bfbdd9a3e0e0892369c18249211ba857f35963d0e05d8da98f1aa0c6bba58f47487b8f663e395091275f82941830b050b260e4767ce2fa903e75ff8970c98bfb3a08d6db91ab1746c86420ee2e909bf681cac173697135983c3594b2def673736220452fde4ddec867d40ff42dd3da36c84e3e52508b891a00f50b4f62d112edb3b6b6cc3dbd546ba10f36b03f06c0d82aeec3b25e127af545fac28e1613a0517a6095ad18a98ab79f68801e05c175e15bae21f821e80c80ab4fdec6fb34ca315e194502b8f3dcf7892b511aee45060e3994cd15e003861bc7220a2babd7b40eda03382548a34a7110f9b1779bf3ef6011361611e6bc5c0dc851e1509de1a", - "sig": "6fef8bf9bc182cd8cf7ce45c7dcf0e6f3e518ae48f06f3c670c649ac737a8b8119a34d51641785be151a697ed7825fdfece82865123445eab03eb4bb91cecf4d6951738495f8481151b62de869658573df4e50a95c17c31b52e154ae26a04067d5ecdc1592c287550bb982a5bb9c30fd53a768cee6baabb3d483e9f1e2da954c7f4cf492fe3944d2fe456c1ecaf0840369e33fb4010e6b44bb1d721840513524d8e9a3519f40d1b81ae34fb7a31ee6b7ed641cb16c2ac999004c2191de0201457523f5a4700dd649267d9286f5c1d193f1454c9f868a57816bf5ff76c838a2eeb616a3fc9976f65d4371deecfbab29362caebdff69c635fe5a2113da4d4d8c24f0b16a0584fa05e80e607c5d9a2f765f1f069f8d4da21f27c2a3b5c984b4ab24899bef46c6d9323df4862fe51ce300fca40fb539c3bb7fe2dcc9409e425f2d3b95e70e9c49c5feb6ecc9d43442c33d50003ee936845892fb8be475647da9a080f5bc7f8a716590b3745c2209fe05b17992830ce15f32c7b22cde755c8a2fe50bd814a0434130b807dc1b7218d4e85342d70695a5d7f29306f25623ad1e8aa08ef71b54b8ee447b5f64e73d09bdd6c3b7ca224058d7c67cc7551e9241688ada12d859cb7646fbd3ed8b34312f3b49d69802f0eaa11bc4211c2f7a29cd5c01ed01a39001c5856fab36228f5ee2f2e1110811872fe7c865c42ed59029c706195d52" - }, - { - "name": "RSABSSA-SHA384-PSSZERO-Deterministic", - "p": "0xe1f4d7a34802e27c7392a3cea32a262a34dc3691bd87f3f310dc75673488930559c120fd0410194fb8a0da55bd0b81227e843fdca6692ae80e5a5d414116d4803fca7d8c30eaaae57e44a1816ebb5c5b0606c536246c7f11985d731684150b63c9a3ad9e41b04c0b5b27cb188a692c84696b742a80d3cd00ab891f2457443dadfeba6d6daf108602be26d7071803c67105a5426838e6889d77e8474b29244cefaf418e381b312048b457d73419213063c60ee7b0d81820165864fef93523c9635c22210956e53a8d96322493ffc58d845368e2416e078e5bcb5d2fd68ae6acfa54f9627c42e84a9d3f2774017e32ebca06308a12ecc290c7cd1156dcccfb2311", - "q": "0xc601a9caea66dc3835827b539db9df6f6f5ae77244692780cd334a006ab353c806426b60718c05245650821d39445d3ab591ed10a7339f15d83fe13f6a3dfb20b9452c6a9b42eaa62a68c970df3cadb2139f804ad8223d56108dfde30ba7d367e9b0a7a80c4fdba2fd9dde6661fc73fc2947569d2029f2870fc02d8325acf28c9afa19ecf962daa7916e21afad09eb62fe9f1cf91b77dc879b7974b490d3ebd2e95426057f35d0a3c9f45f79ac727ab81a519a8b9285932d9b2e5ccd347e59f3f32ad9ca359115e7da008ab7406707bd0e8e185a5ed8758b5ba266e8828f8d863ae133846304a2936ad7bc7c9803879d2fc4a28e69291d73dbd799f8bc238385", - "n": "0xaec4d69addc70b990ea66a5e70603b6fee27aafebd08f2d94cbe1250c556e047a928d635c3f45ee9b66d1bc628a03bac9b7c3f416fe20dabea8f3d7b4bbf7f963be335d2328d67e6c13ee4a8f955e05a3283720d3e1f139c38e43e0338ad058a9495c53377fc35be64d208f89b4aa721bf7f7d3fef837be2a80e0f8adf0bcd1eec5bb040443a2b2792fdca522a7472aed74f31a1ebe1eebc1f408660a0543dfe2a850f106a617ec6685573702eaaa21a5640a5dcaf9b74e397fa3af18a2f1b7c03ba91a6336158de420d63188ee143866ee415735d155b7c2d854d795b7bc236cffd71542df34234221a0413e142d8c61355cc44d45bda94204974557ac2704cd8b593f035a5724b1adf442e78c542cd4414fce6f1298182fb6d8e53cef1adfd2e90e1e4deec52999bdc6c29144e8d52a125232c8c6d75c706ea3cc06841c7bda33568c63a6c03817f722b50fcf898237d788a4400869e44d90a3020923dc646388abcc914315215fcd1bae11b1c751fd52443aac8f601087d8d42737c18a3fa11ecd4131ecae017ae0a14acfc4ef85b83c19fed33cfd1cd629da2c4c09e222b398e18d822f77bb378dea3cb360b605e5aa58b20edc29d000a66bd177c682a17e7eb12a63ef7c2e4183e0d898f3d6bf567ba8ae84f84f1d23bf8b8e261c3729e2fa6d07b832e07cddd1d14f55325c6f924267957121902dc19b3b32948bdead5", - "e": "0x010001", - "d": "0x0d43242aefe1fb2c13fbc66e20b678c4336d20b1808c558b6e62ad16a287077180b177e1f01b12f9c6cd6c52630257ccef26a45135a990928773f3bd2fc01a313f1dac97a51cec71cb1fd7efc7adffdeb05f1fb04812c924ed7f4a8269925dad88bd7dcfbc4ef01020ebfc60cb3e04c54f981fdbd273e69a8a58b8ceb7c2d83fbcbd6f784d052201b88a9848186f2a45c0d2826870733e6fd9aa46983e0a6e82e35ca20a439c5ee7b502a9062e1066493bdadf8b49eb30d9558ed85abc7afb29b3c9bc644199654a4676681af4babcea4e6f71fe4565c9c1b85d9985b84ec1abf1a820a9bbebee0df1398aae2c85ab580a9f13e7743afd3108eb32100b870648fa6bc17e8abac4d3c99246b1f0ea9f7f93a5dd5458c56d9f3f81ff2216b3c3680a13591673c43194d8e6fc93fc1e37ce2986bd628ac48088bc723d8fbe293861ca7a9f4a73e9fa63b1b6d0074f5dea2a624c5249ff3ad811b6255b299d6bc5451ba7477f19c5a0db690c3e6476398b1483d10314afd38bbaf6e2fbdbcd62c3ca9797a420ca6034ec0a83360a3ee2adf4b9d4ba29731d131b099a38d6a23cc463db754603211260e99d19affc902c915d7854554aabf608e3ac52c19b8aa26ae042249b17b2d29669b5c859103ee53ef9bdc73ba3c6b537d5c34b6d8f034671d7f3a8a6966cc4543df223565343154140fd7391c7e7be03e241f4ecfeb877a051", - "msg": "8f3dc6fb8c4a02f4d6352edf0907822c1210a9b32f9bdda4c45a698c80023aa6b59f8cfec5fdbb36331372ebefedae7d", - "msg_prefix": "", - "input_msg": "8f3dc6fb8c4a02f4d6352edf0907822c1210a9b32f9bdda4c45a698c80023aa6b59f8cfec5fdbb36331372ebefedae7d", - "sLen": "0x00", - "salt": "", - "encoded_msg": "159499b90471b496c2639ec482e99feaba525c0420c565d17dc60c1bb1f47703f04436cceaa8f69811e1bf8546fa971226c9e71421b32b571ed5ea0e032269d4219b4404316eb17a58f277634aeed394b7f3888153b5bb163e40807e605dafdd1789dd473b0846bdcb6524417bc3a35366fab4261708c0e4b4beba07a1a64bbccb4b1ac215d1350a50a501e8e96612028b535ad731abf1f117ee07d07a4de9cef3d70f5845ba84c29d5d92c6e66a1f9489a5f527b846825360fd6e90f40ed041c682e489f3acde984a3ea580181418c1d15017af2657bc4b70485cdc0f1ebc3693e0d70a5d01f37ff640993fa071274fb9ee44e0c24dcb58ffa21a9a6540d87f24379beaafcc3b4bd42c45ec6820e03738ce98bea11c71685f31db63429fab8658bdb816f1ecccb1888f2402de0bd2f0f9646decdcad4c11b41428eec1ed25f2a86d43bb04f95726bfbd98ea34ca091b7adbabd0e28f17fa0345b89542d23c3530554987508a23641bd4f9e52962b0bee3ac9ffe005322d26a39941c5847774300411c69635f96903e8d593530908bd92a4fa6a2d52f88073a647a4b3894b7e4ebb80699e60227397bfa93f41b1c97e107b632f68e70409372ead2f072c11cf99be4486fcbf763dde28ee156db26cd358a69fcb79644f1f2fcc166f41a4c80f5851ee08be051f14b601418d6e56e61733b9b210c6bef17edac121a754d19b9bc", - "is_randomized": "0x00", - "inv": "0x55f2053e9a4309ac61ac4da7f3a314e626f362e95f30337962d12f08b343165c8dea34d7812dc2dcb227cfa8de49bca57880ac55f6d77b37ed83a32eb33656ddf0cde29761aef9f86bd758280b3403a63b466831cba4c97e17e9a11e4139f9d84e5912b017eafbafdbb3ae59a1424feae6914eb1bf20922c6db5da8a538752b3b662ae15cae7beac9a0362b8836001c57b0c5167dceb9a66e6ab6a90e9898646b4274c3662e4316926c4da7caf5aeff611934b70581280ec68fb2ce04c5681ef95b086b7289afae8ecd669325659791853a9f4c0b784f6f60b212c3b39754d5539e3671d7930d1272e82b3853b6583a83d9ff70c00ce1938c05eccee531cb075564059b2749e84b45dff7d179c69c86c5d1870aeffd6281d099838a3a988ff9e2684f6cc896b5326275309187d9e3558163131e4d247c2ec8317a2c09f8079d32db8241c869bc5f773722ed8e68bfa5c518d20b955abf02103fce1a025149b14670fdfc8a3f0089516db047f86b9be626ff44989d6fcc162c9570da5b862b47304eca2aceba4dedd6a672458aae779004fe116009600a6a52eb6161a3d09fda09963b56f2870a150df7183bfa03ce735513e637631fb4f980657a8cdb953b2156594607f8ebf7de6999626197072afd7ff60a5d2f782dabe026e0f298df141b8a276aaf7202d959088d7721786b04c79e45c807eb46fcf3a94031ef351aff644", - "blinded_msg": "0c86f078fe8fd2ea6b4e120d3fef7555701a7c6b7bd5606a7fb2ef2769d119f2639477a7904984d67f0ecf419059aac58041977871d8da253a1aee14cde49cfb919f502f4d79d56d473a95f450982ad83398c1f3dd3a3342a18df9e81447998eae6c7f9de94148a30de0846fc2402b17b2dfe233c450ba41f141ec14b27bf4e7d79a5c0fa23ad64c2d2fa33691a3048d835f7e477ecba458e4d58f8dbbcfec2a484e1442ab4b266cfc610fec95f6258ef137590254931dea30f58e96a64cef7aca013cb037259d4dec8a2298d3e2ce96c75a10f39dcdfe7e90eba200c73fc3f5fbbdc4d50d33990559504d0ddb4fe50407fc21321128f72866c780d1412f20d4788ad0ebc2077dca4ae87108e416c3510609867196f4fbb69ff6c3a4c0249e3d6bcf157636666a0e17d8dba9034d9875e40bbff075b0a936acd75baf15179042959d6b27f8e233b60db93a2abce81f47e259f76b5a68d58c21fd8ccd7e102fc9292ec5a1bad8618a94f09ca6a58b1c5c7062fb17bd62035d898b76ead5f52a9869d5b6fbbbf5cd07bc3c35adbff4f03949fe32b455cd5b3de07859d65045b72fb1f4a0ab5c80a27a60b57ebd9e0b173778d3be592e74cdc6a9ffa147cbb021a87b9a525bc9135114d4daacf0b111773551474ea98493ed8562dac1c9e6398ada60573ff550a01aa4468fd493fb69b3a98ab3790fc7f71ef5dfa3f1979ebe35af", - "blind_sig": "5ca77254ce107e6e6eedcf8ca03e08d4e92eeb0f4f08b2a2e7fb69da2f5db95f2167ce58a861e45a5cac1bf7d3df3edd64a2802bb5c16ceb62b2f5a0355c0d0f6d8270b658fa26e86afc18a88e91b0ec07e813d50ed4fb20376bf8470179a3a97d5a29f9f9fe931d6bff233c45d62cd91cdb9a692cda309fad962fd9f7f19f89cc48bc75f9b521aeca21921330c7e91ff7ff2af6e62fe3112f7ec675e866c5961556a1796f2fd4707dd9fcde702caf003b5acfde1cd97bc5d2a63d126ac0587bf8ed6a3064d20dbdef9e207423e678f36e516e4c2696cc74f0a74be4c3ddaaf6cdbc95c9d58d930f0f4e00dfa2bf5d0a333964ec03226073030b9b78210d3160ec2722abf3c01efa1636a28c6c5ac9d14913537322ee42d26ab26518ec2af03202ea0e190a4790b7a8951be98313000c62d1fe0ea05647c451348f97ef5ced6c6e83303aececcc508fcc8f18f7751e050f9f7a562f45b0d03159486d067ab4b3df1b0f270d009436f0305640929a2b61cfeef24a2e39a9a622c9d9d9e2c99245ea415243f472b226e068ebba7624ccf012b86b21d80cb2e3b718224b2f7b638a16b7665a1a493b014dd3d0f7b97ca290665b1f0972bc4a7d4051e843182771b6258d9d63f919fde109f8487f443ea54518c053acfbf7c0cfe60435b6966d42c034cf6ad3be2281fa2bf1a90f1d2cba55643e9ae37065a7534f53402e6f4c2a3a", - "sig": "4454b6983ff01cb28545329f394936efa42ed231e15efbc025fdaca00277acf0c8e00e3d8b0ecebd35b057b8ebfc14e1a7097368a4abd20b555894ccef3d1b9528c6bcbda6b95376bef230d0f1feff0c1064c62c60a7ae7431d1fdfa43a81eed9235e363e1ffa0b2797aba6aad6082fcd285e14fc8b71de6b9c87cb4059c7dc1e96ae1e63795a1e9af86b9073d1d848aef3eca8a03421bcd116572456b53bcfd4dabb0a9691f1fabda3ed0ce357aee2cfee5b1a0eb226f69716d4e011d96eede5e38a9acb531a64336a0d5b0bae3ab085b658692579a376740ff6ce69e89b06f360520b864e33d82d029c808248a19e18e31f0ecd16fac5cd4870f8d3ebc1c32c718124152dc905672ab0b7af48bf7d1ac1ff7b9c742549c91275ab105458ae37621757add83482bbcf779e777bbd61126e93686635d4766aedf5103cf7978f3856ccac9e28d21a850dbb03c811128616d315d717be1c2b6254f8509acae862042c034530329ce15ca2e2f6b1f5fd59272746e3918c748c0eb810bf76884fa10fcf749326bbfaa5ba285a0186a22e4f628dbf178d3bb5dc7e165ca73f6a55ecc14c4f5a26c4693ce5da032264cbec319b12ddb9787d0efa4fcf1e5ccee35ad85ecd453182df9ed735893f830b570faae8be0f6fe2e571a4e0d927cba4debd368d3b4fca33ec6251897a137cf75474a32ac8256df5e5ffa518b88b43fb6f63a24" - } -] \ No newline at end of file diff --git a/blindsign/doc.go b/blindsign/doc.go deleted file mode 100644 index e9ebecd9..00000000 --- a/blindsign/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package blindsign provides blind signature schemes. -package blindsign diff --git a/cipher/ascon/ascon.go b/cipher/ascon/ascon.go deleted file mode 100644 index f0fd41d9..00000000 --- a/cipher/ascon/ascon.go +++ /dev/null @@ -1,316 +0,0 @@ -// Package ascon provides ASCON family of light-weight AEAD ciphers. -// -// This package implements Ascon128 and Ascon128a two AEAD ciphers as specified -// in ASCON v1.2 by C. Dobraunig, M. Eichlseder, F. Mendel, M. Schläffer. -// https://ascon.iaik.tugraz.at/index.html -// -// It also implements Ascon-80pq, which has an increased key-size to provide -// more resistance against a quantum adversary using Grover’s algorithm for -// key search. Since Ascon-128 and Ascon-80pq share the same building blocks -// and same parameters except the size of the key, it is claimed the same -// security for Ascon-80pq against classical attacks as for Ascon-128. -package ascon - -import ( - "crypto/subtle" - "encoding/binary" - "errors" - "math/bits" -) - -const ( - KeySize = 16 // For Ascon128 and Ascon128a. - KeySize80pq = 20 // Only for Ascon80pq. - NonceSize = 16 - TagSize = 16 -) - -type Mode int - -// KeySize is 16 for Ascon128 and Ascon128a, or 20 for Ascon80pq. -func (m Mode) KeySize() int { - switch m { - case Ascon128, Ascon128a, Ascon80pq: - v := int(m) >> 2 - return KeySize&^v | KeySize80pq&v - default: - panic(ErrMode) - } -} - -func (m Mode) String() string { - switch m { - case Ascon128: - return "Ascon128" - case Ascon128a: - return "Ascon128a" - case Ascon80pq: - return "Ascon80pq" - default: - panic(ErrMode) - } -} - -const ( - Ascon128 Mode = 1 - Ascon128a Mode = 2 - Ascon80pq Mode = -1 -) - -const permA = 12 - -type Cipher struct { - key [3]uint64 - mode Mode -} - -// New returns a Cipher struct implementing the crypto/cipher.AEAD interface. -// The key must be Mode.KeySize() bytes long, and the mode is one of Ascon128, -// Ascon128a or Ascon80pq. -func New(key []byte, m Mode) (*Cipher, error) { - if (m == Ascon128 || m == Ascon128a) && len(key) != KeySize { - return nil, ErrKeySize - } - if m == Ascon80pq && len(key) != KeySize80pq { - return nil, ErrKeySize - } - if !(m == Ascon128 || m == Ascon128a || m == Ascon80pq) { - return nil, ErrMode - } - c := new(Cipher) - c.mode = m - if m == Ascon80pq { - c.key[0] = uint64(binary.BigEndian.Uint32(key[0:4])) - c.key[1] = binary.BigEndian.Uint64(key[4:12]) - c.key[2] = binary.BigEndian.Uint64(key[12:20]) - } else { - c.key[0] = 0 - c.key[1] = binary.BigEndian.Uint64(key[0:8]) - c.key[2] = binary.BigEndian.Uint64(key[8:16]) - } - - return c, nil -} - -// NonceSize returns the size of the nonce that must be passed to Seal -// and Open. -func (a *Cipher) NonceSize() int { return NonceSize } - -// Overhead returns the maximum difference between the lengths of a -// plaintext and its ciphertext. -func (a *Cipher) Overhead() int { return TagSize } - -// Seal encrypts and authenticates plaintext, authenticates the -// additional data and appends the result to dst, returning the updated -// slice. The nonce must be NonceSize() bytes long and unique for all -// time, for a given key. -// -// To reuse plaintext's storage for the encrypted output, use plaintext[:0] -// as dst. Otherwise, the remaining capacity of dst must not overlap plaintext. -func (a *Cipher) Seal(dst, nonce, plaintext, additionalData []byte) []byte { - if len(nonce) != NonceSize { - panic(ErrNonceSize) - } - - ptLen := len(plaintext) - ret, out := sliceForAppend(dst, ptLen+TagSize) - ciphertext, tag := out[:ptLen], out[ptLen:] - - var s [5]uint64 - a.initialize(nonce, &s) - a.assocData(additionalData, &s) - a.procText(plaintext, ciphertext, true, &s) - a.finalize(tag, &s) - - return ret -} - -// Open decrypts and authenticates ciphertext, authenticates the -// additional data and, if successful, appends the resulting plaintext -// to dst, returning the updated slice. The nonce must be NonceSize() -// bytes long and both it and the additional data must match the -// value passed to Seal. -// -// To reuse ciphertext's storage for the decrypted output, use ciphertext[:0] -// as dst. Otherwise, the remaining capacity of dst must not overlap plaintext. -// -// Even if the function fails, the contents of dst, up to its capacity, -// may be overwritten. -func (a *Cipher) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { - if len(nonce) != NonceSize { - panic(ErrNonceSize) - } - if len(ciphertext) < TagSize { - return nil, ErrDecryption - } - - ptLen := len(ciphertext) - TagSize - ret, out := sliceForAppend(dst, ptLen) - plaintext := out[:ptLen] - ciphertext, tag0 := ciphertext[:ptLen], ciphertext[ptLen:] - tag1 := (&[TagSize]byte{})[:] - - var s [5]uint64 - a.initialize(nonce, &s) - a.assocData(additionalData, &s) - a.procText(ciphertext, plaintext, false, &s) - a.finalize(tag1, &s) - - if subtle.ConstantTimeCompare(tag0, tag1) == 0 { - return nil, ErrDecryption - } - - return ret, nil -} - -func abs(x int) int { m := uint(x >> (bits.UintSize - 1)); return int((uint(x) + m) ^ m) } - -// blockSize = 8 for Ascon128 and Ascon80pq, or 16 for Ascon128a. -func (a *Cipher) blockSize() int { return abs(int(a.mode)) << 3 } - -// permB = 6 for Ascon128 and Ascon80pq, or 8 for Ascon128a. -func (a *Cipher) permB() int { return (abs(int(a.mode)) + 2) << 1 } - -func (a *Cipher) initialize(nonce []byte, s *[5]uint64) { - bcs := uint64(a.blockSize()) - pB := uint64(a.permB()) - kS := uint64(a.mode.KeySize()) - - s[0] = ((kS * 8) << 56) | ((bcs * 8) << 48) | (permA << 40) | (pB << 32) | a.key[0] - s[1] = a.key[1] - s[2] = a.key[2] - s[3] = binary.BigEndian.Uint64(nonce[0:8]) - s[4] = binary.BigEndian.Uint64(nonce[8:16]) - - perm(permA, s) - - s[2] ^= a.key[0] - s[3] ^= a.key[1] - s[4] ^= a.key[2] -} - -func (a *Cipher) assocData(add []byte, s *[5]uint64) { - bcs := a.blockSize() - pB := a.permB() - if len(add) > 0 { - for ; len(add) >= bcs; add = add[bcs:] { - for i := 0; i < bcs; i += 8 { - s[i/8] ^= binary.BigEndian.Uint64(add[i : i+8]) - } - perm(pB, s) - } - for i := 0; i < len(add); i++ { - s[i/8] ^= uint64(add[i]) << (56 - 8*(i%8)) - } - s[len(add)/8] ^= uint64(0x80) << (56 - 8*(len(add)%8)) - perm(pB, s) - } - s[4] ^= 0x01 -} - -func (a *Cipher) procText(in, out []byte, enc bool, s *[5]uint64) { - bcs := a.blockSize() - pB := a.permB() - mask := uint64(0) - if enc { - mask -= 1 - } - - for ; len(in) >= bcs; in, out = in[bcs:], out[bcs:] { - for i := 0; i < bcs; i += 8 { - inW := binary.BigEndian.Uint64(in[i : i+8]) - outW := s[i/8] ^ inW - binary.BigEndian.PutUint64(out[i:i+8], outW) - - s[i/8] = (inW &^ mask) | (outW & mask) - } - perm(pB, s) - } - - mask8 := byte(mask & 0xFF) - for i := 0; i < len(in); i++ { - off := 56 - (8 * (i % 8)) - si := byte((s[i/8] >> off) & 0xFF) - inB := in[i] - outB := si ^ inB - out[i] = outB - ss := inB&^mask8 | outB&mask8 - s[i/8] = (s[i/8] &^ (0xFF << off)) | uint64(ss)<>32 - s[bcs/8+1] ^= a.key[1]<<32 | a.key[2]>>32 - s[bcs/8+2] ^= a.key[2] << 32 - } else { - s[bcs/8+0] ^= a.key[1] - s[bcs/8+1] ^= a.key[2] - } - - perm(permA, s) - binary.BigEndian.PutUint64(tag[0:8], s[3]^a.key[1]) - binary.BigEndian.PutUint64(tag[8:16], s[4]^a.key[2]) -} - -func perm(n int, s *[5]uint64) { - x0, x1, x2, x3, x4 := s[0], s[1], s[2], s[3], s[4] - for i := permA - n; i < permA; i++ { - // pC -- addition of constants - x2 ^= uint64((0xF-i)<<4 | i) - - // pS -- substitution layer - // Figure 6 from Spec [DHVV18,Dae18] - // https://ascon.iaik.tugraz.at/files/asconv12-nist.pdf - x0 ^= x4 - x4 ^= x3 - x2 ^= x1 - t0 := x0 & (^x4) - t1 := x2 & (^x1) - x0 ^= t1 - t1 = x4 & (^x3) - x2 ^= t1 - t1 = x1 & (^x0) - x4 ^= t1 - t1 = x3 & (^x2) - x1 ^= t1 - x3 ^= t0 - x1 ^= x0 - x3 ^= x2 - x0 ^= x4 - x2 = ^x2 - - // pL -- linear diffusion layer - x0 ^= bits.RotateLeft64(x0, -19) ^ bits.RotateLeft64(x0, -28) - x1 ^= bits.RotateLeft64(x1, -61) ^ bits.RotateLeft64(x1, -39) - x2 ^= bits.RotateLeft64(x2, -1) ^ bits.RotateLeft64(x2, -6) - x3 ^= bits.RotateLeft64(x3, -10) ^ bits.RotateLeft64(x3, -17) - x4 ^= bits.RotateLeft64(x4, -7) ^ bits.RotateLeft64(x4, -41) - } - s[0], s[1], s[2], s[3], s[4] = x0, x1, x2, x3, x4 -} - -// sliceForAppend takes a slice and a requested number of bytes. It returns a -// slice with the contents of the given slice followed by that many bytes and a -// second slice that aliases into it and contains only the extra bytes. If the -// original slice has sufficient capacity then no allocation is performed. -func sliceForAppend(in []byte, n int) (head, tail []byte) { - if total := len(in) + n; cap(in) >= total { - head = in[:total] - } else { - head = make([]byte, total) - copy(head, in) - } - tail = head[len(in):] - return -} - -var ( - ErrKeySize = errors.New("ascon: bad key size") - ErrNonceSize = errors.New("ascon: bad nonce size") - ErrDecryption = errors.New("ascon: invalid ciphertext") - ErrMode = errors.New("ascon: invalid cipher mode") -) diff --git a/cipher/ascon/ascon_test.go b/cipher/ascon/ascon_test.go deleted file mode 100644 index 119153d3..00000000 --- a/cipher/ascon/ascon_test.go +++ /dev/null @@ -1,268 +0,0 @@ -package ascon_test - -import ( - "bytes" - "crypto/cipher" - hexa "encoding/hex" - "encoding/json" - "io" - "os" - "strconv" - "sync" - "testing" - - "github.com/quantumcoinproject/circl/cipher/ascon" - "github.com/quantumcoinproject/circl/internal/test" -) - -type vector struct { - Count int `json:"Count"` - Key hex `json:"Key"` - Nonce hex `json:"Nonce"` - PT hex `json:"PT"` - AD hex `json:"AD"` - CT hex `json:"CT"` -} - -type hex []byte - -func (h *hex) UnmarshalJSON(data []byte) error { - var s string - if err := json.Unmarshal(data, &s); err != nil { - return err - } - decoded, err := hexa.DecodeString(s) - if err != nil { - return err - } - *h = hex(decoded) - return nil -} - -func readFile(t *testing.T, fileName string) []vector { - jsonFile, err := os.Open(fileName) - if err != nil { - t.Fatalf("File %v can not be opened. Error: %v", fileName, err) - } - defer jsonFile.Close() - input, err := io.ReadAll(jsonFile) - if err != nil { - t.Fatalf("File %v can not be read. Error: %v", fileName, err) - } - var v []vector - err = json.Unmarshal(input, &v) - if err != nil { - t.Fatalf("File %v can not be loaded. Error: %v", fileName, err) - } - return v -} - -func TestAscon(t *testing.T) { - // Test vectors generated with pyascon - // https://github.com/meichlseder/pyascon/ - for _, mode := range []ascon.Mode{ascon.Ascon128, ascon.Ascon128a, ascon.Ascon80pq} { - name := mode.String() - t.Run(name, func(t *testing.T) { - vectors := readFile(t, "testdata/"+name+".json") - for _, v := range vectors { - a, err := ascon.New(v.Key, mode) - test.CheckNoErr(t, err, "failed to create cipher") - - var aead cipher.AEAD = a - test.CheckOk(len(v.Nonce) == aead.NonceSize(), "bad nonce size", t) - got := aead.Seal(nil, v.Nonce, v.PT, v.AD) - want := v.CT - if !bytes.Equal(got, want) { - test.ReportError(t, got, want, name, v.Count) - } - - got, err = aead.Open(nil, v.Nonce, v.CT, v.AD) - if err != nil { - t.Fatal(err) - } - want = v.PT - if !bytes.Equal(got, want) { - test.ReportError(t, got, want, name, v.Count) - } - test.CheckOk(len(v.PT)+aead.Overhead() == len(v.CT), "bad overhead size", t) - } - }) - } -} - -func TestBadInputs(t *testing.T) { - var key [ascon.KeySize]byte - var m ascon.Mode = 0 - - _, err := ascon.New(key[:], m) - test.CheckIsErr(t, err, "should fail due to bad mode") - - err = test.CheckPanic(func() { _ = m.String() }) - test.CheckNoErr(t, err, "should panic due to bad mode") - - _, err = ascon.New(nil, ascon.Ascon128) - test.CheckIsErr(t, err, "should fail due to nil key") - - _, err = ascon.New(key[:4], ascon.Ascon128) - test.CheckIsErr(t, err, "should fail due to short key") - - _, err = ascon.New(key[:], ascon.Ascon80pq) - test.CheckIsErr(t, err, "should fail due to short key") - - a, _ := ascon.New(key[:], ascon.Ascon128) - err = test.CheckPanic(func() { _ = a.Seal(nil, nil, nil, nil) }) - test.CheckNoErr(t, err, "should panic due to bad nonce") - - err = test.CheckPanic(func() { _, _ = a.Open(nil, nil, nil, nil) }) - test.CheckNoErr(t, err, "should panic due to bad nonce") - - var nonce [ascon.NonceSize]byte - _ = a.Seal(nil, nonce[:], nil, nil) - _, err = a.Open(nil, nonce[:], nil, nil) - test.CheckIsErr(t, err, "should panic due to empty ciphertext") - - pt := []byte("") - ct := a.Seal(nil, nonce[:], pt, nil) - ct[0] ^= 0xFF // tamper ciphertext - _, err = a.Open(nil, nonce[:], ct, nil) - test.CheckIsErr(t, err, "should panic due to bad ciphertext") -} - -func TestAPI(t *testing.T) { - key, _ := hexa.DecodeString("000102030405060708090A0B0C0D0E0F") - nonce, _ := hexa.DecodeString("000102030405060708090A0B0C0D0E0F") - c, _ := ascon.New(key, ascon.Ascon128) - pt := []byte("helloworld") - ct, _ := hexa.DecodeString("d4e663d29cd60a693c20f890982e167d266f940b93b586945065") - - t.Run("append", func(t *testing.T) { - prefix := [5]byte{0x1F, 0x2F, 0x3F, 0x4F, 0x5F} - prefixAndCt := c.Seal(prefix[:], nonce, pt, nil) - got := prefixAndCt - want := append(append([]byte{}, prefix[:]...), ct...) - if !bytes.Equal(got, want) { - test.ReportError(t, got, want) - } - - ciphertext := prefixAndCt[len(prefix):] - prefix = [5]byte{0x11, 0x22, 0x33, 0x44, 0x55} - prefixAndPt, err := c.Open(prefix[:], nonce, ciphertext, nil) - if err != nil { - t.Fatal(err) - } - got = prefixAndPt - want = append(append([]byte{}, prefix[:]...), pt...) - if !bytes.Equal(got, want) { - test.ReportError(t, got, want) - } - }) - t.Run("reuse", func(t *testing.T) { - ptWithCap := make([]byte, len(pt), len(pt)+100) - copy(ptWithCap, pt) - // reusing the input to store the ciphertext. - ciphertext := c.Seal(ptWithCap[:0], nonce, ptWithCap, nil) - got := ciphertext - want := ct - if !bytes.Equal(got, want) { - test.ReportError(t, got, want) - } - test.CheckOk(&ptWithCap[0] == &ciphertext[0], "should have same address", t) - - ctWithCap := make([]byte, len(ct), len(ct)+100) - copy(ctWithCap, ct) - // reusing the input to store the plaintext. - plaintext, err := c.Open(ctWithCap[:0], nonce, ctWithCap, nil) - if err != nil { - t.Fatal(err) - } - got = plaintext - want = pt - if !bytes.Equal(got, want) { - test.ReportError(t, got, want) - } - test.CheckOk(&ctWithCap[0] == &plaintext[0], "should have same address", t) - }) - t.Run("parallel", func(t *testing.T) { - var wg sync.WaitGroup - for i := 0; i < 1_000; i++ { - wg.Add(1) - go func() { - defer wg.Done() - ciphertext := c.Seal(nil, nonce, pt, nil) - plaintext, err := c.Open(nil, nonce, ciphertext, nil) - if err != nil { - t.Error(err) - } - got := plaintext - want := pt - if !bytes.Equal(got, want) { - test.ReportError(t, got, want) - } - }() - } - wg.Wait() - }) -} - -func BenchmarkAscon(b *testing.B) { - for _, mode := range []ascon.Mode{ascon.Ascon128, ascon.Ascon128a, ascon.Ascon80pq} { - for _, length := range []int{64, 1350, 8 * 1024} { - b.Run(mode.String()+"/Open-"+strconv.Itoa(length), func(b *testing.B) { benchmarkOpen(b, make([]byte, length), mode) }) - b.Run(mode.String()+"/Seal-"+strconv.Itoa(length), func(b *testing.B) { benchmarkSeal(b, make([]byte, length), mode) }) - } - } -} - -func benchmarkSeal(b *testing.B, buf []byte, mode ascon.Mode) { - b.ReportAllocs() - b.SetBytes(int64(len(buf))) - - var key []byte - switch mode { - case ascon.Ascon128, ascon.Ascon128a: - key = make([]byte, ascon.KeySize) - case ascon.Ascon80pq: - key = make([]byte, ascon.KeySize80pq) - } - - var nonce [ascon.NonceSize]byte - var ad [13]byte - a, err := ascon.New(key[:], mode) - if err != nil { - b.Fatal(err) - } - var out []byte - - b.ResetTimer() - for i := 0; i < b.N; i++ { - out = a.Seal(out[:0], nonce[:], buf, ad[:]) - } -} - -func benchmarkOpen(b *testing.B, buf []byte, mode ascon.Mode) { - b.ReportAllocs() - b.SetBytes(int64(len(buf))) - - var key []byte - switch mode { - case ascon.Ascon128, ascon.Ascon128a: - key = make([]byte, ascon.KeySize) - case ascon.Ascon80pq: - key = make([]byte, ascon.KeySize80pq) - } - - var nonce [ascon.NonceSize]byte - var ad [13]byte - a, err := ascon.New(key[:], mode) - if err != nil { - b.Fatal(err) - } - var out []byte - - ct := a.Seal(nil, nonce[:], buf, ad[:]) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - out, _ = a.Open(out[:0], nonce[:], ct, ad[:]) - } -} diff --git a/cipher/ascon/testdata/Ascon128.json b/cipher/ascon/testdata/Ascon128.json deleted file mode 100644 index efa5b9f0..00000000 --- a/cipher/ascon/testdata/Ascon128.json +++ /dev/null @@ -1,8714 +0,0 @@ -[ - { - "Count": 1, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "", - "CT": "E355159F292911F794CB1432A0103A8A" - }, - { - "Count": 2, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "00", - "CT": "944DF887CD4901614C5DEDBC42FC0DA0" - }, - { - "Count": 3, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "0001", - "CT": "CE1936FBDD191058DEA8769B79319858" - }, - { - "Count": 4, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102", - "CT": "4C9450689BE3D7C23925A4219DE6B50C" - }, - { - "Count": 5, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "00010203", - "CT": "082389C8819A82BD98C04A3C64A63AA9" - }, - { - "Count": 6, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "0001020304", - "CT": "A88AF3E37EE0188B2B70A74BE1AB573F" - }, - { - "Count": 7, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405", - "CT": "4700E8F2474520FCE1DF779B496A3D43" - }, - { - "Count": 8, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "00010203040506", - "CT": "8CA228C9EA549C73A8BA27291FED88BF" - }, - { - "Count": 9, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "0001020304050607", - "CT": "E3DCF95F869752F61CD7A2DB895F918E" - }, - { - "Count": 10, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708", - "CT": "ABCDB317ECCFE67A62CF70AE974C3DBE" - }, - { - "Count": 11, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "00010203040506070809", - "CT": "4B006A400B6DFB9777BC3446C2B7DC26" - }, - { - "Count": 12, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A", - "CT": "D72C225D6BC2075163BED863186EC886" - }, - { - "Count": 13, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B", - "CT": "4ACECAA3B349728E7317D82467B2749E" - }, - { - "Count": 14, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C", - "CT": "BB6EC1A7AE8120CAD76566397C9AE920" - }, - { - "Count": 15, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D", - "CT": "3078530D228A443D764648F498C26CC2" - }, - { - "Count": 16, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "7E4371F17406D6E5328473177A791CEE" - }, - { - "Count": 17, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "EF5763E75FE32F96D7863410FF0B4786" - }, - { - "Count": 18, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "79AC0FA2BF3859D6962D0C0AF45B1D3E" - }, - { - "Count": 19, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "F56840B36DEE4F7D3450762B209CD93C" - }, - { - "Count": 20, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "4A55B63A5F9218829D81973135D03B10" - }, - { - "Count": 21, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "0B1C94E36D55C29951A74FA7E7F7349B" - }, - { - "Count": 22, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "553E4F9A468A134AF718698FDF7144C1" - }, - { - "Count": 23, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "044DFCDDD0AD865B8730D36FB7F4DFF4" - }, - { - "Count": 24, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "0FF1AEF36526F368B9863D668BA72C8A" - }, - { - "Count": 25, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "4946E5D112779DBCB4FE5E8640D9DC6F" - }, - { - "Count": 26, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "C60AF01FDF64346D9AA8D55F19515FF0" - }, - { - "Count": 27, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "B86842A393129CFEA8DBD9C2BC2AAC45" - }, - { - "Count": 28, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "F94421B4A91423877CF6287F71C8848B" - }, - { - "Count": 29, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "CBF0E4425354BFCD970AE960AD908226" - }, - { - "Count": 30, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "D53624C5DC17242BD996122B3637950E" - }, - { - "Count": 31, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "86F389704159260B45A2246A7D9A5B4E" - }, - { - "Count": 32, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "20CB43574F9F5394F3BEB20CEC8D5CC3" - }, - { - "Count": 33, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "8C74C569E1220E9FE403926E5F9B8956" - }, - { - "Count": 34, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "", - "CT": "BC18C3F4E39ECA7222490D967C79BFFC92" - }, - { - "Count": 35, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "00", - "CT": "BD4102B707775C3C155AE497B43BF834E5" - }, - { - "Count": 36, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "0001", - "CT": "6E4FEE510F556CFE0938D0EB329BB10242" - }, - { - "Count": 37, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102", - "CT": "F11F4103B3CAE0C206E65613D9CB6B167B" - }, - { - "Count": 38, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "00010203", - "CT": "77AF1DB0843C917B04FF3CCFB1F76AFD65" - }, - { - "Count": 39, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "0001020304", - "CT": "0EE7F0711F6A2554D9083B1384DAB75D0E" - }, - { - "Count": 40, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405", - "CT": "5B124B8B390FF024F774132EE0557EEB22" - }, - { - "Count": 41, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "00010203040506", - "CT": "2E06F902CE92C84F95656CBBA55F100FCB" - }, - { - "Count": 42, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "0001020304050607", - "CT": "695A8F1BD29D59C5C82021B6CACE80C895" - }, - { - "Count": 43, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708", - "CT": "320A1C6BADBED598950957A57915001E84" - }, - { - "Count": 44, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "00010203040506070809", - "CT": "3D94512CB8F731A4BDE76BC7A605D7A518" - }, - { - "Count": 45, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A", - "CT": "76F5EE3B934FC1E91255EB17CEBFF1E191" - }, - { - "Count": 46, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B", - "CT": "5904DD9D046F222322BA4D15FDFD3E5036" - }, - { - "Count": 47, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C", - "CT": "84A39968C83395166A1A2995B890734EB8" - }, - { - "Count": 48, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E4BD57543272C1F745559FCD32A6F0F95" - }, - { - "Count": 49, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E49CB3747677963E37F9F298EECA35300" - }, - { - "Count": 50, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE4C30EAE829E2C5569A1D688C2616AEE" - }, - { - "Count": 51, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "86D1F8C7161F1D833B98DB88606A9776A7" - }, - { - "Count": 52, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "774911D56576A4A923553F3DF5EB16C5C7" - }, - { - "Count": 53, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D3B95AA2A80F63D23F93E2968806AEEE85" - }, - { - "Count": 54, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A37D44820FFE19D8C5ECA1E9D3972F4A27" - }, - { - "Count": 55, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74348C6460F114F835F7A7900C0A5B6E2E" - }, - { - "Count": 56, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADF005739016CB736E89488358DAF3385B" - }, - { - "Count": 57, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B6F239F6BEBE53AE3BF822D6F3E9C9A46" - }, - { - "Count": 58, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "743BCBA716F2D586F0AB769038E7863FE2" - }, - { - "Count": 59, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "29F665B4CB0E3CC8FD09970E807C0BF751" - }, - { - "Count": 60, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D20EECE849348696C0D3D75EC669674E5" - }, - { - "Count": 61, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "313A73236DE452F3362662F1026B25D591" - }, - { - "Count": 62, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C7295CE46DC9AEDBC2D135AD19C11F80E8" - }, - { - "Count": 63, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3B629A85B6C06BAB88E1ADC34F0C17C869" - }, - { - "Count": 64, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "27ADAA55348693E99A1DF867424CF410B7" - }, - { - "Count": 65, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D67BC10265FF34109B42AD8842A0B314A4" - }, - { - "Count": 66, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B953BF48496164CD10B79FDFA1FF635659" - }, - { - "Count": 67, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "", - "CT": "BC82D5BDE868F7494F57D81E06FACBF70CE1" - }, - { - "Count": 68, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "00", - "CT": "BD465B2F5E3ABE7949BFD03CC4D6AC14CFBC" - }, - { - "Count": 69, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "0001", - "CT": "6E9F373C0B74264C1CE4D705D995915FCCCD" - }, - { - "Count": 70, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102", - "CT": "F19D592CE15098B027CFA76577257FA321D2" - }, - { - "Count": 71, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "00010203", - "CT": "7763DA1444516D7DA602C03A073A589A5770" - }, - { - "Count": 72, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "0001020304", - "CT": "0E6AB4E7DBA0DD30A57BA83CDE1877D2891B" - }, - { - "Count": 73, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405", - "CT": "5B51067DDA396A46D9F738F502F039525FF8" - }, - { - "Count": 74, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "00010203040506", - "CT": "2E5B03CD2370A536FBDA43D2DB1F58B6306A" - }, - { - "Count": 75, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "0001020304050607", - "CT": "69FF0CC8598FD6CBA54708587A3B96D8AFE7" - }, - { - "Count": 76, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708", - "CT": "3225A36E8F3C2F4886EEF6AA906AAB01930E" - }, - { - "Count": 77, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "00010203040506070809", - "CT": "3DDC1C1BE21FA7342D28583BD229CBF8D0A4" - }, - { - "Count": 78, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A", - "CT": "7680B9FB9FBCF8B3822329B0B27D6B775B6F" - }, - { - "Count": 79, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B", - "CT": "59B3AEAB0ABFEC41C833C3EC0FCD2403718B" - }, - { - "Count": 80, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C", - "CT": "8462A08C11B3C690623D447B6D9704E4B705" - }, - { - "Count": 81, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E32A608854A3AF4A69194369815E416323D" - }, - { - "Count": 82, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83BE6F6B4E093BE3083BF3DA9F8553C9F0" - }, - { - "Count": 83, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE3C82E16CD8C3957966B6EBD167213A483" - }, - { - "Count": 84, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684919DA2D79C1AC1B52D05B68DF35C8F7A" - }, - { - "Count": 85, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA2ABC3EB9D571FB53D1B7C9091BA65C91" - }, - { - "Count": 86, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323956DE8BA617631352060BCAC573F120D" - }, - { - "Count": 87, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31A62E94A4891CBBF0EE8E2DB6126F46C5E" - }, - { - "Count": 88, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA328F8F3940E53EF780013D6C12A8B2F4" - }, - { - "Count": 89, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB9F7E42EFA8EB4A109007C80027FFE128" - }, - { - "Count": 90, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29B6FAFC39BB00037532B10835B86E15BD" - }, - { - "Count": 91, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A67E43F8002BD8026CA4DC83646F6D85D7" - }, - { - "Count": 92, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "297075AA4F4B732E57F99994B5476E1581FE" - }, - { - "Count": 93, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D13B2D4B1CC1A582E955B1D513E7DE3C594" - }, - { - "Count": 94, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "3168121DE378E6C65F6CB589FC8C6DDC9621" - }, - { - "Count": 95, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780AEB12057EFD87BA84C90DA11D11394F8" - }, - { - "Count": 96, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2FF9A184339F2E05C29E062FFE306B1BB" - }, - { - "Count": 97, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D16CB7BFBBBCB3CCA5B9F9EE88F7EE241" - }, - { - "Count": 98, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D6701098EE931AF60640FC51AB794F3AE8E9" - }, - { - "Count": 99, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C9344C81E99D0739B198B1E19C513EE41" - }, - { - "Count": 100, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "", - "CT": "BC820D5BCA14147915031C69F6B27848A7EE29" - }, - { - "Count": 101, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "00", - "CT": "BD46409C17E4EF8246FEB21B629D2D34ED97A0" - }, - { - "Count": 102, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "0001", - "CT": "6E9F82777B23D17A1AFA16EE6BE52B37A47BCE" - }, - { - "Count": 103, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102", - "CT": "F19D28312F928677703FEA1614F57D9FD0D7BD" - }, - { - "Count": 104, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "00010203", - "CT": "7763F8A2BBFBB05B3B4F54DA1576A863B47409" - }, - { - "Count": 105, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "0001020304", - "CT": "0E6A8B1DCAAF912BF13500EEA1B227034DF060" - }, - { - "Count": 106, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405", - "CT": "5B51357C0EA9127BC3D256A9D60BEDE8EFD2E6" - }, - { - "Count": 107, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "00010203040506", - "CT": "2E5BBAB4BAE525B1CE1100CDBDCB4ED23E89B1" - }, - { - "Count": 108, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "0001020304050607", - "CT": "69FFEEBA5F80F8CBDB27F8FB4618473B7C18DD" - }, - { - "Count": 109, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708", - "CT": "3225020CFF6C9660BF5C3F03860FE114532049" - }, - { - "Count": 110, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "00010203040506070809", - "CT": "3DDCE4E7CD32A21A86EA2CDFCCD7A1DEC41A13" - }, - { - "Count": 111, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A", - "CT": "76807B647A02193083052D75998B9DCE8EEF6D" - }, - { - "Count": 112, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B", - "CT": "59B3A50F6A35BF813C68752BF2E504FAB1968E" - }, - { - "Count": 113, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C", - "CT": "8462C348424E1C11003F35D340FCC3240B23E4" - }, - { - "Count": 114, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E3253450ED5EA4764A43E7A6BB83748D21E65" - }, - { - "Count": 115, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC7E16F911FB9290AC5F17C40F52E7150E" - }, - { - "Count": 116, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34121DD630A1F15DFEF25D8EFEDE3A13F09" - }, - { - "Count": 117, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "86845314ED19E9DB81F536D26696A5133F3E2C" - }, - { - "Count": 118, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA51436CF960790EB07DAB08E2F20FD4F93C" - }, - { - "Count": 119, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863569EFD8E8FA18695CE3B22D3AA4E263" - }, - { - "Count": 120, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9C2623B07A0C365A72149BD5D206E6C57" - }, - { - "Count": 121, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BAD85D80B7ADF27386DCC43B891F575BB" - }, - { - "Count": 122, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB72E6E801957BA8689483664660E78A821C" - }, - { - "Count": 123, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29662D855A55A0A9462395A9903570188979" - }, - { - "Count": 124, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A3D8F19DE71E9D421D798EF82E27FE1573" - }, - { - "Count": 125, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5AFFED9B37FC44342DEDCC428E5BC4B3C" - }, - { - "Count": 126, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D05D13E6DEBE8D15BBBAF5CFF51B8F864" - }, - { - "Count": 127, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "3168672E64F723E78EAF5D966906B5986B9B1A" - }, - { - "Count": 128, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780139ECFF41F3E52176DCAF5B7820DA27A73" - }, - { - "Count": 129, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F4523A1534CEB4979B15A8F1638D4C7A68" - }, - { - "Count": 130, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D84AEA6EF6A09C7724783050E337D32DBA5" - }, - { - "Count": 131, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F51E2E53334E3B5294D34F4408ACA0DB21" - }, - { - "Count": 132, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78A72FB2093402948DFF30C4766BEBE53B" - }, - { - "Count": 133, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "", - "CT": "BC820DBD218C5C93E3850E974A3704D1223BDEFB" - }, - { - "Count": 134, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "00", - "CT": "BD4640C450DA237D4E2230C3E44ABDF9E78FCFCD" - }, - { - "Count": 135, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "0001", - "CT": "6E9F820D598CDD2183B5A91E5E6EE7C8F50BE414" - }, - { - "Count": 136, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102", - "CT": "F19D28E0AEEB0F246D9DF6C27FD0DDC624C40DEC" - }, - { - "Count": 137, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "00010203", - "CT": "7763F8BA02B1E06BC3F2370DA5B314302543E9D0" - }, - { - "Count": 138, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "0001020304", - "CT": "0E6A8B0CF463C097AB2FC471431E859AA8C9DB40" - }, - { - "Count": 139, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405", - "CT": "5B51354619693D08DC1A49E3A9223910A1B5136A" - }, - { - "Count": 140, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "00010203040506", - "CT": "2E5BBADE9739CCC2C2692410363AF188BAC59FFF" - }, - { - "Count": 141, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "0001020304050607", - "CT": "69FFEE6F62957813F82C9CBF53F1E9C0D2EF98B2" - }, - { - "Count": 142, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708", - "CT": "322502650E11DE1CB2B66720A5FAA6F0BF48E21E" - }, - { - "Count": 143, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "00010203040506070809", - "CT": "3DDCE4DE9E5F06E7C42C8896DFA938A58F177BFB" - }, - { - "Count": 144, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A", - "CT": "76807B6431D0A2853C5CA0833476B83953A0E080" - }, - { - "Count": 145, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B", - "CT": "59B3A53380D335C2430069E95322C536A9BD29B0" - }, - { - "Count": 146, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C", - "CT": "8462C3768F65190F371C6D2214F07A5807ED8D8D" - }, - { - "Count": 147, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E32534016306B3632E41A7D57F14301578F5AF6" - }, - { - "Count": 148, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36C2952ACC49B20EDA26983D6C0F450690" - }, - { - "Count": 149, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE341250AC282B59324053C701FE5D0CF777784" - }, - { - "Count": 150, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A83298C48E915F044E663728C887526E6" - }, - { - "Count": 151, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA5111E87B986DE8C14A2CBD1D7F0AF8EA6AC5" - }, - { - "Count": 152, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E70606ECC0042151B6DC2DACAD650E8B8" - }, - { - "Count": 153, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1A870D59A89517C2B8433E46D407A97BC" - }, - { - "Count": 154, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA21ECAC8331A4B1C236F1F12EC0D856D25" - }, - { - "Count": 155, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720CEA24641AD48C8D98531712287D2C97E8" - }, - { - "Count": 156, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B2966936291B842CC7A956D052119942669DC1A" - }, - { - "Count": 157, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39DC6CD71BE8E220D45B9419D63E9617BD9" - }, - { - "Count": 158, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D348F415C36751ADD7EA2BA8C37614BEC2" - }, - { - "Count": 159, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DEBAA54A45D06CB03A23ECB826751EC09" - }, - { - "Count": 160, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "316867253765AB1C494C3B685A3E71A98D477E08" - }, - { - "Count": 161, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C78013587F7AEC07C59EC897CF3D7CB716F9519D" - }, - { - "Count": 162, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45C8886EBA3AC1EE7D28DD5E8877860B37B" - }, - { - "Count": 163, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846FE13DCF55D2A9AF1CB1622DB49AA7BF08" - }, - { - "Count": 164, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A411AC3F7D0215703A80A5FDD9503533E3" - }, - { - "Count": 165, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78650A9A122CF59C591659E212455E1C621E" - }, - { - "Count": 166, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "", - "CT": "BC820DBDF746AB3CAAB87DF290F7ED9BF707E3C4D1" - }, - { - "Count": 167, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "00", - "CT": "BD4640C4DA8A7040DA0FEE79264154AC89D2125933" - }, - { - "Count": 168, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "0001", - "CT": "6E9F820D5426813AF66BCB94B61768B42B0D06E776" - }, - { - "Count": 169, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102", - "CT": "F19D28E0F22C30CFFE614999C82DB62261F776444A" - }, - { - "Count": 170, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "00010203", - "CT": "7763F8BA6CFB34138F158D9FCCAF95E2F784F2D300" - }, - { - "Count": 171, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "0001020304", - "CT": "0E6A8B0CA5F31AF8E948A715B8C431DEC208C0F9C8" - }, - { - "Count": 172, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405", - "CT": "5B513546B1EA455C350956CF0AE421A31785B76A45" - }, - { - "Count": 173, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "00010203040506", - "CT": "2E5BBADE95F515F015EA179D164B06A53CDFDE0FC8" - }, - { - "Count": 174, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "0001020304050607", - "CT": "69FFEE6F5596EED35BA83999E2948195334F649B0B" - }, - { - "Count": 175, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708", - "CT": "322502659958040685DDA566144CCCA1994A222DAB" - }, - { - "Count": 176, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "00010203040506070809", - "CT": "3DDCE4DEAB1D356DF6D9C5193AE5CFE49FAE09DD8E" - }, - { - "Count": 177, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A", - "CT": "76807B64489CDD2ACBD609E5F65C1D38B2BCADBC5C" - }, - { - "Count": 178, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CFE80D5DA72623A5C23AD0095DB603CCE" - }, - { - "Count": 179, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C0B3A017DD613600EE03481F25B65DF24D" - }, - { - "Count": 180, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF5C7CF94D2515DE04C4DDA437204C1360" - }, - { - "Count": 181, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F002DDA9C556344C1E0836E3E86E8C9D84" - }, - { - "Count": 182, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FD2B51E8AE5F3CBBE843194A56F3380160" - }, - { - "Count": 183, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FFAD728CE0C193FB75CB944C151F4E27D" - }, - { - "Count": 184, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159A007F0DB5BF7CC1B72FB94BE92442088" - }, - { - "Count": 185, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E59F95C5A8EDD36174DD2C32B72BEE4C76A" - }, - { - "Count": 186, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4C49AE8C5DFD36E822F232A13240D7394" - }, - { - "Count": 187, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2632CDA8261E579172DC6F9DE2047F9440E" - }, - { - "Count": 188, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D356CAD7BA58E3D67A493460D4BAA0BBA" - }, - { - "Count": 189, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B296693950C9941956C2B4EC5ECB74476CC0C30D4" - }, - { - "Count": 190, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A20B81DF190BB7FEFADE185DF9FB6DD5F" - }, - { - "Count": 191, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DC692DE758B3CBDEFF640ED88833E0115C" - }, - { - "Count": 192, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE9406773EE2D98BA8EF80FA1F0F525F7E8" - }, - { - "Count": 193, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B4F63F18D9A4FA55806F41AFD716BED236" - }, - { - "Count": 194, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C7801358376A661ED1A918C6D88B36F94F726FC489" - }, - { - "Count": 195, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE9144B39BDAB0043AB3E26DF7CAE22F39C" - }, - { - "Count": 196, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99BF2E18B408692C305149810F5AB181C3" - }, - { - "Count": 197, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44901D4D6F45E224FF57369445A3D27E6DA" - }, - { - "Count": 198, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B2E0A3CBC4B4ACC98994F14B3D87BCD89" - }, - { - "Count": 199, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "", - "CT": "BC820DBDF7A40AE9AF4985E97254DAF329422C950FAD" - }, - { - "Count": 200, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "00", - "CT": "BD4640C4DA2F78D6EA93E816CB39E0A80B4DCCE94BFC" - }, - { - "Count": 201, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "0001", - "CT": "6E9F820D5468D9E5E408FCE9EC15C85B38CCEFEBD120" - }, - { - "Count": 202, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102", - "CT": "F19D28E0F2224DEE285B29A1342E13F600F333E97113" - }, - { - "Count": 203, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "00010203", - "CT": "7763F8BA6CE936102D7B46CA8704612D627AC16E5944" - }, - { - "Count": 204, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "0001020304", - "CT": "0E6A8B0CA5177A53CB9F906EA699850B741C89B24A4E" - }, - { - "Count": 205, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405", - "CT": "5B513546B1A1AE7318B7D7269A8D9204C83726A1F50D" - }, - { - "Count": 206, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "00010203040506", - "CT": "2E5BBADE9599A512FD6008CE2A1966B8C0DC55BF3F9E" - }, - { - "Count": 207, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "0001020304050607", - "CT": "69FFEE6F5505362C165AC93A2C5BB9368249E9C6D6F1" - }, - { - "Count": 208, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708", - "CT": "3225026599BCAB45922B2F7E244FBADF133386563564" - }, - { - "Count": 209, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF17462F354D4BB4CA64ABAFECE5DFB3201" - }, - { - "Count": 210, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A", - "CT": "76807B644889F84B8161C60383A1BD471FDC895865A6" - }, - { - "Count": 211, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD1E048B8615DAE0AE2DC34D89722C68571" - }, - { - "Count": 212, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06A4D42989455385C2B38E502240479371E" - }, - { - "Count": 213, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7F397440F3EC770E3D3BFEA60030241A79" - }, - { - "Count": 214, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088CC3FF6D959ACE12378B25FCF9556C471" - }, - { - "Count": 215, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA3FF82356F5ABEFDC4023D85E704A2D6A" - }, - { - "Count": 216, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFC8C43E178395D2990DFAD13F96961D4F" - }, - { - "Count": 217, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA51115962859C7AAF78D33DE639B520C99B976930" - }, - { - "Count": 218, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E59725809A1E053BB8807583793861DB825AD" - }, - { - "Count": 219, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D1B1E0F4A0494802543525A9A51DBB06BB" - }, - { - "Count": 220, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635D4E5AB26FB3C916E53398868BF92D6E67" - }, - { - "Count": 221, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D411804EA822D0EAFB27D1D82F240B1E1B6" - }, - { - "Count": 222, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DACA00ABA0D73DA3EC8666D1E05380DB39" - }, - { - "Count": 223, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A51ABBE26927BBD19A417FFEA00FD0936C6" - }, - { - "Count": 224, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDE1037A382DCB83E6F5D0DB387AE072C6F" - }, - { - "Count": 225, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE99448A9D9F23DE84D5620AA3885710F479A" - }, - { - "Count": 226, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA2932B77276DF6916AB2E3D4EE3BA294" - }, - { - "Count": 227, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C78013583721B474CD093BE0C36353BE2CC87DD24AEA" - }, - { - "Count": 228, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E7A4A740BE0693EE435EBBA9F0B632996" - }, - { - "Count": 229, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F9917E1447E30F742B782E1BBCEF2E0EA28FD" - }, - { - "Count": 230, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A449717E7E2589C8D1CB8D5BB599D02CC4BF7A" - }, - { - "Count": 231, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B622AB3CEF82D4964388EE6ACA28391C9F6" - }, - { - "Count": 232, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "", - "CT": "BC820DBDF7A463CE9985966C40BC56A9C5180E23F7086C" - }, - { - "Count": 233, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "00", - "CT": "BD4640C4DA2FFA03B74F698C695A740DE9F8B9C060CCE3" - }, - { - "Count": 234, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "0001", - "CT": "6E9F820D5468A026F06AB25F39569E8731B103543DFB8F" - }, - { - "Count": 235, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102", - "CT": "F19D28E0F222B3943721E28BE3BCFB19BD17A072021F00" - }, - { - "Count": 236, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "00010203", - "CT": "7763F8BA6CE91E3F511196C8AC4E6FB3C7462B63F2F2B5" - }, - { - "Count": 237, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "0001020304", - "CT": "0E6A8B0CA517F59CC32E96F262D3AFEB4C0E23F182AC7F" - }, - { - "Count": 238, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405", - "CT": "5B513546B1A1DCC6CA9DB502F91797830C5A1C14769134" - }, - { - "Count": 239, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC69715FB4556DECD1D4D4834EA4923C12" - }, - { - "Count": 240, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4314219112BF5A163EA5D73EB778848BE" - }, - { - "Count": 241, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708", - "CT": "3225026599BCD4EF4D546056A658769D6E6A3FE44FB086" - }, - { - "Count": 242, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18B6C7F9B6614818FAD0C0BFAC6CF492D14" - }, - { - "Count": 243, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A", - "CT": "76807B6448896C28CA17ED47E1FC9CA44989BE3F2D289D" - }, - { - "Count": 244, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD1715ACD899DF853EF95823F7EAE375E1A53" - }, - { - "Count": 245, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE42216973BB8F4CB76E6C56C0A8CDC79C" - }, - { - "Count": 246, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0EE23D55AE0C820645AA502B3FE988D81" - }, - { - "Count": 247, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088234C11CFC6D934D1970C550C6A4CEE177B" - }, - { - "Count": 248, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA170AF0C57E1ECB24B13703B4074FFDA82C" - }, - { - "Count": 249, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF96A10554F2BA496365CA9EC83456635F2" - }, - { - "Count": 250, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627CB07AFAF2698955EB1D0B46AC4B0C7504" - }, - { - "Count": 251, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E5972978CB4BB85FE34179D82DBA9C4729956A9" - }, - { - "Count": 252, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D182D920FA34B3206B2854EAAA24AF3529A6" - }, - { - "Count": 253, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCB926B6136EF4B6C05D286D90ACE512746" - }, - { - "Count": 254, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EC811279250DE19710B465C790CC9E951" - }, - { - "Count": 255, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8CDBBD3BC5836550023B74915FA9CBAAD" - }, - { - "Count": 256, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A5129E86EF92E6486D298AAA87FE6FE3BF96D" - }, - { - "Count": 257, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED1846E7B60E9BFC21726DDF5D08B1606A3" - }, - { - "Count": 258, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEBD465D327D1BC6D5CDFDD844C01A2E39" - }, - { - "Count": 259, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA9D159293987DB6EC695CA593CE1F865D8" - }, - { - "Count": 260, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C2BEE39663B98EE1649BA3089623F6E9A" - }, - { - "Count": 261, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F2C8ECCA953D1655614E1DF15F13AB7DC" - }, - { - "Count": 262, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F991733756D10D1544B33FC9E8BF0E7870CE3D0" - }, - { - "Count": 263, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE19AD2F6E65DCC0087F195AC3AFB87AA8" - }, - { - "Count": 264, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246F02CDD89EE300146CA89CC41558474B0" - }, - { - "Count": 265, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "", - "CT": "BC820DBDF7A4631C01A8807A44254B42AC6BB490DA1E000A" - }, - { - "Count": 266, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "00", - "CT": "BD4640C4DA2FFA565004C927913485A90B18BE0F3741A393" - }, - { - "Count": 267, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "0001", - "CT": "6E9F820D5468A0D4479650030FCAD9F01546D91CCCE82F5C" - }, - { - "Count": 268, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102", - "CT": "F19D28E0F222B3BFE5857114BF49C50C03B179885C99B370" - }, - { - "Count": 269, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1C2E6D6FA2309EF26D1E6DF20FAEB33A6" - }, - { - "Count": 270, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3CA175AC21A7D27119573A71F04040F1" - }, - { - "Count": 271, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405", - "CT": "5B513546B1A1DC8A17E753A550D508FBCA24A9183E100B01" - }, - { - "Count": 272, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F863B01D95B8945703B3B4A99B5E847A1" - }, - { - "Count": 273, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A489E897E5F141B2E4A2DAD326085A79408A" - }, - { - "Count": 274, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCD056B72EB2EA65EC5A8390501D5307D5" - }, - { - "Count": 275, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBBB2276ED3BC0025CE70E9F9C3ABAC03EB" - }, - { - "Count": 276, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE5BF6CB2C84EF6F0E27EDB1E0C3042758E" - }, - { - "Count": 277, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F9A0092415BF7CBB98FDFC4A4297B1E3E0" - }, - { - "Count": 278, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28CB3C68A035642460945476BE05D40A1E" - }, - { - "Count": 279, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFCD1D00A2AE6CDFD124CC88C69CB5D508" - }, - { - "Count": 280, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A777BF116992B7C3B88403B5DB8DFB50F" - }, - { - "Count": 281, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA1744263AC941C6EDEFB49505018DE9DAC9B3" - }, - { - "Count": 282, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F60A842C859E594D287C37E3CC96D1BB27" - }, - { - "Count": 283, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B4F9E21F048B85228FB7341C0F219898B" - }, - { - "Count": 284, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EA47E8684345C8CCD2F4FE66DF43F14D6C" - }, - { - "Count": 285, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D1822272BBB65A7DC95E7DDEDDCD7E897594FE" - }, - { - "Count": 286, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAAD94C76E59BF92EF72AF4DEFF19E1E121" - }, - { - "Count": 287, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EECD199F3466038201046CD9014E5206156" - }, - { - "Count": 288, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB873D07DEB14119BE886991FC34C7533373C" - }, - { - "Count": 289, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A5129583F067A14D9DFFE298CAFBD5D9B084675" - }, - { - "Count": 290, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18DC4BB79C9A9A48F7BB00808E1AA313387" - }, - { - "Count": 291, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC2A5E625089511B078A2E66D14346147EB" - }, - { - "Count": 292, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA99554EFAB257366A87CB0043C4ED4DACE46" - }, - { - "Count": 293, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C325EAA80F37549500B8785602B54CAEB11" - }, - { - "Count": 294, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F371D6F23757EDC6C010DC34DF6842F6CD2" - }, - { - "Count": 295, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F9917338017F297DD0712D02899570D25D686E23B" - }, - { - "Count": 296, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE131301B9632952ED5D9539C682262EF28F" - }, - { - "Count": 297, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0F4DDFDF86CED08389F0D3A1B58A4882A" - }, - { - "Count": 298, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "", - "CT": "BC820DBDF7A4631C5B46D53803F5D35E0A27D353508C9D054A" - }, - { - "Count": 299, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC8FA8FC61C17487D416BC2500FE08AAD4" - }, - { - "Count": 300, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "0001", - "CT": "6E9F820D5468A0D4765A7C907A77A3E6757192F0E0B60632B3" - }, - { - "Count": 301, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA3037E9B0B10726BD9C37122136DEA6EB" - }, - { - "Count": 302, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "00010203", - "CT": "7763F8BA6CE91ED16864D7B17E30D6B84786DC6E8BF4E4BAF6" - }, - { - "Count": 303, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D375623AC11C852FF0A98098CCB7429F2" - }, - { - "Count": 304, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAA1C99295F2144CF49C8089EE97F28C124" - }, - { - "Count": 305, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D7EA5A5C832E8F41072BD3400FCAD0D64" - }, - { - "Count": 306, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897ECF5BDD353828B5C3B397863CE8BFD719" - }, - { - "Count": 307, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC4E2222006C2A2294B855A474A7BC0C183" - }, - { - "Count": 308, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BBCA82D87B50BC91849B392CE10C92AE1" - }, - { - "Count": 309, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE588A9EDBEC3BF6112310DD58DA04C45D25D" - }, - { - "Count": 310, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D41A5F4500358CFE6C746EA9C00A832C9" - }, - { - "Count": 311, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC0E8002A11357997CAC91CBBF576C1406" - }, - { - "Count": 312, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD237FAD17CC79733643EA0A700A720D892" - }, - { - "Count": 313, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8E104704C8F7BE940187D0A5DDFF69ACF3" - }, - { - "Count": 314, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D2005397035FC67EA1209D61A8FFBE851" - }, - { - "Count": 315, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A823C7312B7CD22838B56833BA5390A96" - }, - { - "Count": 316, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B8565F1B6FAFF78FE04B036FD6E4F440246" - }, - { - "Count": 317, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB5BE7B961574BE4E8F422A2B695A548D08" - }, - { - "Count": 318, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F3AE875E72E80F1B0D6E45D0810D0F737C" - }, - { - "Count": 319, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA405B3525B05D8D68FCD01F7A35FDED0A41" - }, - { - "Count": 320, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45D57012DFC6E1A7493721FE4172066117" - }, - { - "Count": 321, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB87333366F1FE84C2D42364202F331C2D2B75D" - }, - { - "Count": 322, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EED31AC302A6FAC414DE28ECA8E6F37C85" - }, - { - "Count": 323, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D811EE7F2D9BBD55DCE3FFA57F7FFD307B1" - }, - { - "Count": 324, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27EC6B0BD3E896119BD5A7CB2153E2EF6AB" - }, - { - "Count": 325, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FCC3C986EEE5347527C1E7467D27F32829" - }, - { - "Count": 326, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D2326D7FDDB3535A8CCFBF564203081924" - }, - { - "Count": 327, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731883EFFCBC3C7EC8585EDD8FF1CFFF143" - }, - { - "Count": 328, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F991733801941D4D1D0F2760ABE1DA6B85F50C12E46" - }, - { - "Count": 329, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F9681E158D79E3D384374022E4838AE341" - }, - { - "Count": 330, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3CD840D6155C99EB0E4185FE0A0C9DC69" - }, - { - "Count": 331, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "", - "CT": "BC820DBDF7A4631C5B29C9A5A225C5FF2A5358A82D55DC7157AF" - }, - { - "Count": 332, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC7991C3A39392C59631AC91F39AA50FB182" - }, - { - "Count": 333, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "0001", - "CT": "6E9F820D5468A0D476628B3F745CAB219F55F8E39919D9C1E3B6" - }, - { - "Count": 334, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA115DCC8010DCD388868DEB9E72D157B8C0" - }, - { - "Count": 335, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F74C7113AD7BEF7C826D6EFC49C3CC3DB" - }, - { - "Count": 336, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E782C1CAED6E3570D3C167F1C55BAC13" - }, - { - "Count": 337, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA0DDA56A49BCBD3333A2E4D0A4BEB8F0FB" - }, - { - "Count": 338, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D865CFDEA5788E9FD0DDE9F585067078A71" - }, - { - "Count": 339, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC93B4AF37A996A1CDCDD047F83D55553" - }, - { - "Count": 340, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460B07943861109FA5234CC4C8CC54D6D53" - }, - { - "Count": 341, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4482A823D457BBB0420C6EA3E93469585" - }, - { - "Count": 342, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE5884238A66EC016F8D784690455ED86BCA117" - }, - { - "Count": 343, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D70D58C77698D2C8BAB8B414420BEB88157" - }, - { - "Count": 344, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC18D7AD7E7CB3EF8BCE97016B50940A4199" - }, - { - "Count": 345, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BD2AD1D6DE0798731C94390DFA9E28FB3" - }, - { - "Count": 346, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9E474BCCDF4E296516A64F4FCF9240081" - }, - { - "Count": 347, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01F9E880AA510ED2458873665F0DBD1B8E" - }, - { - "Count": 348, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7AF6FA7C56EAB371F3AA96338D5ADC0FFF" - }, - { - "Count": 349, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E56864D46EEBF9B17A23EF01AC3F6A56D" - }, - { - "Count": 350, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C51596B36FF941A15308E7A975383DD3C" - }, - { - "Count": 351, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332EB5D4E5C5911A8FF1AE7339C9C8A50A1" - }, - { - "Count": 352, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A9836FEB54EA9E1ADAF9343398B027FD9" - }, - { - "Count": 353, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC4597207CF70118EF26DFB95C6D70DBB5167E" - }, - { - "Count": 354, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB87333012117D712567DC1B08E27D24ABE2D9E3F" - }, - { - "Count": 355, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE30BE3A3296E2DC42D698EBBAEDA830DB52" - }, - { - "Count": 356, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD99F1097418AFB6556832039EBB9E1072" - }, - { - "Count": 357, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E63D3466BCE8AF7C325EB6D7BBD94B3C089" - }, - { - "Count": 358, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC474169EE68A64472FAA60B8A8D0B21DD6F" - }, - { - "Count": 359, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20DF1C094AB637441FDB14CE10CBAF4AEB4" - }, - { - "Count": 360, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F373164918FC498FBE952EFED4EDAB63D1809B1" - }, - { - "Count": 361, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F991733801999C2413B9D3A48C3F8D5234E3516E1DBAB" - }, - { - "Count": 362, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BCF73FEE4C7065CDDBDBF672AD48F4F35" - }, - { - "Count": 363, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1D567D22AA1E303C021FC57DE0B9330DD" - }, - { - "Count": 364, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "", - "CT": "BC820DBDF7A4631C5B298802CF2EE93FF523BD068CE507C683116C" - }, - { - "Count": 365, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7E990D6C7EE9287B4A1D8D9B6B9439974" - }, - { - "Count": 366, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F29997475DC5B21AED70EE44C34DBB047" - }, - { - "Count": 367, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E1F9CAC9105CBC1F976DD9A01830BBDBF9" - }, - { - "Count": 368, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F0105C50FB633147F93027D24D68A66DCAC" - }, - { - "Count": 369, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1BB13C3845216D9E1BB4643A9DEFA38DA" - }, - { - "Count": 370, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA0106491EE46D3D0E11FDE892A1A9C1926AB" - }, - { - "Count": 371, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F95ECEB88A892347749117B946960A465D" - }, - { - "Count": 372, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC8F390480DDDF5C59A313E252A9BF38059" - }, - { - "Count": 373, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC46018B6B900B6EC6204EDB31F2C094AC212C9" - }, - { - "Count": 374, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDA2A840B22FA894ABEF9E41D49471E04C" - }, - { - "Count": 375, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CBB4C776E1FC0CDEA268F27171C1636772" - }, - { - "Count": 376, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C3F9B4E0E222D8BAFF2A52B044EE3D247" - }, - { - "Count": 377, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182D586AC943C7C681D63F03ABE78252369D" - }, - { - "Count": 378, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC493743A337DB8D1E54203F73BAF51016" - }, - { - "Count": 379, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BA87C7D9F6BC4A69BEA69225CE0193D737" - }, - { - "Count": 380, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA84EC2E553F0AF56E0776164DA35AF72F" - }, - { - "Count": 381, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A49F682D714B4E306646E6CDB863BD93BC3" - }, - { - "Count": 382, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E679BCBBCDB8903A32B900D0F79DF4900F2" - }, - { - "Count": 383, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F22ACF8781069193F582EF6161AAEDC42" - }, - { - "Count": 384, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F2365556EA34A1D999990F16F51676745B" - }, - { - "Count": 385, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C3DCCE0A3CBB0C71FBF8FD07BC5386363" - }, - { - "Count": 386, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978EF78D100C964E121B55E11D3C57CF61A7" - }, - { - "Count": 387, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70C583CE3EF4650AF0DE756C61A01A73D" - }, - { - "Count": 388, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE309169F0CC17CF305D1605B657B3F3362D8D" - }, - { - "Count": 389, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C7EAA9001747D4197D292AF5DFAEF82CF" - }, - { - "Count": 390, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E631448EB6361367ECE979CE0DECD0301423F" - }, - { - "Count": 391, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C0D882B1A7BD480ECB66739C4DCBFCAB1" - }, - { - "Count": 392, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3DD0D32AA275FF244C4CD4953F34FAAB4B" - }, - { - "Count": 393, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C8672EF1E9530AD6C47C8EFB56B09A32C" - }, - { - "Count": 394, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972ED28C17572CEF44CD9D930EAD006640D" - }, - { - "Count": 395, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDDBF85C5C75DE240B593A58105606FED74" - }, - { - "Count": 396, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5416169930686EB8DF5D27AC1FCE8154A" - }, - { - "Count": 397, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884A7D1C07DC8D0D5ED48E64D7DCB25C325F" - }, - { - "Count": 398, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FD4A8FCF788F46F3C6A204295009DB94C2" - }, - { - "Count": 399, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F584D41DD92D033C684EF05C4D2414DF92F" - }, - { - "Count": 400, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E1518AFA8DEA8DD03876AC4D57A3E3796FE1" - }, - { - "Count": 401, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AAAAE6426B668C95B845B822166A11D59" - }, - { - "Count": 402, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8E3F114A959F0436C3C4DEFD8B6247829" - }, - { - "Count": 403, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DCF29744B9EC718709EAF20E38B7157334" - }, - { - "Count": 404, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D6200163BCC6E0594E82FEB3772702C451" - }, - { - "Count": 405, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80C581FF689BBF1A0424213E5706E423F48" - }, - { - "Count": 406, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC4601815248F96E3492EDE5BA9E850B44160A908" - }, - { - "Count": 407, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDAC2CE1F87423F05B9627E3206B08EB8FBC" - }, - { - "Count": 408, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4A94561BC1596B8E690C1C55263020636B" - }, - { - "Count": 409, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5BCA4E671AC19C875F4199BF8FA872BDDE" - }, - { - "Count": 410, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF69A28E81EEF58D7A1F97714EEBB997795" - }, - { - "Count": 411, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2DCA0E9E49F99C745B78D290FA76840B0B" - }, - { - "Count": 412, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB7601569C112D9BB851B619DCA52B07971" - }, - { - "Count": 413, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A4FBE0AF7A029E02AC2321ED6B96A0040" - }, - { - "Count": 414, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A49600A25A3A60C6218002B62B500CD570C10" - }, - { - "Count": 415, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F97C1E05DA800A312422BADFF7F52F2685" - }, - { - "Count": 416, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F13AEBB5FDB936D0F714CD5CD9A75156CE8" - }, - { - "Count": 417, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F2459E7087F8D69D9D783EF1DA1E18BC7EB9" - }, - { - "Count": 418, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C2406C929C79830B1B3129053FD8E6429BC" - }, - { - "Count": 419, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F099C93C1A1229F6CA679F47295754175" - }, - { - "Count": 420, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F34EE7481F58DABF8DFDD5E029C6ED141" - }, - { - "Count": 421, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091493C623AB0EEA65838A7679C86DB353D0F" - }, - { - "Count": 422, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F96BEFE1CBB58EEC93BBCEF6914ED0550" - }, - { - "Count": 423, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E631448F2C0227FCC1539CEA5BEF561CBEED0AC" - }, - { - "Count": 424, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F2ADC5376EC061A58D39F77A4ABFAD5E8" - }, - { - "Count": 425, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D7097A290B3CC022F85F1754EB7F7BFC313" - }, - { - "Count": 426, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6E5BCD5D4993978154FDA2E12546FB4D43" - }, - { - "Count": 427, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D129B5063BC0552F8D4DAC8C6C17D5DDB5" - }, - { - "Count": 428, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82240E2B921122EE96896BAA7A6724BBDC" - }, - { - "Count": 429, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D3A80A06C0C851CF53DAF1B58948FF2E1E" - }, - { - "Count": 430, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD62BBF1806B99220D1C7D5C780B6670433" - }, - { - "Count": 431, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD0F5A5FF903850EE458B1412A7325CBEDA" - }, - { - "Count": 432, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F5865ED4E3616962BA2BA0FD39997DB92DCB0" - }, - { - "Count": 433, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151538105B64988BDC3199E79C677DAC9C67D" - }, - { - "Count": 434, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB60DA3A4A96C735BEE2FAF2B1BE26A061D" - }, - { - "Count": 435, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D713F47BA91F8765555D2D8884E8649DE2" - }, - { - "Count": 436, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49BABB076329398CBE2621CEEABF2D999F" - }, - { - "Count": 437, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D6516781557A57C6D09F102E1659883B67FF" - }, - { - "Count": 438, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBD4F8B0B89564F14027C497D9222129E85" - }, - { - "Count": 439, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575EB717E219B4939D8B6471FAA9B4A2F14" - }, - { - "Count": 440, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCEC8B43D6D1F3C38191BE4A57B8B41169B" - }, - { - "Count": 441, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED3C0254ADF950EBCDB1A9C193420B4157" - }, - { - "Count": 442, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11845171502125BA607CCA01D3B3292C41" - }, - { - "Count": 443, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B5AD69C8F30A5BA3270DD277999732B64F" - }, - { - "Count": 444, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A2EFDE23D534EBAE541345FBF7566DAA0" - }, - { - "Count": 445, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D305CD3549E1F0D14930CFDB168D0F21F" - }, - { - "Count": 446, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EB7C322FA5FBA9BCD32F46521712A3F27" - }, - { - "Count": 447, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A49601063934BE693EC0C20CB214FB95ADC73AD" - }, - { - "Count": 448, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B29CCC9FC4F4FCC6267FD49C97BCF567D" - }, - { - "Count": 449, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D49C8200E44021EA9F41BCD32429BCFA0" - }, - { - "Count": 450, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C7FBD1990862F19C427FB7B09E4E0F280E" - }, - { - "Count": 451, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E417F24415BFEB68700365FE1CF7FD79C9" - }, - { - "Count": 452, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F89E78386941A019842B6D85EE4584B95D7" - }, - { - "Count": 453, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21E5AEEA6926F739785C85EF9E20FADF62" - }, - { - "Count": 454, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE309149034D4674D8DB745A6EE3E95A47EBE77764" - }, - { - "Count": 455, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BF08CD1AB628789BB01DA600EA11A6CB3" - }, - { - "Count": 456, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B0C780A2D13661B515101B4A25B51AFD9" - }, - { - "Count": 457, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26D6D701373CDD506C0AB4D3570712723B" - }, - { - "Count": 458, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A54FB7AA20660DCDAE94D97B71A6647A6" - }, - { - "Count": 459, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC7575C7A8C3FDAC44461027EFB40E1168A" - }, - { - "Count": 460, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19B000DE9A5285AB89A5D80F308FF3EE2D2" - }, - { - "Count": 461, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5BBE210FE2257D72FFA56BC12EE47BF39" - }, - { - "Count": 462, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373020162A0AA7DE86B60A6896EA3A7514C" - }, - { - "Count": 463, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69169B166A6441745A77DD0DF6C80BD700C" - }, - { - "Count": 464, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD0739AF86776A7687DC217A8501BFD24E4B3" - }, - { - "Count": 465, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F586508081A133B9A7C902EE007D0BCD5107CDD" - }, - { - "Count": 466, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C0F1FC3D3A1B27E5D4947E795730F35B7" - }, - { - "Count": 467, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62D6E15CC4540D95C497FCECD4B8140115E" - }, - { - "Count": 468, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D73419C297EA65424D1FB6ACA71C2BB35CA0" - }, - { - "Count": 469, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBBCA554A68B33CE0D6B1C921AABDE21E5" - }, - { - "Count": 470, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651795E6364AE7F28021751D665795F13107E" - }, - { - "Count": 471, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFFF90B87778D831B33C268A1E2F345BC53" - }, - { - "Count": 472, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FAD5FD8B0D4B0E17BFADA58D0B1704DD36" - }, - { - "Count": 473, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A067F4D6E69416186F93F1D756B8D8539" - }, - { - "Count": 474, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C6FCC04C876F9893F783713DEB393ED1F" - }, - { - "Count": 475, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA6D0E531557DFCAF051C0A8A2EA275034" - }, - { - "Count": 476, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59482FC9750406D367C72DB8F1D559809DD" - }, - { - "Count": 477, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A5950F33F2DED3249A60BD255AC1D2949AC" - }, - { - "Count": 478, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02CB78FA4EFE42C665F0111101D241618A" - }, - { - "Count": 479, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEF496A61B13A0FEED274E2906110A134FE" - }, - { - "Count": 480, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F11EF2E78EADEE87E6E1FFF5D1B3A24194" - }, - { - "Count": 481, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3A91AD955AC4BA7975EDA28EFEDA25CF20" - }, - { - "Count": 482, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3E7E9E5DBA53D85D36E48299CF4B975080" - }, - { - "Count": 483, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70A0571E987538C2C57A6ED8C6BC11B9F76" - }, - { - "Count": 484, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E497CDE5452FB18BC2A3CB76418D497776C1" - }, - { - "Count": 485, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F89423901E6F210A135189991CF9F1F3862E5" - }, - { - "Count": 486, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C889F8B994533F0BDDDF7850406F849103" - }, - { - "Count": 487, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE30914903319CC301D76BFE7A112A34827BC060C4CA" - }, - { - "Count": 488, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB25A433AF4D4E761460D414568EF2314F0" - }, - { - "Count": 489, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CE06436CC937A7B3CC371D36FEC15BBE5" - }, - { - "Count": 490, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F261968829D07F56E3F0FBBE5A584393F1C42" - }, - { - "Count": 491, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15FF56CD6F98C3239399793633BFA4F741" - }, - { - "Count": 492, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79EB6876B775211FB5050D2A3C3A7123779" - }, - { - "Count": 493, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE4BCFEF42F569A425BD359A32FA6DD6A84" - }, - { - "Count": 494, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5155335B6656748D1037784327DF981FC3D" - }, - { - "Count": 495, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B05E263B3F65163754B40BE6701016F2EF" - }, - { - "Count": 496, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD6917516D420A5BC2E5357D010818F0B5F7859" - }, - { - "Count": 497, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369A9779D0C974CA41061D4E1250B93D8F0" - }, - { - "Count": 498, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864D33F2CFD1B323CADF3356028727A65E6" - }, - { - "Count": 499, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5C86B17754667730F952C0762C2D036649" - }, - { - "Count": 500, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF6B3AFE8414395DBC6225F8096DCA2FAEE" - }, - { - "Count": 501, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734515E47320236027C25871944F7C8BA8DB8" - }, - { - "Count": 502, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA58CC8E14F4CEB3CE83592BFF99C053DE4" - }, - { - "Count": 503, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D6393E370547CFD0F4CAAE5DDD8503A00" - }, - { - "Count": 504, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67FB25542F1F646BEC9B625408219371A9" - }, - { - "Count": 505, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D5D7878157A3BD44533EB5CAC8EAA808E" - }, - { - "Count": 506, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A6764B450C90CB3C232F3FDD3123E2AA099" - }, - { - "Count": 507, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41E84BD13C5FFA165F9836F5EC8567B117" - }, - { - "Count": 508, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14C972AAC92CA70A8D2235C957793BAA9D" - }, - { - "Count": 509, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467D3BD4E9D996ADF38946367CF3B357314" - }, - { - "Count": 510, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B3618CF3D4C7D9A716483683B193A994C" - }, - { - "Count": 511, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02931359CD914FEEAFE892D429E62F3DE0C9" - }, - { - "Count": 512, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB0CDBAC21A17F7627A02B8520502D0A308" - }, - { - "Count": 513, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129DC0722BC4625170CC8FBBABCE67AC6D0" - }, - { - "Count": 514, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABFA1FA8B51439743E4C8B41E4E76B40460" - }, - { - "Count": 515, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED0FE4BA8BBAEEF96EAB9F7389164447229" - }, - { - "Count": 516, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB246178AEBAC560CBBF26E4610C627B2F4" - }, - { - "Count": 517, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970437D52C2F7DE7354FD3E656BCECBC2FE1" - }, - { - "Count": 518, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249B1B07E0E6A162F76B02B8589F51A8951" - }, - { - "Count": 519, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844B48DF953B828308ACF89FFD715CB69E6" - }, - { - "Count": 520, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6D08156FEB3CBDD13E272B7ADD92B5586" - }, - { - "Count": 521, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2ED71D67E82B00710770DD02265ED5394C4" - }, - { - "Count": 522, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF5C393F936453BC89A78944CC2DF2B8" - }, - { - "Count": 523, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F2619926992D0226C36CB7016F74ABC48E705A2" - }, - { - "Count": 524, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB49B1E0CBB2B593BB733424543A51FFA0" - }, - { - "Count": 525, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E17D442384DF3DAF764A888E7B4B53C1C" - }, - { - "Count": 526, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467A0D0A6E122B5F9B342B5107D80152062" - }, - { - "Count": 527, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152FFE0336ED84AD5635C039C7969F31AEC8" - }, - { - "Count": 528, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D532E2F22E811EFA3311A647577ED0C9E1" - }, - { - "Count": 529, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3F58E28436DD71556D58DFA56AC890BEB" - }, - { - "Count": 530, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DD23185CC86B06939E868E420B69A72AEA" - }, - { - "Count": 531, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F069895A94020C6CDCFA13D2AD695C8C83" - }, - { - "Count": 532, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC73FC3B9115AB49D7C9FD7B853CCA8F42" - }, - { - "Count": 533, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F70DD20FAEA97E4CA259F28B9056D8F5E" - }, - { - "Count": 534, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511CCA08DB19C090B0901B09ACA853AE16E5" - }, - { - "Count": 535, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA5537F85A1B05E557291A75CB0DD96C8F81B" - }, - { - "Count": 536, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72710F0AC3F792B2D287CA34F7C0C314FE" - }, - { - "Count": 537, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE31614DAC97643C45940A8F9E7964613A" - }, - { - "Count": 538, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D141B303840EA35902483DCC94992D994DC" - }, - { - "Count": 539, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B1BF245191EFD88892DF3336ADAAC9AC48" - }, - { - "Count": 540, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41045F54219BA5067337FCCBFEF53ECB879E" - }, - { - "Count": 541, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA1498217B49CEC36F36D119FAA794A140068C" - }, - { - "Count": 542, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467721112BC64E6CDA1F41CE542134B7609B5" - }, - { - "Count": 543, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B44526E4B15B4B3184A2FC1F7D160E4E972" - }, - { - "Count": 544, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E2044DB6FB77058DCC8618539D315E816" - }, - { - "Count": 545, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB0454281D1D3B962418D2E1C8A6D14F3E8A2" - }, - { - "Count": 546, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5A34081410D25FBBC68B9216046750AE6" - }, - { - "Count": 547, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF149935A8D7A204C0FDECFCBCB704B3516E" - }, - { - "Count": 548, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E6C2ABDC9CA80035C91D6B0BD0E10F862" - }, - { - "Count": 549, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D23B4B4438820064CF8B2D9245DF12BB9" - }, - { - "Count": 550, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400DAD3E03324CF89C4B1DF5D6E9680F16E" - }, - { - "Count": 551, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8BBBCB07A1DB054668BDE362EA5EE5A8A" - }, - { - "Count": 552, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D954FDC015CBD0B352D9148F4BFBE535E4" - }, - { - "Count": 553, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A600685D49DBDFD71E1AC9A566BCE7F5ACBB" - }, - { - "Count": 554, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB509A90C2EDB036C3E14C931F9E0C7F66" - }, - { - "Count": 555, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF7CE715F655DE23DB4DAB49C1F0520E17" - }, - { - "Count": 556, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F261992325B4DAC6CCDAFD4EAEA095C95C02D8B0E" - }, - { - "Count": 557, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B2FE107D3141CC7879EF84B050AEFD142" - }, - { - "Count": 558, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E399C809B7EEC00F1C254DE6C76946FBF80" - }, - { - "Count": 559, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6E9CC21E21E4B78EC62FC2D782A0CD9D9" - }, - { - "Count": 560, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F1465798BC5CCBEA264C14DEA8502F25C04" - }, - { - "Count": 561, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D51656B8B02AE9C620D98ED6E1F8E5589F64" - }, - { - "Count": 562, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C33839D3160FF350D4184734773C11BF5603" - }, - { - "Count": 563, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF328827210DAEEF1B00B69D0EE9FC7883E" - }, - { - "Count": 564, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D56EBD66B687065AEE259D8C30EECA5910" - }, - { - "Count": 565, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0B84A31C4522D2CFDBA1312EA6648511D6" - }, - { - "Count": 566, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F583518C83B060F221E3A1EB59E19424AD5" - }, - { - "Count": 567, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32FE42B77F55D173493A512F6384C3FA1A" - }, - { - "Count": 568, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA553510B46BB397A40B26846C5FE78B1201CDA" - }, - { - "Count": 569, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D7275FCCBF5894B00F2521682581DC6B57EC7" - }, - { - "Count": 570, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE45F405DA3F52A534524CD268ABAB34DE1C" - }, - { - "Count": 571, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BE9C8D3517D972AF3CEA382275CD02046" - }, - { - "Count": 572, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D82C2D8F2C53DF140B314F40FAA288856" - }, - { - "Count": 573, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041DE5747C43B1C5F6E021F2A63413077D17" - }, - { - "Count": 574, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA1498058CDE0A253DE70296009D2F77A46B1C4F" - }, - { - "Count": 575, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725AD514C5B75DEEDBB562AFF7B73B9101DB" - }, - { - "Count": 576, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B44616D6BAAE57AE50DA0D10248F7F29BCF65" - }, - { - "Count": 577, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9D932C0D3D8B376021E32A7DE6B2E24E86" - }, - { - "Count": 578, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB0455035A06E6E29643AA3B2A2B3AF5ACDD163" - }, - { - "Count": 579, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9F24CC11E01C76F3C9F6F6F41D480BFC8" - }, - { - "Count": 580, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF14901DCDABB6153FEE4AF0F1E92FC91EE424" - }, - { - "Count": 581, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4E9262177C4A75FDA1F0E2C62EE6A47009" - }, - { - "Count": 582, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D02B951DB9BA69825EBCC65EE42A2724C49" - }, - { - "Count": 583, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA8AB366C8B5E55FA9C7BDDFF8403ED70E" - }, - { - "Count": 584, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE8931AC983F1C07C094B45EAC636F722" - }, - { - "Count": 585, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7DABB5B662840CE5628D0EB0C53F2C236" - }, - { - "Count": 586, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BD44420A51F7FCD892F62A972DD5037A1" - }, - { - "Count": 587, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB40788B8784CE35231F88131BD6E1CCC21E" - }, - { - "Count": 588, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75AB5C2E7EF5F2B44AECCD96589571C0F7" - }, - { - "Count": 589, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD46A54DD60BF832C0390A94967ECA736E" - }, - { - "Count": 590, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B75055BA12A156D966BEE896D3657E4E821" - }, - { - "Count": 591, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D0F367D35E80C73C60E285A06C1BF76BBD" - }, - { - "Count": 592, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C71C592296ABC7DCB443C1AEE204563184" - }, - { - "Count": 593, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149B1FDF764AE096AF5EF06F3B649410D23F" - }, - { - "Count": 594, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168D9FD57F7A9D6C684B8A005CB11EE3A0F0" - }, - { - "Count": 595, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C33896BB6570B77AA9A0D22DBD95359713DDA7" - }, - { - "Count": 596, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF3861BD28D621EDE229828F0F30A0B01A01E" - }, - { - "Count": 597, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5744D68C528C150A1F6DA44571EA0002563" - }, - { - "Count": 598, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEF5983F12F3D14F2F6917679EF250694E9" - }, - { - "Count": 599, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D0FD10A733A02424B71DE04FDF9088F05" - }, - { - "Count": 600, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CACAC740CBEE43DDBC674AACD895754FA6" - }, - { - "Count": 601, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA5535101D580542E71D72F8899DCCFE547AF2F6B" - }, - { - "Count": 602, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750F0D00173D8B641715894EA02912D93C69" - }, - { - "Count": 603, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457EE4FC3BF74D0E7EA8B945F2EB2A898DD7" - }, - { - "Count": 604, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD000E0AA31AAE5C17108B00428F98D178" - }, - { - "Count": 605, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9F7EF5A91230C532887C534E22535CE111" - }, - { - "Count": 606, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DA262476F2ECF4C58ACCD2BEA2F349FF7" - }, - { - "Count": 607, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA149805747057E09435AB4A22585BF36AFEFAE03E" - }, - { - "Count": 608, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70445C48DC636194AA25601AA2B89A769C" - }, - { - "Count": 609, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B146BAAD3796EB22B9EDB294870D9C147A" - }, - { - "Count": 610, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2143034F7F3AE086162F8C431BBF322EC" - }, - { - "Count": 611, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CAB1F8CC1E194FE87EAFA8C358226E28D3" - }, - { - "Count": 612, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3D1D2EF9E5E3AB15916B293C0CBBC83A0" - }, - { - "Count": 613, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F3EEF159D7F59D585D542D06471DDA52E8" - }, - { - "Count": 614, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDB8E5B8314209F5CD94D9236D3728B9DF0" - }, - { - "Count": 615, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B3ED537B3AB4BECC99A39D2804DB5BCE0" - }, - { - "Count": 616, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA7827CB8081D9E59635A25528469C621BFE" - }, - { - "Count": 617, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE01A6038EF6B22B8B0009FD112D6C8CDF1" - }, - { - "Count": 618, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA29C8984EB4235F587E7816F6725F1B27" - }, - { - "Count": 619, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCBCA27D18A9AC1A1ACAB65A7060963F098" - }, - { - "Count": 620, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB40288CBD7E70A7ECC1F9AF850DB1D3A32772" - }, - { - "Count": 621, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC7EA63BFB71CFA709C2EC3E6EEB1A6F33" - }, - { - "Count": 622, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6D9E39E1276E3265D6301F1D0F471919D0" - }, - { - "Count": 623, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B7545412128B588A23725159101ECA0C5955B" - }, - { - "Count": 624, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D0441CDCF90FB69286194B76BD47C5B5CFDC" - }, - { - "Count": 625, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B792BD5DD272A9886432528BD43C8EBC7" - }, - { - "Count": 626, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE4A32665E847F526E62B961869F128241" - }, - { - "Count": 627, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCACB7A9064D604ECBC4756C25C25808705" - }, - { - "Count": 628, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655260B684A89F383344B1B58448CE3A062" - }, - { - "Count": 629, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CA1B7EED9F588EEC0585EA94024E77896F" - }, - { - "Count": 630, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743B6EF9C19C11089FFA2549053C4461F1AA" - }, - { - "Count": 631, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1060BCCA73055372A6F5F92E1418CC916" - }, - { - "Count": 632, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D6432E36454E58C325DEFC8E98930EF7690" - }, - { - "Count": 633, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA445DC34B6E8EF29A17B2B242C43ED39A74" - }, - { - "Count": 634, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA55351011534D8E692193523F78FB90E54F80C86DE" - }, - { - "Count": 635, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE3BEA3408F27B64AC1E044661FCA11487E" - }, - { - "Count": 636, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E4226A261F475B9A4628D3AA6F4C21C48B1" - }, - { - "Count": 637, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D40F465E70C7F8B43C87EB811DE0459CF" - }, - { - "Count": 638, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF2B2F7F9EDB877586583C277B830995397" - }, - { - "Count": 639, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DECA43936776C15D54263D2CCFB482F3821" - }, - { - "Count": 640, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA149805748886FC68BFF26F56523038A9634BFBE809" - }, - { - "Count": 641, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FAD2257EDD0E5343CCE96914CDB8D1150E" - }, - { - "Count": 642, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16DD1DA38BCE767F4BC796221ACE44A173C" - }, - { - "Count": 643, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D9C1A1C79F8F8D9E55DAC33422D19263DE" - }, - { - "Count": 644, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93206B86C53E96F38643F1EAC3B9FE2618" - }, - { - "Count": 645, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3866EF53F0EFBE6F6B4ECDCA6BC70270DC0" - }, - { - "Count": 646, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306C6DB3752200CC9235752C3E0A41B38C8" - }, - { - "Count": 647, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA07F2E5FC7096CE6589F25C8DC07076213" - }, - { - "Count": 648, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47FFDB1F338ABD07F4C62D0A3C7B1DB660" - }, - { - "Count": 649, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DEA9E4F2750CFD52D18CB5B8278B488E28" - }, - { - "Count": 650, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A17BBBE117725F77DBE1258DC408269C89" - }, - { - "Count": 651, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA342CB6620322AD859C9AE5740FEE27BF6E" - }, - { - "Count": 652, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB733B6423E9E947A4E6A486D397B3563C9B" - }, - { - "Count": 653, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824FFABC1A7F01D75DF27090E493FBC0ED1" - }, - { - "Count": 654, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC66CBC57CBE6E0AE3FA307D2EE177A58594" - }, - { - "Count": 655, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEED65258452E40624216D2A2599AE6EE44" - }, - { - "Count": 656, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566DDB4495B0D1DD5CDAEB1FFF95BC684CA" - }, - { - "Count": 657, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D0447634DAB831960367C37BFB9C0B91BC4577" - }, - { - "Count": 658, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B40887CD1E10DE712672F6BFD5C8E08D7DD" - }, - { - "Count": 659, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A77E80F6FF3534F4069508924897650A9" - }, - { - "Count": 660, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A8CBA107FE6B9D1459632EF3F96B86226" - }, - { - "Count": 661, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA4AF310AB698B3090A7CBDBF3432D3DD4" - }, - { - "Count": 662, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACCBBD49F18ED24EC3747A9DC1C7DDE0F25" - }, - { - "Count": 663, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA07D68F09EB8D090D5724D487F3023A8D" - }, - { - "Count": 664, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3F8FB64C8BD6583DDE77ADF171D1D0097" - }, - { - "Count": 665, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643BAC1273081FD86931E93CA453F24E0727" - }, - { - "Count": 666, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415E10196CDE1C6FD04100C89E73AF86DFB" - }, - { - "Count": 667, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA553510115072F5EC462E050792C12464FAFCCC4F5A6" - }, - { - "Count": 668, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31CDD5F0B73385D39934EABC0456241722D" - }, - { - "Count": 669, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E4228C855D481D5E309FBDBB784905DB3DFC1" - }, - { - "Count": 670, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6BF3B05571F8DBC017433E9E13F1C09260" - }, - { - "Count": 671, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF2815344492269D6E93A9696AA4E49461685" - }, - { - "Count": 672, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B5F557C05ED74645E0B5B07FDFA3EC4BB" - }, - { - "Count": 673, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B72E21A203E6D2330F974B682D1A2DC18" - }, - { - "Count": 674, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80C0D6A63C9FC06CD31B44640EDB524B24" - }, - { - "Count": 675, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D086026140E5290276C6327775ED0E4C1F7" - }, - { - "Count": 676, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D902B5D664F6926A24FC00EEE61F16B650DF" - }, - { - "Count": 677, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE1B20FED884AF0C7067D1656CEE475A83" - }, - { - "Count": 678, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BC8EEC2D9B2263B74E0D1784F5C6EE64D" - }, - { - "Count": 679, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CDF4625E80409F05B0719C6E49A80A4FAB" - }, - { - "Count": 680, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA079A23CE7EEB9B4664DDB5F5D1247DC0E2F" - }, - { - "Count": 681, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C186B0449E776F0D6980D44638A0C24370" - }, - { - "Count": 682, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE824E1BC98B6A38037D3428F3AB21D477AC" - }, - { - "Count": 683, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149BB7AE2DA0FA056D43C4FDA052309F33F" - }, - { - "Count": 684, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F6EF8A1C9FC550FA812DD261B6C70D2CC" - }, - { - "Count": 685, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389A8A2D469E118D86BB0C837296505F461" - }, - { - "Count": 686, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D306C64EEE45D243539BFE0E1069217FBD" - }, - { - "Count": 687, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC6679D3960243E50B17366591A5BFDFF410E2" - }, - { - "Count": 688, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECACA676D77C823C51C3DA448C7A1AAE19F" - }, - { - "Count": 689, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D1D05FF63035CCE5744735AB34FBA3D0E2" - }, - { - "Count": 690, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D0447608C49202054DC4CE5ED08A36460813813C" - }, - { - "Count": 691, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088E5B0FDC51BACF2E7129731EAB9957611" - }, - { - "Count": 692, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A13A6C90E104465EB63D28798D22155A0DD" - }, - { - "Count": 693, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96AB55D515C02182868A73513E7D8492BA" - }, - { - "Count": 694, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA817CDDDDDB4EE51C5C403B0AE24B7D8708" - }, - { - "Count": 695, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACC1C9590A1A082168187C08FBCAB96C53044" - }, - { - "Count": 696, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA43B66BFB59B73A1E3029CB52D20D70275C" - }, - { - "Count": 697, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3EFBE84959466CD5541BF4ED5DEE0FC8682" - }, - { - "Count": 698, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643B5BFE32E562562BC17904336252B669D9B1" - }, - { - "Count": 699, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415FD7C242A7053D1D6B1753342465AB814E6" - }, - { - "Count": 700, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA5535101150770F273D2A041CB22ED544792A61DBE7EC5" - }, - { - "Count": 701, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31C29D6B0A52D78DA29D7F1B28C974A817735" - }, - { - "Count": 702, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E42289A6B7A72AE0440055570D04783E828E80B" - }, - { - "Count": 703, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6B1BDD001B6BB4BCC7C8A24C737883D89C02" - }, - { - "Count": 704, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF28142BAE19C560DD6B6722CF219DCF4049140" - }, - { - "Count": 705, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B3AC9C6CD100C70393C119B15991785274D" - }, - { - "Count": 706, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B4C8AA55765BFA9267F8EAEBB38D3ED4E56" - }, - { - "Count": 707, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80E6608C39AB5C2D7D21CA2BA4F5DFE4F4B1" - }, - { - "Count": 708, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D08AEAB52612991152894DAF9664063E5ADF0" - }, - { - "Count": 709, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D902930226854353B8547D18CFFC3D650C073F" - }, - { - "Count": 710, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE23A437797892B8913E9C9003404A91A6A3" - }, - { - "Count": 711, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BFF5F9C585268C198B76BBA59E49A932807" - }, - { - "Count": 712, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CD3749F3DAE6B734BB52F01366B5741970CD" - }, - { - "Count": 713, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA0794B47127D200B0283147870A1E45AF980DD" - }, - { - "Count": 714, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C1D015EBAAE30EB8D864C57EC8566B5E540E" - }, - { - "Count": 715, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE82414590B4B7524D50CE73DF27604183A58B" - }, - { - "Count": 716, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149F4C564D985B1964585AB4D96E930488C11" - }, - { - "Count": 717, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F7D6CA2A65BB9813954D611FC81C4FD0AF4" - }, - { - "Count": 718, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389BB96D35124D1E1C92E4DC0554BDC958A7C" - }, - { - "Count": 719, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D3E8255ED6FAA2A920DD3D86ED56BCFD18BE" - }, - { - "Count": 720, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC667993D5E1524E884961EC39FED07D8F21813A" - }, - { - "Count": 721, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECA2833FC3010E541DA0AEE55EA221712D463" - }, - { - "Count": 722, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D10C2DA8265BF5DE7EFE9C0E2066CD7EF4FD" - }, - { - "Count": 723, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D04476081D8F6373EDD02AA2BC134D9975B7F4B369" - }, - { - "Count": 724, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088F975F5DDBF4C94C8DC99DA2513E4EB55BE" - }, - { - "Count": 725, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A1383B70153B0ACFA4CB9A56260DD86B851E6" - }, - { - "Count": 726, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96736CC5AB9E757CFC6DC4DED82FFB309B24" - }, - { - "Count": 727, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA81353B155C981722AB475C9D51C4DD95F4CF" - }, - { - "Count": 728, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACC1CB31432DAE2EFECDEA8E2F6BD311CCC893B" - }, - { - "Count": 729, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA431B3EF344DA740BB7A3EB3CBA7AB42206E5" - }, - { - "Count": 730, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3EF712CBDDB5B77900426D20A1D858CE3557D" - }, - { - "Count": 731, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643B5BB5156AED825B303060C9FC19D78ED4CC1E" - }, - { - "Count": 732, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415FD43050024682B3FC2884E66111EAC29324D" - }, - { - "Count": 733, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA55351011507708E726ED9EC64EDE105946BC0C84201CC3F" - }, - { - "Count": 734, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31C2913311FA3450A1AE9B24C5D55C9BF760D83" - }, - { - "Count": 735, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E42289AFBFFD5E650F0B24C5BAAB1FB5419C7DF07" - }, - { - "Count": 736, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6B1B7393F82F59D7269C6C44684F7DFDE6E849" - }, - { - "Count": 737, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF28142F6FB8B5BA61CD77279E23A5C2D0DABFFDA" - }, - { - "Count": 738, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B3A0D60FE208982F059EAEBC4B18EC8724EE8" - }, - { - "Count": 739, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B4C39686C1318CEDE76C0BFC5288BE5AF1333" - }, - { - "Count": 740, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80E6A3B602B8D8C2A6D78C3967C9E321655652" - }, - { - "Count": 741, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D08AE5447399AE7B865FA93F15898E9328CE527" - }, - { - "Count": 742, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D9029331FEBEADDFED3B5E0DE5EAAFF488716D7D" - }, - { - "Count": 743, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE23A9BFF1A619D0D3404A01F489767FCAB75F" - }, - { - "Count": 744, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BFF4158A9902C4A26F0E557B63093E9F9C2A1" - }, - { - "Count": 745, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CD374B40554E927446842A6213BAA0AB8315CB" - }, - { - "Count": 746, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA0794BBA3BDBDFC45BC145817689D69B86875591" - }, - { - "Count": 747, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C1D0D373FF563A2B54BD47864CB8B558E86552" - }, - { - "Count": 748, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE82412DBFC8E290B91B2D163154AB3087DA1D4A" - }, - { - "Count": 749, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149F472AA4DF2638B7094F83CD4A65379058614" - }, - { - "Count": 750, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F7DC4B1A5FAAD296303805AE72B74214799EC" - }, - { - "Count": 751, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389BBBFAED24C4E9769418215BA43D829EA310E" - }, - { - "Count": 752, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D3E814A10FEB8FBEA514A59194A28BDF42F59C" - }, - { - "Count": 753, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC667993E0DBEDFD8EC9AF19D47C833C832FD8A613" - }, - { - "Count": 754, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECA28E30F0BDE53D809F15759F77167DE7D91A8" - }, - { - "Count": 755, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D10C5B84B488D0F47736CD8B00578E26C92FD1" - }, - { - "Count": 756, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D04476081D37D3F053C0B637513DC37186286A20D9F8" - }, - { - "Count": 757, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088F95EEB23DF0BE8AB59979C0C87CF229F207F" - }, - { - "Count": 758, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A1383E04A674D308099109354D8EAB6CE4E8078" - }, - { - "Count": 759, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96734C5A7CDD5BC26C14028A5ADB64C11DCBCE" - }, - { - "Count": 760, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA8135C9D5E2571D16C89B50A8A0BF0F59940744" - }, - { - "Count": 761, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACC1CB31B8E0A38E9E8B1599D29F64FFF7680ECAB" - }, - { - "Count": 762, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA431BFDBC5235D406C048728C893FCB6D3A1457" - }, - { - "Count": 763, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3EF719C928013A663C9CA4B739CAE3AAFE7D354" - }, - { - "Count": 764, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643B5BB5F3E743F4E887AE9531FC2BD40F6AC3FE9E" - }, - { - "Count": 765, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415FD432CA8F7BF8C78B8EF274105EAB513824B2F" - }, - { - "Count": 766, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA55351011507708E1FB6DBC18F92A2DBF12C70A5630EFAFB5C" - }, - { - "Count": 767, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31C291333EFB8B9FF1BE21F81B68080AB0C78A88E" - }, - { - "Count": 768, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E42289AFB43D71FEA57922743F8E7BB4118F3E577B2" - }, - { - "Count": 769, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6B1B733270DA2ECC428B40B1FB490BB89CF03A00" - }, - { - "Count": 770, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF28142F6B7A9FB9C2C3158B935FB8E35DFC07EDC63" - }, - { - "Count": 771, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B3A0DD69901F988A337A7239C411A18313622FC" - }, - { - "Count": 772, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B4C39215563862991A2D1DE31B7925E66D5634D" - }, - { - "Count": 773, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80E6A3EB96C1C042224F713A0C4503120C4DCA47" - }, - { - "Count": 774, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D08AE54D9BDD2515F1810F0AB738502C3028470C6" - }, - { - "Count": 775, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D9029331F5FFB8C35D7521C52E2A355615204D8F38" - }, - { - "Count": 776, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE23A9DAFA45957B0265BE12564DA01F48F930FF" - }, - { - "Count": 777, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BFF41706D224E2E7E214ED53B82C0D532C5D583" - }, - { - "Count": 778, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CD374BC3E60905EA8478A9C47C465AB9793E8F8B" - }, - { - "Count": 779, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA0794BBA65E5B41773DA2EFEBB59D84C4FDBCBC04D" - }, - { - "Count": 780, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C1D0D3133C6987DFFA4E31F7712028EF609D53CE" - }, - { - "Count": 781, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE82412D5BF73B38EF40AEA40FA746F1DE150F0CDF" - }, - { - "Count": 782, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149F472B4B0E55F376ACD73DEDAF343575C295C2E" - }, - { - "Count": 783, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F7DC444590FA42F326CAAE22415AC1FA7896F3E" - }, - { - "Count": 784, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389BBBFCC063C4E5B94AC54DB064472C569A27A05" - }, - { - "Count": 785, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D3E8143C8C252A1F5569A8C2C2AD3AF923FAC6E8" - }, - { - "Count": 786, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC667993E0EE2FA4448EF1C870BEB075A81B10929BDD" - }, - { - "Count": 787, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECA28E3408D66CA6E6E887902917EB1CBFC3CFB1D" - }, - { - "Count": 788, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D10C5B9E8E2239199BA72E35107146A678B0FDFB" - }, - { - "Count": 789, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D04476081D37C8CDEE7F6969F5CC3AF30E11F75EA8A684" - }, - { - "Count": 790, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088F95E42EBD669BC049E3EFCB628ACBFC081659A" - }, - { - "Count": 791, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A1383E0F42AE0AC49E742D7CB3541A2C50F0BB6FD" - }, - { - "Count": 792, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96734CF0C36330CECE3977B3C3F8E4A94D14BE7D" - }, - { - "Count": 793, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA8135C9E6576F4D9312543671819CBE00BFF09ED5" - }, - { - "Count": 794, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACC1CB31BF516AE29B9D376774B5840D2B4407B05BB" - }, - { - "Count": 795, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA431BFDB01AC7922B93BBC654E3B8955170D0D485" - }, - { - "Count": 796, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3EF719C0614F30B22F75E39741E687153BDD4465E" - }, - { - "Count": 797, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643B5BB5F3891085EFC807CB291E81C9E265282A6602" - }, - { - "Count": 798, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415FD432CB4698CA4C42E966A40CA6A2995447D9270" - }, - { - "Count": 799, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA55351011507708E1F02666BCF332621CF585BA76F3BA9C6F245" - }, - { - "Count": 800, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31C291333AC961C5850A8C955BCAC60634527C74817" - }, - { - "Count": 801, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E42289AFB4317B8617AB9181B53C30F1FB30082043DBB" - }, - { - "Count": 802, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6B1B7332EDCA2EF20CB62511A019C43ABA94D6EF66" - }, - { - "Count": 803, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF28142F6B7F2D8CA6B2F561EB67F2A67F12EFC12408B" - }, - { - "Count": 804, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B3A0DD68F2D79CD508D5EAF3C751AEA24968A3EEE" - }, - { - "Count": 805, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B4C3921B81FE8227372581F160F43E97087418D32" - }, - { - "Count": 806, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80E6A3EBEDB9D8421D31F415299D31F2CBBBF62401" - }, - { - "Count": 807, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D08AE54D9FB717755217ABB2640AAEE6764551EB894" - }, - { - "Count": 808, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D9029331F558DE438BD8686BC4145366CAC82EF62852" - }, - { - "Count": 809, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE23A9DAAF638A03E693A24AC972C49B4AC5A87C7F" - }, - { - "Count": 810, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BFF417050697722D253A6457C432B90F671947376" - }, - { - "Count": 811, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CD374BC3B644F4F46EF8B091ED9740988735AAF327" - }, - { - "Count": 812, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA0794BBA6573A97BE1D949587F4C1EA6E30A06D8EB7F" - }, - { - "Count": 813, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C1D0D3135DFFD60971F5E0AD9B05CA76644A7B385F" - }, - { - "Count": 814, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE82412D5B17AB8ABC68D89757D4BDE21D984E122361" - }, - { - "Count": 815, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149F472B44C34B84BED02CB4ABF95CFC81931BCD5B8" - }, - { - "Count": 816, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F7DC4441517D59F796563344B8A7E2E395BB9F9E2" - }, - { - "Count": 817, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389BBBFCC921A065889B87D3DBF7DC7D5AAF7C66DC7" - }, - { - "Count": 818, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D3E8143C08E6E876865F8B73048D126C6C40C7E8AE" - }, - { - "Count": 819, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC667993E0EE22D5251D764B978F6133C6FCF8D2A3C541" - }, - { - "Count": 820, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECA28E340E2F3E0A717A1C4A24ACF11E230F41AFE67" - }, - { - "Count": 821, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D10C5B9ECB1EC11004F2975CBE73B1E67503165FD0" - }, - { - "Count": 822, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D04476081D37C89D6D3991E2E9C19178A0C7B692785B78C1" - }, - { - "Count": 823, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088F95E422B31264AC40E91DAB8560494655AA5F579" - }, - { - "Count": 824, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A1383E0F46B34077FF11AA6CF80967695BC45EC5D25" - }, - { - "Count": 825, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96734CF0DD32BC3AAEE2C8C7649298EE9C5ED5F8F8" - }, - { - "Count": 826, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA8135C9E6E8BD5E04471B664ECFCF5C45FC08A92C91" - }, - { - "Count": 827, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACC1CB31BF59262507D8B92B3BF91604E3C00CB015673" - }, - { - "Count": 828, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA431BFDB037675F110E016A1CA24A270D2EBDA44FA2" - }, - { - "Count": 829, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3EF719C06CC2A322BB24BCCAEAC78736EE17DCC688B" - }, - { - "Count": 830, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643B5BB5F3896A033953DA18F305025FB98D16AFCDD6D3" - }, - { - "Count": 831, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415FD432CB48A5DB5937A93BBB8480B7D61F8AF5B67EB" - }, - { - "Count": 832, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA55351011507708E1F0219D75D83AB6B1B656A9405BD6696E965BF" - }, - { - "Count": 833, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31C291333ACCEF1C4534A94D8C0E73F8B27130E5C5FD1" - }, - { - "Count": 834, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E42289AFB4317B24683408CB50B209487262CAB9442EAD4" - }, - { - "Count": 835, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6B1B7332ED3D46B3B4F9B224896306560F12D07600A7" - }, - { - "Count": 836, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF28142F6B7F25D9CC0022A69BA5137C3898BAD30B4B24C" - }, - { - "Count": 837, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B3A0DD68FBF1F0B8EE355CE2BB2B2C68C1E3D09DAEA" - }, - { - "Count": 838, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B4C3921B84D5E90EED07FEC186464FAADE49DE07B12" - }, - { - "Count": 839, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80E6A3EBED6A7498CCBF928BE9A78367CE98901299B5" - }, - { - "Count": 840, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D08AE54D9FB60E2CF9898787BEF4AB16EA87010C8B9FB" - }, - { - "Count": 841, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D9029331F558ED7AD0F96F6AE66E850241501309003E89" - }, - { - "Count": 842, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE23A9DAAF0D38BE83CA09896B101B5BBE6541ECE5AA" - }, - { - "Count": 843, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BFF417050D08353F8763A436FE69410A0F9CB51B727" - }, - { - "Count": 844, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CD374BC3B6C7BDC6E79814CD5757FA4935F2B525D431" - }, - { - "Count": 845, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA0794BBA65739B30C5A5AF711FE0A6884125F4D1E26582" - }, - { - "Count": 846, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C1D0D3135D347CA598EDFEDAC91C0E10B4AEC1C7A9BA" - }, - { - "Count": 847, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE82412D5B177CF9DB726A5A274B298C93EFC832461A6F" - }, - { - "Count": 848, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149F472B44C1D5D1448D8BD1EF77BFA1D8161A160334F" - }, - { - "Count": 849, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F7DC44415E9F4472974B12180264F7A1DFE2020A5C5" - }, - { - "Count": 850, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389BBBFCC92C7D0EDF74EB26262B4D30919E5FDA176E2" - }, - { - "Count": 851, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D3E8143C0875557AC563C51746A50BA43AF062811CBC" - }, - { - "Count": 852, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC667993E0EE22C40E7149806AF158E922D1DA62FB79B01F" - }, - { - "Count": 853, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECA28E340E2E690AB6ED71FD9E638E55BB95FDDF50717" - }, - { - "Count": 854, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D10C5B9ECB226938C3B8757888721678A259DB85CA99" - }, - { - "Count": 855, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D04476081D37C89DA90BCA6DA42D8B195A834F992ADB1FEB82" - }, - { - "Count": 856, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088F95E422B2FB5E88617CBEC383298634488B3CA2472" - }, - { - "Count": 857, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A1383E0F46BAD6133DDB047A077CEEC4A2A6B52AD47AA" - }, - { - "Count": 858, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96734CF0DDF5D7FB48F9ED73CC1BF403E5406C67F2E2" - }, - { - "Count": 859, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA8135C9E6E8FEE8AD23AADE658E616DB4E6466A321CA8" - }, - { - "Count": 860, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACC1CB31BF592F669BA03B1FA8E1FD495E5021DE4069A82" - }, - { - "Count": 861, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA431BFDB037F8DCB92E442AC53BD8414C22CEDED215AF" - }, - { - "Count": 862, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3EF719C06CC91D2241549428CE5A64FD2B4B4845D2CCD" - }, - { - "Count": 863, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643B5BB5F3896A4C4EF959D32AA63290AB4E3F20AC98BCA4" - }, - { - "Count": 864, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415FD432CB48AD69AD14E136ED7572CE147431760782A16" - }, - { - "Count": 865, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA55351011507708E1F021937C310A9C80EED4B054503BF65069FE6C6" - }, - { - "Count": 866, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31C291333ACCE975F96EB2EAAB5FE4250EA36051D40A599" - }, - { - "Count": 867, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E42289AFB4317B2F433199AD0F084978D3DA390107152E492" - }, - { - "Count": 868, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6B1B7332ED3D2687788373498251596945EC8683F8BE10" - }, - { - "Count": 869, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF28142F6B7F25DF984C071062CEB135F2858AB7E5130C6DE" - }, - { - "Count": 870, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B3A0DD68FBFF11012B9ED70AA53EB1798E18514284986" - }, - { - "Count": 871, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B4C3921B84DB594FBB5F97BFB47DD7A3DE88008C21BBF" - }, - { - "Count": 872, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80E6A3EBED6ADE864A10A82D5AD78CC6BB3162A2161AFB" - }, - { - "Count": 873, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D08AE54D9FB609F06D6953FA8F77AA570065490E62106C1" - }, - { - "Count": 874, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D9029331F558ED3800B9FB3361AEBC242F5F4E64DADA4FCF" - }, - { - "Count": 875, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE23A9DAAF0D7B099A344EE66E6CB18A506CC8AA3E66E0" - }, - { - "Count": 876, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BFF417050D028C8CF6CD5A1B74BAB88DC1768F5022320" - }, - { - "Count": 877, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CD374BC3B6C7BA9E63FBEB1D0A1BAC918B6A397C49AF69" - }, - { - "Count": 878, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA0794BBA65739BDFB8E5D45B2FFB308B220D10D35CA93E07" - }, - { - "Count": 879, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C1D0D3135D34F5CCF59C551B21CC2CB55228C5F90F4B34" - }, - { - "Count": 880, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE82412D5B177C5D2117C244929CCAFAB8E73CDDC2BCF852" - }, - { - "Count": 881, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149F472B44C1D0E4E6054E138A6DB0B0B5AF436BC498201" - }, - { - "Count": 882, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F7DC44415E91A3AF916DF7D99A4ACDDFC9081306A6F2F" - }, - { - "Count": 883, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389BBBFCC92C75A6C01D0A0248519971154C9A9CE43ABD7" - }, - { - "Count": 884, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D3E8143C0875EB068A6B6CDEA2B247B21586E9D810D597" - }, - { - "Count": 885, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC667993E0EE22C4CC5261BF011A34D574B072DE100BF56C75" - }, - { - "Count": 886, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECA28E340E2E6D86025BFE0C752294793E34319BB2CD6ED" - }, - { - "Count": 887, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D10C5B9ECB22AA568DBE90627BD947A5E14170B34FF9D3" - }, - { - "Count": 888, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D04476081D37C89DA94387BDC344E906BCC2DF2F19D3DCCAB86D" - }, - { - "Count": 889, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088F95E422B2F13F4AB0D2CED6A3113AF44BF6491C77DDA" - }, - { - "Count": 890, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A1383E0F46BADA40177380D75E8A00656CD22AE908B6BAB" - }, - { - "Count": 891, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96734CF0DDF5F98371332D7EB9742CA82634182AB3F23C" - }, - { - "Count": 892, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA8135C9E6E8FE7440B86B2D278B33DD4CEB82762E573984" - }, - { - "Count": 893, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACC1CB31BF592F6AEE8F62B3012B6CD142858D0F8C4CC9B10" - }, - { - "Count": 894, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA431BFDB037F8A33D0AA523A7BD6F758ADEA066279E2DED" - }, - { - "Count": 895, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3EF719C06CC916089B7F3719FD84D1381BF4AFB42FD90E1" - }, - { - "Count": 896, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643B5BB5F3896A4C74D6B308229995BA5647C60F29121B1505" - }, - { - "Count": 897, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415FD432CB48AD6AD44F720C373F9F85F6063F31917A3399F" - }, - { - "Count": 898, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA55351011507708E1F021937498C770D8DF6C712B3BAADF9E54D877209" - }, - { - "Count": 899, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31C291333ACCE97C475AA4360FB26097F2A47A7D5E16341DF" - }, - { - "Count": 900, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E42289AFB4317B2F4B6C5C822FCCD5D264A65739E27742E8BE4" - }, - { - "Count": 901, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6B1B7332ED3D26464E0A4090215EEDB8B007A09AA8FACCE0" - }, - { - "Count": 902, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF28142F6B7F25DF90EE19AE8BC9439E8ADB4C21FA7F05B0686" - }, - { - "Count": 903, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B3A0DD68FBFF1BEFEDF4C5E7B528AB45C4BB0F7875F2F60" - }, - { - "Count": 904, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B4C3921B84DB5A48A30AC9D3806CAE0EEE8C725487DC9F7" - }, - { - "Count": 905, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80E6A3EBED6ADEF4293A805926923E3D1AC627892166E00E" - }, - { - "Count": 906, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D08AE54D9FB609FFCB32A09701FE0DEFFFF09A44F4F9A108E" - }, - { - "Count": 907, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D9029331F558ED383591D4751020B17C59BAF48F04F4D9D813" - }, - { - "Count": 908, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE23A9DAAF0D7BDD81EB192B98BCAA6793D1F071BF135970" - }, - { - "Count": 909, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BFF417050D0281DCB0E87B1A6025C96455A3FDBF9D506AA" - }, - { - "Count": 910, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CD374BC3B6C7BACE4CF349C93429B357B16EBFF1BAE75934" - }, - { - "Count": 911, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA0794BBA65739BDF24023984ECA2D20C3993777675E0575CF8" - }, - { - "Count": 912, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C1D0D3135D34F551B7CA91DFDDB246D69675DE203E128792" - }, - { - "Count": 913, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE82412D5B177C5DA6B0BD55571275E8E5F83255B21D535BCE" - }, - { - "Count": 914, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149F472B44C1D0E1EB0D94CFF4F35A6C3E23F412DC0C9D3CF" - }, - { - "Count": 915, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F7DC44415E91AF7485FBB9A27C4649BC59213191CA966C4" - }, - { - "Count": 916, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389BBBFCC92C75A4DAE26667986A1CED2618D6D0FB1DF83EB" - }, - { - "Count": 917, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D3E8143C0875EB55B22A256BA2453633FAE2EE5DFF70CB74" - }, - { - "Count": 918, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC667993E0EE22C4CC8640B78A3F936932720C10092FAEB4C3F4" - }, - { - "Count": 919, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECA28E340E2E6D8AD66672F11EB628C7A7F50DD695EEEAC9F" - }, - { - "Count": 920, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D10C5B9ECB22AAB4857B2D27FAA7808EA6D195599B10D626" - }, - { - "Count": 921, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D04476081D37C89DA943ACD1F7F599E499ED000AC7ECBE4F412280" - }, - { - "Count": 922, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088F95E422B2F1382ED0E7103BFB61FA83C90275823211A58" - }, - { - "Count": 923, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A1383E0F46BADA4B04BFA9947FDFD583F8974879437543023" - }, - { - "Count": 924, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96734CF0DDF5F92FB94EE6BF3C68BD2086F40F01325F5A51" - }, - { - "Count": 925, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA8135C9E6E8FE7467036F18683223DE55B84A1621E444AD9A" - }, - { - "Count": 926, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACC1CB31BF592F6AE1B1867495B1E2E128A542F136A468C886B" - }, - { - "Count": 927, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA431BFDB037F8A32BDA8B4B7EBFA1DEB35E80A2127076F678" - }, - { - "Count": 928, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3EF719C06CC916012F6C5F0C90BC14A4B27C33A105732AED9" - }, - { - "Count": 929, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643B5BB5F3896A4C74401C75E5ED7419C2D4FF17E9D4D363993B" - }, - { - "Count": 930, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415FD432CB48AD6ADEB4E561588178AA5912A33DE8D967409B7" - }, - { - "Count": 931, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA55351011507708E1F02193749928D705037D7984E2C4814E6DF2CEC14C4" - }, - { - "Count": 932, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31C291333ACCE97C4FBBFE94CEDF99B31FB251AEB8964FB6879" - }, - { - "Count": 933, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E42289AFB4317B2F4B6A909496CE11CFC27944B36E13778108EDA" - }, - { - "Count": 934, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6B1B7332ED3D26467D901BEDBD838FA7FF39FD7DF6B342D073" - }, - { - "Count": 935, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF28142F6B7F25DF90E24F7671C98791191AD550BD3FB4281A629" - }, - { - "Count": 936, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B3A0DD68FBFF1BECB229320CAC40251F88CEC53A34C904921" - }, - { - "Count": 937, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B4C3921B84DB5A4A9F6E19AD3DD5DCED6271539543A078B27" - }, - { - "Count": 938, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80E6A3EBED6ADEF40DA31D93051A7275F5D8EBB626E896CD35" - }, - { - "Count": 939, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D08AE54D9FB609FFC7134D399E34E27AF40D772B32B90C7D151" - }, - { - "Count": 940, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D9029331F558ED3835574FF6714108CA5FF50C984717F837DB0B" - }, - { - "Count": 941, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE23A9DAAF0D7BDD7E38222AA3229B214B6EC771A21616C54C" - }, - { - "Count": 942, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BFF417050D0281D0B5BAB21A3FCDA1CAEB61D3E6D1B5A3583" - }, - { - "Count": 943, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CD374BC3B6C7BACE95B209218686A839BD85F8DDA773492E38" - }, - { - "Count": 944, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA0794BBA65739BDF2403949DDF12C8C453A9CBD39BD1F9D76795" - }, - { - "Count": 945, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C1D0D3135D34F551684A04712AED3C67B612645BD214353254" - }, - { - "Count": 946, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE82412D5B177C5DA6BE661610382F1CEA890FB2F9D724835D46" - }, - { - "Count": 947, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149F472B44C1D0E1E5722A397B39481562A4EF61F38AB1FE594" - }, - { - "Count": 948, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F7DC44415E91AF7522EE244CF54E4752F95D04B109FED8326" - }, - { - "Count": 949, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389BBBFCC92C75A4D79792A9EB82685EDDDDFCA85E7162A1AB7" - }, - { - "Count": 950, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D3E8143C0875EB55B99422C2EFBD7EFBC68A2AC4E8252B3702" - }, - { - "Count": 951, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC667993E0EE22C4CC866744F0588E0D924F0A7AE482B017C36F60" - }, - { - "Count": 952, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECA28E340E2E6D8AD60846553157F509F690CE1F342150A7112" - }, - { - "Count": 953, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D10C5B9ECB22AAB461DAE41D93496802E70FA8F9C580A4273D" - }, - { - "Count": 954, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D04476081D37C89DA943AC8981968540319FC065C66C033FA2D21F1A" - }, - { - "Count": 955, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088F95E422B2F1382EDEFD6A385ED5F693DD833BE48E86B4FF1" - }, - { - "Count": 956, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A1383E0F46BADA4B03B6E95F98CDFD0C49855C8193AD116301F" - }, - { - "Count": 957, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96734CF0DDF5F92F8D21D7BD579A5871F28C5792F7E1D40839" - }, - { - "Count": 958, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA8135C9E6E8FE7467276CA6C43D4C997E95731D91B0F015B769" - }, - { - "Count": 959, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACC1CB31BF592F6AE1B443A809CAEBD10B0C5A0AF93A01B943C2C" - }, - { - "Count": 960, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA431BFDB037F8A32B9AC818C84CE87FCFC5B853A67157379C4E" - }, - { - "Count": 961, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3EF719C06CC916012F3A9F1D0FA90B2F5786F27706F51F35549" - }, - { - "Count": 962, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643B5BB5F3896A4C7440DA402CE7B7F2E4F19336E043D676CF9C7B" - }, - { - "Count": 963, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415FD432CB48AD6ADEBE7F126D948027B8AE222CA1C12285485CB" - }, - { - "Count": 964, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA55351011507708E1F02193749927364F8A485BC8EC7D7C8AF4D0A0A9926D4" - }, - { - "Count": 965, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31C291333ACCE97C4FB9E34E5F3692AB8943F6C2C3BE88D396421" - }, - { - "Count": 966, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E42289AFB4317B2F4B6A9D90BE07F526414BD146DEF0EFE2985CB94" - }, - { - "Count": 967, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6B1B7332ED3D26467DCACAE26E836F57A32D624F058EADAA4F34" - }, - { - "Count": 968, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF28142F6B7F25DF90E246E1D978BD9595956ABD90F022DB19559BB" - }, - { - "Count": 969, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B3A0DD68FBFF1BECB97D75ACECB8F04FBF743F18E030F00B130" - }, - { - "Count": 970, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B4C3921B84DB5A4A905FA2F483339F9CAEFAB2547806EB11D3A" - }, - { - "Count": 971, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80E6A3EBED6ADEF40D866EADAEB23B112EDD524DCB55B412347E" - }, - { - "Count": 972, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D08AE54D9FB609FFC711C65A0DA61E24953ECBB15B3D3015F4E02" - }, - { - "Count": 973, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D9029331F558ED383557D1F1C497C1A8BDC2973E57C2EA59723B42" - }, - { - "Count": 974, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE23A9DAAF0D7BDD7EB61C9E9D7357EC3441068F7FAD12A5CFAA" - }, - { - "Count": 975, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BFF417050D0281D0BA8D4382C7553C5F3758FA1847BECDCDBF4" - }, - { - "Count": 976, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CD374BC3B6C7BACE95ECFEE2D660A3F8CF4C0DBEA008FC2DAFB0" - }, - { - "Count": 977, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA0794BBA65739BDF24038A0905D8DF03C8768FF9636A56A3E22EA4" - }, - { - "Count": 978, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C1D0D3135D34F55168C064488776A825541DBD6A5E7CE05460EA" - }, - { - "Count": 979, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE82412D5B177C5DA6BE3F3F3DEFC64A1D35500C88B3E0B6DCADB7" - }, - { - "Count": 980, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149F472B44C1D0E1E572CA10DEFE6C64FBFBCD781B881D29275B2" - }, - { - "Count": 981, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F7DC44415E91AF7528C6866A2D130635DC6478A4BE9B9930853" - }, - { - "Count": 982, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389BBBFCC92C75A4D798EB2C6EBDD4DDBD44B03FB63C2A4AA38D6" - }, - { - "Count": 983, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D3E8143C0875EB55B97DB059CC21C8E888CF864BE8E77F5E0BAD" - }, - { - "Count": 984, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC667993E0EE22C4CC8667767E565E10617F8E8E52EDCE82423F443F" - }, - { - "Count": 985, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECA28E340E2E6D8AD601209CCAB1FCB68980666F34E0EC1BC893A" - }, - { - "Count": 986, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D10C5B9ECB22AAB461CEE32BA81DEB6176C029F7995617C0E6BB" - }, - { - "Count": 987, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D04476081D37C89DA943AC8981B06E71A49D8B567DC2A0D5175FED0E7A" - }, - { - "Count": 988, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088F95E422B2F1382ED85D5BBCD5C74DD8BA08B27FF9E36AA3E54" - }, - { - "Count": 989, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A1383E0F46BADA4B03BCF90B7C7E2556A0A93D394DD5E49EDE15E" - }, - { - "Count": 990, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96734CF0DDF5F92F8D152CB136C4857754D15DFFF76B4681AD8A" - }, - { - "Count": 991, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA8135C9E6E8FE7467276FA645436E2F92D77DCBF1947C3061E759" - }, - { - "Count": 992, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACC1CB31BF592F6AE1B44C70155F8EC67E9B87AEB68FA54A4C4FBFD" - }, - { - "Count": 993, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA431BFDB037F8A32B9A4BD7579920197AC5EEA45107010BE320E3" - }, - { - "Count": 994, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3EF719C06CC916012F34166A86BE0AB5543109BE0810068E0397B" - }, - { - "Count": 995, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643B5BB5F3896A4C7440DA6E2CBA448A0FD67B9DA55A9F63185AE6C6" - }, - { - "Count": 996, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415FD432CB48AD6ADEBE7630DA02FA2BD3D6787FAA3B1342C60BFE0" - }, - { - "Count": 997, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA55351011507708E1F0219374992737A8F25A5355BF29C6E7BD2D6C945F9436B" - }, - { - "Count": 998, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31C291333ACCE97C4FB9E9D3E81CE0B3431F8AE4036D63A462D85C8" - }, - { - "Count": 999, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E42289AFB4317B2F4B6A9D92EC2939F5DA33F7E46CC2CAE4881D91411" - }, - { - "Count": 1000, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6B1B7332ED3D26467DCAC53FD6AADEC8D64472A6B869B8ACF37C46" - }, - { - "Count": 1001, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF28142F6B7F25DF90E246E3B70F1D27203D9F3CBB2DB9E9E329FCB31" - }, - { - "Count": 1002, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B3A0DD68FBFF1BECB975B0AF5F330C84765F019BEA2EA2F538862" - }, - { - "Count": 1003, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B4C3921B84DB5A4A905AE906EA775A3A349A03092A6C6E110EBC2" - }, - { - "Count": 1004, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80E6A3EBED6ADEF40D867D2936CF04E0BE075BA122A9771DDEB668" - }, - { - "Count": 1005, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D08AE54D9FB609FFC711C99EEB56C020B9A17376F09A6D76350A947" - }, - { - "Count": 1006, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D9029331F558ED383557D18A5603266F0ADDF6FA979C5616A14CC03D" - }, - { - "Count": 1007, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE23A9DAAF0D7BDD7EB61BDCA8004E967CB004545D35E305FA03D2" - }, - { - "Count": 1008, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BFF417050D0281D0BA8F4DB79F058E10F9B2621E9F1CBD925B041" - }, - { - "Count": 1009, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CD374BC3B6C7BACE95EC2D1F774CAE6B92ACDC86D00DBFDC7BF5F9" - }, - { - "Count": 1010, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA0794BBA65739BDF24038A4AAF7576821E2746417E8B556F6E5635DB" - }, - { - "Count": 1011, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C1D0D3135D34F55168C0CB3804042D1D3458C83451DB7F2A9E6CB0" - }, - { - "Count": 1012, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE82412D5B177C5DA6BE3F2D1CE682F3AADCE160B13CB4B47538F2AE" - }, - { - "Count": 1013, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149F472B44C1D0E1E572C565BFF0DC73F18939B77DB51E115796002" - }, - { - "Count": 1014, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F7DC44415E91AF7528C588F41D1695E8A8F88079689FA0DD8C6FC" - }, - { - "Count": 1015, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389BBBFCC92C75A4D798E1AC8377BE10F3E9149A52217166BEA3152" - }, - { - "Count": 1016, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D3E8143C0875EB55B97D3E21D93B1E974D02A0F99E0EFC46579924" - }, - { - "Count": 1017, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC667993E0EE22C4CC8667768148BCA22A0C2F15688387190B24B50851" - }, - { - "Count": 1018, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECA28E340E2E6D8AD6012ED262EDF0264C2C59BC320F09B036F81F3" - }, - { - "Count": 1019, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D10C5B9ECB22AAB461CE95908AF22B272ABB7BF1FCF1CCC27E6F48" - }, - { - "Count": 1020, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D04476081D37C89DA943AC8981517E90D4AD2411E7D1C4BE1DFB3C62A299" - }, - { - "Count": 1021, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088F95E422B2F1382ED85A3AEF9E5770718A6B108C7D98BC70582CF" - }, - { - "Count": 1022, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A1383E0F46BADA4B03BCF8D39E70E374DD1222A6E455A32CEC3B933" - }, - { - "Count": 1023, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96734CF0DDF5F92F8D15E3A57AA1BDD996FE335C3674061BF5740D" - }, - { - "Count": 1024, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA8135C9E6E8FE7467276F89B824D9C4AF5DA9337BA9AEC86C359A02" - }, - { - "Count": 1025, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACC1CB31BF592F6AE1B44C716A97F9D4F7AEBB2389D65B69CFA2AEA2A" - }, - { - "Count": 1026, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA431BFDB037F8A32B9A4B8DFCDEAD9CEEA160DAEB1E0BA4C1EDA01E" - }, - { - "Count": 1027, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3EF719C06CC916012F341244329785B1DC1B38B2DC58AA105082128" - }, - { - "Count": 1028, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643B5BB5F3896A4C7440DA6E0BADB2E9E7465DDDEB9EADE2A7CB557346" - }, - { - "Count": 1029, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415FD432CB48AD6ADEBE7635B8F09B78EABF7294E856FFFE5E62BE74D" - }, - { - "Count": 1030, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA55351011507708E1F0219374992737A53B58005A88C954E8838F23FA7934F29C2" - }, - { - "Count": 1031, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31C291333ACCE97C4FB9E9DE0501463E5B74F7CC37063C6B7B22CBCDA" - }, - { - "Count": 1032, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E42289AFB4317B2F4B6A9D92E72504EFFA6F2AB330A12D04BC91E59CBE3" - }, - { - "Count": 1033, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6B1B7332ED3D26467DCAC5F2C0F2623D54211261791BA6CF798F6299" - }, - { - "Count": 1034, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF28142F6B7F25DF90E246E3BB0E67EDD562A075ECD2E7F23992DF723C5" - }, - { - "Count": 1035, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B3A0DD68FBFF1BECB975BAD8DF3762BC14E321723B7725C816194E4" - }, - { - "Count": 1036, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B4C3921B84DB5A4A905AE789427C037F2336FA220DECFBD8197B22D" - }, - { - "Count": 1037, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80E6A3EBED6ADEF40D867D4C18D9DDB4ADABB221863B0CB8C13CD1A1" - }, - { - "Count": 1038, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D08AE54D9FB609FFC711C99775C280E44E5D89DE608B020C44BA09993" - }, - { - "Count": 1039, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D9029331F558ED383557D18AF5BC3D21AD2F0269C37C34086970D14856" - }, - { - "Count": 1040, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE23A9DAAF0D7BDD7EB61BC5DDCAD91A1AC5D0D84D8B8804F2D48199" - }, - { - "Count": 1041, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BFF417050D0281D0BA8F4B817F8CF3FD814F99F92665B6C532638DF" - }, - { - "Count": 1042, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CD374BC3B6C7BACE95EC2DF1D01B7A5605DD551C7681DC91E0868832" - }, - { - "Count": 1043, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA0794BBA65739BDF24038A4A7A659779D7B9A164F05FE3859FD5B9F5B2" - }, - { - "Count": 1044, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C1D0D3135D34F55168C0CB3B6A51C64E4824A249B047234B98F638A3" - }, - { - "Count": 1045, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE82412D5B177C5DA6BE3F2D312C8341E1E9D0C1080342516CD3AEBA63" - }, - { - "Count": 1046, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149F472B44C1D0E1E572C56936B67527E0B60FE59E250DBBC42366053" - }, - { - "Count": 1047, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F7DC44415E91AF7528C58BA6878EC0D9DD471D03D42D923FDF172AA" - }, - { - "Count": 1048, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389BBBFCC92C75A4D798E1A29D888552E5D7345576D712B49DF1A4EC2" - }, - { - "Count": 1049, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D3E8143C0875EB55B97D3ED247FFE495A80425C4DA73DC3D7786259A" - }, - { - "Count": 1050, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC667993E0EE22C4CC8667768182C81B3E5AD8E00AD448644F46A6CC24F1" - }, - { - "Count": 1051, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECA28E340E2E6D8AD6012ED598C5E0330F4EFC73D77212CF52F35991A" - }, - { - "Count": 1052, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D10C5B9ECB22AAB461CE950B92025EA11556084B65F285E002089B8B" - }, - { - "Count": 1053, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D04476081D37C89DA943AC898151750EFD11E9068C995D731A9BB2A30DC25B" - }, - { - "Count": 1054, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088F95E422B2F1382ED85A342796EC881C7F63D271896E3355C13661E" - }, - { - "Count": 1055, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A1383E0F46BADA4B03BCF8D0DB702700281AE8EBA1B9A2384C77044F3" - }, - { - "Count": 1056, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96734CF0DDF5F92F8D15E30278032E807419AC213C79CA3A5C4C0BFE" - }, - { - "Count": 1057, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "", - "CT": "BC820DBDF7A4631C5B29884AD69175C3389655CA8135C9E6E8FE7467276F89770D975EFAB2EBAA41C0F3ABEEE425E784" - }, - { - "Count": 1058, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "00", - "CT": "BD4640C4DA2FFA56DC79F7FDD07369DDF386CACC1CB31BF592F6AE1B44C7168C1B3F4BF5810ED8FC586C8151954393ED" - }, - { - "Count": 1059, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "0001", - "CT": "6E9F820D5468A0D476620F58650864F0D5743BAA431BFDB037F8A32B9A4B8D5A10CD67506CBEBE3B8888198811646746" - }, - { - "Count": 1060, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102", - "CT": "F19D28E0F222B3BFCA11E151534C5CCC0BEFA1C3EF719C06CC916012F34124653B839DA8F4076B8A1A4BAD7B79ADC1E2" - }, - { - "Count": 1061, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "00010203", - "CT": "7763F8BA6CE91ED1684F018AB62DF66F584D643B5BB5F3896A4C7440DA6E0BF23C59A0B77D583FAEDF843D82A53C26BE" - }, - { - "Count": 1062, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "0001020304", - "CT": "0E6A8B0CA517F53D3D72E1D8D734511C32CA4415FD432CB48AD6ADEBE7635B2C9636CAB219E4127FC567A45440CA2369" - }, - { - "Count": 1063, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405", - "CT": "5B513546B1A1DC8AAAA010DC49CBA55351011507708E1F0219374992737A5326B1FD642E2BBB851EEF3E8775DD1DDBAA" - }, - { - "Count": 1064, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "00010203040506", - "CT": "2E5BBADE9599AC9F2D86F9D651791D72750FE31C291333ACCE97C4FB9E9DE02FCE1ED18D1533FCF96DAA6BCB9A4004A9" - }, - { - "Count": 1065, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "0001020304050607", - "CT": "69FFEE6F5505A4897E2EC80CBDFF67CE457E42289AFB4317B2F4B6A9D92E7244B7B19FFBD83AC4269C13DDF5D335F92C" - }, - { - "Count": 1066, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708", - "CT": "3225026599BCD4FCC460181575FA9D145BDD3D6B1B7332ED3D26467DCAC5F287400C7D741A64911990189440BA0C0716" - }, - { - "Count": 1067, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "00010203040506070809", - "CT": "3DDCE4DEABF18BBB4BF4EDACCE9A67B15D9FF28142F6B7F25DF90E246E3BB05E785F4E3E0E2FCE89B741827FDFE78E82" - }, - { - "Count": 1068, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A", - "CT": "76807B6448896CE58842CB4AED6C41041D6DEC3B3A0DD68FBFF1BECB975BADABF71505F48D2C6FE27850880318FF8197" - }, - { - "Count": 1069, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B", - "CT": "59B3A5338CD171F93D708C5B11AA14980574886B4C3921B84DB5A4A905AE78A5D7BBC174D80806FE7330701BE26F308C" - }, - { - "Count": 1070, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C", - "CT": "8462C376C06AAE28BC182DF6B59467725A70FA80E6A3EBED6ADEF40D867D4CE3996783B0A283DB2E4F7C8C24A551DB2D" - }, - { - "Count": 1071, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D", - "CT": "2E325340DF7FD0BFD25BEC2D8A596B4461B16D08AE54D9FB609FFC711C997781039A4632DC01EDF8CE7E67BFCDED66AD" - }, - { - "Count": 1072, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "2E83CC36F088232A8EE9BAB74D02938E9DA2D9029331F558ED383557D18AF5FCDECADF4A755C36657D403191B0F4622B" - }, - { - "Count": 1073, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1EE34125FDBA17443D01DA8A0EEFB04550CA93CE23A9DAAF0D7BDD7EB61BC53546073889CB92E4E846635199F7F294A9" - }, - { - "Count": 1074, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "8684539A9FCFF9F68A7A496010F129B5C9A3860BFF417050D0281D0BA8F4B8AAA418C1534CA1A6C18413253E0325E310" - }, - { - "Count": 1075, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "77AA511159627C4B855E67F95B3ABF1490F306CD374BC3B6C7BACE95EC2DF15AB28BEF238CB709F96C8CF653DCF090E2" - }, - { - "Count": 1076, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "D323863E597297EAB51C8F134D3ED02E4EDBA0794BBA65739BDF24038A4A7AE6F71B89F75605207014F635DAA35907BE" - }, - { - "Count": 1077, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "A31AC9A1D4D18222F332F245C70AB28D022B47C1D0D3135D34F55168C0CB3B1DBE88E2FED76216E32191C2A9B5795F40" - }, - { - "Count": 1078, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "74EA9BA2635DCBAA400A5C24E4970400CA78DE82412D5B177C5DA6BE3F2D312860700C8E9CAB7DC4DD9602FFE433BCA3" - }, - { - "Count": 1079, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "ADBB720C2D415EEC45978E6F894249E8ADE0A149F472B44C1D0E1E572C5693F99296BBFA32AE24615BC60A6248AC856D" - }, - { - "Count": 1080, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "3B29669395DAB8733301D70F21C844D9E7BA340F7DC44415E91AF7528C58BA51EA51A5C50D971A9401C5FBA6F6BBA9D8" - }, - { - "Count": 1081, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "74A6A39D0A512958EE3091490331A6000BCB7389BBBFCC92C75A4D798E1A294285FCF2ACD4C7A44C365CF792E275D51D" - }, - { - "Count": 1082, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "2970E5D3DCDED18D81CD6C1F6BB2EDBB402824D3E8143C0875EB55B97D3ED299C7A774EC07F1E832BF1BB6BE383DE4E8" - }, - { - "Count": 1083, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "2D134D2DE994DEC27E6314484B8CA9FF75DC667993E0EE22C4CC8667768182683C0C60068563B5C68028A7A30ED3D668" - }, - { - "Count": 1084, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "31686725B47CA995FC470C8F26199232AD6DEECA28E340E2E6D8AD6012ED59FC87F6A67122323EF0F4BF5BE6CC34A067" - }, - { - "Count": 1085, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "C780135837218C32D20D3D705A15DB9B754566D10C5B9ECB22AAB461CE950BD2C1895752375586A0050E7B548AEE29E9" - }, - { - "Count": 1086, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "3BD2F45CE90E0F3731641C6EC79E1E39D04476081D37C89DA943AC89815175B262B9F07E152F2B8C6E22F50CCD0F03FD" - }, - { - "Count": 1087, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "270D846F99173380199972D19BE467B6C78B4088F95E422B2F1382ED85A34259AB59E243F2178B71D78AC5288F021DE8" - }, - { - "Count": 1088, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "D670F5A44971BE13F91BDD82E5152F149BFE1A1383E0F46BADA4B03BCF8D0D82347746A2CC5CF98AA1B919E67026E710" - }, - { - "Count": 1089, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "B96C78651B6246B0C3B1A5D373B0D5168DCA4A96734CF0DDF5F92F8D15E30270279BF6A6CC3F2FC9350B915C292BDB8D" - } -] diff --git a/cipher/ascon/testdata/Ascon128a.json b/cipher/ascon/testdata/Ascon128a.json deleted file mode 100644 index 9a9d23f6..00000000 --- a/cipher/ascon/testdata/Ascon128a.json +++ /dev/null @@ -1,8714 +0,0 @@ -[ - { - "Count": 1, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "", - "CT": "7A834E6F09210957067B10FD831F0078" - }, - { - "Count": 2, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "00", - "CT": "AF3031B07B129EC84153373DDCABA528" - }, - { - "Count": 3, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "0001", - "CT": "B486742EB408CEFFF2F1290C6C8B1F1F" - }, - { - "Count": 4, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102", - "CT": "8C8978E9940FC7A3D8F51219FDA22405" - }, - { - "Count": 5, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "00010203", - "CT": "3A82BC770598764AC1C6F025CD3FEE57" - }, - { - "Count": 6, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "0001020304", - "CT": "4F860D44CAF4F716D6D12D56C0B1AB9E" - }, - { - "Count": 7, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405", - "CT": "2E400ACF9F57C035269C2535F74DD13D" - }, - { - "Count": 8, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "00010203040506", - "CT": "C341229D53B2F0759C55EE80DA4A77C2" - }, - { - "Count": 9, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "0001020304050607", - "CT": "D60E199FFD3F9B694713DABC6D89F46F" - }, - { - "Count": 10, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708", - "CT": "8273DDD267B984A4D0ECFD98C548F63A" - }, - { - "Count": 11, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "00010203040506070809", - "CT": "16BA49274C773EA15ADB1A5A3BB4EBD6" - }, - { - "Count": 12, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A", - "CT": "794BC2A55833A753795EB56755F17C87" - }, - { - "Count": 13, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B", - "CT": "A5339E4280878EC1916A32375B8599B1" - }, - { - "Count": 14, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C", - "CT": "CC13A2922A77F0461652BBADDBA24E11" - }, - { - "Count": 15, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D", - "CT": "5DB649C3330864D2EF77E13D0F6F2356" - }, - { - "Count": 16, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "E536428B9B7B4035AE9794B3F69BEAAE" - }, - { - "Count": 17, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "56C15EB024DE91CA0165362A49B31EBD" - }, - { - "Count": 18, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "917D530F34157158CF8CA49D01AF44F0" - }, - { - "Count": 19, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "7FFB39D30F8783FE3F85D9A98014AA48" - }, - { - "Count": 20, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "0BF96195398A3EA8B670184FE2424EF7" - }, - { - "Count": 21, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "4C2685CF770369E8A601E7D884BFB681" - }, - { - "Count": 22, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "B399034306E26E73E8B9C160FF5281B3" - }, - { - "Count": 23, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "3813A2CB0F563707EDCB8896C05703F0" - }, - { - "Count": 24, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "251BB9E44F8FF1C07F226A878D5FBE87" - }, - { - "Count": 25, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "786E304275C5633D3AFF3F2BB560458C" - }, - { - "Count": 26, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "5D32E8D94D4322B7C93DEF811E223FBA" - }, - { - "Count": 27, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "6AE7517692D249910555956DA9F062B3" - }, - { - "Count": 28, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "F10D5B4E1B34667BE8675CB2BE6E55E1" - }, - { - "Count": 29, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "60C2EF5D2E49D77F9FFAF073C370720B" - }, - { - "Count": 30, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "72147084CF09A123ECE4BD77FB3BA74F" - }, - { - "Count": 31, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "6D2C65466BD515C494F6FD0054AF2D3D" - }, - { - "Count": 32, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "89703C55CB5ED201153E0D53E788B581" - }, - { - "Count": 33, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "2FDEE642B4C31C2F205DCC8B3DAD4542" - }, - { - "Count": 34, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "", - "CT": "6E652B55BFDC8CAD2EC43815B1666B1A3A" - }, - { - "Count": 35, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "00", - "CT": "E9C2813CC8C6DD2F245F3BB976DA566E9D" - }, - { - "Count": 36, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "0001", - "CT": "AB349C3DE469F54F1DB0A091D0A602A4A2" - }, - { - "Count": 37, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102", - "CT": "DB4C5AF0CCE3AED7E73717DD651A3FF117" - }, - { - "Count": 38, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "00010203", - "CT": "D27F6AD72B3837ABC3E1C94DAF02E573D7" - }, - { - "Count": 39, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "0001020304", - "CT": "0EF91AFF73CA160288AE3FB25217084581" - }, - { - "Count": 40, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405", - "CT": "26D032D7115577F426D22FD9ECC724DF48" - }, - { - "Count": 41, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "00010203040506", - "CT": "AF8F95C538B7E9957E783D7A30CFF6328E" - }, - { - "Count": 42, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "0001020304050607", - "CT": "3422167316638992B5DCDB28D92DCB724A" - }, - { - "Count": 43, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708", - "CT": "DF3B5E3A3C8D2789C87BE0FCC0F23ED141" - }, - { - "Count": 44, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "00010203040506070809", - "CT": "899472965F5A93AB52FFC2C07425BC5CEF" - }, - { - "Count": 45, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A", - "CT": "C5743AE3E52AE6C6CB0E7B047B8615F690" - }, - { - "Count": 46, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B", - "CT": "7BBFE9EB017A8FE174ABD4ADCD720C6B98" - }, - { - "Count": 47, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C", - "CT": "3DD915422CF7A75A134B9FC507AA84423D" - }, - { - "Count": 48, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C5EB0081DBB48855BBA8D0FBC77E2CC63" - }, - { - "Count": 49, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8D4E70A65A1340732EA72D1C4A245A9120" - }, - { - "Count": 50, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52CDCC8F91E862ACACC86437163F8D31D6" - }, - { - "Count": 51, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC1684F3282120E292F39B0D86CC6DE270" - }, - { - "Count": 52, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B4963CB144563E7D4D503DC341E800496" - }, - { - "Count": 53, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B71D77D0E070C9BB55B810D8B6EE253401" - }, - { - "Count": 54, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21706F16F8F84517ECE6C2290DA9C61C39" - }, - { - "Count": 55, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8EC2109A0948919A9E12C548311E27146" - }, - { - "Count": 56, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "263C29B198775AEA5A703DCBC548EDF0C4" - }, - { - "Count": 57, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF0E8EE86D439D73DEAEB98AC7E36F287C" - }, - { - "Count": 58, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E4CF12DAF3B3990340945EC0C2D444E2F" - }, - { - "Count": 59, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C73EB658E61E51940C9646573B1E90C98" - }, - { - "Count": 60, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EC51027E1B1428E0708BEC126C8E3600E" - }, - { - "Count": 61, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "34E22EF7E062EBA627F85AC85B443ADAEE" - }, - { - "Count": 62, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DEC847D9C4AE0B5B94B50A3AD2A7FD91DC" - }, - { - "Count": 63, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49E1644D15AB8A3BCD7FB3369E23E1496A" - }, - { - "Count": 64, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "8733B22623E2A3B710F368666236E6CBF9" - }, - { - "Count": 65, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F88DE274C90E82A9D88EC8BF653FA5D1B5" - }, - { - "Count": 66, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A56CB8F79B16FC91A8CD0DE2F70DC8AF2C" - }, - { - "Count": 67, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "", - "CT": "6E490868E32CB041A71CA5E41B615CE11C4E" - }, - { - "Count": 68, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "00", - "CT": "E92DDC373C1745EB7E1F648BAEAE0F774787" - }, - { - "Count": 69, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "0001", - "CT": "ABE4C55426E24A56BB77F8E0BD9212FE8D29" - }, - { - "Count": 70, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102", - "CT": "DB7F37D536460415AB20D29AE6A06D9D434E" - }, - { - "Count": 71, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "00010203", - "CT": "D21B3A1FF04C2D4EDB15BCA7D05D4B61E8E2" - }, - { - "Count": 72, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "0001020304", - "CT": "0EE0EBE612A14D54DC85101BBC550DF0DBEA" - }, - { - "Count": 73, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405", - "CT": "26575E1CD4969F9864EAE0C84C8EDF880F2F" - }, - { - "Count": 74, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "00010203040506", - "CT": "AFF7771EDBADFCC425C8603110525FA79C8D" - }, - { - "Count": 75, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "0001020304050607", - "CT": "34D378E6F2E0EDACDE0213AA4F80ECF8A860" - }, - { - "Count": 76, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708", - "CT": "DF4B02CAB4A98005F9585A4A030D764C890C" - }, - { - "Count": 77, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "00010203040506070809", - "CT": "89A033F52EFAF5F54AF74F98F890131D2DB4" - }, - { - "Count": 78, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A", - "CT": "C52EEAD897E8944D3CB0182663F395C44C21" - }, - { - "Count": 79, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B", - "CT": "7B9D25337662125F4FAD4A08D1B58921C69F" - }, - { - "Count": 80, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C", - "CT": "3D28D677C47F968F56C2B3636C1305F3EB1C" - }, - { - "Count": 81, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C56E25D8184AFC8547198855A9EE4EF273A" - }, - { - "Count": 82, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA293E27FC203E94DE549FD878BF0A6BF87" - }, - { - "Count": 83, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52490699D360E0FFC04D35CCAAE645D6492C" - }, - { - "Count": 84, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26CF0B8DA67C0CD120CD9583463D6C2B27" - }, - { - "Count": 85, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1D8CCFCF09F30976B236C84FCA77FD42D9" - }, - { - "Count": 86, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B753829163DB6637FEA2BEFACF6DBE366800" - }, - { - "Count": 87, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D50D3609CD4C8BB63905DA3445FE23DBC7" - }, - { - "Count": 88, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BE3450D9D56599D0041EA190008BA2A361" - }, - { - "Count": 89, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "2698CF443C9D5446096A702117F4F52A160A" - }, - { - "Count": 90, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF71E5BB5E4D028DCCAD773BF6854022DBAD" - }, - { - "Count": 91, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F7E290C82D2757DA563C97AF4EAFAA66E" - }, - { - "Count": 92, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C22F64F211E0DEFD110D1F33BDEDCCF93ED" - }, - { - "Count": 93, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB37F5F6440A806BBDF89838B4A5FA28136" - }, - { - "Count": 94, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "3453F3889B023251423C9AB9680C01141D89" - }, - { - "Count": 95, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE434257DDBA336F9D84E5ADEF8F4D54E30D" - }, - { - "Count": 96, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA9F275E4F3F3A035F4543F3442F3B960E" - }, - { - "Count": 97, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87596D0EB6F8700D982FBD8B439162CD69A4" - }, - { - "Count": 98, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F844F377B45D1DE42EC301F2C154C208545F" - }, - { - "Count": 99, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A552E0E6B4E14AAE9E26F36C3456479F45A4" - }, - { - "Count": 100, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "", - "CT": "6E490C898CD14E8316E149A6EDFC3B16C23A4E" - }, - { - "Count": 101, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "00", - "CT": "E92D2A75FBAF8D276C9815B25E01A4CDB4AB09" - }, - { - "Count": 102, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "0001", - "CT": "ABE4E01121DBB2FF21C1B74EBBE59EB1F8F1BB" - }, - { - "Count": 103, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102", - "CT": "DB7F7CAD8A0A4E40B2687DA50E6E197C85570F" - }, - { - "Count": 104, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "00010203", - "CT": "D21BED21A7C17E9212EC39772D25F270077F06" - }, - { - "Count": 105, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "0001020304", - "CT": "0EE0AC7195E851FB1566E16EE2ED5B1A050C74" - }, - { - "Count": 106, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405", - "CT": "265752C7A0A3014FC0D410F2E2F0940CBE8732" - }, - { - "Count": 107, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "00010203040506", - "CT": "AFF7DB11B188C43D95C9AB2E8C36AA094C88AB" - }, - { - "Count": 108, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "0001020304050607", - "CT": "34D3B7194777F9CF678687FF772424A498F7F5" - }, - { - "Count": 109, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708", - "CT": "DF4B3AA14C02C70DC9BD437855B175279980A4" - }, - { - "Count": 110, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "00010203040506070809", - "CT": "89A04600EB7C24D91D2E3ADA336B7B0B1B49BA" - }, - { - "Count": 111, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A", - "CT": "C52E4E4A2B7F002D010D05CF08E393C264B720" - }, - { - "Count": 112, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E44CFE7C54EDB95C6AA5B5B69A78F98B5" - }, - { - "Count": 113, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE6CBF734339D657C1E32F6FAB08C2728C" - }, - { - "Count": 114, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568A467E3AE67428278AA19D89AE20222E2B" - }, - { - "Count": 115, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED69A6E2B55A3A5C91E53F3B0EC294E8BF" - }, - { - "Count": 116, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499A7245EAF94C36550BD18000D0D05A7961" - }, - { - "Count": 117, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A066BFDF1C059D09B9EC32DBB72F4AD499" - }, - { - "Count": 118, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFD251AAF0FE48EDF2605C22476F9E36BDF" - }, - { - "Count": 119, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C28EE14BD448053FC443AB0261F68F364" - }, - { - "Count": 120, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D59258EB44B414038B7AE43B920ABE9C6A42" - }, - { - "Count": 121, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF59E4AF0510061D1E01083F1DE12184E7" - }, - { - "Count": 122, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D50CC1C8515C45DA581D099476AAF37BC" - }, - { - "Count": 123, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D3389FA42F39C965367A8353EFFAAC694" - }, - { - "Count": 124, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9FA697CC1CA923A4078277EE04C491FEE3" - }, - { - "Count": 125, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA300A38A0905B44A0298C00E1FD778F1" - }, - { - "Count": 126, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CC6C7170A1E582F61E633A8C7DE2D175C" - }, - { - "Count": 127, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "34530025BEFD75A6B360EA2DB68AE73E3DFFFC" - }, - { - "Count": 128, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A56AAE9972BA56FD5607B1072DEF1B60AF" - }, - { - "Count": 129, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CDDE50B2A156054F11747FA16053BBD60" - }, - { - "Count": 130, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "8759741171AD125B83FDE5D8A2D7E659C07B14" - }, - { - "Count": 131, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455E87D01B1C279A762DF941EF6C598D1A4" - }, - { - "Count": 132, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A552367D89C69BF3786E36DC23D2C1A188DFDB" - }, - { - "Count": 133, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "", - "CT": "6E490CFEC328490A65C362CDCE54A9D9B12D5074" - }, - { - "Count": 134, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "00", - "CT": "E92D2A653B67A88326B2D19C7E718E86C59E0BC2" - }, - { - "Count": 135, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "0001", - "CT": "ABE4E02CC4F0D784E0FF23B928B5FF4679FE5580" - }, - { - "Count": 136, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102", - "CT": "DB7F7C2461A35DE7690361D1ABC9D2F50E30640A" - }, - { - "Count": 137, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "00010203", - "CT": "D21BED6E1EAA89D36258CFF186E7FC1AE8E15EF5" - }, - { - "Count": 138, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "0001020304", - "CT": "0EE0ACB847DE02EE3D896C94BACEA5F9BBFBA8FF" - }, - { - "Count": 139, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405", - "CT": "26575283D673D1DE8DFECACB8DBA3A2CA41A2E17" - }, - { - "Count": 140, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "00010203040506", - "CT": "AFF7DBF37AC39CB8512B524660A2B38A7D298BC8" - }, - { - "Count": 141, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "0001020304050607", - "CT": "34D3B7ED5ADA458143A802F96521B85DDAB18D98" - }, - { - "Count": 142, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708", - "CT": "DF4B3A722F22229D994913A9EA0D221E27CA7FDA" - }, - { - "Count": 143, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "00010203040506070809", - "CT": "89A046EBF5B0D9D22E4E9D3005DBAC5E33E75944" - }, - { - "Count": 144, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A", - "CT": "C52E4E39948C6851B0E0BCA678DB98E312D88673" - }, - { - "Count": 145, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E59780992C35496CF5B2B543BF5C6B00DF9" - }, - { - "Count": 146, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50EC2C33E44A388E08709DD70108432DFF" - }, - { - "Count": 147, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF078A096F01084F1D872A937EDE053C39" - }, - { - "Count": 148, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95C46F0771A6370609F8FF127AD7EB8AC8" - }, - { - "Count": 149, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC960C30792BBA57D582721082079CF0F48" - }, - { - "Count": 150, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071AFC557D2E3D5E49F37F5301B6839BC51" - }, - { - "Count": 151, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE5EF900E75C47A222415E48918D1935C9B" - }, - { - "Count": 152, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82F40255F34956D74918D4EC29DDCE47A1" - }, - { - "Count": 153, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926C50DFB28E40F264BD044DB2DDC26126EB" - }, - { - "Count": 154, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A9032101B7CD1899FBAD9E0E770102A8D" - }, - { - "Count": 155, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D723FE50B706D24CDB41BEA8D8D91F76356" - }, - { - "Count": 156, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D448D1F39A7E25E5BE38C7ED75159126E8D" - }, - { - "Count": 157, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14D24B44B056DFE0212D13C90A9ACD71F1" - }, - { - "Count": 158, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5FFB0C7E34DEC6BB79B144A81F23E51E9" - }, - { - "Count": 159, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA16DCCD389FF6685EA8ACF7981E00E6A9C" - }, - { - "Count": 160, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "34530084813B826A0EC87A38106664B6A4B220E4" - }, - { - "Count": 161, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5635503C13AF15403712ADDA29257EA6871" - }, - { - "Count": 162, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE0FF676421AA2F10FABE724C99BA9FC6B" - }, - { - "Count": 163, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417C9C0E582987FD0B77C7310051A0D4332" - }, - { - "Count": 164, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A1F74B45E0C29C0C05339494AB75C8F683" - }, - { - "Count": 165, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC601F14EA5690F8B55D426491BD469974" - }, - { - "Count": 166, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "", - "CT": "6E490CFED5F12C2FEB11E2F1ADC255F88E987C9DDC" - }, - { - "Count": 167, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "00", - "CT": "E92D2A65CE0BFAB94AAD8C355F3D48B7717B950B3C" - }, - { - "Count": 168, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "0001", - "CT": "ABE4E02C27936A52B304002C2D3D955A9EBB234C80" - }, - { - "Count": 169, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102", - "CT": "DB7F7C248E66A081FDF750876463B7F5289B85B23F" - }, - { - "Count": 170, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "00010203", - "CT": "D21BED6E93B5A5E8747C615A94A81B2FD488760D71" - }, - { - "Count": 171, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "0001020304", - "CT": "0EE0ACB81F3C7B0D7E564926399DB0C70A1EA7DD70" - }, - { - "Count": 172, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405", - "CT": "2657528373BF7B1CAB0880D0450DEBD59D9F0F632D" - }, - { - "Count": 173, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "00010203040506", - "CT": "AFF7DBF309449255FEE078F50D3BAA05D2F6B8E0BA" - }, - { - "Count": 174, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "0001020304050607", - "CT": "34D3B7EDB806D07412A20BAB2616F901B3B6332ABD" - }, - { - "Count": 175, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708", - "CT": "DF4B3A72822B5D8C62DE5CACF1FE5ECA6BCA347C1A" - }, - { - "Count": 176, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "00010203040506070809", - "CT": "89A046EBA734CDFE2BA4EC90C1E439C52D56693F87" - }, - { - "Count": 177, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5E8FB1D39933CE8210E11405B5F018736" - }, - { - "Count": 178, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908568186C9A5065EE9828646BB121D0879" - }, - { - "Count": 179, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA8519DF6C4F535488AF2FA9365450ADC3" - }, - { - "Count": 180, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF384C081DF6A37C73F760747E755CDEF1CA" - }, - { - "Count": 181, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D6257B2A3541CF2142B5C3731EB7BD293A" - }, - { - "Count": 182, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C86E67C69F15FFFF0938FD6C17926F1C64" - }, - { - "Count": 183, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C82C45C387EE084020940504E21CE29A08" - }, - { - "Count": 184, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE5838A6B0ABC62457E246F1F59780CAC3ED5" - }, - { - "Count": 185, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A81C6630959648CB69E6D02FA5B90C1623" - }, - { - "Count": 186, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA5471626F4D25C35D2B7E185927A2E1A73" - }, - { - "Count": 187, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C8AE3DF00BACA52C1B6C0D66CFE96FC1E" - }, - { - "Count": 188, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D727484E22524DACF7DB81C12D732800ACD8F" - }, - { - "Count": 189, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F07CE8BBF2439829C9BE22AF16BAFB406" - }, - { - "Count": 190, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F142551EFC03A461C80583236D853A3CC24C0" - }, - { - "Count": 191, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F6B422B58AD647E661E6E61480EBA326BE" - }, - { - "Count": 192, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12542D854309239E7B7F152F6791A590EB8" - }, - { - "Count": 193, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842AA17D142B3BDFA0B71561F2CDB676E37A" - }, - { - "Count": 194, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FD977A646247263E2242A479E396D769C" - }, - { - "Count": 195, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D87FB925DEAC56905F09548A0883B5A7B" - }, - { - "Count": 196, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E052B0962B7801701B10B1BEB59D18069F" - }, - { - "Count": 197, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A1634A78A581FFC9E7FDC8ED5D9A9D3D00F6" - }, - { - "Count": 198, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC02531CC916B29CF7C800AF5E0037A2044A" - }, - { - "Count": 199, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "", - "CT": "6E490CFED5B30DB2813B8707D404BFE96887CBB64D1B" - }, - { - "Count": 200, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "00", - "CT": "E92D2A65CEE91640647C87CAC0898C898BFB6F19D730" - }, - { - "Count": 201, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "0001", - "CT": "ABE4E02C2714A21CE7F424F0575AA8AC63F8E408DA22" - }, - { - "Count": 202, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102", - "CT": "DB7F7C248EE267C32C472893F7C2DDB64C47A50616D2" - }, - { - "Count": 203, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "00010203", - "CT": "D21BED6E9307872F763D6F4091399A513ECADC68D6D7" - }, - { - "Count": 204, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "0001020304", - "CT": "0EE0ACB81FDA00C3FFDB864902B0B7BC0CB7558729B0" - }, - { - "Count": 205, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405", - "CT": "265752837373FD04EDF75A48C3506A75F74A95A947D5" - }, - { - "Count": 206, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "00010203040506", - "CT": "AFF7DBF3093737C91E7D710FA107D497188EB9A30199" - }, - { - "Count": 207, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "0001020304050607", - "CT": "34D3B7EDB89BF5B94F62AAC108922EFCA24AD8D0E4A8" - }, - { - "Count": 208, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708", - "CT": "DF4B3A7282D6F1B3F33B697B81035341C1E0738E2724" - }, - { - "Count": 209, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "00010203040506070809", - "CT": "89A046EBA7F27C280CE8A6D37CA7C84125C716065286" - }, - { - "Count": 210, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF3A0B902E273851E6595806519128EFCF" - }, - { - "Count": 211, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E371864768CE84731944E4C187B740FB01" - }, - { - "Count": 212, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A8567B702694042ECD077EBDC772527D1" - }, - { - "Count": 213, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EE9075C9BDC1CE6D072AE4AE303B35F9EA" - }, - { - "Count": 214, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643D90B59621BA955749B1119E1D3639AFA" - }, - { - "Count": 215, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C8432F2470679D92C9F4504E39AFA216154C" - }, - { - "Count": 216, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86EDDCCF56334D0E86B695992256D856D81" - }, - { - "Count": 217, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583978B087838EDF28516F11228E039FC2C6C" - }, - { - "Count": 218, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D05ADF872D91BCF736261F1FDFDD12E0" - }, - { - "Count": 219, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C22F2FB6806FF0183A8DEED7A75CF767" - }, - { - "Count": 220, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7B24020A9962D99E3630E174C84473DA55" - }, - { - "Count": 221, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F734166FD250243F978F98A0F91D02FD9" - }, - { - "Count": 222, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F46C8A21E61A7F894C93737A31DDC9158CD" - }, - { - "Count": 223, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257F95AD543EE755ADEF40C2D2EA41BF6F6C" - }, - { - "Count": 224, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60FE81B0D109D6B094A39ECC4ADD6E18842" - }, - { - "Count": 225, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA1259856FF7C35ADB8757B4206881462F97957" - }, - { - "Count": 226, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2A523E837688A1ABF31B5FBE115D8E61E3" - }, - { - "Count": 227, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91AD284F254030D1955CBD09B16566E0" - }, - { - "Count": 228, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D82FDB11B2C562BE7681BDED66ACC2648A5" - }, - { - "Count": 229, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E5745D50F78199A49AB3BAB49087952D5" - }, - { - "Count": 230, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C097F8F8ADFFACC6F5C47AB7ACCA9665F6" - }, - { - "Count": 231, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020D0AFF68A450D9653EB11022E39EF02961" - }, - { - "Count": 232, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "", - "CT": "6E490CFED5B35449F1BD8AB58546AA5FFA2FEE5AFE13A4" - }, - { - "Count": 233, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "00", - "CT": "E92D2A65CEE972E6974E27994316AE55FC20582C175027" - }, - { - "Count": 234, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "0001", - "CT": "ABE4E02C2714C04E673E9FF2DDB70B28EEDBD06480984E" - }, - { - "Count": 235, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102", - "CT": "DB7F7C248EE27779D67E3E297B312DC76C1BB62D490F85" - }, - { - "Count": 236, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "00010203", - "CT": "D21BED6E9307284F0B6C004AC87E509AFD5057C4DFB451" - }, - { - "Count": 237, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "0001020304", - "CT": "0EE0ACB81FDA052F5310233CC8A47945AE057866FE496F" - }, - { - "Count": 238, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405", - "CT": "2657528373738D5F0EAF7419B48179D2295BBCCAFE0F62" - }, - { - "Count": 239, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "00010203040506", - "CT": "AFF7DBF3093729BEC4E7376A81DBFB0315C567DB2AFCBB" - }, - { - "Count": 240, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1DAB00E12EA7BC5A536AA45FC6901F32E6" - }, - { - "Count": 241, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708", - "CT": "DF4B3A7282D6468F5BD55D0DD1B144C00C43F2F9777060" - }, - { - "Count": 242, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "00010203040506070809", - "CT": "89A046EBA7F234D11825A7E800AC03D49B4E114B099BBB" - }, - { - "Count": 243, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9FEF9A5E296649FE8D4AF27D0FD9D8D597" - }, - { - "Count": 244, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E3012377EEF8F4B284F77B5C01095C68DCD8" - }, - { - "Count": 245, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E97E7232600BCF6CF1733F8781C397170" - }, - { - "Count": 246, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE293702997B5CAB258C3F7D62C4E9BCBBF" - }, - { - "Count": 247, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D6435224D0126DDAADC78E3634CF376E54B834" - }, - { - "Count": 248, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C843231757BBFAD6617BA639F7C2B93390AD01" - }, - { - "Count": 249, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16561DFA28B84452EB4BE4A5F2BAF02749" - }, - { - "Count": 250, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EBC568CC5F3D9B4121CE86EAF7883BC1E" - }, - { - "Count": 251, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D50C8D68ABF27C2FB1761BCEB9EED98DD6" - }, - { - "Count": 252, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1668FC693C35B8F5BE124D0230D102BB3" - }, - { - "Count": 253, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC737C242E10BF19A71A5B07925D2FC6A83" - }, - { - "Count": 254, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F0788C4847DF7126E7DAE7F387D601F2661" - }, - { - "Count": 255, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F46878C52A766A052A6075B38A6951C24D6AA" - }, - { - "Count": 256, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5835C14CE5C8C02E34B52A86F90A23FB5" - }, - { - "Count": 257, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2B708DDF38E1BEECE597B4F1C374E37229" - }, - { - "Count": 258, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2F967FCBE6E60A58D6B31FFF926956754" - }, - { - "Count": 259, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4CBB116AD71DA3C5F1DDD09DBA3F61BF1" - }, - { - "Count": 260, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC9148B3953023EB4ABC7D45A68FCBD6807E" - }, - { - "Count": 261, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826BC8B6632C973012B41BA15EDCD4903E20" - }, - { - "Count": 262, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E359B17BA379429DD6EFE7C99B8FD8A4E64" - }, - { - "Count": 263, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C015658E65D679966D16119E9A513FA14F0A" - }, - { - "Count": 264, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBD7244D4B7338B478C1B4648B252CD9BFD" - }, - { - "Count": 265, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "", - "CT": "6E490CFED5B35467B89C7E12863CE5F76AFC808FFF786B9E" - }, - { - "Count": 266, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "00", - "CT": "E92D2A65CEE9727F42AFA1156833C08994F2A7338B9B020A" - }, - { - "Count": 267, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "0001", - "CT": "ABE4E02C2714C0BA5896594CA6BA5FB0D8574C905FB14333" - }, - { - "Count": 268, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102", - "CT": "DB7F7C248EE277F2717045C2A60D4DE04137EBADA5391828" - }, - { - "Count": 269, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "00010203", - "CT": "D21BED6E930728BF2D9BDE86ED789673504F73F19DFE7836" - }, - { - "Count": 270, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513CC08CCED20CB23679742DF1EE7F1BF3D" - }, - { - "Count": 271, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405", - "CT": "2657528373738D8FFC6C7EB05F901324DC1E8EDC830B229F" - }, - { - "Count": 272, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "00010203040506", - "CT": "AFF7DBF309372971BB0268F8BD5155D5D7D6D58590BAE1C4" - }, - { - "Count": 273, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5069711093B89517C4C8AAEF102B8910BA" - }, - { - "Count": 274, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F398FEE7C6DDC12E3649F3726FF33BD936" - }, - { - "Count": 275, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "00010203040506070809", - "CT": "89A046EBA7F2349324B39EC5D1E6E29098399C4F8A1BB471" - }, - { - "Count": 276, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F84161B63726EDBECAD867C07A3C5D60406" - }, - { - "Count": 277, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA3EB3A2A0F50C5EFCE78F6E40509EF51A" - }, - { - "Count": 278, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E64ECB81D2BEEAF44800FA61C699CCFE8F5" - }, - { - "Count": 279, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291DF54509277A47B168C2E9692991C74F7" - }, - { - "Count": 280, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524A9942177049107E3F624D4C88B2DF9374" - }, - { - "Count": 281, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A499FF70E4DB4031D1582229AF267CD7AB" - }, - { - "Count": 282, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD07E1D444243C7E573509E03B19233970" - }, - { - "Count": 283, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA85E0177AC84439454E67B05475AD1C8B8" - }, - { - "Count": 284, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B60E5A27B0647A48FA00F0DED157AD7D11" - }, - { - "Count": 285, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F0A88060685226B54F57CB414293D39B20" - }, - { - "Count": 286, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D9A15529C321ACEB9EE1BEFA6C214DCF1B" - }, - { - "Count": 287, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFC8C6ED517EB1D128739490CF31D8F1DF" - }, - { - "Count": 288, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D7EE46C57DFCB685557A55D769C5068FDC" - }, - { - "Count": 289, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F0AC12D2721903799EEC576621C13E6B41" - }, - { - "Count": 290, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE43F3A9F3F43202C634CFC17221E461F2" - }, - { - "Count": 291, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B293A370327F29A40B4BF2FDF968B330FDEE" - }, - { - "Count": 292, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4259FFDCA42C539440E839A5073036FBAD6" - }, - { - "Count": 293, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EA56C19755D9A17211DA0484849315B150" - }, - { - "Count": 294, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9EB34F9C0E143F735E0E398D4D9506DD4A" - }, - { - "Count": 295, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564849F54F1705E00C65CABF54BB9FD64F8" - }, - { - "Count": 296, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152F3ABD27A325C89A23029F2B5E6F11D8A1" - }, - { - "Count": 297, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA78E59E325520306254892D585F50A3EF7" - }, - { - "Count": 298, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "", - "CT": "6E490CFED5B35467676AC69B2C75CE045D5425EBBC299EBE79" - }, - { - "Count": 299, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "00", - "CT": "E92D2A65CEE9727FB229CDFECC621ACA725E60575571946F95" - }, - { - "Count": 300, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4A16D4655A2825D7EF4E289E6BDF94E443" - }, - { - "Count": 301, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4C9F50B2A5ED088AF2C1F03996777B017" - }, - { - "Count": 302, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "00010203", - "CT": "D21BED6E930728BF2C547F48408FABC7DB92C128F533B0027E" - }, - { - "Count": 303, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BBBB6B9C80207769847EA81BD874F3E5EE" - }, - { - "Count": 304, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405", - "CT": "2657528373738D8FE86215B0068314E77193EE93A6E8D3F888" - }, - { - "Count": 305, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "00010203040506", - "CT": "AFF7DBF3093729713620837C2EEF1F783EBF619D8A36C99326" - }, - { - "Count": 306, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067BDAC136A8929AE1500559312833B547A" - }, - { - "Count": 307, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C9DAE0DCF40E24361BCC61B89C2AECCC6F" - }, - { - "Count": 308, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "00010203040506070809", - "CT": "89A046EBA7F234936846AB43B21E7498659F73B7048FE99E7D" - }, - { - "Count": 309, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F84614CFE49DF24C2A194B223DC31587441AE" - }, - { - "Count": 310, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36AF62B99784A34522EA52BCF48E4DBD16" - }, - { - "Count": 311, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464690B0FF889697B0E9C6970C97DCDC84D" - }, - { - "Count": 312, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE29115B9C2FC5B051E977CD8DE3F49AFF9627E" - }, - { - "Count": 313, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC9205EFE458A9BF21BD44BB466F6D9D75A" - }, - { - "Count": 314, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE7AE0F7D76A27F60E43E5E7164D93B1E4" - }, - { - "Count": 315, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD25961F7A3D7CD63D49B2D2748FBF8BA1E2" - }, - { - "Count": 316, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CE390E7DFDCB7E7C9291493F2308B43804" - }, - { - "Count": 317, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B66BF2D011A06C49CE03F359885C2D16A8" - }, - { - "Count": 318, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02CD6027391151243A9B4625C4B15D1FE69" - }, - { - "Count": 319, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E8BBE2483F472A31671F58B6C22DE1683" - }, - { - "Count": 320, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE11FBD3C44FD42CFB7912B832369BEAEA9" - }, - { - "Count": 321, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D79944F07DFA29CF97A1B6C15D1CF9B3BDC6" - }, - { - "Count": 322, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F03553A1E020D1D67E85FD2EA603234764FB" - }, - { - "Count": 323, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9EA588CAFD71A51CD8040A28689CCD3C96" - }, - { - "Count": 324, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C6AD7F0E34570F8C49AAD0AE2BB5CFD49" - }, - { - "Count": 325, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254099A11A5C6B0FECD97C0096C50FBC4871" - }, - { - "Count": 326, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAACCC21E6E5273B7ECF95147FA438177D32" - }, - { - "Count": 327, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AE9063AB3ED9CBF7302349DA91EFDBE18" - }, - { - "Count": 328, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B316C0290357B174D639DCF776541F1CEA" - }, - { - "Count": 329, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFF385158963A87B08176583E666DB40F98" - }, - { - "Count": 330, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74C9A2AD9808F54E4466969266F4714DF34" - }, - { - "Count": 331, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "", - "CT": "6E490CFED5B354676735B6ED210C26A647DB0979636078720158" - }, - { - "Count": 332, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FC12953EEF7C9B202AE4676A5EC3E58F7D" - }, - { - "Count": 333, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABEB5C824DDD64BE452DFBFF8057FA0EE5C" - }, - { - "Count": 334, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0E9BAFB45D41AE4368FD8B8F87E40B0CF" - }, - { - "Count": 335, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF73B40EB6DEBFAEE2C159732078D4863D8" - }, - { - "Count": 336, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB49E8280D56D92AF3FA6C56E93BA45CEE53" - }, - { - "Count": 337, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405", - "CT": "2657528373738D8FE843126EEF27CB0DF6222A58BC172BFDE5B2" - }, - { - "Count": 338, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC49D7EDF1C82F32826EC9BF826566422C" - }, - { - "Count": 339, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4BFE5B489102181240826C243729B2560" - }, - { - "Count": 340, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994D373C5C90DB9B3C932E75F72688F5847" - }, - { - "Count": 341, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E9A02222F1DEB99540732D34D3561E981" - }, - { - "Count": 342, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F846191CCD248F3A40C98DEFD6F6921DFE994D7" - }, - { - "Count": 343, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D48C5563E7FD402DBA9AF77A4963AAB046" - }, - { - "Count": 344, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F20332A2A5A808A12434B7696BA42845D7" - }, - { - "Count": 345, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D4347058C17F7BB7F17AA1E8B81A08373" - }, - { - "Count": 346, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99AEA8CCC6CBAD3D7C37B51E69B062B8558" - }, - { - "Count": 347, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24628FE18AAF93AF9057A0E673CC4DD26B" - }, - { - "Count": 348, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FB68A2E033BB1D50C2ED2BCD74FD987AD" - }, - { - "Count": 349, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA305F463ADC45FBC55D2CE50EFC963957F" - }, - { - "Count": 350, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D374B38ABFD34E13724F630CB0C3DD59B5" - }, - { - "Count": 351, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C4120325FA98FFBB37C9B17F39D960DF061" - }, - { - "Count": 352, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E34518F4EF2C6164E9DA05B1618B3A83AA3" - }, - { - "Count": 353, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE079E6F519FD53822E81C48351E3BA868" - }, - { - "Count": 354, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F3A52F40C69C959A5997FF4AD6F1A449E3" - }, - { - "Count": 355, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F03522B313A829CE1F6B69BE99ED8DD033DAA9" - }, - { - "Count": 356, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECEE41F6307EB55EF4C55303909740E1103" - }, - { - "Count": 357, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C0312DB09B16031FC7A38475D4F3ACCB66B" - }, - { - "Count": 358, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006691EEAFF043AB9A307085B8041134F0D" - }, - { - "Count": 359, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC87BDDD2D81B5F406EBFABFC7D0C87F73BF" - }, - { - "Count": 360, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3ACBF81F099448BA23281A280130B2C27" - }, - { - "Count": 361, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35609D7DD5A2AE82A47272027F49CD545E6" - }, - { - "Count": 362, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF43A886C747F5D6FDE89EBAE4FE4BE41E3" - }, - { - "Count": 363, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE65D6290D25B90BAEE0E8F2D3DB392D799" - }, - { - "Count": 364, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "", - "CT": "6E490CFED5B3546767350CB7F46A8693AA9239C5368B5FF5998367" - }, - { - "Count": 365, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA84E1FC5830F696198C3F27472E4E221C" - }, - { - "Count": 366, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE6756673BA8090FA3A22717C9CB97C98C58" - }, - { - "Count": 367, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D082F8A6D135C7865EF79512AC0752DE5A1A" - }, - { - "Count": 368, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB0D70856B7B38D0C3409FD87CFC2515AC" - }, - { - "Count": 369, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB49411E311A10EEC189633A3D5A1712D1FC4E" - }, - { - "Count": 370, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405", - "CT": "2657528373738D8FE8430F75BA97A71BEA269539A2053AEF088938" - }, - { - "Count": 371, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8CA4A0B435987045E1C25B5BF1331A60F4" - }, - { - "Count": 372, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4ECC04E5061500970861C6469EE809A0A24" - }, - { - "Count": 373, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF4D583DDB3AA686CA4A13576FB021C1FD" - }, - { - "Count": 374, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E94BE961872EC3A94EE0409318569BFDCCD" - }, - { - "Count": 375, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912ABFA496FC07156A11898C1AC07A842D27" - }, - { - "Count": 376, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D49647C79160F167BD6B6F9113A22D480253" - }, - { - "Count": 377, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F1F1E3B274610C5BE11C9217FDCAC49954" - }, - { - "Count": 378, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9CD22B5E2023E720914D76F2A50209CB00" - }, - { - "Count": 379, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1B3DED2458A629B20970904D90174A6E72" - }, - { - "Count": 380, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EA7377060D79E2124EC4E623768D04F511" - }, - { - "Count": 381, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD245483D6DB459266EC1AC46FFA3BA6F9E" - }, - { - "Count": 382, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA301AC0A75E6408A2D814CE61C8A388B593E" - }, - { - "Count": 383, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327320CE477C99DA5AC878C8CE2EF1F646F" - }, - { - "Count": 384, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412F7F26A2A833D843B9E26F29784786F787" - }, - { - "Count": 385, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345DDEAEA5DEABDA9DCA6CE65B4312F6518F" - }, - { - "Count": 386, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE367DA6A728AD2782FC4BF4C723526D0843" - }, - { - "Count": 387, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37FE269F48514141CCDA3EA13AA168C699D" - }, - { - "Count": 388, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F0352258C7FA01173B650B96B45A39B1497B7423" - }, - { - "Count": 389, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE457087342F8DB2FFB8E6E537F70A6FA47B" - }, - { - "Count": 390, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF7DA049E72159ABB7B3F6FCDE53E1C76B" - }, - { - "Count": 391, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA6ED8DE57CF6BFFF312BA3CCD910F6F92" - }, - { - "Count": 392, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C982ED9ED334EBB90F452FCAC54BB1D05" - }, - { - "Count": 393, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F96D85807E216DDCE078B1D2A07FD26C1E" - }, - { - "Count": 394, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677F773B72D5C809E939AEE981EF79211F7" - }, - { - "Count": 395, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF412991E0BF7AF7B65FE7A958FBA76DBA93D" - }, - { - "Count": 396, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CC35A4BBE4C3C8E2C011B23A31FFC4EBD8" - }, - { - "Count": 397, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "", - "CT": "6E490CFED5B3546767350CD83E9B1BFEB72DD5BACF71810B946FBE03" - }, - { - "Count": 398, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9ADF435B5C18FDCD4190571AA5FD551112" - }, - { - "Count": 399, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE6799712DF449882ED2746E5DE78736E4E2AE" - }, - { - "Count": 400, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A3713D2741F7DA89905ABF71EED2E85C8" - }, - { - "Count": 401, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB415E98E3E2A07ECA599730B652C2B6D8ED" - }, - { - "Count": 402, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB4941344BBF1665FF94D010BDEB85AAC2D374CF" - }, - { - "Count": 403, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2E6673426506E62797E4CDBF745ED9515" - }, - { - "Count": 404, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C260B9B8304A6BFA436C5D7F05959D88E74" - }, - { - "Count": 405, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9ED207516389CC0700B857FD7444686AE5" - }, - { - "Count": 406, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84D00B2B73FA27E817353FE82F4406EE2B" - }, - { - "Count": 407, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E94715F3C0FB1A75E669A7640DB7FCEDFDC54" - }, - { - "Count": 408, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED521FD2D2ECA952EBCA9EF897797C8FC4" - }, - { - "Count": 409, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F12BB57B8257A6BB92509DD9CFE77A8397" - }, - { - "Count": 410, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E3F7B7F8487CEB62EEFBE278E47CDF31F" - }, - { - "Count": 411, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B905FE626A56444AB0A64B4B2C973B814" - }, - { - "Count": 412, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBBD3D5B6DB32B7A9279050D04B32F4DCD4" - }, - { - "Count": 413, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAEC39B8B8FB982140FC367ACBCA5ED4AEDA" - }, - { - "Count": 414, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD4C89497622B864A1753F8CC483F739CB" - }, - { - "Count": 415, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E187B05B63F0D900BCEAC707861ADEF35" - }, - { - "Count": 416, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FAC4DEE3655CD52B73C0C1DC1D2A72B94D" - }, - { - "Count": 417, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA09E20F050C02F79F6A4205CF98ED9034F" - }, - { - "Count": 418, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30AC70F9D0551763B6F6A1B8CC9EACFBE4" - }, - { - "Count": 419, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DCD6D9A2BEECDBE776CA0B51B2D1376701" - }, - { - "Count": 420, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31D62399A131920E264E9BD4DB6FBABF9A" - }, - { - "Count": 421, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857A4AF4CF248DB55DBF143D5BB1E688534" - }, - { - "Count": 422, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE0A5D419EFB9269C35AF0F55D1E820F6" - }, - { - "Count": 423, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6A78E7CFCE35A882E2F20DBDD8984F847F" - }, - { - "Count": 424, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F3B23E6563FD85FC85355C5A42364CD17" - }, - { - "Count": 425, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8CDF1C9C0FB9012B7CF735763AC62B057A" - }, - { - "Count": 426, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94A3E054C8ECCA2279AAE7380C9011A461A" - }, - { - "Count": 427, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECEA2BC7B3FA0938DB1914F27A53E1F3FC" - }, - { - "Count": 428, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121AD16897BC97EAD79FF413DF5B3C811D61" - }, - { - "Count": 429, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD1CBE8260CCDC7A573F7456E5DA191163A" - }, - { - "Count": 430, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "", - "CT": "6E490CFED5B3546767350CD83CE88B65A90CE3A257049F049CD9213C2B" - }, - { - "Count": 431, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72DC80F796CF5FB9171C3E69638A1844C7" - }, - { - "Count": 432, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F36D6D3753621B41D090B05087F1A8FFE" - }, - { - "Count": 433, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A0197DA29A96765CA64D12C82D7D48348CD" - }, - { - "Count": 434, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E1E6627E769710DB473A66C096CB2E7D5" - }, - { - "Count": 435, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB49413495DD7B29CBFDD50BBE4E439AB38FEAF9B6" - }, - { - "Count": 436, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D19ED1445599C4ED163B5BED7825FFEC76" - }, - { - "Count": 437, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600F297337BAD88819FF658FAC21F7CC41D" - }, - { - "Count": 438, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8CD233D1805D9FAD42B6E503177322C22" - }, - { - "Count": 439, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C32A02C5B973AD73E3E1D0470D467635C8" - }, - { - "Count": 440, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185D577C4D10FFE1D5EAD3BF9FDA122141C" - }, - { - "Count": 441, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7A140CD8C3098A7815B7217890A915E91D" - }, - { - "Count": 442, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A59A2A5F33B736C1129CE835C24734925F" - }, - { - "Count": 443, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97CFE15EDB49A9A6F3767F6D194850EA96" - }, - { - "Count": 444, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1BD6459A508E5FF61ED76AD3115F84AC91" - }, - { - "Count": 445, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB22C2B8EBBEFF52A3F6A8B40B91818F1C48" - }, - { - "Count": 446, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCFC077C002B78F19CF5E9BD54B172CE50C" - }, - { - "Count": 447, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D4D5ECB43AA0090E5DE3268CB39D2F7F1" - }, - { - "Count": 448, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70DADFA19B40686FD19272A45B7FC18C95" - }, - { - "Count": 449, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA1484F03B1302714CBA7C8E80EF5F972C4E" - }, - { - "Count": 450, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0658A9BCB753D13082E9D887DA56AF7E552" - }, - { - "Count": 451, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30159D1CE73D07C3098A68C77CFDE2430068" - }, - { - "Count": 452, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC07D6718D0CCAD57D3B4970CCB83FF3165C" - }, - { - "Count": 453, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31290012E0674EFBC1E37CD9F267AD497DCF" - }, - { - "Count": 454, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D45A1B21B4B4497121B6CC24B74585F3F2" - }, - { - "Count": 455, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE20160E8E1B2292C19DA86DE237F764BAC" - }, - { - "Count": 456, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD59B4DBA29DBDC46AC2496D5EF372F5548" - }, - { - "Count": 457, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A7AEEE25987E1A87F3D312FAB8F3D3AB4" - }, - { - "Count": 458, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B21EEB01BA5EE6F52DE32519B73DEB7D3" - }, - { - "Count": 459, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC7B820EE73FB710FFC9013017E1F640D24" - }, - { - "Count": 460, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCFBDE010E1870310BA6187EBAC1423492A" - }, - { - "Count": 461, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A8B23A2692B2CA63E620D566BD5A1A260" - }, - { - "Count": 462, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C791B766ED9E1A401B4AE7CEFB0A0C40D" - }, - { - "Count": 463, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4A582611E9462F0EFF368629A7C6397054" - }, - { - "Count": 464, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BFB39A5751F06F3F4C06B1A0B8403B7E32" - }, - { - "Count": 465, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5BEF0F617560EE0C78DFD87C23FD8E3ECC" - }, - { - "Count": 466, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018A8F630F912B65A0B57DD6CA3AAB8B440D" - }, - { - "Count": 467, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2A1A26F7EA6AC86FE6A0422C9CDA7893B5" - }, - { - "Count": 468, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956AE01B6FF70F02999F1BEB49173E13EF6C" - }, - { - "Count": 469, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DD2656E419CCF025EDA26581E64F87178" - }, - { - "Count": 470, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C260028168E5319B46455D4242A9F04D7311422" - }, - { - "Count": 471, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB80593C2910FD16D00D213F1E3E83C79D9C8" - }, - { - "Count": 472, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39DD7CC4476CB4449D711C61E6CE5ADCF64" - }, - { - "Count": 473, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE6D08CEEF649775C793C7B653038B40CD" - }, - { - "Count": 474, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBC2855081A99262472B4C1B9995B20095" - }, - { - "Count": 475, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E8CD2FBBF8537A61EDA7A6CFB46CDCEC25" - }, - { - "Count": 476, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DEF471482C0AF4FAFE38B92D1A0E250ECB" - }, - { - "Count": 477, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69C461A2B9F1333A2DEB11D1F1E51C51C7" - }, - { - "Count": 478, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294BB1DFC7BE15B3C6988B4065CB6959799" - }, - { - "Count": 479, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45CC3806CB0575B40E39A29A0FC577AEA5" - }, - { - "Count": 480, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D31538C4E4081CCBCE9E24DC2BAD227F625" - }, - { - "Count": 481, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C5E18821378F3C8A3DAE99E3DEB7BD69E8" - }, - { - "Count": 482, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA1431656DE1F93B3F92AB3A64A268778FB90A" - }, - { - "Count": 483, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659C6D049258806B49724AAE5D186A4B74E2" - }, - { - "Count": 484, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157DA108EE3599057999B88028D77486C29D" - }, - { - "Count": 485, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077828FAC5E10256BC052A3D772A164E3AF0" - }, - { - "Count": 486, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297F8DCC3CC130FF50BCA3FBD08B511DBBF0" - }, - { - "Count": 487, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DB4B95352074A505BC8849B0F4780EEB5" - }, - { - "Count": 488, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE2985CE96DFE1A09B88F7E907F74EC44F511" - }, - { - "Count": 489, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53759C373DD5442CA271119AE7F3A662178" - }, - { - "Count": 490, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5012A6E5763C7C76B105E335234A11FA59" - }, - { - "Count": 491, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8502C73AE744DC96EDC4D5562352EEB240" - }, - { - "Count": 492, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70C63CD71A6C6208752D08891D1A7979E3E" - }, - { - "Count": 493, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4ACEE99E1224CB83501ED9DCA01D2D14B6" - }, - { - "Count": 494, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3AEA7941E47769D5A9DBFD04BCC7502086" - }, - { - "Count": 495, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C687085F40B3497EA721BF2DA4717BBEDF5" - }, - { - "Count": 496, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACF9482EF04436DDD22BC7898E61FDFA0A4" - }, - { - "Count": 497, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF7851304A8A108721079C1B2587312C303D" - }, - { - "Count": 498, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A34B2200F7025CBF5A7C782D10609D3A2" - }, - { - "Count": 499, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6E223F653000A5EF19EDEF3B3E1313340" - }, - { - "Count": 500, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA3A375D6B6F8998D1B0DFE615C1E632F0" - }, - { - "Count": 501, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5BE56DA2D5D81DE75F1C9E612B0ACD6127" - }, - { - "Count": 502, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE2711665E5183EE926CB068DB469237810" - }, - { - "Count": 503, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283EE6D539B1D981C3218E9F0DECF6D1C685" - }, - { - "Count": 504, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB80529FEDD0E0D98AA67DD96D223737ED384DD" - }, - { - "Count": 505, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C15438B7154C9C09F7B7831879939F287" - }, - { - "Count": 506, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B56C7C2F8E915B35B1C690CC4F2F03CA7" - }, - { - "Count": 507, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1926DC619327FA179755CAE159CEF23BA" - }, - { - "Count": 508, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A6EE63D5732BD83B2348E242E508A5DDE" - }, - { - "Count": 509, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECC79AE721C4D7891B4797A9830D13F23BD" - }, - { - "Count": 510, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC49A9D496B4219D84DA58097A7558E576" - }, - { - "Count": 511, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294936F68BD8979525B6A4E5874BE6885EEC7" - }, - { - "Count": 512, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C14BB7700C338C95A089F524C515460CC7" - }, - { - "Count": 513, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139382808D9D51C8B899C5E71C42190C2A8" - }, - { - "Count": 514, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51D7841FBB9B81674BE354BB73B48C41733" - }, - { - "Count": 515, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA1431412F872BFD600FA6668413CC1A59486985" - }, - { - "Count": 516, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8C2E767C801982E86414E5C1A31314EAE" - }, - { - "Count": 517, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45335EFD6A7CFB01B684654AAA04F22092" - }, - { - "Count": 518, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC07789194BEDF714F3409662CD6C44E080F5CAF" - }, - { - "Count": 519, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE20AFCC9461554D2CD839E47FAE2B33015" - }, - { - "Count": 520, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADCA53AC1BA9A8ADFA5DD80942ECC0824" - }, - { - "Count": 521, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDC68162FC0C426E35FBD34843B1A5F032" - }, - { - "Count": 522, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD537709E848B4BA69307B6C8989FCDE12CF0BE" - }, - { - "Count": 523, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A508426D6481880A5189BA7002D22AEC5D97C" - }, - { - "Count": 524, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507C4639F15F1583F8601FC204EE8609C49" - }, - { - "Count": 525, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD862FC359A713948BED9C11874725FC7A2" - }, - { - "Count": 526, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A46116CAD3213319563DA1E9887FA1AD2A5" - }, - { - "Count": 527, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A28F1B355C5A1FFD5F3D86717408B8CA243" - }, - { - "Count": 528, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4F70A6AF30B5B1F8826DF3E9B47C80024" - }, - { - "Count": 529, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBDB10F611B7D79278BD8067FC1BCDF39BE" - }, - { - "Count": 530, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781EAD1682916FDA1AB6BFD8ABD9AD6DBDA5" - }, - { - "Count": 531, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A0790C89AB8188D97262BAFBEEBE729AB18" - }, - { - "Count": 532, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF616041B11CA7ED7D3A18AD35ED1249C7BC0" - }, - { - "Count": 533, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B67192B03AC333ADD5E85E5314476B035" - }, - { - "Count": 534, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A22904F671858B8B315522BCF5E3F1BE6" - }, - { - "Count": 535, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22A0A0E098D9A8C84C59A094E7DCF636948" - }, - { - "Count": 536, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0C3DD6BD67E8453EB659FCC687FFF696EF" - }, - { - "Count": 537, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962522E547863AC130D032A06927D4261DB" - }, - { - "Count": 538, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C7069590A7854378D9B2A7EDD4AEFF77042" - }, - { - "Count": 539, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B0463BB5DA21F215C6E65F09ABC37A80769" - }, - { - "Count": 540, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B885291BEE569F25C69F53BEE948F1F3E5" - }, - { - "Count": 541, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C7A9347B96C8C78F74C2D956279C4B768" - }, - { - "Count": 542, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1BA59DA9469ED0D25FC6DAE971FE09FBE" - }, - { - "Count": 543, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC93E091709E687A34D555C1F6EA29FA4C1C" - }, - { - "Count": 544, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B73E8824A6FEE53CDBDEE674FF1DAC93D" - }, - { - "Count": 545, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C137316D7AB17724BA67A85ECD3C0457C459" - }, - { - "Count": 546, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F440CDB729F8BCBBBCDF377E2D38D3EF15" - }, - { - "Count": 547, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7504E3BA15821E257CE2C3BF5FA380EF1" - }, - { - "Count": 548, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA14314147C4386D2AC5F8FE2C86B5B9E6315C6E08" - }, - { - "Count": 549, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC824B70A6BCBE7AED74CE88231E442D4CBF4" - }, - { - "Count": 550, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C43B442F6D2FFCEAAC35FF364B604776E4" - }, - { - "Count": 551, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A99758DD9B4468CF7B7B6FBBFC436C4D60" - }, - { - "Count": 552, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28ECFF2806B7DE243F808E8D47E8F81BFB5" - }, - { - "Count": 553, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA3341626B5E378231EF66F955851E2540" - }, - { - "Count": 554, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF640C8A741E934B2E33956E3D50436BB4D" - }, - { - "Count": 555, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7D058310A45836ABB693FB334A181FE93" - }, - { - "Count": 556, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7C484611FF73D6072BD1CAF2FF10C0F2" - }, - { - "Count": 557, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D1D1B868580F116BCC6208953D7ECFE029" - }, - { - "Count": 558, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CB724961F3EB40004489E8B8C12A77696" - }, - { - "Count": 559, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628001CA936EE44170E4B4A29FB395321BC" - }, - { - "Count": 560, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C0348CD484A3E5A99C7DE8CEAD133FAA0" - }, - { - "Count": 561, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D88A95D7D97F774CB274ACBB055AF1938E" - }, - { - "Count": 562, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4C24A6876D90D20C110E12F5A5BE51967D" - }, - { - "Count": 563, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E611A5395FCEE412A0DEF634FD58BEE6085" - }, - { - "Count": 564, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079B9750B0845A992A1D4BA5F7BCA73DE64E" - }, - { - "Count": 565, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FF417A0DACC106D0259066C0B0AD34C3C" - }, - { - "Count": 566, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B48FE3E248A801CD56777AD62B96BB1EF5B" - }, - { - "Count": 567, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E50481D1BABE52E88B7682A7049E7EF83" - }, - { - "Count": 568, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF1FD5FFDCF750F319D10272174FA11884" - }, - { - "Count": 569, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB5EA1C838F80C432CD208FE436C7CBD1F3" - }, - { - "Count": 570, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E59C268600E40106B72E37D427A00FB4D8" - }, - { - "Count": 571, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704C53A3814E93E6844A200FAD799D9C8FE6" - }, - { - "Count": 572, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044BBCFAB318648961BD7AEAA93CBFE6B444" - }, - { - "Count": 573, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB655F17467ECF4755E4DDECE4EC0E013C" - }, - { - "Count": 574, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C464A7985623F0B17ADA78306AFADD29D9D" - }, - { - "Count": 575, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7A392DF365E7D8DACED0968D44643D0C8" - }, - { - "Count": 576, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DC10C0B07341F5D7C7276106FC2BD907D" - }, - { - "Count": 577, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D460CFCE2FEA59C4692F6834059C54030" - }, - { - "Count": 578, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379BE1FB14B90AA907A8475A667367CD277D" - }, - { - "Count": 579, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43B1D71C0094E2B77150642B91FDB91FCB2" - }, - { - "Count": 580, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C71DE3AA90E3E64402AFBCD480D142F341" - }, - { - "Count": 581, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478BC74349FDFFBB2F2B30D0B6E600C124BB" - }, - { - "Count": 582, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241A6EACADB6B5FBB2AF6703D687CDDEAF42" - }, - { - "Count": 583, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CDA5B6594E2F73617E446E7A705BEDAB82" - }, - { - "Count": 584, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9ED1E9AAF488EBD3DADE7161FEB08DFB662" - }, - { - "Count": 585, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E287E88CC93C6D4866DC506E083B7D4DA4A" - }, - { - "Count": 586, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F0BC2022E4EF3A3DA2DC7763BFCBF6A8D" - }, - { - "Count": 587, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF67633DADFB2D701AD37E1CF37E6638D0C37" - }, - { - "Count": 588, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C48527C0B7093FEEC3227C096928376AAC" - }, - { - "Count": 589, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA75E9E787D80715ABABCE1CE4C047465BB0" - }, - { - "Count": 590, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B71295BDA1BC1A05B1E89004F85A39501" - }, - { - "Count": 591, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFEECB7C79C1189B7FA735FAFA206BD0C95" - }, - { - "Count": 592, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A462888A21E4DD49424903D198DFA6217A91CB6" - }, - { - "Count": 593, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C338BF2167834ACCF5B43C39A9CA5D7724F" - }, - { - "Count": 594, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8510D0B9D2AA8905C902D5637AB52D5105B" - }, - { - "Count": 595, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB9055C65A277249A2424C29CC65FCA7C4" - }, - { - "Count": 596, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615893D16678B0AB0186AD218E226097FC24" - }, - { - "Count": 597, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF527B013FF2473EF5700C4B7ECDB899E8" - }, - { - "Count": 598, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA10A12CDCEFB053B2170A29CDD993E5B1D" - }, - { - "Count": 599, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483FFBDBEC9B7B13CA5CDA7287F074876C6A" - }, - { - "Count": 600, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E454931DAA651899867F52EE4D40D7F214E" - }, - { - "Count": 601, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF384137FA3E52E5B01C268D3FD1B8A73DC2" - }, - { - "Count": 602, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB5257AEAEABA79837317650D789041D6CF95" - }, - { - "Count": 603, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581DC28263018CADE2F7820236319353FD9" - }, - { - "Count": 604, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8C127F8E43C6ADC2635E0D6936CE71724" - }, - { - "Count": 605, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B3061B10BBC9F063A91959D6581450646F7" - }, - { - "Count": 606, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AAD89D2D8C54D76690340EC498A3E4341" - }, - { - "Count": 607, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D548D987AF7431BAACEF7CD49D151D4C8" - }, - { - "Count": 608, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E758161CD00039A9D0208A27D964D89EB7B4" - }, - { - "Count": 609, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBA0E91C0ED56DC9BB9496131A050C57CFB" - }, - { - "Count": 610, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D8932A300EE9C7947BD95D99F2F97082A00" - }, - { - "Count": 611, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DB0ADE5772083D97B5D126DD66AB853E5" - }, - { - "Count": 612, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDFFA3FDF7D8F4FBBF4A58C3039BDBF4B3" - }, - { - "Count": 613, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC7C784BADC7527A9E938BCB4413D73C3F" - }, - { - "Count": 614, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B115889DB9A6940026C8C2198394990B0E4" - }, - { - "Count": 615, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA5AA9F246260C0E18EC2F1A1647B51B20D" - }, - { - "Count": 616, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD719A65FE181623CEC71ACAA0F875D98B04" - }, - { - "Count": 617, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBBF0FEEB52981F3F084202EE90150C4651" - }, - { - "Count": 618, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880DA9CF8CA2ECA51E63EE2D66C1E8829C1" - }, - { - "Count": 619, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3CB72AE28B02836673C5ABD084D50C494A" - }, - { - "Count": 620, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F247D7E96A4E1903FE8838E25CCE2FEA18" - }, - { - "Count": 621, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C462203EADE1C5294583A504A35682F8DED9" - }, - { - "Count": 622, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571220FFE3903348F1E47C64D0BCA3E31F8" - }, - { - "Count": 623, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CAFA9367B093531CE3D9161A71A8BA028" - }, - { - "Count": 624, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94FC932C607BB4DD82202DCF50301F2A2C" - }, - { - "Count": 625, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886EDF47C9488709795A52EE3FD107AC9164" - }, - { - "Count": 626, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A312C72231ACE461D7826521B126391BC6" - }, - { - "Count": 627, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514425DFBE164ACBD4CEF5F5EB694D2D6C49" - }, - { - "Count": 628, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4B9C2BD84D0519D139FFB0F2DC2D54DA1B" - }, - { - "Count": 629, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804DFD74D598B73726A0E99B8339DDBC30E" - }, - { - "Count": 630, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF606EE8A9934439114087F1B490EA9B6E58" - }, - { - "Count": 631, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E9D87A8F6A1124F47617231B208B81D0F" - }, - { - "Count": 632, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2BFFFB28723A5D25248C8A2EB2B30B3ADF" - }, - { - "Count": 633, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E456897DB49B45CF1C080FAC03B85CE488889" - }, - { - "Count": 634, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF380499320CD8A91D386E26254403FAD4F478" - }, - { - "Count": 635, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549D72C79061B71FC6BC3505BBB2642B5CF" - }, - { - "Count": 636, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F3579E92872DEC3DDEBD1EAA6A61141417" - }, - { - "Count": 637, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B23F749B5BC6EFF8DD0E8C8BB0F0914A8F" - }, - { - "Count": 638, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0DDA833D1C6305254DE4D69048AFCB2D0" - }, - { - "Count": 639, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ABBDEF8D35110EE6263847102A257890" - }, - { - "Count": 640, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D324AB487211F25784DE8E778C7C48E78DB" - }, - { - "Count": 641, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CE7BF0E92EFF883047919C4710B0A17C2" - }, - { - "Count": 642, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEA32F25A3E11165AA90EB7D8E82824E9E5" - }, - { - "Count": 643, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E0018323E109B397682F98D27D4BF3DBD3" - }, - { - "Count": 644, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEA8F019EE1ABD5C8214428F978942515E0" - }, - { - "Count": 645, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCF408145FDB8AE0EE76ADF02742B428A5E" - }, - { - "Count": 646, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E9E96A3FFCF38D5CE0935A05F072BEFDD" - }, - { - "Count": 647, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B11394C706E571AD7FC7D7519E792620F516C" - }, - { - "Count": 648, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513540682AC06E8C30543C437CFC3D7D6DF" - }, - { - "Count": 649, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF4DEBC79FACF7FD1B1B44E99ED15244FF" - }, - { - "Count": 650, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB62C89C6184A6F0C57096C7E534C7AFEC0E" - }, - { - "Count": 651, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CED0B1B5F429594AC86523E8B55DD9B2A0" - }, - { - "Count": 652, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74585AC6F1D548584B29C4BB9191581F69" - }, - { - "Count": 653, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E9B756B02A787775C66153B25FC91AC7E7" - }, - { - "Count": 654, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C462044056D293781F9F208EA7A29F54D05AFB" - }, - { - "Count": 655, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA75712855F2729FE59B7357B2373C3C90F584BB" - }, - { - "Count": 656, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF78D5C04C43FC49BB5AAFF718D95C4AB45" - }, - { - "Count": 657, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DDD8EE789D38C23BDFE78738DEC2F6E27A" - }, - { - "Count": 658, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E15CF73D697509E13116D86DFF7A0EF882C" - }, - { - "Count": 659, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A31500012A52F69B267775FBE4FD945A1B96" - }, - { - "Count": 660, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450E251321DEA5B2FD33A0F0AA37D0C05DC" - }, - { - "Count": 661, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD01E20B580E4AE9F543517283CCFBB4C73" - }, - { - "Count": 662, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E0CDA3F554317F6ADF15C9A1D61F37D03B" - }, - { - "Count": 663, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDC43A9EEC6613B7AE0E0D85ADBA84A27F" - }, - { - "Count": 664, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E11DA99CD1AD3F138FAA89B6E4933D68E2D" - }, - { - "Count": 665, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B382114B7F8AD9C146E98CBA67A9886B21F" - }, - { - "Count": 666, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4FC4A942ACA67E5B91835CE724AA76A33" - }, - { - "Count": 667, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B3B151723E96CF520973D9BCDE5731AB4D" - }, - { - "Count": 668, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C441EAB891A0083D46C7875C5071FD76AB" - }, - { - "Count": 669, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F380BAF38605794F860C30FD8730EDF0F47E" - }, - { - "Count": 670, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B279F53CC8E0337D3D13AE9E6300CAA940DD" - }, - { - "Count": 671, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D83D7181FD84EBEE2D583C17D634B4B2D2" - }, - { - "Count": 672, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACE60BDBF96CDEC73DFF439B789A91C9DA" - }, - { - "Count": 673, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32637B35D335138DAD6FE551E32B2E84631E" - }, - { - "Count": 674, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC7DEB2690FF081569B673D9CDEB5D2699" - }, - { - "Count": 675, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE5E2590AAB082AE50883F96BF217FA10F" - }, - { - "Count": 676, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079A8D1FE4C381545FC20DD2FCD6FDA8717" - }, - { - "Count": 677, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD92810384F4E8678A48DA72B248EBCCD8E" - }, - { - "Count": 678, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD862D2A36F6E5573B30AE41675D2D9E07D" - }, - { - "Count": 679, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E6176F49EBB38CB80FC1C7944E944181794" - }, - { - "Count": 680, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E45BDD8012A4E56C8F3659BDC08851B920" - }, - { - "Count": 681, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCA9AB4E0D16135DD502CE53B98B876E74" - }, - { - "Count": 682, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B69FEEC1EF978AE4FFBAF889ADB0CA0D1" - }, - { - "Count": 683, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620CBFCED1302E8FBB5650242B6B843C82A8" - }, - { - "Count": 684, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0ED60FCE6A4F307829410FB3928198CA37" - }, - { - "Count": 685, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8A677895EC44F4AFA9D72C8A2E8F7C89D" - }, - { - "Count": 686, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E9908D77566BE01A549D515A898A6F39B17D" - }, - { - "Count": 687, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A706998898B188140B638625915DE7CF9B" - }, - { - "Count": 688, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287848A6A2A42F48498CB6836D55B55D1522" - }, - { - "Count": 689, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF791EBBD87CEBF4E316DE201CC59F9B6212E" - }, - { - "Count": 690, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A15731ABD47AD042B0C76680672F053E6" - }, - { - "Count": 691, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CABD1E26754D221C85E7A67C4C8E167D7" - }, - { - "Count": 692, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FB1319B90735508D9E24D4169B5A0CA711" - }, - { - "Count": 693, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A3D856F7BB465B164C5E52E84EAF935015" - }, - { - "Count": 694, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD07A2178BFB255AF5D5A82EC7D69A9AC0196" - }, - { - "Count": 695, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E048D82156A9EFD8A99BAD5BB1A5EA852E3A" - }, - { - "Count": 696, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDF4C93122BB6BC96E2729B8AFB6F23479E7" - }, - { - "Count": 697, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E118AADAD69102366F0D5CAE655B6756F19CA" - }, - { - "Count": 698, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B383D9C3EB73E77091CA023C721CE8FD02604" - }, - { - "Count": 699, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4CD6EE4887F883F3E212E730127D62C3862" - }, - { - "Count": 700, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B3833E32424BA9D7BEE3D43DCCD5E4EDB0F8" - }, - { - "Count": 701, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C464AF1A8D3F49E7D6CAC687AADB6D8B7025" - }, - { - "Count": 702, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F38017F931FF83E55E3D2DC8F2B14D3803121B" - }, - { - "Count": 703, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B2796A623FA0EDE1856D5348EF2B5CCFF7C898" - }, - { - "Count": 704, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D8E3DED820F55FCC085CFB131E8238C88C58" - }, - { - "Count": 705, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACD5502C87B6B09141E9C4FEE26ADC0BCAC9" - }, - { - "Count": 706, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32630F18C370D081940BE9C86EEAD3834B1549" - }, - { - "Count": 707, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC427432FC65628A276863956B98B7263025" - }, - { - "Count": 708, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE175F7EFAD3F29CB7FD93EAD2393D724486" - }, - { - "Count": 709, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079CB2F960FB05BD631C191570694FB759BB0" - }, - { - "Count": 710, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD903D0A6922CEE77554B760A5965CBCADE4E" - }, - { - "Count": 711, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD8CB8EC2668A515AF632EF85DE69A810D48B" - }, - { - "Count": 712, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E61FDF118EE9FA6CB3CC03B92821F4F92400A" - }, - { - "Count": 713, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E480F9939B95F70B58BD85102AB79F7C8A5E" - }, - { - "Count": 714, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCE7F3B364603F77FC23B531F2D4E0B583D6" - }, - { - "Count": 715, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B40D08B0CAE43554A27906E2C4CDD2D491B" - }, - { - "Count": 716, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620C04D20FCFE40726290BF2C8E76E996E9F1D" - }, - { - "Count": 717, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0E069A5CF04EBEF46145E6BBBF5DBCBAA9E8" - }, - { - "Count": 718, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8F91FC650AFFFBD4012524A55FA484248B5" - }, - { - "Count": 719, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E99028BF33B0EEEF14189C337E51702C0F01A5" - }, - { - "Count": 720, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A7EA4758DF1D1298F5780A6E6B69EC13BCD4" - }, - { - "Count": 721, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287855FF33B0139796799F8BA90001D7F6BACF" - }, - { - "Count": 722, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF79194A4AB80FACA72B40E0527ED15A968E0E9" - }, - { - "Count": 723, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A7A351D9BEB93C1B132F14DE7EA30266B3D" - }, - { - "Count": 724, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CE3C9B9FF1071F8F144034744B9175C2EEE" - }, - { - "Count": 725, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FBC85460875FB9D2A5A72E1BEA08C784AE26" - }, - { - "Count": 726, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A382890418637482208A5911D84D0A37FC9A" - }, - { - "Count": 727, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD07ABF6438003FD1345DD414155C64C1BA8D42" - }, - { - "Count": 728, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E0484A0BA1AE29076DE0E8F8F821470301C784" - }, - { - "Count": 729, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDF4E5C2C594A6FA4517D4F9F66D47F2C9D519" - }, - { - "Count": 730, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E118AE0B639438AD2EEEB28BE6AEDF7D9E5A995" - }, - { - "Count": 731, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B383D0CC63FACE2C6E44C74CFF8051495C1EC10" - }, - { - "Count": 732, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4CDC862F701FFB492DEA6F447E7CED7C5B121" - }, - { - "Count": 733, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B383CC9F5C4720E592C83768220BBD59526EAF" - }, - { - "Count": 734, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C464A7EE044B75136AE789A90EFD0E22113CA5" - }, - { - "Count": 735, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F38017531EE757EE3B1E38C8A53A414C649B1355" - }, - { - "Count": 736, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B2796A166DB95827DB429DE78C7CFC07AA2C9111" - }, - { - "Count": 737, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D8E329EF3F6ECA98073C5022C050153EC49F51" - }, - { - "Count": 738, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACD54679A10059423DFF7065797744D337D210" - }, - { - "Count": 739, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32630F9151B0096B464277860FFA457C64E1E1F5" - }, - { - "Count": 740, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC42A368021A66859C390CA0F652DAAFD437B6" - }, - { - "Count": 741, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE177149673E84A38A53F1DD6AE8AEBCAAE607" - }, - { - "Count": 742, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079CBA93D754DDEE3FAE1906C46915965F79463" - }, - { - "Count": 743, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD90335CFEFAF7FF363052FCB2F63B22547C074" - }, - { - "Count": 744, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD8CBACBBAAFF9D0394F607187BF2C886A9A509" - }, - { - "Count": 745, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E61FDDF060DD00B66AD313B664C3CD642835C99" - }, - { - "Count": 746, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E4800AC41320F03E67442037C4566AAF18069C" - }, - { - "Count": 747, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCE7627D59D0388FF6E90DF5527E016880F972" - }, - { - "Count": 748, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B402DBFD52309B3959815969DB94A7A4B1F8B" - }, - { - "Count": 749, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620C04B8D579469C2A42DC22DF7EC82558D8B430" - }, - { - "Count": 750, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0E06EBFA7EFF7632B0352F68A1FE411346A852" - }, - { - "Count": 751, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8F9AEF903CA915ECB0184C290CB38B919125C" - }, - { - "Count": 752, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E990286A2A6DE3B9DE66EF5137E760AB3BD03DDD" - }, - { - "Count": 753, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A7EA81C61DA3A959B1753DDA4849D8296E46CC" - }, - { - "Count": 754, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287855B3AB5EB51230A0E62EB4C08C24897FAC77" - }, - { - "Count": 755, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF79194D055ACF42890DA93FB36433269FA600597" - }, - { - "Count": 756, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A7A5038C6F39150E56C3A715C0C1DB7B9D52A" - }, - { - "Count": 757, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CE3DFEFE9DBC83EC7547B95063860B87B8CF0" - }, - { - "Count": 758, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FBC8BF1B8990FD58938078E2558C9974F8782E" - }, - { - "Count": 759, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A382BC01FB2B6D1F99D7CD495EAE9A6096B708" - }, - { - "Count": 760, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD07ABF5BAE2D36F26B445FB45C1778017BFA4922" - }, - { - "Count": 761, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E0484A39C93C5A3F530C0D461DB0CC3DB935B3DF" - }, - { - "Count": 762, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDF4E520B0A48B711E433FE334957BC67BC10C42" - }, - { - "Count": 763, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E118AE0A678B836D977FDD64114ABFCDB541CBF23" - }, - { - "Count": 764, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B383D0C72A09ECDF0548545F5C1B023A26FD215D3" - }, - { - "Count": 765, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4CDC868E8A066C6AB0E7AD5539B2B1FCE5C28C1" - }, - { - "Count": 766, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B383CCD1985B054F879B924FABD1519BDBBDE07A" - }, - { - "Count": 767, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C464A7737150C2FAA54673406AA3C5F4D9CFD4FC" - }, - { - "Count": 768, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F38017532BF650F09A933E3EB6A2555F67B33B30E7" - }, - { - "Count": 769, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B2796A160018AF78CD567F51CACE83A795AD1DCF7D" - }, - { - "Count": 770, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D8E3299EF5A94054A21D29FEA4F076F68E26208F" - }, - { - "Count": 771, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACD54637D193C5371279753F2177BFC76E5FC300" - }, - { - "Count": 772, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32630F916E7694FF66F7155E44842AB52310F26B75" - }, - { - "Count": 773, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC42A30C552C0E43BFB9CAFB397B8FF6FED3574C" - }, - { - "Count": 774, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE1771E6C69D232D2DF34E1A0D11D92C2C5BAB60" - }, - { - "Count": 775, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079CBA9DF555DB990FB2E50251F4C22FFD7517B55" - }, - { - "Count": 776, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD90335A763A52764950DF06EEA3CD35C2CC790FE" - }, - { - "Count": 777, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD8CBACC5870E21CA12CF9ECF9A0AD25F8E62D722" - }, - { - "Count": 778, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E61FDDF2DE27138C73800055EA30C2BAE3D55F8CF" - }, - { - "Count": 779, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E4800A19BA3BD9374DAF18FAB9DD113DA6459675" - }, - { - "Count": 780, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCE7622003A9A77CBE26C7E46337218722E859D7" - }, - { - "Count": 781, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B402D6E6C34270CD6FFE3F039C6069C10462FA3" - }, - { - "Count": 782, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620C04B80D9D5F130B5AF429A858E31106B3E694A6" - }, - { - "Count": 783, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0E06EB92ECF18458E695E341A174D34106847330" - }, - { - "Count": 784, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8F9AE1926C7A2CFEE8E75B48322A2D7243B046A" - }, - { - "Count": 785, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E990286A154FD824C0C7226860A8E35E2E104E33F6" - }, - { - "Count": 786, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A7EA811051F38883176953E825994EDFC3B125F9" - }, - { - "Count": 787, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287855B37B013958CDE1072C248F648A8FCE93A8E0" - }, - { - "Count": 788, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF79194D054C01D9C5B33DF36CA11FB88968C979AF8" - }, - { - "Count": 789, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A7A503AB013C64199B4C2D5B5985207771F677B" - }, - { - "Count": 790, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CE3DFAFC3BCB29061E9B04BBE1A8E70C558881B" - }, - { - "Count": 791, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FBC8BF6AA81911865C629F0B547C993E75488E86" - }, - { - "Count": 792, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A382BC872E3EE5CDD79BBFC1A95C87E7E10880F1" - }, - { - "Count": 793, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD07ABF5BC2131433EA6269A7E1A6AA63C33CE75F6A" - }, - { - "Count": 794, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E0484A39286189C3F6339F053A1C9FB5B3BDE4D9F7" - }, - { - "Count": 795, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDF4E520B0214AF9170014C2A7122FF5A44F7C8542" - }, - { - "Count": 796, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E118AE0A6D8AF7E49AE94D92F9D484BB5AAFA25F97A" - }, - { - "Count": 797, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B383D0C7213CCB5B8D177465E62EDEAD50A757E7280" - }, - { - "Count": 798, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4CDC8681804211DE67AEF27E229AF3520700A80E1" - }, - { - "Count": 799, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B383CCD1EBDCA0C660A640C6DBE77F0D866658CD76" - }, - { - "Count": 800, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C464A7733659871400760C69E2B7C291359F16F8AF" - }, - { - "Count": 801, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F38017532B88D5A3ACA4C9EEFCC8239FE3EA2BD7E561" - }, - { - "Count": 802, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B2796A1600A3B549251FE16C4BD527FFA7F58FEB78E7" - }, - { - "Count": 803, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D8E3299E5437AA8FCD14BD8985F51F7B74DDF23FBC" - }, - { - "Count": 804, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACD54637F30093BC62D42EBB76C686067504D1994C" - }, - { - "Count": 805, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32630F916E39B36BF194984BF347402053BA19D661AD" - }, - { - "Count": 806, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC42A30CF2B90B49D030468F078A006FD7D74F865C" - }, - { - "Count": 807, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE1771E6D5A6C0FE8573D5CD99D8EB3FBD546516A2" - }, - { - "Count": 808, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079CBA9DF7248FF8FE96EE8F3EDA4B538BB974F4F6E" - }, - { - "Count": 809, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD90335A7D5CC1C4CDD7501D132F24E6430BDF69948" - }, - { - "Count": 810, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD8CBACC5C8CA35FE7F87967EBDDCB292825F6E112C" - }, - { - "Count": 811, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E61FDDF2DBBC0BCF4EC48E18EAB4C74476F7E6740C3" - }, - { - "Count": 812, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E4800A1926E23824C49D168DCB97192BB4D4C2E783" - }, - { - "Count": 813, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCE76220C64F4CA7EA94D73D0ACBC01DAA49F45CFC" - }, - { - "Count": 814, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B402D6EDD78424EC40BEE0CDAF64BA9674476E4F6" - }, - { - "Count": 815, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620C04B80D22A926AC1712C0791364BDB517511FC38C" - }, - { - "Count": 816, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0E06EB9207B1CF473E7529141D8DF4558E5CAEBABA" - }, - { - "Count": 817, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8F9AE198E523154A38755092749F56078E89247AB" - }, - { - "Count": 818, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E990286A1502C8B6C348983615D68666BFF27504D7AC" - }, - { - "Count": 819, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A7EA81107B46278A596047EBD6360C5896DEBDDDDD" - }, - { - "Count": 820, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287855B37B1EEEBB1967F01CBE989C4A6696DAE75461" - }, - { - "Count": 821, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF79194D0543E415EB61D0D45AD9EF5F69336D4ACE06A" - }, - { - "Count": 822, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A7A503A317EEFD70F0E22BEAF5F57903D156F6813" - }, - { - "Count": 823, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CE3DFAFA01980CFF29AD5D0D6E3488EE86B5E2449" - }, - { - "Count": 824, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FBC8BF6ACC1E03F0DBC425547379F8F654CD4A62DF" - }, - { - "Count": 825, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A382BC87C6A889D20AF657F269DFD143BB2F3E9E78" - }, - { - "Count": 826, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD07ABF5BC24DB6518F49190647CB245D6C6A30B3ACB0" - }, - { - "Count": 827, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E0484A3928D9A9FDA2D473E20718538F55B26ED91C13" - }, - { - "Count": 828, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDF4E520B0309E8BF124DB044C414A2E05B026D2B187" - }, - { - "Count": 829, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E118AE0A6D8D5D6EF0AFE2980BB10E9287B2D9A67BE0A" - }, - { - "Count": 830, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B383D0C72136D9EC0C05BD35FD9A37A82BE7DDB104DCE" - }, - { - "Count": 831, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4CDC8681877C96C022453C688552EEF246857893838" - }, - { - "Count": 832, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B383CCD1EB325DDE7BB08E0692E9F6DFCDED6DE6A75F" - }, - { - "Count": 833, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C464A773365DAFDC3312D143EA64AD941EC758434EE6" - }, - { - "Count": 834, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F38017532B881FB6B9E9420DC8DBC0005942DFA6CC566B" - }, - { - "Count": 835, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B2796A1600A33B008FF1DF61D8B2DEF7F8CFBD7B29F42B" - }, - { - "Count": 836, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D8E3299E549DDA9CDCE05926BD8674F06F302E728229" - }, - { - "Count": 837, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACD54637F3CCE145563058468BD87D26105710853CE9" - }, - { - "Count": 838, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32630F916E390A3C043B9A35C24B3EE9F8288C6347321E" - }, - { - "Count": 839, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC42A30CF287D86413138534DD5E89234F9E73BC4BCF" - }, - { - "Count": 840, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE1771E6D572CAFC15386636840D295B2DEBB8BB556F" - }, - { - "Count": 841, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079CBA9DF72F90AC1FC732569928383C5EAA704C6A6F6" - }, - { - "Count": 842, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD90335A7D54400B713E6235166F1F17280C02E55839A" - }, - { - "Count": 843, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD8CBACC5C8E24926E729F02F90C81D678AD07936E7ED" - }, - { - "Count": 844, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E61FDDF2DBBA8E323B5080A3859EADD360113D37BC37F" - }, - { - "Count": 845, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E4800A192694608ACDF5EC1DF043ECCDF36E7663802F" - }, - { - "Count": 846, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCE76220C6445085A673580EC869F662C5B16D9DF795" - }, - { - "Count": 847, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B402D6EDDF2AD810A342EF8C067422DC330C5D56932" - }, - { - "Count": 848, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620C04B80D2222A3B10356F011706B56A9D1F38A350A92" - }, - { - "Count": 849, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0E06EB9207A67DC9795C303EBB94A76C2EAB111AC92A" - }, - { - "Count": 850, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8F9AE198EE2615D813BD6440F30AF4727E27DB1FE94" - }, - { - "Count": 851, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E990286A15022D55E415D19D9FD057C4277D5AD1679D63" - }, - { - "Count": 852, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A7EA81107BC933E7B7490C87031C735FA85884BDEDA9" - }, - { - "Count": 853, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287855B37B1E7A3803976DE7594C5F413419639B68E421" - }, - { - "Count": 854, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF79194D0543EE847A4D4917C519DD21DB8471D4B2557A9" - }, - { - "Count": 855, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A7A503A31D8CDF11D7C3D990657AC0C42F0532931CA" - }, - { - "Count": 856, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CE3DFAFA013B275EA87E7F54229377D8AFCB9F8BDCF" - }, - { - "Count": 857, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FBC8BF6ACCB39EF28FBF83AD308C3C17864337466B76" - }, - { - "Count": 858, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A382BC87C6895C13839C67545D0C78B3138E552C5DC9" - }, - { - "Count": 859, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD07ABF5BC24D4B0B6463776A1A9CADA17E3837D80BA985" - }, - { - "Count": 860, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E0484A3928D960C65C4BF5ED32E18B177AECF72C3A43DE" - }, - { - "Count": 861, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDF4E520B030F0E17DB55F69CEE2BAC3E84B96D61BCA7C" - }, - { - "Count": 862, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E118AE0A6D8D569199645B88897C973973D87747EE64F29" - }, - { - "Count": 863, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B383D0C72136D03A89B27DAE756FAE8D6D81EC2B20B2760" - }, - { - "Count": 864, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4CDC86818777D3CBA8AA7706B2C51916AE9A784193D0C" - }, - { - "Count": 865, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B383CCD1EB322C041EDEF613939A8E9DD0BCF3201D047F" - }, - { - "Count": 866, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C464A773365D64BC8C0D9ADC9454112B89E288B4E26FA1" - }, - { - "Count": 867, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F38017532B881F2E7123401734453FFBD04C048CF30860F1" - }, - { - "Count": 868, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B2796A1600A33B9E1B051D9E20F88A78A691107BB487D3BE" - }, - { - "Count": 869, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D8E3299E549D5685C6D8D364FA293887CECC6A995938D9" - }, - { - "Count": 870, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACD54637F3CC1EA45F91470F3E10E6615B3F8A3779FE3C" - }, - { - "Count": 871, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32630F916E390A8B0FFCC801FCA801FB6ABFCB9E84519142" - }, - { - "Count": 872, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC42A30CF2877DE0D48B293743EDC353D43B32CD407CE5" - }, - { - "Count": 873, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE1771E6D572806DFF5A7066314210688F4A097D189DF5" - }, - { - "Count": 874, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079CBA9DF72F9603580F6074368CD478DB9D6E36AA34120" - }, - { - "Count": 875, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD90335A7D54452FE5C66876B3D04869763DB1B033BC4A0" - }, - { - "Count": 876, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD8CBACC5C8E2F52121F548D15FC15E101A0B394A4877D6" - }, - { - "Count": 877, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E61FDDF2DBBA8BE47D58B8FB43289DCB197D36A0B9EBCFA" - }, - { - "Count": 878, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E4800A19269418C9B805F9DA52ED7D9F6C4DFAE88F77B8" - }, - { - "Count": 879, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCE76220C6445A49785DBB81A2B1C44F80DCEEA629FDEE" - }, - { - "Count": 880, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B402D6EDDF21AFA205D4FCC418270FC3AB1AC783EFA82" - }, - { - "Count": 881, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620C04B80D2222F3D060D8FB14C459E9E40F068286AED89C" - }, - { - "Count": 882, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0E06EB9207A65279913A335D83B1A5DB7885BBCD1323EF" - }, - { - "Count": 883, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8F9AE198EE28852C150FB536782F811C392A2F89712A2" - }, - { - "Count": 884, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E990286A15022D199BF2ACEDF8B923E7F6A69FE7444E8F30" - }, - { - "Count": 885, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A7EA81107BC995F287897577054769D5F0BADE34F514DC" - }, - { - "Count": 886, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287855B37B1E7A6CA3B997EE96A90DABD9989286C4E8D14D" - }, - { - "Count": 887, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF79194D0543EE810183E54FC4D50EFC0DFA83A85D90CF63F" - }, - { - "Count": 888, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A7A503A31D8BD316AE9A9DE934313866952AB78EE9BA4" - }, - { - "Count": 889, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CE3DFAFA013A848D186A01D44F7BD001BB71D3D388140" - }, - { - "Count": 890, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FBC8BF6ACCB37FE3B4EB86802838506EAC86FCA3C4D084" - }, - { - "Count": 891, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A382BC87C6894683A1F0279175B9DFA6FE46F04129CBA1" - }, - { - "Count": 892, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD07ABF5BC24D4B1068AC7572D494E26616C9F2A8836A4C1F" - }, - { - "Count": 893, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E0484A3928D960FA982F4C2690A56260BEB39BC499DA0C73" - }, - { - "Count": 894, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDF4E520B030F045BAB689A42DCC96E8FF13E13D81204318" - }, - { - "Count": 895, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E118AE0A6D8D56905AB1B4DF7E5FB1582C968A0A45B700DF0" - }, - { - "Count": 896, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B383D0C72136D03F86B66D86DBC8CC358D577182AA0FC1C23" - }, - { - "Count": 897, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4CDC86818777D4716A1861973CAEBF1674FCF3C01D78EB5" - }, - { - "Count": 898, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B383CCD1EB322C09CE3D12073A0A50117C03C207E43532C5" - }, - { - "Count": 899, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C464A773365D6435E0D026549E6A7F8F9813FB7E73BEFE04" - }, - { - "Count": 900, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F38017532B881F2E2F7A83855CC341468CE5C935EA80C3BF24" - }, - { - "Count": 901, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B2796A1600A33B9EC9BF3322E713880018C78F61BC779860FA" - }, - { - "Count": 902, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D8E3299E549D56B516F3B5F2D43C56C2284932F64801B4F5" - }, - { - "Count": 903, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACD54637F3CC1EDC58E80F9E1546C17D56DFECFDC9BCD031" - }, - { - "Count": 904, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32630F916E390A8BDE3BCAA3E77B0A6B67E45C7469DB543125" - }, - { - "Count": 905, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC42A30CF2877D82C03603D6B1208A9815752B5C36CA9A15" - }, - { - "Count": 906, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE1771E6D572807724A7D7215B61B7BC475045346846A645" - }, - { - "Count": 907, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079CBA9DF72F9608F2208EF57E609A2F12BFC80A3A6E39C73" - }, - { - "Count": 908, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD90335A7D5445282844DA492B2123E59780B81308E831F69" - }, - { - "Count": 909, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD8CBACC5C8E2F5BFEA05FCBF3343042DC8D9F98827860BD5" - }, - { - "Count": 910, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E61FDDF2DBBA8BE19EB23C100D6805D097A74E5B183D4C7D1" - }, - { - "Count": 911, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E4800A192694186269FADC18A2BB0AD4690097EAF62528BB" - }, - { - "Count": 912, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCE76220C6445ACE9DACC6E4B1CFB5ED2F558BABA79DE470" - }, - { - "Count": 913, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B402D6EDDF21AFFF1B3A9518FB871EEE6AF6932D6906377" - }, - { - "Count": 914, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620C04B80D2222F3FD71A2057C10F3A84A7FAB97D0DBC5EE5E" - }, - { - "Count": 915, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0E06EB9207A652E7FCB2AC29413C8138B58B6CBF4EB2D0BF" - }, - { - "Count": 916, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8F9AE198EE28852F026CE1DFE1DD4004FD3EBF4DD77D25C" - }, - { - "Count": 917, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E990286A15022D19BCAEF742F0EDD4B6DA2094BFD98FB794CB" - }, - { - "Count": 918, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A7EA81107BC995DCA92B6351795301A2ACBAA7B5B7675F0F" - }, - { - "Count": 919, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287855B37B1E7A6CEAEF2B4D17ECB70119D723D11898F76343" - }, - { - "Count": 920, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF79194D0543EE810F7B6AED63716975BA8FCA49CAB7BAE7AE9" - }, - { - "Count": 921, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A7A503A31D8BD45E062F4317BD10E487BD0C408EABC2459" - }, - { - "Count": 922, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CE3DFAFA013A85DC4EACF08CE6675665D76495882EE4CA5" - }, - { - "Count": 923, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FBC8BF6ACCB37F433450D075DDFB611373FF6FEA3C2ACA62" - }, - { - "Count": 924, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A382BC87C68946D89A1A3F0DB75EEA413D3D6634D5D6EEA7" - }, - { - "Count": 925, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD07ABF5BC24D4B1046185C599AFFE88D19C6DD37265F1AF754" - }, - { - "Count": 926, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E0484A3928D960FA38ACAFB5655E81E1AFE98367F56299CCF3" - }, - { - "Count": 927, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDF4E520B030F0452C9B187E00B4105A65461D86A7B27611CF" - }, - { - "Count": 928, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E118AE0A6D8D5690501224E5810CBB650EE84E31B3BAA228834" - }, - { - "Count": 929, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B383D0C72136D03F817D033C06BF5DF88909E301F56E139CA3E" - }, - { - "Count": 930, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4CDC86818777D47AF60FFC7748756B0B9211A7987EC310D0D" - }, - { - "Count": 931, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B383CCD1EB322C0989B82462DE747BA66E66B06258B63F46EE" - }, - { - "Count": 932, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C464A773365D64357633F13618D1346BCE2A047F62C5CF8C42" - }, - { - "Count": 933, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F38017532B881F2E2F395AADAE4391729D7B20F36BF08A2C510A" - }, - { - "Count": 934, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B2796A1600A33B9EC9132AB7CFBDB927E8BEE866AAE43508546F" - }, - { - "Count": 935, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D8E3299E549D56B529C8DA7599B57313A434861F73ECF9CB78" - }, - { - "Count": 936, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACD54637F3CC1EDCCA4F65D2FC5DB43A0C4FBF6CDE7E82B1D2" - }, - { - "Count": 937, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32630F916E390A8BDE8EBB8A7B70C445BF87BFB3E20A4A697200" - }, - { - "Count": 938, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC42A30CF2877D8282F39DC9468594B78ABCA0E359077FC7F1" - }, - { - "Count": 939, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE1771E6D5728077514449240C65ED1228A15907E7E17CB59E" - }, - { - "Count": 940, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079CBA9DF72F9608F16B981BE3D09AF7195B8206CCAC91C138B" - }, - { - "Count": 941, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD90335A7D54452823CF0A6E84B247EB5BED7736B67DA36709D" - }, - { - "Count": 942, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD8CBACC5C8E2F5BF5CCA1D5311CE71ED5B4B585496012BEF84" - }, - { - "Count": 943, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E61FDDF2DBBA8BE1960F4FED001B97C3BB2AB65A4AD03D322B6" - }, - { - "Count": 944, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E4800A1926941862552006A11720220DDCFB9D942E3C8FD143" - }, - { - "Count": 945, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCE76220C6445ACEB14F4BBF4C24D63E8B9C5EA91D77148FCB" - }, - { - "Count": 946, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B402D6EDDF21AFF6F5514AE3F9FD530341DC33B56E2A4D1EA" - }, - { - "Count": 947, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620C04B80D2222F3FD15E882D48CC4A8FF1D47070F2F469851C1" - }, - { - "Count": 948, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0E06EB9207A652E7379AC4A358DA46AB05129C0194BFD4C3F0" - }, - { - "Count": 949, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8F9AE198EE288529CC4713945E08281927AEDA05695E74890" - }, - { - "Count": 950, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E990286A15022D19BCB0D19E84456EE133AB937B47DB0722DB49" - }, - { - "Count": 951, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A7EA81107BC995DCA12BC86B33D1A772042E642EBEB37AFBF5" - }, - { - "Count": 952, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287855B37B1E7A6CEAE06EAE77FA02F002C081B5AE8955D7ACC7" - }, - { - "Count": 953, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF79194D0543EE810F7FE825D47BEDCC50D34407C45928EBD3500" - }, - { - "Count": 954, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A7A503A31D8BD450C4A6673D6D077DF0BBEEB67FAB5A6569A" - }, - { - "Count": 955, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CE3DFAFA013A85D28DF0EA7EB6598B1BC83952B4AC88FE54A" - }, - { - "Count": 956, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FBC8BF6ACCB37F430F6277BB3FB7441598EFFD7961A2350350" - }, - { - "Count": 957, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A382BC87C68946D86ACB06AC88217860EB2308B2F349003232" - }, - { - "Count": 958, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD07ABF5BC24D4B104645800F01808EBFA1440A96E037C88566A3" - }, - { - "Count": 959, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E0484A3928D960FA38E66F276CD6DCACA24127E68C45488A08AA" - }, - { - "Count": 960, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDF4E520B030F0452CFF46413A77787E1AD5BA3889F949559C00" - }, - { - "Count": 961, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E118AE0A6D8D56905018F735EBC768F842EF1FA093908DAAC730D" - }, - { - "Count": 962, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B383D0C72136D03F8179EA4E3D0B8666BB78944BF0D225ED779A3" - }, - { - "Count": 963, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4CDC86818777D47AF8C192375915D096637EDB2D227ABF9BF9B" - }, - { - "Count": 964, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B383CCD1EB322C0989C02B32D259DF542381D93EFD16E7F18AD4" - }, - { - "Count": 965, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C464A773365D643576F640CAF55A7159C6CB090E04AA4FB6E449" - }, - { - "Count": 966, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F38017532B881F2E2F3947514F713D3C6F97B77821F878E57B1676" - }, - { - "Count": 967, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B2796A1600A33B9EC9139AE1694D5CF53ED9BA6B020EEEC1DE9804" - }, - { - "Count": 968, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D8E3299E549D56B5294B419A2E46DE70ADDB782D24A7F34F215F" - }, - { - "Count": 969, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACD54637F3CC1EDCCA13DAEFCA4C1D6D4EF01F3294236CF405F4" - }, - { - "Count": 970, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32630F916E390A8BDE8EE46B357F2B35C798E8DC5B504649A6D631" - }, - { - "Count": 971, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC42A30CF2877D82822492E7B58AAC418033C5BB52F58DD73763" - }, - { - "Count": 972, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE1771E6D572807751970BC90E2E1F7D8FFF894FAE8AEB30A3FC" - }, - { - "Count": 973, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079CBA9DF72F9608F16516F5E2C34DCB176F09220296DAD041FD3" - }, - { - "Count": 974, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD90335A7D54452823CE0B2339DBFFE69F6938771785AB9551549" - }, - { - "Count": 975, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD8CBACC5C8E2F5BF5C999156561A7C7002DD8107706DE032A26F" - }, - { - "Count": 976, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E61FDDF2DBBA8BE196038D35B9EF66313478A660C11707E8365BD" - }, - { - "Count": 977, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E4800A19269418625516EE411700FF2650AB20D5E25B56A29435" - }, - { - "Count": 978, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCE76220C6445ACEB12B207DE5FCF12E433A17B61B0454A9F621" - }, - { - "Count": 979, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B402D6EDDF21AFF6F693465B9010EE415D71B71A4C5718129D4" - }, - { - "Count": 980, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620C04B80D2222F3FD151FEB364F47CA67A3284B8415A67141FD5F" - }, - { - "Count": 981, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0E06EB9207A652E737EB90056CC8AA696349C871D33EFE71F100" - }, - { - "Count": 982, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8F9AE198EE288529C9194965855DE6FF331649A3DC80179DDD9" - }, - { - "Count": 983, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E990286A15022D19BCB04F38288CE68BF3192E8E3184EDCA7A979A" - }, - { - "Count": 984, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A7EA81107BC995DCA17A743542AF16F677763237400FA14D4DF0" - }, - { - "Count": 985, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287855B37B1E7A6CEAE0B2D3BEA049177F36C00FDF52C5BD3ADCF7" - }, - { - "Count": 986, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF79194D0543EE810F7FEC0B08F44042AC5BAD6760AF378DA5DA639" - }, - { - "Count": 987, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A7A503A31D8BD450CDB184F8AD184FAD96BAA1DB823418AE689" - }, - { - "Count": 988, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CE3DFAFA013A85D28A9BDC2882AB5FF47B0AE82C3977F0A9C93" - }, - { - "Count": 989, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FBC8BF6ACCB37F430FE3EFDA5CC1F6DADCB00D482F2A9748223A" - }, - { - "Count": 990, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A382BC87C68946D86A924D7C51C4C3908E396ED643E5F466C516" - }, - { - "Count": 991, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD07ABF5BC24D4B10464571A33C956410BADF70B1AF7ED1E3703692" - }, - { - "Count": 992, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E0484A3928D960FA38E61FEEDE375A44DE8F52F70861837CD83025" - }, - { - "Count": 993, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDF4E520B030F0452CFFFD1DF66C3030A090E3A098A5873C3C9924" - }, - { - "Count": 994, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E118AE0A6D8D56905018F24EE885DF87525632985568B25F26A8620" - }, - { - "Count": 995, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B383D0C72136D03F8179E94846904F5EB2B2547D615AE8C9B205363" - }, - { - "Count": 996, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4CDC86818777D47AF8CBDE83AA0BC603BD5B25958790BD9F5AF07" - }, - { - "Count": 997, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B383CCD1EB322C0989C0A47F3FB3F822DE5E05063F919281B83B3A" - }, - { - "Count": 998, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C464A773365D643576F680C8DFCFD04CAE21ABB2615CA1B8CB7759" - }, - { - "Count": 999, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F38017532B881F2E2F3947AFE08F1FAF2093F4EC3D38A96E6A20C37C" - }, - { - "Count": 1000, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B2796A1600A33B9EC9139A7816AE17D3FF24CC13BF432300348CEC0D" - }, - { - "Count": 1001, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D8E3299E549D56B5294BFC5D8A8E3C4CEC5F0F61C746C039131880" - }, - { - "Count": 1002, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACD54637F3CC1EDCCA133EFB6B9166F398FD1240647F40A38C5CA7" - }, - { - "Count": 1003, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32630F916E390A8BDE8EE4809F03B7969CD912BE0000ADA6846C7D48" - }, - { - "Count": 1004, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC42A30CF2877D828224EC581134D208C5457407369951425318DC" - }, - { - "Count": 1005, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE1771E6D572807751970BD0F36969C4342BC14B4C1B52685A3AD1" - }, - { - "Count": 1006, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079CBA9DF72F9608F16517B91354CAD4D8EBA123065CE9B1BA29255" - }, - { - "Count": 1007, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD90335A7D54452823CE00087F53322F0D01BA499D905E3086ECFEB" - }, - { - "Count": 1008, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD8CBACC5C8E2F5BF5C995EED6B8F1DF639A87D96F7149C5326E3C0" - }, - { - "Count": 1009, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E61FDDF2DBBA8BE1960383B0DEEFE8D3EDEB3382861639F50EE063D" - }, - { - "Count": 1010, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E4800A1926941862551635CF72AF11BF11385743F764D90C0CA82A" - }, - { - "Count": 1011, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCE76220C6445ACEB12B2D5A0B10FF1393C89F46E3D71F2A5E0B41" - }, - { - "Count": 1012, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B402D6EDDF21AFF6F69998C26692E04F00DAB9F6B22D9E72BA7D3" - }, - { - "Count": 1013, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620C04B80D2222F3FD151FFF3B8D8E6C8AF8E1889A97ACB9C728CEB8" - }, - { - "Count": 1014, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0E06EB9207A652E737EB5BF7E9B8D1DB7604EDA2842FBBF0BF6516" - }, - { - "Count": 1015, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8F9AE198EE288529C91398DD44FBFB4E03E06571ED1CA3F1C20A8" - }, - { - "Count": 1016, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E990286A15022D19BCB04F38C6A57DFB2CAA4D6EFC7CAC8BE5FAAEEE" - }, - { - "Count": 1017, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A7EA81107BC995DCA17AB7025BD17F2623D7F8EE8EFE5A5500B829" - }, - { - "Count": 1018, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287855B37B1E7A6CEAE0B22FFF8ABFB52EA326D7AA3D83406D349523" - }, - { - "Count": 1019, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF79194D0543EE810F7FEC062603741565B67C076F4A1A74236D90ECF" - }, - { - "Count": 1020, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A7A503A31D8BD450CDB27038DE0C21775334FEFDF08D563787226" - }, - { - "Count": 1021, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CE3DFAFA013A85D28A9278EA35E4825F29340B7396B79B07B68F8" - }, - { - "Count": 1022, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FBC8BF6ACCB37F430FE3A696965D853ABE2C14F496CE389E59587C" - }, - { - "Count": 1023, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A382BC87C68946D86A921DD47969AD241B0F9ABA9E7F15B467E755" - }, - { - "Count": 1024, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD07ABF5BC24D4B104645717C52960C71DCC79BC5EFFFF314E0D09CF6" - }, - { - "Count": 1025, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E0484A3928D960FA38E61F76BB4E612B91892B7C382B924E607C8433" - }, - { - "Count": 1026, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDF4E520B030F0452CFFFD9C66219CCB871F827A13D6C88A2DE49BB0" - }, - { - "Count": 1027, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E118AE0A6D8D56905018F247F471312CECB2AB4C900AE346DC671AFE7" - }, - { - "Count": 1028, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B383D0C72136D03F8179E9458479119C4A2D0981939CA4F4E7B54453B" - }, - { - "Count": 1029, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4CDC86818777D47AF8CBDAB5AF639C25277FD5A1623F4AC3FCEC80E" - }, - { - "Count": 1030, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B383CCD1EB322C0989C0A400476DD185BE2EC6FDF517A042AFFAB6A7" - }, - { - "Count": 1031, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C464A773365D643576F680581D6D2850A7E9E356696C134C9CB708E8" - }, - { - "Count": 1032, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F38017532B881F2E2F3947AF8E1F27D676A77D16F02510333C86AF5D2F" - }, - { - "Count": 1033, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B2796A1600A33B9EC9139A784CCD1063CC8EE284590D1AA0CBA0DE4F24" - }, - { - "Count": 1034, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D8E3299E549D56B5294BFC5AC8D7BDCDD50E57D869021FC51DD06E87" - }, - { - "Count": 1035, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACD54637F3CC1EDCCA133E9631096CB636B61FFF5058D16F0E114FB8" - }, - { - "Count": 1036, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32630F916E390A8BDE8EE480020B8AD54981F32308F51772BE7ECF5499" - }, - { - "Count": 1037, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC42A30CF2877D828224ECBF6908750C6D8D9CB2DB39C89FC116D5B9" - }, - { - "Count": 1038, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE1771E6D572807751970B81E2F72503F47AC2DB8A97E3BA793E6B6B" - }, - { - "Count": 1039, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079CBA9DF72F9608F16517BA9647FDC43648017D2B01B0AC920C8809D" - }, - { - "Count": 1040, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD90335A7D54452823CE000E439912B652CBD3C21479C323BFB6FFFD7" - }, - { - "Count": 1041, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD8CBACC5C8E2F5BF5C995EF2BC0FA1677F992B205EA248F130236398" - }, - { - "Count": 1042, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E61FDDF2DBBA8BE1960383B706B46586BEAC7E75858A5FC728DFA2B7C" - }, - { - "Count": 1043, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E4800A1926941862551635FD5E65783E01D35A4F1970946CCCB74EFB" - }, - { - "Count": 1044, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCE76220C6445ACEB12B2DF712EB7E0EB89B3352212EDB7FD20E9D73" - }, - { - "Count": 1045, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B402D6EDDF21AFF6F6999E3B1E29E711B6E7F7CC2C0245236F29BDA" - }, - { - "Count": 1046, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620C04B80D2222F3FD151FFF01717F5A7DCED56298609910521143DC12" - }, - { - "Count": 1047, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0E06EB9207A652E737EB5B00F617AA580298BC1B719A7A79C49862A3" - }, - { - "Count": 1048, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8F9AE198EE288529C9139000036D49112745977774552B4B9939F92" - }, - { - "Count": 1049, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E990286A15022D19BCB04F38EF40F29B92AD3801E9D82916BCE71E8869" - }, - { - "Count": 1050, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A7EA81107BC995DCA17AB7B07DBF9FF4A0F93FA536AC4E73B756977B" - }, - { - "Count": 1051, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287855B37B1E7A6CEAE0B22FDC6A20A54F90AB2E30E6D818CB8D362C03" - }, - { - "Count": 1052, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF79194D0543EE810F7FEC06284B3206228A5BACAD8B69A79FE55121D3D" - }, - { - "Count": 1053, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A7A503A31D8BD450CDB2709D267FC5A305BA32218F5AA6934BBB613" - }, - { - "Count": 1054, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CE3DFAFA013A85D28A927EE3CE4E137103D020CE429499864BC6CA0" - }, - { - "Count": 1055, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FBC8BF6ACCB37F430FE3A609FC62CB8C029E4E4406D437CDF5EA4D6A" - }, - { - "Count": 1056, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A382BC87C68946D86A921DD8D512C20775E27C66BEBBFE27460BC467" - }, - { - "Count": 1057, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "", - "CT": "6E490CFED5B3546767350CD83C4ACFBD4CFB4BD07ABF5BC24D4B104645717C1E513ABFD1335ACFD296C49A35E0D54B73" - }, - { - "Count": 1058, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "00", - "CT": "E92D2A65CEE9727FB2FCCA9A72BF781E615804E0484A3928D960FA38E61F76D5124A982608C3FA36F4DF11D1FF2CE8C2" - }, - { - "Count": 1059, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "0001", - "CT": "ABE4E02C2714C0BA4ABE67997F5B2A079BDF60BDF4E520B030F0452CFFFD9C954E45B0FA37373C44F7347B7385112E10" - }, - { - "Count": 1060, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102", - "CT": "DB7F7C248EE277F2F4D0826A018AF6164FA16E118AE0A6D8D56905018F247F5FBBC77152BDFE688E149165CBE4D3FBB2" - }, - { - "Count": 1061, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "00010203", - "CT": "D21BED6E930728BF2CF7BB419E2AAA6B483F2B383D0C72136D03F8179E9458586C9CCF95D78CABB25780603594153D62" - }, - { - "Count": 1062, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "0001020304", - "CT": "0EE0ACB81FDA0513BB494134956A5B2A9E4568A4CDC86818777D47AF8CBDAB49BE9530B783D5439E459A4E23ECC17778" - }, - { - "Count": 1063, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405", - "CT": "2657528373738D8FE8430FC2D10DE22AEF3804B383CCD1EB322C0989C0A4002B888B9021D7121526D0BB1C7EE7F0CA6A" - }, - { - "Count": 1064, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "00010203040506", - "CT": "AFF7DBF30937297136CC8C2600283E0CB52549C464A773365D643576F68058147BA4B92DAAC7F4FA438EC9A6BF431F7B" - }, - { - "Count": 1065, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "0001020304050607", - "CT": "34D3B7EDB89B1D5067C4EC9EB8052962E581F38017532B881F2E2F3947AF8E20ECDD28B8873F384F6F35DAAF7A5847B2" - }, - { - "Count": 1066, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708", - "CT": "DF4B3A7282D646F3C994BF84C39D6C704CE8B2796A1600A33B9EC9139A784C3B7CC026E3928BBE7F8B7AFA9EB65563AC" - }, - { - "Count": 1067, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "00010203040506070809", - "CT": "89A046EBA7F23493680E947185EE4B044B30B0D8E3299E549D56B5294BFC5A13A9D043258A01F87B66C16F0AC435F537" - }, - { - "Count": 1068, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A", - "CT": "C52E4E39F5EF9F8461912AED7ABBA1B8EB8AD7ACD54637F3CC1EDCCA133E968120F5BE8C6876A8C5638ABB4757462825" - }, - { - "Count": 1069, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B", - "CT": "7B9D9E5908E301EA36D496F1A5E86A2C462D32630F916E390A8BDE8EE48002CAF97CD746B2625B9CA2114580922CDD8C" - }, - { - "Count": 1070, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C", - "CT": "3D28BE50FA5A7E6464F2F12E97DECCD1E7585CDC42A30CF2877D828224ECBF67ED335F3C306B62C582BBFE85B4BF0107" - }, - { - "Count": 1071, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D", - "CT": "2C568ABF38EEE291152D9C9B1B69DC935DBAEADE1771E6D572807751970B81EA4AE4E2D65A358336DEAD1651AB21C63E" - }, - { - "Count": 1072, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "8DA2ED95D643524AC99A1BBB2294939B6D89E079CBA9DF72F9608F16517BA96E417DD3B9B6CFFCDFAE172B71C445C62A" - }, - { - "Count": 1073, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "52499AC9C84323A4AE24EAECCF45C1379B2DEAD90335A7D54452823CE000E4445CF880605D0353B9840A606B6502A6AC" - }, - { - "Count": 1074, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "BC26A071C86E16AD251FD2AD8D3139F43BEDCFD8CBACC5C8E2F5BF5C995EF2B013E624B646BF32552615B8A6CB0DA908" - }, - { - "Count": 1075, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "8B1DFDE583979EA8CEA3016E70C51DF7C7EC1E61FDDF2DBBA8BE1960383B703AD55750F27A98C3CEC41898EDF85CD6F0" - }, - { - "Count": 1076, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "B7534C82A8D1D5B6B6D327FA143141478B1139E4800A1926941862551635FDF52E585EAF589624C49D47F1068465C3E7" - }, - { - "Count": 1077, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "21D5926CA563C1F02C412FA0659CC8241AA513DCE76220C6445ACEB12B2DF742ED013DE502FA9CB4DA4C2FA53244CFF2" - }, - { - "Count": 1078, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "F8BEFF5A1C7BC7D93E345D30157D45C4CD71EF1B402D6EDDF21AFF6F6999E3FF4272021B867EFEFC388EFF204A8E2F79" - }, - { - "Count": 1079, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "26987D72744F07FFE1FE36DC077891A9EDBB620C04B80D2222F3FD151FFF0128E52BA5C372B4E4D63E1BE38136D0723B" - }, - { - "Count": 1080, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "DF716D442F4687D799F37F31297FE28E2880CE0E06EB9207A652E737EB5B002E9BDF9D361A9111CA4E0E37A1EACDB1BD" - }, - { - "Count": 1081, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "8E2F9F14257FC5F035225857D43DCADA7F3C74B8F9AE198EE288529C913900329FF6F13A37B363863915A2876621A0AA" - }, - { - "Count": 1082, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "1C227DA5F60F2BFE9ECE455FE298FDF676F2E990286A15022D19BCB04F38EFB76280393708844E4D4DF5037CB2142400" - }, - { - "Count": 1083, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "4EB38CA12598B2938C03BF6AD53770F7C46204A7EA81107BC995DCA17AB7B0B0C25CD104BC9342B20443E99980303803" - }, - { - "Count": 1084, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "345300842A2AB4254006AA0F0A5084CA7571287855B37B1E7A6CEAE0B22FDC64180C76C82F6DB364B28886D3798AEF12" - }, - { - "Count": 1085, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "DE43A5638FAC91EAAC879C8C5B8507D17B3CF79194D0543EE810F7FEC062842275CCDF0B1E76FF7E568164ACB003AF76" - }, - { - "Count": 1086, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "49BA7CEE1D826B9E1AC3F94AC70CD84CFE94DD6A7A503A31D8BD450CDB27094B6780326B358D6562A38DBE136174C55A" - }, - { - "Count": 1087, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "87597417E04E3564B35677ECCF4A4628886E151CE3DFAFA013A85D28A927EEA724268B4999090242B73B841A15FDDBAC" - }, - { - "Count": 1088, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "F84455A163C0152FFFF4121A9A3A283C33A315FBC8BF6ACCB37F430FE3A6090F444655C59BAD111DA2EA475C50832CB0" - }, - { - "Count": 1089, - "Key": "000102030405060708090A0B0C0D0E0F", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "A55236AC020DBDA74CE6CCD10C68C4D8514450A382BC87C68946D86A921DD88E2ADDDFBBE77D4112830E01960B9D38D5" - } -] diff --git a/cipher/ascon/testdata/Ascon80pq.json b/cipher/ascon/testdata/Ascon80pq.json deleted file mode 100644 index 52efef38..00000000 --- a/cipher/ascon/testdata/Ascon80pq.json +++ /dev/null @@ -1,8714 +0,0 @@ -[ - { - "Count": 1, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "", - "CT": "ABB688EFA0B9D56B33277A2C97D2146B" - }, - { - "Count": 2, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "00", - "CT": "A259D760E87B0CA73002C3A01E69B567" - }, - { - "Count": 3, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "0001", - "CT": "6814DFCCE2DD955E890D49663D499061" - }, - { - "Count": 4, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102", - "CT": "FBFEE958A2CCA9BFEEEB7E32C3086CE9" - }, - { - "Count": 5, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "00010203", - "CT": "998DC6C464FC3E5F8241766A7094738A" - }, - { - "Count": 6, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "0001020304", - "CT": "FB572963099DAA84FD2BDA636F4AB357" - }, - { - "Count": 7, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405", - "CT": "94559966FB3A89C426F098461993F21A" - }, - { - "Count": 8, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "00010203040506", - "CT": "5C06310C003E06EBECC2F31A833CB925" - }, - { - "Count": 9, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "0001020304050607", - "CT": "D80B5C5C8FA97EE33D916C61772B2E23" - }, - { - "Count": 10, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708", - "CT": "78175DB8467D5732C97E7A6A67D847B8" - }, - { - "Count": 11, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "00010203040506070809", - "CT": "CAC9DEC54A97F5A1871E1739843C7F4A" - }, - { - "Count": 12, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A", - "CT": "786A870C0F80971B24D9CB22EAEB30B5" - }, - { - "Count": 13, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B", - "CT": "BE52A39ACC510D3449190B2772AAEAC7" - }, - { - "Count": 14, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C", - "CT": "828EB44BFB61E7E576F9A15A0F840B4C" - }, - { - "Count": 15, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D", - "CT": "57E5A51FDEEA8C4B293115439C818D75" - }, - { - "Count": 16, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "DD29BF8DEC1F8235D464D67D4C1032C3" - }, - { - "Count": 17, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "B59E1CFBDB3EF7C32BCD3B8818074A90" - }, - { - "Count": 18, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "56726CE502528807D7F85C2E1CBE386B" - }, - { - "Count": 19, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "748CB57966E123DB191255C80F5B8E1A" - }, - { - "Count": 20, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "C3068619D2F459EDE27C3F423773EAA5" - }, - { - "Count": 21, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "F58AA2E694FE3AD8915C76FF136B509E" - }, - { - "Count": 22, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "D07055DC65420A7A8F7E9D36CC70238B" - }, - { - "Count": 23, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "3D1A7595F83946A7FB1C069E92390D33" - }, - { - "Count": 24, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "8814470E4B0FB6EFCBB37E1A1E7B3065" - }, - { - "Count": 25, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "D24BA7801541777269B6081C97BF082B" - }, - { - "Count": 26, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "AA4EB234B93067645CB0D5D0ABA5925D" - }, - { - "Count": 27, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "D8C94D1578EC4E08A15FE829A9A34FAE" - }, - { - "Count": 28, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "609B21BCA90157C5F1E7ED83ABC4C6C6" - }, - { - "Count": 29, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "F68E9C204CF6BACEE2259A1957A18EC7" - }, - { - "Count": 30, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "E4AA4D057E98865B93B0A684BE5DFD5C" - }, - { - "Count": 31, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "E7A476954899BB5B0DD5BAA0FDDF8578" - }, - { - "Count": 32, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "547587A6FA65D730C2E48BCE79194EC6" - }, - { - "Count": 33, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "46CF5EA5306FCF255C61F5EEB6373B80" - }, - { - "Count": 34, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "", - "CT": "28AA80FFF4CA3AF32F60EBCAF63A4CCAB7" - }, - { - "Count": 35, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "00", - "CT": "A923553474FF995842ECCDC66E0BCA3D45" - }, - { - "Count": 36, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "0001", - "CT": "6244EE6ACFE9E3C9924BB64F33BD4C1BFD" - }, - { - "Count": 37, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102", - "CT": "49F92722BBAB48A96F5E2D31A72AD20CE3" - }, - { - "Count": 38, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "00010203", - "CT": "898AB63051F172DAF57873FCBF242946B7" - }, - { - "Count": 39, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "0001020304", - "CT": "19D9A2824912F2986C3C40D5FFBD4EC548" - }, - { - "Count": 40, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405", - "CT": "4DC89E9CBE835A4753870FE52CE00F698F" - }, - { - "Count": 41, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "00010203040506", - "CT": "4F5156133FC322E9AAA2A696C4AA6F3B2E" - }, - { - "Count": 42, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "0001020304050607", - "CT": "E1701C9E900DEE72AE3D4CCDC111582787" - }, - { - "Count": 43, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708", - "CT": "A4436BA308C0FECE78B4D7BD0A9092745C" - }, - { - "Count": 44, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "00010203040506070809", - "CT": "2A84B0A8C06D0C83CB46114454BCB006D1" - }, - { - "Count": 45, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A", - "CT": "3635A87CFF495383B0798209B0670F943D" - }, - { - "Count": 46, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B", - "CT": "324C51751D716BBEC48FF4D1BFEEAD7308" - }, - { - "Count": 47, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C", - "CT": "5E5F9846ACA6BE1AB53165556F7D22DD2C" - }, - { - "Count": 48, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D", - "CT": "12AD9BDE8DD2254BB513D6D6155F5B6453" - }, - { - "Count": 49, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CB379C61D31635CA7ED305797C1C5112D3" - }, - { - "Count": 50, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DFC00BC1070CDDD5EC4EA07EB7BCDFF52" - }, - { - "Count": 51, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "39E6EE3F7A8A072C344F2A2EF2BAF75FA2" - }, - { - "Count": 52, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "18BC3E6AEBD348824D3C79C07DA3655AC3" - }, - { - "Count": 53, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E64252DA030C468024015FAA3BE3BA6CC" - }, - { - "Count": 54, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "828D4A219D9BBAEC7FDEBD4161A87068E8" - }, - { - "Count": 55, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "505FFB7AFEB631BF1616C62834C582A9EE" - }, - { - "Count": 56, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E292A8AAF8AC991459D1BE726353B05E0D" - }, - { - "Count": 57, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40E8CBDCA781CBACA1F01CBDFAAA48163D" - }, - { - "Count": 58, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20927552102D50E0C2C2C999B5595D6B73" - }, - { - "Count": 59, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "6552AA28F18A42B8A8FC268DD506E2557E" - }, - { - "Count": 60, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A424761724167AD95C73CB398B756F4F9B" - }, - { - "Count": 61, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00C3356B1905DAE3884E3CB684885F4815" - }, - { - "Count": 62, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "719115C9120B7C6E3407B1F37E4D36F025" - }, - { - "Count": 63, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D9E2313539168BA61C18D38AAA1508101" - }, - { - "Count": 64, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2E58E79AC36919F3CCC2FCB42E2D0195B" - }, - { - "Count": 65, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6CC618AE7A531AA5977439C4658F9C5173" - }, - { - "Count": 66, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CCA9253BCF9E509130DF183FF6A33B9E5D" - }, - { - "Count": 67, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "", - "CT": "2846798D04B1E591CBCDF30DBF58D268A69A" - }, - { - "Count": 68, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "00", - "CT": "A96A60CB8D9F9BE0D28DBC0AF213535780BC" - }, - { - "Count": 69, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "0001", - "CT": "623FFF2C0FB416236E91C36D37E4F0A8F2BC" - }, - { - "Count": 70, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102", - "CT": "494446456110F999D9385AAA7143E63609A8" - }, - { - "Count": 71, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "00010203", - "CT": "8987EE629EFBFC1C87CECDF9BB4CD04C44AE" - }, - { - "Count": 72, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "0001020304", - "CT": "197363429521F2E1069886D644594159154F" - }, - { - "Count": 73, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405", - "CT": "4DDB222ECC71417A93FA0FE48FE6EE127475" - }, - { - "Count": 74, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "00010203040506", - "CT": "4F59E841F33BDB6042E95492B717F6C2E51C" - }, - { - "Count": 75, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "0001020304050607", - "CT": "E16CD95F3E488228C4B7689867B46EA65AA9" - }, - { - "Count": 76, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708", - "CT": "A4C1BC161076B0E8B41FD02C1F909842DEB6" - }, - { - "Count": 77, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "00010203040506070809", - "CT": "2A706E722A5BA911AB42DEA01F10487EFDF7" - }, - { - "Count": 78, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A", - "CT": "368DAA6577801C6E2DE560E8B7EB2A506B09" - }, - { - "Count": 79, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B", - "CT": "325159552EEDA23B8DB7DB493491BE6A7A36" - }, - { - "Count": 80, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C", - "CT": "5E2489D5CD988486A9AD8DA2B910D8A251BA" - }, - { - "Count": 81, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C3921DE17C395037FF2C29B892DD0FFF9A" - }, - { - "Count": 82, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCB06BE255038661176A8A3D0809F54FF30" - }, - { - "Count": 83, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB976E230869C9754BAAF85F8F37907BAAB" - }, - { - "Count": 84, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393EFCF3BED4E1AA1DA1E87629066DDB6BA8" - }, - { - "Count": 85, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E904CB319AFB533CFA036D0CAEBD655AA" - }, - { - "Count": 86, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E808FDC923548A26EC5F01B0AE7A7117BF1" - }, - { - "Count": 87, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "82780CD00A6BD8A3E806F6C3F7E323F84181" - }, - { - "Count": 88, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BC9122107A27D59AAB902F2C9252F2ED9E" - }, - { - "Count": 89, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A556F256C2745D49FD520E979A749E59E5" - }, - { - "Count": 90, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F919C3CA9DDBF7AD92BB75C401A7696995" - }, - { - "Count": 91, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D867D0E052F57B0FC7987986E4A18B2052" - }, - { - "Count": 92, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B8E85DD8095AA575771352086C590F281" - }, - { - "Count": 93, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FC9D0C13F1F1FF761DB744984F03074357" - }, - { - "Count": 94, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1CCA4CDF6957404DB4B63013B62EC9189" - }, - { - "Count": 95, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D398FAECE7C90C3E23054CD4E18F8C4011" - }, - { - "Count": 96, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4D9D5E8197B06153FA78BBDCDB410F6AB3" - }, - { - "Count": 97, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CBEF1A169E4889FED8B4767F3070B183F7" - }, - { - "Count": 98, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C457EB399F863C478BC1A29FB4670EE2341" - }, - { - "Count": 99, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4EF0C0501C3A8B14188323938FCA4DE54D" - }, - { - "Count": 100, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "", - "CT": "284641C6DEE4BE955F1CEC31B5DFDCD6EA6DFD" - }, - { - "Count": 101, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "00", - "CT": "A96AE98F3530921ECF2B722DA939CE52CA8249" - }, - { - "Count": 102, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "0001", - "CT": "623F4DD4C29248FBE8BB0E3D43EA8BDAE23115" - }, - { - "Count": 103, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102", - "CT": "4944500B96A8D0E1B7F440F08CBCE8237FA5AA" - }, - { - "Count": 104, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "00010203", - "CT": "89870221E7BD441ADE8392DBCBF39200ABCE4E" - }, - { - "Count": 105, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "0001020304", - "CT": "197354C2BF8E9BD7DF1A9B5ABE4AF446DF3A6F" - }, - { - "Count": 106, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405", - "CT": "4DDBF01AB4CE6B4D89124EB3E3D203EB1C2D7C" - }, - { - "Count": 107, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "00010203040506", - "CT": "4F599ECD1FA057F86641AEE6B34E6638302D2C" - }, - { - "Count": 108, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "0001020304050607", - "CT": "E16C123DFB858AC22741977AABA969229493E1" - }, - { - "Count": 109, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708", - "CT": "A4C1950CAE034793DA70471C34B8EB35D20A0D" - }, - { - "Count": 110, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "00010203040506070809", - "CT": "2A70C04224CE0622A6E574C625CD16B938F754" - }, - { - "Count": 111, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A", - "CT": "368D3FAC9858ADC36BF3620AE3529D68D4D9F6" - }, - { - "Count": 112, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B", - "CT": "32517EE881F7443A02994C9A4B0631687B5743" - }, - { - "Count": 113, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EBEC0DC00CC87EFA415EEC9E1AC5E0D812" - }, - { - "Count": 114, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38F4C553D41CF8A4C07804EC83453DA39FA" - }, - { - "Count": 115, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5B7E2AB402129477E61BE05E8FD47B57A" - }, - { - "Count": 116, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9001A51E73F0E321F56455136683DD036F8" - }, - { - "Count": 117, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E987FE34168F464DCFB83F5161683E89C58" - }, - { - "Count": 118, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B23CEA983A5141521C3ACA6CB984FC926" - }, - { - "Count": 119, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E801547ABDD96DCBB14E521C97A7413031978" - }, - { - "Count": 120, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0657DD5E94BFC2E463DD5BE48DF9549E3" - }, - { - "Count": 121, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF457CE8CAA64B238A437A8640FE5BDFAF6" - }, - { - "Count": 122, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584ED5B497309F4B206B1681BB5BF50A8CC" - }, - { - "Count": 123, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F64E85E478AB63330F7414D0A94D1875B" - }, - { - "Count": 124, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D809DE84B0B4F3C995F71F995EF6975AE307" - }, - { - "Count": 125, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77C3AAB660488DE75B37F4F95A1A7A02AE" - }, - { - "Count": 126, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD99BECCB6C7CE2C0680D3FC74EAAC0DD59" - }, - { - "Count": 127, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A10971B55480F611021616406822D4088B" - }, - { - "Count": 128, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F221C1182C8319A0F28CE7E4781406F9F" - }, - { - "Count": 129, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD9C3C5B1CCA26DC6F93AD4CD74B5A18E11" - }, - { - "Count": 130, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18A024A22D4A45A5F14B3106909117D91D" - }, - { - "Count": 131, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C45960A2BFAD38D524765495350844EC0B323" - }, - { - "Count": 132, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07D22DABBDF5C21D07C646E6512DA5A589" - }, - { - "Count": 133, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "", - "CT": "28464180AE23C458998CCE6DE1A2C92488BD7E6D" - }, - { - "Count": 134, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "00", - "CT": "A96AE9C38F5DAF59E1384CE3BADBC0B021384912" - }, - { - "Count": 135, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "0001", - "CT": "623F4DD4074FDDE066068D6F7E5092918BEAB4BF" - }, - { - "Count": 136, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102", - "CT": "49445018C4B210687D7B4FAEE41B07424CA4EA5A" - }, - { - "Count": 137, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "00010203", - "CT": "8987022AF6E736CB84B8E988085B09B9F6B08E6B" - }, - { - "Count": 138, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "0001020304", - "CT": "1973543D541927AE6AECA64B7624BA2B3138B663" - }, - { - "Count": 139, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405", - "CT": "4DDBF0C53B37EDC962C7F051BA21F7F607B93F3D" - }, - { - "Count": 140, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "00010203040506", - "CT": "4F599EE2EFF028B4FF0BED20B26B7F39AC370050" - }, - { - "Count": 141, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "0001020304050607", - "CT": "E16C12DD87F41FBB0A3FD22E9B76F33464681105" - }, - { - "Count": 142, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708", - "CT": "A4C1955E8E87F84360C9799A72BBC5771DAA53C8" - }, - { - "Count": 143, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "00010203040506070809", - "CT": "2A70C0A5EC1A7E2A6BBEB928370BE18EF9756608" - }, - { - "Count": 144, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A", - "CT": "368D3F1FCF4371B35CC3F688D3B06690FFDE265F" - }, - { - "Count": 145, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B", - "CT": "32517E22E48C662F59D2D1CC840CEFC22B220184" - }, - { - "Count": 146, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23990BE860F82C1106234CF3BDDFB2D19D" - }, - { - "Count": 147, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF5D03304278FD6B3914278FBDBBF2DEE33" - }, - { - "Count": 148, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E926686FAF0EF4018240E7F6F67040D80C" - }, - { - "Count": 149, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB90050F8D2C053C47FBCD6ADCF2E49617BC255" - }, - { - "Count": 150, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C8FD8D9A6903CEB8B02E5072B8D654F063" - }, - { - "Count": 151, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F355AE4A2F68DD6EEDA6948D7DEA2EF69" - }, - { - "Count": 152, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7126AD334692E4B6154DE3C0E89485F21" - }, - { - "Count": 153, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F066FBE8EC815A861D4A3D593C5D8089CE42" - }, - { - "Count": 154, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDB582C9953BBFDB82929E1A4A1E874D71" - }, - { - "Count": 155, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFEA699AD3076DB1AEBE7683B6ADC661B5" - }, - { - "Count": 156, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F69D7E5E7D130E57F0DBB18DDFD0C1B0C7F" - }, - { - "Count": 157, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D809763CFBB53635307EF7520C69092A0C5759" - }, - { - "Count": 158, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B7764EAC5BE45F8EFF8BC904A863F04E8E46C" - }, - { - "Count": 159, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FFC4B384C4503E14F03C3D94608A77AD4A" - }, - { - "Count": 160, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14AC4796F60148817C5DC58B652E3C6BB71" - }, - { - "Count": 161, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2E8884192306BD3D99B65069B0F33FA883" - }, - { - "Count": 162, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F8E8BBC3B32526D4DAFF39B29A6F88BA7" - }, - { - "Count": 163, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F67E6B05C21BDFD021F2CE1649E6B8DD50" - }, - { - "Count": 164, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C4596196946ADA7FA11ED27D936771EB861C845" - }, - { - "Count": 165, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E55D02A0D9798537C75D6438337346578B" - }, - { - "Count": 166, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "", - "CT": "2846418067B0E262618E123531B69953F587787888" - }, - { - "Count": 167, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "00", - "CT": "A96AE9C305AF5F8647C8694136DB45670CC9C903EB" - }, - { - "Count": 168, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "0001", - "CT": "623F4DD4726BE5FB8BCF98F3265F52C90C99CF173C" - }, - { - "Count": 169, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102", - "CT": "494450185C2D163BA283CC675E722686D1EF7203DA" - }, - { - "Count": 170, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "00010203", - "CT": "8987022AE2D380E55CE6259294D264D493214B66A7" - }, - { - "Count": 171, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "0001020304", - "CT": "1973543D21D56C7BF4C01CD69D02F2F32CBA1A1B96" - }, - { - "Count": 172, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405", - "CT": "4DDBF0C5CF440741BC52ED40A0519338EEB54BCDA1" - }, - { - "Count": 173, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "00010203040506", - "CT": "4F599EE2F0AC0C784349CE71AE04F9ECAC9454889E" - }, - { - "Count": 174, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "0001020304050607", - "CT": "E16C12DD1D671F098896657C2DC5B53E951DF2C1BF" - }, - { - "Count": 175, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708", - "CT": "A4C1955E7A07E61912209344D798CF697E54C8584A" - }, - { - "Count": 176, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA622A42187E42B29D5F2A576FC9E17D1F" - }, - { - "Count": 177, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A", - "CT": "368D3F1F3B25963F771B5BA702D1B6211648A7159A" - }, - { - "Count": 178, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B", - "CT": "32517E2275643E8BE60AD5C192B8FF8BB00A7D1DE1" - }, - { - "Count": 179, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB2311A67229FEA37FEF1FBD4C748823B4DF28" - }, - { - "Count": 180, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D4C53F2EB2979FB7D9574B361BCA40B8C" - }, - { - "Count": 181, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9520164DB0EF2611C01FD23FD883E7C8940" - }, - { - "Count": 182, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057FF1877D004EE206ADF158DFA2F7B1AC9" - }, - { - "Count": 183, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899264CB4981362A646C42B90F89B9D36F0" - }, - { - "Count": 184, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F678DCE31E97B20159057EA2CE9EBC720B7" - }, - { - "Count": 185, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D714551C4DA3C1C911D755AC3C5558DA00F5" - }, - { - "Count": 186, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EE8A535FF554336ECFA863E1E7816FBC7" - }, - { - "Count": 187, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA38EBD3FD0D62396BAA1E27F01B93EA9B2" - }, - { - "Count": 188, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD43B58539768BABDCA160FAF674F66C01E" - }, - { - "Count": 189, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F690120FCF61DC86B2A7DE7F54E1811BAFE6C" - }, - { - "Count": 190, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D809763275CBD18A7CE2E69FB8D06AE129AD15A2" - }, - { - "Count": 191, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648A7D3FC94FF2F87AE5564B694AC18FABA0" - }, - { - "Count": 192, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF957CAF4CE28A41EC97E5F7B91F0576F4FD" - }, - { - "Count": 193, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A3294B5228E19F3CFE5CFEF2048D15FE4E3" - }, - { - "Count": 194, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDE600C22FAF76F640E6D93A235349C11A4" - }, - { - "Count": 195, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E9A498A8AFFC929B37E0BB0B2DBD07921" - }, - { - "Count": 196, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F672FD82638B5A1565F78D4707D692E476DD" - }, - { - "Count": 197, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C45961911A80270C4C0971A7036130642FDD837AD" - }, - { - "Count": 198, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FBA0A2381274DAEC552F801A4DCEB868EB" - }, - { - "Count": 199, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "", - "CT": "2846418067CE91553B7AA7083851D70979224267E922" - }, - { - "Count": 200, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "00", - "CT": "A96AE9C305FC064E173F044EF3D3619DB5C5036DD778" - }, - { - "Count": 201, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "0001", - "CT": "623F4DD472C87D0368826F6D7952EA3CF92907FC0EC3" - }, - { - "Count": 202, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102", - "CT": "494450185CCE2DD699E153F6BF505A399049C411204A" - }, - { - "Count": 203, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "00010203", - "CT": "8987022AE20D56F02FAAB3B1E539740F20B62EE13C91" - }, - { - "Count": 204, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "0001020304", - "CT": "1973543D218C32A70106D84F227EDEEAF241ECD95821" - }, - { - "Count": 205, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D2C5C6710B78163D28306C51C4980C26D" - }, - { - "Count": 206, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "00010203040506", - "CT": "4F599EE2F0F9E37D90C89CD2761B4553161597E65036" - }, - { - "Count": 207, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "0001020304050607", - "CT": "E16C12DD1DB79F5C66144DC659EB1A6A572EDBC34476" - }, - { - "Count": 208, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB1CC614465132F7E8DAE97F0C8C791422" - }, - { - "Count": 209, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A4AAE1CE1E703B30FD9414334D7615315" - }, - { - "Count": 210, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA7A971B3BB8F410CC6671F03696A646BED" - }, - { - "Count": 211, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAF111ACFECCF3549B48CA38602FD0D5BF" - }, - { - "Count": 212, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117F11AE4660F7629C66F828826B55FB6A77" - }, - { - "Count": 213, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31E69D837A9FC825ED33584CA425BD2C9A" - }, - { - "Count": 214, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529418F982ECBAF9B550ED9E9CAC6E004615" - }, - { - "Count": 215, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFB24D27F18087B689838F28C8B5704F63" - }, - { - "Count": 216, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899062F6228AC8E52BA56DA7424ADCD41DF1B" - }, - { - "Count": 217, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F2A3B04C70C9F05FBACA7AAE1628AC6F1B" - }, - { - "Count": 218, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D4B83DEE0E760BD2F89EF5FEB83B7D11C" - }, - { - "Count": 219, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF7962730CBE9A728D8508670F7E166B624" - }, - { - "Count": 220, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B71FF7E327C86AF9729DF400155BF5E72" - }, - { - "Count": 221, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD4559330023C3A2DC928EAC16ABC5061295D" - }, - { - "Count": 222, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE6BE95D152D00850D406094CFFB3DF087" - }, - { - "Count": 223, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D467CCE3906E6F7BECB62745B80A025A3B" - }, - { - "Count": 224, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE817E16A8D82FF68028427B7000F1ABD80" - }, - { - "Count": 225, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B735516E3A79802157B1734ECF990F5B9C" - }, - { - "Count": 226, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A9EEC3FF3C3F9B7F2D651128FEAF2CE274" - }, - { - "Count": 227, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCA1D05006CA03E3FC4AFA2B1B20CD4E80" - }, - { - "Count": 228, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3F5F1AFC786CF3465DF3D554D8EDD8EEC0" - }, - { - "Count": 229, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A59942DF78166542C167F5E23041AB070" - }, - { - "Count": 230, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110A3D63E9A97AA56D6E0846AEC1FE7F1949" - }, - { - "Count": 231, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13A614F37A9A3A636E3361156C5B8DDEFE" - }, - { - "Count": 232, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "", - "CT": "2846418067CE936856B80187E0CC51865A45CCE6FE94A3" - }, - { - "Count": 233, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "00", - "CT": "A96AE9C305FCF68BBE5E8141A8CA48CC051F54DC2BAAC3" - }, - { - "Count": 234, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "0001", - "CT": "623F4DD472C8FB4C8386C2DE6FD5B70360C1BA7A15CAA3" - }, - { - "Count": 235, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102", - "CT": "494450185CCE77118EA55595E506638EBE89A31B875940" - }, - { - "Count": 236, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "00010203", - "CT": "8987022AE20DD35F7413F1C4AE2CDF650D5EF3124DFF9B" - }, - { - "Count": 237, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "0001020304", - "CT": "1973543D218C5590037813351AF7099622CACE2017C987" - }, - { - "Count": 238, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D506FF740A658CFBF285AB748FC0B227352" - }, - { - "Count": 239, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD18842D24A5928630624721EAE8354D51" - }, - { - "Count": 240, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74F1F613FE6309C759B8160AF88BD1B81EC" - }, - { - "Count": 241, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB200FB16361AC6824AB4BAFB4A43BD86E24" - }, - { - "Count": 242, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E60E71FB781B002B730B9470B070FD584" - }, - { - "Count": 243, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75B26C4B2A4F4DDB7FB85700538305438D7" - }, - { - "Count": 244, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD6B5ECF93AD2EC82D74F8C6630D2ACE428" - }, - { - "Count": 245, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB486548E9E5BFFD02369F57888F0BE274A" - }, - { - "Count": 246, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31341F7F791953EC4DF8102145CAE11A2DCE" - }, - { - "Count": 247, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E95294193300341018A4979A43B3E6F7D7D89681" - }, - { - "Count": 248, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC791C3341C5BFBD2B929AA2102D296210E" - }, - { - "Count": 249, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061C3B37D634F1799FE540BE7A5E99F78758" - }, - { - "Count": 250, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A403D49AC7385330EC3B57D329345DA99" - }, - { - "Count": 251, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D163A4C982B2FF74D316619FB8627D42F80" - }, - { - "Count": 252, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF74725F357639193188C5DA41DCC1E924131" - }, - { - "Count": 253, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17223A5DB248914A0667E307A70F3E7F74" - }, - { - "Count": 254, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535E78D0D2C5FDA281A8331E0FDA9FC1768" - }, - { - "Count": 255, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9BB1C2730FCBEA6307E438CF9DEBC87A2B" - }, - { - "Count": 256, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D48456F4A4969522F88539CD79BA1313C0DC" - }, - { - "Count": 257, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89B78CFDE9CD24866E2CAF2859BCCBABD56" - }, - { - "Count": 258, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B764DB07F18D9EFD65338FB30C03CE51A8D8" - }, - { - "Count": 259, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A98569C8FD0612527FA573972224E50DD463" - }, - { - "Count": 260, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD3893E329AD2C3DC3D0E76F11FCEB569C" - }, - { - "Count": 261, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDA8D90EC4FC5D39FA07C53393137B543DF" - }, - { - "Count": 262, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3DAF58461C4CAEFC3C80AB74E70F1211DB" - }, - { - "Count": 263, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA37B7AE50D7846CFA7B5349B7A031D768" - }, - { - "Count": 264, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426850873172DD1C36A9F6051C7300A348" - }, - { - "Count": 265, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "", - "CT": "2846418067CE93861A484E22565F161146FB6F47913803F9" - }, - { - "Count": 266, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "00", - "CT": "A96AE9C305FCF6B4D9DCC11C94BD0237CC5FBD8A411CBFDF" - }, - { - "Count": 267, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "0001", - "CT": "623F4DD472C8FB526AFC77765EBB693A4ED8FC64E7F42EB3" - }, - { - "Count": 268, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102", - "CT": "494450185CCE77E01ED661E3B43700257ED544227F9B40EA" - }, - { - "Count": 269, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "00010203", - "CT": "8987022AE20DD392EB142AB0FE223949709DDFD9F1F75CBA" - }, - { - "Count": 270, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "0001020304", - "CT": "1973543D218C55AD596A2A3DB33ABA8D0091B973B49FCA01" - }, - { - "Count": 271, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB3FE07CF36EFA7E05B6925B7FB5A95860" - }, - { - "Count": 272, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87E48E77D80EA260816D4C7836A0E35C8C" - }, - { - "Count": 273, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA7F2928415D5A82D617BA364A8C5FF084F" - }, - { - "Count": 274, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B692C241D3B8109E540BBF8D126BDA499" - }, - { - "Count": 275, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10132E1687AFB2E0D13E5822AD613AF920" - }, - { - "Count": 276, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA9F4BAAAEBA181EA2EC68B5EE1BCB2E45E" - }, - { - "Count": 277, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD643BC204948CF09A8BEE6A729A8FF59F8AA" - }, - { - "Count": 278, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF177EDC69822BAD7B209537F34D82EBE0" - }, - { - "Count": 279, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343C00DC14459241C41FA48822AFE3EA32AF" - }, - { - "Count": 280, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419992762D28BEA0887452699BB4C13B8A08D" - }, - { - "Count": 281, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCE65659061558E6CFD71E9ED37E3FD975" - }, - { - "Count": 282, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCED13063CCCFC0FD5FFEECE884DBB9AAD" - }, - { - "Count": 283, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59D5E7925235A7F897A93258EEE0E33089" - }, - { - "Count": 284, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1EC215DB4855A8E188B5AC180781B9CD4" - }, - { - "Count": 285, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD07C17BDDFBD73BD8BACAEE7B5B988D91" - }, - { - "Count": 286, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E7B25AC61D7BDEA861C9C30BC90889DC75" - }, - { - "Count": 287, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD455353517FB53A36C9005378400648381C2CAF7" - }, - { - "Count": 288, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B538F2DB7519BF7EA8C3BF905D92A198029" - }, - { - "Count": 289, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A8D039E2C84D93783BBD5EBED4E2C2354" - }, - { - "Count": 290, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBFE276D0E1A1183BD5BB9A31D954EDBBC9" - }, - { - "Count": 291, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426F3261C1679806D19C53514E35E8B6A6E" - }, - { - "Count": 292, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2DC143EB97C5868A71E1E88CA930BFDA5" - }, - { - "Count": 293, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD48D5A31329954D88003A0981917CCF1268" - }, - { - "Count": 294, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACB07FBBDF34D5A40DCA48B139EC8D898CF" - }, - { - "Count": 295, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D6553C989342423653082FCC7E266A478FA" - }, - { - "Count": 296, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74D4A1792E039BAF6CF3F12E44E35F7DF2" - }, - { - "Count": 297, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "0001020304050607", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426E0FA18908F75E444CF1E7EDED03BB9E90" - }, - { - "Count": 298, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "", - "CT": "2846418067CE9386B4CB9A729E5FE92BB573F95EF31748543E" - }, - { - "Count": 299, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9F8E0F2DA86FA7CA273E2ECD72D84EF46" - }, - { - "Count": 300, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "0001", - "CT": "623F4DD472C8FB52E69FA0E5AEF46FC7A9295D5004DDB14EE5" - }, - { - "Count": 301, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102", - "CT": "494450185CCE77E07DA22F0B8DDA84D3743B641EC2788B16FA" - }, - { - "Count": 302, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "00010203", - "CT": "8987022AE20DD3923DE2ACF3EDDA152858FCAAAE9B8464AF9A" - }, - { - "Count": 303, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "0001020304", - "CT": "1973543D218C55AD9B9E04616BF128488B4BAE87F84833F74E" - }, - { - "Count": 304, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F94A09E4DC1B05444A284E62B1F921625" - }, - { - "Count": 305, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C5CB9D3F0926CF7B93FF8F54ECC95F5EF6" - }, - { - "Count": 306, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA7738EB40ABED9F4161FFD1E3224FAFF94E3" - }, - { - "Count": 307, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B36CBB0ECF06F460AF72935B83C9DAC363D" - }, - { - "Count": 308, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D8F2D98DEB0249EE6BA453C6DA05F8C28B" - }, - { - "Count": 309, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA9290A3C825C59820F9CB13E398A6D8923B8" - }, - { - "Count": 310, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340B8F20E04DA910A8841C65F903EA4516D" - }, - { - "Count": 311, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF34E51EBEF116982286C57B0BB5A33941E3" - }, - { - "Count": 312, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA22CBAD72121FF0C14D0E65E147F5401C2" - }, - { - "Count": 313, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990408B4DD9CBF2F7706546139B3F9B1ED8C" - }, - { - "Count": 314, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC255F8B12B874D064EF5B64CD71D7D38AB" - }, - { - "Count": 315, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF5E685340FA71C37D3A0AB2AEDAC46C019" - }, - { - "Count": 316, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89AA5A2A9E9826AFBCE71DDB7F5EF1C5" - }, - { - "Count": 317, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFACCCC2E8E3C4E423EB029323C264A897" - }, - { - "Count": 318, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DF146EDEA6DD10C1C368C1660B96359AD" - }, - { - "Count": 319, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E73648F4A1C8B684910177B42CE2029A4497" - }, - { - "Count": 320, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D22B320228ABF9CBD9A7D1252A9800B86" - }, - { - "Count": 321, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC4314F1B5A23CFA5E6F4A6512605973DF" - }, - { - "Count": 322, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A88E23320BEB0C405700E32D956F303B56E" - }, - { - "Count": 323, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF7783017764A29BEED8CEF20161E82E837E" - }, - { - "Count": 324, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD8C292A44FE66184F0F8841E8CAF3BDBD" - }, - { - "Count": 325, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F6201C4AF5D183942A3049E9F7650EF0F9" - }, - { - "Count": 326, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD48717539E00B4921C8C4BDAC7B155AC88421" - }, - { - "Count": 327, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA05983CAE980451A20E975730C17B91C7" - }, - { - "Count": 328, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC14F3B2538A90464E5C69A24568083B93" - }, - { - "Count": 329, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E5857D21A299BD0DFC259341E62A3B9F60" - }, - { - "Count": 330, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFF2190288691F9A3F389FF34B980F44A8E" - }, - { - "Count": 331, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "", - "CT": "2846418067CE9386B47FDC98D1718EBC010BAF0CDDF491EECB6A" - }, - { - "Count": 332, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A545EDEAA170B754D23EAFE81E14964CDF" - }, - { - "Count": 333, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "0001", - "CT": "623F4DD472C8FB52E6940910992D2A65CB617F6E2D8B81BA0C2E" - }, - { - "Count": 334, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102", - "CT": "494450185CCE77E07D6B47B8F62722B4B060700542AEEEAA02BB" - }, - { - "Count": 335, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4BF92F7FAB2E9692B67EAE32CDF70C74B" - }, - { - "Count": 336, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "0001020304", - "CT": "1973543D218C55AD9B42999540D737AA3BC2106BF749842DD5F9" - }, - { - "Count": 337, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6C7E69D7543203BD3B4E53F643A95D3836" - }, - { - "Count": 338, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533C442A461E458B8106C94659C204C7910" - }, - { - "Count": 339, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA7734146BA9B5A4C428882C57EEA9D27DEC214" - }, - { - "Count": 340, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B36663C04E8A73C8D8782AC5A3ED8BA9B3F5E" - }, - { - "Count": 341, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D8754CFD0FE197EC5820BF326F6CE0C6A7D4" - }, - { - "Count": 342, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A1A3B38732F860721ACA2D9CD2BF3C94" - }, - { - "Count": 343, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340522166A361D2A0FDC2578460F9392CBF64" - }, - { - "Count": 344, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B43DFEC821E3FC9BAA4A86AC10DE39353" - }, - { - "Count": 345, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F8EA220C6B399642601544430C7E5D181" - }, - { - "Count": 346, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E952941999048989A8272E23C3D735AAC54C078091718A" - }, - { - "Count": 347, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273375681FE915974459EF6C139E08F6AD1" - }, - { - "Count": 348, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C902ADFDB671ED50FA8D2ECCE2F89AD2D" - }, - { - "Count": 349, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89BBD4ADA296D59A4F3C52E9D3D1AB1AF3" - }, - { - "Count": 350, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBAEEC966599204770FB7663B2090CB8810" - }, - { - "Count": 351, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9DBE4471D893DE7070691543A3D412ACC" - }, - { - "Count": 352, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B688CB0CF19C5EF2BA09D227C27B28150B" - }, - { - "Count": 353, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D351B565E41A4145E80CC85F06E3752543D" - }, - { - "Count": 354, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7EDAEAA8FD00E562FE94DEB9A9D9715BC1" - }, - { - "Count": 355, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A8855C7482C6853CD65F8BBCF588FD2D7ED04" - }, - { - "Count": 356, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDAD8AA4C85C0913EFA5374639242354DE" - }, - { - "Count": 357, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91B4B622E986EB73020AC2A70B2A36198C" - }, - { - "Count": 358, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DDDB646F3551C4CC0DE4C44BB97E8F9F4" - }, - { - "Count": 359, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BEFA2DEC78A30970FC9D63EB135E326BCA" - }, - { - "Count": 360, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6DA9E111EA0E4674A4A88F4109EE38EC7C" - }, - { - "Count": 361, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC078B6265A0F4AFE952B42256C97C68E2A3" - }, - { - "Count": 362, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585B2CC6C5F2E7BEF7BC5C6061EF75B3975" - }, - { - "Count": 363, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "00010203040506070809", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD1F32581AA82E1C2958BA6EC9D467FA726" - }, - { - "Count": 364, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "", - "CT": "2846418067CE9386B47F05452F6CAE435738AFC49036B977E99F31" - }, - { - "Count": 365, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50BCF546E6C7CE00AD0600F1D62E279F04F" - }, - { - "Count": 366, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B12BAB9D5A03DE49EC9B015D7F1CEC5F8A" - }, - { - "Count": 367, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102", - "CT": "494450185CCE77E07D6B201594794515C1C5557BB13F0C4C9AA517" - }, - { - "Count": 368, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D18E9FAC9181F8C2B3D742AFF9537C254B" - }, - { - "Count": 369, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "0001020304", - "CT": "1973543D218C55AD9B428266253462B8763E84024FC3842F0979C4" - }, - { - "Count": 370, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1B0F14391084054C43B0500A3C75828F0" - }, - { - "Count": 371, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE0A8CB6606FEEF63CA75A490EE5474BF0" - }, - { - "Count": 372, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA77341581D074378C8218FB19B0ECCA645FED8C4" - }, - { - "Count": 373, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654BB042DBD959156F2B4CAF5A2CB0C6347" - }, - { - "Count": 374, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C09D01C04DA3EABE8134D70680FA96A6C7" - }, - { - "Count": 375, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A504FAB452FC3EE78D3F1817F444711632" - }, - { - "Count": 376, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD643405263D7FEFAA4FAE7408E7FA6B14DA5C4B306" - }, - { - "Count": 377, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9B6BF1D5265A3ECA98482D6A7754A00377" - }, - { - "Count": 378, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F80C16B48A77F5AB42BA2AB4A0CDF62686B" - }, - { - "Count": 379, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FB88DCC4CD715F00D30125FF3BBB609" - }, - { - "Count": 380, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A607741A2226E0FA52E986458315A2950E" - }, - { - "Count": 381, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8F4297E33AD73C6960CD385FFB753B56D6" - }, - { - "Count": 382, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE8998D81F02FDB359D0A94FA4E0E45F8FBC82" - }, - { - "Count": 383, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE8861A771241E01034AB7CA74C0D7108" - }, - { - "Count": 384, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9E22379E4A47A7B7EB103EA62D4C6FC73" - }, - { - "Count": 385, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FAAF17A34AB4F2D8325EC12C5DB2FBBB79" - }, - { - "Count": 386, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B8D510E4F20A83FA9E92C65F2B108227F" - }, - { - "Count": 387, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E2093E83236527EA28D9F39A91E5CAE4872" - }, - { - "Count": 388, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522B773407F1DC721A39A0A11B44177D63C" - }, - { - "Count": 389, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDADF90F9433B2379F8EEB3438EFE2CB29F" - }, - { - "Count": 390, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF354210EFBD001C73C407833532DA6871" - }, - { - "Count": 391, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA78A4986B33F0CCE939523747AD0DBC68C" - }, - { - "Count": 392, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE997A4DA8453C13576D7784959943449C09" - }, - { - "Count": 393, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9643B6AD3337D8A8791A77E0D0B378E568" - }, - { - "Count": 394, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A02BED1E696B7BA496F468CB1495BE5D24" - }, - { - "Count": 395, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE86CCC8D9622B8FB42EF8186239A09EDB" - }, - { - "Count": 396, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B606349B5AC4C5B248EC013626AB4A236" - }, - { - "Count": 397, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "", - "CT": "2846418067CE9386B47F05841DD3576B0C07001300B6F4D29C55669E" - }, - { - "Count": 398, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B156B1B55D1A5AFF1FA50730C36702561BF" - }, - { - "Count": 399, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10D2C5B2C41772876BFE4FCBE83883BF3A4" - }, - { - "Count": 400, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FEA90C99BCAA375D4A0E177DD6F6F309AD" - }, - { - "Count": 401, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6D8107016F58A92D36601D6294F02AE0C" - }, - { - "Count": 402, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D761A396A875C57FBD62EA9550B8486BD6" - }, - { - "Count": 403, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DEDAB8D9106C5650944879B6B18BDCEFE0" - }, - { - "Count": 404, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4B8FF7A1AA84987A8DE726D89B07E0EBF4" - }, - { - "Count": 405, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872E72221D5D00192E7CB73B22A02ACF3EE" - }, - { - "Count": 406, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654612529743C240410A64EC81656CFC4648F" - }, - { - "Count": 407, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DF21236576FCF713C05EA50886F5904AD" - }, - { - "Count": 408, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A532AD3D0BA00CEEAC77BEACCC250F097C0A" - }, - { - "Count": 409, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353B3BB597D5D6FCB0052739E4DCE6DD9F9" - }, - { - "Count": 410, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEA035110617D0D8EB7667EDFE9EA0E38C7" - }, - { - "Count": 411, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F8065C34A72A650DA205C2D1B159270F5061D" - }, - { - "Count": 412, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FEBE227731F77022E17F5D8179A367052" - }, - { - "Count": 413, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6726B1ECFAAC6AF99305F696C2718F579B5" - }, - { - "Count": 414, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDAE1194DFFFADD0F31545CC5BAF4D9BAA1" - }, - { - "Count": 415, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3ED4B32EBDB85051A8C8EB495F349D38" - }, - { - "Count": 416, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE17D96B7E5D0DD8A977516AE5DC0F1D25F" - }, - { - "Count": 417, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A5FF872FC54059BD1B80FB9BCAD58F284D" - }, - { - "Count": 418, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13A1EE82FD16449347E0DA8D7B2C32C4AE" - }, - { - "Count": 419, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5B3D36BF87745F6707B7DC393BABFD0F8E" - }, - { - "Count": 420, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203E68B444BE0F53A7A94AF398AFA5D69C93" - }, - { - "Count": 421, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1B9902F1C450F67F58408F9100BC9F08" - }, - { - "Count": 422, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5C687510A643CBC11741B5647E06565697" - }, - { - "Count": 423, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5E59437F3ECC20378E9ADA9C9EF497BC8B" - }, - { - "Count": 424, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA777367BA7E7C5CDEB1851A19A2BC9EEC9DD" - }, - { - "Count": 425, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991990D75925843EE78C94492419CE078B35" - }, - { - "Count": 426, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D96259A2295084F44DCFF51CCA1ECED40280D" - }, - { - "Count": 427, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050B1BDF1957AEBC16395DAC38AD6E8D607" - }, - { - "Count": 428, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE44FFE87B9792F9C555AD56C46DD3DB3FFA" - }, - { - "Count": 429, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F937D57F4D72F5569ACB5563805A73DB6" - }, - { - "Count": 430, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "", - "CT": "2846418067CE9386B47F0584BFD919FC5FF05948C75DB703D125BCBB78" - }, - { - "Count": 431, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B15397253F6121E9928BF390DCAC5BB51E9BD" - }, - { - "Count": 432, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD7C4C102F57324F33B725B3C751DCF8EA2" - }, - { - "Count": 433, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70390C88475332AFCBB5805B371FDFE66D" - }, - { - "Count": 434, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B0A6DFD9FA2E99E97CD01B09286AAA62C5" - }, - { - "Count": 435, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7ADDD5D13787CA66D2B27470D480F14E45A" - }, - { - "Count": 436, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECD47FD9E8B1CA6461C71D97F52B3DF4350" - }, - { - "Count": 437, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBB65AF50AED468E63D0A54B54B5B2CC34D" - }, - { - "Count": 438, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B0B49653AB0732CCFFEE9CC6AC4A0AC124" - }, - { - "Count": 439, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617CA908D440D670A8236E2FEB99FE0F23DF" - }, - { - "Count": 440, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC1EB8F6A3446A6EC44CF532ECDC0A78DD5" - }, - { - "Count": 441, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327ED2B2AEE60065A3DDD91BE06DD7637C77" - }, - { - "Count": 442, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C073B1A6C776D1125F2505CF2CC4FD67B5" - }, - { - "Count": 443, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4C36A5421C379BB405DE5856328D73043" - }, - { - "Count": 444, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F80654384D9E368F2E98F3C39117BFC318310B9" - }, - { - "Count": 445, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2039F5C2B6C8466BC7F6BBEE8ED0AC758" - }, - { - "Count": 446, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B41EABB1AE5A181942370122790467F92" - }, - { - "Count": 447, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADD925F0061102771C50DB77CB601AB1A99" - }, - { - "Count": 448, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3ED3D243B90B48CEA91400BF2BB07D500B" - }, - { - "Count": 449, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FC8F39D483F6F643AB73D177AC41CC8A" - }, - { - "Count": 450, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55EBC3FF78A5708A0E8C793E34295EF6458" - }, - { - "Count": 451, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B776A5E30C9E4E8721620049BB382306A3" - }, - { - "Count": 452, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5DC61C22F46EF11BE4EEA6CECA8954D57" - }, - { - "Count": 453, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDE17A4EDE6D5EECDF25DB3A42A40F769A" - }, - { - "Count": 454, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1F2A7F5C28B4F855AF743FDFE00EB3DD12" - }, - { - "Count": 455, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC785FAD4EDC3831CFA45F2D944643D4E3B" - }, - { - "Count": 456, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEB42650E8D8F24839B7EC42CE326E771AC" - }, - { - "Count": 457, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ABFA01C93C74C4085F51B0E14E7FD7FEC" - }, - { - "Count": 458, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE9919654B5A977433E0EB9F6F8AC5B79FC9B5D0" - }, - { - "Count": 459, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B855B3B3E46640622F61A0173DBD0153E7" - }, - { - "Count": 460, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2E6DF6CBA756A047C62425DE324E38169" - }, - { - "Count": 461, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424197D99431D570F7C014AA6C3CB6EC7FB" - }, - { - "Count": 462, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51906EE4E681B21C9717A4B40054F26D03" - }, - { - "Count": 463, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EA0940F2BA6638D0539D37DD1843D1863" - }, - { - "Count": 464, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B808B8FCFFFC67EDFE17EF685A8FAB5555" - }, - { - "Count": 465, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A84A294F7E41D948A666794CD1291210C" - }, - { - "Count": 466, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70459C267AC0F6FC28AC2AA2D5CF3B031039" - }, - { - "Count": 467, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035A4C344EDCBC2386626E7AC9EA0A0D8A3" - }, - { - "Count": 468, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CD65EFEAD3A9BA5899E98D24FA3FC3DF" - }, - { - "Count": 469, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC92258C6F1D11A57F5AD3E909491E13175" - }, - { - "Count": 470, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF100DB5B2B3EB1E2C3F91BA4064372DCFA" - }, - { - "Count": 471, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01C3CD19D28DB8452B06B8B391DBA7885AB" - }, - { - "Count": 472, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0C23DAE402508CE27B46939F672D186789" - }, - { - "Count": 473, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11A5D2727BA153FB33329EDAC7D5B30567D" - }, - { - "Count": 474, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8D6B256166A0D4D1FD15029356308F0FFE" - }, - { - "Count": 475, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F85FCC778403EDCBECC07E45D1A2A44167" - }, - { - "Count": 476, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD461FDD62F1C3D30005C909DA5F29A993BD4" - }, - { - "Count": 477, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DEBCD68B7C6B1A54F6627C77AD841953F2" - }, - { - "Count": 478, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF230E3B7443315DED8582147EC0E5436A028" - }, - { - "Count": 479, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8B5B130E2194CA3406CCF7C7902EAF3A0E" - }, - { - "Count": 480, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE77238987B0E2121A95BD01D5B1DD767AC" - }, - { - "Count": 481, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9AE40BC659AF277E09DC12E2B7EE614BA6" - }, - { - "Count": 482, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE16ED18D38F3DB3D7E6FF2663E0344CA6" - }, - { - "Count": 483, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8ED50D3D0E1677F89B7D1A8860B0940CB6" - }, - { - "Count": 484, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7542D3BAB61DBDEF8C840F7BA3C4B35D3A7" - }, - { - "Count": 485, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7E8907587385BC96C69B4D665166A587D" - }, - { - "Count": 486, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5F5CFA6CC1FF335BD0F404A8D75AFA689" - }, - { - "Count": 487, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFB11DF9DA0A1E92D249480A44D7B7855B5" - }, - { - "Count": 488, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776A74FCCC014A3FFC2FC1A253D092F680A" - }, - { - "Count": 489, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD40710C8D5C37F65BC3BD7BE861DDE31B7" - }, - { - "Count": 490, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE038DECEA69651C8CAF4D4A89815A81A6" - }, - { - "Count": 491, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC3C4790A88DBFA6AD3673A2E557D861A5" - }, - { - "Count": 492, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C1910CFDDA868E2F844916C2ADF538A405" - }, - { - "Count": 493, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EAC04185C745C8D770F7565CA4C4885DB0" - }, - { - "Count": 494, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2AC49312F8D87B44A96CC1000CCD03146" - }, - { - "Count": 495, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A65F01655A848E79134265AF34E71BF97D" - }, - { - "Count": 496, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE8D5C48122DD5E9E11DA9A037A8B6502A" - }, - { - "Count": 497, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B8965D3DB1611DDBDF6DFBBCE0E465AC6F10" - }, - { - "Count": 498, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2228F688CD95862B52C750506E4A31C6CC" - }, - { - "Count": 499, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457D4BADD493CD2BF8038B3F50C8DCD98661" - }, - { - "Count": 500, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035702E8C7E3CCA469870EE4B40470141F0F6" - }, - { - "Count": 501, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CB4760702BD8618E26E2A569BFFAE52FF8" - }, - { - "Count": 502, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC9687577BA75C6B4DA30E46906905164CF2D" - }, - { - "Count": 503, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F4089DC1DE8B16234E488E30F3D21456CD" - }, - { - "Count": 504, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB8281CD822572651275A07E8FDB38804D6" - }, - { - "Count": 505, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF5F8B554632824D3146D54DB99B45A6096" - }, - { - "Count": 506, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE955214CB918F253C62F72725F28678F0" - }, - { - "Count": 507, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE44DFF999CF334282A0ACA6690162A708D" - }, - { - "Count": 508, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F85814B660403F1C61E1B45DA20F995E42CB" - }, - { - "Count": 509, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E81AF414E442F77D5CECE55F5493128EE" - }, - { - "Count": 510, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE45302C2EA0327CAAC0E4BB30F73377EC5D" - }, - { - "Count": 511, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300A94741593B9281FDD27234C2B6AD953E4" - }, - { - "Count": 512, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE18CBD29A97F6FF8648BB191E847566DD9" - }, - { - "Count": 513, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C984DE2936E258E97D96F2A45A6CD74959" - }, - { - "Count": 514, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A364F0EEF1ACC12BCA094EDC25E337627EA" - }, - { - "Count": 515, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6AEC0A5FB765F3877026E542D38162544E" - }, - { - "Count": 516, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5145F585863629A0248ACEA98CF234EBC4" - }, - { - "Count": 517, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B00ED47607FE3AE642A86D09671E3E6F3" - }, - { - "Count": 518, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2B4AC429DA1C37860B340EC5690AFEEB4" - }, - { - "Count": 519, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080C9729FC494429EF625564E8A108CFD4" - }, - { - "Count": 520, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBEC5DECFAF64326B252F3DDE8CF2263FB08" - }, - { - "Count": 521, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776862F472B5B960B236AECF1AEF3445AE7D8" - }, - { - "Count": 522, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B95860462044E5AF44B6EDC3027E8B2EFE" - }, - { - "Count": 523, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A5BB115B20A0DC56E0D6F5FE8D9896C96" - }, - { - "Count": 524, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC576F102139ACDCE7951C70A813908F978A" - }, - { - "Count": 525, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E6C66C50EE8ACFAF7074496ADA3D5A12D" - }, - { - "Count": 526, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA55C371323FC08F7375D64B8A6F5CFC076F" - }, - { - "Count": 527, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2916A05E4CC1A362A3CAB418E2D3A51D937" - }, - { - "Count": 528, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A8D0AC133E757ED09743FAF30C928F9AFC" - }, - { - "Count": 529, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F818CA2B264F3BBFC40B773D0EB81F594" - }, - { - "Count": 530, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E71A04D7949337EDF069808760AE7D7EEE" - }, - { - "Count": 531, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204B5C5F7ED33D6E27F7F800389D99132B2" - }, - { - "Count": 532, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7EDA2AA2873B35A7D96120EB0E40AEF73" - }, - { - "Count": 533, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B0357010128D0A6913E946EDADF62E815D8A6B19" - }, - { - "Count": 534, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1928127A4FBED2EA3FF3D6DDFA543A9F9" - }, - { - "Count": 535, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BC9158641564E412247936B68C1CAE32B3" - }, - { - "Count": 536, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48857E145ACE60FECC49118C400A3F37D4F" - }, - { - "Count": 537, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834DBE18B2D5C6C9E77DF52E8CABB7A3283" - }, - { - "Count": 538, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56CDD4FE31193A97B0682A5C5916F7D31BF" - }, - { - "Count": 539, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38906F3A1BF5ADBC7285A776E48A9F01A7" - }, - { - "Count": 540, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A1F463BA5A17EF73450321D7B4A84FA74" - }, - { - "Count": 541, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F85889BA5721A22963633FA61A9DC1BD29BA75" - }, - { - "Count": 542, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBD0B1C5C5251CB96B0B0778F364B2D29" - }, - { - "Count": 543, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452ECC508B66A91185A84221EF35D209186A" - }, - { - "Count": 544, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD924A59EE891A1B3845AFA8EDE5D142AD1" - }, - { - "Count": 545, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCDAB849111CFD590F480F66BE1D393841" - }, - { - "Count": 546, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E47ECF3BE0A55D1BF849DA473CBDD69207" - }, - { - "Count": 547, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367B288AD97A2FCF6F3579A33B1B2789E9D0" - }, - { - "Count": 548, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A518C892D00B7F8F0DD3A609D6178EB4C03" - }, - { - "Count": 549, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E516344E2E54C9F5A62E4A2AC8EAD139ADC55" - }, - { - "Count": 550, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C4B1CCD50F6B75926E47EB2922D5D94F4" - }, - { - "Count": 551, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CAD24527617C4F8E9D9F4EC86E6EB44E8D" - }, - { - "Count": 552, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080E7ECF2ED8E1860D0C40C53D344D49A8D1" - }, - { - "Count": 553, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB213611A04D6769A72A137F8EB3DDA83C9" - }, - { - "Count": 554, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865BD37289D6BA7712BD01BC20D2D206D5D0" - }, - { - "Count": 555, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B9078BF6D0DD0939386538E97D70B17A3ADC" - }, - { - "Count": 556, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D1C850576A7C373A18DD4B1D3EC911A2B" - }, - { - "Count": 557, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B468291EB3684B6FF37563517037F38B23" - }, - { - "Count": 558, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68A47047F7ECE4754033A29D6D4BE063EC" - }, - { - "Count": 559, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D072364005749A6DD92EFCD156BF89785" - }, - { - "Count": 560, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913EE4C290180B12FB7790071C07F6C2E033" - }, - { - "Count": 561, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A83016F564E1D50A502B9B4FE794A806DC75" - }, - { - "Count": 562, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F5198E62C65AE57B9C6B19FCCC757B8D1DE" - }, - { - "Count": 563, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7804C7F86778B9CDBBE31F55D1DF1AE6A7C" - }, - { - "Count": 564, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A63021F6C941BA68647A7BF8FE2A3DDD4C" - }, - { - "Count": 565, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4E48C491115261476441C40DBF4720598" - }, - { - "Count": 566, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B0357010495E406B6F9D878357384B25C56B3A491E" - }, - { - "Count": 567, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE11470DE1D5DE38F0F59F3FFA5FDEE647040" - }, - { - "Count": 568, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7481B56CE6397C8028A30E2395368DB39" - }, - { - "Count": 569, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871B97D02C7FC07FE01B21E5FC98D937A2F" - }, - { - "Count": 570, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3A721C972C2DD675595459FFF639D2487" - }, - { - "Count": 571, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B505A57BF188163E1ABB3BDB2B20EBD2A" - }, - { - "Count": 572, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DFF402245EF9B2B5B0D39D835EDBBD26B0" - }, - { - "Count": 573, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A553AC959AAC83FC6DDF279870053F05899" - }, - { - "Count": 574, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F858893388DA30D26E22512244D43E7343DC264F" - }, - { - "Count": 575, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBB67C9F87E998329CDB84EB60C09181235" - }, - { - "Count": 576, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBD2EC5ADEC376AEBE786E5614BD4C9F9D" - }, - { - "Count": 577, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD917502E66DA5F21C2FDD9540E7FFF0CA9CD" - }, - { - "Count": 578, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7E056A8001E1A9F7AFCA92117B79D53A3" - }, - { - "Count": 579, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F5CA8B173D13FAE027F5E0B85139ED2D17" - }, - { - "Count": 580, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB19662441B6BD32D3C6319E08ACFEDCE98" - }, - { - "Count": 581, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516A90DB15C692B8AE5D6D35B33E2283BC80" - }, - { - "Count": 582, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B825F8A9BAF0C90E536A062BD77501218E" - }, - { - "Count": 583, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0E33FBCC74E51D3870FEBD0D86897A949E" - }, - { - "Count": 584, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7ED0BBF0FF848A21EFEBD13951A81A753F" - }, - { - "Count": 585, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0E869E870E9DA72AA25DEA678FEB42846" - }, - { - "Count": 586, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28C4747C19B7D500B9E4326A0EC841970FA" - }, - { - "Count": 587, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B81402EFAAF9547F89DF67D0938E9E7952A" - }, - { - "Count": 588, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C0B6C86B029EE8287C000F44FDEB5ED324" - }, - { - "Count": 589, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9258D41BA128DC201CFFD6F283AE524B42" - }, - { - "Count": 590, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60F0EA595C9FD784DE237B09306163B23" - }, - { - "Count": 591, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1B4A62D071B87F9D8C919F37A3B08DF7F" - }, - { - "Count": 592, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D84CBBFC48E8594BBAD8769886925C6C488" - }, - { - "Count": 593, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BB691BFD3A8662D4B294EC29E3E552AFA" - }, - { - "Count": 594, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF95D181B8B773440DFD022DA93B3265F5" - }, - { - "Count": 595, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A6A502429D029B5E8CFFCAE91A844EEB6A" - }, - { - "Count": 596, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BABD7357F35B69977A340ECC84FC86441" - }, - { - "Count": 597, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680D15254255CE5F88BA5AAF59B694A0DCA" - }, - { - "Count": 598, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D48554A286F1F57875E395BD920B7912943D" - }, - { - "Count": 599, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D013736BA86DD3702EA12D8B4109E5F691" - }, - { - "Count": 600, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149C6661EE398FAC1B19857D57CD04D4D0F5" - }, - { - "Count": 601, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E88BB96CD8994758E2BAED2BCF081752AE" - }, - { - "Count": 602, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F4887127964B678EA569FCC4B02A4B00D8054CB9" - }, - { - "Count": 603, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0612339D8C281D090395E624C7F0D5710" - }, - { - "Count": 604, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9EC7F369F4672907FF4C1EE20A8F1CD134" - }, - { - "Count": 605, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7AD384AAC3E07E6FF69477069FC02632B8" - }, - { - "Count": 606, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55389E56D89F7D6D8AE4D693CA211EB12190" - }, - { - "Count": 607, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4F60E6DB2A78C0148BC59EEDC78D94A32" - }, - { - "Count": 608, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEEF9CF57EE35C9D63019B597781F192C3A" - }, - { - "Count": 609, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB33F4CBC23F2984A8FF47CEEF27843C1E2" - }, - { - "Count": 610, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171A40E21310FC3582D25F3E855338B89F94" - }, - { - "Count": 611, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B778CF1759D432433CA5A8ED4325FEFB31" - }, - { - "Count": 612, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED227DBEFFA2AAD3A93FE88504443AD57" - }, - { - "Count": 613, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18FFB0423B4C35A4324B078178DB5497860" - }, - { - "Count": 614, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD389C8AA6C3086D0D0D440F78D2788E347" - }, - { - "Count": 615, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF1A93AED9C408F16E9705D9723DCF29FB" - }, - { - "Count": 616, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE15A84915E5397CF5F8A83FB54AF1FF0C" - }, - { - "Count": 617, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E124A281128013B6FC282ABA9EEB4BBDB13" - }, - { - "Count": 618, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7AC9A42160374F4207CD454859D0DD7A7" - }, - { - "Count": 619, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBF1367DFC888956C69B7DAD928BDF5378" - }, - { - "Count": 620, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813EFAB0027D76D532661F5DED7DA0600D3B" - }, - { - "Count": 621, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05A81C448695C4B86C716BB0400D30944AE" - }, - { - "Count": 622, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261A80130B4BE9AA38EFFC3FFA5BF038515" - }, - { - "Count": 623, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60DE513F07A5F0C8F41DDB80CB86D8CDD88" - }, - { - "Count": 624, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED501906DF8E53423AAAD3721DFFF12B05" - }, - { - "Count": 625, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D1027098B6DCD9B44A0E687F81DB3E563" - }, - { - "Count": 626, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9CB4637729B9CFBF19440AF04CECE2647" - }, - { - "Count": 627, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF48CB7EF62C158B63664E0486ECBF00D69A" - }, - { - "Count": 628, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A6292995E1B6279B3282DD3446C1C848958D" - }, - { - "Count": 629, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE6A06368A404DDCEBC5CD0208056B26E0" - }, - { - "Count": 630, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C225C4C7E1D99230C132DD2F7D721A3532" - }, - { - "Count": 631, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B4996C33E3B456719064849F3BA0D8A27" - }, - { - "Count": 632, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EADBA61ECCDE052056E424791391C01749" - }, - { - "Count": 633, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3AB6DFFB9D45CD7045FC56A6D84F93D4A" - }, - { - "Count": 634, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C59D261B1A52D1DC944570AFB2C21A510A" - }, - { - "Count": 635, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F68AF332B07240124F372086A052AB8EB" - }, - { - "Count": 636, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A4513DE22A39D30C748192C62FD368124F" - }, - { - "Count": 637, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3617683D712082393F529100DF32B35B2B" - }, - { - "Count": 638, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A927309B30573F39C8799B76907083D1379" - }, - { - "Count": 639, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383FB499040D7D109E7295FDC98E55D459B9" - }, - { - "Count": 640, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9FF3669D4CDC0CD032B87024BE3D7D62F" - }, - { - "Count": 641, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45B862CDF571DD229FD29AD019C0E2B45A" - }, - { - "Count": 642, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B2C0866DF0C7F53EBF809B0A52430D5458" - }, - { - "Count": 643, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA192D6896688876283B4299BAB2049A443" - }, - { - "Count": 644, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B7586214BC5C957839E4D0DBC197BE3166C1" - }, - { - "Count": 645, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2A09A9E5C582C9A72A4639521D19FD3FD" - }, - { - "Count": 646, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F572B30F61CDCDAEBE28541B4167A23C654" - }, - { - "Count": 647, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD396F9AA81B9FEF980DFB18E213464D360F5" - }, - { - "Count": 648, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF2211DD6C44EA17EADBC7CE5795CC1C4993" - }, - { - "Count": 649, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0B5AF203BB1664DAC40D65DBFDB9DDFCB3" - }, - { - "Count": 650, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E1275AC3171E23928FEB9E0D7917E107D9E0C" - }, - { - "Count": 651, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7EC204D45C419071B8DB262D93E1AF299E9" - }, - { - "Count": 652, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA2A0DD557247A28F496CF428207149F80" - }, - { - "Count": 653, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DC4EB5D46FC9A1FCC95CFDFF1A897B227" - }, - { - "Count": 654, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD940A53476CEEBAC0E14268B105A121F9" - }, - { - "Count": 655, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0638659753C279C5DDEC4DEC45E701C0E" - }, - { - "Count": 656, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D50BCFA3A725B2C3C41E4352506FDEC4C40" - }, - { - "Count": 657, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C4ABB5D0A936271990A7F5FE912727033" - }, - { - "Count": 658, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63B007686C9A57A2CE3CC65CF84782F3D0" - }, - { - "Count": 659, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9AC1DF6A2B557D4CBB80C8C421CE47F2640" - }, - { - "Count": 660, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C7859C0EDC651333A110579F6E9DF0572" - }, - { - "Count": 661, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A629696E2DA1DD0D3442C1454963880E18AB4D" - }, - { - "Count": 662, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E8020AF3C22065FF8D0666E36D0860777" - }, - { - "Count": 663, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282CF6E4256486E3F903FEC202CFFEFD1A2" - }, - { - "Count": 664, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B5735B89160F7B7DCE08D08754B9396011C" - }, - { - "Count": 665, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD36ACD2C00121CC146FCA84D03F43C72A2" - }, - { - "Count": 666, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8D82FB650A14ACA291105045A08CAC8E5" - }, - { - "Count": 667, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C536BD2EDCBEF7C0304CC215468F0B616006" - }, - { - "Count": 668, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F1257F45950744373BC88AB4981EB4FBDA5" - }, - { - "Count": 669, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A4212376C2E6D1B3569A235F8F9922F3BC54" - }, - { - "Count": 670, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611C95A8ED4A08C451E051BC24EC7075EBF" - }, - { - "Count": 671, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92328100429F7A68CAB2D66DA41D17674EDC" - }, - { - "Count": 672, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F234DC55F75B35811E008C8DEE45C68E810" - }, - { - "Count": 673, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C176E26FB3CCE982444D3598C2B78F88E6" - }, - { - "Count": 674, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC60E4F2583710E3CC4358C3A9E0AB59B2" - }, - { - "Count": 675, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B233839F9C2722BB1AB0BD9372EAF18761AE" - }, - { - "Count": 676, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA175BF293DE9E677010A82D4D7A608768569" - }, - { - "Count": 677, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A60FB5289C45C7FF72A78A8FAF1F1486FE" - }, - { - "Count": 678, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E37B3EC4C7AF9A8D91F05CA588CB4701D2" - }, - { - "Count": 679, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F579793389F428B6EA66C9F27FDCCE25D388A" - }, - { - "Count": 680, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F9B0C33A8B17268F1C675D5DF2E828863" - }, - { - "Count": 681, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D806057345244C5D8EDDFADE45CFA4AB9B" - }, - { - "Count": 682, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCA6BABD53B935F0FB7562D985815B1DE33" - }, - { - "Count": 683, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751AB280E6C82C724F9BEAE005527A00796B" - }, - { - "Count": 684, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD1CE1459AF61E3D014583DC165DD18331" - }, - { - "Count": 685, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA9753AFF1A96990F6CE4D586C268C6E1C2D" - }, - { - "Count": 686, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB78CC1DE6CFD3EC3F36886B3EF46344931" - }, - { - "Count": 687, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD17C8D203A2B654963AD1C4F529B1AF8B12" - }, - { - "Count": 688, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2C6A59DFDDE2801B76C528FA2BBF51521" - }, - { - "Count": 689, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D503528D1C94A411CE55EB20E236A4DAF7492" - }, - { - "Count": 690, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C1452F47B53BC81DE71C507685B52BE85CE" - }, - { - "Count": 691, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F3B8D31604063B4E2A1CA1831BB81E18CD" - }, - { - "Count": 692, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCA611D091A3715F89C5930AA308AC470D2" - }, - { - "Count": 693, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C96E8F353CED300A79D2A12BC2A45E9360F" - }, - { - "Count": 694, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A62969F03B39B24597385E9B17AFA50C5FB197CE" - }, - { - "Count": 695, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E0244B8C948E8B0BE2E0E1504FD7D8903AC" - }, - { - "Count": 696, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282B76F3DA6ED546067A8813B27228A96D794" - }, - { - "Count": 697, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B57BA57BE9A3AEDE2BC0E0893362CDEDF44F4" - }, - { - "Count": 698, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD353E20CBF27793F46126E3D7E5AC91FF1C0" - }, - { - "Count": 699, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8B3535C17F33844D991F618A0EECA836150" - }, - { - "Count": 700, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C5361DAC79C5652F17080765E51E1EC05EC546" - }, - { - "Count": 701, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F1277F422BCD0C2AC4338A6E7068524E38F89" - }, - { - "Count": 702, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A42168565CAC09CBA0B66207D6176C1CE04849" - }, - { - "Count": 703, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611BCF504416276AF29C2F7322325A6632838" - }, - { - "Count": 704, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92325FB22EA02F3E76CF1D514DBCEEEA94945E" - }, - { - "Count": 705, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F238CFC5544BFFBC0890CEFBFF2EA9B30FD35" - }, - { - "Count": 706, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C19EAE61BE39C3E5D3524732D7E4A41D9ED8" - }, - { - "Count": 707, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC961142A09C821AAB2C1A0B6381CCF78C3C" - }, - { - "Count": 708, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B2338695A3943787BD8E8013F541E36590E9C8" - }, - { - "Count": 709, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA175172B9CFFC84BA80A93FC4B490FC67A4110" - }, - { - "Count": 710, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A6B5B8D7753411001DBD4243EBBDA3EF4A06" - }, - { - "Count": 711, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E39CC56D19F4E1A90403154EE4E458E13068" - }, - { - "Count": 712, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F5797DDB329F3AE1C8403826CAAC8626133DFC3" - }, - { - "Count": 713, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F91EB75D0642366034C82ACF4E22134A0F3" - }, - { - "Count": 714, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D860DF7C59F1FDDFFC3DA01E4642ADA4E82C" - }, - { - "Count": 715, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCAFDC219B6417FEDB7D039C647229A82348D" - }, - { - "Count": 716, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751A54F4B5374EC5A9AB06B581C37B56CA3782" - }, - { - "Count": 717, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD3B7403A83E5BA52B35AA88EB37870B8B72" - }, - { - "Count": 718, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA97ABAD22B23C697577A4DDA488E60E4DF247" - }, - { - "Count": 719, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB781E1FF867A129EAC34DC84695A57D036CA" - }, - { - "Count": 720, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD174A005555BBE996361BCC1D177513DA66A6" - }, - { - "Count": 721, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2DE22407A088EFEE0CE78B124C360C09E52" - }, - { - "Count": 722, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D503514EB4C38DADD377BC5022194083B9655C0" - }, - { - "Count": 723, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C146B54A953B1EFF97D5BDB7311632214F430" - }, - { - "Count": 724, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F37EC3ACE7959A6E7F793424F09A8FB069C0" - }, - { - "Count": 725, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCADCB42FC59A9F44095B5D1D9AAAF29CA540" - }, - { - "Count": 726, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C96510BADB949AEC0BED850F2624441B2CBB7" - }, - { - "Count": 727, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A62969F011A59D472724B15652A8BB8F0FFC88AE11" - }, - { - "Count": 728, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E023EC8CA499E78DC4A85672AF84FAE3D1595" - }, - { - "Count": 729, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282B79C44067C9710577276697E4C28C6229D3E" - }, - { - "Count": 730, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B57BA0AAA52DA1767FB5242D68BE98A6BBEC1ED" - }, - { - "Count": 731, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD35309F6053A0952AC087198A71C8E2CD3D568" - }, - { - "Count": 732, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8B36CBEE0191657AF2A8C961F0B45AC599545" - }, - { - "Count": 733, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C5361DE82A91F9BC0A4146A107B0EAD8256CDBEF" - }, - { - "Count": 734, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F12773A1A8F71F83D407E2B358BF10BF353AD56" - }, - { - "Count": 735, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A42168DB5DCF2659AACEA15DCBE45279B98D619F" - }, - { - "Count": 736, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611BCA5006AD3B45CF31EB65A5D88F07B46E410" - }, - { - "Count": 737, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92325FF261A058F925A42F124FD5FC483B5E1687" - }, - { - "Count": 738, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F238CCC6D1516FE1EB34EDE6227A4A8ADFE8F0F" - }, - { - "Count": 739, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C19E8C000E4E348A8AE287F33009C1E8846CC3" - }, - { - "Count": 740, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC96C4DBEEA6A26105488203B51BBB67E10B8A" - }, - { - "Count": 741, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B23386D498A1CFC30317BDED86A9D02DD31A8D15" - }, - { - "Count": 742, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA1751742CC2842B8F0AEB7727C3FCFBB72084CE2" - }, - { - "Count": 743, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A6B58BF3DAFE612668AE9358B34776A9AE96BE" - }, - { - "Count": 744, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E39C4BCA62A7DDA66B93F909D25F76ABEA4B96" - }, - { - "Count": 745, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F5797DDBF6B9E7C5E4D88390E0918FD47F21BD13E" - }, - { - "Count": 746, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F914B3AC968553A7F6C0920AAD8F2BD931975" - }, - { - "Count": 747, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D86016AE3B6ED9B1E4103B190EE06F72755595" - }, - { - "Count": 748, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCAFD123BBAA1E0609DA5A85CB2E70119FCFE5F" - }, - { - "Count": 749, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751A54CAF2BE35861CD2F9D72AE6D69380C804C7" - }, - { - "Count": 750, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD3B1911D3DD6F5A0A1F75CB346F52CD039254" - }, - { - "Count": 751, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA97AB933092CB206E65E589999B6EC3578D7BCC" - }, - { - "Count": 752, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB781EB8B2FF8EBD79141EC751BDFA30B7367E8" - }, - { - "Count": 753, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD174A2BC65C5BEEFF6402F3E2804150AD72C0D1" - }, - { - "Count": 754, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2DEA47B1FB0294BEF1F6F55EA67826BEB4FDF" - }, - { - "Count": 755, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D5035146E7E517E44265CD423A09D453F1F6AEC0B" - }, - { - "Count": 756, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C146B4BEBCC8AC39E5DFEA27EF0C642CC96A556" - }, - { - "Count": 757, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F37EF976588AD3466D57D29C2DC05097C04134" - }, - { - "Count": 758, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCADCBEE19B27B4E65A2E97AB4C25B18063CFC3" - }, - { - "Count": 759, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C9651D79C09E1DD320EE1E7D3B20F4BF01EAF05" - }, - { - "Count": 760, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A62969F011D89F149FEE5AB2A8BB8DC7F58AB582A750" - }, - { - "Count": 761, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E023E8354C4600E277F8DD040558801F05F376B" - }, - { - "Count": 762, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282B79C37FCF310B88623F3FF545349CB3565AABC" - }, - { - "Count": 763, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B57BA0ABC96AB5C446FBE8FD6CBC20872BF06C18B" - }, - { - "Count": 764, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD353094DB3A4DDE01E96B9AB2CC97B55EE1A132B" - }, - { - "Count": 765, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8B36C1C8AAD92CEACB81D51293164449F859E3E" - }, - { - "Count": 766, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C5361DE854F4372B1C7558BD39792E6CFEBC664CE2" - }, - { - "Count": 767, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F12773A39E33AB0B340153EC6871B392306F64A8F" - }, - { - "Count": 768, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A42168DBA20935D0B6E7D4019490CB93BD397832F2" - }, - { - "Count": 769, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611BCA539EDD57532F2A060FE5FAA91B4A7F370A9" - }, - { - "Count": 770, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92325FF2A22D70D97EDDF9AD73A8B473F107CFF9B4" - }, - { - "Count": 771, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F238CCC04F75BF026EF5BE70D67741B339B908B04" - }, - { - "Count": 772, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C19E8CB31CFB6EFE5065E58DD25026020BBE6272" - }, - { - "Count": 773, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC96C47DAE65C5F04BF88959F3A40FDA66AB24A7" - }, - { - "Count": 774, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B23386D40295AC1EF003BDCDA494B8A39228243A76" - }, - { - "Count": 775, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA1751742D59DA4942800ED90B05C0352BB73448BB0" - }, - { - "Count": 776, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A6B58BD5C8D0D81D193B1BEA11EBF8B6AA9E503A" - }, - { - "Count": 777, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E39C4B7F2DB90BB917BE31A6E0340ECFF20D6F69" - }, - { - "Count": 778, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F5797DDBF081AB838F58B70F1E445759CE7AC19B09B" - }, - { - "Count": 779, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F914B256ED3048A6EBD365EE9059DE84357CC07" - }, - { - "Count": 780, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D86016C7CEA5B3D6D01A785A0477C8B11D7CB84E" - }, - { - "Count": 781, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCAFD12C3395D423522519991179D9BACEBCF94BC" - }, - { - "Count": 782, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751A54CACDD2D2FB6F298740C62593C16746E9BE88" - }, - { - "Count": 783, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD3B1942A49BF98AD5A87442260702341FACF542" - }, - { - "Count": 784, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA97AB936C165C897BE51BB9B222F00DFB70A5B4A5" - }, - { - "Count": 785, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB781EBBA36E40A5CA6B79BED6E7FDD0A21F18109" - }, - { - "Count": 786, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD174A2BD5DF1FCEC7E06BA98F63FB62BF81D4E493" - }, - { - "Count": 787, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2DEA469FEB794A79FECAE5A33B1B7A71551CCF9" - }, - { - "Count": 788, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D5035146EDF1BEEDA653540CB2899105E64535A197D" - }, - { - "Count": 789, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C146B4BE9F1DF981AC294D7B6882DA938D3470FB9" - }, - { - "Count": 790, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F37EF9F2323C0A69A464FF369EF9A44CCA6FC237" - }, - { - "Count": 791, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCADCBEFDE98120DBEF0F0B7F87C4798671579F65" - }, - { - "Count": 792, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C9651D77618DFCE6C02F2A805265EBFB4ABCCF51A" - }, - { - "Count": 793, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A62969F011D86D1440DEBA7F9A5E7407084FD958AC0E91" - }, - { - "Count": 794, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E023E83BD51C61E904BF57553AF1F77F25A41A2F3" - }, - { - "Count": 795, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282B79C3768A8A6B98C27E1053B546BC4AE91B698B0" - }, - { - "Count": 796, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B57BA0ABCEEAAB2BED2C03BBE7F72502CDEA679A1E9" - }, - { - "Count": 797, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD353094DE6B6B2B67F506A25693400F5CB7F631A53" - }, - { - "Count": 798, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8B36C1CCAC7F18B82D0350A1862573C70BEAECDF5" - }, - { - "Count": 799, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C5361DE8544642A63B0B410EA679DFA224C1A02F8C10" - }, - { - "Count": 800, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F12773A39CFDE1D43F96224EE606E0F235FECFB3146" - }, - { - "Count": 801, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A42168DBA287994B3BAC8F32EA9950DC081D7183199D" - }, - { - "Count": 802, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611BCA539E26A1F98171D5867A195A6ACF98171BFB0" - }, - { - "Count": 803, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92325FF2A23B607ABE68B76630B21EA8981DEB402002" - }, - { - "Count": 804, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F238CCC045EF1CC2A2DE58C6024574A5488F95600CF" - }, - { - "Count": 805, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C19E8CB33707B86EDCF01EB6A95E1284996B71CA08" - }, - { - "Count": 806, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC96C47D09768C8D39A45B2E70136F4FD89DEA7B3C" - }, - { - "Count": 807, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B23386D402561BE5E3BD22CAEB22091D0B28CA9B2D61" - }, - { - "Count": 808, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA1751742D588A9B5503CCED34D42DEBA1F11FD0143D8" - }, - { - "Count": 809, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A6B58BD5720DB82DF4D7352792FE541841060AAF26" - }, - { - "Count": 810, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E39C4B7F2050321C588D08423D7679DE614B18F32B" - }, - { - "Count": 811, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F5797DDBF08215CDF221440EE1693AE4989C02947BA90" - }, - { - "Count": 812, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F914B2506585FAD4E12970CDD82A73F75D90229C1" - }, - { - "Count": 813, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D86016C759D82BFD8C0C4335F1D1505B05A53576C1" - }, - { - "Count": 814, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCAFD12C300C9E714681B81E22F50FCD65E1F1E03E6" - }, - { - "Count": 815, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751A54CACDBFA7C3FD65C3B5AF9D45681C4128119B72" - }, - { - "Count": 816, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD3B19427CC4FA8FAA94687865E3616812BB94EFEF" - }, - { - "Count": 817, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA97AB936C5CF56418821D97C0AF15410DC7AD411BA9" - }, - { - "Count": 818, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB781EBBA276E787AF7C6772F6B6BB209A5CB80FAC8" - }, - { - "Count": 819, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD174A2BD51223D95D68C8F6B29E8D35E33805F70D47" - }, - { - "Count": 820, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2DEA469805F740179E3E986D9C4F47F7A6E59B73E" - }, - { - "Count": 821, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D5035146EDFC523D4476FD9B91A4694491932E439F92E" - }, - { - "Count": 822, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C146B4BE926D4CBDD2D7A28FFE5530AF6034723EDFD" - }, - { - "Count": 823, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F37EF9F2AF006D2C8D1359BF9F529546F5F963FF81" - }, - { - "Count": 824, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCADCBEFDE57D7DB6FE632595BFA05E065136C23481" - }, - { - "Count": 825, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F1011121314151617", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C9651D77679B23CD4428C1076630A2BA8D3CE73ED8C" - }, - { - "Count": 826, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A62969F011D86DE587FFF7E4BE0D7CE4035624EFDF80BC71" - }, - { - "Count": 827, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E023E83BD7935F56C4B0EC00C74E38507B9FA7B9C5D" - }, - { - "Count": 828, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282B79C376804D91830942C0CE4177D9EC2EA9F88020C" - }, - { - "Count": 829, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B57BA0ABCEE62F8E20A99564937A1D792A7847CD158AD" - }, - { - "Count": 830, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD353094DE6C7EF765A3AB058E5E22B0D906884F84165" - }, - { - "Count": 831, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8B36C1CCA7A0662D07537F281369968BFA77B28E7F1" - }, - { - "Count": 832, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C5361DE854466C0CACA27CEDC501553AA1219EE2181398" - }, - { - "Count": 833, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F12773A39CF0490B07AAC4CE5FC47C417C801FFFD21A5" - }, - { - "Count": 834, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A42168DBA2870A02642D539DA46A22B76A4EFC18BB2D0A" - }, - { - "Count": 835, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611BCA539E2DFEEC7131D2726B5EB839F7206E89EA06C" - }, - { - "Count": 836, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92325FF2A23BF99F8CCD1202243783E701E6749F0D9E2D" - }, - { - "Count": 837, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F238CCC045E2B8CF4533BBBE440430F3CCDEE26936B3E" - }, - { - "Count": 838, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C19E8CB3371481D7F9DC9DAE9527BD75E4B00F24C94E" - }, - { - "Count": 839, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC96C47D0936ACD4F1C18AC81275B1FAFAE789768D59" - }, - { - "Count": 840, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B23386D4025638E7899EFFBE172E96336D586B35DA4CB8" - }, - { - "Count": 841, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA1751742D58834BCEA5607C805F88DC6E92B4D16692955" - }, - { - "Count": 842, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A6B58BD5729D15484E376D0B43C786F4786313E377B2" - }, - { - "Count": 843, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E39C4B7F20537D435988B95988F9354EDEF33738C59E" - }, - { - "Count": 844, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F5797DDBF08211735824E72F48B9D63D92175A456E78451" - }, - { - "Count": 845, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F914B250690FBC889CE9DD6924ED68E0D23E35BD169" - }, - { - "Count": 846, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D86016C7597394891F3BEDFA2E8CCFC5F879298D5DD3" - }, - { - "Count": 847, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCAFD12C3000474B69AD8C6C630C45E4BBAC4150BD6C2" - }, - { - "Count": 848, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751A54CACDBFB149CAB9929041B9C4316EAFA7CA7BB389" - }, - { - "Count": 849, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD3B19427C3E3DB1C4838658328F0F00658A48F759CC" - }, - { - "Count": 850, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA97AB936C5CC66C5D8299B9F9FAFF9341E9A92D8B5CC3" - }, - { - "Count": 851, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB781EBBA2746D528B993E57E055B9DD491ABB8D5619C" - }, - { - "Count": 852, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD174A2BD5127CA7110C36BF6198A56B18BFCD8AFBA197" - }, - { - "Count": 853, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2DEA46980E6B0152DE94D9EA0BD84AF15AA8F34E0A7" - }, - { - "Count": 854, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D5035146EDFC5765A93888901BD72C8C19E58981C70CB9C" - }, - { - "Count": 855, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C146B4BE9264855E799E7FFE1B3B1744B14985B8D2A66" - }, - { - "Count": 856, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F37EF9F2AF6F4FC108FA40F0459C5CA0800B5C01CE15" - }, - { - "Count": 857, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCADCBEFDE59C5532BAABBD552C3F4D96EAEE13665E01" - }, - { - "Count": 858, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C9651D77679978956DDB5839DC8ED1F17798395EB30B1" - }, - { - "Count": 859, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A62969F011D86DE54DB68EBB4E30166F5F06EFEC555D501CBB" - }, - { - "Count": 860, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E023E83BD7916A92F9F15D84BE0D29E7DE9DB17305F5D" - }, - { - "Count": 861, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282B79C3768047E1A6F7DE12309E3D9598A7BC7A150119D" - }, - { - "Count": 862, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B57BA0ABCEE6231AED4B80BFD158F49AE2A6612D0457A8C" - }, - { - "Count": 863, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD353094DE6C7EE000112CD2660A31D29D62F3BF42A2987" - }, - { - "Count": 864, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8B36C1CCA7A211172471136EDFAE1E46A3C9F7D874195" - }, - { - "Count": 865, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C5361DE854466C62423467AF3BAA6DC44C20EB02E6A443C9" - }, - { - "Count": 866, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F12773A39CF0499069133FB6AD122031AE015E42A7E5B72" - }, - { - "Count": 867, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A42168DBA2870A844882A077D994ED8AF0B550C21D059FE8" - }, - { - "Count": 868, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611BCA539E2DF705FC6210A9F30F0DFCD8A7095CD8E2FC6" - }, - { - "Count": 869, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92325FF2A23BF902381AB05B09CB4F87639D36CA02C3702F" - }, - { - "Count": 870, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F238CCC045E2B80CB91FF4B817ECC207E186D89D45EA26E" - }, - { - "Count": 871, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C19E8CB33714EE8917E7206EEC4B7B7375940344DBEE8C" - }, - { - "Count": 872, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC96C47D09363E8520BD86D10CDBE381730CCBB0263898" - }, - { - "Count": 873, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B23386D4025638F48D80A1FEE41B1F9DA9CB7190A490C4CF" - }, - { - "Count": 874, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA1751742D58834C606459639575DCB2767BE30D58B1225F5" - }, - { - "Count": 875, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A6B58BD5729D76ABB3EDE777968604088AD6793146A5EA" - }, - { - "Count": 876, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E39C4B7F2053C002F70914D628279EEBB60A43F15D2B9D" - }, - { - "Count": 877, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F5797DDBF082117CC6DB902A776D204A96CF64490745A5DB9" - }, - { - "Count": 878, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F914B250690715CA94277324A85FF940C16FED14231A7" - }, - { - "Count": 879, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D86016C759731FAA771DE357E80E3F6435363FBF77A68A" - }, - { - "Count": 880, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCAFD12C300049ED74A356DA29E8608B5E992747E1C7941" - }, - { - "Count": 881, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751A54CACDBFB164BA2182EAB0293FDD4063AA5062702E0B" - }, - { - "Count": 882, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD3B19427C3E37104696496DEDAA76F01DCA453CA24D70" - }, - { - "Count": 883, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA97AB936C5CC6E6155256503053053F04F9E5E96C27E750" - }, - { - "Count": 884, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB781EBBA2746019EE7FBFDFDD751763DDB9ECBECD3B31E" - }, - { - "Count": 885, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD174A2BD5127C955383DD8A84862DE1BE97992FEB6A948C" - }, - { - "Count": 886, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2DEA46980E6D5ECD1B487E15D017D0AC675C5E43A674E" - }, - { - "Count": 887, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D5035146EDFC576CC27ED673F73EF4B3A6D7E66FD3E0C8A34" - }, - { - "Count": 888, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C146B4BE92648B404AC8F680F7834B93B3242E7C2539F33" - }, - { - "Count": 889, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F37EF9F2AF6F65756537C2353A6976C88E6F9D5C7A09EE" - }, - { - "Count": 890, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCADCBEFDE59C5A551E6EDA9776145E0DD43FF4F4756050" - }, - { - "Count": 891, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C9651D77679971E63969DDCFA1324ADA0BA47CB8251AB60" - }, - { - "Count": 892, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A62969F011D86DE54D5BA1DA1758B204B91EE4D0FFF3F8269653" - }, - { - "Count": 893, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E023E83BD7916CCADD999E7A7481D9C5FB8B844461F03D2" - }, - { - "Count": 894, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282B79C3768047E7EA99199A7C92FE592789C2242FA953591" - }, - { - "Count": 895, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B57BA0ABCEE623183C94EC75204B463E674FDD475BB8934F5" - }, - { - "Count": 896, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD353094DE6C7EEA428079BAF7FAFF6D3AD74EDC8D32A4BA1" - }, - { - "Count": 897, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8B36C1CCA7A2189E544C8F620FBEBED97CCE8021DB89439" - }, - { - "Count": 898, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C5361DE854466C62A2691A745C01FF77C0D567F563DF1C1C27" - }, - { - "Count": 899, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F12773A39CF0499BFECFAE82DE3442D7BF0AF9FAA53F62E3A" - }, - { - "Count": 900, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A42168DBA2870A84778EC5853EB18E0928B2E94AE77AFEEE6C" - }, - { - "Count": 901, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611BCA539E2DF70F14F82B750C6BCC0BF30866A029B54181A" - }, - { - "Count": 902, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92325FF2A23BF902703213C5EF19406580A3A656EBB05A31B0" - }, - { - "Count": 903, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F238CCC045E2B800B6B52AA9DC14BAECDF1CB69AD9B224EDF" - }, - { - "Count": 904, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C19E8CB33714EEE6D7F6EF4BB35922A3DCCE65815705C47C" - }, - { - "Count": 905, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC96C47D09363EAFE60E5AA1452608B9AF43F27A6D286730" - }, - { - "Count": 906, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B23386D4025638F44CE2898377518AA1F3E1AC2FAA3E6819C2" - }, - { - "Count": 907, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA1751742D58834C6BED2528B247AAF3F4AEF1449B530F2F6F7" - }, - { - "Count": 908, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A6B58BD5729D765A523116C9ECB30EC5B8B635C8763A0D1C" - }, - { - "Count": 909, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E39C4B7F2053C0593C9D7EFA42BC3371B0CB5AFA3DB48A9F" - }, - { - "Count": 910, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F5797DDBF082117CCA385790397DAA2A37AC6A6B53CF10A069D" - }, - { - "Count": 911, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F914B250690711CF23A3C718B168D4E68E635A186C5EE8E" - }, - { - "Count": 912, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D86016C759731FE936FDDA032841A480E0FEA8F7204DAA2F" - }, - { - "Count": 913, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCAFD12C300049E10E75DC43A3D5A5ECDDCBB9AEEA5846BA7" - }, - { - "Count": 914, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751A54CACDBFB164059DEA4EC3E7A97BD0B013B66F3707B8CB" - }, - { - "Count": 915, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD3B19427C3E37C12BF203300DEF5703983DF6744D03A101" - }, - { - "Count": 916, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA97AB936C5CC6E6E46E8CC221FC3A4B80888E73A5A1A53521" - }, - { - "Count": 917, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB781EBBA274601790D3211E5C89C3D564EE45C671A53C0B8" - }, - { - "Count": 918, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD174A2BD5127C95F3C33BDF6C4635EA3C85B9837635DA1DB1" - }, - { - "Count": 919, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2DEA46980E6D5F509D207EFD7989B3BADCDF6F3035E4182" - }, - { - "Count": 920, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D5035146EDFC576CC43F4DDEF3C8482A2BEFE6E3BCB3EC36F80" - }, - { - "Count": 921, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C146B4BE92648B4950EA88312F400B48045B3D8FCC4F7D777" - }, - { - "Count": 922, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F37EF9F2AF6F6517401A4F93C2677332156DB180B86639D4" - }, - { - "Count": 923, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCADCBEFDE59C5A67B0148AAAF5D374D3F444C5A1FF3B1A2A" - }, - { - "Count": 924, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C9651D77679971E8EA6CB857537378B29BC9585096FF47644" - }, - { - "Count": 925, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A62969F011D86DE54D5B25CED3910A68D74577E54E77A6B4D3AC27" - }, - { - "Count": 926, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E023E83BD7916CCD8226DE1A4A6D7870534C560ED8D349E6B" - }, - { - "Count": 927, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282B79C3768047E7E8C57950EE767159F5F416936F387FF59FF" - }, - { - "Count": 928, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B57BA0ABCEE6231839D5C7DB1C49564ADC78639D66F1DBABA3A" - }, - { - "Count": 929, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD353094DE6C7EEA402262B5C763286AB3A7B2CC9D4A94EC82D" - }, - { - "Count": 930, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8B36C1CCA7A218952B763747C9F5B10BDA27AFFF33C6E1395" - }, - { - "Count": 931, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C5361DE854466C62A2AE50D1880F201876BAF3AD149AC9C491B2" - }, - { - "Count": 932, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F12773A39CF0499BF91B79B15001356F3984213693ACA5E954E" - }, - { - "Count": 933, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A42168DBA2870A847702D09CC005AD96983104322558AFF03A91" - }, - { - "Count": 934, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611BCA539E2DF70F1AACEC46D8F488B456DC171F4A72B7278FF" - }, - { - "Count": 935, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92325FF2A23BF90270703D471996CC0973F3C3475664B0FD5339" - }, - { - "Count": 936, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F238CCC045E2B800B81F87C5FD680CC7D193AAB7FD787FE4268" - }, - { - "Count": 937, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C19E8CB33714EEE6C0FD6AAB7F7CA49770DAC2E4273844D713" - }, - { - "Count": 938, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC96C47D09363EAF4B35206B8DE5321B637C872C2441EC8E30" - }, - { - "Count": 939, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B23386D4025638F44C4F33B3C3E267F87B816B5DC69AEC442331" - }, - { - "Count": 940, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA1751742D58834C6BEB3DE5300C3D58A9738E7730D951400D130" - }, - { - "Count": 941, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A6B58BD5729D765A924ECAFDCA458FB1442860C4B8A8129E8D" - }, - { - "Count": 942, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E39C4B7F2053C05963A6C04A4856C85AFB6E666B7CD114DB93" - }, - { - "Count": 943, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F5797DDBF082117CCA38103CE9298F2C005A4DECEF06511ED9954" - }, - { - "Count": 944, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F914B250690711CF8BE6B454E5A6715B2CB568EED53ADEB3A" - }, - { - "Count": 945, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D86016C759731FE9748668CEAEBD0E21766CEC069B08101906" - }, - { - "Count": 946, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCAFD12C300049E106CF9729EF974B74AA9EE75368A51236EE2" - }, - { - "Count": 947, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751A54CACDBFB16405D4DF52AB7C476AC8FE5978CB3BFC8DBA67" - }, - { - "Count": 948, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD3B19427C3E37C1CB55B2EADDFB847E1C62231902D479F727" - }, - { - "Count": 949, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA97AB936C5CC6E6E45A98793CA4EE026EF6CE7AA4C1469660CE" - }, - { - "Count": 950, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB781EBBA2746017975BD72E0DA429917E95695B816123ECCA6" - }, - { - "Count": 951, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD174A2BD5127C95F38A1E955791D1499BDE9ADEF6EBCB9143A2" - }, - { - "Count": 952, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2DEA46980E6D5F5432638B620160E0D2DF4A5710143613D99" - }, - { - "Count": 953, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D5035146EDFC576CC434FF02E573CFFB72B7E005C84B419CB5078" - }, - { - "Count": 954, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C146B4BE92648B4954718D08743F8AD353EE379884787D6110D" - }, - { - "Count": 955, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F37EF9F2AF6F6517ADFA737AE4A2D3AD05E8E123163F86537E" - }, - { - "Count": 956, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCADCBEFDE59C5A6792CBF46C2405F3D51476417CDDBF5C28CF" - }, - { - "Count": 957, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C9651D77679971E8EB4F68025B023C8084F0ACB4AE1AAE6C641" - }, - { - "Count": 958, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A62969F011D86DE54D5B258AAEAC6EC4987C23C73787E5F48372F271" - }, - { - "Count": 959, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E023E83BD7916CCD892CCD5CBAE4630F3CA3AAA5A3031CBA0E1" - }, - { - "Count": 960, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282B79C3768047E7E8C7D5EC9D7065626ABB947E426BA56829266" - }, - { - "Count": 961, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B57BA0ABCEE6231839D3C93F924CFA7418DE7909496761360338E" - }, - { - "Count": 962, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD353094DE6C7EEA4029D8986CAE55BE8D7B545BBE5C228860278" - }, - { - "Count": 963, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8B36C1CCA7A218952B85780BC39E0A5BB7BB28F52A2F477A623" - }, - { - "Count": 964, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C5361DE854466C62A2AE889093465F39DD67A210E921E04A5444BB" - }, - { - "Count": 965, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F12773A39CF0499BF919FF0E84ED21D4F1280C0926246707CCD4E" - }, - { - "Count": 966, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A42168DBA2870A847702FE8FE3D0691275ADB32875EE88EBD42C1E" - }, - { - "Count": 967, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611BCA539E2DF70F1AAAD0ADFF3F41B09E081515C7C955F1D558E" - }, - { - "Count": 968, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92325FF2A23BF90270701092351B5A27DBBBCE5918D69959FA98F7" - }, - { - "Count": 969, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F238CCC045E2B800B8113486DD8F023B68CC1DE36372BEB0C3D4E" - }, - { - "Count": 970, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C19E8CB33714EEE6C0739DA7119EF05095A1AA3578EEF960DD6C" - }, - { - "Count": 971, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC96C47D09363EAF4B202C7C35D527FB2118F47E0894514139F3" - }, - { - "Count": 972, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B23386D4025638F44C4F5E5A2DB6DB060D7BB90B52C4835F2AA873" - }, - { - "Count": 973, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA1751742D58834C6BEB3DEB384AFEE54E71CFC258821BD02BF70E1" - }, - { - "Count": 974, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A6B58BD5729D765A92028E9C359D7A94B64E902D80CFEF7DF36F" - }, - { - "Count": 975, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E39C4B7F2053C05963BD59B06185DBA866ED813471D2B34B619C" - }, - { - "Count": 976, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F5797DDBF082117CCA38135916951CFA80700265780BF83079C91FD" - }, - { - "Count": 977, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F914B250690711CF856905BFEF6E9E68B9C88BD97D594CCFFE8" - }, - { - "Count": 978, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D86016C759731FE974E3F6695FF1753C8B9B0D88C619DB06E004" - }, - { - "Count": 979, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCAFD12C300049E106C7B19D0B7724DEBA49F2FBA344FBD31B7F6" - }, - { - "Count": 980, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751A54CACDBFB16405D404F3D21B54CD1C1052D9164ACCB2B43097" - }, - { - "Count": 981, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD3B19427C3E37C1CB9E223D46081DEB6BA8DE8EE319D087FCE0" - }, - { - "Count": 982, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA97AB936C5CC6E6E45A304BA3CD1C82A0299C264F03C44D2B934F" - }, - { - "Count": 983, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB781EBBA274601797583D336348E1903CBF53A0562971B16ADD3" - }, - { - "Count": 984, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD174A2BD5127C95F38AF55E271723DB73C92AF81DAE2EC1CA3F89" - }, - { - "Count": 985, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2DEA46980E6D5F54335FF4263B6945B604820680D3F984189DC" - }, - { - "Count": 986, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D5035146EDFC576CC434FB3DA74E336B022C5E41F70696B9EA969C8" - }, - { - "Count": 987, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C146B4BE92648B49547B97A728ED64D87821BEF32DBFE97FE41E7" - }, - { - "Count": 988, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F37EF9F2AF6F6517AD208B83461049DE01E60CC7EAB8D5755945" - }, - { - "Count": 989, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCADCBEFDE59C5A67923252203AAF451FCF9239009A0BCF6EE249" - }, - { - "Count": 990, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C9651D77679971E8EB4A8F310923AF573F282C34282CBE9B425A8" - }, - { - "Count": 991, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A62969F011D86DE54D5B258AF8328B14D6403DE210175E6B397B4EC47F" - }, - { - "Count": 992, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E023E83BD7916CCD892E99FD2556D66AF6FC34921CA8B7F199865" - }, - { - "Count": 993, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282B79C3768047E7E8C7D2E6A23F9FA59CBD8850BA7A05F50F2DD42" - }, - { - "Count": 994, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B57BA0ABCEE6231839D3CD6E492AD31E5A1F6B337B36D88F97BE7E4" - }, - { - "Count": 995, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD353094DE6C7EEA4029D345E66C93A69FB9C9F0344DE7E6009152F" - }, - { - "Count": 996, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8B36C1CCA7A218952B8526689550460CF36E6112CC80D7E51E14A" - }, - { - "Count": 997, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C5361DE854466C62A2AE88B3CEC97E8539C6DA179C6347648E4F1D4E" - }, - { - "Count": 998, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F12773A39CF0499BF919F7CD59FA64CCA9DD15C66D5C7293BB04AFF" - }, - { - "Count": 999, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A42168DBA2870A847702FE00EA469E5365ADF05B75FFA95F0D72CF14" - }, - { - "Count": 1000, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611BCA539E2DF70F1AAADCF75CAF5F2159793BA330858AA97986F01" - }, - { - "Count": 1001, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92325FF2A23BF9027070102B6A14C494578BD8C61A1BC454CB30642C" - }, - { - "Count": 1002, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F238CCC045E2B800B81133CCA4D67FBB8445E7D0E79BB205845AABE" - }, - { - "Count": 1003, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C19E8CB33714EEE6C073256FF08776ACE02BD44EE8FBFD85A2D123" - }, - { - "Count": 1004, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC96C47D09363EAF4B207893B71FE6233D10951A912B5C1752E31B" - }, - { - "Count": 1005, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B23386D4025638F44C4F5EE322350932196E3553EC7732ED65F3A393" - }, - { - "Count": 1006, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA1751742D58834C6BEB3DE1C2B10B539483CC9BABA06565494E5A102" - }, - { - "Count": 1007, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A6B58BD5729D765A9202E78A46D150FCC788A88FE6B24537DA9E35" - }, - { - "Count": 1008, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E39C4B7F2053C05963BD3E50DA417F86F63D40EF0C85787C92B811" - }, - { - "Count": 1009, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F5797DDBF082117CCA38135C77CB83F0E21217AF03C61C348111D8218" - }, - { - "Count": 1010, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F914B250690711CF8564DCB4A6E39F9AE1A96667FC884356DC9CD" - }, - { - "Count": 1011, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D86016C759731FE974E3857B9CD9764DCAFCDC21BA6340C2FA4C46" - }, - { - "Count": 1012, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCAFD12C300049E106C7BAA6346E3E7E57261ED332F4250E3B99836" - }, - { - "Count": 1013, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751A54CACDBFB16405D40426FF13B720A36B9BC0C74E3F939F8257F0" - }, - { - "Count": 1014, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD3B19427C3E37C1CB9E056CAD436E0DA2A601B49CBC636C9153FA" - }, - { - "Count": 1015, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA97AB936C5CC6E6E45A301071EAE6A7C65A17E2FC66B249C5C8E0CC" - }, - { - "Count": 1016, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB781EBBA27460179758319360DC759330C42CCE425ADE952C778BE" - }, - { - "Count": 1017, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD174A2BD5127C95F38AF54640CA6E18F0C3E249317BB52958A58D39" - }, - { - "Count": 1018, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2DEA46980E6D5F54335CA8EF99092630AA0BC4C6706FA0DB0A4F2" - }, - { - "Count": 1019, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D5035146EDFC576CC434FB3D0D60A9049A62A8E0AF9B0F4C14DAFFC28" - }, - { - "Count": 1020, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C146B4BE92648B49547B96D756BADA3A552C87B06784C15E7747B04" - }, - { - "Count": 1021, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F37EF9F2AF6F6517AD207CD39C955D33A59121FC7A4E453A14E4A0" - }, - { - "Count": 1022, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCADCBEFDE59C5A6792320942F4343907B1FB92E0772A3F8231AFC8" - }, - { - "Count": 1023, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C9651D77679971E8EB4A8ED7749E26EB1619CA228FB3B9FD11ADDE0" - }, - { - "Count": 1024, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A62969F011D86DE54D5B258AF88C36F5E10FBE0CAAAAD1D25AFE7AB34546" - }, - { - "Count": 1025, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E023E83BD7916CCD892E9D2FF46431D0C6D829FF98FBF3C0D0AA1DE" - }, - { - "Count": 1026, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282B79C3768047E7E8C7D2E7A58BC312EB3D4253199DBDCFA7D15B6FA" - }, - { - "Count": 1027, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B57BA0ABCEE6231839D3CD64EAEB10F43A0B67AE2D23F99B1B7B63417" - }, - { - "Count": 1028, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD353094DE6C7EEA4029D343C806BE2134639B7CC71A177E0621D6283" - }, - { - "Count": 1029, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8B36C1CCA7A218952B8527CB0A2E50F223412C24F9ED23C4FE0A5DC" - }, - { - "Count": 1030, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C5361DE854466C62A2AE88B36D03EB17875835AF0E54E6BFE62EB61C1E" - }, - { - "Count": 1031, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F12773A39CF0499BF919F7C9BE4817571C3BF73BEC26B94244FE07486" - }, - { - "Count": 1032, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A42168DBA2870A847702FE00562C880375BD75518B4BD410608FEF130B" - }, - { - "Count": 1033, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611BCA539E2DF70F1AAADCF99B888FDC27E8F4676754A5B563E32BD3B" - }, - { - "Count": 1034, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92325FF2A23BF9027070102B783D9E75ECF2B68E2E07D5BF6BAF797CDF" - }, - { - "Count": 1035, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F238CCC045E2B800B81133C50222104858D69B8AB4AE1761506C1E692" - }, - { - "Count": 1036, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C19E8CB33714EEE6C073258902A6C201354D7369D552394CCB707F53" - }, - { - "Count": 1037, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC96C47D09363EAF4B2078ACAC0580BCC0F0D9565DAAF998131F1176" - }, - { - "Count": 1038, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B23386D4025638F44C4F5EE37FF6DBF0CF6E732FAA845D70C2BACE37CE" - }, - { - "Count": 1039, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA1751742D58834C6BEB3DE1CFB770B327B9F6F777B9F5E6E3AC50C8AEC" - }, - { - "Count": 1040, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A6B58BD5729D765A9202E7AF0BC835FF51021375609235D3529FE3A3" - }, - { - "Count": 1041, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E39C4B7F2053C05963BD3E114C57325688E2CF1EF80C089A8085E749" - }, - { - "Count": 1042, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F5797DDBF082117CCA38135C7EB356BCDAB80A09BF529AD8782466369F6" - }, - { - "Count": 1043, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F914B250690711CF8564D947D010F54A459C3274CC15099A18C304E" - }, - { - "Count": 1044, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D86016C759731FE974E385EA239EA97B6D1B5F4D4D02A2250DFB1498" - }, - { - "Count": 1045, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCAFD12C300049E106C7BAA18404E4754EE596C0030316674D9C122CB" - }, - { - "Count": 1046, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751A54CACDBFB16405D40426EAEA0CC0AC8F09D2A6E77474C24092893E" - }, - { - "Count": 1047, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD3B19427C3E37C1CB9E0503FE4D7DFE66120E336BCDAC4E22EDD4B8" - }, - { - "Count": 1048, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA97AB936C5CC6E6E45A301055301A8F94FC8A654210B6B7F7412C1C53" - }, - { - "Count": 1049, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB781EBBA27460179758319F95F6DE8BAB613C0898D67780B1A516516" - }, - { - "Count": 1050, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD174A2BD5127C95F38AF546B31EBEA18A78B104DC53AD093B812D130C" - }, - { - "Count": 1051, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2DEA46980E6D5F54335CACC1B32017DC37AE78C4F77CA3C2924237F" - }, - { - "Count": 1052, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D5035146EDFC576CC434FB3D044449276C8CC8E383F6F8BCA5B11F7167C" - }, - { - "Count": 1053, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C146B4BE92648B49547B96DD8EDDC5F1D37AB4F80DE950319D68003FE" - }, - { - "Count": 1054, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F37EF9F2AF6F6517AD207CF698AE89466876E7C4D5B8B19252CB124D" - }, - { - "Count": 1055, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCADCBEFDE59C5A6792320999FCDA8A6645385F759FB583916E49527D" - }, - { - "Count": 1056, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C9651D77679971E8EB4A8EDB5229217E2A8A4EF4E706D2576F272F77D" - }, - { - "Count": 1057, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "", - "CT": "2846418067CE9386B47F0584BF9EEE3F51A62969F011D86DE54D5B258AF88C213DBF091B28119AEDB36D0B0980E664D9" - }, - { - "Count": 1058, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "00", - "CT": "A96AE9C305FCF6B4A9A50B1539B896E7806BDE0E023E83BD7916CCD892E9D2852E268E5D6D8AA577FB15F473AD1CE73C" - }, - { - "Count": 1059, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "0001", - "CT": "623F4DD472C8FB52E694B10DD79A2204A680C282B79C3768047E7E8C7D2E7AA61DBECE24F794CA811F9B40CA16AEF2DB" - }, - { - "Count": 1060, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102", - "CT": "494450185CCE77E07D6B20FE70457DE7D4852B57BA0ABCEE6231839D3CD64E10173D734A72EF5CF23DC873EAC22075BC" - }, - { - "Count": 1061, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "00010203", - "CT": "8987022AE20DD3923DF4D1F6B035701049D0EAD353094DE6C7EEA4029D343C212A832BC1DBB9A218BAA45CE16FDA883E" - }, - { - "Count": 1062, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "0001020304", - "CT": "1973543D218C55AD9B4282D7AD62CBE1149CF3D8B36C1CCA7A218952B8527C6A5F77321FFAFA956BFA5CA46C34A7DC6B" - }, - { - "Count": 1063, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405", - "CT": "4DDBF0C5CF0D50FB6F6CA1DECDC968BCB7E8C5361DE854466C62A2AE88B36D1E91DEA7F7FD4BCC4C6A2F76544783CEA8" - }, - { - "Count": 1064, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "00010203040506", - "CT": "4F599EE2F0F9CD87C533FE4BBBF1F48871271F12773A39CF0499BF919F7C9B01D77CD27B42C57C25517C9B035F147DC8" - }, - { - "Count": 1065, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "0001020304050607", - "CT": "E16C12DD1DB74FA773415872B01CB834C3D0A42168DBA2870A847702FE00565253E7B803F6561AAB65834B6600DE5B50" - }, - { - "Count": 1066, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708", - "CT": "A4C1955E7ADB209B366654617C0CF56C8B9E3611BCA539E2DF70F1AAADCF99068F75F79FE2F3DDBDFC8F1E297927BDFF" - }, - { - "Count": 1067, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "00010203040506070809", - "CT": "2A70C0A5AA0A2E10D875C05DC11AFE38DF7A92325FF2A23BF9027070102B783D2CC8E96FA8109EAD575042810BBE071E" - }, - { - "Count": 1068, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A", - "CT": "368D3F1F3BA75BA929D4A5327E8DE42A55383F238CCC045E2B800B81133C50B958E1B1E57F68DCFCF1CBD017598FEDA2" - }, - { - "Count": 1069, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B", - "CT": "32517E2275DAD64340526353C0F8588933F4D9C19E8CB33714EEE6C0732589D71B8AC3F1242D4D1E81B47E9A46A7D062" - }, - { - "Count": 1070, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C", - "CT": "5E24EB23117FB4AF340B9BEAD4615E3DBBEE45FC96C47D09363EAF4B2078ACDF9074472A1402DA8CBC285A1A19CFEB09" - }, - { - "Count": 1071, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D", - "CT": "12C38FF58D31343CA21F806543DE452EDBB3B23386D4025638F44C4F5EE37F4A035D1D492031E874B1D26703FA5C02D9" - }, - { - "Count": 1072, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E", - "CT": "CBCBE5E9529419990489D65FF2300AD9171AA1751742D58834C6BEB3DE1CFBB1C02E68CCEF2B04832943FE74144B5902" - }, - { - "Count": 1073, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F", - "CT": "1DB9005057CFC7DCC273A6722B8BE1BCA7B758A6B58BD5729D765A9202E7AF7EC32804C8C6C139FB5FBD0E57A767353D" - }, - { - "Count": 1074, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F10", - "CT": "393E98C899061CFCF58C8FDADDE7C9E4F58ED2E39C4B7F2053C05963BD3E119A736B8C4D9C4B1B0B48D0FB3A34127362" - }, - { - "Count": 1075, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F1011", - "CT": "183E1B5F67F24A59DE89980A3E9A367BB18F5797DDBF082117CCA38135C7EB16C752FC8A692CD4A9356C4D8A04BF6045" - }, - { - "Count": 1076, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112", - "CT": "5E8015D7141D16A1CFBA6AE107FE6A516AD3960F914B250690711CF8564D942B873AA7131F1D4A584D44BE2878063176" - }, - { - "Count": 1077, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F10111213", - "CT": "8278F0667EF747FD8DB9D9A55E8E5163B8DF22D86016C759731FE974E385EA9F9B158B9004156680742862371F2FC8DD" - }, - { - "Count": 1078, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F1011121314", - "CT": "50BCF4BDA30B17E736B6FA13B7549B7C0EFE0BCAFD12C300049E106C7BAA1806050D1EFA19309737F168527830CF6FC5" - }, - { - "Count": 1079, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415", - "CT": "E2A584AFD45535354D350B5BF5F7C2CA7E12751A54CACDBFB16405D40426EA20BE9D5D92C2DB0A2D31DB3E8FD8AC7EC9" - }, - { - "Count": 1080, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516", - "CT": "40F95F6901EE9B53BC7E203EEDF5080EA0B7ECAD3B19427C3E37C1CB9E0503B9E363D57F5AA89B8B48DDE03026E6C919" - }, - { - "Count": 1081, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F1011121314151617", - "CT": "20D8097632D4844A885522BC1FFBECB28CEBDA97AB936C5CC6E6E45A301055DB2127791FBE4A5B0D96E76A10412C1240" - }, - { - "Count": 1082, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718", - "CT": "655B77648AE89BBF77CDDA5CC776865B813E9DB781EBBA27460179758319F9B8620F6EFE36A309B14DDD032B6D8CCDB0" - }, - { - "Count": 1083, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F10111213141516171819", - "CT": "A4FCD9FF95B76426CD91EF5EEBD4B907C05ADD174A2BD5127C95F38AF546B30B3C3E33FFDBB8E6C948B83ABB7010C6D8" - }, - { - "Count": 1084, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A", - "CT": "00D1A14A32A985A2F61DA7774ADE7A9D9261F0C2DEA46980E6D5F54335CACCC9EC713D0F50091DBB55DC167821979130" - }, - { - "Count": 1085, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B", - "CT": "71D34F2EDEBCDD4871BE991965AC57B4D60D5035146EDFC576CC434FB3D044767E1DB379DF36B7065CE6A921EAAF884C" - }, - { - "Count": 1086, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C", - "CT": "7D4DD96F7E3FDACBFA6D9625B8C11E68F1ED3C146B4BE92648B49547B96DD86825B56752315738F99C4331A8AA508B7E" - }, - { - "Count": 1087, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D", - "CT": "A2CB18F6727A3D65CC07A050E2EA558D849D63F37EF9F2AF6F6517AD207CF6E6ECBCA676092DFB010B6A87F7B54C81DC" - }, - { - "Count": 1088, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E", - "CT": "6C459619110ADA74E585FE4424B2913E0BE9ACCADCBEFDE59C5A6792320999E6647DC2846708BA6E9B99DE058A9FCC0F" - }, - { - "Count": 1089, - "Key": "000102030405060708090A0B0C0D0E0F10111213", - "Nonce": "000102030405060708090A0B0C0D0E0F", - "PT": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "AD": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", - "CT": "CC4E07E5FB13426EFFD17B0F51A6A830BF484C9651D77679971E8EB4A8EDB5A00782A94C72B2B02D87DCF4AF75DB6996" - } -] \ No newline at end of file diff --git a/cipher/doc.go b/cipher/doc.go deleted file mode 100644 index cbc3ced2..00000000 --- a/cipher/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package cipher provides data encryption algorithms. -package cipher diff --git a/dh/csidh/consts.go b/dh/csidh/consts.go deleted file mode 100644 index fe171232..00000000 --- a/dh/csidh/consts.go +++ /dev/null @@ -1,105 +0,0 @@ -package csidh - -const ( - // pbits is a bitsize of prime p - pbits = 511 - // primeCount number of Elkies primes used for constructing p - primeCount = 74 - // (2*5+1)^74 is roughly 2^256 - expMax = int8(5) - // size of the limbs, pretty much hardcoded to 64-bit words - limbBitSize = 64 - // size of the limbs in bytes - limbByteSize = limbBitSize >> 3 - // Number of limbs for a field element - numWords = 8 - // PrivateKeySize is a size of cSIDH/512 private key in bytes. - PrivateKeySize = 37 - // PublicKeySize is a size of cSIDH/512 public key in bytes. - PublicKeySize = 64 - // SharedSecretSize is a size of cSIDH/512 shared secret in bytes. - SharedSecretSize = 64 -) - -var ( - // Elkies primes up to 374 + prime 587 - // p = 4 * product(Elkies primes) - 1 - primes = [primeCount]uint64{ - 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, 0x0017, 0x001D, 0x001F, 0x0025, - 0x0029, 0x002B, 0x002F, 0x0035, 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, - 0x0059, 0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, 0x0083, 0x0089, 0x008B, - 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD, 0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, - 0x00C7, 0x00D3, 0x00DF, 0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107, - 0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137, 0x0139, 0x013D, 0x014B, - 0x0151, 0x015B, 0x015D, 0x0161, 0x0167, 0x016F, 0x0175, 0x024B, - } - - p = fp{ - 0x1B81B90533C6C87B, 0xC2721BF457ACA835, - 0x516730CC1F0B4F25, 0xA7AAC6C567F35507, - 0x5AFBFCC69322C9CD, 0xB42D083AEDC88C42, - 0xFC8AB0D15E3E4C4A, 0x65B48E8F740F89BF, - } - - /* Montgomery R = 2^512 mod p */ - one = fp{ - 0xC8FC8DF598726F0A, 0x7B1BC81750A6AF95, - 0x5D319E67C1E961B4, 0xB0AA7275301955F1, - 0x4A080672D9BA6C64, 0x97A5EF8A246EE77B, - 0x06EA9E5D4383676A, 0x3496E2E117E0EC80, - } - - // 2 in Montgomery domain - two = fp{ - 0x767762E5FD1E1599, 0x33C5743A49A0B6F6, - 0x68FC0C0364C77443, 0xB9AA1E24F83F56DB, - 0x3914101F20520EFB, 0x7B1ED6D95B1542B4, - 0x114A8BE928C8828A, 0x03793732BBB24F40, - } - - // -2 in Montgomery domain - twoNeg = fp{ - 0xA50A561F36A8B2E2, 0x8EACA7BA0E0BF13E, - 0xE86B24C8BA43DAE2, 0xEE00A8A06FB3FE2B, - 0x21E7ECA772D0BAD1, 0x390E316192B3498E, - 0xEB4024E83575C9C0, 0x623B575CB85D3A7F, - } - - // 4 in Montgomery domain - four = fp{ - 0xECEEC5CBFA3C2B32, 0x678AE87493416DEC, - 0xD1F81806C98EE886, 0x73543C49F07EADB6, - 0x7228203E40A41DF7, 0xF63DADB2B62A8568, - 0x229517D251910514, 0x06F26E6577649E80, - } - - // 4 * sqrt(p) - fourSqrtP = fp{ - 0x17895E71E1A20B3F, 0x38D0CD95F8636A56, - 0x142B9541E59682CD, 0x856F1399D91D6592, - 0x0000000000000002, - } - - // -p^-1 mod 2^64 - pNegInv = fp{ - 0x66c1301f632e294d, - } - - // (p-1)/2. Used as exponent, hence not in - // montgomery domain - pMin1By2 = fp{ - 0x8DC0DC8299E3643D, 0xE1390DFA2BD6541A, - 0xA8B398660F85A792, 0xD3D56362B3F9AA83, - 0x2D7DFE63499164E6, 0x5A16841D76E44621, - 0xFE455868AF1F2625, 0x32DA4747BA07C4DF, - } - - // p-1 mod 2^64. Used as exponent, hence not - // in montgomery domain - pMin1 = fp{ - 0x1B81B90533C6C879, 0xC2721BF457ACA835, - 0x516730CC1F0B4F25, 0xA7AAC6C567F35507, - 0x5AFBFCC69322C9CD, 0xB42D083AEDC88C42, - 0xFC8AB0D15E3E4C4A, 0x65B48E8F740F89BF, - } -) diff --git a/dh/csidh/csidh.go b/dh/csidh/csidh.go deleted file mode 100644 index 5b6b549b..00000000 --- a/dh/csidh/csidh.go +++ /dev/null @@ -1,335 +0,0 @@ -package csidh - -import ( - "io" -) - -// 511-bit number representing prime field element GF(p) -type fp [numWords]uint64 - -// Represents projective point on elliptic curve E over GF(p) -type point struct { - x fp - z fp -} - -// Curve coefficients -type coeff struct { - a fp - c fp -} - -type fpRngGen struct { - // working buffer needed to avoid memory allocation - wbuf [64]byte -} - -// Defines operations on public key -type PublicKey struct { - fpRngGen - // Montgomery coefficient A from GF(p) of the elliptic curve - // y^2 = x^3 + Ax^2 + x. - a fp -} - -// Defines operations on private key -type PrivateKey struct { - fpRngGen - // private key is a set of integers randomly - // each sampled from a range [-5, 5]. - e [PrivateKeySize]int8 -} - -// randFp generates random element from Fp. -func (s *fpRngGen) randFp(v *fp, rng io.Reader) { - mask := uint64(1<<(pbits%limbBitSize)) - 1 - for { - *v = fp{} - _, err := io.ReadFull(rng, s.wbuf[:]) - if err != nil { - panic("Can't read random number") - } - - for i := 0; i < len(s.wbuf); i++ { - j := i / limbByteSize - k := uint(i % 8) - v[j] |= uint64(s.wbuf[i]) << (8 * k) - } - - v[len(v)-1] &= mask - if isLess(v, &p) { - return - } - } -} - -// cofactorMul helper implements batch cofactor multiplication as described -// in the ia.cr/2018/383 (algo. 3). Returns tuple of two booleans, first indicates -// if function has finished successfully. In case first return value is true, -// second return value indicates if curve represented by cofactor 'a' is -// supersingular. -// Implementation uses divide-and-conquer strategy and recursion in order to -// speed up calculation of Q_i = [(p+1)/l_i] * P. -// Implementation is not constant time, but it operates on public data only. -func cofactorMul(p *point, a *coeff, halfL, halfR int, order *fp) (bool, bool) { - var Q point - var r1, d1, r2, d2 bool - if (halfR - halfL) == 1 { - // base case - if !p.z.isZero() { - tmp := fp{primes[halfL]} - xMul(p, p, a, &tmp) - - if !p.z.isZero() { - // order does not divide p+1 -> ordinary curve - return true, false - } - - mul512(order, order, primes[halfL]) - if isLess(&fourSqrtP, order) { - // order > 4*sqrt(p) -> supersingular curve - return true, true - } - } - return false, false - } - - // perform another recursive step - mid := halfL + ((halfR - halfL + 1) / 2) - mulL, mulR := fp{1}, fp{1} - // compute u = primes_1 * ... * primes_m - for i := halfL; i < mid; i++ { - mul512(&mulR, &mulR, primes[i]) - } - // compute v = primes_m+1 * ... * primes_n - for i := mid; i < halfR; i++ { - mul512(&mulL, &mulL, primes[i]) - } - - // calculate Q_i - xMul(&Q, p, a, &mulR) - xMul(p, p, a, &mulL) - - d1, r1 = cofactorMul(&Q, a, mid, halfR, order) - d2, r2 = cofactorMul(p, a, halfL, mid, order) - return d1 || d2, r1 || r2 -} - -// groupAction evaluates group action of prv.e on a Montgomery -// curve represented by coefficient pub.A. -// This is implementation of algorithm 2 from ia.cr/2018/383. -func groupAction(pub *PublicKey, prv *PrivateKey, rng io.Reader) { - var k [2]fp - var e [2][primeCount]uint8 - done := [2]bool{false, false} - A := coeff{a: pub.a, c: one} - - k[0][0] = 4 - k[1][0] = 4 - - for i, v := range primes { - t := (prv.e[uint(i)>>1] << ((uint(i) % 2) * 4)) >> 4 - if t > 0 { - e[0][i] = uint8(t) - e[1][i] = 0 - mul512(&k[1], &k[1], v) - } else if t < 0 { - e[1][i] = uint8(-t) - e[0][i] = 0 - mul512(&k[0], &k[0], v) - } else { - e[0][i] = 0 - e[1][i] = 0 - mul512(&k[0], &k[0], v) - mul512(&k[1], &k[1], v) - } - } - - for { - var P point - var rhs fp - prv.randFp(&P.x, rng) - P.z = one - montEval(&rhs, &A.a, &P.x) - sign := rhs.isNonQuadRes() - - if done[sign] { - continue - } - - xMul(&P, &P, &A, &k[sign]) - done[sign] = true - - for i, v := range primes { - if e[sign][i] != 0 { - cof := fp{1} - var K point - - for j := i + 1; j < len(primes); j++ { - if e[sign][j] != 0 { - mul512(&cof, &cof, primes[j]) - } - } - - xMul(&K, &P, &A, &cof) - if !K.z.isZero() { - xIso(&P, &A, &K, v) - e[sign][i] = e[sign][i] - 1 - if e[sign][i] == 0 { - mul512(&k[sign], &k[sign], primes[i]) - } - } - } - done[sign] = done[sign] && (e[sign][i] == 0) - } - - modExpRdc512(&A.c, &A.c, &pMin1) - mulRdc(&A.a, &A.a, &A.c) - A.c = one - - if done[0] && done[1] { - break - } - } - pub.a = A.a -} - -// PrivateKey operations - -func (c *PrivateKey) Import(key []byte) bool { - if len(key) < len(c.e) { - return false - } - for i, v := range key { - c.e[i] = int8(v) - } - return true -} - -func (c PrivateKey) Export(out []byte) bool { - if len(out) < len(c.e) { - return false - } - for i, v := range c.e { - out[i] = byte(v) - } - return true -} - -func GeneratePrivateKey(key *PrivateKey, rng io.Reader) error { - for i := range key.e { - key.e[i] = 0 - } - - for i := 0; i < len(primes); { - _, err := io.ReadFull(rng, key.wbuf[:]) - if err != nil { - return err - } - - for j := range key.wbuf { - if int8(key.wbuf[j]) <= expMax && int8(key.wbuf[j]) >= -expMax { - key.e[i>>1] |= int8((key.wbuf[j] & 0xF) << uint((i%2)*4)) - i = i + 1 - if i == len(primes) { - break - } - } - } - } - return nil -} - -// Public key operations - -// reset removes key material from PublicKey. -func (c *PublicKey) reset() { - for i := range c.a { - c.a[i] = 0 - } -} - -// Assumes key is in Montgomery domain. -func (c *PublicKey) Import(key []byte) bool { - if len(key) != numWords*limbByteSize { - return false - } - for i := 0; i < len(key); i++ { - j := i / limbByteSize - k := uint64(i % 8) - c.a[j] |= uint64(key[i]) << (8 * k) - } - return true -} - -// Assumes key is exported as encoded in Montgomery domain. -func (c *PublicKey) Export(out []byte) bool { - if len(out) != numWords*limbByteSize { - return false - } - for i := 0; i < len(out); i++ { - j := i / limbByteSize - k := uint64(i % 8) - out[i] = byte(c.a[j] >> (8 * k)) - } - return true -} - -func GeneratePublicKey(pub *PublicKey, prv *PrivateKey, rng io.Reader) { - pub.reset() - groupAction(pub, prv, rng) -} - -// Validate returns true if 'pub' is a valid cSIDH public key, -// otherwise false. -// More precisely, the function verifies that curve -// -// y^2 = x^3 + pub.a * x^2 + x -// -// is supersingular. -func Validate(pub *PublicKey, rng io.Reader) bool { - // Check if in range - if !isLess(&pub.a, &p) { - return false - } - - // Check if pub represents a smooth Montgomery curve. - if pub.a.equal(&two) || pub.a.equal(&twoNeg) { - return false - } - - // Check if pub represents a supersingular curve. - for { - var P point - A := point{pub.a, one} - - // Randomly chosen P must have big enough order to check - // supersingularity. Probability of random P having big - // enough order is very high, as proven by W.Castryck et - // al. (ia.cr/2018/383, ch 5) - pub.randFp(&P.x, rng) - P.z = one - - xDbl(&P, &P, &A) - xDbl(&P, &P, &A) - - done, res := cofactorMul(&P, &coeff{A.x, A.z}, 0, len(primes), &fp{1}) - if done { - return res - } - } -} - -// DeriveSecret computes a cSIDH shared secret. If successful, returns true -// and fills 'out' with shared secret. Function returns false in case 'pub' is invalid. -// More precisely, shared secret is a Montgomery coefficient A of a secret -// curve y^2 = x^3 + Ax^2 + x, computed by applying action of a prv.e -// on a curve represented by pub.a. -func DeriveSecret(out *[64]byte, pub *PublicKey, prv *PrivateKey, rng io.Reader) bool { - if !Validate(pub, rng) { - return false - } - groupAction(pub, prv, rng) - pub.Export(out[:]) - return true -} diff --git a/dh/csidh/csidh_test.go b/dh/csidh/csidh_test.go deleted file mode 100644 index 9ee34412..00000000 --- a/dh/csidh/csidh_test.go +++ /dev/null @@ -1,362 +0,0 @@ -package csidh - -import ( - "bytes" - "crypto/rand" - "encoding/binary" - "encoding/hex" - "encoding/json" - "os" - "testing" - - . "github.com/quantumcoinproject/circl/internal/test" -) - -// Possible values for "Status" -const ( - Valid = iota // Indicates that shared secret must be agreed correctly - ValidPublicKey2 // Public key 2 must succeed validation - InvalidSharedSecret // Calculated shared secret must be different than test vector - InvalidPublicKey1 // Public key 1 generated from private key must be different than test vector - InvalidPublicKey2 // Public key 2 must fail validation -) - -var StatusValues = map[int]string{ - Valid: "valid", - ValidPublicKey2: "valid_public_key2", - InvalidSharedSecret: "invalid_shared_secret", - InvalidPublicKey1: "invalid_public_key1", - InvalidPublicKey2: "invalid_public_key2", -} - -var rng = rand.Reader - -type TestVector struct { - ID int `json:"Id"` - Pk1 string `json:"Pk1"` - Pr1 string `json:"Pr1"` - Pk2 string `json:"Pk2"` - Ss string `json:"Ss"` - Status string `json:"status"` -} - -type TestVectors struct { - Vectors []TestVector `json:"Vectors"` -} - -func TestCompare64(t *testing.T) { - const s uint64 = 0xFFFFFFFFFFFFFFFF - val1 := fp{0, 2, 3, 4, 5, 6, 7, 8} - val2 := fp{s, s, s, s, s, s, s, s} - var zero fp - - if !zero.isZero() { - t.Errorf("isZero returned true, where it should be false") - } - if val1.isZero() { - t.Errorf("isZero returned false, where it should be true") - } - if val2.isZero() { - t.Errorf("isZero returned false, where it should be true") - } -} - -func TestEphemeralKeyExchange(t *testing.T) { - var ss1, ss2 [64]byte - var prv1, prv2 PrivateKey - var pub1, pub2 PublicKey - - prvBytes1 := []byte{0xaa, 0x54, 0xe4, 0xd4, 0xd0, 0xbd, 0xee, 0xcb, 0xf4, 0xd0, 0xc2, 0xbc, 0x52, 0x44, 0x11, 0xee, 0xe1, 0x14, 0xd2, 0x24, 0xe5, 0x0, 0xcc, 0xf5, 0xc0, 0xe1, 0x1e, 0xb3, 0x43, 0x52, 0x45, 0xbe, 0xfb, 0x54, 0xc0, 0x55, 0xb2} - prv1.Import(prvBytes1) - GeneratePublicKey(&pub1, &prv1, rng) - - CheckNoErr(t, GeneratePrivateKey(&prv2, rng), "PrivateKey generation failed") - GeneratePublicKey(&pub2, &prv2, rng) - - CheckOk( - DeriveSecret(&ss1, &pub1, &prv2, rng), - "Derivation failed", t) - CheckOk( - DeriveSecret(&ss2, &pub2, &prv1, rng), - "Derivation failed", t) - - if !bytes.Equal(ss1[:], ss2[:]) { - t.Error("ss1 != ss2") - } -} - -func TestPrivateKeyExportImport(t *testing.T) { - var buf [37]byte - for i := 0; i < numIter; i++ { - var prv1, prv2 PrivateKey - CheckNoErr(t, GeneratePrivateKey(&prv1, rng), "PrivateKey generation failed") - prv1.Export(buf[:]) - prv2.Import(buf[:]) - - for i := 0; i < len(prv1.e); i++ { - if prv1.e[i] != prv2.e[i] { - t.Error("Error occurred when public key export/import") - } - } - } -} - -func TestValidateNegative(t *testing.T) { - pk := PublicKey{a: p} - pk.a[0]++ - if Validate(&pk, rng) { - t.Error("Public key > p has been validated") - } - - pk = PublicKey{a: p} - if Validate(&pk, rng) { - t.Error("Public key == p has been validated") - } - - pk = PublicKey{a: two} - if Validate(&pk, rng) { - t.Error("Public key == 2 has been validated") - } - - pk = PublicKey{a: twoNeg} - if Validate(&pk, rng) { - t.Error("Public key == -2 has been validated") - } -} - -func TestPublicKeyExportImport(t *testing.T) { - var buf [64]byte - eq64 := func(x, y []uint64) bool { - for i := range x { - if x[i] != y[i] { - return false - } - } - return true - } - - for i := 0; i < numIter; i++ { - var prv PrivateKey - var pub1, pub2 PublicKey - CheckNoErr(t, GeneratePrivateKey(&prv, rng), "PrivateKey generation failed") - GeneratePublicKey(&pub1, &prv, rng) - - pub1.Export(buf[:]) - pub2.Import(buf[:]) - - if !eq64(pub1.a[:], pub2.a[:]) { - t.Error("Error occurred when public key export/import") - } - } -} - -// Test vectors generated by reference implementation. -func TestKAT(t *testing.T) { - var tests TestVectors - // Helper checks if e==true and reports an error if not. - checkExpr := func(e bool, vec *TestVector, t *testing.T, msg string) { - t.Helper() - if !e { - t.Errorf("[Test ID=%d] "+msg, vec.ID) - } - } - // checkSharedSecret implements nominal case - imports asymmetric keys for - // both parties, derives secret key and compares it to value in test vector. - // Comparison must succeed in case status is "Valid" in any other case - // it must fail. - checkSharedSecret := func(vec *TestVector, t *testing.T, status int) { - var prv1 PrivateKey - var pub1, pub2 PublicKey - var ss [SharedSecretSize]byte - - prBuf, err := hex.DecodeString(vec.Pr1) - if err != nil { - t.Fatal(err) - } - checkExpr(prv1.Import(prBuf[:]), vec, t, "PrivateKey wrong") - pkBuf, err := hex.DecodeString(vec.Pk1) - if err != nil { - t.Fatal(err) - } - checkExpr(pub1.Import(pkBuf[:]), vec, t, "PublicKey 1 wrong") - pkBuf, err = hex.DecodeString(vec.Pk2) - if err != nil { - t.Fatal(err) - } - checkExpr(pub2.Import(pkBuf[:]), vec, t, "PublicKey 2 wrong") - checkExpr(DeriveSecret(&ss, &pub2, &prv1, rng), vec, t, "Error when deriving key") - ssExp, err := hex.DecodeString(vec.Ss) - if err != nil { - t.Fatal(err) - } - checkExpr(bytes.Equal(ss[:], ssExp) == (status == Valid), vec, t, "Unexpected value of shared secret") - } - // checkPublicKey1 imports public and private key for one party A - // and tries to generate public key for a private key. After that - // it compares generated key to a key from test vector. Comparison - // must fail. - checkPublicKey1 := func(vec *TestVector, t *testing.T) { - var prv PrivateKey - var pub PublicKey - var pubBytesGot [PublicKeySize]byte - - prBuf, err := hex.DecodeString(vec.Pr1) - if err != nil { - t.Fatal(err) - } - - pubBytesExp, err := hex.DecodeString(vec.Pk1) - if err != nil { - t.Fatal(err) - } - - checkExpr( - prv.Import(prBuf[:]), - vec, t, "PrivateKey wrong") - - // Generate public key - CheckNoErr(t, GeneratePrivateKey(&prv, rng), "PrivateKey generation failed") - pub.Export(pubBytesGot[:]) - - // pubBytesGot must be different than pubBytesExp - checkExpr( - !bytes.Equal(pubBytesGot[:], pubBytesExp), - vec, t, "Public key generated is the same as public key from the test vector") - } - // checkPublicKey2 the goal is to test key validation. Test tries to - // import public key for B and ensure that import succeeds in case - // status is "Valid" and fails otherwise. - checkPublicKey2 := func(vec *TestVector, t *testing.T, status int) { - var pub PublicKey - pubBytesExp, err := hex.DecodeString(vec.Pk2) - if err != nil { - t.Fatal(err) - } - // Import validates an input, so it must fail - pub.Import(pubBytesExp[:]) - checkExpr( - Validate(&pub, rng) == (status == Valid || status == ValidPublicKey2), - vec, t, "PublicKey has been validated correctly") - } - // Load test data - file, err := os.Open(katFile) - if err != nil { - t.Fatal(err.Error()) - } - err = json.NewDecoder(file).Decode(&tests) - if err != nil { - t.Fatal(err.Error()) - } - // Loop over numIter test cases - // The algorithm is relatively slow, so it tests a smaller number. - N := len(tests.Vectors) - var buf [2]byte - for i := 0; i < numIter; i++ { - _, _ = rand.Read(buf[:]) - idx := binary.LittleEndian.Uint16(buf[:]) % uint16(N) - test := tests.Vectors[idx] - switch test.Status { - case StatusValues[Valid]: - checkSharedSecret(&test, t, Valid) - checkPublicKey2(&test, t, Valid) - case StatusValues[InvalidSharedSecret]: - checkSharedSecret(&test, t, InvalidSharedSecret) - case StatusValues[InvalidPublicKey1]: - checkPublicKey1(&test, t) - case StatusValues[InvalidPublicKey2]: - checkPublicKey2(&test, t, InvalidPublicKey2) - case StatusValues[InvalidPublicKey2]: - checkPublicKey2(&test, t, InvalidPublicKey2) - case StatusValues[ValidPublicKey2]: - checkPublicKey2(&test, t, ValidPublicKey2) - } - } -} - -var ( - prv1, prv2 PrivateKey - pub1, pub2 PublicKey -) - -// Private key generation. -func BenchmarkGeneratePrivate(b *testing.B) { - for n := 0; n < b.N; n++ { - _ = GeneratePrivateKey(&prv1, rng) - } -} - -// Public key generation from private (group action on empty key). -func BenchmarkGenerateKeyPair(b *testing.B) { - for n := 0; n < b.N; n++ { - var pub PublicKey - _ = GeneratePrivateKey(&prv1, rng) - GeneratePublicKey(&pub, &prv1, rng) - } -} - -// Benchmark validation on same key multiple times. -func BenchmarkValidate(b *testing.B) { - prvBytes := []byte{0xaa, 0x54, 0xe4, 0xd4, 0xd0, 0xbd, 0xee, 0xcb, 0xf4, 0xd0, 0xc2, 0xbc, 0x52, 0x44, 0x11, 0xee, 0xe1, 0x14, 0xd2, 0x24, 0xe5, 0x0, 0xcc, 0xf5, 0xc0, 0xe1, 0x1e, 0xb3, 0x43, 0x52, 0x45, 0xbe, 0xfb, 0x54, 0xc0, 0x55, 0xb2} - prv1.Import(prvBytes) - - var pub PublicKey - GeneratePublicKey(&pub, &prv1, rng) - - for n := 0; n < b.N; n++ { - Validate(&pub, rng) - } -} - -// Benchmark validation on random (most probably wrong) key. -func BenchmarkValidateRandom(b *testing.B) { - var tmp [64]byte - var pub PublicKey - - // Initialize seed - for n := 0; n < b.N; n++ { - if _, err := rng.Read(tmp[:]); err != nil { - b.FailNow() - } - pub.Import(tmp[:]) - } -} - -// Benchmark validation on different keys. -func BenchmarkValidateGenerated(b *testing.B) { - for n := 0; n < b.N; n++ { - _ = GeneratePrivateKey(&prv1, rng) - GeneratePublicKey(&pub1, &prv1, rng) - Validate(&pub1, rng) - } -} - -// Generate some keys and benchmark derive. -func BenchmarkDerive(b *testing.B) { - var ss [64]byte - - _ = GeneratePrivateKey(&prv1, rng) - GeneratePublicKey(&pub1, &prv1, rng) - - _ = GeneratePrivateKey(&prv2, rng) - GeneratePublicKey(&pub2, &prv2, rng) - - b.ResetTimer() - for n := 0; n < b.N; n++ { - DeriveSecret(&ss, &pub2, &prv1, rng) - } -} - -// Benchmarks both - key generation and derivation. -func BenchmarkDeriveGenerated(b *testing.B) { - var ss [64]byte - - for n := 0; n < b.N; n++ { - _ = GeneratePrivateKey(&prv1, rng) - GeneratePublicKey(&pub1, &prv1, rng) - - _ = GeneratePrivateKey(&prv2, rng) - GeneratePublicKey(&pub2, &prv2, rng) - - DeriveSecret(&ss, &pub2, &prv1, rng) - } -} diff --git a/dh/csidh/curve.go b/dh/csidh/curve.go deleted file mode 100644 index aebf40e4..00000000 --- a/dh/csidh/curve.go +++ /dev/null @@ -1,217 +0,0 @@ -package csidh - -// xAdd implements differential arithmetic in P^1 for Montgomery -// curves E(x): x^3 + A*x^2 + x by using x-coordinate only arithmetic. -// -// x(PaQ) = x(P) + x(Q) by using x(P-Q) -// -// This algorithms is correctly defined only for cases when -// P!=inf, Q!=inf, P!=Q and P!=-Q. -func xAdd(PaQ, P, Q, PdQ *point) { - var t0, t1, t2, t3 fp - addRdc(&t0, &P.x, &P.z) - subRdc(&t1, &P.x, &P.z) - addRdc(&t2, &Q.x, &Q.z) - subRdc(&t3, &Q.x, &Q.z) - mulRdc(&t0, &t0, &t3) - mulRdc(&t1, &t1, &t2) - addRdc(&t2, &t0, &t1) - subRdc(&t3, &t0, &t1) - mulRdc(&t2, &t2, &t2) // sqr - mulRdc(&t3, &t3, &t3) // sqr - mulRdc(&PaQ.x, &PdQ.z, &t2) - mulRdc(&PaQ.z, &PdQ.x, &t3) -} - -// xDbl implements point doubling on a Montgomery curve -// E(x): x^3 + A*x^2 + x by using x-coordinate only arithmetic. -// -// x(Q) = [2]*x(P) -// -// It is correctly defined for all P != inf. -func xDbl(Q, P, A *point) { - var t0, t1, t2 fp - addRdc(&t0, &P.x, &P.z) - mulRdc(&t0, &t0, &t0) // sqr - subRdc(&t1, &P.x, &P.z) - mulRdc(&t1, &t1, &t1) // sqr - subRdc(&t2, &t0, &t1) - mulRdc(&t1, &four, &t1) - mulRdc(&t1, &t1, &A.z) - mulRdc(&Q.x, &t0, &t1) - addRdc(&t0, &A.z, &A.z) - addRdc(&t0, &t0, &A.x) - mulRdc(&t0, &t0, &t2) - addRdc(&t0, &t0, &t1) - mulRdc(&Q.z, &t0, &t2) -} - -// xDblAdd implements combined doubling of point P -// and addition of points P and Q on a Montgomery curve -// E(x): x^3 + A*x^2 + x by using x-coordinate only arithmetic. -// -// x(PaP) = x(2*P) -// x(PaQ) = x(P+Q) -func xDblAdd(PaP, PaQ, P, Q, PdQ *point, A24 *coeff) { - var t0, t1, t2 fp - - addRdc(&t0, &P.x, &P.z) - subRdc(&t1, &P.x, &P.z) - mulRdc(&PaP.x, &t0, &t0) - subRdc(&t2, &Q.x, &Q.z) - addRdc(&PaQ.x, &Q.x, &Q.z) - mulRdc(&t0, &t0, &t2) - mulRdc(&PaP.z, &t1, &t1) - mulRdc(&t1, &t1, &PaQ.x) - subRdc(&t2, &PaP.x, &PaP.z) - mulRdc(&PaP.z, &PaP.z, &A24.c) - mulRdc(&PaP.x, &PaP.x, &PaP.z) - mulRdc(&PaQ.x, &A24.a, &t2) - subRdc(&PaQ.z, &t0, &t1) - addRdc(&PaP.z, &PaP.z, &PaQ.x) - addRdc(&PaQ.x, &t0, &t1) - mulRdc(&PaP.z, &PaP.z, &t2) - mulRdc(&PaQ.z, &PaQ.z, &PaQ.z) - mulRdc(&PaQ.x, &PaQ.x, &PaQ.x) - mulRdc(&PaQ.z, &PaQ.z, &PdQ.x) - mulRdc(&PaQ.x, &PaQ.x, &PdQ.z) -} - -// cswappoint swaps P1 with P2 in constant time. The 'choice' -// parameter must have a value of either 1 (results -// in swap) or 0 (results in no-swap). -func cswappoint(P1, P2 *point, choice uint8) { - cswap512(&P1.x, &P2.x, choice) - cswap512(&P1.z, &P2.z, choice) -} - -// xMul implements point multiplication with left-to-right Montgomery -// adder. co is A coefficient of x^3 + A*x^2 + x curve. k must be > 0 -// -// Non-constant time! -func xMul(kP, P *point, co *coeff, k *fp) { - var A24 coeff - var Q point - var j uint - A := point{x: co.a, z: co.c} - R := *P - - // Precompyte A24 = (A+2C:4C) => (A24.x = A.x+2A.z; A24.z = 4*A.z) - addRdc(&A24.a, &co.c, &co.c) - addRdc(&A24.a, &A24.a, &co.a) - mulRdc(&A24.c, &co.c, &four) - - // Skip initial 0 bits. - for j = 511; j > 0; j-- { - // performance hit from making it constant-time is actually - // quite big, so... unsafe branch for now - if uint8(k[j>>6]>>(j&63)&1) != 0 { - break - } - } - - xDbl(&Q, P, &A) - prevBit := uint8(1) - for i := j; i > 0; { - i-- - bit := uint8(k[i>>6] >> (i & 63) & 1) - cswappoint(&Q, &R, prevBit^bit) - xDblAdd(&Q, &R, &Q, &R, P, &A24) - prevBit = bit - } - cswappoint(&Q, &R, uint8(k[0]&1)) - *kP = Q -} - -// xIso computes the isogeny with kernel point kern of a given order -// kernOrder. Returns the new curve coefficient co and the image img. -// -// During computation function switches between Montgomery and twisted -// Edwards curves in order to compute image curve parameters faster. -// This technique is described by Meyer and Reith in ia.cr/2018/782. -// -// Non-constant time. -func xIso(img *point, co *coeff, kern *point, kernOrder uint64) { - var t0, t1, t2, S, D fp - var Q, prod point - var coEd coeff - M := [3]point{*kern} - - // Compute twisted Edwards coefficients - // coEd.a = co.a + 2*co.c - // coEd.c = co.a - 2*co.c - // coEd.a*X^2 + Y^2 = 1 + coEd.c*X^2*Y^2 - addRdc(&coEd.c, &co.c, &co.c) - addRdc(&coEd.a, &co.a, &coEd.c) - subRdc(&coEd.c, &co.a, &coEd.c) - - // Transfer point to twisted Edwards YZ-coordinates - // (X:Z)->(Y:Z) = (X-Z : X+Z) - addRdc(&S, &img.x, &img.z) - subRdc(&D, &img.x, &img.z) - - subRdc(&prod.x, &kern.x, &kern.z) - addRdc(&prod.z, &kern.x, &kern.z) - - mulRdc(&t1, &prod.x, &S) - mulRdc(&t0, &prod.z, &D) - addRdc(&Q.x, &t0, &t1) - subRdc(&Q.z, &t0, &t1) - - xDbl(&M[1], kern, &point{x: co.a, z: co.c}) - - // NOTE: Not constant time. - for i := uint64(1); i < kernOrder>>1; i++ { - if i >= 2 { - xAdd(&M[i%3], &M[(i-1)%3], kern, &M[(i-2)%3]) - } - subRdc(&t1, &M[i%3].x, &M[i%3].z) - addRdc(&t0, &M[i%3].x, &M[i%3].z) - mulRdc(&prod.x, &prod.x, &t1) - mulRdc(&prod.z, &prod.z, &t0) - mulRdc(&t1, &t1, &S) - mulRdc(&t0, &t0, &D) - addRdc(&t2, &t0, &t1) - mulRdc(&Q.x, &Q.x, &t2) - subRdc(&t2, &t0, &t1) - mulRdc(&Q.z, &Q.z, &t2) - } - - mulRdc(&Q.x, &Q.x, &Q.x) - mulRdc(&Q.z, &Q.z, &Q.z) - mulRdc(&img.x, &img.x, &Q.x) - mulRdc(&img.z, &img.z, &Q.z) - - // coEd.a^kernOrder and coEd.c^kernOrder - modExpRdc64(&coEd.a, &coEd.a, kernOrder) - modExpRdc64(&coEd.c, &coEd.c, kernOrder) - - // prod^8 - mulRdc(&prod.x, &prod.x, &prod.x) - mulRdc(&prod.x, &prod.x, &prod.x) - mulRdc(&prod.x, &prod.x, &prod.x) - mulRdc(&prod.z, &prod.z, &prod.z) - mulRdc(&prod.z, &prod.z, &prod.z) - mulRdc(&prod.z, &prod.z, &prod.z) - - // Compute image curve params - mulRdc(&coEd.c, &coEd.c, &prod.x) - mulRdc(&coEd.a, &coEd.a, &prod.z) - - // Convert curve coefficients back to Montgomery - addRdc(&co.a, &coEd.a, &coEd.c) - subRdc(&co.c, &coEd.a, &coEd.c) - addRdc(&co.a, &co.a, &co.a) -} - -// montEval evaluates x^3 + Ax^2 + x. -func montEval(res, A, x *fp) { - var t fp - - *res = *x - mulRdc(res, res, res) - mulRdc(&t, A, x) - addRdc(res, res, &t) - addRdc(res, res, &one) - mulRdc(res, res, x) -} diff --git a/dh/csidh/curve_test.go b/dh/csidh/curve_test.go deleted file mode 100644 index 49ef894b..00000000 --- a/dh/csidh/curve_test.go +++ /dev/null @@ -1,381 +0,0 @@ -package csidh - -import ( - "math/big" - "testing" -) - -// Actual test implementation. -func TestXAdd(t *testing.T) { - var P, Q, PdQ point - var PaQ point - var expPaQ big.Int - - // points from a Elliptic Curve defined in sage as follows: - // A = 0x6055947AAFEBF773CE912680A6A32656073233D2FD6FDF4A143BE82D25B44ECC0431DE564C0F0D6591ACC62D6876E86F5D06B68C9EAF20D0DB0A6B99ED558512 - // E = EllipticCurve(GF(p), [0, A, 0, 1, 0]) - // where p is CSIDH's 511-bit prime - - checkXAdd := func() { - xAdd(&PaQ, &P, &Q, &PdQ) - ret := toNormX(&PaQ) - if ret.Cmp(&expPaQ) != 0 { - t.Errorf("\nExp: %s\nGot: %s", expPaQ.Text(16), ret.Text(16)) - } - } - - expPaQ.SetString("0x41C98C5D7FF118B1A3987733581FD69C0CC27D7B63BCCA525106B9945869C6DAEDAA3D5D9D2679237EF0D013BE68EF12731DBFB26E12576BAD1E824C67ABD125", 0) - P.x = toFp("0x5840FD8E0165F7F474260F99337461AF195233F791FABE735EC2634B74A95559568B4CEB23959C8A01C5C57E215D22639868ED840D74FE2BAC04830CF75047AD") - P.z = toFp("1") - Q.x = toFp("0x3C1A003C71436698B4A181CEB12BA4B4D1FF7BB14AAAF6FBDA6957C4EBA20AD8E3893DF6F64E67E81163E024C19C7E975F3EC61862F75502C3ED802370E75A3F") - Q.z = toFp("1") - PdQ.x = toFp("0x519B1928F752B0B2143C1C23EB247B370DBB5B9C29B9A3A064D7FBC1B67FAC34B6D3DDA0F3CB87C387B425B36F31B93A8E73252BA701927B767A9DE89D5A92AE") - PdQ.z = toFp("1") - checkXAdd() - - expPaQ.SetString("0x5840FD8E0165F7F474260F99337461AF195233F791FABE735EC2634B74A95559568B4CEB23959C8A01C5C57E215D22639868ED840D74FE2BAC04830CF75047AD", 0) - P.x = toFp("0x5840FD8E0165F7F474260F99337461AF195233F791FABE735EC2634B74A95559568B4CEB23959C8A01C5C57E215D22639868ED840D74FE2BAC04830CF75047AD") - P.z = toFp("1") - Q.x = toFp("1") - Q.z = toFp("0x0") - PdQ.x = toFp(expPaQ.Text(10)) - PdQ.z = toFp("1") - checkXAdd() -} - -func TestXDbl(t *testing.T) { - var P, A point - var PaP point - var expPaP big.Int - - // points from a Elliptic Curve defined in sage as follows: - // A = 0x599841D7D1FCD92A85759B7A3D2D5E4C56EFB17F19F86EB70E121EA16305EDE45A55868BE069313F821F7D94069EC220A4AC3B85500376710538246E9B3BC138 - // E = EllipticCurve(GF(p), [0, A, 0, 1, 0]) - // where p is CSIDH's 511-bit prime - - expPaP.SetString("0x6115B5D8BB613D11BDFEA70D436D87C1515553F6A15061727B4001E0AF745AAA9F39EB9464982829D931F77DAB9D71B24FF0D1D34C347F2A51FD45821F2EA06F", 0) - P.x = toFp("0x6C5B4D4AB0765AAB23C10F8455BE522D3A5363324D7AD641CC67C0A52FC1FFE9F3F8EDFE641478CA93D4D0016D83F21487FD4AF4E02F8A2C237CF27C5604BCC") - P.z = toFp("1") - A.x = toFp("0x599841D7D1FCD92A85759B7A3D2D5E4C56EFB17F19F86EB70E121EA16305EDE45A55868BE069313F821F7D94069EC220A4AC3B85500376710538246E9B3BC138") - A.z = toFp("1") - - xDbl(&PaP, &P, &A) - ret := toNormX(&PaP) - if ret.Cmp(&expPaP) != 0 { - t.Errorf("\nExp: %s\nGot: %s", expPaP.Text(16), ret.Text(16)) - } -} - -func TestXDblAddNominal(t *testing.T) { - var P, Q, PdQ point - var PaP, PaQ point - var expPaP, expPaQ big.Int - var A coeff - - checkXDblAdd := func() { - var A24 coeff - - // A24.a = 2*A.z + A.a - addRdc(&A24.a, &A.c, &A.c) - addRdc(&A24.a, &A24.a, &A.a) - // A24.z = 4*A.z - mulRdc(&A24.c, &A.c, &four) - - // Additionally will check if input can be same as output - PaP = P - PaQ = Q - - xDblAdd(&PaP, &PaQ, &PaP, &PaQ, &PdQ, &A24) - retPaP := toNormX(&PaP) - retPaQ := toNormX(&PaQ) - if retPaP.Cmp(&expPaP) != 0 { - t.Errorf("\nExp: %s\nGot: %s", expPaP.Text(16), retPaP.Text(16)) - } - - if retPaQ.Cmp(&expPaQ) != 0 { - t.Errorf("\nExp: %s\nGot: %s", expPaQ.Text(16), retPaQ.Text(16)) - } - } - - // 2*P - expPaP.SetString("0x38F5B37271A3D8FA50107F88045D6F6B08355DD026C02E0306CE5875F47422736AD841B4122B2BD7DE6166BB6498F6A283378FF8250948E834F15CEA2D59A57B", 0) - // P+Q - expPaQ.SetString("0x53D9B44C5F61651612243CF7987F619FE6ACB5CF29538F96A63E7278E131F41A17D64388E31B028A5183EF9096AE82724BC34D8DDFD67AD68BD552A33C345B8C", 0) - P.x = toFp("0x4FE17B4CC66E85960F57033CD45996C99248DA09DF2E36F8840657B52F74ED8173E0D322FA57D7B4D0EE7F12967BBD59140B42F2626E29167D6419E851E5A4C9") - P.z = toFp("1") - Q.x = toFp("0x465047949CD6574FDBE00EA365CAF7A95DC9DEBE96A188823CA8C9DD9F527CF81290D49864F61DF0C08C1D6052139230735CA6CFDBDC1A8820610CCD71861176") - Q.z = toFp("1") - PdQ.x = toFp("0x49D3B999A0A020B34473568A8F75B5405F2D3BE5A006595015FC6DDC6BED8AB2A51A887B6DC62C64354466865FFD69E50AD37F6F4FBD74119EB65EBC9367B556") - PdQ.z = toFp("1") - A.a = toFp("0x118F955D498D902FD42E5B2926F297CC814CD7649EC5B070295622F97C4A0D9BD34058A7E0E00CB73ED32FCC237F9F6B7D2A15F5CC7C4EC61ECEF80ACBB0EFA4") - A.c = toFp("1") - checkXDblAdd() - - // Case P=value, Q=(x=1, z=0). In this case PaQ==P; PaP=2*P - expPaP.SetString("0x38F5B37271A3D8FA50107F88045D6F6B08355DD026C02E0306CE5875F47422736AD841B4122B2BD7DE6166BB6498F6A283378FF8250948E834F15CEA2D59A57B", 0) - expPaQ.SetString("0x4FE17B4CC66E85960F57033CD45996C99248DA09DF2E36F8840657B52F74ED8173E0D322FA57D7B4D0EE7F12967BBD59140B42F2626E29167D6419E851E5A4C9", 0) - P.x = toFp("0x4FE17B4CC66E85960F57033CD45996C99248DA09DF2E36F8840657B52F74ED8173E0D322FA57D7B4D0EE7F12967BBD59140B42F2626E29167D6419E851E5A4C9") - P.z = toFp("1") - Q.x = toFp("1") - Q.z = toFp("0") - PdQ.x = toFp("0x4FE17B4CC66E85960F57033CD45996C99248DA09DF2E36F8840657B52F74ED8173E0D322FA57D7B4D0EE7F12967BBD59140B42F2626E29167D6419E851E5A4C9") - PdQ.z = toFp("1") - A.a = toFp("0x118F955D498D902FD42E5B2926F297CC814CD7649EC5B070295622F97C4A0D9BD34058A7E0E00CB73ED32FCC237F9F6B7D2A15F5CC7C4EC61ECEF80ACBB0EFA4") - A.c = toFp("1") - checkXDblAdd() -} - -func TestXDblAddVSxDblxAdd(t *testing.T) { - var P, Q, PdQ point - var PaP1, PaQ1 point - var PaP2, PaQ2 point - var A point - var A24 coeff - - P.x = toFp("0x4FE17B4CC66E85960F57033CD45996C99248DA09DF2E36F8840657B52F74ED8173E0D322FA57D7B4D0EE7F12967BBD59140B42F2626E29167D6419E851E5A4C9") - P.z = toFp("1") - Q.x = toFp("0x465047949CD6574FDBE00EA365CAF7A95DC9DEBE96A188823CA8C9DD9F527CF81290D49864F61DF0C08C1D6052139230735CA6CFDBDC1A8820610CCD71861176") - Q.z = toFp("1") - PdQ.x = toFp("0x49D3B999A0A020B34473568A8F75B5405F2D3BE5A006595015FC6DDC6BED8AB2A51A887B6DC62C64354466865FFD69E50AD37F6F4FBD74119EB65EBC9367B556") - PdQ.z = toFp("1") - A.x = toFp("0x118F955D498D902FD42E5B2926F297CC814CD7649EC5B070295622F97C4A0D9BD34058A7E0E00CB73ED32FCC237F9F6B7D2A15F5CC7C4EC61ECEF80ACBB0EFA4") - A.z = toFp("1") - - // Precompute A24 for xDblAdd - // (A+2C:4C) => (A24.x = A.x+2A.z; A24.z = 4*A.z) - addRdc(&A24.a, &A.z, &A.z) - addRdc(&A24.a, &A24.a, &A.x) - mulRdc(&A24.c, &A.z, &four) - - for i := 0; i < numIter; i++ { - xAdd(&PaQ2, &P, &Q, &PdQ) - xDbl(&PaP2, &P, &A) - xDblAdd(&PaP1, &PaQ1, &P, &Q, &PdQ, &A24) - - if !ceqpoint(&PaQ1, &PaQ2) { - exp := toNormX(&PaQ1) - got := toNormX(&PaQ2) - t.Errorf("\nExp: \n\t%s\nGot from xAdd: \n\t%s", exp.Text(16), got.Text(16)) - } - - if !ceqpoint(&PaP1, &PaP2) { - exp := toNormX(&PaP1) - got := toNormX(&PaP2) - t.Errorf("\nExp: \n\t%s\nGot from xDbl: \n\t%s", exp.Text(16), got.Text(16)) - } - - // Swap values for next operation - PdQ = Q - Q = P - P = PaP1 - } -} - -func TestXMul(t *testing.T) { - var P point - var co coeff - var expKP big.Int - var k fp - - checkXMul := func() { - var kP point - - xMul(&kP, &P, &co, &k) - retKP := toNormX(&kP) - if expKP.Cmp(&retKP) != 0 { - t.Errorf("\nExp: %s\nGot: %s", expKP.Text(16), retKP.Text(16)) - } - - // Check if first and second argument can overlap - xMul(&P, &P, &co, &k) - retKP = toNormX(&P) - if expKP.Cmp(&retKP) != 0 { - t.Errorf("\nExp: %s\nGot: %s", expKP.Text(16), retKP.Text(16)) - } - } - - // Case C=1 - expKP.SetString("0x582B866603E6FBEBD21FE660FB34EF9466FDEC55FFBCE1073134CC557071147821BBAD225E30F7B2B6790B00ED9C39A29AA043F58AF995E440AFB13DA8E6D788", 0) - P.x = toFp("0x1C5CA539C1D5B52DE4750C390C24C05251E8B1D33E48971FA86F5ADDED2D06C8CD31E94887541468BB2925EBD693C9DDFF5BD9508430F25FE28EE30C0760C0FE") - P.z = toFp("1") - co.a = toFp("0x538F785D52996919C8D5C73D842A0249669B5B6BB05338B74EAE8094AE5009A3BA2D73730F527D7403E8184D9B1FA11C0C4C40E7B328A84874A6DBCE99E1DF92") - co.c = toFp("1") - k = fp{0x7A36C930A83EFBD5, 0xD0E80041ED0DDF9F, 0x5AA17134F1B8F877, 0x975711EC94168E51, 0xB3CAD962BED4BAC5, 0x3026DFDD7E4F5687, 0xE67F91AB8EC9C3AF, 0x34671D3FD8C317E7} - checkXMul() - - // Check if algorithms works correctly with k=1 - expKP.SetString("0x1C5CA539C1D5B52DE4750C390C24C05251E8B1D33E48971FA86F5ADDED2D06C8CD31E94887541468BB2925EBD693C9DDFF5BD9508430F25FE28EE30C0760C0FE", 0) - P.x = toFp("0x1C5CA539C1D5B52DE4750C390C24C05251E8B1D33E48971FA86F5ADDED2D06C8CD31E94887541468BB2925EBD693C9DDFF5BD9508430F25FE28EE30C0760C0FE") - P.z = toFp("1") - co.a = toFp("0x538F785D52996919C8D5C73D842A0249669B5B6BB05338B74EAE8094AE5009A3BA2D73730F527D7403E8184D9B1FA11C0C4C40E7B328A84874A6DBCE99E1DF92") - co.c = toFp("1") - k = fp{1, 0, 0, 0, 0, 0, 0, 0} - checkXMul() - - // Check if algorithms works correctly with value of k for which few small and high - // order bits are 0 (test for odd number of cswaps in xMul) - expKP.SetString("0x1925EDA0928C10F427B4E642E7E1481A670D1249956DED6A2292B9BAB841F6AA86A9F41459400845ED4A5E2531A14165F64FE4E43DBD85321B429C6DAE2E8987", 0) - P.x = toFp("0x4CE8603817B9BB06515E921AA201D26B31F3CE181D1E18CD5CD704708CCAD47546CEEAB42B98EE67925A5259E0684A0489F574A999DE127F708B849ACAA12A63") - P.z = toFp("1") - co.a = toFp("0x538F785D52996919C8D5C73D842A0249669B5B6BB05338B74EAE8094AE5009A3BA2D73730F527D7403E8184D9B1FA11C0C4C40E7B328A84874A6DBCE99E1DF92") - co.c = toFp("1") - k = fp{0, 7, 0, 0, 0, 0, 0, 0} - checkXMul() - - // Check if algorithms works correctly with value of k for which few small and high - // order bits are 0 (test for even number of cswaps in xMul) - expKP.SetString("0x30C02915C5967C3B6EB2196A934ADF38A183E9C7E814B54121F93048A8FC12D5036992FABF8D807581017A4C1F93D07352413F38F6A902FC76A8894FE8D94805", 0) - P.x = toFp("0x2DDD15ED7C169BE6D9EC02CFE3DC507EC4A7A4D96DE3FAAB9BFCEA1B047807EA301E89830F2FDD0E7E642A85E7ACDE16BAD76DF140F719C4A7AB85153E7D69DC") - P.z = toFp("1") - co.a = toFp("0x538F785D52996919C8D5C73D842A0249669B5B6BB05338B74EAE8094AE5009A3BA2D73730F527D7403E8184D9B1FA11C0C4C40E7B328A84874A6DBCE99E1DF92") - co.c = toFp("1") - k = fp{0, 15, 0, 0, 0, 0, 0, 0} - checkXMul() - - // xMul512 does NOT work correctly for k==0. In such case function will return 2*P. But - // thanks to that fact we don't need to handle k==0 case, we get some speedup. - expKP.SetString("0x6115B5D8BB613D11BDFEA70D436D87C1515553F6A15061727B4001E0AF745AAA9F39EB9464982829D931F77DAB9D71B24FF0D1D34C347F2A51FD45821F2EA06F", 0) - P.x = toFp("0x6C5B4D4AB0765AAB23C10F8455BE522D3A5363324D7AD641CC67C0A52FC1FFE9F3F8EDFE641478CA93D4D0016D83F21487FD4AF4E02F8A2C237CF27C5604BCC") - P.z = toFp("1") - co.a = toFp("0x599841D7D1FCD92A85759B7A3D2D5E4C56EFB17F19F86EB70E121EA16305EDE45A55868BE069313F821F7D94069EC220A4AC3B85500376710538246E9B3BC138") - co.c = toFp("1") - k = fp{0, 0, 0, 0, 0, 0, 0, 0} - checkXMul() -} - -func TestMappointHardcoded3(t *testing.T) { - P := point{ - x: fp{0xca1a2fdec38c669b, 0xf2fe3678ebeb978b, 0xfda3e9a6f0c719d, 0x6f7bffa41772570b, 0x3d90cdd6283dc150, 0x21b55b738eb1ded9, 0x209515d0a9f41dd6, 0x5275cf397d154a12}, - z: fp{0x1fff8309761576e, 0xef239cbeda7c2ba1, 0x6136ae2d76e95873, 0x1f8f6ac909570cec, 0x780fdf0cc7d676d8, 0x548098fe92ed04e1, 0xb39da564701ef35d, 0x5fec19626df41306}, - } - A := coeff{ - a: fp{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, - c: fp{0xc8fc8df598726f0a, 0x7b1bc81750a6af95, 0x5d319e67c1e961b4, 0xb0aa7275301955f1, 0x4a080672d9ba6c64, 0x97a5ef8a246ee77b, 0x6ea9e5d4383676a, 0x3496e2e117e0ec80}, - } - K := point{ - x: fp{0x597616608e291c6f, 0xd14230b008736798, 0xa63099b1ace67e6e, 0xe37c13afd768bcfa, 0xc6ef718894f08135, 0x53a4fd09091f3522, 0xc9a1f9f670645fe1, 0x628c4a8efd83e5f0}, - z: fp{0x8f18a654312ac1ad, 0xbc20a9b2472785c9, 0xdaf97c29bbf9e492, 0xf91a8c799e2f6119, 0xc8dc675cc8e528e6, 0x9a7b2c2f0df95171, 0x85629cd38cdd9fdb, 0x656d5253d3fd1a6e}, - } - var k uint64 = 3 - - expA := coeff{ - a: fp{0x6fa92a66e77cfc1, 0x9efbfb7118f1832c, 0x441894cc5d1d24ae, 0x5a2f0fafa26761de, 0x8095c36d3a20a78a, 0xb22be0023612a135, 0x5eb844d06ef0f430, 0x52e53309d1c90cf8}, - c: fp{0x98173d5664a23e5c, 0xd8fe1c6306bbc11a, 0xa774fbc502648059, 0x766a0d839aa62c83, 0x4b074f9b93d1633d, 0xf306019dbf87f505, 0x77c720ca059234b0, 0x3d47ab65269c5908}, - } - expP := point{ - x: fp{0x91aba9b39f280495, 0xfbd8ea69d2990aeb, 0xb03e1b8ed7fe3dba, 0x3d30a41499f08998, 0xb15a42630de9c606, 0xa7dd487fef16f5c8, 0x8673948afed8e968, 0x57ecc8710004cd4d}, - z: fp{0xce8819869a942526, 0xb98ca2ff79ef8969, 0xd49c9703743a1812, 0x21dbb090f9152e03, 0xbabdcac831b1adea, 0x8cee90762baa2ddd, 0xa0dd2ddcef809d96, 0x1de2a8887a32f19b}, - } - xIso(&P, &A, &K, k) - if !eqFp(&P.x, &expP.x) || !eqFp(&P.z, &expP.z) { - normP := toNormX(&P) - normPExp := toNormX(&expP) - t.Errorf("P != expP [\n %s != %s\n]", normP.Text(16), normPExp.Text(16)) - } - if !eqFp(&A.a, &expA.a) || !eqFp(&A.c, &expA.c) { - t.Errorf("A != expA %X %X", A.a[0], expA.a[0]) - } -} - -func TestMappointHardcoded5(t *testing.T) { - P := point{ - x: fp{0xca1a2fdec38c669b, 0xf2fe3678ebeb978b, 0xfda3e9a6f0c719d, 0x6f7bffa41772570b, 0x3d90cdd6283dc150, 0x21b55b738eb1ded9, 0x209515d0a9f41dd6, 0x5275cf397d154a12}, - z: fp{0x1fff8309761576e, 0xef239cbeda7c2ba1, 0x6136ae2d76e95873, 0x1f8f6ac909570cec, 0x780fdf0cc7d676d8, 0x548098fe92ed04e1, 0xb39da564701ef35d, 0x5fec19626df41306}, - } - A := coeff{ - a: fp{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, - c: fp{0xc8fc8df598726f0a, 0x7b1bc81750a6af95, 0x5d319e67c1e961b4, 0xb0aa7275301955f1, 0x4a080672d9ba6c64, 0x97a5ef8a246ee77b, 0x6ea9e5d4383676a, 0x3496e2e117e0ec80}, - } - K := point{ - x: fp{0x597616608e291c6f, 0xd14230b008736798, 0xa63099b1ace67e6e, 0xe37c13afd768bcfa, 0xc6ef718894f08135, 0x53a4fd09091f3522, 0xc9a1f9f670645fe1, 0x628c4a8efd83e5f0}, - z: fp{0x8f18a654312ac1ad, 0xbc20a9b2472785c9, 0xdaf97c29bbf9e492, 0xf91a8c799e2f6119, 0xc8dc675cc8e528e6, 0x9a7b2c2f0df95171, 0x85629cd38cdd9fdb, 0x656d5253d3fd1a6e}, - } - var k uint64 = 5 - - expA := coeff{ - a: fp{0x32076f58298ed474, 0x5094a1fc8696d307, 0x82e510594157944a, 0xb60ce760f88c83a9, 0xae8a28c325186983, 0xe31d2446a4ad2f18, 0xb266c612b5f141c1, 0x64283e618db5a705}, - c: fp{0x4472b49b65272190, 0x2bd5919309778f56, 0x6132753691fe016c, 0x8f654849c09e6d34, 0xfa208dd9aea1ef12, 0xf7df0dd10071411a, 0x75afb7860500922c, 0x52fb7d34b129fb65}, - } - expP := point{ - x: fp{0x3b75fc94b2a6df2d, 0x96d53dc9b0e867a0, 0x22e87202421d274e, 0x30a361440697ee1a, 0x8b52ee078bdbddcd, 0x64425d500e6b934d, 0xf47d1f568f6df391, 0x5d9d3607431395ab}, - z: fp{0x746e02dafa040976, 0xcd408f2cddbf3a8e, 0xf643354e0e13a93f, 0x7c39ed96ce9a5e29, 0xfcdf26f1a1a550ca, 0x2fc8aafc4ca0a559, 0x5d204a2b14cf19ba, 0xbd2c3406762f05d}, - } - - xIso(&P, &A, &K, k) - if !eqFp(&P.x, &expP.x) || !eqFp(&P.z, &expP.z) { - normP := toNormX(&P) - normPExp := toNormX(&expP) - t.Errorf("P != expP [\n %s != %s\n]", normP.Text(16), normPExp.Text(16)) - } - if !eqFp(&A.a, &expA.a) || !eqFp(&A.c, &expA.c) { - t.Errorf("A != expA %X %X", A.a[0], expA.a[0]) - } -} - -func BenchmarkXMul(b *testing.B) { - var kP, P point - var co coeff - var expKP big.Int - var k fp - - // Case C=1 - expKP.SetString("0x582B866603E6FBEBD21FE660FB34EF9466FDEC55FFBCE1073134CC557071147821BBAD225E30F7B2B6790B00ED9C39A29AA043F58AF995E440AFB13DA8E6D788", 0) - P.x = toFp("0x1C5CA539C1D5B52DE4750C390C24C05251E8B1D33E48971FA86F5ADDED2D06C8CD31E94887541468BB2925EBD693C9DDFF5BD9508430F25FE28EE30C0760C0FE") - P.z = toFp("1") - co.a = toFp("0x538F785D52996919C8D5C73D842A0249669B5B6BB05338B74EAE8094AE5009A3BA2D73730F527D7403E8184D9B1FA11C0C4C40E7B328A84874A6DBCE99E1DF92") - co.c = toFp("1") - k = fp{0x7A36C930A83EFBD5, 0xD0E80041ED0DDF9F, 0x5AA17134F1B8F877, 0x975711EC94168E51, 0xB3CAD962BED4BAC5, 0x3026DFDD7E4F5687, 0xE67F91AB8EC9C3AF, 0x34671D3FD8C317E7} - - for n := 0; n < b.N; n++ { - xMul(&kP, &P, &co, &k) - } -} - -func BenchmarkXAdd(b *testing.B) { - var P, Q, PdQ point - var PaQ point - - P.x = toFp("0x5840FD8E0165F7F474260F99337461AF195233F791FABE735EC2634B74A95559568B4CEB23959C8A01C5C57E215D22639868ED840D74FE2BAC04830CF75047AD") - P.z = toFp("1") - Q.x = toFp("0x3C1A003C71436698B4A181CEB12BA4B4D1FF7BB14AAAF6FBDA6957C4EBA20AD8E3893DF6F64E67E81163E024C19C7E975F3EC61862F75502C3ED802370E75A3F") - Q.z = toFp("1") - PdQ.x = toFp("0x519B1928F752B0B2143C1C23EB247B370DBB5B9C29B9A3A064D7FBC1B67FAC34B6D3DDA0F3CB87C387B425B36F31B93A8E73252BA701927B767A9DE89D5A92AE") - PdQ.z = toFp("1") - - for n := 0; n < b.N; n++ { - xAdd(&PaQ, &P, &Q, &PdQ) - } -} - -func BenchmarkXDbl(b *testing.B) { - var P, A point - var PaP point - - P.x = toFp("0x6C5B4D4AB0765AAB23C10F8455BE522D3A5363324D7AD641CC67C0A52FC1FFE9F3F8EDFE641478CA93D4D0016D83F21487FD4AF4E02F8A2C237CF27C5604BCC") - P.z = toFp("1") - A.x = toFp("0x599841D7D1FCD92A85759B7A3D2D5E4C56EFB17F19F86EB70E121EA16305EDE45A55868BE069313F821F7D94069EC220A4AC3B85500376710538246E9B3BC138") - A.z = toFp("1") - - for n := 0; n < b.N; n++ { - xDbl(&PaP, &P, &A) - } -} - -func BenchmarkIsom(b *testing.B) { - var P, kern point - var expPhiP big.Int - var co coeff - k := uint64(2) - - expPhiP.SetString("0x5FEBD68F795F9AEB732ECF0D1507904922F2B0736704E0751EF242B4E191E6F630D83778B5E5681161FD071CDEF7DF4C3A41D0ECEB30E90B119C5BF86C5AB51A", 0) - P.x = toFp("0x5FD8D226C228FD6AA3CCDCAB931C5D3AA000A46B47041F59D9724E517594F696D38F2CB45C987ACF68BB1057D8D518F926D8F55171F337D05354E0022BC66B23") - P.z = toFp("1") - co.a = toFp("0x9E8DBC4914E3C4F080592642DD0B08B9564AB3ADF75EE9B58A685443BA6E39A1ACD1201B7F034077AF344123880AF9D8C77575E6E782E00186881ECE8B87CA3") - co.c = toFp("1") - kern.x = toFp("0x594F77A49EABBF2A12025BC00E1DBC119CDA674B9FE8A00791724B42FEB7D225C4C9940B01B09B8F00B30B0E961212FB63E42614814E38EC9E5E5B0FEBF98C58") - kern.z = toFp("1") - - for n := 0; n < b.N; n++ { - xIso(&P, &co, &kern, k) - } -} diff --git a/dh/csidh/doc.go b/dh/csidh/doc.go deleted file mode 100644 index 05162bfb..00000000 --- a/dh/csidh/doc.go +++ /dev/null @@ -1,10 +0,0 @@ -// Package csidh implements commutative supersingular isogeny-based Diffie-Hellman -// key exchange algorithm (CSIDH) resulting from the group action. Implementation -// uses prime field of a size 512-bits. -// This implementation is highly experimental work and currently it is not suitable -// for securing systems. -// -// References: -// - cSIDH: ia.cr/2018/383 -// - Faster cSIDH: ia.cr/2018/782 -package csidh diff --git a/dh/csidh/fp511.go b/dh/csidh/fp511.go deleted file mode 100644 index c00f1fcd..00000000 --- a/dh/csidh/fp511.go +++ /dev/null @@ -1,218 +0,0 @@ -package csidh - -import ( - "math/bits" -) - -// Constant time select. -// if pick == 0xFF..FF (out = in1) -// if pick == 0 (out = in2) -// else out is undefined. -func ctPick64(which uint64, in1, in2 uint64) uint64 { - return (in1 & which) | (in2 & ^which) -} - -// ctIsNonZero64 returns 0 in case i == 0, otherwise it returns 1. -// Constant-time. -func ctIsNonZero64(i uint64) int { - // In case i==0 then i-1 will set MSB. Only in such case (i OR ~(i-1)) - // will result in MSB being not set (logical implication: (i-1)=>i is - // false iff (i-1)==0 and i==non-zero). In every other case MSB is - // set and hence function returns 1. - return int((i | (^(i - 1))) >> 63) -} - -// Returns result of x= 0; i-- { - v, c := bits.Sub64(y[i], x[i], 0) - if c != 0 { - return false - } - if v != 0 { - return true - } - } - // x == y - return false -} - -// r = x + y mod p. -func addRdc(r, x, y *fp) { - var c uint64 - var t fp - r[0], c = bits.Add64(x[0], y[0], 0) - r[1], c = bits.Add64(x[1], y[1], c) - r[2], c = bits.Add64(x[2], y[2], c) - r[3], c = bits.Add64(x[3], y[3], c) - r[4], c = bits.Add64(x[4], y[4], c) - r[5], c = bits.Add64(x[5], y[5], c) - r[6], c = bits.Add64(x[6], y[6], c) - r[7], _ = bits.Add64(x[7], y[7], c) - - t[0], c = bits.Sub64(r[0], p[0], 0) - t[1], c = bits.Sub64(r[1], p[1], c) - t[2], c = bits.Sub64(r[2], p[2], c) - t[3], c = bits.Sub64(r[3], p[3], c) - t[4], c = bits.Sub64(r[4], p[4], c) - t[5], c = bits.Sub64(r[5], p[5], c) - t[6], c = bits.Sub64(r[6], p[6], c) - t[7], c = bits.Sub64(r[7], p[7], c) - - w := 0 - c - r[0] = ctPick64(w, r[0], t[0]) - r[1] = ctPick64(w, r[1], t[1]) - r[2] = ctPick64(w, r[2], t[2]) - r[3] = ctPick64(w, r[3], t[3]) - r[4] = ctPick64(w, r[4], t[4]) - r[5] = ctPick64(w, r[5], t[5]) - r[6] = ctPick64(w, r[6], t[6]) - r[7] = ctPick64(w, r[7], t[7]) -} - -// r = x - y. -func sub512(r, x, y *fp) uint64 { - var c uint64 - r[0], c = bits.Sub64(x[0], y[0], 0) - r[1], c = bits.Sub64(x[1], y[1], c) - r[2], c = bits.Sub64(x[2], y[2], c) - r[3], c = bits.Sub64(x[3], y[3], c) - r[4], c = bits.Sub64(x[4], y[4], c) - r[5], c = bits.Sub64(x[5], y[5], c) - r[6], c = bits.Sub64(x[6], y[6], c) - r[7], c = bits.Sub64(x[7], y[7], c) - return c -} - -// r = x - y mod p. -func subRdc(r, x, y *fp) { - var c uint64 - - // Same as sub512(r,x,y). Unfortunately - // compiler is not able to inline it. - r[0], c = bits.Sub64(x[0], y[0], 0) - r[1], c = bits.Sub64(x[1], y[1], c) - r[2], c = bits.Sub64(x[2], y[2], c) - r[3], c = bits.Sub64(x[3], y[3], c) - r[4], c = bits.Sub64(x[4], y[4], c) - r[5], c = bits.Sub64(x[5], y[5], c) - r[6], c = bits.Sub64(x[6], y[6], c) - r[7], c = bits.Sub64(x[7], y[7], c) - - // if x r=x-y+p - w := 0 - c - r[0], c = bits.Add64(r[0], ctPick64(w, p[0], 0), 0) - r[1], c = bits.Add64(r[1], ctPick64(w, p[1], 0), c) - r[2], c = bits.Add64(r[2], ctPick64(w, p[2], 0), c) - r[3], c = bits.Add64(r[3], ctPick64(w, p[3], 0), c) - r[4], c = bits.Add64(r[4], ctPick64(w, p[4], 0), c) - r[5], c = bits.Add64(r[5], ctPick64(w, p[5], 0), c) - r[6], c = bits.Add64(r[6], ctPick64(w, p[6], 0), c) - r[7], _ = bits.Add64(r[7], ctPick64(w, p[7], 0), c) -} - -// Fixed-window mod exp for fpBitLen bit value with 4 bit window. Returned -// result is a number in montgomery domain. -// r = b ^ e (mod p). -// Constant time. -func modExpRdcCommon(r, b, e *fp, fpBitLen int) { - var precomp [16]fp - var t fp - var c uint64 - - // Precompute step, computes an array of small powers of 'b'. As this - // algorithm implements 4-bit window, we need 2^4=16 of such values. - // b^0 = 1, which is equal to R from REDC. - precomp[0] = one // b ^ 0 - precomp[1] = *b // b ^ 1 - for i := 2; i < 16; i = i + 2 { - // OPTIMIZE: implement fast squaring. Then interleaving fast squaring - // with multiplication should improve performance. - mulRdc(&precomp[i], &precomp[i/2], &precomp[i/2]) // sqr - mulRdc(&precomp[i+1], &precomp[i], b) - } - - *r = one - for i := fpBitLen/4 - 1; i >= 0; i-- { - for j := 0; j < 4; j++ { - mulRdc(r, r, r) - } - // note: non resistant to cache SCA - idx := (e[i/16] >> uint((i%16)*4)) & 15 - mulRdc(r, r, &precomp[idx]) - } - - // if p <= r < 2p then r = r-p - t[0], c = bits.Sub64(r[0], p[0], 0) - t[1], c = bits.Sub64(r[1], p[1], c) - t[2], c = bits.Sub64(r[2], p[2], c) - t[3], c = bits.Sub64(r[3], p[3], c) - t[4], c = bits.Sub64(r[4], p[4], c) - t[5], c = bits.Sub64(r[5], p[5], c) - t[6], c = bits.Sub64(r[6], p[6], c) - t[7], c = bits.Sub64(r[7], p[7], c) - - w := 0 - c - r[0] = ctPick64(w, r[0], t[0]) - r[1] = ctPick64(w, r[1], t[1]) - r[2] = ctPick64(w, r[2], t[2]) - r[3] = ctPick64(w, r[3], t[3]) - r[4] = ctPick64(w, r[4], t[4]) - r[5] = ctPick64(w, r[5], t[5]) - r[6] = ctPick64(w, r[6], t[6]) - r[7] = ctPick64(w, r[7], t[7]) -} - -// modExpRdc does modular exponentiation of 512-bit number. -// Constant-time. -func modExpRdc512(r, b, e *fp) { - modExpRdcCommon(r, b, e, 512) -} - -// modExpRdc does modular exponentiation of 64-bit number. -// Constant-time. -func modExpRdc64(r, b *fp, e uint64) { - modExpRdcCommon(r, b, &fp{e}, 64) -} - -// isNonQuadRes checks whether value v is quadratic residue. -// Implementation uses Fermat's little theorem (or -// Euler's criterion) -// -// a^(p-1) == 1, hence -// (a^2) ((p-1)/2) == 1 -// -// Which means v is a quadratic residue iff v^((p-1)/2) == 1. -// Caller provided v must be in montgomery domain. -// Returns 0 in case v is quadratic residue or 1 in case -// v is quadratic non-residue. -func (v *fp) isNonQuadRes() int { - var res fp - var b uint64 - - modExpRdc512(&res, v, &pMin1By2) - for i := range res { - b |= res[i] ^ one[i] - } - - return ctIsNonZero64(b) -} - -// isZero returns false in case v is equal to 0, otherwise -// true. Constant time. -func (v *fp) isZero() bool { - var r uint64 - for i := 0; i < numWords; i++ { - r |= v[i] - } - return ctIsNonZero64(r) == 0 -} - -// equal checks if v is equal to in. Constant time. -func (v *fp) equal(in *fp) bool { - var r uint64 - for i := range v { - r |= v[i] ^ in[i] - } - return ctIsNonZero64(r) == 0 -} diff --git a/dh/csidh/fp511_amd64.go b/dh/csidh/fp511_amd64.go deleted file mode 100644 index 4f05c82e..00000000 --- a/dh/csidh/fp511_amd64.go +++ /dev/null @@ -1,65 +0,0 @@ -//go:build amd64 && !purego -// +build amd64,!purego - -package csidh - -import ( - "math/bits" - - "golang.org/x/sys/cpu" -) - -var ( - // Signals support for BMI2 (MULX) - hasBMI2 = cpu.X86.HasBMI2 - // Signals support for ADX and BMI2 - hasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX -) - -var _ = hasBMI2 - -func mul512(r, m1 *fp, m2 uint64) { mul512Amd64(r, m1, m2) } -func cswap512(x, y *fp, choice uint8) { cswap512Amd64(x, y, choice) } -func mulRdc(r, x, y *fp) { mulRdcAmd64(r, x, y) } - -//go:noescape -func mul512Amd64(a, b *fp, c uint64) - -//go:noescape -func cswap512Amd64(x, y *fp, choice uint8) - -//go:noescape -func mulBmiAsm(res, x, y *fp) - -// mulRdc performs montgomery multiplication r = x * y mod P. -// Returned result r is already reduced and in Montgomery domain. -func mulRdcAmd64(r, x, y *fp) { - var t fp - var c uint64 - - if hasADXandBMI2 { - mulBmiAsm(r, x, y) - } else { - mulGeneric(r, x, y) - } - - // if p <= r < 2p then r = r-p - t[0], c = bits.Sub64(r[0], p[0], 0) - t[1], c = bits.Sub64(r[1], p[1], c) - t[2], c = bits.Sub64(r[2], p[2], c) - t[3], c = bits.Sub64(r[3], p[3], c) - t[4], c = bits.Sub64(r[4], p[4], c) - t[5], c = bits.Sub64(r[5], p[5], c) - t[6], c = bits.Sub64(r[6], p[6], c) - t[7], c = bits.Sub64(r[7], p[7], c) - - w := 0 - c - r[0] = ctPick64(w, r[0], t[0]) - r[1] = ctPick64(w, r[1], t[1]) - r[2] = ctPick64(w, r[2], t[2]) - r[3] = ctPick64(w, r[3], t[3]) - r[4] = ctPick64(w, r[4], t[4]) - r[5] = ctPick64(w, r[5], t[5]) - r[6] = ctPick64(w, r[6], t[6]) - r[7] = ctPick64(w, r[7], t[7]) -} diff --git a/dh/csidh/fp511_amd64.s b/dh/csidh/fp511_amd64.s deleted file mode 100644 index 18dfdff9..00000000 --- a/dh/csidh/fp511_amd64.s +++ /dev/null @@ -1,168 +0,0 @@ -//go:build amd64 && !purego -// +build amd64,!purego - -#include "textflag.h" - -// Multiplies 512-bit value by 64-bit value. Uses MULQ instruction to -// multiply 2 64-bit values. -// -// Result: x = (y * z) mod 2^512 -// -// Registers used: AX, CX, DX, SI, DI, R8 -// -// func mul512Amd64(a, b *Fp, c uint64) -TEXT ·mul512Amd64(SB), NOSPLIT, $0-24 - MOVQ a+0(FP), DI // result - MOVQ b+8(FP), SI // multiplicand - - // Check whether to use optimized implementation - CMPB ·hasBMI2(SB), $1 - JE mul512_mulx - - MOVQ c+16(FP), R10 // 64 bit multiplier, used by MULQ - MOVQ R10, AX; MULQ 0(SI); MOVQ DX, R11; MOVQ AX, 0(DI) //x[0] - MOVQ R10, AX; MULQ 8(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 8(DI) //x[1] - MOVQ R10, AX; MULQ 16(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 16(DI) //x[2] - MOVQ R10, AX; MULQ 24(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 24(DI) //x[3] - MOVQ R10, AX; MULQ 32(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 32(DI) //x[4] - MOVQ R10, AX; MULQ 40(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 40(DI) //x[5] - MOVQ R10, AX; MULQ 48(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 48(DI) //x[6] - MOVQ R10, AX; MULQ 56(SI); ADDQ R11, AX; MOVQ AX, 56(DI) //x[7] - RET - -// Optimized for CPUs with BMI2 -mul512_mulx: - MOVQ c+16(FP), DX // 64 bit multiplier, used by MULX - MULXQ 0(SI), AX, R10; MOVQ AX, 0(DI) // x[0] - MULXQ 8(SI), AX, R11; ADDQ R10, AX; MOVQ AX, 8(DI) // x[1] - MULXQ 16(SI), AX, R10; ADCQ R11, AX; MOVQ AX, 16(DI) // x[2] - MULXQ 24(SI), AX, R11; ADCQ R10, AX; MOVQ AX, 24(DI) // x[3] - MULXQ 32(SI), AX, R10; ADCQ R11, AX; MOVQ AX, 32(DI) // x[4] - MULXQ 40(SI), AX, R11; ADCQ R10, AX; MOVQ AX, 40(DI) // x[5] - MULXQ 48(SI), AX, R10; ADCQ R11, AX; MOVQ AX, 48(DI) // x[6] - MULXQ 56(SI), AX, R11; ADCQ R10, AX; MOVQ AX, 56(DI) // x[7] - RET - -TEXT ·cswap512Amd64(SB),NOSPLIT,$0-17 - MOVQ x+0(FP), DI - MOVQ y+8(FP), SI - MOVBLZX choice+16(FP), AX // AL = 0 or 1 - - // Make AX, so that either all bits are set or non - // AX = 0 or 1 - NEGQ AX - - // Fill xmm15. After this step first half of XMM15 is - // just zeros and second half is whatever in AX - MOVQ AX, X15 - - // Copy lower double word everywhere else. So that - // XMM15=AL|AL|AL|AL. As AX has either all bits set - // or non result will be that XMM15 has also either - // all bits set or non of them. - PSHUFD $0, X15, X15 - -#ifndef CSWAP_BLOCK -#define CSWAP_BLOCK(idx) \ - MOVOU (idx*16)(DI), X0 \ - MOVOU (idx*16)(SI), X1 \ - \ // X2 = mask & (X0 ^ X1) - MOVO X1, X2 \ - PXOR X0, X2 \ - PAND X15, X2 \ - \ - PXOR X2, X0 \ - PXOR X2, X1 \ - \ - MOVOU X0, (idx*16)(DI) \ - MOVOU X1, (idx*16)(SI) -#endif - - CSWAP_BLOCK(0) - CSWAP_BLOCK(1) - CSWAP_BLOCK(2) - CSWAP_BLOCK(3) - - RET - -// mulAsm implements montgomery multiplication interleaved with -// montgomery reduction. It uses MULX and ADCX/ADOX instructions. -// Implementation specific to 511-bit prime 'p' -// -// func mulBmiAsm(res, x, y *fp) -TEXT ·mulBmiAsm(SB),NOSPLIT,$8-24 - - MOVQ x+8(FP), DI // multiplicand - MOVQ y+16(FP), SI // multiplier - - XORQ R8, R8 - XORQ R9, R9 - XORQ R10, R10 - XORQ R11, R11 - XORQ R12, R12 - XORQ R13, R13 - XORQ R14, R14 - XORQ CX, CX - - MOVQ BP, 0(SP) // push: BP is Callee-save. - XORQ BP, BP - -// Uses BMI2 (MULX) -#ifdef MULS_MULX_512 -#undef MULS_MULX_512 -#endif -#define MULS_MULX_512(idx, r0, r1, r2, r3, r4, r5, r6, r7, r8) \ - \ // Reduction step - MOVQ ( 0)(SI), DX \ - MULXQ ( 8*idx)(DI), DX, AX \ - ADDQ r0, DX \ - MOVQ ·pNegInv(SB), AX \ - MULXQ AX, DX, AX \ - \ - XORQ AX, AX; \ - MOVQ ·p+ 0(SB), AX; MULXQ AX, AX, BX; ADOXQ AX, r0; ADCXQ BX, r1 \ - MOVQ ·p+ 8(SB), AX; MULXQ AX, AX, BX; ADOXQ AX, r1; ADCXQ BX, r2 \ - MOVQ ·p+16(SB), AX; MULXQ AX, AX, BX; ADOXQ AX, r2; ADCXQ BX, r3 \ - MOVQ ·p+24(SB), AX; MULXQ AX, AX, BX; ADOXQ AX, r3; ADCXQ BX, r4 \ - MOVQ ·p+32(SB), AX; MULXQ AX, AX, BX; ADOXQ AX, r4; ADCXQ BX, r5 \ - MOVQ ·p+40(SB), AX; MULXQ AX, AX, BX; ADOXQ AX, r5; ADCXQ BX, r6 \ - MOVQ ·p+48(SB), AX; MULXQ AX, AX, BX; ADOXQ AX, r6; ADCXQ BX, r7 \ - MOVQ ·p+56(SB), AX; MULXQ AX, AX, BX; ADOXQ AX, r7; ADCXQ BX, r8 \ - MOVQ $0, AX; ;;;;;;;;;;;;;;;;;;;;;;; ADOXQ AX, r8; \ - \ // Multiplication step - MOVQ (8*idx)(DI), DX \ - \ - XORQ AX, AX \ - MULXQ ( 0)(SI), AX, BX; ADOXQ AX, r0; ADCXQ BX, r1 \ - MULXQ ( 8)(SI), AX, BX; ADOXQ AX, r1; ADCXQ BX, r2 \ - MULXQ (16)(SI), AX, BX; ADOXQ AX, r2; ADCXQ BX, r3 \ - MULXQ (24)(SI), AX, BX; ADOXQ AX, r3; ADCXQ BX, r4 \ - MULXQ (32)(SI), AX, BX; ADOXQ AX, r4; ADCXQ BX, r5 \ - MULXQ (40)(SI), AX, BX; ADOXQ AX, r5; ADCXQ BX, r6 \ - MULXQ (48)(SI), AX, BX; ADOXQ AX, r6; ADCXQ BX, r7 \ - MULXQ (56)(SI), AX, BX; ADOXQ AX, r7; ADCXQ BX, r8 \ - MOVQ $0, AX ; ADOXQ AX, r8; - - MULS_MULX_512(0, R8, R9, R10, R11, R12, R13, R14, CX, BP) - MULS_MULX_512(1, R9, R10, R11, R12, R13, R14, CX, BP, R8) - MULS_MULX_512(2, R10, R11, R12, R13, R14, CX, BP, R8, R9) - MULS_MULX_512(3, R11, R12, R13, R14, CX, BP, R8, R9, R10) - MULS_MULX_512(4, R12, R13, R14, CX, BP, R8, R9, R10, R11) - MULS_MULX_512(5, R13, R14, CX, BP, R8, R9, R10, R11, R12) - MULS_MULX_512(6, R14, CX, BP, R8, R9, R10, R11, R12, R13) - MULS_MULX_512(7, CX, BP, R8, R9, R10, R11, R12, R13, R14) -#undef MULS_MULX_512 - - MOVQ res+0(FP), DI - MOVQ BP, ( 0)(DI) - MOVQ R8, ( 8)(DI) - MOVQ R9, (16)(DI) - MOVQ R10, (24)(DI) - MOVQ R11, (32)(DI) - MOVQ R12, (40)(DI) - MOVQ R13, (48)(DI) - MOVQ R14, (56)(DI) - MOVQ 0(SP), BP // pop: BP is Callee-save. - - // NOW DI needs to be reduced if > p - RET diff --git a/dh/csidh/fp511_generic.go b/dh/csidh/fp511_generic.go deleted file mode 100644 index ceb819e7..00000000 --- a/dh/csidh/fp511_generic.go +++ /dev/null @@ -1,180 +0,0 @@ -package csidh - -import "math/bits" - -// mul576 implements schoolbook multiplication of -// 64x512-bit integer. Returns result modulo 2^512. -// r = m1*m2. -func mul512Generic(r, m1 *fp, m2 uint64) { - var c, h, l uint64 - - c, r[0] = bits.Mul64(m2, m1[0]) - - h, l = bits.Mul64(m2, m1[1]) - r[1], c = bits.Add64(l, c, 0) - c = h + c - - h, l = bits.Mul64(m2, m1[2]) - r[2], c = bits.Add64(l, c, 0) - c = h + c - - h, l = bits.Mul64(m2, m1[3]) - r[3], c = bits.Add64(l, c, 0) - c = h + c - - h, l = bits.Mul64(m2, m1[4]) - r[4], c = bits.Add64(l, c, 0) - c = h + c - - h, l = bits.Mul64(m2, m1[5]) - r[5], c = bits.Add64(l, c, 0) - c = h + c - - h, l = bits.Mul64(m2, m1[6]) - r[6], c = bits.Add64(l, c, 0) - c = h + c - - _, l = bits.Mul64(m2, m1[7]) - r[7], _ = bits.Add64(l, c, 0) -} - -// mul576 implements schoolbook multiplication of -// 64x512-bit integer. Returns 576-bit result of -// multiplication. -// r = m1*m2. -func mul576Generic(r *[9]uint64, m1 *fp, m2 uint64) { - var c, h, l uint64 - - c, r[0] = bits.Mul64(m2, m1[0]) - - h, l = bits.Mul64(m2, m1[1]) - r[1], c = bits.Add64(l, c, 0) - c = h + c - - h, l = bits.Mul64(m2, m1[2]) - r[2], c = bits.Add64(l, c, 0) - c = h + c - - h, l = bits.Mul64(m2, m1[3]) - r[3], c = bits.Add64(l, c, 0) - c = h + c - - h, l = bits.Mul64(m2, m1[4]) - r[4], c = bits.Add64(l, c, 0) - c = h + c - - h, l = bits.Mul64(m2, m1[5]) - r[5], c = bits.Add64(l, c, 0) - c = h + c - - h, l = bits.Mul64(m2, m1[6]) - r[6], c = bits.Add64(l, c, 0) - c = h + c - - h, l = bits.Mul64(m2, m1[7]) - r[7], c = bits.Add64(l, c, 0) - r[8], c = bits.Add64(h, c, 0) - r[8] += c -} - -// cswap512 implements constant time swap operation. -// If choice = 0, leave x,y unchanged. If choice = 1, set x,y = y,x. -// If choice is neither 0 nor 1 then behaviour is undefined. -func cswap512Generic(x, y *fp, choice uint8) { - var tmp uint64 - mask64 := 0 - uint64(choice) - - for i := 0; i < numWords; i++ { - tmp = mask64 & (x[i] ^ y[i]) - x[i] = tmp ^ x[i] - y[i] = tmp ^ y[i] - } -} - -// mulRdc performs montgomery multiplication r = x * y mod P. -// Returned result r is already reduced and in Montgomery domain. -func mulRdcGeneric(r, x, y *fp) { - var t fp - var c uint64 - - mulGeneric(r, x, y) - - // if p <= r < 2p then r = r-p - t[0], c = bits.Sub64(r[0], p[0], 0) - t[1], c = bits.Sub64(r[1], p[1], c) - t[2], c = bits.Sub64(r[2], p[2], c) - t[3], c = bits.Sub64(r[3], p[3], c) - t[4], c = bits.Sub64(r[4], p[4], c) - t[5], c = bits.Sub64(r[5], p[5], c) - t[6], c = bits.Sub64(r[6], p[6], c) - t[7], c = bits.Sub64(r[7], p[7], c) - - w := 0 - c - r[0] = ctPick64(w, r[0], t[0]) - r[1] = ctPick64(w, r[1], t[1]) - r[2] = ctPick64(w, r[2], t[2]) - r[3] = ctPick64(w, r[3], t[3]) - r[4] = ctPick64(w, r[4], t[4]) - r[5] = ctPick64(w, r[5], t[5]) - r[6] = ctPick64(w, r[6], t[6]) - r[7] = ctPick64(w, r[7], t[7]) -} - -func mulGeneric(r, x, y *fp) { - var s fp // keeps intermediate results - var t1, t2 [9]uint64 - var c, q uint64 - - for i := 0; i < numWords-1; i++ { - q = ((x[i] * y[0]) + s[0]) * pNegInv[0] - mul576Generic(&t1, &p, q) - mul576Generic(&t2, y, x[i]) - - // x[i]*y + q_i*p - t1[0], c = bits.Add64(t1[0], t2[0], 0) - t1[1], c = bits.Add64(t1[1], t2[1], c) - t1[2], c = bits.Add64(t1[2], t2[2], c) - t1[3], c = bits.Add64(t1[3], t2[3], c) - t1[4], c = bits.Add64(t1[4], t2[4], c) - t1[5], c = bits.Add64(t1[5], t2[5], c) - t1[6], c = bits.Add64(t1[6], t2[6], c) - t1[7], c = bits.Add64(t1[7], t2[7], c) - t1[8], _ = bits.Add64(t1[8], t2[8], c) - - // s = (s + x[i]*y + q_i * p) / R - _, c = bits.Add64(t1[0], s[0], 0) - s[0], c = bits.Add64(t1[1], s[1], c) - s[1], c = bits.Add64(t1[2], s[2], c) - s[2], c = bits.Add64(t1[3], s[3], c) - s[3], c = bits.Add64(t1[4], s[4], c) - s[4], c = bits.Add64(t1[5], s[5], c) - s[5], c = bits.Add64(t1[6], s[6], c) - s[6], c = bits.Add64(t1[7], s[7], c) - s[7], _ = bits.Add64(t1[8], 0, c) - } - - // last iteration stores result in r - q = ((x[numWords-1] * y[0]) + s[0]) * pNegInv[0] - mul576Generic(&t1, &p, q) - mul576Generic(&t2, y, x[numWords-1]) - - t1[0], c = bits.Add64(t1[0], t2[0], c) - t1[1], c = bits.Add64(t1[1], t2[1], c) - t1[2], c = bits.Add64(t1[2], t2[2], c) - t1[3], c = bits.Add64(t1[3], t2[3], c) - t1[4], c = bits.Add64(t1[4], t2[4], c) - t1[5], c = bits.Add64(t1[5], t2[5], c) - t1[6], c = bits.Add64(t1[6], t2[6], c) - t1[7], c = bits.Add64(t1[7], t2[7], c) - t1[8], _ = bits.Add64(t1[8], t2[8], c) - - _, c = bits.Add64(t1[0], s[0], 0) - r[0], c = bits.Add64(t1[1], s[1], c) - r[1], c = bits.Add64(t1[2], s[2], c) - r[2], c = bits.Add64(t1[3], s[3], c) - r[3], c = bits.Add64(t1[4], s[4], c) - r[4], c = bits.Add64(t1[5], s[5], c) - r[5], c = bits.Add64(t1[6], s[6], c) - r[6], c = bits.Add64(t1[7], s[7], c) - r[7], _ = bits.Add64(t1[8], 0, c) -} diff --git a/dh/csidh/fp511_noasm.go b/dh/csidh/fp511_noasm.go deleted file mode 100644 index 72b2efd4..00000000 --- a/dh/csidh/fp511_noasm.go +++ /dev/null @@ -1,9 +0,0 @@ -//go:build !amd64 || purego -// +build !amd64 purego - -package csidh - -func mul512(r, m1 *fp, m2 uint64) { mul512Generic(r, m1, m2) } -func mul576(r *[9]uint64, m1 *fp, m2 uint64) { mul576Generic(r, m1, m2) } -func cswap512(x, y *fp, choice uint8) { cswap512Generic(x, y, choice) } -func mulRdc(r, x, y *fp) { mulRdcGeneric(r, x, y) } diff --git a/dh/csidh/fp511_test.go b/dh/csidh/fp511_test.go deleted file mode 100644 index b3836df6..00000000 --- a/dh/csidh/fp511_test.go +++ /dev/null @@ -1,407 +0,0 @@ -package csidh - -import ( - "crypto/rand" - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func testFp512Mul3Nominal(t *testing.T, f func(*fp, *fp, uint64)) { - var mod, two64 big.Int - - // modulus: 2^512 - mod.SetUint64(1).Lsh(&mod, 512) - two64.SetUint64(1).Lsh(&two64, 64) - - for i := 0; i < numIter; i++ { - multiplier64, _ := rand.Int(rand.Reader, &two64) - mul64 := multiplier64.Uint64() - - fV := randomFp() - exp, _ := new(big.Int).SetString(fp2S(fV), 16) - exp.Mul(exp, multiplier64) - // Truncate to 512 bits - exp.Mod(exp, &mod) - - f(&fV, &fV, mul64) - res, _ := new(big.Int).SetString(fp2S(fV), 16) - - if exp.Cmp(res) != 0 { - test.ReportError(t, exp, res, fV) - } - } -} - -// Check if mul512 produces result -// z = x*y mod 2^512. -func TestFp512Mul3_Nominal(t *testing.T) { - testFp512Mul3Nominal(t, mul512) - testFp512Mul3Nominal(t, mul512Generic) -} - -func TestAddRdcRandom(t *testing.T) { - for i := 0; i < numIter; i++ { - a := randomFp() - bigA, _ := new(big.Int).SetString(fp2S(a), 16) - bigA.Mod(bigA, modulus) - copy(a[:], intGetU64(bigA)) - - b := randomFp() - bigB, _ := new(big.Int).SetString(fp2S(b), 16) - bigB.Mod(bigB, modulus) - copy(b[:], intGetU64(bigB)) - - addRdc(&a, &a, &b) - bigRet, _ := new(big.Int).SetString(fp2S(a), 16) - - bigA.Add(bigA, bigB) - bigA.Mod(bigA, modulus) - - if bigRet.Cmp(bigA) != 0 { - test.ReportError(t, bigRet, bigA, a, b) - } - } -} - -func TestAddRdcNominal(t *testing.T) { - var res fp - - tmp := oneFp512 - addRdc(&res, &tmp, &p) - if !eqFp(&res, &tmp) { - t.Errorf("Wrong value\n%X", res) - } - - tmp = zeroFp512 - addRdc(&res, &p, &p) - if !eqFp(&res, &p) { - t.Errorf("Wrong value\n%X", res) - } - - tmp = fp{1, 1, 1, 1, 1, 1, 1, 1} - addRdc(&res, &p, &tmp) - if !eqFp(&res, &tmp) { - t.Errorf("Wrong value\n%X", res) - } - - tmp = fp{1, 1, 1, 1, 1, 1, 1, 1} - exp := fp{2, 2, 2, 2, 2, 2, 2, 2} - addRdc(&res, &tmp, &tmp) - if !eqFp(&res, &exp) { - t.Errorf("Wrong value\n%X", res) - } -} - -func TestFp512Sub3_Nominal(t *testing.T) { - var ret fp - var mod big.Int - // modulus: 2^512 - mod.SetUint64(1).Lsh(&mod, 512) - - for i := 0; i < numIter; i++ { - a := randomFp() - bigA, _ := new(big.Int).SetString(fp2S(a), 16) - b := randomFp() - bigB, _ := new(big.Int).SetString(fp2S(b), 16) - - sub512(&ret, &a, &b) - bigRet, _ := new(big.Int).SetString(fp2S(ret), 16) - bigA.Sub(bigA, bigB) - // Truncate to 512 bits - bigA.Mod(bigA, &mod) - - if bigRet.Cmp(bigA) != 0 { - test.ReportError(t, bigRet, bigA, a, b) - } - } -} - -func TestFp512Sub3_DoesntReturnCarry(t *testing.T) { - a := fp{} - b := fp{ - 0xFFFFFFFFFFFFFFFF, 1, - 0, 0, - 0, 0, - 0, 0, - } - c := fp{ - 0xFFFFFFFFFFFFFFFF, 2, - 0, 0, - 0, 0, - 0, 0, - } - - if sub512(&a, &b, &c) != 1 { - t.Error("Carry not returned") - } -} - -func TestFp512Sub3_ReturnsCarry(t *testing.T) { - a := fp{} - b := fp{ - 0xFFFFFFFFFFFFFFFF, 2, - 0, 0, - 0, 0, - 0, 0, - } - c := fp{ - 0xFFFFFFFFFFFFFFFF, 1, - 0, 0, - 0, 0, - 0, 0, - } - - if sub512(&a, &b, &c) != 0 { - t.Error("Carry not returned") - } -} - -func testCswap(t *testing.T, f func(*fp, *fp, uint8)) { - arg1 := randomFp() - arg2 := randomFp() - - arg1cpy := arg1 - f(&arg1, &arg2, 0) - if !eqFp(&arg1, &arg1cpy) { - t.Error("cswap swapped") - } - - arg1cpy = arg1 - f(&arg1, &arg2, 1) - if eqFp(&arg1, &arg1cpy) { - t.Error("cswap didn't swapped") - } - - arg1cpy = arg1 - f(&arg1, &arg2, 0xF2) - if eqFp(&arg1, &arg1cpy) { - t.Error("cswap didn't swapped") - } -} - -func TestCswap(t *testing.T) { - testCswap(t, cswap512Generic) - testCswap(t, cswap512) -} - -func TestSubRdc(t *testing.T) { - var res fp - - // 1 - 1 mod P - tmp := oneFp512 - subRdc(&res, &tmp, &tmp) - if !eqFp(&res, &zeroFp512) { - t.Errorf("Wrong value\n%X", res) - } - zero(&res) - - // 0 - 1 mod P - exp := p - exp[0]-- - - subRdc(&res, &zeroFp512, &oneFp512) - if !eqFp(&res, &exp) { - t.Errorf("Wrong value\n%X\n%X", res, exp) - } - zero(&res) - - // P - (P-1) - pMinusOne := p - pMinusOne[0]-- - subRdc(&res, &p, &pMinusOne) - if !eqFp(&res, &oneFp512) { - t.Errorf("Wrong value\n[%X != %X]", res, oneFp512) - } - zero(&res) - - subRdc(&res, &p, &oneFp512) - if !eqFp(&res, &pMinusOne) { - t.Errorf("Wrong value\n[%X != %X]", res, pMinusOne) - } -} - -func testMulRdc(t *testing.T, f func(*fp, *fp, *fp)) { - var res fp - m1 := fp{ - 0x85E2579C786882D0, 0x4E3433657E18DA95, - 0x850AE5507965A0B3, 0xA15BC4E676475964, - } - m2 := fp{ - 0x85E2579C786882CF, 0x4E3433657E18DA95, - 0x850AE5507965A0B3, 0xA15BC4E676475964, - } - - // Expected - m1m1 := fp{ - 0xAEBF46E92C88A4B4, 0xCFE857977B946347, - 0xD3B264FF08493901, 0x6EEB3D23746B6C7C, - 0xC0CA874A349D64B4, 0x7AD4A38B406F8504, - 0x38B6B6CEB82472FB, 0x1587015FD7DDFC7D, - } - m1m2 := fp{ - 0x51534771258C4624, 0x2BFEDE86504E2160, - 0xE8127D5E9329670B, 0x0C84DBD584491D75, - 0x656C73C68B16E38C, 0x01C0DA470B30B8DE, - 0x2532E3903EAA950B, 0x3F2C28EA97FE6FEC, - } - - // 0*0 - tmp := zeroFp512 - f(&res, &tmp, &tmp) - if !eqFp(&res, &tmp) { - t.Errorf("Wrong value\n%X", res) - } - - // 1*m1 == m1 - zero(&res) - f(&res, &m1, &one) - if !eqFp(&res, &m1) { - t.Errorf("Wrong value\n%X", res) - } - - // m1*m2 < p - zero(&res) - f(&res, &m1, &m2) - if !eqFp(&res, &m1m2) { - t.Errorf("Wrong value\n%X", res) - } - - // m1*m1 > p - zero(&res) - f(&res, &m1, &m1) - if !eqFp(&res, &m1m1) { - t.Errorf("Wrong value\n%X", res) - } -} - -func TestMulRdc(t *testing.T) { - testMulRdc(t, mulRdcGeneric) - testMulRdc(t, mulRdc) -} - -func TestModExp(t *testing.T) { - var resExp, base, exp big.Int - var baseFp, expFp, resFp, resFpExp fp - - for i := 0; i < numIter; i++ { - // Perform modexp with reference implementation - // in Montgomery domain - base.SetString(fp2S(randomFp()), 16) - exp.SetString(fp2S(randomFp()), 16) - resExp.Exp(&base, &exp, modulus) - toMont(&base, true) - toMont(&resExp, true) - - // Convert to fp - copy(baseFp[:], intGetU64(&base)) - copy(expFp[:], intGetU64(&exp)) - copy(resFpExp[:], intGetU64(&resExp)) - - // Perform modexp with our implementation - modExpRdc512(&resFp, &baseFp, &expFp) - - if !eqFp(&resFp, &resFpExp) { - test.ReportError(t, resFp, intGetU64(&resExp), base, exp) - } - } -} - -// Test uses Euler's Criterion. -func TestIsNonQuadRes(t *testing.T) { - var n, nMont big.Int - var pm1o2, rawP big.Int - var nMontFp fp - - // (p-1)/2 - pm1o2.SetString("0x32da4747ba07c4dffe455868af1f26255a16841d76e446212d7dfe63499164e6d3d56362b3f9aa83a8b398660f85a792e1390dfa2bd6541a8dc0dc8299e3643d", 0) - // modulus value (not in montgomery) - rawP.SetString("0x65b48e8f740f89bffc8ab0d15e3e4c4ab42d083aedc88c425afbfcc69322c9cda7aac6c567f35507516730cc1f0b4f25c2721bf457aca8351b81b90533c6c87b", 0) - - // There is 641 quadratic residues in this range - for i := uint64(1); i < uint64(numIter); i++ { - n.SetUint64(i) - n.Exp(&n, &pm1o2, &rawP) - // exp == 1 iff n is quadratic non-residue - exp := n.Cmp(big.NewInt(1)) - if exp < 0 { - panic("Should never happen") - } - - nMont.SetUint64(i) - toMont(&nMont, true) - copy(nMontFp[:], intGetU64(&nMont)) - ret := nMontFp.isNonQuadRes() - - if ret != exp { - toMont(&nMont, false) - t.Errorf("Test failed for value %s", nMont.Text(10)) - } - } -} - -func TestCheckSmaller(t *testing.T) { - // p-1 - pMin1 := p - pMin1[0]-- - - // p-1 < p => 1 - if !isLess(&pMin1, &p) { - t.Error("pMin1>p") - } - - // p < p-1 => 0 - if isLess(&p, &pMin1) { - t.Error("p>pMin1") - } - - // p == p => 0 - if isLess(&p, &p) { - t.Error("p==p") - } -} - -func BenchmarkFp(b *testing.B) { - var res, arg1 fp - var two64 big.Int - two64.SetUint64(1).Lsh(&two64, 64) - n, _ := rand.Int(rand.Reader, &two64) - u64 := n.Uint64() - arg2, arg3 := randomFp(), randomFp() - b.Run("sub512", func(b *testing.B) { - for n := 0; n < b.N; n++ { - sub512(&arg1, &arg2, &arg3) - } - }) - b.Run("mul", func(b *testing.B) { - for n := 0; n < b.N; n++ { - mul512(&arg2, &arg3, u64) - } - }) - b.Run("cswap", func(b *testing.B) { - for n := 0; n < b.N; n++ { - cswap512(&arg1, &arg2, uint8(n%2)) - } - }) - b.Run("add", func(b *testing.B) { - for n := 0; n < b.N; n++ { - addRdc(&res, &arg1, &arg2) - } - }) - b.Run("sub", func(b *testing.B) { - for n := 0; n < b.N; n++ { - subRdc(&res, &arg1, &arg2) - } - }) - b.Run("mul", func(b *testing.B) { - for n := 0; n < b.N; n++ { - mulRdc(&res, &arg1, &arg2) - } - }) - b.Run("exp", func(b *testing.B) { - for n := 0; n < b.N; n++ { - modExpRdc512(&res, &arg1, &arg2) - } - }) -} diff --git a/dh/csidh/testdata/csidh_testvectors.json b/dh/csidh/testdata/csidh_testvectors.json deleted file mode 100644 index 01cfec9a..00000000 --- a/dh/csidh/testdata/csidh_testvectors.json +++ /dev/null @@ -1,2956 +0,0 @@ -{ - "Vectors": [ - { - "Id": 0, - "Pk1": "2fd62ea1798c0839387d17587a22dcbb89c5797531bb38eff0cd505575c91c440a70e88aa4e67ad267460e40235076dec6ea6f7b60b59aed2a199cc1eb12123c", - "Pr1": "c4d4dccbfedd1b103c123ff2ed11345dfced1514decbc40cdee12e450fdb35fdb5b33ffb2d", - "Pk2": "895ee9f9e96aebf244c20171133aa0c2601b89f98b9c1f2eff7a44bbfc646a4ff5468775dde42d75803d5298eb5b6d27212d49bf59238c0ddea0eeae8bded937", - "Ss": "870ad67d9875cd535a8b4b5776c2eb59acaa872a5775231f75cef212449e40752ac557d12d556edcac68b1ee94a2a5ba6dce4f6bcb6e91c311d5759c83568e29", - "status": "valid", - "comment": "" - }, - { - "Id": 1, - "Pk1": "c017b2703feb1f429d7e101d34b52652a4dea6499c4731d494e1841c1d4333e8c3c6f986ea8e5a62b7943b61025fc273bce2e1c0430a69b78ec35141065de84e", - "Pr1": "0c323ecd4fbbbbd12ccd5eb41d5c1f420ebf330e1521fc21c104cf0db0f0cb0dd5d10225fe", - "Pk2": "9f189b6f09ec6ef686de1abc438e9708ceaac64cf01e9695c55e1997c5c13992f4e1c35e5c809af2d9be6ffad36e8966a94190f84962fd6e7f5fe9bbd7aee41f", - "Ss": "755e8a3e344b0ef2accd8855ac292cdf1dd3d0f9e7403464f85a0784351f0317caae5455d4f8c2a1666adb364e9dc4aff578f02a4bb3da031a5e5e1e30f5dd30", - "status": "valid", - "comment": "" - }, - { - "Id": 2, - "Pk1": "758baaa1d991fce063ff29b4192dba6c8d9b6620ef858fefe2e5218c1902dc0d84c81877f0eba7ba3346dc6a67c292e2f3ee0567b5ad4a285fab92bd43441305", - "Pr1": "3db1b323d054ec052201d02ff20103b250ceeeb243f40e5e24bf122ebfe30551e55ed0b1eb", - "Pk2": "41d8d0a352cbdeb2ea16733e83b6a6e222abfc2afafd76451ee4231c47d527a58956b69abcccdc582706d4aababbedf26c242c7c1192f43f5d465feb77d72f63", - "Ss": "b95b8b83f4fb3de618306608c5da7e774822f6e4e2f1e93eee0906f5a714c5d58d467cb9e5af617d0b9894dd5008f34fde855ac418b5460bc0109941b7f8151a", - "status": "valid", - "comment": "" - }, - { - "Id": 3, - "Pk1": "0cd103b51492be43c35c80523607142ae88f6896dc64e90bd710d6778688e2b3c2c6cd49d376d859d0ed84804d4584a1ac942cab87483c53bee22369aa0a0d65", - "Pr1": "bfffb01ceb01e2544e1de44e30c21effee3212f5ee534b4b30fffebefbe3e400ebf13e0b2d", - "Pk2": "5ec767260e61594ecf768cc0c3a381042184d58e4092c6c13eca657b2bceb1eb44275babf98741a64618b5c8998d18454c63e92ea0b7fdacdded1bedc44d4549", - "Ss": "c962080c5170ecd996c904b363c9034c49472e177523247029a7d85fd3aa01eb589e17bbec73196fa3835f7460a0bdd75bebb3cd53467cd2d1eec5906d21761a", - "status": "valid", - "comment": "" - }, - { - "Id": 4, - "Pk1": "111fd8d9e336cad4578179638cf3d1e64a5ddc51c1f8a5fcc8bf321563c410e7e0ee7531ac7595b2eb13eddcb70df6919848edbafb941142ae9cce03e47e2d4c", - "Pr1": "f00f025ec4feb142b2cd2e5d04ffc3b10ee4c1ec350ff41d553e1f0323efe305e24fc0f150", - "Pk2": "87d6effecd8ee94b6f84521637187dd9fc4d29100e0ee4b07516c9889acf5fdebe9881dfeb902efd354b367a3ddba3773991cb1cd52ca4f25a7d18f739272462", - "Ss": "20bfe627e1d0a6ff0ead98ab55049d190fb2a563f78b85b574d494c4760d8c567315f3ce7eec8852ae359f74d7b7f0c55ef24d72a285ab6b838f9b16d7cf8749", - "status": "valid", - "comment": "" - }, - { - "Id": 5, - "Pk1": "db8aa23c21ed69dd507048dd032050288f6330c97599d0b78f4091991d39f8b9ecc101d966d4049b38de7f21cb7dae42c02fb5f3d6323c74639f52cbcbf6553b", - "Pr1": "4c23dc513b1ddcbdd5f2fc25bf540b1215ece4f244e1222f44c01515ec0bed1d4b2fcdf234", - "Pk2": "d8d3bb64e2e354e0a4d209d05f39e7150f6dcd074cf5ac558706bc4428555e2c44dea6b036e5492cd5fe2e59e5bed9bde65aeccf8a47d6a28f8525283ec23a09", - "Ss": "af726b0535a37777c3790db3ddf8118c7f795366d51c77d2decab720c799248e34c4417d825a1b3bf3de814bf27c8917ba16e8a83b7117709cb455f34fd37328", - "status": "valid", - "comment": "" - }, - { - "Id": 6, - "Pk1": "c170985f761b9742950f27256f6e5fe63564ace2bb1c1240c87f915b0fe3761295d3c0f8344d78872706124ba6c01b9f460d683801563c7f333404017b8c874d", - "Pr1": "052dde3fcdfc0cd2efe2bd3512d1df32b304cbbbf4402e1cc55f00e3ec2cfdf4fc2c03cb0f", - "Pk2": "096a2838cb794731790b102549905ceda31a94b6951038e6a73483e035045b75917fc8acf982b161418a9a667a8c2afc184feb48462520cc0e85f64a114f0438", - "Ss": "80690d9623baf4e4881aa63f47f751ec88c9c099516a384f3c5d97179c8d33700679e28087f0318e51ed7839917c76dd0db74fc03e10fb1c539c92075368f85a", - "status": "valid", - "comment": "" - }, - { - "Id": 7, - "Pk1": "60270f86533c7394ba891009668d0c5f31dbdf22d6c74b8c1ffddc280d7a16a49797e14c9ae0b16cdaf337f718206d5dab380e345c2bcf9567e25c3eb757bd3f", - "Pr1": "5b224f4dd4501cb0f15b045dd154cd50b25bf52234fbd1cb4db3e50f3b404eb3e4fc1ee530", - "Pk2": "26dc974e40298a7a550d1d28f1eb9273bf16852327d2f2cfef768bda463b43346ec711bb3454bb5dd0a7778744bc6dab6de330f3024baaf249095ae916d87e43", - "Ss": "46eaa33870b4be48fc84b4aafd3cb995852a5ab875cd75d46c40d8516988344a07ec30a4f4b1ff3b63f50a380ae409dabf805ad1af0d9cd4c66871c49aa2b613", - "status": "valid", - "comment": "" - }, - { - "Id": 8, - "Pk1": "007c8c48845b314d3d1cfc1376080e38ce3eb7ff8e876e91ecaa24ecd8778e7a5967930894afde516e585abb2252051e81281988a1f4f4b9fd3beeaaab76d42a", - "Pr1": "b24131234103d5cf1c01543212bcc35bc334cd2ff202dccd04fc3ef5ff35352edce12cd431", - "Pk2": "d4d8de755a9cf5e2c9df44770e1cd2561617cda5a469fa90ca0f3f3b78af682965e78ab05ddcc9618352c890e72f7cff35c218ca7185eaa2377e3ffc14774c51", - "Ss": "14061ac3ea3ddd28a56387eacf9958cd7cbbdfc107b34b1c9c3de3b37db9417acfac5c53357d650e1bef3e5dec24891c6d8968851d6352aaea57aa2ed9a0f00a", - "status": "valid", - "comment": "" - }, - { - "Id": 9, - "Pk1": "43659c08a6d627d9cf4735c891aab0bf3ec481614910372fb5fc26e3742bdbe0ac352e5f9f210f8cdc7b005f353425cee6f5c962770447266bcc53267abd9e23", - "Pr1": "1c5dfd3c25d5d42b1200b0f3ec443d0bebdff012eecd3cb2c1f4c4e32ef3bd0fe35bfe400e", - "Pk2": "bd0c0009df67b0349efbebe675843ee0e730ca02c74305a49e4bc594cba5ea23ebbf422e88e4cbd233929c8f0cfd450f142323832025b3fe8ae9a963ef7f7105", - "Ss": "0848e8785c4adc94057a07b0f4ba1c91eea3fff5f24f4af3ae39a92a4b724e85138c9622d484d350acd5191ac71ca6de6acef4715097e801fa57524de01edb01", - "status": "valid", - "comment": "" - }, - { - "Id": 10, - "Pk1": "8718af0c2f8d1934d36dabf98fd6dfc59b492c712966435da2a5b87ce7d8932d68b8133a8b67baa00ff2c153853e3f6455cb129e64ebcb8bb27da63cf03b9a32", - "Pr1": "25dbdc2c5d133ee52d33f2cb5efdc14fd4d5334452bf3dff02451bc5e2c0c4031b5f432005", - "Pk2": "2f51d9f132fd4dcd455b2824cb34bc3e40a1230fcb5806ac73b790f45ab424e3e1198fde46bfa3616d9ea774aec86b2bad6bc25fe1f69336b1165a6501df912c", - "Ss": "3a01783110eb87f056dd74309eb930d88d04ed743957c49e3fc76cf0e8be519002b1df3f7a0fa25781341dff3903d455435e41d1470b60ba7480883e87185a44", - "status": "valid", - "comment": "" - }, - { - "Id": 11, - "Pk1": "c18552ebbc4c5eeae52527aaf836c85e118768183db8e806e1b8b62f4a41e20820f71e8e9e54fbdc6a23b8d1498a893683b6cad52f6c6e39e2e7a907bec9df2d", - "Pr1": "d30105dd234510d550c5cd4fd5504b34b3dcdf1cb3f255fe104e2d4dd545b40d42ce2c15e1", - "Pk2": "b1665e32f9d5109a6391ef6dc37805d417435c3bcd951c709723c793c5ead0f1b8ff6db0f832c3852017a86d44a1b99bd90a72ece5a16096cdec9ddf76294912", - "Ss": "a510b28404fd18e5e09b86356c79a29f24bd510d6753bd76dd3559a4b6512282e9057fcb5d09a7c7ac7aae303254d979fe32963bae76daa38e440047f8a77a39", - "status": "valid", - "comment": "" - }, - { - "Id": 12, - "Pk1": "7350f4abf09ac07c06060eed93550f3a7e98d33aa8f27eb15b0d95be0464ac5bc076432ed72351b37aadb396b8cf508393b6ec69b21838e2cee8f0b78cbfa134", - "Pr1": "be10bf10bb5b3ebbcceb11c4352b113400cbb411342b1cb21d443352b21203bee1e12fbebe", - "Pk2": "b6e041a164df9c371ce0269edfc39d7a35b4912cdcee025f4cf94ed27d28e293c6aabdd12efbfe242cc3af779780dcf7989602d2040181053cb15e91af8cd218", - "Ss": "f1839d3ee717d4e771ba98cb7d8f0876ef609d121cdb5242c08f024102880c54b70d8b736cd0619749b669c04a81e25f60a43d8de6ab0c99dd965fd04a55f61e", - "status": "valid", - "comment": "" - }, - { - "Id": 13, - "Pk1": "c75d4c97b1279fb71527e197cdb10187496847bec5f92d87aff488f94ed6e4af9106d90e138e9f76080fa3c2dc02bc53605729d61b44a713b73e55c0374aa419", - "Pr1": "d1c4e5204ffc2efbc5fcbe4fc214e25f03d4c1bc52035d43c1ed34fec54535b2ceef40ff14", - "Pk2": "555b2ee62bebf290ea165bc236b52dac676f2fc76035c7a932e5a7af124e765b01c2817f56ecc583becd812844b6900e65215d1f6d1fbf7702daac9b97ed7e55", - "Ss": "907c30d6734023d0834d27a1217d2db171a18847fc23ac841950789e41e1b128e9530ff4adb6ee2a7696822a51860cdac102c88e6174bc36044942f843c40547", - "status": "valid", - "comment": "" - }, - { - "Id": 14, - "Pk1": "464384f617fae27179514b7b4231d24310c0125fa00889b3a301c7fbb2279d01f3d26693c0560d1da464d4d94f86a65c29b8a4a4621a75a51755c16f398bf533", - "Pr1": "5dd0125dfd5c123d33be21e4fbbf13b0e13b00f5253cb151f3b22c02513042cc1c22f3e2bb", - "Pk2": "c26c07be3dfacc0dd675a308be3eaad29c73af2e1fce1d2653e6c3773a9f49c2532206ba96c59c043f48f16ef133c5cb8f324633021171943a15c6bbb6629a61", - "Ss": "54c51f9a31299a0985fae6d50cd7c74489533ddf8ec178f5e9af02e393b14e37fed7282ebeefa296e1279ba8f9f2ef0f2a62e45833d40ef54d49c80c4c758941", - "status": "valid", - "comment": "" - }, - { - "Id": 15, - "Pk1": "930dd66040ef7e32480a68ddbc9bfbf7b4469018652d9600121f25dc88ffb9ac9b15fb0f92a35cec66a258bfd0b7c3108c36ae2004bb88c9444a506a11d8cd36", - "Pr1": "e4530435b302d0cc41c11fbf4bceb4c5cc11cc40bd55b1eb334f533edd1f554eb430f5efd1", - "Pk2": "43d7531ecdedc868ee6f16172c22ee32d566b4c1a6951372ee10c43b6c6c08713308ea5b42b0c8217e1e9bee8971da9fa896012e06e29135850a2c138dbf043a", - "Ss": "1e31b8f444a96180c65eaedb5392b75f177b5273f3c62393a415d0cf56f30d0f39542a661b4171716ccffcb6d6eefddeb19f8fffd682d8f7df5b4132e7c6e22c", - "status": "valid", - "comment": "" - }, - { - "Id": 16, - "Pk1": "abd38fd9948ca9a5de0d50e094e504fcf848c611f9ca0cc071b26bb5c39062892984c46a3d377f60cbfd7f1cbc9288dc4f2c072e31458a27ff97cc65f7e4252e", - "Pr1": "ede0cfd2bb4c1333112ebd50ee01fe404b4cffe242e042ee5bc15fe3df2dfeb3cf255d23e4", - "Pk2": "05fc229d372a5b7b00b8cb54c9cb4bad87b8a3627c06c00e10e4605281d4ba09b8bfde349c83eb45bb014d4f32e15be96c2520f55c6fd97f6a1b7e5582f64c3d", - "Ss": "fb6af7aae48fb5778eaee3017454877b7ffd10609f17a3f85b58c7da6376812316631887c869a9eab534d8ed1be66dd2cf91243cb5b2b4022f225a93e9740616", - "status": "valid", - "comment": "" - }, - { - "Id": 17, - "Pk1": "4c0fd41c5d685da159648670760185bcc570e40719fd1a5418a03a70a44c9338ccce2e95657d9f63aa69d608736165a99858ccd070441848bf8e436271d41f34", - "Pr1": "bec51245f5b2d411cdfd2bff4c504db225be510d523cf30dc1b233bbb5cc0eb120fbceeec4", - "Pk2": "33751b312dc5fe9af5c996e01e0fb9d63577b78426a2a3a38116826879569dca360cd2e7dbfe0ec2a89678a3b1fb3c652d3abb4cc876a209654914a09991493d", - "Ss": "3a03079a1d37263aace2b48db2a2ca3af1fe8a36cdbd575b1f3f4617b7d73c22009997cb54b77724835576e7b185eb3dc1e1ebfc265bb25f43e46091aa6dc71c", - "status": "valid", - "comment": "" - }, - { - "Id": 18, - "Pk1": "7082d57f25bbd7f0bce60613cdbfe5b4acb0f24ff390ff65ce2d7230f5a6e307165437c649001443d36cdaec3b5e5285e2f444ccb9b93803ae90bfdceb7e3e00", - "Pr1": "24b5cbd420f3fb1b50f3c4ece53f101dd15fb402bd2b0524e5ec4cc2b0f45043f1fbe042f2", - "Pk2": "cf36e7a48366a3eac28433d89b2cc5cdd993242ec3ac0d8e3757eed68d90370463aea9a1ee01c3e7ca5cc5a20d0a5aacc7e54145c37f03c84586d965fe334323", - "Ss": "a3d488ae93d1190eef04df0bba02a818e9a0bbc5af95dedde4407a48b8b1b0d78130f1369dc95a256737ffe5fc1949712e69587b67f739d885c6b4c3f91c0246", - "status": "valid", - "comment": "" - }, - { - "Id": 19, - "Pk1": "5b5f18ed7ad6443a249a142be64dd0288b13adfe964fc0a731734161027076d2b4c21712b36d10a1c173b15f1d1bc3d046f81e29efc4d92cd180cec8ec7e3e57", - "Pr1": "e5e5ce0efc0c405fb405c501fbc04cf1df2f04bee00eb5b10f1450323b2d10bdd1b212f302", - "Pk2": "97d42a62862dbeeced990dbfeed7c916275f59d2899b02b21b08828f07852d7ac99145ad33442ad925d0d31c89ea1b6ddb8f79eeb9d07ecbb0a02154f82c4b2f", - "Ss": "6919aa5d436a2e57109fa0ff5a840ea4c1385bb1f24b639f0ed88aa81778ca5f6ec6322f073daa2fa42bbeae472774bb54f485feccdf295abd278e7be7905d4a", - "status": "valid", - "comment": "" - }, - { - "Id": 20, - "Pk1": "ef89e02f02ba2086728ab37c85bcdb629493e8f5eb917dd1badc987fc3105675693d64eebc10c57c347a06075a60e8057894a0f73106dafd4b4d36775e014007", - "Pr1": "d0d0cebf031c332353441c21db2ddc23fc0cde0ecf54df11e0ebcddd50edd0f3030ee344b1", - "Pk2": "2025a26445023ea539c092944611033bf307612e4ce569c7b709b1f49536d4d102f39bbd5e2232dba3c69313983ef9f3884881d4505ceb1b5d018c1cd9235539", - "Ss": "cb1a80a29435e16df8a5fabb216a72139ea8db7a1d28ec969dde48ff8aa8eb6f0ce5237053886334b67b834253f97ea586f338c2ba8c5762e4eec69af1b5e81c", - "status": "valid", - "comment": "" - }, - { - "Id": 21, - "Pk1": "47dcaf21b5cb31b22bf9afe9ce45d9faaf48f977d033822ad9cfbcaebd1c4c5a9fed3332ce51114b6b7739d441a84a6b4108d6dd53abf75d3e6b55fa6bd0a757", - "Pr1": "04520143ee245dffccbcf25df202104ddc2c44413ff2cf0512d1c424b4b44dc2d3e34ee21f", - "Pk2": "1f41827b4da85619b6138c03d22c8c911d85fd8ea5612555c177370dab839b9daab3b5338393a457135dc32616fb708de4a4e04807c3f9fed02fd01625b1d22c", - "Ss": "fa7724a92848ad03b375e50ff89d904a544e0179fe16393630eccf76e73e3cff6cd05b9ff0bb712ae3fa6ef2e55c17bb07dab44cf479033ba92063b22a591f37", - "status": "valid", - "comment": "" - }, - { - "Id": 22, - "Pk1": "2b2c04c91b163176edfe1cd4fb2d822428719b794f18f8c35ec097b14703fef84bf0aa8096066d9af001e6988c34d52674117c73236914c0136f2b5f2650b432", - "Pr1": "c5003bc21d3f350145ef0044310be0214ce44edfe4c3f5453d20e1bce032de33d23c4e130d", - "Pk2": "65a20fb30974ff8752b0848e9a251cc133a031fc63b55b2212d646e499a425ca58007367ee199f77e7a53b1a1eae864d7ea7e2620141cd3221d98cd31c3c822d", - "Ss": "9b7ddb26dad795100d77386ed4daac3e35ef0e6b04c839c5288f79f223f83feaca76a18e29f0d5e61a5890291e7ba267926d07d53fd7d5be56a2fec41233805c", - "status": "valid", - "comment": "" - }, - { - "Id": 23, - "Pk1": "4f9760895c572b8514b93347acd12501cf1d2edf58174d6837a2239b12895383fbd7f0c42f89a2e7c6b09abe4f449505a5296fc8ed237aefb5876cc8b2f32f04", - "Pr1": "3f0ccf444ecd2e10b1e4f025f1ce155d54241db4cbc5e41dcb500213bbe3113ecf40f5d2ff", - "Pk2": "8757d6e77b259fce0a579147e75f3cc08b8c8a8ecb01067639d191d5750996d8fa8debc57a6c547c5e32d735b28937c310e5c47968f2834527078a8b446d790d", - "Ss": "57ac4a9298f3f8e8676edcbc1f0bdea1cc127d0d143948e45eefc40803aaf5901e53ee051e99b4ab186afda58c0c237ad38e9d167acdda99f3cd18c0b5f23945", - "status": "valid", - "comment": "" - }, - { - "Id": 24, - "Pk1": "70659900c5f57000c9527a0228131dce4ccc218592981a3deacc367230fca7b81b9687b3d940790adfb57140ce588cce5988c53ba91742fe20310d0fe9a46517", - "Pr1": "b135c50d05cb3d2cbd11dfb4c2bd5dbb1f42fb4f1eb31bbd32bcef14ecc441e145b0540d33", - "Pk2": "e8da19772ad7ce791bfa45fb22d6d0105ca8e2805b01f2cfa8e117452650ec7ff67313e278233aa01ad43673d9d9d14ef903e6024b86fb0bda1784405e7cd83a", - "Ss": "739ca63d8782f001f710a5d0fd5064a831bbc514db47a0047e2676a7bf5d54e7687b4d8438b292762d5fd3738488136d319a8e1ad9147292c093868c12ef4220", - "status": "valid", - "comment": "" - }, - { - "Id": 25, - "Pk1": "890929d1150b17837afee4c516fe0af7a38195abc26132704c0ce9212fac8c438f24bc8e769d92983bae21e5a6a5946fb799b617cda21728fd60ff76abfdd725", - "Pr1": "dcf05e0cccfe3424d1fd51d2d33fbde30b3bfc0f215103f13c2ebc3fde5ce11bdbb42f515e", - "Pk2": "748c3d3b3dfc65f7166dde35cf7c3b4b326e82415adf9031c7fcd87143b28dd321f96b2c4dd2802134d697ceba98e690dbdf6ea071a687baec1bb68cb2b49e16", - "Ss": "720d711510e5c99f1911d91f43e2d676975d379f94feab01ebfe5076517266fa3fa89afef2989320d84208c23af1b193cd2a7c1ba3a7532cc67c327efd0f3e4e", - "status": "valid", - "comment": "" - }, - { - "Id": 26, - "Pk1": "2adc8c8f6eadebf2612846bfb83c8db6b345f9f89a11dc98c9ace22c20affdf72095a7ea394b96b8d11b6d02a60ea669dd593149fc02aeafe1d8856d0597a642", - "Pr1": "4125d215eb1b31b5dcedd24404dbb2beff3eb4cdccbc5d3c2b14cf3cc5cfcd204ccd34c041", - "Pk2": "c1172412a00a3a81576e7620cf726d85c7643dcd79c1c557c0eaffd3cb9d5201ec56c2aef8b8ebfc3a0a3fb09e62cad9617c288d9e76937bc3991f80716a5763", - "Ss": "d1dfe97b768efb205c6167cc408933cd0327e5daf17fc43282863cb7d09c4788922ca574b50c9659f8be279ac349a5d5a5de827c081b128714b20fc8c5d3e52d", - "status": "valid", - "comment": "" - }, - { - "Id": 27, - "Pk1": "7fc41e17e181b4baf7f6e6a2d8b387abe9fd608cd22f413b639ffaaaf1820eacf69fccd0e91e9d1a356fdd202f85fcb105aadcc0f86c7a8bb2a06085d2f0b408", - "Pr1": "b3e4c40bbee53451cb5db00f350fb2d2e3bc40d30be2be02c5c3bfbbdb4303105cffe4512c", - "Pk2": "3d3adfd18796a2a5669f5aabb931e06e440496f78a8b6d1bfff49a3f2e3d6fcea7263f00ce8837ba1d2ac1c45a37074211636f2f4ae17fd64d06093e55b25c0f", - "Ss": "fe3b0d0b303cdd88be689762554e853c6de336c64d5baaa7239597966030d389dcce524f4653dcb5060bb9bdf80cdce9a4a0ed2a4ff7578fec77bb65d0281407", - "status": "valid", - "comment": "" - }, - { - "Id": 28, - "Pk1": "afb918fb5faec2538fd850a647b7dc668869f281c44a7def068ab68780db2c90eb82676fb5142ae276c4782622b52bc691671c19e8d00098076bae9ffe8b9930", - "Pr1": "4b2cfe542423c5df50b15eb2c5f30f5ebdbb44b430340c5f2c54b14fee0dbd5e50d2301ff0", - "Pk2": "476e6eb224d5ad012fc996f95ce42eb6fb6183a0e625c48b3f270c3930f2b12d8c5dd9a3ebdae3f652b9c1d05124cfb785021d7c37f0761aafb1a4cf6518d42a", - "Ss": "835351fe9f2de9f2c26331c74bf5999e8b888970ea2e9f75cd8362108dba439c994765677cbb6cce1b057abbf029cba3faed7b2d2558d3015894fd9c59e17c39", - "status": "valid", - "comment": "" - }, - { - "Id": 29, - "Pk1": "70cbaebdaf19f32c1d28ed77281b0e17c12ec2fa3b275314eb6ad084126117d32f062f81eb2b9faeb536bf81666315769efd1d67c2bce29b1e480986449f720f", - "Pr1": "2e12d34f3104513525ddfe323d45254de2d3fb3325bbb10ebeb4e2ce3234f33dc4ce3f4552", - "Pk2": "aa04d17d74229b33ada74bf6058d9a10dbc745a4056a58f071571383e3a722794ef99a281fa3597e464b822d0d2a18ba26cd2cfb25ab6376e513913f62ffea1f", - "Ss": "d6113b88f0bbd0aa87076d379fa476062ec3764a5d74c833186c0ca9bb9b5e188f403c95d005378240147615cf54fe34b6374a9f89c20df342c98ccedcf6621b", - "status": "valid", - "comment": "" - }, - { - "Id": 30, - "Pk1": "d14dda6b25180c7fcee5f0aa4c8be710d6e8c43cfd0c6e43f39a439f11330cd09d07ddb2ed54b747657d6e76dbf0e921de2c2bb60164b72e21ca0113737c4d01", - "Pr1": "03c10eedc0c2bc1f5ef30e1fe25cc50fd45eebfde404c12320ccbf31224ecf15b05b4d15cc", - "Pk2": "74090f2cd258bb81aef9a38c12217353bdea54880994bbd75c7eac6985cddb6d22085361fbc75a49a40548eb0089815d0100a125b0da28976f3d79366d90ed03", - "Ss": "3c763b3e48abedd1bb5f1d1b449948eda6145e2e4920f22b8015bd4bb23a83840e555a5e2a39f08b1ecb03a977d613349758a26b3d1f3c75c5e845b1d002e151", - "status": "valid", - "comment": "" - }, - { - "Id": 31, - "Pk1": "1267f152cbed16976d9db447098f2a5c05461eb3b9644c4a650bade9f527f5fb2a96f733d25dd2732cb7f77dd0b72514437a13b7f755a530511f053cb7b6a23b", - "Pr1": "5ccb1e0b042bf0f0f05e2fdb4f01420b5bc2bece542304b4b3d51d455204f33cbbb252becd", - "Pk2": "4b76905ba1310f07642c3d840a84e6db34afdbd8337598a7d724f9190427c6e461d467f1d7cd6f61e7494fc7b4fb553eb3459a2d7676dffb0a83a1af4942cc4b", - "Ss": "92309decb5b10af42279e53be3eb6dfa46bc36604967e881bae310d180b9de7478ec6f2d211117220624e1c25765f7420f6bce60f53e98a1d5738316a47f0e57", - "status": "valid", - "comment": "" - }, - { - "Id": 32, - "Pk1": "fa1ec13a0d40d99be1e6515bb8719628c3a65b7030a4602c44f083fd3921cf3ca1870a218c44b1857b325db3b7c5457882d7018950f045010b3ab64abdec2916", - "Pr1": "ce1342b4d02cc443f24ec32cee4bb23e5c2d5f24bd0c0314d3013f1153e33e2b0fe523b21f", - "Pk2": "9f271bc5699c3cbbbfe57946ab2a9d758ede0ebe1d2edd9a088ca26c84cbfd08557a415ad224a626df324433f81c8596622fde9f0103efae8cfb245014ab272f", - "Ss": "88837b67f06c0e0dc938854631822c91555c4c5dfaf648590c172f59b0716ead23ae4f6574c89d606d8a755100e5358513f9f151fe2feb57cfd064a0fff8f509", - "status": "valid", - "comment": "" - }, - { - "Id": 33, - "Pk1": "70eda06453cb76b9c8c1cde06ebab000a38fb9d486fb93af84cf58c7e09fad682e74ceb5ac6a713626aa880b94500f09957f506c22d0a623980bc43f292e6a47", - "Pr1": "3c412d55320e2030f5455e2bffe4dbce3edf4b45ee125dbdcd0d2d4ee24f201f0252ce3eb5", - "Pk2": "74cc85aa1af4682f439259321f2dea0c1adee2ac490abac7a5dff6a11aa4e43f8dc9916b1186fb7f4b93a861e9d7409c9cb8c242e6ab8d5881743c2204affe2b", - "Ss": "cdf438fc6d7f560c56ab746e3d6e85092441b6621173e4c0de53492c7c3ce42c5fb4e7a9a3db1defe7f58c570e842f7e5226cc1431e0e4a46e93702d91f4da26", - "status": "valid", - "comment": "" - }, - { - "Id": 34, - "Pk1": "369da9ab7eec0a7de1ac36813efc54eafcc0eb8e60498685012c5bd3ac61e898e70acd4cfd3189aa4778900c56e7f80e7dcae25eb1f813fb6c4d06e9acac913e", - "Pr1": "034dcd34ff1d5c1f1ede2f2e2e20f5d5b123f533dfd445fde332520bcffb524413bfbdfd1b", - "Pk2": "197ad46bc959a2cd0afb9753c2f6aad07a7d71308e857a0bf08fad242784e3fd26d9241e76b4e9957131883ba98e7915303a5b248495ed144fce91d0134db364", - "Ss": "3a78a891e06a9b1629c8ff3cebf1b0e79de000c8ec9060d5080cf319327ec500de6ee2d1dd801419b8cb7e6012fb818c758f0b287faa5910991e913304bd6a51", - "status": "valid", - "comment": "" - }, - { - "Id": 35, - "Pk1": "e49d17ba5cf227d242e5c574be68e23d8dde67bc59e88c77d8e958100f1a4b9a03726d715f5e3d9fc9921ed2e9f3425eb6b48786899b921a1d3897c6279c0e4f", - "Pr1": "e2c424d551eccd5cb5431dd05efdc1ecc2eedb21140bc4e23025d0e35f5f3fc0d0e0fc5015", - "Pk2": "3f1c4e9cb8147446745ead96a417d11a54db5c43d2d5e8aa9deb0700e347cc3a62e2c68c1bb9a8165bc2c579861b95a5feef4098ab3741b321cb31a2cb5ea33b", - "Ss": "a370f30b7e6deea5005223202259455c6beceff7ceb8af50c97f554ccb82ea4208efd2487bb1481d85797613180876a1660e5339ff9ee359dd3ca35f6eec054b", - "status": "valid", - "comment": "" - }, - { - "Id": 36, - "Pk1": "4f202bba6594ad47d932ab182aee5975820122b1993f3561dac7ef538edc1ac9eebb863bdee51b50c0ed0c27fbe4764c1e964d36b030b1087ed850f97104f00d", - "Pr1": "e01350c2b011501533203ef0fdc2e0effb242d1541ffb0d4f233c2cccccecbe1e055cec212", - "Pk2": "71caf68de3d4339e6762fe849edce1032f883f73d09597739ad2cc70193d1668f69b742a230731895a6a56aa14b87b07dd5d9734797f29a055155a15a076e404", - "Ss": "c9d723b42ba662dab81aafd91a6779075257366214ffe8ce39f5b82c77053a95f3475969967ab36923f9bd4293a882d6f91c4184cc71f0c85cdbb7517fb71e49", - "status": "valid", - "comment": "" - }, - { - "Id": 37, - "Pk1": "bccfaf23b902b6f02ae3d48b7a7535743536db7a1ebe774c4f01551cac4131aed6b77f860602d436e7d6049641c96a44983c37e58c2c32ac3f7c7a44804f134d", - "Pr1": "4f13db25d3f3e334b3df0bdf5c214c0dd44002bd4fcfb5b533cd12df523343e0c50f5bfe14", - "Pk2": "37d16c998c7abcdaf694066d9eed5f8d1049aef9d8d7b325307aa663b417f1f3f54b72ffe95ea8bd71fda6fe1a329948d8fffc0a128422118e161a750d7d1a59", - "Ss": "5a7301f06a19f19a2946366b58df37e57ff32ca0c4ea28c0c768d1a77e95f232cbb915958786202f9cd0643b359f60a06d5edeaeefeb7ab7abd8719e84bfa462", - "status": "valid", - "comment": "" - }, - { - "Id": 38, - "Pk1": "5fe3561faf0c0612f133ff3f8eb13b64d201de115162c9c3b7258b29aa4efdeb983da1f05cabe9cbc64e900e120ad92dc16a146fb65da04a0474e158e5e9073e", - "Pr1": "45f5b112342310100240de55bdfe53c4fe22befe014f55cff30b4231f20bd525c2f4d4f4be", - "Pk2": "e845b99f95e5cdd38e55d61f6022028142211486a82bf9b4404e2fa9d5bc2db2793a8bd1b450377b43e41d94bacb6533776bd649ebd74534186ccc0b334e7f0e", - "Ss": "c22c91cda28bdd4953d34686a8485ee86d31176e595d1b81e0b26656dd7ffe03c2aa012e7e56683df1be043542f1d7610e21389428e7b04742a4e4083c3e2222", - "status": "valid", - "comment": "" - }, - { - "Id": 39, - "Pk1": "fc79f4f5db414f1305950808e861e09503bee01ca017b7e0c298a391f6d06d9493fdd644156ad7b185e796da1fbd721bdfe1fb2b250b371baf275dbded4dcb23", - "Pr1": "104cc5bbd4c13db4b21fcb3b44dfce1bfe2bc1cf2b20553be5eede5033c05e5dff0d4ecfef", - "Pk2": "43f105be4e1235724f0f523cce8e2c3136f070c175ac8a2ee9dbf810812bbdbde9c1a3988201d370a1da8806c0852bbe60c61e8e9d0edb9da2a3695c93103612", - "Ss": "e0c03da892c667135aa8e24673a58d9cccfd1a4419a28eb65a32a16bb1ca07dfa0a0cd6078e8c6279137e9a77a1ecb3430233e4e6386149753bee4e6cacb5424", - "status": "valid", - "comment": "" - }, - { - "Id": 40, - "Pk1": "d8abedb0ab4f29d97aef42dd4d97fe37c9a6932dae1b09144e1a595cb123187e10c09c7eb698440d6597a4d6557d46ccd99d2d8a721fb60135c3273655a6ae43", - "Pr1": "1552f2e0d5c32ee23d2be3cd2fcf1f0f0224dd20d040151beb310d2ec1f35deee3dd0e2f42", - "Pk2": "db8b17863356eeeeb3e48da6e9bf01a69b0ccc19d5cb403ebd1156c6cd89ab8851b0b9d755d53fdff53630095ea3424aa4755e04d622054ec6702f11cb223905", - "Ss": "96e482b0efb081cd5f989a8fab11c87af7676d97b9107540ea2b3be09ad82270cd31197dfd0c71f0a59cde9fe6ff36e8f3c6e79c682eeda0762df5efd11aea1b", - "status": "valid", - "comment": "" - }, - { - "Id": 41, - "Pk1": "e8a76e7d40ae28794cf8e43e80ce3a5faf69b669d75b10c002b6c1637ae133bf81f563f07ff03f5d3a3a7f484e0659a557f2cd2fd3b6706aa1a5e9516de28d29", - "Pr1": "250e033c52233e50cde3e25be11d4fffe4e0c21def42bde01005dbbb0cd3b5e51305001c04", - "Pk2": "4f7370bbc01a387dd880974b9187efa037dd2cef34c810822e25970b4fc650fab8d442e317238b68bf35d98f1e73e8dd71c95e17482c7f206fc25a4d12b09263", - "Ss": "4a4f1ea87ba28fb104678e363dfb8d3349a42317cdca8c8478c2003cd5bf575b454c4934a4954880a64dc79126e260203d7ea982bcc500ed898a6fce9819bb33", - "status": "valid", - "comment": "" - }, - { - "Id": 42, - "Pk1": "f275d4f32774afe42adf0d874ab81998295c082fff979d570c41b13716a3b0e6bae24c754a5f43b16fa1cb4deef689a9182723162561dc8fda66f72193588c13", - "Pr1": "cf50cc2df3ee54cfb31fe220fddb24fcecb22b1cee4b3c4c2f2200efcdbc5531c1f3bc024b", - "Pk2": "e837cfea1222fd7940bc98382a9fb7cf08fd78484d3ab325c150668055f7ae8e033245a5df6e74e2c0478da6c35febbc08351d8f63b9d59ac914e343e8547319", - "Ss": "ae9a68a489774ca1d06a6d0ebc3e47076de2f30125b18e23a0f97298ef4d14e62b04bdbf3dcb1213a3bc76cb11289a353c46ce8dd79bcfda8366f56956365607", - "status": "valid", - "comment": "" - }, - { - "Id": 43, - "Pk1": "636b5370cb6d8f56573820fc36208d0fc1da00c6bacd48576890d530e9bdf4ca800b1968847648b67d63d91dac71b2c8a201634b85c843d1715a9edbd104813c", - "Pr1": "c303ff2355b3d240e2d03b4e5040bc5b34c4fd35dd3f230d434b3c3b0f5c30c5e13df2b32b", - "Pk2": "2c3863bb4be34c327cd7dedd0810370fae37d66e17a1557ca15e3837259d682b055a097e1d31a0242ed32478b8dd1fff3c9ef7b932380ef1e3fe715391887232", - "Ss": "f18e45f951e1b238e29b29e37da0eed2f3364a179e20abde79107a5aa2c09336ae9c69763f9f17e3c848df2561e4b445c00152547be08b2448bb06e64fe6ba0b", - "status": "valid", - "comment": "" - }, - { - "Id": 44, - "Pk1": "7ad45b5ccccc72b050a797150c3e47164059ac66c7da87b5cc93039b168c08de5892d2dc5ae0a7c0b0ad6411e8f1d7e5ad7f1ab5a0ac986de0dc1249e2832b4b", - "Pr1": "1d34e3df2c40523cdeb24dd2544f35be5413ff03e0cf03f3f211bfe53bfbd4c2cdc3b522cb", - "Pk2": "c8bc7b8237c985f3c4e45735066eb13e02521c32b8c119c799c7de7a79f905b3f344624b0c3e6b043cfc02d0774d32b263ceebaf09e03270994c1c41ed1e0d5b", - "Ss": "ac7758560f8f9b625297b606367b0201da909cb72b78f51d5f97023224b84a4b3a0680893d272a0121430ab9ee2615b311b1b05fa92f3a57c86a462fa302a034", - "status": "valid", - "comment": "" - }, - { - "Id": 45, - "Pk1": "a5bba617cbdad45f33ea534db536a4f13e06474aea177aafbd5005c7d5cd7d80ef6b35c93ae99cf387f0f872d6d70d46dbee1534db09b712df1bc6953edf001e", - "Pr1": "1ff54e053d3b35d1441f0cb205e12d0015c0041bec2ef2de0ce0bce41ebe2cce21250e54db", - "Pk2": "cb7a5016bec4317bf2a81a5bb5db2c1f7451c2df673b6b6d27e3513eaae33932027d57e31b72d2bd201fc2a6df1b4310daf87dcba9062dd49114e19e510b5733", - "Ss": "7a640ca814135f23f00bf417a59095c9a5502727ed25d0be73a603bd54860889ee097d68ac348067f6d2caf0e509f91cf34e825edd55d74db4eea4c4f68ab314", - "status": "valid", - "comment": "" - }, - { - "Id": 46, - "Pk1": "99b688d0c260b6b35dfbc7a27884321d5ad3cf23ce720778b2f235f651d33e2207e44bf04603af01517e42defb8b774e26d9d44b281fd0afb06d62638b1ca250", - "Pr1": "bec5bcfdcf0d1cdc13e3e252451c053101345d3c5d24d24cd0c22b0cc1bc2e1143dffef034", - "Pk2": "24821e9ce27b878d3151e50bcfe2dd81040efca6073aa0a849c21abdc5a71f1cc01daf809d44e868a3e99de67dab2d5a45fcd96156735f591391ea0a92d96a07", - "Ss": "74c6668eb79366b9ff9edc6de1c262b64d3d9bd5f697088965d28e96a84f2070ca1ddc045303680f3e59d13d4cdc1f8221f71db54a9bee8ab4f478e67a8e3042", - "status": "valid", - "comment": "" - }, - { - "Id": 47, - "Pk1": "3f61538c510fd0030ccb79c0e327c5de59b6c25f9131a7569590411612b29c65cd42528c8a703f1013d6483112856732291808f8886b28d1a7123d464974704d", - "Pr1": "2c0c04f1e12bb1dff5215fe44dcdbdc411451fe23fd541e221fec55103dd0e0cb20dee2bc4", - "Pk2": "3b1cb52ede193da596088f5afebdcdff5d417964c83be1a06c2282d0910c1f6f17d52b87695dd99431e691062a6b087f24b7d0cc7ca8a8ac28e257678903224c", - "Ss": "c31b8a0c318104a35330a8cf1ac3add99a0b0c75b87bd2dacbfe57546e4252f3ba69166f41aa0662fb4506105d6c9f712b0cda71694d90b81400127794e97c07", - "status": "valid", - "comment": "" - }, - { - "Id": 48, - "Pk1": "0d3b0ed8fab6eee63567f2aa566635b398eca2fe5593d8102232be0a6b1b190e1627d59bb3a47b558f14a2ed84bda5f35cb1a3a31efffdd1070387d93219b75b", - "Pr1": "45bed3cd31efc005cf3530b1bf0dbf42e140e2e152323ec52e503e043b3cee3cbd12b31d21", - "Pk2": "9c86913b71f55528991e18f555226a2491b2e10974606377787223a924300070e658360eb15405faf0b3944fc57591f5aa9ec4b69a9d36045de23db55b648c15", - "Ss": "415f5bb404f0907ad74659da1794945385329ba2c167a2e1ddced1cfa5ae4b20e7503551abf705d374319999aa43f42631ffdf3b187ce2ec1d8e971d7bbfbe42", - "status": "valid", - "comment": "" - }, - { - "Id": 49, - "Pk1": "3c453793fbd1c784effa7d4247df1c4dee3740385af1fa530c33b74286d6514ccf20dfbb537cb007ce5b80747e11593109e7066043566e0f727b4c049538710d", - "Pr1": "5eb3b32f1d23554bbc1f3343f13f33e5edbcd1ede511c40fb4e0252231db20bbbc5e2fde4e", - "Pk2": "36e2bf1588840c835ed41cb82b84236ef5efeaa8974c9fcc5251d41c6f36c3963df48b45ae806d3d4628e6a5314ebcae8e3db65da25f80eeebb76c475e978f63", - "Ss": "91130cb7684a96e67b3e7226ef59593f86c81817e62911d62b04b13b5138f68a8a020dccee37d6e1e98bed20d01f5df09fa8cc5c2750246f323d3fc29ee1e500", - "status": "valid", - "comment": "" - }, - { - "Id": 50, - "Pk1": "46db86ae790cc9890a9ebef1fba03c9c35fb7cd00c54bc8527464d996ebde41c7dd1fd2038c071dd2bf67dd7b5e497b5b64f6d549afa1d7f6615062a45b6410a", - "Pr1": "bcbd2d3c2be423545e305cc403c3ebbf5221e5fd4cfd4110ccd50db102db330ded0b3d34cd", - "Pk2": "a72d04d0735997dea4878e0b7d5a12f5915568b43c45f3331ba88d0b216decd300a5a05fe47474c6a9f50feebaa71a510802f6f2d08e1ed4f503b5c0aa755c3c", - "Ss": "b08f2a53a4c741b5f2712aa7e46a498726e3d6409f2cc55b21f7818b0ab7ff55ee00c1f73d23e386287da1efb3f73ba3540805560f5acf2505a6bf3b60ec731b", - "status": "valid", - "comment": "" - }, - { - "Id": 51, - "Pk1": "2fc7c4cd8f9b44d9c7c865df2f80326371a15812910850291b15fdf9e85920238ff38b3bad5ae8cc07322dd9d1b5793baae5d6b6283d6315c6f11f54f6400f51", - "Pr1": "b11b2215d1044f2ec4153e4fc52df55d452bcd5f13f313e400f13db0edc0231f5dfe3ecde5", - "Pk2": "9390477587edbe5b1c4356d248b2b0f4c77a95e7bd5627d88a476f9052423793f249067f7777c24d3a88d0252a3b35c2ea7ac76040a1f333f119ed1cd3a8c927", - "Ss": "649e08696dfd11047217dd6c4e409bc3dcde11bbde8e0464812d29709d4db4e200102269765a97dc7f38695b4ad62451c0599052a2aab9dc5a31bcf543ff143b", - "status": "valid", - "comment": "" - }, - { - "Id": 52, - "Pk1": "bbc27bdf00768dabdd533d3b8722f39a2af9eb055d38cf3a21683b078b5955971e3f1097792c60b7962c2f06b953229032cbbb00b9c2efd6ceec4b50df24b412", - "Pr1": "20d1d0be02c201b45c33042f01d1d00c0502fb323cdf50fb41c1cd12ec1c0e0ef0d20e1fb3", - "Pk2": "83d4b548581dd73aa9f06cd9e2a7500dbca8274c157f2f1f77aa1c42077427be8cbb58164db07baaabe283dc0e919a45a98401714cadba33f8ee5d704c9b184b", - "Ss": "e7cfaafa34038e2e5aa6012123ec854d27d2d7041dfdbf7e69bb33af3cba804e1d64ab386e44891c335d3b3798a22f8c47ee9700da29cb804453903ccbfd164c", - "status": "valid", - "comment": "" - }, - { - "Id": 53, - "Pk1": "6db28fd002a175007ba9831c7fba6c22d90f92c5323afbeafd9dee6ffcf4ee6c603aff80da533deef379d4f42c51918df73be7044f1d7e0b8b9af26100c1e604", - "Pr1": "e213022de303eb0c13ce2bbbc00ee53304f0bc30113cffd44242c2bccf0eb54f1bed0bb343", - "Pk2": "38ca5c5cb8694576e86082b1e227184d700f67ce195cd2ec8e807678caedd59e5fd0ceb2409a88d10ebb30f2bd5d0b286d691731449470a554cdacc84044fc32", - "Ss": "cf850621523aab821c3399536ee22436b345a2c045b80139bd4cd5305b8a1219082aa07eeb0e686b1249c8b879118d92071da5a60bfe1b029fa6fbad654fb604", - "status": "valid", - "comment": "" - }, - { - "Id": 54, - "Pk1": "f73bd42f21eba247af717186d3ecc842919df0c52149316152c5334865872fa3f82fae6c1cab00beb203fc63a4bd014bacfa7bb21617baff25eac6cb7b3b9848", - "Pr1": "cbc345ff25c5c2ee0cb44f4bb24dccd400e2b2112f1bbbb4fe3febbeb1eefcb2b41c031ccb", - "Pk2": "4452b65ed121f3bdcd6aea7591ca37e022bcae8e9a39273e9240549e51f0466c85f8004ef6f6dec161d452964fb719c2b1d2dec9be5622c81819c01579e07616", - "Ss": "f672e5223d4a9d3cb7f875a06bb1c5b602d64901ef7d28f3d95c95e06abc9df1e33e3642f65ff86ba5833a6e51824985f2c2c705f2659e0f0c2aa65498d5a538", - "status": "valid", - "comment": "" - }, - { - "Id": 55, - "Pk1": "6940a6c1a053df71e7bf09f2434a6b1cbe01d20a39c4b2da294174bfaf1eb1c767eed10d36d5f9441a5487a7ebc2e9d64ad82fe1a84c643f5159c958f4a56c07", - "Pr1": "25e120d55dcdfcb4ccbd3315d1d5c5134fb2b44ef15dbfbdc2b1f13120c51f01b22fcd5c43", - "Pk2": "f6de8d789b1aeb2db75bda21955122beffbfb8092f78a2e76e3e4db9b73a5ee12454de1a5468bb4f00b6c460d8544f70ebb3b5c8a02abe1138db7e1a44d45344", - "Ss": "5c39f9ce9f554f1432223724841f596424ac137c749174f6d3e52d9a826c2d59a55f308d77a48d32ccf1eed8ec9d3d25130d9260e4942600757cbb944efef814", - "status": "valid", - "comment": "" - }, - { - "Id": 56, - "Pk1": "cd5ffab4dfe6446b491fe9f217a44e5acc4ff093b820255b6b1389254f6e1796507f4c39f79caa42775585219815c7e05e62b52b44da4e4cf3fb38b2c38ee659", - "Pr1": "55b54ff1e4cf01c40005352ee011455cce0fe45201b5e13ef44f334f22cef323111ccdb51c", - "Pk2": "ea272adaf94f45677333d2aedae01205d2f171d357b6d9d39a7c0679fe889f44681c027e4dfd8a7ad370f994d9a16895bb26c5786d88865176f0216f0a9f830d", - "Ss": "2c9cd79fa02c2c44d2970c71b159cb920476495d4a2e8120d9419c77d9c0750ef637b3ed90948e188b188706868c802fa1ea12ca0c346e45a1316ec915d2a820", - "status": "valid", - "comment": "" - }, - { - "Id": 57, - "Pk1": "d7ee92b73fcd9cb387d1f45cfc47b81695a2adfa7f90e600b2a1c8957362a77c74b7c64acc43204d0b1b2227e6df2f828dbed4dc92929704b28ef65df6b42226", - "Pr1": "3bbfc0e0bbcbc054304450fc3d5311c2e5432ef032bbce4b31fdbb55eeb34d03ed4bf2c3f1", - "Pk2": "2e13a1be1cbaf3a95379c4a8a7dfd33ed3211d83f4b67ab488e18f0ea49834b279bd294a4db7af6cf63cd2ac36ceb889c249e89c9636d5114c12a6c8fd86c131", - "Ss": "d43274a41ad8a6d83c6bf234006e649cfb8b26bf0c089655e7c9f1726c6f047a66df2e55c5c6a81db5473d8289bd545504e99b98f458f16afafcf6c466a1240c", - "status": "valid", - "comment": "" - }, - { - "Id": 58, - "Pk1": "63b51a6b80e1479c4349b2a7a3557017f2e339d04cea7e901b495224a6423443906614894275ef128b8b4a391e63361a812a02d19114806de91de2a2d77ce21e", - "Pr1": "53e1f1cb3bfe3455cc030d4e33344becff2ceed5c34fe5dbf02d405c2fe3c1f1bd422050ee", - "Pk2": "ad89c4c7cffd8c7f26394e3dc5319a26d6b127aa11591fbc8f53ad6f6ab9f882eee3226f9275b4bb25866265c743d53a4e815c712929f74a6c33e30a50992b14", - "Ss": "e5e0936407000a72ab3a3c5997737e1e8e0025edd2d61e803eab852d424232e73917bcdccd531acba4e63b0c659d0bd28a4b4365d3ccc637de7310facc900d59", - "status": "valid", - "comment": "" - }, - { - "Id": 59, - "Pk1": "cbcb6ca03df3c389e64ddb50771ca169119003c87edc75f786b5307d169f0db0439e12be5f7d8105b455a6f82b5b7a3609e65022466f07af397c3bff1d5a3b3d", - "Pr1": "e5deb1140d24edf3ccef4db5eb2fb0cccbfbc5322d300d21b245cfb14c154b5fb55fb5cdb3", - "Pk2": "423a6438c223561fb8f4db0937d4557a6225047dcceb3152c5f94ec7a27ffb5c93b7a63705b73f741a638c01b748737397164ac96ff9f9f28c7442fa422a1662", - "Ss": "e0257a6e062476e12b0e625c86f800b8da50fe8f9a8aa57ca1127a827bd5f086aef9b083f6bde996beee9056ca5941697fd0f19243f2fb8cff36ec2e090a8f4a", - "status": "valid", - "comment": "" - }, - { - "Id": 60, - "Pk1": "d47e2b3f3d2455a0cddb1e43cc29eb487fcea4ae3a4d345d4cbed08340883a0be8164a45d871cba92d60485ca66c9754bdffdb8dd6a848c98f93ca5d1159173d", - "Pr1": "3c4c00eeeb1ced25bcddfe0dd302f3dfb5204cb435d002b3e033b3f1bec110ccfeecf52d24", - "Pk2": "0ca4cf66f1ff6a0a9ef9822fbffdc88c0ac44ab9b6709f848ee2f37578e5f52803282fc39380535618b5bd3ef2dff77709ac013e15296964f080e960fc7bd001", - "Ss": "80060ed7fb1f77c71c3b7362a5b7e0f58ce76b08a55f59f46a7a394ea79bfe95e3b1fa7e11ec9adb5f186a4024b41885eafb703da332abc6ba113418f5c37e14", - "status": "valid", - "comment": "" - }, - { - "Id": 61, - "Pk1": "6854611abb5de14cc5ca915b0e32357bd4382999760bb87fdf5bed9ef5e1752970e5db22f4643c36bb2c03a34cf3a3558e2e496b6e1b6aceb3de9aa52f91bf04", - "Pr1": "4dd2543f22b0540f410e1fbedbe2cddc2be100fbd14d52ee3322cd011df253bbf52d40ee54", - "Pk2": "3c06e3ae85a38a57a190c24fda83f509903677e7edf18089f5928b90c15d6a0d0e8a511267f8d7560d89fdda7d8d93eceed51a2c7b420223e11aa95334aef826", - "Ss": "6f05ec6d530fc5186c1bf71cf23b6997d931e4afe94c5c1d982a6eecee58e0a496c26af3e37d0117038f4b6ed5e7ea83798938e10e57301622ae0e7f463c433f", - "status": "valid", - "comment": "" - }, - { - "Id": 62, - "Pk1": "9df5fbd1c44c0ce9d5284f0fde51f2b53802904f86747ee519de3a636e228445d475436bd3f3780a44175c4b830e3ed7d055e729ebe4da42e5f333d3a8183c5f", - "Pr1": "31bf552dcdf1b35020ff0f2fbebfb41532c2f2dbe3240bddddb2500dbbc0efb0fd4ebeb1f1", - "Pk2": "beba0b3b0dfc61597e3586b50838dfdcb8df4f25539b20648427c43e84510f9fd301f4a2ed3e1e15d475c227efe757bb7b9f046875a5898656ef2fa9d20f6553", - "Ss": "42706c0a6eb4c85b7cfe43cd68874db1dfd1b99bcd798400de34d5fda80f6dec8e1579ac015fbb16d716933455cbc563bbe837304c947d314572dc3e6887de2c", - "status": "valid", - "comment": "" - }, - { - "Id": 63, - "Pk1": "67b00bf2dda8505cb3bde15cf33510356e4009600c6ca4a50ce55a41833fe7d398076280c100e51c51523c5e1582b66ed5c0caa92afebfb082e8bfec0443501a", - "Pr1": "e5d1fedb5511dc1b333202cc0f4fc5e221b04b21b3ceddec55e2d02d2bc4fd3f4feb5e2fbb", - "Pk2": "0b856c7ddc7a31d6051006a6ce17a772e13acd68687af17ed7bdd3087df5b87049d32397a9656333f4d5632ec8b92431c976624fd7cdc00b563ebe59647f0b19", - "Ss": "3babb725e9f2e8dc6e95d1ba4f57c64e91981773038da720560a18b7a1ee788e6dc6b8fe9a40271a842bbf3facb837e462e40838cfa9bc9e77a8b69ef2d9d646", - "status": "valid", - "comment": "" - }, - { - "Id": 64, - "Pk1": "b33baecc02ca5ad6fdb47b92a56d5bbd2b1e0e5d158b6f3930e45104fedadc0dcaba2073d7bb600c0ca8a4dbbd2489f59eb4497ec338477c1bb8140580318030", - "Pr1": "cd3df3304e12e1cbce35b2f30135f2fd311f1c00fe5d04b31442cc00fff3c540e5fb3b234d", - "Pk2": "90475986e65caac7cdeb7576c78bdcbc25e23969c4be1cf841cdec8ee3677035e707c3d68dcf5395b6b8625c6f4dec44c3b351b5a0e3d4e4020aaa54a1e0cb0f", - "Ss": "c696baba64b9942e04f75b6a7146a5af2d8a847665f3ab0446137d61f598822a6109ce0f63be083dd88837dc89686364d67ccc3495ccd780f3975272da69831a", - "status": "valid", - "comment": "" - }, - { - "Id": 65, - "Pk1": "dd7e105f200034b3831651616adf527f20262ffd8dd5bda89c0e802c93815b259b87637d7308fef859e8672333aaf7cb13fd31622085bb5e209f4408ed6e4c26", - "Pr1": "34fcd042e3b244240e1d2c14e3f5dee32e1bc2eb021551e13bf502122d3430c02f04de34f1", - "Pk2": "5142ddf63810b623d11575f381c1490baf52f030d665f9d57d87d05130ff40b4407cef942a8541d9e62aac67d21ceb124e474d3af1389ee390e2faf7afac5440", - "Ss": "ad48ca1e580627089db0dcc3c8fd6377b0d40d81181b856fcbe97198a17b215dcf163f9f0a5ff031fda62284b3d6b05960a49f4904a0e836fba969c41145173b", - "status": "valid", - "comment": "" - }, - { - "Id": 66, - "Pk1": "ce40e6378b7bff182ee77b74995bb41cbed6dc6baaa8bb0a731114c03a3f61bca8bcb722f38311dcad9e1d64935fc40a3de647910f9a9ec14381040935ff2f37", - "Pr1": "0d42efecfff3b1fec0c2b1fc1f2d3cdef1be11441e34ed22ebfddcd1f1f250242bcbd2d5b5", - "Pk2": "eb36ec62a9d654b08aa3a2f6cee96d2658f1e163505f06d89d7939a288e87aa6a9445e17d0e78cf7f4e85535b38260af99848ad9603d228d0e783669f2d02128", - "Ss": "1ffa1cebe2c9cee36a35d5da3a22f703591b7f914e23a90275506182109736a4cf7c961740f1915c7dfae1c64e53b4e5b00dec087f8142800d2c90d777c6e50c", - "status": "valid", - "comment": "" - }, - { - "Id": 67, - "Pk1": "09c62765de93d6780dbcebf8751dbf70de0f4269dfd5dc4d8757bcc9e1b7c07d9ab14bb40a1cc10f13d3528d03e29d7b50591893a48e3682eedd6645a4392a13", - "Pr1": "012c0bdf2d42c5050c0c55d1bce1bf022cdd044edc54c3b2114f5fccbdbb532de5d5bdb504", - "Pk2": "3975feba807fa3df6b7635b7a3fd2b9c4a5d4e52a88260f494477c24023cf10ca34c2541ae6259406d530322a380d9d13df2295c82fc9f65756eaf1584c1c006", - "Ss": "e5d6f01327ff93ac867844ba39d1a7a8a1368d02f09c26ccd5a9982d8e67a390f5d0d37377064a25e6af0779b418073dee34893d25784e016a0876f693da8018", - "status": "valid", - "comment": "" - }, - { - "Id": 68, - "Pk1": "045e096da730308eec31c22d70ccf034a48bdd2cef1ed9c4bdda17d699f893be5b75832de44690150d03454fcd430636485836b4ea743f5a9dfeaf2c542c5402", - "Pr1": "4c0f4421255df4d0ed2b1240b4352b2fdbcf4d5420e11b4c00bfc25ebb3dfdd0c1c14cb34d", - "Pk2": "36da7e23b110b1797997984dfe7833caa67eabb045d6beb72d9a444b57154ce94c1da216c97b64d14af5492af5254791240f4ee6406b8a2c0625070edf763737", - "Ss": "880bd3d82df37e13196b10dc0765d7ba650b9b532a64949b673c869e31283c8714b3c6b86c0cdf8c0681996ab0b36fefca63fe97afd9a07facbf28aa56fffd31", - "status": "valid", - "comment": "" - }, - { - "Id": 69, - "Pk1": "875494ecbc1e72a02746b0ecf82fdca2358a9a2cb4c9227e99e0b3bea045e48d459cac988670b4a9244be03360f69d8db6f24ac136c6a63ee18d4403cf165e1b", - "Pr1": "cb0355eeed5e425011cd4e32540ed511e01ccf34ef51b4fbfe4bb14e5d3db2ed003def4200", - "Pk2": "de28cfa07234ffa225ba67908458c7f827ce02d67ae8adb8d6f5b8c417ee55477368a3807a046965e0e06693fc27abc55b5df1a5514942f777d48980ee963740", - "Ss": "d6f733daf0eea9b80cf8a78d6e7821927a9ba457e07cd227afd8ddc1cff28a4d670da41189dcef4ab88e7c3942b011b60180d20f23eb3d1e540234796f2b013d", - "status": "valid", - "comment": "" - }, - { - "Id": 70, - "Pk1": "a80f49aef632349951e8166ba91a3aa32d4304ef74c641bdba162d6445920973172acb614bb680b768a4f2d156d9a09c57876e3b0d414dac6ef6f3cef451d046", - "Pr1": "104edece5b43543b22f1155ce0b00fbf404eed044bbc4b31d330f153bfd1b4231141544225", - "Pk2": "231b4add402f321043a90486ed5650ac98a78453bc3e2ac071f33b87582bbf8b7a4975e9a37df70eefd5690f57fe590ac5e6ff0c28c33d11e6045652684f6f3a", - "Ss": "f855eb0d04132e7b1b3d8a908b85802c417281d3bcdabc75e7fd8cd41b1d379639def4d35d0ef326a9815f065e468fc0dfdd265e32af542b9936426aedb8233f", - "status": "valid", - "comment": "" - }, - { - "Id": 71, - "Pk1": "d60160745c1268730024f7179f4d2efb9732268a9feea990cc4bfd1b8d8b23d4f16b4a3cd430527b66b9fad135cf53bfe728669f289f9f9594fea0f1dfc28637", - "Pr1": "425201441fde0fccddf4c3c1bf2c15fbdbe414d002f522d145fe1b1dcd43b5d500051c51e3", - "Pk2": "1d111a27391da1b0797ffb9ddf6b55a85c71946407d815c883574a7ca38c23e423029d17185ac34dd5ea1e9c8cc6ed39b6292474e3be07ec93cd605ce541f15d", - "Ss": "89e7dd2bdaff08fd41b7d1877c1356a59adcce99efbf58f136035bed2bf19da32d6c7007a0146876725e929980de5bf905c91c604a7458bce4d645f082cee35b", - "status": "valid", - "comment": "" - }, - { - "Id": 72, - "Pk1": "ccdd0f945dd4bc38453595275d68de16439461f4be45037fa5e930a1f2d4edee49a70da806f9c3658c5e9ddb13cf1190fea67fcb225615d4eaf71fe8d6fa4d13", - "Pr1": "f000d12ff5bb02224354432d54042e20b0d3dfb5e522d51e321c5c001224bc0b0e5004fd25", - "Pk2": "0651d2bafa844db0ee996b9ff06801d027c4c9df8e18174af314d23c4c77f89b58878208d1b0d1aa6966393cf43409bea3ebc01eed673b39678056e3c8a50a49", - "Ss": "817dbdcec45d7efcc76e0a77d11acfd2f3f502d49f0d7536837e7a89f929b9d38fb2db4b86a951c60ddecba9d9469b6d410a4ca00117366c51b6718515c43946", - "status": "valid", - "comment": "" - }, - { - "Id": 73, - "Pk1": "805994fbf7891ab76ef31d2b7f5b074e8d1944acaed9e7184f270f0aebc7cc65c8989df661ed62c87679587e5ad88d4bd132edd2f1a6c2624bb481f59283ed01", - "Pr1": "4c50e115d2ff0535db1452bbe1e5efdc4314ce14d4e2ec304ec3305dc5e2ef333cf514ff52", - "Pk2": "62a1121ec51aae2b419b6e7b82a65e19b6083ff62f406ac3b0d29f99835e2e42b40c3988cff08b10ab31faee5f484f27907c0bb0041eae58fe205bdfda4f400e", - "Ss": "7d935abf3a20d5be7d5cb4b67bb3ec1ce8a0dfbdfb5cad3c690b5db6ce13c5e698ed347772886574d31b91d167d971c2dce960dae08d306360c77653b49bf75a", - "status": "valid", - "comment": "" - }, - { - "Id": 74, - "Pk1": "4ad3aca0b2a86224129af953b7b55742e2ccfc48d0bc436794b4c84d9abf3b49b1374bb4ebcbed95378b1f81650207f7c8332731957b9d0311666f37cdd94d58", - "Pr1": "dce3b54c54bfff5504fe3d3efdcf41fefdcb42f0324e15d303c5de4bdf32df24be0e3d2d03", - "Pk2": "5f850610896bd8b61d3168dee8153b16ff620b114587aa42b7e66597c4fc5f727d80e365ea1c747c8ac73a36afe067829ff56cbcbd05147c45c9b3df22047018", - "Ss": "09d7dd0ea26d957f11d4efa5fd995d89daa537e7c0e9219521b70b22a89dbf90689aac011f98db652fd189c5be815c3b4f5cccddc8ac08ac7bee5b37406d4d60", - "status": "valid", - "comment": "" - }, - { - "Id": 75, - "Pk1": "e3967589bcb77c3bacdd84f1ff51725eead898d98784dbbd74b8fee91acb78ad9d7b4f93aa0b1c03825df48ec8ea7a43280910e140cf1c276ed3f5426128c30f", - "Pr1": "50e4ddde0f3df3dec0cfed545d40f3b23d5c5de54d2404ecbf25d5e45c1212e4eec55454f5", - "Pk2": "de343101a690b48711bf5657e4a211991ea21452dd2bbdd10c512e5e3352acd30a43837faa62c4868caa7644fc9a890dcd8148926e8d224566b639d92140f433", - "Ss": "ee5690b88b71cf58467496b9c05e5db74dce4963bbf10f01f9063e77cbfac8a270950a20f9cac8e005b20c9ece7a98d8ff3c0cb8244989dabf344408a9ca5516", - "status": "valid", - "comment": "" - }, - { - "Id": 76, - "Pk1": "b7f4f345758372206e52a2c19bb0d4efca54e1cc43147554d8cf93a2155ada60c7ef5b9bf9c8649079ceebf8a6255430f455a7808bbc23087b329bf6b158b712", - "Pr1": "10e2cde1dec5d5f5def45eec3d0bcbd4c4c332f43541cd0fc3503bb23b5551dbfb3dcf0f22", - "Pk2": "af47681be3eed32da8f9754caaf6d2326ebed999d8dd7033e83718ae95425868ed4756fbd4fbb6247015e08c91e648ef0cb77924c4461c2dfc88307e7c069b33", - "Ss": "f0100153e1b97f895c29f29d9e6e4e4c37d2028b10656ff3f6fcab3ee03520a09295a43221c4cff870f002654683245ea99a0d795f6ee1c12f46d8fad66d4806", - "status": "valid", - "comment": "" - }, - { - "Id": 77, - "Pk1": "2c9b3a8f038227a20b65128a56913f0512aedac2d0242c6e7c38c53598f08bec9f43438547f83670721bb1dfaff15e2a47626716891544fb050620e5bb50771b", - "Pr1": "1ebd03bbd0045cf0dc51d2fe051c003c1e405d1354b3deb1f1c1d5cf3c00cc54d0b2531d15", - "Pk2": "7ccea6684531f438236383b71346e8da9721ece3955d72c479e647e4665628b7afd85824d75bc9330f74ef0f0cf88b997c0687d32a70bb48d2b29335a9813423", - "Ss": "5ded89816d5f315e02538b8d4d0634284d86a46ad2113c0597bc3d24b5dd765f8b0531049df929a24ee231ccaf5f20cad17a64b18a6a539df751988c9fa17461", - "status": "valid", - "comment": "" - }, - { - "Id": 78, - "Pk1": "93d47558b820186c512e9bb21fff8d56c50dcd831b20b0c095952e73608e56757f5eefcf0c69809a857497ffc71f1d8648207fec9d0cf08da416769e3ba5d836", - "Pr1": "3bc0524eed3dd5c420dc13f0b3bcbfebe2b5fb2ff2305b152c1cc2f243e2fbbcdc445fe02f", - "Pk2": "995ccfe467a167cc7eb7a970b9948228200426bdac1cd2170e5b6088cf0c9d491a82ea2aca0b75332ae04992230320b71ce969b7b898d3b49247af79dba9bc61", - "Ss": "9e41df988b1f9eb24c78af870e280d93a08516fdb8f94141c3ea284b13cc844563e715d9a9fc6b20f2bfc78b1a891ef0ec436aa2f9e12a43417e4479d8ae3939", - "status": "valid", - "comment": "" - }, - { - "Id": 79, - "Pk1": "f97ad1740f6af8a77c849dd994aa2cf9ec34d2333a2744d7d692c8f66ac73d8c324679cd7fe1393d1924e53767ddc818bca11c37132433476befb8f7380bb52b", - "Pr1": "100d131c5f0edc2f5ddb5bbcb21fcc4dd140e5cf40c3d3e5e00cbb4e1fd243b22244f330fe", - "Pk2": "3f977001536321456402fe9ef86de522ec444d8e67126d77b1e4abd87849432d35873a444e5bbc880f38046868797c2dec1e1b4b39973e3c3c3ce5c3a184134a", - "Ss": "614d8a5618dfb8ce0ec85ce452710faf7936a9e6ffaf2be36c53841974fc3776f3ce1a48fb367237ab848235c047c2f0756615fb919a076b0bd83d6dbd356236", - "status": "valid", - "comment": "" - }, - { - "Id": 80, - "Pk1": "5cbf5857afc60fa21d258a65fe696c1a3568539aaeba34b9499e5730455493639789d7a1c32c44eef0b73af67f0ce463d5d17a2b8a4ecf3823a1352bd7862107", - "Pr1": "43ce1dc03e4f451bb405d5ff140de0d2e0cef3c2054fc3c5d3bef1112bc33e11d453251d3d", - "Pk2": "a001bdb19985d31707c00ff90e6de241ef29dc39be73c44e24986c011207198b4d3469e7a6b9dfa54ec383ae703c517a1676f4472556a7215b4b03f5b1fd0a36", - "Ss": "15ad38ca3b3d930e68f84c0f0301e54e35b58d709bf7680d9abbdd5b02186481cb08168a53f3b06cbb54e11496f3727cf992ec42a9ffe90b65da3729ab20ec3b", - "status": "valid", - "comment": "" - }, - { - "Id": 81, - "Pk1": "f4c554c546f4a11bebd3249c637548be7b0a6efa500a5206c012d553ff6c02c1be2658755d519ceb5af0defb38c563f270a56b58f4927d5dd5782e1da640a13c", - "Pr1": "3e2343e1134d55c52fceddec42343eec22cd35fc1fdf23cbbe11cde50f5544105e402252bb", - "Pk2": "81b00297f19df6c5c3869dabff351d632c96b475fbd9bc696e650cc3771954124c4fa43b860c4a9bc49d229cd2c13c6574ebdab649accf92eee26ad4c465fd06", - "Ss": "ab710ebb488508532adcbb5a66ce4e6c69bb9d7560a8bfae45517c67c1b7aff4e905178248308755b0f1700e76239dfd0fce38e256e9f024b98f9118cece0040", - "status": "valid", - "comment": "" - }, - { - "Id": 82, - "Pk1": "fc346c1bc35f2ebd94bc4476a847feb8913290d782697f362bb5de019609894c71c5e18f47e9736f6a5f2f8d0fd911d81a532f772a5b5b6d4f48af542c984850", - "Pr1": "00c55e2fffeed0d3cbd0de4440344f5cf0fd03db1d00f21d34b31d05e1e205e2bdf4014443", - "Pk2": "e67ded61f76e6eda6c74e0649ee7c069ad42e6d786fb0f406fee2b7d36d2eb2f85be49f5daadfedff736d1bfc22eb923bfa397d1b3e4fb37f23b51ec9e24d438", - "Ss": "3d8be867826d18fb350f073d6bf2266cc1b6e816b39779e8799465d8bdfe5982878f2b1e516f158d05ebe637c909118bdf60c452a199f9a29618bdc4ecf18c48", - "status": "valid", - "comment": "" - }, - { - "Id": 83, - "Pk1": "f5b2d12cf715fc380d5d29cfbea2020181bdf0eda10b2b3446d67d79f976214b2ffd38b9514c51c87b180921094b752f50175afe440fedadf2e85816dba2761d", - "Pr1": "d0404fbb41bbfb4bfcd4351c5cefce31fd0402d1334c4bb5cf3dbd030dc2eb3b0f5213ccfb", - "Pk2": "8e02f72c4eebb44af9d91d8a75a7b1475473ddaac04ecb979977790998b8e32fc0a19711ed3ae97e3d45a50172e738441fc2bc4148687ce012d3730538263521", - "Ss": "f5f68419a8f4c32aba8aa12d7472c198571534acb02e6115a7a274a7a1c400a00569e76e8a3aedfc3a35a0b98ef9a63cd62f5c861df4de1708bebf866654df4a", - "status": "valid", - "comment": "" - }, - { - "Id": 84, - "Pk1": "41a76cbe9616525bbbbc1dcc318748799389f8c08e7c0b987d1e055cf6b9f0a69588e0f3ee9967bdb245a21886c02d9299040883147a927af3d0351e20480346", - "Pr1": "5340dcb35cb1b5b5b2015b3542c21b40b4eb0c1d4cb40b24d10dfc2f543f13cdcb154e0eef", - "Pk2": "db63b854d0d5f8046b61024c1dbf1f92a611c1a5a8f585203139052f2e071129a30bc4a3ee0f646a599817e5070d83b36493c4fd72e06a57608f0d8868478c19", - "Ss": "09f916f3970cf229733ce1c4e38a6249173dd5406a8368f5aacec3bc8737831bb95050dc5dcf6e08957f1a852d2ba23fe64b35e9b8574deef4942d89096c7108", - "status": "valid", - "comment": "" - }, - { - "Id": 85, - "Pk1": "311a1964f596f4d873729307e86b7c86e3d837975d92942ccb0a4a642057602d66e1aac1555edc1dcba95a2fbae7720d1489c3d9a620e45656a092080ebd295c", - "Pr1": "e12bee0bf04f3152515250cb352dd2dfc1d50b45c5b41fb3b4042ee3015e5b10f42b5c1fff", - "Pk2": "5179fa7efde7dfddab5be56d268b6a277d43504b4f5783e18d4c7b6d6912b5d4958c7b3e2496adab4bb2596406aa180fed4fcda7b016c139c9b88e4a68ba3846", - "Ss": "cc4c1afd7ed81997a8339d7d9896bda15562aefc1592325d9bba503458355712db078d5aef517c3c514b5ea272c9b9c6c5320777fde39cad07e44d912762035f", - "status": "valid", - "comment": "" - }, - { - "Id": 86, - "Pk1": "6d460a246e43b562bb323a07338f74f8ba5a1f8e75e7b6b24611712dc76fbd07b9a2ff5b1e978c72d8b25e9c7560a60640410827d0fef8cd1f14c895d9e6894d", - "Pr1": "fedf25200df0530310e1bd224c222e25d14f1d11345255524b1f0353504350f22df22f13fb", - "Pk2": "d4a0f3a97a0cac2a8ae8d626fcabc5b97c494d9ee6fbfeb50c6efb08b92dd78cde20a7dbad266d87ffff5e920c8b8f5071de4afcac09371e8dcef9222bf5534f", - "Ss": "0a13e839653d1654628480c80a798c016d795518dc95bb3a1483be2679f1b4b1b6474ad884daa80c85146023eead41d7b122dabd7861e0f2310a8a351e02dd21", - "status": "valid", - "comment": "" - }, - { - "Id": 87, - "Pk1": "031bcbfcbf8bf2442adfd2b5f2151777008dd5af8dc2390909980eab4066c87a3620b9ef2e3a53aec4965e76002a2b0444dcf9ee469aee87c80fdaf9a1399163", - "Pr1": "bdbfeff1f30c20fcd31cc350b25111424ef4f43c2ebbb315cbd54fec4f520ef53eb5ee1e4f", - "Pk2": "3d6f496878bbfe8e40020376d9d2590eea7c366abc0b817beb03caf66561823dfd37ff679b87c2c85f36195cb7b7df3e5d7a41ab8a271b8122c7a8018ecd4b4f", - "Ss": "0df9e416ed1c6f6f98da5575cf851c6453ed4e2dfc17057cd3f0c88a0bcbbb394bace30e26609f25903816f54b6d68844e7c3858ba2522df1caf4b9c64410e4b", - "status": "valid", - "comment": "" - }, - { - "Id": 88, - "Pk1": "ac958d0643d3a23c6555d048a93ccee567ee32e15d3dbf4be2937bcec79858a2cc5aa05b52df697cd5e787ff021d199194c82f2fb27f28dbc87fde22a0ae3209", - "Pr1": "1c2de3c14d1cd2dfb51335d2cc04fcff45f0311520d3ff03032f3b2cffd40c4fced2ee43fd", - "Pk2": "a8abd7c09c8f3b1fd86b44ec26c62b0e81751f4f3bd82bcf965e6d243f603e0c9962cf043a4b38657d4d91287558cfd17debf862d9c4bbf8818147dc990df627", - "Ss": "732361a224f8949ef5338b3a0e6d59982556a1ccc0361ae6368905ed5d20ffe3b266e057c21fae0d5843a432372f6856e5893b832fb85124528dd6864977f620", - "status": "valid", - "comment": "" - }, - { - "Id": 89, - "Pk1": "fa5c113490db118b97c559d364c9ecf57ff667db70644f22b82c0606ce5c8c6c0fc14cd61f55006782feb372c2d7df88cc01ae714a0e497aee49708b8a115a5c", - "Pr1": "31bbffebf4f1c0501c34d2b04edd50df303dc1214e2d4b3b5b5cd2deb2301dcec3b243b340", - "Pk2": "ad0c6d0b82db4e1bc042421b2a12a065e2b18902e9ccd6fc707362b6d755f2763a40bf17959922b7bc5a35e8c422bd8f55b86bb8690e5653d1b15f8e9034f903", - "Ss": "608ab463db2c37215a892ee326c3112958774e0e1cdc583ce0dcd1a1c22711c5f0a18be55ded5fb9c10fcf01422911ef44245056d96f6bb8b959d136e648cf0d", - "status": "valid", - "comment": "" - }, - { - "Id": 90, - "Pk1": "0b564b8ef9f32fe2c5b23aa4e5721adf73fb27b8d1c9d0077f174f296ea3cc117d53a253db1b46b5b21c369dd99e5150d829140c88fb8acd9049f75a9dc8271c", - "Pr1": "4f53b454ed001f3d1d04e1ffd4033b02f2f01b25c031bd3fe2315cfffdbbbeec4121034e01", - "Pk2": "3b8ee85d183038a2f4104efd43d1760afc04ce5a72c7c55d3050b74d553aaaa1713f3c808c8f90bd69d5fa28a764978a88e3f36c4ef2fa3150a2db0c9577fe16", - "Ss": "f7cbc304be604c2114702242795e92a7972fa4550d3f51cf63f3647012f30ae46c8a52c37c93ae84d4cd1fbcf1d914592200b83d11061002d4222db6cadf315e", - "status": "valid", - "comment": "" - }, - { - "Id": 91, - "Pk1": "6f81d423f62960cac0f2774ffbb90f3c39081098a32c3116729bd4b47449dfbbb184eb7d7429fd6b6bba3e70bdafdf1f90982adece88214f0c4556276eb1f24b", - "Pr1": "43fcb2cbddd1dbc3c111e0c34412fe530f5d35cd50333d10442e13fd42b52fd1231c01e12d", - "Pk2": "ceed92fa80fa0328e5e970f4c67139b15b3bdfd7092e8754fc8c18a5c7c8c176e37346c205b1be4b8e283e8b12edc3f090f1e0fd93867314d8b727486c86a70a", - "Ss": "df7fcd3dc36e4de36989be99a9f41b535df636213aa010a4150d8074333437eca21a73e8d63ab6a57e0f1208da39c05e95b4fa059bf7fceb27c24fd11349143c", - "status": "valid", - "comment": "" - }, - { - "Id": 92, - "Pk1": "15d3e5df2a4e45f057757d42606a26be829c32df758eb8ddda5d96b22933e114209dd32dbb2bbda43f2527e233bd1f15ffa39c8f217a1105df44fba6c3e14c59", - "Pr1": "d005f04214f2b212c52be24e10334f334bc4e151dfe251bbc2b5e4d5dfff344d040b00e2fe", - "Pk2": "7aefc174f8f1a9a8ca10e4d567700e1f870792963cd3df0c48794633f485426390f3ad8e4b79785af798e9ee5456cc6ab8943401448600f3e785552e24ffac1b", - "Ss": "5f252be6e66a490b715192fa1f93a4ed8afae764802eab700a86ca7b677b8acaeb332c88693f7124e15a9d8f92fda96147ccb558fa36c8ec1eabdbcef037863b", - "status": "valid", - "comment": "" - }, - { - "Id": 93, - "Pk1": "5c83f7f6bb5349ca78167a6e02f6cc911f78721150455b579b1e02966267bf800be2fed136ba6ff72104ddb2cca8974eafe5442a70c8259a9df27a58c2f33d37", - "Pr1": "3314e5bebfeec0e20b11f3cfc3fe04bb3dcc3dedc2c0b331d3ffd05d3b434fe21b2ec1dfee", - "Pk2": "fda0ead7832810277ed48d014175b53b7f1a49b8e946f39e74bcc4ec20ec9e93a05d8b0b4a89a3b87d6fd869b2bc6ef981958ec6b365f2d0b382bcfa8ea7e620", - "Ss": "16469221559c9f75f9c0548d851c9710ba5e5b155d4c0fbfd5c0c84eeb66167231d88ba6c620139a14622f66e08f51048f75b5ad84a7515c0ec26673ac43713c", - "status": "valid", - "comment": "" - }, - { - "Id": 94, - "Pk1": "c49a795fdcf48657b57e90acaa36bc75d7eb10598d0ddd22ac413cac35338bf76463bfa5684c16c39c6b4acf4c56d5acab62fac491dfae420258fcf4f2505a12", - "Pr1": "ce00b5c25012b5fd3f4d40d11f2415b45ec4dbbefbd4cfe5e52530cb111ef5e4d12b43b5f4", - "Pk2": "dc3200d2882c424ac1f1e316fe6d6f0c056f159fa8bc2f4afefe91d62b934a3450999053132b2182bc17dea4e8313fefac0779cd82fee97f7a70bd90ae42c539", - "Ss": "17280ef2f8fa6fc481ae68b792249cb1e79c3a789c4386b47a8370e533c4ce9d58f2f4002ac7df53be7023e3e3e63322533234086ed849abae70c3c712517821", - "status": "valid", - "comment": "" - }, - { - "Id": 95, - "Pk1": "b6c29789ae149992c947f6251c6be9d2ae6307b10c240b8e1297a810e9f08782b6b4e3e7f84438c577a1aa97af456c179e65d49f18d7f02d9d04fd50566b3921", - "Pr1": "305c3c405ccf1ec3bf3de25f1202e4b34cec454121def41e0ccddb4cc340d212414d433b5c", - "Pk2": "fadd06170cec73ff176fa00cd18a0be7660a1b356c25cad0c4a66b13ecccf73d75377e7eb805cb70a0d6aef4714a9c5f6b7c3f2b376cb5e27a40dfde82ce3d63", - "Ss": "ef822a4c51de57534e03cec6f57102b513a14199716236fea18a5e437ce53025538b254cb269049c5c52ec8ec58490749b9aa4d5dda12a49da2cfec779723553", - "status": "valid", - "comment": "" - }, - { - "Id": 96, - "Pk1": "201966613776f8d963f6ed6499d9bacef5cb7de00ad5a2c64f19fd0c9592c1f69811efb4eca496433a650ade904b5b02e8bce7e25dfea0463d48c43873753b64", - "Pr1": "312bf4012241b12500b150ee3d332fd22f0f0eb13efdcbe1fb1d05f0b53f3000e532fe4501", - "Pk2": "5fd37af2c81be1c5decf2a7b2f8cbe03888cedd5f31c2b690f2b9bc729a58c4e4cdb0866a906bae24f4b25a40aecd77d180a04a0de35fb1e256934ea52b42231", - "Ss": "9603d7daf17ec48e393a0b89e74d509466b9465c421c1c0e8028adaf82171e2063eb089d6beee7c2409b8bec3d667b00f8e17432d3e4c6fb82bcd1d0e71b2b41", - "status": "valid", - "comment": "" - }, - { - "Id": 97, - "Pk1": "52163344fd3d8ec0f85baa0010a070c9d81b2039d3d40aeccf395a5e06dccce44209cd3660f6820405d594643ed304d6fa5ee97515d2edacedfa82feec41ea17", - "Pr1": "bdf2c24f341c4c22252c5e32c3bd00401001fdf41bb40f2ee2ef0b354dd2f25ed20240e00d", - "Pk2": "f10aa3e45df841a335916a5a1539b34032fa00aa68625e8be440f40a66b3f44bcaf55a28861640bbbad2d9eec3d823de20a8b33e2d658d2b17d4dc38db249e64", - "Ss": "fed4521b61885076d021cfb372e3c83fc00d6965cdf93d7ade1407eb4790a781e6fe02d632e75c7834ade691216a7eaa37557ba726de3c2fa201d7ff19db561a", - "status": "valid", - "comment": "" - }, - { - "Id": 98, - "Pk1": "23e850fbc204a053974d58e8bebaf85b05c302a0bc364ff15c6e88a716e56a6181334500f578b9841974119f56ee374ca2f2c92d07a67440355c268520c06d32", - "Pr1": "55f4e1d3f030130134ef103ffd4b42de4d5b0d055c35edeffec4f34bd231bd401dddfbbced", - "Pk2": "61f1ddcd2ab64cc584120a46c0b16dbeac25eafb1a8e8dbd5ab744c1c31ee772f1b7fbc2f9ad24aebdbdf45ff6cce0183a891d86a3de9cabb2d7eda1c6cda542", - "Ss": "34af01472258220344e3e1ddfb15d2d893d01fa6fde20580db295f03b0e226a1cc1e52707e7f59b7c82f03d800ef00f0786436a7a235ad9a8da02dab9ef6713e", - "status": "valid", - "comment": "" - }, - { - "Id": 99, - "Pk1": "702002b04f749d4fd6caa2d0f47bf36fa63793cfe076734b96256f68ffc0334cb0c05c7f70cb44fd36d9ae2d5e954870b1141aa74f6b640a71bbf102df688914", - "Pr1": "c2b515b14e1e5b252cec20df52cb222df1bb5bfb245fffcc4f2e4dcf23dbbd0dbd5e3232bf", - "Pk2": "2968d81c1a5079533cc6df5938d52832221a7360fe91c2197329fa21829051d9b5c6f7646ceef4528eedeb1032d69204b978b311bcdec3eee7690c8581fcdb2b", - "Ss": "94836115219538d31e4ef1ccdac43b5d336d16d12472ace5bc595bc85d8d4a40507c15e76936857718ffd4e191444f62370fe2403b12e6cd84e5e6129b0b003c", - "status": "valid", - "comment": "" - }, - { - "Id": 100, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "87342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 101, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b31f2bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 102, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b334fad16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 103, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bb16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 104, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd15333a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 105, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16097a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 106, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033f155eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 107, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a4bbeec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 108, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a45527c95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 109, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455ee9d5498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 110, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec9cc98d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 111, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec9544dd564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 112, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498b164160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 113, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d572160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 114, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564170167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 115, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564166667a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 116, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d5641601c5a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 117, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d5641601678624273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 118, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a203273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 119, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224143376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 120, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224274576989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 121, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a2242733ee989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 122, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376019912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 123, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376988b12501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 124, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989942501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 125, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a2242733769899124d1d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 126, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a2242733769899125074698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 127, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501de78ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 128, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d697bf5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 129, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698e63960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 130, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5990fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 131, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef596aba495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 132, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960f3195607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 133, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa4f5607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 134, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa4951c7c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 135, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495605c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 136, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c2f0f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 137, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c20707f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 138, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f3e414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 139, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f0a4bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 140, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f41b1fafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 141, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414b07fdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 142, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfa17eae1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 143, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafd0be1aef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 144, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdea4faef8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 145, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae156f8bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 146, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1ae46bea65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 147, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef818a65ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 148, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8befb5ddc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 149, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea681dc6c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 150, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65db06c87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 151, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddceb87cd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 152, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c4acd5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 153, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c879c5177eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 154, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd2677eb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 155, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd519ceb6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 156, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd51778b6008249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 157, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6808249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 158, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb602c249dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 159, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008b99dc8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 160, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb60082455c8363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 161, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dfe363a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 162, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc80c3a", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 163, - "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", - "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", - "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", - "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc83689", - "status": "invalid_shared_secret", - "comment": "" - }, - { - "Id": 164, - "Pk1": "6b4140305685c29d86de30d9b382450d5fd43300b8e6a7edbbfea96847537d210db4d88d9a10680d9d890b89b4c4b6da5fc83f794179d8eb640b9698b3848244", - "Pr1": "24df3f2cc33ddebb31c2454eb35bffbd3ffc4ece54fd5de2f0405102b4c2cbeddf24fb0522", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 165, - "Pk1": "da950e2107e9eb0445b54d5ba532ddf22dd7431789c359fb497a5a4e53dc72dce7ac43e32c1846df88815765e2dded89be782dfb4214dcdd6dc775a679b5454b", - "Pr1": "b502d23cdce41d14bf14edc351441013f234fee3454c04e03004fed2d023b35dde1052f15b", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 166, - "Pk1": "4e4c5e4aa760be57a55f4e2375f061f86dbb5b9245cad99a97c812e9355fd2df0207b6c6da83fbde67af32da7de0fd43d3c37345a01ad8bdb4f19b0223d4102d", - "Pr1": "4d005cb30c51b311c345340ee2ec43f13cb2dbc4b0f0b04c5411eefdfb553ed1d21dcd311d", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 167, - "Pk1": "7c8b1d840fb9a3b29c532e0432de176d44a5daa0a007473001e98aa18315ba1ab503a6952c32487f09efbef1cf0605c307d5e16061e29ff00211278ee5a87059", - "Pr1": "0fb3505e44425cdeffe22dd24fdcecdbef242d2f330b4c4d52cff35d13f04135522b44bcf2", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 168, - "Pk1": "922ccae1e9127340a97fc39a5d4f92f15cd6697fb97ffb416838b44786fc4cbab90c5c7b6c07dc126924e7c4bc3be22bfb809149e7d9f0c8c8219bf4127d0e1e", - "Pr1": "150d3c5fb32e33fe2d003010b44232ce1bc1f20f3d1bed020e0bfe4e13ffff332ce5532b3f", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 169, - "Pk1": "5d81d510d3d731bfc9866affa353f1b5eadba4e0f4233a5a82fee52ca07a9ad6a753cacfd5eb7a7cd7d5c761f8f227693e68d07c8e5d1850422a10fab671c464", - "Pr1": "e2c455f11fd0ec0e5354b0cf5f3c4fbf114c20b4154fdb0c32535e12434401bb25021de0e5", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 170, - "Pk1": "1e2a6205b9779a1b7ed45893aaf995ccb3be92280938a426433e17cdaf4f06b8c8e20e2574f8ac885fa0683a1cd545e21aa33079d6a1631d2b712e1cd5515725", - "Pr1": "210dc4ccdbdd333f0d0e3cf4be3e4b3fdb50fcb0124ed5405b351fdb35ee441d202fd352db", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 171, - "Pk1": "f1f34ddfbe3c59d765b44881a03ad41186730e6ea01ace20f7e1474a6455163e07443ff772659f88a113195e26480ca6ac35e9fd0c6f87056b8830b0342c7a11", - "Pr1": "1251fb4e4d2d0c2ffe124f2eb1e2d3de143bd03141d4d5ce2b52c55d34c014c2b0bbcfd022", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 172, - "Pk1": "52e36742b700181a2d353e34d50f67cda2fa33d17d56abcf7c8d0836e4717fd07e4600030bb38c8c9d9b89b36f95498466644e46c63154ee9ced2e773c323646", - "Pr1": "f40d115eccc23c53444323c32d1ddd54fce344ee4252cd5d2b15eb1323e5223223e1552dbf", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 173, - "Pk1": "c3f56ab8416a010c4ca472b4b33e4f0cde2afe682e7824bd14f375eeec69cd15909dedcac345b52fc68982e51ce8e4e72d1d124c99ebaee468efa846801ed546", - "Pr1": "155420e35f5c233bbfb1c30efdf2ceefb0d1b1dce2d135fc0dc0542eee2c5c440d2cb124de", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 174, - "Pk1": "55c3458eb170d217b2c498cec18a7707afab5f5d6d763ce9f30d12bc66ce8e8ebdfcf6f3771e95bb88f48de1ba3b0d2542f0e77a5418d85967dd53d17b01291c", - "Pr1": "c4035bcd3db0f2133b01005ee3fc001c132124bcb204ddedeef40fbf30bfc25f4ffb22e3f0", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 175, - "Pk1": "bfcca9e622eaecd61d93c6ae7fba009ef1394268455c4738d6e1b4e28b1c1a233c128ce2d7015139b19c09f61f2f98fca1a48b4a4fbef231e3f1e729c4ef115b", - "Pr1": "3ed44404105f05c55eee2cb2d3fd332cddb4bc10ce442b4be4dfdd24d5eed31e144bb03dd3", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 176, - "Pk1": "1dc15056e70bb70eed57a1907e13267ee0c83622780f16bca3d11c91555dc4fa00ea5378e25508a3fc28e8bca38523c70ab5be9240f5962f12b37031b146753d", - "Pr1": "cc05dc5b34ccbb14410f053324ec5ee3c5b4ec3e1cb3e0f3520b3ef3e5c03ef0f2ffdc1f40", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 177, - "Pk1": "174ba5e6af61a9ba6105fba22d8e995ba07e644b98e321cf0673cc18ca5e628df0ce6e87d1e20afff5db66026cf842d91b7d8505bfb44bfe30890f7ac79db91b", - "Pr1": "bb4f20cbee43c30ef3d01b12c3c51f133ef23c2b5cb250b4cedcff34e51e1d02cede1cb250", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 178, - "Pk1": "68c2582da6e08511bd7514651adb3a47c56aa1ed7f42654fa250f3158a7f4b6da1841db24cca8545099a400eab1d9fe9b80ea3b40f7f720e26436d4170d71f14", - "Pr1": "e2df515e4cb323500db2b3f3530110ed104c52efec2c2f0bf54b00c111ed50e31550ff1edb", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 179, - "Pk1": "94b32b8aec3b4665e3abfeb3281af5c85af1fd145fa9ed334bd44ffbcbdbcc8a53aea7e46349970b7cb0cb3122404c87d196cb3516bae1e6e619a7000363c31d", - "Pr1": "dc4b5bdc12402b145df335ffc03420d4eff51b4555c34d1edfc05202f410ed55d21c2ef454", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 180, - "Pk1": "84016481af312e20b9445ed380be6ff948578726f0053958d9db542b1108cb10ba69beda4a52d29e9cb5847e8f19fc5008cb76047694c603e642aacc384af92a", - "Pr1": "cc4b144333513dcb3c2e0135fffb524334efeed0b305d32dc333222ede14ee2e2220332ccd", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 181, - "Pk1": "69732150f1cdd0072a26e5093fd1c363f12005e04857b3a1e98c276a5d428a302047bc4fa428ba8c2c69fd32a7faed387e7b4e5d3df0544a33a3af902697060c", - "Pr1": "edf02d513c535d3ef0edf1f23e05b54e2f42c03f4ccfdccc5cf5b1ff00f3de23e11fcc5511", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 182, - "Pk1": "1731dc1e76b1cd90a062db052ce8197dca418eb273cb2192b444464e3add116f5b7c5a034a91135a325da5a543161d31c5fe67e74538cc5e20e30b56e87ac327", - "Pr1": "0d5c0545144023cf2ee533e01cdce15b02033223beb2e31414eb11deed220030b33551f144", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 183, - "Pk1": "6ca297d3accf634d63a4fb62d66c7e0c7cc88de3a44eee12f42b2102688786229cdae325b83b895ddbe9f354b3522266fb3465bd76ecaf36a98873d3e7efee04", - "Pr1": "2ecee33d243cf1e1e30c1ebf5db41db0cb5534bc302e23f0245ebcbecc3d051c0f5153031f", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 184, - "Pk1": "4be7afbc1ca3aa8a15af1817479b10aa6ebee113b4fd24f1cf8c02d4bc423c5e54dffe8ca710e67eb423295db2ccf03e4aa6055d35e4c8195cb4d64629a4ce38", - "Pr1": "04e1cdd35dfbfb54d5c2405dc2cecf0b152e333cdfb2de2eedcfef553dfceff4254cc252d1", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 185, - "Pk1": "8e9d2d1b27b754e1543311b841d110ee69bf82a75d2640564e9af1fadd8477aecf05732d3e0cbc5dbe570a6c9cd9a9fef98eba3592973bd48e3a1ed31e568927", - "Pr1": "0d0fc3c0efb51dfdff4ef0555f340ec5f4150ec4f3ed21111545dbfe301c25eb23c35c1bc3", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 186, - "Pk1": "f6fef2d5c976b2603a41206241b138b41f202d88aea7200b586832b090f09850c52652415ec247ec981f2918c2eee8e9203ce252d09e24c123321b91b8105507", - "Pr1": "deeb4ed2f4bc133eb200e5fbf5e0e44f03cb4bbc5b4f0ebb4f525ec543d3033ecfcdc3ee0e", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 187, - "Pk1": "56f705568e4cf736cbb0b63874ca334641bfd50874360d6ddad24800f10b4d18322f26f36da0d5c9fc10963c116877651cc0264f1da5561ec8d11fc1781ccf28", - "Pr1": "cedf24bc2d503d2be4413eebd5d0c053435c5bdb20f51f03222cf005ecdf03b25b2b3ce54b", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 188, - "Pk1": "b4169daa990e3b461b8e3607e58de16e3b4c1724cfc3f9adf9c44255bf3c74f269f76b142a551c499c9fe0cca394e4fd1f791ffa1a64fb8df73444baed4d0a4c", - "Pr1": "c541130e4de3bb2544fdbe32f03515e0f514ccb1c54e3525e55323530b41ccc4d41fd23de3", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 189, - "Pk1": "d09bc2a0dfd72247b060bdc43d60f0147ed663eaefee2d95954da51e00021fb07f8a2e0a0b831f1a58f40c3cf8b4cf7e864e2de802b5ff9c1877be8c9fa9175e", - "Pr1": "dd1e3e42cd4f024ec3c000dcb1ec5cee11d3bbcf203232e5b3eb1c14210fee1b41c2dcb411", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 190, - "Pk1": "d7336afc4bff63d9bc2bf1b7e24db7566785376da89e8a6e9870d55b2ef536a9e5a21137a59f6dff08ff847cf6795e5db168162a6762f201fb52f714b80a2465", - "Pr1": "2315dcdd002c341e30f25e3f15235ddf03de4515d3b02be10d44dd512252f2bb0fce3b3db0", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 191, - "Pk1": "d4a120d742e98bc7976a5ca8279591cafed6b8fc60f1f1ec36f5b5059f2fb3ff03287390c0a8c86bc2dcb1858c25b10f489c08209106f53ec522254c772bc310", - "Pr1": "5dc230b353d24bc42e2102d2ceb531f334ccb1e0e511fe21c501d5bfde12523f4c2e34b232", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 192, - "Pk1": "0d73d048fe0a18f8bdff59397c8207eb4802b98566c7e43890f7b268f638288a4cf05327fe919246dffbfaa40710dbb7b328788ef8b201f2e438096754ac0308", - "Pr1": "d54edc550334e125bcd4c3bdff3bcc03e2f1e1c4d20d14ef4c44fd5d405c2df1efdc21dd22", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 193, - "Pk1": "9519b8840b09b2009b486502ac85bd8c8fa08e7ed4b8519a492d00d964a9cef757615a77d656e7f95d073f74679bbc0db9800938c2ffc21f5afa0ad2bae37242", - "Pr1": "1b0cdb40ccee3dedde34ddef3f2f5dbef0035bfc24ffe224dbc354bed2e4c0ddfb5dbcdf3f", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 194, - "Pk1": "63385f78e18861cbf0ff5bf93368959ed00ed0c85361a979a5a3584b1dd09f3522183e30255a56e25b7faf3a535ec088b24ff59dea0c68023222573d9ca6d94b", - "Pr1": "01ffb0d5b255fb2544e55b0053d03ccdb2eb0f511ddb512bd3b0ddc0dc12f352d4fdfd24eb", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 195, - "Pk1": "8373c288030c84cbc17142ed584c50cbc5b9b4a4aad7133e196c379b994caaaf6c21da204aa3c719f18c94af062fc293e2d7e8cbd157ae07ba02a6ed8e365c4b", - "Pr1": "e42d5ecf1f2fe0051ff0c30dc0523d4bf44de41d3cdb3de5b15c0c0e1e3bc440ec4b23dbde", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 196, - "Pk1": "3b7ad70c55a2884fc87174cde23d75142efbf4c528b6defa345ebb23e5575ea8c63a0e5ccd8391bf2ac4b3db8398fb2eaacedf78ff70ae7939115ca2d6485c38", - "Pr1": "f1cfc100b2c0e24b5d4cdec1d5405f04e4fb05cecbe5d41b32b1b541fe00fc4e22030f21d5", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 197, - "Pk1": "2429fd89eda2d24d048b37e0d30aa83e565213d9b1985fc126b211f6aff5ef9533652afa384971bd28757eb2cb62138f157039c498ab7f31b9e4ac51de417357", - "Pr1": "f42d3bbb2f022f41de5bdb14c4002fb2f3044315fe43e11ce3cce0e2b0e21351ccf505011b", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 198, - "Pk1": "8e475f011c702d6c6e5de954d167292d26a8d9fbc1d36d4814183710bcfe7adc26b3055057dd6fd079ee1f872fd4e535cce62aee294b2013dcc6a80ee45c2a40", - "Pr1": "fc5c5effcffdeeeebf5d3dc4d0b0f224f15def0c52d21df02ec13bc5f50be1fbe3ec4c14d4", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 199, - "Pk1": "eecad2a0089148d76a1d6ad82ba3e82012394001e7ffebf866136878e234c5fb2909385ec881811fd6dda0c349747652c2c91e32d6ca627fb3f8e4b965500127", - "Pr1": "1d0c14fd422b1d53501d44becdd43fbf010c224c3e550025bc420f412b4fc0003ecd0fb31e", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 200, - "Pk1": "763870d500bae73eeb0b44c912227920f225b5a54321caac7c42e8993e1b8c1a4a2d1e37532a0a605f11dd00fe548bb2a1be1b9409196c5be192e1dd66afee3e", - "Pr1": "fe0145d520c4b353e110f0bd20edd2b04b00e3bfecf0cee5bdc1302b41d30cbc31e5501d4d", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 201, - "Pk1": "94df8f8e0b129c65774ac25bf55b49240ac0b1340d67d71a5ad238497953072ced4614841d3b52acbfc679e8ce146630e3d087f4e0228745b6fe99fad1761d10", - "Pr1": "532d32f31f103220c53b0b3c0d1c241d33b5e1ce42523d43ef233bf0b3f1b055e022c033b2", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 202, - "Pk1": "7971ee208a233789f323a8d2520b578331615fc107f6aa99faba05f828d47d067ce4ed9604581278cb753eea1785c36cf1040996863b4ee574067ea394de804c", - "Pr1": "5cdbdc55eff115cd1d52efbccc0f2f424c1e221124d0e23f5002fed523e22c0dfb1d3411d0", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 203, - "Pk1": "618848bf97d4dbc619c7923d37fbfa8322fddae6a3b494a45769f12eb9ea30781ea204b6cc62511c0b51dd0bc564c116e193782c11d8d6887fc5738398975a44", - "Pr1": "5dbde334f0fbcb1325f533154bc10fe1ee0232bcbb5520d50320ec2b3502d42334b0d13ebf", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 204, - "Pk1": "70f524a12b2ad0c9d99b6ba146df08e95c6a36fc957e6e5e00af096ad33a0d9c0d1986c2ed40a39d71b84e2e641cbc544c429e9dfd2983f6a1f13d5a99a2c71b", - "Pr1": "ef41de4e3d2c22d5f302ddbdd0c344f44d3cf1353cbb120424cd412ef2d2f44b334c2ced2f", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 205, - "Pk1": "ecc8d5e06c63f6b6de4d4d5fff56e2b150bd6aa426b1242758fce90dd60c0584d518675bab957e91343b9910f3e92b5593a72f9a7cf861e6203672ea0e979a58", - "Pr1": "d14330ce00d44bfd03fc21b12ef12cb25eef5213ffc11de54cfc5b522c103de54203db23ce", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 206, - "Pk1": "206b45e818827582095a057bf8c2621f39f5f215fd4b038330ef1092203c1281e853c2f0a095a6518c2db9ed5620d1f775634dc144a33213f07f263ab0bc5721", - "Pr1": "cb20ce440e3db40122fec2445dc2bb53be131edd1eeeb0e120212f0d51d20f20b2cc4c222c", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 207, - "Pk1": "176d46ebfde017ddc4e28c8a755189ce6ad816f0ad10acc682283ce61bdfbb3895b8fe9cd87781b010101c1bad9e65b0eacf3032a7965e9c9c931b82308a322e", - "Pr1": "e11bc51d43f1b502f2ed54db45205200f10fd33d0f33d541d30030fe3154e03431115cedfc", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 208, - "Pk1": "c67601bfed1e055aeb1b22cc10a6aa26c163040ba3a44725087dfcd414a17bfae61a53e132f6d33c40b13b8a04a5b22068b86eab27d1d30f93fa1e7f4841ea56", - "Pr1": "1f1d2d21f3ecbc2f50d31ce02cc1b5152d145dedb2f45ee45b52f53b51d505b40b4be3febc", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 209, - "Pk1": "c20b442fe2d88fd9cbbbe72ebb924cb416d1e7705b04841028f36d74ca5c663f270de394e3b1a341f5f0b52cf7cd1030ef742a611109f76bf95dc19daedea954", - "Pr1": "30e2c3cef4b315cd514fe22e2122c0f4132def405fdc4f01cd1ce5fecb0c204b2b244fe521", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 210, - "Pk1": "0ad106e043e7a07348cfb02c95d7a78571d6dc6f31af93b93365409e0a15bf3cb6a7acf9c6473ab7940722a9448d4d15e308613ba90ebc46698962aec036fd18", - "Pr1": "c3345ed34deb4414143ff3e1b44d352ef4b13ee31e344f5dbccefb41f2f14dff3044fc2103", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 211, - "Pk1": "6d6587bf59394b649018b5c59fc028aec698014ce02b209a44fad53060726d26cc746dd4f58a578b6b447ad95c78dbebd34798d6e15589c252b89a1ad5aff72f", - "Pr1": "d2542e3cdffcfd2f5f2bf04f1dfd2ee3fcf4eb24fc0b4f1df541fd0f415d0e1f3c4c315f25", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 212, - "Pk1": "a68fcfa011c6b594a472a1b2d040f6f715979f6344c5d558c864e1b26228cd15a5b8de1b3fdd22964d9e2aaa229ae75d8469f49620375e3a5116030ed1530025", - "Pr1": "1ed3ceecdc3f25f13fb412c230c34fedfde2e2bf4512dbf2febf5501f3d04114ccf30d0d33", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 213, - "Pk1": "16f56c592c17d2a571adc137c78d3a317000bb7b736c1384ae88e5d0bb24d28a4070f24e5d6948658252d19231fcf691f730f038283b0e0f33a3092484a05262", - "Pr1": "2c2bb5b43b3ee0f5e2fc4535e05ef53d102d5bd4022e34eec5ccb35cf4eb45b2f4efc31c23", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 214, - "Pk1": "6e6271729b4c86c17848641efad9288f36fdb88edd0322ba05c7f2d5bb68fe8ac70cdd2fa711396f7c365747aadb8aa16d45b5fed058af5ec1e35041d0ed0442", - "Pr1": "c434d0ef530d51b3de02f1dee02f01101c234e0ce25f3b0505b054110f51524deeee32c30e", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 215, - "Pk1": "402631ca32fb662e1271795d230cc56fa4a26cd19ffc20d1ae939ac94be7ceadcdd3f3eb1d7d6f2bd2aff800f5a3254e0b754906ab1898030e92c96b677e143c", - "Pr1": "3bc4e2e550d3d5fc0db4b4cb12bcccd30d10dcb3020c0e505cf20eb435ec2d3414340bdb4b", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 216, - "Pk1": "e0ad2f812ef68f9e147d841c33614850b4ad36266c87f14a4c1f8a0d4f109fae67bb0283b56f5c68ce69f6ec57fcb5ef28d2efe92f3d97cf824260d24c516845", - "Pr1": "cfc5dc343cc5cf2541bbbc004edce30f0bc05333e3cc0dd045cfd5d5bbfbd3043fb2cd55fe", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 217, - "Pk1": "0699cd0ab2578bfa5a5c120163f3f6b207f09c9b2276a437dd5a719fe03032b4b4a216d9147a5ccde1c6886017a87859a3d09da84ac14c98677881092ddb995d", - "Pr1": "e31e4e3fd4d11e2b34455050db4c2242b211e3cd2f13bffff424225403104effbd0f45f15f", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 218, - "Pk1": "dc747fe9030e4ab49b00509a2ca61dbb548f1a5cb5f993ef3d33449e8b81b5fd6d190b6fa27610471f8bb7e2d845be0062dbe725764dc5dd8b256cfb9da81d35", - "Pr1": "45f0c3cd44fd5c4f53c0c5bbe55fefef4530f5cb4cef01edf2200d5202f142e53b1b5b40c2", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 219, - "Pk1": "441eb234333efabf9e2516106a72025ba58a0b5de154861030d99506f2f4231889e4405d2579895db1664f91845d159bd4c56fadcdd813817134bbbc23d8dc15", - "Pr1": "0053fed25350cc134f5ef2100eb2d12420febb2ed0f401c11bd1dd43f05d41e243d3ef3344", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 220, - "Pk1": "4fbde7fc513824217ff9c789f444e8b4996ec74fe28f2534198c47347238e4d6c6a7b72f5c06312c9993569f72e00ab479d689b71e0ec4010266b8b174d64658", - "Pr1": "f04132c1e22f113001be43d11fbdefed3e0b3bd1ddc0c11fdfbc145f3fee20f5efcbec3102", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 221, - "Pk1": "ab01b7d095a6a49d7a2687c3798e14529237863af8740b108d152c184368f441df695770b3af638f24e719768d65feaa40966825d0c3599ba2c51678da14294d", - "Pr1": "f040cdfe30dd2cbffb150c4c224114fd5d04025c4bf4525b521f4425251e20c40541dde11e", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 222, - "Pk1": "ada843e481d9161e852f15f5e98166ee93f05720b9bec5606801739f3acb18bd0191ced099a03ec380a694a1b898d58bab99886ce7bede66137b14944f6f1310", - "Pr1": "41cf2c4f4ee02e20bedb2dcddecdced3113d00f325e041f245e4bd005eec2c5f500ee4f41c", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 223, - "Pk1": "5676614b3a7a07b00a0711d7279751aabcccf95eb3b20cd782d892116397578c907824a4dd7af8e4d92638be8761dd0195003e3d65341a2bc845396eb9540b39", - "Pr1": "cbe230c42312fb24c10feee2b311b511dd35cde53c411bc2fcde305fdf3104ff55e225f022", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 224, - "Pk1": "bcc0e329fda0f912c83a17236cab9eccde09793241aab7ede452a7cb51dd55cffd272dcb9667c86720a8c56cc44c3b6619b63efae2b4675600bfa3e6143ff511", - "Pr1": "b531d41ceeb4b2502112dd05bbfbcb02353c11e4fec2f1c430c1233d5d1352cc53dd0cbf24", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 225, - "Pk1": "58d389b6fa9ae227e45afccac4f7e113d1b00d39d286a6ed2d8f9b69b78a93af73afbaf63590f9f3ecbbd837e3e6d9687ebe7eb9cbf54ca0fc72444fff081f5f", - "Pr1": "05400f55cf334b5b5d352f0fc10fbed0fbddf5cbbd002023c2edc114dbdcf4145225311f21", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 226, - "Pk1": "b1592db43c71a1cc98fc76630ec5867ea306404bd53e89b09edc454ce52c8acaea0b7dfa7e9dad55f8a73fac516a5e5f70ca864d782d57059561195f37e6cd43", - "Pr1": "5ce31b22fbf345ec04bdb42112cbf351254cd4fcd43f221e53f4beffbc05e402515f4234e3", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 227, - "Pk1": "29601c971595b864ecd7f1c135f08ea9cbb9dba4ecd9e0be74258f9d1d4f241d0b85e758184d7b96951926e13e329a047f7d8147c04f97c9d249222af3d58b0b", - "Pr1": "540e31ed5d53e05ed4d1f0be2ec0e15de1d4bc02e1e10e3f2fccc1efdef4305c20c5e12212", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 228, - "Pk1": "633ad935e6a4c0ff4da99ec1d9c7a02d01688c6085cbbcb318f4d2f946f5490f21e116147a119d5c0150b5c63ced28aac143c6321a9e06619eb9750a52c8a614", - "Pr1": "3f1f205521bf2e1b1b0c50f33dcbdccde15db1b3b5d15c3e5b2f5bc553f432ef3540f3b23c", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 229, - "Pk1": "5cab3f391e30f5567226db323fab44610220f594f6050c9ffcc7402f03b56879d6ec293a5e60ba3e7f635ec08d02b2810c0ca7ae89a6accf1a753d2a98273e15", - "Pr1": "c24233d53d0ff054d14d3e2fe32032fbbdc50bebf5534ddc44541ff1bc301db33c0015f4b4", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 230, - "Pk1": "c83d7753fd0458e4f16bda3d18d7c3da09c6742100c066e36063dffdc757fd22b58b543bab71897621566e9bf346566eae5a1753ac2462bf0e5748c0c5931f52", - "Pr1": "0e3cc3ec0dfbef3f00ddce30b4ec0b4303402fd140d00504ff313ef1ec2d00d53c5223b1d3", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 231, - "Pk1": "66f1886f2805b15d26dfe4224681eaf86f4186ca8166a3104897593a71339b10591174602db45856271f353f730f1a83b559d2023f05a7ca0149418003cbeb54", - "Pr1": "05f1c52304cce123b040445ceb0e3e411e314fdc2d5ccf20c2cb3c2dd54bcbf0d2dfb2d5e3", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 232, - "Pk1": "82387e61efccce24c274983dba7b1d2be9ef4a68df4ce8ae3a6f100d255969ad2feac41ac2f487b8c30d6c2cff4f0cee8611f9d650afdeef329351b37d6a4445", - "Pr1": "0fd5e1ccd02f4d0eb302efbec4ebd0ffc5cb3d2cdcc0be43edf502ee15513b214425cc0d11", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 233, - "Pk1": "70f44a40f4e750b2c0081cc2c4cbbbe65ac06c824e3696a54672e9e902100d6bb31f50136cf4f3b805ead14b609a287ce5f9bf0d84bbea94977ee151898d270b", - "Pr1": "fd04efdbdc534c2454b0eceed200eedcb25fbf1e3ef443feb4d035b22bd321e53543044323", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 234, - "Pk1": "9dd38d9ffbf202075f3a15cc125d4484396a7c6be7fcaad381ac7e0d49d0b6265dbc3d61b1c73c356a9c5202cd7187450a330343fc7d31cb68b6a4080d2d323a", - "Pr1": "d0e425110f0dc0c351533c411ccfd1ccb25d1335fddf0f21fc5eb0df25bdfffe2fd2501e55", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 235, - "Pk1": "1317a79f3895f2e751dcc9e7f82fd222c819cad8d69a4a1195b14b8d1b984a31eaf9e85a3999e0f4c95d83b78d0884088e3a7c57bc0c12c7284dff867733704c", - "Pr1": "2120eb5be01fc11053d501011df2f550c15434cd1112f3300bf112b4ccb34f2fe55d402435", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 236, - "Pk1": "563f4f485231613d2138b4e5b11274e74fca45c8fb59307990156a11057482f21936e9822a633625e355d874ef457408a9805712babdf65152cfcb185e02de63", - "Pr1": "fcc5d55133e321eb23bf51cd5ce40d42321505d25bdc2b544b2f13ed2cd0e4b4b554d22d40", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 237, - "Pk1": "53d634c2b327d6e775d3dab7c78f307b08acd5d43b54a27309b855f6e68e4cc01ffb80121885494360863c8190dacee49a33fa88978b928f1118a359c1e7784a", - "Pr1": "15b3c452cc5403f410e3b45fcbb51c0232f420c2cc2c0c3314debbfffe551cd55214eed3f1", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 238, - "Pk1": "8a91af87f7df05924cc8de6f199f457fddd1af148c3f1ff3e65eb05c0b638778f09987989864c6ea3eb49f35e1f5716bad612ed8c0100dae2212105e06a51c52", - "Pr1": "31d21c4e2ce3ef4c5be01c12ceee110302f3c35d5c34445042403bbcdc24c411fc32f422bc", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 239, - "Pk1": "071194cd1414afce5383d46b15c8ef883a66e9db44a764c0cce27ddc816142b6b54ead1c711cd394f09b35155d78744218dbec82433835a0009cbf9eaccc2500", - "Pr1": "01bc2d01dfff43cfc1f3dc2154fdffec2c331fc5d23e04dff3ed414e323defe5c3fd3ccce5", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 240, - "Pk1": "85f420d416cd5a2304128a54ebef1783b07f65255e49f1535bc389d2d6886cdf5fe9d8165c085d10af4a414b2bb029136aeae687369cfbd184e7f17dea4a454d", - "Pr1": "fcbf3f21b0f22cd24113c3d44e0d4b10e52dbb5bbf14bbbb053e3b0eef3b5f0db3553d0452", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 241, - "Pk1": "c8b8477ff0d68a14eba2fd9dfefdea2d1c57da34e606e85ca3b6b0ee7b43320ee3addcd4695ebb2b3d56466f55b3c750e5ef84c872d4439f2a52cabb4c87f72c", - "Pr1": "3235401d021e21f1430233fffff0b43b5e54d01f00153fd41345b3d0c4bb1d2de24e1fec22", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 242, - "Pk1": "3019dd20e54ccbae0b95c0e37f3584850f1045612da31a2f9407a07ca55f6b19a2755e8352e6c03b6bdffdabafdc574b0d5cded4433c40819de0399bce7bba28", - "Pr1": "1f14df3ef20f3d010135523d1545e45c50cee4bc54eb1dd2beb5cdc3301b3fd3dcb1434c23", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 243, - "Pk1": "646828e7380d922a502257dd4b1f7a7402cdad3de7756e8ac566e59204a3b9a778a44a572646e93672fbca8381f7a6a76b860ec27bd64b569e481fdf117e2642", - "Pr1": "e1e2efb3f30be0d51fec05142f04d0fffe3530d3c51bd53c1d5f15ee1140d2fb2f2ffbf2ef", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 244, - "Pk1": "0897f74b03a2faf42e558f0e850ca7c6fe3b165d3a111f529b71daa8d17b3aa43384a9e959e325eca106fc1071fc164197f4c1427e919f9285f777ca91ba5659", - "Pr1": "3133143f3c0eb1cbb241fb4355e54f4bc0beeebcec35f13131333d5eec2ebbe3d0d4f3cffb", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 245, - "Pk1": "ce6750816957729e4f1eabb4072b6715139fe0d3dc6ab124eb1de61759eee52182b8a9487bdea70b82d3b1156fe19c73cbe50aa8c7a531d9bfa129bdcb051565", - "Pr1": "5d1ce2155cd2035502bddc3c4e1ce4f5c34cb05d5d1551cf44240bbc5b144444febfe1ddff", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 246, - "Pk1": "f9e2e52e76f6d67d13cda6599ee01ca80c0bcf46670a87d05a6e0a6ddda2aa7b2023e50f0b0e5bfccb6245183dd9be0c4bdb7f37db51baf7adae5d043a2c3e17", - "Pr1": "240e1b5eb204eed3f0c4405c12043321ef32d25c4cf1b0ebe1d154f2ec1dded140fe0423d4", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 247, - "Pk1": "c4c3dd7de2248a54c13bf297a1e4020fa7517aa2c59a92253552f80cfcbba78c1e948f4d6a50408c96dc21dbbf90ad45bc0182708e0614ed031282de079a913b", - "Pr1": "1bbbce2555c2efb0151d33fdbece401fe0cfce5c5ccb3fff3f10cdf0215c532bd15f5eeb0b", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 248, - "Pk1": "31648615561b37ad85629e1019081d5dfe149823c80ad330dce8752fd03aa2de4821cd2fe23453eaad63f4a6a8dbed104b2b30efe186fb390960087d19e47e2c", - "Pr1": "3ee3ee040b04b25155002e241be21045fd1e510cc3e31c10dd353dcbefdd40c5eef40db0cd", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 249, - "Pk1": "77e6662bf343444b19cde23392c48990a1ab79726dd2f76eeeac8df2977f22f2d08a8ff926a2b55ceacf311dacd842abc0ba9bdc437c6173621939232dea6906", - "Pr1": "ffd40f23d1c3421eb4cf4220c32b04d3efb050c0de04c2355f1ee53d3b4e4b02533c0dd42e", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 250, - "Pk1": "4a5fb5a7fbda148f1da927d836cfe01008e7b8b95eaf3e59640aacd7c8f0480d18a8f285f9abbbee0f4cecc219ef1b9373b389cd957f141e423065d19717462e", - "Pr1": "10dc1cdc5eff5cfcdcccdb52efe3f5fee0e5d35520ce13ecee12c51e40e4434c2d23232fef", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 251, - "Pk1": "94bc372d1194e0ffa6088f5dd02948dba136f706439237f4099c4490000771148321e4876790a3c9388a43749009deb7400d5ea05ee3c2eb2a3ea9a4e03eed0b", - "Pr1": "31314f3c413b45311d2f1fc425d13edfbcc354dcdde03f5541d102ccc2034b5b3febb1d2ef", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 252, - "Pk1": "1c04f8fcb44d3911e4426012294620a6ce9eb0253d376e0884ea2836e049d2ee3d983ec86e0f289d635a0bad62588f577118d7c0ab053f2979ee8bd7c986a548", - "Pr1": "5e3cf004ed512f212cb5eccbb5bc0ddffd3414b4201bd025f14b5b245fffe0d3e515e51ebc", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 253, - "Pk1": "8c4877a6549332ef9692edc77cc1860fb1fe4075fef47bf8f03b122d5bf1254e84f4a21a752a922206410e3e793b9a42524eaf0282a87f80d7024e010f13c627", - "Pr1": "dd21c44b15233f0f5c4f145044b3415f103ed5be4455bf1530d3b53b2f0df435335f0df1bb", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 254, - "Pk1": "1446a7bece7dcb372dd86e9ff4e9917f3ea810bb8e2c23c5fc03f3d21ac8860a9d0e9851f279be31a42f61b071d60c214952806947fbc4a216df12609389b05d", - "Pr1": "f5c522ebdccf52f15c0ddedf1d01c21002ccc4050ce4ce5cfdf12cdd035c015b4b1fff5d40", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 255, - "Pk1": "5b5881eac1d641a1ec6b4510da94bf557857a6e96ad8f7fcf9d07149b57c0539a874db99be7528c28ee86eb5b1e15eda3a9058feaef32ed0cedecb62e700d91b", - "Pr1": "1ec4ce20fe2cbbdee31e1e3131552edebf43232225f3fd2012b324544232ccfde23bcf14dc", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 256, - "Pk1": "8148dd31d3068da8e559d314dac138ee89b89d11e3f9a31f7b27e4e622f23de8fcef64552788bb079f8bafe0bef4e2ff6e513b241a8d4672fbd7a6942497715c", - "Pr1": "d0e0b54523dc0cd330e5ebbe335df12bb1c54d5ec2cc2f0ff2cdd002454c0f0f41d1f03bcf", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 257, - "Pk1": "e5c79857af6ad4601a9f01abc3318f9c603e5704858fa91997634d2589138f739b722c5c2679ec4f205ab467cad98b3576a25a893c1f00a6b2d7b97ab8c8942f", - "Pr1": "4b54f542e54cc2cd4d21c0e140ff55bdb2f5e1ce31254e0435bec45b5230d114ffd1e0f031", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 258, - "Pk1": "12bc7bfc455cc0fc9a8ecea941d586d4cc46fe0bd06fdeb76d812cb153cf32c81bd09535d19fae127fbaa6664451427ce9dcf8a7fedad716a6eaa7887345c33d", - "Pr1": "1e53fd540e4ff140225f40c0f24bb32c5455f1e1f2b00d04120cf51eb202ee43503edcfb14", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 259, - "Pk1": "28340cbbd3a507d03f7edec58812727cf4ff2cfb383f10ffe88c661e692aeb9df3770588c945e39e5082f2f55e2450ec62e4eadd27e79053ff47f5aed7be1743", - "Pr1": "c2f02bbf2ccf022f2bcfd014d4f2cc1fe122bd0fe4b53d20f23cc23c1ddc1310e2ef234ccd", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 260, - "Pk1": "c0342a101a9a88e4f9e2ecb806d1af15194dcafe66859570ba9ee1bca7ab7ce9d452cfce42552b6361e802d2f3b2e4152ee7f8bf9e91707e15608e7e41c72452", - "Pr1": "42202be133e24e501cdc1cf3d321e4d5cbd002f4eb321efbf3014dbdbcfd0cd3e5db00bbc5", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 261, - "Pk1": "7c41bf3992f7af3fc09d86d7e732f9ac2a0eaedcdabba9f99b403c4d45b1891215e7694feda6f14c1ab3dff8513f6943e6d092125f1f0c6e16d0f92657100f07", - "Pr1": "dc0ccd43cb0cf112dd44d10f05d22f2bf4b1cb0c530e03de1bb2c05445d3f1230d010cf2b5", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 262, - "Pk1": "b155a0480443c18bd2b77c9dd2e78c04d6fda40dd82d873b9a86359f6f3ce512e2e599c7f704c1da7cfe187d75058add6d23a18b9e7ab7d67666be7b4de6eb36", - "Pr1": "e5f1cfc3e2221d11cb3c20c0b43f2f5e23db13fffe3014d45e505bcd1c5ec1dd50db102223", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 263, - "Pk1": "ac050b70c6f17f9865b5cf3ccff84e069a1e40537a7f95b243ce970ba768013806d96c278981b6ce923cc3186746ce5e76f56dd09bdae548ebf0c2633cd92316", - "Pr1": "4dd1fdbbfe2c33f2e4ebcc33eb2322bbdcb04bfb10f3f43e2ed414451b3c25e0cfdf2b3b31", - "Pk2": "", - "Ss": "", - "status": "invalid_public_key1", - "comment": "" - }, - { - "Id": 264, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "c87e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 265, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b61a64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 266, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67ea3c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 267, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e6494535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 268, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7085b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 269, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c753643f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 270, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b536c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 271, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6a0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 272, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c3533c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 273, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c06f5c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 274, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633ea2c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 275, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c6537f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 276, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c413e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 277, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3b05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 278, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3eebeec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 279, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e0526c88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 280, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05ee498179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 281, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec8f879d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 282, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec881aad34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 283, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec881799f4cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 284, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d3bcf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 285, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34c1aeac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 286, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf02bc136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 287, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eaf736d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 288, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac1e3d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 289, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac13615c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 290, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d523e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 291, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c059bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 292, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e371cb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 293, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3ba905bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 294, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb8ed509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 295, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bdc09f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 296, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd5f0f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 297, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509fb028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 298, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9898bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 299, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9027af188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 300, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028b7988099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 301, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf181099489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 302, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf1889d9489166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 303, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188091d89166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 304, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf18809949f166b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 305, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf1880994897d6b34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 306, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489165f34e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 307, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166bd5e118f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 308, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34f918f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 309, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e1e8f012f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 310, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118e212f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 311, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f0e7f580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 312, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f0127580562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 313, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f5d6562bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 314, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f5807d2bf2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 315, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f58056d9f2b8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 316, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562b4ab8f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 317, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf248f08701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 318, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8778701ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 319, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08601ef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 320, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f087eeef4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 321, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ad4245769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 322, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef0745769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 323, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4233769dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 324, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245eb9dc460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 325, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef42457659c460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 326, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769da460", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - }, - { - "Id": 327, - "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", - "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", - "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc4d6", - "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", - "status": "invalid_public_key2", - "comment": "" - } - ] -} \ No newline at end of file diff --git a/dh/csidh/utils_test.go b/dh/csidh/utils_test.go deleted file mode 100644 index 08ecee5a..00000000 --- a/dh/csidh/utils_test.go +++ /dev/null @@ -1,132 +0,0 @@ -package csidh - -import ( - "crypto/rand" - "encoding/binary" - "fmt" - "math/big" -) - -var ( - // Number of iterations - numIter = 10 - // Modulus - modulus, _ = new(big.Int).SetString(fp2S(p), 16) - // Zero in fp - zeroFp512 = fp{} - // One in fp - oneFp512 = fp{1, 0, 0, 0, 0, 0, 0, 0} - // file with KAT vectors - katFile = "testdata/csidh_testvectors.json" -) - -// Converts dst to Montgomery if "toMont==true" or from Montgomery domain otherwise. -func toMont(dst *big.Int, toMont bool) { - var bigP, bigR big.Int - - intSetU64(&bigP, p[:]) - bigR.SetUint64(1) - bigR.Lsh(&bigR, 512) - - if !toMont { - bigR.ModInverse(&bigR, &bigP) - } - dst.Mul(dst, &bigR) - dst.Mod(dst, &bigP) -} - -func fp2S(v fp) string { - var str string - for i := 0; i < 8; i++ { - str = fmt.Sprintf("%016x", v[i]) + str - } - return str -} - -// zeroize fp. -func zero(v *fp) { - for i := range *v { - v[i] = 0 - } -} - -// returns random value in a range (0,p). -func randomFp() (u fp) { - _ = binary.Read(rand.Reader, binary.LittleEndian, &u) - return -} - -// return x==y for fp. -func eqFp(l, r *fp) bool { - for idx := range l { - if l[idx] != r[idx] { - return false - } - } - return true -} - -// return x==y for point. -func ceqpoint(l, r *point) bool { - return eqFp(&l.x, &r.x) && eqFp(&l.z, &r.z) -} - -// Converts src to big.Int. Function assumes that src is a slice of uint64 -// values encoded in little-endian byte order. -func intSetU64(dst *big.Int, src []uint64) { - var tmp big.Int - - dst.SetUint64(0) - for i := range src { - tmp.SetUint64(src[i]) - tmp.Lsh(&tmp, uint(i*64)) - dst.Add(dst, &tmp) - } -} - -// Converts src to an array of uint64 values encoded in little-endian -// byte order. -func intGetU64(src *big.Int) []uint64 { - var tmp, mod big.Int - dst := make([]uint64, (src.BitLen()/64)+1) - - u64 := uint64(0) - u64-- - mod.SetUint64(u64) - for i := 0; i < (src.BitLen()/64)+1; i++ { - tmp.Set(src) - tmp.Rsh(&tmp, uint(i)*64) - tmp.And(&tmp, &mod) - dst[i] = tmp.Uint64() - } - return dst -} - -// Returns projective coordinate X of normalized EC 'point' (point.x / point.z). -func toNormX(point *point) big.Int { - var bigP, bigDnt, bigDor big.Int - - intSetU64(&bigP, p[:]) - intSetU64(&bigDnt, point.x[:]) - intSetU64(&bigDor, point.z[:]) - - bigDor.ModInverse(&bigDor, &bigP) - bigDnt.Mul(&bigDnt, &bigDor) - bigDnt.Mod(&bigDnt, &bigP) - return bigDnt -} - -// Converts string to fp element in Montgomery domain of cSIDH-512. -func toFp(num string) fp { - var tmp big.Int - var ok bool - var ret fp - - _, ok = tmp.SetString(num, 0) - if !ok { - panic("Can't parse a number") - } - toMont(&tmp, true) - copy(ret[:], intGetU64(&tmp)) - return ret -} diff --git a/dh/curve4q/curve4Q.go b/dh/curve4q/curve4Q.go deleted file mode 100644 index d082d2cc..00000000 --- a/dh/curve4q/curve4Q.go +++ /dev/null @@ -1,29 +0,0 @@ -package curve4q - -import "github.com/quantumcoinproject/circl/ecc/fourq" - -// Size is the size in bytes of keys. -const Size = 32 - -// Key represents a public or private key of FourQ. -type Key [Size]byte - -// KeyGen calculates a public key k from a secret key. -func KeyGen(public, secret *Key) { - var P fourq.Point - P.ScalarBaseMult((*[Size]byte)(secret)) - P.Marshal((*[Size]byte)(public)) -} - -// Shared calculates a shared key k from Alice's secret and Bob's public key. -// Returns true on success. -func Shared(shared, secret, public *Key) bool { - var P, Q fourq.Point - ok := P.Unmarshal((*[Size]byte)(public)) - if !ok { - return false - } - Q.ScalarMult((*[Size]byte)(secret), &P) - Q.Marshal((*[Size]byte)(shared)) - return !Q.IsIdentity() && Q.IsOnCurve() -} diff --git a/dh/curve4q/curve4Q_test.go b/dh/curve4q/curve4Q_test.go deleted file mode 100644 index 57897bfe..00000000 --- a/dh/curve4q/curve4Q_test.go +++ /dev/null @@ -1,133 +0,0 @@ -package curve4q - -import ( - "bytes" - "crypto/rand" - "fmt" - "io" - "testing" - - "github.com/quantumcoinproject/circl/ecc/fourq" - "github.com/quantumcoinproject/circl/internal/test" -) - -func TestDH(t *testing.T) { - var secretAlice, publicAlice, sharedAlice Key - var secretBob, publicBob, sharedBob Key - testTimes := 1 << 10 - - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(secretAlice[:]) - _, _ = rand.Read(secretBob[:]) - - KeyGen(&publicAlice, &secretAlice) - KeyGen(&publicBob, &secretBob) - - if ok := Shared(&sharedAlice, &secretAlice, &publicBob); !ok { - test.ReportError(t, ok, true, secretAlice, publicBob) - } - if ok := Shared(&sharedBob, &secretBob, &publicAlice); !ok { - test.ReportError(t, ok, true, secretBob, publicAlice) - } - - got := sharedAlice - want := sharedBob - if !bytes.Equal(got[:], want[:]) { - test.ReportError(t, got, want, secretAlice, secretBob) - } - } -} - -func TestDHLowOrder(t *testing.T) { - var secretAlice, validPublicAlice, invalidPublicAlice, sharedAlice Key - var secretBob, publicBob, sharedBob Key - - t.Run("zeroPoint", func(t *testing.T) { - testTimes := 1 << 10 - - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(secretAlice[:]) - _, _ = rand.Read(secretBob[:]) - - KeyGen(&validPublicAlice, &secretAlice) - KeyGen(&publicBob, &secretBob) - - zeroPoint := fourq.Point{} - zeroPoint.SetIdentity() - zeroPoint.Marshal((*[Size]byte)(&invalidPublicAlice)) - - ok := Shared(&sharedAlice, &secretAlice, &publicBob) - test.CheckOk(ok, "shared must not fail", t) - - ok = Shared(&sharedBob, &secretBob, &validPublicAlice) - test.CheckOk(ok, "shared must not fail", t) - - invalid := Shared(&sharedBob, &secretBob, &invalidPublicAlice) - test.CheckOk(!invalid, "shared must fail", t) - } - }) - - t.Run("lowOrderPoint", func(t *testing.T) { - KeyGen(&validPublicAlice, &secretAlice) - KeyGen(&publicBob, &secretBob) - - // Point of order 56 - lowOrderPoint := fourq.Point{ - X: fourq.Fq{ - fourq.Fp{0xc0, 0xe5, 0x21, 0x04, 0xaa, 0xe1, 0x93, 0xd8, 0x9b, 0x50, 0x42, 0x54, 0xd6, 0x46, 0x86, 0x74}, - fourq.Fp{0x21, 0x25, 0x4d, 0x9a, 0xda, 0x8f, 0xad, 0x28, 0xa2, 0x3d, 0xfd, 0x02, 0x13, 0xea, 0xd2, 0x56}, - }, - Y: fourq.Fq{ - fourq.Fp{0xaf, 0x71, 0xe4, 0x3b, 0x22, 0x21, 0x41, 0xef, 0x12, 0xba, 0x67, 0x02, 0x57, 0x1, 0xe5, 0x58}, - fourq.Fp{0x0e, 0x1a, 0xf5, 0xe5, 0xb8, 0x24, 0x9c, 0xe0, 0xed, 0xc3, 0xc4, 0x69, 0x7, 0x32, 0x8e, 0x2c}, - }, - } - - ok := lowOrderPoint.IsOnCurve() - test.CheckOk(ok, "point is on curve", t) - - lowOrderPoint.Marshal((*[Size]byte)(&invalidPublicAlice)) - invalid := Shared(&sharedBob, &secretBob, &invalidPublicAlice) - test.CheckOk(!invalid, "shared must fail", t) - }) -} - -func BenchmarkDH(b *testing.B) { - var secret, public, shared Key - _, _ = rand.Read(secret[:]) - _, _ = rand.Read(public[:]) - - b.Run("keygen", func(b *testing.B) { - for i := 0; i < b.N; i++ { - KeyGen(&public, &secret) - } - }) - b.Run("shared", func(b *testing.B) { - for i := 0; i < b.N; i++ { - Shared(&shared, &secret, &public) - } - }) -} - -func ExampleKey() { - var AliceSecret, BobSecret, - AlicePublic, BobPublic, - AliceShared, BobShared Key - - // Generating Alice's secret and public keys - _, _ = io.ReadFull(rand.Reader, AliceSecret[:]) - KeyGen(&AlicePublic, &AliceSecret) - - // Generating Bob's secret and public keys - _, _ = io.ReadFull(rand.Reader, BobSecret[:]) - KeyGen(&BobPublic, &BobSecret) - - // Deriving Alice's shared key - Shared(&AliceShared, &AliceSecret, &BobPublic) - - // Deriving Bob's shared key - Shared(&BobShared, &BobSecret, &AlicePublic) - - fmt.Println(AliceShared == BobShared) - // Output: true -} diff --git a/dh/curve4q/doc.go b/dh/curve4q/doc.go deleted file mode 100644 index 5549571e..00000000 --- a/dh/curve4q/doc.go +++ /dev/null @@ -1,7 +0,0 @@ -// Package curve4q implements Diffie-Hellman operations using the FourQ curve -// at the 128-bit security level. -// -// References: -// - https://eprint.iacr.org/2015/565 -// - https://tools.ietf.org/html/draft-ladd-cfrg-4q-01 -package curve4q diff --git a/dh/sidh/doc.go b/dh/sidh/doc.go deleted file mode 100644 index 69d91067..00000000 --- a/dh/sidh/doc.go +++ /dev/null @@ -1,43 +0,0 @@ -// Package sidh is deprecated, it provides SIDH and SIKE key encapsulation -// mechanisms. -// -// # DEPRECATION NOTICE -// -// SIDH and SIKE are deprecated as were shown vulnerable to a key recovery -// attack by Castryck-Decru's paper (https://eprint.iacr.org/2022/975). New -// systems should not rely on this package. This package is frozen. -// -// # SIDH and SIKE -// -// This package provides implementation of experimental post-quantum -// Supersingular Isogeny Diffie-Hellman (SIDH) as well as Supersingular -// Isogeny Key Encapsulation (SIKE). -// -// It comes with implementations of three different field arithmetic -// implementations sidh.Fp434, sidh.Fp503, and sidh.Fp751. -// -// | Algorithm | Public Key Size | Shared Secret Size | Ciphertext Size | -// |-----------|-----------------|--------------------|-----------------| -// | SIDH/p434 | 330 | 110 | N/A | -// | SIDH/p503 | 378 | 126 | N/A | -// | SIDH/p751 | 564 | 188 | N/A | -// | SIKE/p434 | 330 | 16 | 346 | -// | SIKE/p503 | 378 | 24 | 402 | -// | SIKE/p751 | 564 | 32 | 596 | -// -// In order to instantiate SIKE/p751 KEM one needs to create a KEM object -// and allocate internal structures. This can be done with NewSike751 helper. -// After that, the kem variable can be used multiple times. -// -// var kem = sike.NewSike751(rand.Reader) -// kem.Encapsulate(ciphertext, sharedSecret, publicBob) -// kem.Decapsulate(sharedSecret, privateBob, publicBob, ciphertext) -// -// Code is optimized for AMD64 and aarch64. Generic implementation -// is provided for other architectures. -// -// References: -// -// - [SIDH] https://eprint.iacr.org/2011/506 -// - [SIKE] http://www.sike.org/files/SIDH-spec.pdf -package sidh diff --git a/dh/sidh/internal/common/doc.go b/dh/sidh/internal/common/doc.go deleted file mode 100644 index f606f420..00000000 --- a/dh/sidh/internal/common/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package common provides types, variables, constants and functions commonly used in SIDH or SIKE. -package common diff --git a/dh/sidh/internal/common/params.go b/dh/sidh/internal/common/params.go deleted file mode 100644 index fe06a41c..00000000 --- a/dh/sidh/internal/common/params.go +++ /dev/null @@ -1,24 +0,0 @@ -package common - -import "fmt" - -// Keeps mapping: SIDH prime field ID to domain parameters -var sidhParams = make(map[uint8]SidhParams) - -// Params returns domain parameters corresponding to finite field and identified by -// `id` provided by the caller. Function panics in case `id` wasn't registered earlier. -func Params(id uint8) *SidhParams { - if val, ok := sidhParams[id]; ok { - return &val - } - panic("sidh: SIDH Params ID unregistered") -} - -// Registers SIDH parameters for particular field. -func Register(id uint8, p *SidhParams) { - if _, ok := sidhParams[id]; ok { - msg := fmt.Sprintf("sidh: Field with id %d already registered", id) - panic(msg) - } - sidhParams[id] = *p -} diff --git a/dh/sidh/internal/common/types.go b/dh/sidh/internal/common/types.go deleted file mode 100644 index dc549969..00000000 --- a/dh/sidh/internal/common/types.go +++ /dev/null @@ -1,106 +0,0 @@ -package common - -const ( - // corresponds to words in P751 - FpMaxWords = 12 - // corresponds to byte size of P751 SIDH private key for B - MaxSidhPrivateKeyBsz = 48 - // corresponds to byte size of P751 SIKE private key for B - MaxSikePrivateKeyBsz = MaxSidhPrivateKeyBsz + MaxMsgBsz - // corresponds to SIKE max length of 'n' (see 1.4 of SIKE spec in NIST PQC round 1) - MaxMsgBsz = 40 - // corresponds to byte size of shared secret generated by SIKEp751 - MaxSharedSecretBsz = 188 - // corresponds to by size of the P751 public key - MaxPublicKeySz = 3 * FpMaxWords * 64 - // corresponds to by size of the ciphertext produced by SIKE/P751 - MaxCiphertextBsz = MaxMsgBsz + MaxPublicKeySz -) - -// Id's correspond to bitlength of the prime field characteristic -// Currently Fp751 is the only one supported by this implementation -const ( - Fp503 uint8 = iota - Fp751 - Fp434 -) - -// Representation of an element of the base field F_p. -// -// No particular meaning is assigned to the representation -- it could represent -// an element in Montgomery form, or not. Tracking the meaning of the field -// element is left to higher types. -type Fp [FpMaxWords]uint64 - -// Represents an intermediate product of two elements of the base field F_p. -type FpX2 [2 * FpMaxWords]uint64 - -// Represents an element of the extended field Fp^2 = Fp(x+i) -type Fp2 struct { - A Fp - B Fp -} - -type DomainParams struct { - // P, Q and R=P-Q base points - AffineP, AffineQ, AffineR Fp2 - // Size of a computation strategy for x-torsion group - IsogenyStrategy []uint32 - // Max size of secret key for x-torsion group - SecretBitLen uint - // Max size of secret key for x-torsion group - SecretByteLen uint -} - -type SidhParams struct { - ID uint8 - // Bytelen of P - Bytelen int - // The public key size, in bytes. - PublicKeySize int - // The shared secret size, in bytes. - SharedSecretSize int - // 2- and 3-torsion group parameter definitions - A, B DomainParams - // Precomputed identity element in the Fp2 in Montgomery domain - OneFp2 Fp2 - // Precomputed 1/2 in the Fp2 in Montgomery domain - HalfFp2 Fp2 - // Length of SIKE secret message. Must be one of {24,32,40}, - // depending on size of prime field used (see [SIKE], 1.4 and 5.1) - MsgLen int - // Length of SIKE ephemeral KEM key (see [SIKE], 1.4 and 5.1) - KemSize int - // Byte size of ciphertext that KEM produces - CiphertextSize int - // Defines A,C constant for starting curve Cy^2 = x^3 + Ax^2 + x - InitCurve ProjectiveCurveParameters -} - -// Stores curve projective parameters equivalent to A/C. Meaning of the -// values depends on the context. When working with isogenies over -// subgroup that are powers of: -// * three then (A:C) ~ (A+2C:A-2C) -// * four then (A:C) ~ (A+2C: 4C) -// See Appendix A of SIKE for more details -type CurveCoefficientsEquiv struct { - A Fp2 - C Fp2 -} - -// A point on the projective line P^1(F_{p^2}). -// -// This represents a point on the Kummer line of a Montgomery curve. The -// curve is specified by a ProjectiveCurveParameters struct. -type ProjectivePoint struct { - X Fp2 - Z Fp2 -} - -// A point on the projective line P^1(F_{p^2}). -// -// This is used to work projectively with the curve coefficients. -type ProjectiveCurveParameters struct { - A Fp2 - C Fp2 -} diff --git a/dh/sidh/internal/common/utils.go b/dh/sidh/internal/common/utils.go deleted file mode 100644 index c225228d..00000000 --- a/dh/sidh/internal/common/utils.go +++ /dev/null @@ -1,50 +0,0 @@ -package common - -import "encoding/binary" - -// Constant time select. -// if pick == 1 (out = in1) -// if pick == 0 (out = in2) -// else out is undefined. -func Cpick(pick int, out, in1, in2 []byte) { - which := byte((int8(pick << 7)) >> 7) - for i := range out { - out[i] = (in1[i] & which) | (in2[i] & ^which) - } -} - -// Read 2*bytelen(p) bytes into the given ExtensionFieldElement. -// -// It is an error to call this function if the input byte slice is less than 2*bytelen(p) bytes long. -func BytesToFp2(fp2 *Fp2, input []byte, bytelen int) { - if len(input) < 2*bytelen { - panic("input byte slice too short") - } - numW64 := (bytelen*8 + 63) / 64 - a := make([]byte, 8*numW64) - b := make([]byte, 8*numW64) - copy(a[:bytelen], input[:bytelen]) - copy(b[:bytelen], input[bytelen:]) - for i := 0; i < numW64; i++ { - fp2.A[i] = binary.LittleEndian.Uint64(a[i*8 : (i+1)*8]) - fp2.B[i] = binary.LittleEndian.Uint64(b[i*8 : (i+1)*8]) - } -} - -// Convert the input to wire format. -// -// The output byte slice must be at least 2*bytelen(p) bytes long. -func Fp2ToBytes(output []byte, fp2 *Fp2, bytelen int) { - if len(output) < 2*bytelen { - panic("output byte slice too short") - } - numW64 := (bytelen*8 + 63) / 64 - a := make([]byte, 8*numW64) - b := make([]byte, 8*numW64) - for i := 0; i < numW64; i++ { - binary.LittleEndian.PutUint64(a[i*8:(i+1)*8], fp2.A[i]) - binary.LittleEndian.PutUint64(b[i*8:(i+1)*8], fp2.B[i]) - } - copy(output[:bytelen], a[:bytelen]) - copy(output[bytelen:], b[:bytelen]) -} diff --git a/dh/sidh/internal/p434/arith_amd64.s b/dh/sidh/internal/p434/arith_amd64.s deleted file mode 100644 index a84728a4..00000000 --- a/dh/sidh/internal/p434/arith_amd64.s +++ /dev/null @@ -1,1345 +0,0 @@ -// +build amd64,!purego - -#include "textflag.h" - -// p434 -#define P434_0 $0xFFFFFFFFFFFFFFFF -#define P434_3 $0xFDC1767AE2FFFFFF -#define P434_4 $0x7BC65C783158AEA3 -#define P434_5 $0x6CFC5FD681C52056 -#define P434_6 $0x0002341F27177344 - -// p434 x 2 -#define P434X2_0 $0xFFFFFFFFFFFFFFFE -#define P434X2_1 $0xFFFFFFFFFFFFFFFF -#define P434X2_3 $0xFB82ECF5C5FFFFFF -#define P434X2_4 $0xF78CB8F062B15D47 -#define P434X2_5 $0xD9F8BFAD038A40AC -#define P434X2_6 $0x0004683E4E2EE688 - -// Redefine P434p1Zeros -#define P434_P1_ZEROS 3 - -// Performs schoolbook multiplication of 128-bit with 256-bit -// number. Uses MULX, ADOX, ADCX instruction. -// -// Uses registers: DX,AX -// Calculates: -// (I0,I1) x [M1][0,1,2,3] = (T0,T1,T2,T3,T4,T5) -// |-128-| x |--- 256 ---| = |------ 384 ------| -// Assuming the first digit multiplication was already performed. -#define MULX128x256(I1, M1, T1, T2, T3, T4, T5) \ - MOVQ M1+ 8(SB), AX \ - MULXQ AX, T4, T2 \ - XORQ AX, AX \ - MOVQ M1+16(SB), AX \ - MULXQ AX, T5, T3 \ - ADOXQ T4, T1 \ // T1: interm1 - ADOXQ T5, T2 \ // T2: interm2 - MOVQ M1+24(SB), AX \ - MULXQ AX, T5, T4 \ - ADOXQ T5, T3 \ // T3: interm3 - MOVL $0, AX \ - ADOXQ AX, T4 \ // T4: interm4 - \ - XORQ AX, AX \ - MOVQ I1, DX \ - MOVQ M1+ 0(SB), AX \ - MULXQ AX, T5, I1 \ // T0 <- C0 - ADCXQ T5, T1 \ - ADCXQ I1, T2 \ // T1 <- C1 - MOVQ M1+ 8(SB), AX \ - MULXQ AX, I1, T5 \ - ADCXQ T5, T3 \ - ADOXQ I1, T2 \ // T2 <- C2 - MOVQ M1+16(SB), AX \ - MULXQ AX, I1, T5 \ - ADCXQ T5, T4 \ - ADOXQ I1, T3 \ // T3 <- C3 - MOVQ M1+24(SB), AX \ - MULXQ AX, I1, T5 \ - MOVL $0, AX \ - ADCXQ AX, T5 \ - ADOXQ I1, T4 \ // T4 <- C4 - ADOXQ AX, T5 // T5 <- C5 - -// Performs schoolbook multiplication of 64-bit with 256-bit -// number. Uses MULX and ADOX instructions. -// -// Uses registers: DX,AX -// Calculates: -// (I0) x [M1][0,1,2,3] = (T0,T1,T2,T3,T4) -// |64| x |--- 256 ---| = |----- 320 ----| -// Assuming the first digit multiplication was already performed. -#define MULX64x256(M1, T1, T2, T3, T4, T5) \ - MOVQ M1+ 8(SB), AX \ - MULXQ AX, T4, T2 \ - XORQ AX, AX \ - MOVQ M1+16(SB), AX \ - MULXQ AX, T5, T3 \ - ADOXQ T4, T1 \ // T1 <- C1 - ADOXQ T5, T2 \ // T2 <- C2 - MOVQ M1+24(SB), AX \ - MULXQ AX, T5, T4 \ - ADOXQ T5, T3 \ // T3 <- C3 - MOVL $0, AX \ - ADOXQ AX, T4 // T4 <- C4 - -// Performs schoolbook multiplication of two 192-bit numbers -// number. Uses MULX and ADOX instructions. -// -// Uses registers: DX,AX -#define MULX192(IM0,M0,IM1,M1,ID,MDST,T0,T1,T2,T3,T4,T5,T6) \ - MOVQ (0+IM0)(M0), DX \ - MULXQ (0+IM1)(M1), T1, T0 \ // T0:T1 = A0*B0 - MOVQ T1,(ID+0)(MDST) \ // MDST0 - MULXQ (IM1+ 8)(M1), T2, T1 \ // T1:T2 = A0*B1 - XORQ AX, AX \ - ADOXQ T2, T0 \ - MULXQ (IM1+16)(M1),T3, T2 \ // T2:T3 = A0*B2 - ADOXQ T3, T1 \ - \ - MOVQ (IM0+8)(M0), DX \ - MULXQ (IM1+0)(M1), T4, T3 \ // T3:T4 = A1*B0 - ADOXQ AX, T2 \ - XORQ AX, AX \ - \ - MULXQ (IM1+8)(M1), T6, T5 \ // T6:T7 = A1*B1 - ADOXQ T0, T4 \ - MOVQ T4,(ID+8)(MDST) \ // MDST1 - ADCXQ T6, T3 \ - \ - MULXQ (IM1+16)(M1),T0, T6 \ // T6:T0 = A1*B2 - ADOXQ T1, T3 \ - ADCXQ T0, T5 \ - ADCXQ AX, T6 \ - ADOXQ T2, T5 \ - \ - MOVQ (IM0+16)(M0),DX \ - MULXQ (IM1+ 0)(M1), T0, T1 \ // T1:T0 = A2*B0 - ADOXQ AX, T6 \ - XORQ AX, AX \ - \ - MULXQ (IM1+ 8)(M1), T2, T4 \ // T4:T2 = A2*B1 - ADOXQ T3, T0 \ - MOVQ T0, (ID+16)(MDST) \ // MDST2 - ADCXQ T5, T1 \ - \ - MULXQ (IM1+16)(M1),T3, T0 \ // T0:T3 = A2*B2 - ADCXQ T6, T4 \ - ADCXQ AX, T0 \ - ADOXQ T2, T1 \ - ADOXQ T4, T3 \ - ADOXQ T0, AX - -// Performs schoolbook multiplication of 2 256-bit numbers. Uses -// MULX instruction. Result is stored in 256 bits pointed by $DST. -// -// Uses registers: DX,AX -#define MULX256(IM0,M0,IM1,M1,ID,MDST,T0,T1,T2,T3,T4,T5,T6,T7,T8,T9) \ - MOVQ (IM0+0)(M0), DX \ - MULXQ (IM1+0)(M1), T1, T0 \ // A0*B[0-3] - MOVQ T1, (ID+0)(MDST) \ - MULXQ (IM1+8)(M1), T2, T1 \ - XORQ AX, AX \ - ADOXQ T2, T0 \ - MULXQ (IM1+16)(M1),T3, T2 \ - ADOXQ T3, T1 \ - MULXQ (IM1+24)(M1),T4, T3 \ - ADOXQ T4, T2 \ - \ - MOVQ (IM0+8)(M0), DX \ - MULXQ (IM1+0)(M1), T4, T5 \ // A1*B[0-3] - ADOXQ AX, T3 \ - XORQ AX, AX \ - MULXQ (IM1+8)(M1), T7, T6 \ - ADOXQ T0, T4 \ - MOVQ T4, (ID+8)(MDST) \ - ADCXQ T7, T5 \ - MULXQ (IM1+16)(M1),T8, T7 \ - ADCXQ T8, T6 \ - ADOXQ T1, T5 \ - MULXQ (IM1+24)(M1),T9, T8 \ - ADCXQ T9, T7 \ - ADCXQ AX, T8 \ - ADOXQ T2, T6 \ - \ - MOVQ (IM0+16)(M0),DX \ // A2*B[0-3] - MULXQ (IM1+ 0)(M1), T0, T1 \ - ADOXQ T3, T7 \ - ADOXQ AX, T8 \ - XORQ AX, AX \ - MULXQ (IM1+8)(M1), T3, T2 \ - ADOXQ T5, T0 \ - MOVQ T0, (ID+16)(MDST) \ - ADCXQ T3, T1 \ - MULXQ (IM1+16)(M1),T4, T3 \ - ADCXQ T4, T2 \ - ADOXQ T6, T1 \ - MULXQ (IM1+24)(M1),T9, T4 \ - ADCXQ T9, T3 \ - MOVQ (IM0+24)(M0),DX \ - ADCXQ AX, T4 \ - \ - ADOXQ T7, T2 \ - ADOXQ T8, T3 \ - ADOXQ AX, T4 \ - \ - MULXQ (IM1+ 0)(M1), T0, T5\ // A3*B[0-3] - XORQ AX, AX \ - MULXQ (IM1+ 8)(M1), T7, T6\ - ADCXQ T7, T5 \ - ADOXQ T0, T1 \ - MULXQ (IM1+16)(M1), T8, T7 \ - ADCXQ T8, T6 \ - ADOXQ T5, T2 \ - MULXQ (IM1+24)(M1), T9, T8 \ - ADCXQ T9, T7 \ - ADCXQ AX, T8 \ - ADOXQ T6, T3 \ - ADOXQ T7, T4 \ - ADOXQ AX, T8 \ - MOVQ T1, (ID+24)(MDST) \ - MOVQ T2, (ID+32)(MDST) \ - MOVQ T3, (ID+40)(MDST) \ - MOVQ T4, (ID+48)(MDST) \ - MOVQ T8, (ID+56)(MDST) - -// Performs schoolbook multiplication of 64-bit with 256-bit -// number. -// -// Uses registers: DX, AX -#define MUL64x256(IDX,M0,M1,C0,C1,C2,C3,C4,T0) \ - MOVQ (IDX)(M0), T0 \ - \ - XORQ C2, C2 \ - MOVQ M1+0(SB), AX \ - MULQ T0 \ - MOVQ AX, C0 \ - MOVQ DX, C1 \ - \ - XORQ C3, C3 \ - MOVQ M1+8(SB), AX \ - MULQ T0 \ - ADDQ AX, C1 \ - ADCQ DX, C2 \ - \ - XORQ C4, C4 \ - MOVQ M1+16(SB), AX \ - MULQ T0 \ - ADDQ AX, C2 \ - ADCQ DX, C3 \ - \ - MOVQ M1+24(SB), AX \ - MULQ T0 \ - ADDQ AX, C3 \ - ADCQ DX, C4 - -// Performs schoolbook multiplication of 128-bit with 256-bit -// number. Destroys RAX and RDX -// -// Uses registers: DX, AX -#define MUL128x256(IDX,M0,M1,C0,C1,C2,C3,C4,C5,T0,T1) \ - \ // A0 x B0 - MOVQ (IDX+0)(M0), T0 \ - MOVQ M1+0(SB), AX \ - MULQ T0 \ - XORQ C2, C2 \ - MOVQ AX, C0 \ - MOVQ DX, C1 \ - \ // A0 x B1 - MOVQ M1+8(SB), AX \ - MULQ T0 \ - XORQ C3, C3 \ - ADDQ AX, C1 \ - ADCQ DX, C2 \ - \ // A1 x B0 - MOVQ (IDX+8)(M0), T1 \ - MOVQ M1+0(SB), AX \ - MULQ T1 \ - ADDQ AX, C1 \ - ADCQ DX, C2 \ - ADCQ $0, C3 \ - \ // A0 x B2 - XORQ C4, C4 \ - MOVQ M1+16(SB), AX \ - MULQ T0 \ - ADDQ AX, C2 \ - ADCQ DX, C3 \ - ADCQ $0, C4 \ - \ // A1 x B1 - MOVQ M1+8(SB), AX \ - MULQ T1 \ - ADDQ AX, C2 \ - ADCQ DX, C3 \ - ADCQ $0, C4 \ - \ // A0 x B3 - MOVQ M1+24(SB), AX \ - MULQ T0 \ - XORQ C5, C5 \ - ADDQ AX, C3 \ - ADCQ DX, C4 \ - ADCQ $0, C5 \ - \ // A1 x B2 - MOVQ M1+16(SB), AX \ - MULQ T1 \ - ADDQ AX, C3 \ - ADCQ DX, C4 \ - ADCQ $0, C5 \ - \ // A1 x B3 - MOVQ M1+24(SB), AX \ - MULQ T1 \ - ADDQ AX, C4 \ - ADCQ DX, C5 - -// Montgomery reduction -// Based on method described in Faz-Hernandez et al. https://eprint.iacr.org/2017/1015 -#define REDC_MULX(P1, MUL01, MUL23, MUL45, MUL67) \ - MOVQ 0x0(DI), DX \ - MOVQ 0x8(DI), R14 \ - MOVQ P1, AX \ - MULXQ AX, R8, R9 \ - MUL01 \ - MOVQ 0x10(DI), DX \ - MOVQ 0x48(DI), CX \ - ADDQ 0x18(DI), R8 \ - ADCQ 0x20(DI), R9 \ - ADCQ 0x28(DI), R10 \ - ADCQ 0x30(DI), R11 \ - ADCQ 0x38(DI), R12 \ - ADCQ 0x40(DI), R13 \ - ADCQ $0, CX \ - MOVQ P1, AX \ - MULXQ AX, BX, BP \ - MOVQ R9, 0x0(SI) \ - MOVQ R10, 0x8(SI) \ - MOVQ R11, 0x10(SI) \ - MOVQ R12, 0x18(SI) \ - MOVQ R13, 0x20(SI) \ - MOVQ CX, 0x28(SI) \ - MOVQ 0x50(DI), R9 \ - MOVQ 0x58(DI), R10 \ - MOVQ 0x60(DI), R11 \ - MOVQ 0x68(DI), DI \ - ADCQ $0, R9 \ - ADCQ $0, R10 \ - ADCQ $0, R11 \ - ADCQ $0, DI \ - MUL23 \ - MOVQ 0x0(SI), DX \ - ADDQ 0x08(SI), BX \ - ADCQ 0x10(SI), BP \ - ADCQ 0x18(SI), R12 \ - ADCQ 0x20(SI), R13 \ - ADCQ 0x28(SI), R14 \ - MOVQ R14, 0x18(SI) \ - MOVQ CX, R14 \ - MOVQ $0, CX \ - ADCQ R9, R14 \ - ADCQ R10, CX \ - MOVQ P1, AX \ - MULXQ AX, R8, R9 \ - MOVQ BP, 0x0(SI) \ - MOVQ R12, 0x8(SI) \ - MOVQ R13, 0x10(SI) \ - ADCQ $0, R11 \ - ADCQ $0, DI \ - MUL45 \ - MOVQ 0x0(SI), DX \ - ADDQ 0x8(SI), R8 \ - ADCQ 0x10(SI), R9 \ - ADCQ 0x18(SI), R10 \ - ADCQ R14, BP \ - ADCQ CX, R12 \ - ADCQ R11, R13 \ - ADCQ $0, DI \ - MOVQ P1, AX \ - MULXQ AX, R14, BX \ - MOVQ R8, 0x0(SI) \ - MOVQ R9, 0x8(SI) \ - MUL67 \ - ADDQ R10, R14 \ - ADCQ BP, BX \ - ADCQ R12, R8 \ - ADCQ R13, R9 \ - ADCQ DI, R11 \ - MOVQ R14, 0x10(SI) \ - MOVQ BX, 0x18(SI) \ - MOVQ R8, 0x20(SI) \ - MOVQ R9, 0x28(SI) \ - MOVQ R11, 0x30(SI) - -#define REDC_MULQ(MUL01, MUL23, MUL45, MUL67) \ - MUL01 \ - XORQ CX, CX \ - ADDQ 0x18(DI), R8 \ - ADCQ 0x20(DI), R9 \ - ADCQ 0x28(DI), R10 \ - ADCQ 0x30(DI), R11 \ - ADCQ 0x38(DI), R12 \ - ADCQ 0x40(DI), R13 \ - ADCQ 0x48(DI), CX \ - MOVQ R8, 0x18(DI) \ - MOVQ R9, 0x20(DI) \ - MOVQ R10, 0x28(DI) \ - MOVQ R11, 0x30(DI) \ - MOVQ R12, 0x38(DI) \ - MOVQ R13, 0x40(DI) \ - MOVQ CX, 0x48(DI) \ - MOVQ 0x50(DI), R8 \ - MOVQ 0x58(DI), R9 \ - MOVQ 0x60(DI), R10 \ - MOVQ 0x68(DI), R11 \ - ADCQ $0, R8 \ - ADCQ $0, R9 \ - ADCQ $0, R10 \ - ADCQ $0, R11 \ - MOVQ R8, 0x50(DI) \ - MOVQ R9, 0x58(DI) \ - MOVQ R10, 0x60(DI) \ - MOVQ R11, 0x68(DI) \ - \ - MUL23 \ - XORQ CX, CX \ - ADDQ 0x28(DI), R8 \ - ADCQ 0x30(DI), R9 \ - ADCQ 0x38(DI), R10 \ - ADCQ 0x40(DI), R11 \ - ADCQ 0x48(DI), R12 \ - ADCQ 0x50(DI), R13 \ - ADCQ 0x58(DI), CX \ - MOVQ R8, 0x28(DI) \ - MOVQ R9, 0x30(DI) \ - MOVQ R10, 0x38(DI) \ - MOVQ R11, 0x40(DI) \ - MOVQ R12, 0x48(DI) \ - MOVQ R13, 0x50(DI) \ - MOVQ CX, 0x58(DI) \ - MOVQ 0x60(DI), R8 \ - MOVQ 0x68(DI), R9 \ - ADCQ $0, R8 \ - ADCQ $0, R9 \ - MOVQ R8, 0x60(DI) \ - MOVQ R9, 0x68(DI) \ - \ - MUL45 \ - XORQ CX, CX \ - ADDQ 0x38(DI), R8 \ - ADCQ 0x40(DI), R9 \ - ADCQ 0x48(DI), R10 \ - ADCQ 0x50(DI), R11 \ - ADCQ 0x58(DI), R12 \ - ADCQ 0x60(DI), R13 \ - ADCQ 0x68(DI), CX \ - MOVQ R8, 0x0(SI) \ // OUT0 - MOVQ R9, 0x8(SI) \ // OUT1 - MOVQ R10, 0x48(DI) \ - MOVQ R11, 0x50(DI) \ - MOVQ R12, 0x58(DI) \ - MOVQ R13, 0x60(DI) \ - MOVQ CX, 0x68(DI) \ - \ - MUL67 \ - ADDQ 0x48(DI), R8 \ - ADCQ 0x50(DI), R9 \ - ADCQ 0x58(DI), R10 \ - ADCQ 0x60(DI), R11 \ - ADCQ 0x68(DI), R12 \ - MOVQ R8, 0x10(SI) \ // OUT2 - MOVQ R9, 0x18(SI) \ // OUT3 - MOVQ R10, 0x20(SI) \ // OUT4 - MOVQ R11, 0x28(SI) \ // OUT5 - MOVQ R12, 0x30(SI) // OUT6 - -TEXT ·cswapP434(SB),NOSPLIT,$0-17 - - MOVQ x+0(FP), DI - MOVQ y+8(FP), SI - MOVB choice+16(FP), AL // AL = 0 or 1 - MOVBLZX AL, AX // AX = 0 or 1 - NEGQ AX // AX = 0x00..00 or 0xff..ff -#ifndef CSWAP_BLOCK -#define CSWAP_BLOCK(idx) \ - MOVQ (idx*8)(DI), BX \ // BX = x[idx] - MOVQ (idx*8)(SI), CX \ // CX = y[idx] - MOVQ CX, DX \ // DX = y[idx] - XORQ BX, DX \ // DX = y[idx] ^ x[idx] - ANDQ AX, DX \ // DX = (y[idx] ^ x[idx]) & mask - XORQ DX, BX \ // BX = (y[idx] ^ x[idx]) & mask) ^ x[idx] = x[idx] or y[idx] - XORQ DX, CX \ // CX = (y[idx] ^ x[idx]) & mask) ^ y[idx] = y[idx] or x[idx] - MOVQ BX, (idx*8)(DI) \ - MOVQ CX, (idx*8)(SI) -#endif - CSWAP_BLOCK(0) - CSWAP_BLOCK(1) - CSWAP_BLOCK(2) - CSWAP_BLOCK(3) - CSWAP_BLOCK(4) - CSWAP_BLOCK(5) - CSWAP_BLOCK(6) -#ifdef CSWAP_BLOCK -#undef CSWAP_BLOCK -#endif - RET - -TEXT ·cmovP434(SB),NOSPLIT,$0-17 - - MOVQ x+0(FP), DI - MOVQ y+8(FP), SI - MOVB choice+16(FP), AL // AL = 0 or 1 - MOVBLZX AL, AX // AX = 0 or 1 - NEGQ AX // AX = 0x00..00 or 0xff..ff -#ifndef CMOV_BLOCK -#define CMOV_BLOCK(idx) \ - MOVQ (idx*8)(DI), BX \ // BX = x[idx] - MOVQ (idx*8)(SI), DX \ // DX = y[idx] - XORQ BX, DX \ // DX = y[idx] ^ x[idx] - ANDQ AX, DX \ // DX = (y[idx] ^ x[idx]) & mask - XORQ DX, BX \ // BX = (y[idx] ^ x[idx]) & mask) ^ x[idx] = x[idx] or y[idx] - MOVQ BX, (idx*8)(DI) -#endif - CMOV_BLOCK(0) - CMOV_BLOCK(1) - CMOV_BLOCK(2) - CMOV_BLOCK(3) - CMOV_BLOCK(4) - CMOV_BLOCK(5) - CMOV_BLOCK(6) -#ifdef CMOV_BLOCK -#undef CMOV_BLOCK -#endif - RET - -TEXT ·addP434(SB),NOSPLIT,$0-24 - MOVQ z+0(FP), DX - MOVQ x+8(FP), DI - MOVQ y+16(FP), SI - - // Used later to calculate a mask - XORQ CX, CX - - // [R8-R14]: z = x + y - MOVQ ( 0)(DI), R8; ADDQ ( 0)(SI), R8 - MOVQ ( 8)(DI), R9; ADCQ ( 8)(SI), R9 - MOVQ (16)(DI), R10; ADCQ (16)(SI), R10 - MOVQ (24)(DI), R11; ADCQ (24)(SI), R11 - MOVQ (32)(DI), R12; ADCQ (32)(SI), R12 - MOVQ (40)(DI), R13; ADCQ (40)(SI), R13 - MOVQ (48)(DI), R14; ADCQ (48)(SI), R14 - - XORQ DI, DI - - MOVQ P434X2_0, AX; SUBQ AX, R8 - MOVQ P434X2_1, AX; SBBQ AX, R9 - SBBQ AX, R10 - MOVQ P434X2_3, AX; SBBQ AX, R11 - MOVQ P434X2_4, AX; SBBQ AX, R12 - MOVQ P434X2_5, AX; SBBQ AX, R13 - MOVQ P434X2_6, AX; SBBQ AX, R14 - - // mask - SBBQ $0, CX - - // if z<0 add P434x2 back - MOVQ P434X2_0, R15; ANDQ CX, R15; - MOVQ P434X2_1, AX; ANDQ CX, AX; - - ADDQ R8, R15; MOVQ R15, ( 0)(DX) - ADCQ AX, R9; MOVQ R9, ( 8)(DX) - ADCQ AX, R10; MOVQ R10, (16)(DX) - - ADCQ $0, DI - MOVQ P434X2_3, R15; ANDQ CX, R15; - MOVQ P434X2_4, R8; ANDQ CX, R8; - MOVQ P434X2_5, R9; ANDQ CX, R9; - MOVQ P434X2_6, R10; ANDQ CX, R10; - BTQ $0, DI - - ADCQ R11, R15; MOVQ R15, (24)(DX) - ADCQ R12, R8; MOVQ R8, (32)(DX) - ADCQ R13, R9; MOVQ R9, (40)(DX) - ADCQ R14, R10; MOVQ R10, (48)(DX) - - RET - -TEXT ·adlP434(SB),NOSPLIT,$0-24 - MOVQ z+0(FP), DX - MOVQ x+8(FP), DI - MOVQ y+16(FP),SI - - MOVQ ( 0)(DI), R8 - ADDQ ( 0)(SI), R8 - MOVQ ( 8)(DI), R9 - ADCQ ( 8)(SI), R9 - MOVQ (16)(DI), R10 - ADCQ (16)(SI), R10 - MOVQ (24)(DI), R11 - ADCQ (24)(SI), R11 - MOVQ (32)(DI), R12 - ADCQ (32)(SI), R12 - MOVQ (40)(DI), R13 - ADCQ (40)(SI), R13 - MOVQ (48)(DI), R14 - ADCQ (48)(SI), R14 - MOVQ (56)(DI), R15 - ADCQ (56)(SI), R15 - MOVQ (64)(DI), AX - ADCQ (64)(SI), AX - MOVQ (72)(DI), BX - ADCQ (72)(SI), BX - MOVQ (80)(DI), CX - ADCQ (80)(SI), CX - - MOVQ R8, ( 0)(DX) - MOVQ R9, ( 8)(DX) - MOVQ R10,(16)(DX) - MOVQ R11,(24)(DX) - MOVQ R12,(32)(DX) - MOVQ R13,(40)(DX) - MOVQ R14,(48)(DX) - MOVQ R15,(56)(DX) - MOVQ AX, (64)(DX) - MOVQ BX, (72)(DX) - MOVQ CX, (80)(DX) - - MOVQ (88)(DI), R8 - ADCQ (88)(SI), R8 - MOVQ (96)(DI), R9 - ADCQ (96)(SI), R9 - MOVQ (104)(DI), R10 - ADCQ (104)(SI), R10 - - MOVQ R8, (88)(DX) - MOVQ R9, (96)(DX) - MOVQ R10,(104)(DX) - RET - -TEXT ·subP434(SB),NOSPLIT,$0-24 - MOVQ z+0(FP), DX - MOVQ x+8(FP), DI - MOVQ y+16(FP), SI - - // Used later to calculate a mask - XORQ CX, CX - - MOVQ ( 0)(DI), R8; SUBQ ( 0)(SI), R8 - MOVQ ( 8)(DI), R9; SBBQ ( 8)(SI), R9 - MOVQ (16)(DI), R10; SBBQ (16)(SI), R10 - MOVQ (24)(DI), R11; SBBQ (24)(SI), R11 - MOVQ (32)(DI), R12; SBBQ (32)(SI), R12 - MOVQ (40)(DI), R13; SBBQ (40)(SI), R13 - MOVQ (48)(DI), R14; SBBQ (48)(SI), R14 - - // mask - SBBQ $0, CX - XORQ R15, R15 - - // if z<0 add p434x2 back - MOVQ P434X2_0, DI; ANDQ CX, DI - MOVQ P434X2_1, SI; ANDQ CX, SI - MOVQ P434X2_3, AX; ANDQ CX, AX - - ADDQ DI, R8; MOVQ R8, ( 0)(DX) - ADCQ SI, R9; MOVQ R9, ( 8)(DX) - ADCQ SI, R10; MOVQ R10, (16)(DX) - ADCQ AX, R11; MOVQ R11, (24)(DX) - ADCQ $0, R15 - - MOVQ P434X2_4, R8; ANDQ CX, R8; - MOVQ P434X2_5, R9; ANDQ CX, R9; - MOVQ P434X2_6, R10; ANDQ CX, R10 - - BTQ $0, R15 - - ADCQ R8, R12; MOVQ R12, (32)(DX) - ADCQ R9, R13; MOVQ R13, (40)(DX) - ADCQ R10, R14; MOVQ R14, (48)(DX) - RET - -TEXT ·sulP434(SB),NOSPLIT,$0-24 - MOVQ z+0(FP), DX - MOVQ x+8(FP), DI - MOVQ y+16(FP), SI - - // Used later to store result of 0-borrow - XORQ CX, CX - - // SUBC for first 10 limbs - MOVQ ( 0)(DI), R8; SUBQ ( 0)(SI), R8 - MOVQ ( 8)(DI), R9; SBBQ ( 8)(SI), R9 - MOVQ (16)(DI), R10; SBBQ (16)(SI), R10 - MOVQ (24)(DI), R11; SBBQ (24)(SI), R11 - MOVQ (32)(DI), R12; SBBQ (32)(SI), R12 - MOVQ (40)(DI), R13; SBBQ (40)(SI), R13 - MOVQ (48)(DI), R14; SBBQ (48)(SI), R14 - MOVQ (56)(DI), R15; SBBQ (56)(SI), R15 - MOVQ (64)(DI), AX; SBBQ (64)(SI), AX - MOVQ (72)(DI), BX; SBBQ (72)(SI), BX - - MOVQ R8, ( 0)(DX) - MOVQ R9, ( 8)(DX) - MOVQ R10, (16)(DX) - MOVQ R11, (24)(DX) - MOVQ R12, (32)(DX) - MOVQ R13, (40)(DX) - MOVQ R14, (48)(DX) - MOVQ R15, (56)(DX) - MOVQ AX, (64)(DX) - MOVQ BX, (72)(DX) - - // SUBC for last 4 limbs - MOVQ ( 80)(DI), R8; SBBQ ( 80)(SI), R8 - MOVQ ( 88)(DI), R9; SBBQ ( 88)(SI), R9 - MOVQ ( 96)(DI), R10; SBBQ ( 96)(SI), R10 - MOVQ (104)(DI), R11; SBBQ (104)(SI), R11 - - // Store carry flag - SBBQ $0, CX - - MOVQ R8, ( 80)(DX) - MOVQ R9, ( 88)(DX) - MOVQ R10, ( 96)(DX) - MOVQ R11, (104)(DX) - - // Load p into registers: - MOVQ P434_0, R8; ANDQ CX, R8 - // P434_{1,2} = P434_0, so reuse R8 - MOVQ P434_3, R9; ANDQ CX, R9 - MOVQ P434_4, R10; ANDQ CX, R10 - MOVQ P434_5, R11; ANDQ CX, R11 - MOVQ P434_6, R12; ANDQ CX, R12 - - MOVQ (56 )(DX), AX; ADDQ R8, AX; MOVQ AX, (56 )(DX) - MOVQ (56+ 8)(DX), AX; ADCQ R8, AX; MOVQ AX, (56+ 8)(DX) - MOVQ (56+16)(DX), AX; ADCQ R8, AX; MOVQ AX, (56+16)(DX) - MOVQ (56+24)(DX), AX; ADCQ R9, AX; MOVQ AX, (56+24)(DX) - MOVQ (56+32)(DX), AX; ADCQ R10, AX; MOVQ AX, (56+32)(DX) - MOVQ (56+40)(DX), AX; ADCQ R11, AX; MOVQ AX, (56+40)(DX) - MOVQ (56+48)(DX), AX; ADCQ R12, AX; MOVQ AX, (56+48)(DX) - - RET - -TEXT ·modP434(SB),NOSPLIT,$0-8 - MOVQ x+0(FP), DI - - // Zero AX for later use: - XORQ AX, AX - - // Set x <- x - p - MOVQ P434_0, R8 - SUBQ R8, ( 0)(DI) - // P434_{1,2} = P434_0, so reuse R8 - MOVQ P434_3, R9 - SBBQ R8, ( 8)(DI) - SBBQ R8, (16)(DI) - MOVQ P434_4, R10 - SBBQ R9, (24)(DI) - MOVQ P434_5, R11 - SBBQ R10, (32)(DI) - MOVQ P434_6, R12 - SBBQ R11, (40)(DI) - SBBQ R12, (48)(DI) - - // save carry - SBBQ $0, AX - - // Conditionally add p to x if x-p < 0 - ANDQ AX, R8 - ANDQ AX, R9 - ANDQ AX, R10 - ANDQ AX, R11 - ANDQ AX, R12 - - ADDQ R8, ( 0)(DI) - ADCQ R8, ( 8)(DI) - ADCQ R8, (16)(DI) - ADCQ R9, (24)(DI) - ADCQ R10,(32)(DI) - ADCQ R11,(40)(DI) - ADCQ R12,(48)(DI) - RET - -// 434-bit multiplication using Karatsuba (one level), -// schoolbook (one level). -TEXT ·mulP434(SB),NOSPLIT,$112-24 - MOVQ z+0(FP), CX - MOVQ x+8(FP), DI - MOVQ y+16(FP), SI - - // Check whether to use optimized implementation - CMPB ·HasADXandBMI2(SB), $1 - JE mul_with_mulx_adcx_adox - - // rcx[0-3] <- AH+AL - XORQ AX, AX - MOVQ 0x20(DI), R8 - MOVQ 0x28(DI), R9 - MOVQ 0x30(DI), R10 - XORQ R11, R11 - ADDQ 0x0(DI), R8 - ADCQ 0x8(DI), R9 - ADCQ 0x10(DI), R10 - ADCQ 0x18(DI), R11 - // store AH+AL mask - SBBQ $0, AX - MOVQ AX, 0x40(SP) - // store AH+AL in 0-0x18(rcx) - MOVQ R8, 0x0(CX) - MOVQ R9, 0x8(CX) - MOVQ R10, 0x10(CX) - MOVQ R11, 0x18(CX) - - // r12-r15 <- BH+BL - XORQ DX, DX - MOVQ 0x20(SI), R12 - MOVQ 0x28(SI), R13 - MOVQ 0x30(SI), R14 - XORQ R15, R15 - ADDQ 0x0(SI), R12 - ADCQ 0x8(SI), R13 - ADCQ 0x10(SI), R14 - ADCQ 0x18(SI), R15 - SBBQ $0, DX - - // store BH+BL mask - MOVQ DX, 0x48(SP) - - // (rsp[0-0x38]) <- (AH+AL)*(BH+BL) - MOVQ (CX), AX - MULQ R12 - MOVQ AX, (SP) - MOVQ DX, R8 - - XORQ R9, R9 - MOVQ (CX), AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - - XORQ R10, R10 - MOVQ 0x8(CX), AX - MULQ R12 - ADDQ AX, R8 - MOVQ R8, 0x8(SP) - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ (CX), AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ 0x10(CX), AX - MULQ R12 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ 0x8(CX), AX - MULQ R13 - ADDQ AX, R9 - MOVQ R9, 0x10(SP) - ADCQ DX, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ (CX),AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ 0x18(CX), AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ 0x8(CX), AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ 0x10(CX), AX - MULQ R13 - ADDQ AX, R10 - MOVQ R10, 0x18(SP) - ADCQ DX, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ 0x8(CX), AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ 0x18(CX), AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ 0x10(CX), AX - MULQ R14 - ADDQ AX, R8 - MOVQ R8, 0x20(SP) - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R11, R11 - MOVQ 0x10(CX), AX - MULQ R15 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R11 - - MOVQ 0x18(CX), AX - MULQ R14 - ADDQ AX, R9 - MOVQ R9, 0x28(SP) - ADCQ DX, R10 - ADCQ $0, R11 - - MOVQ 0x18(CX), AX - MULQ R15 - ADDQ AX, R10 - MOVQ R10, 0x30(SP) - ADCQ DX, R11 - MOVQ R11,0x38(SP) - - // r12-r15 <- masked (BH + BL) - MOVQ 0x40(SP), AX - ANDQ AX, R12 - ANDQ AX, R13 - ANDQ AX, R14 - ANDQ AX, R15 - - // r8-r11 <- masked (AH + AL) - MOVQ 0x48(SP), AX - MOVQ 0x00(CX), R8 - ANDQ AX, R8 - MOVQ 0x08(CX), R9 - ANDQ AX, R9 - MOVQ 0x10(CX), R10 - ANDQ AX, R10 - MOVQ 0x18(CX), R11 - ANDQ AX, R11 - - // r12-r15 <- masked (AH + AL) + masked (BH + BL) - ADDQ R8, R12 - ADCQ R9, R13 - ADCQ R10, R14 - ADCQ R11, R15 - - // rsp[0x20-0x38] <- (AH+AL) x (BH+BL) high - MOVQ 0x20(SP), AX - ADDQ AX, R12 - MOVQ 0x28(SP), AX - ADCQ AX, R13 - MOVQ 0x30(SP), AX - ADCQ AX, R14 - MOVQ 0x38(SP), AX - ADCQ AX, R15 - MOVQ R12, 0x50(SP) - MOVQ R13, 0x58(SP) - MOVQ R14, 0x60(SP) - MOVQ R15, 0x68(SP) - - // [rcx] <- CL = AL x BL - MOVQ (DI), R11 - MOVQ (SI), AX - MULQ R11 - XORQ R9, R9 - MOVQ AX, (CX) - MOVQ DX, R8 - - MOVQ 0x10(DI), R14 - MOVQ 0x8(SI), AX - MULQ R11 - XORQ R10, R10 - ADDQ AX, R8 - ADCQ DX, R9 - - MOVQ 0x8(DI), R12 - MOVQ (SI), AX - MULQ R12 - ADDQ AX, R8 - MOVQ R8, 0x8(CX) - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ 0x10(SI), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (SI), R13 - MOVQ R14, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ 0x8(SI), AX - MULQ R12 - ADDQ AX, R9 - MOVQ R9, 0x10(CX) - ADCQ DX, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ 0x18(SI), AX - MULQ R11 - MOVQ 0x18(DI), R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ R15, AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ 0x10(SI), AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ 0x8(SI), AX - MULQ R14 - ADDQ AX, R10 - MOVQ R10, 0x18(CX) - ADCQ DX, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ 0x18(SI), AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ 0x8(SI), AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ 0x10(SI), AX - MULQ R14 - ADDQ AX, R8 - MOVQ R8, 0x20(CX) - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ 0x18(SI), AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ 0x10(SI), AX - MULQ R15 - ADDQ AX, R9 - MOVQ R9, 0x28(CX) - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ 0x18(SI), AX - MULQ R15 - ADDQ AX, R10 - MOVQ R10, 0x30(CX) - ADCQ DX, R8 - MOVQ R8, 0x38(CX) - - // rcx[0x40-0x68] <- AH*BH - // multiplies 2 192-bit numbers A,B - MOVQ 0x20(DI), R11 - MOVQ 0x20(SI), AX - MULQ R11 - XORQ R9, R9 - MOVQ AX, 0x40(CX) - MOVQ DX, R8 - - MOVQ 0x30(DI), R14 - MOVQ 0x28(SI), AX - MULQ R11 - XORQ R10, R10 - ADDQ AX, R8 - ADCQ DX, R9 - - MOVQ 0x28(DI), R12 - MOVQ 0x20(SI), AX - MULQ R12 - ADDQ AX, R8 - MOVQ R8, 0x48(CX) - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ 0x30(SI), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ 0x20(SI), R13 - MOVQ R14, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ 0x28(SI), AX - MULQ R12 - ADDQ AX, R9 - MOVQ R9, 0x50(CX) - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ 0x30(SI), AX - MULQ R12 - XORQ R12, R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R12 - - MOVQ 0x28(SI), AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R12 - MOVQ R10, 0x58(CX) - - MOVQ 0x30(SI), AX - MULQ R14 - ADDQ AX, R8 - ADCQ $0, R12 - MOVQ R8, 0x60(CX) - - ADDQ R12, DX - - // [r8-r15] <- (AH+AL)x(BH+BL) - ALxBL - MOVQ 0x0(SP), R8 - SUBQ 0x0(CX), R8 - MOVQ 0x8(SP), R9 - SBBQ 0x8(CX), R9 - MOVQ 0x10(SP), R10 - SBBQ 0x10(CX), R10 - MOVQ 0x18(SP), R11 - SBBQ 0x18(CX), R11 - MOVQ 0x50(SP), R12 - SBBQ 0x20(CX), R12 - MOVQ 0x58(SP), R13 - SBBQ 0x28(CX), R13 - MOVQ 0x60(SP), R14 - SBBQ 0x30(CX), R14 - MOVQ 0x68(SP), R15 - SBBQ 0x38(CX), R15 - - // [r8-r15] <- (AH+AL) x (BH+BL) - ALxBL - AHxBH - MOVQ 0x40(CX), AX - SUBQ AX, R8 - MOVQ 0x48(CX), AX - SBBQ AX, R9 - MOVQ 0x50(CX), AX - SBBQ AX, R10 - MOVQ 0x58(CX), AX - SBBQ AX, R11 - MOVQ 0x60(CX), AX - SBBQ AX, R12 - SBBQ DX, R13 - SBBQ $0, R14 - SBBQ $0, R15 - - // Final result - ADDQ 0x20(CX), R8 - MOVQ R8, 0x20(CX) // OUT4 - ADCQ 0x28(CX), R9 - MOVQ R9, 0x28(CX) // OUT5 - ADCQ 0x30(CX), R10 - MOVQ R10, 0x30(CX) // OUT6 - ADCQ 0x38(CX), R11 - MOVQ R11, 0x38(CX) // OUT7 - ADCQ 0x40(CX), R12 - MOVQ R12, 0x40(CX) // OUT8 - ADCQ 0x48(CX), R13 - MOVQ R13, 0x48(CX) // OUT9 - ADCQ 0x50(CX), R14 - MOVQ R14, 0x50(CX) // OUT10 - ADCQ 0x58(CX), R15 - MOVQ R15, 0x58(CX) // OUT11 - MOVQ 0x60(CX), R12 - ADCQ $0, R12 - MOVQ R12, 0x60(CX) // OUT12 - ADCQ $0, DX - MOVQ DX, 0x68(CX) // OUT13 - RET - -mul_with_mulx_adcx_adox: - // Mul implementation for CPUs supporting two independent carry chain - // (ADOX/ADCX) instructions and carry-less MULX multiplier - XORQ AX, AX - MOVQ 0x0(DI), R8 - MOVQ 0x8(DI), R9 - MOVQ 0x10(DI), R10 - MOVQ 0x18(DI), R11 - - MOVQ BP, 0x70(SP) // push: BP is Callee-save. - - ADDQ 0x20(DI), R8 - ADCQ 0x28(DI), R9 - ADCQ 0x30(DI), R10 - ADCQ $0, R11 - SBBQ $0, AX - MOVQ R8, 0x0(SP) - MOVQ R9, 0x8(SP) - MOVQ R10, 0x10(SP) - MOVQ R11, 0x18(SP) - - // r12-r15 <- BH + BL, rbx <- mask - XORQ BX, BX - MOVQ 0x0(SI), R12 - MOVQ 0x8(SI), R13 - MOVQ 0x10(SI), R14 - MOVQ 0x18(SI), R15 - ADDQ 0x20(SI), R12 - ADCQ 0x28(SI), R13 - ADCQ 0x30(SI), R14 - ADCQ $0, R15 - SBBQ $0, BX - MOVQ R12, 0x20(SP) - MOVQ R13, 0x28(SP) - MOVQ R14, 0x30(SP) - MOVQ R15, 0x38(SP) - - // r12-r15 <- masked (BH + BL) - ANDQ AX, R12 - ANDQ AX, R13 - ANDQ AX, R14 - ANDQ AX, R15 - - // r8-r11 <- masked (AH + AL) - ANDQ BX, R8 - ANDQ BX, R9 - ANDQ BX, R10 - ANDQ BX, R11 - - // r8-r11 <- masked (AH + AL) + masked (BH + BL) - ADDQ R12, R8 - ADCQ R13, R9 - ADCQ R14, R10 - ADCQ R15, R11 - MOVQ R8, 0x40(SP) - MOVQ R9, 0x48(SP) - MOVQ R10, 0x50(SP) - MOVQ R11, 0x58(SP) - - // [rsp] <- CM = (AH+AL) x (BH+BL) - MULX256(0,SP,32,SP,0,SP,R8,R9,R10,R11,R12,R13,R14,R15,BX,BP) - // [rcx] <- CL = AL x BL (Result c0-c3) - MULX256(0,DI,0,SI,0,CX,R8,R9,R10,R11,R12,R13,R14,R15,BX,BP) - // [rcx+64], rbx, rbp, rax <- CH = AH x BH - MULX192(32,DI,32,SI,64,CX,R8,BX,R10,BP,R12,R13,R14) - - // r8-r11 <- (AH+AL) x (BH+BL), final step - MOVQ 0x40(SP), R8 - MOVQ 0x48(SP), R9 - MOVQ 0x50(SP), R10 - MOVQ 0x58(SP), R11 - - MOVQ 0x20(SP), DX - ADDQ DX, R8 - MOVQ 0x28(SP), DX - ADCQ DX, R9 - MOVQ 0x30(SP), DX - ADCQ DX, R10 - MOVQ 0x38(SP), DX - ADCQ DX, R11 - - // [rsp], x3-x5 <- (AH+AL) x (BH+BL) - ALxBL - MOVQ 0x0(SP), R12 - MOVQ 0x8(SP), R13 - MOVQ 0x10(SP), R14 - MOVQ 0x18(SP), R15 - SUBQ 0x0(CX), R12 - SBBQ 0x8(CX), R13 - SBBQ 0x10(CX), R14 - SBBQ 0x18(CX), R15 - SBBQ 0x20(CX), R8 - SBBQ 0x28(CX), R9 - SBBQ 0x30(CX), R10 - SBBQ 0x38(CX), R11 - - // r8-r15 <- (AH+AL) x (BH+BL) - ALxBL - AHxBH - SUBQ 0x40(CX), R12 - SBBQ 0x48(CX), R13 - SBBQ 0x50(CX), R14 - SBBQ BX, R15 - SBBQ BP, R8 - SBBQ AX, R9 - SBBQ $0, R10 - SBBQ $0, R11 - - ADDQ 0x20(CX), R12 - MOVQ R12, 0x20(CX) // OUT4 - ADCQ 0x28(CX), R13 - MOVQ R13, 0x28(CX) // OUT5 - ADCQ 0x30(CX), R14 - MOVQ R14, 0x30(CX) // OUT6 - ADCQ 0x38(CX), R15 - MOVQ R15, 0x38(CX) // OUT7 - ADCQ 0x40(CX), R8 - MOVQ R8, 0x40(CX) // OUT8 - ADCQ 0x48(CX), R9 - MOVQ R9, 0x48(CX) // OUT9 - ADCQ 0x50(CX), R10 - MOVQ R10, 0x50(CX) // OUT10 - ADCQ BX, R11 - MOVQ R11, 0x58(CX) // OUT11 - ADCQ $0, BP - MOVQ BP, 0x60(CX) // OUT12 - ADCQ $0, AX - MOVQ AX, 0x68(CX) // OUT13 - - MOVQ 0x70(SP), BP // pop: BP is Callee-save. - RET - -TEXT ·rdcP434(SB),$0-16 - MOVQ z+0(FP), SI - MOVQ x+8(FP), DI - CMPB ·HasADXandBMI2(SB), $1 - JE redc_bdw -#define MUL01 MUL128x256( 0,DI,·P434p1+(8*P434_P1_ZEROS),R8,R9,R10,R11,R12,R13,R14,CX) -#define MUL23 MUL128x256(16,DI,·P434p1+(8*P434_P1_ZEROS),R8,R9,R10,R11,R12,R13,R14,CX) -#define MUL45 MUL128x256(32,DI,·P434p1+(8*P434_P1_ZEROS),R8,R9,R10,R11,R12,R13,R14,CX) -#define MUL67 MUL64x256(48,DI,·P434p1+(8*P434_P1_ZEROS),R8,R9,R10,R11,R12,R13) - REDC_MULQ(MUL01, MUL23, MUL45, MUL67) -#undef MUL01 -#undef MUL23 -#undef MUL45 -#undef MUL67 - RET - -// 434-bit montgomery reduction Uses MULX/ADOX/ADCX instructions -// available on Broadwell micro-architectures and newer. -redc_bdw: -#define MULX01 MULX128x256(R14,·P434p1+(8*P434_P1_ZEROS),R9 ,R10,R11,R12,R13) -#define MULX23 MULX128x256(R8 ,·P434p1+(8*P434_P1_ZEROS),BP ,R12,R13,R14,CX ) -#define MULX45 MULX128x256(BX ,·P434p1+(8*P434_P1_ZEROS),R9 ,R10,BP ,R12,R13) -#define MULX67 MULX64x256 ( ·P434p1+(8*P434_P1_ZEROS),BX ,R8 ,R9 ,R11,CX ) - REDC_MULX(·P434p1+(8*P434_P1_ZEROS)+0(SB), MULX01, MULX23, MULX45, MULX67) -#undef MULX01 -#undef MULX23 -#undef MULX45 -#undef MULX67 - RET diff --git a/dh/sidh/internal/p434/arith_amd64_test.go b/dh/sidh/internal/p434/arith_amd64_test.go deleted file mode 100644 index c5adc978..00000000 --- a/dh/sidh/internal/p434/arith_amd64_test.go +++ /dev/null @@ -1,97 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -//go:build amd64 && !purego -// +build amd64,!purego - -package p434 - -import ( - "reflect" - "testing" - "testing/quick" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "golang.org/x/sys/cpu" -) - -type OptimFlag uint - -const ( - // Indicates that optimisation which uses MUL instruction should be used - kUse_MUL OptimFlag = 1 << 0 - // Indicates that optimisation which uses MULX, ADOX and ADCX instructions should be used - kUse_MULXandADxX = 1 << 1 -) - -func resetCpuFeatures() { - HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX -} - -// Utility function used for testing Mul implementations. Tests caller provided -// mulFunc against mul() -func testMul(t *testing.T, f1, f2 OptimFlag) { - doMulTest := func(multiplier, multiplicant common.Fp) bool { - defer resetCpuFeatures() - var resMulRef, resMulOptim common.FpX2 - - // Compute multiplier*multiplicant with first implementation - HasADXandBMI2 = (kUse_MULXandADxX & f1) == kUse_MULXandADxX - mulP434(&resMulOptim, &multiplier, &multiplicant) - - // Compute multiplier*multiplicant with second implementation - HasADXandBMI2 = (kUse_MULXandADxX & f2) == kUse_MULXandADxX - mulP434(&resMulRef, &multiplier, &multiplicant) - - // Compare results - return reflect.DeepEqual(resMulRef, resMulOptim) - } - - if err := quick.Check(doMulTest, quickCheckConfig); err != nil { - t.Error(err) - } -} - -// Utility function used for testing REDC implementations. Tests caller provided -// redcFunc against redc() -func testRedc(t *testing.T, f1, f2 OptimFlag) { - doRedcTest := func(aRR common.FpX2) bool { - defer resetCpuFeatures() - var resRedcF1, resRedcF2 common.Fp - aRRcpy := aRR - - // Compute redc with first implementation - HasADXandBMI2 = (kUse_MULXandADxX & f1) == kUse_MULXandADxX - rdcP434(&resRedcF1, &aRR) - - // Compute redc with second implementation - HasADXandBMI2 = (kUse_MULXandADxX & f2) == kUse_MULXandADxX - rdcP434(&resRedcF2, &aRRcpy) - - // Compare results - return reflect.DeepEqual(resRedcF2, resRedcF1) - } - - if err := quick.Check(doRedcTest, quickCheckConfig); err != nil { - t.Error(err) - } -} - -// Ensures correctness of implementation of mul operation which uses MULX and ADOX/ADCX -func TestMulWithMULXADxX(t *testing.T) { - defer resetCpuFeatures() - if !HasADXandBMI2 { - t.Skip("MULX, ADCX and ADOX not supported by the platform") - } - testMul(t, kUse_MULXandADxX, kUse_MUL) -} - -// Ensures correctness of Montgomery reduction implementation which uses MULX -// and ADCX/ADOX. -func TestRedcWithMULXADxX(t *testing.T) { - defer resetCpuFeatures() - if !HasADXandBMI2 { - t.Skip("MULX, ADCX and ADOX not supported by the platform") - } - testRedc(t, kUse_MULXandADxX, kUse_MUL) -} diff --git a/dh/sidh/internal/p434/arith_decl.go b/dh/sidh/internal/p434/arith_decl.go deleted file mode 100644 index c4109e01..00000000 --- a/dh/sidh/internal/p434/arith_decl.go +++ /dev/null @@ -1,61 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -//go:build amd64 && !purego -// +build amd64,!purego - -package p434 - -import ( - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// If choice = 0, leave x unchanged. If choice = 1, sets x to y. -// If choice is neither 0 nor 1 then behaviour is undefined. -// This function executes in constant time. -// -//go:noescape -func cmovP434(x, y *Fp, choice uint8) - -// If choice = 0, leave x,y unchanged. If choice = 1, set x,y = y,x. -// If choice is neither 0 nor 1 then behaviour is undefined. -// This function executes in constant time. -// -//go:noescape -func cswapP434(x, y *Fp, choice uint8) - -// Compute z = x + y (mod p). -// -//go:noescape -func addP434(z, x, y *Fp) - -// Compute z = x - y (mod p). -// -//go:noescape -func subP434(z, x, y *Fp) - -// Compute z = x + y, without reducing mod p. -// -//go:noescape -func adlP434(z, x, y *FpX2) - -// Compute z = x - y, without reducing mod p. -// -//go:noescape -func sulP434(z, x, y *FpX2) - -// Reduce a field element in [0, 2*p) to one in [0,p). -// -//go:noescape -func modP434(x *Fp) - -// Computes z = x * y. -// -//go:noescape -func mulP434(z *FpX2, x, y *Fp) - -// Computes the Montgomery reduction z = x R^{-1} (mod 2*p). On return value -// of x may be changed. z=x not allowed. -// -//go:noescape -func rdcP434(z *Fp, x *FpX2) diff --git a/dh/sidh/internal/p434/arith_generic.go b/dh/sidh/internal/p434/arith_generic.go deleted file mode 100644 index 664389bf..00000000 --- a/dh/sidh/internal/p434/arith_generic.go +++ /dev/null @@ -1,203 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -//go:build purego || !amd64 -// +build purego !amd64 - -package p434 - -import ( - "math/bits" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Compute z = x + y (mod p). -func addP434(z, x, y *common.Fp) { - var carry uint64 - - // z=x+y % P434 - for i := 0; i < FpWords; i++ { - z[i], carry = bits.Add64(x[i], y[i], carry) - } - - // z = z - P434x2 - carry = 0 - for i := 0; i < FpWords; i++ { - z[i], carry = bits.Sub64(z[i], P434x2[i], carry) - } - - // if z<0 add P434x2 back - mask := uint64(0 - carry) - carry = 0 - for i := 0; i < FpWords; i++ { - z[i], carry = bits.Add64(z[i], P434x2[i]&mask, carry) - } -} - -// Compute z = x - y (mod p). -func subP434(z, x, y *common.Fp) { - var borrow uint64 - - for i := 0; i < FpWords; i++ { - z[i], borrow = bits.Sub64(x[i], y[i], borrow) - } - - mask := uint64(0 - borrow) - borrow = 0 - - for i := 0; i < FpWords; i++ { - z[i], borrow = bits.Add64(z[i], P434x2[i]&mask, borrow) - } -} - -// If choice = 0, leave x unchanged. If choice = 1, sets x to y. -// If choice is neither 0 nor 1 then behaviour is undefined. -// This function executes in constant time. -func cmovP434(x, y *common.Fp, choice uint8) { - mask := 0 - uint64(choice) - for i := 0; i < FpWords; i++ { - x[i] ^= mask & (x[i] ^ y[i]) - } -} - -// Conditionally swaps bits in x and y in constant time. -// mask indicates bits to be swapped (set bits are swapped) -// For details see "Hackers Delight, 2.20" -// -// Implementation doesn't actually depend on a prime field. -func cswapP434(x, y *common.Fp, mask uint8) { - var tmp, mask64 uint64 - - mask64 = 0 - uint64(mask) - for i := 0; i < FpWords; i++ { - tmp = mask64 & (x[i] ^ y[i]) - x[i] = tmp ^ x[i] - y[i] = tmp ^ y[i] - } -} - -// Perform Montgomery reduction: set z = x R^{-1} (mod 2*p) -// with R=2^(FpWords*64). Destroys the input value. -func rdcP434(z *common.Fp, x *common.FpX2) { - var carry, t, u, v uint64 - var hi, lo uint64 - var count int - - count = P434p1Zeros - - for i := 0; i < FpWords; i++ { - for j := 0; j < i; j++ { - if j < (i - count + 1) { - hi, lo = bits.Mul64(z[j], P434p1[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - } - v, carry = bits.Add64(v, x[i], 0) - u, carry = bits.Add64(u, 0, carry) - t += carry - - z[i] = v - v = u - u = t - t = 0 - } - - for i := FpWords; i < 2*FpWords-1; i++ { - if count > 0 { - count-- - } - for j := i - FpWords + 1; j < FpWords; j++ { - if j < (FpWords - count) { - hi, lo = bits.Mul64(z[j], P434p1[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - } - v, carry = bits.Add64(v, x[i], 0) - u, carry = bits.Add64(u, 0, carry) - - t += carry - z[i-FpWords] = v - v = u - u = t - t = 0 - } - v, _ = bits.Add64(v, x[2*FpWords-1], 0) - z[FpWords-1] = v -} - -// Compute z = x * y. -func mulP434(z *common.FpX2, x, y *common.Fp) { - var u, v, t uint64 - var hi, lo uint64 - var carry uint64 - - for i := uint64(0); i < FpWords; i++ { - for j := uint64(0); j <= i; j++ { - hi, lo = bits.Mul64(x[j], y[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - z[i] = v - v = u - u = t - t = 0 - } - - for i := FpWords; i < (2*FpWords)-1; i++ { - for j := i - FpWords + 1; j < FpWords; j++ { - hi, lo = bits.Mul64(x[j], y[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - z[i] = v - v = u - u = t - t = 0 - } - z[2*FpWords-1] = v -} - -// Compute z = x + y, without reducing mod p. -func adlP434(z, x, y *common.FpX2) { - var carry uint64 - for i := 0; i < 2*FpWords; i++ { - z[i], carry = bits.Add64(x[i], y[i], carry) - } -} - -// Reduce a field element in [0, 2*p) to one in [0,p). -func modP434(x *common.Fp) { - var borrow, mask uint64 - for i := 0; i < FpWords; i++ { - x[i], borrow = bits.Sub64(x[i], P434[i], borrow) - } - - // Sets all bits if borrow = 1 - mask = 0 - borrow - borrow = 0 - for i := 0; i < FpWords; i++ { - x[i], borrow = bits.Add64(x[i], P434[i]&mask, borrow) - } -} - -// Compute z = x - y, without reducing mod p. -func sulP434(z, x, y *common.FpX2) { - var borrow, mask uint64 - for i := 0; i < 2*FpWords; i++ { - z[i], borrow = bits.Sub64(x[i], y[i], borrow) - } - - // Sets all bits if borrow = 1 - mask = 0 - borrow - borrow = 0 - for i := FpWords; i < 2*FpWords; i++ { - z[i], borrow = bits.Add64(z[i], P434[i-FpWords]&mask, borrow) - } -} diff --git a/dh/sidh/internal/p434/arith_test.go b/dh/sidh/internal/p434/arith_test.go deleted file mode 100644 index 40f46af1..00000000 --- a/dh/sidh/internal/p434/arith_test.go +++ /dev/null @@ -1,129 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p434 - -import ( - "testing" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Package-level storage for this field element is intended to deter -// compiler optimizations. -var ( - benchmarkFp common.Fp - benchmarkFpX2 common.FpX2 - bench_x = common.Fp{17026702066521327207, 5108203422050077993, 10225396685796065916, 11153620995215874678, 6531160855165088358, 15302925148404145445, 1248821577836769963, 9789766903037985294, 7493111552032041328, 10838999828319306046, 18103257655515297935, 27403304611634} - bench_y = common.Fp{4227467157325093378, 10699492810770426363, 13500940151395637365, 12966403950118934952, 16517692605450415877, 13647111148905630666, 14223628886152717087, 7167843152346903316, 15855377759596736571, 4300673881383687338, 6635288001920617779, 30486099554235} - bench_z = common.FpX2{1595347748594595712, 10854920567160033970, 16877102267020034574, 12435724995376660096, 3757940912203224231, 8251999420280413600, 3648859773438820227, 17622716832674727914, 11029567000887241528, 11216190007549447055, 17606662790980286987, 4720707159513626555, 12887743598335030915, 14954645239176589309, 14178817688915225254, 1191346797768989683, 12629157932334713723, 6348851952904485603, 16444232588597434895, 7809979927681678066, 14642637672942531613, 3092657597757640067, 10160361564485285723, 240071237} -) - -func TestFpCswap(t *testing.T) { - one := common.Fp{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} - two := common.Fp{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2} - - x := one - y := two - - cswapP434(&x, &y, 0) - for i := 0; i < FpWords; i++ { - if (x[i] != one[i]) || (y[i] != two[i]) { - t.Error("Found", x, "expected", one) - } - } - - cswapP434(&x, &y, 1) - for i := 0; i < FpWords; i++ { - if (x[i] != two[i]) || (y[i] != one[i]) { - t.Error("Found", x, "expected", two) - } - } -} - -func TestFpCmov(t *testing.T) { - one := common.Fp{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} - two := common.Fp{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2} - - x := one - y := two - - cmovP434(&x, &y, 0) - for i := 0; i < FpWords; i++ { - if x[i] != one[i] { - t.Error("Found", x, "expected", one) - } - if y[i] != two[i] { - t.Error("Found", y, "expected", two) - } - } - - cmovP434(&x, &y, 1) - for i := 0; i < FpWords; i++ { - if x[i] != two[i] { - t.Error("Found", x, "expected", two) - } - if y[i] != two[i] { - t.Error("Found", y, "expected", two) - } - } -} - -// Benchmarking for field arithmetic -func BenchmarkMul(b *testing.B) { - for n := 0; n < b.N; n++ { - mulP434(&benchmarkFpX2, &bench_x, &bench_y) - } -} - -func BenchmarkRdc(b *testing.B) { - z := bench_z - - // This benchmark actually computes garbage, because - // rdcP434 mangles its input, but since it's - // constant-time that shouldn't matter for the benchmarks. - for n := 0; n < b.N; n++ { - rdcP434(&benchmarkFp, &z) - } -} - -func BenchmarkAdd(b *testing.B) { - for n := 0; n < b.N; n++ { - addP434(&benchmarkFp, &bench_x, &bench_y) - } -} - -func BenchmarkSub(b *testing.B) { - for n := 0; n < b.N; n++ { - subP434(&benchmarkFp, &bench_x, &bench_y) - } -} - -func BenchmarkCswap(b *testing.B) { - x, y := bench_x, bench_y - for n := 0; n < b.N; n++ { - cswapP434(&x, &y, 1) - cswapP434(&x, &y, 0) - } -} - -func BenchmarkMod(b *testing.B) { - x := bench_x - for n := 0; n < b.N; n++ { - modP434(&x) - } -} - -func BenchmarkX2AddLazy(b *testing.B) { - x, y, z := bench_z, bench_z, bench_z - for n := 0; n < b.N; n++ { - adlP434(&x, &y, &z) - } -} - -func BenchmarkX2SubLazy(b *testing.B) { - x, y, z := bench_z, bench_z, bench_z - for n := 0; n < b.N; n++ { - sulP434(&x, &y, &z) - } -} diff --git a/dh/sidh/internal/p434/core.go b/dh/sidh/internal/p434/core.go deleted file mode 100644 index cc90473c..00000000 --- a/dh/sidh/internal/p434/core.go +++ /dev/null @@ -1,300 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p434 - -import ( - crand "crypto/rand" - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// ----------------------------------------------------------------------------- -// Functions for traversing isogeny trees according to strategy. Key type 'A' is -// - -// Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed -// for public key generation. -func traverseTreePublicKeyA(curve *ProjectiveCurveParameters, xR, phiP, phiQ, phiR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny4 - - cparam := CalcCurveParamsEquiv4(curve) - strat := params.A.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow2k(xR, &cparam, 2*k) - i += int(k) - } - cparam = phi.GenerateCurve(xR) - - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - phi.EvaluatePoint(phiP) - phi.EvaluatePoint(phiQ) - phi.EvaluatePoint(phiR) - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Traverses isogeny tree in order to compute xR needed -// for public key generation. -func traverseTreeSharedKeyA(curve *ProjectiveCurveParameters, xR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny4 - - cparam := CalcCurveParamsEquiv4(curve) - strat := params.A.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow2k(xR, &cparam, 2*k) - i += int(k) - } - cparam = phi.GenerateCurve(xR) - - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed -// for public key generation. -func traverseTreePublicKeyB(curve *ProjectiveCurveParameters, xR, phiP, phiQ, phiR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny3 - - cparam := CalcCurveParamsEquiv3(curve) - strat := params.B.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow3k(xR, &cparam, k) - i += int(k) - } - - cparam = phi.GenerateCurve(xR) - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - - phi.EvaluatePoint(phiP) - phi.EvaluatePoint(phiQ) - phi.EvaluatePoint(phiR) - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed -// for public key generation. -func traverseTreeSharedKeyB(curve *ProjectiveCurveParameters, xR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny3 - - cparam := CalcCurveParamsEquiv3(curve) - strat := params.B.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow3k(xR, &cparam, k) - i += int(k) - } - - cparam = phi.GenerateCurve(xR) - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Generate a public key in the 2-torsion group. Public key is a set -// of three x-coordinates: xP,xQ,x(P-Q), where P,Q are points on E_a(Fp2) -func PublicKeyGenA(pub3Pt *[3]Fp2, prvBytes []byte) { - var xPA, xQA, xRA ProjectivePoint - var xPB, xQB, xRB, xR ProjectivePoint - var invZP, invZQ, invZR Fp2 - var phi isogeny4 - - // Load points for A - xPA = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - xQA = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - xRA = ProjectivePoint{X: params.A.AffineR, Z: params.OneFp2} - - // Load points for B - xRB = ProjectivePoint{X: params.B.AffineR, Z: params.OneFp2} - xQB = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - xPB = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Find isogeny kernel - xR = ScalarMul3Pt(¶ms.InitCurve, &xPA, &xQA, &xRA, params.A.SecretBitLen, prvBytes) - traverseTreePublicKeyA(¶ms.InitCurve, &xR, &xPB, &xQB, &xRB) - - // Secret isogeny - phi.GenerateCurve(&xR) - xPA = xPB - xQA = xQB - xRA = xRB - phi.EvaluatePoint(&xPA) - phi.EvaluatePoint(&xQA) - phi.EvaluatePoint(&xRA) - Fp2Batch3Inv(&xPA.Z, &xQA.Z, &xRA.Z, &invZP, &invZQ, &invZR) - - mul(&pub3Pt[0], &xPA.X, &invZP) - mul(&pub3Pt[1], &xQA.X, &invZQ) - mul(&pub3Pt[2], &xRA.X, &invZR) -} - -// Generate a public key in the 2-torsion group. Public key is a set -// of three x-coordinates: xP,xQ,x(P-Q), where P,Q are points on E_a(Fp2) -func PublicKeyGenB(pub3Pt *[3]Fp2, prvBytes []byte) { - var xPB, xQB, xRB, xR ProjectivePoint - var xPA, xQA, xRA ProjectivePoint - var invZP, invZQ, invZR Fp2 - var phi isogeny3 - - // Load points for B - xRB = ProjectivePoint{X: params.B.AffineR, Z: params.OneFp2} - xQB = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - xPB = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Load points for A - xPA = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - xQA = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - xRA = ProjectivePoint{X: params.A.AffineR, Z: params.OneFp2} - - // Find isogeny kernel - xR = ScalarMul3Pt(¶ms.InitCurve, &xPB, &xQB, &xRB, params.B.SecretBitLen, prvBytes) - traverseTreePublicKeyB(¶ms.InitCurve, &xR, &xPA, &xQA, &xRA) - - phi.GenerateCurve(&xR) - xPB = xPA - xQB = xQA - xRB = xRA - phi.EvaluatePoint(&xPB) - phi.EvaluatePoint(&xQB) - phi.EvaluatePoint(&xRB) - Fp2Batch3Inv(&xPB.Z, &xQB.Z, &xRB.Z, &invZP, &invZQ, &invZR) - - mul(&pub3Pt[0], &xPB.X, &invZP) - mul(&pub3Pt[1], &xQB.X, &invZQ) - mul(&pub3Pt[2], &xRB.X, &invZR) -} - -// ----------------------------------------------------------------------------- -// Key agreement functions -// - -// Establishing shared keys in in 2-torsion group -func DeriveSecretA(ss, prv []byte, pub3Pt *[3]Fp2) { - var xP, xQ, xQmP ProjectivePoint - var xR ProjectivePoint - var phi isogeny4 - var jInv Fp2 - - // Recover curve coefficients - cparam := params.InitCurve - RecoverCoordinateA(&cparam, &pub3Pt[0], &pub3Pt[1], &pub3Pt[2]) - - // Find kernel of the morphism - xP = ProjectivePoint{X: pub3Pt[0], Z: params.OneFp2} - xQ = ProjectivePoint{X: pub3Pt[1], Z: params.OneFp2} - xQmP = ProjectivePoint{X: pub3Pt[2], Z: params.OneFp2} - xR = ScalarMul3Pt(&cparam, &xP, &xQ, &xQmP, params.A.SecretBitLen, prv) - - // Traverse isogeny tree - traverseTreeSharedKeyA(&cparam, &xR) - - // Calculate j-invariant on isogenous curve - c := phi.GenerateCurve(&xR) - RecoverCurveCoefficients4(&cparam, &c) - Jinvariant(&cparam, &jInv) - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(ss, &jInv, params.Bytelen) -} - -// Establishing shared keys in in 3-torsion group -func DeriveSecretB(ss, prv []byte, pub3Pt *[3]Fp2) { - var xP, xQ, xQmP ProjectivePoint - var xR ProjectivePoint - var phi isogeny3 - var jInv Fp2 - - // Recover curve coefficients - cparam := params.InitCurve - RecoverCoordinateA(&cparam, &pub3Pt[0], &pub3Pt[1], &pub3Pt[2]) - - // Find kernel of the morphism - xP = ProjectivePoint{X: pub3Pt[0], Z: params.OneFp2} - xQ = ProjectivePoint{X: pub3Pt[1], Z: params.OneFp2} - xQmP = ProjectivePoint{X: pub3Pt[2], Z: params.OneFp2} - - //PUBLIC KEY VALIDATION - if err := PublicKeyValidation(&cparam, &xP, &xQ, &xQmP, params.B.SecretBitLen); err != nil { - _, err_read := crand.Read(ss) - if err_read != nil { - panic("core: failed to generate random ss when public key verification fails") - } - return - } - - xR = ScalarMul3Pt(&cparam, &xP, &xQ, &xQmP, params.B.SecretBitLen, prv) - - // Traverse isogeny tree - traverseTreeSharedKeyB(&cparam, &xR) - - // Calculate j-invariant on isogenous curve - c := phi.GenerateCurve(&xR) - RecoverCurveCoefficients3(&cparam, &c) - Jinvariant(&cparam, &jInv) - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(ss, &jInv, params.Bytelen) - -} diff --git a/dh/sidh/internal/p434/curve.go b/dh/sidh/internal/p434/curve.go deleted file mode 100644 index 6262399d..00000000 --- a/dh/sidh/internal/p434/curve.go +++ /dev/null @@ -1,431 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p434 - -import ( - "errors" - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "math" -) - -// Stores isogeny 3 curve constants -type isogeny3 struct { - K1 Fp2 - K2 Fp2 -} - -// Stores isogeny 4 curve constants -type isogeny4 struct { - isogeny3 - K3 Fp2 -} - -// Computes j-invariant for a curve y2=x3+A/Cx+x with A,C in F_(p^2). Result -// is returned in jBytes buffer, encoded in little-endian format. Caller -// provided jBytes buffer has to be big enough to j-invariant value. In case -// of SIDH, buffer size must be at least size of shared secret. -// Implementation corresponds to Algorithm 9 from SIKE. -func Jinvariant(cparams *ProjectiveCurveParameters, j *Fp2) { - var t0, t1 Fp2 - - sqr(j, &cparams.A) // j = A^2 - sqr(&t1, &cparams.C) // t1 = C^2 - add(&t0, &t1, &t1) // t0 = t1 + t1 - sub(&t0, j, &t0) // t0 = j - t0 - sub(&t0, &t0, &t1) // t0 = t0 - t1 - sub(j, &t0, &t1) // t0 = t0 - t1 - sqr(&t1, &t1) // t1 = t1^2 - mul(j, j, &t1) // j = j * t1 - add(&t0, &t0, &t0) // t0 = t0 + t0 - add(&t0, &t0, &t0) // t0 = t0 + t0 - sqr(&t1, &t0) // t1 = t0^2 - mul(&t0, &t0, &t1) // t0 = t0 * t1 - add(&t0, &t0, &t0) // t0 = t0 + t0 - add(&t0, &t0, &t0) // t0 = t0 + t0 - inv(j, j) // j = 1/j - mul(j, &t0, j) // j = t0 * j -} - -// Given affine points x(P), x(Q) and x(Q-P) in a extension field F_{p^2}, function -// recovers projective coordinate A of a curve. This is Algorithm 10 from SIKE. -func RecoverCoordinateA(curve *ProjectiveCurveParameters, xp, xq, xr *Fp2) { - var t0, t1 Fp2 - - add(&t1, xp, xq) // t1 = Xp + Xq - mul(&t0, xp, xq) // t0 = Xp * Xq - mul(&curve.A, xr, &t1) // A = X(q-p) * t1 - add(&curve.A, &curve.A, &t0) // A = A + t0 - mul(&t0, &t0, xr) // t0 = t0 * X(q-p) - sub(&curve.A, &curve.A, ¶ms.OneFp2) // A = A - 1 - add(&t0, &t0, &t0) // t0 = t0 + t0 - add(&t1, &t1, xr) // t1 = t1 + X(q-p) - add(&t0, &t0, &t0) // t0 = t0 + t0 - sqr(&curve.A, &curve.A) // A = A^2 - inv(&t0, &t0) // t0 = 1/t0 - mul(&curve.A, &curve.A, &t0) // A = A * t0 - sub(&curve.A, &curve.A, &t1) // A = A - t1 -} - -// Computes equivalence (A:C) ~ (A+2C : A-2C) -func CalcCurveParamsEquiv3(cparams *ProjectiveCurveParameters) CurveCoefficientsEquiv { - var coef CurveCoefficientsEquiv - var c2 Fp2 - - add(&c2, &cparams.C, &cparams.C) - // A24p = A+2*C - add(&coef.A, &cparams.A, &c2) - // A24m = A-2*C - sub(&coef.C, &cparams.A, &c2) - return coef -} - -// Computes equivalence (A:C) ~ (A+2C : 4C) -func CalcCurveParamsEquiv4(cparams *ProjectiveCurveParameters) CurveCoefficientsEquiv { - var coefEq CurveCoefficientsEquiv - - add(&coefEq.C, &cparams.C, &cparams.C) - // A24p = A+2C - add(&coefEq.A, &cparams.A, &coefEq.C) - // C24 = 4*C - add(&coefEq.C, &coefEq.C, &coefEq.C) - return coefEq -} - -// Helper function for RightToLeftLadder(). Returns A+2C / 4. -func CalcAplus2Over4(cparams *ProjectiveCurveParameters) (ret Fp2) { - var tmp Fp2 - - // 2C - add(&tmp, &cparams.C, &cparams.C) - // A+2C - add(&ret, &cparams.A, &tmp) - // 1/4C - add(&tmp, &tmp, &tmp) - inv(&tmp, &tmp) - // A+2C/4C - mul(&ret, &ret, &tmp) - return -} - -// Recovers (A:C) curve parameters from projectively equivalent (A+2C:A-2C). -func RecoverCurveCoefficients3(cparams *ProjectiveCurveParameters, coefEq *CurveCoefficientsEquiv) { - add(&cparams.A, &coefEq.A, &coefEq.C) - // cparams.A = 2*(A+2C+A-2C) = 4A - add(&cparams.A, &cparams.A, &cparams.A) - // cparams.C = (A+2C-A+2C) = 4C - sub(&cparams.C, &coefEq.A, &coefEq.C) - return -} - -// Recovers (A:C) curve parameters from projectively equivalent (A+2C:4C). -func RecoverCurveCoefficients4(cparams *ProjectiveCurveParameters, coefEq *CurveCoefficientsEquiv) { - // cparams.C = (4C)*1/2=2C - mul(&cparams.C, &coefEq.C, ¶ms.HalfFp2) - // cparams.A = A+2C - 2C = A - sub(&cparams.A, &coefEq.A, &cparams.C) - // cparams.C = 2C * 1/2 = C - mul(&cparams.C, &cparams.C, ¶ms.HalfFp2) -} - -// Combined coordinate doubling and differential addition. Takes projective points -// P,Q,Q-P and (A+2C)/4C curve E coefficient. Returns 2*P and P+Q calculated on E. -// Function is used only by RightToLeftLadder. Corresponds to Algorithm 5 of SIKE -func xDbladd(P, Q, QmP *ProjectivePoint, a24 *Fp2) (dblP, PaQ ProjectivePoint) { - var t0, t1, t2 Fp2 - - xQmP, zQmP := &QmP.X, &QmP.Z - xPaQ, zPaQ := &PaQ.X, &PaQ.Z - x2P, z2P := &dblP.X, &dblP.Z - xP, zP := &P.X, &P.Z - xQ, zQ := &Q.X, &Q.Z - - add(&t0, xP, zP) // t0 = Xp+Zp - sub(&t1, xP, zP) // t1 = Xp-Zp - sqr(x2P, &t0) // 2P.X = t0^2 - sub(&t2, xQ, zQ) // t2 = Xq-Zq - add(xPaQ, xQ, zQ) // Xp+q = Xq+Zq - mul(&t0, &t0, &t2) // t0 = t0 * t2 - mul(z2P, &t1, &t1) // 2P.Z = t1 * t1 - mul(&t1, &t1, xPaQ) // t1 = t1 * Xp+q - sub(&t2, x2P, z2P) // t2 = 2P.X - 2P.Z - mul(x2P, x2P, z2P) // 2P.X = 2P.X * 2P.Z - mul(xPaQ, a24, &t2) // Xp+q = A24 * t2 - sub(zPaQ, &t0, &t1) // Zp+q = t0 - t1 - add(z2P, xPaQ, z2P) // 2P.Z = Xp+q + 2P.Z - add(xPaQ, &t0, &t1) // Xp+q = t0 + t1 - mul(z2P, z2P, &t2) // 2P.Z = 2P.Z * t2 - sqr(zPaQ, zPaQ) // Zp+q = Zp+q ^ 2 - sqr(xPaQ, xPaQ) // Xp+q = Xp+q ^ 2 - mul(zPaQ, xQmP, zPaQ) // Zp+q = Xq-p * Zp+q - mul(xPaQ, zQmP, xPaQ) // Xp+q = Zq-p * Xp+q - return -} - -// Given the curve parameters, xP = x(P), computes xP = x([2^k]P) -// Safe to overlap xP, x2P. -func Pow2k(xP *ProjectivePoint, params *CurveCoefficientsEquiv, k uint32) { - var t0, t1 Fp2 - - x, z := &xP.X, &xP.Z - for i := uint32(0); i < k; i++ { - sub(&t0, x, z) // t0 = Xp - Zp - add(&t1, x, z) // t1 = Xp + Zp - sqr(&t0, &t0) // t0 = t0 ^ 2 - sqr(&t1, &t1) // t1 = t1 ^ 2 - mul(z, ¶ms.C, &t0) // Z2p = C24 * t0 - mul(x, z, &t1) // X2p = Z2p * t1 - sub(&t1, &t1, &t0) // t1 = t1 - t0 - mul(&t0, ¶ms.A, &t1) // t0 = A24+ * t1 - add(z, z, &t0) // Z2p = Z2p + t0 - mul(z, z, &t1) // Zp = Z2p * t1 - } -} - -// Given the curve parameters, xP = x(P), and k >= 0, compute xP = x([3^k]P). -// -// Safe to overlap xP, xR. -func Pow3k(xP *ProjectivePoint, params *CurveCoefficientsEquiv, k uint32) { - var t0, t1, t2, t3, t4, t5, t6 Fp2 - - x, z := &xP.X, &xP.Z - for i := uint32(0); i < k; i++ { - sub(&t0, x, z) // t0 = Xp - Zp - sqr(&t2, &t0) // t2 = t0^2 - add(&t1, x, z) // t1 = Xp + Zp - sqr(&t3, &t1) // t3 = t1^2 - add(&t4, &t1, &t0) // t4 = t1 + t0 - sub(&t0, &t1, &t0) // t0 = t1 - t0 - sqr(&t1, &t4) // t1 = t4^2 - sub(&t1, &t1, &t3) // t1 = t1 - t3 - sub(&t1, &t1, &t2) // t1 = t1 - t2 - mul(&t5, &t3, ¶ms.A) // t5 = t3 * A24+ - mul(&t3, &t3, &t5) // t3 = t5 * t3 - mul(&t6, &t2, ¶ms.C) // t6 = t2 * A24- - mul(&t2, &t2, &t6) // t2 = t2 * t6 - sub(&t3, &t2, &t3) // t3 = t2 - t3 - sub(&t2, &t5, &t6) // t2 = t5 - t6 - mul(&t1, &t2, &t1) // t1 = t2 * t1 - add(&t2, &t3, &t1) // t2 = t3 + t1 - sqr(&t2, &t2) // t2 = t2^2 - mul(x, &t2, &t4) // X3p = t2 * t4 - sub(&t1, &t3, &t1) // t1 = t3 - t1 - sqr(&t1, &t1) // t1 = t1^2 - mul(z, &t1, &t0) // Z3p = t1 * t0 - } -} - -// Set (y1, y2, y3) = (1/x1, 1/x2, 1/x3). -// -// All xi, yi must be distinct. -func Fp2Batch3Inv(x1, x2, x3, y1, y2, y3 *Fp2) { - var x1x2, t Fp2 - - mul(&x1x2, x1, x2) // x1*x2 - mul(&t, &x1x2, x3) // 1/(x1*x2*x3) - inv(&t, &t) - mul(y1, &t, x2) // 1/x1 - mul(y1, y1, x3) - mul(y2, &t, x1) // 1/x2 - mul(y2, y2, x3) - mul(y3, &t, &x1x2) // 1/x3 -} - -// Scalarmul3Pt is a right-to-left point multiplication that given the -// x-coordinate of P, Q and P-Q calculates the x-coordinate of R=Q+[scalar]P. -// nbits must be smaller or equal to len(scalar). -func ScalarMul3Pt(cparams *ProjectiveCurveParameters, P, Q, PmQ *ProjectivePoint, nbits uint, scalar []uint8) ProjectivePoint { - var R0, R2, R1 ProjectivePoint - aPlus2Over4 := CalcAplus2Over4(cparams) - R1 = *P - R2 = *PmQ - R0 = *Q - - // Iterate over the bits of the scalar, bottom to top - prevBit := uint8(0) - for i := uint(0); i < nbits; i++ { - bit := (scalar[i>>3] >> (i & 7) & 1) - swap := prevBit ^ bit - prevBit = bit - cswap(&R1.X, &R1.Z, &R2.X, &R2.Z, swap) - R0, R2 = xDbladd(&R0, &R2, &R1, &aPlus2Over4) - } - cswap(&R1.X, &R1.Z, &R2.X, &R2.Z, prevBit) - return R1 -} - -// Given a three-torsion point p = x(PB) on the curve E_(A:C), construct the -// three-isogeny phi : E_(A:C) -> E_(A:C)/ = E_(A':C'). -// -// Input: (XP_3: ZP_3), where P_3 has exact order 3 on E_A/C -// Output: -// - Curve coordinates (A' + 2C', A' - 2C') corresponding to E_A'/C' = A_E/C/ -// - Isogeny phi with constants in F_p^2 -func (phi *isogeny3) GenerateCurve(p *ProjectivePoint) CurveCoefficientsEquiv { - var t0, t1, t2, t3, t4 Fp2 - var coefEq CurveCoefficientsEquiv - K1, K2 := &phi.K1, &phi.K2 - - sub(K1, &p.X, &p.Z) // K1 = XP3 - ZP3 - sqr(&t0, K1) // t0 = K1^2 - add(K2, &p.X, &p.Z) // K2 = XP3 + ZP3 - sqr(&t1, K2) // t1 = K2^2 - add(&t2, &t0, &t1) // t2 = t0 + t1 - add(&t3, K1, K2) // t3 = K1 + K2 - sqr(&t3, &t3) // t3 = t3^2 - sub(&t3, &t3, &t2) // t3 = t3 - t2 - add(&t2, &t1, &t3) // t2 = t1 + t3 - add(&t3, &t3, &t0) // t3 = t3 + t0 - add(&t4, &t3, &t0) // t4 = t3 + t0 - add(&t4, &t4, &t4) // t4 = t4 + t4 - add(&t4, &t1, &t4) // t4 = t1 + t4 - mul(&coefEq.C, &t2, &t4) // A24m = t2 * t4 - add(&t4, &t1, &t2) // t4 = t1 + t2 - add(&t4, &t4, &t4) // t4 = t4 + t4 - add(&t4, &t0, &t4) // t4 = t0 + t4 - mul(&t4, &t3, &t4) // t4 = t3 * t4 - sub(&t0, &t4, &coefEq.C) // t0 = t4 - A24m - add(&coefEq.A, &coefEq.C, &t0) // A24p = A24m + t0 - return coefEq -} - -// Given a 3-isogeny phi and a point pB = x(PB), compute x(QB), the x-coordinate -// of the image QB = phi(PB) of PB under phi : E_(A:C) -> E_(A':C'). -// -// The output xQ = x(Q) is then a point on the curve E_(A':C'); the curve -// parameters are returned by the GenerateCurve function used to construct phi. -func (phi *isogeny3) EvaluatePoint(p *ProjectivePoint) { - var t0, t1, t2 Fp2 - K1, K2 := &phi.K1, &phi.K2 - px, pz := &p.X, &p.Z - - add(&t0, px, pz) // t0 = XQ + ZQ - sub(&t1, px, pz) // t1 = XQ - ZQ - mul(&t0, K1, &t0) // t2 = K1 * t0 - mul(&t1, K2, &t1) // t1 = K2 * t1 - add(&t2, &t0, &t1) // t2 = t0 + t1 - sub(&t0, &t1, &t0) // t0 = t1 - t0 - sqr(&t2, &t2) // t2 = t2 ^ 2 - sqr(&t0, &t0) // t0 = t0 ^ 2 - mul(px, px, &t2) // XQ'= XQ * t2 - mul(pz, pz, &t0) // ZQ'= ZQ * t0 -} - -// Given a four-torsion point p = x(PB) on the curve E_(A:C), construct the -// four-isogeny phi : E_(A:C) -> E_(A:C)/ = E_(A':C'). -// -// Input: (XP_4: ZP_4), where P_4 has exact order 4 on E_A/C -// Output: -// - Curve coordinates (A' + 2C', 4C') corresponding to E_A'/C' = A_E/C/ -// - Isogeny phi with constants in F_p^2 -func (phi *isogeny4) GenerateCurve(p *ProjectivePoint) CurveCoefficientsEquiv { - var coefEq CurveCoefficientsEquiv - xp4, zp4 := &p.X, &p.Z - K1, K2, K3 := &phi.K1, &phi.K2, &phi.K3 - - sub(K2, xp4, zp4) - add(K3, xp4, zp4) - sqr(K1, zp4) - add(K1, K1, K1) - sqr(&coefEq.C, K1) - add(K1, K1, K1) - sqr(&coefEq.A, xp4) - add(&coefEq.A, &coefEq.A, &coefEq.A) - sqr(&coefEq.A, &coefEq.A) - return coefEq -} - -// Given a 4-isogeny phi and a point xP = x(P), compute x(Q), the x-coordinate -// of the image Q = phi(P) of P under phi : E_(A:C) -> E_(A':C'). -// -// Input: Isogeny returned by GenerateCurve and point q=(Qx,Qz) from E0_A/C -// Output: Corresponding point q from E1_A'/C', where E1 is 4-isogenous to E0 -func (phi *isogeny4) EvaluatePoint(p *ProjectivePoint) { - var t0, t1 Fp2 - xq, zq := &p.X, &p.Z - K1, K2, K3 := &phi.K1, &phi.K2, &phi.K3 - - add(&t0, xq, zq) - sub(&t1, xq, zq) - mul(xq, &t0, K2) - mul(zq, &t1, K3) - mul(&t0, &t0, &t1) - mul(&t0, &t0, K1) - add(&t1, xq, zq) - sub(zq, xq, zq) - sqr(&t1, &t1) - sqr(zq, zq) - add(xq, &t0, &t1) - sub(&t0, zq, &t0) - mul(xq, xq, &t1) - mul(zq, zq, &t0) -} - -// PublicKeyValidation preforms public key/ciphertext validation using the CLN test. -// CLN test: Check that P and Q are both of order 3^e3 and they generate the torsion E_A[3^e3] -// A countermeasure for remote timing attacks on SIKE; suggested by https://eprint.iacr.org/2022/054.pdf -// Any curve E_A (SIKE 434, 503, 751) that passes CLN test is supersingular. -// Input: The public key / ciphertext P, Q, PmQ. The projective coordinate A of the curve defined by (P, Q, PmQ) -// Outputs: Whether (P,Q,PmQ) follows the CLN test -func PublicKeyValidation(cparams *ProjectiveCurveParameters, P, Q, PmQ *ProjectivePoint, nbits uint) error { - - var PmQX, PmQZ Fp2 - FromMontgomery(&PmQX, &PmQ.X) - FromMontgomery(&PmQZ, &PmQ.Z) - - // PmQ is not point T or O - if (isZero(&PmQX) == 1) || (isZero(&PmQZ) == 1) { - return errors.New("curve: PmQ is invalid") - } - - cparam := CalcCurveParamsEquiv3(cparams) - - // Compute e_3 = log3(2^(nbits+1)) - var e3 uint32 - e3_float := float64(int(nbits)+1) / math.Log2(3) - e3 = uint32(e3_float) - - // Verify that P and Q generate E_A[3^e_3] by checking: [3^(e_3-1)]P != [+-3^(e_3-1)]Q - var test_P, test_Q ProjectivePoint - test_P = *P - test_Q = *Q - - Pow3k(&test_P, &cparam, e3-1) - Pow3k(&test_Q, &cparam, e3-1) - - var PZ, QZ Fp2 - FromMontgomery(&PZ, &test_P.Z) - FromMontgomery(&QZ, &test_Q.Z) - - // P, Q are not of full order 3^e_3 - if (isZero(&PZ) == 1) || (isZero(&QZ) == 1) { - return errors.New("curve: ciphertext/public key are not of full order 3^e3") - } - - // PX/PZ = affine(PX) - // QX/QZ = affine(QX) - // If PX/PZ = QX/QZ, we have P=+-Q - var PXQZ_PZQX_fromMont, PXQZ_PZQX, PXQZ, PZQX Fp2 - mul(&PXQZ, &test_P.X, &test_Q.Z) - mul(&PZQX, &test_P.Z, &test_Q.X) - sub(&PXQZ_PZQX, &PXQZ, &PZQX) - FromMontgomery(&PXQZ_PZQX_fromMont, &PXQZ_PZQX) - - // [3^(e_3-1)]P == [+-3^(e_3-1)]Q - if isZero(&PXQZ_PZQX_fromMont) == 1 { - return errors.New("curve: ciphertext/public key are not linearly independent") - } - - // Check that Ord(P) = Ord(Q) = 3^(e_3) - Pow3k(&test_P, &cparam, 1) - Pow3k(&test_Q, &cparam, 1) - - FromMontgomery(&PZ, &test_P.Z) - FromMontgomery(&QZ, &test_Q.Z) - - // P, Q are not of correct order 3^e_3 - if (isZero(&PZ) == 0) || (isZero(&QZ) == 0) { - return errors.New("curve: ciphertext/public key are not of correct order 3^e3") - } - return nil -} diff --git a/dh/sidh/internal/p434/curve_test.go b/dh/sidh/internal/p434/curve_test.go deleted file mode 100644 index 4371577a..00000000 --- a/dh/sidh/internal/p434/curve_test.go +++ /dev/null @@ -1,392 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p434 - -import ( - "bytes" - crand "crypto/rand" - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "io" - "math" - "math/rand" - "testing" - "time" -) - -func vartimeEqProjFp2(lhs, rhs *ProjectivePoint) bool { - var t0, t1 Fp2 - mul(&t0, &lhs.X, &rhs.Z) - mul(&t1, &lhs.Z, &rhs.X) - return vartimeEqFp2(&t0, &t1) -} - -func toAffine(point *ProjectivePoint) *Fp2 { - var affineX Fp2 - inv(&affineX, &point.Z) - mul(&affineX, &affineX, &point.X) - return &affineX -} - -func Test_jInvariant(t *testing.T) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - jbufRes := make([]byte, params.SharedSecretSize) - jbufExp := make([]byte, params.SharedSecretSize) - var jInv Fp2 - - Jinvariant(&curve, &jInv) - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(jbufRes, &jInv, params.Bytelen) - - jInv = expectedJ - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(jbufExp, &jInv, params.Bytelen) - - if !bytes.Equal(jbufRes[:], jbufExp[:]) { - t.Error("Computed incorrect j-invariant: found\n", jbufRes, "\nexpected\n", jbufExp) - } -} - -func TestProjectivePointVartimeEq(t *testing.T) { - var xP ProjectivePoint - - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - xQ := xP - - // Scale xQ, which results in the same projective point - mul(&xQ.X, &xQ.X, &curveA) - mul(&xQ.Z, &xQ.Z, &curveA) - if !vartimeEqProjFp2(&xP, &xQ) { - t.Error("Expected the scaled point to be equal to the original") - } -} - -func TestPointMulVersusSage(t *testing.T) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - cparams := CalcCurveParamsEquiv4(&curve) - var xP ProjectivePoint - - // x 2 - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - Pow2k(&xP, &cparams, 1) - afxQ := toAffine(&xP) - if !vartimeEqFp2(afxQ, &affineXP2) { - t.Error("\nExpected\n", affineXP2, "\nfound\n", afxQ) - } - - // x 4 - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - Pow2k(&xP, &cparams, 2) - afxQ = toAffine(&xP) - if !vartimeEqFp2(afxQ, &affineXP4) { - t.Error("\nExpected\n", affineXP4, "\nfound\n", afxQ) - } -} - -func TestPointMul9VersusSage(t *testing.T) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - cparams := CalcCurveParamsEquiv3(&curve) - var xP ProjectivePoint - - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - Pow3k(&xP, &cparams, 2) - afxQ := toAffine(&xP) - if !vartimeEqFp2(afxQ, &affineXP9) { - t.Error("\nExpected\n", affineXP9, "\nfound\n", afxQ) - } -} - -func BenchmarkThreePointLadder(b *testing.B) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - for n := 0; n < b.N; n++ { - ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(scalar3Pt)*8), scalar3Pt[:]) - } -} - -/* ------------------------------------------------------------------------- - Generate invalid public key points / ciphertext for test TestKEMInvalidPK - -------------------------------------------------------------------------*/ - -// Left-to-right Montgomery ladder, Algorithm 4 in Costello-Smith -// Input: ProjectivePoint P (xP, zP) -// Output: x([scalar]P), z([scalar]P) -func montgomeryLadder(cparams *ProjectiveCurveParameters, P *ProjectivePoint, scalar []uint8, random uint) ProjectivePoint { - var R0, R2, R1 ProjectivePoint - coefEq := CalcCurveParamsEquiv4(cparams) // for xDbl - aPlus2Over4 := CalcAplus2Over4(cparams) // for xDblAdd - R0 = *P // RO <- P - R1 = *P - Pow2k(&R1, &coefEq, 1) // R1 <- [2]P - R2 = *P // R2 = R1-R0 = P - - prevBit := uint8(0) - for i := int(random); i >= 0; i-- { - bit := (scalar[i>>3] >> (i & 7) & 1) - swap := prevBit ^ bit - prevBit = bit - cswap(&R0.X, &R0.Z, &R1.X, &R1.Z, swap) - R0, R1 = xDbladd(&R0, &R1, &R2, &aPlus2Over4) - } - cswap(&R0.X, &R0.Z, &R1.X, &R1.Z, prevBit) - return R0 -} - -// P = P + T -// From paper https://eprint.iacr.org/2017/212.pdf -// The map tau_T: P->P+T is (X : Z) -> (Z : X) on Montgomery curves -func tauT(P *ProjectivePoint) { - P.X, P.Z = P.Z, P.X // magic! -} - -// Construct Invalid public key tuple (P,Q) such that P and Q are linearly dependent -// Simulate section 3.1.1 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKNoneLinear(t *testing.T) { - - // Generate random scalar as secret - secret := make([]byte, params.B.SecretByteLen) - _, err := io.ReadFull(crand.Reader, secret) - if err != nil { - t.Error("Fail read random bytes") - } - - var P, Q ProjectivePoint - - rand.Seed(time.Now().UnixNano()) - random_index := rand.Intn(int(params.B.SecretByteLen-1) * 8) - - // Set P as a point of order 3^e3 - P = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Set Q = [k]P, where k = secret[:random_index] - Q = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index)) - - // Make sure Q is of full order 3^e_3, - var test_Q ProjectivePoint - test_Q = Q - - var e3 uint32 - e3_float := float64(int(params.B.SecretBitLen)+1) / math.Log2(3) - e3 = uint32(e3_float) - cparam_q := CalcCurveParamsEquiv3(¶ms.InitCurve) - Pow3k(&test_Q, &cparam_q, e3-1) - - var test_QZ Fp2 - FromMontgomery(&test_QZ, &test_Q.Z) - - // Q are not of full order 3^e_3 - for isZero(&test_QZ) == 1 { - rand.Seed(time.Now().UnixNano()) - random_index = rand.Intn(int(params.B.SecretByteLen-1) * 8) - Q = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index)) - test_Q = Q - Pow3k(&test_Q, &cparam_q, e3-1) - FromMontgomery(&test_QZ, &test_Q.Z) - } - - // invQz = 1/Q.Z - var invQz Fp2 - invQz = Q.Z - inv(&invQz, &invQz) - - mul(&P.X, &P.X, &P.Z) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect linearly dependent ciphertext to fail, index: %v scalar: %v ", random_index, secret) - } -} - -// Construct Invalid public key tuple (P,Q) such that Q = [k]P + T, where k is random and T is the point of order 2. -// Simulate HB and section 3.1.2 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKT(t *testing.T) { - - // Generate random scalar as secret - secret := make([]byte, params.B.SecretByteLen) - _, err := io.ReadFull(crand.Reader, secret) - if err != nil { - t.Error("Fail read random bytes") - } - - var P, Q ProjectivePoint - - rand.Seed(time.Now().UnixNano()) - random_index := rand.Intn(int(params.B.SecretByteLen-1) * 8) - - // Set P as a point of order 3^e3 - P = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Set Q = [k]P, where k = secret[:random_index] - Q = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index)) - // Q = [k]P + T - tauT(&Q) - - var invQz Fp2 - invQz = Q.Z - inv(&invQz, &invQz) - - mul(&P.X, &P.X, &P.Z) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect ciphertext involve point T to fail, index: %v scalar: %v ", random_index, secret) - } -} - -// Construct Invalid public key tuple (P,Q) such that P and Q are in E[2^e2] -// Simulate section 3.2 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKOrder2(t *testing.T) { - - // Generate random scalar as secret - secret := make([]byte, params.B.SecretByteLen) - _, err := io.ReadFull(crand.Reader, secret) - if err != nil { - t.Error("Fail read random bytes") - } - - var P, Q ProjectivePoint - - P = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - Q = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - - rand.Seed(time.Now().UnixNano()) - random_index_p := rand.Intn(int(params.A.SecretByteLen-1) * 8) - random_index_q := rand.Intn(int(params.A.SecretByteLen-1) * 8) - - P = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index_p)) - Q = montgomeryLadder(¶ms.InitCurve, &Q, secret, uint(random_index_q)) - - var invQz, invPz Fp2 - invQz = Q.Z - invPz = P.Z - inv(&invQz, &invQz) - inv(&invPz, &invPz) - - mul(&P.X, &P.X, &invPz) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect ciphertext in torsion E[2^e2] to fail, index_p: %v index_q: %v scalar: %v ", random_index_p, random_index_q, secret) - } - -} - -// Construct Invalid public key tuple (P,Q) such that P and Q are in E[3^e3] but not of full order 3^e3 -// Simulate section 3.1.1 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKFullOrder(t *testing.T) { - - var P, Q ProjectivePoint - - P = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - Q = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - - var e3 uint32 - e3_float := float64(int(params.B.SecretBitLen)+1) / math.Log2(3) - e3 = uint32(e3_float) - - rand.Seed(time.Now().UnixNano()) - random_index_p := rand.Intn(int(e3)) - random_index_q := rand.Intn(int(e3)) - - cparam_q := CalcCurveParamsEquiv3(¶ms.InitCurve) - Pow3k(&P, &cparam_q, uint32(random_index_p)) - Pow3k(&Q, &cparam_q, uint32(random_index_q)) - - var invQz, invPz Fp2 - invQz = Q.Z - invPz = P.Z - inv(&invQz, &invQz) - inv(&invPz, &invPz) - - mul(&P.X, &P.X, &invPz) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect ciphertext not of full order to fail, index_p: %v index_q: %v ", random_index_p, random_index_q) - } - -} - -// A trivial test case not covered by paper https://eprint.iacr.org/2022/054.pdf and HB -// Countermeasure in https://eprint.iacr.org/2022/054.pdf only cares about P and Q -// But if PmQ is point T or O, that can also lead to recovery of the first bit -func testInvalidPmQ(t *testing.T) { - - var zero Fp2 - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - xQ = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - xQmP = ProjectivePoint{X: zero, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect PmQ as T to fail\n") - } - -} - -// Test valid ciphertext -// Where P, Q are linearly independent points of correct order 3^e3 in E[3^e3] -func testValidPQ(t *testing.T) { - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - xQ = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify != nil { - t.Errorf("\nExpect correct ciphertext to not fail\n") - } - -} - -/* ------------------------------------------------------------------------- - Public key / Ciphertext validation against attacks proposed in paper https://eprint.iacr.org/2022/054.pdf and HB - -------------------------------------------------------------------------*/ - -func TestInvalidPK(t *testing.T) { - - t.Run("InvalidPmQ", testInvalidPmQ) - t.Run("InvalidPKNoneLinear", testInvalidPKNoneLinear) - t.Run("InvalidPKT", testInvalidPKT) - t.Run("InvalidPKOrder2", testInvalidPKOrder2) - t.Run("InvalidPKFullOrder", testInvalidPKFullOrder) - t.Run("ValidPQ", testValidPQ) - -} diff --git a/dh/sidh/internal/p434/fp2.go b/dh/sidh/internal/p434/fp2.go deleted file mode 100644 index b297e1d3..00000000 --- a/dh/sidh/internal/p434/fp2.go +++ /dev/null @@ -1,222 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p434 - -import ( - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Montgomery multiplication. Input values must be already -// in Montgomery domain. -func mulP(dest, lhs, rhs *common.Fp) { - var ab common.FpX2 - mulP434(&ab, lhs, rhs) // = a*b*R*R - rdcP434(dest, &ab) // = a*b*R mod p -} - -// Set dest = x^((p-3)/4). If x is square, this is 1/sqrt(x). -// Uses variation of sliding-window algorithm from with window size -// of 5 and least to most significant bit sliding (left-to-right) -// See HAC 14.85 for general description. -// -// Allowed to overlap x with dest. -// All values in Montgomery domains -// Set dest = x^(2^k), for k >= 1, by repeated squarings. -func p34(dest, x *common.Fp) { - var lookup [16]common.Fp - - // This performs sum(powStrategy) + 1 squarings and len(lookup) + len(mulStrategy) - // multiplications. - powStrategy := []uint8{3, 10, 7, 5, 6, 5, 3, 8, 4, 7, 5, 6, 4, 5, 9, 6, 3, 11, 5, 5, 2, 8, 4, 7, 7, 8, 5, 6, 4, 8, 5, 2, 10, 6, 5, 4, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1} - mulStrategy := []uint8{2, 15, 9, 8, 14, 12, 2, 8, 5, 15, 8, 15, 6, 6, 3, 2, 0, 10, 9, 13, 1, 12, 3, 7, 1, 10, 8, 11, 2, 15, 14, 1, 11, 12, 14, 3, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0} - initialMul := uint8(8) - - // Precompute lookup table of odd multiples of x for window - // size k=5. - var xx common.Fp - mulP(&xx, x, x) - lookup[0] = *x - for i := 1; i < 16; i++ { - mulP(&lookup[i], &lookup[i-1], &xx) - } - - // Now lookup = {x, x^3, x^5, ... } - // so that lookup[i] = x^{2*i + 1} - // so that lookup[k/2] = x^k, for odd k - *dest = lookup[initialMul] - for i := uint8(0); i < uint8(len(powStrategy)); i++ { - mulP(dest, dest, dest) - for j := uint8(1); j < powStrategy[i]; j++ { - mulP(dest, dest, dest) - } - mulP(dest, dest, &lookup[mulStrategy[i]]) - } -} - -func add(dest, lhs, rhs *common.Fp2) { - addP434(&dest.A, &lhs.A, &rhs.A) - addP434(&dest.B, &lhs.B, &rhs.B) -} - -func sub(dest, lhs, rhs *common.Fp2) { - subP434(&dest.A, &lhs.A, &rhs.A) - subP434(&dest.B, &lhs.B, &rhs.B) -} - -func mul(dest, lhs, rhs *common.Fp2) { - var bMinA, cMinD common.Fp - var ac, bd common.FpX2 - var adPlusBc common.FpX2 - var acMinBd common.FpX2 - - // Let (a,b,c,d) = (lhs.a,lhs.b,rhs.a,rhs.b). - // - // (a + bi)*(c + di) = (a*c - b*d) + (a*d + b*c)i - // - // Use Karatsuba's trick: note that - // - // (b - a)*(c - d) = (b*c + a*d) - a*c - b*d - // - // so (a*d + b*c) = (b-a)*(c-d) + a*c + b*d. - subP434(&bMinA, &lhs.B, &lhs.A) // = (b-a)*R - subP434(&cMinD, &rhs.A, &rhs.B) // = (c-d)*R - mulP434(&ac, &lhs.A, &rhs.A) // = a*c*R*R - mulP434(&bd, &lhs.B, &rhs.B) // = b*d*R*R - mulP434(&adPlusBc, &bMinA, &cMinD) // = (b-a)*(c-d)*R*R - adlP434(&adPlusBc, &adPlusBc, &ac) // = ((b-a)*(c-d) + a*c)*R*R - adlP434(&adPlusBc, &adPlusBc, &bd) // = ((b-a)*(c-d) + a*c + b*d)*R*R - rdcP434(&dest.B, &adPlusBc) // = (a*d + b*c)*R mod p - sulP434(&acMinBd, &ac, &bd) // = (a*c - b*d)*R*R - rdcP434(&dest.A, &acMinBd) // = (a*c - b*d)*R mod p -} - -// Set dest = 1/x -// -// Allowed to overlap dest with x. -// -// Returns dest to allow chaining operations. -func inv(dest, x *common.Fp2) { - var e1, e2 common.FpX2 - var f1, f2 common.Fp - - // We want to compute - // - // 1 1 (a - bi) (a - bi) - // -------- = -------- -------- = ----------- - // (a + bi) (a + bi) (a - bi) (a^2 + b^2) - // - // Letting c = 1/(a^2 + b^2), this is - // - // 1/(a+bi) = a*c - b*ci. - - mulP434(&e1, &x.A, &x.A) // = a*a*R*R - mulP434(&e2, &x.B, &x.B) // = b*b*R*R - adlP434(&e1, &e1, &e2) // = (a^2 + b^2)*R*R - rdcP434(&f1, &e1) // = (a^2 + b^2)*R mod p - // Now f1 = a^2 + b^2 - - mulP(&f2, &f1, &f1) - p34(&f2, &f2) - mulP(&f2, &f2, &f2) - mulP(&f2, &f2, &f1) - - mulP434(&e1, &x.A, &f2) - rdcP434(&dest.A, &e1) - - subP434(&f1, &common.Fp{}, &x.B) - mulP434(&e1, &f1, &f2) - rdcP434(&dest.B, &e1) -} - -func sqr(dest, x *common.Fp2) { - var a2, aPlusB, aMinusB common.Fp - var a2MinB2, ab2 common.FpX2 - - a := &x.A - b := &x.B - - // (a + bi)*(a + bi) = (a^2 - b^2) + 2abi. - addP434(&a2, a, a) // = a*R + a*R = 2*a*R - addP434(&aPlusB, a, b) // = a*R + b*R = (a+b)*R - subP434(&aMinusB, a, b) // = a*R - b*R = (a-b)*R - mulP434(&a2MinB2, &aPlusB, &aMinusB) // = (a+b)*(a-b)*R*R = (a^2 - b^2)*R*R - mulP434(&ab2, &a2, b) // = 2*a*b*R*R - rdcP434(&dest.A, &a2MinB2) // = (a^2 - b^2)*R mod p - rdcP434(&dest.B, &ab2) // = 2*a*b*R mod p -} - -// In case choice == 1, performs following swap in constant time: -// -// xPx <-> xQx -// xPz <-> xQz -// -// Otherwise returns xPx, xPz, xQx, xQz unchanged -func cswap(xPx, xPz, xQx, xQz *common.Fp2, choice uint8) { - cswapP434(&xPx.A, &xQx.A, choice) - cswapP434(&xPx.B, &xQx.B, choice) - cswapP434(&xPz.A, &xQz.A, choice) - cswapP434(&xPz.B, &xQz.B, choice) -} - -// In case choice == 1, performs following moves in constant time: -// -// xPx <- xQx -// xPz <- xQz -// -// Otherwise returns xPx, xPz, xQx, xQz unchanged -func cmov(xPx, xPz, xQx, xQz *common.Fp2, choice uint8) { - cmovP434(&xPx.A, &xQx.A, choice) - cmovP434(&xPx.B, &xQx.B, choice) - cmovP434(&xPz.A, &xQz.A, choice) - cmovP434(&xPz.B, &xQz.B, choice) -} - -func isZero(x *common.Fp2) uint8 { - r64 := uint64(0) - for i := 0; i < FpWords; i++ { - r64 |= x.A[i] | x.B[i] - } - r := uint8(0) - for i := uint64(0); i < 64; i++ { - r |= uint8((r64 >> i) & 0x1) - } - return 1 - r -} - -// Converts in.A and in.B to Montgomery domain and stores -// in 'out' -// out.A = in.A * R mod p -// out.B = in.B * R mod p -// Performs v = v*R^2*R^(-1) mod p, for both in.A and in.B -func ToMontgomery(out, in *common.Fp2) { - var aRR common.FpX2 - - // a*R*R - mulP434(&aRR, &in.A, &P434R2) - // a*R mod p - rdcP434(&out.A, &aRR) - mulP434(&aRR, &in.B, &P434R2) - rdcP434(&out.B, &aRR) -} - -// Converts in.A and in.B from Montgomery domain and stores -// in 'out' -// out.A = in.A mod p -// out.B = in.B mod p -// -// After returning from the call 'in' is not modified. -func FromMontgomery(out, in *common.Fp2) { - var aR common.FpX2 - - // convert from montgomery domain - copy(aR[:], in.A[:]) - rdcP434(&out.A, &aR) // = a mod p in [0, 2p) - modP434(&out.A) // = a mod p in [0, p) - for i := range aR { - aR[i] = 0 - } - copy(aR[:], in.B[:]) - rdcP434(&out.B, &aR) - modP434(&out.B) -} diff --git a/dh/sidh/internal/p434/fp2_test.go b/dh/sidh/internal/p434/fp2_test.go deleted file mode 100644 index ece237f5..00000000 --- a/dh/sidh/internal/p434/fp2_test.go +++ /dev/null @@ -1,245 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p434 - -import ( - "math/rand" - "reflect" - "testing" - "testing/quick" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -type testParams struct { - Point common.ProjectivePoint - Cparam common.ProjectiveCurveParameters - ExtElem common.Fp2 -} - -// Returns true if lhs = rhs. Takes variable time. -func vartimeEqFp2(lhs, rhs *common.Fp2) bool { - a := *lhs - b := *rhs - - modP434(&a.A) - modP434(&a.B) - modP434(&b.A) - modP434(&b.B) - - eq := true - for i := 0; i < FpWords && eq; i++ { - eq = eq && (a.A[i] == b.A[i]) - eq = eq && (a.B[i] == b.B[i]) - } - return eq -} - -func (testParams) generateFp2(rand *rand.Rand) common.Fp2 { - // Generation strategy: low limbs taken from [0,2^64); high limb - // taken from smaller range - // - // Size hint is ignored since all elements are fixed size. - // - // Field elements taken in range [0,2p). Emulate this by capping - // the high limb by the top digit of 2*p-1: - // - // sage: (2*p-1).digits(2^64)[-1] - // - // This still allows generating values >= 2p, but hopefully that - // excess is OK (and if it's not, we'll find out, because it's for - // testing...) - highLimb := rand.Uint64() % P434x2[FpWords-1] - fpElementGen := func() (fp common.Fp) { - for i := 0; i < (FpWords - 1); i++ { - fp[i] = rand.Uint64() - } - fp[FpWords-1] = highLimb - return fp - } - return common.Fp2{A: fpElementGen(), B: fpElementGen()} -} - -func (c testParams) Generate(rand *rand.Rand, size int) reflect.Value { - return reflect.ValueOf( - testParams{ - common.ProjectivePoint{ - X: c.generateFp2(rand), - Z: c.generateFp2(rand), - }, - common.ProjectiveCurveParameters{ - A: c.generateFp2(rand), - C: c.generateFp2(rand), - }, - c.generateFp2(rand), - }) -} - -func TestOne(t *testing.T) { - var tmp common.Fp2 - - mul(&tmp, ¶ms.OneFp2, ¶ms.A.AffineP) - if !vartimeEqFp2(&tmp, ¶ms.A.AffineP) { - t.Error("Not equal 1") - } -} - -func TestFp2ToBytesRoundTrip(t *testing.T) { - roundTrips := func(x testParams) bool { - xBytes := make([]byte, 2*params.Bytelen) - var xPrime common.Fp2 - - common.Fp2ToBytes(xBytes[:], &x.ExtElem, params.Bytelen) - common.BytesToFp2(&xPrime, xBytes[:], params.Bytelen) - return vartimeEqFp2(&xPrime, &x.ExtElem) - } - - if err := quick.Check(roundTrips, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2MulDistributesOverAdd(t *testing.T) { - mulDistributesOverAdd := func(x, y, z testParams) bool { - // Compute t1 = (x+y)*z - t1 := new(common.Fp2) - add(t1, &x.ExtElem, &y.ExtElem) - mul(t1, t1, &z.ExtElem) - - // Compute t2 = x*z + y*z - t2 := new(common.Fp2) - t3 := new(common.Fp2) - mul(t2, &x.ExtElem, &z.ExtElem) - mul(t3, &y.ExtElem, &z.ExtElem) - add(t2, t2, t3) - - return vartimeEqFp2(t1, t2) - } - - if err := quick.Check(mulDistributesOverAdd, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2MulIsAssociative(t *testing.T) { - isAssociative := func(x, y, z testParams) bool { - // Compute t1 = (x*y)*z - t1 := new(common.Fp2) - mul(t1, &x.ExtElem, &y.ExtElem) - mul(t1, t1, &z.ExtElem) - - // Compute t2 = (y*z)*x - t2 := new(common.Fp2) - mul(t2, &y.ExtElem, &z.ExtElem) - mul(t2, t2, &x.ExtElem) - - return vartimeEqFp2(t1, t2) - } - - if err := quick.Check(isAssociative, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2SquareMatchesMul(t *testing.T) { - sqrMatchesMul := func(x testParams) bool { - // Compute t1 = (x*x) - t1 := new(common.Fp2) - mul(t1, &x.ExtElem, &x.ExtElem) - - // Compute t2 = x^2 - t2 := new(common.Fp2) - sqr(t2, &x.ExtElem) - - return vartimeEqFp2(t1, t2) - } - - if err := quick.Check(sqrMatchesMul, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2Inv(t *testing.T) { - inverseIsCorrect := func(x testParams) bool { - z := new(common.Fp2) - inv(z, &x.ExtElem) - - // Now z = (1/x), so (z * x) * x == x - mul(z, z, &x.ExtElem) - mul(z, z, &x.ExtElem) - - return vartimeEqFp2(z, &x.ExtElem) - } - - // This is more expensive; run fewer tests - fasterCheckConfig := &quick.Config{MaxCount: (1 << 11)} - if err := quick.Check(inverseIsCorrect, fasterCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2Batch3Inv(t *testing.T) { - batchInverseIsCorrect := func(x1, x2, x3 testParams) bool { - var x1Inv, x2Inv, x3Inv common.Fp2 - inv(&x1Inv, &x1.ExtElem) - inv(&x2Inv, &x2.ExtElem) - inv(&x3Inv, &x3.ExtElem) - - var y1, y2, y3 common.Fp2 - Fp2Batch3Inv(&x1.ExtElem, &x2.ExtElem, &x3.ExtElem, &y1, &y2, &y3) - - return (vartimeEqFp2(&x1Inv, &y1) && vartimeEqFp2(&x2Inv, &y2) && vartimeEqFp2(&x3Inv, &y3)) - } - - // This is more expensive; run fewer tests - fasterCheckConfig := &quick.Config{MaxCount: (1 << 8)} - if err := quick.Check(batchInverseIsCorrect, fasterCheckConfig); err != nil { - t.Error(err) - } -} - -func BenchmarkFp2Mul(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - mul(w, z, z) - } -} - -func BenchmarkFp2Inv(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - inv(w, z) - } -} - -func BenchmarkFp2Square(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - sqr(w, z) - } -} - -func BenchmarkFp2Add(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - add(w, z, z) - } -} - -func BenchmarkFp2Sub(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - sub(w, z, z) - } -} diff --git a/dh/sidh/internal/p434/params.go b/dh/sidh/internal/p434/params.go deleted file mode 100644 index 3b6e651d..00000000 --- a/dh/sidh/internal/p434/params.go +++ /dev/null @@ -1,202 +0,0 @@ -package p434 - -//go:generate go run ../templates/gen.go P434 - -import ( - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "golang.org/x/sys/cpu" -) - -const ( - // Number of uint64 limbs used to store field element - FpWords = 7 -) - -var ( - // HasADXandBMI2 signals support for ADX and BMI2 - HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX - - // P434 is a prime used by field Fp434 - P434 = common.Fp{ - 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFDC1767AE2FFFFFF, - 0x7BC65C783158AEA3, 0x6CFC5FD681C52056, 0x2341F27177344, - } - - // P434x2 = 2*p434 - 1 - P434x2 = common.Fp{ - 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFB82ECF5C5FFFFFF, - 0xF78CB8F062B15D47, 0xD9F8BFAD038A40AC, 0x4683E4E2EE688, - } - - // P434p1 = p434 + 1 - P434p1 = common.Fp{ - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFDC1767AE3000000, - 0x7BC65C783158AEA3, 0x6CFC5FD681C52056, 0x0002341F27177344, - } - - // P434R2 = (2^448)^2 mod p - P434R2 = common.Fp{ - 0x28E55B65DCD69B30, 0xACEC7367768798C2, 0xAB27973F8311688D, 0x175CC6AF8D6C7C0B, - 0xABCD92BF2DDE347E, 0x69E16A61C7686D9A, 0x000025A89BCDD12A, - } - - // 1/2 * R mod p - half = common.Fp2{ - A: common.Fp{ - 0x0000000000003A16, 0x0000000000000000, 0x0000000000000000, 0x5C87FA027E000000, - 0x6C00D27DAACFD66A, 0x74992A2A2FBBA086, 0x0000767753DE976D, - }, - } - - // 1*R mod p - one = common.Fp2{ - A: common.Fp{ - 0x000000000000742C, 0x0000000000000000, 0x0000000000000000, 0xB90FF404FC000000, - 0xD801A4FB559FACD4, 0xE93254545F77410C, 0x0000ECEEA7BD2EDA, - }, - } - - // 6*R mod p - six = common.Fp2{ - A: common.Fp{ - 0x000000000002B90A, 0x0000000000000000, 0x0000000000000000, 0x5ADCCB2822000000, - 0x187D24F39F0CAFB4, 0x9D353A4D394145A0, 0x00012559A0403298, - }, - } - - P434p1Zeros = 3 - - params = common.SidhParams{ - ID: common.Fp434, - // SIDH public key byte size. - PublicKeySize: 330, - // SIDH shared secret byte size. - SharedSecretSize: 110, - InitCurve: common.ProjectiveCurveParameters{ - A: six, - C: one, - }, - A: common.DomainParams{ - // The x-coordinate of PA - AffineP: common.Fp2{ - A: common.Fp{ - 0x05ADF455C5C345BF, 0x91935C5CC767AC2B, 0xAFE4E879951F0257, 0x70E792DC89FA27B1, - 0xF797F526BB48C8CD, 0x2181DB6131AF621F, 0x00000A1C08B1ECC4, - }, - B: common.Fp{ - 0x74840EB87CDA7788, 0x2971AA0ECF9F9D0B, 0xCB5732BDF41715D5, 0x8CD8E51F7AACFFAA, - 0xA7F424730D7E419F, 0xD671EB919A179E8C, 0x0000FFA26C5A924A, - }, - }, - // The x-coordinate of QA - AffineQ: common.Fp2{ - A: common.Fp{ - 0xFEC6E64588B7273B, 0xD2A626D74CBBF1C6, 0xF8F58F07A78098C7, 0xE23941F470841B03, - 0x1B63EDA2045538DD, 0x735CFEB0FFD49215, 0x0001C4CB77542876, - }, - B: common.Fp{ - 0xADB0F733C17FFDD6, 0x6AFFBD037DA0A050, 0x680EC43DB144E02F, 0x1E2E5D5FF524E374, - 0xE2DDA115260E2995, 0xA6E4B552E2EDE508, 0x00018ECCDDF4B53E, - }, - }, - - // The x-coordinate of RA = PA-QA - AffineR: common.Fp2{ - A: common.Fp{ - 0x01BA4DB518CD6C7D, 0x2CB0251FE3CC0611, 0x259B0C6949A9121B, 0x60E17AC16D2F82AD, - 0x3AA41F1CE175D92D, 0x413FBE6A9B9BC4F3, 0x00022A81D8D55643, - }, - B: common.Fp{ - 0xB8ADBC70FC82E54A, 0xEF9CDDB0D5FADDED, 0x5820C734C80096A0, 0x7799994BAA96E0E4, - 0x044961599E379AF8, 0xDB2B94FBF09F27E2, 0x0000B87FC716C0C6, - }, - }, - // Max size of secret key for 2-torsion group, corresponds to 2^e2 - 1 - SecretBitLen: 216, - // SecretBitLen in bytes. - SecretByteLen: 28, - // 2-torsion group computation strategy - IsogenyStrategy: []uint32{ - 0x30, 0x1C, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, - 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, - 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x0D, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, - 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x04, - 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, - 0x15, 0x0C, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x03, 0x02, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x09, 0x05, 0x03, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, - 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, - }, - }, - B: common.DomainParams{ - // The x-coordinate of PB - AffineP: common.Fp2{ - A: common.Fp{ - 0x6E5497556EDD48A3, 0x2A61B501546F1C05, 0xEB919446D049887D, 0x5864A4A69D450C4F, - 0xB883F276A6490D2B, 0x22CC287022D5F5B9, 0x0001BED4772E551F, - }, - B: common.Fp{ - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - }, - }, - // The x-coordinate of QB - AffineQ: common.Fp2{ - A: common.Fp{ - 0xFAE2A3F93D8B6B8E, 0x494871F51700FE1C, 0xEF1A94228413C27C, 0x498FF4A4AF60BD62, - 0xB00AD2A708267E8A, 0xF4328294E017837F, 0x000034080181D8AE, - }, - B: common.Fp{ - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - }, - }, - // The x-coordinate of RB = PB - QB - AffineR: common.Fp2{ - A: common.Fp{ - 0x283B34FAFEFDC8E4, 0x9208F44977C3E647, 0x7DEAE962816F4E9A, 0x68A2BA8AA262EC9D, - 0x8176F112EA43F45B, 0x02106D022634F504, 0x00007E8A50F02E37, - }, - B: common.Fp{ - 0xB378B7C1DA22CCB1, 0x6D089C99AD1D9230, 0xEBE15711813E2369, 0x2B35A68239D48A53, - 0x445F6FD138407C93, 0xBEF93B29A3F6B54B, 0x000173FA910377D3, - }, - }, - // Size of secret key for 3-torsion group, corresponds to log_2(3^e3) - 1. - SecretBitLen: 217, - // SecretBitLen in bytes. - SecretByteLen: 28, - // 3-torsion group computation strategy - IsogenyStrategy: []uint32{ - 0x42, 0x21, 0x11, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, - 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, - 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, - 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, - 0x01, 0x20, 0x10, 0x08, 0x04, 0x03, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, - 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, - 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, - 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, - }, - }, - OneFp2: one, - HalfFp2: half, - MsgLen: 16, - // SIKEp434 provides 192 bit of classical security ([SIKE], 5.1) - KemSize: 16, - // ceil(434+7/8) - Bytelen: 55, - CiphertextSize: 16 + 330, - } -) - -func init() { - common.Register(common.Fp434, ¶ms) -} diff --git a/dh/sidh/internal/p434/params_test.go b/dh/sidh/internal/p434/params_test.go deleted file mode 100644 index 6e9c219e..00000000 --- a/dh/sidh/internal/p434/params_test.go +++ /dev/null @@ -1,79 +0,0 @@ -package p434 - -// Contains values used by tests -import ( - "testing/quick" - - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Values computed using Sage -var ( - expectedJ = Fp2{ - A: Fp{0x38ECC0A0F53BACB4, 0xF987759E90A6C0DD, 0xC3007B353AE699F6, 0xB2B7E62A4F182414, 0xA65A854B34034F1B, 0xC71EAD20BE427422, 0xFC94F0D8DD51}, - B: Fp{0xFC3B47615764A089, 0x9D32DF1BA8CF22E5, 0x7B895EF92F44C690, 0xE83667F85BBFA475, 0xD44627DCF539CA71, 0x9619A0E7D6657401, 0x4BC5BF1D9B01}, - } - - curveA = Fp2{ - A: Fp{0x13A5A42C36E5E170, 0xC801DC4104E2C1DC, 0xB102AE39A7E24F31, 0x2FB616EA2E824C97, 0xB97073B55448AA67, 0x607266F7204D90DA, 0x1E98FE9739F27}, - B: Fp{0x000000000000742C, 0x0000000000000000, 0x0000000000000000, 0xB90FF404FC000000, 0xD801A4FB559FACD4, 0xE93254545F77410C, 0x0ECEEA7BD2EDA}, - } - - curveC = Fp2{ - A: Fp{0x8CBBA3505E5EDAB2, 0xB1DE7B91FBB77718, 0x6957392BFDC9BEB0, 0xC258E527E05FDDDE, 0x8C5FC7ADF5E50AE9, 0x1B2149FBEC2F4D18, 0x19FC2A5C79942}, - B: Fp{0x000000000000E858, 0x0000000000000000, 0x0000000000000000, 0x721FE809F8000000, 0xB00349F6AB3F59A9, 0xD264A8A8BEEE8219, 0x1D9DD4F7A5DB5}, - } - - affineXP = Fp2{ - A: Fp{0x775C29CA29E5FC3F, 0xCAB15BD1A1AB2754, 0x2C7F5B5DC58096EB, 0x2EE7B0B5A789355A, 0xBBD7BC749FF4D74E, 0x1373A265C9A9D58B, 0x5C183CE99B13}, - B: Fp{0x38CDA704EB4D517C, 0x2F8BA33C91C147D4, 0x4D17E97F04A8D431, 0x5DB8F238AE1B099F, 0x44DC758CE879824C, 0x7E95F1151F6DFA3C, 0xB59F64352B87}, - } - - affineXP2 = Fp2{ - A: Fp{0x2A5C658FD540804D, 0xA27CDB81FA7C6A5C, 0x6C36B6EB38B1B562, 0xC08642D636AF9A51, 0x36B2323A1279F346, 0x530BF3E8726D8B71, 0x61E38F638919}, - B: Fp{0x5D835C52A68FC93D, 0x9E8FAF973A68306C, 0xB3C28FE9D155F61C, 0xCCE6FA22BC1A1FBF, 0xEAB44D8952802BA5, 0xEAAC0F259AAC3A8F, 0x959B242CE01A}, - } - - affineXP4 = Fp2{ - A: Fp{0xF824931762C6DC4A, 0xA9B0FD30136F4B50, 0xAF041BBAB14DC6B1, 0x0AD52F55527A9BA2, 0x282B236D61F08C59, 0x5D3D7EC0C5EB9DCB, 0x10BBDDEA44BF7}, - B: Fp{0x77D92493AF97245B, 0xD717FEC838D464C6, 0xCAACD67DB3BF965D, 0x82D59FB89CDC0711, 0xF13CAE433F39CDE1, 0x9B55DFB11A585FFA, 0x0DC8BA1C054D3}, - } - - affineXP9 = Fp2{ - A: Fp{0x1F6F0785353A02C0, 0xCCB1B8524A63E37F, 0xB283C636B1FDD74C, 0xB76DBFF592DE6FF5, 0x15750EE706F18226, 0x50791362F26E459C, 0x1EA2A9074423}, - B: Fp{0x945C6909DA5039A3, 0x349CFD24FD84FDAF, 0x2FD2F391F2E26E75, 0xEF73E8A634EBDC76, 0x59DDA2622AC22A6C, 0xE0370B80E15F61F4, 0xB302956A0276}, - } - - // Inputs for testing 3-point-ladder - threePointLadderInputs = []ProjectivePoint{ - // x(P) - { - X: Fp2{ - A: Fp{0x43941FA9244C059E, 0xD1F337D076941189, 0x6B6A8B3A8763C96A, 0x6DF569708D6C9482, 0x487EE5707A52F4AA, 0xDE396F6E2559689E, 0xE5EE3895A8991469, 0x2B0946695790A8}, - B: Fp{0xAB552C0FDAED092E, 0x7DF895E43E7DCB1C, 0x35C700E761920C4B, 0xCC5807DD70DC117A, 0x0884039A5A8DB18A, 0xD04620B3D0738052, 0xA200835605138F10, 0x3FF2E59B2FDC6A}, - }, - Z: params.OneFp2, - }, - // x(Q) - { - X: Fp2{ - A: Fp{0x77015826982BA1FD, 0x44024489673471E4, 0x1CAA2A5F4D5DA63B, 0xA183C07E50738C01, 0x8B97782D4E1A0DE6, 0x9B819522FBC38280, 0x0BDA46A937FB7B8A, 0x3B3614305914DF}, - B: Fp{0xBF0366E97B3168D9, 0xAA522AC3879CEF0F, 0x0AF5EC975BD035C8, 0x1F26FEE7BBAC165C, 0xA0EE6A637724A6AB, 0xFB52101E36BA3A38, 0xD29CF5E376E17376, 0x1374A50DF57071}, - }, - Z: params.OneFp2, - }, - // x(P-Q) - { - X: Fp2{ - A: Fp{0xD99279BBD41EA559, 0x35CF18E72F578214, 0x90473B1DC77F73E8, 0xBFFEA930B25D7F66, 0xFD558EA177B900B2, 0x7CFAD273A782A23E, 0x6B1F610822E0F611, 0x26D2D2EF9619B5}, - B: Fp{0x534F83651CBCC75D, 0x591FB4757AED5D08, 0x0B04353D40BED542, 0x829A94703AAC9139, 0x0F9C2E6D7663EB5B, 0x5D2D0F90C283F746, 0x34C872AA12A7676E, 0x0ECDB605FBFA16}, - }, - Z: params.OneFp2, - }, - } - scalar3Pt = [...]uint8{0x9f, 0x3b, 0xe7, 0xf9, 0xf4, 0x7c, 0xe6, 0xce, 0x79, 0x3e, 0x3d, 0x9f, 0x9f, 0x3b, 0xe7, 0xf9, 0xf4, 0x7c, 0xe6, 0xce, 0x79, 0x3e, 0x3d, 0x9f} -) - -var quickCheckConfig = &quick.Config{ - MaxCount: (1 << 15), -} diff --git a/dh/sidh/internal/p503/arith_amd64.s b/dh/sidh/internal/p503/arith_amd64.s deleted file mode 100644 index 0aa77d23..00000000 --- a/dh/sidh/internal/p503/arith_amd64.s +++ /dev/null @@ -1,1718 +0,0 @@ -// +build amd64,!purego - -#include "textflag.h" - -// p503 -#define P503_0 $0xFFFFFFFFFFFFFFFF -#define P503_1 $0xFFFFFFFFFFFFFFFF -#define P503_2 $0xFFFFFFFFFFFFFFFF -#define P503_3 $0xABFFFFFFFFFFFFFF -#define P503_4 $0x13085BDA2211E7A0 -#define P503_5 $0x1B9BF6C87B7E7DAF -#define P503_6 $0x6045C6BDDA77A4D0 -#define P503_7 $0x004066F541811E1E - -// p503+1 -#define P503P1_3 $0xAC00000000000000 -#define P503P1_4 $0x13085BDA2211E7A0 -#define P503P1_5 $0x1B9BF6C87B7E7DAF -#define P503P1_6 $0x6045C6BDDA77A4D0 -#define P503P1_7 $0x004066F541811E1E - -// p503x2 -#define P503X2_0 $0xFFFFFFFFFFFFFFFE -#define P503X2_1 $0xFFFFFFFFFFFFFFFF -#define P503X2_2 $0xFFFFFFFFFFFFFFFF -#define P503X2_3 $0x57FFFFFFFFFFFFFF -#define P503X2_4 $0x2610B7B44423CF41 -#define P503X2_5 $0x3737ED90F6FCFB5E -#define P503X2_6 $0xC08B8D7BB4EF49A0 -#define P503X2_7 $0x0080CDEA83023C3C - -#define REG_P1 DI -#define REG_P2 SI -#define REG_P3 DX - -// Performs schoolbook multiplication of 2 256-bit numbers. This optimized version -// uses MULX instruction. Macro smashes value in DX. -// Input: I0 and I1. -// Output: O -// All the other arguments are registers, used for storing temporary values -#define MULS256_MULX(O, I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ - MOVQ I0, DX \ - MULXQ I1, T1, T0 \ // T0:T1 = A0*B0 - MOVQ T1, O \ // O[0] - MULXQ 8+I1, T2, T1 \ // T1:T2 = U0*V1 - ADDQ T2, T0 \ - MULXQ 16+I1, T3, T2 \ // T2:T3 = U0*V2 - ADCQ T3, T1 \ - MULXQ 24+I1, T4, T3 \ // T3:T4 = U0*V3 - ADCQ T4, T2 \ - \ // Column U1 - MOVQ 8+I0, DX \ - ADCQ $0, T3 \ - MULXQ 0+I1, T4, T5 \ // T5:T4 = U1*V0 - MULXQ 8+I1, T7, T6 \ // T6:T7 = U1*V1 - ADDQ T7, T5 \ - MULXQ 16+I1, T8, T7 \ // T7:T8 = U1*V2 - ADCQ T8, T6 \ - MULXQ 24+I1, T9, T8 \ // T8:T9 = U1*V3 - ADCQ T9, T7 \ - ADCQ $0, T8 \ - ADDQ T0, T4 \ - MOVQ T4, 8+O \ // O[1] - ADCQ T1, T5 \ - ADCQ T2, T6 \ - ADCQ T3, T7 \ - \ // Column U2 - MOVQ 16+I0, DX \ - ADCQ $0, T8 \ - MULXQ 0+I1, T0, T1 \ // T1:T0 = U2*V0 - MULXQ 8+I1, T3, T2 \ // T2:T3 = U2*V1 - ADDQ T3, T1 \ - MULXQ 16+I1, T4, T3 \ // T3:T4 = U2*V2 - ADCQ T4, T2 \ - MULXQ 24+I1, T9, T4 \ // T4:T9 = U2*V3 - ADCQ T9, T3 \ - \ // Column U3 - MOVQ 24+I0, DX \ - ADCQ $0, T4 \ - ADDQ T5, T0 \ - MOVQ T0, 16+O \ // O[2] - ADCQ T6, T1 \ - ADCQ T7, T2 \ - ADCQ T8, T3 \ - ADCQ $0, T4 \ - MULXQ 0+I1, T0, T5 \ // T5:T0 = U3*V0 - MULXQ 8+I1, T7, T6 \ // T6:T7 = U3*V1 - ADDQ T7, T5 \ - MULXQ 16+I1, T8, T7 \ // T7:T8 = U3*V2 - ADCQ T8, T6 \ - MULXQ 24+I1, T9, T8 \ // T8:T9 = U3*V3 - ADCQ T9, T7 \ - ADCQ $0, T8 \ - \ // Add values in remaining columns - ADDQ T0, T1 \ - MOVQ T1, 24+O \ // O[3] - ADCQ T5, T2 \ - MOVQ T2, 32+O \ // O[4] - ADCQ T6, T3 \ - MOVQ T3, 40+O \ // O[5] - ADCQ T7, T4 \ - MOVQ T4, 48+O \ // O[6] - ADCQ $0, T8 \ // O[7] - MOVQ T8, 56+O - -// Performs schoolbook multiplication of 2 256-bit numbers. This optimized version -// uses ADOX, ADCX and MULX instructions. Macro smashes values in AX and DX. -// Input: I0 and I1. -// Output: O -// All the other arguments registers are used for storing temporary values -#define MULS256_MULX_ADCX_ADOX(O, I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ - \ // U0[0] - MOVQ 0+I0, DX \ // MULX requires multiplayer in DX - \ // T0:T1 = I1*DX - MULXQ I1, T1, T0 \ // T0:T1 = U0*V0 (low:high) - MOVQ T1, O \ // O0[0] - MULXQ 8+I1, T2, T1 \ // T2:T1 = U0*V1 - XORQ AX, AX \ - ADOXQ T2, T0 \ - MULXQ 16+I1, T3, T2 \ // T2:T3 = U0*V2 - ADOXQ T3, T1 \ - MULXQ 24+I1, T4, T3 \ // T3:T4 = U0*V3 - ADOXQ T4, T2 \ - \ // Column U1 - MOVQ 8+I0, DX \ - MULXQ I1, T4, T5 \ // T5:T4 = U1*V0 - ADOXQ AX, T3 \ - XORQ AX, AX \ - MULXQ 8+I1, T7, T6 \ // T6:T7 = U1*V1 - ADOXQ T0, T4 \ - MOVQ T4, 8+O \ // O[1] - ADCXQ T7, T5 \ - MULXQ 16+I1, T8, T7 \ // T7:T8 = U1*V2 - ADCXQ T8, T6 \ - ADOXQ T1, T5 \ - MULXQ 24+I1, T9, T8 \ // T8:T9 = U1*V3 - ADCXQ T9, T7 \ - ADCXQ AX, T8 \ - ADOXQ T2, T6 \ - \ // Column U2 - MOVQ 16+I0, DX \ - MULXQ I1, T0, T1 \ // T1:T0 = U2*V0 - ADOXQ T3, T7 \ - ADOXQ AX, T8 \ - XORQ AX, AX \ - MULXQ 8+I1, T3, T2 \ // T2:T3 = U2*V1 - ADOXQ T5, T0 \ - MOVQ T0, 16+O \ // O[2] - ADCXQ T3, T1 \ - MULXQ 16+I1, T4, T3 \ // T3:T4 = U2*V2 - ADCXQ T4, T2 \ - ADOXQ T6, T1 \ - MULXQ 24+I1, T9, T4 \ // T9:T4 = U2*V3 - ADCXQ T9, T3 \ - MOVQ 24+I0, DX \ - ADCXQ AX, T4 \ - \ - ADOXQ T7, T2 \ - ADOXQ T8, T3 \ - ADOXQ AX, T4 \ - \ // Column U3 - MULXQ I1, T0, T5 \ // T5:T0 = U3*B0 - XORQ AX, AX \ - MULXQ 8+I1, T7, T6 \ // T6:T7 = U3*B1 - ADCXQ T7, T5 \ - ADOXQ T0, T1 \ - MULXQ 16+I1, T8, T7 \ // T7:T8 = U3*V2 - ADCXQ T8, T6 \ - ADOXQ T5, T2 \ - MULXQ 24+I1, T9, T8 \ // T8:T9 = U3*V3 - ADCXQ T9, T7 \ - ADCXQ AX, T8 \ - \ - ADOXQ T6, T3 \ - ADOXQ T7, T4 \ - ADOXQ AX, T8 \ - MOVQ T1, 24+O \ // O[3] - MOVQ T2, 32+O \ // O[4] - MOVQ T3, 40+O \ // O[5] - MOVQ T4, 48+O \ // O[6] and O[7] below - MOVQ T8, 56+O - -// Template of a macro that performs schoolbook multiplication of 128-bit with 320-bit -// number. It uses MULX instruction This template must be customized with functions -// performing ADD (add1, add2) and ADD-with-carry (adc1, adc2). addX/adcX may or may -// not be instructions that use two independent carry chains. -// Input: -// * I0 128-bit number -// * I1 320-bit number -// * add1, add2: instruction performing integer addition and starting carry chain -// * adc1, adc2: instruction performing integer addition with carry -// Output: T[0-6] registers -#define MULS_128x320(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, add1, add2, adc1, adc2) \ - \ // Column 0 - MOVQ I0, DX \ - MOVQ I1+24(SB), AX \ - MULXQ AX, T0, T1 \ - MOVQ I1+32(SB), AX \ - MULXQ AX, T4, T2 \ - MOVQ I1+40(SB), AX \ - MULXQ AX, T5, T3 \ - XORQ AX, AX \ - add1 T4, T1 \ - adc1 T5, T2 \ - MOVQ I1+48(SB), AX \ - MULXQ AX, T7, T4 \ - adc1 T7, T3 \ - MOVQ I1+56(SB), AX \ - MULXQ AX, T6, T5 \ - adc1 T6, T4 \ - MOVL $0, AX \ - adc1 AX, T5 \ - \ // Column 1 - MOVQ 8+I0, DX \ - MOVQ I1+24(SB), AX \ - MULXQ AX, T6, T7 \ - add2 T6, T1 \ - adc2 T7, T2 \ - MOVQ I1+32(SB), AX \ - MULXQ AX, T8, T6 \ - adc2 T6, T3 \ - MOVQ I1+40(SB), AX \ - MULXQ AX, T7, T9 \ - adc2 T9, T4 \ - MOVQ I1+48(SB), AX \ - MULXQ AX, T9, T6 \ - adc2 T6, T5 \ - MOVQ I1+56(SB), AX \ - MULXQ AX, DX, T6 \ - MOVL $0, AX \ - adc2 AX, T6 \ - \ // Output - XORQ AX, AX \ - add1 T8, T2 \ - adc1 T7, T3 \ - adc1 T9, T4 \ - adc1 DX, T5 \ - adc1 AX, T6 - -// Multiplies 128-bit with 320-bit integer. Optimized with MULX instruction. -#define MULS_128x320_MULX(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ - MULS_128x320(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, ADDQ, ADDQ, ADCQ, ADCQ) - -// Multiplies 128-bit with 320-bit integer. Optimized with MULX, ADOX and ADCX instructions -#define MULS_128x320_MULX_ADCX_ADOX(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ - MULS_128x320(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, ADOXQ, ADCXQ, ADOXQ, ADCXQ) - -// Template of a macro performing multiplication of two 512-bit numbers. It uses one -// level of Karatsuba and one level of schoolbook multiplication. Template must be -// customized with macro performing schoolbook multiplication. -// Input: -// * I0, I1 - two 512-bit numbers -// * MULS - either MULS256_MULX or MULS256_MULX_ADCX_ADOX -// Output: OUT - 1024-bit long -#define MUL(OUT, I0, I1, MULS) \ - \ // R[8-11]: U1+U0 - XORQ AX, AX \ - MOVQ ( 0)(I0), R8 \ - MOVQ ( 8)(I0), R9 \ - MOVQ (16)(I0), R10 \ - MOVQ (24)(I0), R11 \ - ADDQ (32)(I0), R8 \ - ADCQ (40)(I0), R9 \ - ADCQ (48)(I0), R10 \ - ADCQ (56)(I0), R11 \ - SBBQ $0, AX \ // store mask - MOVQ R8, ( 0)(SP) \ - MOVQ R9, ( 8)(SP) \ - MOVQ R10, (16)(SP) \ - MOVQ R11, (24)(SP) \ - \ - \ // R[12-15]: V1+V0 - XORQ BX, BX \ - MOVQ ( 0)(I1), R12 \ - MOVQ ( 8)(I1), R13 \ - MOVQ (16)(I1), R14 \ - MOVQ (24)(I1), R15 \ - ADDQ (32)(I1), R12 \ - ADCQ (40)(I1), R13 \ - ADCQ (48)(I1), R14 \ - ADCQ (56)(I1), R15 \ - SBBQ $0, BX \ // store mask - MOVQ R12, (32)(SP) \ - MOVQ R13, (40)(SP) \ - MOVQ R14, (48)(SP) \ - MOVQ R15, (56)(SP) \ - \ // Prepare mask for U0+U1 (U1+U0 mod 256^4 if U1+U0 sets carry flag, otherwise 0) - ANDQ AX, R12 \ - ANDQ AX, R13 \ - ANDQ AX, R14 \ - ANDQ AX, R15 \ - \ // Prepare mask for V0+V1 (V1+V0 mod 256^4 if U1+U0 sets carry flag, otherwise 0) - ANDQ BX, R8 \ - ANDQ BX, R9 \ - ANDQ BX, R10 \ - ANDQ BX, R11 \ - \ // res = masked(U0+U1) + masked(V0 + V1) - ADDQ R12, R8 \ - ADCQ R13, R9 \ - ADCQ R14, R10 \ - ADCQ R15, R11 \ - \ // SP[64-96] <- res - MOVQ R8, (64)(SP) \ - MOVQ R9, (72)(SP) \ - MOVQ R10, (80)(SP) \ - MOVQ R11, (88)(SP) \ - \ // BP will be used for schoolbook multiplication below - MOVQ BP, 96(SP) \ // push: BP is Callee-save. - \ // (U1+U0)*(V1+V0) - MULS((64)(OUT), 0(SP), 32(SP), R8, R9, R10, R11, R12, R13, R14, R15, BX, BP) \ - \ // U0 x V0 - MULS(0(OUT), 0(I0), 0(I1), R8, R9, R10, R11, R12, R13, R14, R15, BX, BP) \ - \ // U1 x V1 - MULS(0(SP), 32(I0), 32(I1), R8, R9, R10, R11, R12, R13, R14, R15, BX, BP) \ - \ // Recover BP - MOVQ 96(SP), BP \ // pop: BP is Callee-save. - \ // Final part of schoolbook multiplication; R[8-11] = (U0+U1) x (V0+V1) - MOVQ (64)(SP), R8 \ - MOVQ (72)(SP), R9 \ - MOVQ (80)(SP), R10 \ - MOVQ (88)(SP), R11 \ - MOVQ (96)(OUT), AX \ - ADDQ AX, R8 \ - MOVQ (104)(OUT), AX \ - ADCQ AX, R9 \ - MOVQ (112)(OUT), AX \ - ADCQ AX, R10 \ - MOVQ (120)(OUT), AX \ - ADCQ AX, R11 \ - \ // R[12-15, 8-11] = (U0+U1) x (V0+V1) - U0xV0 - MOVQ (64)(OUT), R12 \ - MOVQ (72)(OUT), R13 \ - MOVQ (80)(OUT), R14 \ - MOVQ (88)(OUT), R15 \ - SUBQ ( 0)(OUT), R12 \ - SBBQ ( 8)(OUT), R13 \ - SBBQ (16)(OUT), R14 \ - SBBQ (24)(OUT), R15 \ - SBBQ (32)(OUT), R8 \ - SBBQ (40)(OUT), R9 \ - SBBQ (48)(OUT), R10 \ - SBBQ (56)(OUT), R11 \ - \ // r8-r15 <- (U0+U1) x (V0+V1) - U0xV0 - U1xV1 - SUBQ ( 0)(SP), R12 \ - SBBQ ( 8)(SP), R13 \ - SBBQ (16)(SP), R14 \ - SBBQ (24)(SP), R15 \ - SBBQ (32)(SP), R8 \ - SBBQ (40)(SP), R9 \ - SBBQ (48)(SP), R10 \ - SBBQ (56)(SP), R11 \ - \ - ; ADDQ (32)(OUT), R12; MOVQ R12, ( 32)(OUT) \ - ; ADCQ (40)(OUT), R13; MOVQ R13, ( 40)(OUT) \ - ; ADCQ (48)(OUT), R14; MOVQ R14, ( 48)(OUT) \ - ; ADCQ (56)(OUT), R15; MOVQ R15, ( 56)(OUT) \ - MOVQ ( 0)(SP), AX; ADCQ AX, R8; MOVQ R8, ( 64)(OUT) \ - MOVQ ( 8)(SP), AX; ADCQ AX, R9; MOVQ R9, ( 72)(OUT) \ - MOVQ (16)(SP), AX; ADCQ AX, R10; MOVQ R10, ( 80)(OUT) \ - MOVQ (24)(SP), AX; ADCQ AX, R11; MOVQ R11, ( 88)(OUT) \ - MOVQ (32)(SP), R12; ADCQ $0, R12; MOVQ R12, ( 96)(OUT) \ - MOVQ (40)(SP), R13; ADCQ $0, R13; MOVQ R13, (104)(OUT) \ - MOVQ (48)(SP), R14; ADCQ $0, R14; MOVQ R14, (112)(OUT) \ - MOVQ (56)(SP), R15; ADCQ $0, R15; MOVQ R15, (120)(OUT) - -// Template for calculating the Montgomery reduction algorithm described in -// section 5.2.3 of https://eprint.iacr.org/2017/1015.pdf. Template must be -// customized with schoolbook multiplication for 128 x 320-bit number. -// This macro reuses memory of IN value and *changes* it. Smashes registers -// R[8-15], BX, CX -// Input: -// * IN: 1024-bit number to be reduced -// * MULS: either MULS_128x320_MULX or MULS_128x320_MULX_ADCX_ADOX -// Output: OUT 512-bit -#define REDC(OUT, IN, MULS) \ - MULS(0(IN), ·P503p1, R8, R9, R10, R11, R12, R13, R14, BX, CX, BP) \ - XORQ R15, R15 \ - ADDQ (24)(IN), R8 \ - ADCQ (32)(IN), R9 \ - ADCQ (40)(IN), R10 \ - ADCQ (48)(IN), R11 \ - ADCQ (56)(IN), R12 \ - ADCQ (64)(IN), R13 \ - ADCQ (72)(IN), R14 \ - ADCQ (80)(IN), R15 \ - MOVQ R8, (24)(IN) \ - MOVQ R9, (32)(IN) \ - MOVQ R10, (40)(IN) \ - MOVQ R11, (48)(IN) \ - MOVQ R12, (56)(IN) \ - MOVQ R13, (64)(IN) \ - MOVQ R14, (72)(IN) \ - MOVQ R15, (80)(IN) \ - MOVQ (88)(IN), R8 \ - MOVQ (96)(IN), R9 \ - MOVQ (104)(IN), R10 \ - MOVQ (112)(IN), R11 \ - MOVQ (120)(IN), R12 \ - ADCQ $0, R8 \ - ADCQ $0, R9 \ - ADCQ $0, R10 \ - ADCQ $0, R11 \ - ADCQ $0, R12 \ - MOVQ R8, (88)(IN) \ - MOVQ R9, (96)(IN) \ - MOVQ R10, (104)(IN) \ - MOVQ R11, (112)(IN) \ - MOVQ R12, (120)(IN) \ - \ - MULS(16(IN), ·P503p1, R8, R9, R10, R11, R12, R13, R14, BX, CX, BP) \ - XORQ R15, R15 \ - ADDQ (40)(IN), R8 \ - ADCQ (48)(IN), R9 \ - ADCQ (56)(IN), R10 \ - ADCQ (64)(IN), R11 \ - ADCQ (72)(IN), R12 \ - ADCQ (80)(IN), R13 \ - ADCQ (88)(IN), R14 \ - ADCQ (96)(IN), R15 \ - MOVQ R8, (40)(IN) \ - MOVQ R9, (48)(IN) \ - MOVQ R10, (56)(IN) \ - MOVQ R11, (64)(IN) \ - MOVQ R12, (72)(IN) \ - MOVQ R13, (80)(IN) \ - MOVQ R14, (88)(IN) \ - MOVQ R15, (96)(IN) \ - MOVQ (104)(IN), R8 \ - MOVQ (112)(IN), R9 \ - MOVQ (120)(IN), R10 \ - ADCQ $0, R8 \ - ADCQ $0, R9 \ - ADCQ $0, R10 \ - MOVQ R8, (104)(IN) \ - MOVQ R9, (112)(IN) \ - MOVQ R10, (120)(IN) \ - \ - MULS(32(IN), ·P503p1, R8, R9, R10, R11, R12, R13, R14, BX, CX, BP) \ - XORQ R15, R15 \ - XORQ BX, BX \ - ADDQ ( 56)(IN), R8 \ - ADCQ ( 64)(IN), R9 \ - ADCQ ( 72)(IN), R10 \ - ADCQ ( 80)(IN), R11 \ - ADCQ ( 88)(IN), R12 \ - ADCQ ( 96)(IN), R13 \ - ADCQ (104)(IN), R14 \ - ADCQ (112)(IN), R15 \ - ADCQ (120)(IN), BX \ - MOVQ R8, ( 56)(IN) \ - MOVQ R10, ( 72)(IN) \ - MOVQ R11, ( 80)(IN) \ - MOVQ R12, ( 88)(IN) \ - MOVQ R13, ( 96)(IN) \ - MOVQ R14, (104)(IN) \ - MOVQ R15, (112)(IN) \ - MOVQ BX, (120)(IN) \ - MOVQ R9, ( 0)(OUT) \ // Result: OUT[0] - \ - MULS(48(IN), ·P503p1, R8, R9, R10, R11, R12, R13, R14, BX, CX, BP) \ - ADDQ ( 72)(IN), R8 \ - ADCQ ( 80)(IN), R9 \ - ADCQ ( 88)(IN), R10 \ - ADCQ ( 96)(IN), R11 \ - ADCQ (104)(IN), R12 \ - ADCQ (112)(IN), R13 \ - ADCQ (120)(IN), R14 \ - MOVQ R8, ( 8)(OUT) \ // Result: OUT[1] - MOVQ R9, (16)(OUT) \ // Result: OUT[2] - MOVQ R10, (24)(OUT) \ // Result: OUT[3] - MOVQ R11, (32)(OUT) \ // Result: OUT[4] - MOVQ R12, (40)(OUT) \ // Result: OUT[5] - MOVQ R13, (48)(OUT) \ // Result: OUT[6] and OUT[7] - MOVQ R14, (56)(OUT) - -TEXT ·modP503(SB), NOSPLIT, $0-8 - MOVQ x+0(FP), REG_P1 - - // Zero AX for later use: - XORQ AX, AX - - // Load p into registers: - MOVQ P503_0, R8 - // P503_{1,2} = P503_0, so reuse R8 - MOVQ P503_3, R9 - MOVQ P503_4, R10 - MOVQ P503_5, R11 - MOVQ P503_6, R12 - MOVQ P503_7, R13 - - // Set x <- x - p - SUBQ R8, ( 0)(REG_P1) - SBBQ R8, ( 8)(REG_P1) - SBBQ R8, (16)(REG_P1) - SBBQ R9, (24)(REG_P1) - SBBQ R10, (32)(REG_P1) - SBBQ R11, (40)(REG_P1) - SBBQ R12, (48)(REG_P1) - SBBQ R13, (56)(REG_P1) - - // Save carry flag indicating x-p < 0 as a mask - SBBQ $0, AX - - // Conditionally add p to x if x-p < 0 - ANDQ AX, R8 - ANDQ AX, R9 - ANDQ AX, R10 - ANDQ AX, R11 - ANDQ AX, R12 - ANDQ AX, R13 - - ADDQ R8, ( 0)(REG_P1) - ADCQ R8, ( 8)(REG_P1) - ADCQ R8, (16)(REG_P1) - ADCQ R9, (24)(REG_P1) - ADCQ R10,(32)(REG_P1) - ADCQ R11,(40)(REG_P1) - ADCQ R12,(48)(REG_P1) - ADCQ R13,(56)(REG_P1) - - RET - -TEXT ·cswapP503(SB),NOSPLIT,$0-17 - - MOVQ x+0(FP), REG_P1 - MOVQ y+8(FP), REG_P2 - MOVB choice+16(FP), AL // AL = 0 or 1 - MOVBLZX AL, AX // AX = 0 or 1 - NEGQ AX // AX = 0x00..00 or 0xff..ff - -#ifndef CSWAP_BLOCK -#define CSWAP_BLOCK(idx) \ - MOVQ (idx*8)(REG_P1), BX \ // BX = x[idx] - MOVQ (idx*8)(REG_P2), CX \ // CX = y[idx] - MOVQ CX, DX \ // DX = y[idx] - XORQ BX, DX \ // DX = y[idx] ^ x[idx] - ANDQ AX, DX \ // DX = (y[idx] ^ x[idx]) & mask - XORQ DX, BX \ // BX = (y[idx] ^ x[idx]) & mask) ^ x[idx] = x[idx] or y[idx] - XORQ DX, CX \ // CX = (y[idx] ^ x[idx]) & mask) ^ y[idx] = y[idx] or x[idx] - MOVQ BX, (idx*8)(REG_P1) \ - MOVQ CX, (idx*8)(REG_P2) -#endif - - CSWAP_BLOCK(0) - CSWAP_BLOCK(1) - CSWAP_BLOCK(2) - CSWAP_BLOCK(3) - CSWAP_BLOCK(4) - CSWAP_BLOCK(5) - CSWAP_BLOCK(6) - CSWAP_BLOCK(7) - -#ifdef CSWAP_BLOCK -#undef CSWAP_BLOCK -#endif - - RET - -TEXT ·cmovP503(SB),NOSPLIT,$0-17 - - MOVQ x+0(FP), DI - MOVQ y+8(FP), SI - MOVB choice+16(FP), AL // AL = 0 or 1 - MOVBLZX AL, AX // AX = 0 or 1 - NEGQ AX // AX = 0x00..00 or 0xff..ff -#ifndef CMOV_BLOCK -#define CMOV_BLOCK(idx) \ - MOVQ (idx*8)(DI), BX \ // BX = x[idx] - MOVQ (idx*8)(SI), DX \ // DX = y[idx] - XORQ BX, DX \ // DX = y[idx] ^ x[idx] - ANDQ AX, DX \ // DX = (y[idx] ^ x[idx]) & mask - XORQ DX, BX \ // BX = (y[idx] ^ x[idx]) & mask) ^ x[idx] = x[idx] or y[idx] - MOVQ BX, (idx*8)(DI) -#endif - CMOV_BLOCK(0) - CMOV_BLOCK(1) - CMOV_BLOCK(2) - CMOV_BLOCK(3) - CMOV_BLOCK(4) - CMOV_BLOCK(5) - CMOV_BLOCK(6) - CMOV_BLOCK(7) -#ifdef CMOV_BLOCK -#undef CMOV_BLOCK -#endif - RET - -TEXT ·addP503(SB),NOSPLIT,$0-24 - - MOVQ z+0(FP), REG_P3 - MOVQ x+8(FP), REG_P1 - MOVQ y+16(FP), REG_P2 - - // Used later to calculate a mask - XORQ CX, CX - - // [R8-R15]: z = x + y - MOVQ ( 0)(REG_P1), R8 - MOVQ ( 8)(REG_P1), R9 - MOVQ (16)(REG_P1), R10 - MOVQ (24)(REG_P1), R11 - MOVQ (32)(REG_P1), R12 - MOVQ (40)(REG_P1), R13 - MOVQ (48)(REG_P1), R14 - MOVQ (56)(REG_P1), R15 - ADDQ ( 0)(REG_P2), R8 - ADCQ ( 8)(REG_P2), R9 - ADCQ (16)(REG_P2), R10 - ADCQ (24)(REG_P2), R11 - ADCQ (32)(REG_P2), R12 - ADCQ (40)(REG_P2), R13 - ADCQ (48)(REG_P2), R14 - ADCQ (56)(REG_P2), R15 - - MOVQ P503X2_0, AX - SUBQ AX, R8 - MOVQ P503X2_1, AX - SBBQ AX, R9 - SBBQ AX, R10 - MOVQ P503X2_3, AX - SBBQ AX, R11 - MOVQ P503X2_4, AX - SBBQ AX, R12 - MOVQ P503X2_5, AX - SBBQ AX, R13 - MOVQ P503X2_6, AX - SBBQ AX, R14 - MOVQ P503X2_7, AX - SBBQ AX, R15 - - // mask - SBBQ $0, CX - - // move z to REG_P3 - MOVQ R8, ( 0)(REG_P3) - MOVQ R9, ( 8)(REG_P3) - MOVQ R10, (16)(REG_P3) - MOVQ R11, (24)(REG_P3) - MOVQ R12, (32)(REG_P3) - MOVQ R13, (40)(REG_P3) - MOVQ R14, (48)(REG_P3) - MOVQ R15, (56)(REG_P3) - - // if z<0 add p503x2 back - MOVQ P503X2_0, R8 - MOVQ P503X2_1, R9 - MOVQ P503X2_3, R10 - MOVQ P503X2_4, R11 - MOVQ P503X2_5, R12 - MOVQ P503X2_6, R13 - MOVQ P503X2_7, R14 - ANDQ CX, R8 - ANDQ CX, R9 - ANDQ CX, R10 - ANDQ CX, R11 - ANDQ CX, R12 - ANDQ CX, R13 - ANDQ CX, R14 - MOVQ ( 0)(REG_P3), AX; ADDQ R8, AX; MOVQ AX, ( 0)(REG_P3) - MOVQ ( 8)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, ( 8)(REG_P3) - MOVQ (16)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, (16)(REG_P3) - MOVQ (24)(REG_P3), AX; ADCQ R10, AX; MOVQ AX, (24)(REG_P3) - MOVQ (32)(REG_P3), AX; ADCQ R11, AX; MOVQ AX, (32)(REG_P3) - MOVQ (40)(REG_P3), AX; ADCQ R12, AX; MOVQ AX, (40)(REG_P3) - MOVQ (48)(REG_P3), AX; ADCQ R13, AX; MOVQ AX, (48)(REG_P3) - MOVQ (56)(REG_P3), AX; ADCQ R14, AX; MOVQ AX, (56)(REG_P3) - RET - -TEXT ·subP503(SB), NOSPLIT, $0-24 - - MOVQ z+0(FP), REG_P3 - MOVQ x+8(FP), REG_P1 - MOVQ y+16(FP), REG_P2 - - // Used later to calculate a mask - XORQ CX, CX - - MOVQ ( 0)(REG_P1), R8 - MOVQ ( 8)(REG_P1), R9 - MOVQ (16)(REG_P1), R10 - MOVQ (24)(REG_P1), R11 - MOVQ (32)(REG_P1), R12 - MOVQ (40)(REG_P1), R13 - MOVQ (48)(REG_P1), R14 - MOVQ (56)(REG_P1), R15 - - SUBQ ( 0)(REG_P2), R8 - SBBQ ( 8)(REG_P2), R9 - SBBQ (16)(REG_P2), R10 - SBBQ (24)(REG_P2), R11 - SBBQ (32)(REG_P2), R12 - SBBQ (40)(REG_P2), R13 - SBBQ (48)(REG_P2), R14 - SBBQ (56)(REG_P2), R15 - - // mask - SBBQ $0, CX - - // store x-y in REG_P3 - MOVQ R8, ( 0)(REG_P3) - MOVQ R9, ( 8)(REG_P3) - MOVQ R10, (16)(REG_P3) - MOVQ R11, (24)(REG_P3) - MOVQ R12, (32)(REG_P3) - MOVQ R13, (40)(REG_P3) - MOVQ R14, (48)(REG_P3) - MOVQ R15, (56)(REG_P3) - - // if z<0 add p503x2 back - MOVQ P503X2_0, R8 - MOVQ P503X2_1, R9 - MOVQ P503X2_3, R10 - MOVQ P503X2_4, R11 - MOVQ P503X2_5, R12 - MOVQ P503X2_6, R13 - MOVQ P503X2_7, R14 - ANDQ CX, R8 - ANDQ CX, R9 - ANDQ CX, R10 - ANDQ CX, R11 - ANDQ CX, R12 - ANDQ CX, R13 - ANDQ CX, R14 - MOVQ ( 0)(REG_P3), AX; ADDQ R8, AX; MOVQ AX, ( 0)(REG_P3) - MOVQ ( 8)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, ( 8)(REG_P3) - MOVQ (16)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, (16)(REG_P3) - MOVQ (24)(REG_P3), AX; ADCQ R10, AX; MOVQ AX, (24)(REG_P3) - MOVQ (32)(REG_P3), AX; ADCQ R11, AX; MOVQ AX, (32)(REG_P3) - MOVQ (40)(REG_P3), AX; ADCQ R12, AX; MOVQ AX, (40)(REG_P3) - MOVQ (48)(REG_P3), AX; ADCQ R13, AX; MOVQ AX, (48)(REG_P3) - MOVQ (56)(REG_P3), AX; ADCQ R14, AX; MOVQ AX, (56)(REG_P3) - - RET - -TEXT ·mulP503(SB), NOSPLIT, $104-24 - MOVQ z+0(FP), CX - MOVQ x+8(FP), REG_P1 - MOVQ y+16(FP), REG_P2 - - // Check whether to use optimized implementation - CMPB ·HasADXandBMI2(SB), $1 - JE mul_with_mulx_adcx_adox - CMPB ·HasBMI2(SB), $1 - JE mul_with_mulx - - // Generic x86 implementation (below) uses variant of Karatsuba method. - // - // Here we store the destination in CX instead of in REG_P3 because the - // multiplication instructions use DX as an implicit destination - // operand: MULQ $REG sets DX:AX <-- AX * $REG. - - // RAX and RDX will be used for a mask (0-borrow) - XORQ AX, AX - - // RCX[0-3]: U1+U0 - MOVQ (32)(REG_P1), R8 - MOVQ (40)(REG_P1), R9 - MOVQ (48)(REG_P1), R10 - MOVQ (56)(REG_P1), R11 - ADDQ ( 0)(REG_P1), R8 - ADCQ ( 8)(REG_P1), R9 - ADCQ (16)(REG_P1), R10 - ADCQ (24)(REG_P1), R11 - MOVQ R8, ( 0)(CX) - MOVQ R9, ( 8)(CX) - MOVQ R10, (16)(CX) - MOVQ R11, (24)(CX) - - SBBQ $0, AX - - // R12-R15: V1+V0 - XORQ DX, DX - MOVQ (32)(REG_P2), R12 - MOVQ (40)(REG_P2), R13 - MOVQ (48)(REG_P2), R14 - MOVQ (56)(REG_P2), R15 - ADDQ ( 0)(REG_P2), R12 - ADCQ ( 8)(REG_P2), R13 - ADCQ (16)(REG_P2), R14 - ADCQ (24)(REG_P2), R15 - - SBBQ $0, DX - - // Store carries on stack - MOVQ AX, (64)(SP) - MOVQ DX, (72)(SP) - - // (SP[0-3],R8,R9,R10,R11) <- (U0+U1)*(V0+V1). - // MUL using comba; In comments below U=U0+U1 V=V0+V1 - - // U0*V0 - MOVQ (CX), AX - MULQ R12 - MOVQ AX, (SP) // C0 - MOVQ DX, R8 - - // U0*V1 - XORQ R9, R9 - MOVQ (CX), AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - - // U1*V0 - XORQ R10, R10 - MOVQ (8)(CX), AX - MULQ R12 - ADDQ AX, R8 - MOVQ R8, (8)(SP) // C1 - ADCQ DX, R9 - ADCQ $0, R10 - - // U0*V2 - XORQ R8, R8 - MOVQ (CX), AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - // U2*V0 - MOVQ (16)(CX), AX - MULQ R12 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - // U1*V1 - MOVQ (8)(CX), AX - MULQ R13 - ADDQ AX, R9 - MOVQ R9, (16)(SP) // C2 - ADCQ DX, R10 - ADCQ $0, R8 - - // U0*V3 - XORQ R9, R9 - MOVQ (CX), AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - // U3*V0 - MOVQ (24)(CX), AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - // U1*V2 - MOVQ (8)(CX), AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - // U2*V1 - MOVQ (16)(CX), AX - MULQ R13 - ADDQ AX, R10 - MOVQ R10, (24)(SP) // C3 - ADCQ DX, R8 - ADCQ $0, R9 - - // U1*V3 - XORQ R10, R10 - MOVQ (8)(CX), AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - // U3*V1 - MOVQ (24)(CX), AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - // U2*V2 - MOVQ (16)(CX), AX - MULQ R14 - ADDQ AX, R8 - MOVQ R8, (32)(SP) // C4 - ADCQ DX, R9 - ADCQ $0, R10 - - // U2*V3 - XORQ R11, R11 - MOVQ (16)(CX), AX - MULQ R15 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R11 - - // U3*V2 - MOVQ (24)(CX), AX - MULQ R14 - ADDQ AX, R9 // C5 - ADCQ DX, R10 - ADCQ $0, R11 - - // U3*V3 - MOVQ (24)(CX), AX - MULQ R15 - ADDQ AX, R10 // C6 - ADCQ DX, R11 // C7 - - MOVQ (64)(SP), AX - ANDQ AX, R12 - ANDQ AX, R13 - ANDQ AX, R14 - ANDQ AX, R15 - ADDQ R8, R12 - ADCQ R9, R13 - ADCQ R10, R14 - ADCQ R11, R15 - - MOVQ (72)(SP), AX - MOVQ (CX), R8 - MOVQ (8)(CX), R9 - MOVQ (16)(CX), R10 - MOVQ (24)(CX), R11 - ANDQ AX, R8 - ANDQ AX, R9 - ANDQ AX, R10 - ANDQ AX, R11 - ADDQ R12, R8 - ADCQ R13, R9 - ADCQ R14, R10 - ADCQ R15, R11 - MOVQ R8, (32)(SP) - MOVQ R9, (40)(SP) - MOVQ R10, (48)(SP) - MOVQ R11, (56)(SP) - - // CX[0-7] <- AL*BL - - // U0*V0 - MOVQ (REG_P1), R11 - MOVQ (REG_P2), AX - MULQ R11 - XORQ R9, R9 - MOVQ AX, (CX) // C0 - MOVQ DX, R8 - - // U0*V1 - MOVQ (16)(REG_P1), R14 - MOVQ (8)(REG_P2), AX - MULQ R11 - XORQ R10, R10 - ADDQ AX, R8 - ADCQ DX, R9 - - // U1*V0 - MOVQ (8)(REG_P1), R12 - MOVQ (REG_P2), AX - MULQ R12 - ADDQ AX, R8 - MOVQ R8, (8)(CX) // C1 - ADCQ DX, R9 - ADCQ $0, R10 - - // U0*V2 - XORQ R8, R8 - MOVQ (16)(REG_P2), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - // U2*V0 - MOVQ (REG_P2), R13 - MOVQ R14, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - // U1*V1 - MOVQ (8)(REG_P2), AX - MULQ R12 - ADDQ AX, R9 - MOVQ R9, (16)(CX) // C2 - ADCQ DX, R10 - ADCQ $0, R8 - - // U0*V3 - XORQ R9, R9 - MOVQ (24)(REG_P2), AX - MULQ R11 - MOVQ (24)(REG_P1), R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - // U3*V1 - MOVQ R15, AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - // U2*V2 - MOVQ (16)(REG_P2), AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - // U2*V3 - MOVQ (8)(REG_P2), AX - MULQ R14 - ADDQ AX, R10 - MOVQ R10, (24)(CX) // C3 - ADCQ DX, R8 - ADCQ $0, R9 - - // U3*V2 - XORQ R10, R10 - MOVQ (24)(REG_P2), AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - // U3*V1 - MOVQ (8)(REG_P2), AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - // U2*V2 - MOVQ (16)(REG_P2), AX - MULQ R14 - ADDQ AX, R8 - MOVQ R8, (32)(CX) // C4 - ADCQ DX, R9 - ADCQ $0, R10 - - // U2*V3 - XORQ R8, R8 - MOVQ (24)(REG_P2), AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - // U3*V2 - MOVQ (16)(REG_P2), AX - MULQ R15 - ADDQ AX, R9 - MOVQ R9, (40)(CX) // C5 - ADCQ DX, R10 - ADCQ $0, R8 - - // U3*V3 - MOVQ (24)(REG_P2), AX - MULQ R15 - ADDQ AX, R10 - MOVQ R10, (48)(CX) // C6 - ADCQ DX, R8 - MOVQ R8, (56)(CX) // C7 - - // CX[8-15] <- U1*V1 - MOVQ (32)(REG_P1), R11 - MOVQ (32)(REG_P2), AX - MULQ R11 - XORQ R9, R9 - MOVQ AX, (64)(CX) // C0 - MOVQ DX, R8 - - MOVQ (48)(REG_P1), R14 - MOVQ (40)(REG_P2), AX - MULQ R11 - XORQ R10, R10 - ADDQ AX, R8 - ADCQ DX, R9 - - MOVQ (40)(REG_P1), R12 - MOVQ (32)(REG_P2), AX - MULQ R12 - ADDQ AX, R8 - MOVQ R8, (72)(CX) // C1 - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ (48)(REG_P2), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (32)(REG_P2), R13 - MOVQ R14, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (40)(REG_P2), AX - MULQ R12 - ADDQ AX, R9 - MOVQ R9, (80)(CX) // C2 - ADCQ DX, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ (56)(REG_P2), AX - MULQ R11 - MOVQ (56)(REG_P1), R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ R15, AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (48)(REG_P2), AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (40)(REG_P2), AX - MULQ R14 - ADDQ AX, R10 - MOVQ R10, (88)(CX) // C3 - ADCQ DX, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ (56)(REG_P2), AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (40)(REG_P2), AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (48)(REG_P2), AX - MULQ R14 - ADDQ AX, R8 - MOVQ R8, (96)(CX) // C4 - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ (56)(REG_P2), AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (48)(REG_P2), AX - MULQ R15 - ADDQ AX, R9 - MOVQ R9, (104)(CX) // C5 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (56)(REG_P2), AX - MULQ R15 - ADDQ AX, R10 - MOVQ R10, (112)(CX) // C6 - ADCQ DX, R8 - MOVQ R8, (120)(CX) // C7 - - // [R8-R15] <- (U0+U1)*(V0+V1) - U1*V1 - MOVQ (SP), R8 - SUBQ (CX), R8 - MOVQ (8)(SP), R9 - SBBQ (8)(CX), R9 - MOVQ (16)(SP), R10 - SBBQ (16)(CX), R10 - MOVQ (24)(SP), R11 - SBBQ (24)(CX), R11 - MOVQ (32)(SP), R12 - SBBQ (32)(CX), R12 - MOVQ (40)(SP), R13 - SBBQ (40)(CX), R13 - MOVQ (48)(SP), R14 - SBBQ (48)(CX), R14 - MOVQ (56)(SP), R15 - SBBQ (56)(CX), R15 - - // [R8-R15] <- (U0+U1)*(V0+V1) - U1*V0 - U0*U1 - MOVQ ( 64)(CX), AX; SUBQ AX, R8 - MOVQ ( 72)(CX), AX; SBBQ AX, R9 - MOVQ ( 80)(CX), AX; SBBQ AX, R10 - MOVQ ( 88)(CX), AX; SBBQ AX, R11 - MOVQ ( 96)(CX), AX; SBBQ AX, R12 - MOVQ (104)(CX), DX; SBBQ DX, R13 - MOVQ (112)(CX), DI; SBBQ DI, R14 - MOVQ (120)(CX), SI; SBBQ SI, R15 - - // Final result - ADDQ (32)(CX), R8; MOVQ R8, (32)(CX) - ADCQ (40)(CX), R9; MOVQ R9, (40)(CX) - ADCQ (48)(CX), R10; MOVQ R10, (48)(CX) - ADCQ (56)(CX), R11; MOVQ R11, (56)(CX) - ADCQ (64)(CX), R12; MOVQ R12, (64)(CX) - ADCQ (72)(CX), R13; MOVQ R13, (72)(CX) - ADCQ (80)(CX), R14; MOVQ R14, (80)(CX) - ADCQ (88)(CX), R15; MOVQ R15, (88)(CX) - ADCQ $0, AX; MOVQ AX, (96)(CX) - ADCQ $0, DX; MOVQ DX, (104)(CX) - ADCQ $0, DI; MOVQ DI, (112)(CX) - ADCQ $0, SI; MOVQ SI, (120)(CX) - RET - -mul_with_mulx_adcx_adox: - // Mul implementation for CPUs supporting two independent carry chain - // (ADOX/ADCX) instructions and carry-less MULX multiplier - MUL(CX, REG_P1, REG_P2, MULS256_MULX_ADCX_ADOX) - RET - -mul_with_mulx: - // Mul implementation for CPUs supporting carry-less MULX multiplier. - MUL(CX, REG_P1, REG_P2, MULS256_MULX) - RET - -TEXT ·rdcP503(SB), $8-16 - MOVQ z+0(FP), REG_P2 - MOVQ x+8(FP), REG_P1 - - // Check whether to use optimized implementation - CMPB ·HasADXandBMI2(SB), $1 - JE redc_with_mulx_adcx_adox - CMPB ·HasBMI2(SB), $1 - JE redc_with_mulx - - MOVQ (REG_P1), R11 - MOVQ P503P1_3, AX - MULQ R11 - XORQ R8, R8 - ADDQ (24)(REG_P1), AX - MOVQ AX, (24)(REG_P2) - ADCQ DX, R8 - - XORQ R9, R9 - MOVQ P503P1_4, AX - MULQ R11 - XORQ R10, R10 - ADDQ AX, R8 - ADCQ DX, R9 - - MOVQ (8)(REG_P1), R12 - MOVQ P503P1_3, AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - ADDQ (32)(REG_P1), R8 - MOVQ R8, (32)(REG_P2) // Z4 - ADCQ $0, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ P503P1_5, AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P503P1_4, AX - MULQ R12 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (16)(REG_P1), R13 - MOVQ P503P1_3, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - ADDQ (40)(REG_P1), R9 - MOVQ R9, (40)(REG_P2) // Z5 - ADCQ $0, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ P503P1_6, AX - MULQ R11 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P503P1_5, AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P503P1_4, AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (24)(REG_P2), R14 - MOVQ P503P1_3, AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - ADDQ (48)(REG_P1), R10 - MOVQ R10, (48)(REG_P2) // Z6 - ADCQ $0, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ P503P1_7, AX - MULQ R11 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P503P1_6, AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P503P1_5, AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P503P1_4, AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (32)(REG_P2), R15 - MOVQ P503P1_3, AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - ADDQ (56)(REG_P1), R8 - MOVQ R8, (56)(REG_P2) // Z7 - ADCQ $0, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ P503P1_7, AX - MULQ R12 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P503P1_6, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P503P1_5, AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P503P1_4, AX - MULQ R15 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (40)(REG_P2), CX - MOVQ P503P1_3, AX - MULQ CX - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - ADDQ (64)(REG_P1), R9 - MOVQ R9, (REG_P2) // Z0 - ADCQ $0, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ P503P1_7, AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P503P1_6, AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P503P1_5, AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P503P1_4, AX - MULQ CX - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (48)(REG_P2), R13 - MOVQ P503P1_3, AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - ADDQ (72)(REG_P1), R10 - MOVQ R10, (8)(REG_P2) // Z1 - ADCQ $0, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ P503P1_7, AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P503P1_6, AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P503P1_5, AX - MULQ CX - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P503P1_4, AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (56)(REG_P2), R14 - MOVQ P503P1_3, AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - ADDQ (80)(REG_P1), R8 - MOVQ R8, (16)(REG_P2) // Z2 - ADCQ $0, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ P503P1_7, AX - MULQ R15 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P503P1_6, AX - MULQ CX - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P503P1_5, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P503P1_4, AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - ADDQ (88)(REG_P1), R9 - MOVQ R9, (24)(REG_P2) // Z3 - ADCQ $0, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ P503P1_7, AX - MULQ CX - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P503P1_6, AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P503P1_5, AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - ADDQ (96)(REG_P1), R10 - MOVQ R10, (32)(REG_P2) // Z4 - ADCQ $0, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ P503P1_7, AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P503P1_6, AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - ADDQ (104)(REG_P1), R8 // Z5 - MOVQ R8, (40)(REG_P2) // Z5 - ADCQ $0, R9 - ADCQ $0, R10 - - MOVQ P503P1_7, AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADDQ (112)(REG_P1), R9 // Z6 - MOVQ R9, (48)(REG_P2) // Z6 - ADCQ $0, R10 - ADDQ (120)(REG_P1), R10 // Z7 - MOVQ R10, (56)(REG_P2) // Z7 - RET - -redc_with_mulx_adcx_adox: - // Implementation of the Montgomery reduction for CPUs - // supporting two independent carry chain (ADOX/ADCX) - // instructions and carry-less MULX multiplier - MOVQ BP, 0(SP) // push: BP is Callee-save. - REDC(REG_P2, REG_P1, MULS_128x320_MULX_ADCX_ADOX) - MOVQ 0(SP), BP // pop: BP is Callee-save. - RET - -redc_with_mulx: - // Implementation of the Montgomery reduction for CPUs - // supporting carry-less MULX multiplier. - MOVQ BP, 0(SP) // push: BP is Callee-save. - REDC(REG_P2, REG_P1, MULS_128x320_MULX) - MOVQ 0(SP), BP // pop: BP is Callee-save. - RET - -TEXT ·adlP503(SB), NOSPLIT, $0-24 - - MOVQ z+0(FP), REG_P3 - MOVQ x+8(FP), REG_P1 - MOVQ y+16(FP), REG_P2 - - MOVQ (REG_P1), R8 - MOVQ (8)(REG_P1), R9 - MOVQ (16)(REG_P1), R10 - MOVQ (24)(REG_P1), R11 - MOVQ (32)(REG_P1), R12 - MOVQ (40)(REG_P1), R13 - MOVQ (48)(REG_P1), R14 - MOVQ (56)(REG_P1), R15 - MOVQ (64)(REG_P1), AX - MOVQ (72)(REG_P1), BX - MOVQ (80)(REG_P1), CX - - ADDQ (REG_P2), R8 - ADCQ (8)(REG_P2), R9 - ADCQ (16)(REG_P2), R10 - ADCQ (24)(REG_P2), R11 - ADCQ (32)(REG_P2), R12 - ADCQ (40)(REG_P2), R13 - ADCQ (48)(REG_P2), R14 - ADCQ (56)(REG_P2), R15 - ADCQ (64)(REG_P2), AX - ADCQ (72)(REG_P2), BX - ADCQ (80)(REG_P2), CX - - MOVQ R8, (REG_P3) - MOVQ R9, (8)(REG_P3) - MOVQ R10, (16)(REG_P3) - MOVQ R11, (24)(REG_P3) - MOVQ R12, (32)(REG_P3) - MOVQ R13, (40)(REG_P3) - MOVQ R14, (48)(REG_P3) - MOVQ R15, (56)(REG_P3) - MOVQ AX, (64)(REG_P3) - MOVQ BX, (72)(REG_P3) - MOVQ CX, (80)(REG_P3) - - MOVQ (88)(REG_P1), R8 - MOVQ (96)(REG_P1), R9 - MOVQ (104)(REG_P1), R10 - MOVQ (112)(REG_P1), R11 - MOVQ (120)(REG_P1), R12 - - ADCQ (88)(REG_P2), R8 - ADCQ (96)(REG_P2), R9 - ADCQ (104)(REG_P2), R10 - ADCQ (112)(REG_P2), R11 - ADCQ (120)(REG_P2), R12 - - MOVQ R8, (88)(REG_P3) - MOVQ R9, (96)(REG_P3) - MOVQ R10, (104)(REG_P3) - MOVQ R11, (112)(REG_P3) - MOVQ R12, (120)(REG_P3) - - RET - -TEXT ·sulP503(SB), NOSPLIT, $0-24 - - MOVQ z+0(FP), REG_P3 - MOVQ x+8(FP), REG_P1 - MOVQ y+16(FP), REG_P2 - // Used later to store result of 0-borrow - XORQ CX, CX - - // SUBC for first 11 limbs - MOVQ (REG_P1), R8 - MOVQ (8)(REG_P1), R9 - MOVQ (16)(REG_P1), R10 - MOVQ (24)(REG_P1), R11 - MOVQ (32)(REG_P1), R12 - MOVQ (40)(REG_P1), R13 - MOVQ (48)(REG_P1), R14 - MOVQ (56)(REG_P1), R15 - MOVQ (64)(REG_P1), AX - MOVQ (72)(REG_P1), BX - - SUBQ (REG_P2), R8 - SBBQ (8)(REG_P2), R9 - SBBQ (16)(REG_P2), R10 - SBBQ (24)(REG_P2), R11 - SBBQ (32)(REG_P2), R12 - SBBQ (40)(REG_P2), R13 - SBBQ (48)(REG_P2), R14 - SBBQ (56)(REG_P2), R15 - SBBQ (64)(REG_P2), AX - SBBQ (72)(REG_P2), BX - - MOVQ R8, (REG_P3) - MOVQ R9, (8)(REG_P3) - MOVQ R10, (16)(REG_P3) - MOVQ R11, (24)(REG_P3) - MOVQ R12, (32)(REG_P3) - MOVQ R13, (40)(REG_P3) - MOVQ R14, (48)(REG_P3) - MOVQ R15, (56)(REG_P3) - MOVQ AX, (64)(REG_P3) - MOVQ BX, (72)(REG_P3) - - // SUBC for last 5 limbs - MOVQ (80)(REG_P1), R8 - MOVQ (88)(REG_P1), R9 - MOVQ (96)(REG_P1), R10 - MOVQ (104)(REG_P1), R11 - MOVQ (112)(REG_P1), R12 - MOVQ (120)(REG_P1), R13 - - SBBQ (80)(REG_P2), R8 - SBBQ (88)(REG_P2), R9 - SBBQ (96)(REG_P2), R10 - SBBQ (104)(REG_P2), R11 - SBBQ (112)(REG_P2), R12 - SBBQ (120)(REG_P2), R13 - - MOVQ R8, (80)(REG_P3) - MOVQ R9, (88)(REG_P3) - MOVQ R10, (96)(REG_P3) - MOVQ R11, (104)(REG_P3) - MOVQ R12, (112)(REG_P3) - MOVQ R13, (120)(REG_P3) - - // Now the carry flag is 1 if x-y < 0. If so, add p*2^512. - SBBQ $0, CX - - // Load p into registers: - MOVQ P503_0, R8 - // P503_{1,2} = P503_0, so reuse R8 - MOVQ P503_3, R9 - MOVQ P503_4, R10 - MOVQ P503_5, R11 - MOVQ P503_6, R12 - MOVQ P503_7, R13 - - ANDQ CX, R8 - ANDQ CX, R9 - ANDQ CX, R10 - ANDQ CX, R11 - ANDQ CX, R12 - ANDQ CX, R13 - - MOVQ (64 )(REG_P3), AX; ADDQ R8, AX; MOVQ AX, (64 )(REG_P3) - MOVQ (64+ 8)(REG_P3), AX; ADCQ R8, AX; MOVQ AX, (64+ 8)(REG_P3) - MOVQ (64+16)(REG_P3), AX; ADCQ R8, AX; MOVQ AX, (64+16)(REG_P3) - MOVQ (64+24)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, (64+24)(REG_P3) - MOVQ (64+32)(REG_P3), AX; ADCQ R10, AX; MOVQ AX, (64+32)(REG_P3) - MOVQ (64+40)(REG_P3), AX; ADCQ R11, AX; MOVQ AX, (64+40)(REG_P3) - MOVQ (64+48)(REG_P3), AX; ADCQ R12, AX; MOVQ AX, (64+48)(REG_P3) - MOVQ (64+56)(REG_P3), AX; ADCQ R13, AX; MOVQ AX, (64+56)(REG_P3) - - RET diff --git a/dh/sidh/internal/p503/arith_amd64_test.go b/dh/sidh/internal/p503/arith_amd64_test.go deleted file mode 100644 index ec9b8e5b..00000000 --- a/dh/sidh/internal/p503/arith_amd64_test.go +++ /dev/null @@ -1,141 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -//go:build amd64 && !purego -// +build amd64,!purego - -package p503 - -import ( - "reflect" - "testing" - "testing/quick" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "golang.org/x/sys/cpu" -) - -type OptimFlag uint - -const ( - // Indicates that optimisation which uses MUL instruction should be used - kUse_MUL OptimFlag = 1 << 0 - // Indicates that optimisation which uses MULX instruction should be used - kUse_MULX = 1 << 1 - // Indicates that optimisation which uses MULX, ADOX and ADCX instructions should be used - kUse_MULXandADxX = 1 << 2 -) - -func resetCpuFeatures() { - HasBMI2 = cpu.X86.HasBMI2 - HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX -} - -// Utility function used for testing Mul implementations. Tests caller provided -// mulFunc against mul() -func testMul(t *testing.T, f1, f2 OptimFlag) { - doMulTest := func(multiplier, multiplicant common.Fp) bool { - defer resetCpuFeatures() - var resMulRef, resMulOptim common.FpX2 - - // Compute multiplier*multiplicant with first implementation - HasBMI2 = (kUse_MULX & f1) == kUse_MULX - HasADXandBMI2 = (kUse_MULXandADxX & f1) == kUse_MULXandADxX - mulP503(&resMulOptim, &multiplier, &multiplicant) - - // Compute multiplier*multiplicant with second implementation - HasBMI2 = (kUse_MULX & f2) == kUse_MULX - HasADXandBMI2 = (kUse_MULXandADxX & f2) == kUse_MULXandADxX - mulP503(&resMulRef, &multiplier, &multiplicant) - - // Compare results - return reflect.DeepEqual(resMulRef, resMulOptim) - } - - if err := quick.Check(doMulTest, quickCheckConfig); err != nil { - t.Error(err) - } -} - -// Utility function used for testing REDC implementations. Tests caller provided -// redcFunc against redc() -func testRedc(t *testing.T, f1, f2 OptimFlag) { - doRedcTest := func(aRR common.FpX2) bool { - defer resetCpuFeatures() - var resRedcF1, resRedcF2 common.Fp - aRRcpy := aRR - - // Compute redc with first implementation - HasBMI2 = (kUse_MULX & f1) == kUse_MULX - HasADXandBMI2 = (kUse_MULXandADxX & f1) == kUse_MULXandADxX - rdcP503(&resRedcF1, &aRR) - - // Compute redc with second implementation - HasBMI2 = (kUse_MULX & f2) == kUse_MULX - HasADXandBMI2 = (kUse_MULXandADxX & f2) == kUse_MULXandADxX - rdcP503(&resRedcF2, &aRRcpy) - - // Compare results - return reflect.DeepEqual(resRedcF2, resRedcF1) - } - - if err := quick.Check(doRedcTest, quickCheckConfig); err != nil { - t.Error(err) - } -} - -// Ensures correctness of implementation of mul operation which uses MULX -func TestMulWithMULX(t *testing.T) { - defer resetCpuFeatures() - if !HasBMI2 { - t.Skip("MULX not supported by the platform") - } - testMul(t, kUse_MULX, kUse_MUL) -} - -// Ensures correctness of implementation of mul operation which uses MULX and ADOX/ADCX -func TestMulWithMULXADxX(t *testing.T) { - defer resetCpuFeatures() - if !HasADXandBMI2 { - t.Skip("MULX, ADCX and ADOX not supported by the platform") - } - testMul(t, kUse_MULXandADxX, kUse_MUL) -} - -// Ensures correctness of implementation of mul operation which uses MULX and ADOX/ADCX -func TestMulWithMULXADxXAgainstMULX(t *testing.T) { - defer resetCpuFeatures() - if !HasADXandBMI2 { - t.Skip("MULX, ADCX and ADOX not supported by the platform") - } - testMul(t, kUse_MULX, kUse_MULXandADxX) -} - -// Ensures correctness of Montgomery reduction implementation which uses MULX -func TestRedcWithMULX(t *testing.T) { - defer resetCpuFeatures() - if !HasBMI2 { - t.Skip("MULX not supported by the platform") - } - testRedc(t, kUse_MULX, kUse_MUL) -} - -// Ensures correctness of Montgomery reduction implementation which uses MULX -// and ADCX/ADOX. -func TestRedcWithMULXADxX(t *testing.T) { - defer resetCpuFeatures() - if !HasADXandBMI2 { - t.Skip("MULX, ADCX and ADOX not supported by the platform") - } - testRedc(t, kUse_MULXandADxX, kUse_MUL) -} - -// Ensures correctness of Montgomery reduction implementation which uses MULX -// and ADCX/ADOX. -func TestRedcWithMULXADxXAgainstMULX(t *testing.T) { - defer resetCpuFeatures() - if !HasADXandBMI2 { - t.Skip("MULX, ADCX and ADOX not supported by the platform") - } - testRedc(t, kUse_MULXandADxX, kUse_MULX) -} diff --git a/dh/sidh/internal/p503/arith_arm64.s b/dh/sidh/internal/p503/arith_arm64.s deleted file mode 100644 index f04c2c65..00000000 --- a/dh/sidh/internal/p503/arith_arm64.s +++ /dev/null @@ -1,805 +0,0 @@ -// +build arm64,!purego - -#include "textflag.h" - - -TEXT ·cmovP503(SB), NOSPLIT, $0-17 - MOVD x+0(FP), R0 - MOVD y+8(FP), R1 - MOVB choice+16(FP), R2 - - // Set flags - // If choice is not 0 or 1, this implementation will swap completely - CMP $0, R2 - - LDP 0(R0), (R3, R4) - LDP 0(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 0(R0) - - LDP 16(R0), (R3, R4) - LDP 16(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 16(R0) - - LDP 32(R0), (R3, R4) - LDP 32(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 32(R0) - - LDP 48(R0), (R3, R4) - LDP 48(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 48(R0) - - RET - -TEXT ·cswapP503(SB), NOSPLIT, $0-17 - MOVD x+0(FP), R0 - MOVD y+8(FP), R1 - MOVB choice+16(FP), R2 - - // Set flags - // If choice is not 0 or 1, this implementation will swap completely - CMP $0, R2 - - LDP 0(R0), (R3, R4) - LDP 0(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 0(R0) - CSEL NE, R3, R5, R9 - CSEL NE, R4, R6, R10 - STP (R9, R10), 0(R1) - - LDP 16(R0), (R3, R4) - LDP 16(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 16(R0) - CSEL NE, R3, R5, R9 - CSEL NE, R4, R6, R10 - STP (R9, R10), 16(R1) - - LDP 32(R0), (R3, R4) - LDP 32(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 32(R0) - CSEL NE, R3, R5, R9 - CSEL NE, R4, R6, R10 - STP (R9, R10), 32(R1) - - LDP 48(R0), (R3, R4) - LDP 48(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 48(R0) - CSEL NE, R3, R5, R9 - CSEL NE, R4, R6, R10 - STP (R9, R10), 48(R1) - - RET - -TEXT ·addP503(SB), NOSPLIT, $0-24 - MOVD z+0(FP), R2 - MOVD x+8(FP), R0 - MOVD y+16(FP), R1 - - // Load first summand into R3-R10 - // Add first summand and second summand and store result in R3-R10 - LDP 0(R0), (R3, R4) - LDP 0(R1), (R11, R12) - LDP 16(R0), (R5, R6) - LDP 16(R1), (R13, R14) - ADDS R11, R3 - ADCS R12, R4 - ADCS R13, R5 - ADCS R14, R6 - - LDP 32(R0), (R7, R8) - LDP 32(R1), (R11, R12) - LDP 48(R0), (R9, R10) - LDP 48(R1), (R13, R14) - ADCS R11, R7 - ADCS R12, R8 - ADCS R13, R9 - ADC R14, R10 - - // Subtract 2 * p503 in R11-R17 from the result in R3-R10 - LDP ·P503x2+0(SB), (R11, R12) - LDP ·P503x2+24(SB), (R13, R14) - SUBS R11, R3 - SBCS R12, R4 - LDP ·P503x2+40(SB), (R15, R16) - SBCS R12, R5 - SBCS R13, R6 - MOVD ·P503x2+56(SB), R17 - SBCS R14, R7 - SBCS R15, R8 - SBCS R16, R9 - SBCS R17, R10 - SBC ZR, ZR, R19 - - // If x + y - 2 * p503 < 0, R19 is 1 and 2 * p503 should be added - AND R19, R11 - AND R19, R12 - AND R19, R13 - AND R19, R14 - AND R19, R15 - AND R19, R16 - AND R19, R17 - - ADDS R11, R3 - ADCS R12, R4 - STP (R3, R4), 0(R2) - ADCS R12, R5 - ADCS R13, R6 - STP (R5, R6), 16(R2) - ADCS R14, R7 - ADCS R15, R8 - STP (R7, R8), 32(R2) - ADCS R16, R9 - ADC R17, R10 - STP (R9, R10), 48(R2) - - RET - -TEXT ·subP503(SB), NOSPLIT, $0-24 - MOVD z+0(FP), R2 - MOVD x+8(FP), R0 - MOVD y+16(FP), R1 - - // Load x into R3-R10 - // Subtract y from x and store result in R3-R10 - LDP 0(R0), (R3, R4) - LDP 0(R1), (R11, R12) - LDP 16(R0), (R5, R6) - LDP 16(R1), (R13, R14) - SUBS R11, R3 - SBCS R12, R4 - SBCS R13, R5 - SBCS R14, R6 - - LDP 32(R0), (R7, R8) - LDP 32(R1), (R11, R12) - LDP 48(R0), (R9, R10) - LDP 48(R1), (R13, R14) - SBCS R11, R7 - SBCS R12, R8 - SBCS R13, R9 - SBCS R14, R10 - SBC ZR, ZR, R19 - - // If x - y < 0, R19 is 1 and 2 * p503 should be added - LDP ·P503x2+0(SB), (R11, R12) - LDP ·P503x2+24(SB), (R13, R14) - AND R19, R11 - AND R19, R12 - LDP ·P503x2+40(SB), (R15, R16) - AND R19, R13 - AND R19, R14 - MOVD ·P503x2+56(SB), R17 - AND R19, R15 - AND R19, R16 - AND R19, R17 - - ADDS R11, R3 - ADCS R12, R4 - STP (R3, R4), 0(R2) - ADCS R12, R5 - ADCS R13, R6 - STP (R5, R6), 16(R2) - ADCS R14, R7 - ADCS R15, R8 - STP (R7, R8), 32(R2) - ADCS R16, R9 - ADC R17, R10 - STP (R9, R10), 48(R2) - - RET - -TEXT ·adlP503(SB), NOSPLIT, $0-24 - MOVD z+0(FP), R2 - MOVD x+8(FP), R0 - MOVD y+16(FP), R1 - - LDP 0(R0), (R3, R4) - LDP 0(R1), (R11, R12) - LDP 16(R0), (R5, R6) - LDP 16(R1), (R13, R14) - ADDS R11, R3 - ADCS R12, R4 - STP (R3, R4), 0(R2) - ADCS R13, R5 - ADCS R14, R6 - STP (R5, R6), 16(R2) - - LDP 32(R0), (R7, R8) - LDP 32(R1), (R11, R12) - LDP 48(R0), (R9, R10) - LDP 48(R1), (R13, R14) - ADCS R11, R7 - ADCS R12, R8 - STP (R7, R8), 32(R2) - ADCS R13, R9 - ADCS R14, R10 - STP (R9, R10), 48(R2) - - LDP 64(R0), (R3, R4) - LDP 64(R1), (R11, R12) - LDP 80(R0), (R5, R6) - LDP 80(R1), (R13, R14) - ADCS R11, R3 - ADCS R12, R4 - STP (R3, R4), 64(R2) - ADCS R13, R5 - ADCS R14, R6 - STP (R5, R6), 80(R2) - - LDP 96(R0), (R7, R8) - LDP 96(R1), (R11, R12) - LDP 112(R0), (R9, R10) - LDP 112(R1), (R13, R14) - ADCS R11, R7 - ADCS R12, R8 - STP (R7, R8), 96(R2) - ADCS R13, R9 - ADC R14, R10 - STP (R9, R10), 112(R2) - - RET - -TEXT ·sulP503(SB), NOSPLIT, $0-24 - MOVD z+0(FP), R2 - MOVD x+8(FP), R0 - MOVD y+16(FP), R1 - - LDP 0(R0), (R3, R4) - LDP 0(R1), (R11, R12) - LDP 16(R0), (R5, R6) - LDP 16(R1), (R13, R14) - SUBS R11, R3 - SBCS R12, R4 - STP (R3, R4), 0(R2) - SBCS R13, R5 - SBCS R14, R6 - STP (R5, R6), 16(R2) - - LDP 32(R0), (R7, R8) - LDP 32(R1), (R11, R12) - LDP 48(R0), (R9, R10) - LDP 48(R1), (R13, R14) - SBCS R11, R7 - SBCS R12, R8 - STP (R7, R8), 32(R2) - SBCS R13, R9 - SBCS R14, R10 - STP (R9, R10), 48(R2) - - LDP 64(R0), (R3, R4) - LDP 64(R1), (R11, R12) - LDP 80(R0), (R5, R6) - LDP 80(R1), (R13, R14) - SBCS R11, R3 - SBCS R12, R4 - SBCS R13, R5 - SBCS R14, R6 - - LDP 96(R0), (R7, R8) - LDP 96(R1), (R11, R12) - LDP 112(R0), (R9, R10) - LDP 112(R1), (R13, R14) - SBCS R11, R7 - SBCS R12, R8 - SBCS R13, R9 - SBCS R14, R10 - SBC ZR, ZR, R15 - - // If x - y < 0, R15 is 1 and p503 should be added - LDP ·P503+16(SB), (R16, R17) - LDP ·P503+32(SB), (R19, R20) - AND R15, R16 - AND R15, R17 - LDP ·P503+48(SB), (R21, R22) - AND R15, R19 - AND R15, R20 - AND R15, R21 - AND R15, R22 - - ADDS R16, R3 - ADCS R16, R4 - STP (R3, R4), 64(R2) - ADCS R16, R5 - ADCS R17, R6 - STP (R5, R6), 80(R2) - ADCS R19, R7 - ADCS R20, R8 - STP (R7, R8), 96(R2) - ADCS R21, R9 - ADC R22, R10 - STP (R9, R10), 112(R2) - - RET - -// Expects that X0*Y0 is already in Z0(low),Z3(high) and X0*Y1 in Z1(low),Z2(high) -// Z0 is not actually touched -// Result of (X0-X1) * (Y0-Y1) will be in Z0-Z3 -// Inputs get overwritten, except for X1 -#define mul128x128comba(X0, X1, Y0, Y1, Z0, Z1, Z2, Z3, T0) \ - MUL X1, Y0, X0 \ - UMULH X1, Y0, Y0 \ - ADDS Z3, Z1 \ - ADC ZR, Z2 \ - \ - MUL Y1, X1, T0 \ - UMULH Y1, X1, Y1 \ - ADDS X0, Z1 \ - ADCS Y0, Z2 \ - ADC ZR, ZR, Z3 \ - \ - ADDS T0, Z2 \ - ADC Y1, Z3 - -// Expects that X points to (X0-X1) -// Result of (X0-X3) * (Y0-Y3) will be in Z0-Z7 -// Inputs get overwritten, except X2-X3 and Y2-Y3 -#define mul256x256karatsuba(X, X0, X1, X2, X3, Y0, Y1, Y2, Y3, Z0, Z1, Z2, Z3, Z4, Z5, Z6, Z7, T0, T1)\ - ADDS X2, X0 \ // xH + xL, destroys xL - ADCS X3, X1 \ - ADCS ZR, ZR, T0 \ - \ - ADDS Y2, Y0, Z6 \ // yH + yL - ADCS Y3, Y1, T1 \ - ADC ZR, ZR, Z7 \ - \ - SUB T0, ZR, Z2 \ - SUB Z7, ZR, Z3 \ - AND Z7, T0 \ // combined carry - \ - AND Z2, Z6, Z0 \ // masked(yH + yL) - AND Z2, T1, Z1 \ - \ - AND Z3, X0, Z4 \ // masked(xH + xL) - AND Z3, X1, Z5 \ - \ - MUL Z6, X0, Z2 \ - MUL T1, X0, Z3 \ - \ - ADDS Z4, Z0 \ - UMULH T1, X0, Z4 \ - ADCS Z5, Z1 \ - UMULH Z6, X0, Z5 \ - ADC ZR, T0 \ - \ // (xH + xL) * (yH + yL) - mul128x128comba(X0, X1, Z6, T1, Z2, Z3, Z4, Z5, Z7)\ - \ - LDP 0+X, (X0, X1) \ - \ - ADDS Z0, Z4 \ - UMULH Y0, X0, Z7 \ - UMULH Y1, X0, T1 \ - ADCS Z1, Z5 \ - MUL Y0, X0, Z0 \ - MUL Y1, X0, Z1 \ - ADC ZR, T0 \ - \ // xL * yL - mul128x128comba(X0, X1, Y0, Y1, Z0, Z1, T1, Z7, Z6)\ - \ - MUL Y2, X2, X0 \ - UMULH Y2, X2, Y0 \ - SUBS Z0, Z2 \ // (xH + xL) * (yH + yL) - xL * yL - SBCS Z1, Z3 \ - SBCS T1, Z4 \ - MUL Y3, X2, X1 \ - UMULH Y3, X2, Z6 \ - SBCS Z7, Z5 \ - SBCS ZR, T0 \ - \ // xH * yH - mul128x128comba(X2, X3, Y2, Y3, X0, X1, Z6, Y0, Y1)\ - \ - SUBS X0, Z2 \ // (xH + xL) * (yH + yL) - xL * yL - xH * yH - SBCS X1, Z3 \ - SBCS Z6, Z4 \ - SBCS Y0, Z5 \ - SBCS ZR, T0 \ - \ - ADDS T1, Z2 \ // (xH * yH) * 2^256 + ((xH + xL) * (yH + yL) - xL * yL - xH * yH) * 2^128 + xL * yL - ADCS Z7, Z3 \ - ADCS X0, Z4 \ - ADCS X1, Z5 \ - ADCS T0, Z6 \ - ADC Y0, ZR, Z7 - - -// This implements two-level Karatsuba with a 128x128 Comba multiplier -// at the bottom -TEXT ·mulP503(SB), NOSPLIT, $0-24 - MOVD z+0(FP), R2 - MOVD x+8(FP), R0 - MOVD y+16(FP), R1 - - // Load xL in R3-R6, xH in R7-R10 - // (xH + xL) in R25-R29 - LDP 0(R0), (R3, R4) - LDP 32(R0), (R7, R8) - ADDS R3, R7, R25 - ADCS R4, R8, R26 - LDP 16(R0), (R5, R6) - LDP 48(R0), (R9, R10) - ADCS R5, R9, R27 - ADCS R6, R10, R29 - ADC ZR, ZR, R7 - - // Load yL in R11-R14, yH in R15-19 - // (yH + yL) in R11-R14, destroys yL - LDP 0(R1), (R11, R12) - LDP 32(R1), (R15, R16) - ADDS R15, R11 - ADCS R16, R12 - LDP 16(R1), (R13, R14) - LDP 48(R1), (R17, R19) - ADCS R17, R13 - ADCS R19, R14 - ADC ZR, ZR, R8 - - // Compute masks and combined carry - SUB R7, ZR, R9 - SUB R8, ZR, R10 - AND R8, R7 - - // masked(yH + yL) - AND R9, R11, R15 - AND R9, R12, R16 - AND R9, R13, R17 - AND R9, R14, R19 - - // masked(xH + xL) - AND R10, R25, R20 - AND R10, R26, R21 - AND R10, R27, R22 - AND R10, R29, R23 - - // masked(xH + xL) + masked(yH + yL) in R15-R19 - ADDS R20, R15 - ADCS R21, R16 - ADCS R22, R17 - ADCS R23, R19 - ADC ZR, R7 - - // Use z as temporary storage - STP (R25, R26), 0(R2) - - // (xH + xL) * (yH + yL) - mul256x256karatsuba(0(R2), R25, R26, R27, R29, R11, R12, R13, R14, R8, R9, R10, R20, R21, R22, R23, R24, R0, R1) - - MOVD x+8(FP), R0 - MOVD y+16(FP), R1 - - ADDS R21, R15 - ADCS R22, R16 - ADCS R23, R17 - ADCS R24, R19 - ADC ZR, R7 - - // Load yL in R11-R14 - LDP 0(R1), (R11, R12) - LDP 16(R1), (R13, R14) - - // xL * yL - mul256x256karatsuba(0(R0), R3, R4, R5, R6, R11, R12, R13, R14, R21, R22, R23, R24, R25, R26, R27, R29, R1, R2) - - MOVD z+0(FP), R2 - MOVD y+16(FP), R1 - - // (xH + xL) * (yH + yL) - xL * yL - SUBS R21, R8 - SBCS R22, R9 - STP (R21, R22), 0(R2) - SBCS R23, R10 - SBCS R24, R20 - STP (R23, R24), 16(R2) - SBCS R25, R15 - SBCS R26, R16 - SBCS R27, R17 - SBCS R29, R19 - SBC ZR, R7 - - // Load xH in R3-R6, yH in R11-R14 - LDP 32(R0), (R3, R4) - LDP 48(R0), (R5, R6) - LDP 32(R1), (R11, R12) - LDP 48(R1), (R13, R14) - - ADDS R25, R8 - ADCS R26, R9 - ADCS R27, R10 - ADCS R29, R20 - ADC ZR, ZR, R1 - - MOVD R20, 32(R2) - - // xH * yH - mul256x256karatsuba(32(R0), R3, R4, R5, R6, R11, R12, R13, R14, R21, R22, R23, R24, R25, R26, R27, R29, R2, R20) - NEG R1, R1 - - MOVD z+0(FP), R2 - MOVD 32(R2), R20 - - // (xH + xL) * (yH + yL) - xL * yL - xH * yH in R8-R10,R20,R15-R19 - // Store lower half in z, that's done - SUBS R21, R8 - SBCS R22, R9 - STP (R8, R9), 32(R2) - SBCS R23, R10 - SBCS R24, R20 - STP (R10, R20), 48(R2) - SBCS R25, R15 - SBCS R26, R16 - SBCS R27, R17 - SBCS R29, R19 - SBC ZR, R7 - - // (xH * yH) * 2^512 + ((xH + xL) * (yH + yL) - xL * yL - xH * yH) * 2^256 + xL * yL - // Store remaining limbs in z - ADDS $1, R1 - ADCS R21, R15 - ADCS R22, R16 - STP (R15, R16), 64(R2) - ADCS R23, R17 - ADCS R24, R19 - STP (R17, R19), 80(R2) - ADCS R7, R25 - ADCS ZR, R26 - STP (R25, R26), 96(R2) - ADCS ZR, R27 - ADC ZR, R29 - STP (R27, R29), 112(R2) - - RET - -// Expects that X0*Y0 is already in Z0(low),Z3(high) and X0*Y1 in Z1(low),Z2(high) -// Z0 is not actually touched -// Result of (X0-X1) * (Y0-Y3) will be in Z0-Z5 -// Inputs remain intact -#define mul128x256comba(X0, X1, Y0, Y1, Y2, Y3, Z0, Z1, Z2, Z3, Z4, Z5, T0, T1, T2, T3)\ - MUL X1, Y0, T0 \ - UMULH X1, Y0, T1 \ - ADDS Z3, Z1 \ - ADC ZR, Z2 \ - \ - MUL X0, Y2, T2 \ - UMULH X0, Y2, T3 \ - ADDS T0, Z1 \ - ADCS T1, Z2 \ - ADC ZR, ZR, Z3 \ - \ - MUL X1, Y1, T0 \ - UMULH X1, Y1, T1 \ - ADDS T2, Z2 \ - ADCS T3, Z3 \ - ADC ZR, ZR, Z4 \ - \ - MUL X0, Y3, T2 \ - UMULH X0, Y3, T3 \ - ADDS T0, Z2 \ - ADCS T1, Z3 \ - ADC ZR, Z4 \ - \ - MUL X1, Y2, T0 \ - UMULH X1, Y2, T1 \ - ADDS T2, Z3 \ - ADCS T3, Z4 \ - ADC ZR, ZR, Z5 \ - \ - MUL X1, Y3, T2 \ - UMULH X1, Y3, T3 \ - ADDS T0, Z3 \ - ADCS T1, Z4 \ - ADC ZR, Z5 \ - ADDS T2, Z4 \ - ADC T3, Z5 - -// This implements the shifted 2^(B*w) Montgomery reduction from -// https://eprint.iacr.org/2016/986.pdf with B = 4, w = 64 -TEXT ·rdcP503(SB), NOSPLIT, $0-16 - MOVD x+8(FP), R0 - - // Load x0-x1 - LDP 0(R0), (R2, R3) - - // Load the prime constant in R25-R29 - LDP ·P503p1s8+32(SB), (R25, R26) - LDP ·P503p1s8+48(SB), (R27, R29) - - // [x0,x1] * p503p1s8 to R4-R9 - MUL R2, R25, R4 // x0 * p503p1s8[0] - UMULH R2, R25, R7 - MUL R2, R26, R5 // x0 * p503p1s8[1] - UMULH R2, R26, R6 - - mul128x256comba(R2, R3, R25, R26, R27, R29, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13) - - LDP 16(R0), (R3, R11) // x2 - LDP 32(R0), (R12, R13) - LDP 48(R0), (R14, R15) - - // Left-shift result in R4-R9 by 56 to R4-R10 - ORR R9>>8, ZR, R10 - LSL $56, R9 - ORR R8>>8, R9 - LSL $56, R8 - ORR R7>>8, R8 - LSL $56, R7 - ORR R6>>8, R7 - LSL $56, R6 - ORR R5>>8, R6 - LSL $56, R5 - ORR R4>>8, R5 - LSL $56, R4 - - ADDS R4, R11 // x3 - ADCS R5, R12 // x4 - ADCS R6, R13 - ADCS R7, R14 - ADCS R8, R15 - LDP 64(R0), (R16, R17) - LDP 80(R0), (R19, R20) - MUL R3, R25, R4 // x2 * p503p1s8[0] - UMULH R3, R25, R7 - ADCS R9, R16 - ADCS R10, R17 - ADCS ZR, R19 - ADCS ZR, R20 - LDP 96(R0), (R21, R22) - LDP 112(R0), (R23, R24) - MUL R3, R26, R5 // x2 * p503p1s8[1] - UMULH R3, R26, R6 - ADCS ZR, R21 - ADCS ZR, R22 - ADCS ZR, R23 - ADC ZR, R24 - - // [x2,x3] * p503p1s8 to R4-R9 - mul128x256comba(R3, R11, R25, R26, R27, R29, R4, R5, R6, R7, R8, R9, R10, R0, R1, R2) - - ORR R9>>8, ZR, R10 - LSL $56, R9 - ORR R8>>8, R9 - LSL $56, R8 - ORR R7>>8, R8 - LSL $56, R7 - ORR R6>>8, R7 - LSL $56, R6 - ORR R5>>8, R6 - LSL $56, R5 - ORR R4>>8, R5 - LSL $56, R4 - - ADDS R4, R13 // x5 - ADCS R5, R14 // x6 - ADCS R6, R15 - ADCS R7, R16 - MUL R12, R25, R4 // x4 * p503p1s8[0] - UMULH R12, R25, R7 - ADCS R8, R17 - ADCS R9, R19 - ADCS R10, R20 - ADCS ZR, R21 - MUL R12, R26, R5 // x4 * p503p1s8[1] - UMULH R12, R26, R6 - ADCS ZR, R22 - ADCS ZR, R23 - ADC ZR, R24 - - // [x4,x5] * p503p1s8 to R4-R9 - mul128x256comba(R12, R13, R25, R26, R27, R29, R4, R5, R6, R7, R8, R9, R10, R0, R1, R2) - - ORR R9>>8, ZR, R10 - LSL $56, R9 - ORR R8>>8, R9 - LSL $56, R8 - ORR R7>>8, R8 - LSL $56, R7 - ORR R6>>8, R7 - LSL $56, R6 - ORR R5>>8, R6 - LSL $56, R5 - ORR R4>>8, R5 - LSL $56, R4 - - ADDS R4, R15 // x7 - ADCS R5, R16 // x8 - ADCS R6, R17 - ADCS R7, R19 - MUL R14, R25, R4 // x6 * p503p1s8[0] - UMULH R14, R25, R7 - ADCS R8, R20 - ADCS R9, R21 - ADCS R10, R22 - MUL R14, R26, R5 // x6 * p503p1s8[1] - UMULH R14, R26, R6 - ADCS ZR, R23 - ADC ZR, R24 - - // [x6,x7] * p503p1s8 to R4-R9 - mul128x256comba(R14, R15, R25, R26, R27, R29, R4, R5, R6, R7, R8, R9, R10, R0, R1, R2) - - ORR R9>>8, ZR, R10 - LSL $56, R9 - ORR R8>>8, R9 - LSL $56, R8 - ORR R7>>8, R8 - LSL $56, R7 - ORR R6>>8, R7 - LSL $56, R6 - ORR R5>>8, R6 - LSL $56, R5 - ORR R4>>8, R5 - LSL $56, R4 - - MOVD z+0(FP), R0 - ADDS R4, R17 - ADCS R5, R19 - STP (R16, R17), 0(R0) // Store final result to z - ADCS R6, R20 - ADCS R7, R21 - STP (R19, R20), 16(R0) - ADCS R8, R22 - ADCS R9, R23 - STP (R21, R22), 32(R0) - ADC R10, R24 - STP (R23, R24), 48(R0) - - RET - -TEXT ·modP503(SB), NOSPLIT, $0-8 - MOVD x+0(FP), R0 - - // Keep x in R1-R8, p503 in R9-R14, subtract to R1-R8 - LDP ·P503+16(SB), (R9, R10) - LDP 0(R0), (R1, R2) - LDP 16(R0), (R3, R4) - SUBS R9, R1 - SBCS R9, R2 - - LDP 32(R0), (R5, R6) - LDP ·P503+32(SB), (R11, R12) - SBCS R9, R3 - SBCS R10, R4 - - LDP 48(R0), (R7, R8) - LDP ·P503+48(SB), (R13, R14) - SBCS R11, R5 - SBCS R12, R6 - - SBCS R13, R7 - SBCS R14, R8 - SBC ZR, ZR, R15 - - // Mask with the borrow and add p503 - AND R15, R9 - AND R15, R10 - AND R15, R11 - AND R15, R12 - AND R15, R13 - AND R15, R14 - - ADDS R9, R1 - ADCS R9, R2 - STP (R1, R2), 0(R0) - ADCS R9, R3 - ADCS R10, R4 - STP (R3, R4), 16(R0) - ADCS R11, R5 - ADCS R12, R6 - STP (R5, R6), 32(R0) - ADCS R13, R7 - ADCS R14, R8 - STP (R7, R8), 48(R0) - - RET diff --git a/dh/sidh/internal/p503/arith_decl.go b/dh/sidh/internal/p503/arith_decl.go deleted file mode 100644 index ed9d01a7..00000000 --- a/dh/sidh/internal/p503/arith_decl.go +++ /dev/null @@ -1,61 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -//go:build (amd64 && !purego) || (arm64 && !purego) -// +build amd64,!purego arm64,!purego - -package p503 - -import ( - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// If choice = 0, leave x unchanged. If choice = 1, sets x to y. -// If choice is neither 0 nor 1 then behaviour is undefined. -// This function executes in constant time. -// -//go:noescape -func cmovP503(x, y *Fp, choice uint8) - -// If choice = 0, leave x,y unchanged. If choice = 1, set x,y = y,x. -// If choice is neither 0 nor 1 then behaviour is undefined. -// This function executes in constant time. -// -//go:noescape -func cswapP503(x, y *Fp, choice uint8) - -// Compute z = x + y (mod p). -// -//go:noescape -func addP503(z, x, y *Fp) - -// Compute z = x - y (mod p). -// -//go:noescape -func subP503(z, x, y *Fp) - -// Compute z = x + y, without reducing mod p. -// -//go:noescape -func adlP503(z, x, y *FpX2) - -// Compute z = x - y, without reducing mod p. -// -//go:noescape -func sulP503(z, x, y *FpX2) - -// Reduce a field element in [0, 2*p) to one in [0,p). -// -//go:noescape -func modP503(x *Fp) - -// Computes z = x * y. -// -//go:noescape -func mulP503(z *FpX2, x, y *Fp) - -// Computes the Montgomery reduction z = x R^{-1} (mod 2*p). On return value -// of x may be changed. z=x not allowed. -// -//go:noescape -func rdcP503(z *Fp, x *FpX2) diff --git a/dh/sidh/internal/p503/arith_generic.go b/dh/sidh/internal/p503/arith_generic.go deleted file mode 100644 index 9d61f16e..00000000 --- a/dh/sidh/internal/p503/arith_generic.go +++ /dev/null @@ -1,203 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -//go:build purego || (!amd64 && !arm64) -// +build purego !amd64,!arm64 - -package p503 - -import ( - "math/bits" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Compute z = x + y (mod p). -func addP503(z, x, y *common.Fp) { - var carry uint64 - - // z=x+y % P503 - for i := 0; i < FpWords; i++ { - z[i], carry = bits.Add64(x[i], y[i], carry) - } - - // z = z - P503x2 - carry = 0 - for i := 0; i < FpWords; i++ { - z[i], carry = bits.Sub64(z[i], P503x2[i], carry) - } - - // if z<0 add P503x2 back - mask := uint64(0 - carry) - carry = 0 - for i := 0; i < FpWords; i++ { - z[i], carry = bits.Add64(z[i], P503x2[i]&mask, carry) - } -} - -// Compute z = x - y (mod p). -func subP503(z, x, y *common.Fp) { - var borrow uint64 - - for i := 0; i < FpWords; i++ { - z[i], borrow = bits.Sub64(x[i], y[i], borrow) - } - - mask := uint64(0 - borrow) - borrow = 0 - - for i := 0; i < FpWords; i++ { - z[i], borrow = bits.Add64(z[i], P503x2[i]&mask, borrow) - } -} - -// If choice = 0, leave x unchanged. If choice = 1, sets x to y. -// If choice is neither 0 nor 1 then behaviour is undefined. -// This function executes in constant time. -func cmovP503(x, y *common.Fp, choice uint8) { - mask := 0 - uint64(choice) - for i := 0; i < FpWords; i++ { - x[i] ^= mask & (x[i] ^ y[i]) - } -} - -// Conditionally swaps bits in x and y in constant time. -// mask indicates bits to be swapped (set bits are swapped) -// For details see "Hackers Delight, 2.20" -// -// Implementation doesn't actually depend on a prime field. -func cswapP503(x, y *common.Fp, mask uint8) { - var tmp, mask64 uint64 - - mask64 = 0 - uint64(mask) - for i := 0; i < FpWords; i++ { - tmp = mask64 & (x[i] ^ y[i]) - x[i] = tmp ^ x[i] - y[i] = tmp ^ y[i] - } -} - -// Perform Montgomery reduction: set z = x R^{-1} (mod 2*p) -// with R=2^(FpWords*64). Destroys the input value. -func rdcP503(z *common.Fp, x *common.FpX2) { - var carry, t, u, v uint64 - var hi, lo uint64 - var count int - - count = P503p1Zeros - - for i := 0; i < FpWords; i++ { - for j := 0; j < i; j++ { - if j < (i - count + 1) { - hi, lo = bits.Mul64(z[j], P503p1[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - } - v, carry = bits.Add64(v, x[i], 0) - u, carry = bits.Add64(u, 0, carry) - t += carry - - z[i] = v - v = u - u = t - t = 0 - } - - for i := FpWords; i < 2*FpWords-1; i++ { - if count > 0 { - count-- - } - for j := i - FpWords + 1; j < FpWords; j++ { - if j < (FpWords - count) { - hi, lo = bits.Mul64(z[j], P503p1[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - } - v, carry = bits.Add64(v, x[i], 0) - u, carry = bits.Add64(u, 0, carry) - - t += carry - z[i-FpWords] = v - v = u - u = t - t = 0 - } - v, _ = bits.Add64(v, x[2*FpWords-1], 0) - z[FpWords-1] = v -} - -// Compute z = x * y. -func mulP503(z *common.FpX2, x, y *common.Fp) { - var u, v, t uint64 - var hi, lo uint64 - var carry uint64 - - for i := uint64(0); i < FpWords; i++ { - for j := uint64(0); j <= i; j++ { - hi, lo = bits.Mul64(x[j], y[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - z[i] = v - v = u - u = t - t = 0 - } - - for i := FpWords; i < (2*FpWords)-1; i++ { - for j := i - FpWords + 1; j < FpWords; j++ { - hi, lo = bits.Mul64(x[j], y[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - z[i] = v - v = u - u = t - t = 0 - } - z[2*FpWords-1] = v -} - -// Compute z = x + y, without reducing mod p. -func adlP503(z, x, y *common.FpX2) { - var carry uint64 - for i := 0; i < 2*FpWords; i++ { - z[i], carry = bits.Add64(x[i], y[i], carry) - } -} - -// Reduce a field element in [0, 2*p) to one in [0,p). -func modP503(x *common.Fp) { - var borrow, mask uint64 - for i := 0; i < FpWords; i++ { - x[i], borrow = bits.Sub64(x[i], P503[i], borrow) - } - - // Sets all bits if borrow = 1 - mask = 0 - borrow - borrow = 0 - for i := 0; i < FpWords; i++ { - x[i], borrow = bits.Add64(x[i], P503[i]&mask, borrow) - } -} - -// Compute z = x - y, without reducing mod p. -func sulP503(z, x, y *common.FpX2) { - var borrow, mask uint64 - for i := 0; i < 2*FpWords; i++ { - z[i], borrow = bits.Sub64(x[i], y[i], borrow) - } - - // Sets all bits if borrow = 1 - mask = 0 - borrow - borrow = 0 - for i := FpWords; i < 2*FpWords; i++ { - z[i], borrow = bits.Add64(z[i], P503[i-FpWords]&mask, borrow) - } -} diff --git a/dh/sidh/internal/p503/arith_test.go b/dh/sidh/internal/p503/arith_test.go deleted file mode 100644 index 515cd594..00000000 --- a/dh/sidh/internal/p503/arith_test.go +++ /dev/null @@ -1,129 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p503 - -import ( - "testing" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Package-level storage for this field element is intended to deter -// compiler optimizations. -var ( - benchmarkFp common.Fp - benchmarkFpX2 common.FpX2 - bench_x = common.Fp{17026702066521327207, 5108203422050077993, 10225396685796065916, 11153620995215874678, 6531160855165088358, 15302925148404145445, 1248821577836769963, 9789766903037985294, 7493111552032041328, 10838999828319306046, 18103257655515297935, 27403304611634} - bench_y = common.Fp{4227467157325093378, 10699492810770426363, 13500940151395637365, 12966403950118934952, 16517692605450415877, 13647111148905630666, 14223628886152717087, 7167843152346903316, 15855377759596736571, 4300673881383687338, 6635288001920617779, 30486099554235} - bench_z = common.FpX2{1595347748594595712, 10854920567160033970, 16877102267020034574, 12435724995376660096, 3757940912203224231, 8251999420280413600, 3648859773438820227, 17622716832674727914, 11029567000887241528, 11216190007549447055, 17606662790980286987, 4720707159513626555, 12887743598335030915, 14954645239176589309, 14178817688915225254, 1191346797768989683, 12629157932334713723, 6348851952904485603, 16444232588597434895, 7809979927681678066, 14642637672942531613, 3092657597757640067, 10160361564485285723, 240071237} -) - -func TestFpCswap(t *testing.T) { - one := common.Fp{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} - two := common.Fp{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2} - - x := one - y := two - - cswapP503(&x, &y, 0) - for i := 0; i < FpWords; i++ { - if (x[i] != one[i]) || (y[i] != two[i]) { - t.Error("Found", x, "expected", one) - } - } - - cswapP503(&x, &y, 1) - for i := 0; i < FpWords; i++ { - if (x[i] != two[i]) || (y[i] != one[i]) { - t.Error("Found", x, "expected", two) - } - } -} - -func TestFpCmov(t *testing.T) { - one := common.Fp{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} - two := common.Fp{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2} - - x := one - y := two - - cmovP503(&x, &y, 0) - for i := 0; i < FpWords; i++ { - if x[i] != one[i] { - t.Error("Found", x, "expected", one) - } - if y[i] != two[i] { - t.Error("Found", y, "expected", two) - } - } - - cmovP503(&x, &y, 1) - for i := 0; i < FpWords; i++ { - if x[i] != two[i] { - t.Error("Found", x, "expected", two) - } - if y[i] != two[i] { - t.Error("Found", y, "expected", two) - } - } -} - -// Benchmarking for field arithmetic -func BenchmarkMul(b *testing.B) { - for n := 0; n < b.N; n++ { - mulP503(&benchmarkFpX2, &bench_x, &bench_y) - } -} - -func BenchmarkRdc(b *testing.B) { - z := bench_z - - // This benchmark actually computes garbage, because - // rdcP503 mangles its input, but since it's - // constant-time that shouldn't matter for the benchmarks. - for n := 0; n < b.N; n++ { - rdcP503(&benchmarkFp, &z) - } -} - -func BenchmarkAdd(b *testing.B) { - for n := 0; n < b.N; n++ { - addP503(&benchmarkFp, &bench_x, &bench_y) - } -} - -func BenchmarkSub(b *testing.B) { - for n := 0; n < b.N; n++ { - subP503(&benchmarkFp, &bench_x, &bench_y) - } -} - -func BenchmarkCswap(b *testing.B) { - x, y := bench_x, bench_y - for n := 0; n < b.N; n++ { - cswapP503(&x, &y, 1) - cswapP503(&x, &y, 0) - } -} - -func BenchmarkMod(b *testing.B) { - x := bench_x - for n := 0; n < b.N; n++ { - modP503(&x) - } -} - -func BenchmarkX2AddLazy(b *testing.B) { - x, y, z := bench_z, bench_z, bench_z - for n := 0; n < b.N; n++ { - adlP503(&x, &y, &z) - } -} - -func BenchmarkX2SubLazy(b *testing.B) { - x, y, z := bench_z, bench_z, bench_z - for n := 0; n < b.N; n++ { - sulP503(&x, &y, &z) - } -} diff --git a/dh/sidh/internal/p503/core.go b/dh/sidh/internal/p503/core.go deleted file mode 100644 index 3cefa17a..00000000 --- a/dh/sidh/internal/p503/core.go +++ /dev/null @@ -1,300 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p503 - -import ( - crand "crypto/rand" - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// ----------------------------------------------------------------------------- -// Functions for traversing isogeny trees according to strategy. Key type 'A' is -// - -// Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed -// for public key generation. -func traverseTreePublicKeyA(curve *ProjectiveCurveParameters, xR, phiP, phiQ, phiR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny4 - - cparam := CalcCurveParamsEquiv4(curve) - strat := params.A.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow2k(xR, &cparam, 2*k) - i += int(k) - } - cparam = phi.GenerateCurve(xR) - - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - phi.EvaluatePoint(phiP) - phi.EvaluatePoint(phiQ) - phi.EvaluatePoint(phiR) - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Traverses isogeny tree in order to compute xR needed -// for public key generation. -func traverseTreeSharedKeyA(curve *ProjectiveCurveParameters, xR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny4 - - cparam := CalcCurveParamsEquiv4(curve) - strat := params.A.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow2k(xR, &cparam, 2*k) - i += int(k) - } - cparam = phi.GenerateCurve(xR) - - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed -// for public key generation. -func traverseTreePublicKeyB(curve *ProjectiveCurveParameters, xR, phiP, phiQ, phiR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny3 - - cparam := CalcCurveParamsEquiv3(curve) - strat := params.B.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow3k(xR, &cparam, k) - i += int(k) - } - - cparam = phi.GenerateCurve(xR) - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - - phi.EvaluatePoint(phiP) - phi.EvaluatePoint(phiQ) - phi.EvaluatePoint(phiR) - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed -// for public key generation. -func traverseTreeSharedKeyB(curve *ProjectiveCurveParameters, xR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny3 - - cparam := CalcCurveParamsEquiv3(curve) - strat := params.B.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow3k(xR, &cparam, k) - i += int(k) - } - - cparam = phi.GenerateCurve(xR) - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Generate a public key in the 2-torsion group. Public key is a set -// of three x-coordinates: xP,xQ,x(P-Q), where P,Q are points on E_a(Fp2) -func PublicKeyGenA(pub3Pt *[3]Fp2, prvBytes []byte) { - var xPA, xQA, xRA ProjectivePoint - var xPB, xQB, xRB, xR ProjectivePoint - var invZP, invZQ, invZR Fp2 - var phi isogeny4 - - // Load points for A - xPA = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - xQA = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - xRA = ProjectivePoint{X: params.A.AffineR, Z: params.OneFp2} - - // Load points for B - xRB = ProjectivePoint{X: params.B.AffineR, Z: params.OneFp2} - xQB = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - xPB = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Find isogeny kernel - xR = ScalarMul3Pt(¶ms.InitCurve, &xPA, &xQA, &xRA, params.A.SecretBitLen, prvBytes) - traverseTreePublicKeyA(¶ms.InitCurve, &xR, &xPB, &xQB, &xRB) - - // Secret isogeny - phi.GenerateCurve(&xR) - xPA = xPB - xQA = xQB - xRA = xRB - phi.EvaluatePoint(&xPA) - phi.EvaluatePoint(&xQA) - phi.EvaluatePoint(&xRA) - Fp2Batch3Inv(&xPA.Z, &xQA.Z, &xRA.Z, &invZP, &invZQ, &invZR) - - mul(&pub3Pt[0], &xPA.X, &invZP) - mul(&pub3Pt[1], &xQA.X, &invZQ) - mul(&pub3Pt[2], &xRA.X, &invZR) -} - -// Generate a public key in the 2-torsion group. Public key is a set -// of three x-coordinates: xP,xQ,x(P-Q), where P,Q are points on E_a(Fp2) -func PublicKeyGenB(pub3Pt *[3]Fp2, prvBytes []byte) { - var xPB, xQB, xRB, xR ProjectivePoint - var xPA, xQA, xRA ProjectivePoint - var invZP, invZQ, invZR Fp2 - var phi isogeny3 - - // Load points for B - xRB = ProjectivePoint{X: params.B.AffineR, Z: params.OneFp2} - xQB = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - xPB = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Load points for A - xPA = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - xQA = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - xRA = ProjectivePoint{X: params.A.AffineR, Z: params.OneFp2} - - // Find isogeny kernel - xR = ScalarMul3Pt(¶ms.InitCurve, &xPB, &xQB, &xRB, params.B.SecretBitLen, prvBytes) - traverseTreePublicKeyB(¶ms.InitCurve, &xR, &xPA, &xQA, &xRA) - - phi.GenerateCurve(&xR) - xPB = xPA - xQB = xQA - xRB = xRA - phi.EvaluatePoint(&xPB) - phi.EvaluatePoint(&xQB) - phi.EvaluatePoint(&xRB) - Fp2Batch3Inv(&xPB.Z, &xQB.Z, &xRB.Z, &invZP, &invZQ, &invZR) - - mul(&pub3Pt[0], &xPB.X, &invZP) - mul(&pub3Pt[1], &xQB.X, &invZQ) - mul(&pub3Pt[2], &xRB.X, &invZR) -} - -// ----------------------------------------------------------------------------- -// Key agreement functions -// - -// Establishing shared keys in in 2-torsion group -func DeriveSecretA(ss, prv []byte, pub3Pt *[3]Fp2) { - var xP, xQ, xQmP ProjectivePoint - var xR ProjectivePoint - var phi isogeny4 - var jInv Fp2 - - // Recover curve coefficients - cparam := params.InitCurve - RecoverCoordinateA(&cparam, &pub3Pt[0], &pub3Pt[1], &pub3Pt[2]) - - // Find kernel of the morphism - xP = ProjectivePoint{X: pub3Pt[0], Z: params.OneFp2} - xQ = ProjectivePoint{X: pub3Pt[1], Z: params.OneFp2} - xQmP = ProjectivePoint{X: pub3Pt[2], Z: params.OneFp2} - xR = ScalarMul3Pt(&cparam, &xP, &xQ, &xQmP, params.A.SecretBitLen, prv) - - // Traverse isogeny tree - traverseTreeSharedKeyA(&cparam, &xR) - - // Calculate j-invariant on isogenous curve - c := phi.GenerateCurve(&xR) - RecoverCurveCoefficients4(&cparam, &c) - Jinvariant(&cparam, &jInv) - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(ss, &jInv, params.Bytelen) -} - -// Establishing shared keys in in 3-torsion group -func DeriveSecretB(ss, prv []byte, pub3Pt *[3]Fp2) { - var xP, xQ, xQmP ProjectivePoint - var xR ProjectivePoint - var phi isogeny3 - var jInv Fp2 - - // Recover curve coefficients - cparam := params.InitCurve - RecoverCoordinateA(&cparam, &pub3Pt[0], &pub3Pt[1], &pub3Pt[2]) - - // Find kernel of the morphism - xP = ProjectivePoint{X: pub3Pt[0], Z: params.OneFp2} - xQ = ProjectivePoint{X: pub3Pt[1], Z: params.OneFp2} - xQmP = ProjectivePoint{X: pub3Pt[2], Z: params.OneFp2} - - //PUBLIC KEY VALIDATION - if err := PublicKeyValidation(&cparam, &xP, &xQ, &xQmP, params.B.SecretBitLen); err != nil { - _, err_read := crand.Read(ss) - if err_read != nil { - panic("core: failed to generate random ss when public key verification fails") - } - return - } - - xR = ScalarMul3Pt(&cparam, &xP, &xQ, &xQmP, params.B.SecretBitLen, prv) - - // Traverse isogeny tree - traverseTreeSharedKeyB(&cparam, &xR) - - // Calculate j-invariant on isogenous curve - c := phi.GenerateCurve(&xR) - RecoverCurveCoefficients3(&cparam, &c) - Jinvariant(&cparam, &jInv) - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(ss, &jInv, params.Bytelen) - -} diff --git a/dh/sidh/internal/p503/curve.go b/dh/sidh/internal/p503/curve.go deleted file mode 100644 index c6d9b24c..00000000 --- a/dh/sidh/internal/p503/curve.go +++ /dev/null @@ -1,431 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p503 - -import ( - "errors" - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "math" -) - -// Stores isogeny 3 curve constants -type isogeny3 struct { - K1 Fp2 - K2 Fp2 -} - -// Stores isogeny 4 curve constants -type isogeny4 struct { - isogeny3 - K3 Fp2 -} - -// Computes j-invariant for a curve y2=x3+A/Cx+x with A,C in F_(p^2). Result -// is returned in jBytes buffer, encoded in little-endian format. Caller -// provided jBytes buffer has to be big enough to j-invariant value. In case -// of SIDH, buffer size must be at least size of shared secret. -// Implementation corresponds to Algorithm 9 from SIKE. -func Jinvariant(cparams *ProjectiveCurveParameters, j *Fp2) { - var t0, t1 Fp2 - - sqr(j, &cparams.A) // j = A^2 - sqr(&t1, &cparams.C) // t1 = C^2 - add(&t0, &t1, &t1) // t0 = t1 + t1 - sub(&t0, j, &t0) // t0 = j - t0 - sub(&t0, &t0, &t1) // t0 = t0 - t1 - sub(j, &t0, &t1) // t0 = t0 - t1 - sqr(&t1, &t1) // t1 = t1^2 - mul(j, j, &t1) // j = j * t1 - add(&t0, &t0, &t0) // t0 = t0 + t0 - add(&t0, &t0, &t0) // t0 = t0 + t0 - sqr(&t1, &t0) // t1 = t0^2 - mul(&t0, &t0, &t1) // t0 = t0 * t1 - add(&t0, &t0, &t0) // t0 = t0 + t0 - add(&t0, &t0, &t0) // t0 = t0 + t0 - inv(j, j) // j = 1/j - mul(j, &t0, j) // j = t0 * j -} - -// Given affine points x(P), x(Q) and x(Q-P) in a extension field F_{p^2}, function -// recovers projective coordinate A of a curve. This is Algorithm 10 from SIKE. -func RecoverCoordinateA(curve *ProjectiveCurveParameters, xp, xq, xr *Fp2) { - var t0, t1 Fp2 - - add(&t1, xp, xq) // t1 = Xp + Xq - mul(&t0, xp, xq) // t0 = Xp * Xq - mul(&curve.A, xr, &t1) // A = X(q-p) * t1 - add(&curve.A, &curve.A, &t0) // A = A + t0 - mul(&t0, &t0, xr) // t0 = t0 * X(q-p) - sub(&curve.A, &curve.A, ¶ms.OneFp2) // A = A - 1 - add(&t0, &t0, &t0) // t0 = t0 + t0 - add(&t1, &t1, xr) // t1 = t1 + X(q-p) - add(&t0, &t0, &t0) // t0 = t0 + t0 - sqr(&curve.A, &curve.A) // A = A^2 - inv(&t0, &t0) // t0 = 1/t0 - mul(&curve.A, &curve.A, &t0) // A = A * t0 - sub(&curve.A, &curve.A, &t1) // A = A - t1 -} - -// Computes equivalence (A:C) ~ (A+2C : A-2C) -func CalcCurveParamsEquiv3(cparams *ProjectiveCurveParameters) CurveCoefficientsEquiv { - var coef CurveCoefficientsEquiv - var c2 Fp2 - - add(&c2, &cparams.C, &cparams.C) - // A24p = A+2*C - add(&coef.A, &cparams.A, &c2) - // A24m = A-2*C - sub(&coef.C, &cparams.A, &c2) - return coef -} - -// Computes equivalence (A:C) ~ (A+2C : 4C) -func CalcCurveParamsEquiv4(cparams *ProjectiveCurveParameters) CurveCoefficientsEquiv { - var coefEq CurveCoefficientsEquiv - - add(&coefEq.C, &cparams.C, &cparams.C) - // A24p = A+2C - add(&coefEq.A, &cparams.A, &coefEq.C) - // C24 = 4*C - add(&coefEq.C, &coefEq.C, &coefEq.C) - return coefEq -} - -// Helper function for RightToLeftLadder(). Returns A+2C / 4. -func CalcAplus2Over4(cparams *ProjectiveCurveParameters) (ret Fp2) { - var tmp Fp2 - - // 2C - add(&tmp, &cparams.C, &cparams.C) - // A+2C - add(&ret, &cparams.A, &tmp) - // 1/4C - add(&tmp, &tmp, &tmp) - inv(&tmp, &tmp) - // A+2C/4C - mul(&ret, &ret, &tmp) - return -} - -// Recovers (A:C) curve parameters from projectively equivalent (A+2C:A-2C). -func RecoverCurveCoefficients3(cparams *ProjectiveCurveParameters, coefEq *CurveCoefficientsEquiv) { - add(&cparams.A, &coefEq.A, &coefEq.C) - // cparams.A = 2*(A+2C+A-2C) = 4A - add(&cparams.A, &cparams.A, &cparams.A) - // cparams.C = (A+2C-A+2C) = 4C - sub(&cparams.C, &coefEq.A, &coefEq.C) - return -} - -// Recovers (A:C) curve parameters from projectively equivalent (A+2C:4C). -func RecoverCurveCoefficients4(cparams *ProjectiveCurveParameters, coefEq *CurveCoefficientsEquiv) { - // cparams.C = (4C)*1/2=2C - mul(&cparams.C, &coefEq.C, ¶ms.HalfFp2) - // cparams.A = A+2C - 2C = A - sub(&cparams.A, &coefEq.A, &cparams.C) - // cparams.C = 2C * 1/2 = C - mul(&cparams.C, &cparams.C, ¶ms.HalfFp2) -} - -// Combined coordinate doubling and differential addition. Takes projective points -// P,Q,Q-P and (A+2C)/4C curve E coefficient. Returns 2*P and P+Q calculated on E. -// Function is used only by RightToLeftLadder. Corresponds to Algorithm 5 of SIKE -func xDbladd(P, Q, QmP *ProjectivePoint, a24 *Fp2) (dblP, PaQ ProjectivePoint) { - var t0, t1, t2 Fp2 - - xQmP, zQmP := &QmP.X, &QmP.Z - xPaQ, zPaQ := &PaQ.X, &PaQ.Z - x2P, z2P := &dblP.X, &dblP.Z - xP, zP := &P.X, &P.Z - xQ, zQ := &Q.X, &Q.Z - - add(&t0, xP, zP) // t0 = Xp+Zp - sub(&t1, xP, zP) // t1 = Xp-Zp - sqr(x2P, &t0) // 2P.X = t0^2 - sub(&t2, xQ, zQ) // t2 = Xq-Zq - add(xPaQ, xQ, zQ) // Xp+q = Xq+Zq - mul(&t0, &t0, &t2) // t0 = t0 * t2 - mul(z2P, &t1, &t1) // 2P.Z = t1 * t1 - mul(&t1, &t1, xPaQ) // t1 = t1 * Xp+q - sub(&t2, x2P, z2P) // t2 = 2P.X - 2P.Z - mul(x2P, x2P, z2P) // 2P.X = 2P.X * 2P.Z - mul(xPaQ, a24, &t2) // Xp+q = A24 * t2 - sub(zPaQ, &t0, &t1) // Zp+q = t0 - t1 - add(z2P, xPaQ, z2P) // 2P.Z = Xp+q + 2P.Z - add(xPaQ, &t0, &t1) // Xp+q = t0 + t1 - mul(z2P, z2P, &t2) // 2P.Z = 2P.Z * t2 - sqr(zPaQ, zPaQ) // Zp+q = Zp+q ^ 2 - sqr(xPaQ, xPaQ) // Xp+q = Xp+q ^ 2 - mul(zPaQ, xQmP, zPaQ) // Zp+q = Xq-p * Zp+q - mul(xPaQ, zQmP, xPaQ) // Xp+q = Zq-p * Xp+q - return -} - -// Given the curve parameters, xP = x(P), computes xP = x([2^k]P) -// Safe to overlap xP, x2P. -func Pow2k(xP *ProjectivePoint, params *CurveCoefficientsEquiv, k uint32) { - var t0, t1 Fp2 - - x, z := &xP.X, &xP.Z - for i := uint32(0); i < k; i++ { - sub(&t0, x, z) // t0 = Xp - Zp - add(&t1, x, z) // t1 = Xp + Zp - sqr(&t0, &t0) // t0 = t0 ^ 2 - sqr(&t1, &t1) // t1 = t1 ^ 2 - mul(z, ¶ms.C, &t0) // Z2p = C24 * t0 - mul(x, z, &t1) // X2p = Z2p * t1 - sub(&t1, &t1, &t0) // t1 = t1 - t0 - mul(&t0, ¶ms.A, &t1) // t0 = A24+ * t1 - add(z, z, &t0) // Z2p = Z2p + t0 - mul(z, z, &t1) // Zp = Z2p * t1 - } -} - -// Given the curve parameters, xP = x(P), and k >= 0, compute xP = x([3^k]P). -// -// Safe to overlap xP, xR. -func Pow3k(xP *ProjectivePoint, params *CurveCoefficientsEquiv, k uint32) { - var t0, t1, t2, t3, t4, t5, t6 Fp2 - - x, z := &xP.X, &xP.Z - for i := uint32(0); i < k; i++ { - sub(&t0, x, z) // t0 = Xp - Zp - sqr(&t2, &t0) // t2 = t0^2 - add(&t1, x, z) // t1 = Xp + Zp - sqr(&t3, &t1) // t3 = t1^2 - add(&t4, &t1, &t0) // t4 = t1 + t0 - sub(&t0, &t1, &t0) // t0 = t1 - t0 - sqr(&t1, &t4) // t1 = t4^2 - sub(&t1, &t1, &t3) // t1 = t1 - t3 - sub(&t1, &t1, &t2) // t1 = t1 - t2 - mul(&t5, &t3, ¶ms.A) // t5 = t3 * A24+ - mul(&t3, &t3, &t5) // t3 = t5 * t3 - mul(&t6, &t2, ¶ms.C) // t6 = t2 * A24- - mul(&t2, &t2, &t6) // t2 = t2 * t6 - sub(&t3, &t2, &t3) // t3 = t2 - t3 - sub(&t2, &t5, &t6) // t2 = t5 - t6 - mul(&t1, &t2, &t1) // t1 = t2 * t1 - add(&t2, &t3, &t1) // t2 = t3 + t1 - sqr(&t2, &t2) // t2 = t2^2 - mul(x, &t2, &t4) // X3p = t2 * t4 - sub(&t1, &t3, &t1) // t1 = t3 - t1 - sqr(&t1, &t1) // t1 = t1^2 - mul(z, &t1, &t0) // Z3p = t1 * t0 - } -} - -// Set (y1, y2, y3) = (1/x1, 1/x2, 1/x3). -// -// All xi, yi must be distinct. -func Fp2Batch3Inv(x1, x2, x3, y1, y2, y3 *Fp2) { - var x1x2, t Fp2 - - mul(&x1x2, x1, x2) // x1*x2 - mul(&t, &x1x2, x3) // 1/(x1*x2*x3) - inv(&t, &t) - mul(y1, &t, x2) // 1/x1 - mul(y1, y1, x3) - mul(y2, &t, x1) // 1/x2 - mul(y2, y2, x3) - mul(y3, &t, &x1x2) // 1/x3 -} - -// Scalarmul3Pt is a right-to-left point multiplication that given the -// x-coordinate of P, Q and P-Q calculates the x-coordinate of R=Q+[scalar]P. -// nbits must be smaller or equal to len(scalar). -func ScalarMul3Pt(cparams *ProjectiveCurveParameters, P, Q, PmQ *ProjectivePoint, nbits uint, scalar []uint8) ProjectivePoint { - var R0, R2, R1 ProjectivePoint - aPlus2Over4 := CalcAplus2Over4(cparams) - R1 = *P - R2 = *PmQ - R0 = *Q - - // Iterate over the bits of the scalar, bottom to top - prevBit := uint8(0) - for i := uint(0); i < nbits; i++ { - bit := (scalar[i>>3] >> (i & 7) & 1) - swap := prevBit ^ bit - prevBit = bit - cswap(&R1.X, &R1.Z, &R2.X, &R2.Z, swap) - R0, R2 = xDbladd(&R0, &R2, &R1, &aPlus2Over4) - } - cswap(&R1.X, &R1.Z, &R2.X, &R2.Z, prevBit) - return R1 -} - -// Given a three-torsion point p = x(PB) on the curve E_(A:C), construct the -// three-isogeny phi : E_(A:C) -> E_(A:C)/ = E_(A':C'). -// -// Input: (XP_3: ZP_3), where P_3 has exact order 3 on E_A/C -// Output: -// - Curve coordinates (A' + 2C', A' - 2C') corresponding to E_A'/C' = A_E/C/ -// - Isogeny phi with constants in F_p^2 -func (phi *isogeny3) GenerateCurve(p *ProjectivePoint) CurveCoefficientsEquiv { - var t0, t1, t2, t3, t4 Fp2 - var coefEq CurveCoefficientsEquiv - K1, K2 := &phi.K1, &phi.K2 - - sub(K1, &p.X, &p.Z) // K1 = XP3 - ZP3 - sqr(&t0, K1) // t0 = K1^2 - add(K2, &p.X, &p.Z) // K2 = XP3 + ZP3 - sqr(&t1, K2) // t1 = K2^2 - add(&t2, &t0, &t1) // t2 = t0 + t1 - add(&t3, K1, K2) // t3 = K1 + K2 - sqr(&t3, &t3) // t3 = t3^2 - sub(&t3, &t3, &t2) // t3 = t3 - t2 - add(&t2, &t1, &t3) // t2 = t1 + t3 - add(&t3, &t3, &t0) // t3 = t3 + t0 - add(&t4, &t3, &t0) // t4 = t3 + t0 - add(&t4, &t4, &t4) // t4 = t4 + t4 - add(&t4, &t1, &t4) // t4 = t1 + t4 - mul(&coefEq.C, &t2, &t4) // A24m = t2 * t4 - add(&t4, &t1, &t2) // t4 = t1 + t2 - add(&t4, &t4, &t4) // t4 = t4 + t4 - add(&t4, &t0, &t4) // t4 = t0 + t4 - mul(&t4, &t3, &t4) // t4 = t3 * t4 - sub(&t0, &t4, &coefEq.C) // t0 = t4 - A24m - add(&coefEq.A, &coefEq.C, &t0) // A24p = A24m + t0 - return coefEq -} - -// Given a 3-isogeny phi and a point pB = x(PB), compute x(QB), the x-coordinate -// of the image QB = phi(PB) of PB under phi : E_(A:C) -> E_(A':C'). -// -// The output xQ = x(Q) is then a point on the curve E_(A':C'); the curve -// parameters are returned by the GenerateCurve function used to construct phi. -func (phi *isogeny3) EvaluatePoint(p *ProjectivePoint) { - var t0, t1, t2 Fp2 - K1, K2 := &phi.K1, &phi.K2 - px, pz := &p.X, &p.Z - - add(&t0, px, pz) // t0 = XQ + ZQ - sub(&t1, px, pz) // t1 = XQ - ZQ - mul(&t0, K1, &t0) // t2 = K1 * t0 - mul(&t1, K2, &t1) // t1 = K2 * t1 - add(&t2, &t0, &t1) // t2 = t0 + t1 - sub(&t0, &t1, &t0) // t0 = t1 - t0 - sqr(&t2, &t2) // t2 = t2 ^ 2 - sqr(&t0, &t0) // t0 = t0 ^ 2 - mul(px, px, &t2) // XQ'= XQ * t2 - mul(pz, pz, &t0) // ZQ'= ZQ * t0 -} - -// Given a four-torsion point p = x(PB) on the curve E_(A:C), construct the -// four-isogeny phi : E_(A:C) -> E_(A:C)/ = E_(A':C'). -// -// Input: (XP_4: ZP_4), where P_4 has exact order 4 on E_A/C -// Output: -// - Curve coordinates (A' + 2C', 4C') corresponding to E_A'/C' = A_E/C/ -// - Isogeny phi with constants in F_p^2 -func (phi *isogeny4) GenerateCurve(p *ProjectivePoint) CurveCoefficientsEquiv { - var coefEq CurveCoefficientsEquiv - xp4, zp4 := &p.X, &p.Z - K1, K2, K3 := &phi.K1, &phi.K2, &phi.K3 - - sub(K2, xp4, zp4) - add(K3, xp4, zp4) - sqr(K1, zp4) - add(K1, K1, K1) - sqr(&coefEq.C, K1) - add(K1, K1, K1) - sqr(&coefEq.A, xp4) - add(&coefEq.A, &coefEq.A, &coefEq.A) - sqr(&coefEq.A, &coefEq.A) - return coefEq -} - -// Given a 4-isogeny phi and a point xP = x(P), compute x(Q), the x-coordinate -// of the image Q = phi(P) of P under phi : E_(A:C) -> E_(A':C'). -// -// Input: Isogeny returned by GenerateCurve and point q=(Qx,Qz) from E0_A/C -// Output: Corresponding point q from E1_A'/C', where E1 is 4-isogenous to E0 -func (phi *isogeny4) EvaluatePoint(p *ProjectivePoint) { - var t0, t1 Fp2 - xq, zq := &p.X, &p.Z - K1, K2, K3 := &phi.K1, &phi.K2, &phi.K3 - - add(&t0, xq, zq) - sub(&t1, xq, zq) - mul(xq, &t0, K2) - mul(zq, &t1, K3) - mul(&t0, &t0, &t1) - mul(&t0, &t0, K1) - add(&t1, xq, zq) - sub(zq, xq, zq) - sqr(&t1, &t1) - sqr(zq, zq) - add(xq, &t0, &t1) - sub(&t0, zq, &t0) - mul(xq, xq, &t1) - mul(zq, zq, &t0) -} - -// PublicKeyValidation preforms public key/ciphertext validation using the CLN test. -// CLN test: Check that P and Q are both of order 3^e3 and they generate the torsion E_A[3^e3] -// A countermeasure for remote timing attacks on SIKE; suggested by https://eprint.iacr.org/2022/054.pdf -// Any curve E_A (SIKE 434, 503, 751) that passes CLN test is supersingular. -// Input: The public key / ciphertext P, Q, PmQ. The projective coordinate A of the curve defined by (P, Q, PmQ) -// Outputs: Whether (P,Q,PmQ) follows the CLN test -func PublicKeyValidation(cparams *ProjectiveCurveParameters, P, Q, PmQ *ProjectivePoint, nbits uint) error { - - var PmQX, PmQZ Fp2 - FromMontgomery(&PmQX, &PmQ.X) - FromMontgomery(&PmQZ, &PmQ.Z) - - // PmQ is not point T or O - if (isZero(&PmQX) == 1) || (isZero(&PmQZ) == 1) { - return errors.New("curve: PmQ is invalid") - } - - cparam := CalcCurveParamsEquiv3(cparams) - - // Compute e_3 = log3(2^(nbits+1)) - var e3 uint32 - e3_float := float64(int(nbits)+1) / math.Log2(3) - e3 = uint32(e3_float) - - // Verify that P and Q generate E_A[3^e_3] by checking: [3^(e_3-1)]P != [+-3^(e_3-1)]Q - var test_P, test_Q ProjectivePoint - test_P = *P - test_Q = *Q - - Pow3k(&test_P, &cparam, e3-1) - Pow3k(&test_Q, &cparam, e3-1) - - var PZ, QZ Fp2 - FromMontgomery(&PZ, &test_P.Z) - FromMontgomery(&QZ, &test_Q.Z) - - // P, Q are not of full order 3^e_3 - if (isZero(&PZ) == 1) || (isZero(&QZ) == 1) { - return errors.New("curve: ciphertext/public key are not of full order 3^e3") - } - - // PX/PZ = affine(PX) - // QX/QZ = affine(QX) - // If PX/PZ = QX/QZ, we have P=+-Q - var PXQZ_PZQX_fromMont, PXQZ_PZQX, PXQZ, PZQX Fp2 - mul(&PXQZ, &test_P.X, &test_Q.Z) - mul(&PZQX, &test_P.Z, &test_Q.X) - sub(&PXQZ_PZQX, &PXQZ, &PZQX) - FromMontgomery(&PXQZ_PZQX_fromMont, &PXQZ_PZQX) - - // [3^(e_3-1)]P == [+-3^(e_3-1)]Q - if isZero(&PXQZ_PZQX_fromMont) == 1 { - return errors.New("curve: ciphertext/public key are not linearly independent") - } - - // Check that Ord(P) = Ord(Q) = 3^(e_3) - Pow3k(&test_P, &cparam, 1) - Pow3k(&test_Q, &cparam, 1) - - FromMontgomery(&PZ, &test_P.Z) - FromMontgomery(&QZ, &test_Q.Z) - - // P, Q are not of correct order 3^e_3 - if (isZero(&PZ) == 0) || (isZero(&QZ) == 0) { - return errors.New("curve: ciphertext/public key are not of correct order 3^e3") - } - return nil -} diff --git a/dh/sidh/internal/p503/curve_test.go b/dh/sidh/internal/p503/curve_test.go deleted file mode 100644 index 0286d54e..00000000 --- a/dh/sidh/internal/p503/curve_test.go +++ /dev/null @@ -1,392 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p503 - -import ( - "bytes" - crand "crypto/rand" - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "io" - "math" - "math/rand" - "testing" - "time" -) - -func vartimeEqProjFp2(lhs, rhs *ProjectivePoint) bool { - var t0, t1 Fp2 - mul(&t0, &lhs.X, &rhs.Z) - mul(&t1, &lhs.Z, &rhs.X) - return vartimeEqFp2(&t0, &t1) -} - -func toAffine(point *ProjectivePoint) *Fp2 { - var affineX Fp2 - inv(&affineX, &point.Z) - mul(&affineX, &affineX, &point.X) - return &affineX -} - -func Test_jInvariant(t *testing.T) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - jbufRes := make([]byte, params.SharedSecretSize) - jbufExp := make([]byte, params.SharedSecretSize) - var jInv Fp2 - - Jinvariant(&curve, &jInv) - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(jbufRes, &jInv, params.Bytelen) - - jInv = expectedJ - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(jbufExp, &jInv, params.Bytelen) - - if !bytes.Equal(jbufRes[:], jbufExp[:]) { - t.Error("Computed incorrect j-invariant: found\n", jbufRes, "\nexpected\n", jbufExp) - } -} - -func TestProjectivePointVartimeEq(t *testing.T) { - var xP ProjectivePoint - - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - xQ := xP - - // Scale xQ, which results in the same projective point - mul(&xQ.X, &xQ.X, &curveA) - mul(&xQ.Z, &xQ.Z, &curveA) - if !vartimeEqProjFp2(&xP, &xQ) { - t.Error("Expected the scaled point to be equal to the original") - } -} - -func TestPointMulVersusSage(t *testing.T) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - cparams := CalcCurveParamsEquiv4(&curve) - var xP ProjectivePoint - - // x 2 - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - Pow2k(&xP, &cparams, 1) - afxQ := toAffine(&xP) - if !vartimeEqFp2(afxQ, &affineXP2) { - t.Error("\nExpected\n", affineXP2, "\nfound\n", afxQ) - } - - // x 4 - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - Pow2k(&xP, &cparams, 2) - afxQ = toAffine(&xP) - if !vartimeEqFp2(afxQ, &affineXP4) { - t.Error("\nExpected\n", affineXP4, "\nfound\n", afxQ) - } -} - -func TestPointMul9VersusSage(t *testing.T) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - cparams := CalcCurveParamsEquiv3(&curve) - var xP ProjectivePoint - - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - Pow3k(&xP, &cparams, 2) - afxQ := toAffine(&xP) - if !vartimeEqFp2(afxQ, &affineXP9) { - t.Error("\nExpected\n", affineXP9, "\nfound\n", afxQ) - } -} - -func BenchmarkThreePointLadder(b *testing.B) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - for n := 0; n < b.N; n++ { - ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(scalar3Pt)*8), scalar3Pt[:]) - } -} - -/* ------------------------------------------------------------------------- - Generate invalid public key points / ciphertext for test TestKEMInvalidPK - -------------------------------------------------------------------------*/ - -// Left-to-right Montgomery ladder, Algorithm 4 in Costello-Smith -// Input: ProjectivePoint P (xP, zP) -// Output: x([scalar]P), z([scalar]P) -func montgomeryLadder(cparams *ProjectiveCurveParameters, P *ProjectivePoint, scalar []uint8, random uint) ProjectivePoint { - var R0, R2, R1 ProjectivePoint - coefEq := CalcCurveParamsEquiv4(cparams) // for xDbl - aPlus2Over4 := CalcAplus2Over4(cparams) // for xDblAdd - R0 = *P // RO <- P - R1 = *P - Pow2k(&R1, &coefEq, 1) // R1 <- [2]P - R2 = *P // R2 = R1-R0 = P - - prevBit := uint8(0) - for i := int(random); i >= 0; i-- { - bit := (scalar[i>>3] >> (i & 7) & 1) - swap := prevBit ^ bit - prevBit = bit - cswap(&R0.X, &R0.Z, &R1.X, &R1.Z, swap) - R0, R1 = xDbladd(&R0, &R1, &R2, &aPlus2Over4) - } - cswap(&R0.X, &R0.Z, &R1.X, &R1.Z, prevBit) - return R0 -} - -// P = P + T -// From paper https://eprint.iacr.org/2017/212.pdf -// The map tau_T: P->P+T is (X : Z) -> (Z : X) on Montgomery curves -func tauT(P *ProjectivePoint) { - P.X, P.Z = P.Z, P.X // magic! -} - -// Construct Invalid public key tuple (P,Q) such that P and Q are linearly dependent -// Simulate section 3.1.1 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKNoneLinear(t *testing.T) { - - // Generate random scalar as secret - secret := make([]byte, params.B.SecretByteLen) - _, err := io.ReadFull(crand.Reader, secret) - if err != nil { - t.Error("Fail read random bytes") - } - - var P, Q ProjectivePoint - - rand.Seed(time.Now().UnixNano()) - random_index := rand.Intn(int(params.B.SecretByteLen-1) * 8) - - // Set P as a point of order 3^e3 - P = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Set Q = [k]P, where k = secret[:random_index] - Q = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index)) - - // Make sure Q is of full order 3^e_3, - var test_Q ProjectivePoint - test_Q = Q - - var e3 uint32 - e3_float := float64(int(params.B.SecretBitLen)+1) / math.Log2(3) - e3 = uint32(e3_float) - cparam_q := CalcCurveParamsEquiv3(¶ms.InitCurve) - Pow3k(&test_Q, &cparam_q, e3-1) - - var test_QZ Fp2 - FromMontgomery(&test_QZ, &test_Q.Z) - - // Q are not of full order 3^e_3 - for isZero(&test_QZ) == 1 { - rand.Seed(time.Now().UnixNano()) - random_index = rand.Intn(int(params.B.SecretByteLen-1) * 8) - Q = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index)) - test_Q = Q - Pow3k(&test_Q, &cparam_q, e3-1) - FromMontgomery(&test_QZ, &test_Q.Z) - } - - // invQz = 1/Q.Z - var invQz Fp2 - invQz = Q.Z - inv(&invQz, &invQz) - - mul(&P.X, &P.X, &P.Z) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect linearly dependent ciphertext to fail, index: %v scalar: %v ", random_index, secret) - } -} - -// Construct Invalid public key tuple (P,Q) such that Q = [k]P + T, where k is random and T is the point of order 2. -// Simulate HB and section 3.1.2 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKT(t *testing.T) { - - // Generate random scalar as secret - secret := make([]byte, params.B.SecretByteLen) - _, err := io.ReadFull(crand.Reader, secret) - if err != nil { - t.Error("Fail read random bytes") - } - - var P, Q ProjectivePoint - - rand.Seed(time.Now().UnixNano()) - random_index := rand.Intn(int(params.B.SecretByteLen-1) * 8) - - // Set P as a point of order 3^e3 - P = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Set Q = [k]P, where k = secret[:random_index] - Q = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index)) - // Q = [k]P + T - tauT(&Q) - - var invQz Fp2 - invQz = Q.Z - inv(&invQz, &invQz) - - mul(&P.X, &P.X, &P.Z) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect ciphertext involve point T to fail, index: %v scalar: %v ", random_index, secret) - } -} - -// Construct Invalid public key tuple (P,Q) such that P and Q are in E[2^e2] -// Simulate section 3.2 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKOrder2(t *testing.T) { - - // Generate random scalar as secret - secret := make([]byte, params.B.SecretByteLen) - _, err := io.ReadFull(crand.Reader, secret) - if err != nil { - t.Error("Fail read random bytes") - } - - var P, Q ProjectivePoint - - P = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - Q = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - - rand.Seed(time.Now().UnixNano()) - random_index_p := rand.Intn(int(params.A.SecretByteLen-1) * 8) - random_index_q := rand.Intn(int(params.A.SecretByteLen-1) * 8) - - P = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index_p)) - Q = montgomeryLadder(¶ms.InitCurve, &Q, secret, uint(random_index_q)) - - var invQz, invPz Fp2 - invQz = Q.Z - invPz = P.Z - inv(&invQz, &invQz) - inv(&invPz, &invPz) - - mul(&P.X, &P.X, &invPz) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect ciphertext in torsion E[2^e2] to fail, index_p: %v index_q: %v scalar: %v ", random_index_p, random_index_q, secret) - } - -} - -// Construct Invalid public key tuple (P,Q) such that P and Q are in E[3^e3] but not of full order 3^e3 -// Simulate section 3.1.1 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKFullOrder(t *testing.T) { - - var P, Q ProjectivePoint - - P = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - Q = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - - var e3 uint32 - e3_float := float64(int(params.B.SecretBitLen)+1) / math.Log2(3) - e3 = uint32(e3_float) - - rand.Seed(time.Now().UnixNano()) - random_index_p := rand.Intn(int(e3)) - random_index_q := rand.Intn(int(e3)) - - cparam_q := CalcCurveParamsEquiv3(¶ms.InitCurve) - Pow3k(&P, &cparam_q, uint32(random_index_p)) - Pow3k(&Q, &cparam_q, uint32(random_index_q)) - - var invQz, invPz Fp2 - invQz = Q.Z - invPz = P.Z - inv(&invQz, &invQz) - inv(&invPz, &invPz) - - mul(&P.X, &P.X, &invPz) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect ciphertext not of full order to fail, index_p: %v index_q: %v ", random_index_p, random_index_q) - } - -} - -// A trivial test case not covered by paper https://eprint.iacr.org/2022/054.pdf and HB -// Countermeasure in https://eprint.iacr.org/2022/054.pdf only cares about P and Q -// But if PmQ is point T or O, that can also lead to recovery of the first bit -func testInvalidPmQ(t *testing.T) { - - var zero Fp2 - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - xQ = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - xQmP = ProjectivePoint{X: zero, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect PmQ as T to fail\n") - } - -} - -// Test valid ciphertext -// Where P, Q are linearly independent points of correct order 3^e3 in E[3^e3] -func testValidPQ(t *testing.T) { - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - xQ = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify != nil { - t.Errorf("\nExpect correct ciphertext to not fail\n") - } - -} - -/* ------------------------------------------------------------------------- - Public key / Ciphertext validation against attacks proposed in paper https://eprint.iacr.org/2022/054.pdf and HB - -------------------------------------------------------------------------*/ - -func TestInvalidPK(t *testing.T) { - - t.Run("InvalidPmQ", testInvalidPmQ) - t.Run("InvalidPKNoneLinear", testInvalidPKNoneLinear) - t.Run("InvalidPKT", testInvalidPKT) - t.Run("InvalidPKOrder2", testInvalidPKOrder2) - t.Run("InvalidPKFullOrder", testInvalidPKFullOrder) - t.Run("ValidPQ", testValidPQ) - -} diff --git a/dh/sidh/internal/p503/doc.go b/dh/sidh/internal/p503/doc.go deleted file mode 100644 index 3541a440..00000000 --- a/dh/sidh/internal/p503/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package p503 provides implementation of field arithmetic used in SIDH and SIKE. -package p503 diff --git a/dh/sidh/internal/p503/fp2.go b/dh/sidh/internal/p503/fp2.go deleted file mode 100644 index 86e395d7..00000000 --- a/dh/sidh/internal/p503/fp2.go +++ /dev/null @@ -1,222 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p503 - -import ( - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Montgomery multiplication. Input values must be already -// in Montgomery domain. -func mulP(dest, lhs, rhs *common.Fp) { - var ab common.FpX2 - mulP503(&ab, lhs, rhs) // = a*b*R*R - rdcP503(dest, &ab) // = a*b*R mod p -} - -// Set dest = x^((p-3)/4). If x is square, this is 1/sqrt(x). -// Uses variation of sliding-window algorithm from with window size -// of 5 and least to most significant bit sliding (left-to-right) -// See HAC 14.85 for general description. -// -// Allowed to overlap x with dest. -// All values in Montgomery domains -// Set dest = x^(2^k), for k >= 1, by repeated squarings. -func p34(dest, x *common.Fp) { - var lookup [16]common.Fp - - // This performs sum(powStrategy) + 1 squarings and len(lookup) + len(mulStrategy) - // multiplications. - powStrategy := []uint8{12, 5, 5, 2, 7, 11, 3, 8, 4, 11, 4, 7, 5, 6, 3, 7, 5, 7, 2, 12, 5, 6, 4, 6, 8, 6, 4, 7, 5, 5, 8, 5, 8, 5, 5, 8, 9, 3, 6, 2, 10, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3} - mulStrategy := []uint8{12, 11, 10, 0, 1, 8, 3, 7, 1, 8, 3, 6, 7, 14, 2, 14, 14, 9, 0, 13, 9, 15, 5, 12, 7, 13, 7, 15, 6, 7, 9, 0, 5, 7, 6, 8, 8, 3, 7, 0, 10, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3} - initialMul := uint8(0) - - // Precompute lookup table of odd multiples of x for window - // size k=5. - var xx common.Fp - mulP(&xx, x, x) - lookup[0] = *x - for i := 1; i < 16; i++ { - mulP(&lookup[i], &lookup[i-1], &xx) - } - - // Now lookup = {x, x^3, x^5, ... } - // so that lookup[i] = x^{2*i + 1} - // so that lookup[k/2] = x^k, for odd k - *dest = lookup[initialMul] - for i := uint8(0); i < uint8(len(powStrategy)); i++ { - mulP(dest, dest, dest) - for j := uint8(1); j < powStrategy[i]; j++ { - mulP(dest, dest, dest) - } - mulP(dest, dest, &lookup[mulStrategy[i]]) - } -} - -func add(dest, lhs, rhs *common.Fp2) { - addP503(&dest.A, &lhs.A, &rhs.A) - addP503(&dest.B, &lhs.B, &rhs.B) -} - -func sub(dest, lhs, rhs *common.Fp2) { - subP503(&dest.A, &lhs.A, &rhs.A) - subP503(&dest.B, &lhs.B, &rhs.B) -} - -func mul(dest, lhs, rhs *common.Fp2) { - var bMinA, cMinD common.Fp - var ac, bd common.FpX2 - var adPlusBc common.FpX2 - var acMinBd common.FpX2 - - // Let (a,b,c,d) = (lhs.a,lhs.b,rhs.a,rhs.b). - // - // (a + bi)*(c + di) = (a*c - b*d) + (a*d + b*c)i - // - // Use Karatsuba's trick: note that - // - // (b - a)*(c - d) = (b*c + a*d) - a*c - b*d - // - // so (a*d + b*c) = (b-a)*(c-d) + a*c + b*d. - subP503(&bMinA, &lhs.B, &lhs.A) // = (b-a)*R - subP503(&cMinD, &rhs.A, &rhs.B) // = (c-d)*R - mulP503(&ac, &lhs.A, &rhs.A) // = a*c*R*R - mulP503(&bd, &lhs.B, &rhs.B) // = b*d*R*R - mulP503(&adPlusBc, &bMinA, &cMinD) // = (b-a)*(c-d)*R*R - adlP503(&adPlusBc, &adPlusBc, &ac) // = ((b-a)*(c-d) + a*c)*R*R - adlP503(&adPlusBc, &adPlusBc, &bd) // = ((b-a)*(c-d) + a*c + b*d)*R*R - rdcP503(&dest.B, &adPlusBc) // = (a*d + b*c)*R mod p - sulP503(&acMinBd, &ac, &bd) // = (a*c - b*d)*R*R - rdcP503(&dest.A, &acMinBd) // = (a*c - b*d)*R mod p -} - -// Set dest = 1/x -// -// Allowed to overlap dest with x. -// -// Returns dest to allow chaining operations. -func inv(dest, x *common.Fp2) { - var e1, e2 common.FpX2 - var f1, f2 common.Fp - - // We want to compute - // - // 1 1 (a - bi) (a - bi) - // -------- = -------- -------- = ----------- - // (a + bi) (a + bi) (a - bi) (a^2 + b^2) - // - // Letting c = 1/(a^2 + b^2), this is - // - // 1/(a+bi) = a*c - b*ci. - - mulP503(&e1, &x.A, &x.A) // = a*a*R*R - mulP503(&e2, &x.B, &x.B) // = b*b*R*R - adlP503(&e1, &e1, &e2) // = (a^2 + b^2)*R*R - rdcP503(&f1, &e1) // = (a^2 + b^2)*R mod p - // Now f1 = a^2 + b^2 - - mulP(&f2, &f1, &f1) - p34(&f2, &f2) - mulP(&f2, &f2, &f2) - mulP(&f2, &f2, &f1) - - mulP503(&e1, &x.A, &f2) - rdcP503(&dest.A, &e1) - - subP503(&f1, &common.Fp{}, &x.B) - mulP503(&e1, &f1, &f2) - rdcP503(&dest.B, &e1) -} - -func sqr(dest, x *common.Fp2) { - var a2, aPlusB, aMinusB common.Fp - var a2MinB2, ab2 common.FpX2 - - a := &x.A - b := &x.B - - // (a + bi)*(a + bi) = (a^2 - b^2) + 2abi. - addP503(&a2, a, a) // = a*R + a*R = 2*a*R - addP503(&aPlusB, a, b) // = a*R + b*R = (a+b)*R - subP503(&aMinusB, a, b) // = a*R - b*R = (a-b)*R - mulP503(&a2MinB2, &aPlusB, &aMinusB) // = (a+b)*(a-b)*R*R = (a^2 - b^2)*R*R - mulP503(&ab2, &a2, b) // = 2*a*b*R*R - rdcP503(&dest.A, &a2MinB2) // = (a^2 - b^2)*R mod p - rdcP503(&dest.B, &ab2) // = 2*a*b*R mod p -} - -// In case choice == 1, performs following swap in constant time: -// -// xPx <-> xQx -// xPz <-> xQz -// -// Otherwise returns xPx, xPz, xQx, xQz unchanged -func cswap(xPx, xPz, xQx, xQz *common.Fp2, choice uint8) { - cswapP503(&xPx.A, &xQx.A, choice) - cswapP503(&xPx.B, &xQx.B, choice) - cswapP503(&xPz.A, &xQz.A, choice) - cswapP503(&xPz.B, &xQz.B, choice) -} - -// In case choice == 1, performs following moves in constant time: -// -// xPx <- xQx -// xPz <- xQz -// -// Otherwise returns xPx, xPz, xQx, xQz unchanged -func cmov(xPx, xPz, xQx, xQz *common.Fp2, choice uint8) { - cmovP503(&xPx.A, &xQx.A, choice) - cmovP503(&xPx.B, &xQx.B, choice) - cmovP503(&xPz.A, &xQz.A, choice) - cmovP503(&xPz.B, &xQz.B, choice) -} - -func isZero(x *common.Fp2) uint8 { - r64 := uint64(0) - for i := 0; i < FpWords; i++ { - r64 |= x.A[i] | x.B[i] - } - r := uint8(0) - for i := uint64(0); i < 64; i++ { - r |= uint8((r64 >> i) & 0x1) - } - return 1 - r -} - -// Converts in.A and in.B to Montgomery domain and stores -// in 'out' -// out.A = in.A * R mod p -// out.B = in.B * R mod p -// Performs v = v*R^2*R^(-1) mod p, for both in.A and in.B -func ToMontgomery(out, in *common.Fp2) { - var aRR common.FpX2 - - // a*R*R - mulP503(&aRR, &in.A, &P503R2) - // a*R mod p - rdcP503(&out.A, &aRR) - mulP503(&aRR, &in.B, &P503R2) - rdcP503(&out.B, &aRR) -} - -// Converts in.A and in.B from Montgomery domain and stores -// in 'out' -// out.A = in.A mod p -// out.B = in.B mod p -// -// After returning from the call 'in' is not modified. -func FromMontgomery(out, in *common.Fp2) { - var aR common.FpX2 - - // convert from montgomery domain - copy(aR[:], in.A[:]) - rdcP503(&out.A, &aR) // = a mod p in [0, 2p) - modP503(&out.A) // = a mod p in [0, p) - for i := range aR { - aR[i] = 0 - } - copy(aR[:], in.B[:]) - rdcP503(&out.B, &aR) - modP503(&out.B) -} diff --git a/dh/sidh/internal/p503/fp2_test.go b/dh/sidh/internal/p503/fp2_test.go deleted file mode 100644 index 67d33cb9..00000000 --- a/dh/sidh/internal/p503/fp2_test.go +++ /dev/null @@ -1,245 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p503 - -import ( - "math/rand" - "reflect" - "testing" - "testing/quick" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -type testParams struct { - Point common.ProjectivePoint - Cparam common.ProjectiveCurveParameters - ExtElem common.Fp2 -} - -// Returns true if lhs = rhs. Takes variable time. -func vartimeEqFp2(lhs, rhs *common.Fp2) bool { - a := *lhs - b := *rhs - - modP503(&a.A) - modP503(&a.B) - modP503(&b.A) - modP503(&b.B) - - eq := true - for i := 0; i < FpWords && eq; i++ { - eq = eq && (a.A[i] == b.A[i]) - eq = eq && (a.B[i] == b.B[i]) - } - return eq -} - -func (testParams) generateFp2(rand *rand.Rand) common.Fp2 { - // Generation strategy: low limbs taken from [0,2^64); high limb - // taken from smaller range - // - // Size hint is ignored since all elements are fixed size. - // - // Field elements taken in range [0,2p). Emulate this by capping - // the high limb by the top digit of 2*p-1: - // - // sage: (2*p-1).digits(2^64)[-1] - // - // This still allows generating values >= 2p, but hopefully that - // excess is OK (and if it's not, we'll find out, because it's for - // testing...) - highLimb := rand.Uint64() % P503x2[FpWords-1] - fpElementGen := func() (fp common.Fp) { - for i := 0; i < (FpWords - 1); i++ { - fp[i] = rand.Uint64() - } - fp[FpWords-1] = highLimb - return fp - } - return common.Fp2{A: fpElementGen(), B: fpElementGen()} -} - -func (c testParams) Generate(rand *rand.Rand, size int) reflect.Value { - return reflect.ValueOf( - testParams{ - common.ProjectivePoint{ - X: c.generateFp2(rand), - Z: c.generateFp2(rand), - }, - common.ProjectiveCurveParameters{ - A: c.generateFp2(rand), - C: c.generateFp2(rand), - }, - c.generateFp2(rand), - }) -} - -func TestOne(t *testing.T) { - var tmp common.Fp2 - - mul(&tmp, ¶ms.OneFp2, ¶ms.A.AffineP) - if !vartimeEqFp2(&tmp, ¶ms.A.AffineP) { - t.Error("Not equal 1") - } -} - -func TestFp2ToBytesRoundTrip(t *testing.T) { - roundTrips := func(x testParams) bool { - xBytes := make([]byte, 2*params.Bytelen) - var xPrime common.Fp2 - - common.Fp2ToBytes(xBytes[:], &x.ExtElem, params.Bytelen) - common.BytesToFp2(&xPrime, xBytes[:], params.Bytelen) - return vartimeEqFp2(&xPrime, &x.ExtElem) - } - - if err := quick.Check(roundTrips, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2MulDistributesOverAdd(t *testing.T) { - mulDistributesOverAdd := func(x, y, z testParams) bool { - // Compute t1 = (x+y)*z - t1 := new(common.Fp2) - add(t1, &x.ExtElem, &y.ExtElem) - mul(t1, t1, &z.ExtElem) - - // Compute t2 = x*z + y*z - t2 := new(common.Fp2) - t3 := new(common.Fp2) - mul(t2, &x.ExtElem, &z.ExtElem) - mul(t3, &y.ExtElem, &z.ExtElem) - add(t2, t2, t3) - - return vartimeEqFp2(t1, t2) - } - - if err := quick.Check(mulDistributesOverAdd, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2MulIsAssociative(t *testing.T) { - isAssociative := func(x, y, z testParams) bool { - // Compute t1 = (x*y)*z - t1 := new(common.Fp2) - mul(t1, &x.ExtElem, &y.ExtElem) - mul(t1, t1, &z.ExtElem) - - // Compute t2 = (y*z)*x - t2 := new(common.Fp2) - mul(t2, &y.ExtElem, &z.ExtElem) - mul(t2, t2, &x.ExtElem) - - return vartimeEqFp2(t1, t2) - } - - if err := quick.Check(isAssociative, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2SquareMatchesMul(t *testing.T) { - sqrMatchesMul := func(x testParams) bool { - // Compute t1 = (x*x) - t1 := new(common.Fp2) - mul(t1, &x.ExtElem, &x.ExtElem) - - // Compute t2 = x^2 - t2 := new(common.Fp2) - sqr(t2, &x.ExtElem) - - return vartimeEqFp2(t1, t2) - } - - if err := quick.Check(sqrMatchesMul, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2Inv(t *testing.T) { - inverseIsCorrect := func(x testParams) bool { - z := new(common.Fp2) - inv(z, &x.ExtElem) - - // Now z = (1/x), so (z * x) * x == x - mul(z, z, &x.ExtElem) - mul(z, z, &x.ExtElem) - - return vartimeEqFp2(z, &x.ExtElem) - } - - // This is more expensive; run fewer tests - fasterCheckConfig := &quick.Config{MaxCount: (1 << 11)} - if err := quick.Check(inverseIsCorrect, fasterCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2Batch3Inv(t *testing.T) { - batchInverseIsCorrect := func(x1, x2, x3 testParams) bool { - var x1Inv, x2Inv, x3Inv common.Fp2 - inv(&x1Inv, &x1.ExtElem) - inv(&x2Inv, &x2.ExtElem) - inv(&x3Inv, &x3.ExtElem) - - var y1, y2, y3 common.Fp2 - Fp2Batch3Inv(&x1.ExtElem, &x2.ExtElem, &x3.ExtElem, &y1, &y2, &y3) - - return (vartimeEqFp2(&x1Inv, &y1) && vartimeEqFp2(&x2Inv, &y2) && vartimeEqFp2(&x3Inv, &y3)) - } - - // This is more expensive; run fewer tests - fasterCheckConfig := &quick.Config{MaxCount: (1 << 8)} - if err := quick.Check(batchInverseIsCorrect, fasterCheckConfig); err != nil { - t.Error(err) - } -} - -func BenchmarkFp2Mul(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - mul(w, z, z) - } -} - -func BenchmarkFp2Inv(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - inv(w, z) - } -} - -func BenchmarkFp2Square(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - sqr(w, z) - } -} - -func BenchmarkFp2Add(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - add(w, z, z) - } -} - -func BenchmarkFp2Sub(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - sub(w, z, z) - } -} diff --git a/dh/sidh/internal/p503/params.go b/dh/sidh/internal/p503/params.go deleted file mode 100644 index 984125b7..00000000 --- a/dh/sidh/internal/p503/params.go +++ /dev/null @@ -1,208 +0,0 @@ -package p503 - -//go:generate go run ../templates/gen.go P503 - -import ( - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "golang.org/x/sys/cpu" -) - -const ( - // Number of uint64 limbs used to store field element - FpWords = 8 -) - -// P503 is a prime used by field Fp503 -var ( - // According to https://github.com/golang/go/issues/28230, - // variables referred from the assembly must be in the same package. - // HasBMI2 signals support for MULX which is in BMI2 - HasBMI2 = cpu.X86.HasBMI2 - // HasADXandBMI2 signals support for ADX and BMI2 - HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX - - // P503 is a prime used by field Fp503 - P503 = common.Fp{ - 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xABFFFFFFFFFFFFFF, - 0x13085BDA2211E7A0, 0x1B9BF6C87B7E7DAF, 0x6045C6BDDA77A4D0, 0x004066F541811E1E, - } - - // P503x2 = 2*p503 - 1 - P503x2 = common.Fp{ - 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x57FFFFFFFFFFFFFF, - 0x2610B7B44423CF41, 0x3737ED90F6FCFB5E, 0xC08B8D7BB4EF49A0, 0x0080CDEA83023C3C, - } - - // P503p1 = p503 + 1 - P503p1 = common.Fp{ - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xAC00000000000000, - 0x13085BDA2211E7A0, 0x1B9BF6C87B7E7DAF, 0x6045C6BDDA77A4D0, 0x004066F541811E1E, - } - - // P503R2 = (2^512)^2 mod p - P503R2 = common.Fp{ - 0x5289A0CF641D011F, 0x9B88257189FED2B9, 0xA3B365D58DC8F17A, 0x5BC57AB6EFF168EC, - 0x9E51998BD84D4423, 0xBF8999CBAC3B5695, 0x46E9127BCE14CDB6, 0x003F6CFCE8B81771, - } - - // P503p1s8 = p503 + 1 left-shifted by 8, assuming little endianness - P503p1s8 = common.Fp{ - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x085BDA2211E7A0AC, 0x9BF6C87B7E7DAF13, 0x45C6BDDA77A4D01B, 0x4066F541811E1E60, - } - - // P503p1Zeros number of 0 digits in the least significant part of P503+1 - P503p1Zeros = 3 - - // 1*R mod p - one = common.Fp2{ - A: common.Fp{ - 0x00000000000003F9, 0x0000000000000000, 0x0000000000000000, 0xB400000000000000, - 0x63CB1A6EA6DED2B4, 0x51689D8D667EB37D, 0x8ACD77C71AB24142, 0x0026FBAEC60F5953, - }, - } - // 1/2 * R mod p - half = common.Fp2{ - A: common.Fp{ - 0x00000000000001FC, 0x0000000000000000, 0x0000000000000000, 0xB000000000000000, - 0x3B69BB2464785D2A, 0x36824A2AF0FE9896, 0xF5899F427A94F309, 0x0033B15203C83BB8, - }, - } - // 6*R mod p - six = common.Fp2{ - A: common.Fp{ - 0x00000000000017D8, 0x0000000000000000, 0x0000000000000000, 0xE000000000000000, - 0x30B1E6E3A51520FA, 0xB13BC3BF6FFB3992, 0x8045412EEB3E3DED, 0x0069182E2159DBB8, - }, - } - - params = common.SidhParams{ - ID: common.Fp503, - // SIDH public key byte size. - PublicKeySize: 378, - // SIDH shared secret byte size. - SharedSecretSize: 126, - A: common.DomainParams{ - // The x-coordinate of PA - AffineP: common.Fp2{ - A: common.Fp{ - 0x5D083011589AD893, 0xADFD8D2CB67D0637, 0x330C9AC34FFB6361, 0xF0D47489A2E805A2, - 0x27E2789259C6B8DC, 0x63866A2C121931B9, 0x8D4C65A7137DCF44, 0x003A183AE5967B3F, - }, - B: common.Fp{ - 0x7E3541B8C96D1519, 0xD3ADAEEC0D61A26C, 0xC0A2219CE7703DD9, 0xFF3E46658FCDBC52, - 0xD5B38DEAE6E196FF, 0x1AAC826364956D58, 0xEC9F4875B9A5F27A, 0x001B0B475AB99843, - }, - }, - // The x-coordinate of QA - AffineQ: common.Fp2{ - A: common.Fp{ - 0x4D83695107D03BAD, 0x221F3299005E2FCF, 0x78E6AE22F30DECF2, 0x6D982DB5111253E4, - 0x504C80A8AB4526A8, 0xEFD0C3AA210BB024, 0xCB77483501DC6FCF, 0x001052544A96BDF3, - }, - B: common.Fp{ - 0x0D74FE3402BCAE47, 0xDF5B8CDA832D8AED, 0xB86BCF06E4BD837E, 0x892A2933A0FA1F63, - 0x9F88FC67B6CCB461, 0x822926EA9DDA3AC8, 0xEAC8DDE5855425ED, 0x000618FE6DA37A80, - }, - }, - - // The x-coordinate of RA = PA-QA - AffineR: common.Fp2{ - A: common.Fp{ - 0x1D9D32D2DC877C17, 0x5517CD8F71D5B02B, 0x395AFB8F6B60C117, 0x3AE31AC85F9098C8, - 0x5F5341C198450848, 0xF8C609DBEA435C6A, 0xD832BC7EDC7BA5E4, 0x002AD98AA6968BF5, - }, - B: common.Fp{ - 0xC466CAB0F73C2E5B, 0x7B1817148FB2CF9C, 0x873E87C099E470A0, 0xBB17AC6D17A7BAC1, - 0xA146FDCD0F2E2A58, 0x88B311E9CEAB6201, 0x37604CF5C7951757, 0x0006804071C74BF9, - }, - }, - // Max size of secret key for 2-torsion group, corresponds to 2^e2 - 1 - SecretBitLen: 250, - // SecretBitLen in bytes. - SecretByteLen: 32, - // 2-torsion group computation strategy - IsogenyStrategy: []uint32{ - 0x3D, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, - 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, - 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x1D, 0x10, 0x08, 0x04, 0x02, 0x01, - 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x0D, 0x08, - 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x05, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, - }, - }, - B: common.DomainParams{ - // The x-coordinate of PB - AffineP: common.Fp2{ - A: common.Fp{ - 0xDF630FC5FB2468DB, 0xC30C5541C102040E, 0x3CDC9987B76511FC, 0xF54B5A09353D0CDD, - 0x3ADBA8E00703C42F, 0x8253F9303DDC95D0, 0x62D30778763ABFD7, 0x001CD00FB581CD55, - }, - B: common.Fp{ - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - }, - }, - // The x-coordinate of QB - AffineQ: common.Fp2{ - A: common.Fp{ - 0x2E3457A12B429261, 0x311F94E89627DCF8, 0x5B71C98FD1DB73F6, 0x3671DB7DCFC21541, - 0xB6D1484C9FE0CF4F, 0x19CD110717356E35, 0xF4F9FB00AC9919DF, 0x0035BC124D38A70B, - }, - B: common.Fp{ - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - }, - }, - // The x-coordinate of RB = PB - QB - AffineR: common.Fp2{ - A: common.Fp{ - 0x2E08BB99413D2952, 0xD3021467CD088D72, 0x21017AF859752245, 0x26314ED8FFD9DE5C, - 0x4AF43C73344B6686, 0xCFA1F91149DF0993, 0xF327A95365587A89, 0x000DBF54E03D3906, - }, - B: common.Fp{ - 0x03E03FF342F5F304, 0x993D604D7B4B6E56, 0x80412F4D9280E71F, 0x0FFDC9EF990B3982, - 0xE584E64C51604931, 0x1374F42AC8B0BBD7, 0x07D5BC37DFA41A5F, 0x00396CCFD61FD34C, - }, - }, - // Size of secret key for 3-torsion group, corresponds to log_2(3^e3) - 1. - SecretBitLen: 252, - // SecretBitLen in bytes. - SecretByteLen: 32, - // 3-torsion group computation strategy - IsogenyStrategy: []uint32{ - 0x47, 0x26, 0x15, 0x0D, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x05, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, - 0x01, 0x01, 0x01, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x11, 0x09, 0x05, 0x03, 0x02, - 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, - 0x01, 0x02, 0x01, 0x01, 0x21, 0x11, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, - 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, - 0x01, 0x02, 0x01, 0x01, - }, - }, - OneFp2: one, - HalfFp2: half, - MsgLen: 24, - // SIKEp503 provides 192 bit of classical security ([SIKE], 5.1) - KemSize: 24, - // ceil(503+7/8) - Bytelen: 63, - CiphertextSize: 24 + 378, - InitCurve: common.ProjectiveCurveParameters{ - A: six, - C: one, - }, - } -) - -func init() { - common.Register(common.Fp503, ¶ms) -} diff --git a/dh/sidh/internal/p503/params_test.go b/dh/sidh/internal/p503/params_test.go deleted file mode 100644 index 1ae46491..00000000 --- a/dh/sidh/internal/p503/params_test.go +++ /dev/null @@ -1,82 +0,0 @@ -package p503 - -// Contains values used by tests -import ( - "testing/quick" - - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Values computed using Sage -var ( - // j = 3674553797500778604587777859668542828244523188705960771798425843588160903687122861541242595678107095655647237100722594066610650373491179241544334443939077738732728884873568393760629500307797547379838602108296735640313894560419*i + 3127495302417548295242630557836520229396092255080675419212556702820583041296798857582303163183558315662015469648040494128968509467224910895884358424271180055990446576645240058960358037224785786494172548090318531038910933793845 - expectedJ = Fp2{ - A: Fp{0x2c441d03b72e27c, 0xf2c6748151dbf84, 0x3a774f6191070e, 0xa7c6212c9c800ba6, 0x23921b5cf09abc27, 0x9e1baefbb3cd4265, 0x8cd6a289f12e10dc, 0x3fa364128cf87e}, - B: Fp{0xe7497ac2bf6b0596, 0x629ee01ad23bd039, 0x95ee11587a119fa7, 0x572fb28a24772269, 0x3c00410b6c71567e, 0xe681e83a345f8a34, 0x65d21b1d96bd2d52, 0x7889a47e58901}, - } - - // A = 8752234765512331234913716743014562460822083005386252003333602919474238975785850965349950219277942402920758585086620525443539725921333735154674119646075*i + 6339624979889725406021454983012408976766782818694212228554611573314701271183857175866122275755278397694585249002282183018114967373119429936587424396917 - curveA = Fp2{ - A: Fp{0xd9816986a543095f, 0xa78cb1d7217bec21, 0x9595dc97b74ea70, 0x9120a1da6b42797d, 0x59ef9d903f74e47c, 0x4c58a4cdc45b6d0b, 0x816d5213aaf7ee6d, 0x3892fee6bb7343}, - B: Fp{0x28c5288acbedf11b, 0x2143a438c86f6c68, 0x7cb5c4ae9c4c8e34, 0xb478aea445eed48b, 0x24d5c175776db478, 0x234582f8676c0ebe, 0x56234267b625fb08, 0x2c6e58d84b1192}, - } - - // C = 10458464853790890798085664692909194316288127038910691163573355876336993883402795907795767791362493831987298578966325154262747805705783782806176495638177*i + 7770984753616185271325854825309278833018655051139367603077592443785629339985729818288672809062782315510526648882226172896710704020683893684611137718845 - curveC = Fp2{ - A: Fp{0xe05948236f2f913b, 0xc45da9ad1219a255, 0x7a568972a32fc1d0, 0x30f00bdd7071c3b1, 0x3b761b8dac2c98bc, 0x760f21b2179737b6, 0x13217e6656a13476, 0x2606b798e685aa}, - B: Fp{0x1c0171f78820052e, 0x440b7f7087e57140, 0xe0510c07b31b0e96, 0xd0cf489b2ac4aea9, 0x4fb328f1c1fdf783, 0xb3b4912342951cb7, 0x70a4b64e81961c42, 0x33eed63cf07181}, - } - // x(P) = 9720237205826983370867050298878715935679372786589878620121159082290288918688002583435964840822877971257659901481591644347943354235932355923042390796255*i + 634577413124118560098123299804750904956499531431297942628887930019161512075536652691244843248133437326050395005054997679717801535474938466995392156605 - affineXP = Fp2{ - A: Fp{0xb606d954d407faf2, 0x58a1ef6cd213a203, 0x9823b55033e62f7b, 0x59cafc060d5e25a1, 0x529685f1753526fc, 0xc2eac3d219989c7d, 0xc5e30c75dfd343a0, 0x378285adc968a0}, - B: Fp{0x6670f36db977b9da, 0xa07e2fdda5e1a7f0, 0xf367a7a722aed87d, 0x6c269e06d595cd10, 0x8379aa6092d87700, 0x57276ce3557ee7ae, 0xac8107bfbcd28993, 0x3d6f98869617a7}, - } - - affineXP2 = Fp2{ - A: Fp{0x4e1133c2b3855902, 0x875a775c67597fbb, 0xd17eb74254141abb, 0x1d5a464a4f3391f5, 0x24405c332811d007, 0x7e47e3eb489a7372, 0x65b130dfd9efe605, 0xfa69fac179803}, - B: Fp{0x329f5322e1be51ee, 0x9004dca8132ebd6f, 0x7cd87e447ca8a7b6, 0x10a6ec02c38ce69e, 0x8cef2ed7d112ac46, 0x5f385a9fc4b57cd7, 0x68a366354fe7a32e, 0x2223c1455486ac}, - } - - affineXP4 = Fp2{ - A: Fp{0x4eb695d34b46be8f, 0xfb5e76c58585f2d2, 0xa41f8aafa6dbb531, 0x4db82f5db5cfd144, 0x14dab0e3200cbba0, 0x430381706a279f81, 0xdf6707a57161f81, 0x44740f17197c3}, - B: Fp{0xa2473705cdb6d4e9, 0xfa3cd67b9c15502c, 0xf0928166d0c5cee1, 0x6150aba0c874faaa, 0x6c0b18d6d92f9034, 0xcff71d340fc1e72e, 0x19a47027af917587, 0x25ed4bad443b8f}, - } - - affineXP9 = Fp2{ - A: Fp{0x112da30e288217e0, 0x5b336d527320a5f7, 0xbbf4d9403b68e3c6, 0x55eccb31c40b359c, 0x8907129ab69b3203, 0x69cc8c750125a915, 0xa41a38e6f530c0e1, 0xbe68e23af1b8d}, - B: Fp{0x472c603765964213, 0xe4e64995b0769754, 0x4515583c74a6dd24, 0xff7c57f5818363a2, 0xbeaeb24662a92177, 0x8a54fa61fbf24c68, 0xa85542049eb45e12, 0x2b54caf655e285}, - } - - // Inputs for testing 3-point-ladder - threePointLadderInputs = []ProjectivePoint{ - // x(P) - { - X: Fp2{ - A: Fp{0x43941FA9244C059E, 0xD1F337D076941189, 0x6B6A8B3A8763C96A, 0x6DF569708D6C9482, 0x487EE5707A52F4AA, 0xDE396F6E2559689E, 0xE5EE3895A8991469, 0x2B0946695790A8}, - B: Fp{0xAB552C0FDAED092E, 0x7DF895E43E7DCB1C, 0x35C700E761920C4B, 0xCC5807DD70DC117A, 0x0884039A5A8DB18A, 0xD04620B3D0738052, 0xA200835605138F10, 0x3FF2E59B2FDC6A}, - }, - Z: params.OneFp2, - }, - // x(Q) - { - X: Fp2{ - A: Fp{0x77015826982BA1FD, 0x44024489673471E4, 0x1CAA2A5F4D5DA63B, 0xA183C07E50738C01, 0x8B97782D4E1A0DE6, 0x9B819522FBC38280, 0x0BDA46A937FB7B8A, 0x3B3614305914DF}, - B: Fp{0xBF0366E97B3168D9, 0xAA522AC3879CEF0F, 0x0AF5EC975BD035C8, 0x1F26FEE7BBAC165C, 0xA0EE6A637724A6AB, 0xFB52101E36BA3A38, 0xD29CF5E376E17376, 0x1374A50DF57071}, - }, - Z: params.OneFp2, - }, - // x(P-Q) - { - X: Fp2{ - A: Fp{0xD99279BBD41EA559, 0x35CF18E72F578214, 0x90473B1DC77F73E8, 0xBFFEA930B25D7F66, 0xFD558EA177B900B2, 0x7CFAD273A782A23E, 0x6B1F610822E0F611, 0x26D2D2EF9619B5}, - B: Fp{0x534F83651CBCC75D, 0x591FB4757AED5D08, 0x0B04353D40BED542, 0x829A94703AAC9139, 0x0F9C2E6D7663EB5B, 0x5D2D0F90C283F746, 0x34C872AA12A7676E, 0x0ECDB605FBFA16}, - }, - Z: params.OneFp2, - }, - } - scalar3Pt = [...]uint8{0x9f, 0x3b, 0xe7, 0xf9, 0xf4, 0x7c, 0xe6, 0xce, 0x79, 0x3e, 0x3d, 0x9f, 0x9f, 0x3b, 0xe7, 0xf9, 0xf4, 0x7c, 0xe6, 0xce, 0x79, 0x3e, 0x3d, 0x9f} -) - -var quickCheckConfig = &quick.Config{ - MaxCount: (1 << 15), -} diff --git a/dh/sidh/internal/p751/arith_amd64.s b/dh/sidh/internal/p751/arith_amd64.s deleted file mode 100644 index bae52963..00000000 --- a/dh/sidh/internal/p751/arith_amd64.s +++ /dev/null @@ -1,2666 +0,0 @@ -// +build amd64,!purego - -#include "textflag.h" - -// p751 + 1 -#define P751P1_5 $0xEEB0000000000000 -#define P751P1_6 $0xE3EC968549F878A8 -#define P751P1_7 $0xDA959B1A13F7CC76 -#define P751P1_8 $0x084E9867D6EBE876 -#define P751P1_9 $0x8562B5045CB25748 -#define P751P1_10 $0x0E12909F97BADC66 -#define P751P1_11 $0x00006FE5D541F71C - -#define P751_0 $0xFFFFFFFFFFFFFFFF -#define P751_5 $0xEEAFFFFFFFFFFFFF -#define P751_6 $0xE3EC968549F878A8 -#define P751_7 $0xDA959B1A13F7CC76 -#define P751_8 $0x084E9867D6EBE876 -#define P751_9 $0x8562B5045CB25748 -#define P751_10 $0x0E12909F97BADC66 -#define P751_11 $0x00006FE5D541F71C - -#define P751X2_0 $0xFFFFFFFFFFFFFFFE -#define P751X2_1 $0xFFFFFFFFFFFFFFFF -#define P751X2_5 $0xDD5FFFFFFFFFFFFF -#define P751X2_6 $0xC7D92D0A93F0F151 -#define P751X2_7 $0xB52B363427EF98ED -#define P751X2_8 $0x109D30CFADD7D0ED -#define P751X2_9 $0x0AC56A08B964AE90 -#define P751X2_10 $0x1C25213F2F75B8CD -#define P751X2_11 $0x0000DFCBAA83EE38 - -// The MSR code uses these registers for parameter passing. Keep using -// them to avoid significant code changes. This means that when the Go -// assembler does something strange, we can diff the machine code -// against a different assembler to find out what Go did. - -#define REG_P1 DI -#define REG_P2 SI -#define REG_P3 DX - -TEXT ·modP751(SB), NOSPLIT, $0-8 - MOVQ x+0(FP), REG_P1 - - // Zero AX for later use: - XORQ AX, AX - - // Load p into registers: - MOVQ P751_0, R8 - // P751_{1,2,3,4} = P751_0, so reuse R8 - MOVQ P751_5, R9 - MOVQ P751_6, R10 - MOVQ P751_7, R11 - MOVQ P751_8, R12 - MOVQ P751_9, R13 - MOVQ P751_10, R14 - MOVQ P751_11, R15 - - // Set x <- x - p - SUBQ R8, (REG_P1) - SBBQ R8, (8)(REG_P1) - SBBQ R8, (16)(REG_P1) - SBBQ R8, (24)(REG_P1) - SBBQ R8, (32)(REG_P1) - SBBQ R9, (40)(REG_P1) - SBBQ R10, (48)(REG_P1) - SBBQ R11, (56)(REG_P1) - SBBQ R12, (64)(REG_P1) - SBBQ R13, (72)(REG_P1) - SBBQ R14, (80)(REG_P1) - SBBQ R15, (88)(REG_P1) - - // Save carry flag indicating x-p < 0 as a mask in AX - SBBQ $0, AX - - // Conditionally add p to x if x-p < 0 - ANDQ AX, R8 - ANDQ AX, R9 - ANDQ AX, R10 - ANDQ AX, R11 - ANDQ AX, R12 - ANDQ AX, R13 - ANDQ AX, R14 - ANDQ AX, R15 - - ADDQ R8, (REG_P1) - ADCQ R8, (8)(REG_P1) - ADCQ R8, (16)(REG_P1) - ADCQ R8, (24)(REG_P1) - ADCQ R8, (32)(REG_P1) - ADCQ R9, (40)(REG_P1) - ADCQ R10, (48)(REG_P1) - ADCQ R11, (56)(REG_P1) - ADCQ R12, (64)(REG_P1) - ADCQ R13, (72)(REG_P1) - ADCQ R14, (80)(REG_P1) - ADCQ R15, (88)(REG_P1) - - RET - -TEXT ·cswapP751(SB), NOSPLIT, $0-17 - - MOVQ x+0(FP), REG_P1 - MOVQ y+8(FP), REG_P2 - MOVB choice+16(FP), AL // AL = 0 or 1 - MOVBLZX AL, AX // AX = 0 or 1 - NEGQ AX // RAX = 0x00..00 or 0xff..ff - - MOVQ (0*8)(REG_P1), BX // BX = x[0] - MOVQ (0*8)(REG_P2), CX // CX = y[0] - MOVQ CX, DX // DX = y[0] - XORQ BX, DX // DX = y[0] ^ x[0] - ANDQ AX, DX // DX = (y[0] ^ x[0]) & mask - XORQ DX, BX // BX = (y[0] ^ x[0]) & mask) ^ x[0] = x[0] or y[0] - XORQ DX, CX // CX = (y[0] ^ x[0]) & mask) ^ y[0] = y[0] or x[0] - MOVQ BX, (0*8)(REG_P1) - MOVQ CX, (0*8)(REG_P2) - - MOVQ (1*8)(REG_P1), BX - MOVQ (1*8)(REG_P2), CX - MOVQ CX, DX - XORQ BX, DX - ANDQ AX, DX - XORQ DX, BX - XORQ DX, CX - MOVQ BX, (1*8)(REG_P1) - MOVQ CX, (1*8)(REG_P2) - - MOVQ (2*8)(REG_P1), BX - MOVQ (2*8)(REG_P2), CX - MOVQ CX, DX - XORQ BX, DX - ANDQ AX, DX - XORQ DX, BX - XORQ DX, CX - MOVQ BX, (2*8)(REG_P1) - MOVQ CX, (2*8)(REG_P2) - - MOVQ (3*8)(REG_P1), BX - MOVQ (3*8)(REG_P2), CX - MOVQ CX, DX - XORQ BX, DX - ANDQ AX, DX - XORQ DX, BX - XORQ DX, CX - MOVQ BX, (3*8)(REG_P1) - MOVQ CX, (3*8)(REG_P2) - - MOVQ (4*8)(REG_P1), BX - MOVQ (4*8)(REG_P2), CX - MOVQ CX, DX - XORQ BX, DX - ANDQ AX, DX - XORQ DX, BX - XORQ DX, CX - MOVQ BX, (4*8)(REG_P1) - MOVQ CX, (4*8)(REG_P2) - - MOVQ (5*8)(REG_P1), BX - MOVQ (5*8)(REG_P2), CX - MOVQ CX, DX - XORQ BX, DX - ANDQ AX, DX - XORQ DX, BX - XORQ DX, CX - MOVQ BX, (5*8)(REG_P1) - MOVQ CX, (5*8)(REG_P2) - - MOVQ (6*8)(REG_P1), BX - MOVQ (6*8)(REG_P2), CX - MOVQ CX, DX - XORQ BX, DX - ANDQ AX, DX - XORQ DX, BX - XORQ DX, CX - MOVQ BX, (6*8)(REG_P1) - MOVQ CX, (6*8)(REG_P2) - - MOVQ (7*8)(REG_P1), BX - MOVQ (7*8)(REG_P2), CX - MOVQ CX, DX - XORQ BX, DX - ANDQ AX, DX - XORQ DX, BX - XORQ DX, CX - MOVQ BX, (7*8)(REG_P1) - MOVQ CX, (7*8)(REG_P2) - - MOVQ (8*8)(REG_P1), BX - MOVQ (8*8)(REG_P2), CX - MOVQ CX, DX - XORQ BX, DX - ANDQ AX, DX - XORQ DX, BX - XORQ DX, CX - MOVQ BX, (8*8)(REG_P1) - MOVQ CX, (8*8)(REG_P2) - - MOVQ (9*8)(REG_P1), BX - MOVQ (9*8)(REG_P2), CX - MOVQ CX, DX - XORQ BX, DX - ANDQ AX, DX - XORQ DX, BX - XORQ DX, CX - MOVQ BX, (9*8)(REG_P1) - MOVQ CX, (9*8)(REG_P2) - - MOVQ (10*8)(REG_P1), BX - MOVQ (10*8)(REG_P2), CX - MOVQ CX, DX - XORQ BX, DX - ANDQ AX, DX - XORQ DX, BX - XORQ DX, CX - MOVQ BX, (10*8)(REG_P1) - MOVQ CX, (10*8)(REG_P2) - - MOVQ (11*8)(REG_P1), BX - MOVQ (11*8)(REG_P2), CX - MOVQ CX, DX - XORQ BX, DX - ANDQ AX, DX - XORQ DX, BX - XORQ DX, CX - MOVQ BX, (11*8)(REG_P1) - MOVQ CX, (11*8)(REG_P2) - - RET - -TEXT ·cmovP751(SB),NOSPLIT,$0-17 - - MOVQ x+0(FP), DI - MOVQ y+8(FP), SI - MOVB choice+16(FP), AL // AL = 0 or 1 - MOVBLZX AL, AX // AX = 0 or 1 - NEGQ AX // AX = 0x00..00 or 0xff..ff -#ifndef CMOV_BLOCK -#define CMOV_BLOCK(idx) \ - MOVQ (idx*8)(DI), BX \ // BX = x[idx] - MOVQ (idx*8)(SI), DX \ // DX = y[idx] - XORQ BX, DX \ // DX = y[idx] ^ x[idx] - ANDQ AX, DX \ // DX = (y[idx] ^ x[idx]) & mask - XORQ DX, BX \ // BX = (y[idx] ^ x[idx]) & mask) ^ x[idx] = x[idx] or y[idx] - MOVQ BX, (idx*8)(DI) -#endif - CMOV_BLOCK(0) - CMOV_BLOCK(1) - CMOV_BLOCK(2) - CMOV_BLOCK(3) - CMOV_BLOCK(4) - CMOV_BLOCK(5) - CMOV_BLOCK(6) - CMOV_BLOCK(7) - CMOV_BLOCK(8) - CMOV_BLOCK(9) - CMOV_BLOCK(10) - CMOV_BLOCK(11) -#ifdef CMOV_BLOCK -#undef CMOV_BLOCK -#endif - RET - -TEXT ·addP751(SB), NOSPLIT, $0-24 - - MOVQ z+0(FP), REG_P3 - MOVQ x+8(FP), REG_P1 - MOVQ y+16(FP), REG_P2 - - MOVQ (REG_P1), R8 - MOVQ (8)(REG_P1), R9 - MOVQ (16)(REG_P1), R10 - MOVQ (24)(REG_P1), R11 - MOVQ (32)(REG_P1), R12 - MOVQ (40)(REG_P1), R13 - MOVQ (48)(REG_P1), R14 - MOVQ (56)(REG_P1), R15 - MOVQ (64)(REG_P1), CX - ADDQ (REG_P2), R8 - ADCQ (8)(REG_P2), R9 - ADCQ (16)(REG_P2), R10 - ADCQ (24)(REG_P2), R11 - ADCQ (32)(REG_P2), R12 - ADCQ (40)(REG_P2), R13 - ADCQ (48)(REG_P2), R14 - ADCQ (56)(REG_P2), R15 - ADCQ (64)(REG_P2), CX - MOVQ (72)(REG_P1), AX - ADCQ (72)(REG_P2), AX - MOVQ AX, (72)(REG_P3) - MOVQ (80)(REG_P1), AX - ADCQ (80)(REG_P2), AX - MOVQ AX, (80)(REG_P3) - MOVQ (88)(REG_P1), AX - ADCQ (88)(REG_P2), AX - MOVQ AX, (88)(REG_P3) - - MOVQ P751X2_0, AX - SUBQ AX, R8 - MOVQ P751X2_1, AX - SBBQ AX, R9 - SBBQ AX, R10 - SBBQ AX, R11 - SBBQ AX, R12 - MOVQ P751X2_5, AX - SBBQ AX, R13 - MOVQ P751X2_6, AX - SBBQ AX, R14 - MOVQ P751X2_7, AX - SBBQ AX, R15 - MOVQ P751X2_8, AX - SBBQ AX, CX - MOVQ R8, (REG_P3) - MOVQ R9, (8)(REG_P3) - MOVQ R10, (16)(REG_P3) - MOVQ R11, (24)(REG_P3) - MOVQ R12, (32)(REG_P3) - MOVQ R13, (40)(REG_P3) - MOVQ R14, (48)(REG_P3) - MOVQ R15, (56)(REG_P3) - MOVQ CX, (64)(REG_P3) - MOVQ (72)(REG_P3), R8 - MOVQ (80)(REG_P3), R9 - MOVQ (88)(REG_P3), R10 - MOVQ P751X2_9, AX - SBBQ AX, R8 - MOVQ P751X2_10, AX - SBBQ AX, R9 - MOVQ P751X2_11, AX - SBBQ AX, R10 - MOVQ R8, (72)(REG_P3) - MOVQ R9, (80)(REG_P3) - MOVQ R10, (88)(REG_P3) - MOVQ $0, AX - SBBQ $0, AX - - MOVQ P751X2_0, SI - ANDQ AX, SI - MOVQ P751X2_1, R8 - ANDQ AX, R8 - MOVQ P751X2_5, R9 - ANDQ AX, R9 - MOVQ P751X2_6, R10 - ANDQ AX, R10 - MOVQ P751X2_7, R11 - ANDQ AX, R11 - MOVQ P751X2_8, R12 - ANDQ AX, R12 - MOVQ P751X2_9, R13 - ANDQ AX, R13 - MOVQ P751X2_10, R14 - ANDQ AX, R14 - MOVQ P751X2_11, R15 - ANDQ AX, R15 - - MOVQ (REG_P3), AX - ADDQ SI, AX - MOVQ AX, (REG_P3) - MOVQ (8)(REG_P3), AX - ADCQ R8, AX - MOVQ AX, (8)(REG_P3) - MOVQ (16)(REG_P3), AX - ADCQ R8, AX - MOVQ AX, (16)(REG_P3) - MOVQ (24)(REG_P3), AX - ADCQ R8, AX - MOVQ AX, (24)(REG_P3) - MOVQ (32)(REG_P3), AX - ADCQ R8, AX - MOVQ AX, (32)(REG_P3) - MOVQ (40)(REG_P3), AX - ADCQ R9, AX - MOVQ AX, (40)(REG_P3) - MOVQ (48)(REG_P3), AX - ADCQ R10, AX - MOVQ AX, (48)(REG_P3) - MOVQ (56)(REG_P3), AX - ADCQ R11, AX - MOVQ AX, (56)(REG_P3) - MOVQ (64)(REG_P3), AX - ADCQ R12, AX - MOVQ AX, (64)(REG_P3) - MOVQ (72)(REG_P3), AX - ADCQ R13, AX - MOVQ AX, (72)(REG_P3) - MOVQ (80)(REG_P3), AX - ADCQ R14, AX - MOVQ AX, (80)(REG_P3) - MOVQ (88)(REG_P3), AX - ADCQ R15, AX - MOVQ AX, (88)(REG_P3) - - RET - -TEXT ·subP751(SB), NOSPLIT, $0-24 - - MOVQ z+0(FP), REG_P3 - MOVQ x+8(FP), REG_P1 - MOVQ y+16(FP), REG_P2 - - MOVQ (REG_P1), R8 - MOVQ (8)(REG_P1), R9 - MOVQ (16)(REG_P1), R10 - MOVQ (24)(REG_P1), R11 - MOVQ (32)(REG_P1), R12 - MOVQ (40)(REG_P1), R13 - MOVQ (48)(REG_P1), R14 - MOVQ (56)(REG_P1), R15 - MOVQ (64)(REG_P1), CX - SUBQ (REG_P2), R8 - SBBQ (8)(REG_P2), R9 - SBBQ (16)(REG_P2), R10 - SBBQ (24)(REG_P2), R11 - SBBQ (32)(REG_P2), R12 - SBBQ (40)(REG_P2), R13 - SBBQ (48)(REG_P2), R14 - SBBQ (56)(REG_P2), R15 - SBBQ (64)(REG_P2), CX - MOVQ R8, (REG_P3) - MOVQ R9, (8)(REG_P3) - MOVQ R10, (16)(REG_P3) - MOVQ R11, (24)(REG_P3) - MOVQ R12, (32)(REG_P3) - MOVQ R13, (40)(REG_P3) - MOVQ R14, (48)(REG_P3) - MOVQ R15, (56)(REG_P3) - MOVQ CX, (64)(REG_P3) - MOVQ (72)(REG_P1), AX - SBBQ (72)(REG_P2), AX - MOVQ AX, (72)(REG_P3) - MOVQ (80)(REG_P1), AX - SBBQ (80)(REG_P2), AX - MOVQ AX, (80)(REG_P3) - MOVQ (88)(REG_P1), AX - SBBQ (88)(REG_P2), AX - MOVQ AX, (88)(REG_P3) - MOVQ $0, AX - SBBQ $0, AX - - MOVQ P751X2_0, SI - ANDQ AX, SI - MOVQ P751X2_1, R8 - ANDQ AX, R8 - MOVQ P751X2_5, R9 - ANDQ AX, R9 - MOVQ P751X2_6, R10 - ANDQ AX, R10 - MOVQ P751X2_7, R11 - ANDQ AX, R11 - MOVQ P751X2_8, R12 - ANDQ AX, R12 - MOVQ P751X2_9, R13 - ANDQ AX, R13 - MOVQ P751X2_10, R14 - ANDQ AX, R14 - MOVQ P751X2_11, R15 - ANDQ AX, R15 - - MOVQ (REG_P3), AX - ADDQ SI, AX - MOVQ AX, (REG_P3) - MOVQ (8)(REG_P3), AX - ADCQ R8, AX - MOVQ AX, (8)(REG_P3) - MOVQ (16)(REG_P3), AX - ADCQ R8, AX - MOVQ AX, (16)(REG_P3) - MOVQ (24)(REG_P3), AX - ADCQ R8, AX - MOVQ AX, (24)(REG_P3) - MOVQ (32)(REG_P3), AX - ADCQ R8, AX - MOVQ AX, (32)(REG_P3) - MOVQ (40)(REG_P3), AX - ADCQ R9, AX - MOVQ AX, (40)(REG_P3) - MOVQ (48)(REG_P3), AX - ADCQ R10, AX - MOVQ AX, (48)(REG_P3) - MOVQ (56)(REG_P3), AX - ADCQ R11, AX - MOVQ AX, (56)(REG_P3) - MOVQ (64)(REG_P3), AX - ADCQ R12, AX - MOVQ AX, (64)(REG_P3) - MOVQ (72)(REG_P3), AX - ADCQ R13, AX - MOVQ AX, (72)(REG_P3) - MOVQ (80)(REG_P3), AX - ADCQ R14, AX - MOVQ AX, (80)(REG_P3) - MOVQ (88)(REG_P3), AX - ADCQ R15, AX - MOVQ AX, (88)(REG_P3) - - RET - -TEXT ·mulP751(SB), $96-24 - - // Here we store the destination in CX instead of in REG_P3 because the - // multiplication instructions use DX as an implicit destination - // operand: MULQ $REG sets DX:AX <-- AX * $REG. - - MOVQ z+0(FP), CX - MOVQ x+8(FP), REG_P1 - MOVQ y+16(FP), REG_P2 - - XORQ AX, AX - MOVQ (48)(REG_P1), R8 - MOVQ (56)(REG_P1), R9 - MOVQ (64)(REG_P1), R10 - MOVQ (72)(REG_P1), R11 - MOVQ (80)(REG_P1), R12 - MOVQ (88)(REG_P1), R13 - ADDQ (REG_P1), R8 - ADCQ (8)(REG_P1), R9 - ADCQ (16)(REG_P1), R10 - ADCQ (24)(REG_P1), R11 - ADCQ (32)(REG_P1), R12 - ADCQ (40)(REG_P1), R13 - MOVQ R8, (CX) - MOVQ R9, (8)(CX) - MOVQ R10, (16)(CX) - MOVQ R11, (24)(CX) - MOVQ R12, (32)(CX) - MOVQ R13, (40)(CX) - SBBQ $0, AX - - XORQ DX, DX - MOVQ (48)(REG_P2), R8 - MOVQ (56)(REG_P2), R9 - MOVQ (64)(REG_P2), R10 - MOVQ (72)(REG_P2), R11 - MOVQ (80)(REG_P2), R12 - MOVQ (88)(REG_P2), R13 - ADDQ (REG_P2), R8 - ADCQ (8)(REG_P2), R9 - ADCQ (16)(REG_P2), R10 - ADCQ (24)(REG_P2), R11 - ADCQ (32)(REG_P2), R12 - ADCQ (40)(REG_P2), R13 - MOVQ R8, (48)(CX) - MOVQ R9, (56)(CX) - MOVQ R10, (64)(CX) - MOVQ R11, (72)(CX) - MOVQ R12, (80)(CX) - MOVQ R13, (88)(CX) - SBBQ $0, DX - MOVQ AX, (80)(SP) - MOVQ DX, (88)(SP) - - // (SP[0-8],R10,R8,R9) <- (AH+AL)*(BH+BL) - - MOVQ (CX), R11 - MOVQ R8, AX - MULQ R11 - MOVQ AX, (SP) // c0 - MOVQ DX, R14 - - XORQ R15, R15 - MOVQ R9, AX - MULQ R11 - XORQ R9, R9 - ADDQ AX, R14 - ADCQ DX, R9 - - MOVQ (8)(CX), R12 - MOVQ R8, AX - MULQ R12 - ADDQ AX, R14 - MOVQ R14, (8)(SP) // c1 - ADCQ DX, R9 - ADCQ $0, R15 - - XORQ R8, R8 - MOVQ R10, AX - MULQ R11 - ADDQ AX, R9 - MOVQ (48)(CX), R13 - ADCQ DX, R15 - ADCQ $0, R8 - - MOVQ (16)(CX), AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R15 - MOVQ (56)(CX), AX - ADCQ $0, R8 - - MULQ R12 - ADDQ AX, R9 - MOVQ R9, (16)(SP) // c2 - ADCQ DX, R15 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ (72)(CX), AX - MULQ R11 - ADDQ AX, R15 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (24)(CX), AX - MULQ R13 - ADDQ AX, R15 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ R10, AX - MULQ R12 - ADDQ AX, R15 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (16)(CX), R14 - MOVQ (56)(CX), AX - MULQ R14 - ADDQ AX, R15 - MOVQ R15, (24)(SP) // c3 - ADCQ DX, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ (80)(CX), AX - MULQ R11 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (64)(CX), AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (48)(CX), R15 - MOVQ (32)(CX), AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (72)(CX), AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (24)(CX), R13 - MOVQ (56)(CX), AX - MULQ R13 - ADDQ AX, R8 - MOVQ R8, (32)(SP) // c4 - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ (88)(CX), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (64)(CX), AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (72)(CX), AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (40)(CX), AX - MULQ R15 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (80)(CX), AX - MULQ R12 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (32)(CX), R15 - MOVQ (56)(CX), AX - MULQ R15 - ADDQ AX, R9 - MOVQ R9, (40)(SP) // c5 - ADCQ DX, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ (64)(CX), AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (88)(CX), AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (80)(CX), AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (40)(CX), R11 - MOVQ (56)(CX), AX - MULQ R11 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (72)(CX), AX - MULQ R13 - ADDQ AX, R10 - MOVQ R10, (48)(SP) // c6 - ADCQ DX, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ (88)(CX), AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (64)(CX), AX - MULQ R11 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (80)(CX), AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (72)(CX), AX - MULQ R15 - ADDQ AX, R8 - MOVQ R8, (56)(SP) // c7 - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ (72)(CX), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (80)(CX), AX - MULQ R15 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (88)(CX), AX - MULQ R13 - ADDQ AX, R9 - MOVQ R9, (64)(SP) // c8 - ADCQ DX, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ (88)(CX), AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (80)(CX), AX - MULQ R11 - ADDQ AX, R10 // c9 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (88)(CX), AX - MULQ R11 - ADDQ AX, R8 // c10 - ADCQ DX, R9 // c11 - - MOVQ (88)(SP), AX - MOVQ (CX), DX - ANDQ AX, R12 - ANDQ AX, R14 - ANDQ AX, DX - ANDQ AX, R13 - ANDQ AX, R15 - ANDQ AX, R11 - MOVQ (48)(SP), AX - ADDQ AX, DX - MOVQ (56)(SP), AX - ADCQ AX, R12 - MOVQ (64)(SP), AX - ADCQ AX, R14 - ADCQ R10, R13 - ADCQ R8, R15 - ADCQ R9, R11 - MOVQ (80)(SP), AX - MOVQ DX, (48)(SP) - MOVQ R12, (56)(SP) - MOVQ R14, (64)(SP) - MOVQ R13, (72)(SP) - MOVQ R15, (80)(SP) - MOVQ R11, (88)(SP) - - MOVQ (48)(CX), R8 - MOVQ (56)(CX), R9 - MOVQ (64)(CX), R10 - MOVQ (72)(CX), R11 - MOVQ (80)(CX), R12 - MOVQ (88)(CX), R13 - ANDQ AX, R8 - ANDQ AX, R9 - ANDQ AX, R10 - ANDQ AX, R11 - ANDQ AX, R12 - ANDQ AX, R13 - MOVQ (48)(SP), AX - ADDQ AX, R8 - MOVQ (56)(SP), AX - ADCQ AX, R9 - MOVQ (64)(SP), AX - ADCQ AX, R10 - MOVQ (72)(SP), AX - ADCQ AX, R11 - MOVQ (80)(SP), AX - ADCQ AX, R12 - MOVQ (88)(SP), AX - ADCQ AX, R13 - MOVQ R8, (48)(SP) - MOVQ R9, (56)(SP) - MOVQ R11, (72)(SP) - - // CX[0-11] <- AL*BL - MOVQ (REG_P1), R11 - MOVQ (REG_P2), AX - MULQ R11 - XORQ R9, R9 - MOVQ AX, (CX) // c0 - MOVQ R10, (64)(SP) - MOVQ DX, R8 - - MOVQ (8)(REG_P2), AX - MULQ R11 - XORQ R10, R10 - ADDQ AX, R8 - MOVQ R12, (80)(SP) - ADCQ DX, R9 - - MOVQ (8)(REG_P1), R12 - MOVQ (REG_P2), AX - MULQ R12 - ADDQ AX, R8 - MOVQ R8, (8)(CX) // c1 - ADCQ DX, R9 - MOVQ R13, (88)(SP) - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ (16)(REG_P2), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (REG_P2), R13 - MOVQ (16)(REG_P1), AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (8)(REG_P2), AX - MULQ R12 - ADDQ AX, R9 - MOVQ R9, (16)(CX) // c2 - ADCQ DX, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ (24)(REG_P2), AX - MULQ R11 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (24)(REG_P1), AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (16)(REG_P2), AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (16)(REG_P1), R14 - MOVQ (8)(REG_P2), AX - MULQ R14 - ADDQ AX, R10 - MOVQ R10, (24)(CX) // c3 - ADCQ DX, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ (32)(REG_P2), AX - MULQ R11 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (16)(REG_P2), AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (32)(REG_P1), AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (24)(REG_P2), AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (24)(REG_P1), R13 - MOVQ (8)(REG_P2), AX - MULQ R13 - ADDQ AX, R8 - MOVQ R8, (32)(CX) // c4 - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ (40)(REG_P2), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (16)(REG_P2), AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (24)(REG_P2), AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (40)(REG_P1), R11 - MOVQ (REG_P2), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (32)(REG_P2), AX - MULQ R12 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (32)(REG_P1), R15 - MOVQ (8)(REG_P2), AX - MULQ R15 - ADDQ AX, R9 - MOVQ R9, (40)(CX) //c5 - ADCQ DX, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ (16)(REG_P2), AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (40)(REG_P2), AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (32)(REG_P2), AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (8)(REG_P2), AX - MULQ R11 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (24)(REG_P2), AX - MULQ R13 - ADDQ AX, R10 - MOVQ R10, (48)(CX) // c6 - ADCQ DX, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ (40)(REG_P2), AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (16)(REG_P2), AX - MULQ R11 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (32)(REG_P2), AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (24)(REG_P2), AX - MULQ R15 - ADDQ AX, R8 - MOVQ R8, (56)(CX) // c7 - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ (24)(REG_P2), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (32)(REG_P2), AX - MULQ R15 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (40)(REG_P2), AX - MULQ R13 - ADDQ AX, R9 - MOVQ R9, (64)(CX) // c8 - ADCQ DX, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ (40)(REG_P2), AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (32)(REG_P2), AX - MULQ R11 - ADDQ AX, R10 - MOVQ R10, (72)(CX) // c9 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (40)(REG_P2), AX - MULQ R11 - ADDQ AX, R8 - MOVQ R8, (80)(CX) // c10 - ADCQ DX, R9 - MOVQ R9, (88)(CX) // c11 - - // CX[12-23] <- AH*BH - MOVQ (48)(REG_P1), R11 - MOVQ (48)(REG_P2), AX - MULQ R11 - XORQ R9, R9 - MOVQ AX, (96)(CX) // c0 - MOVQ DX, R8 - - MOVQ (56)(REG_P2), AX - MULQ R11 - XORQ R10, R10 - ADDQ AX, R8 - ADCQ DX, R9 - - MOVQ (56)(REG_P1), R12 - MOVQ (48)(REG_P2), AX - MULQ R12 - ADDQ AX, R8 - MOVQ R8, (104)(CX) // c1 - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ (64)(REG_P2), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (48)(REG_P2), R13 - MOVQ (64)(REG_P1), AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (56)(REG_P2), AX - MULQ R12 - ADDQ AX, R9 - MOVQ R9, (112)(CX) // c2 - ADCQ DX, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ (72)(REG_P2), AX - MULQ R11 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (72)(REG_P1), AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (64)(REG_P2), AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (64)(REG_P1), R14 - MOVQ (56)(REG_P2), AX - MULQ R14 - ADDQ AX, R10 - MOVQ R10, (120)(CX) // c3 - ADCQ DX, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ (80)(REG_P2), AX - MULQ R11 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (64)(REG_P2), AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (80)(REG_P1), R15 - MOVQ R13, AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (72)(REG_P2), AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (72)(REG_P1), R13 - MOVQ (56)(REG_P2), AX - MULQ R13 - ADDQ AX, R8 - MOVQ R8, (128)(CX) // c4 - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ (88)(REG_P2), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (64)(REG_P2), AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (72)(REG_P2), AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (88)(REG_P1), R11 - MOVQ (48)(REG_P2), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (80)(REG_P2), AX - MULQ R12 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (56)(REG_P2), AX - MULQ R15 - ADDQ AX, R9 - MOVQ R9, (136)(CX) // c5 - ADCQ DX, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ (64)(REG_P2), AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (88)(REG_P2), AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (80)(REG_P2), AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (56)(REG_P2), AX - MULQ R11 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (72)(REG_P2), AX - MULQ R13 - ADDQ AX, R10 - MOVQ R10, (144)(CX) // c6 - ADCQ DX, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ (88)(REG_P2), AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (64)(REG_P2), AX - MULQ R11 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (80)(REG_P2), AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (72)(REG_P2), AX - MULQ R15 - ADDQ AX, R8 - MOVQ R8, (152)(CX) // c7 - ADCQ DX, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ (72)(REG_P2), AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (80)(REG_P2), AX - MULQ R15 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (88)(REG_P2), AX - MULQ R13 - ADDQ AX, R9 - MOVQ R9, (160)(CX) // c8 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (88)(REG_P2), AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - - MOVQ (80)(REG_P2), AX - MULQ R11 - ADDQ AX, R10 - MOVQ R10, (168)(CX) // c9 - ADCQ DX, R8 - - MOVQ (88)(REG_P2), AX - MULQ R11 - ADDQ AX, R8 - MOVQ R8, (176)(CX) // c10 - ADCQ $0, DX - MOVQ DX, (184)(CX) // c11 - - // [R8-R15,AX,DX,DI,(SP)] <- (AH+AL)*(BH+BL)-AL*BL - MOVQ (SP), R8 - SUBQ (CX), R8 - MOVQ (8)(SP), R9 - SBBQ (8)(CX), R9 - MOVQ (16)(SP), R10 - SBBQ (16)(CX), R10 - MOVQ (24)(SP), R11 - SBBQ (24)(CX), R11 - MOVQ (32)(SP), R12 - SBBQ (32)(CX), R12 - MOVQ (40)(SP), R13 - SBBQ (40)(CX), R13 - MOVQ (48)(SP), R14 - SBBQ (48)(CX), R14 - MOVQ (56)(SP), R15 - SBBQ (56)(CX), R15 - MOVQ (64)(SP), AX - SBBQ (64)(CX), AX - MOVQ (72)(SP), DX - SBBQ (72)(CX), DX - MOVQ (80)(SP), DI - SBBQ (80)(CX), DI - MOVQ (88)(SP), SI - SBBQ (88)(CX), SI - MOVQ SI, (SP) - - // [R8-R15,AX,DX,DI,(SP)] <- (AH+AL)*(BH+BL) - AL*BL - AH*BH - MOVQ (96)(CX), SI - SUBQ SI, R8 - MOVQ (104)(CX), SI - SBBQ SI, R9 - MOVQ (112)(CX), SI - SBBQ SI, R10 - MOVQ (120)(CX), SI - SBBQ SI, R11 - MOVQ (128)(CX), SI - SBBQ SI, R12 - MOVQ (136)(CX), SI - SBBQ SI, R13 - MOVQ (144)(CX), SI - SBBQ SI, R14 - MOVQ (152)(CX), SI - SBBQ SI, R15 - MOVQ (160)(CX), SI - SBBQ SI, AX - MOVQ (168)(CX), SI - SBBQ SI, DX - MOVQ (176)(CX), SI - SBBQ SI, DI - MOVQ (SP), SI - SBBQ (184)(CX), SI - - // FINAL RESULT - ADDQ (48)(CX), R8 - MOVQ R8, (48)(CX) - ADCQ (56)(CX), R9 - MOVQ R9, (56)(CX) - ADCQ (64)(CX), R10 - MOVQ R10, (64)(CX) - ADCQ (72)(CX), R11 - MOVQ R11, (72)(CX) - ADCQ (80)(CX), R12 - MOVQ R12, (80)(CX) - ADCQ (88)(CX), R13 - MOVQ R13, (88)(CX) - ADCQ (96)(CX), R14 - MOVQ R14, (96)(CX) - ADCQ (104)(CX), R15 - MOVQ R15, (104)(CX) - ADCQ (112)(CX), AX - MOVQ AX, (112)(CX) - ADCQ (120)(CX), DX - MOVQ DX, (120)(CX) - ADCQ (128)(CX), DI - MOVQ DI, (128)(CX) - ADCQ (136)(CX), SI - MOVQ SI, (136)(CX) - MOVQ (144)(CX), AX - ADCQ $0, AX - MOVQ AX, (144)(CX) - MOVQ (152)(CX), AX - ADCQ $0, AX - MOVQ AX, (152)(CX) - MOVQ (160)(CX), AX - ADCQ $0, AX - MOVQ AX, (160)(CX) - MOVQ (168)(CX), AX - ADCQ $0, AX - MOVQ AX, (168)(CX) - MOVQ (176)(CX), AX - ADCQ $0, AX - MOVQ AX, (176)(CX) - MOVQ (184)(CX), AX - ADCQ $0, AX - MOVQ AX, (184)(CX) - - RET - -// This multiplies a 256-bit number pointed to by M0 with p751+1. -// It is assumed that M1 points to p751+1 stored as a 768-bit Fp751Element. -// C points to the place to store the result and should be at least 192 bits. -// This should only be used when the BMI2 and ADX instruction set extensions -// are available. -#define mul256x448bmi2adx(M0, M1, C, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ - MOVQ 0+M0, DX \ - MOVQ M1+40(SB), AX \ - MULXQ AX, T1, T0 \ - MOVQ M1+48(SB), AX \ - MULXQ AX, T3, T2 \ - MOVQ T1, 0+C \ // C0_final - MOVQ M1+56(SB), AX \ - MULXQ AX, T5, T4 \ - ADOXQ T3, T0 \ - ADOXQ T5, T2 \ - MOVQ M1+64(SB), AX \ - MULXQ AX, T3, T1 \ - ADOXQ T3, T4 \ - MOVQ M1+72(SB), AX \ - MULXQ AX, T6, T5 \ - ADOXQ T6, T1 \ - MOVQ M1+80(SB), AX \ - MULXQ AX, T7, T3 \ - ADOXQ T7, T5 \ - MOVQ M1+88(SB), AX \ - MULXQ AX, T8, T6 \ - ADOXQ T8, T3 \ - MOVL $0, AX \ - ADOXQ AX, T6 \ - \ - MOVQ 8+M0, DX \ - MOVQ M1+40(SB), AX \ - MULXQ AX, T7, T8 \ - ADCXQ T7, T0 \ - MOVQ T0, 8+C \ // C1_final - ADCXQ T8, T2 \ - MOVQ M1+48(SB), AX \ - MULXQ AX, T8, T7 \ - ADOXQ T8, T2 \ - ADCXQ T7, T4 \ - MOVQ M1+56(SB), AX \ - MULXQ AX, T8, T0 \ - ADOXQ T8, T4 \ - ADCXQ T1, T0 \ - MOVQ M1+64(SB), AX \ - MULXQ AX, T7, T1 \ - ADCXQ T5, T1 \ - MOVQ M1+72(SB), AX \ - MULXQ AX, T8, T5 \ - ADCXQ T5, T3 \ - MOVQ M1+80(SB), AX \ - MULXQ AX, T9, T5 \ - ADCXQ T5, T6 \ - MOVQ M1+88(SB), AX \ - MULXQ AX, DX, T5 \ - MOVL $0, AX \ - ADCXQ AX, T5 \ - \ - ADOXQ T7, T0 \ - ADOXQ T8, T1 \ - ADOXQ T9, T3 \ - ADOXQ DX, T6 \ - ADOXQ AX, T5 \ - \ - MOVQ 16+M0, DX \ - MOVQ M1+40(SB), AX \ - MULXQ AX, T7, T8 \ - ADCXQ T7, T2 \ - MOVQ T2, 16+C \ // C2_final - ADCXQ T8, T4 \ - MOVQ M1+48(SB), AX \ - MULXQ AX, T7, T8 \ - ADOXQ T7, T4 \ - ADCXQ T8, T0 \ - MOVQ M1+56(SB), AX \ - MULXQ AX, T8, T2 \ - ADOXQ T8, T0 \ - ADCXQ T2, T1 \ - MOVQ M1+64(SB), AX \ - MULXQ AX, T7, T2 \ - ADCXQ T2, T3 \ - MOVQ M1+72(SB), AX \ - MULXQ AX, T8, T2 \ - ADCXQ T2, T6 \ - MOVQ M1+80(SB), AX \ - MULXQ AX, T9, T2 \ - ADCXQ T2, T5 \ - MOVQ M1+88(SB), AX \ - MULXQ AX, DX, T2 \ - MOVL $0, AX \ - ADCXQ AX, T2 \ - \ - ADOXQ T7, T1 \ - ADOXQ T8, T3 \ - ADOXQ T9, T6 \ - ADOXQ DX, T5 \ - ADOXQ AX, T2 \ - \ - MOVQ 24+M0, DX \ - MOVQ M1+40(SB), AX \ - MULXQ AX, T7, T8 \ - ADCXQ T4, T7 \ - ADCXQ T8, T0 \ - MOVQ M1+48(SB), AX \ - MULXQ AX, T9, T8 \ - ADOXQ T9, T0 \ - ADCXQ T8, T1 \ - MOVQ M1+56(SB), AX \ - MULXQ AX, T8, T4 \ - ADOXQ T8, T1 \ - ADCXQ T4, T3 \ - MOVQ M1+64(SB), AX \ - MULXQ AX, AX, T4 \ - ADCXQ T4, T6 \ - ADOXQ AX, T3 \ - MOVQ M1+72(SB), AX \ - MULXQ AX, T8, T4 \ - ADCXQ T4, T5 \ - MOVQ M1+80(SB), AX \ - MULXQ AX, T9, T4 \ - ADCXQ T4, T2 \ - MOVQ M1+88(SB), AX \ - MULXQ AX, DX, T4 \ - MOVL $0, AX \ - ADCXQ AX, T4 \ - \ - ADOXQ T8, T6 \ - ADOXQ T9, T5 \ - ADOXQ DX, T2 \ - ADOXQ AX, T4 - -// This multiplies a 256-bit number pointed to by M0 with p751+1. -// It is assumed that M1 points to p751+1 stored as a 768-bit Fp751Element. -// C points to the place to store the result and should be at least 192 bits. -// This should only be used when the BMI2 instruction set extension is -// available. -#define mul256x448bmi2(M0, M1, C, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ - MOVQ 0+M0, DX \ - MOVQ M1+40(SB), AX \ - MULXQ AX, T1, T0 \ - MOVQ M1+48(SB), AX \ - MULXQ AX, T3, T2 \ - MOVQ T1, 0+C \ // C0_final - MOVQ M1+56(SB), AX \ - MULXQ AX, T5, T4 \ - ADDQ T3, T0 \ - ADCQ T5, T2 \ - MOVQ M1+64(SB), AX \ - MULXQ AX, T3, T1 \ - ADCQ T3, T4 \ - MOVQ M1+72(SB), AX \ - MULXQ AX, T6, T5 \ - ADCQ T6, T1 \ - MOVQ M1+80(SB), AX \ - MULXQ AX, T7, T3 \ - ADCQ T7, T5 \ - MOVQ M1+88(SB), AX \ - MULXQ AX, T8, T6 \ - ADCQ T8, T3 \ - ADCQ $0, T6 \ - \ - MOVQ 8+M0, DX \ - MOVQ M1+40(SB), AX \ - MULXQ AX, T7, T8 \ - ADDQ T7, T0 \ - MOVQ T0, 8+C \ // C1_final - ADCQ T8, T2 \ - MOVQ M1+48(SB), AX \ - MULXQ AX, T8, T7 \ - MOVQ T8, 32+C \ - ADCQ T7, T4 \ - MOVQ M1+56(SB), AX \ - MULXQ AX, T8, T0 \ - MOVQ T8, 40+C \ - ADCQ T1, T0 \ - MOVQ M1+64(SB), AX \ - MULXQ AX, T7, T1 \ - ADCQ T5, T1 \ - MOVQ M1+72(SB), AX \ - MULXQ AX, T8, T5 \ - ADCQ T5, T3 \ - MOVQ M1+80(SB), AX \ - MULXQ AX, T9, T5 \ - ADCQ T5, T6 \ - MOVQ M1+88(SB), AX \ - MULXQ AX, DX, T5 \ - ADCQ $0, T5 \ - \ - XORQ AX, AX \ - ADDQ 32+C, T2 \ - ADCQ 40+C, T4 \ - ADCQ T7, T0 \ - ADCQ T8, T1 \ - ADCQ T9, T3 \ - ADCQ DX, T6 \ - ADCQ AX, T5 \ - \ - MOVQ 16+M0, DX \ - MOVQ M1+40(SB), AX \ - MULXQ AX, T7, T8 \ - ADDQ T7, T2 \ - MOVQ T2, 16+C \ // C2_final - ADCQ T8, T4 \ - MOVQ M1+48(SB), AX \ - MULXQ AX, T7, T8 \ - MOVQ T7, 32+C \ - ADCQ T8, T0 \ - MOVQ M1+56(SB), AX \ - MULXQ AX, T8, T2 \ - MOVQ T8, 40+C \ - ADCQ T2, T1 \ - MOVQ M1+64(SB), AX \ - MULXQ AX, T7, T2 \ - ADCQ T2, T3 \ - MOVQ M1+72(SB), AX \ - MULXQ AX, T8, T2 \ - ADCQ T2, T6 \ - MOVQ M1+80(SB), AX \ - MULXQ AX, T9, T2 \ - ADCQ T2, T5 \ - MOVQ M1+88(SB), AX \ - MULXQ AX, DX, T2 \ - ADCQ $0, T2 \ - \ - XORQ AX, AX \ - ADDQ 32+C, T4 \ - ADCQ 40+C, T0 \ - ADCQ T7, T1 \ - ADCQ T8, T3 \ - ADCQ T9, T6 \ - ADCQ DX, T5 \ - ADCQ AX, T2 \ - \ - MOVQ 24+M0, DX \ - MOVQ M1+40(SB), AX \ - MULXQ AX, T7, T8 \ - ADDQ T4, T7 \ - MOVQ T7, 8(SP) /* push T7 */ \ - ADCQ T8, T0 \ - MOVQ M1+48(SB), AX \ - MULXQ AX, T9, T8 \ - MOVQ T9, 32+C \ - ADCQ T8, T1 \ - MOVQ M1+56(SB), AX \ - MULXQ AX, T8, T4 \ - MOVQ T8, 40+C \ - ADCQ T4, T3 \ - MOVQ M1+64(SB), AX \ - MULXQ AX, T7, T4 \ - ADCQ T4, T6 \ - MOVQ M1+72(SB), AX \ - MULXQ AX, T8, T4 \ - ADCQ T4, T5 \ - MOVQ M1+80(SB), AX \ - MULXQ AX, T9, T4 \ - ADCQ T4, T2 \ - MOVQ M1+88(SB), AX \ - MULXQ AX, DX, T4 \ - ADCQ $0, T4 \ - \ - XORQ AX, AX \ - ADDQ 32+C, T0 \ - ADCQ 40+C, T1 \ - ADCQ T7, T3 \ - ADCQ T8, T6 \ - ADCQ T9, T5 \ - ADCQ DX, T2 \ - ADCQ AX, T4 \ - MOVQ 8(SP), T7 /* pop T7 */ - -// Template for calculating the Montgomery reduction algorithm described in -// section 5.2.3 of https://eprint.iacr.org/2017/1015.pdf. Template must be -// customized with schoolbook multiplication for 256 x 448-bit number. -// This macro reuses memory of IN value and *changes* it. Smashes registers -// R[8-15], AX, BX, CX, DX, BP. -// Input: -// * M0: 1536-bit number to be reduced -// * C : either mul256x448bmi2 or mul256x448bmi2adx -// Output: OUT 768-bit -#define REDC(C, M0, MULS) \ - \ // a[0-3] x p751p1_nz --> result: [reg_p2+48], [reg_p2+56], [reg_p2+64], and rbp, r8:r14 - MULS(M0, ·P751p1, 48+C, R8, R9, R13, R10, R14, R12, R11, BP, BX, CX) \ - XORQ R15, R15 \ - MOVQ 48+C, AX \ - MOVQ 56+C, DX \ - MOVQ 64+C, BX \ - ADDQ 40+M0, AX \ - ADCQ 48+M0, DX \ - ADCQ 56+M0, BX \ - MOVQ AX, 40+M0 \ - MOVQ DX, 48+M0 \ - MOVQ BX, 56+M0 \ - ADCQ 64+M0, BP \ - ADCQ 72+M0, R8 \ - ADCQ 80+M0, R9 \ - ADCQ 88+M0, R10 \ - ADCQ 96+M0, R11 \ - ADCQ 104+M0, R12 \ - ADCQ 112+M0, R13 \ - ADCQ 120+M0, R14 \ - ADCQ 128+M0, R15 \ - MOVQ BP, 64+M0 \ - MOVQ R8, 72+M0 \ - MOVQ R9, 80+M0 \ - MOVQ R10, 88+M0 \ - MOVQ R11, 96+M0 \ - MOVQ R12, 104+M0 \ - MOVQ R13, 112+M0 \ - MOVQ R14, 120+M0 \ - MOVQ R15, 128+M0 \ - MOVQ 136+M0, R8 \ - MOVQ 144+M0, R9 \ - MOVQ 152+M0, R10 \ - MOVQ 160+M0, R11 \ - MOVQ 168+M0, R12 \ - MOVQ 176+M0, R13 \ - MOVQ 184+M0, R14 \ - ADCQ $0, R8 \ - ADCQ $0, R9 \ - ADCQ $0, R10 \ - ADCQ $0, R11 \ - ADCQ $0, R12 \ - ADCQ $0, R13 \ - ADCQ $0, R14 \ - MOVQ R8, 136+M0 \ - MOVQ R9, 144+M0 \ - MOVQ R10, 152+M0 \ - MOVQ R11, 160+M0 \ - MOVQ R12, 168+M0 \ - MOVQ R13, 176+M0 \ - MOVQ R14, 184+M0 \ - \ // a[4-7] x p751p1_nz --> result: [reg_p2+48], [reg_p2+56], [reg_p2+64], and rbp, r8:r14 - MULS(32+M0, ·P751p1, 48+C, R8, R9, R13, R10, R14, R12, R11, BP, BX, CX) \ - XORQ R15, R15 \ - MOVQ 48+C, AX \ - MOVQ 56+C, DX \ - MOVQ 64+C, BX \ - ADDQ 72+M0, AX \ - ADCQ 80+M0, DX \ - ADCQ 88+M0, BX \ - MOVQ AX, 72+M0 \ - MOVQ DX, 80+M0 \ - MOVQ BX, 88+M0 \ - ADCQ 96+M0, BP \ - ADCQ 104+M0, R8 \ - ADCQ 112+M0, R9 \ - ADCQ 120+M0, R10 \ - ADCQ 128+M0, R11 \ - ADCQ 136+M0, R12 \ - ADCQ 144+M0, R13 \ - ADCQ 152+M0, R14 \ - ADCQ 160+M0, R15 \ - MOVQ BP, 0+C \ // Final result c0 - MOVQ R8, 104+M0 \ - MOVQ R9, 112+M0 \ - MOVQ R10, 120+M0 \ - MOVQ R11, 128+M0 \ - MOVQ R12, 136+M0 \ - MOVQ R13, 144+M0 \ - MOVQ R14, 152+M0 \ - MOVQ R15, 160+M0 \ - MOVQ 168+M0, R12 \ - MOVQ 176+M0, R13 \ - MOVQ 184+M0, R14 \ - ADCQ $0, R12 \ - ADCQ $0, R13 \ - ADCQ $0, R14 \ - MOVQ R12, 168+M0 \ - MOVQ R13, 176+M0 \ - MOVQ R14, 184+M0 \ - \ // a[8-11] x p751p1_nz --> result: [reg_p2+48], [reg_p2+56], [reg_p2+64], and rbp, r8:r14 - MULS(64+M0, ·P751p1, 48+C, R8, R9, R13, R10, R14, R12, R11, BP, BX, CX) \ - MOVQ 48+C, AX \ // Final result c1:c11 - MOVQ 56+C, DX \ - MOVQ 64+C, BX \ - ADDQ 104+M0, AX \ - ADCQ 112+M0, DX \ - ADCQ 120+M0, BX \ - MOVQ AX, 8+C \ - MOVQ DX, 16+C \ - MOVQ BX, 24+C \ - ADCQ 128+M0, BP \ - ADCQ 136+M0, R8 \ - ADCQ 144+M0, R9 \ - ADCQ 152+M0, R10 \ - ADCQ 160+M0, R11 \ - ADCQ 168+M0, R12 \ - ADCQ 176+M0, R13 \ - ADCQ 184+M0, R14 \ - MOVQ BP, 32+C \ - MOVQ R8, 40+C \ - MOVQ R9, 48+C \ - MOVQ R10, 56+C \ - MOVQ R11, 64+C \ - MOVQ R12, 72+C \ - MOVQ R13, 80+C \ - MOVQ R14, 88+C - -TEXT ·rdcP751(SB), $16-16 - MOVQ z+0(FP), REG_P2 - MOVQ x+8(FP), REG_P1 - - // Check whether to use optimized implementation - CMPB ·HasADXandBMI2(SB), $1 - JE redc_with_mulx_adcx_adox - CMPB ·HasBMI2(SB), $1 - JE redc_with_mulx - - MOVQ (REG_P1), R11 - MOVQ P751P1_5, AX - MULQ R11 - XORQ R8, R8 - ADDQ (40)(REG_P1), AX - MOVQ AX, (40)(REG_P2) // Z5 - ADCQ DX, R8 - - XORQ R9, R9 - MOVQ P751P1_6, AX - MULQ R11 - XORQ R10, R10 - ADDQ AX, R8 - ADCQ DX, R9 - - MOVQ (8)(REG_P1), R12 - MOVQ P751P1_5, AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - ADDQ (48)(REG_P1), R8 - MOVQ R8, (48)(REG_P2) // Z6 - ADCQ $0, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ P751P1_7, AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_6, AX - MULQ R12 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (16)(REG_P1), R13 - MOVQ P751P1_5, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - ADDQ (56)(REG_P1), R9 - MOVQ R9, (56)(REG_P2) // Z7 - ADCQ $0, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ P751P1_8, AX - MULQ R11 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_7, AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_6, AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (24)(REG_P1), R14 - MOVQ P751P1_5, AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - ADDQ (64)(REG_P1), R10 - MOVQ R10, (64)(REG_P2) // Z8 - ADCQ $0, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ P751P1_9, AX - MULQ R11 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_8, AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_7, AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_6, AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (32)(REG_P1), R15 - MOVQ P751P1_5, AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - ADDQ (72)(REG_P1), R8 - MOVQ R8, (72)(REG_P2) // Z9 - ADCQ $0, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ P751P1_10, AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_9, AX - MULQ R12 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_8, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_7, AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_6, AX - MULQ R15 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (40)(REG_P2), CX - MOVQ P751P1_5, AX - MULQ CX - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - ADDQ (80)(REG_P1), R9 - MOVQ R9, (80)(REG_P2) // Z10 - ADCQ $0, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ P751P1_11, AX - MULQ R11 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_10, AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_9, AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_8, AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_7, AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_6, AX - MULQ CX - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (48)(REG_P2), R11 - MOVQ P751P1_5, AX - MULQ R11 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - ADDQ (88)(REG_P1), R10 - MOVQ R10, (88)(REG_P2) // Z11 - ADCQ $0, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ P751P1_11, AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_10, AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_9, AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_8, AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_7, AX - MULQ CX - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_6, AX - MULQ R11 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (56)(REG_P2), R12 - MOVQ P751P1_5, AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - ADDQ (96)(REG_P1), R8 - MOVQ R8, (REG_P2) // Z0 - ADCQ $0, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ P751P1_11, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_10, AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_9, AX - MULQ R15 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_8, AX - MULQ CX - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_7, AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_6, AX - MULQ R12 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (64)(REG_P2), R13 - MOVQ P751P1_5, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - ADDQ (104)(REG_P1), R9 - MOVQ R9, (8)(REG_P2) // Z1 - ADCQ $0, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ P751P1_11, AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_10, AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_9, AX - MULQ CX - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_8, AX - MULQ R11 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_7, AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_6, AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ (72)(REG_P2), R14 - MOVQ P751P1_5, AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - ADDQ (112)(REG_P1), R10 - MOVQ R10, (16)(REG_P2) // Z2 - ADCQ $0, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ P751P1_11, AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_10, AX - MULQ CX - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_9, AX - MULQ R11 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_8, AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_7, AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_6, AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ (80)(REG_P2), R15 - MOVQ P751P1_5, AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - ADDQ (120)(REG_P1), R8 - MOVQ R8, (24)(REG_P2) // Z3 - ADCQ $0, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ P751P1_11, AX - MULQ CX - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_10, AX - MULQ R11 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_9, AX - MULQ R12 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_8, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_7, AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_6, AX - MULQ R15 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ (88)(REG_P2), CX - MOVQ P751P1_5, AX - MULQ CX - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - ADDQ (128)(REG_P1), R9 - MOVQ R9, (32)(REG_P2) // Z4 - ADCQ $0, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ P751P1_11, AX - MULQ R11 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_10, AX - MULQ R12 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_9, AX - MULQ R13 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_8, AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_7, AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_6, AX - MULQ CX - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - ADDQ (136)(REG_P1), R10 - MOVQ R10, (40)(REG_P2) // Z5 - ADCQ $0, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ P751P1_11, AX - MULQ R12 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_10, AX - MULQ R13 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_9, AX - MULQ R14 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_8, AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_7, AX - MULQ CX - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - ADDQ (144)(REG_P1), R8 - MOVQ R8, (48)(REG_P2) // Z6 - ADCQ $0, R9 - ADCQ $0, R10 - - XORQ R8, R8 - MOVQ P751P1_11, AX - MULQ R13 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_10, AX - MULQ R14 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_9, AX - MULQ R15 - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - - MOVQ P751P1_8, AX - MULQ CX - ADDQ AX, R9 - ADCQ DX, R10 - ADCQ $0, R8 - ADDQ (152)(REG_P1), R9 - MOVQ R9, (56)(REG_P2) // Z7 - ADCQ $0, R10 - ADCQ $0, R8 - - XORQ R9, R9 - MOVQ P751P1_11, AX - MULQ R14 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_10, AX - MULQ R15 - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - - MOVQ P751P1_9, AX - MULQ CX - ADDQ AX, R10 - ADCQ DX, R8 - ADCQ $0, R9 - ADDQ (160)(REG_P1), R10 - MOVQ R10, (64)(REG_P2) // Z8 - ADCQ $0, R8 - ADCQ $0, R9 - - XORQ R10, R10 - MOVQ P751P1_11, AX - MULQ R15 - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - - MOVQ P751P1_10, AX - MULQ CX - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, R10 - ADDQ (168)(REG_P1), R8 // Z9 - MOVQ R8, (72)(REG_P2) // Z9 - ADCQ $0, R9 - ADCQ $0, R10 - - MOVQ P751P1_11, AX - MULQ CX - ADDQ AX, R9 - ADCQ DX, R10 - ADDQ (176)(REG_P1), R9 // Z10 - MOVQ R9, (80)(REG_P2) // Z10 - ADCQ $0, R10 - ADDQ (184)(REG_P1), R10 // Z11 - MOVQ R10, (88)(REG_P2) // Z11 - RET - -redc_with_mulx_adcx_adox: - // This implements the Montgomery reduction algorithm described in - // section 5.2.3 of https://eprint.iacr.org/2017/1015.pdf. - // This assumes that the BMI2 and ADX instruction set extensions are available. - MOVQ BP, 0(SP) // push: BP is Callee-save. - REDC(0(REG_P2), 0(REG_P1), mul256x448bmi2adx) - MOVQ 0(SP), BP // pop: BP is Callee-save. - RET - -redc_with_mulx: - // This implements the Montgomery reduction algorithm described in - // section 5.2.3 of https://eprint.iacr.org/2017/1015.pdf. - // This assumes that the BMI2 instruction set extension is available. - MOVQ BP, 0(SP) // push: BP is Callee-save. - REDC(0(REG_P2), 0(REG_P1), mul256x448bmi2) - MOVQ 0(SP), BP // pop: BP is Callee-save. - RET - -TEXT ·adlP751(SB), NOSPLIT, $0-24 - - MOVQ z+0(FP), REG_P3 - MOVQ x+8(FP), REG_P1 - MOVQ y+16(FP), REG_P2 - - MOVQ (REG_P1), R8 - MOVQ (8)(REG_P1), R9 - MOVQ (16)(REG_P1), R10 - MOVQ (24)(REG_P1), R11 - MOVQ (32)(REG_P1), R12 - MOVQ (40)(REG_P1), R13 - MOVQ (48)(REG_P1), R14 - MOVQ (56)(REG_P1), R15 - MOVQ (64)(REG_P1), AX - MOVQ (72)(REG_P1), BX - MOVQ (80)(REG_P1), CX - - ADDQ (REG_P2), R8 - ADCQ (8)(REG_P2), R9 - ADCQ (16)(REG_P2), R10 - ADCQ (24)(REG_P2), R11 - ADCQ (32)(REG_P2), R12 - ADCQ (40)(REG_P2), R13 - ADCQ (48)(REG_P2), R14 - ADCQ (56)(REG_P2), R15 - ADCQ (64)(REG_P2), AX - ADCQ (72)(REG_P2), BX - ADCQ (80)(REG_P2), CX - - MOVQ R8, (REG_P3) - MOVQ R9, (8)(REG_P3) - MOVQ R10, (16)(REG_P3) - MOVQ R11, (24)(REG_P3) - MOVQ R12, (32)(REG_P3) - MOVQ R13, (40)(REG_P3) - MOVQ R14, (48)(REG_P3) - MOVQ R15, (56)(REG_P3) - MOVQ AX, (64)(REG_P3) - MOVQ BX, (72)(REG_P3) - MOVQ CX, (80)(REG_P3) - MOVQ (88)(REG_P1), AX - ADCQ (88)(REG_P2), AX - MOVQ AX, (88)(REG_P3) - - MOVQ (96)(REG_P1), R8 - MOVQ (104)(REG_P1), R9 - MOVQ (112)(REG_P1), R10 - MOVQ (120)(REG_P1), R11 - MOVQ (128)(REG_P1), R12 - MOVQ (136)(REG_P1), R13 - MOVQ (144)(REG_P1), R14 - MOVQ (152)(REG_P1), R15 - MOVQ (160)(REG_P1), AX - MOVQ (168)(REG_P1), BX - MOVQ (176)(REG_P1), CX - MOVQ (184)(REG_P1), DI - - ADCQ (96)(REG_P2), R8 - ADCQ (104)(REG_P2), R9 - ADCQ (112)(REG_P2), R10 - ADCQ (120)(REG_P2), R11 - ADCQ (128)(REG_P2), R12 - ADCQ (136)(REG_P2), R13 - ADCQ (144)(REG_P2), R14 - ADCQ (152)(REG_P2), R15 - ADCQ (160)(REG_P2), AX - ADCQ (168)(REG_P2), BX - ADCQ (176)(REG_P2), CX - ADCQ (184)(REG_P2), DI - - MOVQ R8, (96)(REG_P3) - MOVQ R9, (104)(REG_P3) - MOVQ R10, (112)(REG_P3) - MOVQ R11, (120)(REG_P3) - MOVQ R12, (128)(REG_P3) - MOVQ R13, (136)(REG_P3) - MOVQ R14, (144)(REG_P3) - MOVQ R15, (152)(REG_P3) - MOVQ AX, (160)(REG_P3) - MOVQ BX, (168)(REG_P3) - MOVQ CX, (176)(REG_P3) - MOVQ DI, (184)(REG_P3) - - RET - - -TEXT ·sulP751(SB), NOSPLIT, $0-24 - - MOVQ z+0(FP), REG_P3 - MOVQ x+8(FP), REG_P1 - MOVQ y+16(FP), REG_P2 - - MOVQ (REG_P1), R8 - MOVQ (8)(REG_P1), R9 - MOVQ (16)(REG_P1), R10 - MOVQ (24)(REG_P1), R11 - MOVQ (32)(REG_P1), R12 - MOVQ (40)(REG_P1), R13 - MOVQ (48)(REG_P1), R14 - MOVQ (56)(REG_P1), R15 - MOVQ (64)(REG_P1), AX - MOVQ (72)(REG_P1), BX - MOVQ (80)(REG_P1), CX - - SUBQ (REG_P2), R8 - SBBQ (8)(REG_P2), R9 - SBBQ (16)(REG_P2), R10 - SBBQ (24)(REG_P2), R11 - SBBQ (32)(REG_P2), R12 - SBBQ (40)(REG_P2), R13 - SBBQ (48)(REG_P2), R14 - SBBQ (56)(REG_P2), R15 - SBBQ (64)(REG_P2), AX - SBBQ (72)(REG_P2), BX - SBBQ (80)(REG_P2), CX - - MOVQ R8, (REG_P3) - MOVQ R9, (8)(REG_P3) - MOVQ R10, (16)(REG_P3) - MOVQ R11, (24)(REG_P3) - MOVQ R12, (32)(REG_P3) - MOVQ R13, (40)(REG_P3) - MOVQ R14, (48)(REG_P3) - MOVQ R15, (56)(REG_P3) - MOVQ AX, (64)(REG_P3) - MOVQ BX, (72)(REG_P3) - MOVQ CX, (80)(REG_P3) - MOVQ (88)(REG_P1), AX - SBBQ (88)(REG_P2), AX - MOVQ AX, (88)(REG_P3) - - MOVQ (96)(REG_P1), R8 - MOVQ (104)(REG_P1), R9 - MOVQ (112)(REG_P1), R10 - MOVQ (120)(REG_P1), R11 - MOVQ (128)(REG_P1), R12 - MOVQ (136)(REG_P1), R13 - MOVQ (144)(REG_P1), R14 - MOVQ (152)(REG_P1), R15 - MOVQ (160)(REG_P1), AX - MOVQ (168)(REG_P1), BX - MOVQ (176)(REG_P1), CX - MOVQ (184)(REG_P1), DI - - SBBQ (96)(REG_P2), R8 - SBBQ (104)(REG_P2), R9 - SBBQ (112)(REG_P2), R10 - SBBQ (120)(REG_P2), R11 - SBBQ (128)(REG_P2), R12 - SBBQ (136)(REG_P2), R13 - SBBQ (144)(REG_P2), R14 - SBBQ (152)(REG_P2), R15 - SBBQ (160)(REG_P2), AX - SBBQ (168)(REG_P2), BX - SBBQ (176)(REG_P2), CX - SBBQ (184)(REG_P2), DI - - MOVQ R8, (96)(REG_P3) - MOVQ R9, (104)(REG_P3) - MOVQ R10, (112)(REG_P3) - MOVQ R11, (120)(REG_P3) - MOVQ R12, (128)(REG_P3) - MOVQ R13, (136)(REG_P3) - MOVQ R14, (144)(REG_P3) - MOVQ R15, (152)(REG_P3) - MOVQ AX, (160)(REG_P3) - MOVQ BX, (168)(REG_P3) - MOVQ CX, (176)(REG_P3) - MOVQ DI, (184)(REG_P3) - - // Now the carry flag is 1 if x-y < 0. If so, add p*2^768. - MOVQ $0, AX - SBBQ $0, AX - - // Load p into registers: - MOVQ P751_0, R8 - // P751_{1,2,3,4} = P751_0, so reuse R8 - MOVQ P751_5, R9 - MOVQ P751_6, R10 - MOVQ P751_7, R11 - MOVQ P751_8, R12 - MOVQ P751_9, R13 - MOVQ P751_10, R14 - MOVQ P751_11, R15 - - ANDQ AX, R8 - ANDQ AX, R9 - ANDQ AX, R10 - ANDQ AX, R11 - ANDQ AX, R12 - ANDQ AX, R13 - ANDQ AX, R14 - ANDQ AX, R15 - - ADDQ R8, (96 )(REG_P3) - ADCQ R8, (96+ 8)(REG_P3) - ADCQ R8, (96+16)(REG_P3) - ADCQ R8, (96+24)(REG_P3) - ADCQ R8, (96+32)(REG_P3) - ADCQ R9, (96+40)(REG_P3) - ADCQ R10, (96+48)(REG_P3) - ADCQ R11, (96+56)(REG_P3) - ADCQ R12, (96+64)(REG_P3) - ADCQ R13, (96+72)(REG_P3) - ADCQ R14, (96+80)(REG_P3) - ADCQ R15, (96+88)(REG_P3) - - RET diff --git a/dh/sidh/internal/p751/arith_amd64_test.go b/dh/sidh/internal/p751/arith_amd64_test.go deleted file mode 100644 index b2f9a14d..00000000 --- a/dh/sidh/internal/p751/arith_amd64_test.go +++ /dev/null @@ -1,141 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -//go:build amd64 && !purego -// +build amd64,!purego - -package p751 - -import ( - "reflect" - "testing" - "testing/quick" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "golang.org/x/sys/cpu" -) - -type OptimFlag uint - -const ( - // Indicates that optimisation which uses MUL instruction should be used - kUse_MUL OptimFlag = 1 << 0 - // Indicates that optimisation which uses MULX instruction should be used - kUse_MULX = 1 << 1 - // Indicates that optimisation which uses MULX, ADOX and ADCX instructions should be used - kUse_MULXandADxX = 1 << 2 -) - -func resetCpuFeatures() { - HasBMI2 = cpu.X86.HasBMI2 - HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX -} - -// Utility function used for testing Mul implementations. Tests caller provided -// mulFunc against mul() -func testMul(t *testing.T, f1, f2 OptimFlag) { - doMulTest := func(multiplier, multiplicant common.Fp) bool { - defer resetCpuFeatures() - var resMulRef, resMulOptim common.FpX2 - - // Compute multiplier*multiplicant with first implementation - HasBMI2 = (kUse_MULX & f1) == kUse_MULX - HasADXandBMI2 = (kUse_MULXandADxX & f1) == kUse_MULXandADxX - mulP751(&resMulOptim, &multiplier, &multiplicant) - - // Compute multiplier*multiplicant with second implementation - HasBMI2 = (kUse_MULX & f2) == kUse_MULX - HasADXandBMI2 = (kUse_MULXandADxX & f2) == kUse_MULXandADxX - mulP751(&resMulRef, &multiplier, &multiplicant) - - // Compare results - return reflect.DeepEqual(resMulRef, resMulOptim) - } - - if err := quick.Check(doMulTest, quickCheckConfig); err != nil { - t.Error(err) - } -} - -// Utility function used for testing REDC implementations. Tests caller provided -// redcFunc against redc() -func testRedc(t *testing.T, f1, f2 OptimFlag) { - doRedcTest := func(aRR common.FpX2) bool { - defer resetCpuFeatures() - var resRedcF1, resRedcF2 common.Fp - aRRcpy := aRR - - // Compute redc with first implementation - HasBMI2 = (kUse_MULX & f1) == kUse_MULX - HasADXandBMI2 = (kUse_MULXandADxX & f1) == kUse_MULXandADxX - rdcP751(&resRedcF1, &aRR) - - // Compute redc with second implementation - HasBMI2 = (kUse_MULX & f2) == kUse_MULX - HasADXandBMI2 = (kUse_MULXandADxX & f2) == kUse_MULXandADxX - rdcP751(&resRedcF2, &aRRcpy) - - // Compare results - return reflect.DeepEqual(resRedcF2, resRedcF1) - } - - if err := quick.Check(doRedcTest, quickCheckConfig); err != nil { - t.Error(err) - } -} - -// Ensures correctness of implementation of mul operation which uses MULX -func TestMulWithMULX(t *testing.T) { - defer resetCpuFeatures() - if !HasBMI2 { - t.Skip("MULX not supported by the platform") - } - testMul(t, kUse_MULX, kUse_MUL) -} - -// Ensures correctness of implementation of mul operation which uses MULX and ADOX/ADCX -func TestMulWithMULXADxX(t *testing.T) { - defer resetCpuFeatures() - if !HasADXandBMI2 { - t.Skip("MULX, ADCX and ADOX not supported by the platform") - } - testMul(t, kUse_MULXandADxX, kUse_MUL) -} - -// Ensures correctness of implementation of mul operation which uses MULX and ADOX/ADCX -func TestMulWithMULXADxXAgainstMULX(t *testing.T) { - defer resetCpuFeatures() - if !HasADXandBMI2 { - t.Skip("MULX, ADCX and ADOX not supported by the platform") - } - testMul(t, kUse_MULX, kUse_MULXandADxX) -} - -// Ensures correctness of Montgomery reduction implementation which uses MULX -func TestRedcWithMULX(t *testing.T) { - defer resetCpuFeatures() - if !HasBMI2 { - t.Skip("MULX not supported by the platform") - } - testRedc(t, kUse_MULX, kUse_MUL) -} - -// Ensures correctness of Montgomery reduction implementation which uses MULX -// and ADCX/ADOX. -func TestRedcWithMULXADxX(t *testing.T) { - defer resetCpuFeatures() - if !HasADXandBMI2 { - t.Skip("MULX, ADCX and ADOX not supported by the platform") - } - testRedc(t, kUse_MULXandADxX, kUse_MUL) -} - -// Ensures correctness of Montgomery reduction implementation which uses MULX -// and ADCX/ADOX. -func TestRedcWithMULXADxXAgainstMULX(t *testing.T) { - defer resetCpuFeatures() - if !HasADXandBMI2 { - t.Skip("MULX, ADCX and ADOX not supported by the platform") - } - testRedc(t, kUse_MULXandADxX, kUse_MULX) -} diff --git a/dh/sidh/internal/p751/arith_arm64.s b/dh/sidh/internal/p751/arith_arm64.s deleted file mode 100644 index f5f50118..00000000 --- a/dh/sidh/internal/p751/arith_arm64.s +++ /dev/null @@ -1,1525 +0,0 @@ -// +build arm64,!purego - -#include "textflag.h" - -TEXT ·cmovP751(SB), NOSPLIT, $0-17 - MOVD x+0(FP), R0 - MOVD y+8(FP), R1 - MOVB choice+16(FP), R2 - - // Set flags - // If choice is not 0 or 1, this implementation will swap completely - CMP $0, R2 - - LDP 0(R0), (R3, R4) - LDP 0(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 0(R0) - - LDP 16(R0), (R3, R4) - LDP 16(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 16(R0) - - LDP 32(R0), (R3, R4) - LDP 32(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 32(R0) - - LDP 48(R0), (R3, R4) - LDP 48(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 48(R0) - - LDP 64(R0), (R3, R4) - LDP 64(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 64(R0) - - LDP 80(R0), (R3, R4) - LDP 80(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 80(R0) - - RET - -TEXT ·cswapP751(SB), NOSPLIT, $0-17 - MOVD x+0(FP), R0 - MOVD y+8(FP), R1 - MOVB choice+16(FP), R2 - - // Set flags - // If choice is not 0 or 1, this implementation will swap completely - CMP $0, R2 - - LDP 0(R0), (R3, R4) - LDP 0(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 0(R0) - CSEL NE, R3, R5, R9 - CSEL NE, R4, R6, R10 - STP (R9, R10), 0(R1) - - LDP 16(R0), (R3, R4) - LDP 16(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 16(R0) - CSEL NE, R3, R5, R9 - CSEL NE, R4, R6, R10 - STP (R9, R10), 16(R1) - - LDP 32(R0), (R3, R4) - LDP 32(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 32(R0) - CSEL NE, R3, R5, R9 - CSEL NE, R4, R6, R10 - STP (R9, R10), 32(R1) - - LDP 48(R0), (R3, R4) - LDP 48(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 48(R0) - CSEL NE, R3, R5, R9 - CSEL NE, R4, R6, R10 - STP (R9, R10), 48(R1) - - LDP 64(R0), (R3, R4) - LDP 64(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 64(R0) - CSEL NE, R3, R5, R9 - CSEL NE, R4, R6, R10 - STP (R9, R10), 64(R1) - - LDP 80(R0), (R3, R4) - LDP 80(R1), (R5, R6) - CSEL EQ, R3, R5, R7 - CSEL EQ, R4, R6, R8 - STP (R7, R8), 80(R0) - CSEL NE, R3, R5, R9 - CSEL NE, R4, R6, R10 - STP (R9, R10), 80(R1) - - RET - -TEXT ·addP751(SB), NOSPLIT, $0-24 - MOVD z+0(FP), R2 - MOVD x+8(FP), R0 - MOVD y+16(FP), R1 - - // Load first summand into R3-R14 - // Add first summand and second summand and store result in R3-R14 - LDP 0(R0), (R3, R4) - LDP 0(R1), (R15, R16) - LDP 16(R0), (R5, R6) - LDP 16(R1), (R17, R19) - ADDS R15, R3 - ADCS R16, R4 - ADCS R17, R5 - ADCS R19, R6 - - LDP 32(R0), (R7, R8) - LDP 32(R1), (R15, R16) - LDP 48(R0), (R9, R10) - LDP 48(R1), (R17, R19) - ADCS R15, R7 - ADCS R16, R8 - ADCS R17, R9 - ADCS R19, R10 - - LDP 64(R0), (R11, R12) - LDP 64(R1), (R15, R16) - LDP 80(R0), (R13, R14) - LDP 80(R1), (R17, R19) - ADCS R15, R11 - ADCS R16, R12 - ADCS R17, R13 - ADC R19, R14 - - // Subtract 2 * p751 in R15-R24 from the result in R3-R14 - LDP ·P751x2+0(SB), (R15, R16) - SUBS R15, R3 - SBCS R16, R4 - LDP ·P751x2+40(SB), (R17, R19) - SBCS R16, R5 - SBCS R16, R6 - SBCS R16, R7 - LDP ·P751x2+56(SB), (R20, R21) - SBCS R17, R8 - SBCS R19, R9 - LDP ·P751x2+72(SB), (R22, R23) - SBCS R20, R10 - SBCS R21, R11 - MOVD ·P751x2+88(SB), R24 - SBCS R22, R12 - SBCS R23, R13 - SBCS R24, R14 - SBC ZR, ZR, R25 - - // If x + y - 2 * p751 < 0, R25 is 1 and 2 * p751 should be added - AND R25, R15 - AND R25, R16 - AND R25, R17 - AND R25, R19 - AND R25, R20 - AND R25, R21 - AND R25, R22 - AND R25, R23 - AND R25, R24 - - ADDS R15, R3 - ADCS R16, R4 - STP (R3, R4), 0(R2) - ADCS R16, R5 - ADCS R16, R6 - STP (R5, R6), 16(R2) - ADCS R16, R7 - ADCS R17, R8 - STP (R7, R8), 32(R2) - ADCS R19, R9 - ADCS R20, R10 - STP (R9, R10), 48(R2) - ADCS R21, R11 - ADCS R22, R12 - STP (R11, R12), 64(R2) - ADCS R23, R13 - ADC R24, R14 - STP (R13, R14), 80(R2) - - RET - -TEXT ·subP751(SB), NOSPLIT, $0-24 - MOVD z+0(FP), R2 - MOVD x+8(FP), R0 - MOVD y+16(FP), R1 - - // Load x into R3-R14 - // Subtract y from x and store result in R3-R14 - LDP 0(R0), (R3, R4) - LDP 0(R1), (R15, R16) - LDP 16(R0), (R5, R6) - LDP 16(R1), (R17, R19) - SUBS R15, R3 - SBCS R16, R4 - SBCS R17, R5 - SBCS R19, R6 - - LDP 32(R0), (R7, R8) - LDP 32(R1), (R15, R16) - LDP 48(R0), (R9, R10) - LDP 48(R1), (R17, R19) - SBCS R15, R7 - SBCS R16, R8 - SBCS R17, R9 - SBCS R19, R10 - - LDP 64(R0), (R11, R12) - LDP 64(R1), (R15, R16) - LDP 80(R0), (R13, R14) - LDP 80(R1), (R17, R19) - SBCS R15, R11 - SBCS R16, R12 - SBCS R17, R13 - SBCS R19, R14 - SBC ZR, ZR, R15 - - // If x - y < 0, R15 is 1 and 2 * p751 should be added - LDP ·P751x2+0(SB), (R16, R17) - AND R15, R16 - AND R15, R17 - LDP ·P751x2+40(SB), (R19, R20) - AND R15, R19 - AND R15, R20 - - ADDS R16, R3 - ADCS R17, R4 - STP (R3, R4), 0(R2) - ADCS R17, R5 - ADCS R17, R6 - STP (R5, R6), 16(R2) - ADCS R17, R7 - ADCS R19, R8 - STP (R7, R8), 32(R2) - ADCS R20, R9 - - LDP ·P751x2+56(SB), (R16, R17) - AND R15, R16 - AND R15, R17 - LDP ·P751x2+72(SB), (R19, R20) - AND R15, R19 - AND R15, R20 - - ADCS R16, R10 - STP (R9, R10), 48(R2) - ADCS R17, R11 - ADCS R19, R12 - STP (R11, R12), 64(R2) - ADCS R20, R13 - - MOVD ·P751x2+88(SB), R16 - AND R15, R16 - ADC R16, R14 - STP (R13, R14), 80(R2) - - RET - -TEXT ·adlP751(SB), NOSPLIT, $0-24 - MOVD z+0(FP), R2 - MOVD x+8(FP), R0 - MOVD y+16(FP), R1 - - LDP 0(R0), (R3, R4) - LDP 0(R1), (R15, R16) - LDP 16(R0), (R5, R6) - LDP 16(R1), (R17, R19) - ADDS R15, R3 - ADCS R16, R4 - STP (R3, R4), 0(R2) - ADCS R17, R5 - ADCS R19, R6 - STP (R5, R6), 16(R2) - - LDP 32(R0), (R7, R8) - LDP 32(R1), (R15, R16) - LDP 48(R0), (R9, R10) - LDP 48(R1), (R17, R19) - ADCS R15, R7 - ADCS R16, R8 - STP (R7, R8), 32(R2) - ADCS R17, R9 - ADCS R19, R10 - STP (R9, R10), 48(R2) - - LDP 64(R0), (R11, R12) - LDP 64(R1), (R15, R16) - LDP 80(R0), (R13, R14) - LDP 80(R1), (R17, R19) - ADCS R15, R11 - ADCS R16, R12 - STP (R11, R12), 64(R2) - ADCS R17, R13 - ADCS R19, R14 - STP (R13, R14), 80(R2) - - LDP 96(R0), (R3, R4) - LDP 96(R1), (R15, R16) - LDP 112(R0), (R5, R6) - LDP 112(R1), (R17, R19) - ADCS R15, R3 - ADCS R16, R4 - STP (R3, R4), 96(R2) - ADCS R17, R5 - ADCS R19, R6 - STP (R5, R6), 112(R2) - - LDP 128(R0), (R7, R8) - LDP 128(R1), (R15, R16) - LDP 144(R0), (R9, R10) - LDP 144(R1), (R17, R19) - ADCS R15, R7 - ADCS R16, R8 - STP (R7, R8), 128(R2) - ADCS R17, R9 - ADCS R19, R10 - STP (R9, R10), 144(R2) - - LDP 160(R0), (R11, R12) - LDP 160(R1), (R15, R16) - LDP 176(R0), (R13, R14) - LDP 176(R1), (R17, R19) - ADCS R15, R11 - ADCS R16, R12 - STP (R11, R12), 160(R2) - ADCS R17, R13 - ADC R19, R14 - STP (R13, R14), 176(R2) - - RET - -TEXT ·sulP751(SB), NOSPLIT, $0-24 - MOVD z+0(FP), R2 - MOVD x+8(FP), R0 - MOVD y+16(FP), R1 - - LDP 0(R0), (R3, R4) - LDP 0(R1), (R15, R16) - LDP 16(R0), (R5, R6) - LDP 16(R1), (R17, R19) - SUBS R15, R3 - SBCS R16, R4 - STP (R3, R4), 0(R2) - SBCS R17, R5 - SBCS R19, R6 - STP (R5, R6), 16(R2) - - LDP 32(R0), (R7, R8) - LDP 32(R1), (R15, R16) - LDP 48(R0), (R9, R10) - LDP 48(R1), (R17, R19) - SBCS R15, R7 - SBCS R16, R8 - STP (R7, R8), 32(R2) - SBCS R17, R9 - SBCS R19, R10 - STP (R9, R10), 48(R2) - - LDP 64(R0), (R11, R12) - LDP 64(R1), (R15, R16) - LDP 80(R0), (R13, R14) - LDP 80(R1), (R17, R19) - SBCS R15, R11 - SBCS R16, R12 - STP (R11, R12), 64(R2) - SBCS R17, R13 - SBCS R19, R14 - STP (R13, R14), 80(R2) - - LDP 96(R0), (R3, R4) - LDP 96(R1), (R15, R16) - LDP 112(R0), (R5, R6) - LDP 112(R1), (R17, R19) - SBCS R15, R3 - SBCS R16, R4 - SBCS R17, R5 - SBCS R19, R6 - - LDP 128(R0), (R7, R8) - LDP 128(R1), (R15, R16) - LDP 144(R0), (R9, R10) - LDP 144(R1), (R17, R19) - SBCS R15, R7 - SBCS R16, R8 - SBCS R17, R9 - SBCS R19, R10 - - LDP 160(R0), (R11, R12) - LDP 160(R1), (R15, R16) - LDP 176(R0), (R13, R14) - LDP 176(R1), (R17, R19) - SBCS R15, R11 - SBCS R16, R12 - SBCS R17, R13 - SBCS R19, R14 - SBC ZR, ZR, R15 - - // If x - y < 0, R15 is 1 and p751 should be added - MOVD ·P751+0(SB), R20 - AND R15, R20 - LDP ·P751+40(SB), (R16, R17) - ADDS R20, R3 - ADCS R20, R4 - STP (R3, R4), 96(R2) - ADCS R20, R5 - ADCS R20, R6 - STP (R5, R6), 112(R2) - ADCS R20, R7 - - LDP ·P751+56(SB), (R19, R20) - AND R15, R16 - AND R15, R17 - ADCS R16, R8 - STP (R7, R8), 128(R2) - ADCS R17, R9 - - LDP ·P751+72(SB), (R16, R17) - AND R15, R19 - AND R15, R20 - ADCS R19, R10 - STP (R9, R10), 144(R2) - ADCS R20, R11 - - MOVD ·P751+88(SB), R19 - AND R15, R16 - AND R15, R17 - ADCS R16, R12 - STP (R11, R12), 160(R2) - ADCS R17, R13 - - AND R15, R19 - ADC R19, R14 - STP (R13, R14), 176(R2) - - RET - -// Expects that X0*Y0 is already in Z0(low),Z3(high) and X0*Y1 in Z1(low),Z2(high) -// Z0 is not actually touched -// Result of (X0-X2) * (Y0-Y2) will be in Z0-Z5 -// Inputs remain intact -#define mul192x192comba(X0, X1, X2, Y0, Y1, Y2, Z0, Z1, Z2, Z3, Z4, Z5, T0, T1, T2, T3) \ - MUL X1, Y0, T2 \ - UMULH X1, Y0, T3 \ - \ - ADDS Z3, Z1 \ - ADCS ZR, Z2 \ - ADC ZR, ZR, Z3 \ - \ - MUL X0, Y2, T0 \ - UMULH X0, Y2, T1 \ - \ - ADDS T2, Z1 \ - ADCS T3, Z2 \ - ADC ZR, Z3 \ - \ - MUL X1, Y1, T2 \ - UMULH X1, Y1, T3 \ - \ - ADDS T0, Z2 \ - ADCS T1, Z3 \ - ADC ZR, ZR, Z4 \ - \ - MUL X2, Y0, T0 \ - UMULH X2, Y0, T1 \ - \ - ADDS T2, Z2 \ - ADCS T3, Z3 \ - ADC ZR, Z4 \ - \ - MUL X1, Y2, T2 \ - UMULH X1, Y2, T3 \ - \ - ADDS T0, Z2 \ - ADCS T1, Z3 \ - ADC ZR, Z4 \ - \ - MUL X2, Y1, T0 \ - UMULH X2, Y1, T1 \ - \ - ADDS T2, Z3 \ - ADCS T3, Z4 \ - ADC ZR, ZR, Z5 \ - \ - MUL X2, Y2, T2 \ - UMULH X2, Y2, T3 \ - \ - ADDS T0, Z3 \ - ADCS T1, Z4 \ - ADC ZR, Z5 \ - \ - ADDS T2, Z4 \ - ADC T3, Z5 - -// Expects that X points to (X4-X6), Y to (Y4-Y6) -// Result of (X0-X5) * (Y0-Y5) will be in (0(Z), 8(Z), 16(Z), T0-T8) -// Inputs get overwritten -#define mul384x384karatsuba(X, Y, Z, X0, X1, X2, X3, X4, X5, Y0, Y1, Y2, Y3, Y4, Y5, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)\ - ADDS X0, X3 \ // xH + xL, destroys xH - ADCS X1, X4 \ - ADCS X2, X5 \ - ADC ZR, ZR, T10 \ - \ - ADDS Y0, Y3 \ // yH + yL, destroys yH - ADCS Y1, Y4 \ - ADCS Y2, Y5 \ - ADC ZR, ZR, T6 \ - \ - SUB T10, ZR, T7 \ - SUB T6, ZR, T8 \ - AND T6, T10 \ // combined carry - \ - AND T7, Y3, T0 \ // masked(yH + yL) - AND T7, Y4, T1 \ - AND T7, Y5, T2 \ - \ - AND T8, X3, T3 \ // masked(xH + xL) - AND T8, X4, T4 \ - AND T8, X5, T5 \ - \ - ADDS T3, T0 \ - ADCS T4, T1 \ - STP (T0, T1), 0+Z \ - \ - MUL X3, Y3, T0 \ - MUL X3, Y4, T1 \ - \ - ADCS T5, T2 \ - MOVD T2, 16+Z \ - \ - UMULH X3, Y4, T2 \ - UMULH X3, Y3, T3 \ - \ - ADC ZR, T10 \ - \ // (xH + xL) * (yH + yL) - mul192x192comba(X3, X4, X5, Y3, Y4, Y5, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)\ - \ - MUL X0, Y0, X3 \ - LDP 0+Z, (T6, T7) \ - MOVD 16+Z, T8 \ - \ - UMULH X0, Y0, Y3 \ - ADDS T6, T3 \ - ADCS T7, T4 \ - MUL X0, Y1, X4 \ - ADCS T8, T5 \ - ADC ZR, T10 \ - UMULH X0, Y1, X5 \ - \ // xL * yL - mul192x192comba(X0, X1, X2, Y0, Y1, Y2, X3, X4, X5, Y3, Y4, Y5, T6, T7, T8, T9)\ - \ - STP (X3, X4), 0+Z \ - MOVD X5, 16+Z \ - \ - SUBS X3, T0 \ // (xH + xL) * (yH + yL) - xL * yL - SBCS X4, T1 \ - LDP 0+X, (X3, X4) \ - SBCS X5, T2 \ - MOVD 16+X, X5 \ - SBCS Y3, T3 \ - SBCS Y4, T4 \ - SBCS Y5, T5 \ - SBC ZR, T10 \ - \ - ADDS Y3, T0 \ // ((xH + xL) * (yH + yL) - xL * yL) * 2^192 + xL * yL - ADCS Y4, T1 \ - LDP 0+Y, (Y3, Y4) \ - MUL X3, Y3, X0 \ - ADCS Y5, T2 \ - UMULH X3, Y3, Y0 \ - MOVD 16+Y, Y5 \ - MUL X3, Y4, X1 \ - ADCS ZR, T3 \ - UMULH X3, Y4, X2 \ - ADCS ZR, T4 \ - ADCS ZR, T5 \ - ADC ZR, T10 \ - \ // xH * yH, overwrite xLow, yLow - mul192x192comba(X3, X4, X5, Y3, Y4, Y5, X0, X1, X2, Y0, Y1, Y2, T6, T7, T8, T9)\ - \ - SUBS X0, T0 \ // ((xH + xL) * (yH + yL) - xL * yL - xH * yH) - SBCS X1, T1 \ - SBCS X2, T2 \ - SBCS Y0, T3 \ - SBCS Y1, T4 \ - SBCS Y2, T5 \ - SBC ZR, T10 \ - \ - ADDS X0, T3 \ - ADCS X1, T4 \ - ADCS X2, T5 \ - ADCS T10, Y0, T6 \ - ADCS ZR, Y1, T7 \ - ADC ZR, Y2, T8 - - -TEXT ·mulP751(SB), NOSPLIT, $0-24 - MOVD z+0(FP), R2 - MOVD x+8(FP), R0 - MOVD y+16(FP), R1 - - // Load xL in R3-R8, xH in R9-R14 - // (xH + xL) in R3-R8, destroys xH - LDP 0(R0), (R3, R4) - LDP 48(R0), (R9, R10) - ADDS R9, R3 - ADCS R10, R4 - LDP 16(R0), (R5, R6) - LDP 64(R0), (R11, R12) - ADCS R11, R5 - ADCS R12, R6 - LDP 32(R0), (R7, R8) - LDP 80(R0), (R13, R14) - ADCS R13, R7 - ADCS R14, R8 - ADC ZR, ZR, R22 - - // Load yL in R9-R14, yH in R15-21 - // (yH + yL) in R9-R14, destroys yH - LDP 0(R1), (R9, R10) - LDP 48(R1), (R15, R16) - ADDS R15, R9 - ADCS R16, R10 - LDP 16(R1), (R11, R12) - LDP 64(R1), (R17, R19) - ADCS R17, R11 - ADCS R19, R12 - LDP 32(R1), (R13, R14) - LDP 80(R1), (R20, R21) - ADCS R20, R13 - ADCS R21, R14 - ADC ZR, ZR, R23 - - // Compute masks and combined carry - SUB R22, ZR, R24 - SUB R23, ZR, R25 - AND R23, R22 - - // Store xH, yH in z so mul384x384karatsuba can retrieve them from memory - // It doesn't have enough registers - // Meanwhile computed masked(xH + xL) in R15-R21 - STP (R6, R7), 0(R2) - AND R25, R3, R15 - AND R25, R4, R16 - STP (R8, R12), 16(R2) - AND R25, R5, R17 - AND R25, R6, R19 - STP (R13, R14), 32(R2) - AND R25, R7, R20 - AND R25, R8, R21 - - // Masked(xH + xL) + masked(yH + yL) in R15-R21 - // Store intermediate values in z - AND R24, R9, R25 - AND R24, R10, R26 - ADDS R25, R15 - ADCS R26, R16 - STP (R15, R16), 96(R2) - AND R24, R11, R25 - AND R24, R12, R26 - ADCS R25, R17 - ADCS R26, R19 - STP (R17, R19), 112(R2) - AND R24, R13, R25 - AND R24, R14, R26 - ADCS R25, R20 - ADCS R26, R21 - STP (R20, R21), 128(R2) - // Store carry in R29 so it can remain there - ADC ZR, R22, R29 - - // (xH + xL) * (yH + yL) - mul384x384karatsuba(0(R2), 24(R2), 48(R2), R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R19, R20, R21, R22, R23, R24, R25, R26) - - // Load masked(xH + xL) + masked(yH + yL) and add that to its top half - // Store the result back in z - STP (R15, R16), 72(R2) - LDP 96(R2), (R3, R4) - ADDS R3, R19 - STP (R17, R19), 88(R2) - ADCS R4, R20 - LDP 112(R2), (R5, R6) - ADCS R5, R21 - STP (R20, R21), 104(R2) - ADCS R6, R22 - LDP 128(R2), (R7, R8) - ADCS R7, R23 - STP (R22, R23), 120(R2) - ADCS R8, R24 - MOVD R24, 136(R2) - ADC ZR, R29 - - // Load xL, yL - LDP 0(R0), (R3, R4) - LDP 16(R0), (R5, R6) - LDP 32(R0), (R7, R8) - LDP 0(R1), (R9, R10) - LDP 16(R1), (R11, R12) - LDP 32(R1), (R13, R14) - - // xL * yL - mul384x384karatsuba(24(R0), 24(R1), 0(R2), R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R19, R20, R21, R22, R23, R24, R25, R26) - - // (xH + xL) * (yH + yL) - xL * yL in R3-R14 - LDP 0(R2), (R12, R13) - LDP 48(R2), (R3, R4) - SUBS R12, R3 - LDP 64(R2), (R5, R6) - MOVD 16(R2), R14 - SBCS R13, R4 - SBCS R14, R5 - LDP 80(R2), (R7, R8) - SBCS R15, R6 - SBCS R16, R7 - LDP 96(R2), (R9, R10) - SBCS R17, R8 - SBCS R19, R9 - LDP 112(R2), (R11, R12) - SBCS R20, R10 - SBCS R21, R11 - LDP 128(R2), (R13, R14) - SBCS R22, R12 - SBCS R23, R13 - SBCS R24, R14 - SBC ZR, R29 - - STP (R15, R16), 24(R2) - MOVD R17, 40(R2) - - // ((xH + xL) * (yH + yL) - xL * yL) * 2^384 + xL * yL and store back in z - ADDS R19, R3 - ADCS R20, R4 - STP (R3, R4), 48(R2) - ADCS R21, R5 - ADCS R22, R6 - STP (R5, R6), 64(R2) - ADCS R23, R7 - ADCS R24, R8 - STP (R7, R8), 80(R2) - ADCS ZR, R9 - ADCS ZR, R10 - STP (R9, R10), 96(R2) - ADCS ZR, R11 - ADCS ZR, R12 - STP (R11, R12), 112(R2) - ADCS ZR, R13 - ADCS ZR, R14 - STP (R13, R14), 128(R2) - ADC ZR, R29 - - // Load xH, yH - LDP 48(R0), (R3, R4) - LDP 64(R0), (R5, R6) - LDP 80(R0), (R7, R8) - LDP 48(R1), (R9, R10) - LDP 64(R1), (R11, R12) - LDP 80(R1), (R13, R14) - - // xH * yH - mul384x384karatsuba(72(R0), 72(R1), 144(R2), R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R19, R20, R21, R22, R23, R24, R25, R26) - - LDP 144(R2), (R12, R13) - MOVD 160(R2), R14 - - // (xH + xL) * (yH + yL) - xL * yL - xH * yH in R3-R14 - // Store lower half in z, that's done - LDP 48(R2), (R3, R4) - SUBS R12, R3 - LDP 64(R2), (R5, R6) - SBCS R13, R4 - SBCS R14, R5 - LDP 80(R2), (R7, R8) - SBCS R15, R6 - SBCS R16, R7 - LDP 96(R2), (R9, R10) - SBCS R17, R8 - SBCS R19, R9 - LDP 112(R2), (R11, R12) - SBCS R20, R10 - SBCS R21, R11 - LDP 128(R2), (R13, R14) - SBCS R22, R12 - SBCS R23, R13 - STP (R3, R4), 48(R2) - SBCS R24, R14 - STP (R5, R6), 64(R2) - SBC ZR, R29 - STP (R7, R8), 80(R2) - - // (xH * yH) * 2^768 + ((xH + xL) * (yH + yL) - xL * yL - xH * yH) * 2^384 + xL * yL - // Store remaining limbs in z - LDP 144(R2), (R3, R4) - MOVD 160(R2), R5 - - ADDS R3, R9 - ADCS R4, R10 - STP (R9, R10), 96(R2) - ADCS R5, R11 - ADCS R15, R12 - STP (R11, R12), 112(R2) - ADCS R16, R13 - ADCS R17, R14 - STP (R13, R14), 128(R2) - - ADCS R29, R19 - ADCS ZR, R20 - STP (R19, R20), 144(R2) - ADCS ZR, R21 - ADCS ZR, R22 - STP (R21, R22), 160(R2) - ADCS ZR, R23 - ADC ZR, R24 - STP (R23, R24), 176(R2) - - RET - -TEXT ·rdcP751(SB), NOSPLIT, $0-16 - MOVD z+0(FP), R0 - MOVD x+8(FP), R1 - - // Load p751+1 in R14-R17, R29, R19-R20, spread over arithmetic - LDP ·P751p1+40(SB), (R14, R15) - // z0-z11 will be R2-R13 - // Load x0-x4 to z0-z4 and x5, spread over arithmetic - LDP 0(R1), (R2, R3) - - // x5 iteration - MUL R2, R14, R22 - LDP 32(R1), (R6, R21) - UMULH R2, R14, R23 - ADDS R21, R22, R7 // Set z5 - ADC ZR, R23, R25 - - // x6 iteration - MUL R2, R15, R22 - MOVD 48(R1), R21 - UMULH R2, R15, R23 - ADDS R22, R25 - ADC R23, ZR, R26 - - MUL R3, R14, R22 - LDP ·P751p1+56(SB), (R16, R17) - UMULH R3, R14, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, ZR, R24 - - ADDS R21, R25, R8 // Set z6 - ADCS ZR, R26 - ADC ZR, R24 - - // x7 iteration - MUL R2, R16, R22 - MOVD 56(R1), R21 - UMULH R2, R16, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, ZR, R25 - - MUL R3, R15, R22 - LDP 16(R1), (R4, R5) - UMULH R3, R15, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R4, R14, R22 - LDP ·P751p1+72(SB), (R29, R19) - UMULH R4, R14, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - ADDS R21, R26, R9 // Set z7 - ADCS ZR, R24 - ADC ZR, R25 - - // x8 iteration - MUL R2, R17, R22 - MOVD 64(R1), R21 - UMULH R2, R17, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, ZR, R26 - - MUL R3, R16, R22 - MOVD ·P751p1+88(SB), R20 - UMULH R3, R16, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R4, R15, R22 - UMULH R4, R15, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R5, R14, R22 - UMULH R5, R14, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - ADDS R24, R21, R10 // Set z8 - ADCS ZR, R25 - ADC ZR, R26 - - // x9 iteration - MUL R2, R29, R22 - MOVD 72(R1), R21 - UMULH R2, R29, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, ZR, R24 - - MUL R3, R17, R22 - UMULH R3, R17, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R4, R16, R22 - UMULH R4, R16, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R5, R15, R22 - UMULH R5, R15, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R6, R14, R22 - UMULH R6, R14, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - ADDS R21, R25, R11 // Set z9 - ADCS ZR, R26 - ADC ZR, R24 - - // x10 iteration - MUL R2, R19, R22 - MOVD 80(R1), R21 - UMULH R2, R19, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, ZR, R25 - - MUL R3, R29, R22 - UMULH R3, R29, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R4, R17, R22 - UMULH R4, R17, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R5, R16, R22 - UMULH R5, R16, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R6, R15, R22 - UMULH R6, R15, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R7, R14, R22 - UMULH R7, R14, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - ADDS R21, R26, R12 // Set z10 - ADCS ZR, R24 - ADC ZR, R25 - - // x11 iteration - MUL R2, R20, R22 - MOVD 88(R1), R21 - UMULH R2, R20, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, ZR, R26 - - MUL R3, R19, R22 - UMULH R3, R19, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R4, R29, R22 - UMULH R4, R29, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R5, R17, R22 - UMULH R5, R17, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R6, R16, R22 - UMULH R6, R16, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R7, R15, R22 - UMULH R7, R15, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R8, R14, R22 - UMULH R8, R14, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - ADDS R21, R24, R13 // Set z11 - ADCS ZR, R25 - ADC ZR, R26 - - // x12 iteration - MUL R3, R20, R22 - MOVD 96(R1), R21 - UMULH R3, R20, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, ZR, R24 - - MUL R4, R19, R22 - UMULH R4, R19, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R5, R29, R22 - UMULH R5, R29, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R6, R17, R22 - UMULH R6, R17, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R7, R16, R22 - UMULH R7, R16, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R8, R15, R22 - UMULH R8, R15, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R9, R14, R22 - UMULH R9, R14, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - ADDS R21, R25, R2 // Set z0 - ADCS ZR, R26 - ADC ZR, R24 - - // x13 iteration - MUL R4, R20, R22 - MOVD 104(R1), R21 - UMULH R4, R20, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, ZR, R25 - - MUL R5, R19, R22 - UMULH R5, R19, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R6, R29, R22 - UMULH R6, R29, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R7, R17, R22 - UMULH R7, R17, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R8, R16, R22 - UMULH R8, R16, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R9, R15, R22 - UMULH R9, R15, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R10, R14, R22 - UMULH R10, R14, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - ADDS R21, R26, R3 // Set z1 - STP (R2, R3), 0(R0) - ADCS ZR, R24 - ADC ZR, R25 - - // x14 iteration - MUL R5, R20, R22 - MOVD 112(R1), R21 - UMULH R5, R20, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, ZR, R26 - - MUL R6, R19, R22 - UMULH R6, R19, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R7, R29, R22 - UMULH R7, R29, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R8, R17, R22 - UMULH R8, R17, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R9, R16, R22 - UMULH R9, R16, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R10, R15, R22 - UMULH R10, R15, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R11, R14, R22 - UMULH R11, R14, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - ADDS R21, R24, R4 // Set z2 - ADCS ZR, R25 - ADC ZR, R26 - - // x15 iteration - MUL R6, R20, R22 - MOVD 120(R1), R21 - UMULH R6, R20, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, ZR, R24 - - MUL R7, R19, R22 - UMULH R7, R19, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R8, R29, R22 - UMULH R8, R29, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R9, R17, R22 - UMULH R9, R17, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R10, R16, R22 - UMULH R10, R16, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R11, R15, R22 - UMULH R11, R15, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R12, R14, R22 - UMULH R12, R14, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - ADDS R21, R25, R5 // Set z3 - STP (R4, R5), 16(R0) - ADCS ZR, R26 - ADC ZR, R24 - - // x16 iteration - MUL R7, R20, R22 - MOVD 128(R1), R21 - UMULH R7, R20, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, ZR, R25 - - MUL R8, R19, R22 - UMULH R8, R19, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R9, R29, R22 - UMULH R9, R29, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R10, R17, R22 - UMULH R10, R17, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R11, R16, R22 - UMULH R11, R16, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R12, R15, R22 - UMULH R12, R15, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R13, R14, R22 - UMULH R13, R14, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - ADDS R21, R26, R6 // Set z4 - ADCS ZR, R24 - ADC ZR, R25 - - // x17 iteration - MUL R8, R20, R22 - MOVD 136(R1), R21 - UMULH R8, R20, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, ZR, R26 - - MUL R9, R19, R22 - UMULH R9, R19, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R10, R29, R22 - UMULH R10, R29, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R11, R17, R22 - UMULH R11, R17, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R12, R16, R22 - UMULH R12, R16, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R13, R15, R22 - UMULH R13, R15, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - ADDS R21, R24, R7 // Set z5 - STP (R6, R7), 32(R0) - ADCS ZR, R25 - ADC ZR, R26 - - // x18 iteration - MUL R9, R20, R22 - MOVD 144(R1), R21 - UMULH R9, R20, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, ZR, R24 - - MUL R10, R19, R22 - UMULH R10, R19, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R11, R29, R22 - UMULH R11, R29, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R12, R17, R22 - UMULH R12, R17, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - MUL R13, R16, R22 - UMULH R13, R16, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - ADDS R21, R25, R8 // Set z6 - ADCS ZR, R26 - ADC ZR, R24 - - // x19 iteration - MUL R10, R20, R22 - MOVD 152(R1), R21 - UMULH R10, R20, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, ZR, R25 - - MUL R11, R19, R22 - UMULH R11, R19, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R12, R29, R22 - UMULH R12, R29, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - MUL R13, R17, R22 - UMULH R13, R17, R23 - ADDS R22, R26 - ADCS R23, R24 - ADC ZR, R25 - - ADDS R21, R26, R9 // Set z7 - STP (R8, R9), 48(R0) - ADCS ZR, R24 - ADC ZR, R25 - - // x20 iteration - MUL R11, R20, R22 - MOVD 160(R1), R21 - UMULH R11, R20, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, ZR, R26 - - MUL R12, R19, R22 - UMULH R12, R19, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - MUL R13, R29, R22 - UMULH R13, R29, R23 - ADDS R22, R24 - ADCS R23, R25 - ADC ZR, R26 - - ADDS R21, R24, R10 // Set z8 - ADCS ZR, R25 - ADC ZR, R26 - - // x21 iteration - MUL R12, R20, R22 - MOVD 168(R1), R21 - UMULH R12, R20, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, ZR, R24 - - MUL R13, R19, R22 - UMULH R13, R19, R23 - ADDS R22, R25 - ADCS R23, R26 - ADC ZR, R24 - - ADDS R21, R25, R11 // Set z9 - STP (R10, R11), 64(R0) - ADCS ZR, R26 - ADC ZR, R24 - - // x22 iteration - MUL R13, R20, R22 - MOVD 176(R1), R21 - UMULH R13, R20, R23 - ADDS R22, R26 - ADC R23, R24 - ADDS R21, R26, R12 // Set z10 - - MOVD 184(R1), R21 - ADC R21, R24, R13 // Set z11 - STP (R12, R13), 80(R0) - - RET - -TEXT ·modP751(SB), NOSPLIT, $0-8 - MOVD x+0(FP), R0 - - // Keep x in R1-R12, p751 in R13-R21, subtract to R1-R12 - MOVD ·P751+0(SB), R13 - LDP 0(R0), (R1, R2) - LDP 16(R0), (R3, R4) - SUBS R13, R1 - SBCS R13, R2 - - LDP 32(R0), (R5, R6) - LDP ·P751+40(SB), (R14, R15) - SBCS R13, R3 - SBCS R13, R4 - - LDP 48(R0), (R7, R8) - LDP ·P751+56(SB), (R16, R17) - SBCS R13, R5 - SBCS R14, R6 - - LDP 64(R0), (R9, R10) - LDP ·P751+72(SB), (R19, R20) - SBCS R15, R7 - SBCS R16, R8 - - LDP 80(R0), (R11, R12) - MOVD ·P751+88(SB), R21 - SBCS R17, R9 - SBCS R19, R10 - - SBCS R20, R11 - SBCS R21, R12 - SBC ZR, ZR, R22 - - // Mask with the borrow and add p751 - AND R22, R13 - AND R22, R14 - AND R22, R15 - AND R22, R16 - AND R22, R17 - AND R22, R19 - AND R22, R20 - AND R22, R21 - - ADDS R13, R1 - ADCS R13, R2 - STP (R1, R2), 0(R0) - ADCS R13, R3 - ADCS R13, R4 - STP (R3, R4), 16(R0) - ADCS R13, R5 - ADCS R14, R6 - STP (R5, R6), 32(R0) - ADCS R15, R7 - ADCS R16, R8 - STP (R7, R8), 48(R0) - ADCS R17, R9 - ADCS R19, R10 - STP (R9, R10), 64(R0) - ADCS R20, R11 - ADC R21, R12 - STP (R11, R12), 80(R0) - - RET diff --git a/dh/sidh/internal/p751/arith_decl.go b/dh/sidh/internal/p751/arith_decl.go deleted file mode 100644 index 9de57d5e..00000000 --- a/dh/sidh/internal/p751/arith_decl.go +++ /dev/null @@ -1,61 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -//go:build (amd64 && !purego) || (arm64 && !purego) -// +build amd64,!purego arm64,!purego - -package p751 - -import ( - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// If choice = 0, leave x unchanged. If choice = 1, sets x to y. -// If choice is neither 0 nor 1 then behaviour is undefined. -// This function executes in constant time. -// -//go:noescape -func cmovP751(x, y *Fp, choice uint8) - -// If choice = 0, leave x,y unchanged. If choice = 1, set x,y = y,x. -// If choice is neither 0 nor 1 then behaviour is undefined. -// This function executes in constant time. -// -//go:noescape -func cswapP751(x, y *Fp, choice uint8) - -// Compute z = x + y (mod p). -// -//go:noescape -func addP751(z, x, y *Fp) - -// Compute z = x - y (mod p). -// -//go:noescape -func subP751(z, x, y *Fp) - -// Compute z = x + y, without reducing mod p. -// -//go:noescape -func adlP751(z, x, y *FpX2) - -// Compute z = x - y, without reducing mod p. -// -//go:noescape -func sulP751(z, x, y *FpX2) - -// Reduce a field element in [0, 2*p) to one in [0,p). -// -//go:noescape -func modP751(x *Fp) - -// Computes z = x * y. -// -//go:noescape -func mulP751(z *FpX2, x, y *Fp) - -// Computes the Montgomery reduction z = x R^{-1} (mod 2*p). On return value -// of x may be changed. z=x not allowed. -// -//go:noescape -func rdcP751(z *Fp, x *FpX2) diff --git a/dh/sidh/internal/p751/arith_generic.go b/dh/sidh/internal/p751/arith_generic.go deleted file mode 100644 index 560b84b5..00000000 --- a/dh/sidh/internal/p751/arith_generic.go +++ /dev/null @@ -1,203 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -//go:build purego || (!amd64 && !arm64) -// +build purego !amd64,!arm64 - -package p751 - -import ( - "math/bits" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Compute z = x + y (mod p). -func addP751(z, x, y *common.Fp) { - var carry uint64 - - // z=x+y % P751 - for i := 0; i < FpWords; i++ { - z[i], carry = bits.Add64(x[i], y[i], carry) - } - - // z = z - P751x2 - carry = 0 - for i := 0; i < FpWords; i++ { - z[i], carry = bits.Sub64(z[i], P751x2[i], carry) - } - - // if z<0 add P751x2 back - mask := uint64(0 - carry) - carry = 0 - for i := 0; i < FpWords; i++ { - z[i], carry = bits.Add64(z[i], P751x2[i]&mask, carry) - } -} - -// Compute z = x - y (mod p). -func subP751(z, x, y *common.Fp) { - var borrow uint64 - - for i := 0; i < FpWords; i++ { - z[i], borrow = bits.Sub64(x[i], y[i], borrow) - } - - mask := uint64(0 - borrow) - borrow = 0 - - for i := 0; i < FpWords; i++ { - z[i], borrow = bits.Add64(z[i], P751x2[i]&mask, borrow) - } -} - -// If choice = 0, leave x unchanged. If choice = 1, sets x to y. -// If choice is neither 0 nor 1 then behaviour is undefined. -// This function executes in constant time. -func cmovP751(x, y *common.Fp, choice uint8) { - mask := 0 - uint64(choice) - for i := 0; i < FpWords; i++ { - x[i] ^= mask & (x[i] ^ y[i]) - } -} - -// Conditionally swaps bits in x and y in constant time. -// mask indicates bits to be swapped (set bits are swapped) -// For details see "Hackers Delight, 2.20" -// -// Implementation doesn't actually depend on a prime field. -func cswapP751(x, y *common.Fp, mask uint8) { - var tmp, mask64 uint64 - - mask64 = 0 - uint64(mask) - for i := 0; i < FpWords; i++ { - tmp = mask64 & (x[i] ^ y[i]) - x[i] = tmp ^ x[i] - y[i] = tmp ^ y[i] - } -} - -// Perform Montgomery reduction: set z = x R^{-1} (mod 2*p) -// with R=2^(FpWords*64). Destroys the input value. -func rdcP751(z *common.Fp, x *common.FpX2) { - var carry, t, u, v uint64 - var hi, lo uint64 - var count int - - count = P751p1Zeros - - for i := 0; i < FpWords; i++ { - for j := 0; j < i; j++ { - if j < (i - count + 1) { - hi, lo = bits.Mul64(z[j], P751p1[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - } - v, carry = bits.Add64(v, x[i], 0) - u, carry = bits.Add64(u, 0, carry) - t += carry - - z[i] = v - v = u - u = t - t = 0 - } - - for i := FpWords; i < 2*FpWords-1; i++ { - if count > 0 { - count-- - } - for j := i - FpWords + 1; j < FpWords; j++ { - if j < (FpWords - count) { - hi, lo = bits.Mul64(z[j], P751p1[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - } - v, carry = bits.Add64(v, x[i], 0) - u, carry = bits.Add64(u, 0, carry) - - t += carry - z[i-FpWords] = v - v = u - u = t - t = 0 - } - v, _ = bits.Add64(v, x[2*FpWords-1], 0) - z[FpWords-1] = v -} - -// Compute z = x * y. -func mulP751(z *common.FpX2, x, y *common.Fp) { - var u, v, t uint64 - var hi, lo uint64 - var carry uint64 - - for i := uint64(0); i < FpWords; i++ { - for j := uint64(0); j <= i; j++ { - hi, lo = bits.Mul64(x[j], y[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - z[i] = v - v = u - u = t - t = 0 - } - - for i := FpWords; i < (2*FpWords)-1; i++ { - for j := i - FpWords + 1; j < FpWords; j++ { - hi, lo = bits.Mul64(x[j], y[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - z[i] = v - v = u - u = t - t = 0 - } - z[2*FpWords-1] = v -} - -// Compute z = x + y, without reducing mod p. -func adlP751(z, x, y *common.FpX2) { - var carry uint64 - for i := 0; i < 2*FpWords; i++ { - z[i], carry = bits.Add64(x[i], y[i], carry) - } -} - -// Reduce a field element in [0, 2*p) to one in [0,p). -func modP751(x *common.Fp) { - var borrow, mask uint64 - for i := 0; i < FpWords; i++ { - x[i], borrow = bits.Sub64(x[i], P751[i], borrow) - } - - // Sets all bits if borrow = 1 - mask = 0 - borrow - borrow = 0 - for i := 0; i < FpWords; i++ { - x[i], borrow = bits.Add64(x[i], P751[i]&mask, borrow) - } -} - -// Compute z = x - y, without reducing mod p. -func sulP751(z, x, y *common.FpX2) { - var borrow, mask uint64 - for i := 0; i < 2*FpWords; i++ { - z[i], borrow = bits.Sub64(x[i], y[i], borrow) - } - - // Sets all bits if borrow = 1 - mask = 0 - borrow - borrow = 0 - for i := FpWords; i < 2*FpWords; i++ { - z[i], borrow = bits.Add64(z[i], P751[i-FpWords]&mask, borrow) - } -} diff --git a/dh/sidh/internal/p751/arith_test.go b/dh/sidh/internal/p751/arith_test.go deleted file mode 100644 index 99808a9c..00000000 --- a/dh/sidh/internal/p751/arith_test.go +++ /dev/null @@ -1,129 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p751 - -import ( - "testing" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Package-level storage for this field element is intended to deter -// compiler optimizations. -var ( - benchmarkFp common.Fp - benchmarkFpX2 common.FpX2 - bench_x = common.Fp{17026702066521327207, 5108203422050077993, 10225396685796065916, 11153620995215874678, 6531160855165088358, 15302925148404145445, 1248821577836769963, 9789766903037985294, 7493111552032041328, 10838999828319306046, 18103257655515297935, 27403304611634} - bench_y = common.Fp{4227467157325093378, 10699492810770426363, 13500940151395637365, 12966403950118934952, 16517692605450415877, 13647111148905630666, 14223628886152717087, 7167843152346903316, 15855377759596736571, 4300673881383687338, 6635288001920617779, 30486099554235} - bench_z = common.FpX2{1595347748594595712, 10854920567160033970, 16877102267020034574, 12435724995376660096, 3757940912203224231, 8251999420280413600, 3648859773438820227, 17622716832674727914, 11029567000887241528, 11216190007549447055, 17606662790980286987, 4720707159513626555, 12887743598335030915, 14954645239176589309, 14178817688915225254, 1191346797768989683, 12629157932334713723, 6348851952904485603, 16444232588597434895, 7809979927681678066, 14642637672942531613, 3092657597757640067, 10160361564485285723, 240071237} -) - -func TestFpCswap(t *testing.T) { - one := common.Fp{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} - two := common.Fp{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2} - - x := one - y := two - - cswapP751(&x, &y, 0) - for i := 0; i < FpWords; i++ { - if (x[i] != one[i]) || (y[i] != two[i]) { - t.Error("Found", x, "expected", one) - } - } - - cswapP751(&x, &y, 1) - for i := 0; i < FpWords; i++ { - if (x[i] != two[i]) || (y[i] != one[i]) { - t.Error("Found", x, "expected", two) - } - } -} - -func TestFpCmov(t *testing.T) { - one := common.Fp{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} - two := common.Fp{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2} - - x := one - y := two - - cmovP751(&x, &y, 0) - for i := 0; i < FpWords; i++ { - if x[i] != one[i] { - t.Error("Found", x, "expected", one) - } - if y[i] != two[i] { - t.Error("Found", y, "expected", two) - } - } - - cmovP751(&x, &y, 1) - for i := 0; i < FpWords; i++ { - if x[i] != two[i] { - t.Error("Found", x, "expected", two) - } - if y[i] != two[i] { - t.Error("Found", y, "expected", two) - } - } -} - -// Benchmarking for field arithmetic -func BenchmarkMul(b *testing.B) { - for n := 0; n < b.N; n++ { - mulP751(&benchmarkFpX2, &bench_x, &bench_y) - } -} - -func BenchmarkRdc(b *testing.B) { - z := bench_z - - // This benchmark actually computes garbage, because - // rdcP751 mangles its input, but since it's - // constant-time that shouldn't matter for the benchmarks. - for n := 0; n < b.N; n++ { - rdcP751(&benchmarkFp, &z) - } -} - -func BenchmarkAdd(b *testing.B) { - for n := 0; n < b.N; n++ { - addP751(&benchmarkFp, &bench_x, &bench_y) - } -} - -func BenchmarkSub(b *testing.B) { - for n := 0; n < b.N; n++ { - subP751(&benchmarkFp, &bench_x, &bench_y) - } -} - -func BenchmarkCswap(b *testing.B) { - x, y := bench_x, bench_y - for n := 0; n < b.N; n++ { - cswapP751(&x, &y, 1) - cswapP751(&x, &y, 0) - } -} - -func BenchmarkMod(b *testing.B) { - x := bench_x - for n := 0; n < b.N; n++ { - modP751(&x) - } -} - -func BenchmarkX2AddLazy(b *testing.B) { - x, y, z := bench_z, bench_z, bench_z - for n := 0; n < b.N; n++ { - adlP751(&x, &y, &z) - } -} - -func BenchmarkX2SubLazy(b *testing.B) { - x, y, z := bench_z, bench_z, bench_z - for n := 0; n < b.N; n++ { - sulP751(&x, &y, &z) - } -} diff --git a/dh/sidh/internal/p751/core.go b/dh/sidh/internal/p751/core.go deleted file mode 100644 index 76d5086e..00000000 --- a/dh/sidh/internal/p751/core.go +++ /dev/null @@ -1,300 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p751 - -import ( - crand "crypto/rand" - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// ----------------------------------------------------------------------------- -// Functions for traversing isogeny trees according to strategy. Key type 'A' is -// - -// Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed -// for public key generation. -func traverseTreePublicKeyA(curve *ProjectiveCurveParameters, xR, phiP, phiQ, phiR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny4 - - cparam := CalcCurveParamsEquiv4(curve) - strat := params.A.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow2k(xR, &cparam, 2*k) - i += int(k) - } - cparam = phi.GenerateCurve(xR) - - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - phi.EvaluatePoint(phiP) - phi.EvaluatePoint(phiQ) - phi.EvaluatePoint(phiR) - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Traverses isogeny tree in order to compute xR needed -// for public key generation. -func traverseTreeSharedKeyA(curve *ProjectiveCurveParameters, xR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny4 - - cparam := CalcCurveParamsEquiv4(curve) - strat := params.A.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow2k(xR, &cparam, 2*k) - i += int(k) - } - cparam = phi.GenerateCurve(xR) - - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed -// for public key generation. -func traverseTreePublicKeyB(curve *ProjectiveCurveParameters, xR, phiP, phiQ, phiR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny3 - - cparam := CalcCurveParamsEquiv3(curve) - strat := params.B.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow3k(xR, &cparam, k) - i += int(k) - } - - cparam = phi.GenerateCurve(xR) - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - - phi.EvaluatePoint(phiP) - phi.EvaluatePoint(phiQ) - phi.EvaluatePoint(phiR) - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed -// for public key generation. -func traverseTreeSharedKeyB(curve *ProjectiveCurveParameters, xR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny3 - - cparam := CalcCurveParamsEquiv3(curve) - strat := params.B.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow3k(xR, &cparam, k) - i += int(k) - } - - cparam = phi.GenerateCurve(xR) - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Generate a public key in the 2-torsion group. Public key is a set -// of three x-coordinates: xP,xQ,x(P-Q), where P,Q are points on E_a(Fp2) -func PublicKeyGenA(pub3Pt *[3]Fp2, prvBytes []byte) { - var xPA, xQA, xRA ProjectivePoint - var xPB, xQB, xRB, xR ProjectivePoint - var invZP, invZQ, invZR Fp2 - var phi isogeny4 - - // Load points for A - xPA = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - xQA = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - xRA = ProjectivePoint{X: params.A.AffineR, Z: params.OneFp2} - - // Load points for B - xRB = ProjectivePoint{X: params.B.AffineR, Z: params.OneFp2} - xQB = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - xPB = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Find isogeny kernel - xR = ScalarMul3Pt(¶ms.InitCurve, &xPA, &xQA, &xRA, params.A.SecretBitLen, prvBytes) - traverseTreePublicKeyA(¶ms.InitCurve, &xR, &xPB, &xQB, &xRB) - - // Secret isogeny - phi.GenerateCurve(&xR) - xPA = xPB - xQA = xQB - xRA = xRB - phi.EvaluatePoint(&xPA) - phi.EvaluatePoint(&xQA) - phi.EvaluatePoint(&xRA) - Fp2Batch3Inv(&xPA.Z, &xQA.Z, &xRA.Z, &invZP, &invZQ, &invZR) - - mul(&pub3Pt[0], &xPA.X, &invZP) - mul(&pub3Pt[1], &xQA.X, &invZQ) - mul(&pub3Pt[2], &xRA.X, &invZR) -} - -// Generate a public key in the 2-torsion group. Public key is a set -// of three x-coordinates: xP,xQ,x(P-Q), where P,Q are points on E_a(Fp2) -func PublicKeyGenB(pub3Pt *[3]Fp2, prvBytes []byte) { - var xPB, xQB, xRB, xR ProjectivePoint - var xPA, xQA, xRA ProjectivePoint - var invZP, invZQ, invZR Fp2 - var phi isogeny3 - - // Load points for B - xRB = ProjectivePoint{X: params.B.AffineR, Z: params.OneFp2} - xQB = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - xPB = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Load points for A - xPA = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - xQA = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - xRA = ProjectivePoint{X: params.A.AffineR, Z: params.OneFp2} - - // Find isogeny kernel - xR = ScalarMul3Pt(¶ms.InitCurve, &xPB, &xQB, &xRB, params.B.SecretBitLen, prvBytes) - traverseTreePublicKeyB(¶ms.InitCurve, &xR, &xPA, &xQA, &xRA) - - phi.GenerateCurve(&xR) - xPB = xPA - xQB = xQA - xRB = xRA - phi.EvaluatePoint(&xPB) - phi.EvaluatePoint(&xQB) - phi.EvaluatePoint(&xRB) - Fp2Batch3Inv(&xPB.Z, &xQB.Z, &xRB.Z, &invZP, &invZQ, &invZR) - - mul(&pub3Pt[0], &xPB.X, &invZP) - mul(&pub3Pt[1], &xQB.X, &invZQ) - mul(&pub3Pt[2], &xRB.X, &invZR) -} - -// ----------------------------------------------------------------------------- -// Key agreement functions -// - -// Establishing shared keys in in 2-torsion group -func DeriveSecretA(ss, prv []byte, pub3Pt *[3]Fp2) { - var xP, xQ, xQmP ProjectivePoint - var xR ProjectivePoint - var phi isogeny4 - var jInv Fp2 - - // Recover curve coefficients - cparam := params.InitCurve - RecoverCoordinateA(&cparam, &pub3Pt[0], &pub3Pt[1], &pub3Pt[2]) - - // Find kernel of the morphism - xP = ProjectivePoint{X: pub3Pt[0], Z: params.OneFp2} - xQ = ProjectivePoint{X: pub3Pt[1], Z: params.OneFp2} - xQmP = ProjectivePoint{X: pub3Pt[2], Z: params.OneFp2} - xR = ScalarMul3Pt(&cparam, &xP, &xQ, &xQmP, params.A.SecretBitLen, prv) - - // Traverse isogeny tree - traverseTreeSharedKeyA(&cparam, &xR) - - // Calculate j-invariant on isogenous curve - c := phi.GenerateCurve(&xR) - RecoverCurveCoefficients4(&cparam, &c) - Jinvariant(&cparam, &jInv) - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(ss, &jInv, params.Bytelen) -} - -// Establishing shared keys in in 3-torsion group -func DeriveSecretB(ss, prv []byte, pub3Pt *[3]Fp2) { - var xP, xQ, xQmP ProjectivePoint - var xR ProjectivePoint - var phi isogeny3 - var jInv Fp2 - - // Recover curve coefficients - cparam := params.InitCurve - RecoverCoordinateA(&cparam, &pub3Pt[0], &pub3Pt[1], &pub3Pt[2]) - - // Find kernel of the morphism - xP = ProjectivePoint{X: pub3Pt[0], Z: params.OneFp2} - xQ = ProjectivePoint{X: pub3Pt[1], Z: params.OneFp2} - xQmP = ProjectivePoint{X: pub3Pt[2], Z: params.OneFp2} - - //PUBLIC KEY VALIDATION - if err := PublicKeyValidation(&cparam, &xP, &xQ, &xQmP, params.B.SecretBitLen); err != nil { - _, err_read := crand.Read(ss) - if err_read != nil { - panic("core: failed to generate random ss when public key verification fails") - } - return - } - - xR = ScalarMul3Pt(&cparam, &xP, &xQ, &xQmP, params.B.SecretBitLen, prv) - - // Traverse isogeny tree - traverseTreeSharedKeyB(&cparam, &xR) - - // Calculate j-invariant on isogenous curve - c := phi.GenerateCurve(&xR) - RecoverCurveCoefficients3(&cparam, &c) - Jinvariant(&cparam, &jInv) - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(ss, &jInv, params.Bytelen) - -} diff --git a/dh/sidh/internal/p751/curve.go b/dh/sidh/internal/p751/curve.go deleted file mode 100644 index 677925cf..00000000 --- a/dh/sidh/internal/p751/curve.go +++ /dev/null @@ -1,431 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p751 - -import ( - "errors" - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "math" -) - -// Stores isogeny 3 curve constants -type isogeny3 struct { - K1 Fp2 - K2 Fp2 -} - -// Stores isogeny 4 curve constants -type isogeny4 struct { - isogeny3 - K3 Fp2 -} - -// Computes j-invariant for a curve y2=x3+A/Cx+x with A,C in F_(p^2). Result -// is returned in jBytes buffer, encoded in little-endian format. Caller -// provided jBytes buffer has to be big enough to j-invariant value. In case -// of SIDH, buffer size must be at least size of shared secret. -// Implementation corresponds to Algorithm 9 from SIKE. -func Jinvariant(cparams *ProjectiveCurveParameters, j *Fp2) { - var t0, t1 Fp2 - - sqr(j, &cparams.A) // j = A^2 - sqr(&t1, &cparams.C) // t1 = C^2 - add(&t0, &t1, &t1) // t0 = t1 + t1 - sub(&t0, j, &t0) // t0 = j - t0 - sub(&t0, &t0, &t1) // t0 = t0 - t1 - sub(j, &t0, &t1) // t0 = t0 - t1 - sqr(&t1, &t1) // t1 = t1^2 - mul(j, j, &t1) // j = j * t1 - add(&t0, &t0, &t0) // t0 = t0 + t0 - add(&t0, &t0, &t0) // t0 = t0 + t0 - sqr(&t1, &t0) // t1 = t0^2 - mul(&t0, &t0, &t1) // t0 = t0 * t1 - add(&t0, &t0, &t0) // t0 = t0 + t0 - add(&t0, &t0, &t0) // t0 = t0 + t0 - inv(j, j) // j = 1/j - mul(j, &t0, j) // j = t0 * j -} - -// Given affine points x(P), x(Q) and x(Q-P) in a extension field F_{p^2}, function -// recovers projective coordinate A of a curve. This is Algorithm 10 from SIKE. -func RecoverCoordinateA(curve *ProjectiveCurveParameters, xp, xq, xr *Fp2) { - var t0, t1 Fp2 - - add(&t1, xp, xq) // t1 = Xp + Xq - mul(&t0, xp, xq) // t0 = Xp * Xq - mul(&curve.A, xr, &t1) // A = X(q-p) * t1 - add(&curve.A, &curve.A, &t0) // A = A + t0 - mul(&t0, &t0, xr) // t0 = t0 * X(q-p) - sub(&curve.A, &curve.A, ¶ms.OneFp2) // A = A - 1 - add(&t0, &t0, &t0) // t0 = t0 + t0 - add(&t1, &t1, xr) // t1 = t1 + X(q-p) - add(&t0, &t0, &t0) // t0 = t0 + t0 - sqr(&curve.A, &curve.A) // A = A^2 - inv(&t0, &t0) // t0 = 1/t0 - mul(&curve.A, &curve.A, &t0) // A = A * t0 - sub(&curve.A, &curve.A, &t1) // A = A - t1 -} - -// Computes equivalence (A:C) ~ (A+2C : A-2C) -func CalcCurveParamsEquiv3(cparams *ProjectiveCurveParameters) CurveCoefficientsEquiv { - var coef CurveCoefficientsEquiv - var c2 Fp2 - - add(&c2, &cparams.C, &cparams.C) - // A24p = A+2*C - add(&coef.A, &cparams.A, &c2) - // A24m = A-2*C - sub(&coef.C, &cparams.A, &c2) - return coef -} - -// Computes equivalence (A:C) ~ (A+2C : 4C) -func CalcCurveParamsEquiv4(cparams *ProjectiveCurveParameters) CurveCoefficientsEquiv { - var coefEq CurveCoefficientsEquiv - - add(&coefEq.C, &cparams.C, &cparams.C) - // A24p = A+2C - add(&coefEq.A, &cparams.A, &coefEq.C) - // C24 = 4*C - add(&coefEq.C, &coefEq.C, &coefEq.C) - return coefEq -} - -// Helper function for RightToLeftLadder(). Returns A+2C / 4. -func CalcAplus2Over4(cparams *ProjectiveCurveParameters) (ret Fp2) { - var tmp Fp2 - - // 2C - add(&tmp, &cparams.C, &cparams.C) - // A+2C - add(&ret, &cparams.A, &tmp) - // 1/4C - add(&tmp, &tmp, &tmp) - inv(&tmp, &tmp) - // A+2C/4C - mul(&ret, &ret, &tmp) - return -} - -// Recovers (A:C) curve parameters from projectively equivalent (A+2C:A-2C). -func RecoverCurveCoefficients3(cparams *ProjectiveCurveParameters, coefEq *CurveCoefficientsEquiv) { - add(&cparams.A, &coefEq.A, &coefEq.C) - // cparams.A = 2*(A+2C+A-2C) = 4A - add(&cparams.A, &cparams.A, &cparams.A) - // cparams.C = (A+2C-A+2C) = 4C - sub(&cparams.C, &coefEq.A, &coefEq.C) - return -} - -// Recovers (A:C) curve parameters from projectively equivalent (A+2C:4C). -func RecoverCurveCoefficients4(cparams *ProjectiveCurveParameters, coefEq *CurveCoefficientsEquiv) { - // cparams.C = (4C)*1/2=2C - mul(&cparams.C, &coefEq.C, ¶ms.HalfFp2) - // cparams.A = A+2C - 2C = A - sub(&cparams.A, &coefEq.A, &cparams.C) - // cparams.C = 2C * 1/2 = C - mul(&cparams.C, &cparams.C, ¶ms.HalfFp2) -} - -// Combined coordinate doubling and differential addition. Takes projective points -// P,Q,Q-P and (A+2C)/4C curve E coefficient. Returns 2*P and P+Q calculated on E. -// Function is used only by RightToLeftLadder. Corresponds to Algorithm 5 of SIKE -func xDbladd(P, Q, QmP *ProjectivePoint, a24 *Fp2) (dblP, PaQ ProjectivePoint) { - var t0, t1, t2 Fp2 - - xQmP, zQmP := &QmP.X, &QmP.Z - xPaQ, zPaQ := &PaQ.X, &PaQ.Z - x2P, z2P := &dblP.X, &dblP.Z - xP, zP := &P.X, &P.Z - xQ, zQ := &Q.X, &Q.Z - - add(&t0, xP, zP) // t0 = Xp+Zp - sub(&t1, xP, zP) // t1 = Xp-Zp - sqr(x2P, &t0) // 2P.X = t0^2 - sub(&t2, xQ, zQ) // t2 = Xq-Zq - add(xPaQ, xQ, zQ) // Xp+q = Xq+Zq - mul(&t0, &t0, &t2) // t0 = t0 * t2 - mul(z2P, &t1, &t1) // 2P.Z = t1 * t1 - mul(&t1, &t1, xPaQ) // t1 = t1 * Xp+q - sub(&t2, x2P, z2P) // t2 = 2P.X - 2P.Z - mul(x2P, x2P, z2P) // 2P.X = 2P.X * 2P.Z - mul(xPaQ, a24, &t2) // Xp+q = A24 * t2 - sub(zPaQ, &t0, &t1) // Zp+q = t0 - t1 - add(z2P, xPaQ, z2P) // 2P.Z = Xp+q + 2P.Z - add(xPaQ, &t0, &t1) // Xp+q = t0 + t1 - mul(z2P, z2P, &t2) // 2P.Z = 2P.Z * t2 - sqr(zPaQ, zPaQ) // Zp+q = Zp+q ^ 2 - sqr(xPaQ, xPaQ) // Xp+q = Xp+q ^ 2 - mul(zPaQ, xQmP, zPaQ) // Zp+q = Xq-p * Zp+q - mul(xPaQ, zQmP, xPaQ) // Xp+q = Zq-p * Xp+q - return -} - -// Given the curve parameters, xP = x(P), computes xP = x([2^k]P) -// Safe to overlap xP, x2P. -func Pow2k(xP *ProjectivePoint, params *CurveCoefficientsEquiv, k uint32) { - var t0, t1 Fp2 - - x, z := &xP.X, &xP.Z - for i := uint32(0); i < k; i++ { - sub(&t0, x, z) // t0 = Xp - Zp - add(&t1, x, z) // t1 = Xp + Zp - sqr(&t0, &t0) // t0 = t0 ^ 2 - sqr(&t1, &t1) // t1 = t1 ^ 2 - mul(z, ¶ms.C, &t0) // Z2p = C24 * t0 - mul(x, z, &t1) // X2p = Z2p * t1 - sub(&t1, &t1, &t0) // t1 = t1 - t0 - mul(&t0, ¶ms.A, &t1) // t0 = A24+ * t1 - add(z, z, &t0) // Z2p = Z2p + t0 - mul(z, z, &t1) // Zp = Z2p * t1 - } -} - -// Given the curve parameters, xP = x(P), and k >= 0, compute xP = x([3^k]P). -// -// Safe to overlap xP, xR. -func Pow3k(xP *ProjectivePoint, params *CurveCoefficientsEquiv, k uint32) { - var t0, t1, t2, t3, t4, t5, t6 Fp2 - - x, z := &xP.X, &xP.Z - for i := uint32(0); i < k; i++ { - sub(&t0, x, z) // t0 = Xp - Zp - sqr(&t2, &t0) // t2 = t0^2 - add(&t1, x, z) // t1 = Xp + Zp - sqr(&t3, &t1) // t3 = t1^2 - add(&t4, &t1, &t0) // t4 = t1 + t0 - sub(&t0, &t1, &t0) // t0 = t1 - t0 - sqr(&t1, &t4) // t1 = t4^2 - sub(&t1, &t1, &t3) // t1 = t1 - t3 - sub(&t1, &t1, &t2) // t1 = t1 - t2 - mul(&t5, &t3, ¶ms.A) // t5 = t3 * A24+ - mul(&t3, &t3, &t5) // t3 = t5 * t3 - mul(&t6, &t2, ¶ms.C) // t6 = t2 * A24- - mul(&t2, &t2, &t6) // t2 = t2 * t6 - sub(&t3, &t2, &t3) // t3 = t2 - t3 - sub(&t2, &t5, &t6) // t2 = t5 - t6 - mul(&t1, &t2, &t1) // t1 = t2 * t1 - add(&t2, &t3, &t1) // t2 = t3 + t1 - sqr(&t2, &t2) // t2 = t2^2 - mul(x, &t2, &t4) // X3p = t2 * t4 - sub(&t1, &t3, &t1) // t1 = t3 - t1 - sqr(&t1, &t1) // t1 = t1^2 - mul(z, &t1, &t0) // Z3p = t1 * t0 - } -} - -// Set (y1, y2, y3) = (1/x1, 1/x2, 1/x3). -// -// All xi, yi must be distinct. -func Fp2Batch3Inv(x1, x2, x3, y1, y2, y3 *Fp2) { - var x1x2, t Fp2 - - mul(&x1x2, x1, x2) // x1*x2 - mul(&t, &x1x2, x3) // 1/(x1*x2*x3) - inv(&t, &t) - mul(y1, &t, x2) // 1/x1 - mul(y1, y1, x3) - mul(y2, &t, x1) // 1/x2 - mul(y2, y2, x3) - mul(y3, &t, &x1x2) // 1/x3 -} - -// Scalarmul3Pt is a right-to-left point multiplication that given the -// x-coordinate of P, Q and P-Q calculates the x-coordinate of R=Q+[scalar]P. -// nbits must be smaller or equal to len(scalar). -func ScalarMul3Pt(cparams *ProjectiveCurveParameters, P, Q, PmQ *ProjectivePoint, nbits uint, scalar []uint8) ProjectivePoint { - var R0, R2, R1 ProjectivePoint - aPlus2Over4 := CalcAplus2Over4(cparams) - R1 = *P - R2 = *PmQ - R0 = *Q - - // Iterate over the bits of the scalar, bottom to top - prevBit := uint8(0) - for i := uint(0); i < nbits; i++ { - bit := (scalar[i>>3] >> (i & 7) & 1) - swap := prevBit ^ bit - prevBit = bit - cswap(&R1.X, &R1.Z, &R2.X, &R2.Z, swap) - R0, R2 = xDbladd(&R0, &R2, &R1, &aPlus2Over4) - } - cswap(&R1.X, &R1.Z, &R2.X, &R2.Z, prevBit) - return R1 -} - -// Given a three-torsion point p = x(PB) on the curve E_(A:C), construct the -// three-isogeny phi : E_(A:C) -> E_(A:C)/ = E_(A':C'). -// -// Input: (XP_3: ZP_3), where P_3 has exact order 3 on E_A/C -// Output: -// - Curve coordinates (A' + 2C', A' - 2C') corresponding to E_A'/C' = A_E/C/ -// - Isogeny phi with constants in F_p^2 -func (phi *isogeny3) GenerateCurve(p *ProjectivePoint) CurveCoefficientsEquiv { - var t0, t1, t2, t3, t4 Fp2 - var coefEq CurveCoefficientsEquiv - K1, K2 := &phi.K1, &phi.K2 - - sub(K1, &p.X, &p.Z) // K1 = XP3 - ZP3 - sqr(&t0, K1) // t0 = K1^2 - add(K2, &p.X, &p.Z) // K2 = XP3 + ZP3 - sqr(&t1, K2) // t1 = K2^2 - add(&t2, &t0, &t1) // t2 = t0 + t1 - add(&t3, K1, K2) // t3 = K1 + K2 - sqr(&t3, &t3) // t3 = t3^2 - sub(&t3, &t3, &t2) // t3 = t3 - t2 - add(&t2, &t1, &t3) // t2 = t1 + t3 - add(&t3, &t3, &t0) // t3 = t3 + t0 - add(&t4, &t3, &t0) // t4 = t3 + t0 - add(&t4, &t4, &t4) // t4 = t4 + t4 - add(&t4, &t1, &t4) // t4 = t1 + t4 - mul(&coefEq.C, &t2, &t4) // A24m = t2 * t4 - add(&t4, &t1, &t2) // t4 = t1 + t2 - add(&t4, &t4, &t4) // t4 = t4 + t4 - add(&t4, &t0, &t4) // t4 = t0 + t4 - mul(&t4, &t3, &t4) // t4 = t3 * t4 - sub(&t0, &t4, &coefEq.C) // t0 = t4 - A24m - add(&coefEq.A, &coefEq.C, &t0) // A24p = A24m + t0 - return coefEq -} - -// Given a 3-isogeny phi and a point pB = x(PB), compute x(QB), the x-coordinate -// of the image QB = phi(PB) of PB under phi : E_(A:C) -> E_(A':C'). -// -// The output xQ = x(Q) is then a point on the curve E_(A':C'); the curve -// parameters are returned by the GenerateCurve function used to construct phi. -func (phi *isogeny3) EvaluatePoint(p *ProjectivePoint) { - var t0, t1, t2 Fp2 - K1, K2 := &phi.K1, &phi.K2 - px, pz := &p.X, &p.Z - - add(&t0, px, pz) // t0 = XQ + ZQ - sub(&t1, px, pz) // t1 = XQ - ZQ - mul(&t0, K1, &t0) // t2 = K1 * t0 - mul(&t1, K2, &t1) // t1 = K2 * t1 - add(&t2, &t0, &t1) // t2 = t0 + t1 - sub(&t0, &t1, &t0) // t0 = t1 - t0 - sqr(&t2, &t2) // t2 = t2 ^ 2 - sqr(&t0, &t0) // t0 = t0 ^ 2 - mul(px, px, &t2) // XQ'= XQ * t2 - mul(pz, pz, &t0) // ZQ'= ZQ * t0 -} - -// Given a four-torsion point p = x(PB) on the curve E_(A:C), construct the -// four-isogeny phi : E_(A:C) -> E_(A:C)/ = E_(A':C'). -// -// Input: (XP_4: ZP_4), where P_4 has exact order 4 on E_A/C -// Output: -// - Curve coordinates (A' + 2C', 4C') corresponding to E_A'/C' = A_E/C/ -// - Isogeny phi with constants in F_p^2 -func (phi *isogeny4) GenerateCurve(p *ProjectivePoint) CurveCoefficientsEquiv { - var coefEq CurveCoefficientsEquiv - xp4, zp4 := &p.X, &p.Z - K1, K2, K3 := &phi.K1, &phi.K2, &phi.K3 - - sub(K2, xp4, zp4) - add(K3, xp4, zp4) - sqr(K1, zp4) - add(K1, K1, K1) - sqr(&coefEq.C, K1) - add(K1, K1, K1) - sqr(&coefEq.A, xp4) - add(&coefEq.A, &coefEq.A, &coefEq.A) - sqr(&coefEq.A, &coefEq.A) - return coefEq -} - -// Given a 4-isogeny phi and a point xP = x(P), compute x(Q), the x-coordinate -// of the image Q = phi(P) of P under phi : E_(A:C) -> E_(A':C'). -// -// Input: Isogeny returned by GenerateCurve and point q=(Qx,Qz) from E0_A/C -// Output: Corresponding point q from E1_A'/C', where E1 is 4-isogenous to E0 -func (phi *isogeny4) EvaluatePoint(p *ProjectivePoint) { - var t0, t1 Fp2 - xq, zq := &p.X, &p.Z - K1, K2, K3 := &phi.K1, &phi.K2, &phi.K3 - - add(&t0, xq, zq) - sub(&t1, xq, zq) - mul(xq, &t0, K2) - mul(zq, &t1, K3) - mul(&t0, &t0, &t1) - mul(&t0, &t0, K1) - add(&t1, xq, zq) - sub(zq, xq, zq) - sqr(&t1, &t1) - sqr(zq, zq) - add(xq, &t0, &t1) - sub(&t0, zq, &t0) - mul(xq, xq, &t1) - mul(zq, zq, &t0) -} - -// PublicKeyValidation preforms public key/ciphertext validation using the CLN test. -// CLN test: Check that P and Q are both of order 3^e3 and they generate the torsion E_A[3^e3] -// A countermeasure for remote timing attacks on SIKE; suggested by https://eprint.iacr.org/2022/054.pdf -// Any curve E_A (SIKE 434, 503, 751) that passes CLN test is supersingular. -// Input: The public key / ciphertext P, Q, PmQ. The projective coordinate A of the curve defined by (P, Q, PmQ) -// Outputs: Whether (P,Q,PmQ) follows the CLN test -func PublicKeyValidation(cparams *ProjectiveCurveParameters, P, Q, PmQ *ProjectivePoint, nbits uint) error { - - var PmQX, PmQZ Fp2 - FromMontgomery(&PmQX, &PmQ.X) - FromMontgomery(&PmQZ, &PmQ.Z) - - // PmQ is not point T or O - if (isZero(&PmQX) == 1) || (isZero(&PmQZ) == 1) { - return errors.New("curve: PmQ is invalid") - } - - cparam := CalcCurveParamsEquiv3(cparams) - - // Compute e_3 = log3(2^(nbits+1)) - var e3 uint32 - e3_float := float64(int(nbits)+1) / math.Log2(3) - e3 = uint32(e3_float) - - // Verify that P and Q generate E_A[3^e_3] by checking: [3^(e_3-1)]P != [+-3^(e_3-1)]Q - var test_P, test_Q ProjectivePoint - test_P = *P - test_Q = *Q - - Pow3k(&test_P, &cparam, e3-1) - Pow3k(&test_Q, &cparam, e3-1) - - var PZ, QZ Fp2 - FromMontgomery(&PZ, &test_P.Z) - FromMontgomery(&QZ, &test_Q.Z) - - // P, Q are not of full order 3^e_3 - if (isZero(&PZ) == 1) || (isZero(&QZ) == 1) { - return errors.New("curve: ciphertext/public key are not of full order 3^e3") - } - - // PX/PZ = affine(PX) - // QX/QZ = affine(QX) - // If PX/PZ = QX/QZ, we have P=+-Q - var PXQZ_PZQX_fromMont, PXQZ_PZQX, PXQZ, PZQX Fp2 - mul(&PXQZ, &test_P.X, &test_Q.Z) - mul(&PZQX, &test_P.Z, &test_Q.X) - sub(&PXQZ_PZQX, &PXQZ, &PZQX) - FromMontgomery(&PXQZ_PZQX_fromMont, &PXQZ_PZQX) - - // [3^(e_3-1)]P == [+-3^(e_3-1)]Q - if isZero(&PXQZ_PZQX_fromMont) == 1 { - return errors.New("curve: ciphertext/public key are not linearly independent") - } - - // Check that Ord(P) = Ord(Q) = 3^(e_3) - Pow3k(&test_P, &cparam, 1) - Pow3k(&test_Q, &cparam, 1) - - FromMontgomery(&PZ, &test_P.Z) - FromMontgomery(&QZ, &test_Q.Z) - - // P, Q are not of correct order 3^e_3 - if (isZero(&PZ) == 0) || (isZero(&QZ) == 0) { - return errors.New("curve: ciphertext/public key are not of correct order 3^e3") - } - return nil -} diff --git a/dh/sidh/internal/p751/curve_test.go b/dh/sidh/internal/p751/curve_test.go deleted file mode 100644 index 6a0b4c4e..00000000 --- a/dh/sidh/internal/p751/curve_test.go +++ /dev/null @@ -1,392 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p751 - -import ( - "bytes" - crand "crypto/rand" - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "io" - "math" - "math/rand" - "testing" - "time" -) - -func vartimeEqProjFp2(lhs, rhs *ProjectivePoint) bool { - var t0, t1 Fp2 - mul(&t0, &lhs.X, &rhs.Z) - mul(&t1, &lhs.Z, &rhs.X) - return vartimeEqFp2(&t0, &t1) -} - -func toAffine(point *ProjectivePoint) *Fp2 { - var affineX Fp2 - inv(&affineX, &point.Z) - mul(&affineX, &affineX, &point.X) - return &affineX -} - -func Test_jInvariant(t *testing.T) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - jbufRes := make([]byte, params.SharedSecretSize) - jbufExp := make([]byte, params.SharedSecretSize) - var jInv Fp2 - - Jinvariant(&curve, &jInv) - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(jbufRes, &jInv, params.Bytelen) - - jInv = expectedJ - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(jbufExp, &jInv, params.Bytelen) - - if !bytes.Equal(jbufRes[:], jbufExp[:]) { - t.Error("Computed incorrect j-invariant: found\n", jbufRes, "\nexpected\n", jbufExp) - } -} - -func TestProjectivePointVartimeEq(t *testing.T) { - var xP ProjectivePoint - - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - xQ := xP - - // Scale xQ, which results in the same projective point - mul(&xQ.X, &xQ.X, &curveA) - mul(&xQ.Z, &xQ.Z, &curveA) - if !vartimeEqProjFp2(&xP, &xQ) { - t.Error("Expected the scaled point to be equal to the original") - } -} - -func TestPointMulVersusSage(t *testing.T) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - cparams := CalcCurveParamsEquiv4(&curve) - var xP ProjectivePoint - - // x 2 - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - Pow2k(&xP, &cparams, 1) - afxQ := toAffine(&xP) - if !vartimeEqFp2(afxQ, &affineXP2) { - t.Error("\nExpected\n", affineXP2, "\nfound\n", afxQ) - } - - // x 4 - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - Pow2k(&xP, &cparams, 2) - afxQ = toAffine(&xP) - if !vartimeEqFp2(afxQ, &affineXP4) { - t.Error("\nExpected\n", affineXP4, "\nfound\n", afxQ) - } -} - -func TestPointMul9VersusSage(t *testing.T) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - cparams := CalcCurveParamsEquiv3(&curve) - var xP ProjectivePoint - - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - Pow3k(&xP, &cparams, 2) - afxQ := toAffine(&xP) - if !vartimeEqFp2(afxQ, &affineXP9) { - t.Error("\nExpected\n", affineXP9, "\nfound\n", afxQ) - } -} - -func BenchmarkThreePointLadder(b *testing.B) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - for n := 0; n < b.N; n++ { - ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(scalar3Pt)*8), scalar3Pt[:]) - } -} - -/* ------------------------------------------------------------------------- - Generate invalid public key points / ciphertext for test TestKEMInvalidPK - -------------------------------------------------------------------------*/ - -// Left-to-right Montgomery ladder, Algorithm 4 in Costello-Smith -// Input: ProjectivePoint P (xP, zP) -// Output: x([scalar]P), z([scalar]P) -func montgomeryLadder(cparams *ProjectiveCurveParameters, P *ProjectivePoint, scalar []uint8, random uint) ProjectivePoint { - var R0, R2, R1 ProjectivePoint - coefEq := CalcCurveParamsEquiv4(cparams) // for xDbl - aPlus2Over4 := CalcAplus2Over4(cparams) // for xDblAdd - R0 = *P // RO <- P - R1 = *P - Pow2k(&R1, &coefEq, 1) // R1 <- [2]P - R2 = *P // R2 = R1-R0 = P - - prevBit := uint8(0) - for i := int(random); i >= 0; i-- { - bit := (scalar[i>>3] >> (i & 7) & 1) - swap := prevBit ^ bit - prevBit = bit - cswap(&R0.X, &R0.Z, &R1.X, &R1.Z, swap) - R0, R1 = xDbladd(&R0, &R1, &R2, &aPlus2Over4) - } - cswap(&R0.X, &R0.Z, &R1.X, &R1.Z, prevBit) - return R0 -} - -// P = P + T -// From paper https://eprint.iacr.org/2017/212.pdf -// The map tau_T: P->P+T is (X : Z) -> (Z : X) on Montgomery curves -func tauT(P *ProjectivePoint) { - P.X, P.Z = P.Z, P.X // magic! -} - -// Construct Invalid public key tuple (P,Q) such that P and Q are linearly dependent -// Simulate section 3.1.1 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKNoneLinear(t *testing.T) { - - // Generate random scalar as secret - secret := make([]byte, params.B.SecretByteLen) - _, err := io.ReadFull(crand.Reader, secret) - if err != nil { - t.Error("Fail read random bytes") - } - - var P, Q ProjectivePoint - - rand.Seed(time.Now().UnixNano()) - random_index := rand.Intn(int(params.B.SecretByteLen-1) * 8) - - // Set P as a point of order 3^e3 - P = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Set Q = [k]P, where k = secret[:random_index] - Q = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index)) - - // Make sure Q is of full order 3^e_3, - var test_Q ProjectivePoint - test_Q = Q - - var e3 uint32 - e3_float := float64(int(params.B.SecretBitLen)+1) / math.Log2(3) - e3 = uint32(e3_float) - cparam_q := CalcCurveParamsEquiv3(¶ms.InitCurve) - Pow3k(&test_Q, &cparam_q, e3-1) - - var test_QZ Fp2 - FromMontgomery(&test_QZ, &test_Q.Z) - - // Q are not of full order 3^e_3 - for isZero(&test_QZ) == 1 { - rand.Seed(time.Now().UnixNano()) - random_index = rand.Intn(int(params.B.SecretByteLen-1) * 8) - Q = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index)) - test_Q = Q - Pow3k(&test_Q, &cparam_q, e3-1) - FromMontgomery(&test_QZ, &test_Q.Z) - } - - // invQz = 1/Q.Z - var invQz Fp2 - invQz = Q.Z - inv(&invQz, &invQz) - - mul(&P.X, &P.X, &P.Z) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect linearly dependent ciphertext to fail, index: %v scalar: %v ", random_index, secret) - } -} - -// Construct Invalid public key tuple (P,Q) such that Q = [k]P + T, where k is random and T is the point of order 2. -// Simulate HB and section 3.1.2 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKT(t *testing.T) { - - // Generate random scalar as secret - secret := make([]byte, params.B.SecretByteLen) - _, err := io.ReadFull(crand.Reader, secret) - if err != nil { - t.Error("Fail read random bytes") - } - - var P, Q ProjectivePoint - - rand.Seed(time.Now().UnixNano()) - random_index := rand.Intn(int(params.B.SecretByteLen-1) * 8) - - // Set P as a point of order 3^e3 - P = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Set Q = [k]P, where k = secret[:random_index] - Q = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index)) - // Q = [k]P + T - tauT(&Q) - - var invQz Fp2 - invQz = Q.Z - inv(&invQz, &invQz) - - mul(&P.X, &P.X, &P.Z) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect ciphertext involve point T to fail, index: %v scalar: %v ", random_index, secret) - } -} - -// Construct Invalid public key tuple (P,Q) such that P and Q are in E[2^e2] -// Simulate section 3.2 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKOrder2(t *testing.T) { - - // Generate random scalar as secret - secret := make([]byte, params.B.SecretByteLen) - _, err := io.ReadFull(crand.Reader, secret) - if err != nil { - t.Error("Fail read random bytes") - } - - var P, Q ProjectivePoint - - P = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - Q = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - - rand.Seed(time.Now().UnixNano()) - random_index_p := rand.Intn(int(params.A.SecretByteLen-1) * 8) - random_index_q := rand.Intn(int(params.A.SecretByteLen-1) * 8) - - P = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index_p)) - Q = montgomeryLadder(¶ms.InitCurve, &Q, secret, uint(random_index_q)) - - var invQz, invPz Fp2 - invQz = Q.Z - invPz = P.Z - inv(&invQz, &invQz) - inv(&invPz, &invPz) - - mul(&P.X, &P.X, &invPz) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect ciphertext in torsion E[2^e2] to fail, index_p: %v index_q: %v scalar: %v ", random_index_p, random_index_q, secret) - } - -} - -// Construct Invalid public key tuple (P,Q) such that P and Q are in E[3^e3] but not of full order 3^e3 -// Simulate section 3.1.1 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKFullOrder(t *testing.T) { - - var P, Q ProjectivePoint - - P = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - Q = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - - var e3 uint32 - e3_float := float64(int(params.B.SecretBitLen)+1) / math.Log2(3) - e3 = uint32(e3_float) - - rand.Seed(time.Now().UnixNano()) - random_index_p := rand.Intn(int(e3)) - random_index_q := rand.Intn(int(e3)) - - cparam_q := CalcCurveParamsEquiv3(¶ms.InitCurve) - Pow3k(&P, &cparam_q, uint32(random_index_p)) - Pow3k(&Q, &cparam_q, uint32(random_index_q)) - - var invQz, invPz Fp2 - invQz = Q.Z - invPz = P.Z - inv(&invQz, &invQz) - inv(&invPz, &invPz) - - mul(&P.X, &P.X, &invPz) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect ciphertext not of full order to fail, index_p: %v index_q: %v ", random_index_p, random_index_q) - } - -} - -// A trivial test case not covered by paper https://eprint.iacr.org/2022/054.pdf and HB -// Countermeasure in https://eprint.iacr.org/2022/054.pdf only cares about P and Q -// But if PmQ is point T or O, that can also lead to recovery of the first bit -func testInvalidPmQ(t *testing.T) { - - var zero Fp2 - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - xQ = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - xQmP = ProjectivePoint{X: zero, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify == nil { - t.Errorf("\nExpect PmQ as T to fail\n") - } - -} - -// Test valid ciphertext -// Where P, Q are linearly independent points of correct order 3^e3 in E[3^e3] -func testValidPQ(t *testing.T) { - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - xQ = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify != nil { - t.Errorf("\nExpect correct ciphertext to not fail\n") - } - -} - -/* ------------------------------------------------------------------------- - Public key / Ciphertext validation against attacks proposed in paper https://eprint.iacr.org/2022/054.pdf and HB - -------------------------------------------------------------------------*/ - -func TestInvalidPK(t *testing.T) { - - t.Run("InvalidPmQ", testInvalidPmQ) - t.Run("InvalidPKNoneLinear", testInvalidPKNoneLinear) - t.Run("InvalidPKT", testInvalidPKT) - t.Run("InvalidPKOrder2", testInvalidPKOrder2) - t.Run("InvalidPKFullOrder", testInvalidPKFullOrder) - t.Run("ValidPQ", testValidPQ) - -} diff --git a/dh/sidh/internal/p751/doc.go b/dh/sidh/internal/p751/doc.go deleted file mode 100644 index fb774fec..00000000 --- a/dh/sidh/internal/p751/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package p751 provides implementation of field arithmetic used in SIDH and SIKE. -package p751 diff --git a/dh/sidh/internal/p751/fp2.go b/dh/sidh/internal/p751/fp2.go deleted file mode 100644 index 14de3dc5..00000000 --- a/dh/sidh/internal/p751/fp2.go +++ /dev/null @@ -1,222 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p751 - -import ( - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Montgomery multiplication. Input values must be already -// in Montgomery domain. -func mulP(dest, lhs, rhs *common.Fp) { - var ab common.FpX2 - mulP751(&ab, lhs, rhs) // = a*b*R*R - rdcP751(dest, &ab) // = a*b*R mod p -} - -// Set dest = x^((p-3)/4). If x is square, this is 1/sqrt(x). -// Uses variation of sliding-window algorithm from with window size -// of 5 and least to most significant bit sliding (left-to-right) -// See HAC 14.85 for general description. -// -// Allowed to overlap x with dest. -// All values in Montgomery domains -// Set dest = x^(2^k), for k >= 1, by repeated squarings. -func p34(dest, x *common.Fp) { - var lookup [16]common.Fp - - // This performs sum(powStrategy) + 1 squarings and len(lookup) + len(mulStrategy) - // multiplications. - powStrategy := []uint8{5, 7, 6, 2, 10, 4, 6, 9, 8, 5, 9, 4, 7, 5, 5, 4, 8, 3, 9, 5, 5, 4, 10, 4, 6, 6, 6, 5, 8, 9, 3, 4, 9, 4, 5, 6, 6, 2, 9, 4, 5, 5, 5, 7, 7, 9, 4, 6, 4, 8, 5, 8, 6, 6, 2, 9, 7, 4, 8, 8, 8, 4, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2} - mulStrategy := []uint8{15, 11, 10, 0, 15, 3, 3, 3, 4, 4, 9, 7, 11, 11, 5, 3, 12, 2, 10, 8, 5, 2, 8, 3, 5, 4, 11, 4, 0, 9, 2, 1, 12, 7, 5, 14, 15, 0, 14, 5, 6, 4, 5, 13, 6, 9, 7, 15, 1, 14, 11, 15, 12, 5, 0, 10, 9, 7, 7, 10, 14, 6, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 1} - initialMul := uint8(13) - - // Precompute lookup table of odd multiples of x for window - // size k=5. - var xx common.Fp - mulP(&xx, x, x) - lookup[0] = *x - for i := 1; i < 16; i++ { - mulP(&lookup[i], &lookup[i-1], &xx) - } - - // Now lookup = {x, x^3, x^5, ... } - // so that lookup[i] = x^{2*i + 1} - // so that lookup[k/2] = x^k, for odd k - *dest = lookup[initialMul] - for i := uint8(0); i < uint8(len(powStrategy)); i++ { - mulP(dest, dest, dest) - for j := uint8(1); j < powStrategy[i]; j++ { - mulP(dest, dest, dest) - } - mulP(dest, dest, &lookup[mulStrategy[i]]) - } -} - -func add(dest, lhs, rhs *common.Fp2) { - addP751(&dest.A, &lhs.A, &rhs.A) - addP751(&dest.B, &lhs.B, &rhs.B) -} - -func sub(dest, lhs, rhs *common.Fp2) { - subP751(&dest.A, &lhs.A, &rhs.A) - subP751(&dest.B, &lhs.B, &rhs.B) -} - -func mul(dest, lhs, rhs *common.Fp2) { - var bMinA, cMinD common.Fp - var ac, bd common.FpX2 - var adPlusBc common.FpX2 - var acMinBd common.FpX2 - - // Let (a,b,c,d) = (lhs.a,lhs.b,rhs.a,rhs.b). - // - // (a + bi)*(c + di) = (a*c - b*d) + (a*d + b*c)i - // - // Use Karatsuba's trick: note that - // - // (b - a)*(c - d) = (b*c + a*d) - a*c - b*d - // - // so (a*d + b*c) = (b-a)*(c-d) + a*c + b*d. - subP751(&bMinA, &lhs.B, &lhs.A) // = (b-a)*R - subP751(&cMinD, &rhs.A, &rhs.B) // = (c-d)*R - mulP751(&ac, &lhs.A, &rhs.A) // = a*c*R*R - mulP751(&bd, &lhs.B, &rhs.B) // = b*d*R*R - mulP751(&adPlusBc, &bMinA, &cMinD) // = (b-a)*(c-d)*R*R - adlP751(&adPlusBc, &adPlusBc, &ac) // = ((b-a)*(c-d) + a*c)*R*R - adlP751(&adPlusBc, &adPlusBc, &bd) // = ((b-a)*(c-d) + a*c + b*d)*R*R - rdcP751(&dest.B, &adPlusBc) // = (a*d + b*c)*R mod p - sulP751(&acMinBd, &ac, &bd) // = (a*c - b*d)*R*R - rdcP751(&dest.A, &acMinBd) // = (a*c - b*d)*R mod p -} - -// Set dest = 1/x -// -// Allowed to overlap dest with x. -// -// Returns dest to allow chaining operations. -func inv(dest, x *common.Fp2) { - var e1, e2 common.FpX2 - var f1, f2 common.Fp - - // We want to compute - // - // 1 1 (a - bi) (a - bi) - // -------- = -------- -------- = ----------- - // (a + bi) (a + bi) (a - bi) (a^2 + b^2) - // - // Letting c = 1/(a^2 + b^2), this is - // - // 1/(a+bi) = a*c - b*ci. - - mulP751(&e1, &x.A, &x.A) // = a*a*R*R - mulP751(&e2, &x.B, &x.B) // = b*b*R*R - adlP751(&e1, &e1, &e2) // = (a^2 + b^2)*R*R - rdcP751(&f1, &e1) // = (a^2 + b^2)*R mod p - // Now f1 = a^2 + b^2 - - mulP(&f2, &f1, &f1) - p34(&f2, &f2) - mulP(&f2, &f2, &f2) - mulP(&f2, &f2, &f1) - - mulP751(&e1, &x.A, &f2) - rdcP751(&dest.A, &e1) - - subP751(&f1, &common.Fp{}, &x.B) - mulP751(&e1, &f1, &f2) - rdcP751(&dest.B, &e1) -} - -func sqr(dest, x *common.Fp2) { - var a2, aPlusB, aMinusB common.Fp - var a2MinB2, ab2 common.FpX2 - - a := &x.A - b := &x.B - - // (a + bi)*(a + bi) = (a^2 - b^2) + 2abi. - addP751(&a2, a, a) // = a*R + a*R = 2*a*R - addP751(&aPlusB, a, b) // = a*R + b*R = (a+b)*R - subP751(&aMinusB, a, b) // = a*R - b*R = (a-b)*R - mulP751(&a2MinB2, &aPlusB, &aMinusB) // = (a+b)*(a-b)*R*R = (a^2 - b^2)*R*R - mulP751(&ab2, &a2, b) // = 2*a*b*R*R - rdcP751(&dest.A, &a2MinB2) // = (a^2 - b^2)*R mod p - rdcP751(&dest.B, &ab2) // = 2*a*b*R mod p -} - -// In case choice == 1, performs following swap in constant time: -// -// xPx <-> xQx -// xPz <-> xQz -// -// Otherwise returns xPx, xPz, xQx, xQz unchanged -func cswap(xPx, xPz, xQx, xQz *common.Fp2, choice uint8) { - cswapP751(&xPx.A, &xQx.A, choice) - cswapP751(&xPx.B, &xQx.B, choice) - cswapP751(&xPz.A, &xQz.A, choice) - cswapP751(&xPz.B, &xQz.B, choice) -} - -// In case choice == 1, performs following moves in constant time: -// -// xPx <- xQx -// xPz <- xQz -// -// Otherwise returns xPx, xPz, xQx, xQz unchanged -func cmov(xPx, xPz, xQx, xQz *common.Fp2, choice uint8) { - cmovP751(&xPx.A, &xQx.A, choice) - cmovP751(&xPx.B, &xQx.B, choice) - cmovP751(&xPz.A, &xQz.A, choice) - cmovP751(&xPz.B, &xQz.B, choice) -} - -func isZero(x *common.Fp2) uint8 { - r64 := uint64(0) - for i := 0; i < FpWords; i++ { - r64 |= x.A[i] | x.B[i] - } - r := uint8(0) - for i := uint64(0); i < 64; i++ { - r |= uint8((r64 >> i) & 0x1) - } - return 1 - r -} - -// Converts in.A and in.B to Montgomery domain and stores -// in 'out' -// out.A = in.A * R mod p -// out.B = in.B * R mod p -// Performs v = v*R^2*R^(-1) mod p, for both in.A and in.B -func ToMontgomery(out, in *common.Fp2) { - var aRR common.FpX2 - - // a*R*R - mulP751(&aRR, &in.A, &P751R2) - // a*R mod p - rdcP751(&out.A, &aRR) - mulP751(&aRR, &in.B, &P751R2) - rdcP751(&out.B, &aRR) -} - -// Converts in.A and in.B from Montgomery domain and stores -// in 'out' -// out.A = in.A mod p -// out.B = in.B mod p -// -// After returning from the call 'in' is not modified. -func FromMontgomery(out, in *common.Fp2) { - var aR common.FpX2 - - // convert from montgomery domain - copy(aR[:], in.A[:]) - rdcP751(&out.A, &aR) // = a mod p in [0, 2p) - modP751(&out.A) // = a mod p in [0, p) - for i := range aR { - aR[i] = 0 - } - copy(aR[:], in.B[:]) - rdcP751(&out.B, &aR) - modP751(&out.B) -} diff --git a/dh/sidh/internal/p751/fp2_test.go b/dh/sidh/internal/p751/fp2_test.go deleted file mode 100644 index 9a8c45ef..00000000 --- a/dh/sidh/internal/p751/fp2_test.go +++ /dev/null @@ -1,245 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package p751 - -import ( - "math/rand" - "reflect" - "testing" - "testing/quick" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -type testParams struct { - Point common.ProjectivePoint - Cparam common.ProjectiveCurveParameters - ExtElem common.Fp2 -} - -// Returns true if lhs = rhs. Takes variable time. -func vartimeEqFp2(lhs, rhs *common.Fp2) bool { - a := *lhs - b := *rhs - - modP751(&a.A) - modP751(&a.B) - modP751(&b.A) - modP751(&b.B) - - eq := true - for i := 0; i < FpWords && eq; i++ { - eq = eq && (a.A[i] == b.A[i]) - eq = eq && (a.B[i] == b.B[i]) - } - return eq -} - -func (testParams) generateFp2(rand *rand.Rand) common.Fp2 { - // Generation strategy: low limbs taken from [0,2^64); high limb - // taken from smaller range - // - // Size hint is ignored since all elements are fixed size. - // - // Field elements taken in range [0,2p). Emulate this by capping - // the high limb by the top digit of 2*p-1: - // - // sage: (2*p-1).digits(2^64)[-1] - // - // This still allows generating values >= 2p, but hopefully that - // excess is OK (and if it's not, we'll find out, because it's for - // testing...) - highLimb := rand.Uint64() % P751x2[FpWords-1] - fpElementGen := func() (fp common.Fp) { - for i := 0; i < (FpWords - 1); i++ { - fp[i] = rand.Uint64() - } - fp[FpWords-1] = highLimb - return fp - } - return common.Fp2{A: fpElementGen(), B: fpElementGen()} -} - -func (c testParams) Generate(rand *rand.Rand, size int) reflect.Value { - return reflect.ValueOf( - testParams{ - common.ProjectivePoint{ - X: c.generateFp2(rand), - Z: c.generateFp2(rand), - }, - common.ProjectiveCurveParameters{ - A: c.generateFp2(rand), - C: c.generateFp2(rand), - }, - c.generateFp2(rand), - }) -} - -func TestOne(t *testing.T) { - var tmp common.Fp2 - - mul(&tmp, ¶ms.OneFp2, ¶ms.A.AffineP) - if !vartimeEqFp2(&tmp, ¶ms.A.AffineP) { - t.Error("Not equal 1") - } -} - -func TestFp2ToBytesRoundTrip(t *testing.T) { - roundTrips := func(x testParams) bool { - xBytes := make([]byte, 2*params.Bytelen) - var xPrime common.Fp2 - - common.Fp2ToBytes(xBytes[:], &x.ExtElem, params.Bytelen) - common.BytesToFp2(&xPrime, xBytes[:], params.Bytelen) - return vartimeEqFp2(&xPrime, &x.ExtElem) - } - - if err := quick.Check(roundTrips, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2MulDistributesOverAdd(t *testing.T) { - mulDistributesOverAdd := func(x, y, z testParams) bool { - // Compute t1 = (x+y)*z - t1 := new(common.Fp2) - add(t1, &x.ExtElem, &y.ExtElem) - mul(t1, t1, &z.ExtElem) - - // Compute t2 = x*z + y*z - t2 := new(common.Fp2) - t3 := new(common.Fp2) - mul(t2, &x.ExtElem, &z.ExtElem) - mul(t3, &y.ExtElem, &z.ExtElem) - add(t2, t2, t3) - - return vartimeEqFp2(t1, t2) - } - - if err := quick.Check(mulDistributesOverAdd, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2MulIsAssociative(t *testing.T) { - isAssociative := func(x, y, z testParams) bool { - // Compute t1 = (x*y)*z - t1 := new(common.Fp2) - mul(t1, &x.ExtElem, &y.ExtElem) - mul(t1, t1, &z.ExtElem) - - // Compute t2 = (y*z)*x - t2 := new(common.Fp2) - mul(t2, &y.ExtElem, &z.ExtElem) - mul(t2, t2, &x.ExtElem) - - return vartimeEqFp2(t1, t2) - } - - if err := quick.Check(isAssociative, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2SquareMatchesMul(t *testing.T) { - sqrMatchesMul := func(x testParams) bool { - // Compute t1 = (x*x) - t1 := new(common.Fp2) - mul(t1, &x.ExtElem, &x.ExtElem) - - // Compute t2 = x^2 - t2 := new(common.Fp2) - sqr(t2, &x.ExtElem) - - return vartimeEqFp2(t1, t2) - } - - if err := quick.Check(sqrMatchesMul, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2Inv(t *testing.T) { - inverseIsCorrect := func(x testParams) bool { - z := new(common.Fp2) - inv(z, &x.ExtElem) - - // Now z = (1/x), so (z * x) * x == x - mul(z, z, &x.ExtElem) - mul(z, z, &x.ExtElem) - - return vartimeEqFp2(z, &x.ExtElem) - } - - // This is more expensive; run fewer tests - fasterCheckConfig := &quick.Config{MaxCount: (1 << 11)} - if err := quick.Check(inverseIsCorrect, fasterCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2Batch3Inv(t *testing.T) { - batchInverseIsCorrect := func(x1, x2, x3 testParams) bool { - var x1Inv, x2Inv, x3Inv common.Fp2 - inv(&x1Inv, &x1.ExtElem) - inv(&x2Inv, &x2.ExtElem) - inv(&x3Inv, &x3.ExtElem) - - var y1, y2, y3 common.Fp2 - Fp2Batch3Inv(&x1.ExtElem, &x2.ExtElem, &x3.ExtElem, &y1, &y2, &y3) - - return (vartimeEqFp2(&x1Inv, &y1) && vartimeEqFp2(&x2Inv, &y2) && vartimeEqFp2(&x3Inv, &y3)) - } - - // This is more expensive; run fewer tests - fasterCheckConfig := &quick.Config{MaxCount: (1 << 8)} - if err := quick.Check(batchInverseIsCorrect, fasterCheckConfig); err != nil { - t.Error(err) - } -} - -func BenchmarkFp2Mul(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - mul(w, z, z) - } -} - -func BenchmarkFp2Inv(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - inv(w, z) - } -} - -func BenchmarkFp2Square(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - sqr(w, z) - } -} - -func BenchmarkFp2Add(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - add(w, z, z) - } -} - -func BenchmarkFp2Sub(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - sub(w, z, z) - } -} diff --git a/dh/sidh/internal/p751/params.go b/dh/sidh/internal/p751/params.go deleted file mode 100644 index 83c9c9f5..00000000 --- a/dh/sidh/internal/p751/params.go +++ /dev/null @@ -1,258 +0,0 @@ -package p751 - -//go:generate go run ../templates/gen.go P751 - -import ( - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "golang.org/x/sys/cpu" -) - -const ( - // Number of uint64 limbs used to store field element - FpWords = 12 -) - -var ( - // HasBMI2 signals support for MULX which is in BMI2 - HasBMI2 = cpu.X86.HasBMI2 - // HasADXandBMI2 signals support for ADX and BMI2 - HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX - // P751 is a prime used by field Fp751 - P751 = common.Fp{ - 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, - 0xffffffffffffffff, 0xffffffffffffffff, 0xeeafffffffffffff, - 0xe3ec968549f878a8, 0xda959b1a13f7cc76, 0x084e9867d6ebe876, - 0x8562b5045cb25748, 0x0e12909f97badc66, 0x00006fe5d541f71c, - } - - // P751x2 = 2*p751 - 1 - P751x2 = common.Fp{ - 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, - 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xDD5FFFFFFFFFFFFF, - 0xC7D92D0A93F0F151, 0xB52B363427EF98ED, 0x109D30CFADD7D0ED, - 0x0AC56A08B964AE90, 0x1C25213F2F75B8CD, 0x0000DFCBAA83EE38, - } - - // P751p1 = p751 + 1 - P751p1 = common.Fp{ - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0xeeb0000000000000, - 0xe3ec968549f878a8, 0xda959b1a13f7cc76, 0x084e9867d6ebe876, - 0x8562b5045cb25748, 0x0e12909f97badc66, 0x00006fe5d541f71c, - } - - // P751R2 = (2^768)^2 mod p - P751R2 = common.Fp{ - 0x233046449DAD4058, 0xDB010161A696452A, 0x5E36941472E3FD8E, - 0xF40BFE2082A2E706, 0x4932CCA8904F8751, 0x1F735F1F1EE7FC81, - 0xA24F4D80C1048E18, 0xB56C383CCDB607C5, 0x441DD47B735F9C90, - 0x5673ED2C6A6AC82A, 0x06C905261132294B, 0x000041AD830F1F35, - } - - // P751p1Zeros number of 0 digits in the least significant part of P751+1 - P751p1Zeros = 5 - - // 1*R mod p - one = common.Fp2{ - A: common.Fp{ - 0x00000000000249ad, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x8310000000000000, - 0x5527b1e4375c6c66, 0x697797bf3f4f24d0, 0xc89db7b2ac5c4e2e, - 0x4ca4b439d2076956, 0x10f7926c7512c7e9, 0x00002d5b24bce5e2, - }, - } - // 1/2 * R mod p - half = common.Fp2{ - A: common.Fp{ - 0x00000000000124D6, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0xB8E0000000000000, - 0x9C8A2434C0AA7287, 0xA206996CA9A378A3, 0x6876280D41A41B52, - 0xE903B49F175CE04F, 0x0F8511860666D227, 0x00004EA07CFF6E7F, - }, - } - // 6*R mod p - six = common.Fp2{ - A: common.Fp{ - 0x00000000000DBA10, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x3500000000000000, - 0x3714FE4EB8399915, 0xC3A2584753EB43F4, 0xA3151D605C520428, - 0xC116CF5232C7C978, 0x49A84D4B8EFAF6AA, 0x0000305731E97514, - }, - } - - params = common.SidhParams{ - ID: common.Fp751, - // SIDH public key byte size. - PublicKeySize: 564, - // SIDH shared secret byte size. - SharedSecretSize: 188, - A: common.DomainParams{ - // The x-coordinate of PA - AffineP: common.Fp2{ - A: common.Fp{ - 0x884F46B74000BAA8, 0xBA52630F939DEC20, 0xC16FB97BA714A04D, - 0x082536745B1AB3DB, 0x1117157F446F9E82, 0xD2F27D621A018490, - 0x6B24AB523D544BCD, 0x9307D6AA2EA85C94, 0xE1A096729528F20F, - 0x896446F868F3255C, 0x2401D996B1BFF8A5, 0x00000EF8786A5C0A, - }, - B: common.Fp{ - 0xAEB78B3B96F59394, 0xAB26681E29C90B74, 0xE520AC30FDC4ACF1, - 0x870AAAE3A4B8111B, 0xF875BDB738D64EFF, 0x50109A7ECD7ED6BC, - 0x4CC64848FF0C56FB, 0xE617CB6C519102C9, 0x9C74B3835921E609, - 0xC91DDAE4A35A7146, 0x7FC82A155C1B9129, 0x0000214FA6B980B3, - }, - }, - // The x-coordinate of QA - AffineQ: common.Fp2{ - A: common.Fp{ - 0x0F93CC38680A8CA9, 0x762E733822E7FED7, 0xE549F005AC0ADB67, - 0x94A71FDD2C43A4ED, 0xD48645C2B04721C5, 0x432DA1FE4D4CA4DC, - 0xBC99655FAA7A80E8, 0xB2C6D502BCFD4823, 0xEE92F40CA2EC8BDB, - 0x7B074132EFB6D16C, 0x3340B46FA38A7633, 0x0000215749657F6C, - }, - B: common.Fp{ - 0xECFF375BF3079F4C, 0xFBFE74B043E80EF3, 0x17376CBE3C5C7AD1, - 0xC06327A7E29CDBF2, 0x2111649C438BF3D4, 0xC1F9298261BA2E97, - 0x1F9FECE869CFD1C2, 0x01A39B4FC9346D62, 0x147CD1D3E82A3C9F, - 0xDE84E9D249E533EE, 0x1C48A5ADFB7C578D, 0x000061ACA0B82E1D, - }, - }, - // The x-coordinate of RA = PA-QA - AffineR: common.Fp2{ - A: common.Fp{ - 0x1600C525D41059F1, 0xA596899A0A1D83F7, 0x6BFDEED6D2B23F35, - 0x5C7E707270C23910, 0x276CA1A4E8369411, 0xB193651A602925A0, - 0x243D239F1CA1F04A, 0x543DC6DA457860AD, 0xCDA590F325181DE9, - 0xD3AB7ACFDA80B395, 0x6C97468580FDDF7B, 0x0000352A3E5C4C77, - }, - B: common.Fp{ - 0x9B794F9FD1CC3EE8, 0xDB32E40A9B2FD23E, 0x26192A2542E42B67, - 0xA18E94FCA045BCE7, 0x96DC1BC38E7CDA2D, 0x9A1D91B752487DE2, - 0xCC63763987436DA3, 0x1316717AACCC551D, 0xC4C368A4632AFE72, - 0x4B6EA85C9CCD5710, 0x7A12CAD582C7BC9A, 0x00001C7E240149BF, - }, - }, - // Max size of secret key for 2-torsion group, corresponds to 2^e2 - 1 - SecretBitLen: 372, - // SecretBitLen in bytes. - SecretByteLen: 47, - // 2-torsion group computation strategy - IsogenyStrategy: []uint32{ - 0x50, 0x30, 0x1B, 0x0F, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, - 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x07, - 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, - 0x01, 0x01, 0x01, 0x0C, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, - 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x03, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x15, - 0x0C, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x03, 0x02, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x09, 0x05, 0x03, 0x02, - 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, - 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x21, 0x14, 0x0C, 0x07, - 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, - 0x01, 0x01, 0x01, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x01, 0x08, 0x05, 0x03, 0x02, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, - 0x01, 0x01, 0x02, 0x01, 0x01, - }, - }, - B: common.DomainParams{ - // The x-coordinate of PB - AffineP: common.Fp2{ - A: common.Fp{ - 0x85691AAF4015F88C, 0x7478C5B8C36E9631, 0x7EF2A185DE4DD6E2, - 0x943BBEE46BEB9DC7, 0x1A3EC62798792D22, 0x791BC4B084B31D69, - 0x03DBE6522CEA17C4, 0x04749AA65D665D83, 0x3D52B5C45EF450F3, - 0x0B4219848E36947D, 0xA4CF7070466BDE27, 0x0000334B1FA6D193, - }, - B: common.Fp{ - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - }, - }, - // The x-coordinate of QB - AffineQ: common.Fp2{ - A: common.Fp{ - 0x8E7CB3FA53211340, 0xD67CE54F7A05EEE0, 0xFDDC2C8BCE46FC38, - 0x08587FAE3110DF1E, 0xD6B8246FA22B058B, 0x4DAC3ACC905A5DBD, - 0x51D0BF2FADCED3E8, 0xE5A2406DF6484425, 0x907F177584F671B8, - 0x4738A2FFCCED051C, 0x2B0067B4177E4853, 0x00002806AC948D3D, - }, - B: common.Fp{ - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - }, - }, - // The x-coordinate of RB = PB - QB - AffineR: common.Fp2{ - A: common.Fp{ - 0xB56457016D1D6D1C, 0x03DECCB38F39C491, 0xDFB910AC8A559452, - 0xA9D0F17D1FF24883, 0x8562BBAF515C248C, 0x249B2A6DDB1CB67D, - 0x3131AF96FB46835C, 0xE10258398480C3E1, 0xEAB5E2B872D4FAB1, - 0xB71E63875FAEB1DF, 0xF8384D4F13757CF6, 0x0000361EC9B09912, - }, - B: common.Fp{ - 0x58C967899ED16EF4, 0x81998376DC622A4B, 0x3D1C1DCFE0B12681, - 0x9347DEBB953E1730, 0x9ABB344D3A82C2D7, 0xE4881BD2820552B2, - 0x0037247923D90266, 0x2E3156EDB157E5A5, 0xF86A46A7506823F7, - 0x8FE5523A7B7F1CFC, 0xFA3CFFA38372F67B, 0x0000692DCE85FFBD, - }, - }, - // Size of secret key for 3-torsion group, corresponds to log_2(3^e3) - 1. - SecretBitLen: 378, - // SecretBitLen in bytes. - SecretByteLen: 48, - // 3-torsion group computation strategy - IsogenyStrategy: []uint32{ - 0x70, 0x3F, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, - 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, - 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, - 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x1F, 0x10, 0x08, 0x04, 0x02, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, - 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x0F, 0x08, 0x04, - 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, - 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x31, 0x1F, 0x10, - 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x0F, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, - 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x07, 0x04, 0x02, 0x01, - 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x15, 0x0C, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x05, 0x03, 0x02, - 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x09, 0x05, - 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, - 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, - }, - }, - OneFp2: one, - HalfFp2: half, - - MsgLen: 32, - // SIKEp751 provides 128 bit of classical security ([SIKE], 5.1) - KemSize: 32, - // ceil(751+7/8) - Bytelen: 94, - CiphertextSize: 32 + 564, - InitCurve: common.ProjectiveCurveParameters{ - A: six, - C: one, - }, - } -) - -func init() { - common.Register(common.Fp751, ¶ms) -} diff --git a/dh/sidh/internal/p751/params_test.go b/dh/sidh/internal/p751/params_test.go deleted file mode 100644 index ce3d5a6a..00000000 --- a/dh/sidh/internal/p751/params_test.go +++ /dev/null @@ -1,83 +0,0 @@ -package p751 - -// Contains values used by tests -import ( - "testing/quick" - - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -var ( - expectedJ = Fp2{ - A: Fp{0xc7a8921c1fb23993, 0xa20aea321327620b, 0xf1caa17ed9676fa8, 0x61b780e6b1a04037, 0x47784af4c24acc7a, 0x83926e2e300b9adf, 0xcd891d56fae5b66, 0x49b66985beb733bc, 0xd4bcd2a473d518f, 0xe242239991abe224, 0xa8af5b20f98672f8, 0x139e4d4e4d98}, - B: Fp{0xb5b52a21f81f359, 0x715e3a865db6d920, 0x9bac2f9d8911978b, 0xef14acd8ac4c1e3d, 0xe81aacd90cfb09c8, 0xaf898288de4a09d9, 0xb85a7fb88c5c4601, 0x2c37c3f1dd303387, 0x7ad3277fe332367c, 0xd4cbee7f25a8e6f8, 0x36eacbe979eaeffa, 0x59eb5a13ac33}, - } - // A = 4385300808024233870220415655826946795549183378139271271040522089756750951667981765872679172832050962894122367066234419550072004266298327417513857609747116903999863022476533671840646615759860564818837299058134292387429068536219*i + 1408083354499944307008104531475821995920666351413327060806684084512082259107262519686546161682384352696826343970108773343853651664489352092568012759783386151707999371397181344707721407830640876552312524779901115054295865393760 - curveA = Fp2{ - A: Fp{0x8319eb18ca2c435e, 0x3a93beae72cd0267, 0x5e465e1f72fd5a84, 0x8617fa4150aa7272, 0x887da24799d62a13, 0xb079b31b3c7667fe, 0xc4661b150fa14f2e, 0xd4d2b2967bc6efd6, 0x854215a8b7239003, 0x61c5302ccba656c2, 0xf93194a27d6f97a2, 0x1ed9532bca75}, - B: Fp{0xb6f541040e8c7db6, 0x99403e7365342e15, 0x457e9cee7c29cced, 0x8ece72dc073b1d67, 0x6e73cef17ad28d28, 0x7aed836ca317472, 0x89e1de9454263b54, 0x745329277aa0071b, 0xf623dfc73bc86b9b, 0xb8e3c1d8a9245882, 0x6ad0b3d317770bec, 0x5b406e8d502b}, - } - - // C = 933177602672972392833143808100058748100491911694554386487433154761658932801917030685312352302083870852688835968069519091048283111836766101703759957146191882367397129269726925521881467635358356591977198680477382414690421049768*i + 9088894745865170214288643088620446862479558967886622582768682946704447519087179261631044546285104919696820250567182021319063155067584445633834024992188567423889559216759336548208016316396859149888322907914724065641454773776307 - curveC = Fp2{ - A: Fp{0x4fb2358bbf723107, 0x3a791521ac79e240, 0x283e24ef7c4c922f, 0xc89baa1205e33cc, 0x3031be81cff6fee1, 0xaf7a494a2f6a95c4, 0x248d251eaac83a1d, 0xc122fca1e2550c88, 0xbc0451b11b6cfd3d, 0x9c0a114ab046222c, 0x43b957b32f21f6ea, 0x5b9c87fa61de}, - B: Fp{0xacf142afaac15ec6, 0xfd1322a504a071d5, 0x56bb205e10f6c5c6, 0xe204d2849a97b9bd, 0x40b0122202fe7f2e, 0xecf72c6fafacf2cb, 0x45dfc681f869f60a, 0x11814c9aff4af66c, 0x9278b0c4eea54fe7, 0x9a633d5baf7f2e2e, 0x69a329e6f1a05112, 0x1d874ace23e4}, - } - - // x(P) = 8172151271761071554796221948801462094972242987811852753144865524899433583596839357223411088919388342364651632180452081960511516040935428737829624206426287774255114241789158000915683252363913079335550843837650671094705509470594*i + 9326574858039944121604015439381720195556183422719505497448541073272720545047742235526963773359004021838961919129020087515274115525812121436661025030481584576474033630899768377131534320053412545346268645085054880212827284581557 - affineXP = Fp2{ - A: Fp{0xe8d05f30aac47247, 0x576ec00c55441de7, 0xbf1a8ec5fe558518, 0xd77cb17f77515881, 0x8e9852837ee73ec4, 0x8159634ad4f44a6b, 0x2e4eb5533a798c5, 0x9be8c4354d5bc849, 0xf47dc61806496b84, 0x25d0e130295120e0, 0xdbef54095f8139e3, 0x5a724f20862c}, - B: Fp{0x3ca30d7623602e30, 0xfb281eddf45f07b7, 0xd2bf62d5901a45bc, 0xc67c9baf86306dd2, 0x4e2bd93093f538ca, 0xcfd92075c25b9cbe, 0xceafe9a3095bcbab, 0x7d928ad380c85414, 0x37c5f38b2afdc095, 0x75325899a7b779f4, 0xf130568249f20fdd, 0x178f264767d1}, - } - - // x([2]P) = 1476586462090705633631615225226507185986710728845281579274759750260315746890216330325246185232948298241128541272709769576682305216876843626191069809810990267291824247158062860010264352034514805065784938198193493333201179504845*i + 3623708673253635214546781153561465284135688791018117615357700171724097420944592557655719832228709144190233454198555848137097153934561706150196041331832421059972652530564323645509890008896574678228045006354394485640545367112224 - affineXP2 = Fp2{ - A: Fp{0x2a77afa8576ce979, 0xab1360e69b0aeba0, 0xd79e3e3cbffad660, 0x5fd0175aa10f106b, 0x1800ebafce9fbdbc, 0x228fc9142bdd6166, 0x867cf907314e34c3, 0xa58d18c94c13c31c, 0x699a5bc78b11499f, 0xa29fc29a01f7ccf1, 0x6c69c0c5347eebce, 0x38ecee0cc57}, - B: Fp{0x43607fd5f4837da0, 0x560bad4ce27f8f4a, 0x2164927f8495b4dd, 0x621103fdb831a997, 0xad740c4eea7db2db, 0x2cde0442205096cd, 0x2af51a70ede8324e, 0x41a4e680b9f3466, 0x5481f74660b8f476, 0xfcb2f3e656ff4d18, 0x42e3ce0837171acc, 0x44238c30530c}, - } - - // x([2^2]P) = 441719501189485559222919502512761433931671682884872259563221427434901842337947564993718830905758163254463901652874331063768876314142359813382575876106725244985607032091781306919778265250690045578695338669105227100119314831452*i + 6961734028200975729170216310486458180126343885294922940439352055937945948015840788921225114530454649744697857047401608073256634790353321931728699534700109268264491160589480994022419317695690866764726967221310990488404411684053 - affineXP4 = Fp2{ - A: Fp{0x6f9dbe4c39175153, 0xf2fec757eb99e88, 0x43d7361a93733d91, 0x3abd10ed19c85a3d, 0xc4de9ab9c5ef7181, 0x53e375901684c900, 0x68ffc3e7d71c41ff, 0x47adab62c8d942fe, 0x226a33fd6fbb381d, 0x87ef4c8fdd83309a, 0xaca1cf44c5fa8799, 0x6cbae86c755f}, - B: Fp{0x4c80c37fe68282a7, 0xbd8b9d7248bf553a, 0x1fb0e8e74d5e1762, 0xb63fa0e4e5f91482, 0xc675ab8a45a1439, 0xdfa6772deace7820, 0xf0d813d71d9a9255, 0x53a1a58c634534bd, 0x4ebfc6485fdfd888, 0x6991fe4358bcf169, 0xc0547bdaca85b6fd, 0xf461548d632}, - } - - // x([3^2]P) = 3957171963425208493644602380039721164492341594850197356580248639045894821895524981729970650520936632013218950972842867220898274664982599375786979902471523505057611521217523103474682939638645404445093536997296151472632038973463*i + 1357869545269286021642168835877253886774707209614159162748874474269328421720121175566245719916322684751967981171882659798149072149161259103020057556362998810229937432814792024248155991141511691087135859252304684633946087474060 - affineXP9 = Fp2{ - A: Fp{0x7c0daa0f04ded4e0, 0x52dc4f883d85e065, 0x91afbdc2c1714d0b, 0xb7b3db8e658cfeba, 0x43d4e72a692882f3, 0x535c56d83753da30, 0xc8a58724433cbf5d, 0x351153c0a5e74219, 0x2c81827d19f93dd5, 0x26ef8aca3370ea1a, 0x1cf939a6dd225dec, 0x3403cb28ad41}, - B: Fp{0x93e7bc373a9ff7b, 0x57b8cc47635ebc0f, 0x92eab55689106cf3, 0x93643111d421f24c, 0x1c58b519506f6b7a, 0xebd409fb998faa13, 0x5c86ed799d09d80e, 0xd9a1d764d6363562, 0xf95e87f92fb0c4cc, 0x6b2bbaf5632a5609, 0x2d9b6a809dfaff7f, 0x29c0460348b}, - } - - // Inputs for testing 3-point-ladder - threePointLadderInputs = []ProjectivePoint{ - // x(P) - { - X: Fp2{ - A: Fp{0xe8d05f30aac47247, 0x576ec00c55441de7, 0xbf1a8ec5fe558518, 0xd77cb17f77515881, 0x8e9852837ee73ec4, 0x8159634ad4f44a6b, 0x2e4eb5533a798c5, 0x9be8c4354d5bc849, 0xf47dc61806496b84, 0x25d0e130295120e0, 0xdbef54095f8139e3, 0x5a724f20862c}, - B: Fp{0x3ca30d7623602e30, 0xfb281eddf45f07b7, 0xd2bf62d5901a45bc, 0xc67c9baf86306dd2, 0x4e2bd93093f538ca, 0xcfd92075c25b9cbe, 0xceafe9a3095bcbab, 0x7d928ad380c85414, 0x37c5f38b2afdc095, 0x75325899a7b779f4, 0xf130568249f20fdd, 0x178f264767d1}, - }, - Z: params.OneFp2, - }, - // x(Q) - { - X: Fp2{ - A: Fp{0x2b71a2a93ad1e10e, 0xf0b9842a92cfb333, 0xae17373615a27f5c, 0x3039239f428330c4, 0xa0c4b735ed7dcf98, 0x6e359771ddf6af6a, 0xe986e4cac4584651, 0x8233a2b622d5518, 0xbfd67bf5f06b818b, 0xdffe38d0f5b966a6, 0xa86b36a3272ee00a, 0x193e2ea4f68f}, - B: Fp{0x5a0f396459d9d998, 0x479f42250b1b7dda, 0x4016b57e2a15bf75, 0xc59f915203fa3749, 0xd5f90257399cf8da, 0x1fb2dadfd86dcef4, 0x600f20e6429021dc, 0x17e347d380c57581, 0xc1b0d5fa8fe3e440, 0xbcf035330ac20e8, 0x50c2eb5f6a4f03e6, 0x86b7c4571}, - }, - Z: params.OneFp2, - }, - // x(P-Q) - { - X: Fp2{ - A: Fp{0x4aafa9f378f7b5ff, 0x1172a683aa8eee0, 0xea518d8cbec2c1de, 0xe191bcbb63674557, 0x97bc19637b259011, 0xdbeae5c9f4a2e454, 0x78f64d1b72a42f95, 0xe71cb4ea7e181e54, 0xe4169d4c48543994, 0x6198c2286a98730f, 0xd21d675bbab1afa5, 0x2e7269fce391}, - B: Fp{0x23355783ce1d0450, 0x683164cf4ce3d93f, 0xae6d1c4d25970fd8, 0x7807007fb80b48cf, 0xa005a62ec2bbb8a2, 0x6b5649bd016004cb, 0xbb1a13fa1330176b, 0xbf38e51087660461, 0xe577fddc5dd7b930, 0x5f38116f56947cd3, 0x3124f30b98c36fde, 0x4ca9b6e6db37}, - }, - Z: params.OneFp2, - }, - } - scalar3Pt = [...]uint8{84, 222, 146, 63, 85, 18, 173, 162, 167, 38, 10, 8, 143, 176, 93, 228, 247, 128, 50, 128, 205, 42, 15, 137, 119, 67, 43, 3, 61, 91, 237, 24, 235, 12, 53, 96, 186, 164, 232, 223, 197, 224, 64, 109, 137, 63, 246, 4} -) - -var quickCheckConfig = &quick.Config{ - MaxCount: (1 << 15), -} diff --git a/dh/sidh/internal/templates/arith_decl.gotemp b/dh/sidh/internal/templates/arith_decl.gotemp deleted file mode 100644 index fc554f14..00000000 --- a/dh/sidh/internal/templates/arith_decl.gotemp +++ /dev/null @@ -1,61 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -//go:build {{if .OPT_ARM}}({{end}}amd64 && !purego{{if .OPT_ARM}}) || (arm64 && !purego){{end}} -// +build amd64,!purego{{if .OPT_ARM}} arm64,!purego{{end}} - -package {{.PACKAGE}} - -import ( - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// If choice = 0, leave x unchanged. If choice = 1, sets x to y. -// If choice is neither 0 nor 1 then behaviour is undefined. -// This function executes in constant time. -// -//go:noescape -func cmov{{.FIELD}}(x, y *Fp, choice uint8) - -// If choice = 0, leave x,y unchanged. If choice = 1, set x,y = y,x. -// If choice is neither 0 nor 1 then behaviour is undefined. -// This function executes in constant time. -// -//go:noescape -func cswap{{.FIELD}}(x, y *Fp, choice uint8) - -// Compute z = x + y (mod p). -// -//go:noescape -func add{{.FIELD}}(z, x, y *Fp) - -// Compute z = x - y (mod p). -// -//go:noescape -func sub{{.FIELD}}(z, x, y *Fp) - -// Compute z = x + y, without reducing mod p. -// -//go:noescape -func adl{{.FIELD}}(z, x, y *FpX2) - -// Compute z = x - y, without reducing mod p. -// -//go:noescape -func sul{{.FIELD}}(z, x, y *FpX2) - -// Reduce a field element in [0, 2*p) to one in [0,p). -// -//go:noescape -func mod{{.FIELD}}(x *Fp) - -// Computes z = x * y. -// -//go:noescape -func mul{{.FIELD}}(z *FpX2, x, y *Fp) - -// Computes the Montgomery reduction z = x R^{-1} (mod 2*p). On return value -// of x may be changed. z=x not allowed. -// -//go:noescape -func rdc{{.FIELD}}(z *Fp, x *FpX2) diff --git a/dh/sidh/internal/templates/arith_generic.gotemp b/dh/sidh/internal/templates/arith_generic.gotemp deleted file mode 100644 index 659b8233..00000000 --- a/dh/sidh/internal/templates/arith_generic.gotemp +++ /dev/null @@ -1,203 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -//go:build {{if .OPT_ARM}}purego || (!amd64 && !arm64){{else}}purego || !amd64{{end}} -// +build {{if .OPT_ARM}}purego !amd64,!arm64{{else}}purego !amd64{{end}} - -package {{.PACKAGE}} - -import ( - "math/bits" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Compute z = x + y (mod p). -func add{{.FIELD}}(z, x, y *common.Fp) { - var carry uint64 - - // z=x+y % {{.FIELD}} - for i := 0; i < FpWords; i++ { - z[i], carry = bits.Add64(x[i], y[i], carry) - } - - // z = z - {{.FIELD}}x2 - carry = 0 - for i := 0; i < FpWords; i++ { - z[i], carry = bits.Sub64(z[i], {{.FIELD}}x2[i], carry) - } - - // if z<0 add {{.FIELD}}x2 back - mask := uint64(0 - carry) - carry = 0 - for i := 0; i < FpWords; i++ { - z[i], carry = bits.Add64(z[i], {{.FIELD}}x2[i]&mask, carry) - } -} - -// Compute z = x - y (mod p). -func sub{{.FIELD}}(z, x, y *common.Fp) { - var borrow uint64 - - for i := 0; i < FpWords; i++ { - z[i], borrow = bits.Sub64(x[i], y[i], borrow) - } - - mask := uint64(0 - borrow) - borrow = 0 - - for i := 0; i < FpWords; i++ { - z[i], borrow = bits.Add64(z[i], {{.FIELD}}x2[i]&mask, borrow) - } -} - -// If choice = 0, leave x unchanged. If choice = 1, sets x to y. -// If choice is neither 0 nor 1 then behaviour is undefined. -// This function executes in constant time. -func cmov{{.FIELD}}(x, y *common.Fp, choice uint8) { - mask := 0 - uint64(choice) - for i := 0; i < FpWords; i++ { - x[i] ^= mask & (x[i] ^ y[i]) - } -} - -// Conditionally swaps bits in x and y in constant time. -// mask indicates bits to be swapped (set bits are swapped) -// For details see "Hackers Delight, 2.20" -// -// Implementation doesn't actually depend on a prime field. -func cswap{{.FIELD}}(x, y *common.Fp, mask uint8) { - var tmp, mask64 uint64 - - mask64 = 0 - uint64(mask) - for i := 0; i < FpWords; i++ { - tmp = mask64 & (x[i] ^ y[i]) - x[i] = tmp ^ x[i] - y[i] = tmp ^ y[i] - } -} - -// Perform Montgomery reduction: set z = x R^{-1} (mod 2*p) -// with R=2^(FpWords*64). Destroys the input value. -func rdc{{.FIELD}}(z *common.Fp, x *common.FpX2) { - var carry, t, u, v uint64 - var hi, lo uint64 - var count int - - count = {{.FIELD}}p1Zeros - - for i := 0; i < FpWords; i++ { - for j := 0; j < i; j++ { - if j < (i - count + 1) { - hi, lo = bits.Mul64(z[j], {{.FIELD}}p1[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - } - v, carry = bits.Add64(v, x[i], 0) - u, carry = bits.Add64(u, 0, carry) - t += carry - - z[i] = v - v = u - u = t - t = 0 - } - - for i := FpWords; i < 2*FpWords-1; i++ { - if count > 0 { - count-- - } - for j := i - FpWords + 1; j < FpWords; j++ { - if j < (FpWords - count) { - hi, lo = bits.Mul64(z[j], {{.FIELD}}p1[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - } - v, carry = bits.Add64(v, x[i], 0) - u, carry = bits.Add64(u, 0, carry) - - t += carry - z[i-FpWords] = v - v = u - u = t - t = 0 - } - v, _ = bits.Add64(v, x[2*FpWords-1], 0) - z[FpWords-1] = v -} - -// Compute z = x * y. -func mul{{.FIELD}}(z *common.FpX2, x, y *common.Fp) { - var u, v, t uint64 - var hi, lo uint64 - var carry uint64 - - for i := uint64(0); i < FpWords; i++ { - for j := uint64(0); j <= i; j++ { - hi, lo = bits.Mul64(x[j], y[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - z[i] = v - v = u - u = t - t = 0 - } - - for i := FpWords; i < (2*FpWords)-1; i++ { - for j := i - FpWords + 1; j < FpWords; j++ { - hi, lo = bits.Mul64(x[j], y[i-j]) - v, carry = bits.Add64(lo, v, 0) - u, carry = bits.Add64(hi, u, carry) - t += carry - } - z[i] = v - v = u - u = t - t = 0 - } - z[2*FpWords-1] = v -} - -// Compute z = x + y, without reducing mod p. -func adl{{.FIELD}}(z, x, y *common.FpX2) { - var carry uint64 - for i := 0; i < 2*FpWords; i++ { - z[i], carry = bits.Add64(x[i], y[i], carry) - } -} - -// Reduce a field element in [0, 2*p) to one in [0,p). -func mod{{.FIELD}}(x *common.Fp) { - var borrow, mask uint64 - for i := 0; i < FpWords; i++ { - x[i], borrow = bits.Sub64(x[i], {{.FIELD}}[i], borrow) - } - - // Sets all bits if borrow = 1 - mask = 0 - borrow - borrow = 0 - for i := 0; i < FpWords; i++ { - x[i], borrow = bits.Add64(x[i], {{.FIELD}}[i]&mask, borrow) - } -} - -// Compute z = x - y, without reducing mod p. -func sul{{.FIELD}}(z, x, y *common.FpX2) { - var borrow, mask uint64 - for i := 0; i < 2*FpWords; i++ { - z[i], borrow = bits.Sub64(x[i], y[i], borrow) - } - - // Sets all bits if borrow = 1 - mask = 0 - borrow - borrow = 0 - for i := FpWords; i < 2*FpWords; i++ { - z[i], borrow = bits.Add64(z[i], {{.FIELD}}[i-FpWords]&mask, borrow) - } -} diff --git a/dh/sidh/internal/templates/arith_test.gotemp b/dh/sidh/internal/templates/arith_test.gotemp deleted file mode 100644 index 57d2ada9..00000000 --- a/dh/sidh/internal/templates/arith_test.gotemp +++ /dev/null @@ -1,129 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package {{.PACKAGE}} - -import ( - "testing" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Package-level storage for this field element is intended to deter -// compiler optimizations. -var ( - benchmarkFp common.Fp - benchmarkFpX2 common.FpX2 - bench_x = common.Fp{17026702066521327207, 5108203422050077993, 10225396685796065916, 11153620995215874678, 6531160855165088358, 15302925148404145445, 1248821577836769963, 9789766903037985294, 7493111552032041328, 10838999828319306046, 18103257655515297935, 27403304611634} - bench_y = common.Fp{4227467157325093378, 10699492810770426363, 13500940151395637365, 12966403950118934952, 16517692605450415877, 13647111148905630666, 14223628886152717087, 7167843152346903316, 15855377759596736571, 4300673881383687338, 6635288001920617779, 30486099554235} - bench_z = common.FpX2{1595347748594595712, 10854920567160033970, 16877102267020034574, 12435724995376660096, 3757940912203224231, 8251999420280413600, 3648859773438820227, 17622716832674727914, 11029567000887241528, 11216190007549447055, 17606662790980286987, 4720707159513626555, 12887743598335030915, 14954645239176589309, 14178817688915225254, 1191346797768989683, 12629157932334713723, 6348851952904485603, 16444232588597434895, 7809979927681678066, 14642637672942531613, 3092657597757640067, 10160361564485285723, 240071237} -) - -func TestFpCswap(t *testing.T) { - one := common.Fp{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} - two := common.Fp{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2} - - x := one - y := two - - cswap{{.FIELD}}(&x, &y, 0) - for i := 0; i < FpWords; i++ { - if (x[i] != one[i]) || (y[i] != two[i]) { - t.Error("Found", x, "expected", one) - } - } - - cswap{{.FIELD}}(&x, &y, 1) - for i := 0; i < FpWords; i++ { - if (x[i] != two[i]) || (y[i] != one[i]) { - t.Error("Found", x, "expected", two) - } - } -} - -func TestFpCmov(t *testing.T) { - one := common.Fp{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} - two := common.Fp{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2} - - x := one - y := two - - cmov{{.FIELD}}(&x, &y, 0) - for i := 0; i < FpWords; i++ { - if x[i] != one[i] { - t.Error("Found", x, "expected", one) - } - if y[i] != two[i] { - t.Error("Found", y, "expected", two) - } - } - - cmov{{.FIELD}}(&x, &y, 1) - for i := 0; i < FpWords; i++ { - if x[i] != two[i] { - t.Error("Found", x, "expected", two) - } - if y[i] != two[i] { - t.Error("Found", y, "expected", two) - } - } -} - -// Benchmarking for field arithmetic -func BenchmarkMul(b *testing.B) { - for n := 0; n < b.N; n++ { - mul{{.FIELD}}(&benchmarkFpX2, &bench_x, &bench_y) - } -} - -func BenchmarkRdc(b *testing.B) { - z := bench_z - - // This benchmark actually computes garbage, because - // rdc{{.FIELD}} mangles its input, but since it's - // constant-time that shouldn't matter for the benchmarks. - for n := 0; n < b.N; n++ { - rdc{{.FIELD}}(&benchmarkFp, &z) - } -} - -func BenchmarkAdd(b *testing.B) { - for n := 0; n < b.N; n++ { - add{{.FIELD}}(&benchmarkFp, &bench_x, &bench_y) - } -} - -func BenchmarkSub(b *testing.B) { - for n := 0; n < b.N; n++ { - sub{{.FIELD}}(&benchmarkFp, &bench_x, &bench_y) - } -} - -func BenchmarkCswap(b *testing.B) { - x, y := bench_x, bench_y - for n := 0; n < b.N; n++ { - cswap{{.FIELD}}(&x, &y, 1) - cswap{{.FIELD}}(&x, &y, 0) - } -} - -func BenchmarkMod(b *testing.B) { - x := bench_x - for n := 0; n < b.N; n++ { - mod{{.FIELD}}(&x) - } -} - -func BenchmarkX2AddLazy(b *testing.B) { - x, y, z := bench_z, bench_z, bench_z - for n := 0; n < b.N; n++ { - adl{{.FIELD}}(&x, &y, &z) - } -} - -func BenchmarkX2SubLazy(b *testing.B) { - x, y, z := bench_z, bench_z, bench_z - for n := 0; n < b.N; n++ { - sul{{.FIELD}}(&x, &y, &z) - } -} diff --git a/dh/sidh/internal/templates/core.gotemp b/dh/sidh/internal/templates/core.gotemp deleted file mode 100644 index 7d583811..00000000 --- a/dh/sidh/internal/templates/core.gotemp +++ /dev/null @@ -1,301 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package {{.PACKAGE}} - -import ( - crand "crypto/rand" - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// ----------------------------------------------------------------------------- -// Functions for traversing isogeny trees according to strategy. Key type 'A' is -// - -// Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed -// for public key generation. -func traverseTreePublicKeyA(curve *ProjectiveCurveParameters, xR, phiP, phiQ, phiR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny4 - - cparam := CalcCurveParamsEquiv4(curve) - strat := params.A.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow2k(xR, &cparam, 2*k) - i += int(k) - } - cparam = phi.GenerateCurve(xR) - - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - phi.EvaluatePoint(phiP) - phi.EvaluatePoint(phiQ) - phi.EvaluatePoint(phiR) - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Traverses isogeny tree in order to compute xR needed -// for public key generation. -func traverseTreeSharedKeyA(curve *ProjectiveCurveParameters, xR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny4 - - cparam := CalcCurveParamsEquiv4(curve) - strat := params.A.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow2k(xR, &cparam, 2*k) - i += int(k) - } - cparam = phi.GenerateCurve(xR) - - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed -// for public key generation. -func traverseTreePublicKeyB(curve *ProjectiveCurveParameters, xR, phiP, phiQ, phiR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny3 - - cparam := CalcCurveParamsEquiv3(curve) - strat := params.B.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow3k(xR, &cparam, k) - i += int(k) - } - - cparam = phi.GenerateCurve(xR) - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - - phi.EvaluatePoint(phiP) - phi.EvaluatePoint(phiQ) - phi.EvaluatePoint(phiR) - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed -// for public key generation. -func traverseTreeSharedKeyB(curve *ProjectiveCurveParameters, xR *ProjectivePoint) { - points := make([]ProjectivePoint, 0, 8) - indices := make([]int, 0, 8) - var i, sIdx int - var phi isogeny3 - - cparam := CalcCurveParamsEquiv3(curve) - strat := params.B.IsogenyStrategy - stratSz := len(strat) - - for j := 1; j <= stratSz; j++ { - for i <= stratSz-j { - points = append(points, *xR) - indices = append(indices, i) - - k := strat[sIdx] - sIdx++ - Pow3k(xR, &cparam, k) - i += int(k) - } - - cparam = phi.GenerateCurve(xR) - for k := 0; k < len(points); k++ { - phi.EvaluatePoint(&points[k]) - } - - // pop xR from points - *xR, points = points[len(points)-1], points[:len(points)-1] - i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] - } -} - -// Generate a public key in the 2-torsion group. Public key is a set -// of three x-coordinates: xP,xQ,x(P-Q), where P,Q are points on E_a(Fp2) -func PublicKeyGenA(pub3Pt *[3]Fp2, prvBytes []byte) { - var xPA, xQA, xRA ProjectivePoint - var xPB, xQB, xRB, xR ProjectivePoint - var invZP, invZQ, invZR Fp2 - var phi isogeny4 - - // Load points for A - xPA = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - xQA = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - xRA = ProjectivePoint{X: params.A.AffineR, Z: params.OneFp2} - - // Load points for B - xRB = ProjectivePoint{X: params.B.AffineR, Z: params.OneFp2} - xQB = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - xPB = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Find isogeny kernel - xR = ScalarMul3Pt(¶ms.InitCurve, &xPA, &xQA, &xRA, params.A.SecretBitLen, prvBytes) - traverseTreePublicKeyA(¶ms.InitCurve, &xR, &xPB, &xQB, &xRB) - - // Secret isogeny - phi.GenerateCurve(&xR) - xPA = xPB - xQA = xQB - xRA = xRB - phi.EvaluatePoint(&xPA) - phi.EvaluatePoint(&xQA) - phi.EvaluatePoint(&xRA) - Fp2Batch3Inv(&xPA.Z, &xQA.Z, &xRA.Z, &invZP, &invZQ, &invZR) - - mul(&pub3Pt[0], &xPA.X, &invZP) - mul(&pub3Pt[1], &xQA.X, &invZQ) - mul(&pub3Pt[2], &xRA.X, &invZR) -} - -// Generate a public key in the 2-torsion group. Public key is a set -// of three x-coordinates: xP,xQ,x(P-Q), where P,Q are points on E_a(Fp2) -func PublicKeyGenB(pub3Pt *[3]Fp2, prvBytes []byte) { - var xPB, xQB, xRB, xR ProjectivePoint - var xPA, xQA, xRA ProjectivePoint - var invZP, invZQ, invZR Fp2 - var phi isogeny3 - - // Load points for B - xRB = ProjectivePoint{X: params.B.AffineR, Z: params.OneFp2} - xQB = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - xPB = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Load points for A - xPA = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - xQA = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - xRA = ProjectivePoint{X: params.A.AffineR, Z: params.OneFp2} - - // Find isogeny kernel - xR = ScalarMul3Pt(¶ms.InitCurve, &xPB, &xQB, &xRB, params.B.SecretBitLen, prvBytes) - traverseTreePublicKeyB(¶ms.InitCurve, &xR, &xPA, &xQA, &xRA) - - phi.GenerateCurve(&xR) - xPB = xPA - xQB = xQA - xRB = xRA - phi.EvaluatePoint(&xPB) - phi.EvaluatePoint(&xQB) - phi.EvaluatePoint(&xRB) - Fp2Batch3Inv(&xPB.Z, &xQB.Z, &xRB.Z, &invZP, &invZQ, &invZR) - - mul(&pub3Pt[0], &xPB.X, &invZP) - mul(&pub3Pt[1], &xQB.X, &invZQ) - mul(&pub3Pt[2], &xRB.X, &invZR) -} - -// ----------------------------------------------------------------------------- -// Key agreement functions -// - -// Establishing shared keys in in 2-torsion group -func DeriveSecretA(ss, prv []byte, pub3Pt *[3]Fp2) { - var xP, xQ, xQmP ProjectivePoint - var xR ProjectivePoint - var phi isogeny4 - var jInv Fp2 - - // Recover curve coefficients - cparam := params.InitCurve - RecoverCoordinateA(&cparam, &pub3Pt[0], &pub3Pt[1], &pub3Pt[2]) - - // Find kernel of the morphism - xP = ProjectivePoint{X: pub3Pt[0], Z: params.OneFp2} - xQ = ProjectivePoint{X: pub3Pt[1], Z: params.OneFp2} - xQmP = ProjectivePoint{X: pub3Pt[2], Z: params.OneFp2} - xR = ScalarMul3Pt(&cparam, &xP, &xQ, &xQmP, params.A.SecretBitLen, prv) - - // Traverse isogeny tree - traverseTreeSharedKeyA(&cparam, &xR) - - // Calculate j-invariant on isogenous curve - c := phi.GenerateCurve(&xR) - RecoverCurveCoefficients4(&cparam, &c) - Jinvariant(&cparam, &jInv) - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(ss, &jInv, params.Bytelen) -} - -// Establishing shared keys in in 3-torsion group -func DeriveSecretB(ss, prv []byte, pub3Pt *[3]Fp2) { - var xP, xQ, xQmP ProjectivePoint - var xR ProjectivePoint - var phi isogeny3 - var jInv Fp2 - - // Recover curve coefficients - cparam := params.InitCurve - RecoverCoordinateA(&cparam, &pub3Pt[0], &pub3Pt[1], &pub3Pt[2]) - - // Find kernel of the morphism - xP = ProjectivePoint{X: pub3Pt[0], Z: params.OneFp2} - xQ = ProjectivePoint{X: pub3Pt[1], Z: params.OneFp2} - xQmP = ProjectivePoint{X: pub3Pt[2], Z: params.OneFp2} - - //PUBLIC KEY VALIDATION - if err := PublicKeyValidation(&cparam, &xP, &xQ, &xQmP, params.B.SecretBitLen); err != nil { - _, err_read := crand.Read(ss) - if err_read != nil { - panic("core: failed to generate random ss when public key verification fails") - } - return - } - - xR = ScalarMul3Pt(&cparam, &xP, &xQ, &xQmP, params.B.SecretBitLen, prv) - - // Traverse isogeny tree - traverseTreeSharedKeyB(&cparam, &xR) - - // Calculate j-invariant on isogenous curve - c := phi.GenerateCurve(&xR) - RecoverCurveCoefficients3(&cparam, &c) - Jinvariant(&cparam, &jInv) - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(ss, &jInv, params.Bytelen) - - -} diff --git a/dh/sidh/internal/templates/curve.gotemp b/dh/sidh/internal/templates/curve.gotemp deleted file mode 100644 index b56ca7ba..00000000 --- a/dh/sidh/internal/templates/curve.gotemp +++ /dev/null @@ -1,437 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package {{.PACKAGE}} - -import ( - "math" - "errors" - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Stores isogeny 3 curve constants -type isogeny3 struct { - K1 Fp2 - K2 Fp2 -} - -// Stores isogeny 4 curve constants -type isogeny4 struct { - isogeny3 - K3 Fp2 -} - -// Computes j-invariant for a curve y2=x3+A/Cx+x with A,C in F_(p^2). Result -// is returned in jBytes buffer, encoded in little-endian format. Caller -// provided jBytes buffer has to be big enough to j-invariant value. In case -// of SIDH, buffer size must be at least size of shared secret. -// Implementation corresponds to Algorithm 9 from SIKE. -func Jinvariant(cparams *ProjectiveCurveParameters, j *Fp2) { - var t0, t1 Fp2 - - sqr(j, &cparams.A) // j = A^2 - sqr(&t1, &cparams.C) // t1 = C^2 - add(&t0, &t1, &t1) // t0 = t1 + t1 - sub(&t0, j, &t0) // t0 = j - t0 - sub(&t0, &t0, &t1) // t0 = t0 - t1 - sub(j, &t0, &t1) // t0 = t0 - t1 - sqr(&t1, &t1) // t1 = t1^2 - mul(j, j, &t1) // j = j * t1 - add(&t0, &t0, &t0) // t0 = t0 + t0 - add(&t0, &t0, &t0) // t0 = t0 + t0 - sqr(&t1, &t0) // t1 = t0^2 - mul(&t0, &t0, &t1) // t0 = t0 * t1 - add(&t0, &t0, &t0) // t0 = t0 + t0 - add(&t0, &t0, &t0) // t0 = t0 + t0 - inv(j, j) // j = 1/j - mul(j, &t0, j) // j = t0 * j -} - -// Given affine points x(P), x(Q) and x(Q-P) in a extension field F_{p^2}, function -// recovers projective coordinate A of a curve. This is Algorithm 10 from SIKE. -func RecoverCoordinateA(curve *ProjectiveCurveParameters, xp, xq, xr *Fp2) { - var t0, t1 Fp2 - - add(&t1, xp, xq) // t1 = Xp + Xq - mul(&t0, xp, xq) // t0 = Xp * Xq - mul(&curve.A, xr, &t1) // A = X(q-p) * t1 - add(&curve.A, &curve.A, &t0) // A = A + t0 - mul(&t0, &t0, xr) // t0 = t0 * X(q-p) - sub(&curve.A, &curve.A, ¶ms.OneFp2) // A = A - 1 - add(&t0, &t0, &t0) // t0 = t0 + t0 - add(&t1, &t1, xr) // t1 = t1 + X(q-p) - add(&t0, &t0, &t0) // t0 = t0 + t0 - sqr(&curve.A, &curve.A) // A = A^2 - inv(&t0, &t0) // t0 = 1/t0 - mul(&curve.A, &curve.A, &t0) // A = A * t0 - sub(&curve.A, &curve.A, &t1) // A = A - t1 -} - -// Computes equivalence (A:C) ~ (A+2C : A-2C) -func CalcCurveParamsEquiv3(cparams *ProjectiveCurveParameters) CurveCoefficientsEquiv { - var coef CurveCoefficientsEquiv - var c2 Fp2 - - add(&c2, &cparams.C, &cparams.C) - // A24p = A+2*C - add(&coef.A, &cparams.A, &c2) - // A24m = A-2*C - sub(&coef.C, &cparams.A, &c2) - return coef -} - -// Computes equivalence (A:C) ~ (A+2C : 4C) -func CalcCurveParamsEquiv4(cparams *ProjectiveCurveParameters) CurveCoefficientsEquiv { - var coefEq CurveCoefficientsEquiv - - add(&coefEq.C, &cparams.C, &cparams.C) - // A24p = A+2C - add(&coefEq.A, &cparams.A, &coefEq.C) - // C24 = 4*C - add(&coefEq.C, &coefEq.C, &coefEq.C) - return coefEq -} - -// Helper function for RightToLeftLadder(). Returns A+2C / 4. -func CalcAplus2Over4(cparams *ProjectiveCurveParameters) (ret Fp2) { - var tmp Fp2 - - // 2C - add(&tmp, &cparams.C, &cparams.C) - // A+2C - add(&ret, &cparams.A, &tmp) - // 1/4C - add(&tmp, &tmp, &tmp) - inv(&tmp, &tmp) - // A+2C/4C - mul(&ret, &ret, &tmp) - return -} - -// Recovers (A:C) curve parameters from projectively equivalent (A+2C:A-2C). -func RecoverCurveCoefficients3(cparams *ProjectiveCurveParameters, coefEq *CurveCoefficientsEquiv) { - add(&cparams.A, &coefEq.A, &coefEq.C) - // cparams.A = 2*(A+2C+A-2C) = 4A - add(&cparams.A, &cparams.A, &cparams.A) - // cparams.C = (A+2C-A+2C) = 4C - sub(&cparams.C, &coefEq.A, &coefEq.C) - return -} - -// Recovers (A:C) curve parameters from projectively equivalent (A+2C:4C). -func RecoverCurveCoefficients4(cparams *ProjectiveCurveParameters, coefEq *CurveCoefficientsEquiv) { - // cparams.C = (4C)*1/2=2C - mul(&cparams.C, &coefEq.C, ¶ms.HalfFp2) - // cparams.A = A+2C - 2C = A - sub(&cparams.A, &coefEq.A, &cparams.C) - // cparams.C = 2C * 1/2 = C - mul(&cparams.C, &cparams.C, ¶ms.HalfFp2) -} - - -// Combined coordinate doubling and differential addition. Takes projective points -// P,Q,Q-P and (A+2C)/4C curve E coefficient. Returns 2*P and P+Q calculated on E. -// Function is used only by RightToLeftLadder. Corresponds to Algorithm 5 of SIKE -func xDbladd(P, Q, QmP *ProjectivePoint, a24 *Fp2) (dblP, PaQ ProjectivePoint) { - var t0, t1, t2 Fp2 - - xQmP, zQmP := &QmP.X, &QmP.Z - xPaQ, zPaQ := &PaQ.X, &PaQ.Z - x2P, z2P := &dblP.X, &dblP.Z - xP, zP := &P.X, &P.Z - xQ, zQ := &Q.X, &Q.Z - - add(&t0, xP, zP) // t0 = Xp+Zp - sub(&t1, xP, zP) // t1 = Xp-Zp - sqr(x2P, &t0) // 2P.X = t0^2 - sub(&t2, xQ, zQ) // t2 = Xq-Zq - add(xPaQ, xQ, zQ) // Xp+q = Xq+Zq - mul(&t0, &t0, &t2) // t0 = t0 * t2 - mul(z2P, &t1, &t1) // 2P.Z = t1 * t1 - mul(&t1, &t1, xPaQ) // t1 = t1 * Xp+q - sub(&t2, x2P, z2P) // t2 = 2P.X - 2P.Z - mul(x2P, x2P, z2P) // 2P.X = 2P.X * 2P.Z - mul(xPaQ, a24, &t2) // Xp+q = A24 * t2 - sub(zPaQ, &t0, &t1) // Zp+q = t0 - t1 - add(z2P, xPaQ, z2P) // 2P.Z = Xp+q + 2P.Z - add(xPaQ, &t0, &t1) // Xp+q = t0 + t1 - mul(z2P, z2P, &t2) // 2P.Z = 2P.Z * t2 - sqr(zPaQ, zPaQ) // Zp+q = Zp+q ^ 2 - sqr(xPaQ, xPaQ) // Xp+q = Xp+q ^ 2 - mul(zPaQ, xQmP, zPaQ) // Zp+q = Xq-p * Zp+q - mul(xPaQ, zQmP, xPaQ) // Xp+q = Zq-p * Xp+q - return -} - -// Given the curve parameters, xP = x(P), computes xP = x([2^k]P) -// Safe to overlap xP, x2P. -func Pow2k(xP *ProjectivePoint, params *CurveCoefficientsEquiv, k uint32) { - var t0, t1 Fp2 - - x, z := &xP.X, &xP.Z - for i := uint32(0); i < k; i++ { - sub(&t0, x, z) // t0 = Xp - Zp - add(&t1, x, z) // t1 = Xp + Zp - sqr(&t0, &t0) // t0 = t0 ^ 2 - sqr(&t1, &t1) // t1 = t1 ^ 2 - mul(z, ¶ms.C, &t0) // Z2p = C24 * t0 - mul(x, z, &t1) // X2p = Z2p * t1 - sub(&t1, &t1, &t0) // t1 = t1 - t0 - mul(&t0, ¶ms.A, &t1) // t0 = A24+ * t1 - add(z, z, &t0) // Z2p = Z2p + t0 - mul(z, z, &t1) // Zp = Z2p * t1 - } -} - -// Given the curve parameters, xP = x(P), and k >= 0, compute xP = x([3^k]P). -// -// Safe to overlap xP, xR. -func Pow3k(xP *ProjectivePoint, params *CurveCoefficientsEquiv, k uint32) { - var t0, t1, t2, t3, t4, t5, t6 Fp2 - - x, z := &xP.X, &xP.Z - for i := uint32(0); i < k; i++ { - sub(&t0, x, z) // t0 = Xp - Zp - sqr(&t2, &t0) // t2 = t0^2 - add(&t1, x, z) // t1 = Xp + Zp - sqr(&t3, &t1) // t3 = t1^2 - add(&t4, &t1, &t0) // t4 = t1 + t0 - sub(&t0, &t1, &t0) // t0 = t1 - t0 - sqr(&t1, &t4) // t1 = t4^2 - sub(&t1, &t1, &t3) // t1 = t1 - t3 - sub(&t1, &t1, &t2) // t1 = t1 - t2 - mul(&t5, &t3, ¶ms.A) // t5 = t3 * A24+ - mul(&t3, &t3, &t5) // t3 = t5 * t3 - mul(&t6, &t2, ¶ms.C) // t6 = t2 * A24- - mul(&t2, &t2, &t6) // t2 = t2 * t6 - sub(&t3, &t2, &t3) // t3 = t2 - t3 - sub(&t2, &t5, &t6) // t2 = t5 - t6 - mul(&t1, &t2, &t1) // t1 = t2 * t1 - add(&t2, &t3, &t1) // t2 = t3 + t1 - sqr(&t2, &t2) // t2 = t2^2 - mul(x, &t2, &t4) // X3p = t2 * t4 - sub(&t1, &t3, &t1) // t1 = t3 - t1 - sqr(&t1, &t1) // t1 = t1^2 - mul(z, &t1, &t0) // Z3p = t1 * t0 - } -} - -// Set (y1, y2, y3) = (1/x1, 1/x2, 1/x3). -// -// All xi, yi must be distinct. -func Fp2Batch3Inv(x1, x2, x3, y1, y2, y3 *Fp2) { - var x1x2, t Fp2 - - mul(&x1x2, x1, x2) // x1*x2 - mul(&t, &x1x2, x3) // 1/(x1*x2*x3) - inv(&t, &t) - mul(y1, &t, x2) // 1/x1 - mul(y1, y1, x3) - mul(y2, &t, x1) // 1/x2 - mul(y2, y2, x3) - mul(y3, &t, &x1x2) // 1/x3 -} - -// Scalarmul3Pt is a right-to-left point multiplication that given the -// x-coordinate of P, Q and P-Q calculates the x-coordinate of R=Q+[scalar]P. -// nbits must be smaller or equal to len(scalar). -func ScalarMul3Pt(cparams *ProjectiveCurveParameters, P, Q, PmQ *ProjectivePoint, nbits uint, scalar []uint8) ProjectivePoint { - var R0, R2, R1 ProjectivePoint - aPlus2Over4 := CalcAplus2Over4(cparams) - R1 = *P - R2 = *PmQ - R0 = *Q - - - // Iterate over the bits of the scalar, bottom to top - prevBit := uint8(0) - for i := uint(0); i < nbits; i++ { - bit := (scalar[i>>3] >> (i & 7) & 1) - swap := prevBit ^ bit - prevBit = bit - cswap(&R1.X, &R1.Z, &R2.X, &R2.Z, swap) - R0, R2 = xDbladd(&R0, &R2, &R1, &aPlus2Over4) - } - cswap(&R1.X, &R1.Z, &R2.X, &R2.Z, prevBit) - return R1 -} - -// Given a three-torsion point p = x(PB) on the curve E_(A:C), construct the -// three-isogeny phi : E_(A:C) -> E_(A:C)/ = E_(A':C'). -// -// Input: (XP_3: ZP_3), where P_3 has exact order 3 on E_A/C -// Output: -// - Curve coordinates (A' + 2C', A' - 2C') corresponding to E_A'/C' = A_E/C/ -// - Isogeny phi with constants in F_p^2 -func (phi *isogeny3) GenerateCurve(p *ProjectivePoint) CurveCoefficientsEquiv { - var t0, t1, t2, t3, t4 Fp2 - var coefEq CurveCoefficientsEquiv - K1, K2 := &phi.K1, &phi.K2 - - sub(K1, &p.X, &p.Z) // K1 = XP3 - ZP3 - sqr(&t0, K1) // t0 = K1^2 - add(K2, &p.X, &p.Z) // K2 = XP3 + ZP3 - sqr(&t1, K2) // t1 = K2^2 - add(&t2, &t0, &t1) // t2 = t0 + t1 - add(&t3, K1, K2) // t3 = K1 + K2 - sqr(&t3, &t3) // t3 = t3^2 - sub(&t3, &t3, &t2) // t3 = t3 - t2 - add(&t2, &t1, &t3) // t2 = t1 + t3 - add(&t3, &t3, &t0) // t3 = t3 + t0 - add(&t4, &t3, &t0) // t4 = t3 + t0 - add(&t4, &t4, &t4) // t4 = t4 + t4 - add(&t4, &t1, &t4) // t4 = t1 + t4 - mul(&coefEq.C, &t2, &t4) // A24m = t2 * t4 - add(&t4, &t1, &t2) // t4 = t1 + t2 - add(&t4, &t4, &t4) // t4 = t4 + t4 - add(&t4, &t0, &t4) // t4 = t0 + t4 - mul(&t4, &t3, &t4) // t4 = t3 * t4 - sub(&t0, &t4, &coefEq.C) // t0 = t4 - A24m - add(&coefEq.A, &coefEq.C, &t0) // A24p = A24m + t0 - return coefEq -} - -// Given a 3-isogeny phi and a point pB = x(PB), compute x(QB), the x-coordinate -// of the image QB = phi(PB) of PB under phi : E_(A:C) -> E_(A':C'). -// -// The output xQ = x(Q) is then a point on the curve E_(A':C'); the curve -// parameters are returned by the GenerateCurve function used to construct phi. -func (phi *isogeny3) EvaluatePoint(p *ProjectivePoint) { - var t0, t1, t2 Fp2 - K1, K2 := &phi.K1, &phi.K2 - px, pz := &p.X, &p.Z - - add(&t0, px, pz) // t0 = XQ + ZQ - sub(&t1, px, pz) // t1 = XQ - ZQ - mul(&t0, K1, &t0) // t2 = K1 * t0 - mul(&t1, K2, &t1) // t1 = K2 * t1 - add(&t2, &t0, &t1) // t2 = t0 + t1 - sub(&t0, &t1, &t0) // t0 = t1 - t0 - sqr(&t2, &t2) // t2 = t2 ^ 2 - sqr(&t0, &t0) // t0 = t0 ^ 2 - mul(px, px, &t2) // XQ'= XQ * t2 - mul(pz, pz, &t0) // ZQ'= ZQ * t0 -} - -// Given a four-torsion point p = x(PB) on the curve E_(A:C), construct the -// four-isogeny phi : E_(A:C) -> E_(A:C)/ = E_(A':C'). -// -// Input: (XP_4: ZP_4), where P_4 has exact order 4 on E_A/C -// Output: -// - Curve coordinates (A' + 2C', 4C') corresponding to E_A'/C' = A_E/C/ -// - Isogeny phi with constants in F_p^2 -func (phi *isogeny4) GenerateCurve(p *ProjectivePoint) CurveCoefficientsEquiv { - var coefEq CurveCoefficientsEquiv - xp4, zp4 := &p.X, &p.Z - K1, K2, K3 := &phi.K1, &phi.K2, &phi.K3 - - sub(K2, xp4, zp4) - add(K3, xp4, zp4) - sqr(K1, zp4) - add(K1, K1, K1) - sqr(&coefEq.C, K1) - add(K1, K1, K1) - sqr(&coefEq.A, xp4) - add(&coefEq.A, &coefEq.A, &coefEq.A) - sqr(&coefEq.A, &coefEq.A) - return coefEq -} - -// Given a 4-isogeny phi and a point xP = x(P), compute x(Q), the x-coordinate -// of the image Q = phi(P) of P under phi : E_(A:C) -> E_(A':C'). -// -// Input: Isogeny returned by GenerateCurve and point q=(Qx,Qz) from E0_A/C -// Output: Corresponding point q from E1_A'/C', where E1 is 4-isogenous to E0 -func (phi *isogeny4) EvaluatePoint(p *ProjectivePoint) { - var t0, t1 Fp2 - xq, zq := &p.X, &p.Z - K1, K2, K3 := &phi.K1, &phi.K2, &phi.K3 - - add(&t0, xq, zq) - sub(&t1, xq, zq) - mul(xq, &t0, K2) - mul(zq, &t1, K3) - mul(&t0, &t0, &t1) - mul(&t0, &t0, K1) - add(&t1, xq, zq) - sub(zq, xq, zq) - sqr(&t1, &t1) - sqr(zq, zq) - add(xq, &t0, &t1) - sub(&t0, zq, &t0) - mul(xq, xq, &t1) - mul(zq, zq, &t0) -} - -// PublicKeyValidation preforms public key/ciphertext validation using the CLN test. -// CLN test: Check that P and Q are both of order 3^e3 and they generate the torsion E_A[3^e3] -// A countermeasure for remote timing attacks on SIKE; suggested by https://eprint.iacr.org/2022/054.pdf -// Any curve E_A (SIKE 434, 503, 751) that passes CLN test is supersingular. -// Input: The public key / ciphertext P, Q, PmQ. The projective coordinate A of the curve defined by (P, Q, PmQ) -// Outputs: Whether (P,Q,PmQ) follows the CLN test -func PublicKeyValidation(cparams *ProjectiveCurveParameters, P, Q, PmQ *ProjectivePoint, nbits uint) error { - - - var PmQX, PmQZ Fp2 - FromMontgomery(&PmQX, &PmQ.X) - FromMontgomery(&PmQZ, &PmQ.Z) - - // PmQ is not point T or O - if((isZero(&PmQX)==1)||(isZero(&PmQZ)==1)){ - return errors.New("curve: PmQ is invalid") - } - - cparam := CalcCurveParamsEquiv3(cparams) - - // Compute e_3 = log3(2^(nbits+1)) - var e3 uint32 - e3_float := float64(int(nbits)+1)/math.Log2(3) - e3 = uint32(e3_float) - - // Verify that P and Q generate E_A[3^e_3] by checking: [3^(e_3-1)]P != [+-3^(e_3-1)]Q - var test_P, test_Q ProjectivePoint - test_P = *P - test_Q = *Q - - - Pow3k(&test_P, &cparam, e3-1) - Pow3k(&test_Q, &cparam, e3-1) - - - var PZ, QZ Fp2 - FromMontgomery(&PZ, &test_P.Z) - FromMontgomery(&QZ, &test_Q.Z) - - - // P, Q are not of full order 3^e_3 - if((isZero(&PZ)==1)||(isZero(&QZ)==1)){ - return errors.New("curve: ciphertext/public key are not of full order 3^e3") - } - - // PX/PZ = affine(PX) - // QX/QZ = affine(QX) - // If PX/PZ = QX/QZ, we have P=+-Q - var PXQZ_PZQX_fromMont, PXQZ_PZQX, PXQZ, PZQX Fp2 - mul(&PXQZ, &test_P.X, &test_Q.Z) - mul(&PZQX, &test_P.Z, &test_Q.X) - sub(&PXQZ_PZQX, &PXQZ, &PZQX) - FromMontgomery(&PXQZ_PZQX_fromMont, &PXQZ_PZQX) - - // [3^(e_3-1)]P == [+-3^(e_3-1)]Q - if(isZero(&PXQZ_PZQX_fromMont)==1){ - return errors.New("curve: ciphertext/public key are not linearly independent") - } - - // Check that Ord(P) = Ord(Q) = 3^(e_3) - Pow3k(&test_P, &cparam, 1) - Pow3k(&test_Q, &cparam, 1) - - FromMontgomery(&PZ, &test_P.Z) - FromMontgomery(&QZ, &test_Q.Z) - - // P, Q are not of correct order 3^e_3 - if((isZero(&PZ)==0)||(isZero(&QZ)==0)){ - return errors.New("curve: ciphertext/public key are not of correct order 3^e3") - } - return nil -} diff --git a/dh/sidh/internal/templates/curve_test.gotemp b/dh/sidh/internal/templates/curve_test.gotemp deleted file mode 100644 index c3a34333..00000000 --- a/dh/sidh/internal/templates/curve_test.gotemp +++ /dev/null @@ -1,398 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package {{.PACKAGE}} - -import ( - "bytes" - "testing" - "math" - "math/rand" - crand "crypto/rand" - "io" - . "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "time" -) - -func vartimeEqProjFp2(lhs, rhs *ProjectivePoint) bool { - var t0, t1 Fp2 - mul(&t0, &lhs.X, &rhs.Z) - mul(&t1, &lhs.Z, &rhs.X) - return vartimeEqFp2(&t0, &t1) -} - -func toAffine(point *ProjectivePoint) *Fp2 { - var affineX Fp2 - inv(&affineX, &point.Z) - mul(&affineX, &affineX, &point.X) - return &affineX -} - -func Test_jInvariant(t *testing.T) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - jbufRes := make([]byte, params.SharedSecretSize) - jbufExp := make([]byte, params.SharedSecretSize) - var jInv Fp2 - - Jinvariant(&curve, &jInv) - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(jbufRes, &jInv, params.Bytelen) - - jInv = expectedJ - FromMontgomery(&jInv, &jInv) - Fp2ToBytes(jbufExp, &jInv, params.Bytelen) - - if !bytes.Equal(jbufRes[:], jbufExp[:]) { - t.Error("Computed incorrect j-invariant: found\n", jbufRes, "\nexpected\n", jbufExp) - } -} - -func TestProjectivePointVartimeEq(t *testing.T) { - var xP ProjectivePoint - - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - xQ := xP - - // Scale xQ, which results in the same projective point - mul(&xQ.X, &xQ.X, &curveA) - mul(&xQ.Z, &xQ.Z, &curveA) - if !vartimeEqProjFp2(&xP, &xQ) { - t.Error("Expected the scaled point to be equal to the original") - } -} - -func TestPointMulVersusSage(t *testing.T) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - cparams := CalcCurveParamsEquiv4(&curve) - var xP ProjectivePoint - - // x 2 - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - Pow2k(&xP, &cparams, 1) - afxQ := toAffine(&xP) - if !vartimeEqFp2(afxQ, &affineXP2) { - t.Error("\nExpected\n", affineXP2, "\nfound\n", afxQ) - } - - // x 4 - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - Pow2k(&xP, &cparams, 2) - afxQ = toAffine(&xP) - if !vartimeEqFp2(afxQ, &affineXP4) { - t.Error("\nExpected\n", affineXP4, "\nfound\n", afxQ) - } -} - -func TestPointMul9VersusSage(t *testing.T) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - cparams := CalcCurveParamsEquiv3(&curve) - var xP ProjectivePoint - - xP = ProjectivePoint{X: affineXP, Z: params.OneFp2} - Pow3k(&xP, &cparams, 2) - afxQ := toAffine(&xP) - if !vartimeEqFp2(afxQ, &affineXP9) { - t.Error("\nExpected\n", affineXP9, "\nfound\n", afxQ) - } -} - -func BenchmarkThreePointLadder(b *testing.B) { - curve := ProjectiveCurveParameters{A: curveA, C: curveC} - for n := 0; n < b.N; n++ { - ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(scalar3Pt)*8), scalar3Pt[:]) - } -} - -/* ------------------------------------------------------------------------- - Generate invalid public key points / ciphertext for test TestKEMInvalidPK - -------------------------------------------------------------------------*/ - -// Left-to-right Montgomery ladder, Algorithm 4 in Costello-Smith -// Input: ProjectivePoint P (xP, zP) -// Output: x([scalar]P), z([scalar]P) -func montgomeryLadder(cparams *ProjectiveCurveParameters, P *ProjectivePoint, scalar []uint8, random uint) ProjectivePoint { - var R0, R2, R1 ProjectivePoint - coefEq := CalcCurveParamsEquiv4(cparams) // for xDbl - aPlus2Over4 := CalcAplus2Over4(cparams) // for xDblAdd - R0 = *P // RO <- P - R1 = *P - Pow2k(&R1, &coefEq, 1) // R1 <- [2]P - R2 = *P // R2 = R1-R0 = P - - prevBit := uint8(0) - for i := int(random); i >= 0; i-- { - bit := (scalar[i>>3] >> (i & 7) & 1) - swap := prevBit ^ bit - prevBit = bit - cswap(&R0.X, &R0.Z, &R1.X, &R1.Z, swap) - R0, R1 = xDbladd(&R0, &R1, &R2, &aPlus2Over4) - } - cswap(&R0.X, &R0.Z, &R1.X, &R1.Z, prevBit) - return R0 -} - -// P = P + T -// From paper https://eprint.iacr.org/2017/212.pdf -// The map tau_T: P->P+T is (X : Z) -> (Z : X) on Montgomery curves -func tauT(P *ProjectivePoint) { - P.X, P.Z = P.Z, P.X // magic! -} - -// Construct Invalid public key tuple (P,Q) such that P and Q are linearly dependent -// Simulate section 3.1.1 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKNoneLinear(t *testing.T) { - - // Generate random scalar as secret - secret := make([]byte, params.B.SecretByteLen) - _, err := io.ReadFull(crand.Reader, secret) - if err != nil{ - t.Error("Fail read random bytes") - } - - var P, Q ProjectivePoint - - rand.Seed(time.Now().UnixNano()) - random_index := rand.Intn(int(params.B.SecretByteLen-1)*8) - - // Set P as a point of order 3^e3 - P = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Set Q = [k]P, where k = secret[:random_index] - Q = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index)) - - // Make sure Q is of full order 3^e_3, - var test_Q ProjectivePoint - test_Q = Q - - var e3 uint32 - e3_float := float64(int(params.B.SecretBitLen)+1)/math.Log2(3) - e3 = uint32(e3_float) - cparam_q := CalcCurveParamsEquiv3(¶ms.InitCurve) - Pow3k(&test_Q, &cparam_q, e3-1) - - var test_QZ Fp2 - FromMontgomery(&test_QZ, &test_Q.Z) - - // Q are not of full order 3^e_3 - for((isZero(&test_QZ)==1)){ - rand.Seed(time.Now().UnixNano()) - random_index = rand.Intn(int(params.B.SecretByteLen-1)*8) - Q = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index)) - test_Q = Q - Pow3k(&test_Q, &cparam_q, e3-1) - FromMontgomery(&test_QZ, &test_Q.Z) - } - - // invQz = 1/Q.Z - var invQz Fp2 - invQz = Q.Z - inv(&invQz, &invQz) - - mul(&P.X, &P.X, &P.Z) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify==nil{ - t.Errorf("\nExpect linearly dependent ciphertext to fail, index: %v scalar: %v ", random_index, secret) - } -} - -// Construct Invalid public key tuple (P,Q) such that Q = [k]P + T, where k is random and T is the point of order 2. -// Simulate HB and section 3.1.2 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKT(t *testing.T) { - - // Generate random scalar as secret - secret := make([]byte, params.B.SecretByteLen) - _, err := io.ReadFull(crand.Reader, secret) - if err != nil{ - t.Error("Fail read random bytes") - } - - - var P, Q ProjectivePoint - - rand.Seed(time.Now().UnixNano()) - random_index := rand.Intn(int(params.B.SecretByteLen-1)*8) - - // Set P as a point of order 3^e3 - P = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - - // Set Q = [k]P, where k = secret[:random_index] - Q = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index)) - // Q = [k]P + T - tauT(&Q) - - var invQz Fp2 - invQz = Q.Z - inv(&invQz, &invQz) - - mul(&P.X, &P.X, &P.Z) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify==nil{ - t.Errorf("\nExpect ciphertext involve point T to fail, index: %v scalar: %v ", random_index, secret) - } -} - - -// Construct Invalid public key tuple (P,Q) such that P and Q are in E[2^e2] -// Simulate section 3.2 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKOrder2(t *testing.T) { - - // Generate random scalar as secret - secret := make([]byte, params.B.SecretByteLen) - _, err := io.ReadFull(crand.Reader, secret) - if err != nil{ - t.Error("Fail read random bytes") - } - - - var P, Q ProjectivePoint - - P = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - Q = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - - rand.Seed(time.Now().UnixNano()) - random_index_p := rand.Intn(int(params.A.SecretByteLen-1)*8) - random_index_q := rand.Intn(int(params.A.SecretByteLen-1)*8) - - P = montgomeryLadder(¶ms.InitCurve, &P, secret, uint(random_index_p)) - Q = montgomeryLadder(¶ms.InitCurve, &Q, secret, uint(random_index_q)) - - var invQz, invPz Fp2 - invQz = Q.Z - invPz = P.Z - inv(&invQz, &invQz) - inv(&invPz, &invPz) - - mul(&P.X, &P.X, &invPz) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify==nil{ - t.Errorf("\nExpect ciphertext in torsion E[2^e2] to fail, index_p: %v index_q: %v scalar: %v ", random_index_p, random_index_q, secret) - } - -} - - -// Construct Invalid public key tuple (P,Q) such that P and Q are in E[3^e3] but not of full order 3^e3 -// Simulate section 3.1.1 of paper https://eprint.iacr.org/2022/054.pdf -// We only construct point P and Q because in the attacks the third point is P-Q by construction -// and the countermeasure does not test it -// Without loss of generality, we assume the curve is the starting curve -func testInvalidPKFullOrder(t *testing.T) { - - var P, Q ProjectivePoint - - P = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - Q = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - - var e3 uint32 - e3_float := float64(int(params.B.SecretBitLen)+1)/math.Log2(3) - e3 = uint32(e3_float) - - rand.Seed(time.Now().UnixNano()) - random_index_p := rand.Intn(int(e3)) - random_index_q := rand.Intn(int(e3)) - - cparam_q := CalcCurveParamsEquiv3(¶ms.InitCurve) - Pow3k(&P, &cparam_q, uint32(random_index_p)) - Pow3k(&Q, &cparam_q, uint32(random_index_q)) - - - var invQz, invPz Fp2 - invQz = Q.Z - invPz = P.Z - inv(&invQz, &invQz) - inv(&invPz, &invPz) - - mul(&P.X, &P.X, &invPz) - mul(&Q.X, &Q.X, &invQz) - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: P.X, Z: params.OneFp2} - xQ = ProjectivePoint{X: Q.X, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify==nil{ - t.Errorf("\nExpect ciphertext not of full order to fail, index_p: %v index_q: %v ", random_index_p, random_index_q) - } - -} - -// A trivial test case not covered by paper https://eprint.iacr.org/2022/054.pdf and HB -// Countermeasure in https://eprint.iacr.org/2022/054.pdf only cares about P and Q -// But if PmQ is point T or O, that can also lead to recovery of the first bit -func testInvalidPmQ(t *testing.T) { - - var zero Fp2 - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: params.A.AffineP, Z: params.OneFp2} - xQ = ProjectivePoint{X: params.A.AffineQ, Z: params.OneFp2} - xQmP = ProjectivePoint{X: zero, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify==nil{ - t.Errorf("\nExpect PmQ as T to fail\n") - } - -} - -// Test valid ciphertext -// Where P, Q are linearly independent points of correct order 3^e3 in E[3^e3] -func testValidPQ(t *testing.T) { - - var xP, xQ, xQmP ProjectivePoint - xP = ProjectivePoint{X: params.B.AffineP, Z: params.OneFp2} - xQ = ProjectivePoint{X: params.B.AffineQ, Z: params.OneFp2} - xQmP = ProjectivePoint{X: params.OneFp2, Z: params.OneFp2} - - error_verify := PublicKeyValidation(¶ms.InitCurve, &xP, &xQ, &xQmP, params.B.SecretBitLen) - if error_verify!=nil{ - t.Errorf("\nExpect correct ciphertext to not fail\n") - } - -} - - -/* ------------------------------------------------------------------------- - Public key / Ciphertext validation against attacks proposed in paper https://eprint.iacr.org/2022/054.pdf and HB - -------------------------------------------------------------------------*/ - -func TestInvalidPK(t *testing.T) { - - t.Run("InvalidPmQ", testInvalidPmQ) - t.Run("InvalidPKNoneLinear", testInvalidPKNoneLinear) - t.Run("InvalidPKT", testInvalidPKT) - t.Run("InvalidPKOrder2", testInvalidPKOrder2) - t.Run("InvalidPKFullOrder", testInvalidPKFullOrder) - t.Run("ValidPQ", testValidPQ) - -} diff --git a/dh/sidh/internal/templates/fp2.gotemp b/dh/sidh/internal/templates/fp2.gotemp deleted file mode 100644 index 2531c5ce..00000000 --- a/dh/sidh/internal/templates/fp2.gotemp +++ /dev/null @@ -1,222 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package {{.PACKAGE}} - -import ( - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -// Montgomery multiplication. Input values must be already -// in Montgomery domain. -func mulP(dest, lhs, rhs *common.Fp) { - var ab common.FpX2 - mul{{.FIELD}}(&ab, lhs, rhs) // = a*b*R*R - rdc{{.FIELD}}(dest, &ab) // = a*b*R mod p -} - -// Set dest = x^((p-3)/4). If x is square, this is 1/sqrt(x). -// Uses variation of sliding-window algorithm from with window size -// of 5 and least to most significant bit sliding (left-to-right) -// See HAC 14.85 for general description. -// -// Allowed to overlap x with dest. -// All values in Montgomery domains -// Set dest = x^(2^k), for k >= 1, by repeated squarings. -func p34(dest, x *common.Fp) { - var lookup [16]common.Fp - - // This performs sum(powStrategy) + 1 squarings and len(lookup) + len(mulStrategy) - // multiplications. - powStrategy := {{.P34_POW_STRATEGY}} - mulStrategy := {{.P34_MUL_STRATEGY}} - initialMul := uint8({{.P34_INITIAL_MUL}}) - - // Precompute lookup table of odd multiples of x for window - // size k=5. - var xx common.Fp - mulP(&xx, x, x) - lookup[0] = *x - for i := 1; i < 16; i++ { - mulP(&lookup[i], &lookup[i-1], &xx) - } - - // Now lookup = {x, x^3, x^5, ... } - // so that lookup[i] = x^{2*i + 1} - // so that lookup[k/2] = x^k, for odd k - *dest = lookup[initialMul] - for i := uint8(0); i < uint8(len(powStrategy)); i++ { - mulP(dest, dest, dest) - for j := uint8(1); j < powStrategy[i]; j++ { - mulP(dest, dest, dest) - } - mulP(dest, dest, &lookup[mulStrategy[i]]) - } -} - -func add(dest, lhs, rhs *common.Fp2) { - add{{.FIELD}}(&dest.A, &lhs.A, &rhs.A) - add{{.FIELD}}(&dest.B, &lhs.B, &rhs.B) -} - -func sub(dest, lhs, rhs *common.Fp2) { - sub{{.FIELD}}(&dest.A, &lhs.A, &rhs.A) - sub{{.FIELD}}(&dest.B, &lhs.B, &rhs.B) -} - -func mul(dest, lhs, rhs *common.Fp2) { - var bMinA, cMinD common.Fp - var ac, bd common.FpX2 - var adPlusBc common.FpX2 - var acMinBd common.FpX2 - - // Let (a,b,c,d) = (lhs.a,lhs.b,rhs.a,rhs.b). - // - // (a + bi)*(c + di) = (a*c - b*d) + (a*d + b*c)i - // - // Use Karatsuba's trick: note that - // - // (b - a)*(c - d) = (b*c + a*d) - a*c - b*d - // - // so (a*d + b*c) = (b-a)*(c-d) + a*c + b*d. - sub{{.FIELD}}(&bMinA, &lhs.B, &lhs.A) // = (b-a)*R - sub{{.FIELD}}(&cMinD, &rhs.A, &rhs.B) // = (c-d)*R - mul{{.FIELD}}(&ac, &lhs.A, &rhs.A) // = a*c*R*R - mul{{.FIELD}}(&bd, &lhs.B, &rhs.B) // = b*d*R*R - mul{{.FIELD}}(&adPlusBc, &bMinA, &cMinD) // = (b-a)*(c-d)*R*R - adl{{.FIELD}}(&adPlusBc, &adPlusBc, &ac) // = ((b-a)*(c-d) + a*c)*R*R - adl{{.FIELD}}(&adPlusBc, &adPlusBc, &bd) // = ((b-a)*(c-d) + a*c + b*d)*R*R - rdc{{.FIELD}}(&dest.B, &adPlusBc) // = (a*d + b*c)*R mod p - sul{{.FIELD}}(&acMinBd, &ac, &bd) // = (a*c - b*d)*R*R - rdc{{.FIELD}}(&dest.A, &acMinBd) // = (a*c - b*d)*R mod p -} - -// Set dest = 1/x -// -// Allowed to overlap dest with x. -// -// Returns dest to allow chaining operations. -func inv(dest, x *common.Fp2) { - var e1, e2 common.FpX2 - var f1, f2 common.Fp - - // We want to compute - // - // 1 1 (a - bi) (a - bi) - // -------- = -------- -------- = ----------- - // (a + bi) (a + bi) (a - bi) (a^2 + b^2) - // - // Letting c = 1/(a^2 + b^2), this is - // - // 1/(a+bi) = a*c - b*ci. - - mul{{.FIELD}}(&e1, &x.A, &x.A) // = a*a*R*R - mul{{.FIELD}}(&e2, &x.B, &x.B) // = b*b*R*R - adl{{.FIELD}}(&e1, &e1, &e2) // = (a^2 + b^2)*R*R - rdc{{.FIELD}}(&f1, &e1) // = (a^2 + b^2)*R mod p - // Now f1 = a^2 + b^2 - - mulP(&f2, &f1, &f1) - p34(&f2, &f2) - mulP(&f2, &f2, &f2) - mulP(&f2, &f2, &f1) - - mul{{.FIELD}}(&e1, &x.A, &f2) - rdc{{.FIELD}}(&dest.A, &e1) - - sub{{.FIELD}}(&f1, &common.Fp{}, &x.B) - mul{{.FIELD}}(&e1, &f1, &f2) - rdc{{.FIELD}}(&dest.B, &e1) -} - -func sqr(dest, x *common.Fp2) { - var a2, aPlusB, aMinusB common.Fp - var a2MinB2, ab2 common.FpX2 - - a := &x.A - b := &x.B - - // (a + bi)*(a + bi) = (a^2 - b^2) + 2abi. - add{{.FIELD}}(&a2, a, a) // = a*R + a*R = 2*a*R - add{{.FIELD}}(&aPlusB, a, b) // = a*R + b*R = (a+b)*R - sub{{.FIELD}}(&aMinusB, a, b) // = a*R - b*R = (a-b)*R - mul{{.FIELD}}(&a2MinB2, &aPlusB, &aMinusB) // = (a+b)*(a-b)*R*R = (a^2 - b^2)*R*R - mul{{.FIELD}}(&ab2, &a2, b) // = 2*a*b*R*R - rdc{{.FIELD}}(&dest.A, &a2MinB2) // = (a^2 - b^2)*R mod p - rdc{{.FIELD}}(&dest.B, &ab2) // = 2*a*b*R mod p -} - -// In case choice == 1, performs following swap in constant time: -// -// xPx <-> xQx -// xPz <-> xQz -// -// Otherwise returns xPx, xPz, xQx, xQz unchanged -func cswap(xPx, xPz, xQx, xQz *common.Fp2, choice uint8) { - cswap{{.FIELD}}(&xPx.A, &xQx.A, choice) - cswap{{.FIELD}}(&xPx.B, &xQx.B, choice) - cswap{{.FIELD}}(&xPz.A, &xQz.A, choice) - cswap{{.FIELD}}(&xPz.B, &xQz.B, choice) -} - -// In case choice == 1, performs following moves in constant time: -// -// xPx <- xQx -// xPz <- xQz -// -// Otherwise returns xPx, xPz, xQx, xQz unchanged -func cmov(xPx, xPz, xQx, xQz *common.Fp2, choice uint8) { - cmov{{.FIELD}}(&xPx.A, &xQx.A, choice) - cmov{{.FIELD}}(&xPx.B, &xQx.B, choice) - cmov{{.FIELD}}(&xPz.A, &xQz.A, choice) - cmov{{.FIELD}}(&xPz.B, &xQz.B, choice) -} - -func isZero(x *common.Fp2) uint8 { - r64 := uint64(0) - for i := 0; i < FpWords; i++ { - r64 |= x.A[i] | x.B[i] - } - r := uint8(0) - for i := uint64(0); i < 64; i++ { - r |= uint8((r64 >> i) & 0x1) - } - return 1 - r -} - -// Converts in.A and in.B to Montgomery domain and stores -// in 'out' -// out.A = in.A * R mod p -// out.B = in.B * R mod p -// Performs v = v*R^2*R^(-1) mod p, for both in.A and in.B -func ToMontgomery(out, in *common.Fp2) { - var aRR common.FpX2 - - // a*R*R - mul{{.FIELD}}(&aRR, &in.A, &{{.FIELD}}R2) - // a*R mod p - rdc{{.FIELD}}(&out.A, &aRR) - mul{{.FIELD}}(&aRR, &in.B, &{{.FIELD}}R2) - rdc{{.FIELD}}(&out.B, &aRR) -} - -// Converts in.A and in.B from Montgomery domain and stores -// in 'out' -// out.A = in.A mod p -// out.B = in.B mod p -// -// After returning from the call 'in' is not modified. -func FromMontgomery(out, in *common.Fp2) { - var aR common.FpX2 - - // convert from montgomery domain - copy(aR[:], in.A[:]) - rdc{{.FIELD}}(&out.A, &aR) // = a mod p in [0, 2p) - mod{{.FIELD}}(&out.A) // = a mod p in [0, p) - for i := range aR { - aR[i] = 0 - } - copy(aR[:], in.B[:]) - rdc{{.FIELD}}(&out.B, &aR) - mod{{.FIELD}}(&out.B) -} diff --git a/dh/sidh/internal/templates/fp2_test.gotemp b/dh/sidh/internal/templates/fp2_test.gotemp deleted file mode 100644 index a7caa09a..00000000 --- a/dh/sidh/internal/templates/fp2_test.gotemp +++ /dev/null @@ -1,245 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots. - -package {{.PACKAGE}} - -import ( - "math/rand" - "reflect" - "testing" - "testing/quick" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" -) - -type testParams struct { - Point common.ProjectivePoint - Cparam common.ProjectiveCurveParameters - ExtElem common.Fp2 -} - -// Returns true if lhs = rhs. Takes variable time. -func vartimeEqFp2(lhs, rhs *common.Fp2) bool { - a := *lhs - b := *rhs - - mod{{.FIELD}}(&a.A) - mod{{.FIELD}}(&a.B) - mod{{.FIELD}}(&b.A) - mod{{.FIELD}}(&b.B) - - eq := true - for i := 0; i < FpWords && eq; i++ { - eq = eq && (a.A[i] == b.A[i]) - eq = eq && (a.B[i] == b.B[i]) - } - return eq -} - -func (testParams) generateFp2(rand *rand.Rand) common.Fp2 { - // Generation strategy: low limbs taken from [0,2^64); high limb - // taken from smaller range - // - // Size hint is ignored since all elements are fixed size. - // - // Field elements taken in range [0,2p). Emulate this by capping - // the high limb by the top digit of 2*p-1: - // - // sage: (2*p-1).digits(2^64)[-1] - // - // This still allows generating values >= 2p, but hopefully that - // excess is OK (and if it's not, we'll find out, because it's for - // testing...) - highLimb := rand.Uint64() % {{.FIELD}}x2[FpWords-1] - fpElementGen := func() (fp common.Fp) { - for i := 0; i < (FpWords - 1); i++ { - fp[i] = rand.Uint64() - } - fp[FpWords-1] = highLimb - return fp - } - return common.Fp2{A: fpElementGen(), B: fpElementGen()} -} - -func (c testParams) Generate(rand *rand.Rand, size int) reflect.Value { - return reflect.ValueOf( - testParams{ - common.ProjectivePoint{ - X: c.generateFp2(rand), - Z: c.generateFp2(rand), - }, - common.ProjectiveCurveParameters{ - A: c.generateFp2(rand), - C: c.generateFp2(rand), - }, - c.generateFp2(rand), - }) -} - -func TestOne(t *testing.T) { - var tmp common.Fp2 - - mul(&tmp, ¶ms.OneFp2, ¶ms.A.AffineP) - if !vartimeEqFp2(&tmp, ¶ms.A.AffineP) { - t.Error("Not equal 1") - } -} - -func TestFp2ToBytesRoundTrip(t *testing.T) { - roundTrips := func(x testParams) bool { - xBytes := make([]byte, 2*params.Bytelen) - var xPrime common.Fp2 - - common.Fp2ToBytes(xBytes[:], &x.ExtElem, params.Bytelen) - common.BytesToFp2(&xPrime, xBytes[:], params.Bytelen) - return vartimeEqFp2(&xPrime, &x.ExtElem) - } - - if err := quick.Check(roundTrips, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2MulDistributesOverAdd(t *testing.T) { - mulDistributesOverAdd := func(x, y, z testParams) bool { - // Compute t1 = (x+y)*z - t1 := new(common.Fp2) - add(t1, &x.ExtElem, &y.ExtElem) - mul(t1, t1, &z.ExtElem) - - // Compute t2 = x*z + y*z - t2 := new(common.Fp2) - t3 := new(common.Fp2) - mul(t2, &x.ExtElem, &z.ExtElem) - mul(t3, &y.ExtElem, &z.ExtElem) - add(t2, t2, t3) - - return vartimeEqFp2(t1, t2) - } - - if err := quick.Check(mulDistributesOverAdd, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2MulIsAssociative(t *testing.T) { - isAssociative := func(x, y, z testParams) bool { - // Compute t1 = (x*y)*z - t1 := new(common.Fp2) - mul(t1, &x.ExtElem, &y.ExtElem) - mul(t1, t1, &z.ExtElem) - - // Compute t2 = (y*z)*x - t2 := new(common.Fp2) - mul(t2, &y.ExtElem, &z.ExtElem) - mul(t2, t2, &x.ExtElem) - - return vartimeEqFp2(t1, t2) - } - - if err := quick.Check(isAssociative, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2SquareMatchesMul(t *testing.T) { - sqrMatchesMul := func(x testParams) bool { - // Compute t1 = (x*x) - t1 := new(common.Fp2) - mul(t1, &x.ExtElem, &x.ExtElem) - - // Compute t2 = x^2 - t2 := new(common.Fp2) - sqr(t2, &x.ExtElem) - - return vartimeEqFp2(t1, t2) - } - - if err := quick.Check(sqrMatchesMul, quickCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2Inv(t *testing.T) { - inverseIsCorrect := func(x testParams) bool { - z := new(common.Fp2) - inv(z, &x.ExtElem) - - // Now z = (1/x), so (z * x) * x == x - mul(z, z, &x.ExtElem) - mul(z, z, &x.ExtElem) - - return vartimeEqFp2(z, &x.ExtElem) - } - - // This is more expensive; run fewer tests - fasterCheckConfig := &quick.Config{MaxCount: (1 << 11)} - if err := quick.Check(inverseIsCorrect, fasterCheckConfig); err != nil { - t.Error(err) - } -} - -func TestFp2Batch3Inv(t *testing.T) { - batchInverseIsCorrect := func(x1, x2, x3 testParams) bool { - var x1Inv, x2Inv, x3Inv common.Fp2 - inv(&x1Inv, &x1.ExtElem) - inv(&x2Inv, &x2.ExtElem) - inv(&x3Inv, &x3.ExtElem) - - var y1, y2, y3 common.Fp2 - Fp2Batch3Inv(&x1.ExtElem, &x2.ExtElem, &x3.ExtElem, &y1, &y2, &y3) - - return (vartimeEqFp2(&x1Inv, &y1) && vartimeEqFp2(&x2Inv, &y2) && vartimeEqFp2(&x3Inv, &y3)) - } - - // This is more expensive; run fewer tests - fasterCheckConfig := &quick.Config{MaxCount: (1 << 8)} - if err := quick.Check(batchInverseIsCorrect, fasterCheckConfig); err != nil { - t.Error(err) - } -} - -func BenchmarkFp2Mul(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - mul(w, z, z) - } -} - -func BenchmarkFp2Inv(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - inv(w, z) - } -} - -func BenchmarkFp2Square(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - sqr(w, z) - } -} - -func BenchmarkFp2Add(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - add(w, z, z) - } -} - -func BenchmarkFp2Sub(b *testing.B) { - z := &common.Fp2{A: bench_x, B: bench_y} - w := new(common.Fp2) - - for n := 0; n < b.N; n++ { - sub(w, z, z) - } -} diff --git a/dh/sidh/internal/templates/gen.go b/dh/sidh/internal/templates/gen.go deleted file mode 100644 index b5dfe039..00000000 --- a/dh/sidh/internal/templates/gen.go +++ /dev/null @@ -1,123 +0,0 @@ -// The following directive is necessary to make the package coherent: - -//go:build ignore -// +build ignore - -// This program generates contributors.go. It can be invoked by running -// go generate -package main - -import ( - "bytes" - "fmt" - "go/format" - "os" - "strings" - "text/template" -) - -var p34 = map[string]struct { - pow_strategy string - mul_strategy string - mul_initial int -}{ - "P434": { - pow_strategy: "[]uint8{3, 10, 7, 5, 6, 5, 3, 8, 4, 7, 5, 6, 4, 5, 9, 6, 3, 11, 5, 5, 2, 8, 4, 7, 7, 8, 5, 6, 4, 8, 5, 2, 10, 6, 5, 4, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1}", - mul_strategy: "[]uint8{2, 15, 9, 8, 14, 12, 2, 8, 5, 15, 8, 15, 6, 6, 3, 2, 0, 10, 9, 13, 1, 12, 3, 7, 1, 10, 8, 11, 2, 15, 14, 1, 11, 12, 14, 3, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0}", - mul_initial: 8, - }, - "P503": { - pow_strategy: "[]uint8{12, 5, 5, 2, 7, 11, 3, 8, 4, 11, 4, 7, 5, 6, 3, 7, 5, 7, 2, 12, 5, 6, 4, 6, 8, 6, 4, 7, 5, 5, 8, 5, 8, 5, 5, 8, 9, 3, 6, 2, 10, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3}", - mul_strategy: "[]uint8{12, 11, 10, 0, 1, 8, 3, 7, 1, 8, 3, 6, 7, 14, 2, 14, 14, 9, 0, 13, 9, 15, 5, 12, 7, 13, 7, 15, 6, 7, 9, 0, 5, 7, 6, 8, 8, 3, 7, 0, 10, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3}", - mul_initial: 0, - }, - "P751": { - pow_strategy: "[]uint8{5, 7, 6, 2, 10, 4, 6, 9, 8, 5, 9, 4, 7, 5, 5, 4, 8, 3, 9, 5, 5, 4, 10, 4, 6, 6, 6, 5, 8, 9, 3, 4, 9, 4, 5, 6, 6, 2, 9, 4, 5, 5, 5, 7, 7, 9, 4, 6, 4, 8, 5, 8, 6, 6, 2, 9, 7, 4, 8, 8, 8, 4, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2}", - mul_strategy: "[]uint8{15, 11, 10, 0, 15, 3, 3, 3, 4, 4, 9, 7, 11, 11, 5, 3, 12, 2, 10, 8, 5, 2, 8, 3, 5, 4, 11, 4, 0, 9, 2, 1, 12, 7, 5, 14, 15, 0, 14, 5, 6, 4, 5, 13, 6, 9, 7, 15, 1, 14, 11, 15, 12, 5, 0, 10, 9, 7, 7, 10, 14, 6, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 1}", - mul_initial: 13, - }, -} - -// P434 optimized implementation for -// ARM64 is not ported yet -var opt_arm = map[string]bool{ - "P434": false, - "P503": true, - "P751": true, -} - -// Generates an 'fileNameBase.go' from 'fileNameBase.gotemp' file -// for a given finite 'field'. Maps placeholders to 'values'. -func gen(field, fileNameBase string, values interface{}) { - // Template files are located in ../templates and have - // extension .gotemp - templateFile := "../templates/" + fileNameBase + ".gotemp" - t, err := template.ParseFiles(templateFile) - if err != nil { - panic(fmt.Sprintf("Cannot open template file %s", templateFile)) - } - var buf bytes.Buffer - err = t.Execute(&buf, values) - if err != nil { - panic("bad template execution") - } - - // Formating output code - code, err := format.Source(buf.Bytes()) - if err != nil { - panic("error formating code") - } - - // name of the output .go file - outFileName := fileNameBase + ".go" - out, err := os.Create(outFileName) - if err != nil { - panic("Cannot open file") - } - _, err = out.Write(code) - if err != nil { - panic("error writing code") - } - - err = out.Close() - if err != nil { - panic("Cant close generated file") - } -} - -func main() { - field := os.Args[1] - - s := struct { - FIELD string - PACKAGE string - P34_POW_STRATEGY string - P34_MUL_STRATEGY string - P34_INITIAL_MUL int - OPT_ARM bool - }{ - FIELD: field, - PACKAGE: strings.ToLower(field), - P34_POW_STRATEGY: p34[field].pow_strategy, - P34_MUL_STRATEGY: p34[field].mul_strategy, - P34_INITIAL_MUL: p34[field].mul_initial, - OPT_ARM: opt_arm[field], - } - - targets := map[string]interface{}{ - "arith_decl": s, - "arith_generic": s, - "curve": s, - "fp2": s, - "core": s, - - // tests - "arith_test": s, - "fp2_test": s, - "curve_test": s, - } - - for v, s := range targets { - gen(field, v, s) - } -} diff --git a/dh/sidh/sidh.go b/dh/sidh/sidh.go deleted file mode 100644 index a3ed3880..00000000 --- a/dh/sidh/sidh.go +++ /dev/null @@ -1,298 +0,0 @@ -package sidh - -import ( - "errors" - "io" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "github.com/quantumcoinproject/circl/dh/sidh/internal/p434" - "github.com/quantumcoinproject/circl/dh/sidh/internal/p503" - "github.com/quantumcoinproject/circl/dh/sidh/internal/p751" -) - -// I keep it bool in order to be able to apply logical NOT. -// -// Deprecated: not cryptographically secure. -type KeyVariant uint - -// Base type for public and private key. Used mainly to carry domain -// parameters. -type key struct { - // Domain parameters of the algorithm to be used with a key - params *common.SidhParams - // Flag indicates whether corresponds to 2-, 3-torsion group or SIKE - keyVariant KeyVariant -} - -// Defines operations on public key -// -// Deprecated: not cryptographically secure. -type PublicKey struct { - key - // x-coordinates of P,Q,P-Q in this exact order - affine3Pt [3]common.Fp2 -} - -// Defines operations on private key -// -// Deprecated: not cryptographically secure. -type PrivateKey struct { - key - // Secret key - Scalar []byte - // Used only by KEM - S []byte -} - -// Identifiers correspond to the bitlength of the prime field characteristic. -const ( - Fp434 = common.Fp434 - Fp503 = common.Fp503 - Fp751 = common.Fp751 -) - -const ( - // First 2 bits identify SIDH variant third bit indicates - // whether key is a SIKE variant (set) or SIDH (not set) - - // 001 - SIDH: corresponds to 2-torsion group - KeyVariantSidhA KeyVariant = 1 << 0 - // 010 - SIDH: corresponds to 3-torsion group - KeyVariantSidhB = 1 << 1 - // 110 - SIKE - KeyVariantSike = 1<<2 | KeyVariantSidhB -) - -// Accessor to key variant. -func (key *key) Variant() KeyVariant { - return key.keyVariant -} - -// NewPublicKey initializes public key. -// Usage of this function guarantees that the object is correctly initialized. -// -// Deprecated: not cryptographically secure. -func NewPublicKey(id uint8, v KeyVariant) *PublicKey { - return &PublicKey{key: key{params: common.Params(id), keyVariant: v}} -} - -// Import clears content of the public key currently stored in the structure -// and imports key stored in the byte string. Returns error in case byte string -// size is wrong. Doesn't perform any validation. -func (pub *PublicKey) Import(input []byte) error { - if len(input) != pub.Size() { - return errors.New("sidh: input to short") - } - ssSz := pub.params.SharedSecretSize - common.BytesToFp2(&pub.affine3Pt[0], input[0:ssSz], pub.params.Bytelen) - common.BytesToFp2(&pub.affine3Pt[1], input[ssSz:2*ssSz], pub.params.Bytelen) - common.BytesToFp2(&pub.affine3Pt[2], input[2*ssSz:3*ssSz], pub.params.Bytelen) - switch pub.params.ID { - case Fp434: - p434.ToMontgomery(&pub.affine3Pt[0], &pub.affine3Pt[0]) - p434.ToMontgomery(&pub.affine3Pt[1], &pub.affine3Pt[1]) - p434.ToMontgomery(&pub.affine3Pt[2], &pub.affine3Pt[2]) - case Fp503: - p503.ToMontgomery(&pub.affine3Pt[0], &pub.affine3Pt[0]) - p503.ToMontgomery(&pub.affine3Pt[1], &pub.affine3Pt[1]) - p503.ToMontgomery(&pub.affine3Pt[2], &pub.affine3Pt[2]) - case Fp751: - p751.ToMontgomery(&pub.affine3Pt[0], &pub.affine3Pt[0]) - p751.ToMontgomery(&pub.affine3Pt[1], &pub.affine3Pt[1]) - p751.ToMontgomery(&pub.affine3Pt[2], &pub.affine3Pt[2]) - default: - panic("Unsupported key") - } - return nil -} - -// Exports currently stored key. In case structure hasn't been filled with key data -// returned byte string is filled with zeros. -func (pub *PublicKey) Export(out []byte) { - var feTmp [3]common.Fp2 - ssSz := pub.params.SharedSecretSize - switch pub.params.ID { - case Fp434: - p434.FromMontgomery(&feTmp[0], &pub.affine3Pt[0]) - p434.FromMontgomery(&feTmp[1], &pub.affine3Pt[1]) - p434.FromMontgomery(&feTmp[2], &pub.affine3Pt[2]) - case Fp503: - p503.FromMontgomery(&feTmp[0], &pub.affine3Pt[0]) - p503.FromMontgomery(&feTmp[1], &pub.affine3Pt[1]) - p503.FromMontgomery(&feTmp[2], &pub.affine3Pt[2]) - case Fp751: - p751.FromMontgomery(&feTmp[0], &pub.affine3Pt[0]) - p751.FromMontgomery(&feTmp[1], &pub.affine3Pt[1]) - p751.FromMontgomery(&feTmp[2], &pub.affine3Pt[2]) - default: - panic("Unsupported key") - } - common.Fp2ToBytes(out[0:ssSz], &feTmp[0], pub.params.Bytelen) - common.Fp2ToBytes(out[ssSz:2*ssSz], &feTmp[1], pub.params.Bytelen) - common.Fp2ToBytes(out[2*ssSz:3*ssSz], &feTmp[2], pub.params.Bytelen) -} - -// Size returns size of the public key in bytes. -func (pub *PublicKey) Size() int { - return pub.params.PublicKeySize -} - -// NewPrivateKey initializes private key. -// Usage of this function guarantees that the object is correctly initialized. -// -// Deprecated: not cryptographically secure. -func NewPrivateKey(id uint8, v KeyVariant) *PrivateKey { - prv := &PrivateKey{key: key{params: common.Params(id), keyVariant: v}} - if (v & KeyVariantSidhA) == KeyVariantSidhA { - prv.Scalar = make([]byte, prv.params.A.SecretByteLen) - } else { - prv.Scalar = make([]byte, prv.params.B.SecretByteLen) - } - if v == KeyVariantSike { - prv.S = make([]byte, prv.params.MsgLen) - } - return prv -} - -// Exports currently stored key. In case structure hasn't been filled with key data -// returned byte string is filled with zeros. -func (prv *PrivateKey) Export(out []byte) { - copy(out, prv.S) - copy(out[len(prv.S):], prv.Scalar) -} - -// Size returns size of the private key in bytes. -func (prv *PrivateKey) Size() int { - tmp := len(prv.Scalar) - if prv.Variant() == KeyVariantSike { - tmp += prv.params.MsgLen - } - return tmp -} - -// Size returns size of the shared secret. -func (prv *PrivateKey) SharedSecretSize() int { - return prv.params.SharedSecretSize -} - -// Import clears content of the private key currently stored in the structure -// and imports key from octet string. In case of SIKE, the random value 'S' -// must be prepended to the value of actual private key (see SIKE spec for details). -// Function doesn't import public key value to PrivateKey object. -func (prv *PrivateKey) Import(input []byte) error { - if len(input) != prv.Size() { - return errors.New("sidh: input to short") - } - copy(prv.S, input[:len(prv.S)]) - copy(prv.Scalar, input[len(prv.S):]) - return nil -} - -// Generates random private key for SIDH or SIKE. Generated value is -// formed as little-endian integer from key-space <2^(e2-1)..2^e2 - 1> -// for KeyVariant_A or <2^(s-1)..2^s - 1>, where s = floor(log_2(3^e3)), -// for KeyVariant_B. -// -// Returns error in case user provided RNG fails. -func (prv *PrivateKey) Generate(rand io.Reader) error { - var dp *common.DomainParams - - if (prv.keyVariant & KeyVariantSidhA) == KeyVariantSidhA { - dp = &prv.params.A - } else { - dp = &prv.params.B - } - - if prv.keyVariant == KeyVariantSike { - if _, err := io.ReadFull(rand, prv.S); err != nil { - return err - } - } - - // Private key generation takes advantage of the fact that keyspace for secret - // key is (0, 2^x - 1), for some positive value of 'x' (see SIKE, 1.3.8). - // It means that all bytes in the secret key, but the last one, can take any - // value between <0x00,0xFF>. Similarly for the last byte, but generation - // needs to chop off some bits, to make sure generated value is an element of - // a key-space. - if _, err := io.ReadFull(rand, prv.Scalar); err != nil { - return err - } - - prv.Scalar[len(prv.Scalar)-1] &= (1 << (dp.SecretBitLen % 8)) - 1 - // Make sure scalar is SecretBitLen long. SIKE spec says that key - // space starts from 0, but I'm not comfortable with having low - // value scalars used for private keys. It is still secure as per - // table 5.1 in [SIKE]. - prv.Scalar[len(prv.Scalar)-1] |= 1 << ((dp.SecretBitLen % 8) - 1) - - return nil -} - -// Generates public key. -func (prv *PrivateKey) GeneratePublicKey(pub *PublicKey) { - isA := (prv.keyVariant & KeyVariantSidhA) == KeyVariantSidhA - - if (pub.keyVariant != prv.keyVariant) || (pub.params.ID != prv.params.ID) { - panic("sidh: incompatible public key") - } - - switch prv.params.ID { - case Fp434: - if isA { - p434.PublicKeyGenA(&pub.affine3Pt, prv.Scalar) - } else { - p434.PublicKeyGenB(&pub.affine3Pt, prv.Scalar) - } - case Fp503: - if isA { - p503.PublicKeyGenA(&pub.affine3Pt, prv.Scalar) - } else { - p503.PublicKeyGenB(&pub.affine3Pt, prv.Scalar) - } - case Fp751: - if isA { - p751.PublicKeyGenA(&pub.affine3Pt, prv.Scalar) - } else { - p751.PublicKeyGenB(&pub.affine3Pt, prv.Scalar) - } - default: - panic("Field not supported") - } -} - -// Computes a SIDH shared secret. Function requires that pub has different -// KeyVariant than prv. Length of returned output is 2*ceil(log_2 P)/8), -// where P is a prime defining finite field. -// -// Caller must make sure key SIDH key pair is not used more than once. -func (prv *PrivateKey) DeriveSecret(ss []byte, pub *PublicKey) { - isA := (prv.keyVariant & KeyVariantSidhA) == KeyVariantSidhA - - if (pub.keyVariant == prv.keyVariant) || (pub.params.ID != prv.params.ID) { - panic("sidh: public and private are incompatible") - } - - switch prv.params.ID { - case Fp434: - if isA { - p434.DeriveSecretA(ss, prv.Scalar, &pub.affine3Pt) - } else { - p434.DeriveSecretB(ss, prv.Scalar, &pub.affine3Pt) - } - case Fp503: - if isA { - p503.DeriveSecretA(ss, prv.Scalar, &pub.affine3Pt) - } else { - p503.DeriveSecretB(ss, prv.Scalar, &pub.affine3Pt) - } - case Fp751: - if isA { - p751.DeriveSecretA(ss, prv.Scalar, &pub.affine3Pt) - } else { - p751.DeriveSecretB(ss, prv.Scalar, &pub.affine3Pt) - } - default: - panic("Field not supported") - } -} diff --git a/dh/sidh/sidh_test.go b/dh/sidh/sidh_test.go deleted file mode 100644 index acf4c708..00000000 --- a/dh/sidh/sidh_test.go +++ /dev/null @@ -1,616 +0,0 @@ -package sidh - -import ( - "bytes" - "crypto/rand" - "encoding/hex" - "fmt" - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - . "github.com/quantumcoinproject/circl/internal/test" -) - -/* ------------------------------------------------------------------------- - Test data - -------------------------------------------------------------------------*/ - -type sidhVec struct { - id uint8 - name string - PkA string - PrA string - PkB string - PrB string -} - -var tdataSidh = map[uint8]sidhVec{ - Fp434: { - id: Fp434, - name: "P-434", - PrA: "3A727E04EA9B7E2A766A6F846489E7E7B915263BCEED308BB10FC900", - PrB: "E37BFE55B43B32448F375903D8D226EC94ADBFEA1D2B3536EB987001", - PkA: "9E668D1E6750ED4B91EE052C32839CA9DD2E56D52BC24DECC950AAAD" + - "24CEED3F9049C77FE80F0B9B01E7F8DAD7833EEC2286544D6380009C" + - "379CDD3E7517CEF5E20EB01F8231D52FC30DC61D2F63FB357F85DC63" + - "96E8A95DB9740BD3A972C8DB7901B31F074CD3E45345CA78F9008171" + - "30E688A29A7CF0073B5C00FF2C65FBE776918EF9BD8E75B29EF7FAB7" + - "91969B60B0C5B37A8992EDEF95FA7BAC40A95DAFE02E237301FEE9A7" + - "A43FD0B73477E8035DD12B73FAFEF18D39904DDE3653A754F36BE188" + - "8F6607C6A7951349A414352CF31A29F2C40302DB406C48018C905EB9" + - "DC46AFBF42A9187A9BB9E51B587622A2862DC7D5CC598BF38ED6320F" + - "B51D8697AD3D7A72ABCC32A393F0133DA8DF5E253D9E00B760B2DF34" + - "2FCE974DCFE946CFE4727783531882800F9E5DD594D6D5A6275EEFEF" + - "9713ED838F4A06BB34D7B8D46E0B385AAEA1C7963601", - PkB: "C9F73E4497AAA3FDF9EB688135866A8A83934BA10E273B8CC3808CF0" + - "C1F5FAB3E9BB295885881B73DEBC875670C0F51C4BB40DF5FEDE01B8" + - "AF32D1BF10508B8C17B2734EB93B2B7F5D84A4A0F2F816E9E2C32AC2" + - "53C0B6025B124D05A87A9E2A8567930F44BAA14219B941B6B400B4AE" + - "D1D796DA12A5A9F0B8F3F5EE9DD43F64CB24A3B1719DF278ADF56B5F" + - "3395187829DA2319DEABF6BBD6EDA244DE2B62CC5AC250C1009DD1CD" + - "4712B0B37406612AD002B5E51A62B51AC9C0374D143ABBBD58275FAF" + - "C4A5E959C54838C2D6D9FB43B7B2609061267B6A2E6C6D01D295C422" + - "3E0D3D7A4CDCFB28A7818A737935279751A6DD8290FD498D1F6AD5F4" + - "FFF6BDFA536713F509DCE8047252F1E7D0DD9FCC414C0070B5DCCE36" + - "65A21A032D7FBE749181032183AFAD240B7E671E87FBBEC3A8CA4C11" + - "AA7A9A23AC69AE2ACF54B664DECD27753D63508F1B02", - }, - Fp503: { - id: Fp503, - name: "P-503", - PrA: "D5B94224FA1AD1701EC277FDA83462D09E87181C2E583C5F09FD446A43F25103", - PrB: "FF0EF91753D71D83D912656856086007AD2CF3B2A979B2BD63E5313BFD276506", - PkA: "FFB9A589DBB3975A20373F1AD3B449880E1DA47916FCD7C751A019AAA8E95A03" + - "4ADA1AE8BFCF6FBF70F323713318E25315DE865B29C9124982594BF78CD61C09" + - "B98C22307DFD4FC0958C58EC0D144828006E510FA4072D721B48D1A3CFEA02F6" + - "062324FE1B68F457CF29BD4EB1FB68D0684EE69F53A3FAC327404341BB39365B" + - "5DE885034C9A6DD6798CB08126183C696D0302730D489584AC8D6BCADF3AB4DE" + - "FFC227D3B1701462DA15BF68EF2B07C44712DB5429B74063202F43DC0EA7919D" + - "B95025B2B03E5A3EBF57FF37E21838CE8F5531F491315E576A260DC2F515DDF2" + - "4DEDE54CA69737CE6442B4219CD472D9CCCF8AF12B5C5B23ACB9C22929924ABA" + - "52C820932C82435518B920AFC43F2041263AE98D29E58B73F33A5DD42AAC7533" + - "404B4AC2B83DD2C7BEA7676930B6007CC185C264672B75F5332C18429BBC7B0F" + - "2EA3F746995A298E7443FFB0C1B27DCA7D19635064AF3B87938960587F56B724" + - "C1EF1FF012B056D7301F8713295B7734563542D4259B8BEA260C", - PkB: "AA3303F79FCE4855DE125B239D10BEC3B7082E55B08C769A9765F1BF41A31210" + - "66382D6BF2857D85138CC17D69593B8FC7703D22C553FB077DFB3AC577CF1E55" + - "2AED6DC0368123E01DDD70059A47E31E06423D2F697A3DA5D621EB5FF2A52EE7" + - "CA7D3BD01B427AC14CB6099E03C6639A3BAC9B939297CEB10F276F93CF16A1EE" + - "1B8085DE3DA037C911491B145B034A47B42A996A61C2313FEF166FD3665B0AE8" + - "C201A268DA01AB52E4759ACCC1DD09685A17CDA5D44AF847931ABB221D62E241" + - "2329394445ADFD662C77472A9268F40AB540177C0E6F1D59026E595C46FBED2F" + - "703838C5F3D7A811B500237596C5E960AA1F2989C5F17DD60D8A752569DBF250" + - "E01C63C9790D014CE05A9D8683814A320E30185E478AF9ABD761DADDA8DE7E3E" + - "A53C224AC8313C176D14BD0F04AB09A9D0D0302ACBF768EB4DB03681EAE3BC10" + - "21CAA429A1490AE1D6E0CA9D6BC4BCD14B1CFE694226D03E8731E9E0B3760877" + - "7D56630B31298CC05B6FF6C1A08935312D8E95B8056AD7831A22", - }, - Fp751: { - id: Fp751, - name: "P-751", - // PrA - Alice's Private Key: 2*randint(0,2^371) - PrA: "B1937F2B009FD9F785C5AD899F5ED2FD064218C07A76798D1433336E093DF184CA0CAF6E7C92B320E89632A7765F0B", - // PrB - Bob's Private Key: 3*randint(0,3^238) - PrB: "54DB4380D4134E187F5793FA82A4F18B39CA2F8F1C145FFB040FC917E2F41542037FF227F3A4AAFB17A6983AA88B4403", - PkA: "2B53BB7C002A9D18B077D068C38353ADFD57A3CA0E431D92CCB8060D41A83A09" + - "C1500BEE63FB07DA1DBEDB4AF145F22C2D8152B07B7E124F06643C7AB5B1C48D" + - "581FC4C6FB7FC165F6E02F40B47D81400B84B6288DEAB38DE795B51486430974" + - "788377770D46B0ABC1F3F7C3647A0E38ACED475EA8EE990F3C5A7668452478C1" + - "975993E126B405E476AD6A10E9DD4E135ADA910BE41A8F93331268791F7B958A" + - "0888052D1CF7B9128058A258002F22AC48E2C296E3935033139D336FDEB33E9B" + - "8713663B1705B566AC4F4455FD0E710A5236C18011EA971DDD18633F9022C432" + - "B225EC401FCD4C233B8BF91BE5944D1A657516CE4B844D0BC6049478046B60B6" + - "BE163E41CCE743054806B13FAC0A1FA393C866D74A5A93A938209287324FAB46" + - "295F5B271C9D8CFEE17868599202D7AEF1A67EBE2FA2A27AD9E0991CEDEE270D" + - "1E7639425D94A0F0A2EFDE90B86D5D7F03F3CF97D30415CAA661F865ADB788E6" + - "3F79EE2FE8637D9DCAF3BCD5C42AE499688048BBB49F216B4714675FD87F7CCC" + - "37A0C2EA56BB53675584F7648BA052F963C35387ECC4DDED4F8076934FF32D5D" + - "77B5D3C57553757A4CB9588C4575D4CC4CA8280370041A6FF03007C31D0712E8" + - "327CC5BC9885F896904FAB4EE167745260D331C3E85E8A32FCCD23093F2C55A9" + - "EA8D7BECEFC3564D3C3D4CE585B62785773B2228742185C97D6F51CD3E3CF885" + - "5CF37F305734E97A86479580FDB9983DDCAE9D0F1B125523DB2FE58339240A58" + - "131D0EFD14A560A6F7EDE774F6C3C54F46DD0830", - PkB: "E93E4E2B0E7348C088FD91F8E3B17CC52B55C5E8933B6D00B3757E5347C5A0AE" + - "5F1A6051C32FB20A41013A244484C8D0501B6A3516A634581E08C907F29D651C" + - "BCC5B6CA6BAC4DCC980CD36155B60A2108134D3F78ED19ADA2B8B20184302FD7" + - "47E096B01ABB33CB76B115D673B00F76913281CF7A0B44FF5CF1A256B8138FE6" + - "77AB8D22FEBBCB10EB46E442D0AD96A126DD24E941280C7AB3F9FAC2832A149C" + - "AD93D221EDCB406303F5A1B38F43F310244D766239A7F4D89EED4C6FD272BC4F" + - "F7C4E34F3E5E77BFF59D6FE5C0D3937F574ABE81C2FC1FEDD98F43323F8F2D7C" + - "154DCEBF410FCF698A4E6506D6FD6E4A861395F75698C810A527E00ADC118C90" + - "9CDE7729B24C6E7DE9C92CFB592CB9A4BAC54DB468AA52724452CC7A7B40509B" + - "B7894ACCF2C7933537FD52DB312D7FBC4FDE01AC2350CD25ABDD5E6F3AEF87BA" + - "1BE23691544EB6A4F8FA9CF2BE70B9665EA479B44DC3C61D4651CDDB53656B6F" + - "3A2D139EC6BE8550B8A623CCA30EB5374F70C67A932712002006F3D73190384F" + - "6D3BEC9DB9F46E9B7AE2891E615752E74DC112579CF43283E8B6EBEF4C802BD6" + - "700A97B9739E8694B48D8CB9C8ABBC915A834FF1DBF2C823B3E156D0A415C558" + - "71B719BD9DD215F57C8D19A6B4F8CD93283D6EBD135347DAAF4F20C54D24017F" + - "5E6AF400AB6DC98AD2D5810E59360DF64503599FAF6FBAB720CC557DEEF0F528" + - "249DEB530C8F310465E0BE2B4041C24DAF783BC4EE71D27C760FA7CFD4A9A691" + - "70BCBA465CA242961671DF0C53A8112CCD708D58", - }, -} - -/* ------------------------------------------------------------------------- - Helpers - -------------------------------------------------------------------------*/ -// Converts string to private key. -func convToPrv(s string, v KeyVariant, id uint8) *PrivateKey { - key := NewPrivateKey(id, v) - hex, e := hex.DecodeString(s) - if e != nil { - panic("non-hex number provided") - } - e = key.Import(hex) - if e != nil { - panic("Can't import private key") - } - return key -} - -// Converts string to public key. -func convToPub(s string, v KeyVariant, id uint8) *PublicKey { - key := NewPublicKey(id, v) - hex, e := hex.DecodeString(s) - if e != nil { - panic("non-hex number provided") - } - e = key.Import(hex) - if e != nil { - panic("Can't import public key") - } - return key -} - -/* Unit tests */ - -func testKeygen(t *testing.T, v sidhVec) { - pubA := NewPublicKey(v.id, KeyVariantSidhA) - pubB := NewPublicKey(v.id, KeyVariantSidhB) - alicePrivate := convToPrv(v.PrA, KeyVariantSidhA, v.id) - bobPrivate := convToPrv(v.PrB, KeyVariantSidhB, v.id) - expPubA := convToPub(v.PkA, KeyVariantSidhA, v.id) - expPubB := convToPub(v.PkB, KeyVariantSidhB, v.id) - - alicePrivate.GeneratePublicKey(pubA) - bobPrivate.GeneratePublicKey(pubB) - - got := make([]byte, expPubA.Size()) - exp := make([]byte, expPubA.Size()) - pubA.Export(got) - expPubA.Export(exp) - if !bytes.Equal(got, exp) { - t.Fatalf("unexpected value of public key A\ngot [%X]\nexp [%X]", got, exp) - } - - got = make([]byte, expPubB.Size()) - exp = make([]byte, expPubB.Size()) - pubB.Export(got) - expPubB.Export(exp) - if !bytes.Equal(got, exp) { - t.Fatalf("unexpected value of public key B\ngot [%X]\nexp [%X]", got, exp) - } -} - -func testRoundtrip(t *testing.T, v sidhVec) { - var err error - pubA := NewPublicKey(v.id, KeyVariantSidhA) - pubB := NewPublicKey(v.id, KeyVariantSidhB) - prvA := NewPrivateKey(v.id, KeyVariantSidhA) - prvB := NewPrivateKey(v.id, KeyVariantSidhB) - s1 := make([]byte, common.Params(v.id).SharedSecretSize) - s2 := make([]byte, common.Params(v.id).SharedSecretSize) - - // Generate private keys - err = prvA.Generate(rand.Reader) - CheckNoErr(t, err, "key generation failed") - err = prvB.Generate(rand.Reader) - CheckNoErr(t, err, "key generation failed") - - // Generate public keys - prvA.GeneratePublicKey(pubA) - prvB.GeneratePublicKey(pubB) - - // Derive shared secret - prvB.DeriveSecret(s1, pubA) - prvA.DeriveSecret(s2, pubB) - - if !bytes.Equal(s1[:], s2[:]) { - t.Fatalf("Two shared keys do not match:\ns1 [%X]\ns2 [%X]", s1, s2) - } -} - -func testKeyAgreement(t *testing.T, v sidhVec) { - var err error - s1 := make([]byte, common.Params(v.id).SharedSecretSize) - s2 := make([]byte, common.Params(v.id).SharedSecretSize) - - // KeyPairs - alicePublic := convToPub(v.PkA, KeyVariantSidhA, v.id) - bobPublic := convToPub(v.PkB, KeyVariantSidhB, v.id) - alicePrivate := convToPrv(v.PrA, KeyVariantSidhA, v.id) - bobPrivate := convToPrv(v.PrB, KeyVariantSidhB, v.id) - - // Do actual test - bobPrivate.DeriveSecret(s1, alicePublic) - alicePrivate.DeriveSecret(s2, bobPublic) - - if !bytes.Equal(s1[:], s2[:]) { - t.Fatalf("two shared keys do not match\ngot [%X]\nexp [%X]", s1, s2) - } - - // Negative case - dec, err := hex.DecodeString(v.PkA) - CheckNoErr(t, err, "decoding failed") - - dec[0] = ^dec[0] - err = alicePublic.Import(dec) - CheckNoErr(t, err, "import failed") - bobPrivate.DeriveSecret(s1, alicePublic) - alicePrivate.DeriveSecret(s2, bobPublic) - if bytes.Equal(s1[:], s2[:]) { - t.Fatalf("DeriveSecret produces wrong results. The two shared keys match, but they shouldn't") - } -} - -func testImportExport(t *testing.T, v sidhVec) { - var err error - a := NewPublicKey(v.id, KeyVariantSidhA) - b := NewPublicKey(v.id, KeyVariantSidhB) - - // Import keys - aHex, err := hex.DecodeString(v.PkA) - CheckNoErr(t, err, "invalid hex-number provided") - - err = a.Import(aHex) - CheckNoErr(t, err, "import failed") - - bHex, err := hex.DecodeString(v.PkB) - CheckNoErr(t, err, "invalid hex-number provided") - - err = b.Import(bHex) - CheckNoErr(t, err, "import failed") - - aBytes := make([]byte, a.Size()) - bBytes := make([]byte, b.Size()) - a.Export(aBytes) - b.Export(bBytes) - - // Export and check if same - if !bytes.Equal(bBytes, bHex) || !bytes.Equal(aBytes, aHex) { - t.Fatalf("export/import failed") - } - - if (len(bBytes) != b.Size()) || (len(aBytes) != a.Size()) { - t.Fatalf("wrong size of exported keys") - } - - // Ensure that public key is unchanged after it is exported - aBytes2 := make([]byte, a.Size()) - bBytes2 := make([]byte, b.Size()) - a.Export(aBytes2) - b.Export(bBytes2) - if !bytes.Equal(aBytes, aBytes2) || !bytes.Equal(bBytes, bBytes2) { - t.Fatalf("Second export doesn't match first export") - } -} - -func testPrivateKeyBelowMax(t *testing.T, vec sidhVec) { - for variant, keySz := range map[KeyVariant]*common.DomainParams{ - KeyVariantSidhA: &common.Params(vec.id).A, - KeyVariantSidhB: &common.Params(vec.id).B, - } { - func(v KeyVariant, dp *common.DomainParams) { - blen := int(dp.SecretByteLen) - prv := NewPrivateKey(vec.id, v) - secretBytes := make([]byte, prv.Size()) - - // Calculate either (2^e2 - 1) or (2^s - 1); where s=ceil(log_2(3^e3))) - maxSecretVal := big.NewInt(int64(dp.SecretBitLen)) - maxSecretVal.Exp(big.NewInt(int64(2)), maxSecretVal, nil) - maxSecretVal.Sub(maxSecretVal, big.NewInt(1)) - - // Do same test 1000 times - for i := 0; i < 1000; i++ { - err := prv.Generate(rand.Reader) - CheckNoErr(t, err, "Private key generation") - - // Convert to big-endian, as that's what expected by (*Int)SetBytes() - prv.Export(secretBytes) - for i := 0; i < blen/2; i++ { - tmp := secretBytes[i] ^ secretBytes[blen-i-1] - secretBytes[i] = tmp ^ secretBytes[i] - secretBytes[blen-i-1] = tmp ^ secretBytes[blen-i-1] - } - prvBig := new(big.Int).SetBytes(secretBytes) - // Check if generated key is bigger then acceptable - if prvBig.Cmp(maxSecretVal) == 1 { - t.Error("Generated private key is wrong") - } - } - }(variant, keySz) - } -} - -func TestKeyAgreementP751_AliceEvenNumber(t *testing.T) { - // even alice - v := tdataSidh[Fp751] - v.PkA = "FDED78E9F490CB518BD6357E18FEEB63FFEFEBE907338B3ABCA74A7E590DBF79" + - "0C732AB9E3778244608CD563064BDF6AAEF511CEAF07C702309ADAA7EBEBC6B3" + - "D7B00F5C02FB2FEDA763B2D695FD27F93F45D3AC58C2F0524A942D6DE407B651" + - "1854A1D974F11A8686CF8AD675A081F4B668F3C6617029AA33FD597C8910AB37" + - "F71DBE004A3FF8442C4B65DE51201DFAE6F9DC20FDE5B998D19C23589437229D" + - "724B4378602321F247276E7B4E441383C9BE6D277A127362D9C9FB68A41C5F5B" + - "9D2BA63FA790D62315DECF5049F0476A43D30BC1E8A36047C8EE0DA9E0A3937E" + - "BDF52A91BC53266A82CBF2CEAB227CB6D5075B486679CA7701F6F35C53499B45" + - "A451CE37C57B9BB1276142F495B83D987BD4B62E78E3084DCF3EB906D19DFA8F" + - "819DFC7FDF104C1A01CCF8D933B91EBD72CDE83A502B1FB0A5DF782BC7085766" + - "AE795123903A2D30F0F79073D27CF71BA4C9D3CA86512842AA8B5AEB729C78B1" + - "E15392E20A6043C05F88F6F412C3C9FE14F8FAAE8B8482514822162F93E81615" + - "BDD77363F872D0506FFDC1809C165A5C8A19F8EA0254D73E08202A6FF3AF43CF" + - "A7EC9B137AE003A19440DCE2EF3CFC99080F75E683AF6D0E25DF55C60B2A8013" + - "FA3D59828D31C2360DF83E202FB48AFAA65AF7279137E827B80E761FA49B842A" + - "A70FD4E77B284A14B8E28C8B11B389E1160DD9877C8D5A5A1471E605F1848369" + - "3F7578B3733DDEE117227E35B1765FEBB765B340A084E8D99176C0837099C864" + - "C71C864842D3E9B58CB870AD45F3B6BE476FEB6D" - v.PrA = "C09957CC83045FB4C3726384D784476ACB6FFD92E5B15B3C2D451BA063F1BD4CE" + - "D8FBCF682A98DD0954D37BCAF730F" - testKeyAgreement(t, v) -} - -/* ------------------------------------------------------------------------- - Wrappers for 'testing' SIDH - -------------------------------------------------------------------------*/ - -func testSidhVec(t *testing.T, m *map[uint8]sidhVec, f func(t *testing.T, v sidhVec)) { - for i := range *m { - v := (*m)[i] - t.Run(v.name, func(t *testing.T) { f(t, v) }) - } -} -func TestKeygen(t *testing.T) { testSidhVec(t, &tdataSidh, testKeygen) } -func TestRoundtrip(t *testing.T) { testSidhVec(t, &tdataSidh, testRoundtrip) } -func TestImportExport(t *testing.T) { testSidhVec(t, &tdataSidh, testImportExport) } -func TestKeyAgreement(t *testing.T) { testSidhVec(t, &tdataSidh, testKeyAgreement) } -func TestPrivateKeyBelowMax(t *testing.T) { testSidhVec(t, &tdataSidh, testPrivateKeyBelowMax) } - -/* ------------------------------------------------------------------------- - Benchmarking - -------------------------------------------------------------------------*/ - -func BenchmarkSidhKeyAgreementP751(b *testing.B) { - // KeyPairs - alicePublic := convToPub(tdataSidh[Fp751].PkA, KeyVariantSidhA, Fp751) - bobPublic := convToPub(tdataSidh[Fp751].PkB, KeyVariantSidhB, Fp751) - alicePrivate := convToPrv(tdataSidh[Fp751].PrA, KeyVariantSidhA, Fp751) - bobPrivate := convToPrv(tdataSidh[Fp751].PrB, KeyVariantSidhB, Fp751) - var ss [2 * 94]byte - - for i := 0; i < b.N; i++ { - // Derive shared secret - bobPrivate.DeriveSecret(ss[:], alicePublic) - alicePrivate.DeriveSecret(ss[:], bobPublic) - } -} - -func BenchmarkSidhKeyAgreementP503(b *testing.B) { - // KeyPairs - alicePublic := convToPub(tdataSidh[Fp503].PkA, KeyVariantSidhA, Fp503) - bobPublic := convToPub(tdataSidh[Fp503].PkB, KeyVariantSidhB, Fp503) - alicePrivate := convToPrv(tdataSidh[Fp503].PrA, KeyVariantSidhA, Fp503) - bobPrivate := convToPrv(tdataSidh[Fp503].PrB, KeyVariantSidhB, Fp503) - var ss [2 * 63]byte - - for i := 0; i < b.N; i++ { - // Derive shared secret - bobPrivate.DeriveSecret(ss[:], alicePublic) - alicePrivate.DeriveSecret(ss[:], bobPublic) - } -} - -func BenchmarkSidhKeyAgreementP434(b *testing.B) { - // KeyPairs - alicePublic := convToPub(tdataSidh[Fp434].PkA, KeyVariantSidhA, Fp434) - bobPublic := convToPub(tdataSidh[Fp434].PkB, KeyVariantSidhB, Fp434) - alicePrivate := convToPrv(tdataSidh[Fp434].PrA, KeyVariantSidhA, Fp434) - bobPrivate := convToPrv(tdataSidh[Fp434].PrB, KeyVariantSidhB, Fp434) - var ss [2 * 63]byte - - for i := 0; i < b.N; i++ { - // Derive shared secret - bobPrivate.DeriveSecret(ss[:], alicePublic) - alicePrivate.DeriveSecret(ss[:], bobPublic) - } -} - -func BenchmarkAliceKeyGenPrvP751(b *testing.B) { - prv := NewPrivateKey(Fp751, KeyVariantSidhA) - for n := 0; n < b.N; n++ { - _ = prv.Generate(rand.Reader) - } -} - -func BenchmarkAliceKeyGenPrvP503(b *testing.B) { - prv := NewPrivateKey(Fp503, KeyVariantSidhA) - for n := 0; n < b.N; n++ { - _ = prv.Generate(rand.Reader) - } -} - -func BenchmarkAliceKeyGenPrvP434(b *testing.B) { - prv := NewPrivateKey(Fp434, KeyVariantSidhA) - for n := 0; n < b.N; n++ { - _ = prv.Generate(rand.Reader) - } -} - -func BenchmarkBobKeyGenPrvP751(b *testing.B) { - prv := NewPrivateKey(Fp751, KeyVariantSidhB) - for n := 0; n < b.N; n++ { - _ = prv.Generate(rand.Reader) - } -} - -func BenchmarkBobKeyGenPrvP503(b *testing.B) { - prv := NewPrivateKey(Fp503, KeyVariantSidhB) - for n := 0; n < b.N; n++ { - _ = prv.Generate(rand.Reader) - } -} - -func BenchmarkBobKeyGenPrvP434(b *testing.B) { - prv := NewPrivateKey(Fp434, KeyVariantSidhB) - for n := 0; n < b.N; n++ { - _ = prv.Generate(rand.Reader) - } -} - -func BenchmarkAliceKeyGenPubP751(b *testing.B) { - prv := NewPrivateKey(Fp751, KeyVariantSidhA) - pub := NewPublicKey(Fp751, KeyVariantSidhA) - _ = prv.Generate(rand.Reader) - for n := 0; n < b.N; n++ { - prv.GeneratePublicKey(pub) - } -} - -func BenchmarkAliceKeyGenPubP503(b *testing.B) { - prv := NewPrivateKey(Fp503, KeyVariantSidhA) - pub := NewPublicKey(Fp503, KeyVariantSidhA) - _ = prv.Generate(rand.Reader) - for n := 0; n < b.N; n++ { - prv.GeneratePublicKey(pub) - } -} - -func BenchmarkAliceKeyGenPubP434(b *testing.B) { - prv := NewPrivateKey(Fp434, KeyVariantSidhA) - pub := NewPublicKey(Fp434, KeyVariantSidhA) - _ = prv.Generate(rand.Reader) - for n := 0; n < b.N; n++ { - prv.GeneratePublicKey(pub) - } -} - -func BenchmarkBobKeyGenPubP751(b *testing.B) { - prv := NewPrivateKey(Fp751, KeyVariantSidhB) - pub := NewPublicKey(Fp751, KeyVariantSidhB) - _ = prv.Generate(rand.Reader) - for n := 0; n < b.N; n++ { - prv.GeneratePublicKey(pub) - } -} - -func BenchmarkBobKeyGenPubP503(b *testing.B) { - prv := NewPrivateKey(Fp503, KeyVariantSidhB) - pub := NewPublicKey(Fp503, KeyVariantSidhB) - _ = prv.Generate(rand.Reader) - for n := 0; n < b.N; n++ { - prv.GeneratePublicKey(pub) - } -} - -func BenchmarkBobKeyGenPubP434(b *testing.B) { - prv := NewPrivateKey(Fp434, KeyVariantSidhB) - pub := NewPublicKey(Fp434, KeyVariantSidhB) - _ = prv.Generate(rand.Reader) - for n := 0; n < b.N; n++ { - prv.GeneratePublicKey(pub) - } -} - -func BenchmarkSharedSecretAliceP751(b *testing.B) { - aPr := convToPrv(tdataSidh[Fp751].PrA, KeyVariantSidhA, Fp751) - bPk := convToPub(tdataSidh[Fp751].PkB, KeyVariantSidhB, Fp751) - var ss [2 * 94]byte - for n := 0; n < b.N; n++ { - aPr.DeriveSecret(ss[:], bPk) - } -} - -func BenchmarkSharedSecretAliceP503(b *testing.B) { - aPr := convToPrv(tdataSidh[Fp503].PrA, KeyVariantSidhA, Fp503) - bPk := convToPub(tdataSidh[Fp503].PkB, KeyVariantSidhB, Fp503) - var ss [2 * 63]byte - for n := 0; n < b.N; n++ { - aPr.DeriveSecret(ss[:], bPk) - } -} - -func BenchmarkSharedSecretAliceP434(b *testing.B) { - aPr := convToPrv(tdataSidh[Fp434].PrA, KeyVariantSidhA, Fp434) - bPk := convToPub(tdataSidh[Fp434].PkB, KeyVariantSidhB, Fp434) - var ss [2 * 63]byte - for n := 0; n < b.N; n++ { - aPr.DeriveSecret(ss[:], bPk) - } -} - -func BenchmarkSharedSecretBobP751(b *testing.B) { - // m_B = 3*randint(0,3^238) - aPk := convToPub(tdataSidh[Fp751].PkA, KeyVariantSidhA, Fp751) - bPr := convToPrv(tdataSidh[Fp751].PrB, KeyVariantSidhB, Fp751) - var ss [2 * 94]byte - for n := 0; n < b.N; n++ { - bPr.DeriveSecret(ss[:], aPk) - } -} - -func BenchmarkSharedSecretBobP503(b *testing.B) { - // m_B = 3*randint(0,3^238) - aPk := convToPub(tdataSidh[Fp503].PkA, KeyVariantSidhA, Fp503) - bPr := convToPrv(tdataSidh[Fp503].PrB, KeyVariantSidhB, Fp503) - var ss [2 * 63]byte - for n := 0; n < b.N; n++ { - bPr.DeriveSecret(ss[:], aPk) - } -} - -func BenchmarkSharedSecretBobP434(b *testing.B) { - // m_B = 3*randint(0,3^238) - aPk := convToPub(tdataSidh[Fp434].PkA, KeyVariantSidhA, Fp434) - bPr := convToPrv(tdataSidh[Fp434].PrB, KeyVariantSidhB, Fp434) - var ss [2 * 63]byte - for n := 0; n < b.N; n++ { - bPr.DeriveSecret(ss[:], aPk) - } -} - -// Examples - -func ExamplePrivateKey() { - // import "github.com/quantumcoinproject/circl/dh/sidh" - - // Alice's key pair - prvA := NewPrivateKey(Fp503, KeyVariantSidhA) - pubA := NewPublicKey(Fp503, KeyVariantSidhA) - // Bob's key pair - prvB := NewPrivateKey(Fp503, KeyVariantSidhB) - pubB := NewPublicKey(Fp503, KeyVariantSidhB) - // Generate keypair for Alice - err := prvA.Generate(rand.Reader) - if err != nil { - fmt.Print(err) - } - prvA.GeneratePublicKey(pubA) - // Generate keypair for Bob - err = prvB.Generate(rand.Reader) - if err != nil { - fmt.Print(err) - } - prvB.GeneratePublicKey(pubB) - // Buffers storing shared secret - ssA := make([]byte, prvA.SharedSecretSize()) - ssB := make([]byte, prvA.SharedSecretSize()) - // Alice calculates shared secret with hers private - // key and Bob's public key - prvA.DeriveSecret(ssA[:], pubB) - // Bob calculates shared secret with hers private - // key and Alice's public key - prvB.DeriveSecret(ssB[:], pubA) - // Check if ssA == ssB - fmt.Printf("%t\n", bytes.Equal(ssA, ssB)) - // Output: - // true -} diff --git a/dh/sidh/sike.go b/dh/sidh/sike.go deleted file mode 100644 index e9ac7ead..00000000 --- a/dh/sidh/sike.go +++ /dev/null @@ -1,284 +0,0 @@ -package sidh - -import ( - "crypto/subtle" - "errors" - "io" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - "github.com/quantumcoinproject/circl/internal/sha3" -) - -// SIKE KEM interface. -// -// Deprecated: not cryptographically secure. -type KEM struct { - allocated bool - rng io.Reader - msg []byte - secretBytes []byte - params *common.SidhParams - shake sha3.State -} - -// NewSike434 instantiates SIKE/p434 KEM. -// -// Deprecated: not cryptographically secure. -func NewSike434(rng io.Reader) *KEM { - var c KEM - c.Allocate(Fp434, rng) - return &c -} - -// NewSike503 instantiates SIKE/p503 KEM. -// -// Deprecated: not cryptographically secure. -func NewSike503(rng io.Reader) *KEM { - var c KEM - c.Allocate(Fp503, rng) - return &c -} - -// NewSike751 instantiates SIKE/p751 KEM. -// -// Deprecated: not cryptographically secure. -func NewSike751(rng io.Reader) *KEM { - var c KEM - c.Allocate(Fp751, rng) - return &c -} - -// Allocate allocates KEM object for multiple SIKE operations. The rng -// must be cryptographically secure PRNG. -func (c *KEM) Allocate(id uint8, rng io.Reader) { - c.rng = rng - c.params = common.Params(id) - c.msg = make([]byte, c.params.MsgLen) - c.secretBytes = make([]byte, c.params.A.SecretByteLen) - c.shake = sha3.NewShake256() - c.allocated = true -} - -// Encapsulate receives the public key and generates SIKE ciphertext and shared secret. -// The generated ciphertext is used for authentication. -// Error is returned in case PRNG fails. Function panics in case wrongly formatted -// input was provided. -func (c *KEM) Encapsulate(ciphertext, secret []byte, pub *PublicKey) error { - if !c.allocated { - panic("KEM unallocated") - } - - if KeyVariantSike != pub.keyVariant { - panic("Wrong type of public key") - } - - if len(secret) < c.SharedSecretSize() { - panic("shared secret buffer to small") - } - - if len(ciphertext) < c.CiphertextSize() { - panic("ciphertext buffer to small") - } - - // Generate ephemeral value - _, err := io.ReadFull(c.rng, c.msg[:]) - if err != nil { - return err - } - - var buf [3 * common.MaxSharedSecretBsz]byte - skA := PrivateKey{ - key: key{ - params: c.params, - keyVariant: KeyVariantSidhA, - }, - Scalar: c.secretBytes, - } - pkA := NewPublicKey(c.params.ID, KeyVariantSidhA) - - pub.Export(buf[:]) - c.shake.Reset() - _, _ = c.shake.Write(c.msg) - _, _ = c.shake.Write(buf[:3*c.params.SharedSecretSize]) - _, _ = c.shake.Read(skA.Scalar) - - // Ensure bitlength is not bigger then to 2^e2-1 - skA.Scalar[len(skA.Scalar)-1] &= (1 << (c.params.A.SecretBitLen % 8)) - 1 - skA.GeneratePublicKey(pkA) - c.generateCiphertext(ciphertext, &skA, pkA, pub, c.msg[:]) - - // K = H(msg||(c0||c1)) - c.shake.Reset() - _, _ = c.shake.Write(c.msg) - _, _ = c.shake.Write(ciphertext) - _, _ = c.shake.Read(secret[:c.SharedSecretSize()]) - return nil -} - -// Decapsulate given the keypair and ciphertext as inputs, Decapsulate outputs a shared -// secret if plaintext verifies correctly, otherwise function outputs random value. -// Decapsulation may panic in case input is wrongly formatted, in particular, size of -// the 'ciphertext' must be exactly equal to c.CiphertextSize(). -func (c *KEM) Decapsulate(secret []byte, prv *PrivateKey, pub *PublicKey, ciphertext []byte) error { - if !c.allocated { - panic("KEM unallocated") - } - - if KeyVariantSike != pub.keyVariant { - panic("Wrong type of public key") - } - - if pub.keyVariant != prv.keyVariant { - panic("Public and private key are of different type") - } - - if len(secret) < c.SharedSecretSize() { - panic("shared secret buffer to small") - } - - if len(ciphertext) != c.CiphertextSize() { - panic("ciphertext buffer to small") - } - - var m [common.MaxMsgBsz]byte - var r [common.MaxSidhPrivateKeyBsz]byte - var pkBytes [3 * common.MaxSharedSecretBsz]byte - skA := PrivateKey{ - key: key{ - params: c.params, - keyVariant: KeyVariantSidhA, - }, - Scalar: c.secretBytes, - } - pkA := NewPublicKey(c.params.ID, KeyVariantSidhA) - c1Len, err := c.decrypt(m[:], prv, ciphertext) - if err != nil { - return err - } - - // r' = G(m'||pub) - pub.Export(pkBytes[:]) - c.shake.Reset() - _, _ = c.shake.Write(m[:c1Len]) - _, _ = c.shake.Write(pkBytes[:3*c.params.SharedSecretSize]) - _, _ = c.shake.Read(r[:c.params.A.SecretByteLen]) - // Ensure bitlength is not bigger than 2^e2-1 - r[c.params.A.SecretByteLen-1] &= (1 << (c.params.A.SecretBitLen % 8)) - 1 - - err = skA.Import(r[:c.params.A.SecretByteLen]) - if err != nil { - return err - } - skA.GeneratePublicKey(pkA) - pkA.Export(pkBytes[:]) - - // S is chosen at random when generating a key and unknown to other party. It is - // important that S is unpredictable to the other party. Without this check, would - // be possible to recover a secret, by providing series of invalid ciphertexts. - // - // See more details in "On the security of supersingular isogeny cryptosystems" - // (S. Galbraith, et al., 2016, ePrint #859). - mask := subtle.ConstantTimeCompare(pkBytes[:c.params.PublicKeySize], ciphertext[:pub.params.PublicKeySize]) - common.Cpick(mask, m[:c1Len], m[:c1Len], prv.S) - c.shake.Reset() - _, _ = c.shake.Write(m[:c1Len]) - _, _ = c.shake.Write(ciphertext) - _, _ = c.shake.Read(secret[:c.SharedSecretSize()]) - return nil -} - -// Resets internal state of KEM. Function should be used -// after Allocate and between subsequent calls to Encapsulate -// and/or Decapsulate. -func (c *KEM) Reset() { - for i := range c.msg { - c.msg[i] = 0 - } - - for i := range c.secretBytes { - c.secretBytes[i] = 0 - } -} - -// Returns size of resulting ciphertext. -func (c *KEM) CiphertextSize() int { - return c.params.CiphertextSize -} - -// Returns size of resulting shared secret. -func (c *KEM) SharedSecretSize() int { - return c.params.KemSize -} - -// PublicKeySize returns size of the public key in bytes. -func (c *KEM) PublicKeySize() int { - return c.params.PublicKeySize -} - -// Size returns size of the private key in bytes. -func (c *KEM) PrivateKeySize() int { - return int(c.params.B.SecretByteLen) + c.params.MsgLen -} - -func (c *KEM) generateCiphertext(ctext []byte, skA *PrivateKey, pkA, pkB *PublicKey, ptext []byte) { - var n [common.MaxMsgBsz]byte - var j [common.MaxSharedSecretBsz]byte - ptextLen := skA.params.MsgLen - - skA.DeriveSecret(j[:], pkB) - c.shake.Reset() - _, _ = c.shake.Write(j[:skA.params.SharedSecretSize]) - _, _ = c.shake.Read(n[:ptextLen]) - for i := range ptext { - n[i] ^= ptext[i] - } - - pkA.Export(ctext) - copy(ctext[pkA.Size():], n[:ptextLen]) -} - -// encrypt uses SIKE public key to encrypt plaintext. Requires cryptographically secure -// PRNG. Returns ciphertext in case encryption succeeds. Returns error in case PRNG fails -// or wrongly formated input was provided. -func (c *KEM) encrypt(ctext []byte, rng io.Reader, pub *PublicKey, ptext []byte) error { - ptextLen := len(ptext) - // c1 must be security level + 64 bits (see [SIKE] 1.4 and 4.3.3) - if ptextLen != pub.params.KemSize { - return errors.New("unsupported message length") - } - - skA := NewPrivateKey(pub.params.ID, KeyVariantSidhA) - pkA := NewPublicKey(pub.params.ID, KeyVariantSidhA) - err := skA.Generate(rng) - if err != nil { - return err - } - - skA.GeneratePublicKey(pkA) - c.generateCiphertext(ctext, skA, pkA, pub, ptext) - return nil -} - -// decrypt uses SIKE private key to decrypt ciphertext. Returns plaintext in case -// decryption succeeds or error in case unexpected input was provided. -// Constant time. -func (c *KEM) decrypt(n []byte, prv *PrivateKey, ctext []byte) (int, error) { - var c1Len int - var j [common.MaxSharedSecretBsz]byte - pkLen := prv.params.PublicKeySize - - // ctext is a concatenation of (ciphertext = pubkey_A || c1) - // it must be security level + 64 bits (see [SIKE] 1.4 and 4.3.3) - // Lengths has been already checked by Decapsulate() - c1Len = len(ctext) - pkLen - c0 := NewPublicKey(prv.params.ID, KeyVariantSidhA) - err := c0.Import(ctext[:pkLen]) - prv.DeriveSecret(j[:], c0) - c.shake.Reset() - _, _ = c.shake.Write(j[:prv.params.SharedSecretSize]) - _, _ = c.shake.Read(n[:c1Len]) - for i := range n[:c1Len] { - n[i] ^= ctext[pkLen+i] - } - return c1Len, err -} diff --git a/dh/sidh/sike_test.go b/dh/sidh/sike_test.go deleted file mode 100644 index c5171606..00000000 --- a/dh/sidh/sike_test.go +++ /dev/null @@ -1,585 +0,0 @@ -package sidh - -import ( - "bufio" - "bytes" - "crypto/rand" - "encoding/hex" - "fmt" - "io" - "os" - "strings" - "testing" - - "github.com/quantumcoinproject/circl/dh/sidh/internal/common" - . "github.com/quantumcoinproject/circl/internal/test" -) - -type sikeVec struct { - id uint8 - name string - kem *KEM - KatFile string - PkB string - PrB string -} - -var tdataSike = map[uint8]sikeVec{ - Fp434: { - Fp434, "P-434", NewSike434(rand.Reader), - "testdata/PQCkemKAT_374.rsp", - "1BD0A2E81307B6F96461317DDF535ACC0E59C742627BAE60D27605E10FAF722D" + - "22A73E184CB572A12E79DCD58C6B54FB01442114CBE9010B6CAEC25D04C16C5E" + - "42540C1524C545B8C67614ED4183C9FA5BD0BE45A7F89FBC770EE8E7E5E391C7" + - "EE6F35F74C29E6D9E35B1663DA01E48E9DEB2347512D366FDE505161677055E3" + - "EF23054D276E817E2C57025DA1C10D2461F68617F2D11256EEE4E2D7DBDF6C8E" + - "34F3A0FD00C625428CB41857002159DAB94267ABE42D630C6AAA91AF837C7A67" + - "40754EA6634C45454C51B0BB4D44C3CCCCE4B32C00901CF69C008D013348379B" + - "2F9837F428A01B6173584691F2A6F3A3C4CF487D20D261B36C8CDB1BC158E2A5" + - "162A9DA4F7A97AA0879B9897E2B6891B672201F9AEFBF799C27B2587120AC586" + - "A511360926FB7DA8EBF5CB5272F396AE06608422BE9792E2CE9BEF21BF55B7EF" + - "F8DC7EC8C99910D3F800", - "4B622DE1350119C45A9F2E2EF3DC5DF56A27FCDFCDDAF58CD69B903752D68C20" + - "0934E160B234E49EDE247601", - }, - Fp503: { - Fp503, "P-503", NewSike503(rand.Reader), - "testdata/PQCkemKAT_434.rsp", - "4032A90B6C036B7D2A83878AD116641AD319E420235A505F3F5C3DEC27C87A6C" + - "BA0792201D6E7B196C582D43CAF86CB2C7DEFA6598B543C946CDDF62EF9A328C" + - "8719B66BA5052231DAE13AF7D9CDEBB4ED327773C7AE0818F41AF1D28CD78B16" + - "C996232528235C8392B8FCFD925CB311B2A801B0402A90E527261EA32F2BEF67" + - "7C544908D5509B8AB7D7BF20456727AD358AD585306A0B28F6B2AA583CE8A3E0" + - "BB92D8CD55347D39D4E3C30D3D0F96EABB721A6968CDD143FE9227643CF697FB" + - "2DF0B71322B5EA1505D0DDBF70A2FD1193011F3BC18AA1E127C614B76969DCDA" + - "45A2072B519A1074FDA49F5C828450C6A007BF8D7CDDD5D2FC112119C679CA3A" + - "B16C6960B25F6C681A7DCED0F0E3901740D3DBF3A33011EB7DA460E8ADA80EE3" + - "45B2B71420950A9A803E4F11330EB91CCABB1EEE4D875A109D7724ABD201272C" + - "0B4981BDCDFA70F3430A89D2A88EEED474CF0CFAC65CE883F44B4722FA280C6F" + - "A9C4724D414B35AF69D6ECB21BFDA23BFF6B66C22C2451DC8E1C", - "7BF6938C975658AEB8B4D37CFFBDE25D97E561F36C219A0E8FE645816DBBC7ED7B57" + - "7700AE8DC3138E97A0C3F6F002065C92A0B1B8180208", - }, - Fp751: { - Fp751, "P-751", NewSike751(rand.Reader), - "testdata/PQCkemKAT_644.rsp", - "E1A758EC0D418BFE86D8077B5BB169133C06C1F2A067D8B202D9D058FFC51F63" + - "FD26155A6577C74BA7F1A27E7BA51982517B923615DEB00BE408920A07831DF5" + - "978CFDDD0BF690A264353A4A16B666F90586D7F89A193CE09375D389C1379A7A" + - "528581C3ACB002CD2DC4F0FD672568FF9050BA8365C7FEFC5E6ED089B921DE68" + - "04091A0744DE3EB14D426A3F7DA215C50312617C1C2697243980D06056F2CCE8" + - "8AE7AE73C7343C0B7104C9F2870A94FED744CF6E94630514B6CEAB0E64733BB6" + - "FA67B931E5D8206010475CBE8BC587248D65D89D8CD9C8BBFA93E8B5F9EB9130" + - "773DED665D52ABBD91C4C8C255F73C0FC82501AE33330E9F308DE7177CBF83E4" + - "E26E334D7CB09019E638147FC58ED372AF660F14C194BC80E9666325C98E0F80" + - "877271D4A6BF514F603703D8A697874CD50A34D92F5AAEA84633CCF96801BD51" + - "7BF425DEE4A32AAF06684052473EA14643C3D535440FB2240A988D09F297C5A3" + - "88CB3DE60ED943F124034B90EFF611221F80F78EC124956338A105F6636B063D" + - "7E48BFBD5D614310FB97D86F122E4AE6F9DDF4977A93ED7D0CE2A94E346A1A03" + - "D3219CF21907B85A5BCDC713F93A4406A22E03B1655A66E1F6741A2F953E6FE0" + - "868B2614BABEF1943BBBCB1B66D3E7017E533EA84F291240B56AB33EF1DC3F3D" + - "E99DBF9E8BE51A0076E462BCDD825EA96D7F63C99177C305C257B31461F4C23D" + - "43115F0220409E8880BBB2468586D03461E807BE824B693874911B2B52AF06FD" + - "BDC47F5A0159729641A7C950AB9E03F2DC045135", - "0001020304050607080900010203040506070809000102030405060708090102" + - "8626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB8F" + - "AB0A7289852106E40538D3575C500201", - }, -} - -// Encrypt, Decrypt, check if input/output plaintext is the same. -func testPKERoundTrip(t *testing.T, v sikeVec) { - // Message to be encrypted - var pt [common.MaxMsgBsz]byte - params := common.Params(v.id) - ct := make([]byte, v.kem.CiphertextSize()) - msg := make([]byte, params.MsgLen) - for i := range msg { - msg[i] = byte(i) - } - - // Import keys - pkB := NewPublicKey(params.ID, KeyVariantSike) - skB := NewPrivateKey(params.ID, KeyVariantSike) - pkHex, err := hex.DecodeString(v.PkB) - CheckNoErr(t, err, "Test vector wrong") - skHex, err := hex.DecodeString(v.PrB) - CheckNoErr(t, err, "Test vector wrong") - err = pkB.Import(pkHex) - CheckNoErr(t, err, "Public key import failed") - err = skB.Import(skHex) - CheckNoErr(t, err, "Private key import failed") - err = v.kem.encrypt(ct, rand.Reader, pkB, msg[:]) - CheckNoErr(t, err, "PKE roundtrip - encryption failed") - ptLen, err := v.kem.decrypt(pt[:], skB, ct) - CheckNoErr(t, err, "PKE roundtrip - description failed") - - if !bytes.Equal(pt[:ptLen], msg[:]) { - t.Errorf("Decryption failed \n got : %X\n exp : %X", pt[:ptLen], msg) - } -} - -// Generate key and check if can encrypt. -func testPKEKeyGeneration(t *testing.T, v sikeVec) { - var err error - params := common.Params(v.id) - var pt [common.MaxMsgBsz]byte - msg := make([]byte, params.MsgLen) - ct := make([]byte, v.kem.CiphertextSize()) - // static buffer to ensure no overrides - pk := NewPublicKey(v.id, KeyVariantSike) - sk := NewPrivateKey(v.id, KeyVariantSike) - - for i := range msg { - msg[i] = byte(i) - } - - err = sk.Generate(rand.Reader) - CheckNoErr(t, err, "PKE key generation") - sk.GeneratePublicKey(pk) - - err = v.kem.encrypt(ct, rand.Reader, pk, msg[:]) - CheckNoErr(t, err, "PKE encryption") - ptLen, err := v.kem.decrypt(pt[:], sk, ct) - CheckNoErr(t, err, "PKE key decryption") - - if !bytes.Equal(pt[:ptLen], msg[:]) { - t.Fatalf("Decryption failed \n got : %X\n exp : %X", pt, msg) - } -} - -func testNegativePKE(t *testing.T, v sikeVec) { - var err error - var msg [common.MaxMsgBsz]byte - ct := make([]byte, v.kem.CiphertextSize()) - pk := NewPublicKey(v.id, KeyVariantSike) - sk := NewPrivateKey(v.id, KeyVariantSike) - - // Generate key - err = sk.Generate(rand.Reader) - CheckNoErr(t, err, "key generation") - sk.GeneratePublicKey(pk) - - // bytelen(msg) - 1 - err = v.kem.encrypt(ct, rand.Reader, pk, msg[:v.kem.params.KemSize+8-1]) - CheckIsErr(t, err, "PKE encryption doesn't fail") - for _, v := range ct { - if v != 0 { - t.Fatal("Returned ciphertext must be not changed") - } - } -} - -func testKEMRoundTrip(t *testing.T, pkB, skB []byte, v sikeVec) { - // Import keys - var err error - var ssE [common.MaxSharedSecretBsz]byte - var ssD [common.MaxSharedSecretBsz]byte - pk := NewPublicKey(v.id, KeyVariantSike) - sk := NewPrivateKey(v.id, KeyVariantSike) - ct := make([]byte, v.kem.CiphertextSize()) - ssBsz := v.kem.SharedSecretSize() - - err = pk.Import(pkB) - CheckNoErr(t, err, "Public key import failed") - err = sk.Import(skB) - CheckNoErr(t, err, "Private key import failed") - - v.kem.Reset() - err = v.kem.Encapsulate(ct, ssE[:], pk) - CheckNoErr(t, err, "Encapsulation failed") - v.kem.Reset() - err = v.kem.Decapsulate(ssD[:ssBsz], sk, pk, ct) - CheckNoErr(t, err, "Decapsulation failed") - - if !bytes.Equal(ssE[:v.kem.SharedSecretSize()], ssD[:v.kem.SharedSecretSize()]) { - t.Errorf("Shared secrets from decapsulation and encapsulation differ [%s]", v.name) - } -} - -func testKEMKeyGeneration(t *testing.T, v sikeVec) { - var ssE [common.MaxSharedSecretBsz]byte - var ssD [common.MaxSharedSecretBsz]byte - ct := make([]byte, v.kem.CiphertextSize()) - - sk := NewPrivateKey(v.id, KeyVariantSike) - pk := NewPublicKey(v.id, KeyVariantSike) - CheckNoErr(t, sk.Generate(rand.Reader), "error: key generation") - sk.GeneratePublicKey(pk) - - // calculated shared secret - v.kem.Reset() - err := v.kem.Encapsulate(ct, ssE[:], pk) - CheckNoErr(t, err, "encapsulation failed") - v.kem.Reset() - err = v.kem.Decapsulate(ssD[:v.kem.SharedSecretSize()], sk, pk, ct) - CheckNoErr(t, err, "decapsulation failed") - - if !bytes.Equal(ssE[:], ssD[:]) { - t.Fatalf("KEM failed \n encapsulated: %X\n decapsulated: %X", ssD[:], ssE[:]) - } -} - -func testNegativeKEM(t *testing.T, v sikeVec) { - var ssE [common.MaxSharedSecretBsz]byte - var ssD [common.MaxSharedSecretBsz]byte - var ssTmp [common.MaxSharedSecretBsz]byte - ct := make([]byte, v.kem.CiphertextSize()) - ssBsz := v.kem.SharedSecretSize() - - sk := NewPrivateKey(v.id, KeyVariantSike) - pk := NewPublicKey(v.id, KeyVariantSike) - CheckNoErr(t, sk.Generate(rand.Reader), "error: key generation") - sk.GeneratePublicKey(pk) - - v.kem.Reset() - err := v.kem.Encapsulate(ct, ssE[:], pk) - CheckNoErr(t, err, "pre-requisite for a test failed") - - // Try decapsulate too small ciphertext - v.kem.Reset() - CheckNoErr( - t, - CheckPanic(func() { _ = v.kem.Decapsulate(ssTmp[:ssBsz], sk, pk, ct[:len(ct)-2]) }), - "Decapsulation must panic if ciphertext is too small") - - ctTmp := make([]byte, len(ct)+1) - // Try decapsulate too big ciphertext - v.kem.Reset() - CheckNoErr( - t, - CheckPanic(func() { _ = v.kem.Decapsulate(ssTmp[:ssBsz], sk, pk, ctTmp) }), - "Decapsulation must panic if ciphertext is too big") - - // Change ciphertext - ct[0] = ct[0] - 1 - v.kem.Reset() - err = v.kem.Decapsulate(ssD[:ssBsz], sk, pk, ct) - CheckNoErr(t, err, "decapsulation returns error when invalid ciphertext provided") - - if bytes.Equal(ssE[:], ssD[:]) { - // no idea how this could ever happen, but it would be very bad - t.Error("critical error") - } - - // Try encapsulating with SIDH key - pkSidh := NewPublicKey(v.id, KeyVariantSidhB) - prSidh := NewPrivateKey(v.id, KeyVariantSidhB) - v.kem.Reset() - CheckNoErr( - t, - CheckPanic(func() { _ = v.kem.Encapsulate(ct, ssE[:], pkSidh) }), - "encapsulation accepts SIDH public key") - - // Try decapsulating with SIDH key - v.kem.Reset() - CheckNoErr( - t, - CheckPanic(func() { _ = v.kem.Decapsulate(ssD[:ssBsz], prSidh, pk, ct) }), - "encapsulation accepts SIDH public key") -} - -// In case invalid ciphertext is provided, SIKE's decapsulation must -// return same (but unpredictable) result for a given key. -func testNegativeKEMSameWrongResult(t *testing.T, v sikeVec) { - var ssE [common.MaxSharedSecretBsz]byte - var ssD1 [common.MaxSharedSecretBsz]byte - var ssD2 [common.MaxSharedSecretBsz]byte - ct := make([]byte, v.kem.CiphertextSize()) - ssBsz := v.kem.SharedSecretSize() - - sk := NewPrivateKey(v.id, KeyVariantSike) - pk := NewPublicKey(v.id, KeyVariantSike) - CheckNoErr(t, sk.Generate(rand.Reader), "error: key generation") - sk.GeneratePublicKey(pk) - - v.kem.Reset() - err := v.kem.Encapsulate(ct, ssE[:], pk) - CheckNoErr(t, err, "pre-requisite for a test failed") - - // make ciphertext wrong - ct[0] = ct[0] - 1 - v.kem.Reset() - err = v.kem.Decapsulate(ssD1[:ssBsz], sk, pk, ct) - CheckNoErr(t, err, "pre-requisite for a test failed") - - // change secret keysecond decapsulation must be done with same, but imported private key - var expSk [common.MaxSikePrivateKeyBsz]byte - sk.Export(expSk[:]) - - // create new private key - sk = NewPrivateKey(v.id, KeyVariantSike) - CheckNoErr(t, sk.Import(expSk[:sk.Size()]), "import failed") - - // try decapsulating again. - v.kem.Reset() - err = v.kem.Decapsulate(ssD2[:ssBsz], sk, pk, ct) - CheckNoErr(t, err, "pre-requisite for a test failed") - - // ssD1 must be same as ssD2 - if !bytes.Equal(ssD1[:], ssD2[:]) { - t.Error("decapsulation is insecure") - } - - // ssD1 and ssD2 must be different than ssE - if bytes.Equal(ssE[:], ssD1[:]) || bytes.Equal(ssE[:], ssD2[:]) { - // this test requires that decapsulation returns wrong result - t.Errorf("test implementation error") - } -} - -func testKAT(t *testing.T, v sikeVec) { - ssGot := make([]byte, v.kem.SharedSecretSize()) - testDecapsulation := func(pk, sk, ct, ssExpected []byte) { - pubKey := NewPublicKey(v.id, KeyVariantSike) - prvKey := NewPrivateKey(v.id, KeyVariantSike) - if pubKey.Import(pk) != nil || prvKey.Import(sk) != nil { - panic("sike test: can't load KAT") - } - - err := v.kem.Decapsulate(ssGot, prvKey, pubKey, ct) - CheckNoErr(t, err, "sike test: can't perform decapsulation KAT") - if !bytes.Equal(ssGot, ssExpected) { - t.Fatalf("KAT decapsulation failed\n") - } - } - - readAndCheckLine := func(r *bufio.Reader) []byte { - // Read next line from buffer - line, isPrefix, err := r.ReadLine() - if err != nil || isPrefix { - panic("Wrong format of input file") - } - - // Function expects that line is in format "KEY = HEX_VALUE". Get - // value, which should be a hex string - hexst := strings.Split(string(line), "=")[1] - hexst = strings.TrimSpace(hexst) - // Convert value to byte string - ret, err := hex.DecodeString(hexst) - if err != nil { - panic("Wrong format of input file") - } - return ret - } - - testKeygen := func(pk, sk []byte) { - // Import provided private key - prvKey := NewPrivateKey(v.id, KeyVariantSike) - pubKey := NewPublicKey(v.id, KeyVariantSike) - pubKeyBytes := make([]byte, pubKey.Size()) - CheckNoErr(t, prvKey.Import(sk), "Can't load KAT") - - // Generate public key - prvKey.GeneratePublicKey(pubKey) - pubKey.Export(pubKeyBytes) - if !bytes.Equal(pubKeyBytes, pk) { - t.Errorf("Public key differ [%s]", v.name) - } - } - - f, err := os.Open(v.KatFile) - if err != nil { - t.Fatal(err) - } - - r := bufio.NewReader(f) - for { - line, isPrefix, err := r.ReadLine() - if err != nil || isPrefix { - if err == io.EOF { - break - } else { - t.Fatal(err) - } - } - if len(strings.TrimSpace(string(line))) == 0 || line[0] == '#' { - continue - } - - // count - _ = strings.Split(string(line), "=")[1] - // seed - _ = readAndCheckLine(r) - // pk - pk := readAndCheckLine(r) - // sk (secret key in test vector is concatenation of - // MSG + SECRET_BOB_KEY + PUBLIC_BOB_KEY. We use only MSG+SECRET_BOB_KEY - sk := readAndCheckLine(r) - sk = sk[:v.kem.params.MsgLen+int(v.kem.params.B.SecretByteLen)] - // ct - ct := readAndCheckLine(r) - // ss - ss := readAndCheckLine(r) - - testKeygen(pk, sk) - testDecapsulation(pk, sk, ct, ss) - testKEMRoundTrip(t, pk, sk, v) - } -} - -// Interface to "testing" - -/* ------------------------------------------------------------------------- - Wrappers for 'testing' SIDH - -------------------------------------------------------------------------*/ - -func testSike(t *testing.T, m *map[uint8]sikeVec, f func(*testing.T, sikeVec)) { - for i := range *m { - v := (*m)[i] - t.Run(v.name, func(t *testing.T) { f(t, v) }) - } -} - -func TestPKERoundTrip(t *testing.T) { testSike(t, &tdataSike, testPKERoundTrip) } -func TestPKEKeyGeneration(t *testing.T) { testSike(t, &tdataSike, testPKEKeyGeneration) } -func TestNegativePKE(t *testing.T) { testSike(t, &tdataSike, testNegativePKE) } -func TestKEMKeyGeneration(t *testing.T) { testSike(t, &tdataSike, testKEMKeyGeneration) } -func TestNegativeKEM(t *testing.T) { testSike(t, &tdataSike, testNegativeKEM) } -func TestKAT(t *testing.T) { testSike(t, &tdataSike, testKAT) } -func TestNegativeKEMSameWrongResult(t *testing.T) { - testSike(t, &tdataSike, testNegativeKEMSameWrongResult) -} - -func TestKEMRoundTrip(t *testing.T) { - for _, val := range tdataSike { - // fmt.Printf("\tTesting: %s\n", val.name) - pk, err := hex.DecodeString(val.PkB) - CheckNoErr(t, err, "public key B not a number") - sk, err := hex.DecodeString(val.PrB) - CheckNoErr(t, err, "private key B not a number") - testKEMRoundTrip(t, pk, sk, val) - } -} - -/* ------------------------------------------------------------------------- - Benchmarking - -------------------------------------------------------------------------*/ - -func benchSike(t *testing.B, m *map[uint8]sikeVec, f func(*testing.B, sikeVec)) { - for i := range *m { - v := (*m)[i] - t.Run(v.name, func(t *testing.B) { f(t, v) }) - } -} - -func benchKeygen(b *testing.B, v sikeVec) { - pub := NewPublicKey(v.id, KeyVariantSike) - prv := NewPrivateKey(v.id, KeyVariantSike) - _ = prv.Generate(rand.Reader) - - b.ResetTimer() - for n := 0; n < b.N; n++ { - prv.GeneratePublicKey(pub) - } -} - -func benchmarkEncaps(b *testing.B, v sikeVec) { - pub := NewPublicKey(v.id, KeyVariantSike) - prv := NewPrivateKey(v.id, KeyVariantSike) - - if prv.Generate(rand.Reader) != nil { - b.FailNow() - } - prv.GeneratePublicKey(pub) - - var ct [common.MaxCiphertextBsz]byte - var ss [common.MaxSharedSecretBsz]byte - - b.ResetTimer() - for n := 0; n < b.N; n++ { - v.kem.Reset() - _ = v.kem.Encapsulate(ct[:], ss[:], pub) - } -} - -func benchmarkDecaps(b *testing.B, v sikeVec) { - var ct [common.MaxCiphertextBsz]byte - var ss [common.MaxSharedSecretBsz]byte - ssBsz := v.kem.SharedSecretSize() - - pkA := NewPublicKey(v.id, KeyVariantSike) - prvA := NewPrivateKey(v.id, KeyVariantSike) - pkB := NewPublicKey(v.id, KeyVariantSike) - prvB := NewPrivateKey(v.id, KeyVariantSike) - - if prvA.Generate(rand.Reader) != nil || prvB.Generate(rand.Reader) != nil { - b.FailNow() - } - - prvA.GeneratePublicKey(pkA) - prvB.GeneratePublicKey(pkB) - - v.kem.Reset() - err := v.kem.Encapsulate(ct[:], ss[:], pkA) - if err != nil { - b.FailNow() - } - - ctSlc := ct[:v.kem.CiphertextSize()] - - b.ResetTimer() - for n := 0; n < b.N; n++ { - v.kem.Reset() - _ = v.kem.Decapsulate(ss[:ssBsz], prvA, pkB, ctSlc) - } -} - -func BenchmarkKeygen(b *testing.B) { benchSike(b, &tdataSike, benchKeygen) } -func BenchmarkEncaps(b *testing.B) { benchSike(b, &tdataSike, benchmarkEncaps) } -func BenchmarkDecaps(b *testing.B) { benchSike(b, &tdataSike, benchmarkDecaps) } - -func ExampleKEM() { - // Alice's key pair - prvA := NewPrivateKey(Fp503, KeyVariantSike) - pubA := NewPublicKey(Fp503, KeyVariantSike) - // Bob's key pair - prvB := NewPrivateKey(Fp503, KeyVariantSike) - pubB := NewPublicKey(Fp503, KeyVariantSike) - // Generate keypair for Alice - err := prvA.Generate(rand.Reader) - if err != nil { - panic(err) - } - prvA.GeneratePublicKey(pubA) - // Generate keypair for Bob - err = prvB.Generate(rand.Reader) - if err != nil { - panic(err) - } - prvB.GeneratePublicKey(pubB) - // Initialize internal KEM structures - kem := NewSike503(rand.Reader) - // Create buffers for ciphertext, shared secret received - // from encapsulation and shared secret from decapsulation - ct := make([]byte, kem.CiphertextSize()) - ssE := make([]byte, kem.SharedSecretSize()) - ssD := make([]byte, kem.SharedSecretSize()) - // Alice performs encapsulation with Bob's public key - err = kem.Encapsulate(ct, ssE, pubB) - if err != nil { - panic(err) - } - // Bob performs decapsulation with his key pair - err = kem.Decapsulate(ssD, prvB, pubB, ct) - if err != nil { - panic(err) - } - fmt.Printf("%t\n", bytes.Equal(ssE, ssD)) - - // Bob performs encapsulation with Alice's public key - err = kem.Encapsulate(ct, ssE, pubA) - if err != nil { - panic(err) - } - // Alice performs decapsulation with hers key pair - err = kem.Decapsulate(ssD, prvA, pubA, ct) - if err != nil { - panic(err) - } - fmt.Printf("%t\n", bytes.Equal(ssE, ssD)) - - // Output: - // true - // true -} diff --git a/dh/sidh/testdata/PQCkemKAT_374.rsp b/dh/sidh/testdata/PQCkemKAT_374.rsp deleted file mode 100644 index 940427e9..00000000 --- a/dh/sidh/testdata/PQCkemKAT_374.rsp +++ /dev/null @@ -1,702 +0,0 @@ -# SIKEp434 - -count = 0 -seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 -pk = 4484D7AADB44B40CC180DC568B2C142A60E6E2863F5988614A6215254B2F5F6F79B48F329AD1A2DED20B7ABAB10F7DBF59C3E20B59A700093060D2A44ACDC0083A53CF0808E0B3A827C45176BEE0DC6EC7CC16461E38461C12451BB95191407C1E942BB50D4C7B25A49C644B630159E6C403653838E689FBF4A7ADEA693ED0657BA4A724786AF7953F7BA6E15F9BBF9F5007FB711569E72ACAB05D3463A458536CAB647F00C205D27D5311B2A5113D4B26548000DB237515931A040804E769361F94FF0167C78353D2630A1E6F595A1F80E87F6A5BCD679D7A64C5006F6191D4ADEFA1EA67F6388B7017D453F4FE2DFE80CCC709000B52175BFC3ADE52ECCB0CEBE1654F89D39131C357EACB61E5F13C80AB0165B7714D6BE6DF65F8DE73FF47B7F3304639F0903653ECCFA252F6E2104C4ABAD3C33AF24FD0E56F58DB92CC66859766035419AB2DF600 -sk = 7C9935A0B07694AA0C6D10E4DB6B1ADD91282214654CB55E7C2CACD53919604D5BAC7B23EEF4B315FEEF5E014484D7AADB44B40CC180DC568B2C142A60E6E2863F5988614A6215254B2F5F6F79B48F329AD1A2DED20B7ABAB10F7DBF59C3E20B59A700093060D2A44ACDC0083A53CF0808E0B3A827C45176BEE0DC6EC7CC16461E38461C12451BB95191407C1E942BB50D4C7B25A49C644B630159E6C403653838E689FBF4A7ADEA693ED0657BA4A724786AF7953F7BA6E15F9BBF9F5007FB711569E72ACAB05D3463A458536CAB647F00C205D27D5311B2A5113D4B26548000DB237515931A040804E769361F94FF0167C78353D2630A1E6F595A1F80E87F6A5BCD679D7A64C5006F6191D4ADEFA1EA67F6388B7017D453F4FE2DFE80CCC709000B52175BFC3ADE52ECCB0CEBE1654F89D39131C357EACB61E5F13C80AB0165B7714D6BE6DF65F8DE73FF47B7F3304639F0903653ECCFA252F6E2104C4ABAD3C33AF24FD0E56F58DB92CC66859766035419AB2DF600 -ct = 0FDEB26DBD96E0CD272283CA5BDD1435BC9A7F9AB7FC24F83CA926DEED038AE4E47F39F9886E0BD7EEBEAACD12AB435CC92AA3383B2C01E6B9E02BC3BEF9C6C2719014562A96A0F3E784E3FA44E5C62ED8CEA79E1108B6FECD5BF8836BF2DAE9FEB1863C4C8B3429220E2797F601FB4B8EBAFDD4F17355508D259CA60721D167F6E5480B5133E824F76D3240E97F31325DBB9A53E9A3EEE2E0712734825615A027857E2000D4D00E11988499A738452C93DA895BFA0E10294895CCF25E3C261CBE38F5D7E19ABE4E322094CB8DEC5BF7484902BABDE33CC69595F6013B20AABA9698C1DEA2BC6F65D57519294E6FEEA3B549599D480948374D2D21B643573C276E1A5B0745301F648D7982AB46A3065639960182BF365819EFC0D4E61E87D2820DBC0E849E99E875B21501D1CA7588A1D458CD70C7DF793D4993B9B1679886CAE8013A8DD854F010A100C9933FA642DC0AEA9985786ED36B98D3 -ss = 35F7F8FF388714DEDC41F139078CEDC9 - -count = 1 -seed = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC81ADDE6AEEB4A5A875C3BFCADFA958F -pk = C9F73E4497AAA3FDF9EB688135866A8A83934BA10E273B8CC3808CF0C1F5FAB3E9BB295885881B73DEBC875670C0F51C4BB40DF5FEDE01B8AF32D1BF10508B8C17B2734EB93B2B7F5D84A4A0F2F816E9E2C32AC253C0B6025B124D05A87A9E2A8567930F44BAA14219B941B6B400B4AED1D796DA12A5A9F0B8F3F5EE9DD43F64CB24A3B1719DF278ADF56B5F3395187829DA2319DEABF6BBD6EDA244DE2B62CC5AC250C1009DD1CD4712B0B37406612AD002B5E51A62B51AC9C0374D143ABBBD58275FAFC4A5E959C54838C2D6D9FB43B7B2609061267B6A2E6C6D01D295C4223E0D3D7A4CDCFB28A7818A737935279751A6DD8290FD498D1F6AD5F4FFF6BDFA536713F509DCE8047252F1E7D0DD9FCC414C0070B5DCCE3665A21A032D7FBE749181032183AFAD240B7E671E87FBBEC3A8CA4C11AA7A9A23AC69AE2ACF54B664DECD27753D63508F1B02 -sk = D60B93492A1D8C1C7BA6FC0B733137F3E37BFE55B43B32448F375903D8D226EC94ADBFEA1D2B3536EB987001C9F73E4497AAA3FDF9EB688135866A8A83934BA10E273B8CC3808CF0C1F5FAB3E9BB295885881B73DEBC875670C0F51C4BB40DF5FEDE01B8AF32D1BF10508B8C17B2734EB93B2B7F5D84A4A0F2F816E9E2C32AC253C0B6025B124D05A87A9E2A8567930F44BAA14219B941B6B400B4AED1D796DA12A5A9F0B8F3F5EE9DD43F64CB24A3B1719DF278ADF56B5F3395187829DA2319DEABF6BBD6EDA244DE2B62CC5AC250C1009DD1CD4712B0B37406612AD002B5E51A62B51AC9C0374D143ABBBD58275FAFC4A5E959C54838C2D6D9FB43B7B2609061267B6A2E6C6D01D295C4223E0D3D7A4CDCFB28A7818A737935279751A6DD8290FD498D1F6AD5F4FFF6BDFA536713F509DCE8047252F1E7D0DD9FCC414C0070B5DCCE3665A21A032D7FBE749181032183AFAD240B7E671E87FBBEC3A8CA4C11AA7A9A23AC69AE2ACF54B664DECD27753D63508F1B02 -ct = 5C0BD37BFCBB23AEFD37ADF1F95AE78DCFEC2981E50E81FDD0569E0FF53F117A5B3D2969F3E51A074487B12329665A7B23B16478F012015E271A46992D953E62A51BA0100BF6A50E8EA2A393D5514CA02DEFB5B62860C1A6AD27FBDE9387AB86F5D519021693FA45CF8F55DF2E007583720AE637CB2DE891A2CE272565CE546079EF81AF08277D8511D164447826310DB06C28E58DEF4B4ADD55D45FAB3036C9C7D3975E01590BA490768F84B758B2FD6E64A73704887BF43AB5DFA4ABC79D2B01A843C8B7F3673B458DD9260810BC5D54C30E7E84F63CCABB37BA00587A36563AC5D02C82482AFA6EFE1E29A187D42CDB6039CA35269CD5CEE420820699AE03BFEDB1A84772BCBA36AD2E34AD025B2C6E0302A4753B1F5320C51796A9CE2E4A543044A6C4B47CC94959618052ED806425849983F0890B8A9ED935AC86E8FB2FA819C793CD90FCBE790018D8FE6B6B89FD54DBF3F1BDE4FB3574 -ss = 9D7EDCCC78E60EFDDD75D585AD920730 - -count = 2 -seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 -pk = 1BD0A2E81307B6F96461317DDF535ACC0E59C742627BAE60D27605E10FAF722D22A73E184CB572A12E79DCD58C6B54FB01442114CBE9010B6CAEC25D04C16C5E42540C1524C545B8C67614ED4183C9FA5BD0BE45A7F89FBC770EE8E7E5E391C7EE6F35F74C29E6D9E35B1663DA01E48E9DEB2347512D366FDE505161677055E3EF23054D276E817E2C57025DA1C10D2461F68617F2D11256EEE4E2D7DBDF6C8E34F3A0FD00C625428CB41857002159DAB94267ABE42D630C6AAA91AF837C7A6740754EA6634C45454C51B0BB4D44C3CCCCE4B32C00901CF69C008D013348379B2F9837F428A01B6173584691F2A6F3A3C4CF487D20D261B36C8CDB1BC158E2A5162A9DA4F7A97AA0879B9897E2B6891B672201F9AEFBF799C27B2587120AC586A511360926FB7DA8EBF5CB5272F396AE06608422BE9792E2CE9BEF21BF55B7EFF8DC7EC8C99910D3F800 -sk = 4B622DE1350119C45A9F2E2EF3DC5DF56A27FCDFCDDAF58CD69B903752D68C200934E160B234E49EDE2476011BD0A2E81307B6F96461317DDF535ACC0E59C742627BAE60D27605E10FAF722D22A73E184CB572A12E79DCD58C6B54FB01442114CBE9010B6CAEC25D04C16C5E42540C1524C545B8C67614ED4183C9FA5BD0BE45A7F89FBC770EE8E7E5E391C7EE6F35F74C29E6D9E35B1663DA01E48E9DEB2347512D366FDE505161677055E3EF23054D276E817E2C57025DA1C10D2461F68617F2D11256EEE4E2D7DBDF6C8E34F3A0FD00C625428CB41857002159DAB94267ABE42D630C6AAA91AF837C7A6740754EA6634C45454C51B0BB4D44C3CCCCE4B32C00901CF69C008D013348379B2F9837F428A01B6173584691F2A6F3A3C4CF487D20D261B36C8CDB1BC158E2A5162A9DA4F7A97AA0879B9897E2B6891B672201F9AEFBF799C27B2587120AC586A511360926FB7DA8EBF5CB5272F396AE06608422BE9792E2CE9BEF21BF55B7EFF8DC7EC8C99910D3F800 -ct = E4F8CA44EA281F30009DBF0CF812C6193B2E488E6CBDEBA99E421ABD70BA1FBF809F5D9CED745F9DB9E3666AF910A25B3AB179575D15019AF37568B386928F0448DA4CA43C2A58940AF03AABABB662EDFD1752EE011F175C34B6B3D0E3B5FFF2DA995FFFE021B7371D2145495201C72E8B326C80E1F5DDC3365085D307087A85B17584B61200D2115434320961DE9CC23A4D29008756D2BCA99C80FF3D189FDF0F825A0E001726A3AD60BF8164C737971C9868D22EAB96397F47921564B92527099B8FB5712AE0001CFBE968BB87D2D51279C01989D6747190049D01465C7B80DE91682978478A71DC301714AB1FCD6E4AE297441F680C70345B38894495EF6AA112AE5994B608165B00FD93AB7546999C3800C7A40576134ADAB162777E98699FE9780375104F788E7F4B0D3C9783013131AE87609C4C47979C39D788E79518617D710F37E4ACD635013BA43BA645D229881B7058DDD716760B -ss = 68C17AB42604D799578D835DC7256001 - -count = 3 -seed = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1A -pk = 026656630E8C79F68BE7B3EFA96969922859DDDFEF5DAF19BD4891E7A4806A6D438B346BC832F10754FE0B75CA937E01B3E8B77EEF410145F254E77AB2CFDA7BC7A42507EF8F91024D14113C63B89C8663ADFE755CF3AA0FE90C38C6B765A98980720B1092FDA9EB9677AEA04900B822F112408BF3727B999D44A07A5327623D7FC69A9E52E3A8EC66FE11047CAE20731F2E2522E647B7F5C445630A4A5472AEDCC6212302476F9A539BD6D286E5BDE01B8265FB3D081C2E0B83DAE8378D73651486F96B9F9FDD8BAE795E3FF42BAF19D568B287BA84F59FEB1AA200E9204BFBBDB1E49045A0D62CDCF0808282EE2311F600EE8D82C707DE99EEBCD358FD8A3E77874B46B115BF4E5E323C31087171401E2E0226598EB04C95338094E7C24B6E089B75E425C98BF89651FA6A9348607A8A6DA08C2DEA2E8A88A33D7C41710BADBF607B90A57002EFFD00 -sk = 050D58F9F757EDC1E8180E3808B806F5F114AAA7D2AA844222D0A658998298638BB2C80C40B4B76260672401026656630E8C79F68BE7B3EFA96969922859DDDFEF5DAF19BD4891E7A4806A6D438B346BC832F10754FE0B75CA937E01B3E8B77EEF410145F254E77AB2CFDA7BC7A42507EF8F91024D14113C63B89C8663ADFE755CF3AA0FE90C38C6B765A98980720B1092FDA9EB9677AEA04900B822F112408BF3727B999D44A07A5327623D7FC69A9E52E3A8EC66FE11047CAE20731F2E2522E647B7F5C445630A4A5472AEDCC6212302476F9A539BD6D286E5BDE01B8265FB3D081C2E0B83DAE8378D73651486F96B9F9FDD8BAE795E3FF42BAF19D568B287BA84F59FEB1AA200E9204BFBBDB1E49045A0D62CDCF0808282EE2311F600EE8D82C707DE99EEBCD358FD8A3E77874B46B115BF4E5E323C31087171401E2E0226598EB04C95338094E7C24B6E089B75E425C98BF89651FA6A9348607A8A6DA08C2DEA2E8A88A33D7C41710BADBF607B90A57002EFFD00 -ct = FC9C6A593AECFFAB44DA40D39FCB1125851C1412F6B0038748729A7898EB6E3026A0FA09F7D700277CC9ED0E8592359BB6B41D7166EE01A97B09CC3C9745FEC2227081AA712A2EDC326130097C1A65972EB1A7893D2DFCE9C18DC7AD58BC077D35FE091CA69E8F3B25B2E6AF5700852416FD07B666DCD52871A106D8BBCC1CFF3F6C846F7247BC2A7849C897AD8950630A9EAEB9B873B99AC7F280FB60AE81EC245629AB010777FF7771722CDAA8465F6B51028D3B1015249AD2C3A235975BB03B2783639AD9C46E0994FEDA332C4FDC0C315E86F1EAC7F3903BC300436B6B8430A00C6C284C229AE9504B835374883E8F2028A28F1CC486E9225E1F32BD0F30EE3260C3F68A92CB803AC99C901CE42B63B300E0AEECA9421B87652CC78E612CB62C09F8E8A62B1D55FD175A563C3F232D007633B915DCC8ED5B0C2EA85990457B092738C5AD704560003EE88C3362C9247820853932DB9E61EE -ss = E0BD6870B0308BACBDA1061628CE8F0D - -count = 4 -seed = EDC76E7C1523E3862552133FEA4D2AB05C69FB54A9354F0846456A2A407E071DF4650EC0E0A5666A52CD09462DBC51F9 -pk = 5B9EC441333B3876B02FE62FA4D3E87CF7149D2EDFCFE02B76A81321127907AC1732B2C5FCB0213ADDCB2AAD482BCCBF26CC1B1CF96601B9E9F6AB077759ED1BD8C5F1B579076E75EF089FF1E820502AB9CC67FF4822D310A2BE1D6C9BF7B019F958A360B7B4A73315B8D9D63A0152E58534D86B49875D88E3817C6A603CF2998403D73CE72685044FABB74BF774C4FA31C1E27A6250C7CA6EDF817DF6859D188594304301999FF1575039CA1B8D401C16A9DB57D54CD389703038555F30D2B0687B268DEFBDDBB37DC87E9C4A00409C6CE46075205CB2121B012801A1D46233CEDF1BE83A19D83EE8DA55C9C4279EA1B011B2386CA2390D62B906F9ADF2AD5B0EADF2D90D2705B0AD1FAFB71D0B7F8F41600065C9F4CFBA6A1D7316905BAF5F5DCC127EFAD9F34453548B8A6439B08C58173EDB7067068C0DC33AED4B3D2217E29CA2F5199984833600 -sk = 66B79B844E0C2ADAD694E0478661AC461C84F5D40C73FDE4C2D060E671DCAC99C0F268F85ADDCC7681A032005B9EC441333B3876B02FE62FA4D3E87CF7149D2EDFCFE02B76A81321127907AC1732B2C5FCB0213ADDCB2AAD482BCCBF26CC1B1CF96601B9E9F6AB077759ED1BD8C5F1B579076E75EF089FF1E820502AB9CC67FF4822D310A2BE1D6C9BF7B019F958A360B7B4A73315B8D9D63A0152E58534D86B49875D88E3817C6A603CF2998403D73CE72685044FABB74BF774C4FA31C1E27A6250C7CA6EDF817DF6859D188594304301999FF1575039CA1B8D401C16A9DB57D54CD389703038555F30D2B0687B268DEFBDDBB37DC87E9C4A00409C6CE46075205CB2121B012801A1D46233CEDF1BE83A19D83EE8DA55C9C4279EA1B011B2386CA2390D62B906F9ADF2AD5B0EADF2D90D2705B0AD1FAFB71D0B7F8F41600065C9F4CFBA6A1D7316905BAF5F5DCC127EFAD9F34453548B8A6439B08C58173EDB7067068C0DC33AED4B3D2217E29CA2F5199984833600 -ct = CDD134EDDFA2B2E9C6DE157E1ED68E0FE13798D243A0630D1566A459680A7BF93D81664866F560D59DC18D43D6400734087D4F3831C6003E21D02091176298BA40154011081E972AA1AD5BA3CB8BB069A721E2C09946D1F45AB6B9B3CD7E867F910AA6CD409413BB6488EE88F6013C44D83C55B0748DDFE5312571F7A1745B5AE94EC18002A367ACC7C83D33AE2391641FB0F8D129F8CD249E718EA5828F76EAF5CE053100711E510D753215604C0AAA6B325DD6D81E564983EF3820BB4908F6BBDA16B3B6E1FE2D0D01C3C33A73E2BB6DEF6D83B8D0481E376C8501E0FD3617273D4BB9577D6AB6485530D08116C4D9EE8A76767FEE8BE93B04BD1101AD86B642F8D3D8C3F5349734C683AA20420AD3BF250235962505CC934D87E32020F717D0018457838079ACE67F7E6C5D81DB53C40A54D755911E042778471E610F8D8860E47505F63234161100CE2EE0B19ED2A830497D0D70A6E61BD3 -ss = 18C6E6AE1527E5A612E98F2018FDD744 - -count = 5 -seed = AA93649193C2C5985ACF8F9E6AC50C36AE16A2526D7C684F7A3BB4ABCD7B6FF790E82BADCE89BC7380D66251F97AAAAA -pk = ABD9D07C7D8957F8F043CF2565406A71C0F5845EAA8F0C633EE78D2EEFD276C9D65E8718482EB0CF082F16C8A91F9F779D29E04D402A018EF75E4758206392C6502D4AB3B539CB505E86DDC39F2472CDCD47513116B38AF8B591F70230497CB55F5F9F80C7DFB698B8CF8EA7110292D067C0340E6F815839DEBA5F2AE53840E1114587A3E45F1206E0679F0783B3833293A425FA7D7F5DF6D5077B43081DAB970D49CB0202B89503F46CB3C599D7A258A63A29913D0DF9DD0D5D7A0F50CF837D7BCEF760B56AF9D0A34627754F7B4A7DBBD2BD9D4836F7B848D9EE008E8E9982887E4E7DC36AD259715C3A54540241D995CB115E5DDD727567E36EEB0E858CFF4394EE030159E52C03035E36ED796864E88301AB9B98BEA197396E09569477CC25192EC3235C5A24F3794D2B39295E3F108AE3365470E68FCB81F9E097284BD88F7FEDF6AC91255B1F02 -sk = 7EC408F52C9AA723D0C41D9987682A5F96EF1EB28E65EEF99B8CE6DDE26D979BDAA37158C7649ECDA51A5D01ABD9D07C7D8957F8F043CF2565406A71C0F5845EAA8F0C633EE78D2EEFD276C9D65E8718482EB0CF082F16C8A91F9F779D29E04D402A018EF75E4758206392C6502D4AB3B539CB505E86DDC39F2472CDCD47513116B38AF8B591F70230497CB55F5F9F80C7DFB698B8CF8EA7110292D067C0340E6F815839DEBA5F2AE53840E1114587A3E45F1206E0679F0783B3833293A425FA7D7F5DF6D5077B43081DAB970D49CB0202B89503F46CB3C599D7A258A63A29913D0DF9DD0D5D7A0F50CF837D7BCEF760B56AF9D0A34627754F7B4A7DBBD2BD9D4836F7B848D9EE008E8E9982887E4E7DC36AD259715C3A54540241D995CB115E5DDD727567E36EEB0E858CFF4394EE030159E52C03035E36ED796864E88301AB9B98BEA197396E09569477CC25192EC3235C5A24F3794D2B39295E3F108AE3365470E68FCB81F9E097284BD88F7FEDF6AC91255B1F02 -ct = 73B277597F6861DF9C9929397A7216AAFFFE94C1DC522D31B2FE4ECF64A09A30B754186519B9C3FF348B7249F32B944E04BD4B7AE719027CD8F38559585FE916014EF21607D4D7A83DA63237B7623D68F42F4134CFC701630B74B2C7C36BAC6C9B1F90334783C37219D6D72CF501A468B5B0149CE42C491E71AC55FB68C628CE0347873FA0E9D6240DF43D6C4FD8945C901666A92DDC068ECB3D70D99A2AE2A968DD69C201BE9B2AF07502F88CBAFA9B02E4B9208F3FD9DF66DB977DF0469F547A62522454617BA14357572F17CDD74A1C5756EF0B49797665905B00FE9A2665C8A3AC0FEB3164B9EC129C7C8C0015AD3532A0B332F0ABA0CBCEA670F81664C6543E94BABF1C455316350B07E70AC9439048009E6E25D222884CB7A6989CBB50C226C9951172F2A18D7308660ABC0B441355E4D938441B4C18B18BB20A35B8D9EBA2EE5FEF04300BB300C4B6EFAD7D9B9E29AA430F4ACD9D8645 -ss = 377A154FEDAC0A7DF1DFB1409D34F568 - -count = 6 -seed = 2E014DC7C2696B9F6D4AF555CBA4B931B34863FF60E2341D4FDFE472FEF2FE2C33E0813FC5CAFDE4E30277FE522A9049 -pk = 235B59C4931909215173C321D2BE02DDD8F4227D1AFAF566BBFCDD8E9280F63A7D1AA346C3B01F429AD66689D9912A5C4C36241A314200403282704705DBBBA6917E131FCF5541BDED9478B08649619D8F6FE9D4D5BB9B28F3F851C5AFF4B31A4D94858876BF3218D68FF88A8A018E55B5B9C7A664001BC7793C2052841329A80DAC59A919BB4C51ED106FF12646327E08E6CBA2F3FA92CBA3655640681E93EAF9F8A0BE0092576BD86705BA9FA4546F78659A8F4C162763F37F8376E480BB15F15AF187B02A1ACE9F9A994977A076FD8C9CEE72C2F58B6C06570602F37989AFC2A59068F95F510AC7565D90B8D101CCF66A3C3A758319F690D59843F1E5142A701B2622944DA1D8B48E0AD0FD888EA0D41D018C387AEA8B7A9DCD0F1536822A9E7C9056784637637D9FA3F242C84A20B29558A3C73DC38462527F6659572317DAD665727952769FAB00 -sk = C121915BFEF6ABDFC177DAE2F5A24218C701C945CF4234DAB0E8518592EDD35881C0F413DE3FB6CFB2370801235B59C4931909215173C321D2BE02DDD8F4227D1AFAF566BBFCDD8E9280F63A7D1AA346C3B01F429AD66689D9912A5C4C36241A314200403282704705DBBBA6917E131FCF5541BDED9478B08649619D8F6FE9D4D5BB9B28F3F851C5AFF4B31A4D94858876BF3218D68FF88A8A018E55B5B9C7A664001BC7793C2052841329A80DAC59A919BB4C51ED106FF12646327E08E6CBA2F3FA92CBA3655640681E93EAF9F8A0BE0092576BD86705BA9FA4546F78659A8F4C162763F37F8376E480BB15F15AF187B02A1ACE9F9A994977A076FD8C9CEE72C2F58B6C06570602F37989AFC2A59068F95F510AC7565D90B8D101CCF66A3C3A758319F690D59843F1E5142A701B2622944DA1D8B48E0AD0FD888EA0D41D018C387AEA8B7A9DCD0F1536822A9E7C9056784637637D9FA3F242C84A20B29558A3C73DC38462527F6659572317DAD665727952769FAB00 -ct = A0D5B0A211B37E232BD846CB7EF30CF81548BB89C96DAA08D39762F5FEE12B3960C72C30C53D4B2ECF4A998A569C546125C7EB7790EC006C4D6927CAAF595D87581702B4FB5C395F2DEE22E137DE40CB337907B150D9C1607ECECB6E9C33A614EEC4EE7BA3AFC681935B95BAD200DE71E80A5E19C54780E2DFA06E3EB7ED7941A84FC337B9CF13CFA6A14BC15E0AC72A89022BEBED520F71C01E8A4B63ABB904CAAB210100C8FDA4BBB7BEFD1B574376A7855F75DBD39546DACAC66E668192D4B54975504658AA2E438095BCD41FF86173DC6AE72B72FA8C136B1702623DCF514EADF17033D18018408DB3CD77354B383365DD2327B18047A882EC4966ABD4470FB256993DBA121E5F00FE250E218E5185C10085627D0FA545EDE681390F4B9FCC10748DA761A7353E52C4CC1135F1CD53EB5F6960410F7195A33DC1E2BCE864BE7B200D81FC2F5A7F0027E416D28AF12A64C1DCC5BC596E9636 -ss = 20702B740B8447FEBB904FC9BF411637 - -count = 7 -seed = AEFB28FDD34E0AB403A703B535296E3A545CA479C1D8148E2D501B3C8DD8B1034BD986F13F1A7B4671BE769359FD2AAB -pk = B35A0DB3B8FBA28F72C047A5E4676FBEFF9D14B938D20C6A38DCB38F2CBDF3C5B4B789695DCAE46833A572FBD116A7966FC1407E72B000CBC49BD2ABA200E58A59BA975A956DEFB144A8C37886CE65FB7AEC52A67976BA830C0C51200DE5D03108064D78CE79DFEA0FD539BEEA00D911697F499BD056294C565A483F855CCD2A461927BA6CAEF894A1798AE8EFEF2DEA8078817A5FCEFA4A688F91BE9D714794F96D075600D7B785DC0E72174BA8AECECDDD1FF68EF6859C867BB6FB58FABD9CBC1B52424EB6CBA25185B01907B8DF6CFF1CB7F399A8A73D888A40018279D0888FFB2D0B7EE92E74942B567D6842706E965F7B44319AE8148552EF363285E6F1F6F655BC8693F6567793897E8A7B9358A6AE0075C9413DA7945EA98E2296A7A84562E58BE632381699449C62E3DEE3E3E42B93034C2002A91B7330E5FD22D884185314767B660C499800 -sk = D86634ECF96CC2603761E284C0E36734440251BC6D79105402015AFCF1B6E3F84D723CB0B6DC224BDF7B6701B35A0DB3B8FBA28F72C047A5E4676FBEFF9D14B938D20C6A38DCB38F2CBDF3C5B4B789695DCAE46833A572FBD116A7966FC1407E72B000CBC49BD2ABA200E58A59BA975A956DEFB144A8C37886CE65FB7AEC52A67976BA830C0C51200DE5D03108064D78CE79DFEA0FD539BEEA00D911697F499BD056294C565A483F855CCD2A461927BA6CAEF894A1798AE8EFEF2DEA8078817A5FCEFA4A688F91BE9D714794F96D075600D7B785DC0E72174BA8AECECDDD1FF68EF6859C867BB6FB58FABD9CBC1B52424EB6CBA25185B01907B8DF6CFF1CB7F399A8A73D888A40018279D0888FFB2D0B7EE92E74942B567D6842706E965F7B44319AE8148552EF363285E6F1F6F655BC8693F6567793897E8A7B9358A6AE0075C9413DA7945EA98E2296A7A84562E58BE632381699449C62E3DEE3E3E42B93034C2002A91B7330E5FD22D884185314767B660C499800 -ct = B4C21958149D7CB56C45669273AD8D8D3A4F0CC2334E7EC6D38C5F39A9DB08DBBB2AA246F2A7D0C204FA34FAA30D76EA76A6026B02B50026736C0007B38358AE10570494B3A9D431F3B4658ABB737F2C7D4C11B20DACA1D5D455C3AD05970EEE452DB1A83E92FDA138C9F76076003923082298E36A8425304EA83A0E978581673DC5457833BC488304A1F8F4FF832231FBAA643D53CD0DBBB2E97034CFB172F5A996026100A592AE49711B17FD7C12F8D676A8E821694769193DF59BC266CBBD0DC735DFE39BCF6C75BB129D70AE6FFA6D9CEA4CA13AF6D93AF4F700691CCEAA2F3FBEEF2F962DB0E429015D6CC25C4CE5AD3577FBD68C543594008B37D6D18E4AB4DA3201D10AB437BB3B6353AD219164BF01FAE551C0E65F9976FB5A992EB6ED2E50D44DEE844568D5C9C7785F646C2498AFC12C28EF075B9C2C3B6F6D301CBCA4C251DA4AE0E39C0049D5D61D0F8EE4D1E9699CD16863DD2E -ss = CBC8B73A7F31E6E4B909DF774D17E1A2 - -count = 8 -seed = CBE5161E8DE02DDA7DE204AEB0FBB4CA81344BA8C30FE357A4664E5D2988A03B64184D7DC69F8D367550E5FEA0876D41 -pk = AC97BE89E1D09C95148DCA3A189D52B8C39251DFDD534264C0CAC77ECD7E0A6A4625E95CD0FDAD68522C20AAE8D0FFABC262E95F3A1401A0626EC88F43FD1403B1EA5D052D89D65501E3DFB735BA92EAFA34AE5657322957EDC1DD52FF5620B85412355A1C2C866405269FCEDF0045092A0D136D64834DD7DE0BC7ED46DBC671C5C34AA76147E65670A569B349646412BA9D015155D85BC39075FEAB1DB50042B570DAC10028C016EB01199EB50C03DB532F675E1FBC00FDBF70D756C71DF66BC63831B42AC1F4EBD7B2F5042E00053F14EC10A803B69B5455E80D018263D184B8220300640C0442A82667258387F2A7FDD26425E07E4637F159951E16D460D7C89F131BE2FDBD6C0069C1F781FA789FE5BC00805BC7390C6300C6E075710C0394AC840DBBEC175620ECFB0AAE71902EA5141CFBC0B4473C954C67C62544412DBE142401013D9C984200 -sk = 0610678FF4DC3128E1619F915DC192C244DCAF91D70AAAE9BCBB952354FE199605F4E8F1C3685DA286275601AC97BE89E1D09C95148DCA3A189D52B8C39251DFDD534264C0CAC77ECD7E0A6A4625E95CD0FDAD68522C20AAE8D0FFABC262E95F3A1401A0626EC88F43FD1403B1EA5D052D89D65501E3DFB735BA92EAFA34AE5657322957EDC1DD52FF5620B85412355A1C2C866405269FCEDF0045092A0D136D64834DD7DE0BC7ED46DBC671C5C34AA76147E65670A569B349646412BA9D015155D85BC39075FEAB1DB50042B570DAC10028C016EB01199EB50C03DB532F675E1FBC00FDBF70D756C71DF66BC63831B42AC1F4EBD7B2F5042E00053F14EC10A803B69B5455E80D018263D184B8220300640C0442A82667258387F2A7FDD26425E07E4637F159951E16D460D7C89F131BE2FDBD6C0069C1F781FA789FE5BC00805BC7390C6300C6E075710C0394AC840DBBEC175620ECFB0AAE71902EA5141CFBC0B4473C954C67C62544412DBE142401013D9C984200 -ct = 08A36B7D52A8370AD5AAEC88961ADCE21B28151D3A29C55586730657C3329265EAFD9F5A34E6244FDB1199BD9C8BDE1455EF983E95E501FCBACD909D94005A65696622471267F87844B2E40D3FB17B19CF875876B79986263BB9C1E99D3E82FF3885B8AF9AE9072CE964029FD701C9AA228D4FB525540F03E13BDA0EDABA7B3AB5EAE7044F60D50F61EE3AB1BE1558F45254D7CEE84B6E9529AE78BF24F070873A75B6D901D27E2CF3854BE26A6BA6B37B81B739A6895F18866C3CD5DA15FF135C6DE75A322194452C701BD73083A1EB948095E5AB8B1DF1C769EE0194260DBBE31F8299B790EC41ED291646BBCE2C25D67688ED5BD3C43DC7CD31CBC8657CD61A8D20FC41B4CB1C4B206C20B5C9E54107110187B486D381F1E33D7A5F9D40A222BBD318C5163C4B55E37BB7464F6D1AC678A0450DC4824B3B708C6DE35F1A117D16F4FC939BAF860B01D5F49BF66A77D2A3010DD6082D9B7792 -ss = 1246DD9FC2F3E56DE0C452A7D2B86573 - -count = 9 -seed = B4663A7A9883386A2AE4CBD93787E247BF26087E3826D1B8DBEB679E49C0BB286E114F0E9F42F61F63DEC42B4F974846 -pk = 668881CAE185276DFD6A43218A42DE7723EE833E27D1C7066D86080ED653E65F617A217FD3F42C759B8A8DA42460FFFBF38846FC04FE01A4E96287DB081B3D4E2E59BDB428E60F5ACC955E2EFCCB170E6C12C36F8EE7B9E95E75849D93EEA25695FD495A641730AE6DD041B40200233777DAD6720778A2058FECD4048F1A08DD9796F0B71E269479DDF211882CCF3E50F36C1CAE87412DE375B5AEC42375D05404F4C3780091A98C0281AFEC3118B99BA9FB578F244859243EDBDF507810E6D3D07A0D73BE513B96BD9B0E4101341D69E37F4B2CEC9F64C6465B4C00F87CAB1564A1BD1DBC20B3BC93D77217A1D74FC937C7C9AEE5EC4972C347BE332D2B6E8982F725AD0C56340474601ADDB1AE6619792302AAC9E9FC331A4D0B2BFBFE40905540AF3784B3231E6081E388637E35528963552E1BF79AD06B57B6DAC762D80FF9B0A34BAA7C69287701 -sk = D322D56D8EF067BA1F24C92492B9C56D661BC2DBCB9B8E0FF1621C1B0328A2BE50D39C528D9B2989CA705201668881CAE185276DFD6A43218A42DE7723EE833E27D1C7066D86080ED653E65F617A217FD3F42C759B8A8DA42460FFFBF38846FC04FE01A4E96287DB081B3D4E2E59BDB428E60F5ACC955E2EFCCB170E6C12C36F8EE7B9E95E75849D93EEA25695FD495A641730AE6DD041B40200233777DAD6720778A2058FECD4048F1A08DD9796F0B71E269479DDF211882CCF3E50F36C1CAE87412DE375B5AEC42375D05404F4C3780091A98C0281AFEC3118B99BA9FB578F244859243EDBDF507810E6D3D07A0D73BE513B96BD9B0E4101341D69E37F4B2CEC9F64C6465B4C00F87CAB1564A1BD1DBC20B3BC93D77217A1D74FC937C7C9AEE5EC4972C347BE332D2B6E8982F725AD0C56340474601ADDB1AE6619792302AAC9E9FC331A4D0B2BFBFE40905540AF3784B3231E6081E388637E35528963552E1BF79AD06B57B6DAC762D80FF9B0A34BAA7C69287701 -ct = A8A6B1ABA6920A714B66734100197CDD934E56FE7E98ECB11B6B7A2975A939E5AAADA310E063A0C15A32136F02767A49361635704FF700D019D06583AD98FD283C5138BE0A591430DF5560C9F83C9B256DFF69859FD6D08E2FC811DC59D2D2F081510F9F48640CF261CBCDBA7101D19453344F2CF82E4307E4EC21C09C2A5DCEDF387CAD493A2E1E8D6F657043D207F441605D7EDB21730ADF82B04A364A730A2E728D1B0136EB3F1ED669E17125C6B7E6922B306C3CABC46B20071ADE1021767A8E4977F70868F6FF9F6F9D2AD6A9051374C7F94BBCF1F8B82E3C00F522B515134D8763CD6984BF86F28DF8B766556FDCA9E8697EB4D7F1604DF738AE1307EC008C6A6B2EB5184407F64991A94A49DC0CCE01879EF0A781B7F47A31F3579EF53AAF9B7818E4C818F8F262CB5BAB557D594833F7AA3016EFB757773F8DC9DCA55FFCFFC6D28E3BC1D701A52D911F82CD7F717B3215D5E5FAA555 -ss = B09D92921E68FA2CD595FF094B9BAA6B - -count = 10 -seed = 980D0BA7C8F8B23D0E948A6029FF2659810EA1360064663A8994D0333C8543EE5FF5D6D5C9ACF446E61DC464F792B9D3 -pk = 41DBDA29EE49155B922C93C96B7F12D55194828187F3E11CD38DAD1AAFA7F6A6FA9E1C4C12658F4A7541B2238EE9A5AAB532520CB61E0071B7C7932DE780BFA88D10766CB04C1957C964A850C00D9F3C79DAB54320B5D83C11B831651D7E8981AFA8523C5FA587868EFF138A7D009322269125F89B2F2E1CD4C38F29385000A8EBA4C70D67890ED38317E2FC12BBA2B246CCF9ABED1B05A5D52B1D83BDE8FCC43C5F6BAD013E7C125B72A711CC32B000EE81A50BAB72EFD106E560A93FECEFD96777630F607CF75090C049FD7A9EF88A2BF6F423933909A66916F4003D6A6AB0AE9D192591742E59ED338675F6D21A7B58844CCC054C325E369E3C67B658CC8192EED3BE171888712942826D7A4D8CAB051002C4082A05C7DCC8B4C267A3861AAC5F415DFC6594BDE00BB3164008B7BED93597CF39B7484574704CAD537275B7BEC8C2FEFECFEC18EC00 -sk = 2F1D8A3BEBB34540324B9485FDF3D5BE1913E716E52EF135BBC36077D16C70CF656E07A895F704902629630141DBDA29EE49155B922C93C96B7F12D55194828187F3E11CD38DAD1AAFA7F6A6FA9E1C4C12658F4A7541B2238EE9A5AAB532520CB61E0071B7C7932DE780BFA88D10766CB04C1957C964A850C00D9F3C79DAB54320B5D83C11B831651D7E8981AFA8523C5FA587868EFF138A7D009322269125F89B2F2E1CD4C38F29385000A8EBA4C70D67890ED38317E2FC12BBA2B246CCF9ABED1B05A5D52B1D83BDE8FCC43C5F6BAD013E7C125B72A711CC32B000EE81A50BAB72EFD106E560A93FECEFD96777630F607CF75090C049FD7A9EF88A2BF6F423933909A66916F4003D6A6AB0AE9D192591742E59ED338675F6D21A7B58844CCC054C325E369E3C67B658CC8192EED3BE171888712942826D7A4D8CAB051002C4082A05C7DCC8B4C267A3861AAC5F415DFC6594BDE00BB3164008B7BED93597CF39B7484574704CAD537275B7BEC8C2FEFECFEC18EC00 -ct = DB347701F4B35DA8C147211207E85D9C2C138BD70FB59C57934427752F7E5204E74219DA08D06FCADD41BA4DF8B4BAA43B7B8B060BBC0105157CFCC311115421135229AF37F20F877D8CBD920312224A6D3E14718AF0ED326E944767D2B572A72E4EEBBB24890288765281D638019C75728B3966805A9558316CC41AA941FE60455F07FAB8A3161409CCC84D2D872183797E25888C5ACBBED0F5AF785CCB3967558C98D500690FC821192E058BEB8234CF709E7478911CBBFAF062DCBD11982973CBEED625FA2DFB561EB458109E821FA20DBDBC54FAB936A173FA017BF53B17B51F63DA3BCD5EBC83F60C9B6D546C48262E7E8AFF53388EF6FCB8D4A94CA003F24FFBDFD262CE5C151F9628C3DDED96226F0110FF0D524B43AAF19BB4D659D8F2C4CFC5220426D0DE7C365D6141445F9F9CEC0EBA4ADCF726A213138543FE79A72046380DDB831AF0004EE70EE09B57FC1632907938568F14AC -ss = B49ABAAE30A790FECE54A3F113FD575B - -count = 11 -seed = 6C029462CA42ED520F10A579F52687101105E0B90C6E7BFA582A4C112B579D5AD0A0ABD38F72ABCFDCAAF5893A112BDC -pk = 3727C2F466E3E3209BB9A28D2E721BC651AD9D0F06F50347FF911F19D2E9DF1AFB7AADCC589B7E40C25F0108066F5D0DC02E243A74140188A075505372E2981C2BDC310625E5CABEA344C18D8B14D0F3793A47C45739F89139C1E19DB5DC708E607DA782EF5EFF5E07960109DB019C2B786D515A479BC30B4727D458A50680668CBA757C6AD86408931424697B71B5A2593547CB56B21A0C420708640556F80A47A9D4A000593601D8010205A02E167BF296D5AD0625B294964076A507594779DEDCB4D1E423F83FCA1C63B473D3A69AC77E7A6729DBD925436E0300BBD20C06ADE192EDAFAE35E724EA8ECE69CBD16072D756323C15D3270FA9D83F62EEE2C06BFF4D77C70025AF9D5BAB73DF9F6D375F5F01322771D24F67BA11FB7A89538BD274AFFF7C50BC5A471C806F7712DCF529B90238667F4F1050AC8212E428F36BD0FE6422BED3AFC5AC01 -sk = 31BEDA3462627F601CBC56F3DDF4424E204C429A2AF01AA8E9151242EFBB30DBD557B64979456ED0E3E8AF013727C2F466E3E3209BB9A28D2E721BC651AD9D0F06F50347FF911F19D2E9DF1AFB7AADCC589B7E40C25F0108066F5D0DC02E243A74140188A075505372E2981C2BDC310625E5CABEA344C18D8B14D0F3793A47C45739F89139C1E19DB5DC708E607DA782EF5EFF5E07960109DB019C2B786D515A479BC30B4727D458A50680668CBA757C6AD86408931424697B71B5A2593547CB56B21A0C420708640556F80A47A9D4A000593601D8010205A02E167BF296D5AD0625B294964076A507594779DEDCB4D1E423F83FCA1C63B473D3A69AC77E7A6729DBD925436E0300BBD20C06ADE192EDAFAE35E724EA8ECE69CBD16072D756323C15D3270FA9D83F62EEE2C06BFF4D77C70025AF9D5BAB73DF9F6D375F5F01322771D24F67BA11FB7A89538BD274AFFF7C50BC5A471C806F7712DCF529B90238667F4F1050AC8212E428F36BD0FE6422BED3AFC5AC01 -ct = 1727DC42DF2D04F0AE833C20A9FD83E230A810C1660204260F8CC4C1129F57B5FF160AF7DEA5A060F495B21D83347118E581647B4334019BEC70D8EA75F2D19228505F32831B505DA9139FAE8A9265CD475198352B2E10B0E4C4B44FE1227768302B16DF5CFB4C9CFC5B5F1EDB005475046B86CBB7D572283B0E85D7C1F33C6D57D8CE05D8A4DBCA3372C497C1936D35E0013D4BB585F080C88D9CE375BDB6BC31501A31011E5CB262E82DE1D0574623E14DC733B5D7A8644DBC0175AFAFDE58E5CCAD7989D9ADB4EAC5029FA946BD509B63BE8E6E41F41C1898AD01C94103D6A3E17B96B7C19F8F6978B8C6F8BF12187E61FF80B25632ED37AE2B8EDE698A394CA3480179E35B3A4E47CEA3F26BB74642DC00069A058757D75F26C82DA3881FEB28A875CD4B1CD775B7982F9FC2702C0AE7A859CCB880092356824563ABB5E79648118FD6C81D591D0239EFD9E6DAFDDCFD07372FCB258DACFA -ss = A663DA396F96655AED1602ACFB1C83B3 - -count = 12 -seed = DB00120937570D62331F4C3F19A10465231EFF46465CDEE336A0D46AA1E7493DF80F18617F9FFD0476CF7784A403EF4F -pk = 4CA4DAF17B19813A22D6CA2AE239BA3E2C5593249E1D798D0FDF57E74596A18760EF706784C677FB7390223AFB26A183B12FFA51BBC701C88BA3AAA3D871CCDD7C2936553469527228DCB18D1DDE2E3339DE94DCAF7901C4311C67BF2FF055CBBB7F13720F2B5026158F266ECD01C27130547A89C9ABDF2193A554934E121B8EAE74C862D9236C1D94B4318F643B200EEA147952384421BA7EAF6BCA50B48866D025A9E101C287A3CC1EBDE69B35A6BDFC823D904C8B6885B412E7416FCE1AE03F931D221AB9BE8F73F66A69929D35FDB291CD25D351647CC59B3202F4255C29F382E3E041407FCB2968AAA1BDE8FA7CCA4C1C84E76BC79D9D2C81C520670FD5E27EAFCDB8CF900947AAC8BD975030EAB9B301BA1B2D3199699A476CD1C3BCA367175C06AC5DBDAA69EF0122B620CA218FECE279D8D9921709E869BA5867098A2ABACE72D905F9B30900 -sk = CBDFF028766D558AF4466EF14043A1A964288E066695F6610A3FF37C401463403E91F53E7B89CED7721756014CA4DAF17B19813A22D6CA2AE239BA3E2C5593249E1D798D0FDF57E74596A18760EF706784C677FB7390223AFB26A183B12FFA51BBC701C88BA3AAA3D871CCDD7C2936553469527228DCB18D1DDE2E3339DE94DCAF7901C4311C67BF2FF055CBBB7F13720F2B5026158F266ECD01C27130547A89C9ABDF2193A554934E121B8EAE74C862D9236C1D94B4318F643B200EEA147952384421BA7EAF6BCA50B48866D025A9E101C287A3CC1EBDE69B35A6BDFC823D904C8B6885B412E7416FCE1AE03F931D221AB9BE8F73F66A69929D35FDB291CD25D351647CC59B3202F4255C29F382E3E041407FCB2968AAA1BDE8FA7CCA4C1C84E76BC79D9D2C81C520670FD5E27EAFCDB8CF900947AAC8BD975030EAB9B301BA1B2D3199699A476CD1C3BCA367175C06AC5DBDAA69EF0122B620CA218FECE279D8D9921709E869BA5867098A2ABACE72D905F9B30900 -ct = 78D61E2AE434AB6A7F0DE50A61C5E0872F73C33FBF79B1F47FCAF705467BAF5C82A0BAABFABB0AAFE8B6A8547FD2290955B0C7224164016C1A2CFD68974B6BDB93B57CA0E7F3268E75A5C21AE514FC411D2C1257830723B00025B49E2AFEAF7CC5F0E8CD05DA54FE104C1EA79F015B5B25CB39C3309A3AF4540AF404293B62E371627AF7EF702D64267F003116B3056418A8480ED137DEFEBE385628CEE94EB0A260ED9601F6399DA434DF6C29994705B0EA5A8E0836E776B70A8F638D690E58FDEDF8AFDDA6FA6A13DF274FCC37ACFB313F59CF928AA7911D1A400058581BB7EDDAF5313826B1A30F3E18E4568A2B96EF83E951DD17921BCB419C22ED246E8B5A90319CBF5474C064D611C34DB82B3234F001FBCD73882D42D12F310B1748C51350F31594AC61D95A880597BBECCE8B5FA0EB17D83F714CC0338C615639A3FCD718736E7085E83CE4016B9DD7B06AC35D1A127A4ACF6973862A -ss = 040192B84326A814B18C80CA838F94C9 - -count = 13 -seed = BD26C0B9A33E3B9B4C5D7EA32D5BD1FC371015BE163C86F584E49BFD5362C8D8341161CD1308115B2A03B7E5EADDD418 -pk = D5DB4E282AE88F7CF3D2714C2603A73464BA1480BB8380EEAA4438FB56497079A962AF996DDD5CEDD9AB826042E3494BD4E43697073900816D69587993486898A4C70E490ECF1241C39220C736EE270A041FBCAE61786174E677B5853B86409381D9A44535C7CADB1FD7BCE8EE00B0114826C33A4A86B4060F19A27B42EE76C884EF687CE597FCF2BCDB51F621D50CFB0823A17660D0CDAC36851ED0D59AFFEF4CECE68B011AE1BBA7C2C42FF094A4FA0451973AD866477B95C9361CF5DDFC1D94493A55C1B2BBB011485D4F4F6EEEC0A3530AD4FD3CDB6BB0C8840178BEC8738B648C7BD79A49A2D5205F2EB0FCA34883E99835A631A83E779298D66A4D507F7D5B2606688A453BC0FF6A30A5EE91B417A401A4DA09E689AA5BA84C04EFE246906E915832F873B83786DE28FE72D0DAEA035747E8FA556E622BA9E693487500E6A44BD5B6E1AB1C7600 -sk = 4C04310BEA66305C6CA8BA6B8F61CA96E9EDAC80932AA0C57BAA480CD8A5BC44B98B1F0AE30325D09046F901D5DB4E282AE88F7CF3D2714C2603A73464BA1480BB8380EEAA4438FB56497079A962AF996DDD5CEDD9AB826042E3494BD4E43697073900816D69587993486898A4C70E490ECF1241C39220C736EE270A041FBCAE61786174E677B5853B86409381D9A44535C7CADB1FD7BCE8EE00B0114826C33A4A86B4060F19A27B42EE76C884EF687CE597FCF2BCDB51F621D50CFB0823A17660D0CDAC36851ED0D59AFFEF4CECE68B011AE1BBA7C2C42FF094A4FA0451973AD866477B95C9361CF5DDFC1D94493A55C1B2BBB011485D4F4F6EEEC0A3530AD4FD3CDB6BB0C8840178BEC8738B648C7BD79A49A2D5205F2EB0FCA34883E99835A631A83E779298D66A4D507F7D5B2606688A453BC0FF6A30A5EE91B417A401A4DA09E689AA5BA84C04EFE246906E915832F873B83786DE28FE72D0DAEA035747E8FA556E622BA9E693487500E6A44BD5B6E1AB1C7600 -ct = 28F71DB04148FC2AC4EAE01B7F0AD6C382428CD3EC9875948A0B1B9FE4DF00A8138439F779BE259DF85AA61419435B7E2318E99A982E0117FBCB8FBA8C0CEAB5C6FAAD44482FFEC27A688BD49E28463ECCB25D08BCF7604ED2FBBAB6640A4B87A650B41621B72509FE0CDFF8E60071E70A61583C0BCA1BD0F4FEB57BB57DE922D36E4A9D52C08FFDDB4F54859BD796FD7183A2ECB695B68A17C3C68901D121613BE0297400732EA38C548CE390F4F8F0688709C7079C7EC42FE632E954057024C6C459AB474B6CD16D49D00C41CBBA257D0E3027A02BC29373746E01D0326253B0EFE5F839B6DCD0085E638A9AEBDB07FAEA9FA9CF54CECE8CB65069F4D7A9A82BAB6AA537DB3BBE4E84EF182DADAE6A03E20146ED55CAD3CBADC5C5AA963BB41CFD8EC787BABD1CDB329FCC2CCACAE2DEADB7DDEDA266322F8F338BE09A46E468A6F2CBDDD4D0773E00C665870DBBB3E529CDABC10176C0E9D4 -ss = 897ECF117CAD056AA7607F485F5EDBBD - -count = 14 -seed = E2819EF86853BCA1B9DEE7EE1C1619988964F9A913E635AACF0D96CA6E0300D084329DABD8F149E24176D22757404260 -pk = E30D37CC8CB6C2D560EDBF4A063539BFDFAA52D97802652A299A955D18FF253CE8528339E1539D60216D16AF30DA5C7C220FB587536100B638DA38F505FC6D8724259501E7FC037F781BBA379CD3839867D290FF2679C925726DF80F09C1C11E16DAB4CDDB647C716623B96A99018289196013C72B51D9C056F07C58F62B4D7E1B45ECD4AC34A8F5E0F3A7A64F3ED0F3423A04D4C630CDCD832BDA5CE714A36EC5007DAE0097883B09743D3D0D2BB23CDD2632AA0350D58E16B2C04E914B5E4904E4BC79F30412784EE926A8450436B0843C64FBC4B29E996CCE1501A0B006A2CF72B4B501E86FEAB5DA59E67A9D7B56D053E79E2293E3F84D5CACA9F101FC146A74E029B136C56FFB3C734D5CD6F99A6AA600FE427A45F7FF75811766B9AD018921DE96E8AF0227405A7A752448095BE78FA16DA7B9A8439A4ABD0D29DC47B128A8777921DC2E73E101 -sk = 38A0D5F41D7DC1896EFD1B45B04856342DFA1132C7F742C89D311C9D211ECC47B0FBD1966E7DDB27197F6401E30D37CC8CB6C2D560EDBF4A063539BFDFAA52D97802652A299A955D18FF253CE8528339E1539D60216D16AF30DA5C7C220FB587536100B638DA38F505FC6D8724259501E7FC037F781BBA379CD3839867D290FF2679C925726DF80F09C1C11E16DAB4CDDB647C716623B96A99018289196013C72B51D9C056F07C58F62B4D7E1B45ECD4AC34A8F5E0F3A7A64F3ED0F3423A04D4C630CDCD832BDA5CE714A36EC5007DAE0097883B09743D3D0D2BB23CDD2632AA0350D58E16B2C04E914B5E4904E4BC79F30412784EE926A8450436B0843C64FBC4B29E996CCE1501A0B006A2CF72B4B501E86FEAB5DA59E67A9D7B56D053E79E2293E3F84D5CACA9F101FC146A74E029B136C56FFB3C734D5CD6F99A6AA600FE427A45F7FF75811766B9AD018921DE96E8AF0227405A7A752448095BE78FA16DA7B9A8439A4ABD0D29DC47B128A8777921DC2E73E101 -ct = BDC7C8F76ABA0194AF62D89B9C5D5B0BFC4D761DF50F37B6FEA6B2152D3502D481252D8BCA9607013BA0D8BBE14C773E29E8C6B26FBB01BDA396F0C79EF0223F485A0D772271421BB304C8BFBC17CE0229193FD572DD55F22232075FF92CF9CA401968A740FF9223438AB46453011B913E46BA24837B084BF78F50C08F5688E339155FDDEFC02EA73FCA112CF337994E99FEB4197FE1DD3C916190D70712E5A3E044FC93012D6DFFFA2AE0C9E7468FC0BF18F7215586B893B1A82522CCB49C8BBA4958D086AE447E3F728CB5D226C0E3D8441B5AE8DC35471E7762005E02E90F5967B733BBF91892C6161DF290FCEFB99D62EFE5699BCB5B46461A582B95930526661A4DED3DDDF7652FA26153F14441B8E701F61F20D3AB5FDC3FDA0BDE5404C526D1AA0D809231C0DCBC0A96E9535A6D9C7ED2FED9E92B84EB16802BE9C9D32EDF69A9A6BDA30E2B00F2B73B108499499829C416F24AE55877 -ss = 694A4A8AAD90783D407AC750E7B787A1 - -count = 15 -seed = 669C4EF8A051CE201DA65FC4BC34D398EC1F806276FC5D987AD71D93BC12DC8F107B58BE6E8422A0795C88CB9A0E7488 -pk = FE2CDF7A0ED6A9DACE00C76608D0BD33C07C8BBAC34F9558F69AECCAE7343179A4EA723676C7BA725080FF81B01C9B96628E9DBFC8A000B48679C63F10AB47077ED339F8304AEDDF12E5A0B07C5F618B82F55A38BF9F7A8BC609B93F585AE9A84C0BB7666320BA0CED79A14FAC00B75391565182BB83C1437C2013965EAAF5D308B3BC4B89F2008BDE4305580370A4DBC40BDBC18E77D7F646CC519F503D5627673AD6BE01F5480D2A33AB8BC0A595DE3213D679C2477399F42826CCE2E9769F66EC9B54D4C43C82229DFB98D55EF5D4CC5291CE9F5E957035AE8E000402F80121D9E7FA3F013247950C54BA77B5F60D68C1D81FFAD450F93179B10A73F84B96A12273338619984B6D14BD3F5EDE3543D4F8017854FBA247E8BF44AF7115D269E90B6573694E7EC8BDFC5130205E1E0C2838D52A0CE794025B68674382025F92B7EE382E4E706FE1B800 -sk = 97B5665676E59E3538EBADAA8CD50DF142AE6DC4AE262206EBABA48C74A234C1138525803526A8C29DC7FD00FE2CDF7A0ED6A9DACE00C76608D0BD33C07C8BBAC34F9558F69AECCAE7343179A4EA723676C7BA725080FF81B01C9B96628E9DBFC8A000B48679C63F10AB47077ED339F8304AEDDF12E5A0B07C5F618B82F55A38BF9F7A8BC609B93F585AE9A84C0BB7666320BA0CED79A14FAC00B75391565182BB83C1437C2013965EAAF5D308B3BC4B89F2008BDE4305580370A4DBC40BDBC18E77D7F646CC519F503D5627673AD6BE01F5480D2A33AB8BC0A595DE3213D679C2477399F42826CCE2E9769F66EC9B54D4C43C82229DFB98D55EF5D4CC5291CE9F5E957035AE8E000402F80121D9E7FA3F013247950C54BA77B5F60D68C1D81FFAD450F93179B10A73F84B96A12273338619984B6D14BD3F5EDE3543D4F8017854FBA247E8BF44AF7115D269E90B6573694E7EC8BDFC5130205E1E0C2838D52A0CE794025B68674382025F92B7EE382E4E706FE1B800 -ct = BA99787C22449C2F8C9BEA41CE3D6AF52BDC6AC86EAADBCD63FE9CC2DB9289E56FE6785B1F1223F66E2623F5E0C81C1DCEE787DF1AFF010EEF7E9C9D131629A4153B3061B5BA517A66872AE21EE6CA7C1882161375A3EDFFE6CF04FFD6392932CE627C0739EEA06D7A4A3DAE2A021FA0DA97E15E0DE5933A7C71FB5A9F1DC7882A8AD316AD002261FACE947CA78903C3A013268413015D19F643BBB4183C01041323698600EC8D35DCBB2B757EF32E91A1E8BBE12D9019FBC9AD21E4295131670630E461A07BCBE9097793C7C6EC55688A0B6E4D5C1ED9E8448CB00146F70CA8BD35ABF9DA05ADB017ACBE2FB602F379B8FD1147CB11647ABEF755153060B7BC476B756251C1839CD0F3E1833EB377294B7500A86BF5A6FFA4F8753A09E4E280DFB823127C38C82A39F8CF499847D3F81E1E9574C9119C60D37C8B83AFA661DA9904F31E3667B031B50120B4C3560F5312DB42EE0A1C83C396E2 -ss = C13E65613329AF85AF74CEF46B8384CA - -count = 16 -seed = 9DEBCCFE818F6B5204DB4EA09C03EC9A19DCF1629C1527685B8A29776BB1DAAEC45F8ABF8F0ADC9A8C8BD6E2DF6D8048 -pk = 79D967425432D24A0C3977DAD8B1B74440AAB34950413665F6F0B5CB40C96B78550C950A5F7CD2AAD088AEEBA931F97D0277B11964E501A6A741C08C6445D013B8AAD9CB2DF9B88F9A08E481513016CD46DD0EE1EB56732369A8C8CBA34A2F38947E2290FE61593BBFB1D28DE300CD6F0A175773FA411BA7E6A4ECC136561F1F98DB691603FC53E71DDB911673AE43AE5C6ECED2D899CA95EEA8C26163C5671EAD30F6D800F03DFB43C7A46C7CE485993A489E785A396AC1719C30F751AA9E9A6BC7A0E28FFB7B60A4F4EFC95FD3D8B3694155CDE492DDD10D5A1902C1D096FFD81C8D771E3F00026A9EC646CCDC973A0D4F92C31A1A7EE05A8CC41ACA004BE01DF8A312804F1F905B6F7F099C99885A8213023B2863489779C86C1DF6D9AEA76A1586A4EFDE52A965516D457EF6A9537B7FFAE6B5D31EE6F1580C0DFFEAA7C9C00E3FE7D48720CEBE00 -sk = EF99224A03A85A46EF115474EC5B5D628BD0CF95F3E495FD375B444F9B9C1FC8A23857EEF27896A08FE7B80079D967425432D24A0C3977DAD8B1B74440AAB34950413665F6F0B5CB40C96B78550C950A5F7CD2AAD088AEEBA931F97D0277B11964E501A6A741C08C6445D013B8AAD9CB2DF9B88F9A08E481513016CD46DD0EE1EB56732369A8C8CBA34A2F38947E2290FE61593BBFB1D28DE300CD6F0A175773FA411BA7E6A4ECC136561F1F98DB691603FC53E71DDB911673AE43AE5C6ECED2D899CA95EEA8C26163C5671EAD30F6D800F03DFB43C7A46C7CE485993A489E785A396AC1719C30F751AA9E9A6BC7A0E28FFB7B60A4F4EFC95FD3D8B3694155CDE492DDD10D5A1902C1D096FFD81C8D771E3F00026A9EC646CCDC973A0D4F92C31A1A7EE05A8CC41ACA004BE01DF8A312804F1F905B6F7F099C99885A8213023B2863489779C86C1DF6D9AEA76A1586A4EFDE52A965516D457EF6A9537B7FFAE6B5D31EE6F1580C0DFFEAA7C9C00E3FE7D48720CEBE00 -ct = 509F931C69B91B463F9184495F8036417E4A7D7E59085CE1C500F438B088FF86806487AEED6C644FC04D6C470796F39C18CB689BCC1F01DD65379668EFB5749EA8002F5411B131A6A8F733E7DAD73C553EB8A62428F854D8244BC5137B921ED3F5C5D3E85E981FCA403DA91106023C47ABFF15A8B8B12BCAFFB33E0657C4118C4F9B0B632C77D96807AE509281207E157577E51426897B1D3DA003A30AC4813D725CD8B50141968CCB11877104AB6BC2F30BAC781C228C0378BDF38C79ED5772E505F3B9EAB2F5F075FDACB1C0FBF54B2003EC1EA0436D18F2209100391321A03A5EA2100AAAB510267C97A4C51E99BA40F457B831B8DECD43C51357BB711392B9C60A78B65EC4EF46A9C7A20050D690961502F2E58D319EEF77CA1AAD1E6BEEB36EC89619B38DB2862AFDA4E4F48C359CBDF49BFF88C359BC53EE9416F2B368E410270CA28F498F7D0055AA195855AA118D011490262C8875D8 -ss = 71CF8ED3966D7D1DC1E355644F91FAC3 - -count = 17 -seed = 8098AE7A92C10F707D405F7DEA02C2EFBEF44EFA132BA8AEFE81BD45E543ECEC74F10920AE48A40B0653D63532517F2A -pk = 79E0A7998D558892479C2B99DB360986D18A7BC05EE4CAB08C8EACA5FB1055F535DA75145F817CC1657E756E107AE19D43E5D1C80E7E01AC367F1CF7BBDB785FEEF6AB0AF79504C9561FCFD0EDE7AECE5C70DE22F0D81E7CCF61E248D2F0AC8C556BFEFE25DDD11C06BE87068C01035499FA9D6B54E50D3670C0A6B018F5A93331223B6CCA306B8CF5D3C7F3098A5D320C7C345A329B0A457177C4C3C5B2E18251EE885D017C123958F3AE6E47E38AE36E339038DCCD619D611BC1C303BB0DB7575A0A1E8D64E8115EDE663A90A995896D48CBF2150F30D1037BF501119D23ADCA8E66C78AEDA4E418D1CD4E898F95583C892784E563BE2AB786DD19C41BA07A915685E5DA73830860851F796B89CF02C85F0178D832055F8E098A2C942DB4146B2EE69FA5DAEDC462AA81695F9C1DF98BA2CD9F0875BEB1F8E5D34573610E796A3DA5B112C943888401 -sk = B12F6FD965EA9C5B947DB80FC60C83D5CE44DDDF0CED4891F7CDB79060DABDD40C6B00BCEADB3EE4D5D7E40079E0A7998D558892479C2B99DB360986D18A7BC05EE4CAB08C8EACA5FB1055F535DA75145F817CC1657E756E107AE19D43E5D1C80E7E01AC367F1CF7BBDB785FEEF6AB0AF79504C9561FCFD0EDE7AECE5C70DE22F0D81E7CCF61E248D2F0AC8C556BFEFE25DDD11C06BE87068C01035499FA9D6B54E50D3670C0A6B018F5A93331223B6CCA306B8CF5D3C7F3098A5D320C7C345A329B0A457177C4C3C5B2E18251EE885D017C123958F3AE6E47E38AE36E339038DCCD619D611BC1C303BB0DB7575A0A1E8D64E8115EDE663A90A995896D48CBF2150F30D1037BF501119D23ADCA8E66C78AEDA4E418D1CD4E898F95583C892784E563BE2AB786DD19C41BA07A915685E5DA73830860851F796B89CF02C85F0178D832055F8E098A2C942DB4146B2EE69FA5DAEDC462AA81695F9C1DF98BA2CD9F0875BEB1F8E5D34573610E796A3DA5B112C943888401 -ct = 0B2DF56B13EA8EC412B34EB6B795907BE8CF9285D0F54F4BBAD2F616AD052BDC343BC037B7CE43338824A080B168D55F19F01675994401288643228347B9CBBA4F081773FDC6AA62787A9E9E289A0029D53F64019BA58546C006428E2FBE75172D3357F36D0CE9D667B72571200223CFD443E4A1896C1585A3A2B8AB8BC74220CB17A6A7ACD6A37F3580671FD2DF73028AB52E26E74D53F9BF3D709F3904706B667E9A3F017274A3AB8BAACA666693C072E6489568B3BC1C17652D7307FF3011712C385E36F3AF2DABE643B2FC3C350E4C02C8E828E7B9A297F2B300440EEC731D384FD2DF79B611FBD9758E118B64AE153B67530A188DD19A642AF131E90CA6DC213292B050432544D5ED45C587437F5B1C0253E620F09F8692D5D134D318B71A5AB394CF61D3373D052F6658F55E0E355AAE8ED0DB3F5483FA7FDE38F44D102D71178CFC8CE626D8002E49A160432A1CFA03473235E209A8D6 -ss = FACCC640638E1613E321D6A9BF931BE9 - -count = 18 -seed = D5F23808871544E9C1D6EACE2028362B48E225312F77663E9F78CAFEB512B908CD9E25875D61A16EC615F4B8FF826856 -pk = 9E48237FEDDBA4C4E8E9D431FA629F90A93B80DA0311A7DC67FD8E99EAF2C786DF31118C1A3107A6C1A473A295F84AA95AD4A9B6621901CB875A9627E676338F4BFD14F052D7FD7C256177F7A31DF73C156580B124709BAB66B4A05D892F24D7B9D5412A65B3A21A0165D8D0F30036AFAC724353B41204A7710D07582EB3F575937BBB6CB410AFA5A44DD9756E35B89A9776E0D55E37D25E6C91AFCE336D38FF840ADE3A01FE155957CBC62FCEC03481C775BE0F27A563D5C9FA589159519085080752E8818DE911590E4D97CAECAFAF87C0001E5455474EA8D3050052DBB3BA1F72E1B1A7BD411B629D7D22315EF5C4CC1279B7FF3C84629CF8374E59294722BCC5E2AC38C9E7357A910D84ACB7F395D9D101B2F291ADBAA4AB888AFB02FE84747BA6DB45D23FACC2D4A0E00DB47D2ED9E698733DE9D3EB70781655E186CCA62E213B7F334023715B01 -sk = 9F52AF92CA165FDC38788F2B59BA02E0D21361DEA07AA8A47E2CD4A35DACA8B09C7145DFB568DCA2D01D98009E48237FEDDBA4C4E8E9D431FA629F90A93B80DA0311A7DC67FD8E99EAF2C786DF31118C1A3107A6C1A473A295F84AA95AD4A9B6621901CB875A9627E676338F4BFD14F052D7FD7C256177F7A31DF73C156580B124709BAB66B4A05D892F24D7B9D5412A65B3A21A0165D8D0F30036AFAC724353B41204A7710D07582EB3F575937BBB6CB410AFA5A44DD9756E35B89A9776E0D55E37D25E6C91AFCE336D38FF840ADE3A01FE155957CBC62FCEC03481C775BE0F27A563D5C9FA589159519085080752E8818DE911590E4D97CAECAFAF87C0001E5455474EA8D3050052DBB3BA1F72E1B1A7BD411B629D7D22315EF5C4CC1279B7FF3C84629CF8374E59294722BCC5E2AC38C9E7357A910D84ACB7F395D9D101B2F291ADBAA4AB888AFB02FE84747BA6DB45D23FACC2D4A0E00DB47D2ED9E698733DE9D3EB70781655E186CCA62E213B7F334023715B01 -ct = A57904C3BFE47E496333B5EC33D60788AE7948A6C055E9D7D59DF4AB7C02AE7E785A2F38FE70E6D0F9086AB5E020D399348F27C0891A02501558C9E97B46A444A6AFBF811DD7D11CF79AF001542A92FA0E59D6C5F927FA2D2CC9727B0118927D500B0DFD05BAF7FE5629314F2502F22ED8ECDBECB954444984EC84E509893C70C65E4D497139986F55701BC62CC33C97283EE5BD5C2832571731BDEC0A563966854382A90114C5F9CD142F8369F4176E08F563321F662F4D3AFD861239436AA25F10EBFDFD4D3F8C4A832E3510A3704C1DB4C206262EBF8B41182901E7A4DEBC54FFA218D0AAE0CDDA2C2E5909ED71E62E0FAFC99BF53AF55E4BEB2998D0C2221907F14D35751C0B474786456CB14DA7E79A01A6678BA6AA60FCF8666822F6FCF71E1367DBDB2E6E6315FE4ED24A2351A3DB86278147520DB6F96CEE79FD812EE76CB1CDAC8F3424E201792808BF5A73344CAECF081E2AD720F9 -ss = 019ACAE70F324EF52D715966BDE79FBA - -count = 19 -seed = 822CB47BE2266E182F34546924D753A5E3369011047E6950B00BC392F8FEC19EA87C26D8021D377DF86DC76C24C5F827 -pk = E78527604A03B2262803424C585D407333700CC6415EA598DE84B3A00B553B2CC4EE433D96D5DA3A007C6A18F715F4D90C8CD4DC43F200772D2606F083D85638C12B26512093D1A3724E9EB4374730BAB9F7D7A30ADAB87786979D720C1E337893BDD053AEAA6AE384A972585D00062E8D8F4853FA84E5C1715559A090F1EED6C1E5B7F812B4D3CE8D433E518A66396AC07223932ACB9772FDCA3A70C552AA96AA3EA90F02A2BC8C3C2378D927CFB0E431EF704CA1BBDA0B047D85116FDF6A8DCA906689339DC809C2C00AB2D3C9F88FC9196D21D1CCDD947CFB0A009D14320960AAD5D5B5742CC5FEFE262D8C5C150C7230203D6A1872F84497F20B20F57196F715B528773200A1A48AC8157810A2BED91000DDB9C3E5AA0CAD8CD3EC75F0F1852AF7645CBD60498191E35EEB189CC31C075A472A60E8AA4E9B809CDFC4B2E2D8E9595ED790FAEBA500 -sk = 851EA90FD3854CBF28FE39FB81F68E4B4C094361B4B3511F46403B2955F371F12DEB940ABC80C905BBEF0800E78527604A03B2262803424C585D407333700CC6415EA598DE84B3A00B553B2CC4EE433D96D5DA3A007C6A18F715F4D90C8CD4DC43F200772D2606F083D85638C12B26512093D1A3724E9EB4374730BAB9F7D7A30ADAB87786979D720C1E337893BDD053AEAA6AE384A972585D00062E8D8F4853FA84E5C1715559A090F1EED6C1E5B7F812B4D3CE8D433E518A66396AC07223932ACB9772FDCA3A70C552AA96AA3EA90F02A2BC8C3C2378D927CFB0E431EF704CA1BBDA0B047D85116FDF6A8DCA906689339DC809C2C00AB2D3C9F88FC9196D21D1CCDD947CFB0A009D14320960AAD5D5B5742CC5FEFE262D8C5C150C7230203D6A1872F84497F20B20F57196F715B528773200A1A48AC8157810A2BED91000DDB9C3E5AA0CAD8CD3EC75F0F1852AF7645CBD60498191E35EEB189CC31C075A472A60E8AA4E9B809CDFC4B2E2D8E9595ED790FAEBA500 -ct = A6D8DC0B0DCFFEF0E34728FE4DE79A1D59FC9C9AA0FB6361EE18451550D69B313758E1DA7BE3C9E6783C16DEB7B00603109ACF879C56012635C2925DB4DF0D2FEAA89134C1FD33A487C852105DEFA6DF4BAD559B645C96049811445AD49F1ACCA668CFC12D0561747C4A251CC501A6751C36ADDC183AE86DBE1794DCD7AEB9CBEA6ADF4F18011AC2624D0B0E4AE3377AD2E4E7458693FB3D04C4020F3A008988F5DC8F0801232AD1725DB94C378425EBE6CCB3C6AEEBB9A774663AA8A72988A2C6380F56F2FCCDCE3497903B9E9AA3EB6C0809F21ECD5442E8AECB01FCD8CF9AAA3BE92A2FB0D5D43E5703F8939BF15AA6935997B9DE26A4D83FC4A9CA42D4E89591C698640FE3C5E5DFB925076A393B74CE014E8D257FA543FB29F915C5274F74EA862F6065E93FEE25845322ED62ADBB5A0709C7072F520C9B220FE8EFC67B3F5A9AC21CA2B12EE7001A8BCD24CD1F7776630D9F3025034D2D -ss = 031C5FBEE7FD72BEA84A703A739FF9B8 - -count = 20 -seed = 81401DB81138D6874E91B7C11D59596E4ACE543F5A3471B6FB00999221765FEC3CA057ABE20F03B2D59003375FD71FE8 -pk = E5ADFE2A2841DDE0CBAB4F9A9E8D4EC1A07FA5456ECC04C76AC192B968BC030073D066B1D9129D6B6A74092500E3E812B18E7A77959701696C5C603FADD6E1415AF1F64FDFA173C967195A6A018F3946C3A446AE08013EB73ED4F83BFA103F1E7CE0DFC46D566021C306D197740041802A3CA75CDD8984AD4534D7988A338A31639AD33090488EB76B3120346CF64350EE772C8031A74C7B1362F96A6E969D11B61EDEFF014647540DAF3C9A78BC2975CCE93A2A02B9EF54B3F767D21A5FE9C2D885716079A207BED74B55C34D1D2E4FB8243FCD839916CF1B3F16009A2118E0F012AC828117209E74CCAD66C80D9D7B4BA06330DF23A9122D82A5043C31AF133A6D3A99169C17FC8AF5A42765FA3D96F26B011B9DD08673C53691B011DA58AE666570F8849EBB66855BFAC516720944B65A4B71D6D4F35EB4CBF85E61C02FA9347EA39D8042ED292302 -sk = D304C9389CC973477F169788ABCB9D517E067CF2D7B0AF8B6621970053836C9B24568F4A35E007C88CAADE00E5ADFE2A2841DDE0CBAB4F9A9E8D4EC1A07FA5456ECC04C76AC192B968BC030073D066B1D9129D6B6A74092500E3E812B18E7A77959701696C5C603FADD6E1415AF1F64FDFA173C967195A6A018F3946C3A446AE08013EB73ED4F83BFA103F1E7CE0DFC46D566021C306D197740041802A3CA75CDD8984AD4534D7988A338A31639AD33090488EB76B3120346CF64350EE772C8031A74C7B1362F96A6E969D11B61EDEFF014647540DAF3C9A78BC2975CCE93A2A02B9EF54B3F767D21A5FE9C2D885716079A207BED74B55C34D1D2E4FB8243FCD839916CF1B3F16009A2118E0F012AC828117209E74CCAD66C80D9D7B4BA06330DF23A9122D82A5043C31AF133A6D3A99169C17FC8AF5A42765FA3D96F26B011B9DD08673C53691B011DA58AE666570F8849EBB66855BFAC516720944B65A4B71D6D4F35EB4CBF85E61C02FA9347EA39D8042ED292302 -ct = B44C6CB690A599DA437ED550DE19E05B6DD374BABF7F189C46F209CB261D4B97ED66370B1473DF217BB466B671C6E428E996E7491BEC00E407B27259B3DAA431DEEAE11D337F8B2D9758675B37D1A550DCECB489A5627FD4AB9853B1329ED6A79083E5351CEA79E2544BD4BBD201B81F8F66078690C7C64162F7B4ED2E92A5F806D5B6DABFA4B29D80E6B885695377E6CFEE0A8BD462AF401F62CBF52FCFD2FF7B911D2D02ED29685034344E5531EE7610AD97197CC38C9C935A2096400E196D13D883A7F0583029056F7323AA4D89DD8E775F189B253FC8C7EE4D017E1138DD5317812A4744BD3DE8DA014D29FAFFB81D3CC751701A65BC1539F92FB92281760B69EC962AAE6FC762D579F0166CFFBA0D96019D1C5AC299FC2FAD6E55FFCF84B6A9363A0129766D94B218B7C556B938B6CBF510B0A40D026D99A2FC45E6F48BCFFE7D8AED10C24EBD016261622D7CD57BAE2A0BB48E706D5124 -ss = FBE3D8D78996D62A3652F8B86D15ED92 - -count = 21 -seed = 30B5DE5B73681EC08AAA03F6F2D2169525D25F4042A5E3695A20A52CA54927B85F8BB948FC21DF7DEFC3910B28674994 -pk = B398CB02EC7FD85A5FB95BC0028DEB12D5E18FCCDA3E9CCBC453D9C41EA0D84A790A4657E83B7D50B9A06F607E195C6DC04AF7EBBD0901210A54AA537A9D0A03A41C05D53D67680623279A4304F59472F8E8463C7F20B40F77F212E894F8173F79B04165F343B6E73E871D767F01407A3B7EA88CCF701524226E425B2E2CF6D3636D5EFBBDE4FB117A5ECD64825D80D9FE4E0A3EBB0BC948DE9CB2053ACD9F6879C2FBD300DDC67DD715402DF6EBFFC4D55E7ED1DFA935817C2EFE2DE6991F579CF6033538AD4D2ECE4260DF01BC398F269E7FB1BE66FB0A23F89C013C53496938380DFB64BE070A27AF25822A9B1283703C1BAE428B7BAB4403665946E689E2A21D4C38E6A7A5C8E1135D181570FFB3BCA80167267DD1B09A00F3A201FDE34A24CC30B46314CA4D9E793CBC872798CE511A1F0AC40C580B19E1A8FF78628E400878870C0DFF0E84C701 -sk = 89A6E3BE304A3518FB82B18CA730F0B3B1B7DE5CF0A30D1030216C0057C368AE8D6FE4565D9D5E0540B62A00B398CB02EC7FD85A5FB95BC0028DEB12D5E18FCCDA3E9CCBC453D9C41EA0D84A790A4657E83B7D50B9A06F607E195C6DC04AF7EBBD0901210A54AA537A9D0A03A41C05D53D67680623279A4304F59472F8E8463C7F20B40F77F212E894F8173F79B04165F343B6E73E871D767F01407A3B7EA88CCF701524226E425B2E2CF6D3636D5EFBBDE4FB117A5ECD64825D80D9FE4E0A3EBB0BC948DE9CB2053ACD9F6879C2FBD300DDC67DD715402DF6EBFFC4D55E7ED1DFA935817C2EFE2DE6991F579CF6033538AD4D2ECE4260DF01BC398F269E7FB1BE66FB0A23F89C013C53496938380DFB64BE070A27AF25822A9B1283703C1BAE428B7BAB4403665946E689E2A21D4C38E6A7A5C8E1135D181570FFB3BCA80167267DD1B09A00F3A201FDE34A24CC30B46314CA4D9E793CBC872798CE511A1F0AC40C580B19E1A8FF78628E400878870C0DFF0E84C701 -ct = 5A4033674303F5116A5EB8B8FA8D9C745A8459F1997B5F3D21761E68552270C3C53AD68C76C0AD179C9781633326017B8122E4F5707601C178C777A5A4587D572C6EF1702228D26B428EA4B29876F03120C14B3DBCE50FF01AD329E0836826D54BA969AB6AA3DA251D6133CE270299DFD7BE932A17DFA7C288AC70C780B4DF72396A0069633B83BA9B77CDB79E00FE448133B3EC289E36E80DE32477B4C64304F45B007D0116A979E983E3E177C26190B30B68A7C246BD2CBF56C572EAB6C1FE3E6B7E0AAB44F725DF6417B8257F505C52C93FD195459792E93918020CB1A3FB02844A08C99CDAD3CAF60B92C3E60925BCFB6C6EAB9B9AE302A8AA31A496BCC3750CBD1E2F45EDF63B52711649597B2A80D700E529B8CDC733018D0A1A885B663DDBB6B4D895A063BAC07E2F136C06E10793F0FD474DB4DC6EEB466E22B73F4A16CF73F80B73654DF0005F9998BEA5F0910321449F5967CE8986 -ss = 3D7E8D87B57B2B32DA794159078EA043 - -count = 22 -seed = E335DF8FC0D890588C3E305AC92C7160FF199E07C85760A828933750E3FED8C83B0DBE802234481ECF890A32D7A2884F -pk = 617B81E845C0D725940B3F7B1B973AD95B34B22C6AE8248D2FAE9D53C27516B90D7D64D04046BF49EBE7E3B867E4846A1C0FBA53610901890F5D4E38B9F66AD0FFB340131B393EE8F1DF5071A65EF174A4D119C44ACC8A810AF76CD857ACE288B82BA81CB111BAED16226020710123BFD9AF426AC20CD6E91261D8D963E3D3B6B79895013868E3632F27135B73E4FBECD8CABD31617C4B226F57D9A1BC01E4F935DC1A9701FB3F3433CA3E7A2EACAD2C2177D731964646BA47A3C2CC8F81271AB7459F2041D0B0A1FE6390E4D8849C1078A61174CD9872ABDD96E301E1EA3CE9351D90CAB51E23045E00DBA8249F8BC12192E05080202F34901ABDD0A4A86914CA52B2AFB901A3DEC6E070FD1D953543CBC8016D57F3408A1EDDAEE272E7624F9FA5E27E3E103156C046E8B2BA0B4BEDD4F9528DA6F17AF23E4149D08A1B313CA674C74E168C133E3100 -sk = D569B935CE015C85F792F8F7FB0D83C401514B7E7AC373B9210B7DF08A8B12A9C0385B16BC8D71C7B6945400617B81E845C0D725940B3F7B1B973AD95B34B22C6AE8248D2FAE9D53C27516B90D7D64D04046BF49EBE7E3B867E4846A1C0FBA53610901890F5D4E38B9F66AD0FFB340131B393EE8F1DF5071A65EF174A4D119C44ACC8A810AF76CD857ACE288B82BA81CB111BAED16226020710123BFD9AF426AC20CD6E91261D8D963E3D3B6B79895013868E3632F27135B73E4FBECD8CABD31617C4B226F57D9A1BC01E4F935DC1A9701FB3F3433CA3E7A2EACAD2C2177D731964646BA47A3C2CC8F81271AB7459F2041D0B0A1FE6390E4D8849C1078A61174CD9872ABDD96E301E1EA3CE9351D90CAB51E23045E00DBA8249F8BC12192E05080202F34901ABDD0A4A86914CA52B2AFB901A3DEC6E070FD1D953543CBC8016D57F3408A1EDDAEE272E7624F9FA5E27E3E103156C046E8B2BA0B4BEDD4F9528DA6F17AF23E4149D08A1B313CA674C74E168C133E3100 -ct = 37A3D8C7E16E0E18593EA9C1B6E0BC040F69ABFC622886EF650C4EB5FD1B47CF77D4721C5E1DB49127F54E9917BC5D40549E9297061B007EA80B5E4EB433AF558613C891651564B834D959B4206DA1819D448FFC27A2DD80ACD65011D7AF672885C37C6384572AA16DF8EB9D1A00C477F77578EDF36A4AF373EF6CCC9D05655EC45982C7B69BF88174808F4FE5A9FF7E892E0D0BCAFAECC2C4187A08637659126B8BA4510116B4E7F62B7DB87AD687BCB6346CDA4BFF940DE098CD150BAB054E6F9C03B49F21779BCF1D2414C0EAA56D2301130E269E326E802F3C0014DFB5FAE901B4BE916824266D76B80B2D918CFBBADA3D634718BEA7666D94F28BE9212E076AB7C217832FA343C78CF237DC05AEDC0402519EBE46EB6B362A64B691D05CA9C72C80CB8F2479E927145595DDB3D9A6897C9B328D75CC010BB5AF13357AE0577293EB4099D3103302E74BAA27FF6684BA9243B66D2533FB35 -ss = C24173C7DA58B449DD977568836FF856 - -count = 23 -seed = FBEA1BC2C379F4F8FDCB0DE260D31CDB064C9EA9B1D6DFBE91B3692ADD1D34DEC9C9FFAE7BF5E72ED2743BA3F9F2E43D -pk = 4771098E0B07E996EAFC696CF6C8E10C4ADE3FE1B4764793CBEE4235F873321E9F8F71B2357EA46E481138B3433790FAD710CBD1BE89018F7FFFA5FA3B63BC98E3A6BC83376E4F86FCB866A7756D74D8BA45C86B88925B35352AD0345AD95EB4AC5CF53C6998133C57A569CC1602B9B0897EC8DA43E75291BFF1990DC01CE1B5D727B1447CB5DB432FF62BFCCE6995E04FD81032D276D856F36936D7E05A5CAA76CD90CD013DDA3C80E5FC28C72406C1905925FFFCDC8ADFA41CB12FFE5D2FCBE9DA6A2B567EDB9896B6A03382EFE79FFECB40280A12C78437808100882D45E5C2C2E1EBAE25061E04F14C540849F65CF39E701C46A32988EC7517176BEC1E616A42ED258315A8991B0E1D4158F08571EC0402358A61FF669CDF1E5FCBD08D75C988A6875F7B197A45AEEEC2AC2B43024C304B8B357D002EB51F856AEAA4BDD062A09B8957927FBADD00 -sk = 5CBB141C2763425C274F7404FE530D91164BDF5F413B63F4EDDCC47594FFB9E2C7287FD5714CAF679CD3EF014771098E0B07E996EAFC696CF6C8E10C4ADE3FE1B4764793CBEE4235F873321E9F8F71B2357EA46E481138B3433790FAD710CBD1BE89018F7FFFA5FA3B63BC98E3A6BC83376E4F86FCB866A7756D74D8BA45C86B88925B35352AD0345AD95EB4AC5CF53C6998133C57A569CC1602B9B0897EC8DA43E75291BFF1990DC01CE1B5D727B1447CB5DB432FF62BFCCE6995E04FD81032D276D856F36936D7E05A5CAA76CD90CD013DDA3C80E5FC28C72406C1905925FFFCDC8ADFA41CB12FFE5D2FCBE9DA6A2B567EDB9896B6A03382EFE79FFECB40280A12C78437808100882D45E5C2C2E1EBAE25061E04F14C540849F65CF39E701C46A32988EC7517176BEC1E616A42ED258315A8991B0E1D4158F08571EC0402358A61FF669CDF1E5FCBD08D75C988A6875F7B197A45AEEEC2AC2B43024C304B8B357D002EB51F856AEAA4BDD062A09B8957927FBADD00 -ct = 545FC97ED910F330B4BA794B368DA77BBD174EF9A654487FDCEA4406A438B04FFAA75336C67F4EFB6EA650645CE1B69D1C8E44FE798500BE8B169B7063B1ACC4A9E4AEBFA175783796190C638F47669B1EA271DF591F4730EA87BCE2BA2427BCC3A1F73FC94A6387CB4C3ED80401BFCBCDDECA82DDB51F4622B33104E5D4483E8D99317A7AC5CE38FFAFFA64C7BCF551D5E4DFF9723E998C5B8A6C5B73680610725EB29901E15EBC7B9979720ACF893E7A72945D4B7B9F8304E3F3D8DF2A7A80AA6FE71C341968166CFD9A218B78640E8CF268901506D8F391F4B801C6DE231CA5A43E1CE9F06CA5AA5AD7330A0906CB96DD0D914B33F75C98FFAAD43CE6850291ADE9241DFE69FF699FF7171D38E4FEDFEA0114316D23BAB6F9F214E3D49A1580085340ED30FF160EFF8ED54CFA3067DA31DC71D25C2D176B5157ACD7ECD42B55B8D839218B935EFC0141E6103357A6CD3F3DE4EC8BD20DB364 -ss = A5D8459E0B0C063FF5696743360F4186 - -count = 24 -seed = 7E87FB886BC3C7C9FC12569F465D2ECD12532E76CC27C65644C8D3DD603B0CB2D036C5974E675058F271D5C82AD7A813 -pk = B0CA13F0AE46FFCD00D5DBE90E094F0DA3775987817A4B27A69FBF427827D617B66F48D9C0B6BEA4792F58E08B61A8CB0AA7325487E0000695D8CDF7EFB2B112ADD1A534D6440F298BC6678F67F79D7D2723AEF9D0880EC9C9CF87E90DF158E489DBA4574CFE6037BF2D59046F00FB00FA9105D62AFA83C6CBDBEAE4E5A0E0AD92900FD7B089067E5AB16D61D924127E2C0B4958F39270233921DA842E1454CAA7F95BBD018CBD6B086CC69B50CA35E96F26D8C778CF1459C2B6CE37B321C862DD45077956F4CBCABBE4CDBB5B3F5920EDCCCE03A4C86FD61C9BBF019D74FB3E090A4A9B9D6BD3830EC627D6985529D059077D926480D7D28F76B49EFA9D92032C53C46539AF29F8A2E8015FC1F00081BF59009DAEF6E0E74BB0A3D4DA9056C89C5426A09427732D0A560AAD27DC4B1340CEF6D71A9F7987CC5F3C635EDC523931108D8992083D9DE700 -sk = 293ABB6D1C207927945417CF84883EF06C2D005E0DF6FA70D10F5B8E13FDB305CF307DDC3FEDF97D29089D01B0CA13F0AE46FFCD00D5DBE90E094F0DA3775987817A4B27A69FBF427827D617B66F48D9C0B6BEA4792F58E08B61A8CB0AA7325487E0000695D8CDF7EFB2B112ADD1A534D6440F298BC6678F67F79D7D2723AEF9D0880EC9C9CF87E90DF158E489DBA4574CFE6037BF2D59046F00FB00FA9105D62AFA83C6CBDBEAE4E5A0E0AD92900FD7B089067E5AB16D61D924127E2C0B4958F39270233921DA842E1454CAA7F95BBD018CBD6B086CC69B50CA35E96F26D8C778CF1459C2B6CE37B321C862DD45077956F4CBCABBE4CDBB5B3F5920EDCCCE03A4C86FD61C9BBF019D74FB3E090A4A9B9D6BD3830EC627D6985529D059077D926480D7D28F76B49EFA9D92032C53C46539AF29F8A2E8015FC1F00081BF59009DAEF6E0E74BB0A3D4DA9056C89C5426A09427732D0A560AAD27DC4B1340CEF6D71A9F7987CC5F3C635EDC523931108D8992083D9DE700 -ct = CF160BDE31A7608A72A6DAFED55D5462B177730AAD95324D89B9BE0AC3D51011EA868E907B91841FE54CF57F37B3BD24E5E7470667BC010B6D9D301FB4E91CD5DE594BF0EDB72C29F3EE6577D308D5F27A80F94D3C01483AC70D65A7B4D4259316E85852D339380BDD261A24B7013B82A14CC28C211ED7D20CC3E0CD88160465B2CC50C8A1322D5790F5A52EE78B481D9E30DE657B603FE94AFB409B2D6240C050FCA59D006CCC82BED7FEDD739A7F2565A3D82FE61421FE762625BF6B4E7A8EDE6F378C77AA828F42DAAB6D76F0BEB4D5C89511ACEDEAC1A43839003CA58A145AAE91504A68A851617F12896F1885E8EEEEA7F7C6589BA64BF4418F7388AD43357D867AB4ABA174EBABE44B83DDF32BBBE5018F2E780384CB78781BE0BB92F68CCA4260BB07B23D8E117BE89B150DD67DC64AE41A549A659DC9CB1D06D223904BF88478798333C370009EF7A472506D33A8EF92ADA940C1422D -ss = D5D19932C9F4580ECB0EAAE0504526AC - -count = 25 -seed = AD1424E804F306C7FF513DA4C1E8D445AFCA7BC942FAC5C0B335733AAF70693712ECBDE26EA726EE0F9FD9D52A83B1A4 -pk = 1573C9DABCEFAFC5CAB63298B29009AE04F01B94B4BB5E82D87BA0985736D529B34E33689CB06CD7BD7CD765402F267E6CEE6196C36B004DDB9041A740C6F5DF87AA7B4193C0BA066A11F2FFDB3E76AA9FE79B972D09F0680806181A704D605E159E02891EE12AE4873DE686A3004E51C1B44F529A3B62F5FCEA4C38E874CC82861E36E05A462A9033FF5DAAF515FC8DF26DFE5B63EFE92FC67C58F4B3E2EB5AA28F0D5C00DF09CF57E106A79DC7704185556E2E131A4FCC83DC325838E6D536EA9BF99C46A5E2DE4CB05178E5D6A442B44F8F2E14DABEAF510EF7009F870D730D868F3D25952ECAC032CBB4B7EE645B6793CA1B1ABEF4ABF1F9FD1D266352A8CC1D981CB58BBF2BDB6DF7EC5C2DC5FD57E300C4799375413FD553B1EE65C0FBF245919F5269445C0BEE0313FD8507571782A4D4B01382E93EFF30152D8575ED0F3A856537A4FBFE4800 -sk = 74D87C7556F2671F2D666854A4D6E0738F75A8885AB2972C5C91AB2CA4CB7EB6E9A79AE0C496E90EA77802001573C9DABCEFAFC5CAB63298B29009AE04F01B94B4BB5E82D87BA0985736D529B34E33689CB06CD7BD7CD765402F267E6CEE6196C36B004DDB9041A740C6F5DF87AA7B4193C0BA066A11F2FFDB3E76AA9FE79B972D09F0680806181A704D605E159E02891EE12AE4873DE686A3004E51C1B44F529A3B62F5FCEA4C38E874CC82861E36E05A462A9033FF5DAAF515FC8DF26DFE5B63EFE92FC67C58F4B3E2EB5AA28F0D5C00DF09CF57E106A79DC7704185556E2E131A4FCC83DC325838E6D536EA9BF99C46A5E2DE4CB05178E5D6A442B44F8F2E14DABEAF510EF7009F870D730D868F3D25952ECAC032CBB4B7EE645B6793CA1B1ABEF4ABF1F9FD1D266352A8CC1D981CB58BBF2BDB6DF7EC5C2DC5FD57E300C4799375413FD553B1EE65C0FBF245919F5269445C0BEE0313FD8507571782A4D4B01382E93EFF30152D8575ED0F3A856537A4FBFE4800 -ct = 094C0BE692710E360DCCF7D770D751AD7839B6DFB43C171ED3BA2C8007CFC51F6ACF60E4569FE08006E15804A0E887F1470835B9D80300377F958E2FCE71C2B68C4FAE158BE4099272C1AEFF56C2A3336FB3C55788045585A9016D4D97EB3A4BBA76D9A505942CD9B89557B3A0008164D4A2B03A9D1123E9E54FE47D20306C0F0C445D84ED84FA3B62F2B8110510013FB0B87C0DF58C57CCF7926F4F52C33B7CE199F08E0033A7E55EAF99351C1206D8CDE852A084EC73BC6A0F99FA1B934C4C7D6859D6B46295CFA529005DA3174831D6582C2A34642387E8CA30019805265BF953F1C18DDA05BD8C8797178480CFB2E762C35F924BF658040B9FB2E2C0C91AB9FBD24D98FE43DB45564750825668BFD02800B87AB5AF5DADCCC623FAB1CF4B5118EF883B33E5A60D4D95962497601D9C3C712F77F35AF4492B37FF6A79CF8EEDA3610730BCA7E7F9016FA6CC846E59E73483DA2578A5957BB7 -ss = F777EF5840DD876797535F8122B2DFBA - -count = 26 -seed = 7C33CA0E987226C8524DD56C811FA4D1CCF9995B1E4E4DD5B1481974E88CFABFBF6787775C2611CEFB27ED4403EA9B46 -pk = 64B9965D19319330455412B2460C01E2C88331A400CCFE842A500F198136C01F134E4D7D460E1E99B0760FB26DB04AD2A944021BE16D0139C26CBAD19C89DD3D2E87B49CF614E90A0518F4256C1B3EF10289E1EBF2C8E5934B775FD899AACD0FB872E80FB91DF5C613C9124B3A00242DA316865459961D20A9821943A3CD7A1B52E8C27DA63E6145FEFCE014E4DB82B6ABF548B02DC50004F3CCC088EC06D9D0BEEF82BF005A549D89B2D24F29B593CA7C47A046E76FDB290C0D30B3382D8C3ACFBB55F1DDFCB943E7F919E7D90D0E97905FDD38C826BD45FEB210008C84F82A241BB03737758563ADC718F63D32E6B7B5E999CFF0AE3A70E9BD1EE824B3F06F45D05D572AF49A402C21938008A4D07B3568002AB0A90867422011974D891D20ABCE11B28601A0AF5E3ECD2F8495150133E5C3D2AFD2AC5796EEE9AFC0AC00E901D9E64F411AAB211102 -sk = 013BAB0212D04ECD54B478DAF7274800FBE097D801C58088B66DFF45AD9AA22010B170A6BDAD118817C65F0064B9965D19319330455412B2460C01E2C88331A400CCFE842A500F198136C01F134E4D7D460E1E99B0760FB26DB04AD2A944021BE16D0139C26CBAD19C89DD3D2E87B49CF614E90A0518F4256C1B3EF10289E1EBF2C8E5934B775FD899AACD0FB872E80FB91DF5C613C9124B3A00242DA316865459961D20A9821943A3CD7A1B52E8C27DA63E6145FEFCE014E4DB82B6ABF548B02DC50004F3CCC088EC06D9D0BEEF82BF005A549D89B2D24F29B593CA7C47A046E76FDB290C0D30B3382D8C3ACFBB55F1DDFCB943E7F919E7D90D0E97905FDD38C826BD45FEB210008C84F82A241BB03737758563ADC718F63D32E6B7B5E999CFF0AE3A70E9BD1EE824B3F06F45D05D572AF49A402C21938008A4D07B3568002AB0A90867422011974D891D20ABCE11B28601A0AF5E3ECD2F8495150133E5C3D2AFD2AC5796EEE9AFC0AC00E901D9E64F411AAB211102 -ct = 2261F4BE74D14EF8627FCFE874B02B3FF62B2F30DCA91660A73D2FF24765464AE253CA62957865F8C957867D7858E8D1D29110F33B15025DE695985B081E582C954F8B6F1EEA51430386D99F57037FBB497586F777EDAD7E756574C317F299558137C7B3682466E1ADD74E651A0284A229DEBBEEC8579AEDAE20DAA62D6CE02B0A1F4913AD02C05DE48FAF028DE1607756F4B6A22A4C2BF329DD391546528688725465450131B3D31775594496E32FA32611CE9184DC37D5D7C75DDBCEB653163DB4382DA9CB61FAC7147D7EF27C228A17B02C3B13D037D2437A25014EB25477847E6CE71808490B2413EA4526634E7CC30B650656593A7A6F5977D98373BDD403003BC661559A875F1A784B7448F1BEC02402384F0311C9EC507BA3A073777FFB52527127779545E8C2695E79595DBFF5E48C17431B25B793E062337542D2C371812C007754C9E45A00A18DCA0585EBC078942359E88411CC13 -ss = B2F713B6EE25BD7E567BEBCC5997F6A4 - -count = 27 -seed = 54770EA1252EA2857D6635151194F5F520ADEA8A41E409FF498D40C271359858FE2B084D5B96BEE087B8E8F4DD4E00C5 -pk = 579CAF24BCA30BA44F3214AC535775263C4530AEB8B471F7B92BCF218FCEE3C88F32B03C8202B4B16E88D0F3333A5C2B775FDC04ED6E001A164D01F369A1A8FE5874A86A02D4DEAD4D36B5F5EB86EDCC04606CB20966AF09D52687FFA85B0B45D0A4F2B5F0149805929B56DEC301CD45C9443F116E0A827E22F6676CD3DAE9B099BBE661D2118DD08234C5F936F2102EBBBB0743DACFAFBAE266A440D05715A750314AA1004FDEE91BB4A2B6D8B80E794E56C79A3BC328DA4D7FBDE3F9CD68E53DE212661D1F45D4559EE29ADC7950CE354FD6888EA56CFC7358E80131F9C32241DF762B6BE1349A342DD8E4483FF9CDBF557B5E8C65DB210BC35D33379DE7379F12423427262E261CC1138039779255345E003D8EAF0D3B3887AC221D1DE20A7E11D18EB50D9E5160CC6EDC1C2B0EBEC2AB22626C18396335C9F34BF68A3866ECC081C29A2D410D8D01 -sk = CCB073C4B90BE0AD746E26FB093B60C7E0B4194DB681E84934D511565454BE2532A70B22663D775EFCB50700579CAF24BCA30BA44F3214AC535775263C4530AEB8B471F7B92BCF218FCEE3C88F32B03C8202B4B16E88D0F3333A5C2B775FDC04ED6E001A164D01F369A1A8FE5874A86A02D4DEAD4D36B5F5EB86EDCC04606CB20966AF09D52687FFA85B0B45D0A4F2B5F0149805929B56DEC301CD45C9443F116E0A827E22F6676CD3DAE9B099BBE661D2118DD08234C5F936F2102EBBBB0743DACFAFBAE266A440D05715A750314AA1004FDEE91BB4A2B6D8B80E794E56C79A3BC328DA4D7FBDE3F9CD68E53DE212661D1F45D4559EE29ADC7950CE354FD6888EA56CFC7358E80131F9C32241DF762B6BE1349A342DD8E4483FF9CDBF557B5E8C65DB210BC35D33379DE7379F12423427262E261CC1138039779255345E003D8EAF0D3B3887AC221D1DE20A7E11D18EB50D9E5160CC6EDC1C2B0EBEC2AB22626C18396335C9F34BF68A3866ECC081C29A2D410D8D01 -ct = 400EB3A03C28F5D9DE6513FF995AC280EFFEA99A4811CA7CA97CD5A0A37FB0D397CA3DF9A98EBB48974F3D8A5E9812DC2E25238AD819029F58ECFF5133D6A0521944BD9EF95A45797CF5032614F0F88FE0F2E07B251CFCA247CBA3BED777EF37A9B4EDFC014617613A4D469D6E0102688FCDF8255596958EAEA19D0734E867FFD4C5508287ED912947EBFD19520E49AC03860D94352366EF8F7FD56BBF405571AECD2BB1012FDAD601FC063B92F1CC6EDCA99C80DF1619B8A2EC24BAA82CBA132060172F424C16BAA43A9D8228E500FD7197A87D22A8A72F8F3FAD0007C54CA676168D7B86FC901FD3B5DEA50D16124F8A70A2627EF87812172A7009A828F1FEC7EF8AFB5E75FF32439D9040F4B1654C7A6E016834C77B549C5CAF251B623D5B934F86743DCFA0D4B4A57DD9CF6522AC3BD19C3047790FD33C90C2B6E161C235438043FEB20BCAFBCC00D7519818C60F5EDAD8CDF80873A92BEE -ss = B5004ADF0D36CFB07BD259921AF706CC - -count = 28 -seed = CD6CFE94E9C0A1CC4FFDCD2D7876504BE5F50F1D1CA5CF93482943465B268276056F2781F4DE805C138976CA72621387 -pk = C7A15174B16833D563B47A3A8658A929DCD5413F80249CD506F1F8E345FE18DAED3CB4291F5064FC44BF06A148B05403CE1A10DD2F41018CFD898325DCDDF46484624317AB7883985F9FC31366F786A36BE40B7C111BC1AB71B61F5D763B625DF9C1C27F498F4C8EDAD8B17D6B015644608EEDFD2130E71F3D03FE9B1269DF2FCCCE385FA13D2EBB0EF6BCEB676121AA14B7FFB7C6AACF1468866AD7EAF31E3D2732C970001243989EB52F71577B978342CF0154EB3A46264892F9FE1D6BED6C0DF4FD626FB633180D3FD351C2951F5F063C2496931DFCE025F80500BBB68C8D4F7BEC39D56556181157D0E8423400CDDA2234B8F34329E44CEE0E8CC6D768284ECB20E5F797FF686D3BEAC587A7F5D99A8D01E57CA3ABAB77733ABA512507E69738E0DF9138CCD0E70A14617FBFB7938107EB18F47F536383CBE96316BBAC8FD787981191DD59B9CE00 -sk = 2E889F44E28901E9AC7CA6B2FFFCB124E0978A0CBACB4248BFD50609838543E787EA931800CADBE9F4A2D500C7A15174B16833D563B47A3A8658A929DCD5413F80249CD506F1F8E345FE18DAED3CB4291F5064FC44BF06A148B05403CE1A10DD2F41018CFD898325DCDDF46484624317AB7883985F9FC31366F786A36BE40B7C111BC1AB71B61F5D763B625DF9C1C27F498F4C8EDAD8B17D6B015644608EEDFD2130E71F3D03FE9B1269DF2FCCCE385FA13D2EBB0EF6BCEB676121AA14B7FFB7C6AACF1468866AD7EAF31E3D2732C970001243989EB52F71577B978342CF0154EB3A46264892F9FE1D6BED6C0DF4FD626FB633180D3FD351C2951F5F063C2496931DFCE025F80500BBB68C8D4F7BEC39D56556181157D0E8423400CDDA2234B8F34329E44CEE0E8CC6D768284ECB20E5F797FF686D3BEAC587A7F5D99A8D01E57CA3ABAB77733ABA512507E69738E0DF9138CCD0E70A14617FBFB7938107EB18F47F536383CBE96316BBAC8FD787981191DD59B9CE00 -ct = 1BFF2F2830A933A56F9AC4173358755194C458861D8C6C73AAFC1CC08CA359ABFE0E30330BBE6FEA2D0544F3742E933AA1C4D9AC2BAA000820C188A30EF5D9756B0ADF2493591EFDB4369F38DCDD22B23855074E70B6C8B44CDA713ECC8B8E28CA62F50BEA5D50A5D783CB90070134F6D4AB28ABF2E5F819153ADEAD5E66CA1E3B18C531571A063C06A365E359C90F679ECE5E70E9CAD5EF89406CAB86BA04BF78A53E2401A1BA6E6612AE8995F32DB213EAF58ABD0DD58680F7B922D3D5CE2B584E1AD22D45C252C806CDD0EA8D7C2CE6FB82201D61F2BE039C780069E916EB58469BE7B780E73C6501C0739374B5080DBCB4C88C08E95ED5A85875B722C611C8CA22AF9743142505E36AF325D46CB5D8810001A1F788627AADD7B697485CBAAFEAA1BEC48B3A9EBD60DB6761637B83C889F46D4428560C9902F36794FEE7B015835D6CFB9853A43A019350ABCCE41278B4A884C1B57C18196F -ss = 4F8AE0D0BC2AA3FF8717C6C7A876924B - -count = 29 -seed = 265EB2DE7099E4BD5614E5DE7F0C2A05C78EF3E8E2DD4AE4CB70F3E5E59C8D1D88248303F07DE0C5508652DA66B47222 -pk = 6A534BF74C6D58027DC079040D66CB118F898B435017BD11F10F5C17209EE5622DE035BF0D9B7754571173F16764D64BBBB00C6D577C0174476727253EA41211FA32F2BEAEBD9BF9D7D1D24DBDEF9326ED807C726394E0D5F70A6E9C2FD3536BA45AD16A1E223262BD85DBD992007DC4F4AE07D9E8B460AE2D1D6C94EFC898FC4297E603901D15E2B17C0D73180E9BBCE6B0C373780744BF3744161926C53BA18EF2688601D5AD8E623856809A460AB077C813D28FE82A8D91DB0830991047EA507E64C7000A8A89C14119846A360CD4E3D8A9EEAC984710FC5C4001EA827D32416068CCA6E666E1CF610B6BB2CE58E9A85B99358C0F1F9B3CB1C10D53D2EE9BD68A6625D24857585B36AE1E53D7E49ABBAA0074A77FB1AB394A13D07EE9C42DA45935F4CF5A726EC71FC68A2A181F508FFD34E4AB07D786E9A3662176DCBD42FAD52EC598366B796100 -sk = 174AAA36410566DC15A5E62874218D7A654BE8CCF785304172D23662455A07E51DAA8BB66E6A7E64506F3D006A534BF74C6D58027DC079040D66CB118F898B435017BD11F10F5C17209EE5622DE035BF0D9B7754571173F16764D64BBBB00C6D577C0174476727253EA41211FA32F2BEAEBD9BF9D7D1D24DBDEF9326ED807C726394E0D5F70A6E9C2FD3536BA45AD16A1E223262BD85DBD992007DC4F4AE07D9E8B460AE2D1D6C94EFC898FC4297E603901D15E2B17C0D73180E9BBCE6B0C373780744BF3744161926C53BA18EF2688601D5AD8E623856809A460AB077C813D28FE82A8D91DB0830991047EA507E64C7000A8A89C14119846A360CD4E3D8A9EEAC984710FC5C4001EA827D32416068CCA6E666E1CF610B6BB2CE58E9A85B99358C0F1F9B3CB1C10D53D2EE9BD68A6625D24857585B36AE1E53D7E49ABBAA0074A77FB1AB394A13D07EE9C42DA45935F4CF5A726EC71FC68A2A181F508FFD34E4AB07D786E9A3662176DCBD42FAD52EC598366B796100 -ct = 22146D9D609E135591109A291F87AD1FCCC007F32031320F78EF50765C3EEA95EADAD255777ACFF05AF66F56304933B295353998CF7700A56B3B419F55D09C1627CAF5B23681D71E5E7892B9111295C46B8E97797E3F825CFDC17B368656E7667E2F83CB48F443EF426609998F01403BC546A41DB2CD1CF3EBD576154574E07E23FF8E2CFAFF96D73B458C2E1E0FE3054E0489FAF1DC79FB98E0BF3D49B88E25608A2AB50155C5CA6C080FD21A2A21CAD3B589C0A17F063C7BA4A0954720CD511EB8DA27B298AFA32FEFB1FCEB49DAE3170545609E41A5E72B98F801E15B41BB62543E8B7F6187818146E2C947BA339190E8B83AEF1D3E2D450DF00C14505BBF947C1479EFA96D0C88E6ABD915ADD43867D0017FB5B930BFB8C90EE21D43705696C7D93C1687692AB43F46E4316BB1726C9BD6CD9918BD7E0C24A7A9CC33A40A6BABBC0BF23BB735190064509F719A8623890634F6324517357B -ss = 0DA2A1D17AE0CDE68A74B4BF76ED8D71 - -count = 30 -seed = 806BBD111F27C2668318387BD0830F65EC21A51AF01985EF48D03D64E1958FF7EE5133A4EBF6DBF36329BCAAF65F40EA -pk = A63B2A28909178A9D24BE5939CB25A530E8C9F55344D6F9AA661576D70C7EF5BCC59B76EA915AA0258584EF18FF65A8240321C1AA56400CCE0E2A91E0B439A8FC9DFD2A1861D064B4D3B72797A19874DB3B9339FC88E2E9EAE1945D9DF5837B1B40DD4BADD7A1500B971BC5D9B01F40ADB8F44009C2AFA75623F354F251EF76C0BF0176DDF9E2D87CD3B3FA3839C937FC8874A8843F87726178A689267C1F665D9EF64C5012C5D8F33DF7E9D0FCF7C878E5B2F67277E6FDB402955D65B015269D318F3E90698020D4BFB8B39F5FA0F0F1D76B102B06EFC7FD08B9C017EB568ECEDF74AF679187989FF1187511E66E557B391EA3B899993498B7B54EE052472381520F798539CDAE2D3E708210555F518A1D301AFD7E2C5108AA200BADAA1189F0A53EB49950CB292E36C52CACDC6389A19B79AABDD247738EA94A76C889BFF89F93191817B1EC61AF901 -sk = 351FE4313E2DA7FAC83D509F3103CAF7F33C7F7BCFF9B8E2D0728777AF71AA0254E89D9867F83BDD2B008C00A63B2A28909178A9D24BE5939CB25A530E8C9F55344D6F9AA661576D70C7EF5BCC59B76EA915AA0258584EF18FF65A8240321C1AA56400CCE0E2A91E0B439A8FC9DFD2A1861D064B4D3B72797A19874DB3B9339FC88E2E9EAE1945D9DF5837B1B40DD4BADD7A1500B971BC5D9B01F40ADB8F44009C2AFA75623F354F251EF76C0BF0176DDF9E2D87CD3B3FA3839C937FC8874A8843F87726178A689267C1F665D9EF64C5012C5D8F33DF7E9D0FCF7C878E5B2F67277E6FDB402955D65B015269D318F3E90698020D4BFB8B39F5FA0F0F1D76B102B06EFC7FD08B9C017EB568ECEDF74AF679187989FF1187511E66E557B391EA3B899993498B7B54EE052472381520F798539CDAE2D3E708210555F518A1D301AFD7E2C5108AA200BADAA1189F0A53EB49950CB292E36C52CACDC6389A19B79AABDD247738EA94A76C889BFF89F93191817B1EC61AF901 -ct = E5D3BDCF2887F16B012B17604096FA3220992E756D23081D0DA75BF7A40F196F3D370AC078586AA613477F5F60100A6651DD333BD518024FF2655609A5D8B82ECEE75ABD75496E90913323E385526509982D861C2AAC2E4D096E3793A8E9609CA1BFA1F9BE8C3E74A858C883A70108C646486719961CFAF18DF04B6F821A9532935894AD55A47CB3573D58FCA9AE6B5804AEF6E9DC6DC1E1B94189CDE10BB5A84182DA2A022560A933D838F293E427DEA7B0AA2AE25CACAC1FF483F907201F947E209A32D3EE86956371582B458A28C76B91F13E2E8B2D3D0BF2D1002586E5A9834917B943539EB3CF993F34BAFBA9557647D0518A189FDA12C04979229257A4BBAB34C9CF659C80DCE1D03DEF4793BFA8C10055FD41D06B629DB8178F8CDB33F7D1F5311BED2B8A6B9ED38F1FFAD72241552E5D06F44269172D25E1A5DB64A285B13C924B2C6B90D6014F983A2E3F8C63E8FBFAD9EB68794174 -ss = 5B0C71C6C97FA1FFD3A31B6598B80749 - -count = 31 -seed = AD540A9CE816D6FB1661E5483C44F6FDD00C9E7BD1A8CEDA4B4C4D3697D4F78ED0A56954996CCB7DA96ECB8F5CB15809 -pk = 67BB9A00D3AF1BA186ABFA6C21BD46DEBA00570578F03C5CFF05B5CA56FDC4C1A616D6841799F71719D1DCD1DFA3799EA0B5C9D3D004001160B669655F448C6F9FD30C7B985802D0738F0447FC5B3B587B0DAC305432BA8EF5937CA4BF3704F5F08D64CAECCC77D9CEBAFB2DE401A48B0E89EE1E8876A8AD3FEF2FA6081DD522ECD1B1E100EB67536F62591EFB339A0C7CAD7FB70B9D1E7F8B4661E4C1A72C9730112A0901061EE3F466198FDFB528715224152BF0798C92775865F6F08002BC7D89E85E1198DA17FF0EE2E0D65DE16E3129DE09EC260764980A3E01D9F260F81C21E257974FFAC3B31D108F4D7648F1E5B26C0068669582D03EDA60842C8D1E14C92E51A7EF5DC9D7196654C4FB312C15A401013BFE48BE05AB9E8CC633D5C31CB57F6BCD3A8031AE973C9EC8AB84CB97D3062DA6A0D19B0AC0AE4EFEFD5D8C17DC99E8D7B1D694E000 -sk = 9BC5315580207C6C16DCF3A30C48DAF26D9E884BEB0556E1A5F29C6DC5D1EAD767E59BAE46496B40C790650167BB9A00D3AF1BA186ABFA6C21BD46DEBA00570578F03C5CFF05B5CA56FDC4C1A616D6841799F71719D1DCD1DFA3799EA0B5C9D3D004001160B669655F448C6F9FD30C7B985802D0738F0447FC5B3B587B0DAC305432BA8EF5937CA4BF3704F5F08D64CAECCC77D9CEBAFB2DE401A48B0E89EE1E8876A8AD3FEF2FA6081DD522ECD1B1E100EB67536F62591EFB339A0C7CAD7FB70B9D1E7F8B4661E4C1A72C9730112A0901061EE3F466198FDFB528715224152BF0798C92775865F6F08002BC7D89E85E1198DA17FF0EE2E0D65DE16E3129DE09EC260764980A3E01D9F260F81C21E257974FFAC3B31D108F4D7648F1E5B26C0068669582D03EDA60842C8D1E14C92E51A7EF5DC9D7196654C4FB312C15A401013BFE48BE05AB9E8CC633D5C31CB57F6BCD3A8031AE973C9EC8AB84CB97D3062DA6A0D19B0AC0AE4EFEFD5D8C17DC99E8D7B1D694E000 -ct = 4707B9E7C15985BA3D1097262E30395679522860AA06FB66BBDA9A990CC5647D58AAFF212730476C1FCA15C84C576C7B49140D58ED1D004F54548341CF3D64E4A5CFB19C605CD3A97FA403C3C032DF127304C0654AEE6D9F55E2CE651C422C4D7DB5346D52A17905F2CD8F4461012AAE335BA0696315BB4EBF395C40E8AEB859B45C55B0B7C65A6C5D7A2A48F3319112C180FC45F52B5429AB8440BB503350BE33E8E2FC015353963D816FB379F7848A61057FD5946A303E26717F250C8A4A542347EA3E8FA95CFF6ACF203960E33313E04C4D08C5C9ED156D1A9E0116961A32E78446A217D6FBD7B65125B5EE1BB4803D4F65A83D169715F8425847584CA8A122460071AB06A1CC9D187E351E78BAAA657200C86564E849C8337689605EAC9C29FA2939C427AAF6BBBE1A176D8FED4F3C8974B0992C16D145583C0CBB6CB9818D19212A7147AFC88A01281AE8B5D46550C2D9D2D86DD70FDE07 -ss = B566B8997380CE9ABBA5A871A09D934E - -count = 32 -seed = 288A5F2684D862A86D2790AFDDDDBAC6FDA934EE7D2E6DA1508BB550838609E8107312B28E00A6C01706374CCD3AEFA7 -pk = 6DFB6A675AAC447EC0AD5E53EC7041616889FA9E456E7A7D5456845D9ABA80354DEEDB58BCC2C581B74A32D08B8D0F313ED53E39EF8000F8B1737504BB222F60A0B45A7CD9B1FA41BA53EBAD6ACA23076335B57DBEE7BE25E724FB787AE7B1A0B65BCC12ED1D4B8D232EEC0FF4013BDFAF510A82DBB2733683C67CC466ACA19CC11C9C0D1FCC32A60D5FA7AD360A0444849CDE6F05EA3412BC61C372F30C0F0A3D03011D0064E69B5D94C915B615373CF5E3F01FCACA7C3480B1C03AECAC80739084221AC550A3D91562C0C2FC339ABB01ECF8A19F4346E1853E89014209997CDB1192AA136C34859C37A093D23D4D3174095E7563CD7BEAAB20946F2F2C2207E763BBAD441372CDB6A457B5BF0F67FDA3C5008ACEDAEC5418ADE37EC5A0346CD06A130CDB15205D23E2065A0E1621DB5D5794C9D83DF48D006C7DB8949092AC1C29BD8CD15B8D212B00 -sk = D8B907B34D152FF8603B73051F772DAA4713480D2B1C408532CA1492DC73120EA013E3522323EE18F2FB4B006DFB6A675AAC447EC0AD5E53EC7041616889FA9E456E7A7D5456845D9ABA80354DEEDB58BCC2C581B74A32D08B8D0F313ED53E39EF8000F8B1737504BB222F60A0B45A7CD9B1FA41BA53EBAD6ACA23076335B57DBEE7BE25E724FB787AE7B1A0B65BCC12ED1D4B8D232EEC0FF4013BDFAF510A82DBB2733683C67CC466ACA19CC11C9C0D1FCC32A60D5FA7AD360A0444849CDE6F05EA3412BC61C372F30C0F0A3D03011D0064E69B5D94C915B615373CF5E3F01FCACA7C3480B1C03AECAC80739084221AC550A3D91562C0C2FC339ABB01ECF8A19F4346E1853E89014209997CDB1192AA136C34859C37A093D23D4D3174095E7563CD7BEAAB20946F2F2C2207E763BBAD441372CDB6A457B5BF0F67FDA3C5008ACEDAEC5418ADE37EC5A0346CD06A130CDB15205D23E2065A0E1621DB5D5794C9D83DF48D006C7DB8949092AC1C29BD8CD15B8D212B00 -ct = 17DF50A3C270E4A93FD35EA23A49E81CE417672C810937716341B46C031E5D09EB90FC53D11605DA1D1BD54DDAD45784EE5B3699CA76015173C9FB0C94EA1F6111D36CEF2F13C6EC8A82C4C42821F96C4B2BD4BB88A83DEB6EC0CA05CC8129D4A984166983D55E41CE49B49B910148EE6D6A544DEB5129F3EE98FA8F210C0FB3CEA00E03C3A478309454E02A1F55095973A4A1B06F06D9990FED792B07D1D9592480F04C00AE86ECFD37645FDDE16DFDECB35EA33209AD0D182338DAD6EE2871EE3C8C2500A16488F9F61819619D9BF578896DD7CDC0A6C1677856003463F823FA737A8518E5120B7FED15FE5E82F7958FB73EA0FF64ED569E49540F923EB1FCA63496013BB62B53DF43167AB110467B696E01ABFDE6E7CAA7C35F91ED0CE9C47901ABDB157B8096B98BEE035AFA5DD4F070A15B8D440333CE5874DCB14D2D070B34E12DE4A4D45A1D021855FA315DF1EC8955181B9A9B853830 -ss = 968C0162E93282100048613EF3C737D6 - -count = 33 -seed = 4635DC5BB92EF98CDB6220DF0DD717C7F8158375EAA2B78FC3F0B58E9C9653E92684CAD3461D9158A481DA3D14694C44 -pk = A9749110AE79832B23DF00ECE0D4DA13275EB4E2A42DB0FB7AC8A1C40371B5AD6621C11C10F9C385A2815572368794852DE1CE87C07C0179F034B5BC99D44AC64EDAB4BB38641C330458A21C980A08A63409FD5C8C15624A146A3EDB76B3823A34EF9908E0BF896F74D16529ED012E155F3542CC4E114A3289E285E560A576A9C9EB6D8B9561B85A7BE53FB368F535F605BD9746ACB7A0D8E0C6056A92527D5BD34947D101BD8D9FDBFE9FF72F6D5FD697A24455F46244EE0494B5EC5B2FCDC2DF02CF73D53996410A563A566FDF44E511ED855427EA5B4CF38C74019A7B9BCD6896822FA056CB7ACBC474BF3FB5098C1C1FBEEF23A438EB32848377516505F503A83DBF9758A863FA3CAC5C532F4C24491D01EB93C0752EBDFA3600F98B57393E766EA403A8E0BD125DBA0C7AA4F2827A2E10C6DCA2F3960AA6C981046214792DB12686F0A1FEB62001 -sk = 684A29E4E5480A5F2533E1526B5FAC8CD48C758346DBE432A3228952635DC682A402DCADB073D596FEAA9201A9749110AE79832B23DF00ECE0D4DA13275EB4E2A42DB0FB7AC8A1C40371B5AD6621C11C10F9C385A2815572368794852DE1CE87C07C0179F034B5BC99D44AC64EDAB4BB38641C330458A21C980A08A63409FD5C8C15624A146A3EDB76B3823A34EF9908E0BF896F74D16529ED012E155F3542CC4E114A3289E285E560A576A9C9EB6D8B9561B85A7BE53FB368F535F605BD9746ACB7A0D8E0C6056A92527D5BD34947D101BD8D9FDBFE9FF72F6D5FD697A24455F46244EE0494B5EC5B2FCDC2DF02CF73D53996410A563A566FDF44E511ED855427EA5B4CF38C74019A7B9BCD6896822FA056CB7ACBC474BF3FB5098C1C1FBEEF23A438EB32848377516505F503A83DBF9758A863FA3CAC5C532F4C24491D01EB93C0752EBDFA3600F98B57393E766EA403A8E0BD125DBA0C7AA4F2827A2E10C6DCA2F3960AA6C981046214792DB12686F0A1FEB62001 -ct = B456E8BB9C8D4CEF7EC7B5AE3D67F608C36227A26AA10CDFBD2E4CD949D586B0A60937D09329CE83EC8363FF1F8C171A2034FFF6E2AB00FD430A62678F4ED7E382CFB3A1D2E6DFBECB34B0862466D5D21CD281304CE0304606FA64EA45C98A8122CA453EF0C1DE69FCA2447E1D012AD5D1C153435568910F1580954143C5423DE782C493520A5653BD0009135A1665F46CDE58BC23841867D94A4969340F70727744212901F94C5A6B128C7DA96CE66B1D0BCA66AC33C3CE1995E544E99F0E410D5114BEFF28F055BE6EFD723F640CBFA035EF2C6538257D478B530040B8DEB4277217C80532D5F660BF3EC2FFBEC67FD6FFB78CF4684C637280BEB0FE6C0F2A2168474268AA46272A399F39EE282C89D91F014EA52E255432CEFC32FA7DC717F45A9820A5DC1D88B0F3763368E7F608159733BC18C8FC0CCE9A1621BD5E25B679DE75405EE853D11F02E2D0435B1B0494EF7CEE0546E49CEA0C -ss = 4CF1CCA95A4F53EDEAEAF084D0D6A0FB - -count = 34 -seed = 5DA2C51B4ACF488C8BDED5E985CC4702E4A7BCB248B5AC18AABA529F7F9CBF30EFA776E99F76D5C1686E94F50FB57DAE -pk = 755BECCBAEC71D99A39FAD1E7D64F741DDA159A12534D9E39DF3E4E5545314C41DDAB46F1045B275C02966242C3D077078F6668A9223014EAA908643BAF38B65BA06619F14DBB2F915FA998C31A36DF317BD75966B580E9DFEFDB8FB613664C95D00DBA0128B9AE2C2695FCD9401E0AF77F7539C14E0635893D3D0407BB82BEF1B14853EF1B79AD6A242B816761FBED743FC2F5758F53D21F583B2824E7BA760C84EDAB40067FDD800926EA6D5D0F434F905FB6980CCCAD6D1768D8F090779F8B5380A48B890DB4F81FFE52DDEB5EC1B9AA0D5E0960A9754496CD7018427DA38718AA3C54DA5CB81847ECC41BA4AA3FD4451EDB0759F2B4EDC24EEB22C3780B1A6CCB7C2EF5CD85BCE9A09B3B1331CF2FFFA00F790D58F7A3D0C77AB91E2BAD875648B34B7206D2B5DDF411569EA39713876F60D89D5FD724ACABBB8713303EA5AB89930B7DE87279F01 -sk = D76B3573F596EB286AB5231FEEC74996E8B7BE3C815A5D5D76C69722A85C212B66491CEF853A65710F3E6201755BECCBAEC71D99A39FAD1E7D64F741DDA159A12534D9E39DF3E4E5545314C41DDAB46F1045B275C02966242C3D077078F6668A9223014EAA908643BAF38B65BA06619F14DBB2F915FA998C31A36DF317BD75966B580E9DFEFDB8FB613664C95D00DBA0128B9AE2C2695FCD9401E0AF77F7539C14E0635893D3D0407BB82BEF1B14853EF1B79AD6A242B816761FBED743FC2F5758F53D21F583B2824E7BA760C84EDAB40067FDD800926EA6D5D0F434F905FB6980CCCAD6D1768D8F090779F8B5380A48B890DB4F81FFE52DDEB5EC1B9AA0D5E0960A9754496CD7018427DA38718AA3C54DA5CB81847ECC41BA4AA3FD4451EDB0759F2B4EDC24EEB22C3780B1A6CCB7C2EF5CD85BCE9A09B3B1331CF2FFFA00F790D58F7A3D0C77AB91E2BAD875648B34B7206D2B5DDF411569EA39713876F60D89D5FD724ACABBB8713303EA5AB89930B7DE87279F01 -ct = 65979FBC591F9A1F3C91C7490EA42D9DD744B2B2EEF097CE0DB5C92D29A08497E4F25455725BE66CF546597617B79874C1A6EDB7B628022C950CE48903F12510F76D2AC6412F76C055B00F118CE97FE4E7831FC0F96A41C48E148826B3360666F9B25F78A907FBD4EDAE5CCD0702919CF4F839F67A1456F9A5797AE632EA114B71915941AD1B29BCD7FB60431E6958895F9AD67E8024498C361A64662FBFD6295230C9C200D7A1DA8E8812BC64EB612A0742E1B4A97D9F70F42032B9F0C26BBD4D4527BC2DF82C023DE42327D7BE930C6CAFAE1E0743354338566101B337149C8EAADE6A00622406B137FB2096763C675DD4A9890F40F6BF5AD7D5A2AB1D43C4918BE9FDE65B06E20E15986BAA0B9414178700A8F3AB25B4EB2E78BDD626EC43A36C6931DAC802FB1CC250E239BCB7A28483CE6C2D568B6F4B9828B5AD5E6B34F88782A5C0B4E4B1A2009F96C663BB2FCC61E657BDC52C48C127 -ss = AE968D6A27804749820215D949802EF1 - -count = 35 -seed = 4D2239E84B052109A78DBAB6D80C51A86D38248105970476B74A0B78B9CFAB6283E30D5A406FAE1C7F54F8BAE1110EE4 -pk = B29D0563604551E0DDB53DC0F6A6A552403138B54DDD8F7E641439448B1066EDF1BCD01317A82A895EF44E3A551371BB6617EC37B5CE010B1DCA16216B1A666FEF6C072B8C36208F33736241CCEC4136D5000A3E1C5127C8F542616971D49C5AEB1337B758571E3850E3DFF6CD01ECEDA2EDC5B9DFD2B23B42062AAE93416478B4940ACAA7A0DF1D1217453FE11E6D59B3283A3C2AF9F7137704C6154F1CF26C478D3B9C00FE962821C843F08200B06DAD771C9739836B6AD549B0B929802FCD3F387676FB44E47192B708EFC1152D062565724CE1240AC980D2DD0136E5A04DE3694EF2F48279DF6A4E73DE70830B9C67E06B44A3A103E0BFCE63080316C1E63BC065C651359496379FAFB9FADBF2D6BB2A007F609405BBB86E0782A478D266800C9C950F08C71D28A55CD08575156BEDC60D4C111F83764B869892A1C710A23E655BEE1BC617CE2102 -sk = B87439FDE81C9E39EEBE7CF741C685789C1801C4A2DA5DE2C75FAD022D9418C2B6B82A2DE1586E0E0A31DF00B29D0563604551E0DDB53DC0F6A6A552403138B54DDD8F7E641439448B1066EDF1BCD01317A82A895EF44E3A551371BB6617EC37B5CE010B1DCA16216B1A666FEF6C072B8C36208F33736241CCEC4136D5000A3E1C5127C8F542616971D49C5AEB1337B758571E3850E3DFF6CD01ECEDA2EDC5B9DFD2B23B42062AAE93416478B4940ACAA7A0DF1D1217453FE11E6D59B3283A3C2AF9F7137704C6154F1CF26C478D3B9C00FE962821C843F08200B06DAD771C9739836B6AD549B0B929802FCD3F387676FB44E47192B708EFC1152D062565724CE1240AC980D2DD0136E5A04DE3694EF2F48279DF6A4E73DE70830B9C67E06B44A3A103E0BFCE63080316C1E63BC065C651359496379FAFB9FADBF2D6BB2A007F609405BBB86E0782A478D266800C9C950F08C71D28A55CD08575156BEDC60D4C111F83764B869892A1C710A23E655BEE1BC617CE2102 -ct = 7BDA080E55A57EDEBA01D4C5D1FF2451532CB5639322FCDE3B9BE0999AE0AE5E20FEBF6BF863B8D81141AEDDB6C0ADEE12E034FA122E02187A390D4B49A7C4BFAFB58D9FFCC65928C84E930713FBEFE543CF5F6CE14680198F900972947D80E797B0EBED4EA7846D0C053DE460019B5B9FDD36F2406C400675EF48A65B3ED760A2A6AEECB4A66A6E5F46450DD73F7B0B5AE57D5AF0135B85A9EC168D64123A7C66A854170081BFF5DC07ED5328A14AFEBD01D839F95C6D1B8D9812D37F2F432379AD718620C7F602EB6D662337A0BFE90C9F49BA00CE1F5035723301D01C6317A783951674E2868238AF6735549E1E54CCD5B931A94FE6FED80B62CE244670BDB33874A6D6570C2B2E029472A2F5E298734100E47133378E7D58E96A03AD5CE897539D30FC107EA9C70938A4D02235B8F088C76EFBBD7B7F647EA3BE9DB150FBACB46E75CD97CD30B600171A71D988ECD50292B6326C3E70AB44 -ss = 106D77DECF74C78D230AE3A4C60E9209 - -count = 36 -seed = EE762F5C9021C36446706A88EF16312F4A12C725CD7AFFF1484337C91EDA8E89F7007F3705747D29907B3FB7500E5074 -pk = B670CDC458CF6AE732F6CDDE24E56BB2C7AD734022B455D5DA50E9BB19E15DC66BAABA217B447D8A7930E018E605B1F5B7D4C628C5160264BE68A1103225A206033E82366CB0F2105CC94694868735B0C98738F9F218C5FDD6B97AFB2F0575628688098D55AB33893135B9C9820078F7874F2B13D3A810385EB80B906030F11599CA82FFFF99E03BAD0B2427E59BE6E48ACF88A56190CFE764F9D5E17368A273A475C9A101E15D87649E54B874B22A7792BBAB6A48A7A63832FC14C95EEDA92DD4D156D7CBE576FDCAA4C446CF7C93B79A04123EAF6D2F6EF26C5C01886FE3BE92A8D6CE49022A15005DECCBA8E14A2FF80E62E3E09925D353CD444A78DD2FB9265FA53DE75D65564336F0C5E787C703406C01EC47BCB352A6650A125D04D3A43B6DDC8AA829B5CC391AC21E394097516EE56635179A32279F43904DBFAE7C03D3A23001B85DD0ECAE00 -sk = 056661B38038DA4FDD7426F32A81576C9B4469FEFC4282E5E4563F98349656F19BC4B038D90BBAF3E534DE01B670CDC458CF6AE732F6CDDE24E56BB2C7AD734022B455D5DA50E9BB19E15DC66BAABA217B447D8A7930E018E605B1F5B7D4C628C5160264BE68A1103225A206033E82366CB0F2105CC94694868735B0C98738F9F218C5FDD6B97AFB2F0575628688098D55AB33893135B9C9820078F7874F2B13D3A810385EB80B906030F11599CA82FFFF99E03BAD0B2427E59BE6E48ACF88A56190CFE764F9D5E17368A273A475C9A101E15D87649E54B874B22A7792BBAB6A48A7A63832FC14C95EEDA92DD4D156D7CBE576FDCAA4C446CF7C93B79A04123EAF6D2F6EF26C5C01886FE3BE92A8D6CE49022A15005DECCBA8E14A2FF80E62E3E09925D353CD444A78DD2FB9265FA53DE75D65564336F0C5E787C703406C01EC47BCB352A6650A125D04D3A43B6DDC8AA829B5CC391AC21E394097516EE56635179A32279F43904DBFAE7C03D3A23001B85DD0ECAE00 -ct = DF9CD952C12F9F05F73D441464A18B05771B5CCFCE4F1EDC33FDD3C5248616D0BAAE63FD10F117B59D7C892A525E84FA84CA1BD8D5F80119BDB8BC3BC3876F861FD8DE0AF96E6DE0827B7C49A3E1112E9231FBE4390BD8C65D6764ADA84F88A5881BB17DCA90579F71659D329B01BD3DF1FC018AB7F338500B599D05A57F89BBA5DFEA91F1765CE2DCE25AFE7A2B760856D0ED46193EE78E8FC556E28117D3B448A7F56D01D37418D88820ECACA50658D4C6AF100BAF9ED5AB79CCEA0E6347D51533DCA2CA50EDF5812FB4CC5F5136AAD41EAF97D483A4BD72E40801FB36D31ECBE3371205E1076B343781AA0257D196E12A60BAE0E11AE4964B49F8FCCA81393472BF8E9A48842918793137EE5DDDDD11640170B17A9307A7323AECCBFC1D24607B5A9E67018AA17387863F04EDF2426D23E435234EAEA7695B092DF99A11FA5E08F5B3CE61787AFC00CABBB865C815ECEFFE9E5F90B1E14DE8 -ss = 265DCCF5815CF483644326C4BD905550 - -count = 37 -seed = D882BA69AC8BBC88715F1C6387531F53273A5DAB87E66FAA8221A7F628D2BDEEE1CBC59C0E08D0ADD84520A3A70C1389 -pk = 23E28D43F846DCCC539A3DE1864657579B9DEDB6CCB6B339E2F181C9F4FCCDCE9FC7F3B40F92C5098D78A68F11837C0A7BCF44D26E21014B0CBCEBB86BC92D8009A7CFF8544B4116EA1518679BEC46BF11B8C451FFAA032B1AE58B91D9C2E4D5489C77BC6E5853E4E6BB9FC7FE0199BFBA3177BCB574502E5D07E81867FD7FFF2F0C2B030996D5629F80FF4F97BEAE55BFF4A3E5593D07FCFDEF632D609F1ECEA9AD727C01B5B463C7089B6CE458002F488F16773DD2FB6C838D39154AE328D55D48558397C30F772B44C4449C5E6E6BECD46D6AF9F1C5ED86CA4700B666AD1153D4DF7E75CE07C0965383B2EA85A1206BF2CAB2A18D1BF9233212792DFD7C4FED46D9E7B11DBF9ACA42FF5A0696C26AEF6500BACD4695FC2D8189D58FA5D49C0ABA66E1255D15794D2168CF72B357CCD1923AEB384727A48EF43B3EF80DA1D994368603FBB370405301 -sk = A1B52D871612A1C611AE0944F9E718585D189DC4AC1BB9A9329D942E322E0175D03AE93B11DCE9CE0046DE0023E28D43F846DCCC539A3DE1864657579B9DEDB6CCB6B339E2F181C9F4FCCDCE9FC7F3B40F92C5098D78A68F11837C0A7BCF44D26E21014B0CBCEBB86BC92D8009A7CFF8544B4116EA1518679BEC46BF11B8C451FFAA032B1AE58B91D9C2E4D5489C77BC6E5853E4E6BB9FC7FE0199BFBA3177BCB574502E5D07E81867FD7FFF2F0C2B030996D5629F80FF4F97BEAE55BFF4A3E5593D07FCFDEF632D609F1ECEA9AD727C01B5B463C7089B6CE458002F488F16773DD2FB6C838D39154AE328D55D48558397C30F772B44C4449C5E6E6BECD46D6AF9F1C5ED86CA4700B666AD1153D4DF7E75CE07C0965383B2EA85A1206BF2CAB2A18D1BF9233212792DFD7C4FED46D9E7B11DBF9ACA42FF5A0696C26AEF6500BACD4695FC2D8189D58FA5D49C0ABA66E1255D15794D2168CF72B357CCD1923AEB384727A48EF43B3EF80DA1D994368603FBB370405301 -ct = F0AB3E2C9CCA0E67AFE1AD0FE8C1AC6D2938CD9E14207FD02D10F8A737E0FC51B0439A80BB67FFCDD3B7883599CCE68F66B1113E458200664C0DAEA094057B1F5166363F0B8B36AF4504FD08AB43FCA8882904DE88E8E775204907D194D4AA1663C936F2DB4AC3A6B2E29A6A4600A5496F3C98F745839A013173DAD4A763D7B6E1F8B0BC0F46DBB3F9D920D4C4CA1A982CFE11B25F2BBCC1F567D8809EA66842F3CF140B01854690C5D960168883B5F0B995355305818C841BE63CBF645A89693327EFF6BD27A4B4919EB654011288499A49DAA4B12FF6DB55EFF40002A360D34EFAE47C45380D0226EB9144C2F46F8D68CFD914525DD4E3FEFC9A5284F3260F3BC292D9BF3E0C701420C1D5B57EA5B0AF08006986371BE0AB510DB5968950E3A9B3A05116A40CC5A58CE8E0B04CB1E0E010F72129D2049D3844B91119DD2EC22F0F5B4E0DBE75DE1F016D3B7508B73A7F329E218E70D8A2F1A8 -ss = E3A35F1CB2667A2FFDCE38CE2FE22205 - -count = 38 -seed = 6C3AFF39F5D097096D882F24717718C8A702382DC4AAFFD7629763FDA73C163CF084807BBB0C9F600CD31A7135F48AEC -pk = 2ACED76575102E9CA0AEF82D980EAD88889D4BDD5D5434D7EB162309EDC1E6619B90AD83AFFBDF90AC0DAE4DF4B00FF4B63A96ADA65D004AC8423058F244A1BF4FF112F396D82C15E6835414BF44D56DE3C5833D9267A737B48009A6EF15E8BCE9893195984CD94E2319BCB08500DE313971527E4B6AC7677B654C8BCE46AE14E0E4BF705876DED05B5EB478068663FED13EBB045FAB2ECDD92124352E70BD7F84B3C63701376F75BA7ABCDA55D586397BD459D8F6D2EB06F16425293E10E86CC9AFD61F41E04493338699FB43423F769DC2D2EB9C2F4D1D6D1B8B01530FA5577E4483BC912ECCA04170B76D25EC70646085C1C56778DCA20F4874A384710220FBD562F0409BA6E866FFCE374CA3431494B2010B561D3491A746C031DC7FB712746C0D4DF6D6738C4D78E84C7C9384C62BFA8CC9DC598993E2EB2E2BA0D10AC3862BAAA9B4725241CD00 -sk = 952B49C803D6D6FBA69F4375ADCE8594D6D0ED89E743657C260B769DDA95968B08C290D0B1AD889BFF66CD012ACED76575102E9CA0AEF82D980EAD88889D4BDD5D5434D7EB162309EDC1E6619B90AD83AFFBDF90AC0DAE4DF4B00FF4B63A96ADA65D004AC8423058F244A1BF4FF112F396D82C15E6835414BF44D56DE3C5833D9267A737B48009A6EF15E8BCE9893195984CD94E2319BCB08500DE313971527E4B6AC7677B654C8BCE46AE14E0E4BF705876DED05B5EB478068663FED13EBB045FAB2ECDD92124352E70BD7F84B3C63701376F75BA7ABCDA55D586397BD459D8F6D2EB06F16425293E10E86CC9AFD61F41E04493338699FB43423F769DC2D2EB9C2F4D1D6D1B8B01530FA5577E4483BC912ECCA04170B76D25EC70646085C1C56778DCA20F4874A384710220FBD562F0409BA6E866FFCE374CA3431494B2010B561D3491A746C031DC7FB712746C0D4DF6D6738C4D78E84C7C9384C62BFA8CC9DC598993E2EB2E2BA0D10AC3862BAAA9B4725241CD00 -ct = 46722EFE47F4BFDC5B36F8FDC92336C965669E48B6A1018E88B4AFAF4EC7765AF9ACD146F2D0DD800BBC15B8A79043E74DBA8372DA5E0157635F4C61FEA89934E5948B39B2C4833DF9BBD41A92E87D2EAA03F892FBE46D5A3DED0474FD123B6BC29A6D451F0C4CCD913994BD1900E3164E578A596DD8E7B0C6EB7A2485113A8AD5770BEECEA55E302039658E234E918495E0EEAFED4FB8AE8FDB0CE0EB926075C4E5EB4B00B57C1643BD1B4166191A35C0DCC839FEBB8B4BE072452C5BF0E901D34A71350BAA7EC471780306856FE952C97668E94EACDF943047870093BCF560CE4A01C0F26C9B4ADC2B7EFE2C97D9FA8C38FA193A61D50DC4DC4CFD09EE9F3D4025F51231CDEF2D1229B4995274B3EBDD5B01849C10CF45ED4C2EC1BCA8C03A0F0619FEE9FA84095D9A95CDC957450BCB5B3639076A6D6117922D8998BA479026F050C1A9923FEFBD009C4DF016F2395F2C7EFC8203AAF18A58 -ss = B58E59F4A05558B84AE4851836CC49B2 - -count = 39 -seed = CF520B92A2E3677AFD003EC1EC6EF136A709D78F828C9C0DD4946EFBD451C5FAABFC83CA66F9D3D17EE4220553B7A69F -pk = 0F0B839F996D4D1E8F08AFA3A1EFBBFB28BE9A35E187F27431D48D05220A98DF798C2432C2B28D966B8806E83F7C6DDDB9AF95FDF4C90088D311DC95BE43024AC244A1ED221F16153D6BA687EFD5A628918209F869DB38BFB2C44C95F5FA8753CD350E09C3D5DD1455EEEE4FE90006649D4839FDE8B88029AB779D48479080558FD4DAD1390C981CD7CB30FB82342344A52AF58F076983F257B1E1A1062B79D62C32737B0109FC20E92E9A264825E8B477A50B41157F1928A94596CD2D65F3386CCCE7907E9CFDFB78BD9718C1F6DE7F87150F3BC8E129BDCF093200D63A1F74F38C77C903E67C3913CE22E7B879DF5AEE80FC7D1C52E6380F9C715432A326DCF451446C90BE35D1DF2CA71E1E85814CDBD4014AD1F145E161AC634CD22A3276D8073377F40AFAC4166EC55A434F8BCD1A55F5FB7C29FE35A6460F245F08B67846FCCBE07559CF19D601 -sk = 3C815E57E9233E975FA1630208AAB206BC7309AE5C304D142AA66EFB4C844C6071BAE44EF96A27ECCFB6B8000F0B839F996D4D1E8F08AFA3A1EFBBFB28BE9A35E187F27431D48D05220A98DF798C2432C2B28D966B8806E83F7C6DDDB9AF95FDF4C90088D311DC95BE43024AC244A1ED221F16153D6BA687EFD5A628918209F869DB38BFB2C44C95F5FA8753CD350E09C3D5DD1455EEEE4FE90006649D4839FDE8B88029AB779D48479080558FD4DAD1390C981CD7CB30FB82342344A52AF58F076983F257B1E1A1062B79D62C32737B0109FC20E92E9A264825E8B477A50B41157F1928A94596CD2D65F3386CCCE7907E9CFDFB78BD9718C1F6DE7F87150F3BC8E129BDCF093200D63A1F74F38C77C903E67C3913CE22E7B879DF5AEE80FC7D1C52E6380F9C715432A326DCF451446C90BE35D1DF2CA71E1E85814CDBD4014AD1F145E161AC634CD22A3276D8073377F40AFAC4166EC55A434F8BCD1A55F5FB7C29FE35A6460F245F08B67846FCCBE07559CF19D601 -ct = C83D91157EB6E5B5033B430B8F1004578C73134349DD120B8AC29496C2FA5C8762029E057FF023FE6BF3C02228B516F7E6B27444672C01DCB6021EE5D705EE284E2E592E99A8B327BF181E3E48036787BAE959AA50CA0A0E20773A555E7D9DFD4EDFE674F01D3E2C9ACDA45ED3008D414FFC10DB82EBDF5483B1A5E2A16E134008FEDCEABAFA830755321BF9A14FD218F3026B9DE3A69FDD6F0F5BD5FD2DB637C281E4AF00D5AA853CACAB943252021EE2CD55F52FA5D6050717ADE74242EB1E1546B3B02E0DCB4E00A7525351FF759732733E85B6D33D40ECCB0D028FB110F1E5BE9E2B2B6D7C87CADBA3EE50DBA37FB380C45B59F6D6242A4A7D8A3FA1554AA76449750C19C68B0CDD508533E86C248DBA0178935029B1149D5A256BB1E9A7AB0EC4E997DFBBCF88A89462BE9390190BAA036F166E9FB6CAAF0B4C3A005FC72AE5CFE99E74561EC50176F046B69E8F6ACFCF6C7E4143917652 -ss = 2F93D724C4655F62C3BC06277EFE84CB - -count = 40 -seed = 197E5D562DE7E01BED4FC597DB28DC6EFDF0179F3A5BDA5F94CAA39D67BAE730540534D59A7A06C8448F628DA8B7859F -pk = E2EDE84A8108232087E95C55D274AE9E40CFE4DC7815504CFF0C92D4AE62A53C6C42F1D7B45200B285478B34C6EDEBB5FDE3B68F6AB301CA6ED9C94F64C3F7AA9E5AC02E42BA75700D9F38445BA4E2FDA972EC627F5EDDC7145D8A61AB88A61561BC186EC67BAA7C706E9E0A8B005A4D7255622337F47C5C871F0555689EDEF50C61B3230291F27740CF64102B44334D37EB4B060CBD0BD18E95563ACDC4D8B314D6916001339DF3B4CC6469F7B426FE2D83D1A077167B61ABBD9382756A205A9D55FB54FB66FF30D6622D0700A28039A1F4083486171C119DA5E9002855AEF2BBBCE4EEE2B68E5F8837AD3C00C6E63D589CC5E14294F647DAEC7A8A9B9A3FAF8E18924255ED256500ED539030FBB9D3B93E007F301EE812A7B486B903326AD035B98AD887CEDCA58E6C1D8E1351D88551FECB51334396232B4E595FBF54699AD1B72E1AD5A54BA20000 -sk = 588760826DCFBD36D9ABE6AE44A669BB8637FC0C04E21E7629319A89BCDF0C2688D3F3C62E3DCB1FB5C67E01E2EDE84A8108232087E95C55D274AE9E40CFE4DC7815504CFF0C92D4AE62A53C6C42F1D7B45200B285478B34C6EDEBB5FDE3B68F6AB301CA6ED9C94F64C3F7AA9E5AC02E42BA75700D9F38445BA4E2FDA972EC627F5EDDC7145D8A61AB88A61561BC186EC67BAA7C706E9E0A8B005A4D7255622337F47C5C871F0555689EDEF50C61B3230291F27740CF64102B44334D37EB4B060CBD0BD18E95563ACDC4D8B314D6916001339DF3B4CC6469F7B426FE2D83D1A077167B61ABBD9382756A205A9D55FB54FB66FF30D6622D0700A28039A1F4083486171C119DA5E9002855AEF2BBBCE4EEE2B68E5F8837AD3C00C6E63D589CC5E14294F647DAEC7A8A9B9A3FAF8E18924255ED256500ED539030FBB9D3B93E007F301EE812A7B486B903326AD035B98AD887CEDCA58E6C1D8E1351D88551FECB51334396232B4E595FBF54699AD1B72E1AD5A54BA20000 -ct = AFA49BE5FA86BD3317A0DCB7B86B38B8A585B3D0755C127C6AF2CC1CE190363B0F40C14DB8B7F426D800348B2C2D0BF39788166178C90199BA184F96662741A6592D1FF1E777EF7B9AC68402067CA677243CAE3A5116A270C4A6362228DEE70595C4FD39E7F906C906BC36575E018814CA8FA5D7D16E0B75E1AD4E946EEF64D551769E00B7A58B13436382E0AB82A5759349EAE99A69339193DBD0B51115A3727CE689050155A5FE08145441C60C9D36A81E47DA6D1872B914D64BA1C8DB53DA264453A5E74A8B14D6401710069A9CAB211CA4C27964C94A69EBEE014EF1CB1743F35093C33F3692F13859955B2911CB6FDFDBB7CBBBC164FCF8772DC09EE0756C822269FF58F1A2DDF6273893228658B0F001DA2C9E0243F750B0C4E231DED2B56139938B079B2D9FDCF9198806689D4B6CB2659A28197C2BF4A22CE9AD87DDC2D2B54593703C1E1A01C3F0DE7422029F4E69CA6F91730C37ED -ss = B899E849D60739D059CF343F459E7230 - -count = 41 -seed = F170583CB451D8A45D105457C02C01A33A40350616ED8515BD49067142F61EFB00F07857E4FFF3FE11E7164C648C76ED -pk = 3E31D5B9C4FAA343548D389DA16BA6D1EF1E9124B45B7967EB704ECA8F92757AF6073766C60147D3E80197785B01222E937C6D5EF0180159E8EEFD36A81F83687BA289AD1D8F6B670FA6769FCAD4885D63B18B872DA9D237A7B3940D04167ABB9607A43C5857C50DA3CA41878C00158C037DF87BD887FE08B0D680CE17E3A155FEE2CA9C7C61E98C55DF845D7BFACEC8CA2C7D70A369F2F057CCD5E1C74FC3C968E49E260218E036B49BEE4E5B31A2B584695D24064EAEF02EB715E33DE8A47431AAAB5164D2962F7E019EB40CFCFFC34D4FE16EBF5B786A28EA67014C6B7B5DD887147DE93E26D968596B4D641BEF8510630F5270A06A1469DEBD3F97C2E2D7C41B57364E7A108B78EA7CF3C0F7D6B9FD93007B5799737117CAD561FA9715FB204C9048374CCE2149E09401CE7E9DCA4F083AEE4B0929EFC6844EA7151322154D30B974AE70FDF61701 -sk = 47550E9EDACB6DDCE3D9AB81F6B61080A9565C4770C1E638BEBFDAB6C9724C0371A22DF2F3EED0FFDACFE8003E31D5B9C4FAA343548D389DA16BA6D1EF1E9124B45B7967EB704ECA8F92757AF6073766C60147D3E80197785B01222E937C6D5EF0180159E8EEFD36A81F83687BA289AD1D8F6B670FA6769FCAD4885D63B18B872DA9D237A7B3940D04167ABB9607A43C5857C50DA3CA41878C00158C037DF87BD887FE08B0D680CE17E3A155FEE2CA9C7C61E98C55DF845D7BFACEC8CA2C7D70A369F2F057CCD5E1C74FC3C968E49E260218E036B49BEE4E5B31A2B584695D24064EAEF02EB715E33DE8A47431AAAB5164D2962F7E019EB40CFCFFC34D4FE16EBF5B786A28EA67014C6B7B5DD887147DE93E26D968596B4D641BEF8510630F5270A06A1469DEBD3F97C2E2D7C41B57364E7A108B78EA7CF3C0F7D6B9FD93007B5799737117CAD561FA9715FB204C9048374CCE2149E09401CE7E9DCA4F083AEE4B0929EFC6844EA7151322154D30B974AE70FDF61701 -ct = D650509DDE7464111B4EA141829D2AE11C99A6A6048D81F8E4B84FD3CF0C3A3CE1E517C383ED69872692629F221D2D7162CD48833E9501EC94E5FE08640D787EB57282DA5DA19A1AACF4E5F6404DB460B6CB6D080C1FAA0136FED6148677CB751CFBA76ACA6767283BF355D1EE00EF753300EACA94B208A403DB0A489E8FF98BB37245E70D51C1174DDC3CA05B1F8BF668E05BAF40C65AE7091E913DF829B59746559C60003709342F980D8CE03AB73468895480E419361B2703096ABBAE078BA806FD49961AF166D861E25A479C13BC91C94D2DF4C40CCD796B07018E876D89189D36FC852816D88ACD9818299AD1BF4B93214501951D759073173B99377241D2F026D90B71BDD749B429693CFF9AA4BD9A00F994B2155D0568C905C605DAD83B193BAC6E9845DF9ED18FE095329CAD5D874AB9BA3B0ADCD2C52F2E61D10F53D848E48CAC018766FD01C9EE56FFDF8B3A224FFFDB433440D874 -ss = 8FA20B8DCB491DE5FADF49328709045D - -count = 42 -seed = 44A6774B2CAC02DFF210FF861A090561A453DB311F47B6FEDB81811872D5D9489F5FC4103010139AE53FCAED209DC9BE -pk = F477C54C20925686C615D5AB3F02428BC4B70F39DAD2C2F11CD2860DC1D01BFEA151EF4C188984AB38FC3E2DA5F8FE3A335A3262F19D018CB15E9E2AF72D41D06897B3779A8583177D9EF3269F2C834B837E42FF81955DA7164F5B638828065E48B96FC85F92965337E8BD992D02930D37015A26C2107810FB12EFC8F28AA086207DEDF597C18835CCA2064274988189714A9979598AFF01CA0CF824D0148FA804478BAE00FEE5E5DFF9311703D37537936E1CC8DA59243DD3592FF877827F6CEB695693DD2E20A92A1A2B6D9E01BA9373ED8907B121DB11DCF49900153A06215D70E25D409559CC36562DBA68D97997FB101A02952BFBF27EF9EAA5C080C8FA617B69D6CCD09CF1F2CEBE4892D2FC0BF63F00E9D949CE085AC7D7A63D318FC7B5132EC9A7AE1D953C036ED557728109628043E89807D8AE94F0BD9015C0FC1896785FF765DCA75EEC01 -sk = 610AFB64BE8CC1DF288CFB016EE2F44CDEDFD97038566534837AE3FF6C465992390EF1D33871468E46101B01F477C54C20925686C615D5AB3F02428BC4B70F39DAD2C2F11CD2860DC1D01BFEA151EF4C188984AB38FC3E2DA5F8FE3A335A3262F19D018CB15E9E2AF72D41D06897B3779A8583177D9EF3269F2C834B837E42FF81955DA7164F5B638828065E48B96FC85F92965337E8BD992D02930D37015A26C2107810FB12EFC8F28AA086207DEDF597C18835CCA2064274988189714A9979598AFF01CA0CF824D0148FA804478BAE00FEE5E5DFF9311703D37537936E1CC8DA59243DD3592FF877827F6CEB695693DD2E20A92A1A2B6D9E01BA9373ED8907B121DB11DCF49900153A06215D70E25D409559CC36562DBA68D97997FB101A02952BFBF27EF9EAA5C080C8FA617B69D6CCD09CF1F2CEBE4892D2FC0BF63F00E9D949CE085AC7D7A63D318FC7B5132EC9A7AE1D953C036ED557728109628043E89807D8AE94F0BD9015C0FC1896785FF765DCA75EEC01 -ct = A9DC17012D96FB5A6C1532FAA8A61C3B85FFD45928E06CF1E020BBB15B37CDA74346408C54C14C08119827F6B21F3B8B2615C7A076F90090F484393B27BE9FA7E4443AA1233109A9E99D625DA9A44BA5EC706782C5597F2ECDA421D047CD8656470251154DA75008645B1B43B300E885C99264C5B4E695B2E7E34815CFEF4E01FE19BB010DA6E4C5EEC84F5A246C08A90141CA2C765622F57C125F8652D1730E30D2503B01CBAE0487ADAE6ED1E3F2110AA0F418C673952FE9F9A35547D9B970B506A571FE48F43D9563E2D5F441825934B5C5C7F0531D082B84D9015ADA11ADF397B2CD39356929CA5DCD3C380AAF76CA7463EDB9FDC12C7F10838C2428944BC0D95EDD10A6FD4C5819883C0EF6CAF0A84701B493C767C9EB9C9C8F03A6241C20123A3107DFDC305548F2C58B6C8AA9BF5D49257EE25042F0E214316F9AD0E14E6D326A3A3995B86200700075F95FCBE42E06D48D21DC51837F -ss = C42E0777D7ABAC1417C39BF318CF4F5A - -count = 43 -seed = 49E1855588B6235DF2A400C4A70AEDF8AB17B6E5E2891AA745F132FA2E7AB0C8117C1DF37C39F5D57624EB77C2B4A091 -pk = 84D7A1EA546985E802AA24458B19537402AE8C43332C8629EDB71C1A129659C593CEE32F282A35E423F15362DFCAAB4FDD695395AD1E00C00D169419B0F8BF1C6F9E46574912790A86B94BBD0ED436865CD55521B3ECA87CEA7594ACC5485DA814C0ACEE9307BBAB6FDA285DE40069F81A1369416A5CED9EFCD011543ED3274AC633F22C31DC1A4093CA76954D8172A40E0D388C8595843F98B8B6CFD916E3A2706616FB013ADC80396980A108B680E645BC8424A821C1D287639F196F001A11959A0C148F4BCA151A039FEB2D47DDC90C0839D079B1F0137FB8DD00872C73089A4EEDA971548E59F59ED959C443478185321E03B307120F2483C64C4EE1BE5427C353840F6C518CF8DC5DDE280A9AC485540017BA69AE6DF708043DDD11D7605A4E24A2C208C1D6E867BB0C25CAACCB0FEBE2D7D3E3881145CD089EC76B0957C63F08E63CDA04DE4A01 -sk = E1953800ACAA85AC02A906C72CB8E8D7AF2ED0F29F56400BB087C5C7CFC24CCD1756634FDD14A884C51DF90184D7A1EA546985E802AA24458B19537402AE8C43332C8629EDB71C1A129659C593CEE32F282A35E423F15362DFCAAB4FDD695395AD1E00C00D169419B0F8BF1C6F9E46574912790A86B94BBD0ED436865CD55521B3ECA87CEA7594ACC5485DA814C0ACEE9307BBAB6FDA285DE40069F81A1369416A5CED9EFCD011543ED3274AC633F22C31DC1A4093CA76954D8172A40E0D388C8595843F98B8B6CFD916E3A2706616FB013ADC80396980A108B680E645BC8424A821C1D287639F196F001A11959A0C148F4BCA151A039FEB2D47DDC90C0839D079B1F0137FB8DD00872C73089A4EEDA971548E59F59ED959C443478185321E03B307120F2483C64C4EE1BE5427C353840F6C518CF8DC5DDE280A9AC485540017BA69AE6DF708043DDD11D7605A4E24A2C208C1D6E867BB0C25CAACCB0FEBE2D7D3E3881145CD089EC76B0957C63F08E63CDA04DE4A01 -ct = 1BC8FE87FCE9963FCB70065B9039DA084F17CEDA8EF3793E1D7CFB64249EBE391D00C5372CBA206D6A9A4E170056E010A1C2EAF10C1A0188186E4586A3A0425F02CA497F8082FF39E732E36396D72C2BAF7D1600AC642251D0E4B32E604214675D6E00E8499693982C789003B7008899F0C38BB17139E7AB373E3E2E4060D52A4252ACDB7C36CA4497C5B9E4146F3C617CD35F4F831069B8585D3589EEA6E8AC50B0B92000D20613E79CFB402D1357E3BE6F588C5DD76834E152DAE7E6124E4BDCC85B93A499B26DDEFFAA8CD5CA15C5A70FD58DDB318E81FC026101878A361EFA8D395F5D1340E78FE675DADFCB58BD5E0DE320F118545686FE6A94089D7D811DC0C9940F68D2682192A069FCB427A3C4070125C3883CA5B298633EC03A5E05A387DEA577E9F50154DC5BB4D1225EDA565BC975DFF2B2DBEE75DBF06876FCC4947427E5353FC003EA01442743FB3385F49DDFC51F057E1A8A18 -ss = 801A1A7CA92866C67832D4E33D5C771B - -count = 44 -seed = DF0E41D2F6F86C1F79D31FD5878E7AB434FC0AF3A0D5F47D2AB3FEF31A42BD949B0E3629DF9F575BEFBB62E829E51DAE -pk = 1AF9AE7F5D9836088652DCF7DE5B92A5C07DAAEBF77D8A5CCFB27D1097A92DE3EF714E99876B513840FBC08BBE9AE75C33A25D78346801052153FC316DF0D26972AEC8E8BEF3F159B30E8787B562CE0902672275DD1C5994A83E3D0B2C086D7C4827A7458CBE52539663815333024C6D6984D36F47FFCBC2B3B819D9B4897AFB21879AC36D21971B2DD548AFB0DF557094422258AEBA3E4EBE3873E67C6CA05E03A5EA10012D1422E446F7632278FF4E7191FE22FB77CEE507C91E32969171CD4205B38BAA8BBE4FFDEE41CCA2392E4FEFC4AA5B4A9079822E45A3013E89DD87A8EBAA9FE2BC1FA1B9E4390D5A5549B78774E6EC21AECD5EB1E475E2C0810E8BABF4603D72C89D9429C956BAB82598E3220B00021F193E757551BB62941A47C8510F633629E0220CF4EF9D7617F5A50E44C914A9CCC5BA67688B2B7C7F5E6126993770662834DDAA3500 -sk = C719F9B2D16399B7326CE4ECA30DABEF8A7B00848AB1F261D351168973AD4E4DD3F28CBAFBDD282EF717D1011AF9AE7F5D9836088652DCF7DE5B92A5C07DAAEBF77D8A5CCFB27D1097A92DE3EF714E99876B513840FBC08BBE9AE75C33A25D78346801052153FC316DF0D26972AEC8E8BEF3F159B30E8787B562CE0902672275DD1C5994A83E3D0B2C086D7C4827A7458CBE52539663815333024C6D6984D36F47FFCBC2B3B819D9B4897AFB21879AC36D21971B2DD548AFB0DF557094422258AEBA3E4EBE3873E67C6CA05E03A5EA10012D1422E446F7632278FF4E7191FE22FB77CEE507C91E32969171CD4205B38BAA8BBE4FFDEE41CCA2392E4FEFC4AA5B4A9079822E45A3013E89DD87A8EBAA9FE2BC1FA1B9E4390D5A5549B78774E6EC21AECD5EB1E475E2C0810E8BABF4603D72C89D9429C956BAB82598E3220B00021F193E757551BB62941A47C8510F633629E0220CF4EF9D7617F5A50E44C914A9CCC5BA67688B2B7C7F5E6126993770662834DDAA3500 -ct = 2F76E5EB32E7476CBB33890AD997AA2A9DCAC8354E810D4E9BAC76EF28FF5E6B914DF4CFAF8E1A36FED7014FC3F7238FF1428B615A1D016EC2560EE809CA20204025E2E6F6ED7115A05545996D7B186FA2E83022075BD63FB800FA28A9762F02C17A8C89DE435236B742DC3D4701B5D654E2B09F9112D14E1922C8D579D68BDBC507C82422A770BF5AE64CDCB751A809A3804405E7984A68DF674847BE790985E3CF75A8002EF07B7732928F21FC87AB4E1FCED3BCF74B0982290511A60B5BE65E5FAC885426A8FB9550D6CAD225A8860DF034D8E3E088B63930650078854EEA7F6323F4C9F783F6F8D889769AF037AEAD6805BFC9DB1D408DBAD09680E99BD1E2B068968D0B934A2988453D1DB6AE1E124800246D8AB7C59A9F8C82D7567E316D2CD2D05D122042D9BFFF81E569A0AB5AA1EFACB0BE9851FB15511B9CAF745500E5A853F86940D40E01BF9B9F3E74418C343F2B9CA8E457C7D6 -ss = F8E403222BF0E2ADAF1F08C95D008ADA - -count = 45 -seed = D3C9EBBA6EB03CCB5C9B9D2C8D7F0CFBBF50841E24396CDDF0E56525B38918C2FBE6C34CC1B93F7BCD4F4D5777E1A488 -pk = 9BC769B4CD1637CC475A63DE751C41B30B71DE90A23301846EF3BE062DCA54C42EC189EFE6F5078E9EAEABBCFB3B182EA7108A82639D012EC1161215475CFEA257FC9F2625B40C34F4862E5077097D2D9263FE574C1236E07595A3BF8F40DB367D7C1753D39F98591AD363DA9501AE0EE69305F4E4076E6CABFD2EDBADBCD3D2D228C83C2A7BB0438DF57E9DF20A29FADF414F7803BFEB9E5566D797820B46A9E5FFB3AF00CABA26F15FC79C6E926D0309B95DA0DB28F0A00B6A9D25BBA050B24AE447896516543A215ABB6E056FBF0BF5AA9CF78B573AD94B90FD01671865145687EA8CAA6C695EAD2A250483F4F7375F22D253A54D02E07C2ECD84C3E2092D157512B00EBF797FE94A5ED0EEA0C55D8A000084BA5EFF506B09B6DFA30192F21A0D5332C52608B4F18BD7F89576D8E543AD55D316348E79FEA81734D1A00A9848A997207DD25055A000 -sk = E9ACBB774BE970206C3A738E243B420864E3C9BE202513B43165B8BE1F2DCE13088992F78B590D6DB2233A019BC769B4CD1637CC475A63DE751C41B30B71DE90A23301846EF3BE062DCA54C42EC189EFE6F5078E9EAEABBCFB3B182EA7108A82639D012EC1161215475CFEA257FC9F2625B40C34F4862E5077097D2D9263FE574C1236E07595A3BF8F40DB367D7C1753D39F98591AD363DA9501AE0EE69305F4E4076E6CABFD2EDBADBCD3D2D228C83C2A7BB0438DF57E9DF20A29FADF414F7803BFEB9E5566D797820B46A9E5FFB3AF00CABA26F15FC79C6E926D0309B95DA0DB28F0A00B6A9D25BBA050B24AE447896516543A215ABB6E056FBF0BF5AA9CF78B573AD94B90FD01671865145687EA8CAA6C695EAD2A250483F4F7375F22D253A54D02E07C2ECD84C3E2092D157512B00EBF797FE94A5ED0EEA0C55D8A000084BA5EFF506B09B6DFA30192F21A0D5332C52608B4F18BD7F89576D8E543AD55D316348E79FEA81734D1A00A9848A997207DD25055A000 -ct = DDC23AA5D837BBF6CFE201305B7A2CF7B84F83A9C1D7F5E935E9CCC006B0307FB97726983153D162511E93B6533B2E32A420C36A6F69005D543140F298B7B710D7F1FC6E94779E6D8C084C477C76C2406536B8A9ADC13E0DECD68A9658C804EB8EFD5EB6D14EEF5594462D331801711A94E2FE441A0729BC18BAC6291A2C2D51B1AB178F1B5160BDF300DE2C026AEC8B9000A7C33565890A44CCCAD08AF2868B61ECDA0C01238A092E7850F1C5BEEC3BA88421E28F8EFA6F8F5295CD36F0B46E479765D534178B05D7C85B7D4E14E4BB712A190F02565FFD954C36018992071DA173FE5E831A4CC7EFFDCC7C3DD024EB4188EA8892471187E935492B53B6E54AADE035DCEA5069329B772D6CBDAFD52E44B6016898CFDC928F424091B39B2511083978FC27FB3992893EF1C5AEC269FF90AF976996BA403802ECF3196FB9CE394BC934908074E291340002135143A60387AC1F0A5B6F7D9D8A7E -ss = 35E3D14C2920FC09FF5D0E159609FAE4 - -count = 46 -seed = 6B3996E8BC6F52879F2B7BE012C44AD555707CB7E5FD8ABB3457A298336D6FDC9EB7853008FF13201D5969A315C7E493 -pk = 3855AEE68558398E50CF49B80C47635620A9615408A1DAAA44F71DAEC5628B1AAA48A867F13B4176561BEAD2977FDD349D4D3179EAEE00D1422CF125602802F4AB08102F9DF7C424AC1D882C4EB39C29B147C560CE9FD6260037F9900CB052E4536B3532775A7F5B5BA99BA03901EE24DA256BFEA66EB5CAB03763B933A29156E72B0B82CE014403F4CB65ED06027256182ED0435E855F1EEF5A8B40348E47628041252A00750BC000779CEFD5B19E94D25C7ACCFF0C49D74362837A97719A8B31E11EEEDCC33FDEEC0760DE1862AA999485FF8AF8178CBA394922026E447E6AC2BAE3D31069764C8E0B80A2C749D94954010A324C49D737113AD179E8AAB6CF24B42967EBA28776671D563E852837501CC80094C3CD5041D31AE72717C1B747CF3351F878F356E351DA56DB8AD154FEA375AA878F6298C60F4FF501FEB44095E0F1D1A6AD6C91948401 -sk = C1B3CBFFAD4B306F9AF0CDD302887648D7C02BF6EF9C5C44B7D40B9BF861995EC09DBA98446A8F7B5E6E65013855AEE68558398E50CF49B80C47635620A9615408A1DAAA44F71DAEC5628B1AAA48A867F13B4176561BEAD2977FDD349D4D3179EAEE00D1422CF125602802F4AB08102F9DF7C424AC1D882C4EB39C29B147C560CE9FD6260037F9900CB052E4536B3532775A7F5B5BA99BA03901EE24DA256BFEA66EB5CAB03763B933A29156E72B0B82CE014403F4CB65ED06027256182ED0435E855F1EEF5A8B40348E47628041252A00750BC000779CEFD5B19E94D25C7ACCFF0C49D74362837A97719A8B31E11EEEDCC33FDEEC0760DE1862AA999485FF8AF8178CBA394922026E447E6AC2BAE3D31069764C8E0B80A2C749D94954010A324C49D737113AD179E8AAB6CF24B42967EBA28776671D563E852837501CC80094C3CD5041D31AE72717C1B747CF3351F878F356E351DA56DB8AD154FEA375AA878F6298C60F4FF501FEB44095E0F1D1A6AD6C91948401 -ct = C06089A9ABE630E39E6DCCFF03B9DCECFD69115739E62E64D186B1DB5F9F8E3DE5B026E4138CA882DE699AADD624E420D903EB6A120B003EA8028ADE6E15E68655597ECD81D8E0D7EC083C1B4FC520E70979DED438D25314CBCA659C1DE7105E98C35B1626064F6AC230CB77DE011A16D911A5929997DF29DF864BDE00B104334973FF05158371E37F795D4D5833D9CB9796516C092AC4EFC18074BA184415C79181E8E500F65C3380A3676B7685AAA50EBD536B3933FAB14B17EF85BFEEE90409B5563831068F0EE30864DBE8849C8D74583EAA142EB7E7AD39E70087462E7BD3D6127C2D57A5F5A2D3A73709D77C84A6B589A1DD2C128A2F6BC053FB383ECC695C101629D01D65967F103BBA75FF710D4E0114C3584E437750D652C54DE7CDC50193507136DFA2A7B88C09564FCD5635D3DE2E8D7BC12B2F814A829E29FA7F15D055A0A72A93101800E3F9AC7D3DB8E1F5C18953D09699492B -ss = 63FE00582274725260514057BF36BFB3 - -count = 47 -seed = 730B65ECE22DE27D573CE3AEA7CB021C415DF210D228808D91D4F380070FFCB0778B683C71D4853DEB569C822765F2A3 -pk = EA7F957F20FD5C7000B0F1F401355BF496C1644CE31F5640FAB4E5948603FA389D967E982A2F6367C777B5346D658969D6B6487CDCCD0087374CE621387C9316165D241E611C94573CB275BBE7F3EA03439273B5761702142F360E8FB87FDA01663127299123AEBB0017BA9420004D2516787A5CC733DE612F97B4F4B63FDDF898D2594457056B6D676D470510ADB8C09821D1CF6433B3FD1473CE158595D7D22BCB4C3C002454C724EAD9B3AC44C2121518757CE786778FE4F955A99EFDA20B531FD76684420288C8E74AA784F3C6D58A076095BA3A21193B1803003DF45FACFAA76D8F2C345A9A58E14B45B9BAF5260257A6BF6B20751676F604F0E75E6A69AC88557B9EB6B238C6402EDA6C44BC79D3CC006A2D6874D92531681EF09856096FF45FD89DA50E429973C4C74B6DDC8C436EB0B6E2A1725DBF26E357F3178E2D353BA245190A3461C700 -sk = FF7495B8575B5A98E4FD21FB4C3E58CBCD336920AAC5667CD62074B3D34C7C6EC0DDBCA8333F73AE42194700EA7F957F20FD5C7000B0F1F401355BF496C1644CE31F5640FAB4E5948603FA389D967E982A2F6367C777B5346D658969D6B6487CDCCD0087374CE621387C9316165D241E611C94573CB275BBE7F3EA03439273B5761702142F360E8FB87FDA01663127299123AEBB0017BA9420004D2516787A5CC733DE612F97B4F4B63FDDF898D2594457056B6D676D470510ADB8C09821D1CF6433B3FD1473CE158595D7D22BCB4C3C002454C724EAD9B3AC44C2121518757CE786778FE4F955A99EFDA20B531FD76684420288C8E74AA784F3C6D58A076095BA3A21193B1803003DF45FACFAA76D8F2C345A9A58E14B45B9BAF5260257A6BF6B20751676F604F0E75E6A69AC88557B9EB6B238C6402EDA6C44BC79D3CC006A2D6874D92531681EF09856096FF45FD89DA50E429973C4C74B6DDC8C436EB0B6E2A1725DBF26E357F3178E2D353BA245190A3461C700 -ct = 26457EAE4B95CA30CD09FCBA508DF98CE0E6FFEA62384B8EA08C0D7CB6D955560ECA8B6B66EBB98323A053B36197772CC29BD9E83656010AA821C165CB6B91E84C123D8B48233C45F64560327E3BCAA19CB17720220001E115D53AF3B659DBB3D27119DF32645FA2CBBE9694E00151CA76371C628F3D4530C6B2809FC7944EFD2F25E64F38A3381CD548D8731AB95A30D76EE9B8DCBDF74CA590B08C92921770C88487AB0032050C975F81DD857D3EB16744A97AC4C3F42BF12343FC7A2CE753AFBFA2F7FC4C136C9C1373E71FD76316D4F42BAF5EABC82DBD151B00B5C238B51B6ED6675DD9F4E80BAA7DC99030830F4ABB892774E766CBE0A4B480B1090C880192C7A71E75A5134D767E2847CCE03579CC00DED00B0E9A385260A0459629EA6AB8CDA972ED0BD697FCA88233A2D67404123B1C22796941A1B29E253EFBF49F0BFE4C5F59D13DB2A301B3645995DE74A846A14A5262D60949F3 -ss = 9A176F2E3F1B00AC7385E9CE14BD60A6 - -count = 48 -seed = 5522A5A891A9A9B5514F4556AFD8DF40B9CEC63A01492F0CB8A1DB073A285A963E4A9FF2376C88662F7D8D241F8ACF17 -pk = 8F8D1BA886220CC3AC2EE16698A510D95BB9B1E9CE880FC9574F4CA4359951E45AC9178E60DA2F38D64D19E9209B8261F7CCB74371EA01E420CEDFFCEC2A3A140F029D7A9AE33BE1594661C0667D0583141DF26C19FEE2933C8C56A2E7A2D9153A3C48EF0596977AD6AB0931F000A5ECC743B390253F8BA48A2E62FB4D4561E226F659E145BCC22E34FA66A6E4C66831DF931CF2AC756B682A55CACABF5A0FF27067F4730178E62498DE47AAB31531B35D552178F04B4E98CA7A6F236E58060F18121B2FD3A7AA180717788220C74C8986AA8B0AF7C4357687A20C01A179F3778C715BBC0D2BB89FC3C04BC8C1CF072B245B73CEF3821E48A744E118F5D3226E6F0F976B6A06D70678113904349E5B66043E01621C8D8F6C3E72222B2927F75CB14196DF99736978705E9248138DEF65A7351615199784B700E453858A7256AC52F5A7065126C3173601 -sk = BDC3FBA1C32751139FC45BACFFB3EA97209C6B9A077825C43E36AA2E13D7B93FE5364DCEC0D2F23E705E3B008F8D1BA886220CC3AC2EE16698A510D95BB9B1E9CE880FC9574F4CA4359951E45AC9178E60DA2F38D64D19E9209B8261F7CCB74371EA01E420CEDFFCEC2A3A140F029D7A9AE33BE1594661C0667D0583141DF26C19FEE2933C8C56A2E7A2D9153A3C48EF0596977AD6AB0931F000A5ECC743B390253F8BA48A2E62FB4D4561E226F659E145BCC22E34FA66A6E4C66831DF931CF2AC756B682A55CACABF5A0FF27067F4730178E62498DE47AAB31531B35D552178F04B4E98CA7A6F236E58060F18121B2FD3A7AA180717788220C74C8986AA8B0AF7C4357687A20C01A179F3778C715BBC0D2BB89FC3C04BC8C1CF072B245B73CEF3821E48A744E118F5D3226E6F0F976B6A06D70678113904349E5B66043E01621C8D8F6C3E72222B2927F75CB14196DF99736978705E9248138DEF65A7351615199784B700E453858A7256AC52F5A7065126C3173601 -ct = 878A0E555EE2243BEE1CDA2BD6DDCEAA0CE5269DF7C2B71C78DE51194FFF8F613D7065D790C38F5A30744A597616718BD4509FF988390143B08C52B658E64E81D267128E56605607A3A6CC903B265FF6B8F4A141B5E2BACC453C5178D992CFA662DF049BFDC13425B08F624E7900A32599CDB0B7899AC104D7A6BFD9866407C2DC477497D381357A7A5B1E2CA3BEE48B6CE31764757BC91BA90F678D0FD4456985383628004F0B1C929384E1CFF8E2B838472C284AD23A631D8B189AA048A58D1F9327B5B139B60047E2C9FCD3F4AFC1ADA2EE88CBAE8F1F6A341C01D3FCA36C8FFEF006BAB338363745230AB09EF0C2EADA67DF23F08C67D082349D12864ABFEFD0677F8CD253B7C4B5985AE13D89FB762001F54B4A50021FA3C7AACA6DAD85D540EDC2127CA638ED8C2B52DD0F607895C347B27990A2EA5E2F565F2EE45B977C40E8266ADE4A4B250068964C321EE0E31973B6F9906D1C1236 -ss = 7388DE674871722069D24664917D44B1 - -count = 49 -seed = 1853E72329353B3F89AE6A1B1EF700DA8ED3C10D19F9E61EE9252E28EBB0E15802EE43083A12A0B7527088832605E3AB -pk = F244A7FA24F6046396C3EF3B0DE1739DACF1801CA178DEBF5F20A3849942C1DE4BE218A44434B95CB07573984A466B5AE03564A78310016FB3DEAE453101ED20E832B441EB82B55268F0C584ED9707914E270F7FC9FCE597C63F65B6378550332D998E9C047E4021AAD922441E01B6283505788EEB23CA1E34044D76CB8278EF97997F78D0132CB1E522CB047C50B239F73E5E33EE354408209B5AFA7D0C86AEE02121DD014D12417972032548E3D3AE9032861A01174426B8661253D31680E59F8C8901471EE733669E7E2DFE36262F23E01B1ED4E73A86B5D2C80197C6F5859B8F6DCC50D4F8CEEAE3A913155EBAF952CC1AC150CD22A66A6E0ED2C0B292A04E620E8E7177133B7334AC89CA6B93290AE100266845387F657467A1C93AF638759EE43E6D780D9C485CBCB8B9995FFE771954F93B5B41B3E96F3A57EADF5F833B5E704C845C2EF26E01 -sk = 447F6076A627BBC5AD7773FBFEB14B4BDC2C66BC573F32EF57526D55DC22497E8C412552485CA51850F29800F244A7FA24F6046396C3EF3B0DE1739DACF1801CA178DEBF5F20A3849942C1DE4BE218A44434B95CB07573984A466B5AE03564A78310016FB3DEAE453101ED20E832B441EB82B55268F0C584ED9707914E270F7FC9FCE597C63F65B6378550332D998E9C047E4021AAD922441E01B6283505788EEB23CA1E34044D76CB8278EF97997F78D0132CB1E522CB047C50B239F73E5E33EE354408209B5AFA7D0C86AEE02121DD014D12417972032548E3D3AE9032861A01174426B8661253D31680E59F8C8901471EE733669E7E2DFE36262F23E01B1ED4E73A86B5D2C80197C6F5859B8F6DCC50D4F8CEEAE3A913155EBAF952CC1AC150CD22A66A6E0ED2C0B292A04E620E8E7177133B7334AC89CA6B93290AE100266845387F657467A1C93AF638759EE43E6D780D9C485CBCB8B9995FFE771954F93B5B41B3E96F3A57EADF5F833B5E704C845C2EF26E01 -ct = B5FC58AB9096E102E2D28E52B8D2FA2BD5C01C2C6E3BC8FFC34FC49AC77E2EC3CF8312D537D6E93B1853B012872CD64E68A7856D2C570089296B09E609162B52D7FCC3FDFF1F4ABD89D4AA29E72623DD661175BDEB2E1232EDDC5D56D0F3D85FDB888D6A47E337819E31AEA1DC01B44BCB2982C0F4FD367041A48F32F794D5180A7B85940C420424C4BD7075FB60708A006D914311DFB496E6745EFB07AE5E0A5B524EDD00C7BB4DCD4CE64C2333EAF1A69D0FB38BC9802AEF65AE90337F9B59DD881D3CB9615DABC8B6BD7B33AD887D70E1ACC0B8D17334FAD63C00F300B94853EC93E4350D73EE2D26361F8813446BD9C98567EE0CFBB7CBE4336E9C8AC43260F71749D86F54494FB5051FB9BA727917E901C30DA11BFA89D651F9C2266C5E93C8DED379CE219F72BDA5C1A372CE01AFAE819A63D955E79251A0368A03923C587DF047C46C7EE7E801E417AEA7630FA259A363A29014AA543A -ss = 82BE0F91FFED9DF2F66E264621DA7121 - -count = 50 -seed = 027C3D5847ED4470931141104F25B19AE76117CBB64B224EE424FFB782E9A0E988839E0BDED0DF666FE8E5FCBB5DBC09 -pk = 4F780D5C1047ECF584DD204B2CC68102DD0FE9D5FAED786302D8DD7DF41617F9BDFFB120EDE1BCB1E653BEAA873996AE53FC5EB07B2F01FF0C6E0F885525E214E8A6E9F92A8D69E10FF9660E5FA5DF6FE843BE5DA347B44ABA8B14535BF8380C1D1B692AA345F9E5E79AA1E3DA01410F49FBD5B13128156D84F801E5521C91903FA14740D393149BE1A94221EB95F10AF676CBEA84C6DA1E94B08547FACF44ED219200BA01E52161E21BD716AB760DF8C54A7A9838326C1811340ED2E1ADB1F33707CCFAF252E0211C6882C0F74C4DC275385430BA0845446E3533022972C815F0D257E308E7745F5A2FA40F3BBAD0850A6BD0AE2C7D2EE4174827E7796015EB8214ABE8CC102E381B599C4330D26BCAB0E2000E27A842342E7CAB920BCEBE5C69E5F1A0792B43A19006E20B45DB8D1B3133928CF2703680B7956EC2930D1CA626B7393C7EC9450E4600 -sk = 2D5DF64D62CB07FE630310BB801C658D90CB357285DAFC246676B8CA88987EBE61947D3FFEFF00BFFBC37F014F780D5C1047ECF584DD204B2CC68102DD0FE9D5FAED786302D8DD7DF41617F9BDFFB120EDE1BCB1E653BEAA873996AE53FC5EB07B2F01FF0C6E0F885525E214E8A6E9F92A8D69E10FF9660E5FA5DF6FE843BE5DA347B44ABA8B14535BF8380C1D1B692AA345F9E5E79AA1E3DA01410F49FBD5B13128156D84F801E5521C91903FA14740D393149BE1A94221EB95F10AF676CBEA84C6DA1E94B08547FACF44ED219200BA01E52161E21BD716AB760DF8C54A7A9838326C1811340ED2E1ADB1F33707CCFAF252E0211C6882C0F74C4DC275385430BA0845446E3533022972C815F0D257E308E7745F5A2FA40F3BBAD0850A6BD0AE2C7D2EE4174827E7796015EB8214ABE8CC102E381B599C4330D26BCAB0E2000E27A842342E7CAB920BCEBE5C69E5F1A0792B43A19006E20B45DB8D1B3133928CF2703680B7956EC2930D1CA626B7393C7EC9450E4600 -ct = F548B40FD2C1EC3E8BFD0A62B27016E93BC56A588F4DEFED3CE0D90B43EEB098391369587286E7CFC4A1926E9D9CBBB1162DB9416F04018DF7076B3A2EFC440EA7DE93EE8C3FF5AEF157A68CC7DCC79D56872F6055C982DE9152263C94C4BD1E635AC20CD2AA344D1550439B1602C21351776DD3E4BD31AA96322197B34271004F31FA483E7EF0EF9D0F9C9ECC57A179541B9C00BC09F4840AAF148B2E98D3D763DCFEE200B0D7CFCFE68D38B274CFFC44A2297DBF084E2B74F7914BC41C7DB62ADA327481133BC7CB2E1CFA93966F0D2A20172F3576C70407DEBC002DAEF9065C775CE1D91277F2835DCAB79294BAF2BD6AA51C0724B50A388E0DD9F1A575C2AEA38C1706FBDEB785D3A3FDD9E487B370490182B3CD180E1E0B7F42705C5ADA72039136EA84ABB920C708F1720F7DEA928C179E9429F9BF79E7F951F0CA332D04667160265E269A1000B8C3CD96AA512D829EE245A27BCC653D -ss = 6D343ABF2D3FE4ED15E5B57E54EFCD94 - -count = 51 -seed = 450751D4401737459C6D93E6C5F2FBCC4A3AF7CD7250CCF404BBB817A67BAB7B4C9D0EF4570BFE25CF919DA331C31D88 -pk = 2CD1C8A305F9501C0604C394B9963F61FC0F78FFDEFC2EB81369B124A5CA4AC5D6BEA02FB7BF4F07924234F9F385F3CFFFBFD6F0A82002AFA5FE622B6FB7312620502F004A8D7E7EA56D3DCFC0D3D99E19FF6ECC021673079D2472C33586A0B7D5937B7E29E6A2C7E79BBC1E7001C3CC35B76571C4D83BDBDD799256DDB2E17902DFD5E7EC0FDC821417D0DE7D0C93D26F4939D23135D3C29ED81DA9F928A553AD5F29D000B4A4A12BEE57602205540C4892FFB14012FEDE6ADC42B7FFC3AF0AA0E9D8A9E879E6AB8883C8157A5A8FE82EAF33527F871693FA29E201E081A3336718AB915CFC73ECFF7D73B00F3B631949DFE96B95A96AF9EEE8142F82DDFB66C86C1C012B11CE5E0E01CF4AF60E61B4CF7E0032982D766A5707D9D2D5C0CAC23D954C8446475DA29111C52FE6A9E13DD82F6160AADD4CE1AEB0A4804A3EB66666B179BC056BA249A701 -sk = 25056D1B8113BB362DD979D98643D7A79399C9B80D3F4839CB33CA0C0DC8C1577E4CEA5B8088492E452ECB002CD1C8A305F9501C0604C394B9963F61FC0F78FFDEFC2EB81369B124A5CA4AC5D6BEA02FB7BF4F07924234F9F385F3CFFFBFD6F0A82002AFA5FE622B6FB7312620502F004A8D7E7EA56D3DCFC0D3D99E19FF6ECC021673079D2472C33586A0B7D5937B7E29E6A2C7E79BBC1E7001C3CC35B76571C4D83BDBDD799256DDB2E17902DFD5E7EC0FDC821417D0DE7D0C93D26F4939D23135D3C29ED81DA9F928A553AD5F29D000B4A4A12BEE57602205540C4892FFB14012FEDE6ADC42B7FFC3AF0AA0E9D8A9E879E6AB8883C8157A5A8FE82EAF33527F871693FA29E201E081A3336718AB915CFC73ECFF7D73B00F3B631949DFE96B95A96AF9EEE8142F82DDFB66C86C1C012B11CE5E0E01CF4AF60E61B4CF7E0032982D766A5707D9D2D5C0CAC23D954C8446475DA29111C52FE6A9E13DD82F6160AADD4CE1AEB0A4804A3EB66666B179BC056BA249A701 -ct = E85E324EEBCE9BF2F204EDBADFCFF08FE598C6A66FE2861D88581F4374F3B30873DEAD8E63A2F4744C572A93CC8F8E1D02AF0CF690D600BDDFBD945A9CE99547A5ECB8884EBCAA85E56EACBE8FE3030F45E242B030FA301C08D054B2DEC4F8359F82F1F9CE73423587AEB43F3E01F14D62C6987D489C4D0994216CC83B6A26921CA1129DF61346A35B22A0E729CB766BF5216303E4CA189C477AC74C1698866C91F268BE010772A51B856405D105959F3AD8B48E7118758AA9AF90BF8CBA40ABFB581D9880CEFDBA851C690568DE7D4B2441591BA2B89B19AE30AC010BB2A2BF203380B15C7B42F72413CBC7835C1401530685E4EB8BD5BAEFC67B6F0AB2154F76362340F267A228E3AA7C714583CDD45131013B7CA4583B428F7716B8C6E796FF806FDA50112208F5D2786FC3A09258BA5A2532FA1B3A420FA3B505824A6EFCB768524A63AB055EA1004F92DDC352EDF886326216EF59206323 -ss = A1C30FF86FDE868B5D09FBADC336D4DC - -count = 52 -seed = 5DE720F2D152BF4E1F96A61E7AE5F1BED6B8548E32638C2CCEC9F43B87D1BB43DFCF334F0582984D27E440D519AB662F -pk = 380B70236FABDF82BDBC9BE250DCD716A1DEF6D53310EDCDFEB262943E2423FE42DDE0E6FF179EB9948323A9574AC0D2F3597FCD584E00AD39DC89E0A590ADFB6DA42D7FF54F4E07478D4F86A9987E95FCC26145544FB8ACC0D0B3338A3BC0D7EEE2715BA01D5FB25C209C30E9009FBB8B132CFC249A491B042A7A18AC3EC1E58F82164CB0B1D762598EDFE3E769F68317D5409E21F312D91F6A9091385F74D0118712B60098105DE309BAB85BD40A2788EC6A88A3D3A18E961176E8068F91243FE5C060B0346A7212182F4C5925DED2F1EF2212EC3AA04F46FFC901F01F9B2B62C514831D9CD8F9CCC49648B114772D1BF43D390EBC097A1FFEA3CEFB48621D3C8C03C6E3516EB99BB7034E7A526BA3757F00158C0AE3E08733E1463DA1219228E3DEB33E486209CF48D8035B2048FFB4776A8A98CEE549A89EA8B318E47315F4AD5E8580429AF6A501 -sk = E4D34E12982AEEB1D62FD488D9B9E2856F1336F0D4E622E3E950AD12176C29F0880458774FCCAD78D080F101380B70236FABDF82BDBC9BE250DCD716A1DEF6D53310EDCDFEB262943E2423FE42DDE0E6FF179EB9948323A9574AC0D2F3597FCD584E00AD39DC89E0A590ADFB6DA42D7FF54F4E07478D4F86A9987E95FCC26145544FB8ACC0D0B3338A3BC0D7EEE2715BA01D5FB25C209C30E9009FBB8B132CFC249A491B042A7A18AC3EC1E58F82164CB0B1D762598EDFE3E769F68317D5409E21F312D91F6A9091385F74D0118712B60098105DE309BAB85BD40A2788EC6A88A3D3A18E961176E8068F91243FE5C060B0346A7212182F4C5925DED2F1EF2212EC3AA04F46FFC901F01F9B2B62C514831D9CD8F9CCC49648B114772D1BF43D390EBC097A1FFEA3CEFB48621D3C8C03C6E3516EB99BB7034E7A526BA3757F00158C0AE3E08733E1463DA1219228E3DEB33E486209CF48D8035B2048FFB4776A8A98CEE549A89EA8B318E47315F4AD5E8580429AF6A501 -ct = 9A1733FC5D0AA11B4E294DEAF5B01567EA0EF9FA77BECB1DF566B06B3EA4B4E8A7273DB7EB99E1D9B11FDC4110A78B5843C61D4ED26E01B8180AD4E3637DF908B73EDD4F5F2F2E14CFB16FDFBF5004C36DE8AFBAA7EEBDFB4B02ABF5B39E927B5854A7ED7DC6E7854017226E19009C96CF54BB174F5AC38629E0C5865B0F7013E60C66C41E830CC1572F563C27734C3494488405544C94F68DB14863EA98528B7ABE6E3F019CF8108265915C68359D0E403DDDA592F76C3B114BB5B3C8FAD5DC801E9622EE8A5D95C35EB0B7DBFB5F2645C0BA027019B7DBBC0E4101533F462812A12ECBC1E8BDE6E358E16510ADEAA22F4FA4A332DDE5D0FEF3937D946D5BFD34011B1C6D2C7327DA4533BA02480370D3690198C8EE9736410AA5D74A85D1D19DFF276C01420418C50537A647CD589E40DB27695A49F7E8A56EE4F440F9E7184F1FB84CD76D5CA4B300F979FD4BD304EBD2B068FD18B7EE3F91 -ss = EEC1AEF4A49E035594CF00B7C02F9019 - -count = 53 -seed = D71729DCBB27D7CB39E9E905025D3E55C8602EFBCC483C9B866EBF82326157833169243C14550AD728BD1470F39C642E -pk = 737261D6870E16D9090AF3C4BFE788C0B31975F27AE90F44FBCBC8903CD79FD2327FDD89DFD4E1EA6DF35641563096FAECD0CD4ABE18014A0D070A5393BBE654585E5A932891DA67ABA32F8D80DF166E64F95072B751FABE434F38C62D7DAF8F7A50D03C6C09E9ACD9EDAAD7B9016072EA9BCD673D3E1B365CA17A2F17D6434D96EF04FACBB4D835B1974D4664DD5813621E895F3C01988D06B371932840C105E819D38E00C634BA9772B227A3B17D104744A4D3F2E0E4923A65FD97133BC854F4815021769E4122824CFECA04D20B1F122DDD175EBE095C3DA94E00B41D9B0B73D49FDB1DF811FD013C5DC69B66E291100794381D04EB4EC9588ED23C68DE7165EBA479E831C34EAB7EE12C4BE2FC9C07C200229C9B3479F3265BF2B45C86DD37A0F7107EB01BB034D2F65A8E996DA3A415D7FBC6E420D1B253FB25B827148D4D4A3278107BE77D3101 -sk = CD6A99396EB3539CA663A51E42063A3A6E29681BA52735192A80FA5D709F1AF1417DEA2C3235668327427600737261D6870E16D9090AF3C4BFE788C0B31975F27AE90F44FBCBC8903CD79FD2327FDD89DFD4E1EA6DF35641563096FAECD0CD4ABE18014A0D070A5393BBE654585E5A932891DA67ABA32F8D80DF166E64F95072B751FABE434F38C62D7DAF8F7A50D03C6C09E9ACD9EDAAD7B9016072EA9BCD673D3E1B365CA17A2F17D6434D96EF04FACBB4D835B1974D4664DD5813621E895F3C01988D06B371932840C105E819D38E00C634BA9772B227A3B17D104744A4D3F2E0E4923A65FD97133BC854F4815021769E4122824CFECA04D20B1F122DDD175EBE095C3DA94E00B41D9B0B73D49FDB1DF811FD013C5DC69B66E291100794381D04EB4EC9588ED23C68DE7165EBA479E831C34EAB7EE12C4BE2FC9C07C200229C9B3479F3265BF2B45C86DD37A0F7107EB01BB034D2F65A8E996DA3A415D7FBC6E420D1B253FB25B827148D4D4A3278107BE77D3101 -ct = 4D0CA2C37A3B14E09C0970DAA3CC5C13B486C4993AC910D2E72260D2382CC0D50603648B715D31CF7081CF709F76F456BF031FAFE27301CDEA5086C041DC07F5B582B71123A85C5C6D461C027C8772E6D4B0D9F2AACA2EAFD46702145AAD45895A160E11BA17B97538DC0668EC00CF5116041498764E937498EC2D2E0854C0DF508570FCCB74E9C659CCE5534383341EAFC0D0620A137D08519E38993660AFBB6C1E73620153DE56C904BE16E6753A552394A49EF9925667888DAEF0FA8BDB604382B03991C02BEC4861A37E711BE96E926A4AEFA5F5568AE2495501FD96148155C2377B16CACC5A26EE3836E6383C15A1C2D63BE77C4A99A36F62AEE32D10C22B7A569E654DD72E8F1444DF45A2B00AA346009153B38CB839CB211F8F3E5D5D348E0D43FCC66267F170432F5D3BF4879440C682DAA27E476F254795F06870EEB8C54A0ED96C7FAC34005D837019AB202BBE4609D72644445F88 -ss = 0BF8ED57229D0B958D41DC39CA6C6F94 - -count = 54 -seed = A7C2C8EDB3601396BEB2DF0657EC82FD5780A2723581A9E03DEE1CDB018440439BB1142CAB0487C5D136E9AF46338AB7 -pk = C51FAF1A4F4EB85E1A508A4336D492BD270A710C0E38343D0383ACEA2137A54D189C4BDF485F857AD58E15A40C7DE89DA8DAB22073B500D684BC760EFF8A3B7F44E200136DDFB82CE6D182D406A71ECA2FAA1799559C898465326977C83722F06FA6AE8974A18FB1C6EDFA133202DDE3DAFB931137F0C263C5E937F054C725B96F97B6F847CAAE501CBACC0536D1B372F3517ED9123D99061E3073019B2B66CCD6B15F480131BF3DE062F1DF0D2A6505BB1C30D5C0FDF2E66ABF83261C2E66F7D9FD19030FEA7C2655380EAEF87841A9F1479E18F07E8FA88063360111D8D730E5DE04520973CF5810B7FD02D9858C49039236B7AEA9ED490A12435EC24AD39CD01621CB50CA54E89B9C4AB00ACBBFCEA6ED007D14CC2B9BE43B59CEAD6D1B576AE686F13BC1482DE32043F07478961FD15E7C3FB17C373560BF2F9294541B7BE1C6DFE47C065B68FF01 -sk = 6C8C53ED6F65E6B2E324B84364E10DE4705B6EA889FB97589AD7990177A19ADB0CE37B4B5A51758E7D70E901C51FAF1A4F4EB85E1A508A4336D492BD270A710C0E38343D0383ACEA2137A54D189C4BDF485F857AD58E15A40C7DE89DA8DAB22073B500D684BC760EFF8A3B7F44E200136DDFB82CE6D182D406A71ECA2FAA1799559C898465326977C83722F06FA6AE8974A18FB1C6EDFA133202DDE3DAFB931137F0C263C5E937F054C725B96F97B6F847CAAE501CBACC0536D1B372F3517ED9123D99061E3073019B2B66CCD6B15F480131BF3DE062F1DF0D2A6505BB1C30D5C0FDF2E66ABF83261C2E66F7D9FD19030FEA7C2655380EAEF87841A9F1479E18F07E8FA88063360111D8D730E5DE04520973CF5810B7FD02D9858C49039236B7AEA9ED490A12435EC24AD39CD01621CB50CA54E89B9C4AB00ACBBFCEA6ED007D14CC2B9BE43B59CEAD6D1B576AE686F13BC1482DE32043F07478961FD15E7C3FB17C373560BF2F9294541B7BE1C6DFE47C065B68FF01 -ct = 32EB94DF91D635A31EAE1AE81C1319CD2E10B0AA35660BA45B99D982CBE07A2644FEC754C4FC59EEBED7E0D433FBE598F9E9C3B195B200788887150928874EF338D15A08F5F6C2ED66244A91463904374734F105389F3E9ADDC5330884A9E7465DAAD09A9CE2DD043FC2584A4900A9D434E262120FF948EA630359FF1A71483407879194C8D3B6A381CEBF5AFEFF661EC4B8C70CC9A22C99BF21474549F3538287318FE701FFF517B3F92D678AB79443386E4DA40256B861A43A0CB3D9EC5F2A4AD524373BE0D2DC495E49480234BCF67B01521E9FF2AD7771480E00C95705535765F7D4DFC9096927485FF15B5AB236A7755E51BED99B5F2A939367E444F68C0472AE8466049BCF5542D471CB332D36FC9E0049052B4EA30C9BC4133DA5DBE23A5616FBB1C0B98273C1C788C18D872A4452C094F8B15B94F9FB6204B24C5F6FA27FC2EB60A1B371B401EA3C58F71D6E68E43E0973F3552F9BB4 -ss = A3ABAE416B3EFD3FA907D5C21E9B8F51 - -count = 55 -seed = 467F6158CB86B724039FF18C47950AE5C49170163C910FC9A9B30141F86E9C06EBCEC91497BCD156D95758C9F0C6EF91 -pk = 98B2D052F7DCE2E26A25D28006AD08D1A9DA8E1FB331DA9E349AB449F6F0B1074A859AAB5D4B3241553180FF0C944E6B317190AF3A9100FD5063623C9B346C0F47D8D5FF62821E30E7B1D47095DFA078360D75B58F5042C198042DE71B87400708D4BFDB97B1A1CE57A0CD56EE00064C826AFA29AA726354C553F3DB19BDCCE701929E5EDEAF3F1F8D2214F917AF9AADD08C6DDC3CCBE6FA7B4EC45E9FC5FF3A946EF5B000753F2D2F8D043196AA802573104B5473CEC0E991E79472E00352954F82F202DECFD7ED39C80CDAFA88A952DDA57AA6C98DB30E61295F0006B8487B9575A04D5B699FD88C7AE8EC3D3D3F4F579C92427309243FCB2510D32900A25C452C857EABE89851FA2E634A15AF0761E42700A240DDE2201897B61DB0561632371BF5B14323B1DA1300A80AFC00E1A6B4853E7792695B4E9CAFF6F398BA01B5AB13C7DBABBC9379E800 -sk = 2107204CD995F1DF14314D5381F8C544036C7CF2D797F1DD5D2E23E80727FEAA67B5F019FE8AD45F1F7DB80198B2D052F7DCE2E26A25D28006AD08D1A9DA8E1FB331DA9E349AB449F6F0B1074A859AAB5D4B3241553180FF0C944E6B317190AF3A9100FD5063623C9B346C0F47D8D5FF62821E30E7B1D47095DFA078360D75B58F5042C198042DE71B87400708D4BFDB97B1A1CE57A0CD56EE00064C826AFA29AA726354C553F3DB19BDCCE701929E5EDEAF3F1F8D2214F917AF9AADD08C6DDC3CCBE6FA7B4EC45E9FC5FF3A946EF5B000753F2D2F8D043196AA802573104B5473CEC0E991E79472E00352954F82F202DECFD7ED39C80CDAFA88A952DDA57AA6C98DB30E61295F0006B8487B9575A04D5B699FD88C7AE8EC3D3D3F4F579C92427309243FCB2510D32900A25C452C857EABE89851FA2E634A15AF0761E42700A240DDE2201897B61DB0561632371BF5B14323B1DA1300A80AFC00E1A6B4853E7792695B4E9CAFF6F398BA01B5AB13C7DBABBC9379E800 -ct = E716FD738B7AA39239F4352BD27A7922F410A62AFC46AA4571080446FFF818E5EBB67E2FC799639FF75E7E8F1995E1369C683880224C002644DC773AF4F1F2B4A2C2A1A709BF2DA46C9813832DB3D404F09FD7CD3967ED3E9472F17556457C5E1B49446B3469990FF8E67B6F83001B547A5DAD929DE07DB1B25021F5E993A7E3B2AAA602380BDD8D6313EFBD26186AC880D9D842A9F0A0F91C8EE128A148CB566153D56400221C5ED3A4BAAC79F73ACEBC82C5647872140D38BAF4721D00BD0C10162848B68B83891C89A6832F1A5F3AC01483D47B9C0EA6A8DBED017672A221A099E9FC2A5C4C53E265001D2AEBEF0EAD8F44EA1671B6662E631F56CDA9062354C84DD9B49220262941AB9FA033C87C78CB004115282DC18AEA80E07A959104F19EA5972EBFA824E9D27D96ACF615B7747337E007F2BB32E634773E44D49FD1D0FE2D15BDF82E86F500FEF58818E5BDA791C1C85FFB43677F10 -ss = 66A0B0B4DF621E5AA3B0D21CDD7D9164 - -count = 56 -seed = 687C02DE1041ABAC7B2C1E6EC2A7C3375552ED5EDB10E3A8139C24CC76BDA44D719D8121A81D47A0B762B4E9EEB85235 -pk = 702701BF3674F2824EF3526FDCB0356222C384393E292FF2D6D90709E8417ABA6B8ACE3A569A1B513D29A006CF117A16B2B0978E880200706B2E913CE9CC0C9E4D0D239C538578D05D3A7716538E1527A02A9002E99B9C47B5CC201224E7F5BB25DAB559B9B0BC4E339063446700AFDB94426D4F8E34CFCFD65A62E1E2EF3BD375AAB11BCB284FD98EC717FAEABE811D0DE96E245DC7C45D8D60FA136A9C319D2D5AD77D010B872AAE5011B8F9F21CB54AE07985FE4E8EB9F41E118D2F7C77887B3E70B53718F1DFE0DAF1F17DD06E2EECAE612951AB03F38EB63800C23C3C4385FEE2C1BD670E20290DC7734F9DC4BEBFE546A91615A2899B0534A35E8AAD6D580B0A3B48DC60DBFB01A72AFE3591964CC5010396224D19D0837AF24BCE050A68C93F7CB2B29D3B470694A5AE337FD4C2DE384052B40F0AFBF3A122B242A3B1A6F1977E66D6A7BA1402 -sk = 63A925685A8AC5BBD918FAA33AC397D16D3E9BFDC871811E8827E576118AA548CB46A1B5E1A4B63823FE1C01702701BF3674F2824EF3526FDCB0356222C384393E292FF2D6D90709E8417ABA6B8ACE3A569A1B513D29A006CF117A16B2B0978E880200706B2E913CE9CC0C9E4D0D239C538578D05D3A7716538E1527A02A9002E99B9C47B5CC201224E7F5BB25DAB559B9B0BC4E339063446700AFDB94426D4F8E34CFCFD65A62E1E2EF3BD375AAB11BCB284FD98EC717FAEABE811D0DE96E245DC7C45D8D60FA136A9C319D2D5AD77D010B872AAE5011B8F9F21CB54AE07985FE4E8EB9F41E118D2F7C77887B3E70B53718F1DFE0DAF1F17DD06E2EECAE612951AB03F38EB63800C23C3C4385FEE2C1BD670E20290DC7734F9DC4BEBFE546A91615A2899B0534A35E8AAD6D580B0A3B48DC60DBFB01A72AFE3591964CC5010396224D19D0837AF24BCE050A68C93F7CB2B29D3B470694A5AE337FD4C2DE384052B40F0AFBF3A122B242A3B1A6F1977E66D6A7BA1402 -ct = C72AF9DB8FE0058FA999507EC3D69AEAFCD3AFBF9E6387CEA9C17AA8C00978879F12D50501CF452269A4E03F9949AAC344C66C1786ED00A7FC845BB14A89758A2CE4C994FAD5E02EAA0295BACAAC65E52BA78937C11121F333432FED33FFB236E9E639E80224A9A8B7CD98915E014664854BA468779676EB43B741746C866E2FF44AEDBD9BCAAAD11E1765AEF8BB22F650665EA148FECF45DF31B2A3AEF84589316E9E2002F88644E12B419ED95CA38632472DD17BA9E6269CA2C75E30857A1C1417985E4229C56C0C21CFDA48D90430B0F6D347F9DF7227D492940029E47B6AAB336DEF51D7C052681B5767C4DE900122736F959421DF1185C4E75FF67A9D09B73874758AD3A57C02AD9AC1F30FCFA71E03022F67663AE7F6F90008D753ECDF7F25375BF3E73C928821D5ACCDB33DFC9BFA1AE29B8FD11341FDE6F35579E19E56C002F6691E46E38801FF40F63ECD985E7A147CC4273A56E153 -ss = A345B90C57E48D5257A155B917500E62 - -count = 57 -seed = 4142237070C216BCBE245A39BD9220533C97651D84832B26727855AD994A0760C52B9319AD404693E4248B8C5FF324B3 -pk = 3701DDF09F3DD9D871D4D663EFC9DADA11FFCEF725F363F544D68DC9453C0D1A39EF81251D101C50CF2D6C428FAC2597B11824D3350C00D8A42F20B9ACA29379375DF81BDA41FA4B3F17F3363DB150CC568E9436C29CC51C99D13C1E0A76CDE29BE2BDE30232D11542668809C001DA076B316F4B2511016001649C08EA73EF7F0701C16EB62798575DC713697A8B0550BF30A63E673C0E3E968E8788D784522D519EDEB60036415ED153629685CC8BA3DE6E23350933AB3E552102FA940884290E7296C8A948F38A907734C7493BA93392494A67DF881CF8D342E5015451FCCCE54ED98EB606A3ACB6240624856537935ACECD0546BD39353495B1A1B8231C2F970B752AEDA92D5E7891F52CBCE841803CF7001274ECD6397F1A8B27AABD9470BF1D18AB9AF401CB454E158BFA3960D4624F072A14EDBDCCDCE63410FCDC1D762B6AF0DAE11A1B4D7100 -sk = 6A1AEE5E708C1B47F02BDACCE4F56C86CA9F6F64AE7EB3C493F0D576ADACCABC44FDE623EBCBD94785F31C003701DDF09F3DD9D871D4D663EFC9DADA11FFCEF725F363F544D68DC9453C0D1A39EF81251D101C50CF2D6C428FAC2597B11824D3350C00D8A42F20B9ACA29379375DF81BDA41FA4B3F17F3363DB150CC568E9436C29CC51C99D13C1E0A76CDE29BE2BDE30232D11542668809C001DA076B316F4B2511016001649C08EA73EF7F0701C16EB62798575DC713697A8B0550BF30A63E673C0E3E968E8788D784522D519EDEB60036415ED153629685CC8BA3DE6E23350933AB3E552102FA940884290E7296C8A948F38A907734C7493BA93392494A67DF881CF8D342E5015451FCCCE54ED98EB606A3ACB6240624856537935ACECD0546BD39353495B1A1B8231C2F970B752AEDA92D5E7891F52CBCE841803CF7001274ECD6397F1A8B27AABD9470BF1D18AB9AF401CB454E158BFA3960D4624F072A14EDBDCCDCE63410FCDC1D762B6AF0DAE11A1B4D7100 -ct = 3DC947FB0B86A9024DAE01A470AE88862436083EA0BF3ED41E673B113E3CA290EAA3C0F938228B2A7E1AED58E77D0A574B71F2123F7400BBB55D5C94C7CAB38C4C79AFAEFEBAD6C450632D617B0FB232CD1B540B3DE896F7E28CFFB4F94862D7A61851E652AFD761E30304741D013B6C52F280CBD71E8A1D349F8E8A7D266564E3413FCA60C046DC9218F23EF36C3CE2640987321AF768A6075D39D2822F66C0C1F1D12A00185622BAAAB8C8C748BFE834EEBDD45A3E50E15806A163626331DDE75A354EF120FC8589B6F82EC056CFD236E4C557684CE030466A6C017B4605D04E742C4365094FAF72C9CCD18890DDF1CFE6E757DE9D22E33492571BCABF08DB167DB99477494B099087A7365149A170126600568F6148753A37C0F544B22E23119FF3AE7C858C9FAC3A72B06F769C8F37D034395815F5C3555197E6F1F1EEB7F667D653C1F7D7B1E600843381BE13131C2626FB7C9E473FDF50 -ss = 48F4CAAAC964251E2A039063C206E99B - -count = 58 -seed = BD334D7B7EB14E00E68863F2E5551A095F8AF10681C28353FD19B9A7E70B8BFE266840860609008A567ABC66316C77CE -pk = AD5CA25928A95A69099DBD0E2AB67494CBE404741115FEC47EE8D44588EC55323D633791020CE18C4CBCF315A63109DF9EB41C9CF37A00D73EEA2F67DA46E38507567740E4FB0FFB31659995E1F24BA21A32A27DCA0963B03F880588CE54F5C08FFE81F8480C86D0AA83A7E8C700B8A4A8C2EA85DEDB049AAB634871C40DFEFE3E66A123203F3345223BBE04F35CE4F5053FBFF8D2087B3080F67679AC6A35E9681CEDD801A91A45B6324D09E48126551EB613085E708198E134742D771DCCBEC10BD249AF80D3EF8B3074B85395B866B1A9446A8390ABE7FB0CA70088CC702018182B6BA52B2F621C118F95D691265FDA98EE072B2F61E14C835EDEA8266A0864EEC302BA7A75A2E79D7ED8D74568FDA2BD01885197037A0C99E0BA2822F95046A3A3938977E0EB8930DB4D3B130B627CBC7F6B49FFBADC5ED1092B2800DD283215DB044728AC939201 -sk = 6396B328B100E4C7F4BCAE69875EDEA1B1947083EA19DE32004F49E8696F247C556CF33F78745F7DA7D50001AD5CA25928A95A69099DBD0E2AB67494CBE404741115FEC47EE8D44588EC55323D633791020CE18C4CBCF315A63109DF9EB41C9CF37A00D73EEA2F67DA46E38507567740E4FB0FFB31659995E1F24BA21A32A27DCA0963B03F880588CE54F5C08FFE81F8480C86D0AA83A7E8C700B8A4A8C2EA85DEDB049AAB634871C40DFEFE3E66A123203F3345223BBE04F35CE4F5053FBFF8D2087B3080F67679AC6A35E9681CEDD801A91A45B6324D09E48126551EB613085E708198E134742D771DCCBEC10BD249AF80D3EF8B3074B85395B866B1A9446A8390ABE7FB0CA70088CC702018182B6BA52B2F621C118F95D691265FDA98EE072B2F61E14C835EDEA8266A0864EEC302BA7A75A2E79D7ED8D74568FDA2BD01885197037A0C99E0BA2822F95046A3A3938977E0EB8930DB4D3B130B627CBC7F6B49FFBADC5ED1092B2800DD283215DB044728AC939201 -ct = C3A47DC452E79684E7A511CF7D139688C2BBDEED755F718229B56C7C80EE03CA9BE48AF78D70921068D2492AD0190C1758C185E66FE700A8A717FDCB49DA688098B337D2A1DB691087DE8FE3AC7292BD87DF02B884CB9465A377B69D6E0B030C0CBE7CD3DDEFF9CD544052148C0058977F18A2A5264209DF07DB5CFB29A44473A00D833E8F1634BE13A13563015745D8C8132F5F757376AB26CA9715B23F664E1D2DFD5901BAE51C8E80E3BC227A964697D90D7D08F10C088D5E287A16848ABA827DFA744D4645DA78F8AABE2878913D2D8FC2C6AA18EC220F922801BB549A9910DDCA0AF9B64EF0587F8B970B4396887EFB69C067ED1492C4AB3C60D039171F41AA5EB796A15E0D1A08835054F7C06A697E00C02BCDCE04320347CEE14C1AD829BE6DA4F09558447569869D1E316CF9CFB87F739F2B720F52E50EB750965F27E29DEF1CE079BC402001DBD04830957773FEAD0A5262F0B79131 -ss = A5611782265E1932DF3B7E736F40BA3A - -count = 59 -seed = A0264C58AB1F2CBCB212077FD378D340307ACCB31F1312137CF84E3D3135044D4EAE8BD38BC3E540A0C14D46458F6179 -pk = 8CA6ABBED1FC3E64B29FA9F87E149A906BB5FC7C69BB386ABCCCD2CD1755EEF206FD9F801139F62BBCDF136B9AE3F1076B29584D07AA0183A6A1F092976FFC146D2022D77A0F132DC1A8E32E510729B00CA76A172D41A553072177D2ABA1E087D7FF1EE4642CABAB83D9C9B1EA0144C76374657D4BFA797CBE29C0F2CA863A4AF30EFCA9DEEB76EE64E823A6D27E73DA326A65D49B4DDE6AF41594CBDADB27152F6CD71D023B719F7CF53C9DC2262C6C1910284264399B75AF086548FA8F955D2BC3467EA78E873B200997AD4CE2C6DFDCCD9DBA90B7B2D276837301AA1B4F88864096B0B4A4E0A4F8542EDA77DCB92AF456D930E29040D8ACB57C5813E6E051FC51A4D9537B51FD5182656D86E08EAF01EC01925A6B7BE77D58C998B3D21C5F64DDCFE561AEE1732B01C7315BAB1F4AFE0400789FA36939EC389F9964FC735C75B86B6E64D041443901 -sk = A453BCACDD2B0D4646009E5ED451C3C4E810FDFF3E1086663F6C7B489742305D34B1FDD7159072FA736B97018CA6ABBED1FC3E64B29FA9F87E149A906BB5FC7C69BB386ABCCCD2CD1755EEF206FD9F801139F62BBCDF136B9AE3F1076B29584D07AA0183A6A1F092976FFC146D2022D77A0F132DC1A8E32E510729B00CA76A172D41A553072177D2ABA1E087D7FF1EE4642CABAB83D9C9B1EA0144C76374657D4BFA797CBE29C0F2CA863A4AF30EFCA9DEEB76EE64E823A6D27E73DA326A65D49B4DDE6AF41594CBDADB27152F6CD71D023B719F7CF53C9DC2262C6C1910284264399B75AF086548FA8F955D2BC3467EA78E873B200997AD4CE2C6DFDCCD9DBA90B7B2D276837301AA1B4F88864096B0B4A4E0A4F8542EDA77DCB92AF456D930E29040D8ACB57C5813E6E051FC51A4D9537B51FD5182656D86E08EAF01EC01925A6B7BE77D58C998B3D21C5F64DDCFE561AEE1732B01C7315BAB1F4AFE0400789FA36939EC389F9964FC735C75B86B6E64D041443901 -ct = FFFC3BFC6FEE16A0657F2D379A88E6ED0E40DEB71C6D703DB7699AE914F5E54EAF974221D93A6160294DEFC2E4D0E45A2E73345477660050B3121137F1E6CB4359EAA0799BFF98297FD0CF2AEC3530A9ADE6B651FBAC09CBC15D96AE2D0155065E1700900F7C04CDC1C23C5B06004FC9955C8E9464E36C2FB2D3022288B937805562DA27AF2E3F8D656BC9CB04B83D1BB71259B6F9D281CBE0D93939C0E00B83DD2D231002B230A362BC27DB27729D6C64CEE188EA9F019AD77D1E8FD38FD8337B8F8C132137B6786D3B0D55677C5BAC3CF590462EEAD4C9C2EA1C02209AC0DB71C164123BE68CCDB62DAD9731C034FB528D05D16F7D144644997E33699DEEC61D73FCB06463D734A454B2405D679EBF230500CBA5DCD4B4399525FFDF252D3C7310310F6758897FC3CD838BFA26E6316C8DC8E536509D31EDFB6D017A19A829496240816134C46D2502C33A13D0612EBF343F71E311A24B7702 -ss = BBA5BD08A7BD6DB8620A1C1149B00D03 - -count = 60 -seed = 99A9CDBFC674AB3FF2C64CDED7D697A6E27A767434A47AFF7C3FBF3C6A22D6043D27868955286A13EFE3DE36D22EC48E -pk = E97E2291AC4EDD6C891CDD83254AAFFCE54E17DA2B5A2FF5DE80BD3099FF430422F894BB444FA8D932B42847C24C307618AC07711338000C0C47E13241A82DC36DADEFC9A734E15487BA0A5158C4BA24E1AB09D296AF9BE33BB66357EF74BBA7C6F6C26D253850A2D5B7053ABD01C967B1D444B830C13F2D84595991027CD057264DA437C40FF680292E3CC4B6C1532205C01A8AB1260276C1C66332D7F88DC68177F42C0155B3E4B612DCF0E7569CB58290D34E03F41C5A6971BC9AE2B94B8DF7BA89C315024834B01DEA17150753A18ADBE18BF7E34D9918E3AD014A5F85825E6AA2A0694D69CCEE5E65EDD3013265DDDF21DEF509A70115158B3B873DF1E73F185BFF1A297384C8531886E66C4A4897EA01C978364EEDCBE2EBAF9C9BB572081C381125E09DD4A539B7B6B4603D3AA145CF1A3C5057963D41981BECCE8D4DCBC316B952F252FA6F01 -sk = 47CA2B77C5B717F423222C2730CA5CB978B7B859D042C0EF174CD6EBCE4C1FED3D4248A48506D73838F8DA01E97E2291AC4EDD6C891CDD83254AAFFCE54E17DA2B5A2FF5DE80BD3099FF430422F894BB444FA8D932B42847C24C307618AC07711338000C0C47E13241A82DC36DADEFC9A734E15487BA0A5158C4BA24E1AB09D296AF9BE33BB66357EF74BBA7C6F6C26D253850A2D5B7053ABD01C967B1D444B830C13F2D84595991027CD057264DA437C40FF680292E3CC4B6C1532205C01A8AB1260276C1C66332D7F88DC68177F42C0155B3E4B612DCF0E7569CB58290D34E03F41C5A6971BC9AE2B94B8DF7BA89C315024834B01DEA17150753A18ADBE18BF7E34D9918E3AD014A5F85825E6AA2A0694D69CCEE5E65EDD3013265DDDF21DEF509A70115158B3B873DF1E73F185BFF1A297384C8531886E66C4A4897EA01C978364EEDCBE2EBAF9C9BB572081C381125E09DD4A539B7B6B4603D3AA145CF1A3C5057963D41981BECCE8D4DCBC316B952F252FA6F01 -ct = 3613BFD6D40D49A140CDE59FF2AFF193B5C6A5E5699E25AB2FE0FD4A495B68E3FBF4C3FF92440462C3881D533D289619D63D7F48F05400F70F1977A6EDAC7BDBA93E629032B0BF5501B7BF17FD2B3C1BF2A2273498F1A96620730CC4EE61E76CF0680B52DC49BFC4CAF155FB9C00AFED4CDB9DCEEA14389E1E6A174A8D23E863380E06B3DDBE07BF19CC88005C2A68F82CA2462FEC058D11F7C44811363E7945705C3E710085443A799503AF24CC49688C6D8900E27577E9ACFB18601F383E36143C36CF7F013F97024598B64B3EB1AA60738AF99D00FDDD66105D0114932A2E7F50C4A38269C81C97574A43821FF7F53655F1264281FFDEF023D4398D56084958C27B8EB72729C0CFAC6FEA68618683CF6C00D9C8A17F50184135053706013D0FAB0B11E3CBCFF39ECA75A02980A178800A730AD15308714481FD9BCF733408B17EDF38661432F48101430614AC37977237A2E574DC450EC6C4 -ss = E72DEB6A7678A71CC4986737F98204E5 - -count = 61 -seed = C799D57B41F28C5C446DFC58A5AC6499C4BCF3C162AFD2B09A16549826EC2A6F689E44BAFC4ACC82F5D6AEC23F4A3993 -pk = 727B0124AE457E9C7FFAA43B1C7A3110983E6B6B81F86317616432DCE466B257BFF20FE0ECAF6FC44F967784D2E6F04C6A80314769AA01CE1B91064D34EDE360D599F301DD2DD120F1223D4EADD07F1F533CE694C78EDD2315ACD642F6ECD5A7A451392C2B1B40EF48788AC844011587B1EFE4438ECF17CC9136A0691BF7659CFFF0DBFFD657F89A9E61765E6CC69B968DFBE82F5BCE4E4722406E9D1DCEA63E00953FB401706C9BF31F785E313B0DAB61DFA2DF687E373F9F9CC8FBE8A14FFDBAB52EBC1E6935AD9C7EF14C07345AB0D570ADF8493B20A9ABAA6C004C1CBC4C938C9097F7ACC090F4452DCCACAFF3E9911999233D3A2309792107B0446A39E9E8FAFABF8376AFE9F230053B500E517CF15101186D4C219EEB85E15B11D74DF2286B437C9C7D34BEDA9BD03D91F764AB6DB04AFE4AB4DD94F710FC366DCBF68F8E1467C06189929E7400 -sk = AAF6EB40E596A5E3E8218871E708B0897C0AFEEA370632D3C232B25961508A363FB76E44B1ECA4C8A54E1B01727B0124AE457E9C7FFAA43B1C7A3110983E6B6B81F86317616432DCE466B257BFF20FE0ECAF6FC44F967784D2E6F04C6A80314769AA01CE1B91064D34EDE360D599F301DD2DD120F1223D4EADD07F1F533CE694C78EDD2315ACD642F6ECD5A7A451392C2B1B40EF48788AC844011587B1EFE4438ECF17CC9136A0691BF7659CFFF0DBFFD657F89A9E61765E6CC69B968DFBE82F5BCE4E4722406E9D1DCEA63E00953FB401706C9BF31F785E313B0DAB61DFA2DF687E373F9F9CC8FBE8A14FFDBAB52EBC1E6935AD9C7EF14C07345AB0D570ADF8493B20A9ABAA6C004C1CBC4C938C9097F7ACC090F4452DCCACAFF3E9911999233D3A2309792107B0446A39E9E8FAFABF8376AFE9F230053B500E517CF15101186D4C219EEB85E15B11D74DF2286B437C9C7D34BEDA9BD03D91F764AB6DB04AFE4AB4DD94F710FC366DCBF68F8E1467C06189929E7400 -ct = 703BB1DD130A7087003CD296E13FFA7CE1AB2EFA024EB02ECBB6054C2DA0537317614E1D075F1F0A03A289B48212EFA3E0FCFD6D00DF009E6D779B03BC0EFE5C1FC44327E710FAB872A967B5A53D129AF3336FBFD92BEB7361DFBB019DC19630D756D7888095DB3396DF579D200064B53C4DC5DE29A5535E77B5C5BACF30373F2D85E29FEB60ECBDF46ECE95DAEFF20D1331DEF5F53AD0004385275C206A1AF5BF46914D00BB9D1D4C631000C5FDB4ECA685E0C14FA07CA70795798B801CB05658615A9B11B953519A6A15E7BE7A9D24665F3D0146215A3451BCA000E1FF18EFAC26EAA35A084C4D4644DA52D3E69357C3E51A6C3DB78B968A2046DC7727BB115B24C92D63D1E0DBE440F96B1E3428BA3A7801F4190D85804D261D1613A361F529FDFA77579CA65586E7E6DD91E9F0B7B376597745BA0821176F66B1613B84B973D0B9EF62E41741C6013AFCE7D7BCFAB307E3543041847B858B -ss = 14E0D35F4EEF91D784C700B5C9E99296 - -count = 62 -seed = F7AE036A0176A9DE9A036A542DD2840033277C44AE936D10B768566216DE9D4395CD42B116873B69D9804BA6CCBC05D5 -pk = 0D6F148903FD537FD294950DAD7FC52118B64EE1150DBCD5C1AD19C48598FB17178313D61F22C4EBBF1B6A8E636630BDCDB533E6E66601D84ACB55038F89DAADF7A1F2F7EC9BEB5AE775FB64BC0A1D1A43AF3E76C6C910A565E8507947450016782FC98C237440EBA4F1064809004947295949BF56B588AAA379E43C700FB5EA93087451A2704B725466682251A00456A73EC81DC80E32815E4B6C74F0A3A860326F0C1902E633C345FC06B71367A37308E9D83CDA6AA6C7D6F22F93758896DB2FE0B913C31B9848895717545E8C51F1AF850B9EA6D398959FE26D00E24F7309C3CF818BFAFD7D25F2C4D21BD071E8AE3C085D4E4E5F7A4981A6D108DD4DC39B394E36ABF58D9CE0894980FFA2C99FF0633301C86174ED24E5CF936D8AAE331919567D0989136AD54CF66BBF5E696560234BB883E63A6E4D17EA264F9B02AA9491F027CF627FE00B4F00 -sk = 6500F32C93415CFDBC0BD31D78D5BE95CB4DD6F6DEC81902BB89A14C910D5DE6303E7F605BFF6153D43A63010D6F148903FD537FD294950DAD7FC52118B64EE1150DBCD5C1AD19C48598FB17178313D61F22C4EBBF1B6A8E636630BDCDB533E6E66601D84ACB55038F89DAADF7A1F2F7EC9BEB5AE775FB64BC0A1D1A43AF3E76C6C910A565E8507947450016782FC98C237440EBA4F1064809004947295949BF56B588AAA379E43C700FB5EA93087451A2704B725466682251A00456A73EC81DC80E32815E4B6C74F0A3A860326F0C1902E633C345FC06B71367A37308E9D83CDA6AA6C7D6F22F93758896DB2FE0B913C31B9848895717545E8C51F1AF850B9EA6D398959FE26D00E24F7309C3CF818BFAFD7D25F2C4D21BD071E8AE3C085D4E4E5F7A4981A6D108DD4DC39B394E36ABF58D9CE0894980FFA2C99FF0633301C86174ED24E5CF936D8AAE331919567D0989136AD54CF66BBF5E696560234BB883E63A6E4D17EA264F9B02AA9491F027CF627FE00B4F00 -ct = 3CC75AA604817508EBA5C04D73D0593B95A3ED553F4D26E404F7BE6C2372C1E83CD5CE5265BFBE1F3AAEE586CB17756441F6673CE90902AF24549B7B7376D07BB4519BABCF12DEC564CBAC7D48C0DE6E9BABDDBE03268E8FD605BE8E839B00794600EA11F0DB8FE5FD2EECFB8A00BC264283D425B9FC312371C565B64D2DF1066360695697E895CCC356B2DF78083F450D89B790AC17618B6EC4151CC4BF467BF1364E92017403299D6595EDEBAF9584684CC2D8C759111CB75335A3C4FBE78781245307B3ACBE19C50B157F3898C92EF84A34AC1E4919B343816001FDFA4D0713D29543B3D9E738E7677CA978ED575460ECBD62CE874D630E276BCCBB3BF95D8B90F21FE95D9E2275BEEEC2AD9A9109F6AA0104FAB9F2AEC92CC70F612954FAE3DD43AB82D7604F56C2B68E98615B6DDA1183A72A305E74D092D3F53E8E44DD1650F0482CE9D3CAF800B0EAC4B9C25048324BB2F81545741AF5 -ss = 3588D259EA898E25FE7883554B9B4A77 - -count = 63 -seed = D995D38F934B6E1A7CA77C9522E3D037676CC939B0C8BD4B84394B3DC91A791F09D2D97199258C9943DA955E7F7B26FC -pk = 22E6AD3701B91F9AE1D91BBC7164C6733DF4A4E08FAB8A8DCDAB3D6A5EF86C6A2F0DB050A5A07C95CDEE030261EA73A1A12767BE6C5E01070952A58D80098114AF8957E76747FD2F06DDE6BE794A089211846C6BD6A329A213A5B2F401B493B756D30637581DCF0BD48C88FEE7016FE419944906487E4452F4AFA330CC61C035C1F64A9B4D59439BF417F936FC992361465D512985528140802AFBCA00A51917FD18714E014CACFDE6D1A3CB4195B13A1AF7EBED68751AF5C52B19DC5689F7E4AC1253671B6C15C9552F117D7BBAFEC770AFBBB528E62B9DB933BF01918526CF61BBDCDBE2AF5301F5273E649AF2AF618EBE5167F8E33B5F48B8AEDE72E4B49A32CEB4D8FECBA5F2B7D90C9E578BA950A54D0055C71A66FC6B4D16B59ECF438D20E13360CCCEBCF4DE9A90BAC2056B18C64D5629E2201882977B17717A07B8A03E6D64BD247A98BEBD00 -sk = 7643CEF2D62CC5AAEECF754653EA6229D02532A13919CCBD7622339742B0F44C697D5D5931C43D983CD1E50022E6AD3701B91F9AE1D91BBC7164C6733DF4A4E08FAB8A8DCDAB3D6A5EF86C6A2F0DB050A5A07C95CDEE030261EA73A1A12767BE6C5E01070952A58D80098114AF8957E76747FD2F06DDE6BE794A089211846C6BD6A329A213A5B2F401B493B756D30637581DCF0BD48C88FEE7016FE419944906487E4452F4AFA330CC61C035C1F64A9B4D59439BF417F936FC992361465D512985528140802AFBCA00A51917FD18714E014CACFDE6D1A3CB4195B13A1AF7EBED68751AF5C52B19DC5689F7E4AC1253671B6C15C9552F117D7BBAFEC770AFBBB528E62B9DB933BF01918526CF61BBDCDBE2AF5301F5273E649AF2AF618EBE5167F8E33B5F48B8AEDE72E4B49A32CEB4D8FECBA5F2B7D90C9E578BA950A54D0055C71A66FC6B4D16B59ECF438D20E13360CCCEBCF4DE9A90BAC2056B18C64D5629E2201882977B17717A07B8A03E6D64BD247A98BEBD00 -ct = B5D25E6449FAAF1A85254AB7F3AA11889F3BB222AAB8B0DF68699CCF394922C0C32965EFD1274A066924261E88225E5BCDCDE4B6DD9B00B10B98A5CC2E5D2A01CEA357F63B5855C4D283AD44EDE0F25B1AC1D24C915D547F699872C8E7D53C6DBB9667D54DD598CB6E5C511A1001E447080B1821220829C7BBBE3C170026966F1119A0DDC1354EEB3B9DACE5E6CBA5787434B6772200767254C056161CDF729ECC62BBA70016B12E6B5A67CE21500A048260862CBA87BE225D9A29231C0EC7EB7A58056BB2D055C676C702FE1655DE177B3E04E97B56AEA0BDD6D1007478AACA5F6BE4AEBCC46091798A5420E4BB7F51BD2AA62FD2BD55DBAEA4F7429C3543570965F5476D8CAB5CF5FACE07248281F5ADD2013254679D4AD0E98FFEEA1E44711887D3FD6C66C128764FC5515026ECCE2146EA39B732A633E3359DC95E17A1E14B152DCCC788CBCF0B021FE12ACD811D405CAECA9AB1B7B731AD -ss = 5CA9F51BE147CEAD8A910A5AACBE78CF - -count = 64 -seed = 5929F02A271725CB40200DE32D9D03D8BEA53B53AC83186C42C7F565CCB1CA508305D470850CF86E9B2C61A5B8CA1C93 -pk = 26E993E2F3857E5AD642A76ECDB1155A31E48C17759AB60AB96E54DF115D96626307A87FC2B201EE215E6EBAA8076674501C1EA54873003C0535CF2EB25C9B86DCA55367A037E30F5265AC3B73DC7FAA570BA0A288F933DCB37F1FAEC658E81FAB6D17713F798735177F20C81101D0FFDD14A9588B9CC7DBB7410E208C519C524F6909150C0825FCE0DD695243177B3B6446DE6B59E870B02811376F04EC5D2B03A5341800D81E2AE30953896F228538490A411BF97C287E11436DE0A96A61ECFCCF4FD8C26CA87345911553E1C9CB985077C27E01D4E6228DCD6101C1B9B6DEA614AE25ACD893257D26AD73CA67145067EF8884A31A7EE969C593DFD9525EA595096C199CE7DE16AC10C3BCB705713BF21300F2030FBD6D944EC69809BCFD91B9B3F08AEFE02A4518D942E327E54E33F5698AA798F3A1A73F9417FFCDE5DBBC2A9A3F6AF31652F7AA01 -sk = F8EE95521060C03BB8DACC79F7EB7DB61E3D78F1A9C5D3AB7B0F124E6595BDD2A1CFD3DAF7125AB513EEA00126E993E2F3857E5AD642A76ECDB1155A31E48C17759AB60AB96E54DF115D96626307A87FC2B201EE215E6EBAA8076674501C1EA54873003C0535CF2EB25C9B86DCA55367A037E30F5265AC3B73DC7FAA570BA0A288F933DCB37F1FAEC658E81FAB6D17713F798735177F20C81101D0FFDD14A9588B9CC7DBB7410E208C519C524F6909150C0825FCE0DD695243177B3B6446DE6B59E870B02811376F04EC5D2B03A5341800D81E2AE30953896F228538490A411BF97C287E11436DE0A96A61ECFCCF4FD8C26CA87345911553E1C9CB985077C27E01D4E6228DCD6101C1B9B6DEA614AE25ACD893257D26AD73CA67145067EF8884A31A7EE969C593DFD9525EA595096C199CE7DE16AC10C3BCB705713BF21300F2030FBD6D944EC69809BCFD91B9B3F08AEFE02A4518D942E327E54E33F5698AA798F3A1A73F9417FFCDE5DBBC2A9A3F6AF31652F7AA01 -ct = 401F10B5DB7B513CFAF8BFAD98ADA521D132BC0AF521E94794412A4AB88397C87A041191F5EF4AB65FA522BEDA2443990D3C40D7BF7500B71DE14FB97ED3D400334A1B7689E0D53FE3025B1141521A0E1A330C4886AD65DF816F98E22C716DBC1AB69638D8B92618D5AF51BC7C0119079DDF3415010E02DFB2A8E94561E4999A49C2952CEC4E0E7C78AA2A5BAE8AB4ECC6F9EB1B79B09DC69BD709F9BCC9E2899EF4C70C02F656A3C5180EAC9F45A0FCA863554A793B73AAC6CAB04348208317A7AE30D66C62B88A66BD0C31D58AC64A5F2FAC091C8A85645555A3008C4D621003819D34621F3DE662E35C3DBCB00EEAA840E787258F535AB9C1ABF9DFF07BB57BB6D03812DDEC800964280039B50C1BFF7601AEE4C029194A6689381CB43C4E303DB1F2CB09D86B5EB4C34F953CAE1A7868EBF652555D590309CA6A0A5C077720C50473AACC30C97B00A4CE018D8B4399B8B035AE66AE4EED06 -ss = 5E0D47D983AD86F377EC2B28DF453778 - -count = 65 -seed = 905074033D7B75DEB2D06A2F29144EB377B452534C5710632989F02D45312D156557E96D4486020826DB200153BC4A8B -pk = F4EB5756A2A7C3ABA281BE7039E0403CB305C7CF98546C78E69928898BEF2544C78679001E4EA5A91F76F6764B6EEA449B2B0A08537101CABDE41DB7E11717260ED2602A2D48ACFC5E1E5CD1C457CC2CA042A4D224A82F1D23731E03858BD226070AABECA820F5D8AB6AC7AADA0121176DAC0DD030768115083870D17F4B3ADD2BD48E7253A7644F7505CD1CB368E00C557ED4ADA00E7820E2C2D7AC35994603AF86C62B0199B312F5F9497C68973086098E39FCECA2DEE91F8F8B408B99E9FCE6F1311B8FCBDCB6A715B1C6A52A8A6E368B05D38F2B298C6900E601F858D5F0AE138076010B1257E9BCECDE939899B5B9F5473B150F0A2E7B9DB8357C0399BE41711EA5F9E2B60815BC2D95C1A92B14304700826E45C1D9886A64F411401B1566345B0921FD28FE8FAA3D15D93F28D9A6DB09CF0D40849691304384A338CDD261A0CFEA21701A949300 -sk = B8BD0493A882E3A49B4E0F6256FB1FEA0799EAD9BDDF2FDE63F0732FD66DAFA88AC7888939CEEBAD55F19401F4EB5756A2A7C3ABA281BE7039E0403CB305C7CF98546C78E69928898BEF2544C78679001E4EA5A91F76F6764B6EEA449B2B0A08537101CABDE41DB7E11717260ED2602A2D48ACFC5E1E5CD1C457CC2CA042A4D224A82F1D23731E03858BD226070AABECA820F5D8AB6AC7AADA0121176DAC0DD030768115083870D17F4B3ADD2BD48E7253A7644F7505CD1CB368E00C557ED4ADA00E7820E2C2D7AC35994603AF86C62B0199B312F5F9497C68973086098E39FCECA2DEE91F8F8B408B99E9FCE6F1311B8FCBDCB6A715B1C6A52A8A6E368B05D38F2B298C6900E601F858D5F0AE138076010B1257E9BCECDE939899B5B9F5473B150F0A2E7B9DB8357C0399BE41711EA5F9E2B60815BC2D95C1A92B14304700826E45C1D9886A64F411401B1566345B0921FD28FE8FAA3D15D93F28D9A6DB09CF0D40849691304384A338CDD261A0CFEA21701A949300 -ct = 7D2CB287ECA1594AE8FE77116C564A4E77DE76C2E4D3A67CE8CA134AEAD60F07F7B5C786D2B865751002EF92FEF134F1563B2FCFBFD8018D30FE640F235166676486D0244C43B97EF7D0237649160E45F7DF78EC101414603B74FEAF8A8F58C9CB2C5A22F1555541DC75DDF90501B22624C8D81240BE36AD591F189C19AB38C0BD9F575454A51E8D3A479253A1A3080657BF3AD0251AC9BE63CF45D32F0FDBA4403C9E1401F792BBDF038F891C46008BD9B414233E83CA76F65ED30999DD685732087F03D1246442416C4277413FA6511B1C64BF9ED296ED15CD5100F958396F5028B27F6F1B5AD52672EA16C73B35B16F0CFF1BD3B80CAB0B838237AD7B9576362B2D8909AF6ABDD872E50A73A2D7F705A80125425598039E5E5F34424A6C54609C7951F09E5DB6D11D6568419391EA4025498C412B5134780B2893B80CE6A909F9A685D12CA2966D0024C52DFFFEEC7CC69F799751250CBA24 -ss = 3F4B8410B799D38F26202CAC1B52A37C - -count = 66 -seed = A3E2E511AFA7BB560446BDADF67D2EE2E16FFC7BAEAE7EFB8C5455068BBD4E91BF9BE9D98B280072FABA7712C75B26D4 -pk = 8DA22097FEA967029BC23E0ACAF0405204B9B9B33D2EEFE2956E299D9A35B1432AA5D5904C70D5A1D52A7B69820EBD051A031257A3790099EF548478B458ED7FED9C0383D74B1CEF2675F2B1D2509BB1E28A8E26C9467FFF6C387FC911BCDC16BE5035911E3F82E3D8BD562ACC0109A627415E59A3D8D773264E1F634AB338025D226CCF4DA521875A4236CFC6960E65D71175015B98E7FF65CE3F02A1D79D31205311E7003AD731866DAB04CDD1C133A6F0514BBDE0B9CF9CA7A2AFAE0B8E28E92F935260FF9A07F996185FFAC3F18D977C9EF673A8908DBE7FE2004BE34CAA9C41895EFA374A8E2859229B9DE100C55D201FEB69EA258ED48E11C032347C47A21F27532864DC71FF375B8DED71B23B52B5017D89CC27537CBDF44E33CECCB04648C1A25BAAB95A5E3BE0822763F61DD65BC0EE9EFDD83C27D6E6E0248C7FD1094DDFBD531C10122F00 -sk = C0407E41DDF48D333978B89BCF2DB01EC941FA96362BA1E4733E332888BA4E8B1C5CE574652472A75B864F008DA22097FEA967029BC23E0ACAF0405204B9B9B33D2EEFE2956E299D9A35B1432AA5D5904C70D5A1D52A7B69820EBD051A031257A3790099EF548478B458ED7FED9C0383D74B1CEF2675F2B1D2509BB1E28A8E26C9467FFF6C387FC911BCDC16BE5035911E3F82E3D8BD562ACC0109A627415E59A3D8D773264E1F634AB338025D226CCF4DA521875A4236CFC6960E65D71175015B98E7FF65CE3F02A1D79D31205311E7003AD731866DAB04CDD1C133A6F0514BBDE0B9CF9CA7A2AFAE0B8E28E92F935260FF9A07F996185FFAC3F18D977C9EF673A8908DBE7FE2004BE34CAA9C41895EFA374A8E2859229B9DE100C55D201FEB69EA258ED48E11C032347C47A21F27532864DC71FF375B8DED71B23B52B5017D89CC27537CBDF44E33CECCB04648C1A25BAAB95A5E3BE0822763F61DD65BC0EE9EFDD83C27D6E6E0248C7FD1094DDFBD531C10122F00 -ct = F221775D58433EF77F71C1627C026D70CADF30C93380FE22D08A573930A2B9FAE636871AD98E416C80FA86244B1E6270F8DD6636E6A7019C5D72AF128298754787C647422CA611374D5AFAF7E4518C2345AA885577E323018B0BE76F45611B88E696AD1E62AB427F71ED4EE9C401F5366E392945D3828C7E9F1A2F0CBC48035C923529628FB4D313633803F2DABB06A3ED53D73DA5E774B576E4D157B45EF2613235C65200B643C7A345548F1D964D0BE2ADA496A41A359634D5F7FB8A8DA444CF57CB0765CAE79C445988E20ECB4B3ABB31864E55D05D669A56D001627C302F75F58BE7BB465E71F549A5205FD14346B07AEC29B906B0917225084142FA7D90D0665CA67D435B420C1F051EE770F9A196A0007ADDBDFA4AF669F6D581A0AA71768438902AA035B1FD01A7B16CE45D76A509FC67FDC0FD1DE02AFED736D212F9225199FEDE5C1148D1007AE4FDFA31EFA408C63EAC035849A16A -ss = 19949A812632BA36C87F77EE12C9529B - -count = 67 -seed = 074AB1A37BA5A0403D8F68D26FB787BC2C90F5EF88F2A6D286C3E6B168ABD85D393D8225618608B8EEB301D26AF53BC0 -pk = D8F84A5C1BDF2EE99F1E9AD650743165C16BF1CBD7A47C6DB7BE95E6CBDDE9172C9A83719137BE189BAFCE89A1DBC37C52470F917DAD010CE18B4EEA8BA439FE2FD8C83E8545919BEE28FA608214B91B5EDD378FCB3AA42AD898BEE1E983763C3083DCBD7515FBA2C217C13AA600FA48A9D989C8DFC56A020D3BFE63DB0725495D5DE9CE9DA3DFBD125CF7AAE0D2B87E2557263B501B2DA712FAE8E7082AF0C06A1EF6220067F6D671CAB553D33A70453EFE727D8A8B0711E5E329760BFAE67765331D46EFFB1F3C085BA9249191EBB1B762DD5F4022A799FC9AB300F14329E72B942E7BA336D6F07820048AFA84B3B6B3CDE05CBDCC4C71786D2E80DB684B9C81E38D9E7F9629A5FF751641BFFE22056BD70076E01C4ECF36CF5B4E7C03C57040DF7A1360B123D0146A45792BD7B8881075C02947C56FFA0560561056505FEF3F073F9B32E59229D500 -sk = 334382D39164D1989696A2FF77B25A28D3AC131E0CECFB0900E8E52BAAFAB8AF11EA820B17D1BE1A497EA700D8F84A5C1BDF2EE99F1E9AD650743165C16BF1CBD7A47C6DB7BE95E6CBDDE9172C9A83719137BE189BAFCE89A1DBC37C52470F917DAD010CE18B4EEA8BA439FE2FD8C83E8545919BEE28FA608214B91B5EDD378FCB3AA42AD898BEE1E983763C3083DCBD7515FBA2C217C13AA600FA48A9D989C8DFC56A020D3BFE63DB0725495D5DE9CE9DA3DFBD125CF7AAE0D2B87E2557263B501B2DA712FAE8E7082AF0C06A1EF6220067F6D671CAB553D33A70453EFE727D8A8B0711E5E329760BFAE67765331D46EFFB1F3C085BA9249191EBB1B762DD5F4022A799FC9AB300F14329E72B942E7BA336D6F07820048AFA84B3B6B3CDE05CBDCC4C71786D2E80DB684B9C81E38D9E7F9629A5FF751641BFFE22056BD70076E01C4ECF36CF5B4E7C03C57040DF7A1360B123D0146A45792BD7B8881075C02947C56FFA0560561056505FEF3F073F9B32E59229D500 -ct = AAD9E86660249AB2675FCBC20D2A552946BAFC415EC2C1B3F8E92EF124613FC8F723DA7079A2F4C94503DA3B9349332C2DA847A126190177BBF0961C03816488B76342E8365F3277FDC1B395883D1408C2BB4488D677973EC44D708350717D6331B723CE0687013DD72D31616600C39E4BE1A726E25308C5F63406E23D2A6CF9880223F99DD006993DE133C1D5B8B9CB0C524FDE13F2016E478FABF4AC3CF9FDC781AD0A00202F2036EEA45C5BCD812F39C31F33054F708F6B305A10CD36912BC895B5BD828A89A0B7D0C3A878955D5AEE8B93B753B4AB6F34BCB600DE6E94BB7B4A417F7467DB1147F431F6BBD82FDD3C0DAE862D20F4A1FF8A08D89E5D375B794BA88CE9EAE65D5B61889B4F6C255264F80023DBB375FCE467082B72D2F37C86CBEF3266C7D3B42F8B3DF7A42CE75DC43B6DD0F2686B1DD577D70AB0316507BFA5C675449F31B6D201B537C869E53E6CB1213F772576EEBB8E -ss = 5D20C1D82577713863D76ED5A40C184D - -count = 68 -seed = CC0C86CC0ABF86FA21899BE1953913C00E7C46E6B5F730C4E88B3C034012763981D7F14459D3081638080378348856EA -pk = F5BF4C2956BE430CB1FDB803958EACC92796B70F561ADB4C0D0BD29CB9900E82ECF627F800F83D1A153BFA6FBEBFCF6027794206199701B924370B2F6150EFC12AB47707B1EE32729B9B083BB1736CB2FBF7BDD3A573AB9D6A755F8BED02B5EC4FDF4DB16246921DD13F1197620158EB926CB4A9EB0BC97A2E33134BC38F0394AB895E573F0D3A98CE9660C80FF79953F293FF67473EBEC935062F09D1ABE15688E8C0AD01A0BB965AE1114BA2854EF9826ABBB2A86D995781023124B8FB1C4B22D2B69E1CAE735AE45FA313F9FEBA82B270CC6EF64866EAF18379004FBEB90747AAC4DBBCAF8F7682EC5D5A730A4E4936462FBF061C84A60AB3D741BBED0538381E76C84CE29B3AF4C7BDD574700159733F00E346E9D251ADF2DAA6A8D99A50A8BA116F91EE461751C0B116EA47699BBBDF8A0208F5EC2A8A681522085CD8654840F2DDBCEC44EE8C01 -sk = 6995143E8EB8A6E93840F76EEC844F671D3273A811D6EAF877FCB3A3C985593289572FCE4CAF52D13CA6DA01F5BF4C2956BE430CB1FDB803958EACC92796B70F561ADB4C0D0BD29CB9900E82ECF627F800F83D1A153BFA6FBEBFCF6027794206199701B924370B2F6150EFC12AB47707B1EE32729B9B083BB1736CB2FBF7BDD3A573AB9D6A755F8BED02B5EC4FDF4DB16246921DD13F1197620158EB926CB4A9EB0BC97A2E33134BC38F0394AB895E573F0D3A98CE9660C80FF79953F293FF67473EBEC935062F09D1ABE15688E8C0AD01A0BB965AE1114BA2854EF9826ABBB2A86D995781023124B8FB1C4B22D2B69E1CAE735AE45FA313F9FEBA82B270CC6EF64866EAF18379004FBEB90747AAC4DBBCAF8F7682EC5D5A730A4E4936462FBF061C84A60AB3D741BBED0538381E76C84CE29B3AF4C7BDD574700159733F00E346E9D251ADF2DAA6A8D99A50A8BA116F91EE461751C0B116EA47699BBBDF8A0208F5EC2A8A681522085CD8654840F2DDBCEC44EE8C01 -ct = 0E19214A955A12BD90B22ABFA1AAA39A4E300368F2DABF8E68BE96AFF86FE09BDAFF292F8643937E4DB2B620083034ED5B8F683DD18A00719D5B5E92D282C53DCE84E912BFFEF6225A6642F5BD66610419D86FC8A87B277C6E85B52074894AEFB522FA2F54CE3090C9EA63E5CE007FAAFB11D8A2AF4687183FB7BCD7E1293392BCA6CDD7E4A27AB4D4275832A86D0256A1684607379284219DC05779AE937E488207DAA20154717FD0AAA43366498E50016394243697F0206FEDBD45A498498C8F2096596DE5333B107917A475E3362BBD8C7BF769CC52344AF3D80060769932AC3938E4D0143B85FAF2E99AA26016D76838520861AE32C9867DB8A6081BE5A2482C33B2382BDC938F94F440FD5D0F57712C02497C64525EB1E820E4C70CDF5869A11E7E9C8F45B4C0A0D6E0483A4CE0F445E1C33D73006AED8B7CE3902CECD17417E69B780AF62B1F024915C5527ABA7379E7C78B66329E7336 -ss = 3774A74D416427DF3F63B8AE681FDCB5 - -count = 69 -seed = 6D5A7CC326ECF3983C4E7683F45263A37F692F3BCD2D920E1FD9584350119E74F9A3F905F70D3E20318C1413DE2A0DEA -pk = 92E3CED10A5147663B0AC3C8FC40C4DE0C8B0377EA6CB22FFFD9566193FB6D55D1EE1FEA92E930336C4DBEC9975CE98991F8F094E4BE01B8E921407FBA15E0329700E7C9A347F33E0B772D89A5B769060FFC2654A60F2745A0A868EA7282EEEE5608B1C28EDFF8B6AF3B4304060179F5F8E008B219F2F95A0AF63786D6F894AA5FA84E2E788B0B7B2F75B3216720272DFCBF96589871C0B3E4A9233D751E475C52A5E32501FF8E46798B1CFC95E611B64F9AD6A44ADF6378C2632204BA1F3AC81A715DA8DF4F785E5B1E0A3DD322D4EC084C65912BB99DD3B38D05000FD0FF843C17408D18C377F62CAC7A879F735E258DEAB3FB2DC8E98F29A5B00BFD5E2097D0F82F713ED60A43842DB679AD8304940BF601556E8FC925A9E95F383BBFC64B8E2068206AF2F509BCD49DE502E779A291DCE652654C31220CE494D943D838137B86FC693C79D700C601 -sk = 995EFF7E0D195C6D0533F3DC194D47E62611ACA46794A598D0E9165F7AD0ACE0D92ED09688FEED4E6841C90192E3CED10A5147663B0AC3C8FC40C4DE0C8B0377EA6CB22FFFD9566193FB6D55D1EE1FEA92E930336C4DBEC9975CE98991F8F094E4BE01B8E921407FBA15E0329700E7C9A347F33E0B772D89A5B769060FFC2654A60F2745A0A868EA7282EEEE5608B1C28EDFF8B6AF3B4304060179F5F8E008B219F2F95A0AF63786D6F894AA5FA84E2E788B0B7B2F75B3216720272DFCBF96589871C0B3E4A9233D751E475C52A5E32501FF8E46798B1CFC95E611B64F9AD6A44ADF6378C2632204BA1F3AC81A715DA8DF4F785E5B1E0A3DD322D4EC084C65912BB99DD3B38D05000FD0FF843C17408D18C377F62CAC7A879F735E258DEAB3FB2DC8E98F29A5B00BFD5E2097D0F82F713ED60A43842DB679AD8304940BF601556E8FC925A9E95F383BBFC64B8E2068206AF2F509BCD49DE502E779A291DCE652654C31220CE494D943D838137B86FC693C79D700C601 -ct = AA8B5D5D9D2EF286A112E9E3864F6CCB69E6294DB90AC11DF4D3543E4319C53F94A5296355C740A8299B2059FE6D8DD31C2457292E7401E9F2AC61E47AE55424CF9C18D4242C323622E5EB40DB6516D96D26B288798F2B1959788178B316A779E85243A8382711132D16DB72F50140EE90A11438296745055019C6BA0C2021BBE78ED43B2849E6A058B4DEF11D8A5998ABE5A113ECF53A26E2734C9F1F9240695E152E9C00CEBA823145112547577C523DF178261D59560438C2AB80FAAFBD807E0B2F709D7DF6B6FAAB4DF83D1325841638C46099FF193AC61DF0019FEE296545483C92A6E8BEA5BFD26CBB42B95AA773FDCBBC3945806C7777F5BC5079BD04DB250840460258B943ECA32886FAB610C34D00CC93CDCE378AB010FAA29AE2718D0766DFB84714FF8B030451789D357F03A2EC6FFDEC33CA2C27E4721AC81BBDFE889801F4E2994B7401B1CD9600F99443637765D280334E7171 -ss = 202E3D6D3132D36F93EF6BD8BA489C3D - -count = 70 -seed = F68FC0314DEA88F66AFAA76E6C9B6804B13D4876924410D1F526FAC59A62E26C560B125B1D0F8B461F1FC2E351EFFB4F -pk = 37496914E4EC49D39E6019E283D16B3984ED7587324CA8100F35A22EAFF4ABB8A98FD1957EF82AE80450A25FF5BF77DCC93A0DC8246E008E3454F6DA37C343A65D41AD1CDDA30E27FDE128DEF7A8BB7CCBDB44C8293F113EC47D7C5011FF4FEAE756282D47D971E6A0214CCC5C00C796D5BC3E514FC5A3707FE5104B5309914766A4774C313A8FFD4357D1F42ECEE8DB4C7D2D0A54E315FC003281045DDD92E8A82981EE01D43AD6DE2CBE1932EF1F26CBFDD0CB8C38F9576D4D494C3CAE8211930B86B6E8A061AB9B26DA36F07913B4CE80774030910127A5E815025EB6CBB27FF56D31A895AE5B13FA282B52CEFFE555437C67A40AD109EA70DC763243B5A3FAFD8FD31E172E8233F0EACE410C9B1CD949018745A6909F862228CBA49F070D60C2349121758D7D1BDA506AFB497D22998B3AEC1AEDE66E195DEC3A0EC4F3D5847889926538FBFDA600 -sk = 3E809EC8DD0FEC0D911A4E3FAC20F70F50C00D09A1E90D4A1B9480A64DBBA9BFC95372B0907A0697266FEC0037496914E4EC49D39E6019E283D16B3984ED7587324CA8100F35A22EAFF4ABB8A98FD1957EF82AE80450A25FF5BF77DCC93A0DC8246E008E3454F6DA37C343A65D41AD1CDDA30E27FDE128DEF7A8BB7CCBDB44C8293F113EC47D7C5011FF4FEAE756282D47D971E6A0214CCC5C00C796D5BC3E514FC5A3707FE5104B5309914766A4774C313A8FFD4357D1F42ECEE8DB4C7D2D0A54E315FC003281045DDD92E8A82981EE01D43AD6DE2CBE1932EF1F26CBFDD0CB8C38F9576D4D494C3CAE8211930B86B6E8A061AB9B26DA36F07913B4CE80774030910127A5E815025EB6CBB27FF56D31A895AE5B13FA282B52CEFFE555437C67A40AD109EA70DC763243B5A3FAFD8FD31E172E8233F0EACE410C9B1CD949018745A6909F862228CBA49F070D60C2349121758D7D1BDA506AFB497D22998B3AEC1AEDE66E195DEC3A0EC4F3D5847889926538FBFDA600 -ct = CEF0E295D105A49B06C0C3FCA84751592114449890E5EE22A92E884D038989EDF10597D794515BCDB3BD8F3F04C808683275A522B80F00A09369EBDFCA1DAE1533C6B3AF1931E61BA9AEFC824AE2527392C2E7736453AE7E6906F28B292B94405504FFE115C4E0E6416566B3DC002731C35C89EC52CF54360D2B65D72B02C0CBCFC3E9512F091FD3C8132758FAC750006F2A0231B02278A119D9639136E3341372BE4AEE01E28FF6A2AF16E41050A7573DD06FFB3C21EC0BB069BDAF7C7230F86FDA5097DCC60C4AA18F5560C4470302D22C5E85FF48612C3FEB3A01D505C88B5688D6DB461356FE1A592FF21DCEDA379596BD8A9FC8E2ECDCA53A1E28E1AABB8DC54E91073948FD8641A08D71DACC6A7E9901482CBEC6DACC39E5FB773E8EF88519C0B81CDD721102751D2E552FAD03408263A46720E9027513FCF277D8F3F6B244E71C48E886984A0067926CE78EC3B09D7AFF29D49DE2205B -ss = 9B5515A30B0C0C147AE152BDFB20599D - -count = 71 -seed = A229218B0D51F58D915DF549901548FB0722F352C7470900E7E4D8399205764A319BBDDBD06C00E8C5932722EE5A404D -pk = 779C9EF12283079228CA485CB6BF4986186A8C31BF00F2D906DE37CEF7E03B6D322F518E5B5B7938440F9B3F1BBB56C148A5CC185BE50118CE92909B8CC652CD7AF99C838AB25B21A115669A536470E206B274F694598D421B808E076F7F9746CB86A02D09883C006BCB4C8FF4009E6265E73EB9520521090186A961CD9F9D8B116FE306EEC8F72CAC10A05D56E7D411FEA5F88208C96AA85351E0491AC36B7405537711011E33FAEB9AB94A63FA2D236664F837C4046936C3786875A00FF51E92AB77A7F81FAB18AA657BCCC8BB8BBD58388A3E4B23617F6E7875002D6B11CF6A3C0A64EFD1C1706D8FD4712F0D9A30F294AE8C406F4774FFFC752632830A514B1C2D83005DDBFB22738DA9C3DC22425606001BEB79B8AB56C78C1893FDB887F2E20C7C546628EF2D585166D1AC1335C701F54A21E85DF8FC48BD66D731AD157692FF3B2437E85F0D02 -sk = DBF1C465FFF3D9F783BD9EE61A573715CB9A1309AD27732313B1CE192CBC3D6F14BE491F71FDC193BB041200779C9EF12283079228CA485CB6BF4986186A8C31BF00F2D906DE37CEF7E03B6D322F518E5B5B7938440F9B3F1BBB56C148A5CC185BE50118CE92909B8CC652CD7AF99C838AB25B21A115669A536470E206B274F694598D421B808E076F7F9746CB86A02D09883C006BCB4C8FF4009E6265E73EB9520521090186A961CD9F9D8B116FE306EEC8F72CAC10A05D56E7D411FEA5F88208C96AA85351E0491AC36B7405537711011E33FAEB9AB94A63FA2D236664F837C4046936C3786875A00FF51E92AB77A7F81FAB18AA657BCCC8BB8BBD58388A3E4B23617F6E7875002D6B11CF6A3C0A64EFD1C1706D8FD4712F0D9A30F294AE8C406F4774FFFC752632830A514B1C2D83005DDBFB22738DA9C3DC22425606001BEB79B8AB56C78C1893FDB887F2E20C7C546628EF2D585166D1AC1335C701F54A21E85DF8FC48BD66D731AD157692FF3B2437E85F0D02 -ct = 69974372EF5FE414B5D02A8FD112EAC801D5027D712766690F3BE8DC7CF5408B80044818FA596CC7AAB1E871E3FD62736AE66514CB760169C001D6F185CD0080C14A1357B8E12036E6A1996255B4DE6D1AAE756FF3CFD6BFDBBF18C9D3459FF8CC3315AB90CB6C7DB0371E6BD001CCC8B2218BEE86F114B9904D3304A1F177DF0718765B6358C8BE7EDD961CBEA424DDFE38201AC5F78006F70EB7B57D2ACAD3AAC08F2F01E297D156EDA318A6C67AD5526938E5C183398DF76F91668A8BE64BF7C751904AFF99D00F9E071B2CFB4F5355E8B84B9E59E2781DE03D01FAF77C4108A3E7F6969CC09DEE6C0D54E1AA80A371C184AC93E0A852A56B3DCA6D24B31961B333355EC13D84CA0693B4CA2F55C4BFDB00B4F858092D63DBCBC6AFD38C6BCCDF967B2C039E58EB43ED0B347A887D44543583CDAB22DA3258466D0AB7AA1BFBB85520F75DF6B9DD01556D408B42F061FDA7EECBBA142DC6ED -ss = E8F99D5CFDF7D84DCFB663A77856D6B3 - -count = 72 -seed = 6960F21C7350DCF41B4770C551DC8692D8BA2C0B6E162C589166FF22E7A1AC0F94C2F48504A5F7EB0DA094DF427BC98A -pk = 302D79030A8F84399672BC554CEDF7FFC9B9B4953C04129C8245306FB787C2CA2F27322BB0EA1899A421E2376504F31E56B9E47A12C10028D4F8E6C9CB94F760AF65B7F5F86920F797F6B8A25062839C4BA0CDBD3B9266FD17FC10D52E6CA7F3390210F8943B0824CF9979BA410062DB8F749903071BF66A9FFD3F12FEBE6EC2F5774128E7FCE6D5A55BD4DA635A86C7C880996FA6570523FD17E509E5B1F53A4DE83BCC003E02C10AA4A89DE190EB56A08F4897E92BEE3F109EEA1823532207CBB84BF233A28E17D7766CDDE20140FA844DF518D58496BEF75FDA00F98F9C3948CDFA6FDC2572CE27C65609893996B9BC69E65DFBBA196C0404014E32C9C128EA2D37211C2AE344EDBE0AB9BD5F7205165501C698C8671A08F27E097BDB55784AA94DB80AF5966278270500DBAD9FAAF23989569DEB2845864D0EB7EA9F21315ACFA2F969920BA71D00 -sk = 1F7CFD2B70863154E8A69D1758532E864F68EC73C821458EA0462697A39E61A679CC5B069452780D4E890900302D79030A8F84399672BC554CEDF7FFC9B9B4953C04129C8245306FB787C2CA2F27322BB0EA1899A421E2376504F31E56B9E47A12C10028D4F8E6C9CB94F760AF65B7F5F86920F797F6B8A25062839C4BA0CDBD3B9266FD17FC10D52E6CA7F3390210F8943B0824CF9979BA410062DB8F749903071BF66A9FFD3F12FEBE6EC2F5774128E7FCE6D5A55BD4DA635A86C7C880996FA6570523FD17E509E5B1F53A4DE83BCC003E02C10AA4A89DE190EB56A08F4897E92BEE3F109EEA1823532207CBB84BF233A28E17D7766CDDE20140FA844DF518D58496BEF75FDA00F98F9C3948CDFA6FDC2572CE27C65609893996B9BC69E65DFBBA196C0404014E32C9C128EA2D37211C2AE344EDBE0AB9BD5F7205165501C698C8671A08F27E097BDB55784AA94DB80AF5966278270500DBAD9FAAF23989569DEB2845864D0EB7EA9F21315ACFA2F969920BA71D00 -ct = 700507E9C566CD975B5573B12841FFE0BD3C6FAB0819E32AF3597AC11FECDD32DC7E914F3051A464646ADB7DCD955406F8BD93A87A1D00198403AA55F866D4E2BE203AF19DD11C4979414067C1CC208564DD0F9F85D7C6D22CCD599C86763CAE36CEEFCE7241E7B7FBC75CA5F700D4B7A2057E032C6DDA0FD7ABC2D3ED92E972E0285D727A072E3906D74168FAF103CDB329181EE0680B0744FED177EF185D4EBAFFA4E80049ED569D9561E5007F31E8E32F4D0B621AD280138BCE99F5D918D7AF73D6E0F7BF9FF1D8700E7A4C9E1DB2D7E2F820FE24A120B413340150427DA3999440DADC95B04712F54EE28F20C430995C554AF5F94D477040AE31DBF6FCC86A4920D8EAAD1D1E192F52862FFDFBF2AB5D0021EC3976E7F3D364C629EF6B78DBFFE46B3A815FBE267B89771AFCB09AF1BF8B06D431BBDB32DAF1F3832DB8CB746D65628124DFB11A01EEDAC282384C9EB2278AC7109910846A -ss = 58FF3C071363D83AA6B6B330A6E48D5F - -count = 73 -seed = 53DF46012CAD4A745B7A3C06E18CA95E0B839FD8161E3025749A0887549EB0ED6A44EEEA08BD6060D6509DBF7E9DC864 -pk = 3BE5CA49D556D1110C266C6AA2630C76656730C67B0D221A25A53E68A61AF5E5E62F09E5A210FF63E6FC83AEE7067C0C5945A08EFC9D01C5BE185F968A156B1EB1F81550D7513415AF3B5CACA0E8550A3837C360E454BABEFD53079296302A86717BB495B464F70DF4F7BEC634002ADCFC680C347A16A65591944495BABBA684782C44DF252637DFC16B7C346E66BDEE8C53FFA952D25862865629209918ACEBE5FE846B0164BCF37149AFEAE222C7DC0B2DB657A365C936071055D52A19A1E20458AE94DAAA5B472423D9876D4598DEA7550F793F64E2F153F9CF018315A053742073D5E6E47BFC72155BD4DB566CBD60A6C3394B84EBE66A5552928C44CD34574D34F36B024807EC501BD8F115FF6B066101765AA098CBD6CB1627CB851573B153DA3E767E713C3960F1E034D4880F238E3D1F67D391863A8178FA51E41DB1DB73BEAACFD3E38DD701 -sk = 3A19577908EFD37697B8EDC7FDAF47D13F3B3F40BFADD4CA842C82D0220751A528282593412DC138376B14003BE5CA49D556D1110C266C6AA2630C76656730C67B0D221A25A53E68A61AF5E5E62F09E5A210FF63E6FC83AEE7067C0C5945A08EFC9D01C5BE185F968A156B1EB1F81550D7513415AF3B5CACA0E8550A3837C360E454BABEFD53079296302A86717BB495B464F70DF4F7BEC634002ADCFC680C347A16A65591944495BABBA684782C44DF252637DFC16B7C346E66BDEE8C53FFA952D25862865629209918ACEBE5FE846B0164BCF37149AFEAE222C7DC0B2DB657A365C936071055D52A19A1E20458AE94DAAA5B472423D9876D4598DEA7550F793F64E2F153F9CF018315A053742073D5E6E47BFC72155BD4DB566CBD60A6C3394B84EBE66A5552928C44CD34574D34F36B024807EC501BD8F115FF6B066101765AA098CBD6CB1627CB851573B153DA3E767E713C3960F1E034D4880F238E3D1F67D391863A8178FA51E41DB1DB73BEAACFD3E38DD701 -ct = 45B85520B276EEECB71AECADCB02674CD14D2D35108207C8053807291BE2443BC5BF59566F582007BFBC418987C6685C4587E7AB984F00905136A595DEC7B9A70BF8A34D84D924D1C14B5FC4706C0DE7A1B886A8A6F9E100F8BFD1924F581F0250CFF6CA33139F8DFA9ED2BAEF01BA369656EDBBDADF489860DD6AF421DC7C2DE8C94B5B35F2AAB071496EB4C30B091830B40FB599C9E6494C776299D2696DB123B21024023D518CF99CD614D4F44DD730263AA9D9245F1A7793C75E4B7FF3E71F96D85A02EE2CAD361A3873A2E0A40F1C1E9043A03DD9D475946301E88930E226CAAAFE8D84FE49DC70A6EC9839ACEC4CD315417F05C2807404F98A0E6B4ED1F6B707C0B9035ECB2E0965AA15C1CEC22C010213B5252C33586DBC66EEC7EBB83B849EC9A46D2C48E52F78C24B0E3F9D00D380D4C0AF1ACBCD7F7582AF5F76EBC58FDB75271840EE07017D0D7275AAB4062C0C8FA446ABA19191 -ss = A4E753CE52D682D4BD468D9BD872A6D8 - -count = 74 -seed = DEB963F8B1D8FBDF499D564BA8D2D47915BB402DA02F17031B37B4039A842AFB9B7E48F37200605992BD2429427A7A4E -pk = BFDF47DD1581700F7A19EA3554BAE3E7B985962418824B33422AFCE02D1B4A27373F02F1D388C87CE3ADAB3A39653659ED6FB9510A0D01C7A54616C86DCF44CD213345D439D537A66AF0860C5B2A32DAF3C7618DDA061B7351FC719A7F6754BEF63B083A8B565FEB136BA801E100F08D5E89B8D14CA0E8B06507CB4230ACBD0C4D2F3EBC32C9BF5CD873A3E353A3EBAC565677C4A851C2E907E27E76A27B62DFA9A46EDF0070821563BCAFB597F631D776DFB2F5591C3D9CC2AF8A0A06F347D3F7219E9FDC527A5A79FC7C3A2025E9C42C0668AD75C0B2B561F21701BD4993AB6EADC93FA9216812B7E7521C69D3062F89036EDDCCAD2D23F5B158C54F2E74AD1B1FFEF763ED902D3B793A8A21A4F1040963010F73C9C8F42C6B76E41D6982566AFD76B03F48AFAF4228453CF3CA2C754FC9C92DEC9FF93DA36D32ECFD1587B9E448046EC883AF648500 -sk = AE0F65E29F38804A6759F70F4D01E2AAA1E0F79A8C218EB9E2D0664BBD9F1E531A366BD8CAB1172AA6A64600BFDF47DD1581700F7A19EA3554BAE3E7B985962418824B33422AFCE02D1B4A27373F02F1D388C87CE3ADAB3A39653659ED6FB9510A0D01C7A54616C86DCF44CD213345D439D537A66AF0860C5B2A32DAF3C7618DDA061B7351FC719A7F6754BEF63B083A8B565FEB136BA801E100F08D5E89B8D14CA0E8B06507CB4230ACBD0C4D2F3EBC32C9BF5CD873A3E353A3EBAC565677C4A851C2E907E27E76A27B62DFA9A46EDF0070821563BCAFB597F631D776DFB2F5591C3D9CC2AF8A0A06F347D3F7219E9FDC527A5A79FC7C3A2025E9C42C0668AD75C0B2B561F21701BD4993AB6EADC93FA9216812B7E7521C69D3062F89036EDDCCAD2D23F5B158C54F2E74AD1B1FFEF763ED902D3B793A8A21A4F1040963010F73C9C8F42C6B76E41D6982566AFD76B03F48AFAF4228453CF3CA2C754FC9C92DEC9FF93DA36D32ECFD1587B9E448046EC883AF648500 -ct = 8069BB2B0DC833C4A359E1F31AAF513AA4A26826CC9EF2F1C5EED50A8C44994B4DF322724BD8D35375D1EE7018DAD3A44C051B92950C00F56634BD3EF14EB2D4603EE3F72B47BA9ED688F3A4C99D21A3C52EE18EA6032EE07F514D6FE1C462FFD1ABC3628CB52866D536E6D47400EF4B861FB3621714923FB1995C1C072B2121DEF1109E995C97482B009CBCED8FAB14DD572F5261C717EBD6C2BCFE245AB2B669FDD0B70166C3EFD6D1DC97DE7CD63AA125D4816CF4B7CE2B2D19EE6BC0FD1A5F7F0B432EBF77FEAE12DA413A4E594C550471677C0F2E80F913C9003127CF2850AB91ACD60269B9CFBD3051FBE4783E682D014F71E040DE213459C052E5EFD1EB377D8EF89CFF2C8CC5AD7C1EBFC25F4D850129E3AEB6999E9592AD4B467DAB3CE8C8DECA783D1B8133E3BDBA5667EBB7205563DB0B770F68565FBB9E5E14E63E6232B89EDFF8B77E0086CD2DABE1865962834D4C51E3D64D7D -ss = D229BBB3CA9080B96B26D87F2FBFCC26 - -count = 75 -seed = 8E2995F1B3E43853B18916BB1212ACEB05898E2B177A87ABEB928AD7184E59695C56B2CCCF5DB80853C28A525E327D13 -pk = 642C64398DEDD29CFF26006A5C989C9114FE2CF5D2E5DB45A1DB66A42C13DBD08EFD116CDC3092271A78BF5D80197921ECE35537A3770109AC49BFDC73254DEC64BEFD4D326002293FE8C5177E3CA648E8ACF9D3A3A1B576EE40187A68CAD01DF11E337455860377318097B861002B3E1A7E06D7BC8A11BBEA50419EF432DF8946A62DAB52D04C01FCD01EAB2CCF798D0E3B4625CB8A06F853A0B3716243606B6C871ED800B13DDFC1196E65C2065E7EA3E70B450D82551A52F2F848CEF9DC41F9BBAF2C5A9345C3EF4E915B43FE4C8E4883D403D420AC4F19ADC7008C944732181E48C3650AFAC2A6BD47815CD0891FCBCC5ADCA9BC0CD788998F947D11880CADFE1FD458DE4218C5837D07DEB0E989C1E001A9F281283F8273BB0CDB912F54066F13A3A73E65691BE0CFFE719C0C556BD2BA770484278E91B9E4FA76BE271DB91A7939CF48CC54ED01 -sk = 6084A235F79DD093EF6D185B54E69DF3F1B7A24CB6E6F21B112C4AD8FF7CE8A9BDA1BA1751496BF39A354B00642C64398DEDD29CFF26006A5C989C9114FE2CF5D2E5DB45A1DB66A42C13DBD08EFD116CDC3092271A78BF5D80197921ECE35537A3770109AC49BFDC73254DEC64BEFD4D326002293FE8C5177E3CA648E8ACF9D3A3A1B576EE40187A68CAD01DF11E337455860377318097B861002B3E1A7E06D7BC8A11BBEA50419EF432DF8946A62DAB52D04C01FCD01EAB2CCF798D0E3B4625CB8A06F853A0B3716243606B6C871ED800B13DDFC1196E65C2065E7EA3E70B450D82551A52F2F848CEF9DC41F9BBAF2C5A9345C3EF4E915B43FE4C8E4883D403D420AC4F19ADC7008C944732181E48C3650AFAC2A6BD47815CD0891FCBCC5ADCA9BC0CD788998F947D11880CADFE1FD458DE4218C5837D07DEB0E989C1E001A9F281283F8273BB0CDB912F54066F13A3A73E65691BE0CFFE719C0C556BD2BA770484278E91B9E4FA76BE271DB91A7939CF48CC54ED01 -ct = 211EC0A98ECFA99BCF11E20042BBC5AC8EE0529BE358D76CD0E35FA55597FE8B27EBC856B13328D88F4D50D6BA169C821153417186A701F8038354A03885D7EA9F65A8CCA89316C29B5CF5EC4820A79E1A745DC32C81837675151862909DAAE94D6B71F444E507CBCC540F8E4200F59D56AF1EACCD8B97A00B084748A066FE2FD945C7A69F07E7EFBDB1CC947C7BABAFD95084405F60A9741C40D8AA7F9120619501F81400C381CEA185617FF07832A0C9A79C62E41D80FB89354AA20229C1B346F4B5B8B127A991BA2E430E7FE29C4B99F9BDAFD77581607BCC0E003EAEDE18AA0297590E2E27F4FEEF0FFBD15C31BF6D1615FEF8CF15533671FBAF71D2760DF9232327A27A47E08227B295374DB0F25C9A01E70998C6E54D1AA70D5867F0E1868D27A85CEE9055B270BFE04973D4B29F14AB8B0BE5CB2BE9D2A4204717AA4063721C26AD72ED6B2F007E327EFFDC4A5FDC9033903FC5D8681D -ss = C96B986298CC6BFDA4253200192D1573 - -count = 76 -seed = 9218943C51FD2DE47E509AAC67EFF176795102F37D7A2017E3AFD768FCDA7877AF38739B00FCDF227C2FD62EB635942C -pk = 26297E9605B8847A59C1479CF45C7B4DE51CC85E6F2D86C561D43B7BFEA88AB65C2F52E854EB95D0693D536BE960307BA02C216A33C1015E39F12C35F7A15AA6D7BE547F28599A4CEE951018A8801EAB191DAD1B0EB24E6901C10E14A000791BCBC61519AB12CA5C22701A1B6401484E47B3B1D27F0226616E7F5CE4C166DF11E3EB76B328181215FC6E413985D23D7760BBAA2A55857AD6A33CC61E58B17325E599367F015FB6C73EEE26DBDEAA051A17A323EF6768A969CAC8D57FCCCBB396D626F7DBD01A6EF939E2D1B42EC5E03E638661677A69F4343EAD7B01CEC04B8E472F3DFDA39A3E5487E972B38CD380447CEFD39DD0E89EC316EFFADA55B6FC8F15334E2755587F44B4CB34DB6F91585C66F1007A6D027148DB73CA52CA86086C342941257A99B67F485A1B7D40AE65F512C5FB43A517C9E7D073954F6B70377EC02AC49B23F22E0DFD00 -sk = ACD1C0217FAD5CAA4235544DD9DE153AD8BB1AC46327E9F25BF1784AA724B0126D173A8D3445F069FA2C7B0026297E9605B8847A59C1479CF45C7B4DE51CC85E6F2D86C561D43B7BFEA88AB65C2F52E854EB95D0693D536BE960307BA02C216A33C1015E39F12C35F7A15AA6D7BE547F28599A4CEE951018A8801EAB191DAD1B0EB24E6901C10E14A000791BCBC61519AB12CA5C22701A1B6401484E47B3B1D27F0226616E7F5CE4C166DF11E3EB76B328181215FC6E413985D23D7760BBAA2A55857AD6A33CC61E58B17325E599367F015FB6C73EEE26DBDEAA051A17A323EF6768A969CAC8D57FCCCBB396D626F7DBD01A6EF939E2D1B42EC5E03E638661677A69F4343EAD7B01CEC04B8E472F3DFDA39A3E5487E972B38CD380447CEFD39DD0E89EC316EFFADA55B6FC8F15334E2755587F44B4CB34DB6F91585C66F1007A6D027148DB73CA52CA86086C342941257A99B67F485A1B7D40AE65F512C5FB43A517C9E7D073954F6B70377EC02AC49B23F22E0DFD00 -ct = 0C24341686DB351AE2ED452C4457AD1BF175D450C49070720894B7F70DF06F5875FC667B1B8C394EFFA7D19DA7D74BAA7CEF335E367201109F7671ED81D537A69F4F1CAEFFFE70228B98DF2740C071E5FF2C2D632CEA43EBFCA60B58C04EC6DCA7B4F33730C83E9B3DD638099D0036CCC8DC106FBE1DDDBBF26A1737E826903C9A24DFC985756F264BFEA891F50F074C877D4C6F2EBBFB422DC22A5299FE07A3554AB0E8012BF4828E2EA61B9C8219E1B8DFF8DB95CA3C981B0B64545341427A34937001E70E7F6A9B6D2791CDCCDB3B343DE8CE1E0A449B3C12F201CDDDE7D9A63E1783B69F7969C1DE25FE1EE2AAB4EE950CF6F80F1323A2742997C353F500AA45ECC5EB18C392CBBED14F611A2556E78600785FAB246A64C1D7A6F2C31FEBDA748DB0566B1CABDC8ED18C14CD621A5F48A9651674E15CB64A1EE6E87E36BEECC6577FDA0C068F38008BC2009E582D2A52D1A8842373356BEE -ss = B1466D6C93EDFD9DDA1805592F90690D - -count = 77 -seed = 542E20078ADD5296050AF150360F057F6B9AB3BA835589DD56987DE805F900B906505B5390A0D86CBA28038992DFC59A -pk = D5BFE0A0BC5D1E06ABEB2A65F7B1B24093F5F9DCE46F194EDA944F44386AB427832AD4A37BCB10ACF082FB9DE250CA206B903412FD9301F4A4F756824FAAD608C0EFDBFC92AF40CA11B7D820752165CBE49EC964DA9574FD16D430F641E6DEEE62DD74B6B3E44C315940CA420B0108C38CE04E9EF520F2682A8D8E269F13C0C11E9B630B1CC812EBFAF28EB12416480B90BEC755DB430CB63CA6FBEE259D5B078841131F01A3261C4B2D737C7BC6584547006E40D8F8BD47698E403CD13CEA2E6A30B73442BF34CC08A2DBCC5DF1760A8ED4FC376BF9F761FE6BCE01F52DF1EC7AB307132EAADD05B6F331130CA2C56F38E1441CA4506794768DEACD84F075B88176061B318697490AEE4EBF3B3D3C8523AA00A8002DADA2CC3BF8FB0AFDA93EF74CC1336234180E86A615CE1FF92E1DD2ACF183613B37BB5484E9CC3728B89036A4A976652ABDEF2302 -sk = 241191401A63AFA750F05662E354DDDB30AC637A035D3B650C62A021078AD7F1E9E3D14FDD4B7FAD20DE4F01D5BFE0A0BC5D1E06ABEB2A65F7B1B24093F5F9DCE46F194EDA944F44386AB427832AD4A37BCB10ACF082FB9DE250CA206B903412FD9301F4A4F756824FAAD608C0EFDBFC92AF40CA11B7D820752165CBE49EC964DA9574FD16D430F641E6DEEE62DD74B6B3E44C315940CA420B0108C38CE04E9EF520F2682A8D8E269F13C0C11E9B630B1CC812EBFAF28EB12416480B90BEC755DB430CB63CA6FBEE259D5B078841131F01A3261C4B2D737C7BC6584547006E40D8F8BD47698E403CD13CEA2E6A30B73442BF34CC08A2DBCC5DF1760A8ED4FC376BF9F761FE6BCE01F52DF1EC7AB307132EAADD05B6F331130CA2C56F38E1441CA4506794768DEACD84F075B88176061B318697490AEE4EBF3B3D3C8523AA00A8002DADA2CC3BF8FB0AFDA93EF74CC1336234180E86A615CE1FF92E1DD2ACF183613B37BB5484E9CC3728B89036A4A976652ABDEF2302 -ct = F7B3FADEFE141BF309B476DFC9E621AAD059F8A0902C5217D8923E2F60655C87BCBCA4E49366F95A1C28A40D42C9238C2D0FCF30FCE301EEA357DE19D698CE5DDCF4152F9FE766FAFD0A4F6A8C1DE63F33A810F08C7FA39863EE8A35B1634ECA054C78AA961532E9C1D9C3D98E005EF456E603B246FE280DD5069A6CA40353F318A453E51E4BA3905096401E3AA9750228BBA806C98762D8AE5E4C98859D97A2FAAF97790174125CB37420224A8CB0E025D4BD55B93DE058769EA1CF436B1401660481DAC65049F25014671BDA6138C3F56EBA6235D75DB58C0A0D01EF2240227274D3ED866D0471C000C05F177587203F60CDCE413417EE7934A166D45C104469B031E292376253EC892230EF620E28A3F3005559C9D7D7735865ABF7041DA0180FD60493B6DF3E3463590B5FE02CB278D566144DF82838A5564C97948C8E66C245995B1EFBC7402A013F525D7D6262291C6CE4F1EED0904E8B -ss = 437B7246BE78180BA44324C3B743A028 - -count = 78 -seed = 6A85A61DD08C0733FCBC158ABB49FE0B0D96A50DCCA140A2E9F5A254F1901985844613B1C656C0CB0112620591B88AD0 -pk = DF14F17DE9364D2E04391D6412671ABF06A75DC4E280FE366D76F93F43E7D2B60059C4CE42F2C0C8E0D2EC2B876802A2D84E1E826D7000C90C03F404166DD5C02703216F53E4E108FE9CFC889E44F6ECD90CABA745B81A563342C56B45448DF77710FC89C1D3F66954F2D2F359015B120886BD0F88CCE40FAA4805D63FAB0F60A72CCBD187A0DAC23286DE58B09D80128D8ABC6CEDACAAEA2F2197EDEA5B44ECF75973490066E92A64F2857D83CC1A392971FB16470E5D20AA492E9CACAE88DDF321C8EC0995BBE52AD0688ED2957658930A27C43148F21A1EC01C02AF3DC6B958D074FC26B5F36392465BBB3C8276EB418DAF9F7C74CA00EA53A5F62631C7DDD72CD62999DC305E89A7D709958ECCB2D9DD014E31A053749C86B2658429CC0A89294DB18EB401C29AB7443F0E9153F47EF28A32D73BF4DDBC1FE494216CB40631C645AFFCA672F14F01 -sk = B9A6B0C05677E957D41A34BA03BD06F2AA88CD55413EBE82AACBFF9925A16A40931912C860D5F334F236F400DF14F17DE9364D2E04391D6412671ABF06A75DC4E280FE366D76F93F43E7D2B60059C4CE42F2C0C8E0D2EC2B876802A2D84E1E826D7000C90C03F404166DD5C02703216F53E4E108FE9CFC889E44F6ECD90CABA745B81A563342C56B45448DF77710FC89C1D3F66954F2D2F359015B120886BD0F88CCE40FAA4805D63FAB0F60A72CCBD187A0DAC23286DE58B09D80128D8ABC6CEDACAAEA2F2197EDEA5B44ECF75973490066E92A64F2857D83CC1A392971FB16470E5D20AA492E9CACAE88DDF321C8EC0995BBE52AD0688ED2957658930A27C43148F21A1EC01C02AF3DC6B958D074FC26B5F36392465BBB3C8276EB418DAF9F7C74CA00EA53A5F62631C7DDD72CD62999DC305E89A7D709958ECCB2D9DD014E31A053749C86B2658429CC0A89294DB18EB401C29AB7443F0E9153F47EF28A32D73BF4DDBC1FE494216CB40631C645AFFCA672F14F01 -ct = 1DCD103E5C2F11A2ABE82284B694FF926EF59277450305849E0E21FE41978BC1C80E2530B44ADA96A3A78CEF861FF505AA279900045D0198C1EA37E0C8D56724DC4D23836D5D2E2275B6383231A834B51B22A0A0645E11F660FC935B2FCDA5172B249AFA1B1C2A44A75AA5429201EFF31FB2522CED0E539D1AA474E0564260A28EA8A59B0D21088AF25FA35F024E0A21ABAE187940CEF6269F3275B9DB80D7C83139F94C01E1C57687EED12C1E4530AF7B636B7C1C5DB85419FEEB675AF13335E1272352B4A207AD17976B1B396ED4408ABDA935F5114454300AC30135F6B6B8682DEC4374561F85D18C2175F8FDC4945698A89BEC32A5D6D251137AF94628ADF66065D04C875B24C2C158384B52249A07710168D83E4B7BA942625A9F279B22C9A7EECBC04947FA9FF88BDDF3C6432BE56E71F1CB7BB643A4D314C7C78CEB6C10B7D47CF67612B5030137E33087221674FF242B2441EA0E31D8 -ss = A7CC77ABAC122AE68F6D5F9BC4A01AD1 - -count = 79 -seed = 7F4A56EDA151E7B097CFB8EF980440FFF707AFFBA91867C89522CED6C5FF3BD7F5F00BB49DDD615D9361A7E4EFA42851 -pk = 3F0DFDEFE400120A9557199CEB8A8FF36675D04B70A1C5B677BFB1D8FE1220E8AEAFDB3B48A91CEDE5E015EDD661CFC8F1BF0492C129029A68BD556471F971D84D2F031C24618CCAB69C986193DEA9C026CB4A5CD371D7E92C8297385BB7C2FF95EF3B98FF89F316C5D1B1272F0219A7CBBCA980BDD23C4FAB892437F1E2F73326CDC53E08A8EB1C10670322B32672BFD4942F7341A9371FE09972CB8ACA269BC473B47A00D83CD1FFADC54946A033F99DD7C188340B5339C97AB12221130CA0C57ED26215255405F882E1387B14DE764024E42DB70E7274798C7700297420196C348CE0646AA9E17189CF99E0429B469E14C41FE0280B4452C08E1CDAF2A754F45602230573586DFEB527FEEF06C7CBAFA6006B218A5D634054162F01BA46B2708BC898FB6BAEDFF6057BB3DC7922ECE7B41551EBFDAE0046EEE572D33DA00E4CED015A6E4A72AB2602 -sk = 28A96C71577BA00C94F99FE965BC595AED4441D5BA51EB259B0F084AE277B0CF1315E715F919D851482AF4013F0DFDEFE400120A9557199CEB8A8FF36675D04B70A1C5B677BFB1D8FE1220E8AEAFDB3B48A91CEDE5E015EDD661CFC8F1BF0492C129029A68BD556471F971D84D2F031C24618CCAB69C986193DEA9C026CB4A5CD371D7E92C8297385BB7C2FF95EF3B98FF89F316C5D1B1272F0219A7CBBCA980BDD23C4FAB892437F1E2F73326CDC53E08A8EB1C10670322B32672BFD4942F7341A9371FE09972CB8ACA269BC473B47A00D83CD1FFADC54946A033F99DD7C188340B5339C97AB12221130CA0C57ED26215255405F882E1387B14DE764024E42DB70E7274798C7700297420196C348CE0646AA9E17189CF99E0429B469E14C41FE0280B4452C08E1CDAF2A754F45602230573586DFEB527FEEF06C7CBAFA6006B218A5D634054162F01BA46B2708BC898FB6BAEDFF6057BB3DC7922ECE7B41551EBFDAE0046EEE572D33DA00E4CED015A6E4A72AB2602 -ct = FC98277A808FD81DDB8224E78835D0D276C84EE80FB587F473652DCBB1B2A7EFB759D6DF3B725F3EDDBC247716D8CCA07337D3BE366E017890D0C02ECDDEFB5F6E1F7542FC877E381D8159847BA70B57469DFD3FFCFE48D408424BE69D75E657971BF736AF83E57CCA883B910200D606AEED67BFBA5570A32AE41B2CE4204C2F5970D4CEB3BF64DD7ABDE6758770D2B038BBCF02AE3845C43B907E61B9563C88EDDD069A01B27544F06A558FB2463124A9B5A94C52B664BD8ACB15A7BC02A60515995459D5F07FA1E4C2CC9504E0E766DF020781970E3237FB6872019F02C5F5D86B0A05E3C97DCA8D6E8513F9D8FC3D57EEB3ED4C6F5A26895DE5BF0C23E392E24B9FB4E2BB825F83FFB1402F0E4AF48D0902E0E3350216C5D03A6D4674AE99FF58C2B373ED44C788475E70A435C5DC83A1B1F548441761B9489AE91798674117435C3438A3E62312010F58A35703F1A7A42FD7383FC464B6D7 -ss = 1668F6FE2A022440D748D2225256D97D - -count = 80 -seed = 09FC004519BCF85B20D25D314A0DFC79E00CB6262A7DDDF9C52473641AFB8CFA0F5DD5F53558184CAAE9EC34B459E98E -pk = 24410A206CB562AA5CEB0B04519E66B380BECE417D9D6EC10AA2076645DB2BFBA5183A715074108A5406B75AA00725EC81591397301902973AEA8F1D532AEE77B78B5F0BC3CE8EB553C7C7D5D0708B1565E50A67E1E5B5DB34DA089214265F6E2F79D8C877C5065AB0EFF833D6005E002FF7D30880AD3BA795D27B678D69C51043AB38254DA0B9076380DBB21C76F104E4B0DB9C316FAE0AD2F77D8C96DDF1552394BBDF00262BEA8C1F9C1E6F8D468032E9E087AEABD1E7AD904BF0AE15F6598CA1A236B555F1C52FEBBB79CD9AAD12DF1778AC75B5A0CD93E532016F4DCF0A633CCF05B551193029D057018DB12BE465F6683B17E61FE15A1FC7E0D49DEE3AE631D608A62E70BCA3614C336CE8F2D83EE100B816487C5532C8FC8BFA0FF6F648F530EA50040394EEF8F32B89E9010A8B11248691871B6FEB8F2681B10151775507553FD3F65045CF01 -sk = C08BA2EF8C3A0A043AFAD931652D7A191572E7169D50969A767734B15CBCAA4ADA2CF96962955342CD54F70124410A206CB562AA5CEB0B04519E66B380BECE417D9D6EC10AA2076645DB2BFBA5183A715074108A5406B75AA00725EC81591397301902973AEA8F1D532AEE77B78B5F0BC3CE8EB553C7C7D5D0708B1565E50A67E1E5B5DB34DA089214265F6E2F79D8C877C5065AB0EFF833D6005E002FF7D30880AD3BA795D27B678D69C51043AB38254DA0B9076380DBB21C76F104E4B0DB9C316FAE0AD2F77D8C96DDF1552394BBDF00262BEA8C1F9C1E6F8D468032E9E087AEABD1E7AD904BF0AE15F6598CA1A236B555F1C52FEBBB79CD9AAD12DF1778AC75B5A0CD93E532016F4DCF0A633CCF05B551193029D057018DB12BE465F6683B17E61FE15A1FC7E0D49DEE3AE631D608A62E70BCA3614C336CE8F2D83EE100B816487C5532C8FC8BFA0FF6F648F530EA50040394EEF8F32B89E9010A8B11248691871B6FEB8F2681B10151775507553FD3F65045CF01 -ct = F47AC313CA6775862787DC223D09F375E6DFEC29F8CA0D2D212A1E544EE8968EAD4CF488E832D2B1187FEC96939B3186AA37BA3B8746005BDB92A4562BFCCAD8598479FE32F68C530ACD648727EED50DCC9E12F0A801C9239E3567E392296A986D61FB4FC307F0C3DDD2D9715E01DC7D41FF0E895709527F905579492925C2E11E5A1D350F433CFA40781B50AFCCF0E1829069DF081E13C03B41C97EE5C4CF6AEBA88D6C0119AB0B070737D70BAF4255319A644E47352DB4DB57E96AFA633C0F16949A09B6813BBEDDC869EC43294D393E8CD61E840489095134160040E2BF606D9DECDB41C917FE455924B760383CDA89BDB7A380C926BEEE84187D85B0E8B779D65740601CE6202BE0B03D43BC9F71E63202FFE6F9036A55C5A25C58D78EA402420EE957902C3A0C760791F94850AAD409BBB4BFFC41553A6451FB13E9D1594EEF2128A1B138783600C7058B784C0CEF3B581F5E997C3867FD -ss = 8C09C3984055F2706130AE9F5291B941 - -count = 81 -seed = E3C41CCA6F04CFE7732FD54DE30CC5CAAC93E2F80E76AED7D24A962A3969C1B6A311459A3EC3E510E3E9B1E4291D4D7D -pk = E763483C849CF162B8B7EFB8C0AAD1FD8430CB09B8B9358D2874819C50ED045A3E7A1F67096161F37A5559BC48BCAFDBBC1AFFE7480901AAB866BB717B4DEE853BAA07CE2F0E56EA510D09514E1102B2E05B3F7059803032EFD941BD494ED97D36053AA51D3BAC6731C6857A94003FAFBF92D70578D25071625F0B0111CA1A21E1236A671CDBABF023297796D8089E740C05608B3F5BE5C3C462FB52902D73735EA3872F023A22D7AB2324C2D12E3356ED61A21C02FB245BFE5E62BFAE46387448A7294FDB54ECF7922E21299C4C2F170718458428E0A2C21B772102D236FB733788DCDEE112CF533BF8528E5D5BD41167BFA8C79E4CCB26B4C9CACCD5534324CE7953DB4DC994D79856D9B46DF7AE2F61C90154997BF205796F86E9F52980E8D73BA371FB9B9C85C6E35A6E7706C1C11A6AE4FC1DABAF4B28E2BB2D0F50687AC8F85721619D5ABFDC00 -sk = 0E3B30E102D707538C2671060F603BB009BF978E2A6175A868F93CE4969C69204C0D234AA7285DB4E55CEB01E763483C849CF162B8B7EFB8C0AAD1FD8430CB09B8B9358D2874819C50ED045A3E7A1F67096161F37A5559BC48BCAFDBBC1AFFE7480901AAB866BB717B4DEE853BAA07CE2F0E56EA510D09514E1102B2E05B3F7059803032EFD941BD494ED97D36053AA51D3BAC6731C6857A94003FAFBF92D70578D25071625F0B0111CA1A21E1236A671CDBABF023297796D8089E740C05608B3F5BE5C3C462FB52902D73735EA3872F023A22D7AB2324C2D12E3356ED61A21C02FB245BFE5E62BFAE46387448A7294FDB54ECF7922E21299C4C2F170718458428E0A2C21B772102D236FB733788DCDEE112CF533BF8528E5D5BD41167BFA8C79E4CCB26B4C9CACCD5534324CE7953DB4DC994D79856D9B46DF7AE2F61C90154997BF205796F86E9F52980E8D73BA371FB9B9C85C6E35A6E7706C1C11A6AE4FC1DABAF4B28E2BB2D0F50687AC8F85721619D5ABFDC00 -ct = EF5471DC00603F3B6CA49A046394E8E4550180C5086A4EC4AE524683AB05DC43B9805F05610F57E29D7A4217A23967A7B1FA471BAEEB009200D3F880C9B7C37634F397AB6263AAD865B527C6779ADA27A6442079C6947F43BB7DDA8F230E532F91F9AF6B50C7B939D56435FE51015BB618EFFB9B0210A020809C9308A05CF82D33FF23FEAA00605D579D3B01BD28FBA1ACFEDA23E464F624B00A63E95D07900EF55FFACC013731F45F0A4BF688D09B85300A3FA142C7D060FCB477D0C7A84948882798C1C1082A397149845F6FD23D2E1CDABD6FF6B1B0A9E9BF4C009D8FE85E8347B6ABBA433F7C753B070C705C4C9C18BCB6B256746B4C755F6CC9E6A3D5C3738C93E21211D2402830A32338F617F376DA00656A023643417677B908FB426ADB37849BDD485C40554A52A7295534DEFEE1A415EFF291BBD0B2F0213DCD4CD63E7FD8FA449D8F52FF008C65D2F9E301826E9716DB1AE09B09C8 -ss = 657A6670077450DF16010E2B27552FF6 - -count = 82 -seed = 373FDDE922CFC416ED96B444E445BDD0962E8989F6C50ADF9912A89937C57217D3600B06C95440448E3F601AE69CA5BE -pk = 403E0FE2E4768D8AABA88A13D1095F6919CD6378D19B0E07564A839A2E56CA7DE01F393AA50AA8BD69D78CE8207A7A429B7FEC318D42001257C6378A904A283769B5D17A3F6DCB7B2248266002A5B00AF91B21B06A90A0FFA206AB41B14519D37A5A42A5EF98C3DBFFC9DF73DA00AA8F3EC93698526F004836C97DA5AD2C31B23C5D2246EF4907D9BDA97C9BD43EA08C5AE939F92524E6BFFC573F65006EE4314BD950F30084DE631F2AC3834BD6091E96AD30963EE8F1183B50BA51E416E33CA724FD0475E8343E1D83C8A69A6E6C5D01DFDE1B63228B22DBEEA30110D4B6A1F2708AC6397FEB87A82F8AC4497B144BDE41B15C65DD5B83D47594F0B10385C48A941F5890CE4B9A7CD3C6D463DCCA7D277B01956BBCF7F6944FD80527A65E63E56F4238E31B0EC2134CE28C603BC7E252792C37233316BA8D5D6DEE9EEA54AE421B5D5E9941FC308F01 -sk = 2478F7D3DE6041E7E5CD11C5E2EF483DB02E23D880594683E501A9F67E5885D5EFAB28CA726C65DD9C3E5100403E0FE2E4768D8AABA88A13D1095F6919CD6378D19B0E07564A839A2E56CA7DE01F393AA50AA8BD69D78CE8207A7A429B7FEC318D42001257C6378A904A283769B5D17A3F6DCB7B2248266002A5B00AF91B21B06A90A0FFA206AB41B14519D37A5A42A5EF98C3DBFFC9DF73DA00AA8F3EC93698526F004836C97DA5AD2C31B23C5D2246EF4907D9BDA97C9BD43EA08C5AE939F92524E6BFFC573F65006EE4314BD950F30084DE631F2AC3834BD6091E96AD30963EE8F1183B50BA51E416E33CA724FD0475E8343E1D83C8A69A6E6C5D01DFDE1B63228B22DBEEA30110D4B6A1F2708AC6397FEB87A82F8AC4497B144BDE41B15C65DD5B83D47594F0B10385C48A941F5890CE4B9A7CD3C6D463DCCA7D277B01956BBCF7F6944FD80527A65E63E56F4238E31B0EC2134CE28C603BC7E252792C37233316BA8D5D6DEE9EEA54AE421B5D5E9941FC308F01 -ct = ADA6439834C7BCAC8F61B4DBAFFD4EBC116196FDE0BEEC1F216D52AADAB44E967692B0CC5D6593B3A02A501F3415679A3D1C4D128DB500169EDA624EA81F0B9B31B320D135ED13BCE80B4320EB66DCFBF76D7C45C3506151A256475B4105B17B276AB35DBA3E6BD5FC8B54BF98005FFD6C4CA4C714914D29708DE71C948B235C6C66613CF86B8D6666283E78584D8FC7A1A332A82E2C17DCD09B65255BC7412D1ACCB36D01A539FE37FAA72432674A2B62AC63FFBCE68DD364F5F25CDFAA3B842966EB09992BB096241BB7924D180F11535709CB2BBC7EE4B8C98301ACF3E0AF53D3B8CA222C703279EB719FF3580E1033041B5474EA9D6753A0237BBE446E75FFF86F62F0FD7594B43D3E0CCA22889D669301CB1AE3593669DC516480F11192B23F6644E1AA106AC98B976AF3743A9FFD3C52402725061F87F9D14D01800E08BBC7AD3DB8B7AC312F0204D0A5BFD970CD7D90A6E388798D92FD -ss = F83EC12EBE74AD7A567E22537E605B62 - -count = 83 -seed = 16BEF67F7AC3A755C59C816478B75FCC16CE5844DB537791ACCD1EBD49D2824B105FD2E970F728C8F0CF16E439A9AE2F -pk = AFFF8BF1695CED245FBC2C8C7703DD13E4F9D052A689B35E6B8D2CD9D73622D3209A223D04A960A970DADFB62BD5CA4897244E28E3A500A659DE76B433D2884743E23C766442266C5E9C3F74A027684715D0A67A6A543742833272AD82D9AC992D94671A548EEE12676FD1129A0190D7C89011A8A0AB34F30D91FCE9B9EBE8B252F7A6513A3AC1A8DFC08044D91D396F812A25BB08867F39BF302F91FD1EB041A1A3F8BA018A5F3A9609CAF8B2A6BB64C9E37F22CCFA4E684B3CCE3187EA875E7CFC8CC1F14F0ADD1A5BCC4A4132F90FF1706333014B793AC646DA00A364EB3C317A0A396332006350C2BCA1F7BF67BAB73A7E4D702A1A685A4A1499B558A609FEDB159606394E492A283D43AF45765AC08B010502829B342612A91D46773F3DE2E25C615A7F2E3B2DD25721AA1CBE573AD4771403DF1097137356895C91FE0043EF7C8A86D95F0F3200 -sk = 9D405D3EBDAF35FA8722DE431B669722721A91D8DF95B05F40CC35754625090284AD6C131427DE79BAEE2801AFFF8BF1695CED245FBC2C8C7703DD13E4F9D052A689B35E6B8D2CD9D73622D3209A223D04A960A970DADFB62BD5CA4897244E28E3A500A659DE76B433D2884743E23C766442266C5E9C3F74A027684715D0A67A6A543742833272AD82D9AC992D94671A548EEE12676FD1129A0190D7C89011A8A0AB34F30D91FCE9B9EBE8B252F7A6513A3AC1A8DFC08044D91D396F812A25BB08867F39BF302F91FD1EB041A1A3F8BA018A5F3A9609CAF8B2A6BB64C9E37F22CCFA4E684B3CCE3187EA875E7CFC8CC1F14F0ADD1A5BCC4A4132F90FF1706333014B793AC646DA00A364EB3C317A0A396332006350C2BCA1F7BF67BAB73A7E4D702A1A685A4A1499B558A609FEDB159606394E492A283D43AF45765AC08B010502829B342612A91D46773F3DE2E25C615A7F2E3B2DD25721AA1CBE573AD4771403DF1097137356895C91FE0043EF7C8A86D95F0F3200 -ct = F692C2E446B8DE4E601A7F9C508FFEB376A2605C1060FEACD26CC1DA8ACA539C05ADF973E7596E9F58BEBA1BC93994E8D2C2FD50381D01F66897236675240FD1B781E95EE0AC81191725EEF73AB54C15056204D87069A90F179150B70D8C0AF9AAC73B1CED9A328F48C608FE7000D6D5499A365DC84727F87677AF22DA40E0A14E0BE0DD5DEBD081B26E8E0C3521D0124C9A12AF241F623C73B83422EDAA4A2C372FFC730146D211CF1FADCE9C56040D8003D887605EC7E8AD29BC01925951CA00D217F0719AF0D4912E295942B6C12D5271902D901757011F5F3D0002D9D25583C492C5E5CAD1B56865B8927C4927953A492625EBEBB1E3784DF2B1EDA1601A3405E5CCAC9EBFCF66D7EA1205C5A77A9A350154BAAB41371C2FE157184BC9222443D65CC5B703A63422E26671D8731FA0420AFC29C1D2642219A0952D1DD338BEC7C532A0B9D7454901294972667D5E8BA1682979F9283D3CC9 -ss = DA75F7C38E010985947EF930BA6B83E7 - -count = 84 -seed = D0611F9AE5BE4DA5D7EADC9109944348E716CB3DAEE545721EEA8C892E7831CF2E54603146454CBFD92387739E9A78D8 -pk = 7D3FC0511382996C71EB3B77BFE0A16AB73DF026C180B5BA297F1722CFCAB93599F53EEE2E0E642DFDD88AF187AC70B4FFA0714363A20166B7D314A29F89AB12F8EAE2567D383B2F5C244110450D2714A01B6DD61878D153A22A52EC246DE9144B956AE2686F0058F18322B69D00356BAA882DBFA529CB39E45535241AE0EEC6F239F8F4DB2971B1E9B741D894107124D0745ACC064DC7ABB21B6E208F6DEC6BDB5603E90070DEF2D226326F8917EBB48119BF8D7DA4EACF2157002C8A84B8F8A9BDF53D3263E62F0749BAE32A9B89305BCAED3672B0F6BEBD2574015F8B1BCF14A692411EC23CF2A26A059610E10DCDFF9BAB924EE7A10858A69014A65B550CB8823930A38BA84F1BB252C6686B5B4E8C6B0100B81395E44AE10C1FBBF3975F949A7027CDA1076336273A121C537747428BE68F229CB6A7396AB149F5EB21E9C1EFBFBBB2190E9C9900 -sk = 9A86490F0615F3EDF789CB0654066E9E11A2F62A82C999B0ACC95D1C3BA10B734827586C051001754C8C4B017D3FC0511382996C71EB3B77BFE0A16AB73DF026C180B5BA297F1722CFCAB93599F53EEE2E0E642DFDD88AF187AC70B4FFA0714363A20166B7D314A29F89AB12F8EAE2567D383B2F5C244110450D2714A01B6DD61878D153A22A52EC246DE9144B956AE2686F0058F18322B69D00356BAA882DBFA529CB39E45535241AE0EEC6F239F8F4DB2971B1E9B741D894107124D0745ACC064DC7ABB21B6E208F6DEC6BDB5603E90070DEF2D226326F8917EBB48119BF8D7DA4EACF2157002C8A84B8F8A9BDF53D3263E62F0749BAE32A9B89305BCAED3672B0F6BEBD2574015F8B1BCF14A692411EC23CF2A26A059610E10DCDFF9BAB924EE7A10858A69014A65B550CB8823930A38BA84F1BB252C6686B5B4E8C6B0100B81395E44AE10C1FBBF3975F949A7027CDA1076336273A121C537747428BE68F229CB6A7396AB149F5EB21E9C1EFBFBBB2190E9C9900 -ct = FE0559C7DAEC3451BDCEE23E2D82A70CE36625DC8BECC7F58FAF6E38154DAEC257407A75BC6B249CE93EF1211E10E5C2D883ADE723050101E0AF2702B6212A500B40DB8D2166ACE5F35E17509BCE9F93FBD8C0899F7FB2DB97C790E036BB79AB83FA2E33FF2520E75F5B5D109001CC524C58AC794307A1556879CDA453D0D51E39050C86D37962D9BFAF9A8AC7174AA3ECFA0CA0E4CAAC0C0BA6F208800118EAD944546001583B37F18C4C71F54D8E3031AD66688CC4E3BB6115A6DE364AFD2F0204FC77EA8336F55CA22F12A46C198D01C79134029A31047D4B5501B7DA0ACC711530CBB5261221904A6C34F9AAC3926A854609510D4B23A3725A9E45CD444D02B4E0CE3F392EBD7C9DE13774DC349F28AA00BB59233AE46D845F9239D64003E85678FF270EBDEF2834A39CF64166825B803E53C86E5D275999E4E232673D97E3CE93770C60AA5F920105CC6F1C852EAE8223523C1E18E5B6E0 -ss = 389E75A62D289C99CD55DEE471EFD8FE - -count = 85 -seed = FBC38D7614D7718E931EDB850D2C6F0C5EEA9EE889B3E25BD69AC255D5B91E885D93E808E66BF9C88C655DC594DA5792 -pk = 2201048D6ED00F2CF905E3DEC468164C3D86578E06BAB3ED59FC8D3620876CC876677B73B97F2FBB887D9BDA577AE06597876C1431C0002C2EF1A6497C437417F2908BE9F147DE8DE09993F5C024472A4D7593612471F12A248F47A862568DA438EE76D1ADC9E259477CA25397014B9937B9B704E3DA976578E0DB447D280195B307833603681232CDE558466CBD3BF02E2747FD4139CADE697F256A67B1522CCC299A02018A58A2C462A9829745DB219B94FF2C4BF972C523CDCEB2AE7B893A226F248951A369D1E3F4CE68E3AC8E4FD9924AF689A4B83BD6056700339CA542C3B735666ADF91CC52B87816E88F9385CA566220EF24A97695D28DC474DD64ACD3413D085CE9E135B2C51F158B115DD6D0CF0175A4204359581F98FD18C39126B61177BE71F16CB0F37E95403BC2E98B718C9449025B51E4A637B936F5A0D915F6BEDB8AC856185C1E00 -sk = 6DFD9B575872560C7BDC2732C4A28DACC1F19CD6E52710F40C63065365C210DF5DC00930FD2FE896B183D7002201048D6ED00F2CF905E3DEC468164C3D86578E06BAB3ED59FC8D3620876CC876677B73B97F2FBB887D9BDA577AE06597876C1431C0002C2EF1A6497C437417F2908BE9F147DE8DE09993F5C024472A4D7593612471F12A248F47A862568DA438EE76D1ADC9E259477CA25397014B9937B9B704E3DA976578E0DB447D280195B307833603681232CDE558466CBD3BF02E2747FD4139CADE697F256A67B1522CCC299A02018A58A2C462A9829745DB219B94FF2C4BF972C523CDCEB2AE7B893A226F248951A369D1E3F4CE68E3AC8E4FD9924AF689A4B83BD6056700339CA542C3B735666ADF91CC52B87816E88F9385CA566220EF24A97695D28DC474DD64ACD3413D085CE9E135B2C51F158B115DD6D0CF0175A4204359581F98FD18C39126B61177BE71F16CB0F37E95403BC2E98B718C9449025B51E4A637B936F5A0D915F6BEDB8AC856185C1E00 -ct = E304BD1D8E23512AE8C2DE64DDF9BE3D8340FC28C8814F78BE3D0F5CEE0C0E9D901B0536793EFEA9A4DBE099C9F0DC62C5C350FBC410011F59035D58134E1E9BA87EB44326DBA6CF34086932B119865CD3969960D64D99FA630D9CF9B84DD26D2F5A611E9878A4694755E4BE740174F824E123B9C8805A7D9ED689495E4E0D5E10797AC2BA4A52C7AB807A4E7505990F2ED051DD883D5B5A80DD2E985B02F2DEF687EA3B0168EE44D02635B949DDA2747B4F62CC172D98B0B11E90BAD710A80990AC4797D9631178F2268B888E64EB0D2B89ED62BC1C4E0DD0F7E900E742852CCBE351314EB3F7CA2ED494B52F342CDC4BDC4980A90A9E18993523C5CD5108D1E8B7610002BD9D075BB368F6697DE3100D90016FE43A4C6F6C096F0639F7564BDD58E9ECC53620A52AE1BCA052617DEFB518C08C45CC2B29B5E77A3D2D7613DE0476DB5A56480B4EC50066836841752DDA471E6A05BE340ED113 -ss = 57651B54AEAEEEA98B87A7D60BE38C90 - -count = 86 -seed = 1722219CB5DB47374EB0AF0232C856A57F026F1CB09E5A5799F4C333DD422FF6A0A67C4DA502FAAE727FB2D45DAFCF35 -pk = 9900D987D9DE09CDF27B12E7743BFDC905E61AFF645EAF02C67D3778935C42F5EF223B6057EF4224158BCB1C989105D70145D594425600C996218C12C222ABDA46A3F9BB51D172A3558F6EBFB4B92E5F63BFA44D12B1FC6B065850EDFA5997E43F7B7B4A92333D704B19A48527029369A58624E88CD0C12BF76ADC19324696FD8C6E632A37A8F0ECDAACB7DE805C80C5FB7368A3CD40F2F86D42BE61CD660609DF5BFB37017E47F082C907E4CF21650D351711B5D3C8156D077D1CADE204D0118377BF582E3116295482744C3D325AA48356DAB735AB91E98D2569015BB69791A80437956724D843E39F5C4ACB573581941CBE2D1F813D181A75DD33949189F2EE1BDE52BD9013D135DC6965D211924E1AB601979A4B1E9BB82D52F0E3EB6EE349F5088E6D797D7F53211C6531FAF94E68CE1CC8FCA2ED9D2F3C3AF387FCE8A7D4EE6CB2424568E1AD01 -sk = 6FCA9F4E384D8418075CC064C70730801B9B38C17733BA74730C46BF39C6D2440E49B70531A315A6B80133009900D987D9DE09CDF27B12E7743BFDC905E61AFF645EAF02C67D3778935C42F5EF223B6057EF4224158BCB1C989105D70145D594425600C996218C12C222ABDA46A3F9BB51D172A3558F6EBFB4B92E5F63BFA44D12B1FC6B065850EDFA5997E43F7B7B4A92333D704B19A48527029369A58624E88CD0C12BF76ADC19324696FD8C6E632A37A8F0ECDAACB7DE805C80C5FB7368A3CD40F2F86D42BE61CD660609DF5BFB37017E47F082C907E4CF21650D351711B5D3C8156D077D1CADE204D0118377BF582E3116295482744C3D325AA48356DAB735AB91E98D2569015BB69791A80437956724D843E39F5C4ACB573581941CBE2D1F813D181A75DD33949189F2EE1BDE52BD9013D135DC6965D211924E1AB601979A4B1E9BB82D52F0E3EB6EE349F5088E6D797D7F53211C6531FAF94E68CE1CC8FCA2ED9D2F3C3AF387FCE8A7D4EE6CB2424568E1AD01 -ct = 8E4C55A45318D42EC17906C0AB3BBAD6A610931BD794D60414C93B7DE740D08D92B279F30B599CBB72AD29FEF2972B041E4C26505C7A00A44A0C74823588A80E7027BA0474EE3DE013D532B893BA4503C1F9A4B67D8113613741D4302C9F43462C19DCED342A998F8340C91A0F0270BA4D21A17314AA398C863382FDBAC1543A088B81FF17074729C26AC9E325FBBDEE8FD3C0E07D6FA64F321CD32575B0AB9A701005890181600CB562982E4F86D7443DC56B2B965B17C526859066210893C4D7AA20699AB47E6F07C287E3082CD843B6C5F1313E1BF310B1385F019A8936D54EF89E8D11A93C9968B14A0CADDDC54AA8690EBC3CE58B58B900F527AF3DC14412FB391AC5758434967DD39836ADFD6E439800D88A8566B1A765E9378CA02CF1CBA8E44F2751B511957A439C3377227C1577ED73B32E826A0EE6731977E14312A29669B7E057F909F600C7C4C8AC3395B0EBFD758BFAACCB1920 -ss = F6082FA9C2DF2BBAB518B4DE9F489231 - -count = 87 -seed = AC139B78FD16CA0F26D6D7F9E15345C888D857B1910CF38D883339B37EAD2DCAC30F7CF10176F23FF34B4488EB79437C -pk = BDD34E9B75E382D60D8EE5F67B58BC98D201BF3CFA54BA20095E7E16EB3C3D3F80E4D17FAB494E8D2F3B2CC6D6887FFFF567E948ED2602941ED7584BB18FD1E5D370A14ED6C612D689C8516FE5527B06DDF4D44A7BAB2852D41F19BA296FE18F6743DCD3035C2FFB12360015040049194B9C6607B6CF00C71EBD57A6E04B41FFBF7F731CA7E8721BB2A439E9F24BCCE2E70845636EE7B50E2EBE82B17A3B670AC45ED378001F222EC68B015FB84848C139BB2313A97717F1F456E7C0A1A65F2CBDAD1CABD7510700D75BEF0E53B0044F349FBACC3B021E60FA2E3200311ED3CB16DBF2AE3CF60F22BE5411E3C2FBA508B2D6EFC6755D74F1C2AB193D468BB10949C0EE65D3C78BF8B6D62353043B7D3CC20602704365AAA7C56DF5B93EF267484077F1FA63FCA68A61637A23B915A8A11530366A9BA7938D88FE158238DBB5DF43878A96D54F6040B000 -sk = E58F71BF175C0550A67E00E0F7B3B7FC8D3FB72B55010DDAC525AF967662C8CDC6BD65F230E21FEBA3FB3F01BDD34E9B75E382D60D8EE5F67B58BC98D201BF3CFA54BA20095E7E16EB3C3D3F80E4D17FAB494E8D2F3B2CC6D6887FFFF567E948ED2602941ED7584BB18FD1E5D370A14ED6C612D689C8516FE5527B06DDF4D44A7BAB2852D41F19BA296FE18F6743DCD3035C2FFB12360015040049194B9C6607B6CF00C71EBD57A6E04B41FFBF7F731CA7E8721BB2A439E9F24BCCE2E70845636EE7B50E2EBE82B17A3B670AC45ED378001F222EC68B015FB84848C139BB2313A97717F1F456E7C0A1A65F2CBDAD1CABD7510700D75BEF0E53B0044F349FBACC3B021E60FA2E3200311ED3CB16DBF2AE3CF60F22BE5411E3C2FBA508B2D6EFC6755D74F1C2AB193D468BB10949C0EE65D3C78BF8B6D62353043B7D3CC20602704365AAA7C56DF5B93EF267484077F1FA63FCA68A61637A23B915A8A11530366A9BA7938D88FE158238DBB5DF43878A96D54F6040B000 -ct = 5BE2B297C41D5E3DE52E1F48667EC76AD3BBBE167B79252DE2DC3D06CE6D76F0382F4400EE57EA20DFFEC4DE019AC28A34BD8CC68B7E01276E20DAC70D5060660192DFC3B9AFA1C50730D5D865BC7F0D9D6CAFD5817853BC9F76E083A6FAC476F90EE7506F5B68059C263E0DCC01CEA739DF7D52D8032E2CD934F5119B03E70F7ED3CF4ACAA84A6524254934D4CB2C875F1FD7945474282388903FC3C7D0A7EE4CD2AD3E00138B27ED81369AF50C8B1FA5BA7C693CA98400ECFEA59F1D541A92DBB6B92752FB164C775AB472F08B949E73C136427D4594C14FF1FC00406ACA2F65F37872D498D7E58C73EEE80C96CBDD21FCF1C3EB172862A54773EF59542BDF8DAFCFA1241EC187B7A9AC57E35A5911123D00CD387140A2EF8ED2AC15D2FA06EBACF4E279E617947A6822B62A72C35ECC938A3A9FC3FADD637ACB556D758019B08D82A1469106DB1C029A809215BCCE9EF8557E7593EC2DE97A -ss = 35C62EBA540CB14180433A41CADE8988 - -count = 88 -seed = CC7152849C98D5FED2813275D32069E44824ECB14EAEF425CE017448CD9A401C91C06D0F7EED6D22B7BBE8BA6C429EC3 -pk = AF9DF3DB2FC633DCD52B4448291577FC5DEF87F572DAB9200658EA0071EEAC78B3F8B2106F5BCBA7DA7683E6CBEE6ADC236361623AE40116C77436B7EE5BE3077E09CE4CF9219C6794B1C781B225EBB16FAA9146D94ACDF01BDFF1209D8A31F15C63300D057321D995ACD71F380067197909D44A9F0B58D7C59045465AAC0C2171C798A0E8587E70F5C33E6F694528199D46EB633FF3C8BC5196C6E8CA6271077E4C26C900601E49AE716EF3CEC7858BA6227EA9B576A5201CF1712FE8578BF2676DFC2C1013986E48DBECA4444EE24F5CC9442931C7707610DA6D0081A2BA37384162E842A09095AF7E3228E2123C4F9FB2AAFB5BFE5F849C8BF20D46F977EB18143A09B697969A6D11CFD6D21F0EAE4663011320CB23679907015C27757D451AB2B775EA17AF603D04E4A2EE3C237A94DE32569225C4E00331C6B98F9D4BD0C0FC916E935655A9D800 -sk = E3FC575ED51513E62ABA655D24CD9C8FEC49560745A08FE9D8341C3F25F459B64EA92BD0C6C7FA16A35B3D01AF9DF3DB2FC633DCD52B4448291577FC5DEF87F572DAB9200658EA0071EEAC78B3F8B2106F5BCBA7DA7683E6CBEE6ADC236361623AE40116C77436B7EE5BE3077E09CE4CF9219C6794B1C781B225EBB16FAA9146D94ACDF01BDFF1209D8A31F15C63300D057321D995ACD71F380067197909D44A9F0B58D7C59045465AAC0C2171C798A0E8587E70F5C33E6F694528199D46EB633FF3C8BC5196C6E8CA6271077E4C26C900601E49AE716EF3CEC7858BA6227EA9B576A5201CF1712FE8578BF2676DFC2C1013986E48DBECA4444EE24F5CC9442931C7707610DA6D0081A2BA37384162E842A09095AF7E3228E2123C4F9FB2AAFB5BFE5F849C8BF20D46F977EB18143A09B697969A6D11CFD6D21F0EAE4663011320CB23679907015C27757D451AB2B775EA17AF603D04E4A2EE3C237A94DE32569225C4E00331C6B98F9D4BD0C0FC916E935655A9D800 -ct = AA8140EA0B7FBFC506126531274EC76B02E73F1F46E2EB3BEC4C98CEF595F901380ED823D3F474242D5FA6DAB20227940F05CF254303012C19D48EA45EF6DD4E4E60B9B618446342FAA480519C5978B31A4AB51FD833BDDFAB1EDC809C9BBE47E730577A71E5B8F66FBC8CD4D4015DA8AC2A2EFE963D2C94BAEB38F7C0ADC2D31EC9A9C5337A02E1B9FA4145F55A2A8E6874584006C79DC3752B4DF8782FF0A4377BF24800FAF73684FECB522B1EFFDBF6C8A7205076C3E290692D3C1277137A0F83869AB3ABA3D1F99B94F7CB5F30FB049A27BA03C570755F1CF100A516C84A748AE234A6892CEDF0997B859D5A87E14F1D2C6B9B5A91E8B80882187B97407E498A6142E12F49E200C84FE4FD8383DA05E401C8B542EBC56A9BFF71494C9643E321851A9EB15535ABCC3974D8FF46410490B0B5AD9CE77623F945A2EE95BF3E7EA63B9167480FE49E007BA7776F5878BB63181A7DB3F79F4331 -ss = 8FBB1675631012AA69F22561CCAFE1FB - -count = 89 -seed = 96D9A06F88FF2C2036FA8E914B89C765E4A510B468DEE40F914F78858C811857EFE9FD0E17C0048E7389E8D996B7E2B0 -pk = 25866D1F4A0D7F7252C128D035CA93460542C32E545077D57BEA62FFE92C37B83C040ED2D7E2341ED7B406D1D9A0BCD82BCE3C9BCE1200E625EEAB1A74EC3AF9E0B18949627E0890A949DFC367DB9C0915A3541422B9E0CC632B45ADBC0F18E749B0875869116CD6145DE3BC540067F8E8BAB51AF4005306FEFF6478F567CE0B0476836606E7B7FDBCD888A5C863ED338C0B2DB7FD99220D84EFEF722D78A262081404DF01EF4AD81A528EF02650A4B8F1F4EAAB96B467289DF861781F4EF505A09EB95FD54023597C23E0DE8AE2942778F967C1CDC688E4E1161001EDBBF26CA03005DAECBE4C672662778D42464190C6AA95B0906B3995CB99F02D16413F056635BADEC34DF3B43EBE29866FF6FBB64F2F01E87CE3EB63B52765172361823F6981E02CA2BF33AD5FFB2B062F58B44FCB8F40B309E80278A804D9F6A572B5FA936BC391FA95686DF501 -sk = 470B4943F0FE7FD0D8EC5185ABA0D1DB7CC710FAF7C1C1F4A4A8419DEB87C915EF692895903BAE280771460125866D1F4A0D7F7252C128D035CA93460542C32E545077D57BEA62FFE92C37B83C040ED2D7E2341ED7B406D1D9A0BCD82BCE3C9BCE1200E625EEAB1A74EC3AF9E0B18949627E0890A949DFC367DB9C0915A3541422B9E0CC632B45ADBC0F18E749B0875869116CD6145DE3BC540067F8E8BAB51AF4005306FEFF6478F567CE0B0476836606E7B7FDBCD888A5C863ED338C0B2DB7FD99220D84EFEF722D78A262081404DF01EF4AD81A528EF02650A4B8F1F4EAAB96B467289DF861781F4EF505A09EB95FD54023597C23E0DE8AE2942778F967C1CDC688E4E1161001EDBBF26CA03005DAECBE4C672662778D42464190C6AA95B0906B3995CB99F02D16413F056635BADEC34DF3B43EBE29866FF6FBB64F2F01E87CE3EB63B52765172361823F6981E02CA2BF33AD5FFB2B062F58B44FCB8F40B309E80278A804D9F6A572B5FA936BC391FA95686DF501 -ct = CCF491F399710CD48DB7AD77A77369B6304B73FA1CD567010FE8B47E58CD801B4F40B9857590DDD69BAB17F316FBD8A05392681089BF01EFA3FB36E9532A0FD0B05DDA37544AF71DA6677DCECF1BF62D611F39CD7E842BAF9078D706F85BCAA06F2885F6652E0F907E60D1C68D0017570AF6730C69D84A9BE48EE1559E0C5ABF4143CE492C14D2573006C73AB0C9BC7A5699D306E40929811FF695302B090EF0CC6152E0019317FBECC106907E3D4CB85E0A93D07DCCCBE7AC61B365652EA3D955E81A4A986B46BA85CED2F8E2509EE1D9F4A51CBEABC1A0F76B080148BC0DD9800C403A618F53CFB485C946D1C8D2B6E6E9B6D6D6076F1A2F22F5C574DDE4A9C764282C47FC5DC1CC5D3799AE906A2132420108B82ED09D9915A1121EA97FBED7DEAE58A6658BEF2098A0A0FD588EF8D34250198052693CB95270160743791370BFECA4B54A55840500B4FD3BE468B107651404EBEC9F0E620B -ss = B3076F1E54E9218D8A56359AD11267AA - -count = 90 -seed = D26CE360D399BF7B89DC364AA7AC06BB513EAB8F527383E93E30727EDC3F22C262AA0EC70257B39EDFF0630DCDC1B79A -pk = 7DCBA0D39939F14443FBFF5A5A7655117CF4ABDDDAA931E1F9F5F2F4DDD9F23D9BD14405C885A5FF48C19BCA55E85CB6C994329FDF410142E78EF67F6502759B0BC2ED49EA8E69B0F0662080803F6D3A08AC2FADE6515F238482328C0E97C96CBC6134BA569870A27754F32D970186491403DA9C984DA754BB8CD3F2A2C117EF7BA1FB1F9D24AC04F989E6DD1EE421EEA63BA820E435D0EAFBB535C2AEDE244CF1EB43C9016BE24B68B1393512CC8E6DC4A0B9B2C8B8D9BBC0354D592101CA78F7058B32DDBE732C7752D489D4774049A25FD8F58FAC2A95B7BDB60131B6C1C121EB81C4C86A79813538F7B4E4FA3FB72A82A33C8DFC5073AA7B9D5BC01E10AC03FBF84045C718CF108CC4A5584E205E2DB1014F901110951736A4CC27F72E0CE59D4BB32A8DDD9E1699D59ED3982689C0576E009784E07526F45EC75F6F0C3C6E5D358F0A848485E500 -sk = 6DF4385DB978D27B27D2AA5E452E41529B8E8792F075F00ABD73FC790D3297EF894C5475CA4323B06E63EE017DCBA0D39939F14443FBFF5A5A7655117CF4ABDDDAA931E1F9F5F2F4DDD9F23D9BD14405C885A5FF48C19BCA55E85CB6C994329FDF410142E78EF67F6502759B0BC2ED49EA8E69B0F0662080803F6D3A08AC2FADE6515F238482328C0E97C96CBC6134BA569870A27754F32D970186491403DA9C984DA754BB8CD3F2A2C117EF7BA1FB1F9D24AC04F989E6DD1EE421EEA63BA820E435D0EAFBB535C2AEDE244CF1EB43C9016BE24B68B1393512CC8E6DC4A0B9B2C8B8D9BBC0354D592101CA78F7058B32DDBE732C7752D489D4774049A25FD8F58FAC2A95B7BDB60131B6C1C121EB81C4C86A79813538F7B4E4FA3FB72A82A33C8DFC5073AA7B9D5BC01E10AC03FBF84045C718CF108CC4A5584E205E2DB1014F901110951736A4CC27F72E0CE59D4BB32A8DDD9E1699D59ED3982689C0576E009784E07526F45EC75F6F0C3C6E5D358F0A848485E500 -ct = 20759960EE23EC88F2C37E4DDEC502DD0CE3F3FFF4D7A71E4E61697CC78519D2600F0ADCFD6414BB080E0E6B4D95062D7F651A1716A8001A3C06D9BFE74DC8F8B3FF7CC22118A684135337CCD45DEB75A886F833862C41EE2DEEC0B7EA60FF56DD73123D8CBF4161AA4A9E68C001D3AA5C25064926AB4E68E646E3C58C02E28B2A6FB0F99129F804FE508231F03A4710080FEB33EA46AEEE07EF7D3681E053E8B5029DC201F49C93B0360C5AA64ABC98B72BBD7429106E80F14C7C47705BF68D7B5B77831A97BD467C22A54AEBDB1AF35EDF43095871D1B3E4D931016E5431D56BD566A4E180A20E4BCFBCB9F634179403916F2A83617CEEE981CA401CE6479B7B238A5175DD21D08BDC6914DDCEFFB08E07005E10E3FD52CEF9AF4E3A3D8E68938191D63EB207BA736D71369843D7BF7F5FD5A16053688C475939858B80DED3C01B049FB09DBDE5DD004668C5F892C9845B7034DE3DBFAFFC76 -ss = FA89E11860344D23EF3708B4E18E6228 - -count = 91 -seed = C5856298C3CB6AC9787A0F30938537AB2635B96F6D19CC9522063360E7A5C88E644929D2879180E3E5BCAD2422B7CFC3 -pk = D838126D3EA3E3B661E4533ED9718149448B1E506E14B8B04DA7F945DDCF4B5363733086D5FA5F4E250EE1E8447827103EDF71E80F2F009600AC670B23DF0C598BFC21C5F5D9A25A03053380D148DADE2CA60626E0339489A91CD6F81C38039BB09E93D94C79584C79AF201954011623DDDEB03231F99013AF1595CAE2438F4013273673527DB83F7F28D3A13887910891EF3AB644059E8DFEC05CB671683265BE53BD3901FBF356BD8794AD73F644F527D24497A25110C24808DF4F2B924E71D99A33440C33DC84B99071EF05317DFD2990B193A7C54143D59FF301EFFB7B94A46DA50C7915FBCFC823E36B39144CA8F21BCAD4070ECEB81F13F7588986C90555390F096EC1C3DC2BBE0F218BE4F3A06E0A00F65A67CD56D9A18CFC51867D0C38293FB226F8855FF20B95C5C9A9D23126CE42A08382F03BDB5E9CF5E01C164EAE3DBABB2690B54B6E01 -sk = DBACBA825728444921B227CDBA54446B57D37B8DBFF080C604AD1E083CB0F9E3A2D62131ACAE982E474B6201D838126D3EA3E3B661E4533ED9718149448B1E506E14B8B04DA7F945DDCF4B5363733086D5FA5F4E250EE1E8447827103EDF71E80F2F009600AC670B23DF0C598BFC21C5F5D9A25A03053380D148DADE2CA60626E0339489A91CD6F81C38039BB09E93D94C79584C79AF201954011623DDDEB03231F99013AF1595CAE2438F4013273673527DB83F7F28D3A13887910891EF3AB644059E8DFEC05CB671683265BE53BD3901FBF356BD8794AD73F644F527D24497A25110C24808DF4F2B924E71D99A33440C33DC84B99071EF05317DFD2990B193A7C54143D59FF301EFFB7B94A46DA50C7915FBCFC823E36B39144CA8F21BCAD4070ECEB81F13F7588986C90555390F096EC1C3DC2BBE0F218BE4F3A06E0A00F65A67CD56D9A18CFC51867D0C38293FB226F8855FF20B95C5C9A9D23126CE42A08382F03BDB5E9CF5E01C164EAE3DBABB2690B54B6E01 -ct = 437A2D3D5E514A9917FB25F0A243B9325BE06E753C9C8B878D2A33EC9F555FF8DF5287A8E5457AFAAAD7B8FE78F535434701D4BB6CCD01849FE169F0FDB7741FFE0C66C4DE656458CD99A78B2FDA1E36B06FE89C717EF5D1BCD3585FA8C36D2D23166E1C38CDA1A546C2EE9D25005A592C1CB0CCFBE6EC30509821AA07665E2879A069D709AA3BF53BB53651AB346DA3D582708E048A991D7F8461270931288DEDDEF742019D56A0CC3B090830DD14CCB776873EC6AB5D159E279A73CB169C9C134181204D76932EC93F9DC838E052511DF847AD00BF178E39F97F01249C1743D004376699737065358849455CACA0FE5F5B862DBD9CF4B706790332A102C15474E86E28EE18A285F6CB711B9B27FF985A36005478DC8587D9DDDC1466DD5BFF9E10A96FDADF4DFEADD82BD3F34EBA11CBD58380E230488BD2360FA09D53E8CC55BE96387A1A182B8101E7665FE175858B343D2FBA387E687587 -ss = F835B064E9CFE827C979E4DFF55328F6 - -count = 92 -seed = A28EAD0A08E7228AEFF602B16A1E752278B8ED1E91DAC67994F5ADC372E1D82F95CC390CD97AB9212275E0566C833FD8 -pk = 6DA0E28267DB90F6806DDCEA27C6ED27E705BD19D3B55D888CD80CF5FB6FD4CC9F23C153DEB2F60AAEDCE6A260C6F3F1149FFC18A11601987B08AB82E4C6491D4C5585D1CEF2ACA680BC9C6F5DD37FEFF246CBE0857C4CF908DA5652A758EE0EFEA2B5190D68CE636123CCA6A901013217821CE88544701BCC901D4989BD6F42301AFEBA63237A6428E6802664A19BB01EE6CD593184DDB95E93D31D4FCDD34993607FD101DBF5DCD2BF6BFACF5146F0B75914EFC75399508A812729AD193FE6CE75BEF0D94334B0C1E6F2A4FB259752DA8A01AD77789E725C4566018963093F70468600010278B726F20CC9B741CE0316BB3086CBF25D4696E2A06FD0DD2DDD6D13296505E57DE49CF68B0E56BC38B588CA004152D78E6DA99F9A123610D024B3FBFB9F64FB2800F20338BED72CE49AE5DCD1D53E3AEB5F53E94BB25A0C8FD5CF9F9F068A9DB3755B00 -sk = 690EB71FD7052B906EAEC09937A8ED37AE13ACA45F612D2872FE359C4A257A10CB6529A031BB0A93601B30016DA0E28267DB90F6806DDCEA27C6ED27E705BD19D3B55D888CD80CF5FB6FD4CC9F23C153DEB2F60AAEDCE6A260C6F3F1149FFC18A11601987B08AB82E4C6491D4C5585D1CEF2ACA680BC9C6F5DD37FEFF246CBE0857C4CF908DA5652A758EE0EFEA2B5190D68CE636123CCA6A901013217821CE88544701BCC901D4989BD6F42301AFEBA63237A6428E6802664A19BB01EE6CD593184DDB95E93D31D4FCDD34993607FD101DBF5DCD2BF6BFACF5146F0B75914EFC75399508A812729AD193FE6CE75BEF0D94334B0C1E6F2A4FB259752DA8A01AD77789E725C4566018963093F70468600010278B726F20CC9B741CE0316BB3086CBF25D4696E2A06FD0DD2DDD6D13296505E57DE49CF68B0E56BC38B588CA004152D78E6DA99F9A123610D024B3FBFB9F64FB2800F20338BED72CE49AE5DCD1D53E3AEB5F53E94BB25A0C8FD5CF9F9F068A9DB3755B00 -ct = 361D97A81A7DFB50942054F79A2BC7BBFE98E517AA5F1FD7213EA394D48EB268FCD28FA17FCB9F2059C51E7113B266738683FF5576540173540156357E38F991AB9D4055A98C0C013FE4963C8809E7DED72770245841EE207FDC3FF6E64A4CF5B336B1D1DCDBA8FE2EBAB91372003285A261984FA23DD2ECAC81873C1BF5691E2F7A4646993AD5C60EC38BE067F95810A41277DF9897C996C7B7F1CA568B2D5B7DC2CAE500173A413830D124BE7AF8E88189A03B52F9AD66BB87309EF8F4ECAFD9ABD3983C27379965E42D0DE825CB9C1FAC3E641B5AE33EEEDB0B00D14EE300BE12EB1D40DC102D09A4C3986D7F2F64E6E68C47ED5FE2679244440DB55B08C1F26B068A0B2C021114B369439B1113760B26029E70157169FA9A07FE02595B1EEA8C94C40CB696FF405034800DDA5BB0135179DE6EE04D37C563E46ED8AC6F84E1A40AA00D13D87E6F00FA81C28A68E85543A3A9D4194448B763 -ss = 2A25258531402CB564E80DFDEB153127 - -count = 93 -seed = 92877D706DAF88EF3412EB143DB8CD91BC047A9A43B7ACDAA42523560DEE4C172697BE4332042FCAB91135839BF74AB2 -pk = B0752FE50387034F5C50E82374D7A3BA05860AB4DAEBF4233AF0F89E5EA2A7CC95A5B3A3A530161039E2130D6C6F3DDFF81DA1F1BE050022A8B6607C2C02401D78BDB8850735E1DA52EBB06831DEE52E8B33DF0EB4E3991B69B65644ADCB2173EF9F2172A86DF492AF319E605A00BC6EF8E45B86A267E5B5AD490E07B3273163C59EC237FE5CEAEC739E6D1FAD00C8FE524D846B692CAEBD04D10EC58DBDDC57E092E98400C879555CFAF770888240BF5F55046815520BDF0C8CB196396794083A7EDE185B27EA64A6F3B4105885A00530B7A8B8F0FECFF86DFE4E00D363AE905EBB45F23795DD153C02948583C271F8B60FC5EB55BCA8FD561D4E45B9A42C39DD79568A950EB5DC1043BE519610E34458300207A2FD97AD5F8C0C2059D00462B0A9C26579380F39184031DC53E464CAD7ACD106938304AA82B0DDDC50C1AE065B2AD6E1A725B86EA900 -sk = 32E0EA9089FA928482C0770DA545AF1B723ACC261D1CB8D2A37A97233611FB50B68E83E8FF42DF78A4C18A01B0752FE50387034F5C50E82374D7A3BA05860AB4DAEBF4233AF0F89E5EA2A7CC95A5B3A3A530161039E2130D6C6F3DDFF81DA1F1BE050022A8B6607C2C02401D78BDB8850735E1DA52EBB06831DEE52E8B33DF0EB4E3991B69B65644ADCB2173EF9F2172A86DF492AF319E605A00BC6EF8E45B86A267E5B5AD490E07B3273163C59EC237FE5CEAEC739E6D1FAD00C8FE524D846B692CAEBD04D10EC58DBDDC57E092E98400C879555CFAF770888240BF5F55046815520BDF0C8CB196396794083A7EDE185B27EA64A6F3B4105885A00530B7A8B8F0FECFF86DFE4E00D363AE905EBB45F23795DD153C02948583C271F8B60FC5EB55BCA8FD561D4E45B9A42C39DD79568A950EB5DC1043BE519610E34458300207A2FD97AD5F8C0C2059D00462B0A9C26579380F39184031DC53E464CAD7ACD106938304AA82B0DDDC50C1AE065B2AD6E1A725B86EA900 -ct = 8856885697463E14E39727634BB9AEA15D10267A483757040932975984705C4B9CFC0D456996F75490AEFCB3A6B7F0C0E748DF38E3D100FB00397DA23E2AE89F6D06D3C1314866DDE41B4FB5190D7EF593359DB218596B65FCC87644DB4883FC0137ECFA2563B14D8F959C9E15000769465C716FBF997E202FCA0E619BBA0AAA5C814D48238D29CD6A881C27FAD848CE1CEACE6EBB82E7E4F344D89EC239156F3971DF520092E67223709D6B30482C1BE6E421363B3E2E5E8D92C1C187D98574E602FE43E81AA46C993BE2F1270783B15C7CCD5078A398030AE10002A565AA26FA49AF27DB486D91E1B37C8734D0E14C3F1D00A75B46EA5029BAAB713B34A50722734B9790D6586F2CFF9135BEF934C032890147CCDB71AE0E27F5067620B76B1AAD188909DBEA73BDE5FEAAF2777C6735B4F1303584269720A61FE6A75E492392C2976A57E3D5F1BD01175B6C09AC1F9A6A856C78ED17974CFD -ss = 878871AEECAEAE84525E0D7E98CF15DD - -count = 94 -seed = BB4C0082CA4044B1FF60B036C9B0E0495D58667156786C530BC69D949A13BFAFF53798E456423D7A0E162A60039367D7 -pk = EEF752F86CCEA1E6C9C0848E1369C7FA877089AC893E5813A3CEE8CBD0DC0DA37A7C83E7C4A820E5FE846B3B8FC0AA2E1C8FC43BEF8801EC824239706167BC4637378F44721D54FDE0587BE315952982BF9F531C32530A79C8B5CDFD9238AE0B3C84191312C4A0FE21229752AE006CE35A4D62082A86C1765B95D55EF628E755DEBD1FF5A81D5F5353F2ECBCE86969E75540BF372557D4BC90230FC8396A5F4B22E512AC01C6B1A4CC4BDD339903921B1BE7895979C934697375339E04F1CB75A6561FB60601B5690701FD34752A46A947D242462A9C0F3AB9866101CD9520A373D912E32E4C8B96792D8D153221316BD1150ADFE8293B0CAEB06BA4CA65BCF3AD1AE253984DAC8382BDCD080C4E67264F0F02F80BC0F35B56632792A04C0E06C8C61A63C1E494A45EE62C46A8515DBC724887CA35E5B90D7F5BCBC5E708D72C5A0E58FFE0ECE7F31900 -sk = 6FB2EC719F2A0DEA152BF3F64B9D148F4F78ACBC55E7D2DE144993127EBF1F1772776A06EF9492DC17EF3A00EEF752F86CCEA1E6C9C0848E1369C7FA877089AC893E5813A3CEE8CBD0DC0DA37A7C83E7C4A820E5FE846B3B8FC0AA2E1C8FC43BEF8801EC824239706167BC4637378F44721D54FDE0587BE315952982BF9F531C32530A79C8B5CDFD9238AE0B3C84191312C4A0FE21229752AE006CE35A4D62082A86C1765B95D55EF628E755DEBD1FF5A81D5F5353F2ECBCE86969E75540BF372557D4BC90230FC8396A5F4B22E512AC01C6B1A4CC4BDD339903921B1BE7895979C934697375339E04F1CB75A6561FB60601B5690701FD34752A46A947D242462A9C0F3AB9866101CD9520A373D912E32E4C8B96792D8D153221316BD1150ADFE8293B0CAEB06BA4CA65BCF3AD1AE253984DAC8382BDCD080C4E67264F0F02F80BC0F35B56632792A04C0E06C8C61A63C1E494A45EE62C46A8515DBC724887CA35E5B90D7F5BCBC5E708D72C5A0E58FFE0ECE7F31900 -ct = 6DB5EBD78172494CE2632DC81F94CF776DDD3474FF190EC6AA62D0545795FAA588446F814322DCB94D6F67985D003F33C32188E55876015C851687E3B39465BE6E02509626AB4F5E87EE6A6E0BC3EBB20A98FD1C467A7BFFD343650EE27DF889B541E3A324431017A0E27D74A001FF79284A3A8760768AB96ED6F5725EE6D9B05C34C5D85BF8071E78A9B5BBFCEC1425560F9220A4C5D9221D63B6BE969B2310F2AB023500D969B696ED1BAB48782E3F2FA1746AE18D5F5DB3FD64FC551203900246A1E9F513F49C15DFFCFD41C1363085090AA9403A7EF820F1F401BD745E61C07829BEE835592CE1FE04C53FEF4206F8CB176D0D268F47E7B73F9798438F943DD7ECA2BF69FFC88AD764E77AA3EF29C32B00153A06AB5113183985585C9F8354D6E46A2874C50266202EDE0D13BD2A730E37D6814C5BBEA973A530083AAE5B0E4184DA86E7984396016A8FA6DFB656BAFC94D71078977EF9A0 -ss = 6D17E0011D13654679310C7137BEFF80 - -count = 95 -seed = 121D90E70AF6204445D0DEB28AC0C108262719E9FD3476ACA74BBFDE89FAF04D8D5F89A624E8A75DB80431F0D10AD28F -pk = DEA4B4F99F6DA453BEB0685510197F37003DF8F54BD47D94BC6171CA1C14C7BB4E0138FE8FEBBD6C404B7C8B7BA44E66C7719F1FD99301B6EEC117E382EEBE62BC4E54DBB9EFC66FD08F0A7F3AF75E36D8510E718CFE913694946508245D73B1728444980219ED694782E4561302D21D0C5A6E2A3B19D5E2E1327283F7D6910C105D0537E86006B2934D9BB4B61EE6EA2673F213748BB59DC918DAFF9A44B13D4B16C08800B90B6FC87CE105DFCDF415BA6728D86E08417AE3FE1C2F23075F5261EFE0A81CA5CE295EF0A85E46E42E65FD0F7E48A90208E866911702B0B26A1390B562CEB48AA4CC72A34A6BE2B5A852A8502D0304D16A7EC496F572587BC2CBE9FD62EBB9DFD8D6B882D6B8B85EB9FA215E01AE1C5D34847DE14050F4BA90FC7E7F5539076C8B264F98EC31CB3C248DF74F39CDAE95B3F6E208D57BE9D193CD26D7D5D6DC283C5D6501 -sk = 527FB88C8BD9A4D6031DAD15E63878AB3CFC649838B9AD33888C4E00E4172248814F91B15CC2CC8E0BE30B00DEA4B4F99F6DA453BEB0685510197F37003DF8F54BD47D94BC6171CA1C14C7BB4E0138FE8FEBBD6C404B7C8B7BA44E66C7719F1FD99301B6EEC117E382EEBE62BC4E54DBB9EFC66FD08F0A7F3AF75E36D8510E718CFE913694946508245D73B1728444980219ED694782E4561302D21D0C5A6E2A3B19D5E2E1327283F7D6910C105D0537E86006B2934D9BB4B61EE6EA2673F213748BB59DC918DAFF9A44B13D4B16C08800B90B6FC87CE105DFCDF415BA6728D86E08417AE3FE1C2F23075F5261EFE0A81CA5CE295EF0A85E46E42E65FD0F7E48A90208E866911702B0B26A1390B562CEB48AA4CC72A34A6BE2B5A852A8502D0304D16A7EC496F572587BC2CBE9FD62EBB9DFD8D6B882D6B8B85EB9FA215E01AE1C5D34847DE14050F4BA90FC7E7F5539076C8B264F98EC31CB3C248DF74F39CDAE95B3F6E208D57BE9D193CD26D7D5D6DC283C5D6501 -ct = CF2BC01EDBCEDFE897C3434A5D7F84BD2B7CB59B6769CBB339C92B30948ACF86D369FD657EBB63FD88B2F7593F119AD3A443A1E7632800316571ED3571D3E41D15F370EF945ECC7D8536091A5A8A97E2CB40ACE7D42E6F6BEA3E783F7285879D9AC1AB9100169C4C3A319297230066CD25B855743E14A055B396B07442EDC6A0A1B82A454081D2454AE2D962F8DEFFB45DA51F60A1DB5DC56F0DAE294A4278E476A8D2F200CEDA74A7816855B243B02D1E7946E5B79B132C6CA01430B9BCC67935640A3A0042249CF5ADCA0E1847AA77C0CAEB650FD9FAC193C14F004FC05C5178DAFD2E7BFA3895690A9F369B013CB23DDB483C4F1C482334CFF05A85EA7EA4A1A9186AE4DCE68E5A6CE63D859629F77E37019A7C8FCA32FD69AD4697F19C5165B0458E2F60839D59CD83A080EF87C7AE8D62744C134DC87D35D7253997FEA62FD566CFB733DD532501AD45356C7F9E726E941432CC0D28EAFB -ss = 8C41BCA14516014306BE132DC6EFDDDA - -count = 96 -seed = B3AC6503206ACCC2A92CBC210D020A2654726911D11CE676AA04FEAA08AF1D20C654E4105883AE470EC3AB299075D420 -pk = FCA24F4391DD603BC837E1943024C8AC4694356C42C324BAABC61EC0A32ABA45130FAC2CC13991F65F0D78B3106F42007799D14618DF015886196C948804F388A365A5E0240489AD6D93778C9868C3CA68125459C1FB8D170D679722340BE2906D8BA011AD7DC8E452A00CA2F800FBC219F2FFE71A45B05D30291C8608411D0AF98FBA4F441D5A319E9A8208EA689671D962FA0DAFC03F889D807346E393D14ED787ED5C0034FBB2D1F7BC30B5D108D87AC2B3132693EDB656894CD08B51252EAD45F07ADCD4E0365B5AA9600D2DB0C77C1715E375839EE1DCF9BA0052A0166229B30C97661250A4D65117E047A0E6A3626BDECD94ED27FBC3FE661ED669EC5B980FD42A9CD23A95912E2D7AE8C5B60B563101B0B66CCE2AC11575C0F8A20612D106B01A582200EB9FBA2D4C8B6929A519477ED91DB66279BEA619B34F9018B01093CCD7CD48A5261700 -sk = AC6FCFAEEEF795B6EF9E062F02BF4297A326609323DD9C830DC4537008A8393CE51A77519268602BEBC88100FCA24F4391DD603BC837E1943024C8AC4694356C42C324BAABC61EC0A32ABA45130FAC2CC13991F65F0D78B3106F42007799D14618DF015886196C948804F388A365A5E0240489AD6D93778C9868C3CA68125459C1FB8D170D679722340BE2906D8BA011AD7DC8E452A00CA2F800FBC219F2FFE71A45B05D30291C8608411D0AF98FBA4F441D5A319E9A8208EA689671D962FA0DAFC03F889D807346E393D14ED787ED5C0034FBB2D1F7BC30B5D108D87AC2B3132693EDB656894CD08B51252EAD45F07ADCD4E0365B5AA9600D2DB0C77C1715E375839EE1DCF9BA0052A0166229B30C97661250A4D65117E047A0E6A3626BDECD94ED27FBC3FE661ED669EC5B980FD42A9CD23A95912E2D7AE8C5B60B563101B0B66CCE2AC11575C0F8A20612D106B01A582200EB9FBA2D4C8B6929A519477ED91DB66279BEA619B34F9018B01093CCD7CD48A5261700 -ct = 37C15E41D44325B5DD3B601386B51EA5FDDFBF664959D3F64C91DF9575BD6FF00F578C1476970EDAA6DDD03C60E41E2F93D99E61FF2900FD7DE5371D19444973F4A41700B83B117664F0F3D6574EE5C3D99FB51102186AA0C77905EC6B8A8A9D82874BDF1CD209E0ED65170A6F01CEF4D39772FBA2303A8782412615565C1F5EAB75B651F79680BAD0BC91FCF3739F78567718ADD27CA077F21306F3B1BA95F223D1C44C000BC4A61EDBD2E1957F988FEBB118546D65A141B584ECAC9440D87B176EDA65011ACDC5D88B92D26488C1E0029AE84051ABE12590DE25016A0F4ACA9E68528B22A2C53B87333D669AF8DA2C80F8DC14D62AC47A20086F454F965D65C19392C811F7A15C09142624168C1337C44300562D058B1A1F42C05A3393FDE7E843DF97EA6260A69B706AF438C1B03F6506DCEB2ED0842C91172E7B3025C53213929D4831F1095A3400D6A130A811F1B33CCE37D4077D77159A -ss = A6DB9C606E364AECDF4AC552B41757DE - -count = 97 -seed = 59EFF60B1EF6185DB34EE1E3B1DD2F159106CECEAA79BEB74923B4F5623D5BC52DBF5D2594A1F7C6C64D12CF144E9ED4 -pk = 39261E697967B0BB7EE0AD5621B7C62179401C8FCCB5BDA55776AF330E450DAE2E5B7241E9CEC5A2C09514CB96CA35A7BCACEB781E6500D62CF7ACEE028461D8A542F5FA2B7FA25147D62AD481F97C4E2AAE52C6B8AF0D5CEFB771E4E42FD707FEC2B9BE61E403D211DA70AC6801BD0472EDAFAF17A0DD1D772D3B39FCE955FD37648EDE750AE8B707AF6747A1EB53A91EC66C25F30DDB3171C8D83A8114DE7F722460BD017811EF82DF92339BAF90291CB3B37879D4795FAC777793F2DE1FA2724DF4EBE6CB6C0EA6BD6D9548D3AF8701E21292B6791D2A9B0E2901A45B0C8CACE6E2F70172B04128CAE55DCE6B0A2EE31013D6765E7C027A6985DEC8F02ACD09D4BCA7F79516D4F3F4965EB572717CB3BB01FA8871B8D508B9DD59342A43AEAEBEDF788AB4A64585C0C0CB33E1DFB3063566F3B549F4E801AEF11420094EF1143F2D9C84DFBE574301 -sk = BA2FB9318D4DBE7488057C33E95E6F056939B6856262B11B084EF55E11ABB72D2062CEAA72A155F0B158F10039261E697967B0BB7EE0AD5621B7C62179401C8FCCB5BDA55776AF330E450DAE2E5B7241E9CEC5A2C09514CB96CA35A7BCACEB781E6500D62CF7ACEE028461D8A542F5FA2B7FA25147D62AD481F97C4E2AAE52C6B8AF0D5CEFB771E4E42FD707FEC2B9BE61E403D211DA70AC6801BD0472EDAFAF17A0DD1D772D3B39FCE955FD37648EDE750AE8B707AF6747A1EB53A91EC66C25F30DDB3171C8D83A8114DE7F722460BD017811EF82DF92339BAF90291CB3B37879D4795FAC777793F2DE1FA2724DF4EBE6CB6C0EA6BD6D9548D3AF8701E21292B6791D2A9B0E2901A45B0C8CACE6E2F70172B04128CAE55DCE6B0A2EE31013D6765E7C027A6985DEC8F02ACD09D4BCA7F79516D4F3F4965EB572717CB3BB01FA8871B8D508B9DD59342A43AEAEBEDF788AB4A64585C0C0CB33E1DFB3063566F3B549F4E801AEF11420094EF1143F2D9C84DFBE574301 -ct = 0DC86F3AFB7047767E12D21BCE9308FBED0CF6E673632F078313E67B07B58DBAA60011BD321566F2C8990996B662C5D12F1CCF5304B400E1FA7E496BC63DCAD33C3A660173DA466FB2879979453C89D81A672A4708954C1662337050C4A62382CDC4A02CA52CE361C66ED9A8FD0075E908B062AC2F12905819905C08CCD223B0651663A43C980CDB6568010A85D25FC9F4921199670AE34C89A2A926A65D4376350935BF0162FB035CB6A64DE199B88BC2E49D1B425CF0F27AF6968E6DD5BD51E4D6A494EEC29A066736462738721733AF9999FCE2E64D4078783A015F45F74AF20550081A01D81669D3EC84335E80BB367DF9298E084E16EEA5E444BB0554403D900D2DC320F9DF999E57E36122BC2E14950111D146D2C3BB78481DBA632EB346468862E44F3D6C433B8097BFF0D295258243502309B8A5DC0E75F487E9789675966B8DFEA8D513D300EA74CC7C9787D4A7AAD9401FC1D8D9C6 -ss = F68927D6306B93CC1F822E2CBB5C43B3 - -count = 98 -seed = DDDCA9DC31BEA737D3F474E7560B37FACB2F53C803E768FFAADE7669FF94B1D4FBD17068CFFD5DFDD24AADADA4EF6B12 -pk = 5F5E6BEF94BC0012EA7D7558EF4EFB72C137EFE6B14562E0C5F3BE819D7D5809C332F5E5007D3B7992B92719CE077CBD4DCA38FBCC4C0190AB60D8016AE2B4DDDF9ABCB58A3763B3A45947EABDB9A04271F94A0D17B364B854157F3D155D85F7F7C8A171BE9B2373AC90F3C34C001E961ED2CC130ED884486760EAE9156FE69FC0959C9FDA964D212DD304EEBB18AAE58B5D253997794B675AE8BBFD98777E7634696E0E01E005113DEABDB23404FE8D7CBD180C6B0FC0DFB6A995FF3FD2F962DA1FCEFB1080B373E0702FA46D602B7C0F838D6FEA0F6FE948E44201AAA0854135B694547C688C6A1A80809334E321CF47B8FBA421877EB562588E4717B5D1835F6B81A539F8173A300BFF53264A092D110E00B4C4058028EC647DA3C8BAF90520ACD123A20D027E2952A1A45AA892948C84E3092985F8A49293DB7FB98869704A6E8E6827B7C6F20301 -sk = AA6DD1E5799CDF7AF9C4FC632B3EB9D5068EB2D3B95AB779EE1275C14C5AF22568E19CE77BC30BF50CD537005F5E6BEF94BC0012EA7D7558EF4EFB72C137EFE6B14562E0C5F3BE819D7D5809C332F5E5007D3B7992B92719CE077CBD4DCA38FBCC4C0190AB60D8016AE2B4DDDF9ABCB58A3763B3A45947EABDB9A04271F94A0D17B364B854157F3D155D85F7F7C8A171BE9B2373AC90F3C34C001E961ED2CC130ED884486760EAE9156FE69FC0959C9FDA964D212DD304EEBB18AAE58B5D253997794B675AE8BBFD98777E7634696E0E01E005113DEABDB23404FE8D7CBD180C6B0FC0DFB6A995FF3FD2F962DA1FCEFB1080B373E0702FA46D602B7C0F838D6FEA0F6FE948E44201AAA0854135B694547C688C6A1A80809334E321CF47B8FBA421877EB562588E4717B5D1835F6B81A539F8173A300BFF53264A092D110E00B4C4058028EC647DA3C8BAF90520ACD123A20D027E2952A1A45AA892948C84E3092985F8A49293DB7FB98869704A6E8E6827B7C6F20301 -ct = CA1221AE3B6D2227DBEB2D3366A6FF04D4CEAFD8A87A646A0E69C17DE92A65FE381542CCC3DF59EE06EDD5589252CE0154D00CB22BDE00426BA25F63E4D80872B0369562226670F392ABC3EE8254B777AFA9818DA03201D927C6A44A798C4E8101DF0A4532439592FF6219230500C7BA12B97300F7E8251A15508E61299AC293EE92F07C720E5647590A445C11B746402E7722B801ED9D237C5E11F40EAC9F518BB17D2C014A45AAC78605365D21191A0176DA1EA59002F6552A84B34E9CD87099A4C92682510E0F306DB57F65A8B22BB4835EA77F71345041451402F7C5B8C5254F64ECB9E70694D6942986AB2CE261E8BCE34DBAC5BC35AEDAAF97F4638468E81A58A86762F3C7DC33BFE134F7EBBA728301704D894ED7B1E1EE9B56FDC3BC28C991337265D84811A47351F6AB7B7DC13F5903CE4C8533E67EB4562BAD582B6F37A1E43FE31420F901E066D6103DB5DDEE5402CBBCA607DBDC -ss = ABB141C9189DD1D2F5BCD86C02037C36 - -count = 99 -seed = 2A6F7386B815366F572AEB6C79E272CC21B7095FE09575F18072C9D677DA23BC9C8A4BC393B7524604D299BEDD260C8B -pk = 867436C365BC16B95C51E7F0141842F0BCF468592D95294141E6051F329F36DAB2F22FC2C76ED5B66CDCA197D111D7BD9E78EBF1D52E02770B91B6BE2D4BA7D895906D72F7DDB7667C41691EDE3B153BADE39B7873F4772264249EDDEE0FB5A78C7AC439CE9668E231C568C44B004292F96CD47AA8EFE07746AD6E40075D976BFB75BFC481D94C210FDDE78D3371156DBE081064F6274DDFF1F9BE05BDA76886345AAC5F005C307D9A2F2C3DCB6E16EF29530BED4D583DE8507AADC01F7C364DBCF11A1EE94588BC6EC6AE9C23835080ACDB0DCCB33B73A400AB9101111649F226657F153C58C2067A963173A955124AA33334E85F1380830E859EF99EEE2994F4CF9AB19EE0F8D426FA774D4F36A17668870051C1445B987A0034B16F76329FE7E3927E39FEF157C082212046512AADEA51EC22BA069B4684A939937613FC581E9B7596EBA0088B8000 -sk = 195D6C86A3DF4C21E3007D7F2768B43CAE7EF2D029CC7ABAD98E68D0374DEFC5F2EDF8EDAC8ACA265EF84900867436C365BC16B95C51E7F0141842F0BCF468592D95294141E6051F329F36DAB2F22FC2C76ED5B66CDCA197D111D7BD9E78EBF1D52E02770B91B6BE2D4BA7D895906D72F7DDB7667C41691EDE3B153BADE39B7873F4772264249EDDEE0FB5A78C7AC439CE9668E231C568C44B004292F96CD47AA8EFE07746AD6E40075D976BFB75BFC481D94C210FDDE78D3371156DBE081064F6274DDFF1F9BE05BDA76886345AAC5F005C307D9A2F2C3DCB6E16EF29530BED4D583DE8507AADC01F7C364DBCF11A1EE94588BC6EC6AE9C23835080ACDB0DCCB33B73A400AB9101111649F226657F153C58C2067A963173A955124AA33334E85F1380830E859EF99EEE2994F4CF9AB19EE0F8D426FA774D4F36A17668870051C1445B987A0034B16F76329FE7E3927E39FEF157C082212046512AADEA51EC22BA069B4684A939937613FC581E9B7596EBA0088B8000 -ct = D170E6E4C5D4540AC2628029CFF149B7F0CDBCA679EAAD94357DDB9AB0C2CD0FF42C0FA0B7C74C4C3FC39D6CD3CC7919CB1053CC58E9008C9793A8098304B2EBD814ECEDC8740F199BF1B4A05B64F4E70A76B4640330ACED9967416226A7946A1C18C433F0C260B1B4FE5E82F800082D86B188A477CCB81B0EB7D18AD006378B28684A6D479FF53B66F3E20C597A5AB93E978EAD97F3E4A62BD31657B1DDEA441851B71A022066C2C3FE1A31E36BCC22F60C12E5B6D4012879A88B39CCB914480CC30F1489140CA9A9CA54DC2CB635E450A0E2308B1EE20DE8502602C744968E57841BCC8F62B0AC14EEB35ABC77BE42EBF33AE0EC3E53FB62EF6058F6CF27DD91D26CC9EA1B8996F35BD800E15928C7318D0014E2A29706E62A8AF0FBB8A2512823A09E4AF327234ECF4086DBA31A8B26E130633256C19D0BAA5244D3DEB6E397E6B2058DB40BBDB700C58C6E1664620548D2BA2F8702E95878 -ss = DA40C7AB4E2ED76E4A3BDB509B806E5C - diff --git a/dh/sidh/testdata/PQCkemKAT_434.rsp b/dh/sidh/testdata/PQCkemKAT_434.rsp deleted file mode 100644 index 376a5815..00000000 --- a/dh/sidh/testdata/PQCkemKAT_434.rsp +++ /dev/null @@ -1,702 +0,0 @@ -# SIKEp503 - -count = 0 -seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 -pk = 05279D27FF7E3A38ABB05DCFE23B5831C030D832D3EAE35FE06A6538597532D22A0F4012FB2263E160495F8291B58D9DF8A8947C7CF3E6735520BB2D094912408829851AC4B85AA922069F2AAA0A4827DFA4730E9CF05485CBEE411C3D5169DD4953746B6A2E6574957EF920596B1612BE62A883740B5A0C157117AE1C3A07E4CE8CCCE7E9E88FE7C20A507FF019AE0893F34303E173D291F6CB7ECB4C3901FF34A48DE40771F5BAD72DA2B4C1CFD0A61F33E39327A8DA60F5640D4C2E71EF9C7297A4E9BC50493E3BA65D3664610A6D61035CB6600378D017D1E1810ACD113252D60F5915749C2B5CFB4452C40C86F1F40C63297DCCA900686F2D2266F9444539D9BA13B1F52FB2FC3BD4F3EDAA6EB707AAFCA5261EA271ED961B2ED195D5E3B0299179251866CE0EAA31C5C90B7999A8D63BA2DE84A8AFA19F11F2DC0CACA39B982CE053F71D269931D9EE26BCE592A8EA818553BC8F8D244F62FB4F5E5386E3EFF5CD231401C9EC2BA57FF42DC3B3791357A53E1E31394008 -sk = 7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148038626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB0F05279D27FF7E3A38ABB05DCFE23B5831C030D832D3EAE35FE06A6538597532D22A0F4012FB2263E160495F8291B58D9DF8A8947C7CF3E6735520BB2D094912408829851AC4B85AA922069F2AAA0A4827DFA4730E9CF05485CBEE411C3D5169DD4953746B6A2E6574957EF920596B1612BE62A883740B5A0C157117AE1C3A07E4CE8CCCE7E9E88FE7C20A507FF019AE0893F34303E173D291F6CB7ECB4C3901FF34A48DE40771F5BAD72DA2B4C1CFD0A61F33E39327A8DA60F5640D4C2E71EF9C7297A4E9BC50493E3BA65D3664610A6D61035CB6600378D017D1E1810ACD113252D60F5915749C2B5CFB4452C40C86F1F40C63297DCCA900686F2D2266F9444539D9BA13B1F52FB2FC3BD4F3EDAA6EB707AAFCA5261EA271ED961B2ED195D5E3B0299179251866CE0EAA31C5C90B7999A8D63BA2DE84A8AFA19F11F2DC0CACA39B982CE053F71D269931D9EE26BCE592A8EA818553BC8F8D244F62FB4F5E5386E3EFF5CD231401C9EC2BA57FF42DC3B3791357A53E1E31394008 -ct = 100692A8BD30F01BE8AC6B1AF8D93A060D3821B2587F4038D64B72426A194BEDE63CA60B75A5C3C15532CE307115AA9D77AC232E14D99C1E1AFEF1EB2D6321AE342F990023466E683A2568D59A14325C2C6C272029741D8E36976D1804059BC06B802F3A495EA50D0DBBA93FD263F4CF30BDB5F783BA6A0775715B05F700C85B316F7AA1A1624973885941DBFF91316BF47AC698E11D6B2418F553379D67A00F784B8643FB8A94029584391D488775EB4414A5E6E8122B0F282D900F3D05775F1DD994FB232ED826106203CD3433967F60FF925DF9E86CB376CAB5FD90B132E425682741F6AF078E75792CB4CE085D44993CFB6A4ED5AA3541640A0A67687922B92382CAC47C6AD358011A269CC7C17CE651CA2E2393F7DFE19D7054FEF69610A353D676B1F076549510590D406AD13F4A3292CCF206DBDAE47F08D448CC006449F27C1FB54E9C9E6F16ED2F3D120DD5AA2620D76690F00E31904C601310C76A843A58E1AEB9C5F515FCEC482C08205FDE99A89E64485EBBD43EEFE2E24D18EEE8F20DF6E113C6667512E28396862C98F5C0 -ss = AF1280151C2C59B4D4150B18BA7F71590523CEA83C9BDDDA - -count = 1 -seed = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC81ADDE6AEEB4A5A875C3BFCADFA958F -pk = CCF655D6C656A0A80533FAB834B61B0FD8CFCB681966194B4AC63D1A9D3E607EE72A929EA6EE3C6FAB682E48A84127C9DB773B0728D8583E9C0F349E7E7A3B0E9EFA70AC8AB097853D8143ADA5804DE75DE0D7C4975CA91573C62F3060D9213F1EFC82400D167252C9E3A22259E1D4988724E2B73FB40D8625FD0D90DD13062CCD8EA37D2272CB31E81C9E0B8A79E99A7C1090CD7F9BAF5DE30DC044BEF38957367119357EBAA5466D641F31288C06B895CEB1E51B893AEF0226B02115126CC526330008E8288BF9033C4FCB7615A4B53BAD2D731C93CDB26D28AFFC51827CABCBB5544068DDE49DE5E52F235026E8FBA3BED35A1215332F2C7E9A01F9363B3529BFB89AA9A04323C7E0A5E03AA9882E0148BB8F0A700B62149DC5CF4DEBEAAAEFA67F42FF66B803F9E6BA74E04CA273DBEF6212C40FEAE361D7260ABB1397B250C15CE7D92C1393E436FF82DD1A00AA3F60BEB35D0A1AAAFE3E1634730E4364C625815BC6BCE2D6A0192F9B07FCF665AE70D7E5BF1A760DA903 -sk = D60B93492A1D8C1C7BA6FC0B733137F3406CEE8110A93F17003271531CF27285B8721ED5CB46853043B346A66CBA6CF765F1B0EAA40BF602CCF655D6C656A0A80533FAB834B61B0FD8CFCB681966194B4AC63D1A9D3E607EE72A929EA6EE3C6FAB682E48A84127C9DB773B0728D8583E9C0F349E7E7A3B0E9EFA70AC8AB097853D8143ADA5804DE75DE0D7C4975CA91573C62F3060D9213F1EFC82400D167252C9E3A22259E1D4988724E2B73FB40D8625FD0D90DD13062CCD8EA37D2272CB31E81C9E0B8A79E99A7C1090CD7F9BAF5DE30DC044BEF38957367119357EBAA5466D641F31288C06B895CEB1E51B893AEF0226B02115126CC526330008E8288BF9033C4FCB7615A4B53BAD2D731C93CDB26D28AFFC51827CABCBB5544068DDE49DE5E52F235026E8FBA3BED35A1215332F2C7E9A01F9363B3529BFB89AA9A04323C7E0A5E03AA9882E0148BB8F0A700B62149DC5CF4DEBEAAAEFA67F42FF66B803F9E6BA74E04CA273DBEF6212C40FEAE361D7260ABB1397B250C15CE7D92C1393E436FF82DD1A00AA3F60BEB35D0A1AAAFE3E1634730E4364C625815BC6BCE2D6A0192F9B07FCF665AE70D7E5BF1A760DA903 -ct = 3088E00719F21017008052B1332C52277BD0135C86E293270611599BC5787508972B82A077EAAF851557E331B32D75D70AFAF9C32E142A8864CA8F4E1909371620164ED231B9F7B711F6A970AF8321625351215303C617B783101D13DE7E0D64F100FC4A1E11414123BFE461001F03808BF95B7DAAB3BDADA5C193A59E0F9FDFA1A40CCA4FB2929FE0302443D4C2B3708A8A52673C9CF7EF5131456E8EE123938C6C0C80F6E1B8703E6FF885BC110438A710D229D0BEDE280F0497C61ECE61F8C1D11C163F33E034E05368FDE4D9C76DCCC8AAD665C2BA81F0132A8016B385768C80CFE2A49EA093F653D3304C0767EE6AE94B5B3468FB675D371C31F72DB05BF2E40C5DF101288DB11FB32449FA6E9716342E0B547371CD04BA035C1F824686E5CEC119B218AFE37FAA746E9E4083C262A04E61412FF1E9EB29362AAE33B6662A4E338BB305FE498E6685B06234F5497AD4105D476A57843CC29290AE082AAEE4A2B294884CE7857917D3F9E0125B97E2095DE8341019F9990EED947FAD9A47D634AC907920357DB28073BDC39D3764C998 -ss = 810D3549BEB3DD6E45EEADBB75386F6A63FF3330ECB04C22 - -count = 2 -seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 -pk = E18612D0598700639858EA9ED63F644ADEBC7EB1A7FF24249157F928ED9E32C54A60120D63C98F610550069F160E0DE97A555C0810A963826A3E097768B102ED61DE243D9DBC698E319C271A8CA84BE6FC03EEE068145F828BBE53BF58D3EB296A77968765DE63B6F413F6548981A623BC411857B867DA3CFECB227ABC243BBE8783C787171B6EE8F089DAAE7E47A42970D3497F58AB596063CC7C6B37F39AE4B50F16157A456E9578F4C4C15DD81F627824CB5FA23830574F42317F055B6C68B7C47221D7BF66F935AEF1C8BF4FD621BD8932840FE2A1C62DE65BF353E8D5A7206D46B1F281F8828B96E171AAEDE31873E1C49569329B98701E39336B8A1A11937CCEF0F78BE88B470B26A1491C6F6AFB9E12638B0A69BB8E2B575C9A58E6256131EC4901CE345B5B6F6987B477D11407C6755A0D3C29CAEBD61A626D30BD86A7DF57AE44D1A8E460CEED2028F9A295D4F4480D9932859A8405959A36C482A94CCFF5E0CFC28E3375113656AE7F538A46BC5F041F2D5919232B -sk = 4B622DE1350119C45A9F2E2EF3DC5DF50A759D138CDFBD64E82FCC97CA60CCB27BF6938C975658AEB8B4D37CFFBDE25D97E561F36C219A0EE18612D0598700639858EA9ED63F644ADEBC7EB1A7FF24249157F928ED9E32C54A60120D63C98F610550069F160E0DE97A555C0810A963826A3E097768B102ED61DE243D9DBC698E319C271A8CA84BE6FC03EEE068145F828BBE53BF58D3EB296A77968765DE63B6F413F6548981A623BC411857B867DA3CFECB227ABC243BBE8783C787171B6EE8F089DAAE7E47A42970D3497F58AB596063CC7C6B37F39AE4B50F16157A456E9578F4C4C15DD81F627824CB5FA23830574F42317F055B6C68B7C47221D7BF66F935AEF1C8BF4FD621BD8932840FE2A1C62DE65BF353E8D5A7206D46B1F281F8828B96E171AAEDE31873E1C49569329B98701E39336B8A1A11937CCEF0F78BE88B470B26A1491C6F6AFB9E12638B0A69BB8E2B575C9A58E6256131EC4901CE345B5B6F6987B477D11407C6755A0D3C29CAEBD61A626D30BD86A7DF57AE44D1A8E460CEED2028F9A295D4F4480D9932859A8405959A36C482A94CCFF5E0CFC28E3375113656AE7F538A46BC5F041F2D5919232B -ct = 4BF036711DD1C3B4C941967D4F63A35C4EBBF45E4601573CF33D49921D95F17792674F7C18E455D8C7F1BEF479BB91D5B22E2EC955988C70DFFAC371BFB41AB81252F22949685E78E055E7495D82AE77006B1D05015F149D9EA4F927096500C8FCB583452C2E20E0C55B4AB18F801E570E5A8BBC56273902279B2B4C3C1DB0DF7811617694C1DE0117A9E112FA58EA523F8A40A749184DC9F9EF44E09BF372EDB9D55A4C7DB348EC971185EBE8CD005A73008ED74131AB939083813129086BBC1EA1DD04A3D5D844F901DC9FDF089A2504F1D32C61EAFFB0B0B66445856AA5359D49DD737B01A6235B2A35E29154AC71229F93DD4C9CD3DCA2C3621158F11EC6895D5C57A6E2FDCD0DCABB4E150DB2ADF9F5F16320BCE723220522E05B196AFBDEC21FF14E53FE9EF054639FC98D637FEF20FA0149709517BB3521C787B9F377857DE2B41F4FCF60113DE4E0488EFAF0A536E8C46B34E41D8DB237AD704CE981D15CD8765084B35983BD35E172ED977F9B43F8D9273B915D8639F91164642199EFC3F90B43017D1D46BB68ABF28A7EA1D471 -ss = 68CFB6A6E01FB2FFD8707C8278D705E0DCB53A502BFAD6B4 - -count = 3 -seed = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1A -pk = 6D839375DEE6F1486CB7072A4994BE428F1AF5876B5D34943BE2D1C20F650D528EDE5A453CDDD87E83D54F4BF88A13189FCC1ED8FC8E11DB8ED98E0BE87D2E778BD06B33214CE15E5D62554B0367BBA720028A40E20FAC9AE4DC98326178E162611367A51EDF011FBC621492E6EC235FA5CFB604C2C976B8BF8CFBB43D37B26E21766519E11B658D6706D515E4B288E2337BD7A56BB6D51535CA467BC6A5D495884160EB13B7DD6073091A7602C0D2CD98873DD58761603A85CCB85A3A032E25E4BCD2AA384AED7AB6341C68BC125DD49CA7795D7060605EDEEF5A511116BC2E4BD545143D6791A632F5CE045FE567DD45778CF4A297CCCC75E3AD174C3A3DCBB44FAE1B7BC692194034D102C2AC8B7D05E94F63BD297920A35494778C4AA37A8F22F9C6A7C82DF824293FBADEE6B6F779C32D6AA17396ED94DF2C1B2ACF5F979F4153B7F38B841775B4D9E1E02C2E0DA524905483D401C6D7200F7F310A362DBA67B0C604FEDE8E17AD0C255B4811A234DB134E5E0424518118 -sk = 050D58F9F757EDC1E8180E3808B806F5BBB3586DB3470B06DE950541FD53A8A47AAA8CDFE80D928262A5EF7F8129EC3EF92F78D7CC32EF006D839375DEE6F1486CB7072A4994BE428F1AF5876B5D34943BE2D1C20F650D528EDE5A453CDDD87E83D54F4BF88A13189FCC1ED8FC8E11DB8ED98E0BE87D2E778BD06B33214CE15E5D62554B0367BBA720028A40E20FAC9AE4DC98326178E162611367A51EDF011FBC621492E6EC235FA5CFB604C2C976B8BF8CFBB43D37B26E21766519E11B658D6706D515E4B288E2337BD7A56BB6D51535CA467BC6A5D495884160EB13B7DD6073091A7602C0D2CD98873DD58761603A85CCB85A3A032E25E4BCD2AA384AED7AB6341C68BC125DD49CA7795D7060605EDEEF5A511116BC2E4BD545143D6791A632F5CE045FE567DD45778CF4A297CCCC75E3AD174C3A3DCBB44FAE1B7BC692194034D102C2AC8B7D05E94F63BD297920A35494778C4AA37A8F22F9C6A7C82DF824293FBADEE6B6F779C32D6AA17396ED94DF2C1B2ACF5F979F4153B7F38B841775B4D9E1E02C2E0DA524905483D401C6D7200F7F310A362DBA67B0C604FEDE8E17AD0C255B4811A234DB134E5E0424518118 -ct = 2310AA9B6DED40FAC980646C368ACDF8263AB65B5262CED6EFD708222FD5B133EF6EF22A56B940228CA115BF7A9021454467F35FDACA7FA185D3704A4AC630246FA53B2A57FCD146BA8761853110BF380C6B3EFF773B81C941C4258F32C5E392E1F2E4BBC36C0D483AB7CFEECC2679B35A06C50FFD0D9B6C3299C166002ED90EA16030A95CF1C3F1F07B6B7F79FE286FCD2E9C23B95878D48A841F588858EF235B05CB06564A8083ECACFF091A179092AFC512BB652F9128C2C32A462570BF8BD59EA43EAEDCB0E80EB4DA4FBE82379200DCA2ADE33E0168ECDB06EC57C4564946A4BE1D07EE1DB50A05445E1C1274949EE0E3E0444EBC56F7737A275F9B3CD1ACF5E24C96275D9BE24B3846AB7C9019AB51BEE384FF0F0B7EEDBA3FAA640425854478C4D03FC710415880FA6E05F7D39D6ADAF8D781BB71183D0DF40FE456ECA30D789E8A97D271D59FEA9152E2C31898EB6272AF8E9022476FA21193971DBCD7F92F0A2984E3DC16FAA1AAFE85B3A9B935ECD3D6E9D25506265D2F9B7AD4899B5BA812EDEA355CB03C8E220782405079AA -ss = 6CB10B8CF5C9E4D96562A962E5C1B0553799BCE28197C48B - -count = 4 -seed = EDC76E7C1523E3862552133FEA4D2AB05C69FB54A9354F0846456A2A407E071DF4650EC0E0A5666A52CD09462DBC51F9 -pk = C4C97E7F806E15524BA63CE182DC0838B3056E17880565D4EA4665FEE04333AC3C2107C358D4B472F431A19EAF8A336AE7EE591142410A446D41397DFE653DD456824288B7772B9A0E697384FF67986F60CA04AEC1B07032483959F7B32C1F90E1CB538182F796A8B0BDCB639EC7B5A963CF4EE2F988A1DD96CDCDF89233E97A9B1387F3B607498AC9A6AD3C3B12D5984DEF61213BCD11178C061C61CB18DC2F28A984388BC01C4160FBAD75BDCAEDD670614AA17C5A909A1B7A3EB70399CE79BBAC2A44A84C65AAA2BC0C5C1B9A4F89940AE3246640B55E050370F73C26151FD67D8B6FB3C467CD2DF3DC15DB35963FA1A3713BB915CA93A9B2E730F0D3FB412F96BBB3CB3178BFB79C6CAB3411068C31612164FE0FE12423E7E48AAE429C98BF85E80F5F7E6FA7BACFD69E7ED873C168695F9CD89926EB29A40CABD47477B01FE57B992B870E510E29E063DEA9097CB15DFD842D05AD36C34D9967DE9DCDB6DF80F8E47F67C64D0D38AF185B443A08DB897BA69F6F4CC2DB2E -sk = 66B79B844E0C2ADAD694E0478661AC46FE6B6001F6A71FF8BE2D3C64D38269A1EE8660B9A2BEAEB9F5AC022E8F0A357FEEBFD13B06813804C4C97E7F806E15524BA63CE182DC0838B3056E17880565D4EA4665FEE04333AC3C2107C358D4B472F431A19EAF8A336AE7EE591142410A446D41397DFE653DD456824288B7772B9A0E697384FF67986F60CA04AEC1B07032483959F7B32C1F90E1CB538182F796A8B0BDCB639EC7B5A963CF4EE2F988A1DD96CDCDF89233E97A9B1387F3B607498AC9A6AD3C3B12D5984DEF61213BCD11178C061C61CB18DC2F28A984388BC01C4160FBAD75BDCAEDD670614AA17C5A909A1B7A3EB70399CE79BBAC2A44A84C65AAA2BC0C5C1B9A4F89940AE3246640B55E050370F73C26151FD67D8B6FB3C467CD2DF3DC15DB35963FA1A3713BB915CA93A9B2E730F0D3FB412F96BBB3CB3178BFB79C6CAB3411068C31612164FE0FE12423E7E48AAE429C98BF85E80F5F7E6FA7BACFD69E7ED873C168695F9CD89926EB29A40CABD47477B01FE57B992B870E510E29E063DEA9097CB15DFD842D05AD36C34D9967DE9DCDB6DF80F8E47F67C64D0D38AF185B443A08DB897BA69F6F4CC2DB2E -ct = B13B1ADBE980C3D0DBEED0243319534E8D8C5AEB0F775446F83C08C8CD667D9BA0A9E3AFAC556045C3A38E1E7A6BFA9821275917170EB08D6E9B0A5050321E8FCF8DCD4F39B1A04FB08ECF5C7612814704395AD82B7511512CBE659834CD9FA4B79B84C18489B4B05AC4511A7E3EFF4149CB91F63614A96D0E5B13118730BA384518001F4BA0998C83AA09F336900377FD29FFACDB44DFFEACC680C3AF2C412D9D98D8F4E191F5AAA95D7B6EEDED0D025B6E55FEB13B4EB45D1FFF532140A02755963742B6C7E1CD8EA4917431BBC201C632E94AC560BCDB4BA0A9E59738E4706C78EA619EE7FD6480ABF52FA0D3A8494B03E8E4B85E8344F926E820F42A32C716147A0594424D0C63E0EC033E69B97B61E6F746635524094CBE1AA716B239F284381FAA0F078E743CF8F94DE6C00ED2055610C1A64ADC738F03034867CE0B9FB14CA9349819FF11E66DA946FEBBFF934632F556B11081B8B4AB6A8E7820172B641E9437EE61C1D47B9CE281A52E842C5E0068B51D72D2917E2E676FED343E3B13E7394D502F7A744CD2D678402B0920F443 -ss = 815FA89CD9C0C6DEBD6D4C3F4B38FDBA423C8AE4555C6939 - -count = 5 -seed = AA93649193C2C5985ACF8F9E6AC50C36AE16A2526D7C684F7A3BB4ABCD7B6FF790E82BADCE89BC7380D66251F97AAAAA -pk = B1EA55A82BD335EAD91F9242F35213F5B9F49400E2D7AA0CC3491DACB960172DE119BB65CC0A782FD3290590D3604F1DB38AB5DCA5FB8CC01621FD21EA192B133E3B442DE7B1DF9E3C403DFCE43C023EB5DEB435F9D1BF00C6F3A923CE8A5993C377BCE6A96EBAB9904EE4D27644CF3F3566C3447C555B693A921DE2D41BEC1A04218FA743844EC770B340CB25AFE1E68A9401829A858661745990452E2CD02489DB2D4948EE47EB77CC84CB45364BD877F9246BC1201C57D5A6D4771E004013FE0EBCDF9CEB597EDDD8AB968812386D2804ECD968DD91F7B764679E081082A7A4E855FECFB134EDFF1112A286C504170454FBE64B295682561DDD329A4BD9A386B07D7CA06F4A24FFD6A6B290A24377206928997CED46975B400D9B1F52DC3272A3638CF1A03B7837FBD07ECA3A03E9B87D9E48AB94B53DF7D13F78FF48DAFB3615345716623E3D34D06A143C7D6D8E6D1E0CC3C064DC2880A2B39B1AF72B2F89B4D66A65C2EE2E539C862F1F836F8E2C3E731ADA4A2807EF31 -sk = 7EC408F52C9AA723D0C41D9987682A5F4CE6C9DA7CD0215AA08CCF451B049FD51D7A9AD77AE14A81569DF8C9BD3A8F1EBEA86FDCFB823002B1EA55A82BD335EAD91F9242F35213F5B9F49400E2D7AA0CC3491DACB960172DE119BB65CC0A782FD3290590D3604F1DB38AB5DCA5FB8CC01621FD21EA192B133E3B442DE7B1DF9E3C403DFCE43C023EB5DEB435F9D1BF00C6F3A923CE8A5993C377BCE6A96EBAB9904EE4D27644CF3F3566C3447C555B693A921DE2D41BEC1A04218FA743844EC770B340CB25AFE1E68A9401829A858661745990452E2CD02489DB2D4948EE47EB77CC84CB45364BD877F9246BC1201C57D5A6D4771E004013FE0EBCDF9CEB597EDDD8AB968812386D2804ECD968DD91F7B764679E081082A7A4E855FECFB134EDFF1112A286C504170454FBE64B295682561DDD329A4BD9A386B07D7CA06F4A24FFD6A6B290A24377206928997CED46975B400D9B1F52DC3272A3638CF1A03B7837FBD07ECA3A03E9B87D9E48AB94B53DF7D13F78FF48DAFB3615345716623E3D34D06A143C7D6D8E6D1E0CC3C064DC2880A2B39B1AF72B2F89B4D66A65C2EE2E539C862F1F836F8E2C3E731ADA4A2807EF31 -ct = 9C17973667EB92132A299CD857FC15B7FB00876BEC0D55E030F375315EE3A1753E1C325E18F16A814F41F97D12CCAE77B81B613A317CB6F8B819F727E879193B7FB4F9FF27A07BC4E411A86B38197A01A860CA7093C774093F2C4F3A037CD7411E3ACF7776D075B0E44D7323644DE236D33F6BF31FDF94398B07B0E1812B01E7923555209E8C9C7DFC9BB62869DB73FFDAE16ADB5267789F2E1F57C8BD4D4CCBCE822730F37C6D9693BB4B3FF8F67C38934DA5E22347D1115F612E542C33A24D8300F4A2C3CBA9B8832710F8B066CAEC61F59B9903FFB6610DCFC04A4AE9B2BA8525AEDB16FDFAA74FB3925AB4B903B9DD8317FD1B219F5761F0540667205D6F838062B5A3BE2AC8D18326060E4DED3BB5C09CA0F6612B213FEB5407AF7CB210A5101B3ADDD28B5B6F66D4A660F0C678158EC73F5DA5BBB2EAA01700E50B95B61B93258BE34ABBFA7168A39A5B728A8983D08E187FABD79A4F35BC4E850B510CCE31356863F81389801C7E1780186A18CB187114B958F450A1209E85179AA64E4D196FD5EF8ED1A317152FCB1FD51323AFB4 -ss = 4668C26A46478B62B40E5BED0BF71492A7FDB443FC010AB2 - -count = 6 -seed = 2E014DC7C2696B9F6D4AF555CBA4B931B34863FF60E2341D4FDFE472FEF2FE2C33E0813FC5CAFDE4E30277FE522A9049 -pk = 4B8C0E0261C43AE34A19A0C61C63C333C8CC58E415944FDEFED6A7AF831740BEB8BA07E79C806CF4DA9A1DE9448F657F71E0A05C0AE67C0243E36BB4A0560F0F08BC79BC60A32E66B84D9C8D3BA2AE66B7B6DB17584647D9B412DD25219D3F52CD939E8B29FE13458460A22D9EF857DBCE1C41E84796BE1B5653DD37660F57C76419688DA976A1D42D53357F42A80BE16B74F289C1EA06D9410A3E4AC94FABF1A05FB87CD0E3233B469E32CF98500C8FB92C52743A4923D83370AE8509ED2C24F05A3B03EAB4D6AA7795EB3AF2F907E06CF0EFCEB2019C6B6544F0E9B075C438BB0433669B5EAC9010733ABB675ACBA6A3DB1E0EDE690DCD3CDE4E2B17BE9C0B26411E9CD7C5C06B18150DAB03D7C38CE09B4FBFB64827FAFE6C7E62E19C9477F73E1CA00B0A737F3A8CCF6D669979DAAEE8B445372C147790D420DD53630B87676B53FFF90242D834125A1A369975EB3475716CC7B9E168C4A9560B364F164E6EDFE67DDC1967C16496C339789D22C757934980C39752E10E1D -sk = C121915BFEF6ABDFC177DAE2F5A24218F9ABDA2559AFC67484EF52DB5EAA6DF8EC3A0BC5FFA730DB0DDE8C5F38F266D5C680A78D264A7B064B8C0E0261C43AE34A19A0C61C63C333C8CC58E415944FDEFED6A7AF831740BEB8BA07E79C806CF4DA9A1DE9448F657F71E0A05C0AE67C0243E36BB4A0560F0F08BC79BC60A32E66B84D9C8D3BA2AE66B7B6DB17584647D9B412DD25219D3F52CD939E8B29FE13458460A22D9EF857DBCE1C41E84796BE1B5653DD37660F57C76419688DA976A1D42D53357F42A80BE16B74F289C1EA06D9410A3E4AC94FABF1A05FB87CD0E3233B469E32CF98500C8FB92C52743A4923D83370AE8509ED2C24F05A3B03EAB4D6AA7795EB3AF2F907E06CF0EFCEB2019C6B6544F0E9B075C438BB0433669B5EAC9010733ABB675ACBA6A3DB1E0EDE690DCD3CDE4E2B17BE9C0B26411E9CD7C5C06B18150DAB03D7C38CE09B4FBFB64827FAFE6C7E62E19C9477F73E1CA00B0A737F3A8CCF6D669979DAAEE8B445372C147790D420DD53630B87676B53FFF90242D834125A1A369975EB3475716CC7B9E168C4A9560B364F164E6EDFE67DDC1967C16496C339789D22C757934980C39752E10E1D -ct = 30E7FF26E92C4A2D2C959284849698CAF358F6FC489FBA3CEA03824B78C096A337486835851ED787C200C0D4774E5F894E3B0641D999F6C5D15BD1A9346F270ACC72A0C6692D9BDB4593E1A8F17C493A55AA39CF2E1CCFFB231DBFE77E6007D96E742AC1DC6C4CEC1253F2100A04C53736D0827850F725CC885D3912EB3C28FC808AF5F441DF8238E3F8A9899673F32D2BA0C523DBD7C0BF50297765612220A1CAEB971A3F6D948D6268BA0BA0A84BF5E30EFF97D834BD08BDCC456016075F5703855186230281E2FAAA77360478EC5CD9E2023717A8DBA18DD0BE7ED6BCD8D8E9D46D29597DE71CE0C97344D10331CA6D7F68A5F16E6CC0348EB6325AE178F4FCE390FA71F7DAFB8A16D26DACEC6793D01793BAFC6BBB7C31A77B04C5C47D0CF150D60F04633CCB7481A738632E012A035C1B6F880068697BD7251C68D708C60DFDC29F0626DCC54459044607C2AA57CB2B0C962E507B134367BD4CA3C451BE14B2DF5227D88AF093FCEDE18314F733B7A177D465FEBA54453E678B4E4809C4E2FE3529AF3C11B85D30F288EF3C332ABEC4 -ss = F9CDF2C113564143F3CF1EF59E20785D99974121A6832AEC - -count = 7 -seed = AEFB28FDD34E0AB403A703B535296E3A545CA479C1D8148E2D501B3C8DD8B1034BD986F13F1A7B4671BE769359FD2AAB -pk = 6F0C726DF1330754839FECF6CD5712D0EF05C08FAD2C1CBE3D4F90A207287DCE085844C86ED3DD6184D993BABBC6A5D87DE99773F52A3FE76CE2264D6A53243D976C7F793AD39E34A2971CC7ED240AA9A4D8BF959BC12456138B39A8A76223E28E3820F5C216E696E317644E8D7599C7EA9D3F1996D2B85B6C398B5E581C59E08209E53D956BD92469FBB9DF66AF0B50099CD72FC6B1E451D4B867D84A8BD3A0702C2452FF35DA3C0F051B80F68633B3030CE57B55E8CEB068E80B6C1EFE8A52665E29323CC87D942FC055FB50799BD5378BF0C2EF157BDC49975A5D334CC5E718AE4649D462291C2BCB3A3F984054FB2665E347968029AD7931BE1A60C305792BB9886D5B46E4B29FE68FBBFBAB5FD033EA3D1D6514548B83BCA718629453C499EA6B2C1E7005B3DAEB796F44F1FEE1B85833DFF04F2C9C9E4A34D1F8420D32B7BCB899DC424BDBAB62C960FE4A11F534F83E429230720D9C821547E3FB303B36884C285FBCDE9DEF5278A10408A6F9E3C682C4FCF8296F050E -sk = D86634ECF96CC2603761E284C0E36734CEDEC64E7FF4864699DAF37400CFE59841AFC412EC97F2929DC84A6F3C36F378EE84CE3E46CD12096F0C726DF1330754839FECF6CD5712D0EF05C08FAD2C1CBE3D4F90A207287DCE085844C86ED3DD6184D993BABBC6A5D87DE99773F52A3FE76CE2264D6A53243D976C7F793AD39E34A2971CC7ED240AA9A4D8BF959BC12456138B39A8A76223E28E3820F5C216E696E317644E8D7599C7EA9D3F1996D2B85B6C398B5E581C59E08209E53D956BD92469FBB9DF66AF0B50099CD72FC6B1E451D4B867D84A8BD3A0702C2452FF35DA3C0F051B80F68633B3030CE57B55E8CEB068E80B6C1EFE8A52665E29323CC87D942FC055FB50799BD5378BF0C2EF157BDC49975A5D334CC5E718AE4649D462291C2BCB3A3F984054FB2665E347968029AD7931BE1A60C305792BB9886D5B46E4B29FE68FBBFBAB5FD033EA3D1D6514548B83BCA718629453C499EA6B2C1E7005B3DAEB796F44F1FEE1B85833DFF04F2C9C9E4A34D1F8420D32B7BCB899DC424BDBAB62C960FE4A11F534F83E429230720D9C821547E3FB303B36884C285FBCDE9DEF5278A10408A6F9E3C682C4FCF8296F050E -ct = 1BAD4B9ED61F1069BE5892244EBFF7126496477860F990F74AFD67263AA6E0C28BFD10AD10C4DC68ADDA0668180E21203B506AAE9340FA648A55BBC98AA32F4C0D9815C9EB69812803CB1869832527C8495C3756045D4879F47E270A5687907D1461C65DF83BE7E9B2366532308C56AE2ACD6E5D932BDA099068E5548521D73CCB0D97A792E6A5B28C6E13C2C4AB8088432384991F9F1B6C78453226815B5204EE5EAFBBDE84D0A90AE19B85C818069726EE873E5D789DE7E9CC8B3D28CB9DC3BBAE8280697AE452D7D380BB2D4313C1890E91608655BDD0FFE1ACA69CE08C9011BF9E123C8A000EFD8C359F6B5DE52561C01E0EAAEC7FA66B6B7F3B26AC2CECCB35A9A694255AED7DFB63B7C7E43BD213690D24410126FF2282767A5F1E0346DC6DE1FEE06023AC12C672EB0AF8C6FC3ADBE10F9A6B3002F9241CB27975120C7E1686A212C17514E6310E48F99A7DED0FDF0A0BB0E31495E0E7E0D3BAF7C048CBE1AA03F3C4B783470083D6932724527DAA29052FBDB369AF3C23FA4C8160DE3DF62B33A21918D9CC0F8000AF3D0BB6C6CD -ss = 7D5AFA784F3C460498AAA1782428C25E4C3DC97B6F7D3125 - -count = 8 -seed = CBE5161E8DE02DDA7DE204AEB0FBB4CA81344BA8C30FE357A4664E5D2988A03B64184D7DC69F8D367550E5FEA0876D41 -pk = F25AA453B8CDE92A570B0C6E287AF984BED7ABE279F1DC437C3EBACAA7A09C94ED931D182BE098A29D99395037024B950EB6A8162ED59B3974A5EF7E1CCD32A46EB8C8D0B8A648EEEB23D81CF93EA78E85222671E17FC677EC2D33E910648A500C4472329E0717A17EFFEE478484AF217E65684406908FCEB93E008BF633708F63CCACD831CCBB410BB776601AD5762E65597FCCB12268D3D7B79EC9CA6EE4D217B6B36BD35679E0B37EAC9364605F0B100766F86B6FBB29F39D04580B232158A797786223F97C0720BDF934B163600C470A4ADD6A522C8A7CB019BA3B6D7F85BEAA9DB879993B7A83B0E49FF5127B649BB232DDB6DA1DDDB043FB0342753C5529748687DFC247E73164F9C53A418B572A52F7877B76A4DB33EE2C07E045C38B1F4F02418374AD2B930FC69D7BEA8FE23F2E2A178AB898846C3214B6F4BFF53ADD8C73A7F21EE5C84BFB178A393F7918F8B2E6D2E92795670B6A500BF42CF8B26B90211F2556A25BB40749DC9A1D723A1A7AA65BA7150A618422 -sk = 0610678FF4DC3128E1619F915DC192C220F8FAD94DA1943BDA1804DDB5AA9B1C6A47A98F8505A49BAE2AFFDE5FE75E69E828E546A6771004F25AA453B8CDE92A570B0C6E287AF984BED7ABE279F1DC437C3EBACAA7A09C94ED931D182BE098A29D99395037024B950EB6A8162ED59B3974A5EF7E1CCD32A46EB8C8D0B8A648EEEB23D81CF93EA78E85222671E17FC677EC2D33E910648A500C4472329E0717A17EFFEE478484AF217E65684406908FCEB93E008BF633708F63CCACD831CCBB410BB776601AD5762E65597FCCB12268D3D7B79EC9CA6EE4D217B6B36BD35679E0B37EAC9364605F0B100766F86B6FBB29F39D04580B232158A797786223F97C0720BDF934B163600C470A4ADD6A522C8A7CB019BA3B6D7F85BEAA9DB879993B7A83B0E49FF5127B649BB232DDB6DA1DDDB043FB0342753C5529748687DFC247E73164F9C53A418B572A52F7877B76A4DB33EE2C07E045C38B1F4F02418374AD2B930FC69D7BEA8FE23F2E2A178AB898846C3214B6F4BFF53ADD8C73A7F21EE5C84BFB178A393F7918F8B2E6D2E92795670B6A500BF42CF8B26B90211F2556A25BB40749DC9A1D723A1A7AA65BA7150A618422 -ct = B4944ED66A0ABB3791224164D2634AE2709CA5E85FFC4524009AE5CD573A36A9A5F6A87179CF63332A2B8621E5D6C96954F7CE778D5822812B99B3F2E08E3FEA74B9CFEC69C1195CF516AC83FD9AC8DE93D786E17248C8B1E8F19DE0D4E8D95D9644F36914A2C725FF35A09A975362FD87E8AD114FD40B3C7FC15D607F00FDBB332951CE21A784D523C5FD0A9B6BFE49707292CD035809B8483688C3D3B5A48F00DCCB2962032D3CC71CC9F1BC1EF908ACFF95E3CA2AE7623FF1FE2C0AF070EFC462C6933393569CF0C51B3C03CCF839B17218895D3D2884883AA66F6FD47759F140357C7D94D02CDD0686A8FE40ADCE40475587A630BAE04B50F71F9122CA51ADFAB2F271C6CC1C42F1276F8813A86161A4E2408F6DE204FEB62489F02E21F93F543BEFF07B2DE3B899627588BF362599629F7D6B0A8F23FDC62107056BA2ABE227798B53B26FAE0150C87252941136534791D4AE8C2224B0FD569D88FC9A00E41C8F0DEA3BAC2A378DBBE7B9342823F2B7317307BED7A2D8295AA616A63A2EB997F3E3A3E064164837325F2AE29C0F9519 -ss = AD7F7BACCD3229AD8F3B853754F8AFBEE4975C7865EB3980 - -count = 9 -seed = B4663A7A9883386A2AE4CBD93787E247BF26087E3826D1B8DBEB679E49C0BB286E114F0E9F42F61F63DEC42B4F974846 -pk = C2253435EF15A253726C3CDC6CCC2748FE6DA1EE0572A99BCE178C2EDE54BFDEADBAA468D54E1B85DF4113D3B01BA9CEC0406E78FB4769F5BB3B968959D12FF24E3DAC26990FB8D60C332478D3441CD07A8408A5B98BBB2A212BFE8CBBECCD80FCCD0DFFDAF25F7085D42DD19DA677C1BECBD47EB01ABCB546488D7C9C249C185F114C6EB3A90A218EC3ACF66775FD6BFE70B885594ADC3CD448497215BF99228C61205AD1CBAB1A75ED9043D792D03A8C92D4BB27828C6F39BB701207B68629D85761B31E1EB8F61350CB692441230E235B329ED5B42FCABCF4B04269C18F33E4E6AAB10FBF775ED4C8B57E14176762AD7D7C547F85A06F5616263534AB936625D5EAF46478E11CB8C67B482918E1006DB403128E138E94FF61DD3354A36E1AA66194B3437A47C3FD7B0439455F365ECEA9A45256206BBE954101AF20ED537D2FBC8CB0947610D52E8635661A60B4CD262A8F388A32FDDC123903C636FC9A58CDF343B635685D13E49734BD4DD7A6B31828FD9A7E3488DB8924 -sk = D322D56D8EF067BA1F24C92492B9C56DF3A6EF54A304ADC156047447B810CC094D400AB204CF9AE71E3AFA68B88586ECB6498C68AC0E5109C2253435EF15A253726C3CDC6CCC2748FE6DA1EE0572A99BCE178C2EDE54BFDEADBAA468D54E1B85DF4113D3B01BA9CEC0406E78FB4769F5BB3B968959D12FF24E3DAC26990FB8D60C332478D3441CD07A8408A5B98BBB2A212BFE8CBBECCD80FCCD0DFFDAF25F7085D42DD19DA677C1BECBD47EB01ABCB546488D7C9C249C185F114C6EB3A90A218EC3ACF66775FD6BFE70B885594ADC3CD448497215BF99228C61205AD1CBAB1A75ED9043D792D03A8C92D4BB27828C6F39BB701207B68629D85761B31E1EB8F61350CB692441230E235B329ED5B42FCABCF4B04269C18F33E4E6AAB10FBF775ED4C8B57E14176762AD7D7C547F85A06F5616263534AB936625D5EAF46478E11CB8C67B482918E1006DB403128E138E94FF61DD3354A36E1AA66194B3437A47C3FD7B0439455F365ECEA9A45256206BBE954101AF20ED537D2FBC8CB0947610D52E8635661A60B4CD262A8F388A32FDDC123903C636FC9A58CDF343B635685D13E49734BD4DD7A6B31828FD9A7E3488DB8924 -ct = 2A2F7F05143156B646B007D5A4C8B387D4A7B058C40BA943291FAA94616070BC87608E5611D39EEA64B9FDFCF5206548995BBD74A36EF70DC8D27D6BA4581924F163940C6DD921365F2B710DE577F9688E5D4D137B8B53C73BA07D6CA176A68F2C306F7D03B1A2DEEE16F7C294DB369889591F91F5A15A285D35FD84D63CCF80B3588AF8E676F32EB0171001B92C8F08E9FF8052796C7F3AA7BF4EB2C497AF8F67E7058CEDAC9B181B014B25DEC0AD27C30FECDBABE676BA1EB4915C3C9FFC823600FCBC42A7D6F201C67BEE9E5710C347B930EBACE47DA8F79E9C93EDD5B566DE630B400F235B4DA5223CD35CF89AAC6468ABA0D46DC2805359FB10C4266613145A0A292135D663919B86229BC3CE95662A1B957D18BB01D322C6B608BF2ACC93C684DF1FAEE7BBF6D259F8ACB7FFEF9E16806983212CF26FCB20C92A8603B572504F83666CDC08600F8027F9B821F8A2F159FCC931D974F1D32E543CAB29A68995AB9AD1481D4273329F465DC614BE638B7C5D3A5BDC8B4B1BE076C311DFC2987FAD74C04B33BCD071B54ACA0FD32B10BF -ss = BB5168A89FE38D502434B5793D857FDA3422DCCFBDD75558 - -count = 10 -seed = 980D0BA7C8F8B23D0E948A6029FF2659810EA1360064663A8994D0333C8543EE5FF5D6D5C9ACF446E61DC464F792B9D3 -pk = CA92F5A8558F4CAB6038416372906D1337A34FD4C457648923BA46AE81C1053408EE0683A47BA004E23741C1DF25CF089DFA408D00A7F39061156CBDA64B358076A74E1EA93E3826CD9380090CBC8B7481765403916FB922AFAB1AE83F2C2DEC68A64C7957C237BC76449478F00BA6ADE75DFA2F675004E82D1C0076E83D7AAB6E2E02EC1442C013BD25E08CA574A6E4B50CAD1904916289CAC2F36201739D08647BCF123F8A1D63FD80282DFAF48957A7732FACA6FADA73BC8560A13D15FCEACA788279D2C9ABEA38B09747EBE2CB419DBF07867063959FFBB767C80246AE8E4F2E70DDC028477F562F30531F4735E42E91D09B72C257B8A8EC9F06CE118C2CE07FF6C27AE93D4E542341AF03354A23964FD451C6D222BD23545B0382F9538633FEA7E0607A9096E663D810742DF9D5C6FB762A9B739DDB02861E27CBF3C6F860B5E1CC0C115620DBD0F5CD0187035E5048AD0A09808C32CC21A2200174243A580EF3865AF885B0929DF9D052EB3DE9DBDE09821D07C8DD4D02 -sk = 2F1D8A3BEBB34540324B9485FDF3D5BE3B858F544ABC3FC68D6C42E7270EE2B77B6045385F3D175984A0E260363166C73B0C70C971644303CA92F5A8558F4CAB6038416372906D1337A34FD4C457648923BA46AE81C1053408EE0683A47BA004E23741C1DF25CF089DFA408D00A7F39061156CBDA64B358076A74E1EA93E3826CD9380090CBC8B7481765403916FB922AFAB1AE83F2C2DEC68A64C7957C237BC76449478F00BA6ADE75DFA2F675004E82D1C0076E83D7AAB6E2E02EC1442C013BD25E08CA574A6E4B50CAD1904916289CAC2F36201739D08647BCF123F8A1D63FD80282DFAF48957A7732FACA6FADA73BC8560A13D15FCEACA788279D2C9ABEA38B09747EBE2CB419DBF07867063959FFBB767C80246AE8E4F2E70DDC028477F562F30531F4735E42E91D09B72C257B8A8EC9F06CE118C2CE07FF6C27AE93D4E542341AF03354A23964FD451C6D222BD23545B0382F9538633FEA7E0607A9096E663D810742DF9D5C6FB762A9B739DDB02861E27CBF3C6F860B5E1CC0C115620DBD0F5CD0187035E5048AD0A09808C32CC21A2200174243A580EF3865AF885B0929DF9D052EB3DE9DBDE09821D07C8DD4D02 -ct = FDA0BCEE27F3F18C59E58F91A3BFDFC1E5742F47BCF83C44566D612B82B9F0243489AD004242904A08B38E41C27C2B32B644F918C16418AA986152C7F3D0080CA59C4B2A4CB2C28B4813DC8FB8CEA29DD672FC6C7766012A226BD49EC289AB193FA656306F7975305014B445E84AD787DAA402FBBB9CBF55171CBBD8BA163027AAA09C0F76C2EF49CE2AC9EC0A6EC088E871162834FFCF8B0A9536312740EC83BE786AE4A834977BB1BC169393FB1D14E13239E98CD1767AF391F5E322363AEB34C9D926A578616C63797E55A0AA34B3CB7BC820888512E5B14BDD70C63E806C4D24EC3694AADC5DA2D444E9F992EFB04629DEC9E37592BEE0F4AD325AB622CEA7ABAC8E803F718B2709FB783DA81F77907496CFAEB719FC99E516AFECE3D83A9EF275500BB30CB54ACF85ECE04C8CC4FFEF90087761C73395A23F689F9BE64CB6A09C4A440A3A481490B5337A653E623329F96E6940F5E7BADCD5A8A471873CC7313C89D1F5DE2E3611C3DFB48E9E4DC2F83EDF82888FAB1239394A93AF843108522E46A11824F5463A39E68FBC3569AD41 -ss = E889EDBF6075EFCC85A5ACEADAAE48EF56528C64A974A837 - -count = 11 -seed = 6C029462CA42ED520F10A579F52687101105E0B90C6E7BFA582A4C112B579D5AD0A0ABD38F72ABCFDCAAF5893A112BDC -pk = F082E53E07B4F283BE0BC58FA3F3C514A58618519478EF0FF5631D523AFF95DC7B7AA80ABE62474782C2C6492D5C2BCB7C27C51B0EC139F9F7B4B0090F4E3B1A4FFC7E0E7521703780271D84543002C8BC3D21435F1F1214DB2CB6E272FD3727DD8D3EDAA44964F788DCB9626B1D9DC103B66EAB55A8E099A7E1A0B91D1800CA6BC21D28F54723369023B5E8B7B919281EF59F15744C9BE99C4905A267F574297369D08909A63FC280F8119E83E970B2FE6AFDAE273E7CA99127684F2FD85CEF55AB79C1F6BC5CA61F690D210B61819117AD1345B41CC3001005F808918E81C3056964F2150F828E70A03BD86B8E57554A17662AEE80411999724B16CA19C14C6EAAE89F77AA113CE9D011376E565354FDDFCB1C0DF2259EC1CA3A2A92D44737647CD9854D6D3D01A2E4D09527AA8EDFC500E5F30236DD1D48960146DF9EFD4FD208D13AC386F1F0A2FFA6900EF2A5EC81D00891DFD88DB8286C731DE4A62DA7D584FFF4968DEE7A4D46F75E1019310E3B2BD0F99DC736772702 -sk = 31BEDA3462627F601CBC56F3DDF4424E1529C04737EF0EF2812083BFA3B670E3EAF9B443702FB6DB16AC1197656BBD61A8E25ED523B8D105F082E53E07B4F283BE0BC58FA3F3C514A58618519478EF0FF5631D523AFF95DC7B7AA80ABE62474782C2C6492D5C2BCB7C27C51B0EC139F9F7B4B0090F4E3B1A4FFC7E0E7521703780271D84543002C8BC3D21435F1F1214DB2CB6E272FD3727DD8D3EDAA44964F788DCB9626B1D9DC103B66EAB55A8E099A7E1A0B91D1800CA6BC21D28F54723369023B5E8B7B919281EF59F15744C9BE99C4905A267F574297369D08909A63FC280F8119E83E970B2FE6AFDAE273E7CA99127684F2FD85CEF55AB79C1F6BC5CA61F690D210B61819117AD1345B41CC3001005F808918E81C3056964F2150F828E70A03BD86B8E57554A17662AEE80411999724B16CA19C14C6EAAE89F77AA113CE9D011376E565354FDDFCB1C0DF2259EC1CA3A2A92D44737647CD9854D6D3D01A2E4D09527AA8EDFC500E5F30236DD1D48960146DF9EFD4FD208D13AC386F1F0A2FFA6900EF2A5EC81D00891DFD88DB8286C731DE4A62DA7D584FFF4968DEE7A4D46F75E1019310E3B2BD0F99DC736772702 -ct = 8B1484EED557B154800A99F1E82A707AB16C60478C3ADBC8BB5BB0C28B161005602BDB87B8AB662C6A5C177E062E6C05FA3A9D67DEC1AB9C739FF19B501C01ED84BD10AAB12C3BEA8CB592BF1C958A8FA68B425F4801DBECA262E8BB7C6EB18E50DEC9B9755AF094AA03F4F0F78E571180FD3FFBB2CB7FDA34A07C9F842223878D4E0A381756C862E19E89C2336F50F3EF6E1913BBC2F356D8D47DE52C3516A420AF32065159D030616567E4D072E83315716A4D69F1801B42CADA963DA6CE2B3565232BEB6299824C64C32C87FFBB79EA453F9E3076AE222BFEBA21ECB5C5270A2147E4BC1E4AE55896E059CAABF943A7DB7A34B0C5AB09BA0D8922AE4E52123C8948CCE201AAA3938D70B4FAFCED7A87F9930E8960A46C38B5AB20D69CF02D0B5365773293554DC346335B36D20DCC06F4F28F4D962E64C5091AD741EAD5820F4ACB3AB72553A5E9CB05E31698F9CA67B9A120B55E31666B1B80BF170D6149646C1DABE3CE9B9B223CDDCDA94B82A1A22145F64EC05ACB8B2DEF4EF13AB37E405A1CD8E985EE56CB3123E6B3FB3B811534 -ss = 0BFB00221273D530945D57C734E626B5D744F3FE2D959B9A - -count = 12 -seed = DB00120937570D62331F4C3F19A10465231EFF46465CDEE336A0D46AA1E7493DF80F18617F9FFD0476CF7784A403EF4F -pk = 7E4A199764C8179543C0F781581F4BAB1651B53F096DE628775982B863479883214F12C2D1C975D6988C3F0DF06AFE875F1BEDE26867B184F0D8D5328DFC3A03C5390EB943361CF9A8D78C56070CC7FE167E1EB8B0FD6098778C6D9F5E7CC0B40ECDB65E38C2B4CD29FC2D5D30528422CBCF8840FE4E73FFB7732E9B0725CDDFD0AC4F449E52813E95CA1B0DC3DC102A671233F79DFC9338A946A99D7D370E8A31F4C53FF7E90CB8E6579649F82DA0463886F86C029E270A206094D717A95EF0C8D465A4CD9F75AB009C0A9AAC3D588C4C626FEF1F89220E78ED4F7AF19B81C20512344BD45E4B7B228E376A64A00716AE28A6B9D8401497D02BA71577251896B85BF5070449EC7265E7B05451B29E0567F3E59B005350D20AA08CD89C45FB7A0F0334EAC78C68C6FDB688EE7249497861BDF1D3A97D234C2FFF1DDF2693EB7E25AA235F4CC50EAECC52BC4542124DE1B7C23F1B9DD14E94C2DC6F2CC3153BD25E7F0AE5F7591C8A1426A6FB3D841A1B19715D1BDFFECD61A906 -sk = CBDFF028766D558AF4466EF14043A1A9CF765F7748C63CC08E9A30597E4B52FFA87A54B83C91D12A5E9C2CD90FCAC2C11B3A348240411A0C7E4A199764C8179543C0F781581F4BAB1651B53F096DE628775982B863479883214F12C2D1C975D6988C3F0DF06AFE875F1BEDE26867B184F0D8D5328DFC3A03C5390EB943361CF9A8D78C56070CC7FE167E1EB8B0FD6098778C6D9F5E7CC0B40ECDB65E38C2B4CD29FC2D5D30528422CBCF8840FE4E73FFB7732E9B0725CDDFD0AC4F449E52813E95CA1B0DC3DC102A671233F79DFC9338A946A99D7D370E8A31F4C53FF7E90CB8E6579649F82DA0463886F86C029E270A206094D717A95EF0C8D465A4CD9F75AB009C0A9AAC3D588C4C626FEF1F89220E78ED4F7AF19B81C20512344BD45E4B7B228E376A64A00716AE28A6B9D8401497D02BA71577251896B85BF5070449EC7265E7B05451B29E0567F3E59B005350D20AA08CD89C45FB7A0F0334EAC78C68C6FDB688EE7249497861BDF1D3A97D234C2FFF1DDF2693EB7E25AA235F4CC50EAECC52BC4542124DE1B7C23F1B9DD14E94C2DC6F2CC3153BD25E7F0AE5F7591C8A1426A6FB3D841A1B19715D1BDFFECD61A906 -ct = 78E0C28EDD5A14CBD9732A9A329AB0CD620BF2DF7394FF7E8DE4BB0F3C10F336FA4BD16255EED2A85F5FFE2A3A0190A8CADEE8CFF6CC355AC94BACC144CE0EA7A1A72698B75308A922D94CBEF3B261063FE03E7890B6519E69142CF5D88F9536DA8A914A4082D724DACEEB38521CA744E3CCA2737A1DDBE1951D8EA77A14AF040ECD1EF5DC25CD2110BEE1EE80CE953743D8151538C7150CA1B6BE445779CE03F521CC5D146CF7C77BE3ED3E438B6078FCCC230A1923CEDABBBDD04F21B29F8A83E163FF8542982C259F7E7A6A449B0EF2E71A03EA4050DDA3FAC39EFE944B43DC7BE820A2958C4E2A63974C61C3E6F8DE2F801FAE7A250D2323D00FE35A1CA08972A5854493CD79647EC3A409DF8DE4B9DB3EBBC9B16BB291895E6652F33D02D469CD322909243FFC24F7F0B2E4B55B8CA5698CD33EC0CA893109D4267A18A4001D068BB3A5CD8EDEEAEDD3E70621B947E6F38D6D5CD4DBF484302D6B0E99E81A7B6DEEE1EB2BF9E4E1F2BC670F7696CA226F017D1D368F3B39773BDF38491A9C806C09058A67C326003FC45DB8580B57CA -ss = 9701C45E2E2383F51C50E6947D7C77771C93D856199A7D80 - -count = 13 -seed = BD26C0B9A33E3B9B4C5D7EA32D5BD1FC371015BE163C86F584E49BFD5362C8D8341161CD1308115B2A03B7E5EADDD418 -pk = 46F284CFA610B61A563F13E30519DD6BF8F43D41F68BB064C8BD17B345F3406E0E40C135B409F81F769B7B13DA0DCF3B86B250E59721C874A8798B938BB635C06B1BD51A135A1C0BCEFE90E1969546BAB031B7F9E41E8631B969CAF16D06FF864D139DEF9F68317E7B4BE3E085AEC05A128C88593B4022F721D340FC65284A9F215B3550E7AA3171CD54982FD689D322DFF78D1D709AD893B3A23A217701A7F4D2F41C28465300597A5836BEC3273A198C787D6B93C777006D804560107CB8F0385718A3D55F2963D6D26D010924D22999F1699C07FCF7D833B27F791518AC6C7E8EB369BE81AC5508E44BD3AE50B5DB6DED7898600B066BA9EED6042ACE4FBC2F4511621F54D9BB7370D80CC304FCBAC19DAF1F1C2F9619DD3B51009A2D9E154780C92C656088F55198D6650E996BBE00712D4AD1481642E44E3A18A17155D104726D782E7C9F891736658210864F45B17BAAFDC903D388E8503B7C0FA3533C3831A24C80C42ED8769E0000D06FD1FB748DE31E5E3E07340C04 -sk = 4C04310BEA66305C6CA8BA6B8F61CA96257A67663AFC11768AEC87A9A79204CEE2986867A2906EB851B734B8B22B91D6749B1A5F07C44E0B46F284CFA610B61A563F13E30519DD6BF8F43D41F68BB064C8BD17B345F3406E0E40C135B409F81F769B7B13DA0DCF3B86B250E59721C874A8798B938BB635C06B1BD51A135A1C0BCEFE90E1969546BAB031B7F9E41E8631B969CAF16D06FF864D139DEF9F68317E7B4BE3E085AEC05A128C88593B4022F721D340FC65284A9F215B3550E7AA3171CD54982FD689D322DFF78D1D709AD893B3A23A217701A7F4D2F41C28465300597A5836BEC3273A198C787D6B93C777006D804560107CB8F0385718A3D55F2963D6D26D010924D22999F1699C07FCF7D833B27F791518AC6C7E8EB369BE81AC5508E44BD3AE50B5DB6DED7898600B066BA9EED6042ACE4FBC2F4511621F54D9BB7370D80CC304FCBAC19DAF1F1C2F9619DD3B51009A2D9E154780C92C656088F55198D6650E996BBE00712D4AD1481642E44E3A18A17155D104726D782E7C9F891736658210864F45B17BAAFDC903D388E8503B7C0FA3533C3831A24C80C42ED8769E0000D06FD1FB748DE31E5E3E07340C04 -ct = 1F01A47FB2A1282302175180948145041628F94B01C70BF0F6DDCA7F1148BC64D38406F7F510F61EFABAB873ACFD88214F261009B1A4690F2A62BED06EDD2D12DB1AFE2B971F3D77871A270272BD00AC6F39CC983333C84C5CCCDB14DE47503EB17A5EF17FDF70C2882D442B8D7947A1D0637ED7BB94651A07EF9AC0870EFF4BB43E5AEC6C699280CA1821C7EB8591ACAE056B6B8483B2DC99017654B79E8D1D23A7903E3B2F578DCD9725CA68A673D8D0C16E9CF374D14C2C26A6BE2AA5BD48FD4B19818870FEB4317DB65739C115FDA4E99915C8E1C198BB6F4E0FD9D80F06B08638C0BA164F64B86D5C13E2505D285354E5C1341DDC288B22BF1649D6EE07BF1A521757ADAB6EC3374A59068279D57094AD85082A53789D98E610A46B7095E61567283CF0DA206D21A53BF5649830CC23A3BD296ABA0B36513D96F19BF099B3A9D366C64C412B79015C6AF0F2F4AA34C323187E841EAF1A532635875D06A614B6175636F32D442BADF1513AE8CCDF13FB3337036C42F4250E56B8F70DFB8F9D51C5BC899DC935A7EB3C13B6FD66961AAA -ss = 87821E5176B41FF8B7516EBBF94124E2EE89911B41553898 - -count = 14 -seed = E2819EF86853BCA1B9DEE7EE1C1619988964F9A913E635AACF0D96CA6E0300D084329DABD8F149E24176D22757404260 -pk = 899C4E13C8EC0E8D6D2DAAE11FEF98BB82626B50389C198B2539EDAE55867C1DD44B43FD532C34DCA1EB6734E2BA18CD9C1233F46B3FA8E7B517CFE67FAE1D6D01510D23DBCA74D84DD9FFDF6B35944465900B336EA79AFE53F05583D649AC67722C277E9D34B6C53243FD5136E6C571E69C9F649967C1DD9DB4F6C5821F18FCECBD2CE0A9604D9FC27A19E22DDFCDD5CFF48E4A9705D5736098A1EBED32C6B1618871B50A7064E7F97A4FDA4106769A789C2BF9A593559B2C1CCA503F2473CC2FA7E62040ABF19D0288CC198113906F20564D02F850DBB695B8D0259BDE8ADE65B2AD7C541009CE6383B8BAE19628DD6DC4BEE7093471D2B916010EEABD13F42A7C9B041A976E8A48A7C3FEC40E49E4F745183D153924254F11603E571731F7877F5B4567DC46A6C178EF59856B3290FB053540C265104565EE149F7F566D508211B0F64D3B9D6AD0E2CD62BDA6DD923A05753031E7EE4F8D24B176DDEAFDDB964FAF340BFA9C1698A926ECC8999712F2660C1C764F334CFC1F -sk = 38A0D5F41D7DC1896EFD1B45B0485634CEF149828751B960A2ACF359556DF4A2ABAEB9DCEE945829BEB71185B4D6BD18B76E5668F253380A899C4E13C8EC0E8D6D2DAAE11FEF98BB82626B50389C198B2539EDAE55867C1DD44B43FD532C34DCA1EB6734E2BA18CD9C1233F46B3FA8E7B517CFE67FAE1D6D01510D23DBCA74D84DD9FFDF6B35944465900B336EA79AFE53F05583D649AC67722C277E9D34B6C53243FD5136E6C571E69C9F649967C1DD9DB4F6C5821F18FCECBD2CE0A9604D9FC27A19E22DDFCDD5CFF48E4A9705D5736098A1EBED32C6B1618871B50A7064E7F97A4FDA4106769A789C2BF9A593559B2C1CCA503F2473CC2FA7E62040ABF19D0288CC198113906F20564D02F850DBB695B8D0259BDE8ADE65B2AD7C541009CE6383B8BAE19628DD6DC4BEE7093471D2B916010EEABD13F42A7C9B041A976E8A48A7C3FEC40E49E4F745183D153924254F11603E571731F7877F5B4567DC46A6C178EF59856B3290FB053540C265104565EE149F7F566D508211B0F64D3B9D6AD0E2CD62BDA6DD923A05753031E7EE4F8D24B176DDEAFDDB964FAF340BFA9C1698A926ECC8999712F2660C1C764F334CFC1F -ct = E93B4D83DBAE38848FEDA662B665B44A4D071BE399EE432DF83A4DC62D11D473B4A544148392675354254C56A39D62B753433A519D09D48F21A843977C57227BE664ADFE662006FF5C5D42F2FFA66710AE196EAE810C4105E3BFB28A3ABB82E8CD336F30DA78C017821B9531EC328AD6AB537F039AEE48A62D5BFF8B2F18382E5D248ECE7FD5BE907832A7330FC29408B40DE3848220576A11DE5406E28DD735C9C0C98F0A636E6F5DCA77DE4F552E85B31FE021D754E8D284756E1140D896F2657146A557977753D679B8A6D56E166DABFD93678C65F374219B85ED21BE8ED10B355913A6E15217D1CFBC70CE0F4D5CF72C53AA75884FA37130000225361E4094D017DC1920A6DFB2AF4C6F27AC3A2F0508B556CA0D2613493AE7B5072B56860EC86362F9BE46CA74F7D0875E7BC060ADE85E7D2F1E100AA90C28B207D5EF8FBFC9B20DC0E05EF3E2E9B6B72A348019224F7CB93A241B96ACB0EEE3389D124CEE979CCF3D3EB3764362EDE5C501D3EE88691B5B2D07195F780CFB38A3E7AF7680E8C1ADCE22D210A15E4C682D55DE05A2E0 -ss = 40052343FF691A8F901C248C9D19CAADCEBA83B499571B10 - -count = 15 -seed = 669C4EF8A051CE201DA65FC4BC34D398EC1F806276FC5D987AD71D93BC12DC8F107B58BE6E8422A0795C88CB9A0E7488 -pk = 09E755C966DC06215F84CF51E74F1E1DFB7EEF4DBDA390CE4DE4AAD9EEA5CF40ACEC87E31D03F0D7E1AAB5B714782593DC8D2237BB2675A0C3ED59577AD4308CF6B26F49E09FBA77606EA2F5ECDA17ED1C5B04C88AF6FD5350B75F639B9C9B24BF446BCC0F903EDE4E7BC2A74FE7227B7D2F86E4DEC2CEAF1F1A4D55700F843C042A3F2AAD8E5EF5DBA29CE3CAE0065B9FCE5829C10A669C66690073CE0F28221BDA35309135C507919AD3491122A56B5AC14388A8BC466CFC0172C80A5600545A78130EE7CFCA50F253A7EFF3ADE52F38ADF2BB56D23AD6B9A86A4AA984BF2393410F205F8A4EB75197CF51E78B87E2E451E044FC6B38AA12EE450D4CA5AF80250FFC7B15D16FE26EAA08C6492C879A06304400AA7EC632050E9DAA92DD886E8F7EE1C77FA6EE10ED312E369223426C1BB91FEAE77BC6E5AF9E133550B88C7F1EA21D9A1B22B22F49DDD096BA6E87ED84DF8E1C9013A3993D2FB459A972958CA7184620C6B1E726A5356F8B8C1C5F6754F756D17BBF0F1DE411 -sk = 97B5665676E59E3538EBADAA8CD50DF1F9FDA1502D9894C6DF05318B5F655EFE36F1B678CF4B875108A18DB2FA312261CAF839F84BD9560509E755C966DC06215F84CF51E74F1E1DFB7EEF4DBDA390CE4DE4AAD9EEA5CF40ACEC87E31D03F0D7E1AAB5B714782593DC8D2237BB2675A0C3ED59577AD4308CF6B26F49E09FBA77606EA2F5ECDA17ED1C5B04C88AF6FD5350B75F639B9C9B24BF446BCC0F903EDE4E7BC2A74FE7227B7D2F86E4DEC2CEAF1F1A4D55700F843C042A3F2AAD8E5EF5DBA29CE3CAE0065B9FCE5829C10A669C66690073CE0F28221BDA35309135C507919AD3491122A56B5AC14388A8BC466CFC0172C80A5600545A78130EE7CFCA50F253A7EFF3ADE52F38ADF2BB56D23AD6B9A86A4AA984BF2393410F205F8A4EB75197CF51E78B87E2E451E044FC6B38AA12EE450D4CA5AF80250FFC7B15D16FE26EAA08C6492C879A06304400AA7EC632050E9DAA92DD886E8F7EE1C77FA6EE10ED312E369223426C1BB91FEAE77BC6E5AF9E133550B88C7F1EA21D9A1B22B22F49DDD096BA6E87ED84DF8E1C9013A3993D2FB459A972958CA7184620C6B1E726A5356F8B8C1C5F6754F756D17BBF0F1DE411 -ct = F63033C0AA277B688966223BBF280AE264F8E1918986D9557949CC936DCBEDB546C54042860ACE579543F3DD8CB7A63F785A4D46F602A1A62F73EDB9D51B07A0BA15EA074191FC880D314E02FB045EC2D626ED5EC9591FE4D3C623721BBE8AA065EA9436AE299CDB91F2284A1FCF4A0DC61E87C3DE8668CC0D022692FF350F22E80947CDB77234BAB3B79DA07B116A9EF85979BFC43DAD6944DBA64CC6699EC5F269692B9FEFEFC8B3A72B3508C0C8BDC307A69BD79C04799BFBF0A32C8E26446275CF336F15545A4C68D6B3CEC77985AD0D5A546590C2A80C5EB6EBB2594CEB0C3EF55C871486525EDB918A44BDB628D03C9CEFDCC5AB1374147D0DA5F506778229076C94B112E46D5A522204098ED58254338C1A72612249BAFB518A6543A80E2D5497AE5CA4702D07A48142C932E5C585A56AAF274D45F11D12A8EDAFE9E827FB316F148C1075C110B94B515C62A21FCF4FF463BBA0936E31BDC60264548B514EB85EF6118D3DE7567C9BC8C59E8D2F5FC491120EBDA08D08588D7147F6312BCBE81FA45A2DB67F2E4DDF0A98528CBEC4 -ss = 78720FFAE156234DD39387DE9A82199740E064F564E43329 - -count = 16 -seed = 9DEBCCFE818F6B5204DB4EA09C03EC9A19DCF1629C1527685B8A29776BB1DAAEC45F8ABF8F0ADC9A8C8BD6E2DF6D8048 -pk = 66540B0B8ECC7A013E98C10AB75F091FC0804821C984B9325C5751AF81D4FA1AE4B5967287EC424700862135609A16A9D8B3D8AF7F9F9F01E9983FB0A66A17AE297E8C5D7F3532792E338E86317E5E77EBE663CF39767F0611038B83CB8E20A7845988B3A2942EF6D550AE386F19A122EE0B7440DECD83FE153E2E85F33AC52F8BB17043936F56BDBF655D4D80A033A1B0675A776D851DD6E81AD2A3AFE7C4736DACF60AED84F5E4757FFA6DAFF062CAE256747E72DE1DE36EE90E6327F1457C265CE9B90DAB458C9093FDAEB624A7870BE5012C13C77BFB6775A2FA66075B7676457C5909CE9134A27B22B76A2608FA254C90D90CD4B632C490AE1B64BAAC2700B7D263F593B1D69F60EA72F6FF00C78EAC59C0E6F253C8F8E2E89860D2858B559F1286A05C5161DA20C5FA6B759913F436ACEBE46901BF27F90B99D76E1963D511F0C343AF99627C11EC0B209E63BC79CCA372D137D1C784138E0E998E0214242FF2A8AF51915DA75FCBC815E6E26C6271D8E11359E469482B -sk = EF99224A03A85A46EF115474EC5B5D620DA6795D6EFCCA4CDF7D92DDA83E6B2EF4CCE08C9134563063068A196D7B1A1A13623E48AE12520E66540B0B8ECC7A013E98C10AB75F091FC0804821C984B9325C5751AF81D4FA1AE4B5967287EC424700862135609A16A9D8B3D8AF7F9F9F01E9983FB0A66A17AE297E8C5D7F3532792E338E86317E5E77EBE663CF39767F0611038B83CB8E20A7845988B3A2942EF6D550AE386F19A122EE0B7440DECD83FE153E2E85F33AC52F8BB17043936F56BDBF655D4D80A033A1B0675A776D851DD6E81AD2A3AFE7C4736DACF60AED84F5E4757FFA6DAFF062CAE256747E72DE1DE36EE90E6327F1457C265CE9B90DAB458C9093FDAEB624A7870BE5012C13C77BFB6775A2FA66075B7676457C5909CE9134A27B22B76A2608FA254C90D90CD4B632C490AE1B64BAAC2700B7D263F593B1D69F60EA72F6FF00C78EAC59C0E6F253C8F8E2E89860D2858B559F1286A05C5161DA20C5FA6B759913F436ACEBE46901BF27F90B99D76E1963D511F0C343AF99627C11EC0B209E63BC79CCA372D137D1C784138E0E998E0214242FF2A8AF51915DA75FCBC815E6E26C6271D8E11359E469482B -ct = 9679725EEAF437300EEC0CF90D8052ACDF51FA28B755444DE88FDA8BBE00CB996D3AF82B6D915B3EDAA25A162A60D7AE92F8EE89BC3D23412A81E9A2EC2234074167B44273860696E5DF7296E0F9EEF2D56771BF639E4F31B2B256300E6F5A2FFA37DA78205F47942C953404DE0AD8D22FD881E2D0FF84B1CF24126159276EBA73891FBAAA48783063BDA66500F640CAC5B42E690A2D7DF9A5AEA25E9B6BCEC49CDDBD5CF8372C08E917DFF55123370E9E231E2069F4389D4CE44EF931FE8C592F76C0BB76C7041C8B94337C858FD871F8D4314CC14BEFAC903D69EE801EA3EF54115E80E1585759880C450BE7E9E6A84A36B796FDEFBE3A8038CE1E51E5BFC55ADC0788D517670396540EAF4E986DAEFBA2AA0A8E93F600C1B81084B601F459C0B94DFF767E5D0EB271457E6C6FEA9CCA1F7F934BBCAAC3DC421EA12472FD6855DF97B9DB99D1F7858323612924CCB286FDCF97E0D56E1DB3B1BBB8ACCBCFB42A20741735A89F0ADCF6E0413C79431D12F8DD94A3882528933336D49A087EF7190C1025BA49923C901617C7B601E82B7D9F -ss = 4C6DF97FE533560C98ECC1A26A597C456B4DF521F77D2306 - -count = 17 -seed = 8098AE7A92C10F707D405F7DEA02C2EFBEF44EFA132BA8AEFE81BD45E543ECEC74F10920AE48A40B0653D63532517F2A -pk = 9E85F47B655AC8BFDC11498DDA7B702D011131F858BCA91527646B69B664880994741CF637E339F6FE3298059EFC0D75822A7A8BE0804D4E48DF22D674471E9192F369A48C3DBA2361B926244E90A860E8CAE80673D15F487C66F00BD04B600518B8D40FF93007E26DACDCE31459FD0EE63243F6237AC513AD3FF50E482577452839CD397307176DE32984D92F12E4802BB1A5620B2ED84A7E2E6FACA25698C20F1F2EB2799903241E4C99E1408A57D00141D45E6736D61A968EE9F114ABF191E8D3DECBF7D8EC8330DB9A1F4EEA470E8AC09B22E14841F7E2AFD6EF2D23D2B47C77FFF5525F373A5C8F06E3F769277A88B8EFCD345E6D97D987E5063716A274361CC49D04045C2E7A0ACF3EC7028E59DD8862E7B11598C1417385CE8BF841F6EF47A70D6194D82139F015428D1C2613D8B2A7FB565B3D0974F633A41C9DFBCE89AC6263E27F3FE6CA0E23C82853B1304F0AE71E66222151A489BFE383C608543243253C025EADAC039D62AAA49C1224FFDAD9805FD481054305 -sk = B12F6FD965EA9C5B947DB80FC60C83D5E232DCA82E7263020F6AA3E88F7FA8A96067F8CDAECEEAC90C2D0B5E277E56E9C405EC9420C302029E85F47B655AC8BFDC11498DDA7B702D011131F858BCA91527646B69B664880994741CF637E339F6FE3298059EFC0D75822A7A8BE0804D4E48DF22D674471E9192F369A48C3DBA2361B926244E90A860E8CAE80673D15F487C66F00BD04B600518B8D40FF93007E26DACDCE31459FD0EE63243F6237AC513AD3FF50E482577452839CD397307176DE32984D92F12E4802BB1A5620B2ED84A7E2E6FACA25698C20F1F2EB2799903241E4C99E1408A57D00141D45E6736D61A968EE9F114ABF191E8D3DECBF7D8EC8330DB9A1F4EEA470E8AC09B22E14841F7E2AFD6EF2D23D2B47C77FFF5525F373A5C8F06E3F769277A88B8EFCD345E6D97D987E5063716A274361CC49D04045C2E7A0ACF3EC7028E59DD8862E7B11598C1417385CE8BF841F6EF47A70D6194D82139F015428D1C2613D8B2A7FB565B3D0974F633A41C9DFBCE89AC6263E27F3FE6CA0E23C82853B1304F0AE71E66222151A489BFE383C608543243253C025EADAC039D62AAA49C1224FFDAD9805FD481054305 -ct = 6E07DB8980B9B96E9680AC098CC1219926CC89488B822C013E4DBA48576FF0BBE1D34AAE5222E8F535E5851F14120B4EADC82728FD027FE11B125ACDAD7A05A8D63C18D33E6E552291EE98329FA9467120C4ED90E47C8253248C00BB132A7FA818500F2914E0E67B3AE684DF70C2B26BF23CA99A224781E706B92983A70DE5873C1DE7324FBC69631915AB9EC299B6737C3A63F8E9BBAA132BF7F1D89A788705A4CFDEB46854E68331C6104B4505D5D21ABD380E2A38523D1B1B655629917EB5F029AA73BB358D96675AE3DE8C5E8CA4301CD0C8EE08D1E0392D84575BDD0793F1D799E5CCD3F6744749DD0B6AAAD4E54B55F9B9AAB2DC2FC128ED09ED9C6A877A7CD39A09EE01C26B3E7C2FEC3E3D760758602DA0498073E53A7997AEAE68532C1165C7A030449165D5C758F6AFCADE499F0EDB664DD8E5F6D52E078D912A105883A2FF9637CDC6A43C7823F281052970761A1088C6D6631FBF2CBC6D61202C62E9A3B91A686504ED896D3984B0F2896A150682F22FD663580C454BB2C2436A1055FAB73D3F0A32DAA53F83BE4919C007B3 -ss = 28367E5CB625250393C5614DE4D4E7DDDDD84945C815B3A7 - -count = 18 -seed = D5F23808871544E9C1D6EACE2028362B48E225312F77663E9F78CAFEB512B908CD9E25875D61A16EC615F4B8FF826856 -pk = 5A71A94E0A6A3BEA30C367C682AD51E820CF9B5C4790E5B703CF9DC8AF6004B6F68970770A2303EE49AD5ECF7F48E1DF4A1F8B214B8E8274EAD984424EA5287A257D23176FCC8E0109F6ED0310EDE51DD0D4162C56FB03976BCCA82ABC94AA85A3B7DA59989D00F4CC73D84C822E3F83C1A8BE86A244E97AD8B65BC1CB37ECCF547A1B2FFAF6369A15042B106AD8F85954FCA5868AEEFCE3BBE5F1425826BEFD3F342C14C5A3071C28936C536EADC428634EBDF2B16B0CB4FE4EBFCC1A906B4860A17B5F8E333EC4DBC4E432D788C10311B261359F2F2DF74D02350C96132140E90FB67499E6C837F49FC2A87C6E3784D19301D39F4B39B8EA19E813A60F8DB75C7BD50ECC0A5F3B2F9C1C60D46D86A9E327E3C102769720A3CDA910FD9F74CAD6885B95B50D32A26CE9D55BDF84E4C34EB4211B6751AB7E9FF31B73854537DC9F4E84781CB6FC9B11D90D1F083CB1A3DF08CFC4D24114B8C0524ED60EF93CC66CFBCA043E667AF1675CC6DB6139DB4B659021177AC63784F33C -sk = 9F52AF92CA165FDC38788F2B59BA02E01C8281FF7C1E60504F3029E1BE4E1C0258C3A22FF5B50B2674CC094BA7018DA2A61569845C17D20F5A71A94E0A6A3BEA30C367C682AD51E820CF9B5C4790E5B703CF9DC8AF6004B6F68970770A2303EE49AD5ECF7F48E1DF4A1F8B214B8E8274EAD984424EA5287A257D23176FCC8E0109F6ED0310EDE51DD0D4162C56FB03976BCCA82ABC94AA85A3B7DA59989D00F4CC73D84C822E3F83C1A8BE86A244E97AD8B65BC1CB37ECCF547A1B2FFAF6369A15042B106AD8F85954FCA5868AEEFCE3BBE5F1425826BEFD3F342C14C5A3071C28936C536EADC428634EBDF2B16B0CB4FE4EBFCC1A906B4860A17B5F8E333EC4DBC4E432D788C10311B261359F2F2DF74D02350C96132140E90FB67499E6C837F49FC2A87C6E3784D19301D39F4B39B8EA19E813A60F8DB75C7BD50ECC0A5F3B2F9C1C60D46D86A9E327E3C102769720A3CDA910FD9F74CAD6885B95B50D32A26CE9D55BDF84E4C34EB4211B6751AB7E9FF31B73854537DC9F4E84781CB6FC9B11D90D1F083CB1A3DF08CFC4D24114B8C0524ED60EF93CC66CFBCA043E667AF1675CC6DB6139DB4B659021177AC63784F33C -ct = F86AE3DB047CB5C603226D712AFAEEAAF7FF161D92142AC3C37EDB2058A72D182433BD56B254BF5BF875E95C27B155AA5D7598F64BAC8ABB5F61BF1FA71539F2A985CD3715B12464D17E1D00DA5060FEA949495EE93E9C62A48760A5B25216BB2E5AB39759AE0A8A93B873ECC1CB6C332B2CFB3DAC7F311CC0ACC05F060A82A2234C32199AE9B7C8B1D9BEA4119D70B225E6342A5B03F7317BE2299023D4EB1C8A68B3AA3B6F68DCBC460484988880CFA412CB5BB22BA7DC7046366E0AD7B437B3AA2B40F534CBA2CE233E34F80207C891091D1485239910DC92C470ED15B33C41F2780A8E8D00FD6905FD617030ED756F0E96DF80193641ADF5B00990F95E049B5CD8629033F77F9D5826B7F2C84687E3A794D369062DDF00977FCE6BA97C80A9AFBE81416D12A7E5EF4ED4A7E517D5E22E3472CBB8B8C73ECE2E797F5CBF7E4EBF49BB11502BD1933C83BC9504B2E944538CC063DB3AEAD0C45DF07AB0CD4AE68A675A89B110719A5EBE1803FFA2E3CE63FE8BFE0A18682D29F0B7B8CEBC255730DE96D760DEE491A8E7B6A7848D79770A -ss = 37F56382B810B4107E0629B8F426D77EF9425CF8C532187A - -count = 19 -seed = 822CB47BE2266E182F34546924D753A5E3369011047E6950B00BC392F8FEC19EA87C26D8021D377DF86DC76C24C5F827 -pk = A3EFF37BF2DA86E5B41B10EB6321F9F5A46898E255939587358B1083102D5021407CA4B2F4F4EE2B837FA392F4DD1BF94BBA154F56968B57CC5C8FC5B6E73412A83747FD42AA5B537D7A6BA455FA56564229596424CB9F4831A42ECAA486888C7814B6DA3441792A703836767DA0DCA522C5B166468DEFA2D4485CC2FD2D5FD4990A9154F8F0C8F3D5AEDE6139DA6C9D97ABE2E8630750F127DF2AED7C76CC3AD37C9958B966C3678188CA32319340899C64A606BE8750196DA97DE6259DC556A15939ED56349695F944F756B8075A2B1AD65F6169DC33F8B8DDE8AB2C83792442378F5A5167CD69117398AD69B719E1943F3A096701FF912B585033AACFBAC194A7522D95A6EF792C0281EE8B813BD08A2D1EEB58B0FE156CDDD683CD8D582036D6779BD03F67BCC58A1EAD7CDE649DA4D9B84F864350B739583191339D5DD469F677B463E2274F36D8E270E2301541D10CF29BF10318357BE3F8C4B60697B9EA3B7896F5BB886938CF117B26CD7D1A5D69F3E2B843C68B392D -sk = 851EA90FD3854CBF28FE39FB81F68E4B14345CF0D6EEE7EC1C0EC046899A777655233E4E1B5CA44E9AFBDC67964BFD5D5E3DBB45E60D030FA3EFF37BF2DA86E5B41B10EB6321F9F5A46898E255939587358B1083102D5021407CA4B2F4F4EE2B837FA392F4DD1BF94BBA154F56968B57CC5C8FC5B6E73412A83747FD42AA5B537D7A6BA455FA56564229596424CB9F4831A42ECAA486888C7814B6DA3441792A703836767DA0DCA522C5B166468DEFA2D4485CC2FD2D5FD4990A9154F8F0C8F3D5AEDE6139DA6C9D97ABE2E8630750F127DF2AED7C76CC3AD37C9958B966C3678188CA32319340899C64A606BE8750196DA97DE6259DC556A15939ED56349695F944F756B8075A2B1AD65F6169DC33F8B8DDE8AB2C83792442378F5A5167CD69117398AD69B719E1943F3A096701FF912B585033AACFBAC194A7522D95A6EF792C0281EE8B813BD08A2D1EEB58B0FE156CDDD683CD8D582036D6779BD03F67BCC58A1EAD7CDE649DA4D9B84F864350B739583191339D5DD469F677B463E2274F36D8E270E2301541D10CF29BF10318357BE3F8C4B60697B9EA3B7896F5BB886938CF117B26CD7D1A5D69F3E2B843C68B392D -ct = CAC32EA5CB119EB0C6901B31E5800BDC1C59471CCAFD4C6E5F08D5C282B9E0DF6D2411F8602F346B2BD20945D90317F4E6135921E3022D78D4267D41D9D007A1E0B6C1C9C5C2A8153DB0248F41DD31498BFC753375CF250C1062FC3DF6825B76E0F8B938C3A4C2EAA90A5AC01A03A89C6CA2F8D5C95EF848E9A8924C0240CD96DCAF7723AFEE617315918C152E2A2BC1448EB34E589932402AB2B841AD2E9B9E5A3B2994484F59960D0D020F66E69B9985388A6CB56977E41CF906701A83AE8D8AC0CEC6C3200597D0102A1B90A8A4EFB4CFF5AC3C492E568EC216E828959DE8F703178E669042E42761D765A2CB1577ADEDB7F6A020AD8DDE56B6152B98E1E3DB908A6F3BB9EC358079E510C9EE1FCF238D78B6AD8EA82F3C70BDF44A346E27732483E56C2F3EB271B55D56422260C43A54629019296D09848431E86664C4E1E498648E85139D30E54903BD5A8458F2A67DD6EE8456077FC9D6546BB941335FA0D4B4991352E46D2CCC00DB3F1143DD70402DF2CFFF4779661E737C2305F79589850F2C8ED42E799C6A5414E5BAF590D523 -ss = 7669B8EDA6CBD1625F419F5C04D6933DDD9941441755C07D - -count = 20 -seed = 81401DB81138D6874E91B7C11D59596E4ACE543F5A3471B6FB00999221765FEC3CA057ABE20F03B2D59003375FD71FE8 -pk = 7261EAAB74955A88A029F8F26F11721634B5F141AC0B2EF106DA9D0EBC7FC54103DCC7E0E13492129B521AC87A7C68F9922C764D602CF6688FDC741BD9E11C570CDC64736A64F2570B95C31B350E3E22C543EB67E8DDBAACEED2E022BCFC6066E3846F678BEA0C976BA952859E849C5C35A54A1BFB2E2BF733391E0A643C2CFD4F6497BC54C757A341FD057C657944A635638A5AF2A53273B367634D4B969037FAE770F6EA1F47C4CF4749169ADF359CB08A3A1E93BAA6A8AA8390FF201662CBB5002F8997EDADCD10A20527DC4643852F26A167D738AF8D7AFFC2D4A28CAE19A9E470667083EDC8FBB41D071E3054DF9F7A86891EAF13F1708FB62E6F47AEAEF34950AE063850488718C288DC328106A8A9FDC111BABF747DEAC050E25726C8F1ECA17ED1E123A365231E50A057D783F209F26830A61721267110AF93341CD92D49820363B9F663F5667B5388825370B77C7F1F0C624CB341613CA0B2488FC2A8B9D381D909B825822F7BF6B44D05238342FC053B6EF2FECA05 -sk = D304C9389CC973477F169788ABCB9D511F843219D246A9B56590A2E5C7ED86CF2C5C2A898662BC9A81418720BBB632EF9CF0B845ED052D037261EAAB74955A88A029F8F26F11721634B5F141AC0B2EF106DA9D0EBC7FC54103DCC7E0E13492129B521AC87A7C68F9922C764D602CF6688FDC741BD9E11C570CDC64736A64F2570B95C31B350E3E22C543EB67E8DDBAACEED2E022BCFC6066E3846F678BEA0C976BA952859E849C5C35A54A1BFB2E2BF733391E0A643C2CFD4F6497BC54C757A341FD057C657944A635638A5AF2A53273B367634D4B969037FAE770F6EA1F47C4CF4749169ADF359CB08A3A1E93BAA6A8AA8390FF201662CBB5002F8997EDADCD10A20527DC4643852F26A167D738AF8D7AFFC2D4A28CAE19A9E470667083EDC8FBB41D071E3054DF9F7A86891EAF13F1708FB62E6F47AEAEF34950AE063850488718C288DC328106A8A9FDC111BABF747DEAC050E25726C8F1ECA17ED1E123A365231E50A057D783F209F26830A61721267110AF93341CD92D49820363B9F663F5667B5388825370B77C7F1F0C624CB341613CA0B2488FC2A8B9D381D909B825822F7BF6B44D05238342FC053B6EF2FECA05 -ct = A213D78BAF6EE1161C6946FD081545BEA4EB87F7635194BE51730AC81F84B266E32CEB74A1A9C1D02AE86546FD5A7E491F2ABD41BC173A9239BC8C7462DF219BB80E1F5116A65B60975171E8C2A6B97E359BF0A9099EDD7EADB732B4CC8095DACABF4975F3F46C65F1857D4750B66E1C4F4149BBF854EE0F9F05C0F1B21E9328039C5B619CD35B429FC498ADF560B41C699AC2B17965D20FCC1B0F9FC606BC35033D36ABF32CC907DFAFC50B81E33D6072F0C2633E3975004C3AE4F608EC17C741ACACD2841BB4CA4643E5A0E639D20DD4CF8CB5F2F050B78D589B052CF3031FB10ECC2E5F528170D5143716C8E9F2A73BEB9012C3B9978EE32441043627BB5EB40D55F833556805CE797BA3FE3825813B79ACA70BF780959FE352F9A1F0E2328F88D17B3DA27AD73045DFD188AFBF438D261635F4ED948CC9262A64ECAEECDABB7AC341E0B3F4A05997246DCC84B4C6548D91A3F28DA46AD392CE8A725A029AD3DE376B776FCA796991D5CF1545BC9CE62898C760E5F78D7A1EDF8A6D57BFC2FD586398C758F053904316B373B329BF46C6 -ss = 11EB8F2019A872C000DE74CECF48C1F1260C72756933CADC - -count = 21 -seed = 30B5DE5B73681EC08AAA03F6F2D2169525D25F4042A5E3695A20A52CA54927B85F8BB948FC21DF7DEFC3910B28674994 -pk = 1063DE3A0C40AAE9697BB166DA5E32A3CCB4337481952EA7C8894A26047EBF0D720A6CDE2878A8ABDC051F2066E91203609E1C492B7CD2E5E2943D6705C91EE19EA60AA79C2B76EE1C581ACCF1686CAE7BCE23124CCB0587ECC8C5B05278AA8728FE4E94DDC335B2169E695156A2033A9B75ED3C0532AB80883C46CFE72AC1B08C6F9669D41708846972E64F786878D0A2347F39E0F6A2119C3F2C80D2320AD6873B8228032AB1A2B00B2E0943F00A69FD023E9148E97DDB0C324FB200226BF6C440D42CE57864FD46AF8BF53FF875882F812BB74BA53AF568471483BF7B0158BAF0A75D0FCB72443451CE810131F21AE4B3CF0FF51D58287A843528C5763CF37A7CDEE1F99A396DFF768E7BE379E9C9D0F604B70115818252923577F061AB2EF4437E10D9ADE12DE44A6D3748115DE8E76A45A6D4D5DD1D4AD321055E6F117F4E99CB8DC3CD49D2DE386A21907FFC4691616F68DEFD2250FC8341E8A105059ECCCF14696B835F7DA1E8ADD5E02E33E6A2DECFDE802F99D6DB11 -sk = 89A6E3BE304A3518FB82B18CA730F0B359CD6BA90664A493B6591121E25D64010C25A18676033E1D7278AC5F2D0B43A31F3A4156AE7104051063DE3A0C40AAE9697BB166DA5E32A3CCB4337481952EA7C8894A26047EBF0D720A6CDE2878A8ABDC051F2066E91203609E1C492B7CD2E5E2943D6705C91EE19EA60AA79C2B76EE1C581ACCF1686CAE7BCE23124CCB0587ECC8C5B05278AA8728FE4E94DDC335B2169E695156A2033A9B75ED3C0532AB80883C46CFE72AC1B08C6F9669D41708846972E64F786878D0A2347F39E0F6A2119C3F2C80D2320AD6873B8228032AB1A2B00B2E0943F00A69FD023E9148E97DDB0C324FB200226BF6C440D42CE57864FD46AF8BF53FF875882F812BB74BA53AF568471483BF7B0158BAF0A75D0FCB72443451CE810131F21AE4B3CF0FF51D58287A843528C5763CF37A7CDEE1F99A396DFF768E7BE379E9C9D0F604B70115818252923577F061AB2EF4437E10D9ADE12DE44A6D3748115DE8E76A45A6D4D5DD1D4AD321055E6F117F4E99CB8DC3CD49D2DE386A21907FFC4691616F68DEFD2250FC8341E8A105059ECCCF14696B835F7DA1E8ADD5E02E33E6A2DECFDE802F99D6DB11 -ct = ED43C36EDAEAAA550871B528BDCA529CC1E6020B5FDFFC01B1C560F5DC05521F40908C3465492B4022EF5747FCBCAA88E94941766DE014F775BE8BE453A235FF1203B621B2ADFCAD1165AA074B9F8EE48F5340E7A7C8B7A03D52162A54E7CA86CA8D823EE4DC8B11F1C4818921E13E78321C097324F7BB8C0B84F2DEAB16055CD1441FEB1879A39E8B330742DA3E8C3DB19CFAEEC18EFE499878BD86A1ECC0F9CE08FD73DE79069DA27E0092F99E9692220073791F91F997C008F74430D7258D43C532E7B5A2C264E17FC20AAB97389B5CC11607BD310D992B0D5C22C7064605F1229E62512FA025023C66D3610162F713CA3A24014B13BB6DF6B32FAC8BD418AE57BA782883F50E0D185D69A8580675DCEDFD8F5DD9EE5EF36BD1119DBCC51CDAB70F62025FF1D82CACC2C3A05DF3093DCAFA9341904CC9D877072DEC93F9676F279D1D7C5F310F261B79A7F29BBF1CA799EDA656880BC65D3171318D59E6DE07EA67B2C6993101EF6DF78097C0C6D176D63F9701A774F2F4004C13EDF46CE829F5AD4B7C08BF1AC99DDC826FE240CE7C43 -ss = 2802B84BABFC1973FF4D9D2ED0CB2B190E017A010F21092D - -count = 22 -seed = E335DF8FC0D890588C3E305AC92C7160FF199E07C85760A828933750E3FED8C83B0DBE802234481ECF890A32D7A2884F -pk = 322060E201FBE14AB5E71E898CD8424825E2C00638F2FA97074C2A709207319EAB1C571F01E2363A279E2E309D54401C73D3C3F983A6C128A95AFF66F2362839EDF382615D6CA303F47BDE4916B304205903EBBAC1777CEA70E04371FCC37D69AE7D42306C1198F8EDA2CFADE624DCB24F15945E1FC4FA7EC5C862CE7A2248FE5F009ACC4A799CA1027691F2A10B137B03B955F9EE2571CD8D2369B73BD00874304D90872A392FFE0A2679FC1E377500FFBD304FCEA72194CF35523B0DD59F0CD61AEBDC4D6B19D5FEF211290F869A1E2D1D4B342C554C9B90C23E57E4DBA3C99CBA3CF6F2058A621DD2AECFBBD7921753E19929245DB3DECA12751EEB4AF875521440441DB94017E10A54E13C520BA7D90F53A44F36D06182CFABD0FF50BA28F6A34E1A51DFF06001CA9CDA552393A87DFCFB1A9987D2136ACA0096298CB60A672A2F2F6D7326BBDE9BEA62917B432D4C022E4A081B5A9D429AEF49ADC5D6CC2BDCFE08A385E590F9912F02CB56E73E8A2046B9536B02B0B92B -sk = D569B935CE015C85F792F8F7FB0D83C4F53B492959361DD476EAE84D11C4528382828F7A689A0D5CFF87B8CA0BBA97FEACB39B935A87880B322060E201FBE14AB5E71E898CD8424825E2C00638F2FA97074C2A709207319EAB1C571F01E2363A279E2E309D54401C73D3C3F983A6C128A95AFF66F2362839EDF382615D6CA303F47BDE4916B304205903EBBAC1777CEA70E04371FCC37D69AE7D42306C1198F8EDA2CFADE624DCB24F15945E1FC4FA7EC5C862CE7A2248FE5F009ACC4A799CA1027691F2A10B137B03B955F9EE2571CD8D2369B73BD00874304D90872A392FFE0A2679FC1E377500FFBD304FCEA72194CF35523B0DD59F0CD61AEBDC4D6B19D5FEF211290F869A1E2D1D4B342C554C9B90C23E57E4DBA3C99CBA3CF6F2058A621DD2AECFBBD7921753E19929245DB3DECA12751EEB4AF875521440441DB94017E10A54E13C520BA7D90F53A44F36D06182CFABD0FF50BA28F6A34E1A51DFF06001CA9CDA552393A87DFCFB1A9987D2136ACA0096298CB60A672A2F2F6D7326BBDE9BEA62917B432D4C022E4A081B5A9D429AEF49ADC5D6CC2BDCFE08A385E590F9912F02CB56E73E8A2046B9536B02B0B92B -ct = 504804BCEE2367489287F34680A5FF306E2A10CE9F9E5A378541EE15D59B9E1850813D026B5BA8B4987CB777C5E881849E55B433CB99DA4FEFB846465F7910D9D90A1CD88C91466A9A587F12450427028A62E0FF10B0201172F0A051735DA6828EBEC7F320DA15FCA42CAFBC5F407307EBB025E6FE7F291834A01AD1670730603E33E3039EC4501A8E2462F95CC2D2020CA5A4DE9DD8B52715F2321E76D938A029B8988B5847D0809C47B73A0C70622FC75B7AC8E1754EF1A48C5DC9389A8395BC6B4FFFF3BA14450E3D240D831FB8C7F4F078FB518A345D50042CBE8904BCDDE2E3B9C8C05C18C09440628F54A6763156ADEF10D8AF1F6EEED7951773BCD85A9A13AC0E7D24AC99E5D911091F9BA73159C42E2FB08FC23C68F2FAF3F78301BAC2A888523C07038F2D6BFC6454FD926F78047982EA929353937F190307DB27A9BDDA708CD24463999E0A8B268F9E51F4D5E9EF2B29952923CA68376C4F6B006928F5B6F38C044F057AF45CC7BFA9D5EBDDF3D85DFD4EA449DC3ACF9F27778F8F2CC859C61409DBA2E18C1D9C26B05B2FF0D6 -ss = FF9EB3E0434A52E2883FC31009E1F6D10C7E505E324F9B78 - -count = 23 -seed = FBEA1BC2C379F4F8FDCB0DE260D31CDB064C9EA9B1D6DFBE91B3692ADD1D34DEC9C9FFAE7BF5E72ED2743BA3F9F2E43D -pk = 8404DF0E1454442A5E0D1E76D532DE241549B89549824CCF457386EA44ED293B99702C55079A11A7FCDFB7A14FE4754639A57B0D957DE4C7025A9AE21B723A5F67A2BB4278584D6ABA3F1935827DDB80A6A8EBFD7B3F0C7F3DC4C1D3EA781AAC3622C62F242AC431A4D0F1BE84945D2E39E5ADA2D3524F1D18DC8FF2EC2BE38BFA612E67CB34C449B048A7D0ACDEA0AE259195EF7C8BEF6F19ED10D10DECB4E63618F1A6F55BE9612D49B8487052462F99DE604499D650821141A63C3C4F08C464B454EA8BBE598303F46570D6BD2513C273B65CDEC458C391BCD4D745448F196740607C58B7DA68C486748D46364A284F7C2E2442E2FDE485E57E13A466F512F2500C17714C3DD4096756EF272D556C358F7E52D6C1F010B20E777B6FCCAF94D9A077E60DBABAEFB53E8847693EC1E7D42970C2DE6C07223E981A8ACE5DCCDAF0D41BAD3FD63E2AD674F92ECA472B8AE33C758D4239CDA7D68E66F6EEBD2584266BC23BC38E687073971A24F6976E0EFBEBE69DB4F1B956EF31 -sk = 5CBB141C2763425C274F7404FE530D9116E08C33F9F200A2FC9EBBE336DC464489861DB8253606971BD0A9008A433ED17752D040237815028404DF0E1454442A5E0D1E76D532DE241549B89549824CCF457386EA44ED293B99702C55079A11A7FCDFB7A14FE4754639A57B0D957DE4C7025A9AE21B723A5F67A2BB4278584D6ABA3F1935827DDB80A6A8EBFD7B3F0C7F3DC4C1D3EA781AAC3622C62F242AC431A4D0F1BE84945D2E39E5ADA2D3524F1D18DC8FF2EC2BE38BFA612E67CB34C449B048A7D0ACDEA0AE259195EF7C8BEF6F19ED10D10DECB4E63618F1A6F55BE9612D49B8487052462F99DE604499D650821141A63C3C4F08C464B454EA8BBE598303F46570D6BD2513C273B65CDEC458C391BCD4D745448F196740607C58B7DA68C486748D46364A284F7C2E2442E2FDE485E57E13A466F512F2500C17714C3DD4096756EF272D556C358F7E52D6C1F010B20E777B6FCCAF94D9A077E60DBABAEFB53E8847693EC1E7D42970C2DE6C07223E981A8ACE5DCCDAF0D41BAD3FD63E2AD674F92ECA472B8AE33C758D4239CDA7D68E66F6EEBD2584266BC23BC38E687073971A24F6976E0EFBEBE69DB4F1B956EF31 -ct = 92D49914330E0763C7974214C56F421EB4FD986468991002176F83E198EFF0D5CF1974B05B2557F0D571779B49BF10EA3654DBC4D69A161C76C740747E221915B36F005061D3391B48533B3CE381953CA626BD53ABB52B690524870182C48043EF9D918447D07800ACCD0D18D8B662431A4771E1C125857AE8ED5FF3522F686C42AC4598E3FC2AE39EA996899A166FB9524CB34503058C030EB5E2A5AFAABC5B1702BE52F699A62288D2ABD57A065AF779DB676E013C5373E392DB0610778CDAD725D37B330F6AA5508A762CFCC53629795A93C1B61F592B792650AB0C9B7DC48061292937392F78E37B49AE9B05C0A2E8CF535F08EA5890CE58593CB6D215EBD4D5B7D3411436B77EC2D0E41070B3037E95AC3E1B8A05D095948AE821FA08EE14545CDCC5E14C6BB462BCFC959A4CD35755E4B48826E46C0C033EFA5046AADBA600D6797AA8343D7DD9C68E162A878037F10F1CC975CF891BD209AEE75C4402C1CD54236CBAC600D6EF46E6150A2A36F2A8E918E20BC597DC1C93C99D8CCDC299A659D90C8084DC08FFD8726A0C14806DB2 -ss = 25356B80E1208646C29DBA5EF1348D3265E8FF9E767C4465 - -count = 24 -seed = 7E87FB886BC3C7C9FC12569F465D2ECD12532E76CC27C65644C8D3DD603B0CB2D036C5974E675058F271D5C82AD7A813 -pk = 2E3BE7D5145FE035B276D38F787E7FFBC0A5FF06668DFE061D7ADD6669889976ED33CF943E1080AB1CE733FD2D52B71486A3292FF0AB898F79FBF78414B414140EF8C5E473C60183663AA2BBDC2B2AB41BA74ACE4C0BC4F9C65E3355A214BD6CC66F8B2B225D6209786F1962120366669581DC0DB4455DE42333D2807C253278BF2EA4BDECD951787B0C5EDC38ADB07FB75C713876DD11A21DF595C47909A9A7518AECD77BA8B7D78EEC1ADC6D0D2B11CD4D71828D8BA70E3BAFD50F2E78837F1E90FFE09BEA05EE65013FA1154D568222553E9C6F4DB6A1E1F182E58DDD9699B6DB7D0182713DF2A05B543E49FF7726FBB4D5879EE9845B920BB60A3FF23D4AABFBC5BCAFCA0AF53825CE6EBD142C345F84C4CF4F4D59BABE0149E652F59A9844428446DDBBBBC6567777DD1E20A626D272797287FD730FACCF101AEAE1A08B093BFEC545F32FF0943EE0A914A23145784710CA004C827D27287242B9B48752C374D1F0D7AEA1C83DE5221F65BE4DF21C5901A8954A097A9E05 -sk = 293ABB6D1C207927945417CF84883EF010823E11B487ED55FF8563038AAD865A817CAB9CE98846BA75BE9363718ECF5FEA538AEA90B2A5082E3BE7D5145FE035B276D38F787E7FFBC0A5FF06668DFE061D7ADD6669889976ED33CF943E1080AB1CE733FD2D52B71486A3292FF0AB898F79FBF78414B414140EF8C5E473C60183663AA2BBDC2B2AB41BA74ACE4C0BC4F9C65E3355A214BD6CC66F8B2B225D6209786F1962120366669581DC0DB4455DE42333D2807C253278BF2EA4BDECD951787B0C5EDC38ADB07FB75C713876DD11A21DF595C47909A9A7518AECD77BA8B7D78EEC1ADC6D0D2B11CD4D71828D8BA70E3BAFD50F2E78837F1E90FFE09BEA05EE65013FA1154D568222553E9C6F4DB6A1E1F182E58DDD9699B6DB7D0182713DF2A05B543E49FF7726FBB4D5879EE9845B920BB60A3FF23D4AABFBC5BCAFCA0AF53825CE6EBD142C345F84C4CF4F4D59BABE0149E652F59A9844428446DDBBBBC6567777DD1E20A626D272797287FD730FACCF101AEAE1A08B093BFEC545F32FF0943EE0A914A23145784710CA004C827D27287242B9B48752C374D1F0D7AEA1C83DE5221F65BE4DF21C5901A8954A097A9E05 -ct = 692C1F81A0F96716FDE5270FB9CC64E40750E604522C2BBEB0D8E994F545C05984A3A3F9B9547F5892CE5A54370B417E4B1646C667561C43684A9C60BB693878C2777DE07A31C4C8959DF4F479C8EA8AF1FB60AA6942AA599123DFCEA7C896F6C19CE6618E7475B698F204C11FE0EB709A2D40FF2CBFFC9BFAEFECEDDA2ADC67D1E301DDF2F587EC16576F0394ABEC4E60E1D6CC3B68EC900FB6649E318EFABA3B659BEF40E6DF6AFDA50EBDB381B1B709BBC2D813D85FC6A1CE0BC62997DB3A84EDDE23CC8006357247A1FE3C70469F16719EBB9E176CD3CCDB69727FA3F80C0CC1E9D777083C00C28932F58CD4A739EA3C19533B9EC9683AB127108152C883BC12764EBEF9E49454022F52673CCC7939B4D9464F3E158DE0C8BBDF2645C416E6E617FEF6E1460415F6E7DC45616AA23DD0948C7F08E38D76093382345EEFD49A0C56427A0655B68E9E3A0F64FE675B553A46B20F833494272A28B81263A6484CE2622FDDC1B1747E6E41A177F68B2210D8E3880F24FC5EEA2770CF3E3787D56337122E301682713DF1A8F8CF0FDE53B15F -ss = 8D38A9FB575D15AEF5725AE38E75203DB4AFAF6D43171914 - -count = 25 -seed = AD1424E804F306C7FF513DA4C1E8D445AFCA7BC942FAC5C0B335733AAF70693712ECBDE26EA726EE0F9FD9D52A83B1A4 -pk = DE96C16B07415B67553420B347DD8782E5FB834CE71744D68A423A4775F14D2D2A9373D049097352C9979E8F49D235D12EDD7608C4A2A7B52CC610698D653A8D573A111D9F42EA748C718E5DC82D5F429F12FCFACF6DDF3D95E38BB9429FD23285155492BEB51C18406A50EE0861940844A1C834CB6D579D23E7FF9546141EB6C8AC8BF6338976B1DEE0A89B1871D00060984639984E74DB5FD5D35BAD61B80192B0F1D044435E1470811B7BE30AC0D9A8BFC7C6E14B65AE67636443400AA5A0C764D65D3617E35556AE46D8D08BA8CCFB83A8905500C5259B9A665C5842435089EE8296B36E21FF50AC47A3F47F4D7BF16AEC0AEDF382F23D65F3362F3C06CB6880FF5BF953941EB076EABDC6F135619DBFCB3C705AC9C742BA67AB5E98C0ED21F8AAC3DFE8136AD67B82C27A07259288381C8AC39F31F998331F9E4226F102E5F4614A1C9CA78FB5B16F47F7EF3FABE5E50A01EDEDEF687B1263514FDA8A8BB6EA150150B1C8E7F6F0045F450454F5FA26A58ABF8757FD5C20 -sk = 74D87C7556F2671F2D666854A4D6E073E69F35421E6E1A42E1FB7456AC0AA1B97068F452CBA64EBDC138BCF5D36B0A0FADA2A3B374141E09DE96C16B07415B67553420B347DD8782E5FB834CE71744D68A423A4775F14D2D2A9373D049097352C9979E8F49D235D12EDD7608C4A2A7B52CC610698D653A8D573A111D9F42EA748C718E5DC82D5F429F12FCFACF6DDF3D95E38BB9429FD23285155492BEB51C18406A50EE0861940844A1C834CB6D579D23E7FF9546141EB6C8AC8BF6338976B1DEE0A89B1871D00060984639984E74DB5FD5D35BAD61B80192B0F1D044435E1470811B7BE30AC0D9A8BFC7C6E14B65AE67636443400AA5A0C764D65D3617E35556AE46D8D08BA8CCFB83A8905500C5259B9A665C5842435089EE8296B36E21FF50AC47A3F47F4D7BF16AEC0AEDF382F23D65F3362F3C06CB6880FF5BF953941EB076EABDC6F135619DBFCB3C705AC9C742BA67AB5E98C0ED21F8AAC3DFE8136AD67B82C27A07259288381C8AC39F31F998331F9E4226F102E5F4614A1C9CA78FB5B16F47F7EF3FABE5E50A01EDEDEF687B1263514FDA8A8BB6EA150150B1C8E7F6F0045F450454F5FA26A58ABF8757FD5C20 -ct = CFAF97FB2DEB322300BDCC3A1CDD9E84BAA5CECCDBF2740EB215B8C58FA704A141ADC1BD7C28C577159CDEAC50FDAE1CAB47154652F42B44C92A93ECC3F122A186D8F6DFF24B92D3D4FD71CBFF589DD6C23153E2702A79C2301C2A0FCFF4E3DD098F8E9C9278D4CE05F986950A71A5D2CFF7C2D0B2B44D77E114765BA6134C00243C2C6489F6299F3C2589C8566E4BD65C0D8698BAD8C5BD9036BC14CBAE8C2A8DCB6A54786554EE77D8239528F80ADB3858044FCC464A9136BFAE511B5482E53264747E7C8B8F312293C315C950961DB73C8546F9A5F03483B778B8078B6FF53D8F6C7BEAC95E6359CB9E5DFF32A312AEB9D1EC877C5E2DC16D42101CA98CCB2B97923D5518A029F0C7A77D02762CFF7D8A4B45952362D537556A01BA534BF9FF0F5D9F5ED65017B61D2EB562F5041AAA411C06577FC7417058077C53B308A1DA2D37DA5F3B59312A522AC1E754324B9CFF4BD1EF14B6F17FC2FC7D996F2D49E0EEDC4188AEA7C98FF4EDD9C3C1216115B5D7850426370CAD2D5B0B9EE861A1EB1F27191D22A24D814AEE81868604EB7C4C -ss = 46A4994AFBC3A5F11BBB0B1764169F37C03C65C265331C70 - -count = 26 -seed = 7C33CA0E987226C8524DD56C811FA4D1CCF9995B1E4E4DD5B1481974E88CFABFBF6787775C2611CEFB27ED4403EA9B46 -pk = F9702CABFAC90350ACC8B15011903B929AEBB4506E007515B5A7C39772E10419907665DFCCA3B13001C5834AE0A14815617585EC5F457FC6AF32D0A0C517225E7E8ADE36C9A07A5463D7FBA59C45EEDE33C1DD3BF79BA273D8A0DC63897D0CDDC1049AB9AF817E26105D0C33734BEC2321B041D3E6E1539B640453C55B2F6A011594580AC1B9B5A5931A3BA3D227BC5E15591EF55BCBC79DCC88F160A189A32BBC174A69092935DFDF561C191765E4632DC9E0C4D6BE21E75F0E2474299E13750330B9200E5C560285D907F4A8CC277D4B93FCD3208F14C108B48224A4C8485659BB9BC7CA9CE5A546E2739CF38679604CD3C0043E8F3EE3C9827034D1E703F0C18673095D598372A716121F8FB1D6EB0C2C114288C143DB327CA2D94125F995EFBE3A513F49CB36A293F951276503D90550FDD7EDB34150232027C3A240BE190C18C8F1C0139294A0FF9CA530401AA388D1F09604E3D0546DB69D56DDC77E2B173B0262149924B2BD3160D0D9763E320996A41EE7DAF5562F0D -sk = 013BAB0212D04ECD54B478DAF72748003A25E2CB060BA6CC9DA0C5DA5F195B80FBB99C2E8B06926074F3F604B3F6195B5A5B9737876BBA02F9702CABFAC90350ACC8B15011903B929AEBB4506E007515B5A7C39772E10419907665DFCCA3B13001C5834AE0A14815617585EC5F457FC6AF32D0A0C517225E7E8ADE36C9A07A5463D7FBA59C45EEDE33C1DD3BF79BA273D8A0DC63897D0CDDC1049AB9AF817E26105D0C33734BEC2321B041D3E6E1539B640453C55B2F6A011594580AC1B9B5A5931A3BA3D227BC5E15591EF55BCBC79DCC88F160A189A32BBC174A69092935DFDF561C191765E4632DC9E0C4D6BE21E75F0E2474299E13750330B9200E5C560285D907F4A8CC277D4B93FCD3208F14C108B48224A4C8485659BB9BC7CA9CE5A546E2739CF38679604CD3C0043E8F3EE3C9827034D1E703F0C18673095D598372A716121F8FB1D6EB0C2C114288C143DB327CA2D94125F995EFBE3A513F49CB36A293F951276503D90550FDD7EDB34150232027C3A240BE190C18C8F1C0139294A0FF9CA530401AA388D1F09604E3D0546DB69D56DDC77E2B173B0262149924B2BD3160D0D9763E320996A41EE7DAF5562F0D -ct = 12BBBDC2344D6F29BF4CEA447A5B28283573EF13BC0975AA96EDE6D9478CEB702D9C3346A205639ED29848EE51F50E858A54E2CDE6BC867BF4F807391E1415B465162FB1157FE2E828700084892B3D04EE7764B2575AB7D517FB7A319BEBCE90C672A1574E2808E918C9CC44D6DE05525A07D522918B65BF320218326409962B263AB2E2B479707FE73D079D59AC976227961BEA2AE293FC4FE01016495B2E1ECA1DF8E7C6FB4B15831EDDCFD6CB58CF16FEA6ABB172B1B622E0603F0506053881C4F12616D8386C2054460EFF4DB31A2B0FF1EBB4BEF106F80E7B3FDBEB95503C891107876381D01D3EF5B9A46D2F658986C59F94CDD73031D55115384E13562A03236A54DC6F8A73313AFBF37F222E0047BB44DA44C6F9FBFBC50DBB44C7251C4903CCE7F7DD8CB43FBF563A8EA19438DA37AD58BABCDFAA6023725374691A47F43D082EA53A20924D795122CC263E1AD5FA4AC08DD17F632D831B0B38231136C7CA1699A1A34D3C0C62DEABCBEF4ED6BD1D500ECCFAF9760FB68A756BC77426482D0D3BB435522E5BF7049603A936AB6C -ss = 50070F02BE770A0C58C395E7B59ABDCD9C94DFF0CA296C83 - -count = 27 -seed = 54770EA1252EA2857D6635151194F5F520ADEA8A41E409FF498D40C271359858FE2B084D5B96BEE087B8E8F4DD4E00C5 -pk = 291A8F3BBD365D420B0586C15B829203BF35D8CC7FE21FB231ED26391A11236AA7200288B2835D6B83B19CA656426E8353FB9470AEE8DF7D9B5518FFE1D228301087B700B2AA519AF8ED7B1CBC48CD5605EE85CF83E9FB4407D2B70863A893AE632D6FCB8F6DA4C44E2D230E28083AC1416033FDEED2ADF38BAC29FAE42FE71AA37417A8B49EE4F51FB2AFB3A90B98259220F7E682D968BA3DC8EA3988FCFF870F470DF78326801EAA7252692543EDF788791CEAAF5ACAEEE99BF5E62964AF577E0E8CB19C6F2D19A2E12E5457CE52CE4915C30DBBE90555B2FD1A681B54B9519B90F01917BA59CBA4007BFED3BEAD35442E2122FD39CA4DD6A72034E0DAACDE29273D3FBAF00EC5D3F52A3CAF2B142A1C3CE780CC618401757C39D860E71FD92A020C2B72722822C111B11AA223F3A9C405D29F9EF3F030F10D254132C8DB81BEE40D49EE4B88E47F35AAD2B08BF6EAD2CB28085BE2559DA4BBEFF753C851ACA10037321EFA13D5B9CE5BB5D1F622CFA8ED271D597CA812251B -sk = CCB073C4B90BE0AD746E26FB093B60C70110BD1DCBCDDB5671600A8982C350DF524CDE514431DED7AEC23576530894BCBF0EC0BFEF0BB60F291A8F3BBD365D420B0586C15B829203BF35D8CC7FE21FB231ED26391A11236AA7200288B2835D6B83B19CA656426E8353FB9470AEE8DF7D9B5518FFE1D228301087B700B2AA519AF8ED7B1CBC48CD5605EE85CF83E9FB4407D2B70863A893AE632D6FCB8F6DA4C44E2D230E28083AC1416033FDEED2ADF38BAC29FAE42FE71AA37417A8B49EE4F51FB2AFB3A90B98259220F7E682D968BA3DC8EA3988FCFF870F470DF78326801EAA7252692543EDF788791CEAAF5ACAEEE99BF5E62964AF577E0E8CB19C6F2D19A2E12E5457CE52CE4915C30DBBE90555B2FD1A681B54B9519B90F01917BA59CBA4007BFED3BEAD35442E2122FD39CA4DD6A72034E0DAACDE29273D3FBAF00EC5D3F52A3CAF2B142A1C3CE780CC618401757C39D860E71FD92A020C2B72722822C111B11AA223F3A9C405D29F9EF3F030F10D254132C8DB81BEE40D49EE4B88E47F35AAD2B08BF6EAD2CB28085BE2559DA4BBEFF753C851ACA10037321EFA13D5B9CE5BB5D1F622CFA8ED271D597CA812251B -ct = F316D53D5B725385AB4BCC544E4780DF98170CBF13F151D7B4D982E20C28B40F31EFD10834354629DB586AD71EDB938E68615A2A3D28B07C8D2F73F3ADD204321619231D23806BC72CCD19F26FEA8B8F12A2C9B267B433E319E920C372C5F6D572BB417E6B95342C261E0575563FFAB24B30B198DEDCCA56A0F81C1A47066317B79EE4D70BB1C8898619B53B7494A79FC0E80ECE5BFB234CC7D52DCCBA3509B2F873494FB054161F0231A0B289BB8FE68F26EC033C9AE702F842A7DE21A9F005DA980F2AD2CBAA8D10168E4FA94418896FE1EC4CD30BE8190A2314173C59F27CD833233BB158C83344714D27DBC18C52AD79AC4D33D17B7A0C4E110FE1391D0CC10901BACBEFB749E092DBBE33A1359F120E6AB56E511A1EF013B270297908DCF82B9A7623C05E77CD63994346C6FC4D893D15C7F1930A045C9E1676405B978704C0EC9D08162D6DD760B9149B64D8A7629797DDAF678FF7A5A3118D34B4F06751965942D1ABEA1361854EFB7D2CF645A23756C65C5A45839C106D752819C90710915E7315F890BF5E7652928197CAC3CC6D -ss = 63579BEB1B9E77A63D12C42ACCC45CB12113BBD158A98B62 - -count = 28 -seed = CD6CFE94E9C0A1CC4FFDCD2D7876504BE5F50F1D1CA5CF93482943465B268276056F2781F4DE805C138976CA72621387 -pk = 87D7F0EA9A83C8FF9E507D0E66268AB7E20A5BCC9630DDEEC511C0F321EF86CD5EC5C9EF8769CAE18DBC600A54873A1059378736DC9D6F55ED8C692DD1EC30F897C5E9F9C6E84BE8BEA02773A99395591E237372E8FF1D484B56DF2D54EA10ED20B32FE64D97857862E46CB3825D0DBDB031319E4871120D7202DF9F7B2B045ABA4907111D39F8DDDF1D35F078DF3970515C753C169F5B4F1AEB7CF154F307C68DBF095BA4D6DE4F5D932C14841DF41A8E4627612E6B2CCD7E7D8EFD1417D69B18422AC7420B316B143E6BBAF5B52AE02935DB5C77652F3380394307CC5DC60CC712B3690BBF6ADC5028ADF63194402C8DE5AF46DC27593723D7E622F8ED04804DFCE3A800EFC35C40066FCE4A66AE2A60CDAB5F11E340A2358666B5F6B2D09592E9D653D12562DAD1C661B23E96A5EE068C5687D8690CFF9A7235B46A5D4B60E112755E3F9FBB92A46EDCA6D7029F578C0053D7FE34A3E6663FD5437A500E47B3E0F6F854878E5AB499D63FA567D350EDC5314E7BE3BF86FC31 -sk = 2E889F44E28901E9AC7CA6B2FFFCB124C8979401B17064D70E145E44AAE52CFC609E6F47FD7A6F6AF877190FF52256D0AC5B05B89C3F440F87D7F0EA9A83C8FF9E507D0E66268AB7E20A5BCC9630DDEEC511C0F321EF86CD5EC5C9EF8769CAE18DBC600A54873A1059378736DC9D6F55ED8C692DD1EC30F897C5E9F9C6E84BE8BEA02773A99395591E237372E8FF1D484B56DF2D54EA10ED20B32FE64D97857862E46CB3825D0DBDB031319E4871120D7202DF9F7B2B045ABA4907111D39F8DDDF1D35F078DF3970515C753C169F5B4F1AEB7CF154F307C68DBF095BA4D6DE4F5D932C14841DF41A8E4627612E6B2CCD7E7D8EFD1417D69B18422AC7420B316B143E6BBAF5B52AE02935DB5C77652F3380394307CC5DC60CC712B3690BBF6ADC5028ADF63194402C8DE5AF46DC27593723D7E622F8ED04804DFCE3A800EFC35C40066FCE4A66AE2A60CDAB5F11E340A2358666B5F6B2D09592E9D653D12562DAD1C661B23E96A5EE068C5687D8690CFF9A7235B46A5D4B60E112755E3F9FBB92A46EDCA6D7029F578C0053D7FE34A3E6663FD5437A500E47B3E0F6F854878E5AB499D63FA567D350EDC5314E7BE3BF86FC31 -ct = 649B502E3525F5A7A44B02D87A99FD680722545777CE89282937591E7835A1902FB75442EADAF7CA52DFC81B07EECC318DA0FD3C2636030F748C290E303C1FE89C244C87DD2F294C7B82D97336B667D0AFB27B94115E1F44903D990FB7DAFDBDBB208241C9A2481D1ACCA37F37CE9F3087E0E5F793A044D614E2E168160814A704145515BAACDA5BDB385A5A36CEF07B76744053E37AC6BB827CAB5E36978E825DA0CEF2ED020A07DCC5097206AB6538DF9D56165B6A1E66A6A52229156C4498F35DC464DDA5ADB9619E88D639B9737875DBF584B6592F039E8C4CA7289D670896ADC39A19741E034E09D07056BE256EE94CA7BCFC0F51FDDB59F605A68DA0BFBBB937694E5ACD9C89B2161FF482279591D422117F22329A8827E6B2818C16DA21AE8765E3C8BA9F9682F5A334D754ECCC57028DF69FBAA6957724CB284C7218FB36CD2B9EC96D6F8E1243C333DBE6EC25C8988949FC37EBADE57075A5E3475185471EB7F9C2E2B55783A8C9A0290F463F67193C0B2EA1B5BF1333899363E0EAD49AD6DA5FCBFA970BB89EAA1E41A822CD8D -ss = 7AE5663B12E00FB60985F50DC46F2CC949E917EB3C313C8A - -count = 29 -seed = 265EB2DE7099E4BD5614E5DE7F0C2A05C78EF3E8E2DD4AE4CB70F3E5E59C8D1D88248303F07DE0C5508652DA66B47222 -pk = 861D2AD089C83BDF336CF64288A2E593DEA7BBD292DF209B461638382A2BC335813B7CB02206E01785F68AA8C8D7945DA2055A630D0D759820519272B05131CCB861D640B03B598B2C8557907AF1C7CB26A281ADC9E4DCA55237E1076A59B9E0DD0949C71BD94FC5F1B19D747A56C0A7E710222873C966B60829A0C67B25E0D529BF6A7AC9CD0E4C7DA74C8B98DB5C31606FA77223E0A0D3B8908C1A339D38E84050C8BE7F5846F69F6B7FEFC64AFACEF5ACBEDE2E02E2DC665E511B3DB6D33AC1113A59C5C39A742E4F8695E5D6F20D1C8402AECBF007E4CB5EDEDB86929973A71CC797B429AF8D4E39FEB5E1902DD15BFCA0150B517C200411BA2CC164C02E38C9910687390C1DCD20B41EEC081C893F3F4080A5FF0CF2A5AEB3EBEC7F59B92838CA2D80A4A22F806B4A470B5EA2E6B8443AD8E1908BD6CDEF0FB796B83D0DA6994906547C254F6A8F02399A591A44EB027BF6FEE85BC2C27CD0F3A193E42F5C00E5DECABBBEEE59818A3BE83C93005D5AD7EDEF5A859A4C24 -sk = 174AAA36410566DC15A5E62874218D7ABDDE0B2C0F30D87750A7A2354F7E5CEFA6F4A4E9A1C411EB9364506E9E1204A8ACB3CB77FBD2C40D861D2AD089C83BDF336CF64288A2E593DEA7BBD292DF209B461638382A2BC335813B7CB02206E01785F68AA8C8D7945DA2055A630D0D759820519272B05131CCB861D640B03B598B2C8557907AF1C7CB26A281ADC9E4DCA55237E1076A59B9E0DD0949C71BD94FC5F1B19D747A56C0A7E710222873C966B60829A0C67B25E0D529BF6A7AC9CD0E4C7DA74C8B98DB5C31606FA77223E0A0D3B8908C1A339D38E84050C8BE7F5846F69F6B7FEFC64AFACEF5ACBEDE2E02E2DC665E511B3DB6D33AC1113A59C5C39A742E4F8695E5D6F20D1C8402AECBF007E4CB5EDEDB86929973A71CC797B429AF8D4E39FEB5E1902DD15BFCA0150B517C200411BA2CC164C02E38C9910687390C1DCD20B41EEC081C893F3F4080A5FF0CF2A5AEB3EBEC7F59B92838CA2D80A4A22F806B4A470B5EA2E6B8443AD8E1908BD6CDEF0FB796B83D0DA6994906547C254F6A8F02399A591A44EB027BF6FEE85BC2C27CD0F3A193E42F5C00E5DECABBBEEE59818A3BE83C93005D5AD7EDEF5A859A4C24 -ct = EA0A417DC1A13A15DB5FCA1AA40ADEE75F0EBC983F335707DB45B74E1A57BE06EEC132A7DBA217339408B004FF8899F1AAE064C49E8959D3CE6F054E426508413F62A78F38BBAED74F943805D38BBB57896741DFEC86E29D56C4E3E60F5FC5E293601B86E8FE2D5F54ECE703242B3EAECF627FDE6C03CAC65F7A3C03272637F510F8B4D92731F4149C5837072E7E1FD7169DA5DAFDDDAC4B2C248EED3F24FB004C763D655FE46DE11A7E6FBBD6D26B4956D06CBF4D72127C19A662D21413B46FC9AFF4A06FA5F6FC9C1A072DB9A98BEB805B82B7667A4AEB0D84B1FC4D6D8C42B4DE4AA60DAC7D19E66007BED6D9D444853A25CCDD11BF8222FD903E9B9B08E70BB3425A499313725148A70C8D3A959122F77077891384F152AE433ACCAC91D029F19C706EC0ED16148315466666C9776AA0B5651D566671575028A784A6FC5C38A8A1FCB7B986373A861493E6EA1D8F5C24CFE0399BC3695CFF1026CED8A1F2017F2DB363ABA2E08AF8402807656E49F92986660F8C615FBC3957B35C2EAF0E885D28BBF6FF52B97F460A649B2544A357C0 -ss = 7BDFDADCAD41A5B6822F31918D6D7AE2E281C88856EFFFE2 - -count = 30 -seed = 806BBD111F27C2668318387BD0830F65EC21A51AF01985EF48D03D64E1958FF7EE5133A4EBF6DBF36329BCAAF65F40EA -pk = E16A0B7CECAC2BA42CF6720F6D7F7AAEEFABAE71DC5E0B4866918398FAB084577A61833594F9A952EA9D0B9CA27DDE1962108582AEDCADA542ACA37A5C951F25FAFF743093881BAED9968ED76AA66502D9ACA9C4E8EE77C9458B6547A1CA8FDC59E6DC068D78214A1EF59552CA13AE9E6B3369884F32CB8008D884332F276DFC45B4C8EA45DD06F7C6E2B06A2FAEC19E3EF043626CF41B8185E69D43B99BB5619B879DF0E1A3F7DB449036DEE49A2C1C8DBB2F93135DE579F317D95913DD00A87AF2E7A7C46F1CAD9AAA7F2E2666CD4368DD4DE0EC54972D52E0AA0BDB8C7B7B3594C94E905573172B6E40E130D3849B3D75812D3DF5E1123A3E91151FBB65662AE61832E1711CEF1238841D9F6CC7BF022BA84E7036A7DFDF338A401DC2E20185A750DA16A07A1E1E2B3347DE84C5451252D3295AB31908FD072D726771A91F9336E8D022460A48F2BC4FFB958E3DF76726019FA20C1264BCB732792BC67C4E7CA2A54BB58927AD01F81B188CEC2932C5917496AD63AA414A26 -sk = 351FE4313E2DA7FAC83D509F3103CAF7B4C64A4D458FEFDFF072D9B5A99F9C7A0A011E4DC10F6B600D611F40BBA75071E7BEE61D23FD5E0AE16A0B7CECAC2BA42CF6720F6D7F7AAEEFABAE71DC5E0B4866918398FAB084577A61833594F9A952EA9D0B9CA27DDE1962108582AEDCADA542ACA37A5C951F25FAFF743093881BAED9968ED76AA66502D9ACA9C4E8EE77C9458B6547A1CA8FDC59E6DC068D78214A1EF59552CA13AE9E6B3369884F32CB8008D884332F276DFC45B4C8EA45DD06F7C6E2B06A2FAEC19E3EF043626CF41B8185E69D43B99BB5619B879DF0E1A3F7DB449036DEE49A2C1C8DBB2F93135DE579F317D95913DD00A87AF2E7A7C46F1CAD9AAA7F2E2666CD4368DD4DE0EC54972D52E0AA0BDB8C7B7B3594C94E905573172B6E40E130D3849B3D75812D3DF5E1123A3E91151FBB65662AE61832E1711CEF1238841D9F6CC7BF022BA84E7036A7DFDF338A401DC2E20185A750DA16A07A1E1E2B3347DE84C5451252D3295AB31908FD072D726771A91F9336E8D022460A48F2BC4FFB958E3DF76726019FA20C1264BCB732792BC67C4E7CA2A54BB58927AD01F81B188CEC2932C5917496AD63AA414A26 -ct = 89DAB815D870E4A03A93561A62E7C2CB92F2AE47A42AD328B0CB890F8F51D08A5A290315021C9D367D9771DEFBCE703AB4EEC3E95E847AFB04F9AD133D402D8072140038F34078147DF5557BD16397E99041A5ED93AB508FEF0CB8F0076C36511308D646ED14B13BA18D86B1584D31AB58E02D82CB51B2CB700ABD12B6132C8A32133A3735336632F93F819DC6B453FB26C2A7AC2D608A55ED4F66F12CEFAC56D4C40AE5D61AC127DB5306B8E77A194FB134509A1EA7E389A095D73C226493B79FE2F8B36DD1A676FC5B96CF032F02DCA55351F98C94C7E57B180806C1734FE9E86C5F8B87B58C31A53D397D1CD0EBF38E6A19654FE1D9E7AC3AEC38C569136F756D93907885E4437F0BD7C0B19DD1F8E47154517F1E6946357945AFF596DCBE00C8A54AEE7C525D09812505C7B292DA6485D3E96C260F4236083657B96D427E38B42C5646536FF28615C4147B66CC7E93FC25203B49B489CF7D4C049AE67E559576B1BF625C104659029A300821A94C54669964CDEACFAD13396193B257EC8B9A3E373BEF7C553DCABF1DB7F479A04FB587 -ss = 2070A68D724543C3916FC37A02561C82556DB7A8EE97BEBE - -count = 31 -seed = AD540A9CE816D6FB1661E5483C44F6FDD00C9E7BD1A8CEDA4B4C4D3697D4F78ED0A56954996CCB7DA96ECB8F5CB15809 -pk = 8F6E9B55DEF00BFB64F921DB6A0B0FD0DD406608EED52BA4E2520CB3AA12F3F2A03BF3455289E5E15FD5758D8DF76A9E1881E50C61A96607355551B613CA144E02AFC251B865AC4E32E372157B0FA8872BEA3A8C0CD1664E219FC448A9C7D6E45EBFAA419F6723848B8A2DC1EEFC2586C5DF963BD1E332775BC0D857CE2B226E46C8ADA7882F25F560459B14853A5504C768249329ED0A02A639E0A1A762897A4EEA39C3CFC2378BACD7FD4C4AC1C145E4D0445FDA73CD219C052E021D5FDA380E9EB420511E4D296DAF8D2B4C64E737A511E2DB24658EFB2BE85AC088E6B5D40836E4532927DADB505C787C00C857A8B4A9DAE85D0313AFC9DEE0289C2C08B8B9BBD661F8DB4ECD84047ED64A9900E093C7B7BD277905D21965DD46061F9B2D4C4E4A7BFA97C65677251E2FCD2E09EF52A88B4E09DF7DA9CE1D0DC9D13AFF2A0514CA20629F7540D0B90ECF59D9EAFDFAC5931C54C49F0DC994F21B030E823266081F770775D5F7825B0D4FCEDBC8899FAD0A9A9B07E218C336 -sk = 9BC5315580207C6C16DCF3A30C48DAF278DE12E8C27DF6735A4D0A8A41C4F666854E9B13673071CEB2FD61DEF9A850C211E7C50071B1DD0D8F6E9B55DEF00BFB64F921DB6A0B0FD0DD406608EED52BA4E2520CB3AA12F3F2A03BF3455289E5E15FD5758D8DF76A9E1881E50C61A96607355551B613CA144E02AFC251B865AC4E32E372157B0FA8872BEA3A8C0CD1664E219FC448A9C7D6E45EBFAA419F6723848B8A2DC1EEFC2586C5DF963BD1E332775BC0D857CE2B226E46C8ADA7882F25F560459B14853A5504C768249329ED0A02A639E0A1A762897A4EEA39C3CFC2378BACD7FD4C4AC1C145E4D0445FDA73CD219C052E021D5FDA380E9EB420511E4D296DAF8D2B4C64E737A511E2DB24658EFB2BE85AC088E6B5D40836E4532927DADB505C787C00C857A8B4A9DAE85D0313AFC9DEE0289C2C08B8B9BBD661F8DB4ECD84047ED64A9900E093C7B7BD277905D21965DD46061F9B2D4C4E4A7BFA97C65677251E2FCD2E09EF52A88B4E09DF7DA9CE1D0DC9D13AFF2A0514CA20629F7540D0B90ECF59D9EAFDFAC5931C54C49F0DC994F21B030E823266081F770775D5F7825B0D4FCEDBC8899FAD0A9A9B07E218C336 -ct = 9E8B1ADE8007D87B97B409729962367225B30C769E463AFC2F7FA4654520DC2F02AA438413B4BD33612995C12A6C0CBF2AB3ECC19008CCC2A2612A13EC911B1AAA03A5F511F0A2BBC8C106311CDE81F12D0783F43F2F233EE53668358FE9C38F4A64205284E6C70F6DA3D848A1F38C3CA52F06831A4A8117621EF7283C1D26556CE894A64820F7F36B741DA252DAD3AB5DDCE62BEDE4695F9676834BFD4C6EED4514CB464C3610E5AD525B763A262478021BDB312D3F5B3283D09D30161E28EE5F66DA495692EBBDFF6A09EC7C351BF4338E63332701A40B8EE17C2724E04DDDAE50F3C1747CB73A5544F130D3244A8047D8105C3DF0627B836C7F35B8698B51452467C6C1C104FE9882EB1142533D42DCEDC7D80DD8976CCBABE3FC7D679C50208259A09937512223A6864924AAA77EBCADFDC62C1A32A97EBF012B369834DB79AB2AFE6F37CE73478BDDA693391B811876033B44348D831B791F7877F63B098381BD7B7E209E92C298F724D5FEBAC1AB3EC2FA009E49AEF027FEE29B39EBA284A0B82D1B692BF5BA88FA74F550B37C116F -ss = 0AF322CD0E4C18F9886C22C619E933858A45DBB3FF192835 - -count = 32 -seed = 288A5F2684D862A86D2790AFDDDDBAC6FDA934EE7D2E6DA1508BB550838609E8107312B28E00A6C01706374CCD3AEFA7 -pk = 2851227F9B4806BB389A3C606D5C1A2C1BD3251600BF972FB3BC1979A0FD898D33A5D6360414901BC9E8B4B78F2C8F0F68ACAFA3DF1C0D4C575D03EFA9C13942E99DE673B5B4A7D7F3A157C7AF219CCBAC995BC3CF0EA739B9F7776C20770FDA835D8F24EF47570842BFF3192493BDD6E32B1CF129FAE8578D04A9AB1B0FD0F03D95BD237FEDED3AB9AC3438C2891F601E8210E9803F2E643EB9CC267493192763BD10D672D5EC43D2EA7C57D525DAA352999D9104505C187BDA23310F3FAEDFC5DA02BB99390510A9BFDCF47785E2B8A2A6B9D9DD985823529B7EF69CF8E7C1A152AA57FA6A6D5B95F56EC883A9E169B16C525F7EE9994F46191D323463B5A89E32CE08F3286D1EA67377F5C83914AFEA3B9B3A7F07729706E4ACC4FD37D5576AE80EE62F82C8E3034DC3C7366BA0231E5B727231E0B408CDCF3835DE2287A027BE6E7FCECAD9A290D548868DAEFEF01D83F2B0373EC80DD1ABEACF8225EE671649F28FE3457984717B4E601FA803F4EF9164CDBDFE73232939 -sk = D8B907B34D152FF8603B73051F772DAA71EB902C47B7E2F036B817736CBC5F7B1DD6EEF5FE6332FB1A598F3871E5470D440FD2EA631DA20A2851227F9B4806BB389A3C606D5C1A2C1BD3251600BF972FB3BC1979A0FD898D33A5D6360414901BC9E8B4B78F2C8F0F68ACAFA3DF1C0D4C575D03EFA9C13942E99DE673B5B4A7D7F3A157C7AF219CCBAC995BC3CF0EA739B9F7776C20770FDA835D8F24EF47570842BFF3192493BDD6E32B1CF129FAE8578D04A9AB1B0FD0F03D95BD237FEDED3AB9AC3438C2891F601E8210E9803F2E643EB9CC267493192763BD10D672D5EC43D2EA7C57D525DAA352999D9104505C187BDA23310F3FAEDFC5DA02BB99390510A9BFDCF47785E2B8A2A6B9D9DD985823529B7EF69CF8E7C1A152AA57FA6A6D5B95F56EC883A9E169B16C525F7EE9994F46191D323463B5A89E32CE08F3286D1EA67377F5C83914AFEA3B9B3A7F07729706E4ACC4FD37D5576AE80EE62F82C8E3034DC3C7366BA0231E5B727231E0B408CDCF3835DE2287A027BE6E7FCECAD9A290D548868DAEFEF01D83F2B0373EC80DD1ABEACF8225EE671649F28FE3457984717B4E601FA803F4EF9164CDBDFE73232939 -ct = 41B3A6C85D9213AB240BAB88919E5B1A7CF2D712A12437753BFC63DDA5CEAE74D1E541E14520E7002B692D602E0A1F9A9B9DC1C2A67E709B3964613DC8CD1F228B590107B3DDEBCCEF13CB112BB3A47AC23517A238E6EADCC248C814108DCE5E5BA87C0929055678905512F84E0558B6DAC96159884104BC722CD00C8C0D2134DBEF1C66E239E03370D8FB61BEE020B148B7FF4D0F0EF4F3905A1DBF73490B187DE5119084E50BF1E8646850DD6ED3EAE5A45901BB9981BEDE5892C0336FCFC0F7737857447B88DF99BA7409361F9881301D7550036A2CEF54A6E1A45FB5B69915FD61861141A7D654CDC7792DC1875B5B7E3A43318C9A76A843332E00597166CA459DF137104F831EC5AEC36CB7F74B0B7FFAC43E39DA944D98772FF26E64D30F352D73C22E5ACD3195CE346340803BBF77041E7C46BCCCF1BE049013BD0DCF60AC808D54A2BD3FC01400B56C3272D1B5208E6F79FEC64B3F8F57E45FDD2A7814A1AFF12CC5DC5552EA94DE4990C9C543EC406A6FF9C5C68C1FC7FF7D0D9248EE5F888B66D325E58C4F61FFC25806F160F1 -ss = 7DE608427494E125EEEFD9835047F49D8375C7A5CAE1BF2C - -count = 33 -seed = 4635DC5BB92EF98CDB6220DF0DD717C7F8158375EAA2B78FC3F0B58E9C9653E92684CAD3461D9158A481DA3D14694C44 -pk = 1F69DB2F480DD270802C0AE5F305E7B1CEE2EA9F5B498A5AE0833FFF215EA12FC8C156461AFA33F2CB8867C0DCB552AEE51E94C076648AF66DEEFA7047B721021D5176708ED7601A7F0196C13DBD2024B5002592D407A91719F01C8CB209382855F9416436E67C685ADB5414B43BDE786953AC23B9D47DC8A5E3DEA780380F6C1FE089BAEA89D15399DD496D18A7564E89751BD3D0C6485E3961496D39F6A0652D20DC65DFAA51198AA6D2CF384C63233F7F92A328FF5014CA1E2698384F79A523CA43F689488D7D5A5B1E0BD9FDC66215AF26924611A550AC6991EFCB67A2ED9C6731BB0D6A89DE32FB91E8667B1380A09A3F1A21BA0EFC710D1E30F20C695ADE281701B5439C455E87D46F74F8A5BA77A9CE8CC2FD452A3B198C5AD422D1179EE7ABD1527E4267857F3CF73C28BD3653AE5484EA4AF427D8570B263A72F5EA59D9FA25C2359EB6101A9A72356F2748589DAB1BD3D576D288C214CBB485048F17586D9B85D473FB0CC5C4C2269861CF1745749D5E606FAC2D0D -sk = 684A29E4E5480A5F2533E1526B5FAC8CDF5927F3D85087C775D12195EC32A8686D0600E45D4A7F54219B0D7A3826D193A51B9156ECF2ED061F69DB2F480DD270802C0AE5F305E7B1CEE2EA9F5B498A5AE0833FFF215EA12FC8C156461AFA33F2CB8867C0DCB552AEE51E94C076648AF66DEEFA7047B721021D5176708ED7601A7F0196C13DBD2024B5002592D407A91719F01C8CB209382855F9416436E67C685ADB5414B43BDE786953AC23B9D47DC8A5E3DEA780380F6C1FE089BAEA89D15399DD496D18A7564E89751BD3D0C6485E3961496D39F6A0652D20DC65DFAA51198AA6D2CF384C63233F7F92A328FF5014CA1E2698384F79A523CA43F689488D7D5A5B1E0BD9FDC66215AF26924611A550AC6991EFCB67A2ED9C6731BB0D6A89DE32FB91E8667B1380A09A3F1A21BA0EFC710D1E30F20C695ADE281701B5439C455E87D46F74F8A5BA77A9CE8CC2FD452A3B198C5AD422D1179EE7ABD1527E4267857F3CF73C28BD3653AE5484EA4AF427D8570B263A72F5EA59D9FA25C2359EB6101A9A72356F2748589DAB1BD3D576D288C214CBB485048F17586D9B85D473FB0CC5C4C2269861CF1745749D5E606FAC2D0D -ct = 9C6E885CB748B175A54CD54E393EA735103286F88F1D4A28BE4FA3EA45FD26ECA4C8E7A26827DCE44A4DEBC865B9EE19475666359A3748946B4AF29CA35B0EFA242C13A9C7838AFEB3EA213DC27A0BD6537E0B75980D391A5C656B231B184D27AEC59AF09EC91431416B00A45DDFA4A521B0D6CC17FB7CC7F61C250AA521360107F17954DAFB5F39E10D55398447B22C95339CAEB0AF27A42C240E318E5D69A8157DE8DFA9AEBB8843D7C6AF0DB9015622063575B4A611223C1DE7AE27A059893267BF156F944EEA98E822802613DB1E8B02585025FE89BEEEBB5A51AFF0F046FF2DD81FA5FDF8D69BF182979A376F5766B6CA865843007826665D2980C14C886176917D736EF9AF4B8723B2E3FBFF274CB768FFE1B2E8CE2FC59FD603F33494CBD96807D17D24B3B89E971FCB6B7E5A882CC72915CC954428811494A80BCCA283BB57CB8F60367497390CB5B475D77FBAAC936796A1366B05B4AA98CCD265D935215817DA556F0DD4A46CB95B6705095F89249200F949039B19FA407CC7702B209D880898E20B20D4BDD9AC2FD680D27F4C -ss = FA133C56508F068C3BA387BD3E0664A420D5F8F427901B6C - -count = 34 -seed = 5DA2C51B4ACF488C8BDED5E985CC4702E4A7BCB248B5AC18AABA529F7F9CBF30EFA776E99F76D5C1686E94F50FB57DAE -pk = 2E425A6B1D61FB128904AA452B44460784FBF88F246390CACC101BACB0164F80C73ED13E0AF8F15B5F48BDC6E3C8793E6DD123C8E4E25D0A24A3BBBF8D5137F44E0F6432A3240840FC054E89D75FCD15CA0F4609E5152E91534212843FB683D9AB45BA31FF8D743015B02A397EE65187CA0AABD1AE0BBF628DD9B4375D0E281E58BBA0FE64AF04E68BAE1A2A3CA62B2A37F67E92B441860A3DE06E2BF730F3FF44858A7A0A71ACBC98B1E4D70A193FF41CDDEB64AF006A75EEB3B39E2E85E8ED755DFDCB6C68947BE80320FAD94B67A923D0FFF54ED80FAE190DEE68C263B6C96EACBF35F6CFC9A7141D80ECBA9B318006077D2F1D46B18553D39A2D4296AEDDA1BA814CFD42E7878F06A7BD7E364C3F3E81E1EDF0025B82F9A9FA14A99170B42416C5EADEA9CA53A31123BE4BE12D75FDBEA23682A1440FBA062AB490DC4B4E47A3A60AC7CD3894AFDA1272DDF95D582AD095EE08014B8033BBE86C847585245FEF2B0C0E224542B030E630E9A7B05DB27843B1BDA53837ED2B -sk = D76B3573F596EB286AB5231FEEC7499686B13021BE36CB12248C0A21EA0BB6D6F56F12300E8584D8E9A34E0E6F52227281151AE4C305FB0F2E425A6B1D61FB128904AA452B44460784FBF88F246390CACC101BACB0164F80C73ED13E0AF8F15B5F48BDC6E3C8793E6DD123C8E4E25D0A24A3BBBF8D5137F44E0F6432A3240840FC054E89D75FCD15CA0F4609E5152E91534212843FB683D9AB45BA31FF8D743015B02A397EE65187CA0AABD1AE0BBF628DD9B4375D0E281E58BBA0FE64AF04E68BAE1A2A3CA62B2A37F67E92B441860A3DE06E2BF730F3FF44858A7A0A71ACBC98B1E4D70A193FF41CDDEB64AF006A75EEB3B39E2E85E8ED755DFDCB6C68947BE80320FAD94B67A923D0FFF54ED80FAE190DEE68C263B6C96EACBF35F6CFC9A7141D80ECBA9B318006077D2F1D46B18553D39A2D4296AEDDA1BA814CFD42E7878F06A7BD7E364C3F3E81E1EDF0025B82F9A9FA14A99170B42416C5EADEA9CA53A31123BE4BE12D75FDBEA23682A1440FBA062AB490DC4B4E47A3A60AC7CD3894AFDA1272DDF95D582AD095EE08014B8033BBE86C847585245FEF2B0C0E224542B030E630E9A7B05DB27843B1BDA53837ED2B -ct = D5435AA3764B0FF9EF46AB4E53FD14BBDD8B273E7B28C5F51985B51B60458A9CB067CEF38B716A2FEDB26B4987D215BB2CD8491073D8FE5A0C0CAFC842EA2A79E6E32BB4314526E13CD603636B2093A8758F86458E612C5779DED1520096E090F7F1D1C8C215B3C753884FE64BD751F32E9E20F24D713C900F88889A870C22D0B0819BF0EA626C23885278A0B12B0A2B87626137BFB9AE32951FE669161CC024BF8D31D4542E099E2F2977EBC6A81A3B7318A958D65D858E82A526640E95AA7D7216BFBEB37676118D949F86B7B8AA7748A405F6D449D57A5D450EFB8E75954BCF5C535CE026818F2EE8E354A8EF2F4750C107791977EA008BE99B1984499BD8AD62D4C73CDC23C8A4BAE5EA9940F020148812DD49E3056FA92772D0E429CEB146D06A2A5DD98A4A9AA461DB52B008180FE6901E24226241CB431310B09E1EC82C7C6F6EE6F8B41CAB44743E9772E591B900D3120D8DF2553A48736AED97D9253A907BA5A2B4CA70FBCE27CE352367A924381C5AC120B2605A3874BF587C79A130AC76D27ECC438A92EE97F347BD3A4F49D2 -ss = 03F6FF9E4AEE904E7060DBE69BFC53DF8A76F7FE8C07A482 - -count = 35 -seed = 4D2239E84B052109A78DBAB6D80C51A86D38248105970476B74A0B78B9CFAB6283E30D5A406FAE1C7F54F8BAE1110EE4 -pk = C616F9854080080493E779CFDF9ECBE5F776C39EAB7F5B31BF025E57D71A525BA0878CD7A1CED694A38659EA95F73A3E77FB7061E13B2B5AE755A2232A971CFBBB2378D477ECD3385C4577C61093273BD93655F6D461290613AD7C6DA4421FB3386FAA5FAAE6644EF4811DDEDA30ABAA933F5BB0F42009F489259E0D7C3E80D0B443595B34F4DD2773703C260092DA7CDEBB045585E151E1A42CF2029F850F82911D9827F78C33778F79C8441523599629547B06C093AF90FADF501F2BA0C36F5A334CDCF7E6E4670944C98ADC52606105B7203D15A82ECE04F0559F604E34335493FF24C6A9BDC14734A35B0C6B2BF8082C19FF196ECFBA975C47258EB6BD96925B6958438ABDF5095C901C7C5143732BC83F4A215289E627A4AF5029FAFDEC294B82A62A047E4D7BEDF182E1282228262DB95EA6B077F6538D21FBDFCAA1998906DD64B4ABAAEE576AD7D9FD08F8D8B275CA2A9FBFC1DDF0717D02D97A520EA51CFFC50075DFF2AD7A8CDFCDAC1A1BDEA89990BD9DECBD7521 -sk = B87439FDE81C9E39EEBE7CF741C685785532C1DD23E8EF861646460817A0FCE5836BDFE124A7448E7ADF7B8ECC2652AC6D280E986682DF01C616F9854080080493E779CFDF9ECBE5F776C39EAB7F5B31BF025E57D71A525BA0878CD7A1CED694A38659EA95F73A3E77FB7061E13B2B5AE755A2232A971CFBBB2378D477ECD3385C4577C61093273BD93655F6D461290613AD7C6DA4421FB3386FAA5FAAE6644EF4811DDEDA30ABAA933F5BB0F42009F489259E0D7C3E80D0B443595B34F4DD2773703C260092DA7CDEBB045585E151E1A42CF2029F850F82911D9827F78C33778F79C8441523599629547B06C093AF90FADF501F2BA0C36F5A334CDCF7E6E4670944C98ADC52606105B7203D15A82ECE04F0559F604E34335493FF24C6A9BDC14734A35B0C6B2BF8082C19FF196ECFBA975C47258EB6BD96925B6958438ABDF5095C901C7C5143732BC83F4A215289E627A4AF5029FAFDEC294B82A62A047E4D7BEDF182E1282228262DB95EA6B077F6538D21FBDFCAA1998906DD64B4ABAAEE576AD7D9FD08F8D8B275CA2A9FBFC1DDF0717D02D97A520EA51CFFC50075DFF2AD7A8CDFCDAC1A1BDEA89990BD9DECBD7521 -ct = BBF92F9F87591B6857ABDCDA8A24CEA7EB9E8FD233463C150DF9D68E0F462EC18C64155FE8B6FAEAE7612D2C0BE461FA467B5B5B5F4858CF2764727594470223FD646FBFB7CB2B61D4577751490D7A66BB43B6AA7310FC179B0DBD799522612AD8985555CC1B662144F6EBFD3B4947FC27A34593911B3627375F2004CC08091DF45F542A5756919E6CB6150DD894EE11DE6778894274BC28A949D96F04D4C5157555DCE4601DF233439E7EA1254BFB414D2D74815DB0A3B4781699100F53732AA9F2F57792A9482A7063F4B97EA373779443535B7A7F8273F391D6DCB1BDBA159285C8F94295D660E1E150C1A86EEC52754843CFB0645FB03A93263E59A7D59307130ED94868161C61E7D1584A21859C1EF78F3FE90300667899C4D03CDF45F87B52B7ECD76B437CBF0FAA7425F38038E6C3321925BEE46AE6130CCB78FEBCD6B36085EF5F9B3A9F83F65DF4433865D746F5CD40A5C195237BCEA3F5D6216A17B9D387828EAA48135A1FBD58987020129B979152AD6D194EA53362B2BC59AE9C1DC9FAC1534BAF8BA47A923E20E7F39A3F6B -ss = 0E6998CA7260CDE93D7CE60CA8CBD1AB6076EC79DBC94377 - -count = 36 -seed = EE762F5C9021C36446706A88EF16312F4A12C725CD7AFFF1484337C91EDA8E89F7007F3705747D29907B3FB7500E5074 -pk = 7D6DB450BB97FA0557B94795596DD6A65F956239F0A4924D2E869CBFD8E30FED394CF80B473FF51395F0ACE8CE4A50AF6335152413562B499DA9AB75E07203B8A6F178943400C8CA01FF7CCC00183FB917C44ADBF09335BF9011E824EC1C687A91608076DB1710DBC0C98AC8443C447A2ACA28367FD11A840E4891A4D834F911F58E44971768B77198A18629B66BF83B8187B81E429A07946CEBF46ECA19BCDC2841E65A8E09D7C66C2087F8BB9F49A9CF2BDC06ABB3960D188F1C4104C6F69DB354198827EA60A6BA11C366A1A83868F06892B306AF2C7A9BBFA3EDDA6277BA761E877258BA29EA013A0E90A404E1F8C17FB41C1B18F55F18BCD02CC523C3CC7DAAABB55545BF618434C3E09138388E3C583800C52C5A1261AD7E1140C5FD812E8BB9A7DAF4D75EB0A2E773C73BFB2C1C4DB4E95070BAFD37C23BC37AD988913D2744C195976B0B52B7DCAA1BB31ABF59565876BA98DACE8763375362CA10E42568D68212413AD4F78682D24E3925C13CE6EBF23D2BA8EFF335 -sk = 056661B38038DA4FDD7426F32A81576C73ED84843B30516879238A80DCFD7C992D84B2DFFA67493E669243D4FA38C46B090BDF86BC5484017D6DB450BB97FA0557B94795596DD6A65F956239F0A4924D2E869CBFD8E30FED394CF80B473FF51395F0ACE8CE4A50AF6335152413562B499DA9AB75E07203B8A6F178943400C8CA01FF7CCC00183FB917C44ADBF09335BF9011E824EC1C687A91608076DB1710DBC0C98AC8443C447A2ACA28367FD11A840E4891A4D834F911F58E44971768B77198A18629B66BF83B8187B81E429A07946CEBF46ECA19BCDC2841E65A8E09D7C66C2087F8BB9F49A9CF2BDC06ABB3960D188F1C4104C6F69DB354198827EA60A6BA11C366A1A83868F06892B306AF2C7A9BBFA3EDDA6277BA761E877258BA29EA013A0E90A404E1F8C17FB41C1B18F55F18BCD02CC523C3CC7DAAABB55545BF618434C3E09138388E3C583800C52C5A1261AD7E1140C5FD812E8BB9A7DAF4D75EB0A2E773C73BFB2C1C4DB4E95070BAFD37C23BC37AD988913D2744C195976B0B52B7DCAA1BB31ABF59565876BA98DACE8763375362CA10E42568D68212413AD4F78682D24E3925C13CE6EBF23D2BA8EFF335 -ct = 33C8DC5381CC3CE7E50F82C66DA129B3C827A0657A577E0940D2AEDA06A2DE05DB3FE58842F6EF004DBF929A22AF309D0DCCBA66D6CAA8E1612D8533137E2730A94654A51E10B32513BD733A53915E827EE6FAC8A71F5D84CD5B64BBED011E749D96BFEC3999E2AB10281CE9136CF7C57DAC304EA259B3031883557FBF0AC9BF9F11B07A3903BF1CA77BE1FB4F716D5014F656B4615176ADF65CF1189B2B42D0482072A49197FCA56DD9460545D4ECFC9DB09C76ABA5DD156BEFA8243E0503BA20867B0E02A6363C8042C419A5EE8C8549C288DA90E1EB612B477E75BDC56BD50F858163F11D27E1BAE9E20B6160E1E42EC5CFB07E7908FDE9302527B53614ECE02451B61A9A26A9BED4D9C3EE29C60B0DB045BD9C4813154BEDEB77BBBBF43C908FA12516D027B95A67D43C0F811C809A318F14913C11E64DC81FA1541B1A4A72E93B6AE17687246D9DFB820481A3FD2E08E8F9CA4768F53E04B0328FAE2956B8E100A474023A2F893B5078E6C98F684168FA8397E74AAEFE32D23966FE358FE4AFB990D6FA7C9D2F7B74861367F0540818 -ss = 9272A0390B05170693287EB6A6A93CB28F8F5A49731F5873 - -count = 37 -seed = D882BA69AC8BBC88715F1C6387531F53273A5DAB87E66FAA8221A7F628D2BDEEE1CBC59C0E08D0ADD84520A3A70C1389 -pk = F81EA80547B4FE29D3A7353D31307C97AA173E35B90C0116645184E60262A10FD6FE042184803EDAFB1D53BA7BB9F1B17E9B37C50A1271E41A34469DDC962B14D40C093E76F2AD9D39F474F4D30D749CC4385A34CCFD305B385628BF6C539F97E5854A432E251FF170F31319900CA5C75867E69DAE733A89D39FF6356012CC26259EE970A6DF942EE5CC0A3B2926707B32D19B4589670FAD59E11BBE7FFE74D36DF1257EE0277A1C7015E88E32123F023CFEB6D33047E4A7D2BEBCB806B4705022E7D426D8D3BD69419B532EB4848541E0E60EB644A13126A2210B5D40792A74049BC77BBD41D021E8F94E5DA1D00E8F716D8B60623E29AAC7689A2EE2AC3D6953C1A036DD19CF470068D2362B4D0E1A416279514696207C723AC2069657C4DAF2B3C749EDC4E4CAF5BFFBFF5ACD8715B0E5E8F00CB1D711104D233B1FF22CE183BB22011F27156EBC7DAFF060F4FF7CEBAADC59B6062589C26728A3A4F13DF2706727D3F3CADC7CE80F475C902661DBC75DD0C627F437D7943F -sk = A1B52D871612A1C611AE0944F9E71858F35D3BD14F20E96A1F135CF64B6403E103AFAE34DA038613E2853BBFC36BAAFA3C6A95347193F30CF81EA80547B4FE29D3A7353D31307C97AA173E35B90C0116645184E60262A10FD6FE042184803EDAFB1D53BA7BB9F1B17E9B37C50A1271E41A34469DDC962B14D40C093E76F2AD9D39F474F4D30D749CC4385A34CCFD305B385628BF6C539F97E5854A432E251FF170F31319900CA5C75867E69DAE733A89D39FF6356012CC26259EE970A6DF942EE5CC0A3B2926707B32D19B4589670FAD59E11BBE7FFE74D36DF1257EE0277A1C7015E88E32123F023CFEB6D33047E4A7D2BEBCB806B4705022E7D426D8D3BD69419B532EB4848541E0E60EB644A13126A2210B5D40792A74049BC77BBD41D021E8F94E5DA1D00E8F716D8B60623E29AAC7689A2EE2AC3D6953C1A036DD19CF470068D2362B4D0E1A416279514696207C723AC2069657C4DAF2B3C749EDC4E4CAF5BFFBFF5ACD8715B0E5E8F00CB1D711104D233B1FF22CE183BB22011F27156EBC7DAFF060F4FF7CEBAADC59B6062589C26728A3A4F13DF2706727D3F3CADC7CE80F475C902661DBC75DD0C627F437D7943F -ct = 2E1B63993E248E5C93340CB2AA34F53CA33E2E48E24545348123589270C67E32AAA3800A7CD1C53148256145E739D0F03E2C72672D7BBCFAB77B7D9041481924634C3BD7D2C29EBFA649575E8E65C282E232A4BD5CFE2F0F58B6A2DA9A7A79C25204D54B23A4A6FCD27D888302F8D3F9E76A53FAF2DD508BF90C0D9DA60229DA69D1CBC3C3DD1356BC91425839EFBEAFF4F5115172D9A4FE552FD7E4A857A219E55314D5675E099D1C83AB79D3B62340FED2C88CD6F7648BE0B0BEE730651F5992A73AC85023CFFE6B665689DC785353B3127638F8B05DCE7418E87C6E542996930DCE1F19FD5F8584F139B5EA3CF2C01911E0169ED206F830F8FF1811D3A43009D5CDE5209FCC35EC27661D53F69B3797809E76F63646C8F099C7B0676E097BB1FF977467D7996469118524B4C0FD36D9ABFAC3D2E7C511A9312477E3354F26CD44F1FE150F23C6FAE0B8D384F0763137E59D67DC5C6D99159C74A88B4BFF3D8FC537682CF507309DD176901758FC49F2359AE390FF18D4E62D0A9001519EBA42B8BC13CD7F10ACD89BCFF06D214EDE7621 -ss = 72F6DA9DA867652E3E80628EF1D9AC389D41020985D0655F - -count = 38 -seed = 6C3AFF39F5D097096D882F24717718C8A702382DC4AAFFD7629763FDA73C163CF084807BBB0C9F600CD31A7135F48AEC -pk = 3168BD9D3C7E94423496B758FC6CA983EDF620A29D208DC4E3D9068C39E19C161508278609DA43D730E005A14F14DED29EF5EE95B394F1C7E202EEE9509B2B9BF89D16C80EDDA4020A45DFEF2F8B7E304E417B48C70987D3FF1E50C196766EC1A6C5640069BA6141ED8A934EC79CC42A7298610A88C18034D795A2C46A031C330C4F33F3758AE67005A26BCDCB5BFCFD47C5E127DEC06E2E4213256BF1DCBC83CCE752461E167F0FA646B0AEDBB3174C56BA2338F00BEA9474B464C8287B30F02274F10F84AE89E3BCE088603BBCE3F6BD17069B4784A52EDCEB4FC04838BB1E35298092D956D68E19D9FE50F59700D0E77FCB6CA7AAFCB138F7540E72770A7CAE27E991089C5C9661007FD4F01D7311C083402C958ED4EBF4379441337632582C23546E7D9E04DD6DFBDB7336F505FB14160FE9646C47B61D6306D13002B3006C9F4A2670786A4E04B992C8FAAC4E5063D85BB6A2D7454449F6D872C72B64F41800D888B22CBE1B6D93B45A2ECF6DA8088041CEE3EB8CAC2336 -sk = 952B49C803D6D6FBA69F4375ADCE8594847A00BCAE2179DA62D7033947AE42CA53522A65FBAFE18D3BC3E0CB66164E9A094FE4B44D89770D3168BD9D3C7E94423496B758FC6CA983EDF620A29D208DC4E3D9068C39E19C161508278609DA43D730E005A14F14DED29EF5EE95B394F1C7E202EEE9509B2B9BF89D16C80EDDA4020A45DFEF2F8B7E304E417B48C70987D3FF1E50C196766EC1A6C5640069BA6141ED8A934EC79CC42A7298610A88C18034D795A2C46A031C330C4F33F3758AE67005A26BCDCB5BFCFD47C5E127DEC06E2E4213256BF1DCBC83CCE752461E167F0FA646B0AEDBB3174C56BA2338F00BEA9474B464C8287B30F02274F10F84AE89E3BCE088603BBCE3F6BD17069B4784A52EDCEB4FC04838BB1E35298092D956D68E19D9FE50F59700D0E77FCB6CA7AAFCB138F7540E72770A7CAE27E991089C5C9661007FD4F01D7311C083402C958ED4EBF4379441337632582C23546E7D9E04DD6DFBDB7336F505FB14160FE9646C47B61D6306D13002B3006C9F4A2670786A4E04B992C8FAAC4E5063D85BB6A2D7454449F6D872C72B64F41800D888B22CBE1B6D93B45A2ECF6DA8088041CEE3EB8CAC2336 -ct = 377F2974A07068F15C2D52790BB996FA6CE5527E9EA3FCA8C9C6F61F0D4C952B3390F48706D9906E15392E4DCDCAFC88B4B99154B86B3A984F68360A6AC300DFE89A66D7DF0270DC98760C7BBC27A56E8AFC0473CBB850C290D1832EABE77BB4EAE8CE1E20BA595BAD597602EF2A8BF807D22B39AABCCAE623507C27DD1C80F579EB0D221A035630E3F0D499A8A155029618FFCFBDBA11326B60DBDC7AE70348D2F9867E277329F845A572663D1F4BA44680C0B9A19F49C5F6888B37265A6EDAECBDCEDFAD67D0C7CF5D9B25E3D625C9A024B18BE43BF309F7936EDEF1AD795503D6C100A5924753F1CE8FA06C27178500CA6021EFC319134168230355F53F89E93748DDB54524D3007DB0E4AB3DC12A4650C7BABF50B2C8ACA9BBBD9DB3AC5D4FC93EE1DB15412FEECAF348531475F43DC6FF03EBB5B494F9C3312914D8E4A025D7DC0DBE79858DF385ACF1245ACCC9F51A18C574DC3C5797BDD82A68C3DDFCF94E0CFB273CC6D0206B1AE9CD0D945736F1AF31545D79E7E32CF18585D91AFA9A697D22EBF6B0F5488480802B470ACDC634 -ss = 51114A60F9D0E1CBF25CA1A7E1CF78C0B38FCE11BEF7B004 - -count = 39 -seed = CF520B92A2E3677AFD003EC1EC6EF136A709D78F828C9C0DD4946EFBD451C5FAABFC83CA66F9D3D17EE4220553B7A69F -pk = 62DE638857F80F49FDC0DB09A52C96F0760F92876E7E6C36563D3A82E7A615CF8BF48D41EC208EA759D6DAD7277F31D0F9331C976F2A6876B9DF53B8EFDD3D5022E900154BD6A3B3478362454BCFF2BDA112597E11A9664504F1A645A7FC8ACAB3A54B1E1F112598DC1E7CDF30B16FE0F5C5D87962C93FE80112F5809002A9A49349A227738DA1E822D770F75566813A5A56D1289CB98E5F21E89B82B0E3337AE50A65E1A9C4AD6F9BCF1C65F1FD5F3837FE20677E37BDEC3AED33AB294B54BD693417770293BD433AF8D18D06A634A4DD45CDCFD37B8DDC28D672AA467B5794B0F0A1CDB05DE7F75BC45CD20120AC4D400D7118D595434B730B640C0CA7777A9DB119FB6A98EDCB1C1541829E580502CB25626A707E616F79B7F1CEC8B316A2B2A5C3E6DF6E57B7239D1471950B3701659E9F78A7530598C134372E6D78C2728DAAA369F9A1DC6E230A5A0F9C9046D48906EC98D47F81CF4F5A7F0D0CA87242E753908C7820801A69527928A1BBB6845DE6B1D2F0BE8C3A6115 -sk = 3C815E57E9233E975FA1630208AAB206B71AE0DB37A7A87801C8E376FDB140EE343106C093AF7CB149B316BA79446CEB4E5E0CEDB9B1640962DE638857F80F49FDC0DB09A52C96F0760F92876E7E6C36563D3A82E7A615CF8BF48D41EC208EA759D6DAD7277F31D0F9331C976F2A6876B9DF53B8EFDD3D5022E900154BD6A3B3478362454BCFF2BDA112597E11A9664504F1A645A7FC8ACAB3A54B1E1F112598DC1E7CDF30B16FE0F5C5D87962C93FE80112F5809002A9A49349A227738DA1E822D770F75566813A5A56D1289CB98E5F21E89B82B0E3337AE50A65E1A9C4AD6F9BCF1C65F1FD5F3837FE20677E37BDEC3AED33AB294B54BD693417770293BD433AF8D18D06A634A4DD45CDCFD37B8DDC28D672AA467B5794B0F0A1CDB05DE7F75BC45CD20120AC4D400D7118D595434B730B640C0CA7777A9DB119FB6A98EDCB1C1541829E580502CB25626A707E616F79B7F1CEC8B316A2B2A5C3E6DF6E57B7239D1471950B3701659E9F78A7530598C134372E6D78C2728DAAA369F9A1DC6E230A5A0F9C9046D48906EC98D47F81CF4F5A7F0D0CA87242E753908C7820801A69527928A1BBB6845DE6B1D2F0BE8C3A6115 -ct = F1AA58CF8236861636CFBADDD17A852AEA087B449CA0E95A646547DA41A9E2B8BDE763D81942AB72E8996AE97C31F8EC0883C06F2B1CEBA8594D8B7B54443901568777298377267FD272396863E0A6AF29B871B5BDF5182E96F28513BE8B0BD996FC6E7E4AE925523AB10320BA3078147BE06D5B05661629D459E5059C1048AECD5CED098F5D86AE70BAC5CE245C08D74D92B4BBFC8A512F8B227D2E6FA54E9E558BCDE57EF1458E8CF0EB15ED1F453D482ECA57C1D5F598A33A424D37E0A1BB0B8640AE450DDF1CA39440225663DE142A83541364E88AA151CBB5147A89396953000762C85DB36354CC97B3D3787F4BA6233715D43E5F23CBAEBE0C768381B03FAFA99516B0B64E192C7A9820FF2873CB01DAC0FF6ACC02D9531BF9BC43AA89F1FBFC9E5911E954CB620AB155906C607CFFE0C9036C2E49088C397B9CC151C5E8764E8BD630EA9BCE2C6D27B6822C5A4AEB0F73016DBC296AE9C25AA564B1887EB31EE37DBF6EA108C0CD85CB10A637A302037A5F5AE70D142A8C2B70D915FAD53CDB294FCF6A58AB91A00AF5105180FBE3 -ss = 7B624C0703A0A47F62C174681C0CCD4B6F031C40CC05E6DF - -count = 40 -seed = 197E5D562DE7E01BED4FC597DB28DC6EFDF0179F3A5BDA5F94CAA39D67BAE730540534D59A7A06C8448F628DA8B7859F -pk = 0F57DED59D6FF0F82D79EFF2DAE83CC9B75B29696B83687CA0925A06838A99A8157B17D384569CB11DB8DA003F921FFEB7D6FC59A44177A65A98417F7B64059CD40095B471ACEA5E06E972B9E714E97FDD6824E0756ED9439C720AE9BEF8CA6E47EB6CBAE61EC00F73E3035F9B10F14903296175334F9DE7FD452E71242ABFB77F74842F2480DCB3309E6536E6718A9E06CF68D477FDFC7405DEFA4AEC7644F1BE2104E53B4BA744759539B90CC7A30FE3A3357B7DF761F1DC657D191E5C9397F7190B7FAC16E3C22EAB251391426A71AA67467EB10715E8113C2B4608170029E20F390241E0432982CB30B6F0A7961B85D0BAED6239F12ED1983A2DF129DD86944004C22D6C1026CD83CD159D472CF91EB3A1ADAF36CD0EF720E539BDDA0E1A86E1B170AC4D29A026380BA057FC6EFFAAF49F4E599E4B207DE009A99B4CE6BB9233CA2F0FA912E50277AD683EE2509322A7C11AC0A7850BB5DB1101CCBD5EC894BCB7D8EA88AAF0EC52135D002CB930A7D90200EA219494B724 -sk = 588760826DCFBD36D9ABE6AE44A669BB3EBBA6A218EAB69E0E860576285483BB5FD36E2F944D32C4317BEBC1E441470C1372046A790D79040F57DED59D6FF0F82D79EFF2DAE83CC9B75B29696B83687CA0925A06838A99A8157B17D384569CB11DB8DA003F921FFEB7D6FC59A44177A65A98417F7B64059CD40095B471ACEA5E06E972B9E714E97FDD6824E0756ED9439C720AE9BEF8CA6E47EB6CBAE61EC00F73E3035F9B10F14903296175334F9DE7FD452E71242ABFB77F74842F2480DCB3309E6536E6718A9E06CF68D477FDFC7405DEFA4AEC7644F1BE2104E53B4BA744759539B90CC7A30FE3A3357B7DF761F1DC657D191E5C9397F7190B7FAC16E3C22EAB251391426A71AA67467EB10715E8113C2B4608170029E20F390241E0432982CB30B6F0A7961B85D0BAED6239F12ED1983A2DF129DD86944004C22D6C1026CD83CD159D472CF91EB3A1ADAF36CD0EF720E539BDDA0E1A86E1B170AC4D29A026380BA057FC6EFFAAF49F4E599E4B207DE009A99B4CE6BB9233CA2F0FA912E50277AD683EE2509322A7C11AC0A7850BB5DB1101CCBD5EC894BCB7D8EA88AAF0EC52135D002CB930A7D90200EA219494B724 -ct = B9FC8FF5F9F9A030E5BB25F9000090BE8FB2022F163E3753600035991C2D737125C110F7BBD07933F549EA3A6C43B39AE8A72E7F16476F77CC32CDD31EB80C05BFFCC7C38370D1D03D152DD80563E8B6DE4B1AD9D13E52E1C2F6B99F2ACA361B9BFFBE0CB73395D9DAAADFF4498A53F287EC8C861BBC531A50F8AC896608356751A3EF58B28E82FEF0B5B4D2855D91AE7365003D79E21E4FF13856F11C5E5DD15B6C8BBC31DF6E4CF1B870E75FB418E664CCE6C405A4654544F2A3120422255F98A53813FA5AB7DA3D316E1FC7D06C61E1E9DD5BE7DBA6DA6B4AA6FB959BCCD03F860B116BA8647A004AE3DE72B701FF15104CC7B0E6BD35E7235D3027A3267D78F475ACD3D6A6AA470480167CE34E2AA46D3E85DD6E19CFE23629BF12AF399A396CED23A74D8AAAAEFE2D4CC3506688E2FEF1064D7E88C23F10046015C3543C5EC44DA9A5F29BE5C78B055023EBDB1E0498D2897C9C82B90A54A6178A1CD4718FA75115FBC1DDF657E7C847819F2A1599E9B23DBEB6B3F665128AB0428F5686FAE5F792C054CE2EF830088CC2E3085C81D0 -ss = E33DDC85305ABB33EC79D7B3FD5DAF44F4B620B6F2F044CF - -count = 41 -seed = F170583CB451D8A45D105457C02C01A33A40350616ED8515BD49067142F61EFB00F07857E4FFF3FE11E7164C648C76ED -pk = E66D9ADC7D9B147C97F811B40464A27E2999A3388B4861910055709FF732AC417D3A4498B142792899934D4ADF57550CDBBA197EB7C58C9E35C15B7E91D33595D5493D7F3E14F2498D5A26676F468C0D0C04ABE6233556ACA23ABB6A2A2F7D44EEA82A0D8129C3A887EF6D848EDBFCC0EC06DE9617EC0B92B173CB87211395920D4EA2A1585665AC8BFCEC32475BC099A2A9B4353EDE3FFDD1490810E9EFBC0971ED5379DC0547C0C645AB184035D75971FAC9BF4E78CEBE73D89ACE061DE7CF2E29B118024D63E2170C6CDE6511A56C4ED7DB2C713ABB34564087475B9A2A568DFE7F60435D02657E0B48914083DD7B5EA12BFFCF510646FCA45E140090E643AAD17F33B74096B9303F1BBA1DC4D707D196FE8DA39E7E4DCE0FE26DD85534248D66687AC02B99702279328338C43CA27C55DC06EC475171C69D1A644F2D4671628E093882BA1D3FB5F2F4EA453B4A83A2DB83835FAD683701A7CC7DA6C99D53E4095137DFB6EF7445E2821A1761ADD580BFFF4BF6A486C64C24 -sk = 47550E9EDACB6DDCE3D9AB81F6B61080DD4F2693854ACB05F89D7D99D5C3E0D10D6EF9AF054D842375F695ABB28E3B8EB495100F04306E02E66D9ADC7D9B147C97F811B40464A27E2999A3388B4861910055709FF732AC417D3A4498B142792899934D4ADF57550CDBBA197EB7C58C9E35C15B7E91D33595D5493D7F3E14F2498D5A26676F468C0D0C04ABE6233556ACA23ABB6A2A2F7D44EEA82A0D8129C3A887EF6D848EDBFCC0EC06DE9617EC0B92B173CB87211395920D4EA2A1585665AC8BFCEC32475BC099A2A9B4353EDE3FFDD1490810E9EFBC0971ED5379DC0547C0C645AB184035D75971FAC9BF4E78CEBE73D89ACE061DE7CF2E29B118024D63E2170C6CDE6511A56C4ED7DB2C713ABB34564087475B9A2A568DFE7F60435D02657E0B48914083DD7B5EA12BFFCF510646FCA45E140090E643AAD17F33B74096B9303F1BBA1DC4D707D196FE8DA39E7E4DCE0FE26DD85534248D66687AC02B99702279328338C43CA27C55DC06EC475171C69D1A644F2D4671628E093882BA1D3FB5F2F4EA453B4A83A2DB83835FAD683701A7CC7DA6C99D53E4095137DFB6EF7445E2821A1761ADD580BFFF4BF6A486C64C24 -ct = 19EA87EE0A8122652F4D42D5542DF61530D9FDFAFCB86552CB60D046A094D7FB418522EEF60ED25C47362B910CC481640867F04B0D3DABF72D5037E1F7761B0C289FE2C4B230EB5E099C88304118DC274AD5AE3810B88E3AA7C51AB25407EA05A03151FFEC95906B6484263F44BDF6B39CC842B48A3499916216ED204B02CA6D23AB224DBA215733A65BE624360433D7F0D7B1FA37127C5D60A512ECC33C572683E5003A8EA6CB8B033AB9CCBB257A6BB219F6ABFA6F44931C9DF89D38F26AA12F2B417DE95E21F06EF6C0A8DA72A09B26B28D8A0C041CC80DB0CCA9F6AA579CF539E66D982DC860CB25077AD8244030799E932A96AE2A3E5620F302AE72F38C57F8425F52927FB51FC963159111C2079061B64D6F56EAA664748D39F47B2A3EC4FE4D2AB8FF161F08A9D6DCA932CEB281AC62C69658CBA6A2DB2F9E849FA4D960ACA3E0DCC8B75F80EFE77873CC22291BF00D26501F9BE857E63F1320DBFF3D747788FAAC38AE51777871293B424D45DB4978276948CAF5330CAEC3921E6E6DA98B993A93297F3ADB0EA27B9A8FD3C51D2C -ss = B94904EC21529938A5A4651EA576E0372483E6ACD980767F - -count = 42 -seed = 44A6774B2CAC02DFF210FF861A090561A453DB311F47B6FEDB81811872D5D9489F5FC4103010139AE53FCAED209DC9BE -pk = D3AB35DB1ABF9CAC97BABFBA8D055A6AB7468BEDDEA1F4BBDCC503F729E4D82946F34A307C9939DF4524F43B4517B0358E545CBF21BB167899E5E099BB8916CF454B6F97AF4252BBDE9061AEC58A45F7FA8EB50689F87F9BE7F322F0A2CB1E05C8A94F9535615399CFD0D4F56BC9ED6F56CF4E8ED2467E9A4AB5396D7F03A148FD31B8A9D965B223F1B91B862127614C2C1E97F0E86EDC55839CB7640873067396EE224BEC416A19F283089609E68B400DE1A14081D292774D69907F0865D03FE408B912CE188EE2AFDA92ADCBD6158E0E015BC99062A668EDB0E22E28883F40910455927B2D2CF2451F3A722FF19CCEDE483F7E6DCA9FE02430640B2FF863B441E2BD68894515A6F2D54A9CB0D45EA47A3B909EDCB97857611266E92016F961757D6CB9B0A79E84CA5938EC6DD0DA699EBBB1DFF36716F5422600B77FA100434D4C3048638436C622070E19CAFD089D3FBFB9703FB54D3D45C27906F1FA00F3DBBCFA523CCA4C26A3CD35D634383B703A60E11CD4393FD33902 -sk = 610AFB64BE8CC1DF288CFB016EE2F44C6C07113DE7F6FEE0CD292E4C5F9E1A55E0489BCEFFB204D672A6215F4F3980A646D9F880817C520DD3AB35DB1ABF9CAC97BABFBA8D055A6AB7468BEDDEA1F4BBDCC503F729E4D82946F34A307C9939DF4524F43B4517B0358E545CBF21BB167899E5E099BB8916CF454B6F97AF4252BBDE9061AEC58A45F7FA8EB50689F87F9BE7F322F0A2CB1E05C8A94F9535615399CFD0D4F56BC9ED6F56CF4E8ED2467E9A4AB5396D7F03A148FD31B8A9D965B223F1B91B862127614C2C1E97F0E86EDC55839CB7640873067396EE224BEC416A19F283089609E68B400DE1A14081D292774D69907F0865D03FE408B912CE188EE2AFDA92ADCBD6158E0E015BC99062A668EDB0E22E28883F40910455927B2D2CF2451F3A722FF19CCEDE483F7E6DCA9FE02430640B2FF863B441E2BD68894515A6F2D54A9CB0D45EA47A3B909EDCB97857611266E92016F961757D6CB9B0A79E84CA5938EC6DD0DA699EBBB1DFF36716F5422600B77FA100434D4C3048638436C622070E19CAFD089D3FBFB9703FB54D3D45C27906F1FA00F3DBBCFA523CCA4C26A3CD35D634383B703A60E11CD4393FD33902 -ct = B6714EB214580F660B63E7A69B0650F5FC11249AAC2E9A77607921B8B684611CDAB05E7B702E4D16B8DA26290E419E16A5E5C09ED396CE9AEC7019FF2FCA18DD7591BAFEB001B8ED96CB4297FDD3FAD2B9E89C73868E3E616C5CDB3B44E06FE789C6AAEBEB898CA6281FECAB9B516F7FC296710B02B83E18BDAC3C46D51B45FD79658A9C2D1B726E5E330D1ED837D8565BA457CE948A549E71C14E25D7F14CE5F09644CB02E36C5E813BD2B2683279B3E332BC36F0713CB1FDD2F3150C4520A7F21A5C256B0E3997BA5A360E098B582A3FC8C819F8D4C186F210F269BB52B0E5DFF3A4A56D212560ED61B95258BA387408A2AFE6766E89F72505C000558FE7D145A9C56431778F421D58469F59481E0C06AA0B9620A1675A6BD8988EB24EFFCEBD254B8B35246B659A8D6DD74936F0B6169F803332D7F7924FFF0AC4C6AE14A7D0EA4CB384F381D43E17094EA3F3BBF0630D2838A7D05564606C6BB039C2B4624E1903E4FFB096B7B6CD5E6EC8EBBA250D14195448CE96E7C41DEE00E00A470F389D6EB36F69D35ACB8608EE2ED9069BE028 -ss = 4747804B324F5E1700861C0456762F30839CC5D9D7A3CBA7 - -count = 43 -seed = 49E1855588B6235DF2A400C4A70AEDF8AB17B6E5E2891AA745F132FA2E7AB0C8117C1DF37C39F5D57624EB77C2B4A091 -pk = 038C8F14B1756E747DD9239148DC4929C769FB182651E7CF5E566D91CA82D812F4AB5871CBEDDCFD4B3D79F71302DE3BF0BC187D9640E0020E7D7FA6EBDF3650323E9E6DDECCB7E459643E55464948CD65CF4001F9EC92BA61C468E09237BE8A1588B7E6B4C2AA9A4768360E28570CA2286559FAB5F86CE8629C6EEEA2057CDB07D4A0F2C8D7ADB90C19C8FBD4B671C0ACB87F50C29CDB5DF7BFD09156075A8C5B12292239DEE8ED686738D28843E7711D105A5037F27BE001FE9F092A75665B63996DF1C2032DA93B7181AB0F81357A84C90B935ED44172A00A7EE0B2C42E1D011B2A095EBEB2C8924FB67663AA7D35469E17498915A97CC89A4B3FFCB705E6B39FB5C4466E2AE27F94EF10DE3D083DEC766C068D9956D9E2146246445EC163DC45473B902F791DF2017D372CB89725A238E3D313D274DD47C03E7D64DD003205471E0A61E92FAD595D022E06E9E7A9D16761FE3D69C3274287464613134A250795DC73D6F6D052660B0F329A9DC408A6F94F334789BBE3790C -sk = E1953800ACAA85AC02A906C72CB8E8D704E8D27820345F888C64C049C6DFC0F1476CFFD520B055756162F7EC94243DE6B14AC0B9E5FB360C038C8F14B1756E747DD9239148DC4929C769FB182651E7CF5E566D91CA82D812F4AB5871CBEDDCFD4B3D79F71302DE3BF0BC187D9640E0020E7D7FA6EBDF3650323E9E6DDECCB7E459643E55464948CD65CF4001F9EC92BA61C468E09237BE8A1588B7E6B4C2AA9A4768360E28570CA2286559FAB5F86CE8629C6EEEA2057CDB07D4A0F2C8D7ADB90C19C8FBD4B671C0ACB87F50C29CDB5DF7BFD09156075A8C5B12292239DEE8ED686738D28843E7711D105A5037F27BE001FE9F092A75665B63996DF1C2032DA93B7181AB0F81357A84C90B935ED44172A00A7EE0B2C42E1D011B2A095EBEB2C8924FB67663AA7D35469E17498915A97CC89A4B3FFCB705E6B39FB5C4466E2AE27F94EF10DE3D083DEC766C068D9956D9E2146246445EC163DC45473B902F791DF2017D372CB89725A238E3D313D274DD47C03E7D64DD003205471E0A61E92FAD595D022E06E9E7A9D16761FE3D69C3274287464613134A250795DC73D6F6D052660B0F329A9DC408A6F94F334789BBE3790C -ct = 4DF254033DA961CE2BE002A15368DB46140D868AC61FA42B700B6B2FE002F90E45AA7539AAA170798936A8E71E460C7E9635A970F39E364518BC16DD660039BD7A82A2A9AC4D716731A03081788BDB4F37FEF4F7CF2EDCCC77E2385F79F2B411FBD0E43B7DD1BF8A453492D2633E3ADEEF773B64F6BACA9A38694C18373297B39D66803A11405CE1142F8FB4C854C1028D206D96912FAE14E58583BAC5DDA7F0DAFEB711F729BC7D275508043F8A5DC2B00BD766DCB5E90A4F2F3A631A4906465525692C1A7040D81A4B3294DE0FA568B4CA65CCEF3FE5B40DD8426C36DD6A11D79B7B12FA6F9010CA79605925217742E45A8909AAAB169F1E63A303688194B8B836073DF9B5CA70FDA001C449759B115EFA3381B4AA6FC69A2F6EA13A261A456A58D734EEA825A0F61AD1CBDC5EF9BD626441DABD5A7FB94917409E01EF2AF8C8F4C7C31FD5D134874B25AD94B3B390DC057372E406C77C96E509E0A38C95F8EDB52C4646362AAC44156A7DA7A174C10112479ADE0870AC0613D2A6126998BC71C9A4E7C5DDDB7B9C4EE05BDC150B65BB8C -ss = 841903B25A4F1A31C10CBD2357067D22EB25DFC04C58AE38 - -count = 44 -seed = DF0E41D2F6F86C1F79D31FD5878E7AB434FC0AF3A0D5F47D2AB3FEF31A42BD949B0E3629DF9F575BEFBB62E829E51DAE -pk = A9089A7E83D5F9356FD075919B61D2999F42EF4013D2825AE223C0DE56CA729D66BBC5F5C1CD6088C71E7EAFC85C28CA8A1048EF89788CCB1DBF5934CDCE336FAB3515666129140AEB7698E43BD9D3C7346BA9BD503E7BCE6E3A855BAB3B9D63FF3184A476903DA27137AF4B83683DCC422F9544E627E0223B9E580D7E0029A67586039EC1F5C17A3873248637C59EEF3B00D2147E055DEDF4E6EE9B67C24C9DA6B0D1006E1E189F9009A555B8D41A82E63925C0815FC70FA900F6D1004CF2D5CC4D500AFB29B63EC1EE570A459722508F39556C26432639A2FF046A617794C7DAFB82425049DB1FE24C2F537FD127D01037F797BF281ACB25E21F3A5190B0CDE134DF7A5A20F64C6B09B20F784B03AEB3500C061CA89E93E0BB32E52BAD5F2F7EAE21A5CC1E077521BD3247E3C0AD3012752EE5BEC5639AAC9531236FE5F2022BAE273DF4D1C03E4C46AC93770F382A0C9D44BAE0FE60F5CB0A95B5278C411C3F6E0113144CBDA040A8C33BB63C219FDA33FF9E2933BC1DE535 -sk = C719F9B2D16399B7326CE4ECA30DABEFE8FDAAB18E9F6DF8E40771856EB77E4633504899FCB86C6A3D433D0B8D60E26F07BD61F1D4ED690DA9089A7E83D5F9356FD075919B61D2999F42EF4013D2825AE223C0DE56CA729D66BBC5F5C1CD6088C71E7EAFC85C28CA8A1048EF89788CCB1DBF5934CDCE336FAB3515666129140AEB7698E43BD9D3C7346BA9BD503E7BCE6E3A855BAB3B9D63FF3184A476903DA27137AF4B83683DCC422F9544E627E0223B9E580D7E0029A67586039EC1F5C17A3873248637C59EEF3B00D2147E055DEDF4E6EE9B67C24C9DA6B0D1006E1E189F9009A555B8D41A82E63925C0815FC70FA900F6D1004CF2D5CC4D500AFB29B63EC1EE570A459722508F39556C26432639A2FF046A617794C7DAFB82425049DB1FE24C2F537FD127D01037F797BF281ACB25E21F3A5190B0CDE134DF7A5A20F64C6B09B20F784B03AEB3500C061CA89E93E0BB32E52BAD5F2F7EAE21A5CC1E077521BD3247E3C0AD3012752EE5BEC5639AAC9531236FE5F2022BAE273DF4D1C03E4C46AC93770F382A0C9D44BAE0FE60F5CB0A95B5278C411C3F6E0113144CBDA040A8C33BB63C219FDA33FF9E2933BC1DE535 -ct = 116D0A605866F99E49B19D6B6F34CE5A830D07D472E1CC6E3DCEC4A503C79BA503E0D3B54E3BF6ADD464C043243EAEFDEF4C437E160592A78780E0CA87121C7BA8141CCC70B8F60916CACA7E2EBA276C3181064523DC2089D0109EC69C7CB8095566E29B030DDE04690E4E5913919AA169BFDEE0E9AC3941D7898CD4AA250C5BBF1726267B785091309439EB3B6422CC28DF833D662D59D304ABAB55FD54C1D1B779C71C0FED2C514CBC87B169612C4A1A689A76EE210B76B1126F85050D38D9BEE810093206B177EB7194C5FEE4663849B70C1026D0CA39C6DB0197456C7DB43077E079389A6F33F65DD057CE8B3A218937727A24C1CB676B6C8D0335141B68DF6E79C20E1BFC2A7582B8C29E7ECACFA39C3D857F0E74CA7F3A9B058153199DB04C9EC952F4733C0F6A0D881D818CCD6DC4FE8F3D62BBC3A9BB178D1590DF3F62DC0514CF7DCF9AEC3238400F3FBC5A5607FC71FD2A27A08E92F93894671E80751907CBB77D46442B4A19715744A7C3DE731F0440039F19FD0E8C8E57919B3FCF3A8480623859A29617FF3ED0553C396A54 -ss = 55501CE296D88A5A9C9C962B05C7562B8924ACF2128AB352 - -count = 45 -seed = D3C9EBBA6EB03CCB5C9B9D2C8D7F0CFBBF50841E24396CDDF0E56525B38918C2FBE6C34CC1B93F7BCD4F4D5777E1A488 -pk = 80A37EDEFD93DD1A35BDD6E90B5F51FDF3CC860F860A32E6EDFB90514B60C56C0C2D839C9137007368954DCC540B37AA8ABE36827BB7280585FEE0E861E70D3D87B3706D1246D8AE2453F5D021E0A0939A38D196C9A4DBEF323804AF7DF84E8E6EA090B109C528505DB1FD30F6DEFF83391AD8E4C2E135B3B82ED01BED3DAEE49A37A564B4DB21761102540D5102D578F9952BE900DEC9951C546734610BFE90CA1AD00C45833BEE63DF1ECE85AA2ED3CAC4AC6CB62DBD1A6DEA51150B54AC63A631E4495587EAFD3C1DF815C89CD72237620F612A44B9C3664FFA2F4D0CC26E8BD74243D353BDFCE4202566AC51979E34BDDE7F3529990750EE780CBEEA79D3178B3A7435F666477D5CBEE634CF07B90BE80D5D2F2FD9A84A62A4BA313C3D4014702A63F85DE8160D3565655964082A92223B62A846209F58D412F44D5C24BD63CE042E2A2EB392BD3BE00DFCFFF1C75DCE41BE2E9060C0EBCF75F5B1685CA0A563094AD3FA7C34C287384E41063EFDDA5B5F4B733857414A32 -sk = E9ACBB774BE970206C3A738E243B420805A509FA59FA9020DED5EDAEC5DE3BF5B4D7C2F2E18E87F499C1968993EFF196753DB8045E2C8B0880A37EDEFD93DD1A35BDD6E90B5F51FDF3CC860F860A32E6EDFB90514B60C56C0C2D839C9137007368954DCC540B37AA8ABE36827BB7280585FEE0E861E70D3D87B3706D1246D8AE2453F5D021E0A0939A38D196C9A4DBEF323804AF7DF84E8E6EA090B109C528505DB1FD30F6DEFF83391AD8E4C2E135B3B82ED01BED3DAEE49A37A564B4DB21761102540D5102D578F9952BE900DEC9951C546734610BFE90CA1AD00C45833BEE63DF1ECE85AA2ED3CAC4AC6CB62DBD1A6DEA51150B54AC63A631E4495587EAFD3C1DF815C89CD72237620F612A44B9C3664FFA2F4D0CC26E8BD74243D353BDFCE4202566AC51979E34BDDE7F3529990750EE780CBEEA79D3178B3A7435F666477D5CBEE634CF07B90BE80D5D2F2FD9A84A62A4BA313C3D4014702A63F85DE8160D3565655964082A92223B62A846209F58D412F44D5C24BD63CE042E2A2EB392BD3BE00DFCFFF1C75DCE41BE2E9060C0EBCF75F5B1685CA0A563094AD3FA7C34C287384E41063EFDDA5B5F4B733857414A32 -ct = A3C8FF75002902B4350863A5D2E7428B9EEC8560E2912D31F3018CDC7234784B60BFBFE2F2125309D78775A137C7417E07EFE38BC86D79CCB48E871A940D113EE1E57A87FCC3B08BDEC0BB59669D5F43052A68897043C9E9ACDC46D285C7632C957C8567AA073832AA1BBDAC36B7E2B2A10C6ABF588D9A96D670598E5A0FA3AF9E3C1A34906D86C6AD02C0E4E265E178D97243D8CED410AC0CA68D25DC08B8D9919BB3F8C1914AAA0E3D49E217D3D7C58690C08ADE07684A73A4265A2F4A9B67D255B9E1C83A0807369BDF540F4A4F33D8B8E1767CFB598B6EF13CCED2FB06DD8127F5EF9D42997F9A30FA4CA4E4ECE8F414C26AF994D178B56A5734178512F2C83BC5CA698403394E31F66AF04289166C0E659A3AB0F3B372CC5DCB26E0335F03D5B441F56EB8881C4E911350A6C487FAED1D4E48D2151241E7003D0F12B2DA27744596488AAB57E4C5B2EE221625F44ACAA8778B82E2D3E3EADFD18D9E2BEBEC29A1A874C6C62EBAA3D111D976182634903C56FA2CB7B6920D23BB9DCD152DDB8F4D2E4E265B1D80DE5E2725557889D2BD -ss = FE6EEBD0E2902D868889C1C39A0DC8D1E85B5DCA4DB880CF - -count = 46 -seed = 6B3996E8BC6F52879F2B7BE012C44AD555707CB7E5FD8ABB3457A298336D6FDC9EB7853008FF13201D5969A315C7E493 -pk = C2BCE85E112FAFCDC1327B624AC82D2572B73930F7E0F5F81247376356158F7387233F845674DDE0601988EB30720A83C3E58138194C9A05ED9A1C5E74392725B8907B2B90A5B5109A043A10E91C762DF9FA65EE7E0E370A55858D955DBE9BBBDED1160487B7A12D8E3872858AA4E938D07328E217B03A4264A8711FFB1EF9091C617910BC74219E5383F99BA96BA253E6F157E3CF5925C3456B10FD00EEAA03F21D7B97209F805A31B20DE89A30C68E504F51F9DDCEA61CDE895CD414CB291948A1D58D73F726C329121515563A60C48223246A209F782FB757F547E55610D454D76BE1CF88E35D9FBDBA99C4E7C0689CA659421C33D7575BA059368BD8EC79F67A76664A3D2D6293363262DD9E5E9222F9BBB1F3AD0AA9B48742333D532EC5C2F91A64D8E73AA17E04A0CBC37324E4F0984047012B6B81B6AD0B1521C855AA501005D4FD5BFC0C09AC4105E506C27FB54076EE270E3DCF93A9B2D4B2952E19EAA6206EB60237B9B2BA235E6D822E494F6C897A14A91EC13820 -sk = C1B3CBFFAD4B306F9AF0CDD3028876486DBE858875C9B6491C96249919CEDC2369D8D739AB125E0D2CCB82DFEBCD90240A545CDFE0751102C2BCE85E112FAFCDC1327B624AC82D2572B73930F7E0F5F81247376356158F7387233F845674DDE0601988EB30720A83C3E58138194C9A05ED9A1C5E74392725B8907B2B90A5B5109A043A10E91C762DF9FA65EE7E0E370A55858D955DBE9BBBDED1160487B7A12D8E3872858AA4E938D07328E217B03A4264A8711FFB1EF9091C617910BC74219E5383F99BA96BA253E6F157E3CF5925C3456B10FD00EEAA03F21D7B97209F805A31B20DE89A30C68E504F51F9DDCEA61CDE895CD414CB291948A1D58D73F726C329121515563A60C48223246A209F782FB757F547E55610D454D76BE1CF88E35D9FBDBA99C4E7C0689CA659421C33D7575BA059368BD8EC79F67A76664A3D2D6293363262DD9E5E9222F9BBB1F3AD0AA9B48742333D532EC5C2F91A64D8E73AA17E04A0CBC37324E4F0984047012B6B81B6AD0B1521C855AA501005D4FD5BFC0C09AC4105E506C27FB54076EE270E3DCF93A9B2D4B2952E19EAA6206EB60237B9B2BA235E6D822E494F6C897A14A91EC13820 -ct = BAF11C6F58CA328A3CBA6743C3DF7371335C9047CE6CB7F1E5C1D342DA9010EF222A37249D9408D77A1FBD8B26F8FB8A681F836500B85B01014E6D26D45506DC6C2E103530D35F9185EC700DB7904A6C53ED90D60D4A2AF78385EEE2CDA9CB55C9EA14244ECEC1B8F437CB80D3D442E62D75B6B29AF36F1D6DDDDCE30032920F7C56705E5B86FD6D3C69975529A4601ED42029679F7789BCDF3016DB37CD48BF2A871047B47D515B4EA9D3EE51730C6742ECDC32CAFDDE48FBA5B461328CE04C8C5DFAB414E80ABE73CE01EED0873CC1FCD6640DAC8C84BD46F9F4F80B047C14633342DCC732AF9BA5F0862DCD4C4A6D106041A170395C6B61457A248F52F58A666083ACAD5281B1D16E50733E37585592D63F86AF6923ADFDA9B7081E85D77A63B3941830E15E25A5E1A7023076E07BE5988CC81B8ECA666883062E8ECF7CC5B6F65D3B824BDF3BA8FC20BDC9BF81EDFAF4A30E7864790D74780712315601D54BA7F97743B45D437B9C182CC76CDBC1B759DD0D5949E9E3EC3B60AFF1D82735CDFDBFF7C9CCE232FA6062FEB9E3CAEE74C1 -ss = 2B4F3F6BA7D91D8FCA27DBF1B57B8949F1C90D369C619AD4 - -count = 47 -seed = 730B65ECE22DE27D573CE3AEA7CB021C415DF210D228808D91D4F380070FFCB0778B683C71D4853DEB569C822765F2A3 -pk = B5BD5E6D59690C11DB4ACCCB1C5D67F066CF2A732A69A2FB0307019E14D6EB0595065D76C5285A9104F5B9BABC94571F407814F25645A992FE94DC57514F0319C22A1F81C090AFAF0B2EFB79A556549B44F095F40002DE2CA1C0FD08B3EF3B42F449B615EA2DD0A842DE6E7CE0C01432833796C0E84562AD328F99083716780CE37468793C24619A0FD3CEB900ADD3B128E3563C10F34E1B6450A822A8AC5A955A46811D3715D8BC4A811EE07F036E1AB2F8FB80EC89AE6F70E5ABE22A5CF3FDC623DD188B628D32FC2C198090C45EA4E9CA6CE8414B01DBFC0E75C616FFC8A3479D4F22DF4812D61943AEE6A555FA79EC8E4FCD94137B14E514602301B548D18A0525E8CEA4A6502606276A51DFE94398EF989BF0CDB738A8C26A81C264CFD2AA1EEAF089E366528DA64B7E8F6C90108831F5C3DFC8875D907222D116912027AE175A6B436B672D742B6F6E197B0464747C92EBE89465C29780293D8BB9F566AB849BDC7851820FBB3F56FBAAA3895624226F86D25C41FA1B00 -sk = FF7495B8575B5A98E4FD21FB4C3E58CBB60F14BEF21AA74CBDC370460375A778D1A31D01C42B66367ED8D9E8F84551002F552F0E52102B0DB5BD5E6D59690C11DB4ACCCB1C5D67F066CF2A732A69A2FB0307019E14D6EB0595065D76C5285A9104F5B9BABC94571F407814F25645A992FE94DC57514F0319C22A1F81C090AFAF0B2EFB79A556549B44F095F40002DE2CA1C0FD08B3EF3B42F449B615EA2DD0A842DE6E7CE0C01432833796C0E84562AD328F99083716780CE37468793C24619A0FD3CEB900ADD3B128E3563C10F34E1B6450A822A8AC5A955A46811D3715D8BC4A811EE07F036E1AB2F8FB80EC89AE6F70E5ABE22A5CF3FDC623DD188B628D32FC2C198090C45EA4E9CA6CE8414B01DBFC0E75C616FFC8A3479D4F22DF4812D61943AEE6A555FA79EC8E4FCD94137B14E514602301B548D18A0525E8CEA4A6502606276A51DFE94398EF989BF0CDB738A8C26A81C264CFD2AA1EEAF089E366528DA64B7E8F6C90108831F5C3DFC8875D907222D116912027AE175A6B436B672D742B6F6E197B0464747C92EBE89465C29780293D8BB9F566AB849BDC7851820FBB3F56FBAAA3895624226F86D25C41FA1B00 -ct = 80ED2D68CE8086790DAF044175B8819A93460DFB3F96F5906F29DEC8DB5464C5E3E546CAFFAA59831815F655823131973813AC7B264CDC262B7E3243A67B027994D1C0E0C6ADF89A96DD6BFA18BA6249EF635E431C46FF5374B9D2302EC2D43AABB110E8172ADD9A2AE9A9CB7401601CB4F43C5C40941B9B2185C061622B87F1C92E788A71F049FAD4F8E8A39F4A2250B4E602BC087FF957942AC855FC85FA56AD18871899D5D77CBCC220D160576D106DC1636F5A6909FCCAC51A2D1AADE5F7330DB5995F91A26DA65CA197DC09B348E72C7464BF80E7AE9A1FA345A5BE17364D2C210B3889EF9DA209CA6490D4E25E7FE3750184C6EFA46559122D4926B230B44A00A1FFE00FD1E50D880EA7EA0C351E6DEFA18F33F58892B3FBC8548C62F2A0D846E5F23B9246C2F36D90D71700B16CDD2FD854809BCBDF6701E669E46C442B1E70BEE0F0C11EDD853936AF3B55D0677E40E9E8E4F83C8DAD6BFFD2889D881AC1818A1509A1CCBD189AA9072C9F1D3F89327C79062C26BA1D1BA503238449D5B536CDFCE6CD1214F45A71E27395DD9269 -ss = 4770EAE83744168254FF4CAC72D7A3E9624CFB7AEE0187ED - -count = 48 -seed = 5522A5A891A9A9B5514F4556AFD8DF40B9CEC63A01492F0CB8A1DB073A285A963E4A9FF2376C88662F7D8D241F8ACF17 -pk = 9A15E09175DB223CA75B382C458FA086F871CFCC836532D07EAECD450A6197F77194437953436662F60AA7F4E9E9D3A64A20FE16FD623D562C06CEE12C5B221D042D0D783E323839F96C5800B0A2516CD16196C5A7853EF84CE869C7294A6ACCEF578141A9F60AD5E7BF84EF4802B0F3D6A8AB55CA90A87F88663A98A425E567FBA8A3DF33A4E8CF824D00BE7D6A7719579269F9ECC64E8A2A3D652DF7715BD87C372671524BE0B70123EAFA89537E44DB72A9B202DC944D81E3DEDF1F262CE1CBE1C5AF8EE88511453925F76E1D16B98C5964BA32E0DCF36E8EAC617B255F2E483418D3BD12CE91F02653FBD6F36F358F0C8B10897BFC0F03A378316C795620CC267EA66949F6AE6E0CF5C52C54AFBA28B17F774320B1C8B64D678BABD46E997EA0E3F0B25746FEE91A8E3F054058C58D8E4989EA5D35C1C4132C75555A21B93B64E75D1DA832203346B63FB17D98695DE9E7D6301179282B6AD2268E96F0D0FCCD3463D335C0EF947C1209FF4D54E6E88852538F73D4B3F737 -sk = BDC3FBA1C32751139FC45BACFFB3EA97F26573D804A5F27AFD5A08F656A6EB8CD20679930A31CAA6A6331C4B133A6838C223EF9F769F62069A15E09175DB223CA75B382C458FA086F871CFCC836532D07EAECD450A6197F77194437953436662F60AA7F4E9E9D3A64A20FE16FD623D562C06CEE12C5B221D042D0D783E323839F96C5800B0A2516CD16196C5A7853EF84CE869C7294A6ACCEF578141A9F60AD5E7BF84EF4802B0F3D6A8AB55CA90A87F88663A98A425E567FBA8A3DF33A4E8CF824D00BE7D6A7719579269F9ECC64E8A2A3D652DF7715BD87C372671524BE0B70123EAFA89537E44DB72A9B202DC944D81E3DEDF1F262CE1CBE1C5AF8EE88511453925F76E1D16B98C5964BA32E0DCF36E8EAC617B255F2E483418D3BD12CE91F02653FBD6F36F358F0C8B10897BFC0F03A378316C795620CC267EA66949F6AE6E0CF5C52C54AFBA28B17F774320B1C8B64D678BABD46E997EA0E3F0B25746FEE91A8E3F054058C58D8E4989EA5D35C1C4132C75555A21B93B64E75D1DA832203346B63FB17D98695DE9E7D6301179282B6AD2268E96F0D0FCCD3463D335C0EF947C1209FF4D54E6E88852538F73D4B3F737 -ct = 5B2C2D521E4E57B87D24C1DA1241B8339B145B6DB461B7C9DC6FE4E26BC8FA28A0C38139A688DF5E38F3313028FF21A02185BB25313F15D8E20173AB86620CAAF16D7E75007C22266FE6DEAC00F4542EDDF3D93659FC7FB31EE0EEF9D6437BA0DA1F80D33B1965286962D5CB3F584A136D9CF116BB38AE7D9071DBD9ED07DF7A7C1C23B7712FF9192758FECEBE5237CF4A82EBB1AB2468B98A092473FD3E9E36B3EECEC9DE542E11AAE466FBEA650D814F80C44AE0A999793D13922D06D7C8CE5995739643B42B29765E9B9A2CEE1B0C7AFF7187D8936632FA862CB876A2F228FB7D025D866BE5C01A07E6BAB2A649BC4730F20FFEDE4B35C7575A0C9BA755741F54180E5746CA37E8B8B2AFBDFA7E2BC331A38B42F48E68870A2F355D2F59B9EA49FAAE7F7EC0D282CBFB6C37417AAFDDCEC4978F17C38C35DA3F7F80D1210FD640B66F22DF78F79AC99779FE9718FAABE735CE49C7BA1CC509B335DB105F1378560B073C4A2F786796C3A9634963F72CF76AE6D03260C93819B8890AEDBE6E9FB4592E2C0BDAC1FE51493A9E462665B5FB -ss = A2791C017E6396143C0DEF06601118E458FE5A975A6871DF - -count = 49 -seed = 1853E72329353B3F89AE6A1B1EF700DA8ED3C10D19F9E61EE9252E28EBB0E15802EE43083A12A0B7527088832605E3AB -pk = 09ED8CF7986F072AC7AAE4C1625501D55ECC5A297F45BAC1870B9241054AFEA54B6747FC52C4EAE48C83924323F725E31D846BAB302E149ECE9E48ED2B72039EF5B6A2E5D41EB91BFADEC5A71D8457E540B6B7E2ADB6DB049F4FC79EB8ECA0B595EE1766C65B598DCC161771A87DE059FEB67B8CF3E0EA372526136BB42293DA17B87F856FBF5788044EEA7FCA6DD6119033335F74235CFEE917CBF3471FEF20D026B3A61AC36C0F5FD4D6CE53ACDDD83134D74D2CAFD607B88FD6E630EA0588AF95FC2F9C0AEA14D765C9B2724607DDB5C700CE70A894E7A83ED2AD56CF8BCA6AF6D5B15211A70846A505B6830B23CC574AD5D5D058E9ACCD71562264086B0CDB2518C272EEE7CEBFC19463A9FD4730BD523301D057016C2DAE974FA4013EEA208D959FB6FDB4CC310A8DD8689134031A6075CF5B6BB59233DF258F1EA583AD6029D046841451EDF4A11CBA07BC4BD89AD0F21E1A9E73154FCF45704707407DDE98DCFCF712374F82ED53A694AC161E5CB0E2A77C5A1C356610 -sk = 447F6076A627BBC5AD7773FBFEB14B4BA9AC43A0F8B99FB620A7237801F470FCC2BD9FD7BEA8322859B850F7882D362947432913DD068C0109ED8CF7986F072AC7AAE4C1625501D55ECC5A297F45BAC1870B9241054AFEA54B6747FC52C4EAE48C83924323F725E31D846BAB302E149ECE9E48ED2B72039EF5B6A2E5D41EB91BFADEC5A71D8457E540B6B7E2ADB6DB049F4FC79EB8ECA0B595EE1766C65B598DCC161771A87DE059FEB67B8CF3E0EA372526136BB42293DA17B87F856FBF5788044EEA7FCA6DD6119033335F74235CFEE917CBF3471FEF20D026B3A61AC36C0F5FD4D6CE53ACDDD83134D74D2CAFD607B88FD6E630EA0588AF95FC2F9C0AEA14D765C9B2724607DDB5C700CE70A894E7A83ED2AD56CF8BCA6AF6D5B15211A70846A505B6830B23CC574AD5D5D058E9ACCD71562264086B0CDB2518C272EEE7CEBFC19463A9FD4730BD523301D057016C2DAE974FA4013EEA208D959FB6FDB4CC310A8DD8689134031A6075CF5B6BB59233DF258F1EA583AD6029D046841451EDF4A11CBA07BC4BD89AD0F21E1A9E73154FCF45704707407DDE98DCFCF712374F82ED53A694AC161E5CB0E2A77C5A1C356610 -ct = F311B8DFC2AB2EDC87116E3B8C72AF5E1867E94ECD483A0F99D256018273EC5E9ACAF8EFE5F32CB17AF6B468BC658DC242B7DDFCB74A68B2FDAB1438B7AD166F18DD33274A5188A52CBAF0CBE09E405EF3ECCF1B793671390FF2AC92A88FEC70460F4B6248B0BAA67515B8040464F5F5B6153A635FC183CFC488B5C46C30B0882DE66813913AB3FDF2EF240E2B5146F16F106A0CDB05A353039EF8A4690A4DC0FFAC9F45DF730256F6925ED6F7017F61C296E8A7BEA59BA579DBBE0739BAD26CAC05799261F8D356F605EF004CFC38BEC1DF09F0CE1BD0D0DB69D2BDF378A1531BF360E7FF8FD6A1198C5E3CA280C8D10D2364997788267C3598D81F13B80DC88494940800D222A1243CC2C8331132EB545ADBCA9A87917A75EA4099B713E1762050B29E9289448A52215B8262E8C95ECACB667DEF897C15B0A53BA13D9BB8E5EFE0F8AFCE018C72BC2F52F16FE9CB12C3237068357041B0BE6E80D62C093E79BB09819822052A6C357AB298D8F07D75221541B70129D24FE427A1C83CE876841320CC55A4D5D55AC416685A77EA90911B51 -ss = 2C2738D9C4FE9120ACD0F19D46EFC45B4C53BEACF8B213F3 - -count = 50 -seed = 027C3D5847ED4470931141104F25B19AE76117CBB64B224EE424FFB782E9A0E988839E0BDED0DF666FE8E5FCBB5DBC09 -pk = 4CD09AE99FD721431C2DA9841180EEF53A7B94196DFD3B9D6913C02C0D58FB3F17D252835A529F7A9882DBFB24F4537310EEEAE9DBEB840B88755F7677021E1BC9E09761F935C2092A83B6205FFCE669A9BD57FF58BDC987D2BCF9B96F54AE3F8C5AE422538547128ED66B7DD6BAA8B15FA4B79DA11075EBF1FDC460EF069FE87396A1FD253DBB3CDB1907895F3FC2ABDDF8374C8DAD625DCCCF8F6F928F462C9D616CEA3B354FAF1EF8F7FA474FFDC0C01A8FC9A7042B93D0C365480717BC0E5C3452C3A84C5BA711B83245A0DB7C7F5D89C71AD9E949D9E7A32DC6447499DD4B2E7BCC3B3ADDFB4671C8C3709D057246B29801019B2B34D8015D40600F5A0BFE61DD824653B44F8ADF9D7B13023B2DE7AED13045B6319FEB8465059B5C2BD4948AEBD1CCD62A8A9BDBEF60F3012DBA815D3DE6EF86061C087D015B74976D079E5CC4A72DF995846FC74974F9211BD58220FEB457813306F300E571F5BD63A5880C20BCCECCB5002400831B9404826052A5F101769EEE21BC0A -sk = 2D5DF64D62CB07FE630310BB801C658DBF3D97993E6862677B534537ADDABA4ECF14F02AB317D36CB9F0F50222CED7CF029DFF8A0D3D2F094CD09AE99FD721431C2DA9841180EEF53A7B94196DFD3B9D6913C02C0D58FB3F17D252835A529F7A9882DBFB24F4537310EEEAE9DBEB840B88755F7677021E1BC9E09761F935C2092A83B6205FFCE669A9BD57FF58BDC987D2BCF9B96F54AE3F8C5AE422538547128ED66B7DD6BAA8B15FA4B79DA11075EBF1FDC460EF069FE87396A1FD253DBB3CDB1907895F3FC2ABDDF8374C8DAD625DCCCF8F6F928F462C9D616CEA3B354FAF1EF8F7FA474FFDC0C01A8FC9A7042B93D0C365480717BC0E5C3452C3A84C5BA711B83245A0DB7C7F5D89C71AD9E949D9E7A32DC6447499DD4B2E7BCC3B3ADDFB4671C8C3709D057246B29801019B2B34D8015D40600F5A0BFE61DD824653B44F8ADF9D7B13023B2DE7AED13045B6319FEB8465059B5C2BD4948AEBD1CCD62A8A9BDBEF60F3012DBA815D3DE6EF86061C087D015B74976D079E5CC4A72DF995846FC74974F9211BD58220FEB457813306F300E571F5BD63A5880C20BCCECCB5002400831B9404826052A5F101769EEE21BC0A -ct = 8823BEC1998F9B4405A5A7357A17CF09645E956D0D24D0393D9114BE9EAD88007C56C329EB811C38DC7D8735A4AF0BC56BA8785D6A5A6DC6181B92D6EF0D250B1F28D4CEC66E0E4C52860476C081D985C4A076A5FED8E7D7F810EC9A99C6C5B783C24F44E2C71404024A9E7C209DC02AABA1F2209A4A6E604AE4C88CA5045E73BD7DB671F27283AE1FB505DF2B845646EBF4E7D2E976B4E8C265322164CF8969632F283ABDD3B888900F4E31F3840A2F168F180940B919B0D31208AB28819A677B5FAE3F1C400BBFFFA305BD9DE2CB90265DAF3802E31817877D48DDCA22F61EAFEE09F9F7CD90F14CAD53E6FA0799E9495265B171902130246CCF0E78C7AA39D209DF3A1249111E89275E6408F2C7C9B9F153487B568CB24B1AD7F4CE26D97FE7F23B08BE797E1BE9A9451D1116C13D03B3CAFDC6A2A2C3D23A3E73F47369418927A06675A6B91368DFB07AEDCE6666B39A430CB48258FC381232B0244B09C27479EFFFDA5F1026C3B271215286EA6A189EE4BEA54942ED5C3D506A4E5865074B0130B39F640AEDB4E0493A8B6477A60B7A -ss = 38046EE145F00DA177F6C1EE6EB51FDFCE21F360B25C2FDF - -count = 51 -seed = 450751D4401737459C6D93E6C5F2FBCC4A3AF7CD7250CCF404BBB817A67BAB7B4C9D0EF4570BFE25CF919DA331C31D88 -pk = 4887A93D8B7920507AEE3CB0A9EA506D90151DBC44C8EF699A6B0079BF497A34A3A475F54BD7C991F210FC0FC14B582E59BC44473D27A16F592EF12FC1AB02AC99E6FDABC966EA95C7F7FEDDAC29CC9252FA1B45831EE846A7373A3B69E6701178C1B6C3B21A41B352CC8AF1F782D1C4B33997B1999460C290E9347EDF342DE6C2CE7B7835A563BB6A01B0A3DAE0AC9BFCD87C15EC76B8EDB5AB149938D666B8132ECD0805298DFD4A36FF83F6003BDB502866789142125291318DF51A3A9864460293776122A0AA49A263CE64E5F859316786E9842F0BB982DB273A1E09015C3250D22EA7AE178FA8B412AA4CEAAC7BEE294CA6031877951A08991215E5E79659FE4CF43342785A8B5E322D585E51EC5B1C427BAD342A338B8FADD350D2C762BBBCD959C4E5EA1CC4890776F4363CFDBE202E9A4A357F0024A50DA80EA1B3648554E926FD49BC8CDB0298E9562ACBFADD69C97BE59DB9FD8CCFEF400FB3CABF8055D2EE43A406B4C109BBEDB72AD408BAC01D1765222FF16704 -sk = 25056D1B8113BB362DD979D98643D7A7AC9C4F95994C0BA0F48A9254DD40B117941FA35A66BB50296327B725525DEEF70E128CA8045EC4014887A93D8B7920507AEE3CB0A9EA506D90151DBC44C8EF699A6B0079BF497A34A3A475F54BD7C991F210FC0FC14B582E59BC44473D27A16F592EF12FC1AB02AC99E6FDABC966EA95C7F7FEDDAC29CC9252FA1B45831EE846A7373A3B69E6701178C1B6C3B21A41B352CC8AF1F782D1C4B33997B1999460C290E9347EDF342DE6C2CE7B7835A563BB6A01B0A3DAE0AC9BFCD87C15EC76B8EDB5AB149938D666B8132ECD0805298DFD4A36FF83F6003BDB502866789142125291318DF51A3A9864460293776122A0AA49A263CE64E5F859316786E9842F0BB982DB273A1E09015C3250D22EA7AE178FA8B412AA4CEAAC7BEE294CA6031877951A08991215E5E79659FE4CF43342785A8B5E322D585E51EC5B1C427BAD342A338B8FADD350D2C762BBBCD959C4E5EA1CC4890776F4363CFDBE202E9A4A357F0024A50DA80EA1B3648554E926FD49BC8CDB0298E9562ACBFADD69C97BE59DB9FD8CCFEF400FB3CABF8055D2EE43A406B4C109BBEDB72AD408BAC01D1765222FF16704 -ct = CE919850F0EF51FB5A89EEEE3188B2B3E8E3F696982CA8C310D4B8FF14FC051F5FD72D614B941C41857A1BADB0C8E6C755492C15829239DBBA065F288B1F1517074693623E683D121022318EA61358F77609811CCC66719D4C2AD729AECBC224BEACEF3037E21A0D80FFA5CF68105462E99B3EFDB4259E64A47D4DE38F3B66BDCBC3F2FB01C9C84CE9CD1739BB12AA064F919E05D3A41630339C38F201FDBA890DDD78F64DE5B931850EDDF528129E88A03AE681D7B7B41C8BB7B2CB1355E792E971A27F5D94E6AAF4CD10B50AA4EC364E249378AC9DA0A8B4D6B7B48B74ADB756A3F102A4B062C7F9888760ABFDC0AFD21121038C4BE41AA742F106791EC116E11338C183F77FA10AD047D603F755E20852D8B5975BC124BF1AC563C2D38D0EABF7A09FD19540E70F6F2FB4CD74D82ED3A77F8C20CEB1E177ED3794D42209F4DA2F420164B60D28A7390A91FE0755696BFE3A97A94F6FC89483ABEA27E1AC7F21C26C76621FCE814522DC90BE83D1E3B59EBC89B9EB0D1DC12E533BBB051BC013BC4543BC4A9863E763B0C89E5AEE77CDC9 -ss = 4A6C24DB6F372A28188D43BDFE07416177EA68E265CE3482 - -count = 52 -seed = 5DE720F2D152BF4E1F96A61E7AE5F1BED6B8548E32638C2CCEC9F43B87D1BB43DFCF334F0582984D27E440D519AB662F -pk = F7BDE421E0571F51812C42AF7712D9E17C73CAAF9980CC8372E7D59A1F7DE392568EBDBDB1AE716B6A57199A76DD9924478006769536158A77098C93F39E1059017A18D98102B622B3660C6FDD04812F5C6B5B80420C4D8D4C6F3A1F646D293A725BF068DB5DC50FFD038D5A73F97644FB1BCBCABDAFAE4B52E329DEB229577C62FEB62E4DA5FE1533CCB45B58595F87ECF8237B92B1DCDC89CD788A0B32981A1FD306F8303DA07F88DCF0498A12F2E449E56451D06BFF570129CF5E0B50854B2F3E733B2844D60A86E8179A89D7694B8FC346BB0882DA6123BF3304234AF7AD14BE737C526F6B3E1C24904665040B05F03AE07D6A8ED5BBA499A70260F7034084010DF834DEFCF2F714EBF2C95DE06FC93B4F90378096C15ECAB822FF408148D243C743512BA6579747527A97D5AC0A5F94C83D14699FC674383DFD0D6220A1339BDE8A3264874A513AB84A9AF109E6CBFFD4C174CF2541C97C1BE910F0DE62A7FCB9BCAF55EF2DBCC4B7C30ECAD2CA1295F7530C8E05BE6023 -sk = E4D34E12982AEEB1D62FD488D9B9E28557ED3429292239FBE6C45C7FC62329B13C8D29844405DB8FF6860DE474BF727ECD19E54E6E1A140BF7BDE421E0571F51812C42AF7712D9E17C73CAAF9980CC8372E7D59A1F7DE392568EBDBDB1AE716B6A57199A76DD9924478006769536158A77098C93F39E1059017A18D98102B622B3660C6FDD04812F5C6B5B80420C4D8D4C6F3A1F646D293A725BF068DB5DC50FFD038D5A73F97644FB1BCBCABDAFAE4B52E329DEB229577C62FEB62E4DA5FE1533CCB45B58595F87ECF8237B92B1DCDC89CD788A0B32981A1FD306F8303DA07F88DCF0498A12F2E449E56451D06BFF570129CF5E0B50854B2F3E733B2844D60A86E8179A89D7694B8FC346BB0882DA6123BF3304234AF7AD14BE737C526F6B3E1C24904665040B05F03AE07D6A8ED5BBA499A70260F7034084010DF834DEFCF2F714EBF2C95DE06FC93B4F90378096C15ECAB822FF408148D243C743512BA6579747527A97D5AC0A5F94C83D14699FC674383DFD0D6220A1339BDE8A3264874A513AB84A9AF109E6CBFFD4C174CF2541C97C1BE910F0DE62A7FCB9BCAF55EF2DBCC4B7C30ECAD2CA1295F7530C8E05BE6023 -ct = 55F3EAAB473FEBF0CAA4B5C5EB737BBFEC56D4E1CB64899E1FC60BD392ECAA345D84D73F1896527F79E966F5EA58C683B43386AEE0B98CF745365DFC0F2525BC5E692947E7257585DD766E6BC9FE0104F8FCC402F947AE491437A797FC7BCCF6BA7447ABB15A0DBD80E11E419C617B2DFDD231A2C39ACF734BB9D2713D17975C78F8255F7CE70BE77ACF8B364A29600A419542A74DF74F037824CB73BF62070BB7D9AE6967D0F4363544312006F0C9A26C3ABD7B421C8B481F47B2A01FC04DACC9915CD373F4CF9A823A5E3B0D8125E4D8F2576536739D5348EA9E30E03C5F3B9B115B9B36DDCE3AA2C8EEAAC1743000041C0CE97F4F9A630726B713F72339E81E36C0EAE60434DE616CC0E2738B6090CCE6EC0D1F3C7F9E95D66BBEB87218F9580A236824C292FA312AE85C9F67A5C45393781870B5C08F6F5209C2DE8B1DF17E8309CA1C0E0DBC981F2FC3911F054497F9E507A5E9708C3F964E16678D943425162892D882C5D7E8B218EB69FA71CD4F61FE7EE8EB5A8F512815829B4A6BBE3D27AA1E48F570EED41B68EAE8E2FDD03499 -ss = 6611465188E82C488DAA81274C8E37E2B3C93A885D9009A7 - -count = 53 -seed = D71729DCBB27D7CB39E9E905025D3E55C8602EFBCC483C9B866EBF82326157833169243C14550AD728BD1470F39C642E -pk = 7502D2E942D8007A43FB1D68F927CC790183428356D5C634CE2FFEBA44D65AEAE01042112EE533558BBAD88D9498F2A563239C4ACF001F80A68DB797937C14FE8797EA33EA459BB18857B3EA94F0649DB53C5E2DE2B6F23C19A4640036780761F440632231E4D1D3B0441133A943F5D019CE5745EE65B96277B7D91E7D12D7F55BDD61556EB950D97C42CDC0F3203E772D32970BF5CA27E5CEC558A66158D450DE776D0077AF60944C0C52A2385FE7B617E2D75977E5C1948DEB780A20884B8BC1BF9A8CB1BC3626246DA132924466315BCE12B7B20369F321303A73B55EC1CF78C0B575D6D9E31254A2319FB38EDA515B267986C8133A81C0629F37A6BD6398E02890062A2312E23BD5A52DAE989CA4DB261CF5430EFD440A31C8F225B052DE568D25EE504B368FE4156F14B7041DE998D59D01277FB29B5A042CFF84127B9E8C104331A89276A1E7ECD4AF21EB237D5494F2DA6C088C486717506C3D54B58ABA5D149CA64459D12E148188212D6A6EA595ECF587517D32FB0D -sk = CD6A99396EB3539CA663A51E42063A3A262CC1C5A5FCE1565A3407F591791A5DB4578B5972093A95BEC3B8E70C1D542C9B5C9789729F89027502D2E942D8007A43FB1D68F927CC790183428356D5C634CE2FFEBA44D65AEAE01042112EE533558BBAD88D9498F2A563239C4ACF001F80A68DB797937C14FE8797EA33EA459BB18857B3EA94F0649DB53C5E2DE2B6F23C19A4640036780761F440632231E4D1D3B0441133A943F5D019CE5745EE65B96277B7D91E7D12D7F55BDD61556EB950D97C42CDC0F3203E772D32970BF5CA27E5CEC558A66158D450DE776D0077AF60944C0C52A2385FE7B617E2D75977E5C1948DEB780A20884B8BC1BF9A8CB1BC3626246DA132924466315BCE12B7B20369F321303A73B55EC1CF78C0B575D6D9E31254A2319FB38EDA515B267986C8133A81C0629F37A6BD6398E02890062A2312E23BD5A52DAE989CA4DB261CF5430EFD440A31C8F225B052DE568D25EE504B368FE4156F14B7041DE998D59D01277FB29B5A042CFF84127B9E8C104331A89276A1E7ECD4AF21EB237D5494F2DA6C088C486717506C3D54B58ABA5D149CA64459D12E148188212D6A6EA595ECF587517D32FB0D -ct = 40650D6491686A9501CE92B7847D910B2590FED52A4B4DADFD286BB8E88714E7D8324C7169BE8BA591A15D6C65610B784589A46E69A5A20565FDDE9B49941C05C17D040ECC38020CC574F83EF9D8B94EBC42CFA36991EB3955081EFF82D6A398F2B67D84F87B71D51939074B1A7E7562A53CDF71F427BF536E92D26C610A2FCEC7E861C33EA1D5069C136CA9EB2855C5451158A60E02A8B35F0C3BB45A4214E9167EA81CFE6FADCA48A1EDE89AECEA213B6A312E21E6E2A8D981148B3E4A7CD7FA6F9BF9857B96DCA7EB2A48638DE84BAB37646D9F90DF16CC82AC9D873D00FE36B9213ABCC19BB6AE8533AB4903D99B768FA42B89C79A6B66DA8D06D4116CDFB2AC643560023C0234D4296C9D5BD1A6E4C6994C900EEE0A136F0E19919857D8F7CF6AD147DDDD436B7998D4617A1B58D3FBC5BE78DEC37A722D07519A1ED6995C45AF687619BD0D00E1D20E6EC9EC83CF6319CA30564974143E0AAED1B8DF4A4970AC33CE3B0738AC522078BDCE647804A10C6DF5BD1BB276004745252BB9270F325196904B9F71F7A84E5E447E78F54BA5 -ss = 3F068357967BF2EA7A4C4A1C3A7DCDEAB3690623416DDAA9 - -count = 54 -seed = A7C2C8EDB3601396BEB2DF0657EC82FD5780A2723581A9E03DEE1CDB018440439BB1142CAB0487C5D136E9AF46338AB7 -pk = 1EE61186295EA122629A9A13F24788AE62FC843C7DF83F0C42C3899957933C1E1A7C028F9239C49D9D4712B802F7FB0D8C9042328F82B632C2FD7F5F414236B9E156CD691EB74A3F48C2BA25EBFC533A244D42AA7E6EDAA5358F3F77F46232FA0C2AD5885788D558C45A01D49AE0AAEA23CDF109BE0282D1D9F5872B183B5C889D38978A4464E0D78D564C6153D8154A6151027254E456CFE72C545929D95998FB235EE178F678CBF00AB7A4930FC2C5F578ECCA25D42E7743B2FAF932E58F785A45CF7CD14B4FCF648A51D208C7FB4474520446BFE2AB7BCAB31180CB62F1A66C5667FBDEFD27FA4A87BB4ED04B3661AD76D1CE7E683B71A60A1615B4C4C022E9CE841B48D6D5A71C7873F73248AD0686001F2A55C4ACEBA6CD1ACBE1E32745C022FEF67CF009A3F437A8C6A0C184724AD7C38BE38C52EE270C3C7833E448F3870EF987EFEFF032F94D83B6620B5ACA4358B338FF89583CDF4479D3972E993D307FBA4BF8DCBB2814704997F87AB0E0FBB2BD619AF803832513 -sk = 6C8C53ED6F65E6B2E324B84364E10DE42D1C26A106D4D1C9B9402BF02481CE4B27A52E87FEB92C4399C7F2988D40E942E7496AD15AD2AA081EE61186295EA122629A9A13F24788AE62FC843C7DF83F0C42C3899957933C1E1A7C028F9239C49D9D4712B802F7FB0D8C9042328F82B632C2FD7F5F414236B9E156CD691EB74A3F48C2BA25EBFC533A244D42AA7E6EDAA5358F3F77F46232FA0C2AD5885788D558C45A01D49AE0AAEA23CDF109BE0282D1D9F5872B183B5C889D38978A4464E0D78D564C6153D8154A6151027254E456CFE72C545929D95998FB235EE178F678CBF00AB7A4930FC2C5F578ECCA25D42E7743B2FAF932E58F785A45CF7CD14B4FCF648A51D208C7FB4474520446BFE2AB7BCAB31180CB62F1A66C5667FBDEFD27FA4A87BB4ED04B3661AD76D1CE7E683B71A60A1615B4C4C022E9CE841B48D6D5A71C7873F73248AD0686001F2A55C4ACEBA6CD1ACBE1E32745C022FEF67CF009A3F437A8C6A0C184724AD7C38BE38C52EE270C3C7833E448F3870EF987EFEFF032F94D83B6620B5ACA4358B338FF89583CDF4479D3972E993D307FBA4BF8DCBB2814704997F87AB0E0FBB2BD619AF803832513 -ct = 5A229B3C3524E57838F0079074FC2D9D527890DFCBC6E5F83DB85CF3752B67F30E363EEBBC4DCDB0536FAC2D240BE47426D0D4779AAE1305664DBF4A57110A664F8B2B49EEB39974294E455099EC98E5E972240AB6521075B05ED8AF8B0BDB1AF92353F353EDBDDAF04996B6CC83D3E89B2855981EB895EA04F11DC3870CE71AA30076AA72EA9EBB686E4E2E45F489E67C9CB6CF22B1D8BEF243F97E41ADF7CAB8293FD2E950E1F9B3014531B8E4F8DDFD74B7688D03502C32B12CA317518E28A30A713CEA817C32101906D0EAC55DD243642E47606B63885F1CE6E1EF76AA7FCFDB11376E4ACC386A1FF95CE8454481081431AD785CA58C013709172DB03666EBA3F858C750E33067290AAFEE066A1F9B24EFFB14DCD26BFB9D86F6217D217E8C7A5951A2EAAF963D3824E9C44285CA799A4DCFFD9CBA1920A016FBD40E1449E6EF636D91421465A2F3A15ED829D1BE2DC988FDB8F8E92CCCD5BAF6C93084E2BE6F361DA62D63E7D942A4FDFCFD4F8B978714E310565F1C99115F71C71CE99642BAC7DEF32438E45F65BD4E7B1D32E92750 -ss = DE7DC467814DC94405A38C45B0E6FA2984DCC97598D75874 - -count = 55 -seed = 467F6158CB86B724039FF18C47950AE5C49170163C910FC9A9B30141F86E9C06EBCEC91497BCD156D95758C9F0C6EF91 -pk = 05C4F72C66A3173A2DEF37EA9BB834354BCB234581B5F5E145EFEE238B70C4D99FC4CD811ACF6A1483DD309E87E8E4EFAD10710E1387644BBB5BA2561ED623D4D406A687C08D4AB86E5510BAF22D07112660DABE21A5F6E6ADD4912A7ED8B79738D6CF50EC88CA9526F9F2B6C299F1DB78B8C468D2A61BD138A8A4DF8A139289CC727246EA0C401AA475AFF9836740B242A7DC93163ECD9823C8B92F615B288DC8BBF65BEBFC56318E73C9F8BD8FBFC93E45624017BE7A00B118BEBE023C3D7738D3D85EFE1872CF80F91E568BD389429E2B0CABAD37E8DFEE15047DC8A715A584AE71849C3A4AC31158DC1650266A518492DF3AE351963A9CE0041A078C9BBFA43CA6BB3368FE835E14FF12949FBBF902AAFEE0965EE6BA974F0DFC69AF75D2751B73AB50F99FCF85113AEAEC13DC8A7276002EB58BB3AD686D2C95F12B385AC69B4E36D25DBA0347EF9258BBE242CDECEE07CD90C70DA077B9F1CEB5A2FCB2DB8BE77CF9D6021D13FF4CF2460AF6B486809080D9968B69AB08 -sk = 2107204CD995F1DF14314D5381F8C5440F09A347502E161C24C3DA70FE850E80AA818301D60C70F3038153866DCD5D179E22DB59B8991B0405C4F72C66A3173A2DEF37EA9BB834354BCB234581B5F5E145EFEE238B70C4D99FC4CD811ACF6A1483DD309E87E8E4EFAD10710E1387644BBB5BA2561ED623D4D406A687C08D4AB86E5510BAF22D07112660DABE21A5F6E6ADD4912A7ED8B79738D6CF50EC88CA9526F9F2B6C299F1DB78B8C468D2A61BD138A8A4DF8A139289CC727246EA0C401AA475AFF9836740B242A7DC93163ECD9823C8B92F615B288DC8BBF65BEBFC56318E73C9F8BD8FBFC93E45624017BE7A00B118BEBE023C3D7738D3D85EFE1872CF80F91E568BD389429E2B0CABAD37E8DFEE15047DC8A715A584AE71849C3A4AC31158DC1650266A518492DF3AE351963A9CE0041A078C9BBFA43CA6BB3368FE835E14FF12949FBBF902AAFEE0965EE6BA974F0DFC69AF75D2751B73AB50F99FCF85113AEAEC13DC8A7276002EB58BB3AD686D2C95F12B385AC69B4E36D25DBA0347EF9258BBE242CDECEE07CD90C70DA077B9F1CEB5A2FCB2DB8BE77CF9D6021D13FF4CF2460AF6B486809080D9968B69AB08 -ct = 83E19BBDCCBC39BAE4D61E3FFE4688EE5E2D69C0589F49D976089315753DE7D7B494D9513CA2DEC922DEB8914B8E85984790FB995D234189554F598E3B531C8A09EDFE8B72554B0D4CB3C06C212CFF0340FE476E1B34100DFE9B0CF896DB0D4184E981329656AA727D55605778A32BBB017F4DD31C6A83DE3ACE8B711F323217F3081E76B644D8911FA35207EF01B265307DBC38727D7CCFC9D8430C4631CC26E87E82CF1ED1127A7174557A6DA950B353AB89587E3421705A96BABA2F320A66613DE4BCCFFD927967456BD726DBAA22138D4F0A5DFCDEBC46DED8BF54508B20670AB83C37BA1DF7070051C5CCBA3F9498E3B6152D30AC1EFF825733D4C1F29746F821A4EDFD24D3151FB43BF22C2B05CE3463A5EF04A45C398FAACBA206B19189971BF0D68F52770C0A5B3D9EB218C60344D9DA55ABB193088409F587D9BA003BA7EF225B215BD4D0EF14B5F8DD8422FD6E0042E8C7119BD6D5D59A568104936546056740EE09A46D2AA2E27E1E2FA787975430243CAD6F5E38ED96B31D40D0F4193EAF3359360F2F56A0E94D62E00DBC92 -ss = EABE408DD38AB61A83E0E1515ED453208B6C687EFD749C02 - -count = 56 -seed = 687C02DE1041ABAC7B2C1E6EC2A7C3375552ED5EDB10E3A8139C24CC76BDA44D719D8121A81D47A0B762B4E9EEB85235 -pk = 2D7EA08921DAA4C52AAD77E37C5C02F633DEEBBF793184C5DA9DF45CBE5F5DA56D8F4D7E61E517DFF0FF4C2849ED0B2D2B83570EC8935D2083760553A7A134EDBC01B44731B3032A700300DCD25CF8443B39EE22F0DC960C409886151D2C777082EC9E342D373912684AC5F98BE3CABD509CA7141DCB6F24D67A428C9C39AE86EE7BEECA86D70EC57DD67789B998E5239A6A1C624DDC6991B05BF9F70A0070913B9B0D64AE60AC20B598B18C1476CD22FD1474473E277EF6743DE4E6018C4E306D24CCA8895E1F2459305BDE9D466BF54F5234E1491166D58DD1BA56962BD6C0BD6632EB9799BD7FD6C7F01FD835C14ACD4532597FF500B4C14A7E1AAE3F0748E27AEF6789E93A42AD10E57DE310BE2F7D5DFA4FD8F0D9DA4A3ABABCBF674999A1126CEC08C22272AFD0C6A46BE8A0F738609B7633F37CC9F2A0166051CA343351FD244469E15C882A454D91BEF6ED3C88D26CBFD0AB003C97E7C9A9E53C259127FEB5336564135F14F519C90D4A5ED283B9F9D248A24254331E -sk = 63A925685A8AC5BBD918FAA33AC397D1FFBCF99135D9DA7C3AFDB8A246A56EE71465591831C371F2EB87467B0559DEDD776BA063EE6D2F032D7EA08921DAA4C52AAD77E37C5C02F633DEEBBF793184C5DA9DF45CBE5F5DA56D8F4D7E61E517DFF0FF4C2849ED0B2D2B83570EC8935D2083760553A7A134EDBC01B44731B3032A700300DCD25CF8443B39EE22F0DC960C409886151D2C777082EC9E342D373912684AC5F98BE3CABD509CA7141DCB6F24D67A428C9C39AE86EE7BEECA86D70EC57DD67789B998E5239A6A1C624DDC6991B05BF9F70A0070913B9B0D64AE60AC20B598B18C1476CD22FD1474473E277EF6743DE4E6018C4E306D24CCA8895E1F2459305BDE9D466BF54F5234E1491166D58DD1BA56962BD6C0BD6632EB9799BD7FD6C7F01FD835C14ACD4532597FF500B4C14A7E1AAE3F0748E27AEF6789E93A42AD10E57DE310BE2F7D5DFA4FD8F0D9DA4A3ABABCBF674999A1126CEC08C22272AFD0C6A46BE8A0F738609B7633F37CC9F2A0166051CA343351FD244469E15C882A454D91BEF6ED3C88D26CBFD0AB003C97E7C9A9E53C259127FEB5336564135F14F519C90D4A5ED283B9F9D248A24254331E -ct = 7D07124335949EFB5EF3FE6101C6F57C0003A2224DA08D9278981B04CC4D020983A1EFE285B2ED923AE520D930A63999950B67F8FFED5D5F4CA5506726BC202196DCC9FEEED4A8337D94F310F2D2FAB61C940F8718C163DEA1EAC752B54B359558031B8D04F1DA3271863399B9A2BAB73D8280145B13D74C2E1EA709A93C39B47C89BC6A60A6E00B52242630B7D761CFB63F63333A0313A3749E59A59CE1AC401AA578DC2DD6714654E95F2ED7F58995149871E66C14EB59BB564478247A3B27BFE9765EE98A6E1BE199235562D2FB398650C0534E06CEBE692439D729C5B5E98BEF341D25DE6DB03A49135B2D0DFE38FF595541C853249BFD1F200B48753148EC2AD5EBDE458D420E51CAE86AABB8FD8C46B9E3D71C8C1F3AEC2333C0FC70D1B6B4E5A8AD647254492409D7254E53A6DB2080151183CBA0DB161BE64F9A0BECB6E66FD7EF1798F592C1E06965A36349954E0B882EE98BE5206E6C894D660F1F7BB0526AA3100D354A815C080922D1D82359B7A1F1E998D8D512074EEFCCE28F5A220072A588F448DD2AEB3396B3A0FE9406 -ss = 3CC2D29433CE0F0B2CED2B8EEC0000798EEE8C0B93D2D1A7 - -count = 57 -seed = 4142237070C216BCBE245A39BD9220533C97651D84832B26727855AD994A0760C52B9319AD404693E4248B8C5FF324B3 -pk = 247344A11D63CADB095BFA6F6B88D8042AA0F5C99CAC728EDCBE57D9F43087A7E8B0B495E5D274366E57E7E4511BF1558678F265836012479B686AC5D12D106BBF84DD13539E4B29A9F9232B1C25B80961537A17537E5556B8DA02F004CB11B584503141A9C253ED5CF350777FEF37429F1A3E0F505A8FC0ACE0832F4C189063A5B6DAA4350BEFBA31803D8CEBC6FC78090CB08581787FA8C59FA127079084DE83030661EF6DF1753151BFE2250418C834CD17CB15EBA947323807983440C68747FCED74B2BFEB306E972347339698315EEBDE4695CBC39FC92F9BF491FBCDAB166CAF93AB4B8E78FFB943B8A4B45FDB36E601BBC0DFFE01472D2A345BC5CD8FC98475ADF52BF53584672098A09D5AA43E7A254448991A2597BAB9B366413F4507E093C0CFC2003F721E74703DCBE0074152FFC7A2588D3A1B0A2952E1A38727F93CC2B88FA25A4F31C836D0667728F2396DB6D45189E13425D323C92A3CD62D433C4AD898F8244F0C8075F7F99E73D1CF3AD12A4618D61AA000 -sk = 6A1AEE5E708C1B47F02BDACCE4F56C860F74FC7CFEC1EF3B230E05B7114FF0395CC6634DB1EAE8258072D09C09F291E92D6620B177DC5007247344A11D63CADB095BFA6F6B88D8042AA0F5C99CAC728EDCBE57D9F43087A7E8B0B495E5D274366E57E7E4511BF1558678F265836012479B686AC5D12D106BBF84DD13539E4B29A9F9232B1C25B80961537A17537E5556B8DA02F004CB11B584503141A9C253ED5CF350777FEF37429F1A3E0F505A8FC0ACE0832F4C189063A5B6DAA4350BEFBA31803D8CEBC6FC78090CB08581787FA8C59FA127079084DE83030661EF6DF1753151BFE2250418C834CD17CB15EBA947323807983440C68747FCED74B2BFEB306E972347339698315EEBDE4695CBC39FC92F9BF491FBCDAB166CAF93AB4B8E78FFB943B8A4B45FDB36E601BBC0DFFE01472D2A345BC5CD8FC98475ADF52BF53584672098A09D5AA43E7A254448991A2597BAB9B366413F4507E093C0CFC2003F721E74703DCBE0074152FFC7A2588D3A1B0A2952E1A38727F93CC2B88FA25A4F31C836D0667728F2396DB6D45189E13425D323C92A3CD62D433C4AD898F8244F0C8075F7F99E73D1CF3AD12A4618D61AA000 -ct = 6C1CFA35A295B889CD2B8AB7FDD37BA2939DBA381C3F5F69648E65A3BA44B218A50290DF66614255C0A2B0C2B3F6756BC2599226AB4DF1B5EFA05AF4538B3E0909410CAD2095A8561F37A3FF5ED594163D1518E02C98DFCD01267D6EAC8349126F558D72BBB2705B2F8717A28C0B92EC3DF996BEF59C22C621DAE20E411FF92081BB06C5823C975A241020E0316946E5A2729932CB8C4D0CA822D5A08933735AA45783E674285406C75A55A5B47CE99B0C8E86EE937E8B9B67508B7C3C3CFC53B4456CA4F2717A8BB27A632EFC2E5700305E1021C8F9ED7594E1E938DD9877B11A6FBB84BF4FE0F8DD509B61DF4E49F99F067E65C1A7D93F9F48762C1F480B992B7C1D87A63D3301C99E8412F26EBE722F51C47FD3865BFAF5F5D5C930C89BB7C0455075E15F3E1B75DA8EA734388BE486DBF8B3706B45162EB235D1BEA4C0E466D6D9A56FC6C79176D037B5A05E926A8CE23713462B2F9A87344DA0F93AE80569458341D32082D0ADEA146886BABE5705B5278BC86BB03F0B03167FF23644B344490B513AB6ACDC72417A556171B6178C52 -ss = 15ADDD6F14BF3F56D5EC1747A00A4BDEB6E01EB242D939FD - -count = 58 -seed = BD334D7B7EB14E00E68863F2E5551A095F8AF10681C28353FD19B9A7E70B8BFE266840860609008A567ABC66316C77CE -pk = 9FC6442A616B1E9D4D14E604BAF066077048ABBB5583A1E9EF84727315E944318B79EF9BFE9C5803E35580866946456AB855F3ACD00E0EB99C8F8E52033D1CAED972AF9C1E9E2ABB5699E34D768514F8241B2428D1BD76A319F618EA0FD003FD07DCA0CAAA7DDDC0A7AA6342DC2CA49D4C95716146A70EF34062A558FE361F26DA6F30E917BD732D7BD27CA3579675F5F67094F78224A83824765D051501B287113E6E2866762BA3BBF209D53B629453C4C2BCBDF80A9C4C3963801601582512C9CD490FE880AE6C2CC2092C6C6C749BD263390FFD294DA90094934D39534976947B52CF4709B6AA64AB7DF874B8C451B6A706FF6B1FCF13F8DE613CE036B1D897756E84E4E80961AE4845A3A6029405A08D93C8BA71D015CB64CC97D4DBF93D858F27E054488F3702E00E9329D91DD0BFFC38B9B95466B678932E6BA9D7A940E66FD8C43C54CA9FCBEB2BF72FEA887A4A949A282B103D556CC63CC737CC9FC1ED82B9E686E6633472EB16FBA5A282D3945B6A246490B312A819 -sk = 6396B328B100E4C7F4BCAE69875EDEA1A1982421558C608C1100CED48ADD211A5C937B8D6079D8E271AF3F949EDC61F70E60453AEF20DE099FC6442A616B1E9D4D14E604BAF066077048ABBB5583A1E9EF84727315E944318B79EF9BFE9C5803E35580866946456AB855F3ACD00E0EB99C8F8E52033D1CAED972AF9C1E9E2ABB5699E34D768514F8241B2428D1BD76A319F618EA0FD003FD07DCA0CAAA7DDDC0A7AA6342DC2CA49D4C95716146A70EF34062A558FE361F26DA6F30E917BD732D7BD27CA3579675F5F67094F78224A83824765D051501B287113E6E2866762BA3BBF209D53B629453C4C2BCBDF80A9C4C3963801601582512C9CD490FE880AE6C2CC2092C6C6C749BD263390FFD294DA90094934D39534976947B52CF4709B6AA64AB7DF874B8C451B6A706FF6B1FCF13F8DE613CE036B1D897756E84E4E80961AE4845A3A6029405A08D93C8BA71D015CB64CC97D4DBF93D858F27E054488F3702E00E9329D91DD0BFFC38B9B95466B678932E6BA9D7A940E66FD8C43C54CA9FCBEB2BF72FEA887A4A949A282B103D556CC63CC737CC9FC1ED82B9E686E6633472EB16FBA5A282D3945B6A246490B312A819 -ct = 5ECE6B89BDC8CA7843493040B9E31E0C7DAC41A23EAF2B4317DE9A444F10DF86C877A29C6BD6AB3898634E37FA391CBFFC356D4C304589FAA564E2962351086C214E5FBCE1D809E961BC8D7138056F1F2A01F8C2EC246C2624A1997700E8CF65DBC3ABDF79B6ACFA6F8435564FBE3C04A06F9FBE1587726235610EE1A8153C816D40AFA0510F157267FC6003FF44C653F197C7D1EF8315564A82898AA3F6775AF68B2D352B1E28F79E4317B3E8E4EC83AAF9DEBAA1BA424EDB4DE2DF0178352E01567560DC54762C07F1E5DF732764EF6741A64DEE31D04FCF74E5DF9F23CAB1C7823D49588BBB77C9D70A61F0A0D771A778695DE565110C6BD7AF26DE441304FE78827284D3C635C17E9655E1E3B034C1B072BE0AAF78F3513772CC320684A80BF0D78EF8FC2887F4D42D28265EE611EF15E8F027F1C618393428102DC14DA76C6308BCFC087592181EB8256388FBBDEEEA6B91F69A991E3EE88DA515EC561F70F75FA5342A969C272724DFC376888AEBCED23AE910DD9E271F7805D8C9024CBD6E1014E0B9EEBCC1F8146AA8F21799C15E -ss = 609CE20AA0876C387C66550A52B0EED700B56BE5D4E1B5AE - -count = 59 -seed = A0264C58AB1F2CBCB212077FD378D340307ACCB31F1312137CF84E3D3135044D4EAE8BD38BC3E540A0C14D46458F6179 -pk = 0C84F64BD6A8A8981A7BB846BB66329B8323795CB2ECB58CA242FA6391A38AC78D5C2F2355207F4A37211976CE2C552D21DD5B2F35ADCD2ECB502AC85A4B3350E076F843DBFD5126238175AAF041FA98BE3F4E3D86656DE9348C4B0DD0352F2C49BC0EB71ED650B809DD428CCBDAF30F4E9D3D3627F5B30C124313F1B33B6764CBD00B8A90FBF9F5DC737768FE25A570602A02AADC057009C487B53ED07D8DCCDD4148BB9FA1619BB0C93777FCDA3CD25B9F0D8CC1D0C34F04D3E1FD032D1B6918686D0C3A647C348DADF60CFFA0DB45CC3F0F70C7FD810745189599ACFFF9BDA5A865E108556F11F4C34B9ADE1C716BBE2661B859D52F333EDE1D272857725BB22B35C0F95391818FB461E510979C6E72300F86B595415D940DA0E57C9873489F67F38FE7ABD9C8D4945CD71E96325F43F154F275CCF1A58CC22E758251018F64D2151C0C844C607E3230DC1A6345FFA2909C19E5A05E5747B89BA400E5D8750711AEEAA37B25C9C19706C96422AE32E3C2C42BBB4ED1ABB32B -sk = A453BCACDD2B0D4646009E5ED451C3C45F08FB827EF733DB7A3CC8AA3239D4C52CE4C95AFDEFF6EFBFACAC10D294EDC0E7CF4535059BFD0A0C84F64BD6A8A8981A7BB846BB66329B8323795CB2ECB58CA242FA6391A38AC78D5C2F2355207F4A37211976CE2C552D21DD5B2F35ADCD2ECB502AC85A4B3350E076F843DBFD5126238175AAF041FA98BE3F4E3D86656DE9348C4B0DD0352F2C49BC0EB71ED650B809DD428CCBDAF30F4E9D3D3627F5B30C124313F1B33B6764CBD00B8A90FBF9F5DC737768FE25A570602A02AADC057009C487B53ED07D8DCCDD4148BB9FA1619BB0C93777FCDA3CD25B9F0D8CC1D0C34F04D3E1FD032D1B6918686D0C3A647C348DADF60CFFA0DB45CC3F0F70C7FD810745189599ACFFF9BDA5A865E108556F11F4C34B9ADE1C716BBE2661B859D52F333EDE1D272857725BB22B35C0F95391818FB461E510979C6E72300F86B595415D940DA0E57C9873489F67F38FE7ABD9C8D4945CD71E96325F43F154F275CCF1A58CC22E758251018F64D2151C0C844C607E3230DC1A6345FFA2909C19E5A05E5747B89BA400E5D8750711AEEAA37B25C9C19706C96422AE32E3C2C42BBB4ED1ABB32B -ct = 09147DED4B9C4DE5ECCF4A7DDD855656320D2CA5FCB74C93ACC54EA20B68D229C7002BC29D54E35991117CE3DA525ECF7D6CDE69CA2B6FB1C08173CDDEE5194FF5945AAB4B45B59D64734704847D3622D652A497793AA730DF4FDC5B75E084074E3210FAE181DDAA5B32BAF844207EDCBCEA37C2482171C7CB91248AF62CCBBED27129A7BB676EAE246CB59FEAE530BD5C72086946176804712938EBA0E99C34E3DC795EA508771601AA70A5C7F8747EA51EE21E9491CBF904E88EF42775F83943CC72D0BF41169C82332061CD50FBECB6C4E1B6BA22680D85711E2A569BFA42307CB750E462B92AB1DFF342F0248BA5B341A2061CFE36D91200C10999E2962B1A14CB2763EFA1D473B28DA99ACE0A1D6F3B1CE0754ED403255D9DEA1644DEABCA080D1686160D7D0AA4BFCF0E2E92B1425153429D1A9E6B08BD0700F40999A0AB9C548CF2238F3B5412C612DACBF626EC1906E1B4334904E53342C914350783F39252E760B0D6C1CF5AB248B0245AC7CBB5C18FF86475323C2F003E6E219E08EAEAB6FEF5DA019114C04180F078CADA627B -ss = DC5408384C412EFE0E18E8BDCF488CF5D0534867A416A697 - -count = 60 -seed = 99A9CDBFC674AB3FF2C64CDED7D697A6E27A767434A47AFF7C3FBF3C6A22D6043D27868955286A13EFE3DE36D22EC48E -pk = 3D3C688B33D04EBD52BB6946B4BFBB78AE03F1622B44BCBD4B86553F22EB09EC53753A300DD3827F3BCD11CBEA41987956A41207BB82A078E792D3DEB8E8193FC52ED8014B18D122818B7FD268EE02470F697ACA38E944A40BC665133C40BA924AE00D6EBD5EA4E064C64DA1AE2D60302AA8EC65E78FDC789F4CEB0C8D0B2C0A843C65DEB65824CD506F67563D991E32D88A8E0D2B70C18A4E2A69CAABAFA80FCF885CC919EC8CF45CBE74A5FA138C28714EEE6F472226F30755185001FBB915CCA2C92DB7FE81ECE68FB0F74692320844BCB75D8D17D990D6BA467F37AA542F531C5918B4CBBEE2818DECF1F42C27696BD37F6A1DDEC8095EFE7B0FB9CC78E72B500F1FC536B199209B2A80A7639FB3FE309545FAB6A5B6CA8E8C54F677FF76B41D90302B3A018777845E1C9ABAC2FABA497F41F0AEFF20E4252BDD6CC3168990E1F22BBE6FF1F3D35D9861541DAC57757D3A0F19DE74C719D988549BF9D5989D71F7A76FA44E34AABCB1ABC66C947E9CC0B0740FFC6EA93E1C -sk = 47CA2B77C5B717F423222C2730CA5CB9C856BC951D01B2B28F1481D7CAB000E33FA07DE8DC9627A85E76FABB4428A3376E66300CF12A07073D3C688B33D04EBD52BB6946B4BFBB78AE03F1622B44BCBD4B86553F22EB09EC53753A300DD3827F3BCD11CBEA41987956A41207BB82A078E792D3DEB8E8193FC52ED8014B18D122818B7FD268EE02470F697ACA38E944A40BC665133C40BA924AE00D6EBD5EA4E064C64DA1AE2D60302AA8EC65E78FDC789F4CEB0C8D0B2C0A843C65DEB65824CD506F67563D991E32D88A8E0D2B70C18A4E2A69CAABAFA80FCF885CC919EC8CF45CBE74A5FA138C28714EEE6F472226F30755185001FBB915CCA2C92DB7FE81ECE68FB0F74692320844BCB75D8D17D990D6BA467F37AA542F531C5918B4CBBEE2818DECF1F42C27696BD37F6A1DDEC8095EFE7B0FB9CC78E72B500F1FC536B199209B2A80A7639FB3FE309545FAB6A5B6CA8E8C54F677FF76B41D90302B3A018777845E1C9ABAC2FABA497F41F0AEFF20E4252BDD6CC3168990E1F22BBE6FF1F3D35D9861541DAC57757D3A0F19DE74C719D988549BF9D5989D71F7A76FA44E34AABCB1ABC66C947E9CC0B0740FFC6EA93E1C -ct = E2E61AB7F3D376CCEAC5B399CAE8A430325725639B2730F9066DAA5A02EB2E56D360D63D4B482A022D13EA5E8583F21F785B9DF2B337E2BD1D068E7010891CDE053CDBAACEC626E8D5CD4E790E7AAA89DCF09A47797C4486829CA14A42DAA17AD310D2D8894AF6867C975A390FBBFDDCF18023E285FAAE5411C2F17E7430684929D8D2E3C347D71B8B3E60BC7197C05462CC03581D61DACF6E88C6FBD4D972AB86BF4C63949516DEB71C4097E7188398DDFE5451D6441227E8E1CB771EC1B6423379E53AF1821356DA7960FE0E1E512A6394D810156624C845789063FAAA54A91D157518763012C51F3AB883E51FCF39127E74FE8E948B38654C9B3146CDEBBB804E6A4AEFBD565FC4966E06A2EEAC15AD4EA60BBDFBD908B1C67D29AA29100E146839B40AFAB1BE1B411F0D34813D4F9E9FA8C9CE8986E342C03541AC1300E099A265ED7E3D8B4B7E67D3CD83AE2AD7580E39E7563069F7FF2D99C5793F9EF7B0ECCA19DD8DC2C4116FD86ADFEBB5C2D3F202F82AEF6EE7E2290A369BE301C7A3C56D272AC27301F477C2E52D314279E93A -ss = 6EDF4309E3AC18F07A764E64386AEEC8750E934997BF8684 - -count = 61 -seed = C799D57B41F28C5C446DFC58A5AC6499C4BCF3C162AFD2B09A16549826EC2A6F689E44BAFC4ACC82F5D6AEC23F4A3993 -pk = D1EB446EF2BAF3602E244109EA6AAB12BF0207480F96292D837C2651E04C7851AB5C968D410EB824E170C9B84D47F372798559199FD6BD9B688ED23DF3E1305B65CC4392917C2464FA51193A1507C7BD716F447A55D17A389175962630496069D482423E00E86163A88F3ECEC0C88D3885F050F5929632CFA314E6FAE413D0E043359B9FC11C9605BD5548984C215C994BA08E27119AFB29876ED94DB3D381CDE9E0FBE06A6A421CCABF0E3742390B5AE21B3D11C3616C6250E6CDD2161E250E13DB6EA8AB2EB40FB05C551BD31C0E140933FAA5C408BF80600A812C39A3F0A250F305CC3C6D451991496E9AE2CECA372893B47F0D14043C7CD5B70CD719179C3CD03E86F5A072A92761DFB368E13FE4960994362371D1F7CB64BA11B8E3AE336DCF73C7D4C2CA816894C518D60F7D6ADC20285F2C70EB0A56BF264DC87344F29D1D4D660510CD0E66C483E0BF3450FDF5DB28EC764754B305583026F79B4E7A900158236605F47E546E26D2DFA249950F09A414439717524008 -sk = AAF6EB40E596A5E3E8218871E708B089240DCBE7FD3641F0E2F8D320AC3CB0C52EFDC753282F092BC39BAF4A18783A48EA031A191865EB08D1EB446EF2BAF3602E244109EA6AAB12BF0207480F96292D837C2651E04C7851AB5C968D410EB824E170C9B84D47F372798559199FD6BD9B688ED23DF3E1305B65CC4392917C2464FA51193A1507C7BD716F447A55D17A389175962630496069D482423E00E86163A88F3ECEC0C88D3885F050F5929632CFA314E6FAE413D0E043359B9FC11C9605BD5548984C215C994BA08E27119AFB29876ED94DB3D381CDE9E0FBE06A6A421CCABF0E3742390B5AE21B3D11C3616C6250E6CDD2161E250E13DB6EA8AB2EB40FB05C551BD31C0E140933FAA5C408BF80600A812C39A3F0A250F305CC3C6D451991496E9AE2CECA372893B47F0D14043C7CD5B70CD719179C3CD03E86F5A072A92761DFB368E13FE4960994362371D1F7CB64BA11B8E3AE336DCF73C7D4C2CA816894C518D60F7D6ADC20285F2C70EB0A56BF264DC87344F29D1D4D660510CD0E66C483E0BF3450FDF5DB28EC764754B305583026F79B4E7A900158236605F47E546E26D2DFA249950F09A414439717524008 -ct = B2403DDD35C1BB4FB11F092612BAF1B8B634869E09A0B742AE7FDFF1E6AB9A91AB7E1664562FA391FBAE15D362B82159F023279D1644C8FA35EE07F8EA4A0A60E5CB075434362E36FC206DB82CD755B02CCADF8C207B431A8532028EF5B49C3E04785B5501A4E7447BA3E37EBACAFCB5099AC87B483462E95B0B7633A33E28E455FE8DCC64EA4AD113F51D836073B5B9803F10FB893AC5C51CAD14A39C5C231A602BC22F27C71E99A394A273FBA9D1C27FA5E274809396CB8294C6151C63A77DCF19B67FFB59F9D5C757ABC47184F9EA8FD1927E9AB8018AC1CF51436F9B0DA722DA4321241002A1BBA555FB6FDFA3AC8495E69F3ACA9F6B077AFE283065CAA0EE357CAF662D1BEE3CD346B7E42B0A9A24F814A289F7B9BF03DBFF14A3C7909CB51A12A2C30B7DA004761CDCA96B7247F2A749842A6DB50424FB0A68AB617D998F8838E15F9065DE8503E07C774843CC712D5B297DC512E19F5C9FC1C758A6E90E10C191322DA1A699FEA371884AA94DD559B245B0E16505F700D09659714F3EC88C3D86DA1265E324D14F7F5245E2BBC56A -ss = 74900EF600281F369AA1B1D1472FBE03D608C826E33CACDB - -count = 62 -seed = F7AE036A0176A9DE9A036A542DD2840033277C44AE936D10B768566216DE9D4395CD42B116873B69D9804BA6CCBC05D5 -pk = B90B8741AE5F12DD55EF5848E232BA0D8E116993A2D12C8DA825F7A7D799B172AA87B9182D60081D3E821A2718E74C28ECB1F2ED63FD97A2580B8442FF4D1E6C53DE038E57403DD3E1F7EFA01840B9F45A496176A16C946BE9164F81DB8C0815A170A1A9D11D797865134EEDA2788164C09A82FB2C10955D009DB09BEB0959A696E7658B03B0FADE41E465E1901EB55E79F91D18EBD038B8EBADA69759A99EB5B0D738DF6DE3597D9ED013BAE470A2642BA33372F95D5DF5F4AA97CD0480D014448F33E39EC7A98DEF6AFA4D731B375A3D82090A8056EA26184BA3F11AEE82F5183E37A74DA7F11543415C4583D1B512FE4B8490AB49024A40E8501E06B34455E6B896EACFC64D7D5E2D731CC18331B2C986539D568F458A70792D1E24B3A042DDB34F4A3549F0CCE8B9EBDD03CDCA08A389BAFFFC022650A21A2D6961BD3C2DF6F4D5B640D3E74BBC468AA6C360BDD42CCBB6F4C4788431AE00C1259CF199A5941CBB057679BA413323C402AF9FA2BC707370240EB02D26642D -sk = 6500F32C93415CFDBC0BD31D78D5BE95CB9060C8CFA20139393308641A9A4647F230201E1389624A296B55192A9819FCB19AB77C25F95405B90B8741AE5F12DD55EF5848E232BA0D8E116993A2D12C8DA825F7A7D799B172AA87B9182D60081D3E821A2718E74C28ECB1F2ED63FD97A2580B8442FF4D1E6C53DE038E57403DD3E1F7EFA01840B9F45A496176A16C946BE9164F81DB8C0815A170A1A9D11D797865134EEDA2788164C09A82FB2C10955D009DB09BEB0959A696E7658B03B0FADE41E465E1901EB55E79F91D18EBD038B8EBADA69759A99EB5B0D738DF6DE3597D9ED013BAE470A2642BA33372F95D5DF5F4AA97CD0480D014448F33E39EC7A98DEF6AFA4D731B375A3D82090A8056EA26184BA3F11AEE82F5183E37A74DA7F11543415C4583D1B512FE4B8490AB49024A40E8501E06B34455E6B896EACFC64D7D5E2D731CC18331B2C986539D568F458A70792D1E24B3A042DDB34F4A3549F0CCE8B9EBDD03CDCA08A389BAFFFC022650A21A2D6961BD3C2DF6F4D5B640D3E74BBC468AA6C360BDD42CCBB6F4C4788431AE00C1259CF199A5941CBB057679BA413323C402AF9FA2BC707370240EB02D26642D -ct = 818C523C10EAE59B093DFEDC3083B4AEA2F86DD8F902CB935D5F984FBA9C2E453F971B90EC326CD02B3C6C5FA25CD3D5D3ED3CC2D463DD7D5550427E0A0A3E387609BEEE98F723C9124B16D7B59955488EE008C40A25F7F7F6E6621A826169F7E8F01382AF6C5F49136742C61899A97B38376E35DBA5E65E391A5951B91B86CFEB066E80D82B06A0C0F5ECF326A411A2E5C49F58CA6B1F95DC7E79AEF474BCB1E485836E2F220FCF29CC5CEEDDE1C2D374B27A116B84BAEA728C88F51399AC8FF101F384A9AEE0FEB03CEC12873B406F486E8D64DD15F65A475A91E5F98337CEFE2861AB2C63C291DB14242BC0D0892BFC929CE0ABDECDAA4C2B05118C4300D69334679C64662F0E34321941A0E5BA638259A2410EC56D18204A96837F5A0C186F9D0436FFBFEA8612DE6F665765A875E676056EDF700A0E0F102D0889E7D0A93238013D38D7C9BE7312D1C96C9960FD3C28A6C62D874155AB1672D4B09D4F1D051FBBD9863CCC80B20A50966E4659DD03265816080E6BB614222D63AECFFA58C2A94539700CEB3A825E4B5B0041CD1610E2 -ss = 45EFF041C387924E111B34C419C409635FB2F40B78F975BA - -count = 63 -seed = D995D38F934B6E1A7CA77C9522E3D037676CC939B0C8BD4B84394B3DC91A791F09D2D97199258C9943DA955E7F7B26FC -pk = 15410A1BA1E8219D746C3D0E7DCE545773874DA03DCE1B66FEE732E33D60530E8E4D0CCD522766B322E0C3128E0658A592C8C032F43BC4C54B62E978BEF61330E6FB36796FF7362B8F4290A0FE1180A984405CE2D6877463CB889B4FFFD3E3338D69DC0D55BD915B66D3798A49063B244D0672B2D61CFDFB4CDFDE4D2A0E108DF71BCFB856D2F6791FA4677CE293F1E5CE95EC0A9E6C0B4F5A32EA8F25EB37BF942BC8C2636ADB01B1413295D08BA9ED60BA65871EEC91A4D1EBD1950972639D1A55EAD5B57A800F6079EFDB8927D7E47796510C57F80F7A46C8E45169EF34E163860250E418FA8C324EC74EE818894B15171ADB878C7EE6FAEDE81636E698172E2CCBF72A9AA8D9E6520CD06B54D2B85F79F79F3E5D0E14ECD4697CA09D759361B88925E64EBC059580FEAE9677724F1C61FD481F7DED2C1BDB2A914513A96FF263099C8119DAE66FE660E98F0407FE906F877191CE809F41DE6D8017DBB91410CA3CA00C1CA679211B130D938B37A00109FD9D1E6725CA2832 -sk = 7643CEF2D62CC5AAEECF754653EA62294CD2208E5BF3DDEEEAC9D531A532770837A854B4F5531F6E0C8D6C10183B30D3435498C2DD14290115410A1BA1E8219D746C3D0E7DCE545773874DA03DCE1B66FEE732E33D60530E8E4D0CCD522766B322E0C3128E0658A592C8C032F43BC4C54B62E978BEF61330E6FB36796FF7362B8F4290A0FE1180A984405CE2D6877463CB889B4FFFD3E3338D69DC0D55BD915B66D3798A49063B244D0672B2D61CFDFB4CDFDE4D2A0E108DF71BCFB856D2F6791FA4677CE293F1E5CE95EC0A9E6C0B4F5A32EA8F25EB37BF942BC8C2636ADB01B1413295D08BA9ED60BA65871EEC91A4D1EBD1950972639D1A55EAD5B57A800F6079EFDB8927D7E47796510C57F80F7A46C8E45169EF34E163860250E418FA8C324EC74EE818894B15171ADB878C7EE6FAEDE81636E698172E2CCBF72A9AA8D9E6520CD06B54D2B85F79F79F3E5D0E14ECD4697CA09D759361B88925E64EBC059580FEAE9677724F1C61FD481F7DED2C1BDB2A914513A96FF263099C8119DAE66FE660E98F0407FE906F877191CE809F41DE6D8017DBB91410CA3CA00C1CA679211B130D938B37A00109FD9D1E6725CA2832 -ct = 45BE3AF36D2C46DE00A1A108135B8A756EB76C9E6CA13D05BF3F915C0704855726AC6254DCC117CF2A22D29DFC8E227506AB9830E39088D8C23E7DDA5A2235D521533A83890FBDC2EA2487E5AC9A37CA1076DAA030ADBC8873CF3B3F8F911926AAEA74A622AF57174346ADA98ADC9551087566FD880AEE8C5B2A6086B422053C65AD7C871D06F0CDB2B5E85C9AC3329B8FEDFE6937C6AB0C6E8BF95DA6EC9899D6BFEB39616881C22D14F6F66464BE2BBF59A6F424D3A2D4814EC7D30643A0271F22723A63CFA64D701A93E2FBE3A431AB3C549E0E063A426ED1ABFF7B617F0B475710E6B8D402567D893BB21B3C1FD0035D6626C96DAB854D9FEF2E2A30B1A8EA2C24D6EC76F66D0610C46A4AD44D02F501E3FCCCD7A826586B9AACC654CD1D5E258D568E04077E145D5F1467CDE788DD36C22B710684D8B68C1A85049CCC3F6769E6CF55A1A236661B86D940B7AF3E2C48497663E5DD6D3134FD7C79235988EE40F3D5BABC34229CB98C597AC74E745DF822D119421AC43B19705D0004FA92261EDECAE0058D3992864E50FA3D564D9B97 -ss = 6709B260549C1BBAFB6A97C9034D8F67ED3F62BB1BC80C1F - -count = 64 -seed = 5929F02A271725CB40200DE32D9D03D8BEA53B53AC83186C42C7F565CCB1CA508305D470850CF86E9B2C61A5B8CA1C93 -pk = 93D631D8B20BBCEEDF747C9C0F11E3FC1D4FF941918FF83BE03E82E940E900E6834E677253BDD5A9D31DCB51583E8B03BD5D77BEB07EE5C7EB5970C191FF30640A7AF99E215E2E7869DACB85FCE00EC81E63541FE5715CD32C42403D5A030ABE7DD6AA7C01EC3887091663ADAA63749FA9B4EA3CE9AC7162D3DC17E52F1CDC266A4515142C338B46EAEBF57EAD51843BC280014A4614051A34EC19AB00D8D959394CDBA9CBF3316338B45051B941BE8AAED12CF6E9E28A3DE508A8CF2CEE34817C1544E8EB5225A52589C0CB12BB6F4A9ACA0391FC113662F96D292C584E5484304C33B1D574EBE590C3C115AA4C53F8320A0D6D81028D007D0F7A103A97555844362583770698FE8CBC3E57A3559E11A70EC507BC4363D99620C4CB86029A94C72964445C0BC9827F55CF4CE36674D7B8F6F93C226261FF8BE517FA637486BE6B23D88F9CDB9C001BA4041E72257744480FD8B302F7E45C8417C976B8A12609CA55853A6C0E77BC58D26218FA3619678F0CC51D2770BE509605 -sk = F8EE95521060C03BB8DACC79F7EB7DB640F545F315613A353FC3D8392CB53F36ED647364A04E37278A0E0A45B720F4A75C580C9920EBA90D93D631D8B20BBCEEDF747C9C0F11E3FC1D4FF941918FF83BE03E82E940E900E6834E677253BDD5A9D31DCB51583E8B03BD5D77BEB07EE5C7EB5970C191FF30640A7AF99E215E2E7869DACB85FCE00EC81E63541FE5715CD32C42403D5A030ABE7DD6AA7C01EC3887091663ADAA63749FA9B4EA3CE9AC7162D3DC17E52F1CDC266A4515142C338B46EAEBF57EAD51843BC280014A4614051A34EC19AB00D8D959394CDBA9CBF3316338B45051B941BE8AAED12CF6E9E28A3DE508A8CF2CEE34817C1544E8EB5225A52589C0CB12BB6F4A9ACA0391FC113662F96D292C584E5484304C33B1D574EBE590C3C115AA4C53F8320A0D6D81028D007D0F7A103A97555844362583770698FE8CBC3E57A3559E11A70EC507BC4363D99620C4CB86029A94C72964445C0BC9827F55CF4CE36674D7B8F6F93C226261FF8BE517FA637486BE6B23D88F9CDB9C001BA4041E72257744480FD8B302F7E45C8417C976B8A12609CA55853A6C0E77BC58D26218FA3619678F0CC51D2770BE509605 -ct = 2EB25AB9DAF02C1E7F017BA2116349D66A014BABE29A6DE265B49D2DD620E6FF41586A93A7220319E4EA9C09FC272F2BAE6CE7122D11D79E9C51E46DA2DB24411DEDE56F888EF40CCDA80E3C67A9DCDD7ADF46EEDFEB6E702925E6D18D69BE70F354A2B18D597753B6D1A00B70FD72653E7222E4B8AED63EBCE5D826640C8FB78A77C46B0B42F06736DFD8DF8A4D4BB1D4EFB0D4634A241834CA7DB6C8A5DD19644E8BFF702DE1BA648F589591DD3A2398250138E66C859CA8FF3E413C0ED7E44BAA1F953CD66D5FEAC1B80492685EE4FDEF0D2FE24FC1BD0881795794A29C4CEAD837678501AB3F42F6CD19CCD744352F28B603F300D5F1B820132D7DD857013292E7E2C03A3CD61E51BC2EAD30A7437DB584B408C4EEC30CE3B49E742111814E6D8509AE6CE64440C22D64C0197BD0EB968237A889ECDEDA472D5C209E57EA88E398E4F0852B9C38EF27D32DD50407FB29EEF3348D77A8D3A1AC727C2B713B14A4836B8FEB4EE168BE1AAE4B237260A64BDF97CDDCF41CC7061073F848B97B5A58A99CC4358EF9A04BAD573586B67AE761 -ss = DC80EF72E53CB172CB6E9290CD310350E8304DC71BA1C17A - -count = 65 -seed = 905074033D7B75DEB2D06A2F29144EB377B452534C5710632989F02D45312D156557E96D4486020826DB200153BC4A8B -pk = 630F5938E8EB2CF9870133861FD28529930BE4A3167509F385128932428D6E3E6C4CB75AD1BDDB878FC64B1A15D83938590C20889D9507149457732BC5383832B705FD4C1618A287455BCB1B320A05B81F991C2585D003DE13216C2DDCF73E967E89D3D372CD009BCD27735784A74396125228BD4EFDE8E04A50C259FB24D25341567DA6C21136AA40C89943057E33E2224B3DFC149A144BA126B6982A12D61839AECC276DE4C4E145FF5D2396A308A368AD852F05D2FAA51FA57D250E67DD5E3BFBBD76C68ABD9954A11415B42959C8F583FFF91A22D18C0787C8E6EED9C371AB2CCE10C633FB6381A03517B142314E022404E72266064D25B978133B3240262C99968004F954F1B6C21C565C373BA4795CE60345CA3D90AA951AB5E5AA4A6E005234D72887EF6CBBE4A4FF38DF2AEC1BE3CD4D051ED24FF1D31684EB14A8329CA28610DAE6D6684992F09B36D1F42BFBD6174DEC4CFCBBF345973AC1D2F550CA5C421F12D61CBD2ABF78C9D1D55E6C965D49E7FF31B2B04040 -sk = B8BD0493A882E3A49B4E0F6256FB1FEA0912562FD9BA26ECD7E4B5D8021C486B9C3114D7CBBEB7CD49EBA8A61BC2BCAE1F1BEF30A1DAF70D630F5938E8EB2CF9870133861FD28529930BE4A3167509F385128932428D6E3E6C4CB75AD1BDDB878FC64B1A15D83938590C20889D9507149457732BC5383832B705FD4C1618A287455BCB1B320A05B81F991C2585D003DE13216C2DDCF73E967E89D3D372CD009BCD27735784A74396125228BD4EFDE8E04A50C259FB24D25341567DA6C21136AA40C89943057E33E2224B3DFC149A144BA126B6982A12D61839AECC276DE4C4E145FF5D2396A308A368AD852F05D2FAA51FA57D250E67DD5E3BFBBD76C68ABD9954A11415B42959C8F583FFF91A22D18C0787C8E6EED9C371AB2CCE10C633FB6381A03517B142314E022404E72266064D25B978133B3240262C99968004F954F1B6C21C565C373BA4795CE60345CA3D90AA951AB5E5AA4A6E005234D72887EF6CBBE4A4FF38DF2AEC1BE3CD4D051ED24FF1D31684EB14A8329CA28610DAE6D6684992F09B36D1F42BFBD6174DEC4CFCBBF345973AC1D2F550CA5C421F12D61CBD2ABF78C9D1D55E6C965D49E7FF31B2B04040 -ct = 4D5DD6632ED5B0D79DB34A8E0E6606313AE97DDB80CE5551667A7AC71C727073B6AC34C5F61B7DE541659675E2FB18747E4FBA71ADC9A83029B4104270A82203D8FCCFF49B8ABA725498544F36CC2FE40485171060A3F8E1CB6BDBEA4FAD74C71676A90130379BD1590D8CDE4CC5DCC818F2981866585A68BFDC6222A52BE23C190BBD612357574E4D69192D6AD0B148FCE9E809B4047CAA681432F6C978DCE1FB5A5DA4CF1CC684C2E975A51F6B8AB6B91DABCEB31C8A5F0B71040139526D60A2E0B59D7657E0F22357E984F38E2D6B28844130F3034C1829DC0018525FC9466BEE22FD9388657019C7EBF205A1D1E59B1391CA591CDBD2590D842419A2DA22A9A01E2D75964F61C5C4CEEF33CB3A43B0316E0389B0B3FC6079DF08FFCA1C2E0378D4839D53B342C9183C25415821FE891B43941B97A4EC517009086117629C8D085A668C984B9A786E47D290962C2D7AFA8C08E803E1E453EB20861F857B77A33BBF1EF3BEA013C410EA8C647B9BCF4B1E3DFF53FBF524863B20A344EA208AA711978D4C99D84327BE76BE21A8FE3DBCD7 -ss = 59939CEE498FF3CD5B49C1203224641E4F3A0C55DD2A523A - -count = 66 -seed = A3E2E511AFA7BB560446BDADF67D2EE2E16FFC7BAEAE7EFB8C5455068BBD4E91BF9BE9D98B280072FABA7712C75B26D4 -pk = 43105C18A44661C66BA5BD3E14E2BDD34A9D4297FA897CA3F517EA39F847078232E5DBB3B8F9100DA20D55FD66A02CF46074F02D0A1F1B6DEEA7A7B403B812D74C0E8FD263F9D7BB619192B61B86FC556DDA699A906E26D199E142DA42DFB7E9ED593D93C1C055C9974E1CC2E83DA334492AE1BD045FF04D1587DB70523DC9EF35736F6011C9FCA21A82C77A8DE8727C8CE3A1D638E40F9E8906D5F574607089F63C06DF9B6C9B8272EB6240EF7E81EC0EADE3899D9E3D1A19ECFCF837636C5D8932EE84724FBE078E9D719E9BD43908B41DE54CE8AEA63C6FA99B4E2680B51DAA7427668648AF391A7BA294859728F98385A42281611A6C9325FD1E94D0D056421C53CAC7EA1C0E22BA32217DA76B648EACC7BC445085EEEC4DBC0403140D6AAB44D36F182F3340A34E25D55BC5621C0BA31413A5AE5A2181580C8779BC8F693B488CCFCD8247BE87B2A1B9CE5DECCD98F57C7FA8A22338001DBDFA058D00F01C7737CB1E00682AA436547C84AFBAEE00866BBE28E3D9C57C30 -sk = C0407E41DDF48D333978B89BCF2DB01E4613425B456249E7B2DCA81E3F5F748D23C9D356A2209F6B2D60247B2E45C9808DE497F64F12460343105C18A44661C66BA5BD3E14E2BDD34A9D4297FA897CA3F517EA39F847078232E5DBB3B8F9100DA20D55FD66A02CF46074F02D0A1F1B6DEEA7A7B403B812D74C0E8FD263F9D7BB619192B61B86FC556DDA699A906E26D199E142DA42DFB7E9ED593D93C1C055C9974E1CC2E83DA334492AE1BD045FF04D1587DB70523DC9EF35736F6011C9FCA21A82C77A8DE8727C8CE3A1D638E40F9E8906D5F574607089F63C06DF9B6C9B8272EB6240EF7E81EC0EADE3899D9E3D1A19ECFCF837636C5D8932EE84724FBE078E9D719E9BD43908B41DE54CE8AEA63C6FA99B4E2680B51DAA7427668648AF391A7BA294859728F98385A42281611A6C9325FD1E94D0D056421C53CAC7EA1C0E22BA32217DA76B648EACC7BC445085EEEC4DBC0403140D6AAB44D36F182F3340A34E25D55BC5621C0BA31413A5AE5A2181580C8779BC8F693B488CCFCD8247BE87B2A1B9CE5DECCD98F57C7FA8A22338001DBDFA058D00F01C7737CB1E00682AA436547C84AFBAEE00866BBE28E3D9C57C30 -ct = 7A9E2372AE10B005AF59A0DD576463479FC28464645C65AB169B7012CBCB959B2002D4F8A4B621CBB2056718D7281A39EDC4DDCC2F93654A84C052D14F79033D40F6D266E4F7B998D942E9282995F22452BA52F86172620B4851A9D1989A7BC844C00BE648D20E900195920E915B182E5AB61E56D7993EDCB3993C7EAC0631D3942E4B1ED6EC56DE4DF86FFDCD09D95DA78CB9438C28CC67661FD3DEB957D8B085520158C9C933295C66D306FB46499982987F8F7FB7FD5D173400F40CD76F881075D731419726349511BA5536496310B5478EBE86161268E8CF8EE7E4DFF41AF81D3C5E43EFBDB1144BFFA40DC61F16491B4913CDE26B867877BA06C7425A5F0E6A2A077CC54E893DDABF96DD04660C663008D961418CDBE9F3471DC101BA1BBEC442D83863BB2E2351BAD1E75632A0DD635A6069AADB2EBB5B05F36A3A0FD084EDFF57884F3825341DFD2A038FC896DDD2FE5E498B8C74D2A28FDE7A2E22384CF29BD799BA165CF38765F62D55C8A5B31817C10D16C5B22630EBCF371BF981999E51519BBAA9F781E50B0AB80F560B6AB5 -ss = A32F6F1DA77E156A2523D3E043F261E4D8E9483939B317C7 - -count = 67 -seed = 074AB1A37BA5A0403D8F68D26FB787BC2C90F5EF88F2A6D286C3E6B168ABD85D393D8225618608B8EEB301D26AF53BC0 -pk = FD0114CBC56E344ACFC08BBEC2841AFAFF2A1587273294CBF28E5A9B79D485C87FC4BA6D09850DFDA73E2D0F11614EC5ADEA41AA6EF548748E9206AB1F51336150D712A23EFAF3F14C9C6DED9A268DC3562C4F08C180F111B584E00B0B049ED534C33F03FCF8BEB3A6D3424B2ACF420D849099DBBDB5162A06268A95A31A8ED7AE1B672F1CCA3E0DBAB37A81CC4D806FD01EB3D71A8DB53CB26543A64C3D07196249200C13D1A45AF70412116FC1A6728EB64550D09DB65D359289CC0ADAA73A0D808725039FF1639F1D814ED05E8C1E7C6FCE727BB60033C3C41B8ECF6C31BA9E413CA29EA5F8CDC24CB03F43DA5BCD09236062A3F52B0EFE23102789F3BE9C9A87A0E5AE8BFCB32ED2850A623D7F1D7EFCFD7BA6013D6A4321C9691BF708CD62C4B18504C867653FB49CC274B1C48A88D23D3F4043F2208D0326130DE626034A6542232A81D903EDFDD89A0A4D9651EADF302926CB72871DD2887F95DBCBE6205B8BC0A8F7726A4E5C363EE3A9235F6199D208BA06785F601B -sk = 334382D39164D1989696A2FF77B25A28AF8BEAD9883B5365ABA5068AF837BE962F439F233593D193CE5E08F7D66EFB3389885927B89D2503FD0114CBC56E344ACFC08BBEC2841AFAFF2A1587273294CBF28E5A9B79D485C87FC4BA6D09850DFDA73E2D0F11614EC5ADEA41AA6EF548748E9206AB1F51336150D712A23EFAF3F14C9C6DED9A268DC3562C4F08C180F111B584E00B0B049ED534C33F03FCF8BEB3A6D3424B2ACF420D849099DBBDB5162A06268A95A31A8ED7AE1B672F1CCA3E0DBAB37A81CC4D806FD01EB3D71A8DB53CB26543A64C3D07196249200C13D1A45AF70412116FC1A6728EB64550D09DB65D359289CC0ADAA73A0D808725039FF1639F1D814ED05E8C1E7C6FCE727BB60033C3C41B8ECF6C31BA9E413CA29EA5F8CDC24CB03F43DA5BCD09236062A3F52B0EFE23102789F3BE9C9A87A0E5AE8BFCB32ED2850A623D7F1D7EFCFD7BA6013D6A4321C9691BF708CD62C4B18504C867653FB49CC274B1C48A88D23D3F4043F2208D0326130DE626034A6542232A81D903EDFDD89A0A4D9651EADF302926CB72871DD2887F95DBCBE6205B8BC0A8F7726A4E5C363EE3A9235F6199D208BA06785F601B -ct = 0AB025362EEAC2905F52F438DA0B4CB36533200FE168B46F0971428F4938F06B9D165E1060148E4DFA0360313D63B7181DB9E12C140BCD93427969059C60315CFC9859D92B399A4E125D26DB70ACAE893BA783DBF8232F5E315238AD58AB2235F3B22BAA528AFAA47BBAA2BA203BC69C9B827B5D5BB44A6A338266C0791875B8E68978C749C0AEA789B9DB3003E6AD4DADA079C8D0EB87CF2053A64E9002D1360FE42FDF6C2548C0CE5D6263CF3FA4405B2DF25D254998DBD1A2E0161CA2FFA200354FE12B5BAF8454B321B4FB73CE525585C4EA4642297BD0A12FA860EAEFFD13F74E27AD373B4F2285DB0E4FF3910A6E66A1D528A22459BA95A0159495BC262C45C93591A323BDDFC2FB0822258CBABF13B343DD95E5147199C0CCA4E426524E07C8FD66161945C25362D9A6D83E3505882C0604F8E14C964E25C9439E7AFD8E238CC330E84EB247D0205DCCA46A5B9A8271C5DAEA8A77E633276B61C9E9009F9103C75D8E91197B2F5D9604A2EADBA56D6425EDC9AC68013AD662C7F7D74A8308A9E28E68FBBC20360BCC59FEAF25013F -ss = 792F6220241942B423BAE0232B51DE055043E707FE6D3CF8 - -count = 68 -seed = CC0C86CC0ABF86FA21899BE1953913C00E7C46E6B5F730C4E88B3C034012763981D7F14459D3081638080378348856EA -pk = 6493C7F984DF0197C643B1FF30A4639BC34282D9837B02E3B989E606F765CDFDA92DF2030AC29AAC3E272DBC59186E349EF0D79F2352C328CC540CEF7F432FDC610B5E9AE4BEDF737DA5FC3213621428DF774F397AE4D18A5711912324E6C6E0102AC50939CA1C634DE3FA59B37FA5BBB14F31F1302FF6ACB3659EF61A2D0EF0091C68A237A7613087A0E4EBFB989B51C81F991F61164C378FEBB0A917CDE9FF0291635F1885A99D486E394800DE513E195755DA7D8B87C216C02C10143AA915E1725E3B95CBD7925CBEDCF69C6C980A15B2EE6CD8892B3FF619F261B3CE7F8F1B52595ED251A44A4C94FDA1D8E726A0C43D46CB539CD89D8888B32EBF5C6BB64D3D5633C4EE088C9CF27C5325D0E8F269D312FCEF568227864E44D7947557E7BBCBB6D602395604604453FFE641B51AE72F3D9994C909C9FC3923EF692EF6DE7E97858BE55239AF17AC6F1282E9811CFC8D128483B16906676AA795A57965941791D1D07047C1AEE3CEB8AA04E6218AB56AAF56E9AF1E088A14 -sk = 6995143E8EB8A6E93840F76EEC844F67D2B5F75B1839A5040F4DFF8E56F68440836A072412A30D851ACE2C7C6F02D60E7A8420001A63E6066493C7F984DF0197C643B1FF30A4639BC34282D9837B02E3B989E606F765CDFDA92DF2030AC29AAC3E272DBC59186E349EF0D79F2352C328CC540CEF7F432FDC610B5E9AE4BEDF737DA5FC3213621428DF774F397AE4D18A5711912324E6C6E0102AC50939CA1C634DE3FA59B37FA5BBB14F31F1302FF6ACB3659EF61A2D0EF0091C68A237A7613087A0E4EBFB989B51C81F991F61164C378FEBB0A917CDE9FF0291635F1885A99D486E394800DE513E195755DA7D8B87C216C02C10143AA915E1725E3B95CBD7925CBEDCF69C6C980A15B2EE6CD8892B3FF619F261B3CE7F8F1B52595ED251A44A4C94FDA1D8E726A0C43D46CB539CD89D8888B32EBF5C6BB64D3D5633C4EE088C9CF27C5325D0E8F269D312FCEF568227864E44D7947557E7BBCBB6D602395604604453FFE641B51AE72F3D9994C909C9FC3923EF692EF6DE7E97858BE55239AF17AC6F1282E9811CFC8D128483B16906676AA795A57965941791D1D07047C1AEE3CEB8AA04E6218AB56AAF56E9AF1E088A14 -ct = 6187C61B44CFDD9C1454EBF224F7091A1E7D95D196B4C038396043630D04E4C83F66ED7039C45A2B9CFD5BC913CD5E0423D13C11160DD334F613157264402871AB50A6657FFA78F829A134256992C73C2BA5A48D9D1B53744F466AC7D5836B691FAF97BA3D71AD31A5A51F21FE70D00C4DB9CF677050560A86E42EFEE80FE055FB4041B0A9574660E20442EC60C9042049C27A99A360C16335F996FA170661C74F72F71AECA77B55966E3641477B838E1EE292FF6C02095B63359D050B96A02BE431B66A0BCACB73A6CC6A41AF800597BADBDC577A8A30B2573CEB90BDA8AA79BB8A04DF9A0920394F63945C87AE58AC5CF2C575FB40AC0FF937990185ED843317642FE483C9DDA924283169DBA90C4B736D1051D07A815DABF22F7291DF81BC67845A4A98C47EB2B6402749588F70F400CED045E96B38ABE57B139C486465704F86029E8035A1B626EE6F132AB26ACCFAE34EA6A99752349EC4F4031B6EA5F590B5D30BD201712F77AFD6D98758838066C82A6EF2000D259E0D642CB441A15FF9C501A4824021F394E6A880505C9E0CEDC4 -ss = 9FB845B159F6BB1DB99708B4152E5023830D317A78ECC0C6 - -count = 69 -seed = 6D5A7CC326ECF3983C4E7683F45263A37F692F3BCD2D920E1FD9584350119E74F9A3F905F70D3E20318C1413DE2A0DEA -pk = 8437E38BA6F0F61040BE8089DD2B0551FA5EA742D89F034BF68D572CEBD0A5EB59D48DF0174208BB0CE7AC21FCC2BDA564D8888C4517CEE05CB2038A3B1A16E4C990082F466B531DDF5997F20F7B235FC0409DB0E79209D2FF376BE99E1B888A61847A3CD4823C41718E5AC05494F5FEF6AF7DEB02ED8D295014141B8315640D8299CCCE132C626A1842411C0F6661C321CB66532B2D7922494D5CAADC0BE43DD1776C8F2325B0E87AD3CC0564D4250AEDDD477394708684A371619B0D4D6CDBA0CE541F13E747A8AA7E349262DEEEFC790C1458846BB8804B23B225ACC3F11BFFAB8C7EC5622DD61307715139843B7657877917759D3389AF5C4401B88D40924D4DA99E9E5647B03534FCAA833DEC47DB24AD492850D732B1080B4BCB9D5B9BC51A6D9EB70FE893B4EB257E587C8F654A1E988D6FB54FA5994106648D140FA92EC2C92F25CF120F156960C56577827A344BB7D16CFA910988F4E11039122FEE4B61102F9B1AA938FBE4D8C057142A80275E7AC811B582599012 -sk = 995EFF7E0D195C6D0533F3DC194D47E60F9AD14696144CDEB28F7E7A15A005F92400CE33DB073D49B53871594A88FC45E0F94207B5F0F20C8437E38BA6F0F61040BE8089DD2B0551FA5EA742D89F034BF68D572CEBD0A5EB59D48DF0174208BB0CE7AC21FCC2BDA564D8888C4517CEE05CB2038A3B1A16E4C990082F466B531DDF5997F20F7B235FC0409DB0E79209D2FF376BE99E1B888A61847A3CD4823C41718E5AC05494F5FEF6AF7DEB02ED8D295014141B8315640D8299CCCE132C626A1842411C0F6661C321CB66532B2D7922494D5CAADC0BE43DD1776C8F2325B0E87AD3CC0564D4250AEDDD477394708684A371619B0D4D6CDBA0CE541F13E747A8AA7E349262DEEEFC790C1458846BB8804B23B225ACC3F11BFFAB8C7EC5622DD61307715139843B7657877917759D3389AF5C4401B88D40924D4DA99E9E5647B03534FCAA833DEC47DB24AD492850D732B1080B4BCB9D5B9BC51A6D9EB70FE893B4EB257E587C8F654A1E988D6FB54FA5994106648D140FA92EC2C92F25CF120F156960C56577827A344BB7D16CFA910988F4E11039122FEE4B61102F9B1AA938FBE4D8C057142A80275E7AC811B582599012 -ct = A3A4293B3CF0672B51D2378B896147F43DAC477A904C37465323B98F2FBD7649605DE3F78A6F8C28F6006CD81F4E7429618ECEBFF866607D3F27DFE207B52F0919DAC224D2F6AC11385F98DF2BFF0B82BF25D6FDE80D203116C8B7292D37950C6B99947E189A0863D1665542A7369A02DCAC72D71BE14A0D6E91AC038E3B2FD357FD42AF720264A425768CD250D997C91C70FE83178B9419836F6BFE84325A74A0F5FA102761B5637D11488C590A2A8885799596DE182D590D34401724CAAA04998DE75FB4459C79E9CA25CBE78A34B735DCFAF27784E9CBC92ACF52701B6CAD33499FF4BBD18293C182FC823E7E1BE3B71748ABCF711DCDA0CB071791992E5549BC3399426775EBBE1EBDDAD6E35E04D0405DE19E10A454BC2AECC4D1E4ECBB402BCC2FCAD274295FDF4F372021715DA6AC4B99689BA4A21C640A5141AC7E8FD0BCCBBE82F47B8B49FDAA6305CD5FAEEBCD35CFD7CFF5B04EBD339AD5764E8B5056CE1BFD0C5FD8EED244C49DA31D0AB3956036A8F0FE7CAD01A439FE9578055412458974222E4FAB779E9C880D3D26D52E -ss = 2020D67892B0948A4C08FFA87F6DD300270783D2C0FC5169 - -count = 70 -seed = F68FC0314DEA88F66AFAA76E6C9B6804B13D4876924410D1F526FAC59A62E26C560B125B1D0F8B461F1FC2E351EFFB4F -pk = 4FD2EEEF9F048A5B6756A69B329E954E749831135B000A390442C588A3E83E7450E300C6B18CBB7EF1B36911BC759D19E4FFFE452AF2BD2FC2928AC2364A37A74A9C172A719DCF66E7D586DF797AA4A7E1C32A71904FA7E37C4DE5428546A9BA368B34468E4A179E20DB44103F03E235C1E23A1932DD6EFFD5F39B2CD02F6AF3BD96F8AFDFD54F31118B87F720C251B961991941F41827AB730ABAD792192A514B1DD60CF9AC9D5969DCFBDABACB42C94497BAF6474522EF520F20E63BC12FC83D837A0EEA5BF8F8DC7B7A95B484E1C9C81DE2A996A49B691EFB16E88D38B055B43E7184A9804924C34B50E79C934C1A7E7DBD0E21138B8C5A18E62259259CAC978865676521E074FDA01C9F770F155381C775C94DE07038FA4EC2E1DD07FAC47C584BDDDB83C178F6B8558F7E8E76DF8E1FC6115D2A3C0DCA690AC6A8F9193DB53E7FC1AF25A5E7255573B95490D7AFEADAD9BD3F3846BBE7311D02E7E169492B2C3DB630D3FD7C5D93A37F6D676C0971584877005AC4D6BE03 -sk = 3E809EC8DD0FEC0D911A4E3FAC20F70FBB128C5DE94DC718D8128601C28B1DEF8D393A0DB283229F7C7383152A814E7CEFE8EF9D9768C4034FD2EEEF9F048A5B6756A69B329E954E749831135B000A390442C588A3E83E7450E300C6B18CBB7EF1B36911BC759D19E4FFFE452AF2BD2FC2928AC2364A37A74A9C172A719DCF66E7D586DF797AA4A7E1C32A71904FA7E37C4DE5428546A9BA368B34468E4A179E20DB44103F03E235C1E23A1932DD6EFFD5F39B2CD02F6AF3BD96F8AFDFD54F31118B87F720C251B961991941F41827AB730ABAD792192A514B1DD60CF9AC9D5969DCFBDABACB42C94497BAF6474522EF520F20E63BC12FC83D837A0EEA5BF8F8DC7B7A95B484E1C9C81DE2A996A49B691EFB16E88D38B055B43E7184A9804924C34B50E79C934C1A7E7DBD0E21138B8C5A18E62259259CAC978865676521E074FDA01C9F770F155381C775C94DE07038FA4EC2E1DD07FAC47C584BDDDB83C178F6B8558F7E8E76DF8E1FC6115D2A3C0DCA690AC6A8F9193DB53E7FC1AF25A5E7255573B95490D7AFEADAD9BD3F3846BBE7311D02E7E169492B2C3DB630D3FD7C5D93A37F6D676C0971584877005AC4D6BE03 -ct = DC64D193FEC8C9477547345294B156B57EB038AFC1ED7432E6E3483B614E16C055E5B21C76890D8CB5B7507E081528145D2F23096A4EA414783793D1858529CE53A58976E062F56110A7B653EA0FA8DDFAF6D0F4BC3A7D484B5BA754F23ED94E3C850B652755F6D4CB0F7D6B07C1CC52E212BE9E0C6841F9A67A36A44B053BA4BA9DE9281F42DB486F7485C593B1357576596DEE2BF8E96FA666E58708A1324A57F4649ED7A082CCE538E07BCF3282EF12E6EE6F477C93D2F9CB02CB255D38A08C054590AE6929AE76E5A05EEA8ADFDD55C5A108AC541D69628E774863691702AC8DF59F54726846F9AA60930A207204E5399CA045955C831B0C0234EE81ACFD963CAAAC7B2FBF0AD575FB9C81E008D9B59304BE04EF8970024EC00E39BDA5497F75688470B79CFE20707601D6DACB139C237B246B5E504BB89E2FAFE6787237F893AC34528181530CCC29342A494C838E8EB56BEF2E8F4F1255304DBF3B6A4DEFE641FDA73F596481682D5A791AD49FD522FB279CFA80FCD1316CB80BBC123607330020F0B8CDE24FF1C9ABB2A1B4C645D8 -ss = 4850D52145D1B8A34A6E725E8531DAC658A18CFC94C44B4A - -count = 71 -seed = A229218B0D51F58D915DF549901548FB0722F352C7470900E7E4D8399205764A319BBDDBD06C00E8C5932722EE5A404D -pk = 2EE74BB65B8AF7F24CD138AE652C28FC6C70FE5F90C25718CA5D0B603825127A24F2BB909C00724FCB0F0545490ACC812C520EE8D17258383D46571377E63C224F17960AAC40B58330C850861EA35DF382ECDEB1E3EF666C54C3DC6DF85FAFA82E69C121BA98006264F72CB8EBDEB9A26D6F2848425170A46B7B62690D069C4FF34280D88F870A58C9E9A7E6FF80AF011C634DD47D385256788AC9111234383C22237B9795587032371BDDA68F35286CE405AC08711700283EBDA1E0010FA9D7141DB3FE5612CD31DAD69A0CC00C96F4707131904ED4641FEE9B877198F0526C3160CFD1564CFF72C9E9490B332D86B575906C7EC4CB05B14573D11F44F624A9B7B3D4AC3BB5D700A485A8073A887A2CA65435F4880870D071663C2867E882C801E8005F6F526E678B1495E64B688B7A0AD1DCB493160B96941832C79E0CBAD492DC765521D93302E058D1A5035D02BA884FEB3267FCF4F71697249151E2419EBEA0CEB020517D6D46697108FA99DE57968C8831D1E0AD280B36 -sk = DBF1C465FFF3D9F783BD9EE61A573715E45691147B890443B6D75EAC6C76CED1B0A025B40A55440712AD8424672E761E9BC400D63812000F2EE74BB65B8AF7F24CD138AE652C28FC6C70FE5F90C25718CA5D0B603825127A24F2BB909C00724FCB0F0545490ACC812C520EE8D17258383D46571377E63C224F17960AAC40B58330C850861EA35DF382ECDEB1E3EF666C54C3DC6DF85FAFA82E69C121BA98006264F72CB8EBDEB9A26D6F2848425170A46B7B62690D069C4FF34280D88F870A58C9E9A7E6FF80AF011C634DD47D385256788AC9111234383C22237B9795587032371BDDA68F35286CE405AC08711700283EBDA1E0010FA9D7141DB3FE5612CD31DAD69A0CC00C96F4707131904ED4641FEE9B877198F0526C3160CFD1564CFF72C9E9490B332D86B575906C7EC4CB05B14573D11F44F624A9B7B3D4AC3BB5D700A485A8073A887A2CA65435F4880870D071663C2867E882C801E8005F6F526E678B1495E64B688B7A0AD1DCB493160B96941832C79E0CBAD492DC765521D93302E058D1A5035D02BA884FEB3267FCF4F71697249151E2419EBEA0CEB020517D6D46697108FA99DE57968C8831D1E0AD280B36 -ct = 7D035A9067DCE3B2B6F00D702F53BEDDB35C923A3AE916E37D962EC6C233179A34C480389077684C5ADBCF21EE26DBC6A1842953CCE435323738F8CFA95C1C35F3175471560093D96E924E11C760C56AC0B81E5C2424581BC4168C74B651E60C3BCC81BE532A46739276EB8A72B68B20EAB9BD3822650984B71D79692D11F2F3813CB799655864BC01968056B244D03A6954B929ECE09677625196BC0ABC855FD1653D90CBAD4B8AE005E6379DE237931DD5EF66B7FE6F1FB265C24715E5002EC98D1FDD90647CE9068A9A342AEE127CBAE774DE2C3CF5D7CD6F8AF0C5216362159BBE38BC15C714D614483DA782183239094866DA12E032486E6600180D6BAFE3FA528902550949A6058D50273357E776E86D24778E4A5BDC1956A5F303BA66EA3614FBC2C5D3086EA959AF2FA111399EFB43217D17A243CA2B02773E9356EAA52CD3F53ABFE3C832BE179D9F25547269493E9BBEF6FA4D9C27825D50A698867AEC3CB84148CCB319905758A7846BD33880009401A6A2660F3581791B7B212EDA2DB80CB55DE63352FA5519675E319DE072 -ss = FFA07CF6EDDE214FFF98EA251C4DEE8614E7CA2B0045E59F - -count = 72 -seed = 6960F21C7350DCF41B4770C551DC8692D8BA2C0B6E162C589166FF22E7A1AC0F94C2F48504A5F7EB0DA094DF427BC98A -pk = 26FC81335BB62FE0AB13A39CF601FDF65F6ABB7E3A82FBA61EAC00D831E4B6AC93B8EC7C728EFF00238115FB01A8FEAB7C6A941478599129CA9D0126627528174D1788C138D8307BF29D0C273264F670498E8E32751D68BAE6A2F0F71097302EA6BD36F299C9E7FD70993173770DF0F7CF2145157B65C041062766800E3274B1F71CE13C2A4FF798C2881CC0F5386F7715C126B02212881018E10FB8DDC292D49F4533476DD1C183D7F960F7D3E2A39E06AEE8F814B289F3A972162719405FE9E6D0B09EFF98F792B6FEAE945F3E391D40A06AEF02088E2EC68C19313483245D13BBDF4692F92AC826AB663D9969A2AA5B4E67D0F3E4A3DC2FFA171FA05C9BC58E6EB24B6FF30B9E0EDFF6074B5C85870951F272528A452B3D98C747A7376272D50E4190BBB4F5FD84B3DCAE041BA70FAA9BB5DE79D90F564E292E16610B94E7CF42EEB7AB34FAB79A8BFECE6757F42E2415A6DF09B0EC673B796069EB4F74E7D5098F72975D47FB6A4DDE58511E34730C917F2A2554A2682C11 -sk = 1F7CFD2B70863154E8A69D1758532E86C20CFC763D67C758273B38BDDC18488024EC90E62A4110129A42A16D2A93C45439888E760086040626FC81335BB62FE0AB13A39CF601FDF65F6ABB7E3A82FBA61EAC00D831E4B6AC93B8EC7C728EFF00238115FB01A8FEAB7C6A941478599129CA9D0126627528174D1788C138D8307BF29D0C273264F670498E8E32751D68BAE6A2F0F71097302EA6BD36F299C9E7FD70993173770DF0F7CF2145157B65C041062766800E3274B1F71CE13C2A4FF798C2881CC0F5386F7715C126B02212881018E10FB8DDC292D49F4533476DD1C183D7F960F7D3E2A39E06AEE8F814B289F3A972162719405FE9E6D0B09EFF98F792B6FEAE945F3E391D40A06AEF02088E2EC68C19313483245D13BBDF4692F92AC826AB663D9969A2AA5B4E67D0F3E4A3DC2FFA171FA05C9BC58E6EB24B6FF30B9E0EDFF6074B5C85870951F272528A452B3D98C747A7376272D50E4190BBB4F5FD84B3DCAE041BA70FAA9BB5DE79D90F564E292E16610B94E7CF42EEB7AB34FAB79A8BFECE6757F42E2415A6DF09B0EC673B796069EB4F74E7D5098F72975D47FB6A4DDE58511E34730C917F2A2554A2682C11 -ct = EFEC0492F65D5A55E47871DA5F3BAB80B5BA18D0E4E00D5DF1B3BD098AACED2D4F9E311C2A1F91EA42D4FA8AFCF6E88FD1EBA1ED4BBDAB5B624684F115D926ED2E9CE3937974EC4CA37D481423049717E146AB470EEB0DABC9CCCD9A2213F0A6432B7537B52E9626540E7B3E9755851663C1A86205B08E3C8798D671A40BCA34252F3AC33C4A61D237A7C563761EE5C8FAE5EEAC54EF22CFE6D9956BD7C9216987231CF6B41A5B10D2D4193708C30D8613C96198C384A6C20D8191E411633868215C3AEB17199E1D043C1270BF322C7C568F36F2AE64758FE79ED35C679FF65F2DA924182C517A58D1C0497084CFE569B802A76D4001CD010A763908B191A8958092B441E38A7B5CDCB8686709C75A92EA9485C99F7EB05E0A31D9AA34857776C0FA32EBFE96C15106B5971155AF1ED4795F0C40948EAC8847442495204403F5333C5102849A8A53DA985BDFEF105A11AE2F123DE8831D7746CA6F24B2CB12A00C51D121844C5306C53D8460C86E7083B1E211D6B93082103A02C55191C85EB56A3E4E1FF4C85FE53C1F2662AEBA05369954 -ss = BA828873D946191AE2D6823F33E0A97B19BD4FDFFE0528BE - -count = 73 -seed = 53DF46012CAD4A745B7A3C06E18CA95E0B839FD8161E3025749A0887549EB0ED6A44EEEA08BD6060D6509DBF7E9DC864 -pk = 45CC88C2550E06BACF0409CD9D8086FC025B1927261865AD475387971607DFFF19CDF9D814557A0563B94A802D140E90EAC5CF3FDC500176E436044CEE8D08894FA5894B51818648A7E4B3098A20D8AD1B29514E8D42F9894FCA017850F5BCA83A77B6C93896804D522D7FBA974FBB1769E8AA4C9C9EE99BE3D95DB7BE10932E5FF009460C0E83475E786CE6C0879585C84410E2EE14C86E68A49C23695E276A407CDAE3A9C6C97244A557E176B890C29E7D201C9391E31BDA550F390D238B0C93866ECD7947C2710E7930B0CB006DF15344A5A53D2C5F4A3935CE5A5320F6F8434D380237C91C72EEA6653EE2410D4A9A6E3C3E8D73EC6E26CDDB193CB93A773F9925FE1BB7379328A71DB0330DCEF9D5EDD75BF5E141366085E4DA600C5C07FC2B088A18F2216DC95200302B3DCFFA711474D8B8F1B6A1826B053872AFAE3E57D35C5E4E79ADE2E5AD0F4062B6F0414C4A62B003C3BE40661A68C20845B24A8F36A21EB453738F3C8337D975ADA8975B9EBC33188CB614772A -sk = 3A19577908EFD37697B8EDC7FDAF47D1BD3AD01A1B77FAF7A3729672816F3EBA84C9638A79676EEAC0F22C8A48E0C5D50A26FF0844C66B0945CC88C2550E06BACF0409CD9D8086FC025B1927261865AD475387971607DFFF19CDF9D814557A0563B94A802D140E90EAC5CF3FDC500176E436044CEE8D08894FA5894B51818648A7E4B3098A20D8AD1B29514E8D42F9894FCA017850F5BCA83A77B6C93896804D522D7FBA974FBB1769E8AA4C9C9EE99BE3D95DB7BE10932E5FF009460C0E83475E786CE6C0879585C84410E2EE14C86E68A49C23695E276A407CDAE3A9C6C97244A557E176B890C29E7D201C9391E31BDA550F390D238B0C93866ECD7947C2710E7930B0CB006DF15344A5A53D2C5F4A3935CE5A5320F6F8434D380237C91C72EEA6653EE2410D4A9A6E3C3E8D73EC6E26CDDB193CB93A773F9925FE1BB7379328A71DB0330DCEF9D5EDD75BF5E141366085E4DA600C5C07FC2B088A18F2216DC95200302B3DCFFA711474D8B8F1B6A1826B053872AFAE3E57D35C5E4E79ADE2E5AD0F4062B6F0414C4A62B003C3BE40661A68C20845B24A8F36A21EB453738F3C8337D975ADA8975B9EBC33188CB614772A -ct = 85639F64D077EA6B41149591F3938AD12E426318AF84E5A37C1F4F06ED25399F8E0B5DFB9E2F2339A5BE9DA8EAB6AFDE061882E24B92817BBFC7DBC3A7861014E4CA6333830DAF2F0A370870D901A48BB5539D54D4352295334742AE0A267306B6B9691C698512494F18C082BDD55377875EF5A69A4CD9F259274DBB3B1A25BD625131AB4C84B9A73AB8B2EB5047E3AB5BEA65E74B488B788B4EC70DF3F73384ED1815E0F7F92DF6084B3B53BC3F27DEFCED64C518823FDB00D4A60D36EEFCDEA8D3C39F527256ED390D0C3C06ABDE7E1D57B16F028DD79F62D92E4E7177C83A81E9ACD231F53B4746B85B470D063512EE800BACE4D9DAD29221383090B86E4DFE811784D1CC08E91D6D4AEB23FD8C3100A1EB76CA4925F25A7352F71867BA829E19D8321FC1A9754B3AB6CD451653DA30BA80E14B982B7C55F3171DBDAE3EF646AA091D5AD078FD8B70E14C4ABF18CBFBB289B56B7D41297BF800DEBD2F8414988F1B07A533F6A8FC19525E8E7592D46D4B31E592B687571E086E88E84C11A94040B5376F89C32BC6E2F9FCC123D0FDDC80 -ss = 0F6EB990A39CE2345A3D3340ED763CD0C37CA2D21C13999C - -count = 74 -seed = DEB963F8B1D8FBDF499D564BA8D2D47915BB402DA02F17031B37B4039A842AFB9B7E48F37200605992BD2429427A7A4E -pk = CC8CE6FF50B23579F7400E2D0889EB8455276FA195F9708F1F74ABBD978FB707D41D100FA241B29346D6D3D048F0348A8E0AC825CBBA139173920F4C70A803501DB25E43E9FB0AE625791B400FEF61338BB402DA2E3205B15F7A798DF5FB856C3C3F5A04F5F729494DB41884861D0036A8CF6E32269C646754B8113E501F4DC9FEAC0D284C805628E0462FF634CC1B291DE2D3C1B5D10100FDF8FFFE9240C1C5BB61CB927E0FDCA9460039A8F7E28D2F81D1304A55165F0FAEE0066A1897AF29469A2E376F6D520435D3068E5CB9BE4645194E22B83D94371DD2B4CB4D1B949CF8D699B4A0BF55C8631D79F41181CA0A88B2211AAC04BE1D96ABBE0DB10DC1E1A16D9DBF600C7E22999CD65AE6CCA052A1C6B3EE68E114BDEF3BF5D8622FA5162423C38493FE0E6E9F5A20F4B90DAAC2A63053C1466B26C7E415002B31880B2E65375402FE9F81E645DFF1CAF5CAF8DFB9077E6A69DB1798DFD730A44D924C4CDBBC0C52D3CF179A6B53148555F00609C6606F6B51B4665A1924 -sk = AE0F65E29F38804A6759F70F4D01E2AAFF7FE1C91EBC4F89E03FF73E02A217659F53D8C47556BF3D8C94040F630D63605E2D0F923579370CCC8CE6FF50B23579F7400E2D0889EB8455276FA195F9708F1F74ABBD978FB707D41D100FA241B29346D6D3D048F0348A8E0AC825CBBA139173920F4C70A803501DB25E43E9FB0AE625791B400FEF61338BB402DA2E3205B15F7A798DF5FB856C3C3F5A04F5F729494DB41884861D0036A8CF6E32269C646754B8113E501F4DC9FEAC0D284C805628E0462FF634CC1B291DE2D3C1B5D10100FDF8FFFE9240C1C5BB61CB927E0FDCA9460039A8F7E28D2F81D1304A55165F0FAEE0066A1897AF29469A2E376F6D520435D3068E5CB9BE4645194E22B83D94371DD2B4CB4D1B949CF8D699B4A0BF55C8631D79F41181CA0A88B2211AAC04BE1D96ABBE0DB10DC1E1A16D9DBF600C7E22999CD65AE6CCA052A1C6B3EE68E114BDEF3BF5D8622FA5162423C38493FE0E6E9F5A20F4B90DAAC2A63053C1466B26C7E415002B31880B2E65375402FE9F81E645DFF1CAF5CAF8DFB9077E6A69DB1798DFD730A44D924C4CDBBC0C52D3CF179A6B53148555F00609C6606F6B51B4665A1924 -ct = 7C8AB30D6F3D0C6C3B932C50512DEFA808913A59C10F68740BD743A6BED7509CAE3D6440030B10B85DC762FB0EB432867202FCDD481F89DBEEF919B0C8B73F086F86A666CC8437529694A5C18E902BCCE8EDA0D30BEDB812E72425D5B098D10722BB492BB5474E9187764C963E4BFC6CEB578182BB84B94275B268D18B218B1DBF000E3C9BEA622BF763913E18BF87843DB707D0DCF1FEF46C8A8FABB218E3EC79A9FD99420696152C648EA50F59E3D4C4C607DDA503E20A5451535D2CF234CDB4D486DCFCFA31808AE1A516BCEE9B90D7E1F2A269DCE171547B3516BFF3FE1DA415DEB901FCE47A174FCAE8B155C00D41DF2CE4E833C2E0A684D3372A0CCF1EBD9EC00731A992A4132A397BB3D4B695518EA32C41FD17E19980B17484DEA217722EBD53CB0D05C3C33292EF96ED1AD09B3DB0FF26409B5B235F2E1D6A8BD9B0BA16FBDA285EEC04F08A90985913BA620B949CE42957A084505FBEC588D2A811EBB87FB038DF1D5CED67378AFF21876538FC7148620D3AA136080AFEA98E86A27AC772E63E16F48AE88D9714039B7EA26FDD -ss = 9A0CE5F63E14A51EE73FC499B06CAD8C065CBD2CCF52E806 - -count = 75 -seed = 8E2995F1B3E43853B18916BB1212ACEB05898E2B177A87ABEB928AD7184E59695C56B2CCCF5DB80853C28A525E327D13 -pk = 755B3457E6DDA5D8160164998FF89B47CA3E3C6A94ED094FFB149B1A6B0EFAAB67442B626F12AFF10F140815D54AA0A8D6AF98C0FB0012E38467D4C0B50D183E84CC27ED568F85DA4FCB3F3832B200E6F1DECB9D61C2A3CD756DBFA0940439669DFCC44066FE3A096FCDBFD5611129234E8DC7838B6B6794F3E8765E69200AA5239C0148515DF6DF989B47116099CC5F80D725B1B2EB3E9740EA7D9E736F100931B598FADFF1632ECF8209C9CEFDB998DA7B0F1CB1079BA00346912A060029086AE46A41029688C35C5057773A0D021782519F01338A89C1A83228F29679C5A7D5769F1122A0F2B7C07401606082E4222453DB49C95E804A3CE8FE23D5F8D0DCFE7BDFE96D1AD076A3DD1DD4F68969A7B3DA491FA958FB7F8DE91312FC104D04D5705C3A5723826755CD06AE5EAB71551D8D718D22740A6E3C2D0C4E1B50618A59A3C07982E5C46F67ED190B2CE402402ACA39C988F8A52ECC82B590796D3B56133ECF1FBA752DDA1765BF5957000033C3C443D1319E39D8210A -sk = 6084A235F79DD093EF6D185B54E69DF33DACEE73A9BF2F379F684FB055ECE19459EB464E91E126A7A6E3ED11CCEE0046DA234D964C985100755B3457E6DDA5D8160164998FF89B47CA3E3C6A94ED094FFB149B1A6B0EFAAB67442B626F12AFF10F140815D54AA0A8D6AF98C0FB0012E38467D4C0B50D183E84CC27ED568F85DA4FCB3F3832B200E6F1DECB9D61C2A3CD756DBFA0940439669DFCC44066FE3A096FCDBFD5611129234E8DC7838B6B6794F3E8765E69200AA5239C0148515DF6DF989B47116099CC5F80D725B1B2EB3E9740EA7D9E736F100931B598FADFF1632ECF8209C9CEFDB998DA7B0F1CB1079BA00346912A060029086AE46A41029688C35C5057773A0D021782519F01338A89C1A83228F29679C5A7D5769F1122A0F2B7C07401606082E4222453DB49C95E804A3CE8FE23D5F8D0DCFE7BDFE96D1AD076A3DD1DD4F68969A7B3DA491FA958FB7F8DE91312FC104D04D5705C3A5723826755CD06AE5EAB71551D8D718D22740A6E3C2D0C4E1B50618A59A3C07982E5C46F67ED190B2CE402402ACA39C988F8A52ECC82B590796D3B56133ECF1FBA752DDA1765BF5957000033C3C443D1319E39D8210A -ct = EDAD72D61F6AB163D9993D55082228DD46495C14B70FA41CFF4AB0D7142687E89FDC951FC0BEB9781ACECC15F8374BB86A75F4446A2A12FC60AD30C0C1B10446795EF1B3B95EA9010862F0A1027D7A0FECA5870F87D3C88AB1B813F9AF03F952882E2F152C7CD8B1959012415F885A2AD68BDF84258E16A0225DDC7DA438C7C39D2B56DC2A291BE156F6D66EBFD01CA940C18E827847A13164D098E9FDE43807A78EEB84AB81669F1647C8D6527601B7CEB1DDAFC9E4B2EC437895F9321EC845787E930FD891A1B5111A39915EF7274488137ECFE07EA9DF4D2A7A1185ED8037B2C6973623BD79F4F4F38A6DBA59B0961E38B47CE9C3CBFEE174E520B3918B323F50F003DB9A76C143B0FAEBA0EE395D8C53FF947876016E2906B4CAAECA44B44D35722D51CE63F2C76D83CEC671F4C6CCF0B22322952E2F86312D187F5C88B15A9426D1CC5E601A8942754AE4C0A981AFB72EFA9E9268A23AEE814FCC30C1639BBE6FF613F376834460B7976C10A10AFCA6A9B17F8F5DF803381CF5FDDF3FE54B21E7807B798181D80DA7D1C5D6EE80ED4F -ss = 3B2476445718E7F3D3B24A14337C1DE26F9612AAAD6E522E - -count = 76 -seed = 9218943C51FD2DE47E509AAC67EFF176795102F37D7A2017E3AFD768FCDA7877AF38739B00FCDF227C2FD62EB635942C -pk = 7AF1FC339562DBF5021CD0DFB674714657AE5922C43319722E50D3D5BB59622F2371B478F67731688BF2BE0966E1C66F74B507367FE099ED06FCEAB04DC90DB5692361243A7454F37A292BCADA77BC613AA929F371F0758FF51D58D55A79D1FB068F9CCD3ABC5DD076D3195B9C4F1C05B97DCAFC8C2C4C829D41A8D2FC10C1E69972DC43225460D7246E2F8B235B218F2088167FE2E25D9725FEC4DFAEC534AC821BA3690D2D66EAC21C2839F3F828CB82A61DC3DA9C3C1BA9EBF6F70BDA36D87A0F9F0415791A9B2A084A593F9A030AAFC3EABD4E564DBAB7DAA89D982586804BFDFFD6856E9235FFE44FDD81FA08490FA4248F0D35E2457986442D7BFED62514064E90CCE7ADF695A8ED066735E625D0BDCCADFBCA97DC1CF026FFE2FCF4B7C2D85E3DA9438839B71A9A9B7B8E21E0B9A012B1760BF897E5202820D8057C8A95377E3CEB8878A43367C1BC3EEC981A5A9019CB72599010DBF281DA74FFF2BA427487ED2B3B7DB9E125FD399A41F5F7246C8318156D59B49E0B -sk = ACD1C0217FAD5CAA4235544DD9DE153AB1880CCF4C76F16FF03A8ABB0A5010F400AE5722A75BDF5A2F6D5B546B34D73857CB1BFC7E587A077AF1FC339562DBF5021CD0DFB674714657AE5922C43319722E50D3D5BB59622F2371B478F67731688BF2BE0966E1C66F74B507367FE099ED06FCEAB04DC90DB5692361243A7454F37A292BCADA77BC613AA929F371F0758FF51D58D55A79D1FB068F9CCD3ABC5DD076D3195B9C4F1C05B97DCAFC8C2C4C829D41A8D2FC10C1E69972DC43225460D7246E2F8B235B218F2088167FE2E25D9725FEC4DFAEC534AC821BA3690D2D66EAC21C2839F3F828CB82A61DC3DA9C3C1BA9EBF6F70BDA36D87A0F9F0415791A9B2A084A593F9A030AAFC3EABD4E564DBAB7DAA89D982586804BFDFFD6856E9235FFE44FDD81FA08490FA4248F0D35E2457986442D7BFED62514064E90CCE7ADF695A8ED066735E625D0BDCCADFBCA97DC1CF026FFE2FCF4B7C2D85E3DA9438839B71A9A9B7B8E21E0B9A012B1760BF897E5202820D8057C8A95377E3CEB8878A43367C1BC3EEC981A5A9019CB72599010DBF281DA74FFF2BA427487ED2B3B7DB9E125FD399A41F5F7246C8318156D59B49E0B -ct = 4875B2B3582CE1B7D90D654131B043D8724A460D0922E1358CE269ED5779EA58F0BCE7AFE61BC976CEA31824BA77406E069274191B459393A7438DCC218D21997AE498D459D99C170927D9AB7B9551FF1D38D4994442EFE5A936E598FC7C953189C61DDAC976B35437E481EC0A43425257402814711882A5D4237BC2D70DFF42B0322117B91DCBB96D06DA1C0520462F0C41234C35DDA0BCA52C5882B01034CE5E8102A24B3924CB33C4C4C4697514DD4CC37050469F58A4510C6D493974BC39EB508B05AADD1DB502CB24CB8C26A9814D34F017378D1B251F65F959C6103E64CCA6FA099E19F483A0AEE036E44EE8AF76CC56B778E454BCD4063023ADFD840ED30AA835C051DBE8243A87CEE6595680576395194E78C05022C413489E808DD6A36743C3F6F83B9F3DDFC05A00B98DB6239C5D35A99A85E20F0C282789F6B3A5B9055C5AE312A0635EF0800250FBBC9A376DCD46B29F02313A8C90F8FAA8195A4E6079BA8AE876C18A9DB1CB00BF10935E9183EBD65A12A10840AA676C1F36C347B05505B9A316A920EFC3314A1D574D2BA7 -ss = A752CC792C587805D30F9FE4250155822492E10A93161E61 - -count = 77 -seed = 542E20078ADD5296050AF150360F057F6B9AB3BA835589DD56987DE805F900B906505B5390A0D86CBA28038992DFC59A -pk = F719DAC81F1F140FABD43474E31471E9F1732886FC66B4DA09B926E5727702E78CDA06384727EDBFA17D339336EF683ECC8DF3401350A81C0C038E60B56A3646DEDB4293AD1C824B09AC83F07EDCBF9E558A2993E1D59271415FFC56A6ED7A361454401AF0BB667B255BE7F9F855DFFCDF6A548AE06F326050D6D61B723F36493F0B6447D2C18465C8B62C53DC50C864CFB1728575CE6A6734CEA506169E0A3CB971432FEB96C961D829B8757D7C91D329E25FCB78EAF2DD723F070324E14F7072FFE03AF40B699B29F381066D8E5E7754AEFAE650ADC3A1A688B54B838DDAF34A3E9CB9E228DE2AC4ED45E279DB9097673F8B764424B5C617C5731CA3034E1F89D2E929BB46DA4B30F34668AC442FE71F4DCB8459408909BD5B6A6909710839DD4D4696EB73C87FA0DBD903C42D6ADA5E1FDCCCE49BCBF6AD48354DAF5268CF239BB5C854D90BD25B60AEBC57B330F42953DBBB402D957288E3259B69019B26976A60757F038DE317CB9B02478F48F3FB88A915B38201E3E839 -sk = 241191401A63AFA750F05662E354DDDBC683C776CE3222BEA59B3BD23B49A95BC1FAD20070FEC930B6060BD827D742B077092E422268E10DF719DAC81F1F140FABD43474E31471E9F1732886FC66B4DA09B926E5727702E78CDA06384727EDBFA17D339336EF683ECC8DF3401350A81C0C038E60B56A3646DEDB4293AD1C824B09AC83F07EDCBF9E558A2993E1D59271415FFC56A6ED7A361454401AF0BB667B255BE7F9F855DFFCDF6A548AE06F326050D6D61B723F36493F0B6447D2C18465C8B62C53DC50C864CFB1728575CE6A6734CEA506169E0A3CB971432FEB96C961D829B8757D7C91D329E25FCB78EAF2DD723F070324E14F7072FFE03AF40B699B29F381066D8E5E7754AEFAE650ADC3A1A688B54B838DDAF34A3E9CB9E228DE2AC4ED45E279DB9097673F8B764424B5C617C5731CA3034E1F89D2E929BB46DA4B30F34668AC442FE71F4DCB8459408909BD5B6A6909710839DD4D4696EB73C87FA0DBD903C42D6ADA5E1FDCCCE49BCBF6AD48354DAF5268CF239BB5C854D90BD25B60AEBC57B330F42953DBBB402D957288E3259B69019B26976A60757F038DE317CB9B02478F48F3FB88A915B38201E3E839 -ct = 09A679037AF951CBD5CB02601B1B67467DEC6FD98CA098FBCCF36C367D122D4D5AFAD6D18D30735F40EC22E56DE805D82ECD29DAC428D6E50837E94693962F0E59C27AC8165A4CF69B02DF9C6F37747D8D3DB6F07462A3E6E0E25B74F81B6A0A30BFD5EFC9FAEC652F1415CDCD650CF2A59E009239AD5D8E5B049281CC011970818C6265B9F47F1488B36FD0B0C1D63C594555961089C4EE89FD9B39501998E289597AA60D86A4810A34350B91EEDDD7405C0E0E67235A235378D6AE0AD3F455A790272062E916E66EDAEF46B6388C264980B15A8CF3C173EB73CA76437EE689983241CCC9D4A9BBBC8643602CCEF33AFF79F3180363072B722E2239C13723C2C763885C4B41C9C2ADB46AC708AD738F91C9D38470D975DEA1FE02A9CFB23106A95EFC740A8F6B42B7355769FA70E76B8F1AAF7E3CEC9E90BF180E8E05B9E8FDC218376271BA9BF93F19E2B5BB3C59A8415B7F9229A47405DC843F3EB93AFCB67B35126C99E0164EA02A68FFB2DA846A0A32253A21111DD4BF39FADD6BBC65EDCC8089EBF87AE07D81744F4962814F687302 -ss = 43C4B61F15FB7124ABA3F8E872901C308909310E67AB95D2 - -count = 78 -seed = 6A85A61DD08C0733FCBC158ABB49FE0B0D96A50DCCA140A2E9F5A254F1901985844613B1C656C0CB0112620591B88AD0 -pk = 90070817561E4DC82AF6056F74C3865A2F1A4D05B3C200434568A9492CF83E6008AE2157D98D3D8A66125F3D0402D1A71E6676527056067B216A206FE37E325DAE25083E3A5D87211919B2DC162A833FD71E0B0DF18773F814A89324139D2DD958D518E676EE009F2DB36171001069C32B0B892AEE0182A79C72C1C6AF3CABC789CCD6FE92CC8FE0DD3BEB586707B103950A7BCB89BB2896CA4E7626BFB700E2A6416B1EBA1655A2D590C7C24C3A42FE12676FCB48BD703C82ABBDD615CF5ED4241D6F15874705BD958257983D07E9B5AC6901A4DAE3B9DC245D84941D4D53E96D75E2CFD9F7C430238F61DA47E96A6BFFF4E78661DE1C750F2232400EEF8E7933C2C03C5AA072E1D8A2AB4FE30F6AF0722CC72E454A90779A53D45E7C49E46CF537FED39E02EEAA45B1E3EB6237BF3B818196B9CBCCDC6CF1F3153572153CF422DF7A7AEF3521E4183D4A8C824CA209E5EBBA8BF8FFFD16B311CF4ACF4CA601D7E19B1F043424F36EAE25C6003DB0DEB08932BE092C8E798C18 -sk = B9A6B0C05677E957D41A34BA03BD06F2A9092E31F6338939E99C0E7B82BE89BC3C1EAEE6680AA4EFD394E40C2B3F30523C8117F7C26A890990070817561E4DC82AF6056F74C3865A2F1A4D05B3C200434568A9492CF83E6008AE2157D98D3D8A66125F3D0402D1A71E6676527056067B216A206FE37E325DAE25083E3A5D87211919B2DC162A833FD71E0B0DF18773F814A89324139D2DD958D518E676EE009F2DB36171001069C32B0B892AEE0182A79C72C1C6AF3CABC789CCD6FE92CC8FE0DD3BEB586707B103950A7BCB89BB2896CA4E7626BFB700E2A6416B1EBA1655A2D590C7C24C3A42FE12676FCB48BD703C82ABBDD615CF5ED4241D6F15874705BD958257983D07E9B5AC6901A4DAE3B9DC245D84941D4D53E96D75E2CFD9F7C430238F61DA47E96A6BFFF4E78661DE1C750F2232400EEF8E7933C2C03C5AA072E1D8A2AB4FE30F6AF0722CC72E454A90779A53D45E7C49E46CF537FED39E02EEAA45B1E3EB6237BF3B818196B9CBCCDC6CF1F3153572153CF422DF7A7AEF3521E4183D4A8C824CA209E5EBBA8BF8FFFD16B311CF4ACF4CA601D7E19B1F043424F36EAE25C6003DB0DEB08932BE092C8E798C18 -ct = 41007EF2957266C353F81778BF4551CFD13D168AC4496CB62AE4277A71A23FCF664918DF1660781BAC13600B5B0F00908B123BCA9A98FE45BD67E2F4C2F020EA720EB5FE47A7461BB8A8676D045CCEDA9EAB2E62A99FC05D1B1EF504A851987031302C2B9E72A80ADD65865FA2F4DB9A210B9BD5DBFFF3CF55B465E8D5278CD0EC5EC59E291A40EAB4503D7718B0DF744092BFD5AD2042CD4B95F73CAA9A7FD4A1FC92E6BD8FD05C83F377A5821B40FF64CBB91CF5B6F3C40CC4EA653AA3554CE08A6A0D3B99C3A67DD86F177792E6E1606F50CB8A23CDEDD5190B6235131B2175E06CB2FF38953EB51A92E48F0D7676E4CF940FA341998A7210011763CC457F9B5C25990B55548B3755895FF0F7CC52C668D580AA19024F0677746C798E9127BC6E165B1FCCC486B0D30B46544C2F32A119CE2EE8A0FD9D367C1D8981F2C973D9AA427B31F5F764F5D0148DA72C8AC3AB820FFF835F2DBCB38CE5BD6E3A8DEC7DD0E372F8E18044C57B34FB240644251F60A30A792E8CD54131A49C9B2491BBC1EE688453E9CE95E0C3CD629C82F3302BFD -ss = 0B6B8EC0C8CFB0ED111785D7CBDE0162A44C96D58772E5C8 - -count = 79 -seed = 7F4A56EDA151E7B097CFB8EF980440FFF707AFFBA91867C89522CED6C5FF3BD7F5F00BB49DDD615D9361A7E4EFA42851 -pk = AFF975A50503593502668407B35538D635D667510EFE5223D9BF5C25E9CF90497F49E4B42C5129CF7B00EB08A9D41A2786134332C78B543A896600C95BFE1B661F9FF6BA4E3FB208023579B310EED4484B045D934DF426DC6D20C3ECA1CF97C994B70F2DFD251B232E44B651440EC50537CFB57ADCCB39B298B21972620984524D350799B1AC0B9C3DACC0993E5D247DC8ECF1348073E8C7535EFE765EB091E791DE42BD42C4F83B1294C252575BDCEA928BED00D8BC214E86E6A135022E1702B5523B35A68862BA25D6CE3877950030EF989CAFDBFECD23FBC329DD51B290C53CEC4049C511D0027A4EB9FE77C8CD298BE4F309C8B34A603F5A03221A955E1F976B034EA4F827E1D2FC1A4F40C7FDDF3F73236135BA565949129B2E4555EFB497CB5BC8CA3851878BBACD6584F59C63FAF4A0E18EA8C7CFA95D1EEB4E73FEEFA9A85743BA8CC291F68C1B94EB19DB928CDCDF353136ACADCD03DCD4A2F888A3426884F9C3C5C4AAD4DE1A9F53D22407BDF57633D97B98DCD108 -sk = 28A96C71577BA00C94F99FE965BC595A26DB2B3CA6AB5CF89C35D165453E5FCDC6F9DF64526D9DE698F2BD3E6BAC6C7FDD86601B9BA5F405AFF975A50503593502668407B35538D635D667510EFE5223D9BF5C25E9CF90497F49E4B42C5129CF7B00EB08A9D41A2786134332C78B543A896600C95BFE1B661F9FF6BA4E3FB208023579B310EED4484B045D934DF426DC6D20C3ECA1CF97C994B70F2DFD251B232E44B651440EC50537CFB57ADCCB39B298B21972620984524D350799B1AC0B9C3DACC0993E5D247DC8ECF1348073E8C7535EFE765EB091E791DE42BD42C4F83B1294C252575BDCEA928BED00D8BC214E86E6A135022E1702B5523B35A68862BA25D6CE3877950030EF989CAFDBFECD23FBC329DD51B290C53CEC4049C511D0027A4EB9FE77C8CD298BE4F309C8B34A603F5A03221A955E1F976B034EA4F827E1D2FC1A4F40C7FDDF3F73236135BA565949129B2E4555EFB497CB5BC8CA3851878BBACD6584F59C63FAF4A0E18EA8C7CFA95D1EEB4E73FEEFA9A85743BA8CC291F68C1B94EB19DB928CDCDF353136ACADCD03DCD4A2F888A3426884F9C3C5C4AAD4DE1A9F53D22407BDF57633D97B98DCD108 -ct = 2C6F1C997D00EE31E35DD4A45BE079AB61CB0EBB6DA09B31E3DCBF45833A29774711DFAD2EC8488E992236D22BE1BA98E983E9447EF45342D1E0D852BD65009273E2CDFDD8F82C78F6798AE8D194FA10701C53505375C16D8A15C51FB996BF3503090A83374A3EAF9C65323E8C146CAECBF71B1AE623F836540192141101189D71F9F5F5566B2DCC3C629481654F6C897F18ADE97C442715FEB67270434F483FBE43AC98DB0C95C741CD279ADE91F2B5C552E00231ECF9C24EE5CE442A3555259FF0CAB25496B3B43162C826CB4249102F808A568D6E3B804D21AD2222B25F034989DFC9C4D78487A6F2A513A12DA15FF46124577AC3DA408178F322BE51F89869135E21804BC6C3C5DA9FB14B1D6324234A5D666AC9418FD639D703F908D43826C54A8CDE4A79051066B4C0CEBBD3F0B22B1CAD29053D213EC92A918CCE8EC29C9F1478FAAEA2CB5B83B20BEF8DA51C101FD9AC66478A6F92E5D034E260521D750F3CBA3481232EF8625DFD18DA8992DA977F67B5D05E354D3B9853F5C23BA2BE3B93392865B5A440BADF3F456C78383B55 -ss = C506F215F739D554DA46B2C9FA8F98DA69B52E1FE7BC5574 - -count = 80 -seed = 09FC004519BCF85B20D25D314A0DFC79E00CB6262A7DDDF9C52473641AFB8CFA0F5DD5F53558184CAAE9EC34B459E98E -pk = 65B3C48E425334FF990E508E62646CDF7438BAA837C610B4221965DADF5CA7717533376C91EBCFF3A057623DE4594A577F12E24B3200E04758BB2BEF56D61D29376AD9C8763AF9CED27635130D62ED4CCAD330F476DED5540F4BB1F38A61F00496467CD9A8FA6FC1E2F4B251B932F5A0153945FCDB0723726E9A0D4AD02379D730AC17B946C2DFF3E672B4058B1D1D7D555C22C2B971761C180350366890C87C8EA8BFDD5EB2D32807CD6FAE148E76D6180AC0650FBEA4750E8263A935405B3EAEBBF7E20479F7790BFE875AAFA7DA2C882BBEA0966E7932900DF093EA372F49B3CDB23645BC2689F5D1E133DDF6F9C10E317BA919C85FA9764C163F98E74F4DA4614740FE3BE298ABB600772DCE67F0CF6C8FB2DAC1D642A77796549AAB51A42C800413BD05BE5A8EF3AE980A80E112ADE5D48287BF8608ED9E2813573CC4572EC12253CED927A7BD9D54CC0343A8E2693613770CA797D1B2A0914EEC34BE8500C51BFD1C7AB957C4F8463F993432BC69C60781F9475BA1AA3F -sk = C08BA2EF8C3A0A043AFAD931652D7A19E6E8CB670F840DE55FE6141A25F7AB9F875F79E0A82D6EA5CDE5A017AB637D5FDB7C42646A1D710F65B3C48E425334FF990E508E62646CDF7438BAA837C610B4221965DADF5CA7717533376C91EBCFF3A057623DE4594A577F12E24B3200E04758BB2BEF56D61D29376AD9C8763AF9CED27635130D62ED4CCAD330F476DED5540F4BB1F38A61F00496467CD9A8FA6FC1E2F4B251B932F5A0153945FCDB0723726E9A0D4AD02379D730AC17B946C2DFF3E672B4058B1D1D7D555C22C2B971761C180350366890C87C8EA8BFDD5EB2D32807CD6FAE148E76D6180AC0650FBEA4750E8263A935405B3EAEBBF7E20479F7790BFE875AAFA7DA2C882BBEA0966E7932900DF093EA372F49B3CDB23645BC2689F5D1E133DDF6F9C10E317BA919C85FA9764C163F98E74F4DA4614740FE3BE298ABB600772DCE67F0CF6C8FB2DAC1D642A77796549AAB51A42C800413BD05BE5A8EF3AE980A80E112ADE5D48287BF8608ED9E2813573CC4572EC12253CED927A7BD9D54CC0343A8E2693613770CA797D1B2A0914EEC34BE8500C51BFD1C7AB957C4F8463F993432BC69C60781F9475BA1AA3F -ct = 10A444F2EFC022C5B6AF04AB20FF9F101B7437C20A7902B53E321BC52752008C8CDC6F43BFEF35BAFFB17013F838387B4CB528BE5B9F4825CF868804416D2AE917E0208EAFC78844CC4D5E15D425016B390E27ABBEED26398E2EB1EF7FAEF2515F9067216B2CD92D95A84B34CC26714013844A4A6F169921FBC4EF9CD21CD9936F089616CF74E288DE1C9958DD4BF593C3EFAE0A0FFEE8573D875E04611714AEBA9D526602EB06C4B2E5083E6565F6358E64FCC9B2316D948F5FF9232BB86A039D0F350077AA9411C08D5C99544CCDB6C1EC4DF37989D5933FDB59E7BDDA4C5E02B579553F860C918BB74D3D1785B91AA027F100F60AC42165D5B222FC6EEE2DDAC579AEAAA7C05658D4CC929414C673387C95806DD0A6A626CE1F99BFCB20C1CCDB0F5A91A8015627D98ADAF8A07EF18F0F26507CCA29A5C2B53015CF3A807CBE09609C147DB4C6209449B3EA8E69D493E120942092C3DD5FEB6752C6C10CA2D80D6A3732FEC5CB2618D182CE665643095016EFC3393A066408D227C14B548A611BE12021E61CAA39FBAF695B0D84679AE0 -ss = 8E29194E92798F63A56372A284CBA20051D66FCE75098C33 - -count = 81 -seed = E3C41CCA6F04CFE7732FD54DE30CC5CAAC93E2F80E76AED7D24A962A3969C1B6A311459A3EC3E510E3E9B1E4291D4D7D -pk = 2B9A9445EAACDABD31AD55C16D217142CDC68DB45F519256547C4D969953059328AEF6EB5456C73674160B154F62DBE5F49185C5716F3A024DE4EBEA756F23729F8227EB42382B53B49AE72CD11F7C4CDC286DC6AF0A0BD2C1ABB58C373E661ACDD5F036F67C463361763D54A7E07AE3CA8F2D82D13B353A695FB617E005184090E413245382B6CDD3BE109B378828C7EC637552A88912127312ED7A453797D4E2971C116CC628C48337F5048B440DC32CE6E5EAB668A0CFDBC8BC3936DEE9C5281C9EE7F77F191525899D4C77CE15C3005914170D8AF1521E8C6DA8A6A2A07CDD0AFB9B989076AD0535E552020B19A8C4D148E5408BC2E61B69B93B332E1F37DFF246C98A2ACED92953376E00945B439A5389DDD18CFD8683E3FE16A2B671CB7BA206ED9EE26617B735B84757825E3D2AFE47C2AAA6128C47810883D98D6BB3F84F0603F6417EDEA1FB2C3268FD340CDDB2486487BE55AE154B83C505DB1A10549E3AAF24F8ED3E6184A81580D56D156E3381FEF2D3BF62DE04 -sk = 0E3B30E102D707538C2671060F603BB0B8A014103F132D6311EAFECA9E810796C34E8CFCE9D59342884456007B01DDD12EDCE6D10ED87E0C2B9A9445EAACDABD31AD55C16D217142CDC68DB45F519256547C4D969953059328AEF6EB5456C73674160B154F62DBE5F49185C5716F3A024DE4EBEA756F23729F8227EB42382B53B49AE72CD11F7C4CDC286DC6AF0A0BD2C1ABB58C373E661ACDD5F036F67C463361763D54A7E07AE3CA8F2D82D13B353A695FB617E005184090E413245382B6CDD3BE109B378828C7EC637552A88912127312ED7A453797D4E2971C116CC628C48337F5048B440DC32CE6E5EAB668A0CFDBC8BC3936DEE9C5281C9EE7F77F191525899D4C77CE15C3005914170D8AF1521E8C6DA8A6A2A07CDD0AFB9B989076AD0535E552020B19A8C4D148E5408BC2E61B69B93B332E1F37DFF246C98A2ACED92953376E00945B439A5389DDD18CFD8683E3FE16A2B671CB7BA206ED9EE26617B735B84757825E3D2AFE47C2AAA6128C47810883D98D6BB3F84F0603F6417EDEA1FB2C3268FD340CDDB2486487BE55AE154B83C505DB1A10549E3AAF24F8ED3E6184A81580D56D156E3381FEF2D3BF62DE04 -ct = DF8E3FC504DCA4D54090C43E75EF7FD0682DB3844D270838E40F14955294BFE9ACFC4D228A9650998E9C23E8E6294FDACA7327F173F6485F7F485AE6F8C7085B4391F37883D095A459BB6440C97D80AC9E0D4357B334366177F35DA3B72CCD9DBBA28FBD4A9183281A32862A7195A3B86E727A02BD21E7C3F457E431A735FAFA56D41EDA65CFB2EFCC0CD6739E013521E4368C60040D213D890A438F91D45436B228BF9291E4FFBD78CD94F47BE2A0292C41895707BBABEE6C97401D13628AE2E03BD24CAB7A3B0669155D45F3488A8E30377C86922014206D80F8BB26F136080369F3F72144BF4C575862083CE3004694B4011F8765209E06F07B3A9A42EA45E5B809E6E6F9606E96A140BFBB8D1BB6D053559C4D347C57E26E5E8F46186641043B1737E0A8434F86995B677FDA3E84279F8446EA85D6F560890FFAA07192FA971110DEF76D1436D2167EA51B4ACCE34B6AA620479DD9CCBB1FB73F33BD4A872E0C4723449EC29DC9933DF5FBB1851309C1DF618050FEF6790442113455094FAA5FDC1B586958B4F9171F0923EBFA5907E8 -ss = 78B38CCB78A36C6AC719A53A4A571DF65F7021AC114D0742 - -count = 82 -seed = 373FDDE922CFC416ED96B444E445BDD0962E8989F6C50ADF9912A89937C57217D3600B06C95440448E3F601AE69CA5BE -pk = 1C7E2A130909B77F803593A301FB85090C230E13ECC2EE78E334D2430966C97AD9A247D26E60FF6829C322D0EAB81BE002F68FD58AF1C0C75178AFB5572C374A30AE2674604EADB98A557EFA4A0C5F90AD82078CCDE7AE7114BFFD35ED119696AB6033743DDE087876F8AD4D1D187D95B3D1EF8E9A01ACB133B4EF99E40AF2A09A9EAE85E4808FAE59D480A62DC6CC001DC76F15AC8AD4BAD5086FDE9D3820D9FBEA677698967CC8BC976721AE75E25F884467CC866682B13A5CD0A9028A57B01D8831F44371F4798843780C2505EF1BBF8FC6DD0F44ED368DB04A10E6EA9ACA0B49B14F36462ED85C672BCE50E226E3EC6645F010B31382D2953A2955572550812AA2F33EF7947DC6D6E9DE6B2442DD369D774DDE284F1D9BF4BA9B9E3BEDB71308D8CE787740E5F8E77E5C2D4839117E2963A8CFC8C49648850E2A1EBE15551650D8235A50BB5242F737D8E8F79FD184EA043275F3D0842E4537D86B451D6829E7EACDA32A343AB5238A0C086275C39093F23E6F06CF651822 -sk = 2478F7D3DE6041E7E5CD11C5E2EF483D1AA6218EB126444011136E2681DF2EF881B51A092A9BADBE72C9772C169808521C47149578621E081C7E2A130909B77F803593A301FB85090C230E13ECC2EE78E334D2430966C97AD9A247D26E60FF6829C322D0EAB81BE002F68FD58AF1C0C75178AFB5572C374A30AE2674604EADB98A557EFA4A0C5F90AD82078CCDE7AE7114BFFD35ED119696AB6033743DDE087876F8AD4D1D187D95B3D1EF8E9A01ACB133B4EF99E40AF2A09A9EAE85E4808FAE59D480A62DC6CC001DC76F15AC8AD4BAD5086FDE9D3820D9FBEA677698967CC8BC976721AE75E25F884467CC866682B13A5CD0A9028A57B01D8831F44371F4798843780C2505EF1BBF8FC6DD0F44ED368DB04A10E6EA9ACA0B49B14F36462ED85C672BCE50E226E3EC6645F010B31382D2953A2955572550812AA2F33EF7947DC6D6E9DE6B2442DD369D774DDE284F1D9BF4BA9B9E3BEDB71308D8CE787740E5F8E77E5C2D4839117E2963A8CFC8C49648850E2A1EBE15551650D8235A50BB5242F737D8E8F79FD184EA043275F3D0842E4537D86B451D6829E7EACDA32A343AB5238A0C086275C39093F23E6F06CF651822 -ct = CEDFF65BDAF1BF8F2A851BCA4264456480C04173C33C78F465D96944FB841137F7217D484F9C20FA1E60961741FC31F9CE128D64A63DA348E6172EB93468038ECDC91013474B53E179B0EE53D4884FA46263FDE4D400967F924265323B8B3452CFF0514F45EAD5E5BBAAADDF9E4409287C33448BD4028AC083A94CF21C0B65D9FF52295994C4A8215C4894E7BE275ACE0D8990EEB4263F0C6EBDFC3D2CBFC88EC8F6189073927DC4926E8183D75FCEF2783EFF90D7ACF41FD171F9F505AC19A4050EFA3961F3B0F276DA88E9E2EBC8FD6F72212535BF2643E51C6CBC37506B2D71677298CFE9F1DB9E996472496A06F3DB1726EA1D513915CA7849044281320A11DAD0D4E34DEF004E6E3FFDF5C7BC9F887DF9D5139058AD6927839447A7F78E8AC093527018479D8CB1C340BDEBE7EC3BFE313780E6395570BC086084518D305A2F2164A0432E9055783C9EB83DCEC4F3A9D07E8DD9232F466CD534D4B1F7688360B94868263B57773114C9AD0F94FA5242448F99B956C19E3B0F44560417A090139B00688DDCFBD2C7854B949D19F7B8E4 -ss = ED9343F159A608F60E3990C496282C01BBF5E6D1E5582C5D - -count = 83 -seed = 16BEF67F7AC3A755C59C816478B75FCC16CE5844DB537791ACCD1EBD49D2824B105FD2E970F728C8F0CF16E439A9AE2F -pk = 6C9B4D10DFB63EA98D6C89B8C03E969D11A5C764E25A01C952A304530CC58CE0216B09D2AC98F2DF4837EDD028BCD1BB3FDF2D2E033F1A333D52B200007B2DF201C71B1FA6B0DA29C7BCBF9AFD6A3E918BDC76122936041458257BED2383C8646A6B44D8B47E4FC2671C4745D4940D94D797D9D7A1A2683BB13D46064D00D458C927E6562A263DE32C07984411D50658F125A5153F2CA9D85F10BA4FB71123DF5669913D2F40C8E5DD67CC5EA2F96B1A138D9D860FECE2ED479F3DC03F1EB14A87347F5122245CD8587442BC0FB15D514E083487AE1F1177857A30C67F12996DD22511CE1848F10C17FA6FD3BA67E78F17C647889A55EBC7F9509D23A89E7D06CFA009BCBAE53BE32AFAF6606E56E2FC699DEF55EA5EC3F038A9F5305374698F2AD822B521147A40F78B2A5049494467EC77224073409E79A19F3DAF98FC285FF9FA6DB77C6F59A4F94ED206AF00E9DC5B7B329FD047820CDF8D174C785236C40F7849640A829E4CBC09910289F5CC12076286A1E819A05A3C22 -sk = 9D405D3EBDAF35FA8722DE431B669722ACAAEA2FD10B81436CEB14F7662BE0C42779459F69A145C0E2CE9F0BD9A0CD1BF32ED5694CC9AE026C9B4D10DFB63EA98D6C89B8C03E969D11A5C764E25A01C952A304530CC58CE0216B09D2AC98F2DF4837EDD028BCD1BB3FDF2D2E033F1A333D52B200007B2DF201C71B1FA6B0DA29C7BCBF9AFD6A3E918BDC76122936041458257BED2383C8646A6B44D8B47E4FC2671C4745D4940D94D797D9D7A1A2683BB13D46064D00D458C927E6562A263DE32C07984411D50658F125A5153F2CA9D85F10BA4FB71123DF5669913D2F40C8E5DD67CC5EA2F96B1A138D9D860FECE2ED479F3DC03F1EB14A87347F5122245CD8587442BC0FB15D514E083487AE1F1177857A30C67F12996DD22511CE1848F10C17FA6FD3BA67E78F17C647889A55EBC7F9509D23A89E7D06CFA009BCBAE53BE32AFAF6606E56E2FC699DEF55EA5EC3F038A9F5305374698F2AD822B521147A40F78B2A5049494467EC77224073409E79A19F3DAF98FC285FF9FA6DB77C6F59A4F94ED206AF00E9DC5B7B329FD047820CDF8D174C785236C40F7849640A829E4CBC09910289F5CC12076286A1E819A05A3C22 -ct = B68697EB5B2F8254C3E020978D86697409B30069BF60B136E27FC738A833776F4D95E0E24CC7AA3620AA5697062C06FB4671EF14836A23C708BC5BDAB05F24B30D735E5AB63C647BBCF235F25B2834D9612753C71F508C56DC4E57636928FDD310B113F7D4A14B0944BD8D66457CFB3AB6BC214DBAB89D30FD4E8966632B9F6CA3E04B731E20A19674573CF30700E50097EF9CE41D19BAABD878CA75EA8456FBF0F6B09F4A9704D3302AAE8BD4C232D18D3EB351CBD1670CB68771EE2A06044993539C4E72A18C86B7CFB160D411AE4DEE84F91F4D0D47AD5736A801149563F39A2FEA8C33D0EEE919B8408AECC9AD274B0A05848C48C24004180716D73BDC2B7CFFE1BFC9BEBB6C5C196EEAB37419E18EB58B0E7C107272B30890BADE2DF73057C60CD1FF5E3BAE8EFA63E2D1BB546318F3D518643B82164FFD2DA790170660FE3C31E0C3310F0AD0174F6012505C2E6F28CDF204441052631D9C6A469D6BB0EE08D509B375A439D32D9FB002D83A709F78B5EE73F299AAEF1A33CAFB01CA80322099E04E9628EEA2AF68A8F3BA8E9B5998 -ss = 37BBC45B6B83CDB5B8E1E01B05C8DCCA445E9362D853C869 - -count = 84 -seed = D0611F9AE5BE4DA5D7EADC9109944348E716CB3DAEE545721EEA8C892E7831CF2E54603146454CBFD92387739E9A78D8 -pk = 9D7481515ACA6FB379ED8BF0D31CEBA3E668543DDDD371E6622770CCFCD14556A93144B372F642D2814C66AE4A556E1319F0DDA9820D54B09D80022A74590EC9161D4F1797418764A34BDD587360490BBB0845D13033DAAD7615CFA84C186DEF1FF29A0BD8A81EF32AE108B136F5A2805E44C2F48C736FFF5A546C8D4501E283C162ECB7C7F667A8AD2F790216071B26BBA89A0F966A4674CC3A300D3CBD24327E9A57469D892B54D40A80D50B307B0139546D57C34C74B2EA616843314D9D9B178BD52AE2574BE284C4DE79DB6679E91A870F8D0FD4B97D946774EADE0F771BC315F9D58A0F6A1BB2F9FA0A960FC93A55B85BFB869C36D2AD14EE2AC57EEBAFC1C917602D6A4C9D60E0C0D540E0FF0BB503F913BE8472C035EDEC96AB2152908732977B18814FACF17FFCB7BFF29A4D44973E4FF32C2834D7791019B9E42A384A74AD7BF1E185D78E791E91432F0CB7128CF829B3D7808C95EF76BCD94A945685ACB1ACCCB1A6C7A606D68CD6E76E61B3326CDB5F75EAB1F501 -sk = 9A86490F0615F3EDF789CB0654066E9EE339CC59F968281FFAEB2EF44D2F608621E831187CE79B2D2F4A20F1568BBE76B0D3D5AF361117049D7481515ACA6FB379ED8BF0D31CEBA3E668543DDDD371E6622770CCFCD14556A93144B372F642D2814C66AE4A556E1319F0DDA9820D54B09D80022A74590EC9161D4F1797418764A34BDD587360490BBB0845D13033DAAD7615CFA84C186DEF1FF29A0BD8A81EF32AE108B136F5A2805E44C2F48C736FFF5A546C8D4501E283C162ECB7C7F667A8AD2F790216071B26BBA89A0F966A4674CC3A300D3CBD24327E9A57469D892B54D40A80D50B307B0139546D57C34C74B2EA616843314D9D9B178BD52AE2574BE284C4DE79DB6679E91A870F8D0FD4B97D946774EADE0F771BC315F9D58A0F6A1BB2F9FA0A960FC93A55B85BFB869C36D2AD14EE2AC57EEBAFC1C917602D6A4C9D60E0C0D540E0FF0BB503F913BE8472C035EDEC96AB2152908732977B18814FACF17FFCB7BFF29A4D44973E4FF32C2834D7791019B9E42A384A74AD7BF1E185D78E791E91432F0CB7128CF829B3D7808C95EF76BCD94A945685ACB1ACCCB1A6C7A606D68CD6E76E61B3326CDB5F75EAB1F501 -ct = ECD64FEC7DE41222060198881E2287F8A973DA1A64A4D3076FA406978D19A03089AA74C7623D50F568D540ED3A058793D5A092BF4426E6C2833815EEE0232F4C1900CE56391ED93357159DE5D4EE0D2CB25D91EB0DA1C82F743BB3C12DC35DD0419D953A0CF86566F6ABB081CCF302746EC8190D070455AE6F9D47C77907E1342F3C9307A6E93A6A36445ACE9AE66675D8C8E10B5E077E76CA38DCDA8546D7C036C081FD02C550AAF3DFC4DEC109470BC6C0126B1F0615BDB3E237403DA9907906C7BA8CE35CCF262E4FEDF6076D0E5F7B127EA7A25180F16E72A066B916AAC973A3670ADD0C34FB88A2CED9F99F940C89668A177D2FC2E9E7338225CEF4DB17822E57DE509CD74969200740AFFB1C7DB602CD680B0BC8ABB3803BBA044D4AE246F4247FAE9040C5DE2B9B23523FB1C1F1305008E92D8F9913A20CAC68E2CC2118DB5D0EB532E0D6A5D84A8CD10226FAA692BE6E07C6C7BA2063ABC3D1F8AA3B3F7AEF3E365CD44C571EBF8E205DAD0B47CD3AADF660A674E5124663A92318E0AB5972F2677DA8409DCACA621B5DFE4454C0 -ss = 93816F7FAE6511D47D153C04DD1AE13FF21FD701EC3B8839 - -count = 85 -seed = FBC38D7614D7718E931EDB850D2C6F0C5EEA9EE889B3E25BD69AC255D5B91E885D93E808E66BF9C88C655DC594DA5792 -pk = 243848C51898581160FF5A4F7C1A9EE24408CAE8004289892445CA11F8BBFF9011231C55A6C659913A39B9D7BB4E427554E4E52CCFA982153C6DDD1665352A0C8874FCF42C5896DC0AB029407C3BDF96D0BE6C7A70DB404E3F4AF8D23CADE2B1D809C8FFC17B4B70FCBB109002468C7F2D5F84E26D120FFA40162D4A95017BB9B5879961C7906BB703342EB6A58EEE1919E8A3AE3965EEC40D6BFF8D1FE260B45309EF2F6D4B9ABD181F04A11ACEF6FAADF3922C427B06BAA9F1AE770C6EB8F7890BD663D8B474BAFB866C7C03657DF4AF1C6965534653E4924B632A972DA493AA48A81A862ACE5715BB43814329302EDC0627EA11A5019141EB1F17927FB006C8EA0CF965B004CAB36FB22FD519E027A7B13426DC233E1A848A2D99F3D0260F34ECC063B253F0DF3E35C5D6F0CC7C0887957BB638B26A55CD20369474A42647BFD37A30BD1868C90A34D507D13C6A1F5E171A673134E67B6B1C1D189B931B3B3C8181F9710698733E2B99D4F58BFC884CDF6C7550E9CD08AD3B -sk = 6DFD9B575872560C7BDC2732C4A28DAC4DB04E535EB8E402A2985C1C4D203778597947D710DEC806E36B0CD949FE460EF141213BFC525E0B243848C51898581160FF5A4F7C1A9EE24408CAE8004289892445CA11F8BBFF9011231C55A6C659913A39B9D7BB4E427554E4E52CCFA982153C6DDD1665352A0C8874FCF42C5896DC0AB029407C3BDF96D0BE6C7A70DB404E3F4AF8D23CADE2B1D809C8FFC17B4B70FCBB109002468C7F2D5F84E26D120FFA40162D4A95017BB9B5879961C7906BB703342EB6A58EEE1919E8A3AE3965EEC40D6BFF8D1FE260B45309EF2F6D4B9ABD181F04A11ACEF6FAADF3922C427B06BAA9F1AE770C6EB8F7890BD663D8B474BAFB866C7C03657DF4AF1C6965534653E4924B632A972DA493AA48A81A862ACE5715BB43814329302EDC0627EA11A5019141EB1F17927FB006C8EA0CF965B004CAB36FB22FD519E027A7B13426DC233E1A848A2D99F3D0260F34ECC063B253F0DF3E35C5D6F0CC7C0887957BB638B26A55CD20369474A42647BFD37A30BD1868C90A34D507D13C6A1F5E171A673134E67B6B1C1D189B931B3B3C8181F9710698733E2B99D4F58BFC884CDF6C7550E9CD08AD3B -ct = C36C0543CE42D4E148768C6B70058A57520F255DBB361358E7F28423E2A4598201A905C0FF29224FA47C1464DF3634A4E20B47C2439197437ED751DE6360167A521906A938DE4A33D156873270585642A6BAED5FBB94EBC913DE0BD4B83816E619A50943E3842014D48AB01DD743CE57BC743B9A3273A409BE2619ECF615F155C23D71FDC2EA7B096FD8B0919AE45A6601E1F2AF572317ED93C288B5457BB2555E6925C8DAA7E2803FC3797A676F1C352A6D1AE1279C8AAF598FA0C92557BB20F1136D815CEDDDB282D6F194B54CED3591871BA72E38B4DC1B6899A8D0E29AD9A2C3435940C459386A1C4DCD2107C7BD9BB7DC76259896CA9E6D0D02B32F274908794AB6989911626306A8B1EFF04B527638599FFDF27E711043D8DC9C3FC54006F8C1AF1C0295C5F3FDA7713669B94E1E0EA565774AF0F3156612AB7E3B1825875D7891DFEA88F831E34932D9903743D21CE6E617F89F2A087B2256E57BB1AF339C6F51052BBB0642991DC0D495BEDA74D1EC68D029260F4C3204CE5C8DBAB020F13F44102D89ACA08F41CF53778F72B664 -ss = 32F85E3ABC134C88F5994A0C9EE049FE07AF4D7EE67F12C6 - -count = 86 -seed = 1722219CB5DB47374EB0AF0232C856A57F026F1CB09E5A5799F4C333DD422FF6A0A67C4DA502FAAE727FB2D45DAFCF35 -pk = 25FB2248663FAE9C8A7F9871753E337FB67A8F856B056FCA3FD2897BCF1DEF515D906073FAF3D3E75FA695CCFF55B7F114668AFF281EFDC2D489DCAB3F8219CCBE38E48609D1E96A1C1528CA582EA7C62D56CE9438AF19C60D7EB155FA3A47961253EFF7C9F846A773DD60B449461C52E3601D3BF4527E0FF4270B81562A0CC33872DE6B1B71C590A11C6687DF01805F59C3B74954189AB5256C2B28CD11FB28E2F4CFF7D25BE53E0F46CD5D080387E3156337FD9AC16E0364BC679C220514B31134279BF92229E998B0760B826F8443E1B2CEC5B0FEB6907977EEEEC92F67A78B25A9224D3932B7268569604D04EF332F17500C7DF354C901AE23161C114D7A443BB0979212797E7B5EF37D6C8B45BE740AAFB529324ADEE5F5CE27295F4E37142995AFE6BC67B17CC38537C9163D9331EF3256DA883A28BEFC24F4BF1352C770EC38C4DC62740F1EA64997A903108585CA3E7056C1C963272A404955806240D348E58A289DFB1CC62C37D81C610ED11161D3D3F9DB1FBFF929 -sk = 6FCA9F4E384D8418075CC064C70730801BDB8249899D456ACE7683F8A03D3CF04E46970FF7D6A12494AE12558346DFC8FD9370BF944A010225FB2248663FAE9C8A7F9871753E337FB67A8F856B056FCA3FD2897BCF1DEF515D906073FAF3D3E75FA695CCFF55B7F114668AFF281EFDC2D489DCAB3F8219CCBE38E48609D1E96A1C1528CA582EA7C62D56CE9438AF19C60D7EB155FA3A47961253EFF7C9F846A773DD60B449461C52E3601D3BF4527E0FF4270B81562A0CC33872DE6B1B71C590A11C6687DF01805F59C3B74954189AB5256C2B28CD11FB28E2F4CFF7D25BE53E0F46CD5D080387E3156337FD9AC16E0364BC679C220514B31134279BF92229E998B0760B826F8443E1B2CEC5B0FEB6907977EEEEC92F67A78B25A9224D3932B7268569604D04EF332F17500C7DF354C901AE23161C114D7A443BB0979212797E7B5EF37D6C8B45BE740AAFB529324ADEE5F5CE27295F4E37142995AFE6BC67B17CC38537C9163D9331EF3256DA883A28BEFC24F4BF1352C770EC38C4DC62740F1EA64997A903108585CA3E7056C1C963272A404955806240D348E58A289DFB1CC62C37D81C610ED11161D3D3F9DB1FBFF929 -ct = C5BC5D91572F9A7EB51CC1FD9CAC1154C691A147E70BB583CA70F4468E7A603F8039F8510F379C12379EC2C453C66F022397164BF3E26FA6B84AF3F2C66F382A37E334ECA020E4DDDA91FABB92311CAE2AFCC215EE9A6971F151A8EB22D27F990164DC37FCC27133BB681CA4DB8D80974B136F40EEDB8B8733BD7E084040689CD1E95F0051C101C76038538B2F307AC26C27A618198A0B9D2478D66F52C6DD8905407B07F128F216F9F2AEA22DD333F4E5ECCB99D83BB26959A38028389E4D0728F6D3691619F79F11BB483C66F01552DDD90C084CC4E6A0D9A1BE6144B817DD467A8CAC91FF409EE113CE9CC1DE8DB0C17687A94EC9EC08B2BFF51F2437A864342F5906985A2409C8CE82F8DB4A5FA12FC0FA7439EA413F3CF66325E7F7ACBC808EE093E5FC6B7C130ECAA604639EA27B0DB0DC333884C9894420C3ED9C9B9477718C7E7899731773DBA7505B4F2CDC44EE611F131D1FFBF570B1E1F51A7B8B854F9F895828C8A832EE465D0279DC908C1D9F83AB22131F4F05732FECA6BDD5E84502247255FF55C9F3EB0388077B7718BC -ss = 882D3F7190680B6DF68439A524D5EFDE787649DDD43D45FF - -count = 87 -seed = AC139B78FD16CA0F26D6D7F9E15345C888D857B1910CF38D883339B37EAD2DCAC30F7CF10176F23FF34B4488EB79437C -pk = 81CF6AD13306908DF7C067623C5FD6C9BC9820C21D6CC358CC37EA9BDEBCBEEC077D25288C1C5A646C0648DE2D20FD33683AA59374432343EFA47633F2452E5AF30C86567060DD880E17DD0739FE844C9E9D2230756928772656A5B5AF6FA5C0C306E65DF90D304FD47D5C9F70035EBA6DA539AE8B64FAFC40529C14312432337CB7519155FC7C1F43EC0AB8B78060599A0F3C9B786A3AE5F48F811258CD424A5688CE76407D2BCED50078DDA23AE71C2049C104A862BC464D5E2CCC1DDD78C9557CAB1F5A5B4B8AE6F2DC199EF38CE366E67A9D0E40CF423C7654D4FC4E1A36DDE555389A41B105ABE760617527DCB50C9F0C8D396D9BE746755A2D15787306B690A90CE03AD022C4FCCD0550EB7ACC95E8A705014F6C73D25184868740409B87B0A620BAEE2FAB3C16151D221C90838046413B1A317809854D01CDBB5157A77A6E2AD22BCCA4C5297BAFBD5A7EFEB3A2C848A287F7FEFAA72AE4823B692C3938AF5AF14011264B3037220B82ABEC1F6390BCEB3DAF7B252E25 -sk = E58F71BF175C0550A67E00E0F7B3B7FC36BC2707BF0C93047F7054814869CF7625E45647BC1547AFF288DBB90699B2AD84893F3B755D970281CF6AD13306908DF7C067623C5FD6C9BC9820C21D6CC358CC37EA9BDEBCBEEC077D25288C1C5A646C0648DE2D20FD33683AA59374432343EFA47633F2452E5AF30C86567060DD880E17DD0739FE844C9E9D2230756928772656A5B5AF6FA5C0C306E65DF90D304FD47D5C9F70035EBA6DA539AE8B64FAFC40529C14312432337CB7519155FC7C1F43EC0AB8B78060599A0F3C9B786A3AE5F48F811258CD424A5688CE76407D2BCED50078DDA23AE71C2049C104A862BC464D5E2CCC1DDD78C9557CAB1F5A5B4B8AE6F2DC199EF38CE366E67A9D0E40CF423C7654D4FC4E1A36DDE555389A41B105ABE760617527DCB50C9F0C8D396D9BE746755A2D15787306B690A90CE03AD022C4FCCD0550EB7ACC95E8A705014F6C73D25184868740409B87B0A620BAEE2FAB3C16151D221C90838046413B1A317809854D01CDBB5157A77A6E2AD22BCCA4C5297BAFBD5A7EFEB3A2C848A287F7FEFAA72AE4823B692C3938AF5AF14011264B3037220B82ABEC1F6390BCEB3DAF7B252E25 -ct = 91D25ADB0DC2F171B2B1114922841E0EF6A85CBEF27F5F39E7797B33EB65D00144D89A6076DBF68BD4334AA97720CD5C1F53061F07BD6A986FD3809119562FF629B468FDB55FE3542C6283C52D836E063B47DBB3C9CFA0DC626B96CEB2615B3B11C9AE3813CD0CBDC5812E6C9BB4DDFD93B636AB2F5BD25BF9851ED28722F78452F83A97BAF31DA8C060349BC609074EEA11EC0DE20448ADC2CFDEAF816577C2695808DE76E8CAF5E96EFC64CC8858D646F63A4A6D9BF2B76BCFFAA40DD08B2180ADAAFD7D901116F7387DFCC9EC6C9897C5AE8A631F504B611E5DB4E7E0320EEF4C2B37704BDAFB7AFB9A615BBBA2667E14FD5FAAEE006916FD36343FF661EDCC8995ABE7089E138FCE06DC8199FB0AB3D46B73B23ECD856A1F2DBE303FC905410A68AB52BD63369E2DC7CE83C83CA6203C08C70785549B29973067C850B51A20DF8E2ECFE740B088A9A03788BBE3237958495239A6D850B5973AC118328A48BD573D552A97AE0F4BE7903474227343FC63130D825EA07AA51A6E1B9A6FCDFDB2DC9B1B2CB14EEE711D96471B78C8B3B0E0 -ss = 44F2C67406C5E032106545CC7118D8F3FC0A0FF6C1EA93BC - -count = 88 -seed = CC7152849C98D5FED2813275D32069E44824ECB14EAEF425CE017448CD9A401C91C06D0F7EED6D22B7BBE8BA6C429EC3 -pk = 990F4C0DE127E2E5D3307E02AEE3CCA33BC53C2033447F15AD2AB50457759455D2BADF9EB08F68302A77DDD5534211BB310D52357B970F2D3F5153607C4114FF806A5B6173E434939896468B4E2BD6B7A775690F88DC2D879E44D5504632B2E4EC0C1826596DC4CAF3B0B6DCE76A23FC1A1D0938CB349B891DA002F49F3136B1F20C0A03A019F7E51A5ACAB26347F0B6CDAAB1A0BB93DF0FE3CF77D6971FB00AA4BC20CCE8E0F91463B8C11A47F2337DBD7750C8AD9358C00491642428F74D0CB85927F98557A706F1DC0D56F56C81453A24D3A1ECB3E6CD1ED7DAE572FB65EB0C94E8B7C3C4002B856916C1FB886A893DDB018BFCC2D967C2637F2F0AC44FED6A397E571B9EABA0D0B598212337B5AFE539CCEB7FF54CBB614D42125EDCD1DBAFC83D795EF2A1F1A66CAE1188F19DBFCEE25FC1FFF2921591BA1A6D980880952562C100B94C424DA5DF7B8556892703DCC8742623C8BB837D9A281FB6CCF3DA6D296A3DBB0EFCA6B697E81B459927B763C468A2C8AE7AC45820 -sk = E3FC575ED51513E62ABA655D24CD9C8F1C6C848AAFFA946CD82C2F1BF2E6AEBDE5660FA73356982E12999D8FDAFBB3CB186341D0386DEA00990F4C0DE127E2E5D3307E02AEE3CCA33BC53C2033447F15AD2AB50457759455D2BADF9EB08F68302A77DDD5534211BB310D52357B970F2D3F5153607C4114FF806A5B6173E434939896468B4E2BD6B7A775690F88DC2D879E44D5504632B2E4EC0C1826596DC4CAF3B0B6DCE76A23FC1A1D0938CB349B891DA002F49F3136B1F20C0A03A019F7E51A5ACAB26347F0B6CDAAB1A0BB93DF0FE3CF77D6971FB00AA4BC20CCE8E0F91463B8C11A47F2337DBD7750C8AD9358C00491642428F74D0CB85927F98557A706F1DC0D56F56C81453A24D3A1ECB3E6CD1ED7DAE572FB65EB0C94E8B7C3C4002B856916C1FB886A893DDB018BFCC2D967C2637F2F0AC44FED6A397E571B9EABA0D0B598212337B5AFE539CCEB7FF54CBB614D42125EDCD1DBAFC83D795EF2A1F1A66CAE1188F19DBFCEE25FC1FFF2921591BA1A6D980880952562C100B94C424DA5DF7B8556892703DCC8742623C8BB837D9A281FB6CCF3DA6D296A3DBB0EFCA6B697E81B459927B763C468A2C8AE7AC45820 -ct = AFEA78B52C993F7EA0E94272E89052424B908ACFC5D8C50041724FBE6E2AE3AAD10619F3B6593D3831A0CCC7D089D21600D458707C7EA1CE924F634297C7026C4461C00B07BF8401231FCDD9DC9FB7ECAEACB78055ADB4D5D55035879522E70C28775A45C96C8D439B8EC5DC7C18C1C25A03F33093AB91BD83463A16CB1BD2672A6A8259DA43F8C9E44DB7B5E81E8328AFEEC6203DFFEC1F9BF0F2F2B0958FD5AC4B37D5CDEFC1056B63B875981AAB4A857ADC087F70C9ED53DBF5F627383D8E2FCDEFBF75AB63F181B14F35B70C0D1ADDE6B696CA8BC31F6B363902DFF19712E80ACD1B891E623C5400F44CC1E98181C4894DFE658A1C6FAB305C0EAAE225E87A76E9D596D91D6B338E65A3C31E32C42F7A9941B2BD32240A3681C092C53EFEA96EFE67E583283BF6E1B4E4EAEC38E3EB3ECAD8A15735908EF30824DD0DC83E4B7F5EECBE27BBDEF9F01C2EF578A20148C1B6A0C7E69983142735C5095D09109C0A14FB83AAFC693F982FAE602C97642B32B19C17EA1B281A04D878341C564BDCAA064F242E9CD87F69629138265328EE88 -ss = 4E77D3896C5494B0B06FEACB1DB71A345638B0D8BB0908DB - -count = 89 -seed = 96D9A06F88FF2C2036FA8E914B89C765E4A510B468DEE40F914F78858C811857EFE9FD0E17C0048E7389E8D996B7E2B0 -pk = A846439524CE37BA030BB465502028F419F2A64014D9D6C5D419E0BD99144FBC3B6ECE1DFC3CD59E0240376A7A1DD1AA0748D7A92F65559C13F91304C2AC3B9FC1B870118B33BE372BE80186815B935C5C92CD4F2310DFDEA02E6E8E73F94F7D85EEB4BF03745FC6E296084EB63DBEBB0A6C3A6DF96E7A7D5D17CA50C011159BBB247F59BB9F5F59EB3DBA11C933EBB2D6D2C7117FBA4A3156CFC420EA05E6F81B802EEB56F164731EBFC4066D93C4944BBC43679A7071EB010E4A222C0A04A8EF8A3A18ADA8BE668D2EAA9780198CD827D9E7A3CF1D4BFA76C5872F0A1DBABA91E041C77D3026E53FDA38C1D5A0ECAF41E5029F5D373A0FF2C661153D0522EC1553E1B72894EFC1C7BEABB7F6991FC1E9E599743610BCB98212DC9470209A4F9043C049DCB36FDD03AEFDE167964530E24538B9C10F294B9C4B0CB8B4B9E4977EBCC006A81BA71DDE6D12DEEC7D1C8C4A0714A93BEB58A7EE3112F356813C4142DDD01F933B7B5D7A008F708D9AA12799E25B8B62627AC09B1A -sk = 470B4943F0FE7FD0D8EC5185ABA0D1DB09D112934E4FB4788B2809FD40008BE70A6B184981101724BC3D5EC5E1956B510B82FD5AD0668A0AA846439524CE37BA030BB465502028F419F2A64014D9D6C5D419E0BD99144FBC3B6ECE1DFC3CD59E0240376A7A1DD1AA0748D7A92F65559C13F91304C2AC3B9FC1B870118B33BE372BE80186815B935C5C92CD4F2310DFDEA02E6E8E73F94F7D85EEB4BF03745FC6E296084EB63DBEBB0A6C3A6DF96E7A7D5D17CA50C011159BBB247F59BB9F5F59EB3DBA11C933EBB2D6D2C7117FBA4A3156CFC420EA05E6F81B802EEB56F164731EBFC4066D93C4944BBC43679A7071EB010E4A222C0A04A8EF8A3A18ADA8BE668D2EAA9780198CD827D9E7A3CF1D4BFA76C5872F0A1DBABA91E041C77D3026E53FDA38C1D5A0ECAF41E5029F5D373A0FF2C661153D0522EC1553E1B72894EFC1C7BEABB7F6991FC1E9E599743610BCB98212DC9470209A4F9043C049DCB36FDD03AEFDE167964530E24538B9C10F294B9C4B0CB8B4B9E4977EBCC006A81BA71DDE6D12DEEC7D1C8C4A0714A93BEB58A7EE3112F356813C4142DDD01F933B7B5D7A008F708D9AA12799E25B8B62627AC09B1A -ct = CFD0861222550FDE8F2318E73FC000F3443651CDC9913F9089FB2D74714CE097E3EB5299FE94E3A39B73EE7EBAF035B10B92A65D9D7C2B539AC14A7D5D7C004E156D5028FEA586D2B5631AFF90B3BA722F4264822554C1B75B1F7A454C01440500D087C81F7F398D117836070AA0E19A0C099E4A7F5ADF653BAB2514BE376EBF986B2AA48F64C993087CF610264BB7DE399DF453FE36DB3FAF96510DCA584DBF08D1FB2CB7F08BC59BB34E1A74FC37221BBC5BA648766C814B77EE8902565BF1660BC80D8C3FB74A97C3A1E32926F22CFC71879D377A63DB0D1E1F296E81E321ACBBDD3A23097484942C7AFA34D7088A22673BFE06B23E6437F2A6000DAA9401F010BBE6053726D928FB90AE78F18422804EF8CD5E1B4010C5B740C991FF16063C44953412F5C30DABB0B77CC806FDE6208102D025B30510972E0A2BDFD7DFF80E8972A7BC2746A4FCCC603B22B1D1A11380A5793AB0FB94378617CAF500CEEECECA4DFE5D740BFDBD6AA2FA59840C5F217F663612E2E7AD16312F397EAB9C035D683328CE2E68B55C19DD885D027A7F46CB -ss = B41F3712746A65094FDC479A3AC76C79E7516AC03C6EF8F4 - -count = 90 -seed = D26CE360D399BF7B89DC364AA7AC06BB513EAB8F527383E93E30727EDC3F22C262AA0EC70257B39EDFF0630DCDC1B79A -pk = B424191885F225F3908E03A9A0B1961D9276123707A18F3A3E21D1DC22D059190F5C98E37A8819B2431D9350307BF9091399BAEEA45972F53EB85D7F8DFA24576D4445B7956C28CD1FD421B2B66386FCDFFD12D05446BBE679F0F24E1E078C1D3B78F7C9CDDCB8148CBE848A9E8CCBF066F407456EFD64D8F569AA740A3CAEAC7EABD16D176EB0AB477767119A033BDAF7C843E59D8D67D270925ADEA34C2190972A01363B0F5E4EC1EEC3D66322B84A1F5EDBE1037962637950E4F828F1E234D22674B1A83D11BA4D07CCE892A93D5A9D24F5CAFAA9CA5E5F05EAD36705A78B17FC83875645D0F25854FB688E78F0C7E10E65C4F0770CD852ED8608F9516DD37B8EE57940AC17CA394F992AFEECCF6D25AC97CA5E3896792FD28B3153D454193407AC6607888E877B262CF6E43212B2C00DD0DF890C4937FEF515A1CBF9684895CCA19CFEB7A4A3FDF2B79F83580DD883593E835EC3F54DBBABCDBB8E6C0AF5430620A6DB87BA461C8E71A96DBC01D3B3E133C1D783461B021A -sk = 6DF4385DB978D27B27D2AA5E452E4152B36F097503D9581AC95FA08ED106CE84660E8A4C90BD2B22634E40769AA0090A101C5DDDAD45ED05B424191885F225F3908E03A9A0B1961D9276123707A18F3A3E21D1DC22D059190F5C98E37A8819B2431D9350307BF9091399BAEEA45972F53EB85D7F8DFA24576D4445B7956C28CD1FD421B2B66386FCDFFD12D05446BBE679F0F24E1E078C1D3B78F7C9CDDCB8148CBE848A9E8CCBF066F407456EFD64D8F569AA740A3CAEAC7EABD16D176EB0AB477767119A033BDAF7C843E59D8D67D270925ADEA34C2190972A01363B0F5E4EC1EEC3D66322B84A1F5EDBE1037962637950E4F828F1E234D22674B1A83D11BA4D07CCE892A93D5A9D24F5CAFAA9CA5E5F05EAD36705A78B17FC83875645D0F25854FB688E78F0C7E10E65C4F0770CD852ED8608F9516DD37B8EE57940AC17CA394F992AFEECCF6D25AC97CA5E3896792FD28B3153D454193407AC6607888E877B262CF6E43212B2C00DD0DF890C4937FEF515A1CBF9684895CCA19CFEB7A4A3FDF2B79F83580DD883593E835EC3F54DBBABCDBB8E6C0AF5430620A6DB87BA461C8E71A96DBC01D3B3E133C1D783461B021A -ct = 19FBF007137E648B4D8E6FE9C6B026898EA9E7C8FA08E1AA21D1CC66EDFABD7AC3F7A115C64F365D50CF249BF0DC3E69FE26CCBD7491C4D069A8D253A88D3C4EE200D9F1C2F9D295FF665832CD65610B48E22DA3541B9510BFEA0CD04E522FF25FF865F687B0143FE9DE6E73ACD9AE5E4F1A9CF339AE6C0004F51A7E27333826313C571A831FA463CA40B4C284A9D18678FEBC12FE54FFB5149E7CFD083BA002B81F904E05EB6D4CC418E01EB536B89ABE956D62A288108E4CFF63661340032ADB290362699BF60C89194330E8BE71941C7F5994390EBD0E1488449828B1FD5E677453E3CED821D910BEDFE110BD425D90555454B8092C072F367714D8BCA226DDAA0BB5BC685596AD0F5CD195AA8BE36A17BEBA9783BAB4C5F3B9EE7165B2ABABE585A86005D9827117773F9A556C604B9BD91E41E7ADD4356000C9313B8B64CECB975BA5C66C968D24E22A4BB15EC17397DA768CE5CC49C6D926AB8386F34BEFDBDCA99D00FCB1E07320DCB2D345D1579922E5AC043CEB810F98999118A6C1BC8D6B924D7A52A61467A2F79B6AA4EC5A8A -ss = 9197966351C732D5EAA75C7CD6E38B416B2CC72F02B06C18 - -count = 91 -seed = C5856298C3CB6AC9787A0F30938537AB2635B96F6D19CC9522063360E7A5C88E644929D2879180E3E5BCAD2422B7CFC3 -pk = F361885521DDD8390666967A8AEC562395B51D40C56E6CE0C739AED0995605987F846E0ED295453974A1CA8CAAB4D4179EDBA830BE2897A2DC961B0ED1C7038A603A909D3A67ABB820474AA5B576D8C3FCEAD2B3E3E0082227586EEE253FF4F608CB4F41B426CE34C33C4746921B731218FAF5CDD26623F1A6F80EC13C041011F37322C4FE8B67987B4A8FBC5383CA4298B90E1A3E468325E0FED1F9101EB58BE72902971870DD74EBAC1C97CFD8E5A57CA9E8C8DF6DF6C6A2824BA43C9208C8CA360000EF7B775C3C08291687A671052151E6CB2821500A0C4A50D0EF258BB4971DB335CEBF58A2BF8CC9C533CFE0150C0546239FFD550E0BF9981A1CADAD08ADC22964FCA003BFEC5BD88B74D954F35AF61B8A142B0DC063A7AEC30C39173E4C2FC9E0C397A51742BFF17AB303BA0BC94CF38B8DEA92968A123CBB63F80206DE2F3A441BC35BAA56011368F77145A802341636EA94863FF843080612968E746568783AEDA5FDEDA2C50454E353D9742AE8A3892EF053AEEF21 -sk = DBACBA825728444921B227CDBA54446B3F6881B47BE9CD02E15274A8E2BC08FE818B117BA28C5DFAE74D54FCDF6F20052F79BE333EDC8D0EF361885521DDD8390666967A8AEC562395B51D40C56E6CE0C739AED0995605987F846E0ED295453974A1CA8CAAB4D4179EDBA830BE2897A2DC961B0ED1C7038A603A909D3A67ABB820474AA5B576D8C3FCEAD2B3E3E0082227586EEE253FF4F608CB4F41B426CE34C33C4746921B731218FAF5CDD26623F1A6F80EC13C041011F37322C4FE8B67987B4A8FBC5383CA4298B90E1A3E468325E0FED1F9101EB58BE72902971870DD74EBAC1C97CFD8E5A57CA9E8C8DF6DF6C6A2824BA43C9208C8CA360000EF7B775C3C08291687A671052151E6CB2821500A0C4A50D0EF258BB4971DB335CEBF58A2BF8CC9C533CFE0150C0546239FFD550E0BF9981A1CADAD08ADC22964FCA003BFEC5BD88B74D954F35AF61B8A142B0DC063A7AEC30C39173E4C2FC9E0C397A51742BFF17AB303BA0BC94CF38B8DEA92968A123CBB63F80206DE2F3A441BC35BAA56011368F77145A802341636EA94863FF843080612968E746568783AEDA5FDEDA2C50454E353D9742AE8A3892EF053AEEF21 -ct = 7EB2F3FB65C64C2440C51F620139B29D718D5EB4088BF46B572A42F5497D77A3E678E2761ED974DB6F6AD31BDD55C362FBA140A7F46C658C79CA68042AD400CF9F557EB85D8C63C097E916485FE985797D3AF3867E35101B6C3F0875FDB54B0399E11A399131B8A75F6AC1F10A322D49ED5F7F92152B7247FA590C903F3C5A6C611E951B565AA7F0DF6A0D6167016BD8F38DBA95B39ABF1A51D1195B8ED0F34213F1B69A67F0F8A70ECBB656EBEAFB6E51A4AEE9883020FA553618571941733A7EEA4B09E28CA1F571DBADB6E2EFDC4906C552EB2FFAF08FF37D171B3B4791C4E98F465D8835ABC902884C52BDE74EF1F3D111A77834C56F2446791DDB8DCAE9E816CD8FF51A1145D050EF023DD15C116854B1D91B41C3B7063B73E7E15063AFD6D1EA9A159FFD1437E1E12A350956A1B7B61C004180508176A0361D4A2301A64D1F498C7EC19FBBC5E7BE78381EB22E096C6311C183C01B45B66FEFCF42962CB44C95A50166B08FEA6DCB05C34E90C202A65C29881B9D7F913568E2429A65C5A70B311ECCD242676C72AC494A4883A5878C -ss = 010C547D684CBF7E3EF15DEF1EFF805B2648CE3D55141115 - -count = 92 -seed = A28EAD0A08E7228AEFF602B16A1E752278B8ED1E91DAC67994F5ADC372E1D82F95CC390CD97AB9212275E0566C833FD8 -pk = 26C6A6EB7C3975D91BFC6F1958CAFB8C323AC01FA62675E7D0F5ACCBC514F5A53851F8869B4747747CE288A7531EC97E1EC481BE52175CC91434493709C5261DE8819759F8B1E10D0F2E3A08A1CBAB97790CD57C3D1BFEBEB47832A584C955249A75EA121800111AC674186C6E75F15CDB10C09D81EBA51F1691D8B7CA33458415D787235BEE9A5AB1D8718F1224DD47FD079B8E59DF02C756A1E05AA1258242D0E4499D6D7016538DE26D3A11F7465797BF2CDD27EC837AA924E5B6010379032BC56052B5802E15B31C00399FA216A6040AD49F37E5EBC4E96B27AC141400ED9515F90F2EE500C405FA20F173FA84367C14609251643B2E04EB2701F906A2254634B6B6D85D203633CF014BAA3F51450A1D570D0EC878BEBC5768D8328A61E2AF98ADC74FC5BB925B19D487606ACAAA7A4FE31471709E296C6B39ABCB409090C06D455E31475A4F74EB271E96FDDD644F67D6FC1AA4D99CC3CDA1542CD5AA6200B8920A65D9A97217E20F940B23BBDFE0CDBEDDA51CCB8EE205 -sk = 690EB71FD7052B906EAEC09937A8ED374E0B02AFA27C2F1481C38C2CB5CFAFAC81B96A810AB749B61806B6D54C9F8CF4BF1BE0192423280F26C6A6EB7C3975D91BFC6F1958CAFB8C323AC01FA62675E7D0F5ACCBC514F5A53851F8869B4747747CE288A7531EC97E1EC481BE52175CC91434493709C5261DE8819759F8B1E10D0F2E3A08A1CBAB97790CD57C3D1BFEBEB47832A584C955249A75EA121800111AC674186C6E75F15CDB10C09D81EBA51F1691D8B7CA33458415D787235BEE9A5AB1D8718F1224DD47FD079B8E59DF02C756A1E05AA1258242D0E4499D6D7016538DE26D3A11F7465797BF2CDD27EC837AA924E5B6010379032BC56052B5802E15B31C00399FA216A6040AD49F37E5EBC4E96B27AC141400ED9515F90F2EE500C405FA20F173FA84367C14609251643B2E04EB2701F906A2254634B6B6D85D203633CF014BAA3F51450A1D570D0EC878BEBC5768D8328A61E2AF98ADC74FC5BB925B19D487606ACAAA7A4FE31471709E296C6B39ABCB409090C06D455E31475A4F74EB271E96FDDD644F67D6FC1AA4D99CC3CDA1542CD5AA6200B8920A65D9A97217E20F940B23BBDFE0CDBEDDA51CCB8EE205 -ct = EF5A3056D782979E88000A82AF2F6EA2CBE309983017A9271990188E85AA70C32FE5DCFCD70BF681A36DBAD6F631E8010E725A8C9AB0C0AE3E623F9FCF162F776A1B79C77F0B1FA710054AD4E356B2C249524DEDAE9CDCF66CEC9C73A37000DF7F807E2A81BD39C2ACEE17D2755794800BC1745FE0F59718B995F10C060094909C536219C9C6CB0C569F5E68255FFFD165F29A93C1791D80F757021B9B4BEEB58171A77595E522B179AE5FA5DB8EC004F6FE1076518DD98FE841A99837ECEC81A68A7D1A2866E23A31ED3B9BE5267BE8130891A35FF7BA8C2CBDECA3B5F36DEDFB3A28B74FCD0A8C4C99C055FF7ACA83E01F104343046B7D878F3A2FD0379ABDFE72BFA5462674168708FACE1AC610D4AD54B626DA601CF0B4F35B10F3619C93D5C9D1C85BC5874D24E44A2E3BAC346B6CE0C67AE6AA66E30E650B9001282948F74FCE4179D16216ED1ADBFB96DD970B8DE151C1C588AB89A4BD0C7804B41C2BF32B836257C1AA612E04C6815D2517B1DA4EF127CB0DC0160032624F470CEBBAC097B636EAB343C4DBA74B94A0D22DCD7061 -ss = A14DB72B151FA84E5CB3EF9AC1EA2AD63B037B0C754CEE07 - -count = 93 -seed = 92877D706DAF88EF3412EB143DB8CD91BC047A9A43B7ACDAA42523560DEE4C172697BE4332042FCAB91135839BF74AB2 -pk = 47596EC8F229F268E877C36911ACC64EC804A5F4DD8477CCA059D1E159BD442D2446B33AAF56E873A871DB416315005DCCBAE45CF1A9E90470893D91BE7029B8E6DB57965B4E252C8EDA47E770FF72407E813F8A19A850A2B4E06E1E1149A68164FDA6B81C465F10E28CDC30AE5842CE27A3C2032596FB6FBBCF013B132F5037B8BD301379D60A8BBD610D964FDDE236C1F013DCCDEF1D583D1E593E3DE0B27B81BC21DCA0C51D007455338A57D7CBF3E1A822188CA0C4222C2373DA228EBD03F94064C9BB2374196B230B00D51813A6D3D8E55D11363B8C7A3BEA2D460057B7D67832238032D7ED868ADA9C5B4E81AC9563177B0A0DD82D0338FE0E115F2379ABDA40F1E06D118D57B7C545051DD04B47F14112CB4082EE3568B20E4FD1F5D4761FBE424284967989DE76F980275FD858DC803AD10D54409B581523322C3B91FCC33E22A61D4E36665BAA2B2ED42FEE3C878F7BD5E3465F9F2E2ABBF408FF09A998BFE15DEF386A4B838458AF7390C3BFCF947381112E104100 -sk = 32E0EA9089FA928482C0770DA545AF1BB871A03CE3860413C06C5BEF7B6508409DAF847A64C8D30D0974FD3BA7476DC76C46B458A036D80447596EC8F229F268E877C36911ACC64EC804A5F4DD8477CCA059D1E159BD442D2446B33AAF56E873A871DB416315005DCCBAE45CF1A9E90470893D91BE7029B8E6DB57965B4E252C8EDA47E770FF72407E813F8A19A850A2B4E06E1E1149A68164FDA6B81C465F10E28CDC30AE5842CE27A3C2032596FB6FBBCF013B132F5037B8BD301379D60A8BBD610D964FDDE236C1F013DCCDEF1D583D1E593E3DE0B27B81BC21DCA0C51D007455338A57D7CBF3E1A822188CA0C4222C2373DA228EBD03F94064C9BB2374196B230B00D51813A6D3D8E55D11363B8C7A3BEA2D460057B7D67832238032D7ED868ADA9C5B4E81AC9563177B0A0DD82D0338FE0E115F2379ABDA40F1E06D118D57B7C545051DD04B47F14112CB4082EE3568B20E4FD1F5D4761FBE424284967989DE76F980275FD858DC803AD10D54409B581523322C3B91FCC33E22A61D4E36665BAA2B2ED42FEE3C878F7BD5E3465F9F2E2ABBF408FF09A998BFE15DEF386A4B838458AF7390C3BFCF947381112E104100 -ct = C78340426813BE7C899EFB1EC325E07C38AA2149F9E1154DFE6A5F5018D543739D6BC9390AEE836D128EF051635EFCC311950BCD6512B8B3234A96AD1B1C2D15FA64AD1854C3ACCA42F30FC29211C39E95DD8AB832F8DFDCF681EDEEFC854D8C59528D4D6C7B568BB2E0BFBEFA7708CCC86A07555DE846C760F3E9E0D8075D90586AE32E4C8B3CD6265F8721E9622E968B410AC5E7236A54212453A28BA27D81B61572C4240630341BEF8D8F00B7AA81EE6512FECC17D77F9DDFF7360DBFEDC57F8142FFCC0E033E66AE857393AC3DD8B417B8DCA7DE559F2DC9BEB7A37414FDA3B5871C2A8D8D6E1D165BBE23434B73AD2030FCCBD2AEAFF40F4527B5B2E738D1C7B97DA2AF4C8715B2B1B00BCB6DB95FC526C445EA50CB4CF7A32983E684B72D5456D2F055B7C0B40A83BF66617AA57A198D20CE2D0915EFE623ADE1329E4AD3764D2A84AE2656CE810866E461CEDEBA46A47AA93930CF994D27AFFDF885D2A5467DE3EC25080D4CC85849C36765B0E54E74BF8EA8FDED6213AEA82BECC6DCEF6AD43A37991831A259D7FAABE1C85457D3 -ss = E36C98F835D5A87FD733DB9B9B18A47C13B892489ACF18B8 - -count = 94 -seed = BB4C0082CA4044B1FF60B036C9B0E0495D58667156786C530BC69D949A13BFAFF53798E456423D7A0E162A60039367D7 -pk = 8645941AC39A55345AF9F2755FD29802C1AFA0ACF9A8ED5B977299D6A20B5495D47D929019A0652BD250552DD60A2920506C4D79322E5A264B0133AA2DCD2406E4AD1ADCAEC4B25F03BB977749C8EC2FCB2942163B438D7638F593AE576FDFB4DDECD2637A2525387F94DEF7DF3ED08D6171D305A32180B6EFCECEC3FC1510D4F0A5E2E620F299482E9A10581AC3214B43CF57ECCD54803A0DC9371F104A42CFE07BC53FBB460C3E936A00487B1007DD27F2CFB4F6ACDF90066C687E0ABFB26FB7D03F2BF42B634596A1DF16FC5C9F4DE9E724A9EC7B702AEC40AC936DCD4EC287B1D4AAD564115F2A00EA2E2A8754572931896230F119DDC86FD73215A6523CB550D8B23D64F1A1BF1F1BDAC23733A591C8DAFDE26543926BBBE7329A2E21B34706226718427DC24FC3BA2C217A57BB7324DDCE5C1DE642920D246077265A018C6DE1D0824445A0D9413A0461C60A89DD72D697D7208509AD360BB655F9E5D52FA3DE8937BD9AFA810F8116FDB7E8358649FD5F3C7078A26224 -sk = 6FB2EC719F2A0DEA152BF3F64B9D148F8AB8BA88F64E61F54F797C007E4061F95C7D56CFC7EE5C49E849DDE3FEA8F25E7876DF2A18515C048645941AC39A55345AF9F2755FD29802C1AFA0ACF9A8ED5B977299D6A20B5495D47D929019A0652BD250552DD60A2920506C4D79322E5A264B0133AA2DCD2406E4AD1ADCAEC4B25F03BB977749C8EC2FCB2942163B438D7638F593AE576FDFB4DDECD2637A2525387F94DEF7DF3ED08D6171D305A32180B6EFCECEC3FC1510D4F0A5E2E620F299482E9A10581AC3214B43CF57ECCD54803A0DC9371F104A42CFE07BC53FBB460C3E936A00487B1007DD27F2CFB4F6ACDF90066C687E0ABFB26FB7D03F2BF42B634596A1DF16FC5C9F4DE9E724A9EC7B702AEC40AC936DCD4EC287B1D4AAD564115F2A00EA2E2A8754572931896230F119DDC86FD73215A6523CB550D8B23D64F1A1BF1F1BDAC23733A591C8DAFDE26543926BBBE7329A2E21B34706226718427DC24FC3BA2C217A57BB7324DDCE5C1DE642920D246077265A018C6DE1D0824445A0D9413A0461C60A89DD72D697D7208509AD360BB655F9E5D52FA3DE8937BD9AFA810F8116FDB7E8358649FD5F3C7078A26224 -ct = 35DED98A8846D0BF13E0E1B6DFBE6F7118BE573D6CEC1F0535469B5197AFDD194E67F0AE4E9DDB125E39647F4AA4D0FCA6D17072E25993BE8717EB6F2CE40A522E50BCE44DE3203F4969CF6347E127EF0AEA4E933E2B8473C244830F29E42E0DABEF4487824458A433A6123E1C89F1EA9C042DE59DC51880B43109AB93301166F7FECE1C71E4684AA649A1C151D03372C4609E60E97B978656BC7A46DA7E0A99C97EA1A068C2322229081F411BC7386332FC46135B8A86FB4257326014E863E6DDB8DB0D9CACFB6A294462468A87370393C6BABFC13B2BF1D49490DEDCD30A6275DE0865DD1131648CF90B3892059DD6308F9A3CB55366A9220CF313C738126CF353111D6F31711544113F2FE03FAAF50F35FFC8D659FC39C4E224C7CC96061B8918B05BEC6F1B1A1A58443E523B90C34A0C81B8432D3C18AC8C053A0BDAA8FE04256B2A6DCA07E22801CB697E89601ABC0A73E709DB116633AE93904E7E735B8F70D016BB29C29E5CE5AD5790D3C05E44D8CED98F791CD6DC1C1020FCD1CDE1EB6DB80C8EE33C47E3A0DBB49DD59CC256B4 -ss = ECD17431A46D090C552345203774607486E221ADA06125DC - -count = 95 -seed = 121D90E70AF6204445D0DEB28AC0C108262719E9FD3476ACA74BBFDE89FAF04D8D5F89A624E8A75DB80431F0D10AD28F -pk = 41C6DCD56CBA40CD98238A09982EB9AAA87238AEDE1D0B4F4297A93C7CC2E2308CC606D03B867D0B2BE1175A18795FEA0C064C58450E79C6705ECAFA746430254DC5FDAB5742C7FECE43B114EBA62376F744D7BCFCBF9A5C0EEE30E63AC4C407ACDA5E65BC9D29E26CC9EE5596210196E83335A148EEA7AC00A0BA482331FA7732E34AB0B9211FC8B640EB45861B45ADA7C561CD8C747E4CA6FA8246FC6F410A8FC1D4558ED912E5B7FE655FB151A5D942A15C868AE6E2FB10BCE30D283DE864EAD08FBBA1D83E1FEE680341EDAADAA047928E8FCFED06ACCAEA7777A46E938E353B329DDD01EF0885A18EDC15079273372180D1142171C4DFEABB2B7A2A1A2E38CDA3EDA2C7B2336B566FB83590464886787A94A9B93B3E6E84AD2D6851A7445604B745EFBE7179BCC954D15903E1C8828059908868D4062BC8394F35FB49ED7D34DC18D9F4D4789DCFA7C02A2B9A06624BE5A1527D7419CFC25B234882C971EE7B0269E40A1CC2A10CA4CBAF8AF339EF80CD0D68014CC51A09 -sk = 527FB88C8BD9A4D6031DAD15E63878ABD2B559E7E08D61F6E32D432B4F9F751BDE0496C580A181FFED762AA35454A02D3F1F47EE0394C80C41C6DCD56CBA40CD98238A09982EB9AAA87238AEDE1D0B4F4297A93C7CC2E2308CC606D03B867D0B2BE1175A18795FEA0C064C58450E79C6705ECAFA746430254DC5FDAB5742C7FECE43B114EBA62376F744D7BCFCBF9A5C0EEE30E63AC4C407ACDA5E65BC9D29E26CC9EE5596210196E83335A148EEA7AC00A0BA482331FA7732E34AB0B9211FC8B640EB45861B45ADA7C561CD8C747E4CA6FA8246FC6F410A8FC1D4558ED912E5B7FE655FB151A5D942A15C868AE6E2FB10BCE30D283DE864EAD08FBBA1D83E1FEE680341EDAADAA047928E8FCFED06ACCAEA7777A46E938E353B329DDD01EF0885A18EDC15079273372180D1142171C4DFEABB2B7A2A1A2E38CDA3EDA2C7B2336B566FB83590464886787A94A9B93B3E6E84AD2D6851A7445604B745EFBE7179BCC954D15903E1C8828059908868D4062BC8394F35FB49ED7D34DC18D9F4D4789DCFA7C02A2B9A06624BE5A1527D7419CFC25B234882C971EE7B0269E40A1CC2A10CA4CBAF8AF339EF80CD0D68014CC51A09 -ct = B5956BF403C0CB061B8D63A42E855EE5E6E63FE882520210B54C69803C619B22FB06738FFBE3CBB263E0503170A407212C58052F5DD73BF4694BA992BDA40DA8BB16025D0F86560B21B876B8805DF6C5C6296B84D01D866F17164103C0CDF3D601F867F99FE10081153126ED60A68F04D7CCDF5C87863A0F35DD1337C916E714DBA08AFA092843E3D15448B9A35FA62B026A7103820F9B641AEB0FB87AA227B26A1A8E8EE5A8DEBAC45BAD8A5E2E6042CB2451D19ECABE4D8FE1254020EFE25D9A1C2459352ACEE5EDA84E939C83FE19C7162DFFB17DA5C318C0624300C824693FE292523E1885948D168BA21ED2F2BAA77E3064EF776683F100A71E19C37475F66418EB5A8FC983DF5A4DE8B7FC638EF45AFEB3AC9FDF12924B657EFE9786569C1962BD4A551B42FEBD37D256A9A199AEEE86F75D0E7ADC41503EAFAACD919BBBB338CB03D6152EBD4389C18CE6EFF16901A12364DD31FD6B3856FD15F7FDC0FBF47BB6650F44549C04B0EEDDCA0A34EB386DA21EAD88E8A6012CCB381BD4435743FBA5982813B2F155E468E3259D4DF74D -ss = EB336F774D19B142F59AD745419C288CD4876C478F8D923F - -count = 96 -seed = B3AC6503206ACCC2A92CBC210D020A2654726911D11CE676AA04FEAA08AF1D20C654E4105883AE470EC3AB299075D420 -pk = F9A032B24B86F59D1D4C97C3DF83534D34D53F1E2DDE8BEAC479BD1E9D2056FE39497467F6F2B86B921C7E6A82350BDA85762E76A101E90A7C770BB4138E203FC75942726185355C99CB4B1A96C76650FA08DF3B1EBDABBBDD4565410188581F67387141C223D4FAE6351D406F6582D62756006577638F6F70828608DB1FED2AEE76FC2E685956DC163082ECCB94CDBFC88EC9BF4548871F26123307F88CC9A5B0420EC16DF2AEA2B13667CCA903EE30A57F318E0F8DEA3C484A36153B702CB8574D06FF407DBA003F334F8ED0B8188890B588EEE8CFC28C056F5779FE0D2F7CD0D1D0D8484C08CFE74EE94A616E8525B9D1521FB36D06639D74B433DE4188EA3E794660769DE0F1070B9431446EE67E4E53BDC57C6B4C9F5CAD13EDE1FCB8BB2A1ACB2DCA5A45FD07EF1D9D480A535688E66A92110F80A0E6C9024891C6D0E545673C50AF4AFE1524B66F68EB29942D1E9605B20494AB511C0A783FFBB6990508AEB107833926F7FBBE426F80CCD506B99D77B95102AAF6251F -sk = AC6FCFAEEEF795B6EF9E062F02BF42975FA01E7D91BA832F5AEDA108EA4D6C6BC0FB958286850422BC357CA67B83C986048E0D0087FA110CF9A032B24B86F59D1D4C97C3DF83534D34D53F1E2DDE8BEAC479BD1E9D2056FE39497467F6F2B86B921C7E6A82350BDA85762E76A101E90A7C770BB4138E203FC75942726185355C99CB4B1A96C76650FA08DF3B1EBDABBBDD4565410188581F67387141C223D4FAE6351D406F6582D62756006577638F6F70828608DB1FED2AEE76FC2E685956DC163082ECCB94CDBFC88EC9BF4548871F26123307F88CC9A5B0420EC16DF2AEA2B13667CCA903EE30A57F318E0F8DEA3C484A36153B702CB8574D06FF407DBA003F334F8ED0B8188890B588EEE8CFC28C056F5779FE0D2F7CD0D1D0D8484C08CFE74EE94A616E8525B9D1521FB36D06639D74B433DE4188EA3E794660769DE0F1070B9431446EE67E4E53BDC57C6B4C9F5CAD13EDE1FCB8BB2A1ACB2DCA5A45FD07EF1D9D480A535688E66A92110F80A0E6C9024891C6D0E545673C50AF4AFE1524B66F68EB29942D1E9605B20494AB511C0A783FFBB6990508AEB107833926F7FBBE426F80CCD506B99D77B95102AAF6251F -ct = 8BFECB25C08480BCF0730FF016172FAA797A596A06656C978C507997E40710ADF90B480B2FAE94AC46CFA2FA3397E0D3ED3DFF54359F13BDA99BEB7EB8C1091C6377EAEA45C3D77E583D4DD7BFA46F28717BFA78C5C95DD3501D8EB63D442430DE1C05F1AAAD24B58233AC2B34DC78D795984E9B9D5F7096207340F32B3C73696128ADC44595F989A4C2C39AE126DD6708560692092CDCF3C9BC77A8857419676791AD6DEB95BE84D409B4596180AB0F465FC15F69A83A621F41390E0A7D10B270BB6B9D53DA0D65A2558ADF52163DBE4DF75C4BF467CB3C2499368294145F4743990E68E98326185E5BF9F17F8E52EF7AC625E0E6F923D797011C3986902FE6E575C80E67B7350B6386CFD522C4EEF39C8BF9DAB606332BED408FA1173F899F522A782A8B696CD52BAAC5CA8A0344F98FBEE1B0688A0A799D400DBB2A353AD8D58F5734346D6961A4D4FDD3BF0C35C98E3FA5B9C1E948346D794CD1B73212DB1C88E4A9C5B06C7B3BE836BA7FFA16F292BD7124AB115FE47C3D918F64B9E902B5F1EDF6E6EC6C90615A8C926CFBC6015821 -ss = 9C09F9F457B9A961DDAD79027B92AB15257CDD6FEB7E91BB - -count = 97 -seed = 59EFF60B1EF6185DB34EE1E3B1DD2F159106CECEAA79BEB74923B4F5623D5BC52DBF5D2594A1F7C6C64D12CF144E9ED4 -pk = B28C95BB2C8D833C8CB18B44262DFA01A4E80466D4FB3FA071CBF1BE61F4C3E5D4C2E6C9F9C2E03B01395B177B3B17F520F64CE791483CA1AA78BAC4FB8031165D23AB7E3D7AEF1BDFEA0248E75B09AF06703800725C92499929116BE0DF70EAC1567FC6FA85656170E89F0663620EB17227ABBC8466139EA471D9458A3F3DD8BEEB9371C75DCB5C2EE835AECB50EBBA7052F2BF7FB58C87031C74EAA06FF2981B21885FE3A3C1DA38F486BD983E98A137BF6951A7992F0FEA6D8B48334E333490CF15F350F6D3BDC911F8C9663EC0FB30CDE95B8F42D1469DCA0A98927F9FB91F63BA6490B64145CEAAB0A5F71DAF65399947772DF123CC8D3E3E26CFCE8086EFE0E8B1A2ADA6D35AFD4B7F8CE0B4DFB986E9F0288D7D5657C47DA3F18C7832D89EA472943AC26FC2D2B9FF8770D96B70BC9E5DE5EF6C67775E30E64C51180855B0AD13133F0CBDE589DBB4122E71FE5342664F986E08DB314D3DAAB3868637848D875905324D3AC1637866550EC0EA87880D85362342CA4F03 -sk = BA2FB9318D4DBE7488057C33E95E6F054583A2800C41BB83E63F8FFDA3565C2424C89B20974B748A65A5ABA75133FCB3156DFB6626A83B0BB28C95BB2C8D833C8CB18B44262DFA01A4E80466D4FB3FA071CBF1BE61F4C3E5D4C2E6C9F9C2E03B01395B177B3B17F520F64CE791483CA1AA78BAC4FB8031165D23AB7E3D7AEF1BDFEA0248E75B09AF06703800725C92499929116BE0DF70EAC1567FC6FA85656170E89F0663620EB17227ABBC8466139EA471D9458A3F3DD8BEEB9371C75DCB5C2EE835AECB50EBBA7052F2BF7FB58C87031C74EAA06FF2981B21885FE3A3C1DA38F486BD983E98A137BF6951A7992F0FEA6D8B48334E333490CF15F350F6D3BDC911F8C9663EC0FB30CDE95B8F42D1469DCA0A98927F9FB91F63BA6490B64145CEAAB0A5F71DAF65399947772DF123CC8D3E3E26CFCE8086EFE0E8B1A2ADA6D35AFD4B7F8CE0B4DFB986E9F0288D7D5657C47DA3F18C7832D89EA472943AC26FC2D2B9FF8770D96B70BC9E5DE5EF6C67775E30E64C51180855B0AD13133F0CBDE589DBB4122E71FE5342664F986E08DB314D3DAAB3868637848D875905324D3AC1637866550EC0EA87880D85362342CA4F03 -ct = 1D355B433C42B27B5B46FC1D40B1B8439FCA38C18ACEAB23DA86FA9F33F154EAFF88A2B270D922630B3A28835AE6722FA08172ABBA60D61DB6CF3588AE8B0BC632E0F0A5EB0AEE43C2872EBB70B356D2C9962844BCD5B010253405F1E5AC6E9BF170C936344569E65A0C04EC2C992E0165D414C9484F781F28BE22A5EC21FD2C4F30C4E531BA3FC4B81BCD7DD93CA46BEF434FC0D04CD9DFA50394F343EA6A0BED874404AE3B0EFF4F4A66AFD548A3D31E05254586908BE12080FA533A13C0CE2B5D7756E2D78338913EEEB2A2DA35E8C9C0A4DD3F4D060DAD4BA7971171D12EEF9BEC8FA4C03BAE2BD5E1F829AEADAB640525F4C11E1B81AB8A5C003E25E5399F622DEDD6BA00451153AC42C15A38CA9E0F9A0B6B495AE28318951911D799A1DE8FF73370364BDBBC50929BF744062B9066D1713CC401C62E3340882556F096AC3F238069AC636548D9427B7688E211D4E51DB474EB726E3E02878B82C565E5B932B35A9AFBB7E4ACEFE3650A6C2BA1D1CD76B8216588EC5A24508323642EE2E92A996AE6C443F5D5E7E9D426B46C478E3A -ss = 3C988FB8F65F3CCF385CEDC792AFE350C019C819A697FC47 - -count = 98 -seed = DDDCA9DC31BEA737D3F474E7560B37FACB2F53C803E768FFAADE7669FF94B1D4FBD17068CFFD5DFDD24AADADA4EF6B12 -pk = FAE47FF12AD9BCD71917E48A3C8860DF4DC91E065C98D7823783244BF9345D602E13653FA41844307BF4528E88FDA69C3385C1F76BB7FC1AAE417923BF153D27145FE6B6C70240DBB6C8B01F5526E883AC30F07C99BCABF4C8B4F41C0178F34929583CCD0ACB8CCFD63126752FE9FB1EC25575ED8E92767C8FA5EF7C4F1D1A117DB9ABD1D85A1635F3EFB549BCBD4211FB451D97F880518A3130F45B6D3E2883871E2A8C5C357A5B8F2452AAA23B27B2774230F54164BA07C634C74C0930A84340F4DB33A27A81B80261AD1CA2A59A0245162E1CAAC2B227934B5DB5CB2E7FEC62BEECBD00A5D2A5C7DC2181B56979798AE0B60AFCF1D006B9BE1A0083E70171E6141BF2D0C4437428CFC3F9B3BED38DBFCA73EBCA52BB1325E177E97089DB31A4094FB33FF9EBF50ABFBB859B4208FD6540E17E869C248513741AB3F8BA290853804B383082769CBE70E14417F9372931B128D61B7C2202C5F9C3F1CA67FA960B079932EEB32AC9C8105E1E6E8F877D881193C7A0A450A4CE3F -sk = AA6DD1E5799CDF7AF9C4FC632B3EB9D51D66E85C8E0A21ECFDA268813EFAB5204EFA60F78BF81D320D01AC09AC06244F7AFBD2D80FD35609FAE47FF12AD9BCD71917E48A3C8860DF4DC91E065C98D7823783244BF9345D602E13653FA41844307BF4528E88FDA69C3385C1F76BB7FC1AAE417923BF153D27145FE6B6C70240DBB6C8B01F5526E883AC30F07C99BCABF4C8B4F41C0178F34929583CCD0ACB8CCFD63126752FE9FB1EC25575ED8E92767C8FA5EF7C4F1D1A117DB9ABD1D85A1635F3EFB549BCBD4211FB451D97F880518A3130F45B6D3E2883871E2A8C5C357A5B8F2452AAA23B27B2774230F54164BA07C634C74C0930A84340F4DB33A27A81B80261AD1CA2A59A0245162E1CAAC2B227934B5DB5CB2E7FEC62BEECBD00A5D2A5C7DC2181B56979798AE0B60AFCF1D006B9BE1A0083E70171E6141BF2D0C4437428CFC3F9B3BED38DBFCA73EBCA52BB1325E177E97089DB31A4094FB33FF9EBF50ABFBB859B4208FD6540E17E869C248513741AB3F8BA290853804B383082769CBE70E14417F9372931B128D61B7C2202C5F9C3F1CA67FA960B079932EEB32AC9C8105E1E6E8F877D881193C7A0A450A4CE3F -ct = C5622F143F95401048DC7E4EBD7AF9C8E2737F8BE2CC92B151D4FB02F348AA7D5055806E879AD7D9107BACB10533264718554A7CDE3281CCFBBE238F9E2702944E3081F48F9676EEDD488D549ADC9925859BE06C7FF13FFDEE99EB756E93E959D4B5FEA0DD5B4ADA2792B7D66BDD390EA9FF52B8BAC68C3B7372A1EA871BD2C82693743BE7E39FA6C17439ABB897E81AC4A6149853D43BE5E3D539EAFE25116CDDC000F8ADC8330667EA1EC6F6F069DF20D05248A7031CD51213EC252ECB02EFE65A22FCBE24B8CDF9D5A151F28EFB6333396590120AE85B1A3289A088EFD8DF3FA20D20DF55EDE7500D26710B1CFCAB720179126C748D2C060C023FA107E4F189B55205496BCC179D0A55BC3E0EA0DF298B5BC2E974D3FC50E8B3F537A569AC369F62D42B0BCD444D617E987833513401308A86C0D9466EA47115778C34CD9BB9E3FD00FB43B0729A6163F4B1D1B6A7F521B4CB7CE7EE2C698204742FADDEA424F95AB606B00C03E30929E4CCF4920BB0F8FE960930A177CA1E8AC9B2FC661FC19AD7F5F7102DE35751E0939A88EB1A4A34 -ss = 1CB460A2C31B62A729B4D0E781498CE4C4C8B6819CFD3F3A - -count = 99 -seed = 2A6F7386B815366F572AEB6C79E272CC21B7095FE09575F18072C9D677DA23BC9C8A4BC393B7524604D299BEDD260C8B -pk = D10B725FA678E2B06C026AF41AB8728C777C643D959AFF59DD51698CF563D171F3187C6BFCCCF8764CCEBAA6508B0EE619912EEE8C5D3061FB67B383D5DF2B9A40B7023A5D1459757EFEB3638A6834DB338AB82D3B6BFDDD498770ACFBF9CEE3ED01D6990A80A2275D19095C08E456AF201E3EBE266AC5120E7A32CEC4323F43A9E29A442EE3E29E80658F20CDBB733E80940A88EC9C07843AC7E99EFC9DD27DB34E21A5F641AC94B2B95F7CC846CEE3B3ED74D041805381E65D9F1229F11A3EBCD2B3F04C5FC6E7FA87B933138EBE473E47C6B05B829596133F42ED4BF315164B31C524B82532EB0B84E547C5649DC542B017F43460C78F10834737054AA600E6419397DD0F0D594221BB64A429E82786667B17EFA10AFA58FF5DE963D825FFD6F93A5FC9E4741C91BA79FB5C4AF49E90431E0262BD6D334E4039C67F47496690906736D3ED3138DFA9A3817BF8886F64BFB686BDB1FFD20639525CA9BBC2DD5F57D494E20A88591BB7DBE887AB1E89BCA517BE5572DC9F3F40 -sk = 195D6C86A3DF4C21E3007D7F2768B43C74CB3060E0ECA77FAE77E0F9F21EABD8C0C6EEA7767F4E10FDE5C2D79B8400BF96B19014B457EC01D10B725FA678E2B06C026AF41AB8728C777C643D959AFF59DD51698CF563D171F3187C6BFCCCF8764CCEBAA6508B0EE619912EEE8C5D3061FB67B383D5DF2B9A40B7023A5D1459757EFEB3638A6834DB338AB82D3B6BFDDD498770ACFBF9CEE3ED01D6990A80A2275D19095C08E456AF201E3EBE266AC5120E7A32CEC4323F43A9E29A442EE3E29E80658F20CDBB733E80940A88EC9C07843AC7E99EFC9DD27DB34E21A5F641AC94B2B95F7CC846CEE3B3ED74D041805381E65D9F1229F11A3EBCD2B3F04C5FC6E7FA87B933138EBE473E47C6B05B829596133F42ED4BF315164B31C524B82532EB0B84E547C5649DC542B017F43460C78F10834737054AA600E6419397DD0F0D594221BB64A429E82786667B17EFA10AFA58FF5DE963D825FFD6F93A5FC9E4741C91BA79FB5C4AF49E90431E0262BD6D334E4039C67F47496690906736D3ED3138DFA9A3817BF8886F64BFB686BDB1FFD20639525CA9BBC2DD5F57D494E20A88591BB7DBE887AB1E89BCA517BE5572DC9F3F40 -ct = F80525D9BE49304D5C07F0B9A916080CEC3CF99215327586451511E8FB978C5CAF64CDA28AB3A1A1D5A09BFCB9E67CC2D3131E9072EA717A99CA4E461B1C310EA1F1D92E1C40E0E8B0C907C8556CF1D840B41F4A6D95942DEDAF033AC2F8A7337654638E81BC0169856578DC858299D86876676411F613F53E1B4D4E1E31E7C6F9050966BC9FBABD40E92C76E5B1EE0DAF99C92B7B8F5265D371B237213317D4503C1064325C3B487E2A26BE76A4C51C8B3865A567947AEFB433A2FB39AE3D33D8402ADFC9CE470E6CE120BBD73232EFC6905BE5F665A56AE2C66C1FB596ABB4814D2C7E9469E3D7310295274355AA2A0A7B6217A55946B67DD8C2074368A4B00ABB0347F60129A4DD57CBD64CC7B6B6D8CBE6F02BA1E7618632F9BFDEDF4EA198DE61A6AF1E1450CD138FEBC0B392E0A267B8028C2F150AE5DF389A9041CE66D0E6CA81703F7176E357E558903EA0F2AF1E6C50A69CC46A5A2B8C2F90DDDD28B56450595BEE431CCE00D2504CA556C5C2281C20E54701C85E1D61A7B827E13D7172E3D6AF50711D70F62ADB258EE986B198 -ss = A047B7E873C8EA4ECE4B143C3E0896E9E9C7863511508292 - diff --git a/dh/sidh/testdata/PQCkemKAT_644.rsp b/dh/sidh/testdata/PQCkemKAT_644.rsp deleted file mode 100644 index 72260b33..00000000 --- a/dh/sidh/testdata/PQCkemKAT_644.rsp +++ /dev/null @@ -1,702 +0,0 @@ -# SIKEp751 - -count = 0 -seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 -pk = E1A758EC0D418BFE86D8077B5BB169133C06C1F2A067D8B202D9D058FFC51F63FD26155A6577C74BA7F1A27E7BA51982517B923615DEB00BE408920A07831DF5978CFDDD0BF690A264353A4A16B666F90586D7F89A193CE09375D389C1379A7A528581C3ACB002CD2DC4F0FD672568FF9050BA8365C7FEFC5E6ED089B921DE6804091A0744DE3EB14D426A3F7DA215C50312617C1C2697243980D06056F2CCE88AE7AE73C7343C0B7104C9F2870A94FED744CF6E94630514B6CEAB0E64733BB6FA67B931E5D8206010475CBE8BC587248D65D89D8CD9C8BBFA93E8B5F9EB9130773DED665D52ABBD91C4C8C255F73C0FC82501AE33330E9F308DE7177CBF83E4E26E334D7CB09019E638147FC58ED372AF660F14C194BC80E9666325C98E0F80877271D4A6BF514F603703D8A697874CD50A34D92F5AAEA84633CCF96801BD517BF425DEE4A32AAF06684052473EA14643C3D535440FB2240A988D09F297C5A388CB3DE60ED943F124034B90EFF611221F80F78EC124956338A105F6636B063D7E48BFBD5D614310FB97D86F122E4AE6F9DDF4977A93ED7D0CE2A94E346A1A03D3219CF21907B85A5BCDC713F93A4406A22E03B1655A66E1F6741A2F953E6FE0868B2614BABEF1943BBBCB1B66D3E7017E533EA84F291240B56AB33EF1DC3F3DE99DBF9E8BE51A0076E462BCDD825EA96D7F63C99177C305C257B31461F4C23D43115F0220409E8880BBB2468586D03461E807BE824B693874911B2B52AF06FDBDC47F5A0159729641A7C950AB9E03F2DC045135 -sk = 7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148032DCD739936737F2D8626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB8FAB0A7289852106E40538D3575C500201E1A758EC0D418BFE86D8077B5BB169133C06C1F2A067D8B202D9D058FFC51F63FD26155A6577C74BA7F1A27E7BA51982517B923615DEB00BE408920A07831DF5978CFDDD0BF690A264353A4A16B666F90586D7F89A193CE09375D389C1379A7A528581C3ACB002CD2DC4F0FD672568FF9050BA8365C7FEFC5E6ED089B921DE6804091A0744DE3EB14D426A3F7DA215C50312617C1C2697243980D06056F2CCE88AE7AE73C7343C0B7104C9F2870A94FED744CF6E94630514B6CEAB0E64733BB6FA67B931E5D8206010475CBE8BC587248D65D89D8CD9C8BBFA93E8B5F9EB9130773DED665D52ABBD91C4C8C255F73C0FC82501AE33330E9F308DE7177CBF83E4E26E334D7CB09019E638147FC58ED372AF660F14C194BC80E9666325C98E0F80877271D4A6BF514F603703D8A697874CD50A34D92F5AAEA84633CCF96801BD517BF425DEE4A32AAF06684052473EA14643C3D535440FB2240A988D09F297C5A388CB3DE60ED943F124034B90EFF611221F80F78EC124956338A105F6636B063D7E48BFBD5D614310FB97D86F122E4AE6F9DDF4977A93ED7D0CE2A94E346A1A03D3219CF21907B85A5BCDC713F93A4406A22E03B1655A66E1F6741A2F953E6FE0868B2614BABEF1943BBBCB1B66D3E7017E533EA84F291240B56AB33EF1DC3F3DE99DBF9E8BE51A0076E462BCDD825EA96D7F63C99177C305C257B31461F4C23D43115F0220409E8880BBB2468586D03461E807BE824B693874911B2B52AF06FDBDC47F5A0159729641A7C950AB9E03F2DC045135 -ct = 66D24BC4630B2EE312F01B26EC1D3EC1F583795EC93B90FD9B5453E0BEDA2A70FB6181C9B9EA86A9866F1468E62CE853C6C65AA5D0E4535828B3A97E2D1D31DC4372E6A36DA7B0C4733574B91CCE215086C59B54F2364F61298004C8410B17658B4021CD36859C94210DE338869CACF0E2DC11412FA5172E1663AAEBEF4B5EB0ED9175D6C86C5107DA92B8772342A2F44C93EFFE61F6C76AB8ABA194E862543EDB707E9D2EE884995B1062FE2F60627D5C7673C7AC0D15B08C2F8510DC239463B1B32AD46873F6D1CB5A8579457386FD75700989BEED2CA547FE505C581B6B436AABC0F75AD6373A08CEC1504258A972C64EC4A1FEB86BFE32ACF3A73ECF815CBC883F39B42C6429A5875BD0BD6A94CEAD587AF49AC8EFB43E1A447D2D8555CB0ADFBC9F335F1C599BC9FEAB3E4FE5F2D06D930A58C2FFEEDE0E2726EBD85EC890D1CB0E6870DD784AE30286F1A336D57FC41D2F2E2F89765C6A110853BB63E478A64D54A31A18FB4BA44FF58A3662F4D82D544BD9B0E94FC88ABC4E4D27D5F6084B5F2162B357A04A1A28C8938834ECC987E50C0A2CACA442850493CE16C047DF677097D3F7EA034BC3D2535504276003DBBEB12F1949C3D369E7EFBA09831E83D622AB2D9277F523946FBAB1DDE14015857EA47663C5CCF30BDF261CCBF31DBE2A560E96CE87FBA80B783350A42C837EB36B2F39A9FED1B649B8ECCE3D3235825F7C800834740546E0CF42C9C2C8B12495225F991B14547E5EEDB22858B26EE6E0AE13DBE3D50C6C1EF79C4B97DAD1B0239C4037C1AAC29EE1505E0E527EC81348900E7C216A1A1B34B8D2753AF2693647C412 -ss = FEE94595E8A05C50113C044D4D8558DA101035EBBF604AA41D0AAA75B8A7F786 - -count = 1 -seed = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC81ADDE6AEEB4A5A875C3BFCADFA958F -pk = EBE0D12301E2BA26D6666163DD18BA35392D8F9A4BC87B938A29C3DE7E309FDAF243191766729BDF54CE21C2A0939B61B4E456F2A2CA440F7B0618302EE6895B3C154DBC94FCC6BC2A11B11A67481718CF6CDCA734E40E80E41F2322DA4DE1C73F6EF21410B36975A44CF62325CF7F47117D10F3923B8C6DAFA48CE7B7913D8A31F3F881D2CE867AC0684760CBAF822B969690EE28914D466B1B171DDD41299E1C6E8ABFA7843136D05FC86E64D7FD996A8469164093AF569C6B582E67962FA687AFA2B1A0B506834159469C6DAC216C0970D255D0CE9A729A2107A66383107BC0C11CBC21764CDB48BEDC9903C7B194DA03743940904D6EEF6A8D7065A0E1C907E62EB5B5E7E4138ED239F3B6654F092F14069311A49DD7FD586E499AC7D23C2F5B84B805E0CCC4247F8FBA8DB2F09F1E95EB6E02758E5A9C5DF6FEA7BF0338E7B0AC40139405168BCC4FF5965FE78B3F7C58076ADB7EEA556B18DF2317153C88F7B1BE544373571F78E3FA7737F6E96BF68737A7D095503F5E374D03B5A03F9468AA71D604549CEAC13C7395D09430B82CE860D9B8117F5AFB52823B0272000A1E28AD78358A2415FC9A996092CDE52192145F89E6D3F5017F396A01CC4CB6402CBB46DE99D870C5CF1A4E4D7720A7CA3BE066C60144BC90E937DEE815230943E3B6CC3D5E4B0A2B4136B9B34BF73F38A704D4B986D14D901E72C94B256D9CCEB468A043822465D263F8581713D27966D7D5611615983EDDE4FAED6A4F1B1AE8385808405C78394E8DCAEC922B7E504C82575B -sk = D60B93492A1D8C1C7BA6FC0B733137F3406CEE8110A93F170E7A78658AF326D9003271531CF27285B8721ED5CB46853043B346A66CBA6CF765F1B0EAA40BF6723F327918FF97790AF87AD7C2F6030303EBE0D12301E2BA26D6666163DD18BA35392D8F9A4BC87B938A29C3DE7E309FDAF243191766729BDF54CE21C2A0939B61B4E456F2A2CA440F7B0618302EE6895B3C154DBC94FCC6BC2A11B11A67481718CF6CDCA734E40E80E41F2322DA4DE1C73F6EF21410B36975A44CF62325CF7F47117D10F3923B8C6DAFA48CE7B7913D8A31F3F881D2CE867AC0684760CBAF822B969690EE28914D466B1B171DDD41299E1C6E8ABFA7843136D05FC86E64D7FD996A8469164093AF569C6B582E67962FA687AFA2B1A0B506834159469C6DAC216C0970D255D0CE9A729A2107A66383107BC0C11CBC21764CDB48BEDC9903C7B194DA03743940904D6EEF6A8D7065A0E1C907E62EB5B5E7E4138ED239F3B6654F092F14069311A49DD7FD586E499AC7D23C2F5B84B805E0CCC4247F8FBA8DB2F09F1E95EB6E02758E5A9C5DF6FEA7BF0338E7B0AC40139405168BCC4FF5965FE78B3F7C58076ADB7EEA556B18DF2317153C88F7B1BE544373571F78E3FA7737F6E96BF68737A7D095503F5E374D03B5A03F9468AA71D604549CEAC13C7395D09430B82CE860D9B8117F5AFB52823B0272000A1E28AD78358A2415FC9A996092CDE52192145F89E6D3F5017F396A01CC4CB6402CBB46DE99D870C5CF1A4E4D7720A7CA3BE066C60144BC90E937DEE815230943E3B6CC3D5E4B0A2B4136B9B34BF73F38A704D4B986D14D901E72C94B256D9CCEB468A043822465D263F8581713D27966D7D5611615983EDDE4FAED6A4F1B1AE8385808405C78394E8DCAEC922B7E504C82575B -ct = D11E9753B285F87AA07FD7DFC2A2E84DAFBEC696CFD6F2FDE49FF050A44D4C8D1DE068730A503FD2BE7F6A9F7C341D7DCC8DB48DA208160354DFE8B08EE7175653D18A4223D6536BB18310950D3F525F034406A535497AC1E0131A791B5664948074047E08D4A64EC7D37060381DBC69C082599ACC3AE9E8CBC346D295FC894CC99E374FA35E5E293FB5194B078B61763E010F351296146E765CB5AABC73E995AE69FD575DA15619FC5FCA18D514C4A3ACAD4C49D6892E293EE7823964D06664A823BD43B33E424D1D57F0602BED56747B199651D3298923D4A4328EDA7D1B90E5310DF3D73888C365D8B9365CF56B3192D9348368D99D390288A4EB51B8E43F1776802BEA13FCE1C9F854CFCE0D755122BC05D18C5C4EDCD530870AE8C0BC4CA56937F3FEBD8607C5643CB893DCD12C6F204B5B5BE63157F7CFB73C8AE81A9551C097E0C78C32DECD34506652C5306571A68DF960B37BD40E15983B005F9DF5BD379FC85C1E4B66264CAE1143F4698F08131E113B32C604091436B68611E412DBC96972325A94E77E62AA4AFE04147AF13202BC45CC2BC5C396A5FDC8A0CD8B8C0D0991CEA1F3862FFE402857D3DC951AE5D7004357CFE8FACC4E45CC111803FCD78458B5CDEE24382D6D88E4E18D8CEA4EB515904342CC059795A9714FBAB03AC389BC39179C0AB5B6D0D2ED4006F94AC5EEC70CB92F02C38D22CAABB1C5415ADB6AF5BDBEC9DE8F22BA500025D5B06BB09A1F347E3C0956EAFD17FF4FD204ED4A4B4420F03D5B295242DA14B30A81BB9FE4562AB171769D621453DF8EEF703E13792303AB9728FFE8E592FDD9D4485812449A -ss = A8F68D31099FD86235B5A72D9DB689F25AE6FD1EDF0765744F83A6A6577EC0BC - -count = 2 -seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 -pk = F84DCAE8F838C1F89B17F6C5E159E7AC16C87B99154EC9D00EA0F1E99BDFB70C7A82E2C7262907C70D3E6003460902618494AD5C19690F26758A800C41095430EF2AA4B1D677A4D9DEF977412349F9DDB745CD75268C9E5929FB669F6B6E710B4B03F57C2DD2E9DF2ECAAC84C59A6D99B13DB3BDB9AFB138783E21D443A5700FB1FECB24DDCEAF55B7E12EF2C68A992B7308A09360EB924A6F1C82FD39FADA40972776941FC9FE0262661D547713E96926203BD8FFC822E742A8303EE377A08716EC15840BA178DECB4CE11AF6A06D302F60F003F61E5BC2E4204F9A88A0EA17C765B38CA497D11FECDFD56E83BAC72D1A34998D055393AC0B98333E385F7AC2E84334B370A5A18D52A054F018B33D5B61999AF114B0C3D1F1623C4EB6027784927839D1985BE4F4E54E09E63BD4BDC088B41C0E9D0227FE669D5827F643CDCE7831DC1567BC78AC056E0F7B5A1F6A5D9F54BF2F2CB88D091EF9F5DBAE3EA4473C4891FC76D85F7B04E777AC222BF1F382E0D2825EF19C33FF25D430610381A0A0013B338972E9448C95FC820F87CDFA77DDAC7F8284FAF7D21641BF26D6000FFC7D4D5F1B9596F209B8DE93EC9DEF1360455D1AD235D3B60D8B3EFD9D6E621E775C594D65D58AF65E9DA578B2F414D5CB47F5B8932BE8497543FBECB12D93DF4AA7C46DA0BD0FBDA4CBF542D69D204908DCCBFFDEDD92753B09411062089A035E59C3280A72DBA84D0C2407B59A18E5A75D29F2130A26607D45D1230AD7CCD496B8FFAB71F1A990EE575FD5546D47190CA3C91C -sk = 4B622DE1350119C45A9F2E2EF3DC5DF50A759D138CDFBD64C81CC7CC2F513345E82FCC97CA60CCB27BF6938C975658AEB8B4D37CFFBDE25D97E561F36C219ADEF716FB6E3CCBFD9ACEED34DB628D4201F84DCAE8F838C1F89B17F6C5E159E7AC16C87B99154EC9D00EA0F1E99BDFB70C7A82E2C7262907C70D3E6003460902618494AD5C19690F26758A800C41095430EF2AA4B1D677A4D9DEF977412349F9DDB745CD75268C9E5929FB669F6B6E710B4B03F57C2DD2E9DF2ECAAC84C59A6D99B13DB3BDB9AFB138783E21D443A5700FB1FECB24DDCEAF55B7E12EF2C68A992B7308A09360EB924A6F1C82FD39FADA40972776941FC9FE0262661D547713E96926203BD8FFC822E742A8303EE377A08716EC15840BA178DECB4CE11AF6A06D302F60F003F61E5BC2E4204F9A88A0EA17C765B38CA497D11FECDFD56E83BAC72D1A34998D055393AC0B98333E385F7AC2E84334B370A5A18D52A054F018B33D5B61999AF114B0C3D1F1623C4EB6027784927839D1985BE4F4E54E09E63BD4BDC088B41C0E9D0227FE669D5827F643CDCE7831DC1567BC78AC056E0F7B5A1F6A5D9F54BF2F2CB88D091EF9F5DBAE3EA4473C4891FC76D85F7B04E777AC222BF1F382E0D2825EF19C33FF25D430610381A0A0013B338972E9448C95FC820F87CDFA77DDAC7F8284FAF7D21641BF26D6000FFC7D4D5F1B9596F209B8DE93EC9DEF1360455D1AD235D3B60D8B3EFD9D6E621E775C594D65D58AF65E9DA578B2F414D5CB47F5B8932BE8497543FBECB12D93DF4AA7C46DA0BD0FBDA4CBF542D69D204908DCCBFFDEDD92753B09411062089A035E59C3280A72DBA84D0C2407B59A18E5A75D29F2130A26607D45D1230AD7CCD496B8FFAB71F1A990EE575FD5546D47190CA3C91C -ct = 88F864EEBAE3CBE45A01CC8CC048257DFAC43870F232A5FC936B89C63A78A9B73BC94EEA62AB2C7AADBF1BB3C6ED5F8108E2E12D97F647A7FE7099C871379841E5556F42110BC32FC47C2DB873DE84EA122BACC143AA3EEC11C420F7136B326B0299D844D92529AAD19EB18A10D5B4BBCEEF4A822EF10A481364803CA4C69AA2C367EC74308B1AE5CF3B10CF7CC3A8C8AACBBC04031E0B7C8B11BE6E51A920C844A5770ECB880996DE82C785CF2C1DECBF6DFA763667E36FEB5929640DD7E8806C50D40EB59ACCC3236A7C318F439CB39F5475E0B8C8E2F4FC90C4B05DF18D4E22CC05DCE90FC0E541746AB23EA6E8154F86DC9F485F09CF62F9ACE3DA1F6A040D6DF926B30655CAF39EA18623D588E7BFC7CAEF25A9F14BF53EE2D8F2C4E1FCA86AD72BCACED8D2A8882C6CC06DE92C1C2241303EE4F541B04352004E356A84686F1BF253181BADE8BA18918B295E38421B0378E16751449C0EFFCEDF2D45EB24C8E275F0A1CB748F1650B296BD44F7D9FD261D76C99604EFCFF44DB82FE0BC2A9AF2EFEF204EA640FB87292B021E76583981C7184B0A94C9EEA7E0B117A867B44BF79274FB0CC7C8803FE68086D5DD4F1C318B75623B0236E45865CBA333D8AD2849C5951A5B603639852251FDCB5E5C8D29B1B808E8C0C9E204CB07EF653495096AC9236E2D03D8790317BEDB758398F6230D565A0AA01233AE536114F3E2250BB249CAFC9EDC5853E0572CEDA39E73945F03BB2A3D892B628A10D93D2CBC71D4254B4980C03223545B831E570AF80BD82D198FF48DC18382E926B08219331CFCB33A288B893EC04AF4663B8181445E8B3281 -ss = 52FBD8CC39FC5F77D544B9613452B8361BFF5EA79268331B02FF7F0EE145F54F - -count = 3 -seed = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1A -pk = C4AEEB71BD70491C6FC99899FB0C4B9CA202B016C985DC6BE0543AA6D72492E902F2C222F7EB1F746DAB053F2FA629212E72A7FFD15D7F1B22587698710246B7BE21D2639C9728D06076FC6A4D3F08ED65751C51ED9E05EB10AC2722FF27065407003BE6B5FD61CEF70B31BD68E642672A1EB3D53DAA159DDA75D6CF856EE5D299B4C4C6F73AB6B207230E4347DC44CE6FDF851DC679CF2E8CE2CB028B5B052342FFEBEB1F30471C748075235DC0E278ACFEB1360A550819735E0248C7C8898B49AF819A60C4C35275863D5D8A0A18AA123FBD307C59A3595746D17438D08F59802B87C5CC2BB97CAE6744DE325F8913E1A23E67976B7DA61081FCD47DE6D33795A5BE1751004572FA23FE2139B35C37B7D409598CB96DE006266868C7853B05A79DC5CCCDE29873B147A8C242A6364B96ECCD84E1532DEFA347A1CCDCB0C015841858FD78A9248A7905F04428017BCACE9C37908B210C89D70761ED87578DD4B72E56C11AADA4F211E7CECE074118EE8D494EC09B369D388370E67E68A2FE50D16AF776602A006BED79088568B4EF04DD9FEE5853C7CE02348D24A7559F67008A6407BE7564205A4D405F231DA4D7F8470ABDC9B5F687168EA45A748DD8E1A3302C07197C8474C1FEC7E79BF7AAA21B1A34B349C13531E7768F57591D9F9946AF77A4C7852CC3573BE7BA698FF8915F126353EFAEA767B8F9B96088F68A2B88F1D84B4BE4BF34D570B84A8385DDF2D1E5806F186BF345815417CDCD3F6F2FF518E261EC8577B9EE02525F6D91FFF81E49B8E32E -sk = 050D58F9F757EDC1E8180E3808B806F5BBB3586DB3470B069826D1BB9A4EFC2CDE950541FD53A8A47AAA8CDFE80D928262A5EF7F8129EC3EF92F78D7CC32EF60FCA764BCC227C19F847822FD8FDF3603C4AEEB71BD70491C6FC99899FB0C4B9CA202B016C985DC6BE0543AA6D72492E902F2C222F7EB1F746DAB053F2FA629212E72A7FFD15D7F1B22587698710246B7BE21D2639C9728D06076FC6A4D3F08ED65751C51ED9E05EB10AC2722FF27065407003BE6B5FD61CEF70B31BD68E642672A1EB3D53DAA159DDA75D6CF856EE5D299B4C4C6F73AB6B207230E4347DC44CE6FDF851DC679CF2E8CE2CB028B5B052342FFEBEB1F30471C748075235DC0E278ACFEB1360A550819735E0248C7C8898B49AF819A60C4C35275863D5D8A0A18AA123FBD307C59A3595746D17438D08F59802B87C5CC2BB97CAE6744DE325F8913E1A23E67976B7DA61081FCD47DE6D33795A5BE1751004572FA23FE2139B35C37B7D409598CB96DE006266868C7853B05A79DC5CCCDE29873B147A8C242A6364B96ECCD84E1532DEFA347A1CCDCB0C015841858FD78A9248A7905F04428017BCACE9C37908B210C89D70761ED87578DD4B72E56C11AADA4F211E7CECE074118EE8D494EC09B369D388370E67E68A2FE50D16AF776602A006BED79088568B4EF04DD9FEE5853C7CE02348D24A7559F67008A6407BE7564205A4D405F231DA4D7F8470ABDC9B5F687168EA45A748DD8E1A3302C07197C8474C1FEC7E79BF7AAA21B1A34B349C13531E7768F57591D9F9946AF77A4C7852CC3573BE7BA698FF8915F126353EFAEA767B8F9B96088F68A2B88F1D84B4BE4BF34D570B84A8385DDF2D1E5806F186BF345815417CDCD3F6F2FF518E261EC8577B9EE02525F6D91FFF81E49B8E32E -ct = AC7AFED8D2BE5EAB4E7B5633FB14658ADECC8AE41A84266051E3CFF903E976A3C9D23BE318F885BEFDBA1C41A32D0DF059D9CED6139A1D39452A5601F359A71E2F69CB0CA2AD2E3BA48F77E65E2EFF98A47E2525F4B98A232F076A99BF2A4A86C51EFFA3AA036784CAA79D170481B437781D5169DA7579207CBA22CBA467F6C717FE4FADE74EAACEB0404B18DD410A49ECCEDF1187A9E37917B199A86C7DD9479D969F5BA07DAD4AED185DEED28689EA464B0B61DEA2DAD807F1056088E2A294D603D209B6DFC48ACFAD3DB08ED047D7BE8751AEC02674E0A170AFB7BBA4B7623C1F526C347A994E2ABDBF990AC4A1A93516208577353BFB27DCE8C72A1A7D5DE92FE1D3720C3AB4DBC1E4FF67128989F937A7C639A9B46E884F72C175A3CA3E052E1E7EA9D41A74450C0211C4032A41AC92594F2BBD4C30274A0CF0FF1535DAB024ECEB3118B695EB2ED71A7C00CF89A3471DB9757680B0946D6D1959064EDEC78E1C95D8265791F876183B27CD906CC228593EB250745436FBF49ADB1460B6D54F596B00F942856792C1E0A867601EE288068132D3DA8D4E9C980FB3E4594EB7E22C3717A97364DE6612F68464E9CF85AABFE50BFE2A20910C624A10CF3E6E45377CB91780E9B6C00B1B6326E9BA5B3C6E0098CB03B946711E814854EB78792DBA97EFD0C7EBA16D345422FC5A2E2C6D4C3F41C138CFF3360FA45348BA7A955E80A2F2338F2A9EF8489FDB45EE5E50C6F9807C0B2DB80BEB37B719FCD1212C8AF9A798BF6A34DEE56FAF929F6720F95E68581F5FDE76F5E4004ED19B000F8DE5E8C97996223D5B9380E60A5167433B77C125F8 -ss = 4067DF0B490370B1EBA7995594556B209958D1F6B187DAE48362DB8A89E51594 - -count = 4 -seed = EDC76E7C1523E3862552133FEA4D2AB05C69FB54A9354F0846456A2A407E071DF4650EC0E0A5666A52CD09462DBC51F9 -pk = B3C4CAECBC77D2070650975568F5463E1E9896130023B9E16585BFE32A1A38E7096C3E09942AFD4BC9DEB0C2B80C48203C7D701EC8ECF6C4587FE3E5EF10A73650F737D116A13B8FAA92784BA9182E92EA3D1DB03C075AE40365F07C8903AF2FA5C906AC8D8876374AA9FAFE20D5A417B13CC65F60685C0BFD75BA1820737CEE71DF1F247ACE4F54327BC99622DCA7E0D0A668E1339F4AA8B38275946EDC8D7F11181EA3CDB8A508A60AACCF34C623C6548063E93A96F02E59EB321FB0B7C37C56B1065281F5B48990FFA2F2D8A48E4D506C5B18D8B4C6752D9508F4619035D57D65AE996965C58D2C5CAE0981799E498817576E2282B4D62B1B0A6048D61FDC7F91C2CBE331CBF08C1CCF0F87568E77937160CC3F44C533F40589EA78F8E1A8FEFD870DF8D062963EF3C36497F892CC539E5170B320B47798B53E0459225318A2CE1C496A51FED610E4614692CE73B67F6A0FDF8A857547B3B80DFA95C1EC060DB4AABC92C21092AABF9039236FFA9117622EA65A583E44D40783550AF011B2A40156F54406168283F436FB7579D39EB3DF7B9C55A1A035B61275AE7CBF7494910743B638D8C5C8BD0DD439D1CA0B30759DA4FEA19F0C2ED7A1149BB4CCF9E4B4E056FF9A86EA28167D1974BB51F092E22BC6D8C0391B81C1C5ED1FEE0253B34DE228ADB98D2AF1B6208B963182D822AD86399EE46FC29D5EF6FABB60A1A2391D95A85CECB308EC7E923C56EA836A0CD622A10887E6ACF3F42E2EB2C2A4241E3AC9B773621D4FF33D5EBBF5233DCF73C6065E1B -sk = 66B79B844E0C2ADAD694E0478661AC46FE6B6001F6A71FF8E2F034B1FD8833D3BE2D3C64D38269A1EE8660B9A2BEAEB9F5AC022E8F0A357FEEBFD13B06813854019994AA948403F5C1BC1B3BC92E6C01B3C4CAECBC77D2070650975568F5463E1E9896130023B9E16585BFE32A1A38E7096C3E09942AFD4BC9DEB0C2B80C48203C7D701EC8ECF6C4587FE3E5EF10A73650F737D116A13B8FAA92784BA9182E92EA3D1DB03C075AE40365F07C8903AF2FA5C906AC8D8876374AA9FAFE20D5A417B13CC65F60685C0BFD75BA1820737CEE71DF1F247ACE4F54327BC99622DCA7E0D0A668E1339F4AA8B38275946EDC8D7F11181EA3CDB8A508A60AACCF34C623C6548063E93A96F02E59EB321FB0B7C37C56B1065281F5B48990FFA2F2D8A48E4D506C5B18D8B4C6752D9508F4619035D57D65AE996965C58D2C5CAE0981799E498817576E2282B4D62B1B0A6048D61FDC7F91C2CBE331CBF08C1CCF0F87568E77937160CC3F44C533F40589EA78F8E1A8FEFD870DF8D062963EF3C36497F892CC539E5170B320B47798B53E0459225318A2CE1C496A51FED610E4614692CE73B67F6A0FDF8A857547B3B80DFA95C1EC060DB4AABC92C21092AABF9039236FFA9117622EA65A583E44D40783550AF011B2A40156F54406168283F436FB7579D39EB3DF7B9C55A1A035B61275AE7CBF7494910743B638D8C5C8BD0DD439D1CA0B30759DA4FEA19F0C2ED7A1149BB4CCF9E4B4E056FF9A86EA28167D1974BB51F092E22BC6D8C0391B81C1C5ED1FEE0253B34DE228ADB98D2AF1B6208B963182D822AD86399EE46FC29D5EF6FABB60A1A2391D95A85CECB308EC7E923C56EA836A0CD622A10887E6ACF3F42E2EB2C2A4241E3AC9B773621D4FF33D5EBBF5233DCF73C6065E1B -ct = 43488ED638F2AA31141CDF4B363261E7DCFC4D5EA9E50824DB9709306831579D256344FC3D200D308C1A0AA2C491EC101527FA32A8BF5F2F18692F5203174C11274AD47EDDDF777F30315C5FEC45C208172C8C9E5B3976123BBBEE5C23257FF8FD3569D7B276E279CABA3989C86EAAAE6071CA6AFB9AD7CD93CED61D76E01240A3D8F626224718CE0674FEBDAD5DA9DD1E9328352B8CF1A42192CCFA543C731EC1A2891A325E00FC5C3806BA6A68E69ED1352E0A45DA4FD9BED8E8589CB06C78AAADD61AEEFC9AE4E5D6203453903DB94D87B31DA3026E974318BAE075457E47723D3216B01A8B6D1B7489ED672904123691D0C1AC3EA2D03DD13F3EF434E8C4DC4C2EE29222E65B4967F2B9072B5ED1CEF0DB2372A302249C644A3B1620E9066236CA279CC5EF8E1CD1955544BB90FA21FFEEF6BED703EDFAAF476DE31EB86B1EA19B52B76D993648D18549DBB704D14B5257EBAFFA987961FB46D1A183D6BC065AF7C6A628A85EDBC3E1D596B2F2ED9CDE69B532F2D206157A42EE3DE1B7CB5F6B7005D5263FF69A7922A1445FA07EA1D7DA70DBC8CE6F3FA1EBF214B0A514AB7D80F2B6BF11E79E3D7531E082560E9ADF4EF7B4B0C59C95B450F01525D567AE45B8C3D5C50779B313416CD4973B81AE653A929011647E2A15B1618561803413E3418F7651EF97DD199CFD2B1F65A6D4F1AB0280110B9B982592CE0480CD7CB85ED3E9A64C73022E23557A2E793AA83F26C18BC5CF13D0E780E88B173C9D6A47B63019E86E73928CDF749BF5B0DB009AEEE22488CD42E3FED6DEE88F05CEBF596C5E38C998405A036FDB7539002CB4799C7BF2 -ss = CE4798DE43EBFA6B34FB7F22DA2B4CF80864D7F8EDABCDF3FD0E7BF8B0EBD3E6 - -count = 5 -seed = AA93649193C2C5985ACF8F9E6AC50C36AE16A2526D7C684F7A3BB4ABCD7B6FF790E82BADCE89BC7380D66251F97AAAAA -pk = 40F175F4346EFB9FC35D8A0AA991B64CB962F34927C00F71AEB17C2751D919C1999D4977C289919FAC44262D6CCC5B5A06D5CB984955498C806CF1D4FCBE556FCE74001444CF510E664A529301247029F7A1B8BA3A60617E6774CD1A6B68349D9B830D14E3CB40B5CEC69D0888531A554FC7176EA79F31DB1EF7A4ACD6BF904FB798B78BF88909A74F622DBDE8DF2A100074EA27C3395270670562A5D1A2165D7E8397E24682FBD953FDD31DF23C24FF63DC837682A303A85837316796C22D6CED322ACFFC0EED428A8FE4E969A391C6968F16A03F6A8F223AB5C15F42623501577B8908184AA2CC02BAA460708BC80389F9AC008E5B96F1313732291A4CD1B885056E28C7DFA90D05AF0FDCE6E9635A45DA8766D84A825B97208D71E876370EF89A08273CC633C4DC025217D628D2D12A7755CBAF5F4292511E03A53061807BAD2C2F165B48E304A5E37585F80B4C765F54D134DE0381BDAD22B379147B3E2AF92F743A45406CD11891FEECE5D1DCCB0759CB273ADC454F2EA15269F2405A340EDAD9784A7E7244E251E0EFAAC8DD560B410929D9BBB1E8F710AFCF9525CBE85A9D36AD02A80879544790885F66353286D00376A66B2FAAA3E2C95892E6517D63344EAF0578B5939AFA2C86B982E82E35F71294DE09842E2A98D3AAECA23DE424CCC5A8C8AAF34115A190A688406380451F2792D207BFBA3DAC0F6F7A8550A5076E24C0890BCF30796C7D6631D29DF8AFB80840D79826F97E86EA494E13E6CC64CC1AD9810FB51644CE66981B88436A94D06C17 -sk = 7EC408F52C9AA723D0C41D9987682A5F4CE6C9DA7CD0215AF60BBAF5484AB353A08CCF451B049FD51D7A9AD77AE14A81569DF8C9BD3A8F1EBEA86FDCFB823082575E0CDE12B4B3A846F639EB8220490140F175F4346EFB9FC35D8A0AA991B64CB962F34927C00F71AEB17C2751D919C1999D4977C289919FAC44262D6CCC5B5A06D5CB984955498C806CF1D4FCBE556FCE74001444CF510E664A529301247029F7A1B8BA3A60617E6774CD1A6B68349D9B830D14E3CB40B5CEC69D0888531A554FC7176EA79F31DB1EF7A4ACD6BF904FB798B78BF88909A74F622DBDE8DF2A100074EA27C3395270670562A5D1A2165D7E8397E24682FBD953FDD31DF23C24FF63DC837682A303A85837316796C22D6CED322ACFFC0EED428A8FE4E969A391C6968F16A03F6A8F223AB5C15F42623501577B8908184AA2CC02BAA460708BC80389F9AC008E5B96F1313732291A4CD1B885056E28C7DFA90D05AF0FDCE6E9635A45DA8766D84A825B97208D71E876370EF89A08273CC633C4DC025217D628D2D12A7755CBAF5F4292511E03A53061807BAD2C2F165B48E304A5E37585F80B4C765F54D134DE0381BDAD22B379147B3E2AF92F743A45406CD11891FEECE5D1DCCB0759CB273ADC454F2EA15269F2405A340EDAD9784A7E7244E251E0EFAAC8DD560B410929D9BBB1E8F710AFCF9525CBE85A9D36AD02A80879544790885F66353286D00376A66B2FAAA3E2C95892E6517D63344EAF0578B5939AFA2C86B982E82E35F71294DE09842E2A98D3AAECA23DE424CCC5A8C8AAF34115A190A688406380451F2792D207BFBA3DAC0F6F7A8550A5076E24C0890BCF30796C7D6631D29DF8AFB80840D79826F97E86EA494E13E6CC64CC1AD9810FB51644CE66981B88436A94D06C17 -ct = C7917F78DDD31FA2D8C591AC2E43C2F1A661AFFFCA000205A8CC5ACF2229FF98094447F99085DA98B26BBB4968E790877341E46BB6F741749D726984707534008A45267FE9D1D8A28FECA1FE2B0E7B7A8B7DF78D50150B3B0AC349C70E404FC5BD5ED62D204CD07CB2DFFF2A4467D6FB80136415883E2564E3A357FCA439AC3A274CF0FB6C3D51D87B297A57646A3BE95726C56C09DE3B222F2F9114F619C819B8BBAC45105CE76A16FBD403465D41D2C18DB86FCB19BF05AA73D532D68F65D0C1D5832C8960F83EE07875CFAEB3D5E64611617090B001E74F9F0FE80667049287D6E9E9FF70B6B3A5422AE3A2943328A7E8C71825DCC7196CBBFADFA752AA15A0B4C7D5B3B8ADF1ED683FC840AEBF45657A45E152180BBB97639C2BF6B074F2C71E1130D050392A937A9B24486052EA651FC0F22C1663F16A9029D638A6843B660C61D3856E419D3030E2B46760A6EBB75DF2374F6980D59A0DD0A30F3EC508669579997744D862442CAE658F0DCA2C1CAAB56FB2376420C7BA2065BCA2ADDB7F817F5EA79664609949ED3A7C5BA2833E8FFDE18EF06C3ADFF5A5B6226372DEF9F7DC293E7542CD05DF5C33DD9CF5AF84DCB7FE12167C6679FEC37060D306D614EC0AFD2027741B333C5020C75D6BB5A324B7AA090C9424BA30F943C3EAA5ADFF52A7A0750618AC97226B599A831E85BE7D6ED7A385FC5A761DA959ED05E26355F6AE576BFF646740E240D7601D93625EF627A4685F7A1AD2FBA492AE7FF19F7BFD7A5D1042DF59D8C5DC41A2102134AC5F2354CB72859E7BBDABC24248CE33750FD0DE1C55E3C5A17127F89E18F5E843671F52 -ss = D9EF3DBB942B9EEB02E9AD654C1F99A4FC7C2D779500C616FC7E9FB17BBACEA6 - -count = 6 -seed = 2E014DC7C2696B9F6D4AF555CBA4B931B34863FF60E2341D4FDFE472FEF2FE2C33E0813FC5CAFDE4E30277FE522A9049 -pk = 632B9557E6040D42B4B2DFA07C5B7E6A11A6920D617190C9F630A3C67C40CCF6B429350D45B1E3E5A586016BA21B41608899F4E82607AF619DD6523E09F935229504F59F7DAA52177D1ABDF5D25C97CF3A38DE650BF22DB468B7B1EA435194FB73A064FB890F41ADBD49EB69670AA18C32E8CBB3C4360F533D1A5D8323A63F60971B80E1A35E1E34C4483FD98954EBD27D8277E4855579CED9131DAED73F57909EE7E3DC91A168A9B5E74876FC2208052C0E7C87760BB370DAAAE13D6D399A64CD0150A2746004E458BB80F8BA5D90012DA0F7234D51D0A14736EEACFB9D4D5EDBFF8F4E0CC17EE6FD449F8C693DC004B2A1997164265C95D857868596D43414096E430A8D96864A863DE8D036953453B834095A5DE98C09A34D0B842A4AA92CD38B914B47940EC9807449EB689BA6B509B296AF2C5DEE5DDFD042094FCD8ED4B07BB1C6C777FC9F32C3CF9D74C2F74F9032D7FE55120FC8F9701975D91C7409D86AF5368259CF85432D4FED6E32186EA771BB3CD5284A427E56D84F2DBAE9C06FC8BE131DD730F4BC155E73A37FC9CB168731D93CF686E6628799FA2084A3F8EA82BE01CAB30EADF74689DCB56FBFBD956C1B045DA9EE242BBF347710D78056EBD898BEDDF760536D3A1EE58D489557528384BCDD6A8099914EFA04B515DADFA7F7A747BC80F3AC8B2B724678C13AE1457457D811A92C56C20AE04CB609D5815B735567BAB1B94A1C9AEC06E2E629742E6629357F8D666415CF403F2262AE0AC3B73CF817AC6B1DF2D0A1F07AF63CF9B498573B -sk = C121915BFEF6ABDFC177DAE2F5A24218F9ABDA2559AFC6741B08E0E61AB433EB84EF52DB5EAA6DF8EC3A0BC5FFA730DB0DDE8C5F38F266D5C680A78D264A7B9633D9228485C117A4D4C78E14F0C54803632B9557E6040D42B4B2DFA07C5B7E6A11A6920D617190C9F630A3C67C40CCF6B429350D45B1E3E5A586016BA21B41608899F4E82607AF619DD6523E09F935229504F59F7DAA52177D1ABDF5D25C97CF3A38DE650BF22DB468B7B1EA435194FB73A064FB890F41ADBD49EB69670AA18C32E8CBB3C4360F533D1A5D8323A63F60971B80E1A35E1E34C4483FD98954EBD27D8277E4855579CED9131DAED73F57909EE7E3DC91A168A9B5E74876FC2208052C0E7C87760BB370DAAAE13D6D399A64CD0150A2746004E458BB80F8BA5D90012DA0F7234D51D0A14736EEACFB9D4D5EDBFF8F4E0CC17EE6FD449F8C693DC004B2A1997164265C95D857868596D43414096E430A8D96864A863DE8D036953453B834095A5DE98C09A34D0B842A4AA92CD38B914B47940EC9807449EB689BA6B509B296AF2C5DEE5DDFD042094FCD8ED4B07BB1C6C777FC9F32C3CF9D74C2F74F9032D7FE55120FC8F9701975D91C7409D86AF5368259CF85432D4FED6E32186EA771BB3CD5284A427E56D84F2DBAE9C06FC8BE131DD730F4BC155E73A37FC9CB168731D93CF686E6628799FA2084A3F8EA82BE01CAB30EADF74689DCB56FBFBD956C1B045DA9EE242BBF347710D78056EBD898BEDDF760536D3A1EE58D489557528384BCDD6A8099914EFA04B515DADFA7F7A747BC80F3AC8B2B724678C13AE1457457D811A92C56C20AE04CB609D5815B735567BAB1B94A1C9AEC06E2E629742E6629357F8D666415CF403F2262AE0AC3B73CF817AC6B1DF2D0A1F07AF63CF9B498573B -ct = 9C29A12C2534F16715032E1ED62FA8E740287D0A144293E7FEB3099D5C2FF350B27759629F4A280AAF856D742F6643AA38CEF63BB4B4A4514376B1233B3D1F1CE6299F070BDDBCF90D382BDCFF85086B18388A81FF8FFD0E2326B5B8B83E3DE5DF1BEEBFF91013E0B7A38B89A04FB37840006C0241774A416136DA692092FE9FB70B8CE1B32E1A657CC0E5D6BDE51BCC8B3877486EEEAC0DCB85541B1E4C9A1BDB836F8CA29056DDCB31301E17BE77042D766D092C062D0ED845A655969B7DB3FBF774E162C219EC54BEAA4DC381D60DED23818E6148DA4684C578EEEC11DBD36BCA6C6D56EF7179E3391537EA250B7E06E130B426791728DBD48F81CC4993233366CBF169769C01B17F376860F0947517031C6A1055A0380A34CF2418644A9654576F78CC452DD3C5728270496F921AB6D64C54BF838B205B6640A4B6662D56B23B168F95F80C6D966F4035884CC88CA606AA20BA9D1635E7A867951E95E7925012028B8B1A0976224DE761EE1260CE90F0C69201BE2F45D46B8A3A492A1570228FBC83065D5F6717845CC7544A4AE7C0FC1059F4F555D59F33DDB1CF01D4E31AF76F29C2747829DA221FFDBBE6379148C168BA90C346DDC7B23EA156DD256AD194B8B8A65B61450000284CB96469EBEAE4434F0722132E09E9E37746700D5B33CA0250C6E74FF589F87DF19A6F86C9C99D7B7AD11B5D6322B5968F0CBF2E6B687F8FCA53A454069BC6CC937A49DEB39B366EC5307D0B99A8A7628C511654F9DB76773DB7254137E23F90B367101C5313EEAA222B174A0F10783994AD9D7A95D77216ECAE0C65BB64B855FD1A887389D7BC020D -ss = 83C18909FD73AD3732ED11B61AADFC25867E17CE0900C7F001293770325169E0 - -count = 7 -seed = AEFB28FDD34E0AB403A703B535296E3A545CA479C1D8148E2D501B3C8DD8B1034BD986F13F1A7B4671BE769359FD2AAB -pk = DEF8B8B4B7E05C8CF64A994558B0C7C608FBD949D2EF1B0E121FCDA0200F50C910CFDC3F842388A8F8F1C0FB80F6A3E2ABD66ED929CBA9BF207AE080204C52B65CE5A78F783D2573D6ED193A3305A6F2BB8A1D9F53E0152F4F390E94030B33F0D7074EDCDE4AFB5AEE2902D9B3E105999D2572ADFDEB37480F4D6C148ABE81DEB47BD42814BFD99E570DC4DD75C77D066BA1FBF691FB06DAF924541ADFAFC3ABB525151E8067B6EAC9BB738A3A548C3913060B0F697DDB6E78B8A029348D5E76452DC8D766F9CF31986CC93FE8B64DF46F08A43C7D80EF098B294D6409FC4685CAECA0F80D758C89DFE3906673DDB6B1F759F38BEB469F2CA2E96AAF17D5D34CC9D8D6B700056592CFB63BA00A0EF77EB05DF2CFDEAD26846E12ADC4F2E0BA6380BD7761C5C1A8FE090F3B9E4ECE454F22D72495926573F5032B06388634B6B4D0BA7B4C0AD721726A6F2746F98A1C9A68827110C621CDA6036AE46814F7839F65E91616EA6E2B5168CB5A05F8A8F42CC538BD684729D5071CDD7C980891D096DD527D0749B8D378DD2C172CBD2D3BCBCB78AB66778EDF3E16A614B42FD5738476F098EF638EBEEA67F0FD64012663C01392A6384E0FD37386BAEDDAB8F769A1135DA12911624FF7CE4AB4B7D231AA3998052EBA090FC1DEA22B83CA1ECF2B8FEC74824A1554E9B9BCBD5DB58020FCA5FDB4FC5FA75E332BB9C47FDF772CDEFD91A73A89953ADABE47F1CFD52C6E4F250C46A973D577A09FB840999FD2779D2A218796B8D511BA81D9DD435DB55D1ECE517FAC60 -sk = D86634ECF96CC2603761E284C0E36734CEDEC64E7FF486469E38539C71141C5A99DAF37400CFE59841AFC412EC97F2929DC84A6F3C36F378EE84CE3E46CD1209C584B1AC41A0F81C33043A9F815D8D01DEF8B8B4B7E05C8CF64A994558B0C7C608FBD949D2EF1B0E121FCDA0200F50C910CFDC3F842388A8F8F1C0FB80F6A3E2ABD66ED929CBA9BF207AE080204C52B65CE5A78F783D2573D6ED193A3305A6F2BB8A1D9F53E0152F4F390E94030B33F0D7074EDCDE4AFB5AEE2902D9B3E105999D2572ADFDEB37480F4D6C148ABE81DEB47BD42814BFD99E570DC4DD75C77D066BA1FBF691FB06DAF924541ADFAFC3ABB525151E8067B6EAC9BB738A3A548C3913060B0F697DDB6E78B8A029348D5E76452DC8D766F9CF31986CC93FE8B64DF46F08A43C7D80EF098B294D6409FC4685CAECA0F80D758C89DFE3906673DDB6B1F759F38BEB469F2CA2E96AAF17D5D34CC9D8D6B700056592CFB63BA00A0EF77EB05DF2CFDEAD26846E12ADC4F2E0BA6380BD7761C5C1A8FE090F3B9E4ECE454F22D72495926573F5032B06388634B6B4D0BA7B4C0AD721726A6F2746F98A1C9A68827110C621CDA6036AE46814F7839F65E91616EA6E2B5168CB5A05F8A8F42CC538BD684729D5071CDD7C980891D096DD527D0749B8D378DD2C172CBD2D3BCBCB78AB66778EDF3E16A614B42FD5738476F098EF638EBEEA67F0FD64012663C01392A6384E0FD37386BAEDDAB8F769A1135DA12911624FF7CE4AB4B7D231AA3998052EBA090FC1DEA22B83CA1ECF2B8FEC74824A1554E9B9BCBD5DB58020FCA5FDB4FC5FA75E332BB9C47FDF772CDEFD91A73A89953ADABE47F1CFD52C6E4F250C46A973D577A09FB840999FD2779D2A218796B8D511BA81D9DD435DB55D1ECE517FAC60 -ct = 6613F9DC64AAEDBB25920AA0468FE074C37AA4451C2EEF60D4C8668C88D96208A7B1FA998B42E55CC7A2CAA32571CFD88AA1AC2D76328222DA675D3A6325F3BBA561820B20F8A2530DA78155D73C3991C00290A2A0E4F68DAD53E4578F4D8133C21DE26E6A5C1D0528C6F404C6B6104531C31D0BFCC486BA76A65251AC0E5AE2C58988DF85D68FECAE871173999109C61DE5F6C176561FF1E29C265DEC57E6777753CA5B5D90CD9A441E511AAFBDB5FF1CF3FB90630CA37B5DCC186CF7DCE8EC83DB4367E3D5762EDFBC2529E66ED7E9FBA43FB1C07A086A2659C5BEDA01C0DAE330D32CDB35FCEC8B251757463BCA072E4E2F00AB8091EC30F0B4DDCD6096585EB4877A6195518989C0D7575EAF14C2E3189D2B7BDDA4F59002F82E4566F3E4036A99BCEC023077611641FFBDDAF1C3AC5E4D325B7DB74A72301FF1959418CB8E87B5D3EBCCA44C89BCE645AE73BD699C090561ADE40661D71814EBB816C79C37BAB35867EB3744C90C24968A041928735E2AAB7CD9FD1F160892178E143FD243ECE34AAAE61FCB317691EBAA8A975B09E862BC61E66A06F77F9D5C586A32636B9F3BC9EFDEC0187AD715DF8290E8843394580F5200B66F11421F90358F57561775064CCA47691E16190BCB3A26AB0FB374F758CC1EF64E7E647965182B264953B56F3069AE6BA59E1FFCF510D2D02AB25B8160DE0AD79ADCF82F25BC26869CD2554877493D147CCA57DC44D3822B430F38A90C04A92BD7FC37D37D87567327CD253F7E51D2F6E2AA88856416CC5B7E5A9A6C4EAA87815BACC3CBEAD737399938AEC0528440C23B0FB599F021484E635FE4A44F -ss = 600D281AA7B4FD07967253C51C8628F082C0DC380246C5BEC4105483E2B6D62D - -count = 8 -seed = CBE5161E8DE02DDA7DE204AEB0FBB4CA81344BA8C30FE357A4664E5D2988A03B64184D7DC69F8D367550E5FEA0876D41 -pk = 71FA1AD2142E2FCEC33D9509FF702675060031F94EDA26BA7922F1333E131F5D7754D0E528C8ACCEE369774210D880A1C2ABC415720940B418C001BC7761FBE7AE1D7E6BA935874DB0559CC7EDFBAA42A21E7E0188DFE3D771B7D20C4B453E32A82262DE27827061845BEBF92568A5A62F45F09061146CE8A9D67933EBF098C00D12E00ED492B74D70EED721F85D8E6ECC8F3995FFBE17FA28B8E22DB2CA688698C5D95CE900A09CE156A7EF258E13BF79C17AD1CFEF24EAC664CD574AD17470D221FB7A4579499E2532AC28CA62954E2E8CE236C40FFB2B51B78BC988B53C726775360992F1E232DD7E5280863046DD10FDE7C5EB9C3A5DAF50976E810562AD60B37FB357770CBCFC2316D8682B3C904924540640A9C5CF2B1729C4FA3DFF4C2573108FA20448A565B19386021CD51C2761FFAF4D3F125CAA2A71D3247FCFE00EEB5EC7F32958CBA0F757A32B9B7D3A6C4151CC2BBC7D39D329340A03E553A540FCF6F64CC1EE9C2EB8BB00910F2A75470772D3A3565210D70782C1DBAF9AAF1C34026D78E51F626102133F2C35CDC7A859A1305AADFC8582BC5A2049835282056CA2BA3EBD610A758EE2082A0277512ED2ADD2DC648D66F52B0FF85283E2528342A64EAF56720E33A556D05BB1AE14463A7746BE66896C350776CEFAD010F923D345D18E952AC5EF8B06D000AF47862F394E5586C3A94BA38FB0E2B98313793720B062EFE94A98C2EDB5A17BF1E9E429EA5F6D6FE1DEF27A94EFB232A810056000CFADB12FABDCCAB978E9D7B058B25459454D -sk = 0610678FF4DC3128E1619F915DC192C220F8FAD94DA1943B90AAEC401683A492DA1804DDB5AA9B1C6A47A98F8505A49BAE2AFFDE5FE75E69E828E546A67710049BB97233D6B26DD19845A98D1BABD20071FA1AD2142E2FCEC33D9509FF702675060031F94EDA26BA7922F1333E131F5D7754D0E528C8ACCEE369774210D880A1C2ABC415720940B418C001BC7761FBE7AE1D7E6BA935874DB0559CC7EDFBAA42A21E7E0188DFE3D771B7D20C4B453E32A82262DE27827061845BEBF92568A5A62F45F09061146CE8A9D67933EBF098C00D12E00ED492B74D70EED721F85D8E6ECC8F3995FFBE17FA28B8E22DB2CA688698C5D95CE900A09CE156A7EF258E13BF79C17AD1CFEF24EAC664CD574AD17470D221FB7A4579499E2532AC28CA62954E2E8CE236C40FFB2B51B78BC988B53C726775360992F1E232DD7E5280863046DD10FDE7C5EB9C3A5DAF50976E810562AD60B37FB357770CBCFC2316D8682B3C904924540640A9C5CF2B1729C4FA3DFF4C2573108FA20448A565B19386021CD51C2761FFAF4D3F125CAA2A71D3247FCFE00EEB5EC7F32958CBA0F757A32B9B7D3A6C4151CC2BBC7D39D329340A03E553A540FCF6F64CC1EE9C2EB8BB00910F2A75470772D3A3565210D70782C1DBAF9AAF1C34026D78E51F626102133F2C35CDC7A859A1305AADFC8582BC5A2049835282056CA2BA3EBD610A758EE2082A0277512ED2ADD2DC648D66F52B0FF85283E2528342A64EAF56720E33A556D05BB1AE14463A7746BE66896C350776CEFAD010F923D345D18E952AC5EF8B06D000AF47862F394E5586C3A94BA38FB0E2B98313793720B062EFE94A98C2EDB5A17BF1E9E429EA5F6D6FE1DEF27A94EFB232A810056000CFADB12FABDCCAB978E9D7B058B25459454D -ct = 83668F2EE7D45C6BAA4553F79211F0231A7597A47B9F6BCAA7A753376D6E062C966AC6E66DEB438E9BDE3FC6C6FA016F5FC429663AEEE231C617A5E5EA87AF7B1BECB035BAAC67BDC5CA94445FD8E190A360D06E479609B1C35678D0E8330108FE2B1DAA8358D4B2829D07B05B420C22BFB58FF0C621B9762CA589BDAB799AA7E1639A1F91C5195E7C0FB4F4E03F89E609BF263D33C1D63403012284B613BF5DCF809CD016E6F4ACEC5C620E702E283308B71E962F98A32124D66E3CFDCE9B5F7AF4D77F6B85AB6BC23796D64551512FF1684B9D0C980B8C914F1C1882480799303F4B4B99A9D7279271FF1B5EA9EB2B333D8C1AEF553CD4D1A672979940DA3FCD234E9C4D47207153522F41739DC6B7259594998E62282059599EEA8495CAAB4DF3E1FBC09B349CD1EB84ED4CF37403ADE6615DAD1AD65EADB17C7ECA5EC6FE633AF7656C5AD50D619869CC0F551D0B15288D2CC567F8F7E69EA9F412576593AE306E5ADD7A84021B4A4E9ABD7FDC60BFC483A8B1E7C76861ADC52FBF8E7C221618010472F94A47665D59C01F99EAEEFB2F251D419C58E7557370C6CABB42B10536CB34EB390F2E0620DCA4313EF32C30BC9A1269BC2BB4F7A2F799F66D8202D6ACA252D6AF9C330132CEFC152DEFDA490F2733FF5D36BBBDE6C13A19237471EAE464952CFADB266D47888C96EDD8BBA63612C25B915F895138443D25C050C035626805C4C7DA2369EA5CF2D81AFF4DAEFA0C7BA5E88B2E3BEB99AECC0C51BC5D0A6D78B05CE6F8A9BC722568D78F1A432AB45CE2FCFA39F5EC11030A1472E52627E25C8D6ED274F60A72B11E41DE54E02DEF38 -ss = 4CA2CE6B6EE911DC23E50973C0F4999B7463192A2DF4F4055C519665736BEBF2 - -count = 9 -seed = B4663A7A9883386A2AE4CBD93787E247BF26087E3826D1B8DBEB679E49C0BB286E114F0E9F42F61F63DEC42B4F974846 -pk = 4E10BA91D1222CEF6E8531629119A1D5495B60B3FEC556BEFE1AB4D05273F4F74372890C748C84AC9C202D96F63F8549C015F7D93119DEF9443AC79971A8C3AD1A5F2F038B50D4057F512FE1E7BA80C672383ABB28B6EEFE5AF9B875253C0F2672513F4DB9E2DF8796ABB69571015E35889F8DF4197BE1DB915D274B2C9F7F598C93BBBC8B19AB3FAD37F2486BE68662EDEECCC4D5E81604C01F395E988B04E803178D8305A935D9F5AF69B209B91E6E37C4511FD4F45D7FF93E3601990BA1BF1C274FD8701D0733A802C67F363C33F88F8832701D89ACFDD475D5242EB351B9F06004970A2922A7ABE0D883B9654A1DF5AF0EFFF2918DBD6763E3D50C6E8AC4B9A2B1E5833CC844B416851BC63BA5E209C638F13A8D20191A32F7392937060B9B5B7D736CEA2BB6212CCEA79161A711F2B1D92E88C3D5D15F3A72D292D68A12DEB6987DB2693E18DBFA953228942EE49B852FB376BA93610FFC0C86D1007D3C6C2E4F41485E9439AFD6A52788D21BA73929166A4ED34231C7F95B0042DC9EA81D7D7DDA6ECBC8663CDD3C10335C64BB5E087D73F816634DFBAEA7F642FDEA64BD5D661C9709425742B1282DBF670D0C7536A3A27D4EDB09A6C1643FE748A383547E306632FA066734A11B0CB973D99E34D2864F3F06F2C98DB8DC88D9DD576049A4109EBFAF39117E57AB68E052BC94FF1104D7399120BD8CD8D67B369A77290286FFEE41EFD9539BC685337BCDE41BEFB188BFD89C644805388EA6A8504DF3A1FC68DBE837C94AA7161295801B63EFC4778851 -sk = D322D56D8EF067BA1F24C92492B9C56DF3A6EF54A304ADC1B69913766A1CE69756047447B810CC094D400AB204CF9AE71E3AFA68B88586ECB6498C68AC0E51B936CBCEE9FC343B70CA3795DD04C062024E10BA91D1222CEF6E8531629119A1D5495B60B3FEC556BEFE1AB4D05273F4F74372890C748C84AC9C202D96F63F8549C015F7D93119DEF9443AC79971A8C3AD1A5F2F038B50D4057F512FE1E7BA80C672383ABB28B6EEFE5AF9B875253C0F2672513F4DB9E2DF8796ABB69571015E35889F8DF4197BE1DB915D274B2C9F7F598C93BBBC8B19AB3FAD37F2486BE68662EDEECCC4D5E81604C01F395E988B04E803178D8305A935D9F5AF69B209B91E6E37C4511FD4F45D7FF93E3601990BA1BF1C274FD8701D0733A802C67F363C33F88F8832701D89ACFDD475D5242EB351B9F06004970A2922A7ABE0D883B9654A1DF5AF0EFFF2918DBD6763E3D50C6E8AC4B9A2B1E5833CC844B416851BC63BA5E209C638F13A8D20191A32F7392937060B9B5B7D736CEA2BB6212CCEA79161A711F2B1D92E88C3D5D15F3A72D292D68A12DEB6987DB2693E18DBFA953228942EE49B852FB376BA93610FFC0C86D1007D3C6C2E4F41485E9439AFD6A52788D21BA73929166A4ED34231C7F95B0042DC9EA81D7D7DDA6ECBC8663CDD3C10335C64BB5E087D73F816634DFBAEA7F642FDEA64BD5D661C9709425742B1282DBF670D0C7536A3A27D4EDB09A6C1643FE748A383547E306632FA066734A11B0CB973D99E34D2864F3F06F2C98DB8DC88D9DD576049A4109EBFAF39117E57AB68E052BC94FF1104D7399120BD8CD8D67B369A77290286FFEE41EFD9539BC685337BCDE41BEFB188BFD89C644805388EA6A8504DF3A1FC68DBE837C94AA7161295801B63EFC4778851 -ct = FB194A48F4AE908BE6F0D90E06EF67E6272B23E89473AFCEDE9FBBDA7E23AEE79B8B1111828673DD325CDCD5F806B3A38E2C929637A58E69A1CC08C4037D9BCCB7E0B742610C6D8E814F5824F3F720ED985038AE7806F8D593A0DC2F7C62B3DA082CF00E1D87095C950CFB96E7BFDAF5E83B4DBCE54A54FF30DACA521340AEB698CDED3A03CBA88AEE7201E8261363188BB6354B3125721663FFB4F495D98335B4D5831F4736C0481C784388A4003D0E4958F981783D6E5553AF9C694A7369707C77CE1A7A4BCFF591CF93029724464AA985C6B65FEC057E4DB81EC83D199BF10293F97E6BC1333109798B4F82EFA057C43A50111C6E1AB3BA3EBABA7754E1E884F1B5B4D391B1D91BA95035B10E80990CEC4E507CFCE868BB53E2ACC4436092D259072B4D135893BEFF845E7A3F06E61244B5DFA0CDD05638155D6ADD39B7B56353675C7DA949D64DA265CA708ABB766843921C93638BFE2C78E0D7B1E5BBA09AFA6458C3890AF8EB3574E93A7E2577E42EA06F0D9C454D775127BFEED0267E78BDB76ED8E39D8CCA1AC2D2E32236841A920CE883489DC01768AFF0F9FC2902A2E1F5C7968E4E3918B7171D28E2BF9BE0417266189CE13D61957476A6601C55BE2A2ED1550158C179D2EC004870CDC7F67E4869961DA98493E820AD1F2CC3B0C6C523C615C0085FA3962C925A3322DD2F9A383B14742AED8613543055B5D688BA91DCC7FFF36BA80C6E3317BAD4195E26AA8A01182082AEC8D0C172405760037583619585A34BC3D14B85B2C8B6C02C26B5CC3A24CC95369628E71CA7DD37DA150277327A65A8315B9D4D4CC35DCB575D9E4855 -ss = 0AC4196CED9103213B8ADEA333A872DFB2B029B1B9095E32BC24D30441DC4E8C - -count = 10 -seed = 980D0BA7C8F8B23D0E948A6029FF2659810EA1360064663A8994D0333C8543EE5FF5D6D5C9ACF446E61DC464F792B9D3 -pk = 9C7A58A8A6EA9C2CC7EED508FAEF7DC2E88C3A97FFD9662FE1953B7F9789B51C2C6CE9FB45114A38B2DD928C16D992FA20ECBED3BE866626EDA1C98CE68DA968D34ED47D5162CD9E52E74238409BECB84E05782E59EC7E4264DA23349A699C481E0A05BB41F6BACEE7190EDF7CC8F364B4B78EC1484E749BE78EECA4232CDFE5833085012DA3FE169F3AE6D01C195F2C785B9FD97353B85A59526DD7DBD1743C777EAF4E91F30160763FCC67B8702E90E093E801EB05108C4C414C070ACB0B006C31A2317743A7CB4DD64006D7ABC41CA5922A57A6577CDEF038ED7E5F9A780976A59D1A1034D8A30F5D081A31901B6E120FD1D0B84FA1BD49AB983554448652BAF23E12ABA758DAEDB15BC887765A53707D9AAD9776C1CCFB2D97603736E71511E81C4B4CD518FA1639FE30FDBF36E0836AE0FA2770BFC095C96A0803F40565D6D01EC6B14EDD3822AB262CBBAB2BC0E57218A423A1BBE9FCECE0686F8AB35CE2F8F40B06C116AD69C09E2CE0CC23075D329B62C1853C11CF32A35CE3D217634EF65ED78A65D08751A6F96B3FD1124FB7B97D8C12272468638A02B3988D05A166405106C81A2504B4764CB691435F4FDEB5085C5D5FC70C1B07D57D811E273782413105A63316BC380DB0CF79E3B70B5C2E40368301C23B4298FA813606139B8856809F7A7E25468414FB49448046E127A2CD8CFADF11B92361D7E2038A5E36A6B901B2E420142E883F7BE7033CEDB61911981CCA98BBBF7F20BE59ADA6000F159E0F5FD28B871D96CE002B6AFF5825A58CC238 -sk = 2F1D8A3BEBB34540324B9485FDF3D5BE3B858F544ABC3FC641B5728CAFAB03BA8D6C42E7270EE2B77B6045385F3D175984A0E260363166C73B0C70C97164436326466AD9341E61870A84C6A1C7679F019C7A58A8A6EA9C2CC7EED508FAEF7DC2E88C3A97FFD9662FE1953B7F9789B51C2C6CE9FB45114A38B2DD928C16D992FA20ECBED3BE866626EDA1C98CE68DA968D34ED47D5162CD9E52E74238409BECB84E05782E59EC7E4264DA23349A699C481E0A05BB41F6BACEE7190EDF7CC8F364B4B78EC1484E749BE78EECA4232CDFE5833085012DA3FE169F3AE6D01C195F2C785B9FD97353B85A59526DD7DBD1743C777EAF4E91F30160763FCC67B8702E90E093E801EB05108C4C414C070ACB0B006C31A2317743A7CB4DD64006D7ABC41CA5922A57A6577CDEF038ED7E5F9A780976A59D1A1034D8A30F5D081A31901B6E120FD1D0B84FA1BD49AB983554448652BAF23E12ABA758DAEDB15BC887765A53707D9AAD9776C1CCFB2D97603736E71511E81C4B4CD518FA1639FE30FDBF36E0836AE0FA2770BFC095C96A0803F40565D6D01EC6B14EDD3822AB262CBBAB2BC0E57218A423A1BBE9FCECE0686F8AB35CE2F8F40B06C116AD69C09E2CE0CC23075D329B62C1853C11CF32A35CE3D217634EF65ED78A65D08751A6F96B3FD1124FB7B97D8C12272468638A02B3988D05A166405106C81A2504B4764CB691435F4FDEB5085C5D5FC70C1B07D57D811E273782413105A63316BC380DB0CF79E3B70B5C2E40368301C23B4298FA813606139B8856809F7A7E25468414FB49448046E127A2CD8CFADF11B92361D7E2038A5E36A6B901B2E420142E883F7BE7033CEDB61911981CCA98BBBF7F20BE59ADA6000F159E0F5FD28B871D96CE002B6AFF5825A58CC238 -ct = 8728390D12B3761658764AC25BB768F2C95E5BD30BE9A81CE2F05BCDBEE0394BE1DF656F677719CFDC5096BEAB8C6C4FDB3BCC2135B92D51149C23ED1AF5239905EE00EC794BDF794C02F92ECA364D265E84F5D1E6AE0B759AB842D64341FCA42BCE2927863D5211FA9ED8B01EA91DC5644C13AC8B3A1FCF0F8CA5929F3E44FA43311F56FF8536DEA3027DC8CA0D238651C794D35447B3D9C490D2362F04F534CA0D6135C1E4E84327EA8681A2A67E535A300711B222D6EE761D683E0F96D65BCD2CC488058224CCD2D04946A183EC318A96D4D950BF1807FB925FCB60D06D55778F8C7F53F1A162193D3E03A9DC31FDD83FF6E19D43EDA1E7C643E1CF8315BEBE65B14827E38BC5AF6D2D55EE9FCD32915B26C4EFE1C5DE7654F7B975F91CD32B79AE9E7AD21DAF08F5AFC8161CC04885C550735CB9F9708FF0A5DE87DBAF6C913460A91D76F2A6B1052A06F0235355DFEEB4A93D73F2125EC3DB6B240116C4424FB6C9CD78192B57B2F2AEBEBFFC900BB2DC21D51ACA4489917CF8AE2676145D8F24A5F520A50A8B52E0603B3210A19A25AFB61DB6C98E5F5F2272E668C3F95773DCB822D97976E2704509D1E660BDB88E670BF2B055E0934F8F14541286CF79A6EDDCAC2FCB493D15D5677951850FAF4A9958EA53D7C5A9EA744BB286A03BA3B54E4627C4180E78C50F54AA5A4A5A5E5C8CD37EFD673091528F3195A070DF45BABF46FA4A328A5678F06F6B09F6D0F9712F0DBCA121587D3463BFDDF8E6086732450AF060B248AEC59005D1471B15CD0CC131DB732F1678297A5A536B79AD05099BD3B5108281657A31A48F71AEBE1448D67D -ss = FE8CF769164A3ACB29D531BB06E430386CFA36FEDC4D2DFE4769D738BD0F776F - -count = 11 -seed = 6C029462CA42ED520F10A579F52687101105E0B90C6E7BFA582A4C112B579D5AD0A0ABD38F72ABCFDCAAF5893A112BDC -pk = C0E1706227AAA182687BB5FE51FE72CA158C4263AC370CF176570CAB238A3B8F029EA62E965A00F49EBD9F8577B941E14BA57D8307173F3E526191694A81A25A87332BC44A488C6156EFE40593CE23387EC7BEE5B6617AE9A3AC4000314CFB47A4B52F2582176C74F64EBB6ED24DE7F66ECBB5E76015F92A90D5D318FF1DD442E28D45FAAFB0065636CEDD488DB8346AD39CF56616890FF71178415A050BDA4147270EC989402CA1A21A83492889F6A668BE6E723C00E7E038C1733FFB7ACE332C730BB287898AC6F8BAE8223854FBC2F1501864F23F947218BAABFF0BF2D4044CC52CCEA2D8B97A211F031D87A0AA11B99BC612BB7513575884A04E79C946A3CB1FCD35560EDD3045F7702BD230926951FE7EDA9F131193E824E9591B04DB227F9F16F85DD9EB645A5A9BF68E6A76DD350FC854FF1A29F29D323ABD5CD4A380A688F2907B8CB78FB223C4BD881C9765427612FD8827856FDFBDEFDB665AD56C70744A2D2153F1CC23E927CBD78568292CE1993B7205BC0783EFECB8B3B3C70FB7138050B5CB64001FF924627A219BFC3B467740F62F94847304AF81A8D8FC7752E40868A50F977B22AF37411971AC8F7FFB956669AF0747371075479DBF4431C50C2BAA08A6BB763E2C81335F9D095F4AAF9E76C841461C5A2C67698EF36FCBBD4E78CDC45643CCC79C291B96F338BB365C37B3BF32C64FDEFAC37CAE1FDB949A5F26EA3626305D1FBE7A8424DF624BC9D5FB22711B5DF438403316962CE07D8439196FD53575EB8B405E826AE2E6F85BE88F3E -sk = 31BEDA3462627F601CBC56F3DDF4424E1529C04737EF0EF2AF6D7401F653B8A1812083BFA3B670E3EAF9B443702FB6DB16AC1197656BBD61A8E25ED523B8D1E5D2331859E2A7B4F3F9858D9D97F7C703C0E1706227AAA182687BB5FE51FE72CA158C4263AC370CF176570CAB238A3B8F029EA62E965A00F49EBD9F8577B941E14BA57D8307173F3E526191694A81A25A87332BC44A488C6156EFE40593CE23387EC7BEE5B6617AE9A3AC4000314CFB47A4B52F2582176C74F64EBB6ED24DE7F66ECBB5E76015F92A90D5D318FF1DD442E28D45FAAFB0065636CEDD488DB8346AD39CF56616890FF71178415A050BDA4147270EC989402CA1A21A83492889F6A668BE6E723C00E7E038C1733FFB7ACE332C730BB287898AC6F8BAE8223854FBC2F1501864F23F947218BAABFF0BF2D4044CC52CCEA2D8B97A211F031D87A0AA11B99BC612BB7513575884A04E79C946A3CB1FCD35560EDD3045F7702BD230926951FE7EDA9F131193E824E9591B04DB227F9F16F85DD9EB645A5A9BF68E6A76DD350FC854FF1A29F29D323ABD5CD4A380A688F2907B8CB78FB223C4BD881C9765427612FD8827856FDFBDEFDB665AD56C70744A2D2153F1CC23E927CBD78568292CE1993B7205BC0783EFECB8B3B3C70FB7138050B5CB64001FF924627A219BFC3B467740F62F94847304AF81A8D8FC7752E40868A50F977B22AF37411971AC8F7FFB956669AF0747371075479DBF4431C50C2BAA08A6BB763E2C81335F9D095F4AAF9E76C841461C5A2C67698EF36FCBBD4E78CDC45643CCC79C291B96F338BB365C37B3BF32C64FDEFAC37CAE1FDB949A5F26EA3626305D1FBE7A8424DF624BC9D5FB22711B5DF438403316962CE07D8439196FD53575EB8B405E826AE2E6F85BE88F3E -ct = 6DBE96281D66F1995502F15926640875E7CEE6228FA219B14D74C7641FC599AC305ED53D74AAC134A8846E05059C9A2918BFD6E7FA6E970E1E83609726B3B19B0FD676AB7F9099222A0A75DCE6C4711B3E6142F9CF6E8611B0ADAB1213133D8E72B8D32D51E0F307D1AD720737CC8DFE4AF5D24C0716C8E1DDEB695165DFDFC0ECDAAAC32A9A9160CEEF450EA473C911479457C0A1FD0E5CA30E4A31DFBF0AC28C020419D23C2186FB2A7B8AF5F10632827ECE4389F8534B0AE4A4443BF730BD243ADC63205E7FDDBC36DDDA1115CC829ADA03F157026435C636A3AF109338403E44D8FDEFDBE5ACC269FF8202F142BD48BD9F7019156F532CF22B0740339542E757248E7D616D1CED4632D8A5F8B3791E9D303B5C9A7CCB933F0B8A6D3FAB10B5BB36DD43F4A37B0C04A1EC6DA2BA58077670C815249527ABDF75A067479969B817ADDDA75ED9EBC537E9C55346BA981CDD5DAD7A0327B60570D39B98883FDC8EAD3BD88992C14E8E4AE0D2268CDE8F1FBCA9077956113DAEA6D9B0163D8FF843240CB3DC37DC62D8200BC42D2652A04BF91D1F263CDC8B5FA7EB63D912F837727BD926CC35011E2285E83B71EABCD0381CBFC392901F11EE34F130D273A660D85EE3D26A452288A6F290B7349FD62748D7E09AF25AC8292CA71BB52EDB53D3D1034E76201FB44F4970109E1460B80F10F62FC52DEF366DF24FD2C2E41376CE5C83B83E0EF55D4EADAAFB3F187B4785877B591697612506FD634709A7E1B38C66598477AC1134866F1DDB2D008F747FB55D97570D1D7D09C36203CEF2607BE3715BE72FD13DF384C6056846C7380BDCE7B4F245 -ss = 5313944F9D23D149C82725924F10941F841755A508DBF62D937BA7B5AB6C2F19 - -count = 12 -seed = DB00120937570D62331F4C3F19A10465231EFF46465CDEE336A0D46AA1E7493DF80F18617F9FFD0476CF7784A403EF4F -pk = E486F95A900785251E9701A98CE265F8DADF0CB4F278779F1A3EE5189F6725E22B63BBF50F83C4B028A49115C7B9C8AE21E06D4E4752318B7E9D3C951C0FF5B5378CD2FE2B1E3607233E0F78B4C6AE795B7B2EE27A940DA53513D006BE57403998E257880757419506778F7BD6C2E1657BC59408D15D70570E82F5F2ACB1652D64DAA68353803CAFA569297260C80D2709A6179C1220AF98D26F1A6498DA56784B112A8FF05B58881D8F17B9D50808E3F4B35DCC86F95B75D397C66A9C19A51083ACBA34FD6D21C5B871B89357015077E0DDA34DD6331235F162860EB4FCBD11ECC8AE23D50626EEEFB53BC220923F180ED3DC6271FADE8FABE5A057E1C6E01DFD421EB166C1D4571853C5CD40C39C753A08B9074D3F8A824C4B53BC48D661B03D34582389257B5F198680F73F5B7F8350F765990BB490E8FF800944388B187BDDB35DDE70493E873493085F446B0D87368A0F8BBAF9D9EBF42370927339068BBB7C0555C47C894DA5659EB7D6D3DB5E7F5F3AEE2BDD432D6969D8E8FC6720CBC5CD956DDAF4EB7E1C4A6E777F6CFFB4E4742C71B25B82A36A6F978DD8CE8A8EC2757ED17521E38215C71DB6159235F83BFEA2693F1A12F5A7D1E6516E8D4E18D275F7DA27626C2896D620E49F2767ABB56FA98C2C051130E42ACBCEE8860E05991E25CF865B55ACED4535EF74ACB6BE8BD104A5F8396B998885BF1738B042BB61F3D14433084944A21DF135013F00ED02B0699C03924FDB027F3B38B9269252E1044E09B529582DB86F4993589BB916447C063F -sk = CBDFF028766D558AF4466EF14043A1A9CF765F7748C63CC09DCEB59AB39A4E4D8E9A30597E4B52FFA87A54B83C91D12A5E9C2CD90FCAC2C11B3A348240411A4C555A3DEF09A64C09E9EB370293203E03E486F95A900785251E9701A98CE265F8DADF0CB4F278779F1A3EE5189F6725E22B63BBF50F83C4B028A49115C7B9C8AE21E06D4E4752318B7E9D3C951C0FF5B5378CD2FE2B1E3607233E0F78B4C6AE795B7B2EE27A940DA53513D006BE57403998E257880757419506778F7BD6C2E1657BC59408D15D70570E82F5F2ACB1652D64DAA68353803CAFA569297260C80D2709A6179C1220AF98D26F1A6498DA56784B112A8FF05B58881D8F17B9D50808E3F4B35DCC86F95B75D397C66A9C19A51083ACBA34FD6D21C5B871B89357015077E0DDA34DD6331235F162860EB4FCBD11ECC8AE23D50626EEEFB53BC220923F180ED3DC6271FADE8FABE5A057E1C6E01DFD421EB166C1D4571853C5CD40C39C753A08B9074D3F8A824C4B53BC48D661B03D34582389257B5F198680F73F5B7F8350F765990BB490E8FF800944388B187BDDB35DDE70493E873493085F446B0D87368A0F8BBAF9D9EBF42370927339068BBB7C0555C47C894DA5659EB7D6D3DB5E7F5F3AEE2BDD432D6969D8E8FC6720CBC5CD956DDAF4EB7E1C4A6E777F6CFFB4E4742C71B25B82A36A6F978DD8CE8A8EC2757ED17521E38215C71DB6159235F83BFEA2693F1A12F5A7D1E6516E8D4E18D275F7DA27626C2896D620E49F2767ABB56FA98C2C051130E42ACBCEE8860E05991E25CF865B55ACED4535EF74ACB6BE8BD104A5F8396B998885BF1738B042BB61F3D14433084944A21DF135013F00ED02B0699C03924FDB027F3B38B9269252E1044E09B529582DB86F4993589BB916447C063F -ct = 06A4254ECD625472935428F20886535A261AC3278760F234033AD2D1C6FA509680C34C0560F4A34B979BDB611B55B4850A2D979CF0B3C87626EC20908162A315D261904C39C5E87651AF92E2771A81C80236D3C30FC333C8545C64CD0437460BEA0E558E43055A6E183D05208FF7AE18EC69220F6585EA9C5EAEBB764A22DC50FE36457793FBB844FC7436D4EE663CA0CECB97215D4D7C89A7CE53073DAEAA0A8B496EEC4F41148EB00E9AAED85BD69CD763B50CC9A7C0B5F4E5BA2DB0625DD9CEC5DE46EB4C2EC829E596F395B1A51CBCEEF2256A84208405648E3B8C1319D2DD25E55BD4CF89D1D5D5F11C025B9EC94A23EA2E702458BD4E1EC5A0EA1620CC7E6F033F72E69112021F9701CDB54987EF40EB211CFE5CD1D4684E6C4583A3E8E30411E4B44941295E1D1B67CB332A86358734E38B53BAFF7F8B8BCBCCCE8E62584DAF92F8ECDF6C2CC72EF897A2DCFF4C5AB0F4C3E026E6EA76E898E46D4F424AC6973DAAB4A7D837AD9115A4371E886FCB6B3BD94FB45DB3A6FD6AF491072DE556774F3D01C600AB91EEE07ABFF7D983F60E76782795FF035D219387089D1A17C1704241373E1BA0B0DFBC057CE3DB4CF1C2C414E76D81CC12D6A6DEB8CC7E5BA041B8B62AEDD88A403B945E96CFE81E219DFEB46E580C5FC9B5684BC73D57A7C0DD442FD3FE2135DABE8B8E7ACBACF05DE15654BB6B1AF6DB46AC039FBB594AD09F9944F66A08B9576B9C58DCBE0BB16EA90D5A5A4084A483869EC2B43B2153A5EE679C0A4E23713E329090F58ED4F29F2A3CCBF17E7C55692AD4ACFEB89B4CF909645DAE5BF0091A9A162B9E1A86C328CA39 -ss = 7961DE81F9C4303484CE85F5EC4128D8C211A7CEE8A3821D5CC391DCBAEBD42F - -count = 13 -seed = BD26C0B9A33E3B9B4C5D7EA32D5BD1FC371015BE163C86F584E49BFD5362C8D8341161CD1308115B2A03B7E5EADDD418 -pk = AF0F2D51A5A0AAA59F619B8F7F0B0436714E31DA4DE0C54352624C536AD59C9B23C95DDEB2DDE00E889936EE8701D4C545E2AA1FBA31B1E5EB71A6BFE3EFDCE0B95F6787EE16FA966011F59CFC9E4851B32293E2B790AE6CD2B85CB4B06F7D231412EF8C045ECEAE9DA7AB62452FAACEB572E3D1DC110A765B59CDE681174C79AB16DD039D9680D1643A8CD24CAB1C5836C67099A2FEC99689E4586C212269A645363E8402FCAECC43F8EDDAB2F5246BF4F481886ED09A7AB7041A19BDE915692FFD1B2F6E99B3F50AF9CBA70CA73673864194E851D5C5AA015E081A79F37D6C1AA514EE8469FDD1AC462E2B3079E080D2FAB8BBCD6EF87D27225C1A0A68C626E21516AAC5B0C1930E2C22EA34F39AF0C9DAE4540E5F88BD9744D5A43EC8BF512DCCF140E3C1936EE45C258451483420B0718D20F0ACA50A3CAE891B61ECE248C86858AA9A6A95FE8868ED4424D17F024D0259E6FBB66B3DDFD0B8AA566AFA27B0BF930ABDBEDEC9F89911FAD5F305A3E6E9D011A2897552B03C67C145D7422D142A0CC643DBD3074D2CDBA0464DDD25E0FF9313654081479BADC15F4FA705B00A372D7BAFCD8BB5BE3BAC4B831CE6A401E92E4ACC4469EBC8B1E008EC3D0FDE202AF0F3B0557B6A1360FF1B803CDDAA10E89FBD9727A4CC5161E17F88923A5E26362BF12C933C3534B0CE54BB4907ADBF08A69E9DD0D388F896BD3A2737C5DDF3B50C8E0EE9BA2B683CA1F969DC3B76514E9271283292BADE432B3AEA0D7D2E50012B392722C1900023279DD988F06763EA0F17 -sk = 4C04310BEA66305C6CA8BA6B8F61CA96257A67663AFC11761F13FB5C7B324B6B8AEC87A9A79204CEE2986867A2906EB851B734B8B22B91D6749B1A5F07C44E3B8F1862A59F55A7C0859D28B7F2A8E703AF0F2D51A5A0AAA59F619B8F7F0B0436714E31DA4DE0C54352624C536AD59C9B23C95DDEB2DDE00E889936EE8701D4C545E2AA1FBA31B1E5EB71A6BFE3EFDCE0B95F6787EE16FA966011F59CFC9E4851B32293E2B790AE6CD2B85CB4B06F7D231412EF8C045ECEAE9DA7AB62452FAACEB572E3D1DC110A765B59CDE681174C79AB16DD039D9680D1643A8CD24CAB1C5836C67099A2FEC99689E4586C212269A645363E8402FCAECC43F8EDDAB2F5246BF4F481886ED09A7AB7041A19BDE915692FFD1B2F6E99B3F50AF9CBA70CA73673864194E851D5C5AA015E081A79F37D6C1AA514EE8469FDD1AC462E2B3079E080D2FAB8BBCD6EF87D27225C1A0A68C626E21516AAC5B0C1930E2C22EA34F39AF0C9DAE4540E5F88BD9744D5A43EC8BF512DCCF140E3C1936EE45C258451483420B0718D20F0ACA50A3CAE891B61ECE248C86858AA9A6A95FE8868ED4424D17F024D0259E6FBB66B3DDFD0B8AA566AFA27B0BF930ABDBEDEC9F89911FAD5F305A3E6E9D011A2897552B03C67C145D7422D142A0CC643DBD3074D2CDBA0464DDD25E0FF9313654081479BADC15F4FA705B00A372D7BAFCD8BB5BE3BAC4B831CE6A401E92E4ACC4469EBC8B1E008EC3D0FDE202AF0F3B0557B6A1360FF1B803CDDAA10E89FBD9727A4CC5161E17F88923A5E26362BF12C933C3534B0CE54BB4907ADBF08A69E9DD0D388F896BD3A2737C5DDF3B50C8E0EE9BA2B683CA1F969DC3B76514E9271283292BADE432B3AEA0D7D2E50012B392722C1900023279DD988F06763EA0F17 -ct = CE3F1D6629D7BDA4A70719AB3B49B70D0F1BBA52F373D0F0A817D5CAAB92FD71A8A6A636E62F4ABC4A7B5B327F34AA639E4792D967A6376B1E1002C57B716533783FC6A5937D691006E6D8452BDDE93819E72C56292F97D84E525505D535B583A49B2A8E02DB132B432A6E2C17ECEC1CE070145B0AB6DC899FAE618CBF12E57F8F5EE82A067CCC47F63D0A5BBD313C92894AA31CA6CF83336DBA3BEF74A014452D98C9BE8D2475944879CAD774E4A4809706CE53DADE449AF63F653F659914E354EE0452172412AA7E872D72394CF7D8ACA0A12ACDC92F3AEB573AD759E2301C03280B2B313FE779EF3D1863A2DB7590797CE264A08141044EFDF428709DD2EBE6109658E3A4EDFBBCAF8546187E4BAB619531FC7C7DBB53F056E9CA9EBF01114BAFEE3CEC08A4B90AE7CB406D5FD92894675C1BF1FE1A14D31C253CA69D9B0C98A2E62B49F07DFF34A611614AAFBF574DAF3EDD0EA4A2ED6C8838038D1026EC97B09B76E29BE3FE2BAD084EB6CB846CF8CF59A2200CCC5B7A4FD0332E02DFBDEA5539AA03851DD3673688179EC8CFD5114A832F0AFD0D5CAA8BFD8662A612118A2F08C393993B97BFE13B3DD6CE8E609D2568A1192A52C01EE2153C54EC12427B761A8DC2E646111E8A3912537AF3DC1B434FD8B516735A30DE167EF58C40BE29F0970CC75241198B6E9A99FFE65C5E58FC045DD4E9EBAA756E0E45DF94F8977BE6A8D6D0A92483CD62DB5F22FD62C35F09AD21BD09E96166013FCA83BA98D1B813605E61544B90BE1518259B49066313C7E1401CB4D7CA2F6F4680E920F659FEE5AE698280EC29C105EB7822D900F028E3C6A7 -ss = BD7157664183C42F6DE8C8707071C4E731151E9327FAFD536C634207DE2BD4E5 - -count = 14 -seed = E2819EF86853BCA1B9DEE7EE1C1619988964F9A913E635AACF0D96CA6E0300D084329DABD8F149E24176D22757404260 -pk = 6DF986F5E8ADC7F0DE157900ACC1ED39337970897D0D2DE5D1B22D7658C7A4E0C7D6E7ADE1A90E18F4B16C5A536470D19BD9DDF2BFA5E597A34DC469FE4D9FB21306AD00B8FA1237B0F6F2CA2DDAF476EBF0F7F8A066D3A6A91321BA025ADBB417E310D49083D83ECFE1CEE408FDFF7AB94555143001ECF38337D95EF7C5708C66AF4BCB95CAE9E77AE0E8C38B3EB45A55B422CDD732C19B722F2FA19F7F33E5F42F959A1AA7C632AFE463C98774F9F1EF3F25749BE740C81F10865C36F119887ECCC263F2749AA88722ED244EA51B28E0A04B0FF67F519EF9EB90867EE2EDD35960D5DD0A23687CBA1C3B712D72D6D21E8AB4A2E6BD6C6403BD99E3138D298CBFE3ECE1C2281660EC828C6071A417E8AC14289A992505BF8D1A9DC80330B778CA7EACF08C3225A2672FF04673BAD08AFF71B763F9AC1DD852C82A520A942941E120D5CBD84C4F9A233CBBA23083CBC2987DB711586382C642206D3D0656986657EB331443DBD94AC04DA7BFF89B9D160EEE5EC1183BBA2B15276D778F756A1ED572702BAA5A35DB697AC7C5D6BF2D7FE619EED1A9140CF2640407E69F69D99D076F620E389FA7D198DA7CA35CD2B21FD98DCEB5C4DE7A0205DEDAF1AFCFACA456E6B4E1CDEC8539589D58FF2F11515D75E57C2E3A55EBA40EFA13EA948141A796D3B11ED4CD95479066A2C9E94187762C24DE36733CC289894A7B183D206B4F56A86AFE4CDCD93DFDF301E37D59C489663C2952A8A7190CAE7D4CFF853A5AE3FDDA6F3AC7C0284E6C50853AB56A450B19D20923 -sk = 38A0D5F41D7DC1896EFD1B45B0485634CEF149828751B96087A0A6DD81B4D58AA2ACF359556DF4A2ABAEB9DCEE945829BEB71185B4D6BD18B76E5668F253383A0A0A185738805628063B48C2EBE37D016DF986F5E8ADC7F0DE157900ACC1ED39337970897D0D2DE5D1B22D7658C7A4E0C7D6E7ADE1A90E18F4B16C5A536470D19BD9DDF2BFA5E597A34DC469FE4D9FB21306AD00B8FA1237B0F6F2CA2DDAF476EBF0F7F8A066D3A6A91321BA025ADBB417E310D49083D83ECFE1CEE408FDFF7AB94555143001ECF38337D95EF7C5708C66AF4BCB95CAE9E77AE0E8C38B3EB45A55B422CDD732C19B722F2FA19F7F33E5F42F959A1AA7C632AFE463C98774F9F1EF3F25749BE740C81F10865C36F119887ECCC263F2749AA88722ED244EA51B28E0A04B0FF67F519EF9EB90867EE2EDD35960D5DD0A23687CBA1C3B712D72D6D21E8AB4A2E6BD6C6403BD99E3138D298CBFE3ECE1C2281660EC828C6071A417E8AC14289A992505BF8D1A9DC80330B778CA7EACF08C3225A2672FF04673BAD08AFF71B763F9AC1DD852C82A520A942941E120D5CBD84C4F9A233CBBA23083CBC2987DB711586382C642206D3D0656986657EB331443DBD94AC04DA7BFF89B9D160EEE5EC1183BBA2B15276D778F756A1ED572702BAA5A35DB697AC7C5D6BF2D7FE619EED1A9140CF2640407E69F69D99D076F620E389FA7D198DA7CA35CD2B21FD98DCEB5C4DE7A0205DEDAF1AFCFACA456E6B4E1CDEC8539589D58FF2F11515D75E57C2E3A55EBA40EFA13EA948141A796D3B11ED4CD95479066A2C9E94187762C24DE36733CC289894A7B183D206B4F56A86AFE4CDCD93DFDF301E37D59C489663C2952A8A7190CAE7D4CFF853A5AE3FDDA6F3AC7C0284E6C50853AB56A450B19D20923 -ct = CBEF4A9BE4DFA3AAF49DD81722C735B6E50FD3B8844E8D47324EC3CDDC47E8EB510E26711A4A188ED0C803FB3AFE0DF8DCE4CD2E43580FFDD1C048DB24581E4F7045AED1D42FF733BBC3347B95FDF7AC568B658A455AB47D6BCB076D4D07E7940E161DB92505AF3BD49BBDF6FB599759D02890D88236DA21BB7BA20BF4811ABD64DBEFE71405E3DB0B6BB0F51444D7776D86D31B48000B52DA4E3362591804CCB9DB36FB9A34D4AAF1FC8D5741A93576DEB4C07F6B7F384C165187136BD7BF8F8A2688CAA3D43639B76DA0F39A4CA37914948E0504DCB07396ACD7D0297BF7C3FFC0486C36E36DBF21C9EB75FA29382AF796F69B72DA75776B605DA944A72B01F46FA824E498A8CAF1D30E97DFD2038502808077762CF52CC026B29FCD977D391C1C226104C625903C95048842C8D5AB7277BE547F6EB13E25571B8A92C67B4C83F429A78F59F3D04EE983B8C850F358682FC590BE392C996B87A1E93FA495B25525CEB284B986235A4C1CC41F0F43804097EEFD0467341F7E45DBD23F0FF0AEB400C6E2F9504F35DA5005AE9F4BF1A080A9986DDD6477CB753B3A2D1557CD9CFFD360AE99B78FC6A4F465C66A80104A27B4FAD0B1CA49D3E6DEBF7DC31677F1A1DE29C8F1393AE0641AE5E700E5855BBBF10AD3E86D62C6A649B9D9D57AA0AEF171AA6BE37297092FB26469DFC125E528A8F4B5B9A9803F2AF58120C4E17547E067D0756ECC60064C1E7C605F9401EB75A81660515D298C7FC2DE7CF42262B831F691D04A3A614F992D094F1A62E2D846F3630CF26936F4BD17C3BE01E17A81883AB3377ABDF1AE892E745B8A4B0DEFF9F99510 -ss = E52C1D2BEDD3E134DC03578F9D427521121B98F7954E97EE50A752F30D1ED7C4 - -count = 15 -seed = 669C4EF8A051CE201DA65FC4BC34D398EC1F806276FC5D987AD71D93BC12DC8F107B58BE6E8422A0795C88CB9A0E7488 -pk = 9DEBCEFFD1BFE934A2D24AE3BF61EDC788E4617CAF342D5BE9E8995DB446F4ED577A5D873A92A9CCC71D67E149804EAE541CDCAC026F2908BAF0A02BA5117A72789F9BCE83CCCB22F694524E2135E76BFC0BDCA7E6DFCF22F1C51C778867ED35EC84FE21E5C1D387D5CE0EC6FDE303BFAAEB5FA39ED38A746B0F8BE64F12379417002046536E9EB419167042F15A60E5F9D20F64FF17285D650F56E6A9D5F849D05495E05CA20D899BD1277FB998561927C49FD1BB7F8E21A2ADF3632CA033B5DB127B2E50FEF7AC6C4C1B12D8918167D344DDB512ED68C1273F77BB321023A47DDF51EF28239FEA55BE4608476911FF80983FFC468A71211FD61A020D653F106B38B1FB35DBB724B4CC1F2833156A2FA3D1D66E017D9AF5C42C411B0D29782C9840CFF6B738FDE7C3F4E1FC016117351DF9989586E41CEC190D85576790FD4A357830A56AC0B96919298CF0C5F495CE6954BFAA9AF111F9719164ED459ED4F16CDC6F8960B5E9F6023D89B3B4E456F613154D0DE68EC22DDA4098625FF8A92742EFE8F9232125AC4A7A766C844FF3029B83EA9BBF51FC051FAD92C16B9333D0FFFD758E70A8C8C2A37FACC2BDF9A5805330CA762254737F6D7294D2C805DC0D92FE2330DF07C7E60692CF57AC9293A0CAC9ADB22B3E70CF5CB1F5E292CABE763BCE29A98257896539205743C49BFAF3F9C93812907AD1549747AAB10A96E25887E43DE4B3AF5D5175B2CE86AB17739922B965E0422EC0EE4FB3E0B53C38A14E873A2B8C986DA1A2D7F8B479285615D5E2E9A51A -sk = 97B5665676E59E3538EBADAA8CD50DF1F9FDA1502D9894C616A946078E56B621DF05318B5F655EFE36F1B678CF4B875108A18DB2FA312261CAF839F84BD956C55EF849036D6447BEDB6010EE65403B029DEBCEFFD1BFE934A2D24AE3BF61EDC788E4617CAF342D5BE9E8995DB446F4ED577A5D873A92A9CCC71D67E149804EAE541CDCAC026F2908BAF0A02BA5117A72789F9BCE83CCCB22F694524E2135E76BFC0BDCA7E6DFCF22F1C51C778867ED35EC84FE21E5C1D387D5CE0EC6FDE303BFAAEB5FA39ED38A746B0F8BE64F12379417002046536E9EB419167042F15A60E5F9D20F64FF17285D650F56E6A9D5F849D05495E05CA20D899BD1277FB998561927C49FD1BB7F8E21A2ADF3632CA033B5DB127B2E50FEF7AC6C4C1B12D8918167D344DDB512ED68C1273F77BB321023A47DDF51EF28239FEA55BE4608476911FF80983FFC468A71211FD61A020D653F106B38B1FB35DBB724B4CC1F2833156A2FA3D1D66E017D9AF5C42C411B0D29782C9840CFF6B738FDE7C3F4E1FC016117351DF9989586E41CEC190D85576790FD4A357830A56AC0B96919298CF0C5F495CE6954BFAA9AF111F9719164ED459ED4F16CDC6F8960B5E9F6023D89B3B4E456F613154D0DE68EC22DDA4098625FF8A92742EFE8F9232125AC4A7A766C844FF3029B83EA9BBF51FC051FAD92C16B9333D0FFFD758E70A8C8C2A37FACC2BDF9A5805330CA762254737F6D7294D2C805DC0D92FE2330DF07C7E60692CF57AC9293A0CAC9ADB22B3E70CF5CB1F5E292CABE763BCE29A98257896539205743C49BFAF3F9C93812907AD1549747AAB10A96E25887E43DE4B3AF5D5175B2CE86AB17739922B965E0422EC0EE4FB3E0B53C38A14E873A2B8C986DA1A2D7F8B479285615D5E2E9A51A -ct = A8CFBD5F62B4E10A83682BF369C76C262C6F514689D2FCD79D0D598C35BDED17E697A9A373BC4329293687AE43BA0C0C757AE0AF86DF9695EFB2ACD23ED1045F03DE4D95C94AF5D14A2675A5D073248CEE0A3C7758008F9D061BC4869A2058DD26F10CD443E4E90B8CBA66E6241EB065B481A07D94129682C794CB01A2FBD7992519DC1DAA5B161B257C1A7D40D0BB74108D418F14BABB625F416E8A2FF2CAA739D6AF60E08BD2D763D79C7D2C075E30A38BA4DBA581106DAE854447D3038767BD67E2E20A0917179A6003F3318F43CA7B60891E7BD6B462A023DCD09D4B8C3360D102141A0F79EFBDBE07AA6E4DA5C4A56D9580E32F1B634033BCDD861931EC5EEE747779B6113E73D310EBA3F5D69FDE05DD43E5F1E7D12F1EADC61CE8CB60CFE98CA836B3E7D66B63924CB2F96E084FA36C1041BAFDE398DBBE0408C45F01796C39566463DDA78EB6D980674224C1F8299AEE7250E32EEB975D53145875097EDAB942ACAFEA3554928E9C2D3F46569CEB3461128D55166FA2DD3F1CADCAF2977E966D0382661BEEEBA408A90AF33A716B28E3F814A8ABE41208A815360F01E2183A7134F321C8039083B2B3B1A2BD7DF11F7B58524D6D748B2A73ADC0B7F8211C975C3625F0F768F40F0936C38027717AAAC2481E36D989371CF68ABA3FD6E1E2FE4ADED7C920DED0163664DBD85CD73E8C97DA6CE7EA744D833857EB740A79693F63EDE69058428EB3B69DFE9EE00A01C58DCD529284E7C50B382320720A25335730D28C2BF164DAC56B5CB7C2330AD83C3548F163D4DF38E2F19117918FFD83962423B16C23EB536D7F59CA9C4A7AE81933 -ss = ECA5B827963949B33CB9113F7C46F82FBF1B457B50CECF17D436328B9A37D9DB - -count = 16 -seed = 9DEBCCFE818F6B5204DB4EA09C03EC9A19DCF1629C1527685B8A29776BB1DAAEC45F8ABF8F0ADC9A8C8BD6E2DF6D8048 -pk = EAAD1B28CFBD736B988B8CE312D45BF9EAD403612012A232A28041533E49C698FC7727C90D5C7F33E772DD88C54086F492DA1231792A65D79EBA5CE5302976B1E451F19217A2D18C3C76E6A42DD30167B3D52C041539D6924DACDE682D2FE96329C785F54DF4F3821E75E424C8E27EC058F91FA27F0FEFB8A5F666B34A8B050C96833F2BE9C9E892F3C97990D04EA934F7DD04632F5B7C71ABD3720CD61DF1511A4D85C794C33B7BBA49E3FDA965AE4996B61C9CC93F23CF165E7C18E963B54344AF9BAED76FE8C1BD43053A335E453FD6FE2E037CB0C625C5F7D3D27A44D5438010C298586D9AB83C7EDCDA443D1956CC8B2F2E9767EE61D694AB1E6F9A391D363FF87192525341AF252EDD2F028800AA9DE163C30EEC12372EE7D9A9E31E409817F1865F6AAF13EC9EF9C43DA0DECB3186D2EE7A096E2F01FD8E7BE12C12A2D030604527739F0859E79D267CDEDF972F91950AF101408AB68072D76E180478BCD3BE60D4A63680BDB0AF151245F82011B0C922A82495553DDDEDBE3D112116CF9D4717F3C44381C1CAAF1DE147B3C15B6057A9E8824BD5468194B437A09CB04849B385BC0DA69F1AD093BD5312DC8D2EE7246188F62A4579DFB483CF9FD06328236F2B78380E2393602B7ADE11E42185C8175F8052536CD8C089E352C28B40C905B7643E84E464DA3B629B732D6C7B88B05A3669B13961AB60364239323C8140887071B1D780090749DE0E42190C7C4AC8984F97816408DE7BE20FC862E329AD28FDD5FB89AE7537451B2A20BD838E2C36C012 -sk = EF99224A03A85A46EF115474EC5B5D620DA6795D6EFCCA4C9135D19958A9DE62DF7D92DDA83E6B2EF4CCE08C9134563063068A196D7B1A1A13623E48AE12528E90150F7F22A2EFB276D6C4FF6DDAFA02EAAD1B28CFBD736B988B8CE312D45BF9EAD403612012A232A28041533E49C698FC7727C90D5C7F33E772DD88C54086F492DA1231792A65D79EBA5CE5302976B1E451F19217A2D18C3C76E6A42DD30167B3D52C041539D6924DACDE682D2FE96329C785F54DF4F3821E75E424C8E27EC058F91FA27F0FEFB8A5F666B34A8B050C96833F2BE9C9E892F3C97990D04EA934F7DD04632F5B7C71ABD3720CD61DF1511A4D85C794C33B7BBA49E3FDA965AE4996B61C9CC93F23CF165E7C18E963B54344AF9BAED76FE8C1BD43053A335E453FD6FE2E037CB0C625C5F7D3D27A44D5438010C298586D9AB83C7EDCDA443D1956CC8B2F2E9767EE61D694AB1E6F9A391D363FF87192525341AF252EDD2F028800AA9DE163C30EEC12372EE7D9A9E31E409817F1865F6AAF13EC9EF9C43DA0DECB3186D2EE7A096E2F01FD8E7BE12C12A2D030604527739F0859E79D267CDEDF972F91950AF101408AB68072D76E180478BCD3BE60D4A63680BDB0AF151245F82011B0C922A82495553DDDEDBE3D112116CF9D4717F3C44381C1CAAF1DE147B3C15B6057A9E8824BD5468194B437A09CB04849B385BC0DA69F1AD093BD5312DC8D2EE7246188F62A4579DFB483CF9FD06328236F2B78380E2393602B7ADE11E42185C8175F8052536CD8C089E352C28B40C905B7643E84E464DA3B629B732D6C7B88B05A3669B13961AB60364239323C8140887071B1D780090749DE0E42190C7C4AC8984F97816408DE7BE20FC862E329AD28FDD5FB89AE7537451B2A20BD838E2C36C012 -ct = EB5072BA6A89BD298188559BA0A9FC3B57E1B2975811DD289229A1711F0D43EBB8E9A290671CBCAA6E7838503219ED4C23C333E3BA47B975FAD63959BC88BA500728AD4CC1710B61E8EDE5FFA269363A01A6FE58FA9A377FC04CC6C4252C7F166A1A52BDC73E892EEBFA44C221DB67DF9A1169F98DCE31372BBE39D41417DAA5E6716797989EBD5C76D701ECBB8F36DD95266450B472094C3134793EC4D65BA67234D9BE3EB329C23B64F8D627518890CDE983E84A3BD276B3385B1C729723C655279094B0B66F3209DC9F7CA6FD3D18C1698C2EE5E31888CEB41A8AEB722D74B34F770E0C713B460F2CA8682BB267A17188D6A07AE5599159900BD8D615F3BCBA2D60D746EBEF73FC08542AFA491B104AF8B4B50D1EB49A5631DF623457837FD7E1915D4686473D8F3B92094E77F61122FD0B95B38C5A2C857BABE903C35307F504908ED8A20ED011AB5A824FECB0733F80FBEE36E001CEB138DBB731332315201D7E203A5B15A542B5F5A6C31676FDD864ED725986863F6A57AE196CD5ACF8CBBA281BA66807DACEF4D195E36D6E3E173FDF754F043D1D8BEE0D07FB55A045B4C5DC8DC4D42BF2D550B0A8048CDB93C45BD0742064C3D5189D4DD79B9461A83DE45CC3CD2171F23A3C17EF65EE71A9192A4081AD2C7FCD1F4E107602423AA47DA4555F7CC657B8449FFC31BD8B103571E76BBA0F7E72483D73475DE002DFD3E2A3E15592B4E9E908C7FD7B3EFBDD9C6D95FCBC697F44DC8EEB654CC24BD770067D4B42CDD4CBF639805EA40618DA69C7EEFA67C6EC7F4830A210421D17D2427E990CE31DF5DAC44D0C12500131E7B11F7A7504 -ss = AFD8B8D5D0F1AFB1ADE6E9BA85615A1ACAEBCD56C3541E8B50ED409071528791 - -count = 17 -seed = 8098AE7A92C10F707D405F7DEA02C2EFBEF44EFA132BA8AEFE81BD45E543ECEC74F10920AE48A40B0653D63532517F2A -pk = 433D0F9FBBC6418114F0E7A2672847294C915F175FAB00F2AF220BDAD477345C0BFA490E45E10E0B8BE6C7D494D32C68A934C81D1A6A880CD7BFBBCEF7265096C84C3E8EC25C4339DF659726C25DE4CA31D9799A34776EEB134EEF43A46CAE47AD332F28C60CE66C5A22852ED9FF2DEB5931FDC175FE84F4078E6DECE1CFF434BDE317398CB85EEA70BDFC69DEB0B60EB78697B16260595360068691C3320B3D6D5B191112646F211CEED149ADE146066ED904FDA739B1D28F1FDC384B8C6C0C390045893D82288F23FFB4E80DFBCA4807E461726B4DA0F026D577CC3CCE40296CF4E546E70A91B4D0124CF5AD6BC8FBE8B556F7955F16684B598A0A02C900E130C5E1E99C3366B93EB92A3D76372FF1393D941CBC63B9C97D5803032B141FE106FB3D1AD04EF6D8FE49CD059F1AE8FF1AACD32B0034E524D69089E57BE5F8BA9DA70AB7B1155440612865D789BAE822687EB7CAFB51B7C8D6159F95AA53485CD38B8E0F854F681DD1410B516AB159AC5124A070F25731370A71B4504D168B6F25C3F2D1E1526150D3CBE16EFCC41F19D4C4921EA305B388F474F9EB621571D1550F013BB50CD0E96280EA721002BD6543D0041F9EBB7DE4F943D667C238C04C6A853EB4BD925372F336DFF75ED18B89A6FF441FF86BA1817296AE263BC381C86621F2AE6FB8F43183531F26E25C3BAA69013856350514D097211E28E34CA27FD0B6C6D82E8AB824EA10FEE5E8B036728920466386DE8C9BDFF463E043834D8F2055C4B98692F8C1A101CA6962DED9D323FE105F -sk = B12F6FD965EA9C5B947DB80FC60C83D5E232DCA82E7263027C19BD62E5A6FF550F6AA3E88F7FA8A96067F8CDAECEEAC90C2D0B5E277E56E9C405EC9420C302520E0A9CAA76F59A0A6B1638B301A87103433D0F9FBBC6418114F0E7A2672847294C915F175FAB00F2AF220BDAD477345C0BFA490E45E10E0B8BE6C7D494D32C68A934C81D1A6A880CD7BFBBCEF7265096C84C3E8EC25C4339DF659726C25DE4CA31D9799A34776EEB134EEF43A46CAE47AD332F28C60CE66C5A22852ED9FF2DEB5931FDC175FE84F4078E6DECE1CFF434BDE317398CB85EEA70BDFC69DEB0B60EB78697B16260595360068691C3320B3D6D5B191112646F211CEED149ADE146066ED904FDA739B1D28F1FDC384B8C6C0C390045893D82288F23FFB4E80DFBCA4807E461726B4DA0F026D577CC3CCE40296CF4E546E70A91B4D0124CF5AD6BC8FBE8B556F7955F16684B598A0A02C900E130C5E1E99C3366B93EB92A3D76372FF1393D941CBC63B9C97D5803032B141FE106FB3D1AD04EF6D8FE49CD059F1AE8FF1AACD32B0034E524D69089E57BE5F8BA9DA70AB7B1155440612865D789BAE822687EB7CAFB51B7C8D6159F95AA53485CD38B8E0F854F681DD1410B516AB159AC5124A070F25731370A71B4504D168B6F25C3F2D1E1526150D3CBE16EFCC41F19D4C4921EA305B388F474F9EB621571D1550F013BB50CD0E96280EA721002BD6543D0041F9EBB7DE4F943D667C238C04C6A853EB4BD925372F336DFF75ED18B89A6FF441FF86BA1817296AE263BC381C86621F2AE6FB8F43183531F26E25C3BAA69013856350514D097211E28E34CA27FD0B6C6D82E8AB824EA10FEE5E8B036728920466386DE8C9BDFF463E043834D8F2055C4B98692F8C1A101CA6962DED9D323FE105F -ct = 9E3F95DAB5490C57F7097FD2831735FD273AAAD1B0E9886FABC47848637ED3169A8B494B71F2050223FCF2BB51F33CF3357F2AF0576C6943587A7DCAB8D584F699FA2A31462E2C572854C623482F98D5C72D5F92E368FEC396FEDB18ED4A49827B2F69387077F071B4FEB15E7197EE0DB55E8C1D1818A130AEC19423E8223113351D92AD62183E49A2438514E034DA08BDCF1FB6FCB9F96406F5A597A43C1D4D7020167870B46B506DE19CD28912068714F81D6D3B78EEF7D34437000A857A711142D29337E1EA7D6728E493CAAFEE43180C2F44ED365D18A95D0FC3F575F04D132B13EE5D7BEF9A2A8CA8BFFCD295999BF00F066BAE2AB762DF864DD9E8D1B9B78E12EDC449D7C0260487952F74C7C2FEF1437CA633C2276001D5BDD80FF33E9A1E7548237DFC8A00D325F5F5582E68BCA4AF5E13F5F0FBB0F6F5CB71D014666B94B21EC6D19A664CA34B8A57263185C7505A41BCA3E708CD94D36F54F43F4195845154179B3AF05E504BC05EC3290CD5625D27512EA13A5DB9298E502A77C9A3E04C4689E6944577B0A3A3F86A96B54238A589DD0486AB76A6A7B3BEB1FFD5CE76F21FA1B363310AC5F92BB7F913A9609A7162094C36FC8080B93AD56A827638BD1FB93AC893193C329F0861872A68DF099E14993A8425CFCC4EF07A7F671A895201AF2CF8D6C17ADF2E1265C8BAFF619A30263C04292D1DF58FED4C54C1AFE230C2A36BFC3DA2AC76B0BFF2618ED6C366F2513ED29AE908B0022B915F6F643696938E94CB191225D79A3FE34246FC0392AD4C43F9E98E176008AC27DF84AC4F13BED3B673C64D800E24576AED3D88C24C9246 -ss = EC2D4533BF7280BEC229663F6665053B5178A11DD78863CAD12FFC64ABD684B4 - -count = 18 -seed = D5F23808871544E9C1D6EACE2028362B48E225312F77663E9F78CAFEB512B908CD9E25875D61A16EC615F4B8FF826856 -pk = 6B46A039556FC94A95E2FF954AF485D2E39D8F979C10B805632E327793E74A19B04F26E1F90BBBFAFA4A9A9103E1FAF3D2852A739E61F57942B5A5E6F3ACFA6D1831128ADC3844092EF491578E0D7279EA2BF9DC3460E4E0472FEE795B6E05F4050349362AE1D990AB8B8C6BDA1051BC1E4B74CC16D208ADC2CB489402AFEA3D873F5E0CD1B3A44E919BFC6160CFAEA21B2E7A220FA784227756D5A39D12392976F09381E939639E6D9122398A8BAEBBAA13FD748CFD3FC4BDE8451F7225A038412B39D0F62962D75EBCE4FE916DD84342C0022FD5EBAC8F9816F8E354E8A60BF22F9ABC20ABA7B54E97A10C2965B6B2E4D99BA1D57D5AADB2CE89AE9722009ED180723D13F571853DBA243BC01D294E76AF2106B028B0D2CD4FBB0F01FE46BB831A68B6760961CC97BD9056A8AB34533EEA9B8A5A43C656BE39676AF28D0F4B45E5C8D0003861E56C0A2D03D28DD4BB1DE4B9AE1810AB85AB8F8B85EDDF3710101C3F0D4DE5FCFBD8AD92F58EC5A6A60C8A1A4E341058496E69E17C82303A1DF9ED7332F085C57AEA855424E3CAAA5A07A2ADB6468D0D95C44851635AA3B2856B9819EFA939EA9FA8CA52301EE8ED6F575B926906AF3B1687687DC36BCB1C1DBA8174191478D16345BF2E3BF907C6387FADC8F2405E541861D34DF6D8F8776B6099449B2D67BEA295EBDC44515756B514D626B66DFFFCD1A26C78698ADAB840264FAB769969139B2B911E6DB4662D7DDF81A64909FDA762A1333E724E76D41A5225D3DBB0EDC82917C4C8E2928C6314D751903B -sk = 9F52AF92CA165FDC38788F2B59BA02E01C8281FF7C1E60504688043A5FE814B04F3029E1BE4E1C0258C3A22FF5B50B2674CC094BA7018DA2A61569845C17D26F9580704792E5BA2904B75298DD8666036B46A039556FC94A95E2FF954AF485D2E39D8F979C10B805632E327793E74A19B04F26E1F90BBBFAFA4A9A9103E1FAF3D2852A739E61F57942B5A5E6F3ACFA6D1831128ADC3844092EF491578E0D7279EA2BF9DC3460E4E0472FEE795B6E05F4050349362AE1D990AB8B8C6BDA1051BC1E4B74CC16D208ADC2CB489402AFEA3D873F5E0CD1B3A44E919BFC6160CFAEA21B2E7A220FA784227756D5A39D12392976F09381E939639E6D9122398A8BAEBBAA13FD748CFD3FC4BDE8451F7225A038412B39D0F62962D75EBCE4FE916DD84342C0022FD5EBAC8F9816F8E354E8A60BF22F9ABC20ABA7B54E97A10C2965B6B2E4D99BA1D57D5AADB2CE89AE9722009ED180723D13F571853DBA243BC01D294E76AF2106B028B0D2CD4FBB0F01FE46BB831A68B6760961CC97BD9056A8AB34533EEA9B8A5A43C656BE39676AF28D0F4B45E5C8D0003861E56C0A2D03D28DD4BB1DE4B9AE1810AB85AB8F8B85EDDF3710101C3F0D4DE5FCFBD8AD92F58EC5A6A60C8A1A4E341058496E69E17C82303A1DF9ED7332F085C57AEA855424E3CAAA5A07A2ADB6468D0D95C44851635AA3B2856B9819EFA939EA9FA8CA52301EE8ED6F575B926906AF3B1687687DC36BCB1C1DBA8174191478D16345BF2E3BF907C6387FADC8F2405E541861D34DF6D8F8776B6099449B2D67BEA295EBDC44515756B514D626B66DFFFCD1A26C78698ADAB840264FAB769969139B2B911E6DB4662D7DDF81A64909FDA762A1333E724E76D41A5225D3DBB0EDC82917C4C8E2928C6314D751903B -ct = 07AC8DF2B03053C532F4B8FA9058F1CA872C616FEAC135C84AAD4C6D45DBE9FBA0FF786FFB261392EECD3DD92E87D9958B66A3E96C1241022B9625C3C5FC6103218A91522AC881AA98D4D5A3AF205C2526BAA2347637C28CDD0FF6BB9153C59AB7F869C32CE7D552B79DA3191F8B8C7CC52E24A498B0229E65766B95C6FFF6E34E37C48E0C5255224FDF8EF5706B4D68C4433A61EB30A25705E39F9F06F0804E1CD2160D416ED80EB7D755EFE7BE247CAAC4A51532D25F704A477A396380257B466534CA1A9715724F0005190851E2B7644E47E5887AD19718729AE086C36B09BAD826C8DAD8C88B94737091A63099D84826A45F24F94AE04BFDE791BD6C1988409C04A5C7891D4CC7363FB795C0C36907E251B986755CF30B56E0AF1CF921838F35E7F815DB244D2E0C05A458F03290D4154ACBE27AB3EBB0A28854CCC6371F1014FE2329703B9A264F19BC835949277CEDB453C4D31A048F3E5DD97417F6F3FBF3085E9171BCC9562248CA5B9A679F6005AF64F90946260DC25EE5A4C9D68FED7613B413E1F60BB70413A15E75B8EDD0730E1014FB886763CD58084BAC2DB9B97547C96CF6274B5961346F4BE578D631ED88C821034F07BCD781EFB8C2463C11D70F6B0379894731B46485FD093CCBA25E74A9834866533D16272BFA580A62F63D3E0DE1CC982C39270304C8E3393C41ECCFFE703A7896E81249470BD780747F3B3AFD6DECE57A1F5332EF1023F63941EB440C0045E226D0933607919B617414CB4A45781FACAA6631CCCB5B503D85BB00762CCAB158D1E9C214A463DF45732C0AEF3D195ADE2E33C6B0405E9C94F02E042397 -ss = 0D484236F0F718A7383605DD732B0CBD682C860F8899C84683ABAE97DF04BD2C - -count = 19 -seed = 822CB47BE2266E182F34546924D753A5E3369011047E6950B00BC392F8FEC19EA87C26D8021D377DF86DC76C24C5F827 -pk = 8447C5EDC4F5D326E1488C110D373A3594F20A7F56FACDA0BF9A5A7BD192811378B2B313C91A1E8E950D621EEB94FFB01444522FEAC10CDD48242595439F93A455A91716508CB110B67E022BED301FE4CF296E6F2139BC0D66F71CEAF442E0E90BB249DC6689DBB3171D802FD6A15CCFCC2753D998E3D680AE0C4BAA518C366451954F7B3C02ACF852AAA0949818DA2837F9340EA0D54F9245776C24DE782690FB59B3FBF7ABF634B38FBB137A70402F3DA6E52F51E87DC3E44B24038C175BE3AE895A41BDC4DA72D34DF12BBF2291FFFD3C65EB3EF7AA78E64B0274A52414E235BADA773F4418B7CDD710F175BA831C873BEA40318CB5C922D4E2A41E9B23A511E9AFEC2475054FB592EDEC94ECD6E1EE079439EF9D92212E36BD46C63BDD5BFC8CBCA5AD6EC4FF9101AE7A347CECE599A550A2805F973629B2334744E4D16A2A0446C0E4084C34E662F85A6FCC45BEE05BBF194D53A5764EB1D6BBCB1756006B2DEE2722991160773A6BB1DB069E374ED85BD9378E80570A147B0BB71822C84B00AFD932D9933806193EC07F2A0AF21EE403B4AEC02B7910A30B1B47CB5F717E7AC283BFBEB06771827F291AB2BBED20BE3C1962E3A1B398686008567F1A2A2F4419FB6D6EA73C46BA20075D8B39CEFFED51AD8B5F12D00E9035348B9A8B16A3CBF99F21C426F5D61E3FC66A7A466C2D0209D4ED458B1238BD8A34B7685AE5F100AF936BB71F6EA87D9CE51075B79132591A64B2AB068526D8213361B87D081C3AEB43FF75B7196E10090DD3153CF08CEB204B -sk = 851EA90FD3854CBF28FE39FB81F68E4B14345CF0D6EEE7EC4CE772513DF8410D1C0EC046899A777655233E4E1B5CA44E9AFBDC67964BFD5D5E3DBB45E60D03CFD77A9920C166C3AFEACBD5D9792799008447C5EDC4F5D326E1488C110D373A3594F20A7F56FACDA0BF9A5A7BD192811378B2B313C91A1E8E950D621EEB94FFB01444522FEAC10CDD48242595439F93A455A91716508CB110B67E022BED301FE4CF296E6F2139BC0D66F71CEAF442E0E90BB249DC6689DBB3171D802FD6A15CCFCC2753D998E3D680AE0C4BAA518C366451954F7B3C02ACF852AAA0949818DA2837F9340EA0D54F9245776C24DE782690FB59B3FBF7ABF634B38FBB137A70402F3DA6E52F51E87DC3E44B24038C175BE3AE895A41BDC4DA72D34DF12BBF2291FFFD3C65EB3EF7AA78E64B0274A52414E235BADA773F4418B7CDD710F175BA831C873BEA40318CB5C922D4E2A41E9B23A511E9AFEC2475054FB592EDEC94ECD6E1EE079439EF9D92212E36BD46C63BDD5BFC8CBCA5AD6EC4FF9101AE7A347CECE599A550A2805F973629B2334744E4D16A2A0446C0E4084C34E662F85A6FCC45BEE05BBF194D53A5764EB1D6BBCB1756006B2DEE2722991160773A6BB1DB069E374ED85BD9378E80570A147B0BB71822C84B00AFD932D9933806193EC07F2A0AF21EE403B4AEC02B7910A30B1B47CB5F717E7AC283BFBEB06771827F291AB2BBED20BE3C1962E3A1B398686008567F1A2A2F4419FB6D6EA73C46BA20075D8B39CEFFED51AD8B5F12D00E9035348B9A8B16A3CBF99F21C426F5D61E3FC66A7A466C2D0209D4ED458B1238BD8A34B7685AE5F100AF936BB71F6EA87D9CE51075B79132591A64B2AB068526D8213361B87D081C3AEB43FF75B7196E10090DD3153CF08CEB204B -ct = 2761653D18CE6C3006E8D60DE97E18277E1F30F21D77C92D3F52906C52184E21D71A1A97E77A6CA266490C630E969EC164826A053BAC0D2C742730A22D2A5EDA5BE71EF5E81D728847CFE82D9712D852AD9A9207A2B8ED97AAD9119757683DE7D143D51EBDED89C7A56A5C8FE62AD6406F973D30D341F87B65069FC1FCE15AB06984C6586A0A0F9FEF125416F81CDB4A243C61198F79AABD1D5DB476DC7EAA4D5EFC2D6172DD5510BBB1A9310B990AA0E6FA9A9E27A2F5DF06568D254E5F08FBC3D5094ADFE717B16AAE94DBA8307D280A8A520FF8D1B8868B62DCD08FEEC7C05BD278AE7C0BBAB1E74AECC63876BBDE053E316CF720C598DBC1DD74935C293F9B258BA915AD75F7E659638DE572B24F0B9E653ABE6B3B48015396F511518743FF8B07793132D6F8CCCF7D6D440B0B53EB36B183648829138A6EC0830761DDCBC6E18C85D351BA67769B46CAD703F0F74D6A99812BCE78C728F4BE4089496197A9A7EE4A3EE9E4452A4A85C7B3FA3D91F18CC6406687A865C6D183C76B6308E834C72833272DA8353725C50FD83C07D0CB49FF64376404612875FA886DFF3352BBB06B8F99B5E4E7B28374295AC35BCFC8DF428B3A04AEFB46DA8CA8A552EF2FF449FCFB62894E574AC53D1AF62CF1EC21DBF5ECA80C4259E856AC2A40D15CF6035DDC399435AF8055A0B4DCCACB589E957A7D86D1C385BAAF0BB9A1141CD895339CA97020038A413FF96226958224B40FD1EE32550D1D06FA10CB00D11F488029E137EAF5F46B636C534D1DE06EEFE54D8BFC43E07171446FA2873FF690F542291BFBE27C8DF2589A844FFE19F465B626CC74AC -ss = 1C22BEDBBC26C82AF8DCF84F69B8F6DB4877F12C4063098EAF9B3D8E574CDC86 - -count = 20 -seed = 81401DB81138D6874E91B7C11D59596E4ACE543F5A3471B6FB00999221765FEC3CA057ABE20F03B2D59003375FD71FE8 -pk = 2F216187F63E83351EB4E1171D41221B2554262CC70DCD9A75F1FD25357B7668E0FA7B37790B7EE2A2C4049CABD18028B2598FF3EBD8C12DFB8CE52A841C119ACA5DE4A1F784B99234E3A96E4CC4EA87F9DCBF79192A928BA73024CAF4174AA45ED852E40D30CD1DFC63223B7A7FFDDF7B4459D2495DF40AF064BEAA8348655011D0D8CA8E8923BDBF658014DFB0F5C38E498174E083BE5EBCE6B4F774F09534C19099B6028AF759314F951E0510B51841DC7B081BB6E5A516F6971B1F3E050816481701160E039DE6B44CBCDD4BE62E28BAAF96DE6224AEA62B8A6E71785B6F2F946CDE549F50BD98AC4FBF2B45D617134C699C79DD2E80B0766DB0C1BBFA22ABF8F639E83462E7CC1E039F9672EEE047C1055FA066A69CE11018B3B3587F26AED1B299A32B7736541F4974EEDBC4D6303A86D9DFFA492104E63E1EAAE7AC1E4077DD0202DED8F3B9FB3AFD0AC7D64572C39F280DE9110C3A625631CB0B52FE428F71D09C67D1BD0456E05BAE18594220E91534B0096A1C39C0AE52E4DB2B552D8C3EA91C0A3A9B285D9D5057FD4FCC6ABF44A12825F1F4C7EDE64E858F908CDF1184D12A7370112464963C20DF47EA1416392A81334B453F815F53C780C0B5D500C8740E3DDD8D447D24BB6BFCE261823EE211FC43E783B89D97D45A84223860E212E07E45623DD4F55723FB227A478BE998797B14B09BD5FA255E960BCBFB0111EA0E59E4E958BBC6AD67A2DAB873F648C05B3FF32FE2DE7F92AC2424CC8B17334F513F6E1598B94114DDB17DFE41F5D91F3B -sk = D304C9389CC973477F169788ABCB9D511F843219D246A9B587822F422A70C2386590A2E5C7ED86CF2C5C2A898662BC9A81418720BBB632EF9CF0B845ED052D73AFACA1DF98112891F60E2BC740C99E012F216187F63E83351EB4E1171D41221B2554262CC70DCD9A75F1FD25357B7668E0FA7B37790B7EE2A2C4049CABD18028B2598FF3EBD8C12DFB8CE52A841C119ACA5DE4A1F784B99234E3A96E4CC4EA87F9DCBF79192A928BA73024CAF4174AA45ED852E40D30CD1DFC63223B7A7FFDDF7B4459D2495DF40AF064BEAA8348655011D0D8CA8E8923BDBF658014DFB0F5C38E498174E083BE5EBCE6B4F774F09534C19099B6028AF759314F951E0510B51841DC7B081BB6E5A516F6971B1F3E050816481701160E039DE6B44CBCDD4BE62E28BAAF96DE6224AEA62B8A6E71785B6F2F946CDE549F50BD98AC4FBF2B45D617134C699C79DD2E80B0766DB0C1BBFA22ABF8F639E83462E7CC1E039F9672EEE047C1055FA066A69CE11018B3B3587F26AED1B299A32B7736541F4974EEDBC4D6303A86D9DFFA492104E63E1EAAE7AC1E4077DD0202DED8F3B9FB3AFD0AC7D64572C39F280DE9110C3A625631CB0B52FE428F71D09C67D1BD0456E05BAE18594220E91534B0096A1C39C0AE52E4DB2B552D8C3EA91C0A3A9B285D9D5057FD4FCC6ABF44A12825F1F4C7EDE64E858F908CDF1184D12A7370112464963C20DF47EA1416392A81334B453F815F53C780C0B5D500C8740E3DDD8D447D24BB6BFCE261823EE211FC43E783B89D97D45A84223860E212E07E45623DD4F55723FB227A478BE998797B14B09BD5FA255E960BCBFB0111EA0E59E4E958BBC6AD67A2DAB873F648C05B3FF32FE2DE7F92AC2424CC8B17334F513F6E1598B94114DDB17DFE41F5D91F3B -ct = 24E6B35B6467F07DBA70F013B61F235400EDCB76FD24C4889FFCA2EF2B048611A0326F1E11777599E27645703024D311CD1CC3E90AFD1D8DE333B321CF2DAFF3862BBB94AE2C05579B38D105EED9CD38DEB4B1CD441ADC29AC8E25268E542C3CBFCAE2F79CECA19AE543D81A2955507E1001CDE8B2AAD49AFBC177333F29FC9FA2CFFA4F277F9DEF7A8483F75EFFC09013A79F81DE87AF538F63DFEF8987E147CA5DD6865354C2F23D920AD303CF315F2E881405590996825E08C968B76C2DFA36089C3F3008C3090E7D4B6E518E3D9731AE99714497D29818A442BB56EE7B6EF0774C26C6B06AA92C868683F046237D9FDFF5A8A1FFD08477A91A82360A86D06AE537241B4526779D78B7563D20FC9F16539A2894EFC2F5D621038C71E7DE3EF8F9BECC7DF0204C93ADC4606A3878D7BDEE8A15C0D1058CC5ED391F146F41F87BD6126ECD6577323883C948DCE3083A110411DA7121E53507EA1103071AE9B5DD0014AE48E8A0CC714B9740E43BCA8BB13B00229072912F87E88BF44CD2343FE8E787772BFCDB8D81E25E423828981BC51C80A8975B7D993D11FB4126D96C312ED75FE77FFF521599E839CDC5B6858FF66A5510C027563169D3BD9C8BFB66E13ADA61DA5983E4F6CE00038F07B189635FE5F1EACD43C0FB18907DE6621565040297672502829FAD6AED578AF8A8B948343229DC4E916BD9668F68574AACBBD56BFB85A6948042D68A88F9FEDA91370A2497CBEBB8CEC04F808E706596135BFB88C6C5C041C62C03C6676789FF734D43C1897B277F50397955C06610A67308B9CD13B138AF4C400EF0E4B4C892010B51E3A842D1 -ss = 901E8EED2324D6571E0940041B4243A8771F0C72208EFAB0B7DA51E57387C5AE - -count = 21 -seed = 30B5DE5B73681EC08AAA03F6F2D2169525D25F4042A5E3695A20A52CA54927B85F8BB948FC21DF7DEFC3910B28674994 -pk = B70C1B535C4947E61B10DF795170263CFA724A41415E32E674721843421682E6E307891BB03C5BCBCCDE460EABFDF5E56E3F7CBF21807982BA4CC1685482CF36DB9D85F709831D8D186293F2380677E2B5825D59ED21CCF2BCC16A8576357FA519A9A2B51C0F98CA80E7506EA33C439C2E3D0C91084D04F0171528C85B500857DD40DFF4BBF891E1E1CFC8A25E6CD46F9BC9AA2B9D087A1013D45065CDE85DAB2CD5655F3A2C94E4BE790193AA51CCC72FBF0DD7D60E3B2F7578F314A5D5B719F76BFB2E5FC2AA0C68D78294B90652A478F9F0BEDCC2A04488AECB671823BA4FAE5AD39E61A49EBFF194B84A12C87FCDD2A653F0BB1925705F4AED332A32C723F50B523BBF1D945218B32E2BC6D61350AA67261F9401683FE2612918872021E819D284BC319E449187405793EBE8CF88A96CF00E1E02A9B5C33C2AB0BF0AA97FBF826296E3DBFCD34F4BF803257FFA274FFD99C97001E0AA19251389C050A1AE922ADCDB6B472D854B5E05FB53BC520A8B0EDB1C4599C245FCC08400891F1A713A4FD545FD594A90E7F2978405C743C2C975A757DBC144911A9F5F530E2B8E0FA014282C0B4E83BC8C77C4D3A768856CA6D1F9C8F4361A7024902EF414B39979D81434765894E56C9D36810812B9DC8E26C3000B86150E3E6F0B0586DD21734A1F0F15A7B952296579F58445A95E1309C4F5386DA4B0C6141ABC57495B3DE0F083147F265C8050302E57AD4447D12388A5B0766034CBB1B4B9DD5F8A32C303DBF8DBE5E540C7D79760D309B27EA178C33403364E -sk = 89A6E3BE304A3518FB82B18CA730F0B359CD6BA90664A493FB4F8EDAF965B9C3B6591121E25D64010C25A18676033E1D7278AC5F2D0B43A31F3A4156AE7104656018DC349AC67563849A29C50DB66103B70C1B535C4947E61B10DF795170263CFA724A41415E32E674721843421682E6E307891BB03C5BCBCCDE460EABFDF5E56E3F7CBF21807982BA4CC1685482CF36DB9D85F709831D8D186293F2380677E2B5825D59ED21CCF2BCC16A8576357FA519A9A2B51C0F98CA80E7506EA33C439C2E3D0C91084D04F0171528C85B500857DD40DFF4BBF891E1E1CFC8A25E6CD46F9BC9AA2B9D087A1013D45065CDE85DAB2CD5655F3A2C94E4BE790193AA51CCC72FBF0DD7D60E3B2F7578F314A5D5B719F76BFB2E5FC2AA0C68D78294B90652A478F9F0BEDCC2A04488AECB671823BA4FAE5AD39E61A49EBFF194B84A12C87FCDD2A653F0BB1925705F4AED332A32C723F50B523BBF1D945218B32E2BC6D61350AA67261F9401683FE2612918872021E819D284BC319E449187405793EBE8CF88A96CF00E1E02A9B5C33C2AB0BF0AA97FBF826296E3DBFCD34F4BF803257FFA274FFD99C97001E0AA19251389C050A1AE922ADCDB6B472D854B5E05FB53BC520A8B0EDB1C4599C245FCC08400891F1A713A4FD545FD594A90E7F2978405C743C2C975A757DBC144911A9F5F530E2B8E0FA014282C0B4E83BC8C77C4D3A768856CA6D1F9C8F4361A7024902EF414B39979D81434765894E56C9D36810812B9DC8E26C3000B86150E3E6F0B0586DD21734A1F0F15A7B952296579F58445A95E1309C4F5386DA4B0C6141ABC57495B3DE0F083147F265C8050302E57AD4447D12388A5B0766034CBB1B4B9DD5F8A32C303DBF8DBE5E540C7D79760D309B27EA178C33403364E -ct = D496757BDA1B8F2DE60F21C40B267BC4E0EC7A03111EC445B0BB45BAD2D8F9851DA4A833267038998C34CCA57480466A7CF6D67F9A2744550FC8DA3E9C04656C9F7E52ACA8E884EFAB51E7E3A3A5444A99AB3531BAA7C5A89FF2C701E145BC1F957F3FF99DF06A4F24E63E1A9E0A2A6169CEDFE2E94E51E0316E1813A11D1AE020BDB660B4B2D747096EAD1833893BB62BDB09463B72F46BE42552A9336533E2A5A7E91AC9EF04B69AA5E799E1C4C634EEF62C52265DD75E7450C26C56F9BA0F43B7BF46CFD06A138DC67480B11400F6D4632B61D3E0C6335D8F5C6B3C584526802D590EC013816FE9B4DFDC6157044E9D87410E0DDC8F88355A9161C10A5ACF64F3D6783FB94E1C596138EC6D4991F8D8BA1E1DD31CF83AA43E4E5940563CBDB72CA88EAC813780887936C8CA483FF95D5B6F193C9C8144052838BD4656B0FF01CE23BBE87E30EC3A5079F7076E4035FD84B183D8AB52C295FD9BA161950F3BAE15313A7602088E5392250B8FCDC2034BED93F2E4FC7266E26AAE2425F62C3F16D22A0A97055EC3C0171753F6F60F225E09D1CF6281331B495FE056E64D607A69DC69D946581C38640706C5F77AD7DA0ED54F1476E98CA00945C4445583427E44736470E3E4BEE42BA09E58A1D159ADF176B8878B6A00B04D96085474CA4C14FDD3A9138E11A89CA6D37F925FDC309696D8874367682CFE7446BF74380785C45FDEF7DD49035710CA079193DA8D5B0575B682A7B98A97C031DC2F5BB4FAF53E15EC90875F11E55D27DAB32A690FBC681751D02693ABFDAE43F75CA3ECB9717447C0724B0146B3602E2C07CA9264DE1388BC6893 -ss = 54173A3AF286B4F253B6DD8F013F0C025A03C2086E236594D98B0F4FDFF1F178 - -count = 22 -seed = E335DF8FC0D890588C3E305AC92C7160FF199E07C85760A828933750E3FED8C83B0DBE802234481ECF890A32D7A2884F -pk = 663260B7BE72AD45FA145B2F800E335387868F11802DEB2BCF452F551E7221C1981EEA05F09EA89356001E8FDF27A982E37267D8314E3758364DBEE963AC04B2860C79A9B5BEAFEF5AB4D03109EACD60A24189F94D7AA09EA544FDCD4069E3797001CA8BABB6EB03D08A7872445803411A818A83A3B7A144AC90462C0C27D88D69129CDCC291E48FEA29AC4F6B15C389DE7F183830DD077F082E2F1DB5C9B1904C42DC112146E2A73F7FF97D524A67B5936445B07625D37914353840768BBBFDFBEC0C7A1B657BD397AB1D954C0BE0D5CF8FC512CA79FC68A5CADFD52DDCBC463535750B2D83567E39D36CFD3F113B3D989D7B0A10162A78479CBBBE53F97E16CEAD383B08DA76FDD1F323FE44C63E48AD9D654D45C556E5E4325AEECB8C2769E40CE22AC0A4E612DBA0F349BF1CB00075228133EB5C5AD49295FEEE084BFF26FA55BEB8D35721E9EDA48BC5CADC9E69D1EBB6B1180152ECAFDB0804F234601E7FCCF8125C44608133277C2FF89257622EAB9183D891DB134DEEFFEFEEEE1632742D74CA0674609960C6429BBA4A252F0D42A7C49F8E737AB70F7ED310E38218ABD3D5F40228FE2B9BF97257601AD4F9E9A323CE1ED07F66A32B9013D4504B910E5D4729FAA8727A12C07FDB831864A15FF45F72D33D58C6CAF0CA6C45E6889FA1F52A5051CC2480674CC9B94231AB874D48D0576011F4AB8EBFC81AE15347F23CCDF13B4F9712C90C7F7F73EA72FAA19369C927F89796460BC479AF52B725E7D01C22E5D428F0C2B062874BA1650262D0090E48 -sk = D569B935CE015C85F792F8F7FB0D83C4F53B492959361DD4F75FB764D656450176EAE84D11C4528382828F7A689A0D5CFF87B8CA0BBA97FEACB39B935A8788CBD0C65DDFB25BCBA0941A944F63BDDB00663260B7BE72AD45FA145B2F800E335387868F11802DEB2BCF452F551E7221C1981EEA05F09EA89356001E8FDF27A982E37267D8314E3758364DBEE963AC04B2860C79A9B5BEAFEF5AB4D03109EACD60A24189F94D7AA09EA544FDCD4069E3797001CA8BABB6EB03D08A7872445803411A818A83A3B7A144AC90462C0C27D88D69129CDCC291E48FEA29AC4F6B15C389DE7F183830DD077F082E2F1DB5C9B1904C42DC112146E2A73F7FF97D524A67B5936445B07625D37914353840768BBBFDFBEC0C7A1B657BD397AB1D954C0BE0D5CF8FC512CA79FC68A5CADFD52DDCBC463535750B2D83567E39D36CFD3F113B3D989D7B0A10162A78479CBBBE53F97E16CEAD383B08DA76FDD1F323FE44C63E48AD9D654D45C556E5E4325AEECB8C2769E40CE22AC0A4E612DBA0F349BF1CB00075228133EB5C5AD49295FEEE084BFF26FA55BEB8D35721E9EDA48BC5CADC9E69D1EBB6B1180152ECAFDB0804F234601E7FCCF8125C44608133277C2FF89257622EAB9183D891DB134DEEFFEFEEEE1632742D74CA0674609960C6429BBA4A252F0D42A7C49F8E737AB70F7ED310E38218ABD3D5F40228FE2B9BF97257601AD4F9E9A323CE1ED07F66A32B9013D4504B910E5D4729FAA8727A12C07FDB831864A15FF45F72D33D58C6CAF0CA6C45E6889FA1F52A5051CC2480674CC9B94231AB874D48D0576011F4AB8EBFC81AE15347F23CCDF13B4F9712C90C7F7F73EA72FAA19369C927F89796460BC479AF52B725E7D01C22E5D428F0C2B062874BA1650262D0090E48 -ct = 0EAFD981806416DDB6A763494C23818A09161A1A574198C41AB29214BD8F05C326C36CE5C31349642455B89BD9746AD64F26897E0F37E1642F96AADDEFE2233E4E480C4EA298B97AA1CDE5505C2E7E03C85477C339CF48D62AFE7998FD0842CEAC3F41FE954B18865157BB0B8150AAD2352AD4B83010F091EEDAF2F8B51CE36DDEBF3B381675E163CD28D5D46FBC53B1F3DF4CE170175CD3EFB7B4D8E58A275E042AB27D6572CDB0D8468779ADDA864BEE789C4F5618E398D70EE8416C6A0CF7D22C534D5E616BC0345C66C12A3AB7A6369FC2F060BC049772751F3051A6056FAF117DA3FDF3FFEFE5542AEAE310524EC825FFE5347D05EA4B1F33C37FE21CE05A46C2CE690E4A76D615778B79E7B0AF564D8096875245C2F90F74B9B7588B6780FFF5F6CEA84CF9B1DD9D8FBF5DD469543ABF8CDC5B4E862074CC5C90E0686A319D2E6AC76F58E540ADFF3CC9A316F7A904D70134F9F0C0385BACEB55A0A09540138130B0271931899B8608B85B1ED7B2C7D083B546432FC1FBCEC28076D566284D4F94896BF5B2A3C44F1D878CFE6771DCE6BC3DCE33D3FAD4ABE55ED9A353C4E5D14F077F3CFAEBF5FC2C64FD70B1A6E4FDB69377FEBD8B36A75949181BB3DCF738DFC3EAADF583BA81174896AF3183CDAF1E714DF1D5691DD84D0CB8E22B865BF336E67C58C4AD129CBBBCDBAC42EC86C23BDE1E1AE2A6558B9A213B88EC5F97AAAEB978768F99037A700C9A5D8DA5173518B5F951D7B954A344CA17DE58F1A919D251B45FA41AC5201917E553F2E802223CB55FFCB662D4586E9D2A37E31A629665857C09ED53174D0C864BD2B4AE3B12C4 -ss = A9562321DF5970375856AAF0BC0416202AA3D570E4495ABD5061483519091D6D - -count = 23 -seed = FBEA1BC2C379F4F8FDCB0DE260D31CDB064C9EA9B1D6DFBE91B3692ADD1D34DEC9C9FFAE7BF5E72ED2743BA3F9F2E43D -pk = B44C351990310EE5ECEDBAC6D1A6A5DC01DF5A1C9C7ADF9EFF5E8515760414D33AF07925C86F9026B2E1332BCC3D4C4FB2B493ABED5AF35BB683FA97D6F86DE2AEAB800CF2F4DBBFBE029DB6BB56C1104A1F8BD1F06FEDECFFA05C749E5B01146EBD335A6C16B5E9420FA621233DF6F27AEC7FE2CE418F8882EEAAC70263A75EC579CE31C4579DEF56E03C94C0887DCF9429DB6B866C3058B47DEB34C62FFC28D32C189F31AA620AE82FFB1038D5B8E499DA89EFB97C233AB0721F5E04D4E6EB030FD8501C63C93F2AEB1DFBB9B7D06FAD8436564DB022BED3D9C1E1EDC62E0ED1AA3A84582B8219CC77217C592A3DF1C031CA0F64731F9B96B62DECE8FB659228A52D6375E2EDEEBD884E45410273A2DBBCE6B60F543B57D663EE65787EF04EFCF182DBD4AEED5F82A99D7DFF7B22C1D3C8D4BCD54B75107ADFEB6FF4DDB1E1C38907836E1F65A5F46D40F161B78BAB03BAE4B557C42BBF3B4462FEAE3DBFFE4122A4B44F98DA92EF9ECA2474343D0DD5F1E241EFFB3049E7C2C812335ECC83613BDC558380E1BA70C56167C2ACEAA7474716FF0507BBE50CF9B5093B146FFD0AE6F8EF2107AA2A1F5E575633C156ED90B543235CF739174E2695246EB6B1BC21E8345ECD621134188EA4830B020CD02900804D152619A64248490039EF34668E37ED14C4978B751BAD878AE073C038B290B8844CA5DAD395A4CC07218CCC6A8879BA96C55D5C42A77C4213B019294B5DF43E70E58F0AD41BFC4F1A34E3B53DED4905B98ADEE24B71C02FC06828B283D981A217 -sk = 5CBB141C2763425C274F7404FE530D9116E08C33F9F200A20B011CF563A28990FC9EBBE336DC464489861DB8253606971BD0A9008A433ED17752D0402378155291D745C4BB3A03D40D4A65330CFDAB00B44C351990310EE5ECEDBAC6D1A6A5DC01DF5A1C9C7ADF9EFF5E8515760414D33AF07925C86F9026B2E1332BCC3D4C4FB2B493ABED5AF35BB683FA97D6F86DE2AEAB800CF2F4DBBFBE029DB6BB56C1104A1F8BD1F06FEDECFFA05C749E5B01146EBD335A6C16B5E9420FA621233DF6F27AEC7FE2CE418F8882EEAAC70263A75EC579CE31C4579DEF56E03C94C0887DCF9429DB6B866C3058B47DEB34C62FFC28D32C189F31AA620AE82FFB1038D5B8E499DA89EFB97C233AB0721F5E04D4E6EB030FD8501C63C93F2AEB1DFBB9B7D06FAD8436564DB022BED3D9C1E1EDC62E0ED1AA3A84582B8219CC77217C592A3DF1C031CA0F64731F9B96B62DECE8FB659228A52D6375E2EDEEBD884E45410273A2DBBCE6B60F543B57D663EE65787EF04EFCF182DBD4AEED5F82A99D7DFF7B22C1D3C8D4BCD54B75107ADFEB6FF4DDB1E1C38907836E1F65A5F46D40F161B78BAB03BAE4B557C42BBF3B4462FEAE3DBFFE4122A4B44F98DA92EF9ECA2474343D0DD5F1E241EFFB3049E7C2C812335ECC83613BDC558380E1BA70C56167C2ACEAA7474716FF0507BBE50CF9B5093B146FFD0AE6F8EF2107AA2A1F5E575633C156ED90B543235CF739174E2695246EB6B1BC21E8345ECD621134188EA4830B020CD02900804D152619A64248490039EF34668E37ED14C4978B751BAD878AE073C038B290B8844CA5DAD395A4CC07218CCC6A8879BA96C55D5C42A77C4213B019294B5DF43E70E58F0AD41BFC4F1A34E3B53DED4905B98ADEE24B71C02FC06828B283D981A217 -ct = 5D3F6095089C663CD768FD9E87B01EE43D5EF58CF01B40F89B67C48C7CB00E06B478F89E21516AFD991D4A2432DC1AA3671AC02C7822096074FF11F7EC136DDF0836BA0FEC5DAF45164E6935ECF4DC2DEB34BF9440730F895D14D269D41AF3F6E11BAE275B269C91BA0A19729BA818D0A56F62BDC864831714C74896512C84B2ED1604AF659C4F4A28B794CF3AA87514F3C90DE6638B77EEAA546033D07E51D40E4110B51B1D937BE98F691FF67BF629EBFD3AB5C16A73DFBD0E900905F380074024EA645DC26248F6134783C07FEA1E255343E2137FB1882F46A5151B1E2D92BDB2D376087AF69BD7B81E3961D2EC7383A2FCE01AC280B00BBD8C4B90A5C5810BA455E7B5413320E23AD2507F7E8582056DAC625B88E19B933C1028E9F56C36C2ACBE741FEE7F8CD2B93AA72020127BCC15F56EB8B56234070837F2312C942EA0A51E11057E91B196EBF060DFE54E8044EC123A1E6F41147A136CAE6F99C8A305D9E81301AF4430EF1B31788034DFFC927A36B307C8A3021D8FB7DF182D9D94EF2908DB4CFAD8BA313C165631BC6C698D0CF724554A47CDCD11BF51ABE8C64051B5D3266A7582C485051237AD06EDD725FF0EF7771C17A77844CA0E4B0E2767254DE01DC974BDAB4B6DFDB15D16ED30FA7A3E418C1BBB6DED280BEE7FDADE46093F90FCA261F97FB14BC73B396B8E48A15EA22A021434B11A093B94808278F1B726617198B8B78846D9AA376ADD45509E25EC3D05AA515BAE8692B8AA9BE9EFAC3320E1EF102FE276C73F4BAAEBC51672B4B7127295E961F7321685715FB8621D6E5C39FF8DA37570CAEADD4F39403ACDA09873 -ss = F48295BD40FB0E919907CD0BA11405B9ACC83E48E5151754E8960B8E67B62350 - -count = 24 -seed = 7E87FB886BC3C7C9FC12569F465D2ECD12532E76CC27C65644C8D3DD603B0CB2D036C5974E675058F271D5C82AD7A813 -pk = 5A4EEC7C08E6C55D7F3A7B2D50164091FE12B13AEB0850887D72AA84EC239122BE28EAA6C17C7DE0F48E9F9E36E63BB3ED7A3FDFD2906F6578FBD2B622B6B5F1DC8F717C2B32DDDDC553472E5DF71051F31512F82ED947475B2AE2CF0967BBB2E3239B24CA4D3905753182E2599332600881D9F1A8D03C0878F90D8B44F8C7C06986B666B36CE0DB1900F756711637381B00275EC70163A78E3197BDE22C24B01936D49FBCC1D2505CC77C0C6B72F2808EC451F062C8E8D15AF8476E7BC4631B481064753DCF5838089C172F3BE1EAE6CDCBDBABC7C0AF95524C0451A1E5062A0557C124C06421669D54DA24425804026E7690293EC4DCBA416AB7D89BA50843BB0FDA6133A90C7018C5FB105D6BF082B4ABAE28C61E97D4E10CC139374016574FC0576F7C8E85A4643C20D7BE91ED6AE2136472808307AD75B588074A7F065ADEFCD1CF70C3D53F07A6E478BF92A513D4383B8EF0B43B4A814C44887ADB7E09C4B895B4FFE54B3053A5A29535F42F37F33B77DCFFDE292E57F6B89BA9B1845DD9CF88A96AE34DE09996A5C28E93D84A4C74C6380280AF7F35B2F7ADCD78A1A1DB254C1DF63BC934E681D8590B76D6855A51DE92F1C11BE712ADB9C6BE1C6879639D1FC78CA27D794BF3B05D212769488B7CEE6F54580875EA8DA413B8B41F9EBD4D901AD46A0DDB57FA1ADED4A8EA46D454284D995506D5B752F00F427835B27132D22D4FF93CCE02BC990BA383CF4E47FE6DFEB6412C61594000A0A4D40E073EA4E23419DEA3759ACC82429D3456AD65C5BA24 -sk = 293ABB6D1C207927945417CF84883EF010823E11B487ED55239E466E83696D0CFF8563038AAD865A817CAB9CE98846BA75BE9363718ECF5FEA538AEA90B2A558FF5DCFF670AB5482D6734C622BDB0E035A4EEC7C08E6C55D7F3A7B2D50164091FE12B13AEB0850887D72AA84EC239122BE28EAA6C17C7DE0F48E9F9E36E63BB3ED7A3FDFD2906F6578FBD2B622B6B5F1DC8F717C2B32DDDDC553472E5DF71051F31512F82ED947475B2AE2CF0967BBB2E3239B24CA4D3905753182E2599332600881D9F1A8D03C0878F90D8B44F8C7C06986B666B36CE0DB1900F756711637381B00275EC70163A78E3197BDE22C24B01936D49FBCC1D2505CC77C0C6B72F2808EC451F062C8E8D15AF8476E7BC4631B481064753DCF5838089C172F3BE1EAE6CDCBDBABC7C0AF95524C0451A1E5062A0557C124C06421669D54DA24425804026E7690293EC4DCBA416AB7D89BA50843BB0FDA6133A90C7018C5FB105D6BF082B4ABAE28C61E97D4E10CC139374016574FC0576F7C8E85A4643C20D7BE91ED6AE2136472808307AD75B588074A7F065ADEFCD1CF70C3D53F07A6E478BF92A513D4383B8EF0B43B4A814C44887ADB7E09C4B895B4FFE54B3053A5A29535F42F37F33B77DCFFDE292E57F6B89BA9B1845DD9CF88A96AE34DE09996A5C28E93D84A4C74C6380280AF7F35B2F7ADCD78A1A1DB254C1DF63BC934E681D8590B76D6855A51DE92F1C11BE712ADB9C6BE1C6879639D1FC78CA27D794BF3B05D212769488B7CEE6F54580875EA8DA413B8B41F9EBD4D901AD46A0DDB57FA1ADED4A8EA46D454284D995506D5B752F00F427835B27132D22D4FF93CCE02BC990BA383CF4E47FE6DFEB6412C61594000A0A4D40E073EA4E23419DEA3759ACC82429D3456AD65C5BA24 -ct = 4B1CD69E09BAD8C50E39EC393ECA8012E195B9EB5E4C39A0DB4887D5029F12D2F6EE334D5C39713346578F8F08FA0CE8F9343A94AD8970878F1C0F4625DA8DDA9C96D04397C7FB1F27C933806211CD4EA9E3EC1F30D53295A1B8789CDC116962EA7E72221F89AEF3BEC0B3D243DFE4E0144B0930AF35320D749E480BB50B40BD0AEF888F795B90D0EEEC3855989812CF608D5D4A56DB16F282FB11C9DA44EB281F84B622C4D75B9C490BBD14DB5CFB93078B1A23F6CDD12D2FB70D006D0B94B30568459656ACD6998BD9179246FD2FE544BDC19C72375E02531BFCF78498ACDF665F3BF67F698C004A749BB645B645932D85E9805694CD4A22B4FAC2541FA653508BA12DC6FE2B380671AAAAD355496E5B864ADB2E6FE465BC01E4D503E31FF9B32B20ACF1710D392171A1EA47B549DA2EE6A0555EC39A62941B5AEEA21457F3FE78C8E9DA722CBE7259796C403E2E73D7DBD721316B2A6C2825BF5126ABB588D23EB3A27FD72BD4C067F78EEB9D8EC5DC1F6A3B617AFC534E3533C82B11FE5A05D4419ABDD6D2C997D48764DED9B01A78B8D70D2C8E6D611304FB4AE4D8E2CC280380E818B26CDC804927FF6326EF397C8BD47CE8D0ABCEE650990BA4B9835406244CBBBB52FFDE0890111C34B5AF7A7DAA0E724E3B276B47DEC046BDBF5A4C75C3E0A09A80E46A9F03551F92898608FF46A678D183D428B6FA546C56A3F7919E0D84533BBCFA5F72522558DB12A3CE322D0BAF6FB44B6910D19A517B7C9E2D1813F00DF8ADAC95162CB44F6F5B48AF0A954521A6705B505188409AA76624DD6226CEDF3687AB35CDD91A26F6336C38498B09AF -ss = 28F8E24C2F07FF65E730AD254594D812BE3E5F2F1C70CF77542B084A8FBF9535 - -count = 25 -seed = AD1424E804F306C7FF513DA4C1E8D445AFCA7BC942FAC5C0B335733AAF70693712ECBDE26EA726EE0F9FD9D52A83B1A4 -pk = C0CCA24B8A8C6256DC1BC41FC92DBF1B188B1975D39702A5999F3738EB97EAABFDA9A4FFC18A9656405E4232E2E226A133A9129E0D8010D4DE0B373C6286528F305571109D898DC9E03C978DC95466076754A80DE2967B708369FA3907243B32C79127E41E20DDA5380DBD14BF26813D5B3E80D1009B304E7BD901E0AA3E17E09F8F2E21A7095F9BC07CAAC305CDF89DCCBC50A55A30952AED77DD1175648318D180D4B623777A0E7F5AF486BD315F728CEC92C50AD030BC0496264D2E9BFFC2026413A3C120EF43C70C432E3EB7D0A567E766D21AA6D325F431E060CD419110EEBAA157AF0479B5C9DF1B3EDBF773C24E383019B8FA76A2EA018CAF390C21C379DDB058440146F989A50933CFEBBF5ED487313719F7D5F0286D34D55C953A08D957482253E4E44ABD3B8748F28F2409C6DBD032A28A17C3E5A81998387684804EA64625B6D514E7C87109A4BAA29B2DFD456170956D16B01C25A5F63658C57ABA6C9950C89DDF7F22CF922E14FDFAF5E0D7F6ED4D88E515492A82E85CFE881B95A22F5C8F6DB5B0E9464279DACD0C1B1F0E67AD17752675E5D68F398CD1FACE3C4FEFBE1AC6DD1AAADAF6F006BC0FBD00E23893BAF397C3E66DA18A9D57F7DCB25F929326D2D23F5277F2A8E71FE3648C739CB0A162AAD21810E7E86230D166941CDC73AA6804F15DD2268BE9C623455BEE7B06623C9917E68C4F0E1504C8379AEE8339617752DFFF3542E724AC08728796A2728B7DA41A1DFE30D1C4BFE5D4984FB008641F299ABCAEC46E9418181A1FE6146C -sk = 74D87C7556F2671F2D666854A4D6E073E69F35421E6E1A428CCCEA49C37F972CE1FB7456AC0AA1B97068F452CBA64EBDC138BCF5D36B0A0FADA2A3B374141EB99850E03CA7F436DEDA9D54E13BBA0203C0CCA24B8A8C6256DC1BC41FC92DBF1B188B1975D39702A5999F3738EB97EAABFDA9A4FFC18A9656405E4232E2E226A133A9129E0D8010D4DE0B373C6286528F305571109D898DC9E03C978DC95466076754A80DE2967B708369FA3907243B32C79127E41E20DDA5380DBD14BF26813D5B3E80D1009B304E7BD901E0AA3E17E09F8F2E21A7095F9BC07CAAC305CDF89DCCBC50A55A30952AED77DD1175648318D180D4B623777A0E7F5AF486BD315F728CEC92C50AD030BC0496264D2E9BFFC2026413A3C120EF43C70C432E3EB7D0A567E766D21AA6D325F431E060CD419110EEBAA157AF0479B5C9DF1B3EDBF773C24E383019B8FA76A2EA018CAF390C21C379DDB058440146F989A50933CFEBBF5ED487313719F7D5F0286D34D55C953A08D957482253E4E44ABD3B8748F28F2409C6DBD032A28A17C3E5A81998387684804EA64625B6D514E7C87109A4BAA29B2DFD456170956D16B01C25A5F63658C57ABA6C9950C89DDF7F22CF922E14FDFAF5E0D7F6ED4D88E515492A82E85CFE881B95A22F5C8F6DB5B0E9464279DACD0C1B1F0E67AD17752675E5D68F398CD1FACE3C4FEFBE1AC6DD1AAADAF6F006BC0FBD00E23893BAF397C3E66DA18A9D57F7DCB25F929326D2D23F5277F2A8E71FE3648C739CB0A162AAD21810E7E86230D166941CDC73AA6804F15DD2268BE9C623455BEE7B06623C9917E68C4F0E1504C8379AEE8339617752DFFF3542E724AC08728796A2728B7DA41A1DFE30D1C4BFE5D4984FB008641F299ABCAEC46E9418181A1FE6146C -ct = C5DF201D60832116DC496AC6A7A191ADF890387F9F5FFA09E7A24F25B2EEA7AFCB4C9B44DEBE99394D5C05A6CF2A055806715069510F50D27CDFE5C047C4B923CCA68D83D5FD907CD2B13052E3310BB732782E0BA431957A29DBFD61F76A7CABE3D1BE342D2546B0618A52602E8923B6786AA2273B8CD6909B66E47163D63B9E2E1DD7B4B870CAC52B3EF9C311A17314F45CA70D40A29E3F8F2741EAAE462B130F1341B98D661B8AE24D53BC34401475F4763E08349E349298FAC22368961A8C2A3110C48B3440A3875196048B8E1E23F3DD3AF05A804141A9BBA449EB405BBF743433B059BF87132DB01B117497A2EACDA0FA1423422938292CD6F2F495CA791B27C238AB1466CBC6B652699BF37717B6100DA210CCD196305C81B044880DCFAA48ED2A0A5103EC384B6194C1A018E3DF8293C29B4091455455838545E852F3A11000CFEB2B8184804F075FE5BA605C69A6DCBC681F3FC2221C29E034C6125D6AD5A2C80F0554AA6D10626B37ABDF904765A31DAF59CF100C2052F4D389F2688A9499362A8E0A514823CC924ABFF917B1595E6419121BA4364BD07EF478127411ADD1B04803F3B055F19DD6783C9E9BD3FC369286658087585228BE68A8FCFBDBDDBFE65E4A9F3D95811AB58401243585325C3F132DF14A5B4816FC31E927B9D975357C9F927C7B117B5149B516A750105167FE97A2DA620C9F97A92033C39DA82A7745973E38171BA41EB83B32C787695A9EF889EC5FD41359A6BC0FFB942D16941170DE5EF37033FCC4D1F8BDD95EFF7C096F66DB31E05EE1E4047205129E0733344D5440BC571FB559377DC6B0BB566CF142 -ss = 68575A048C1E588D59F7BFD9CDA877D3CA23B93D35A51E9D07920859334AA036 - -count = 26 -seed = 7C33CA0E987226C8524DD56C811FA4D1CCF9995B1E4E4DD5B1481974E88CFABFBF6787775C2611CEFB27ED4403EA9B46 -pk = F5EAE45EEE5080570636B25B9A0BAD3FE2C66637A08DBDD6FC0D6877521F16F2C50698DFA67DA94D1A036F53ABE59AEEF7ECAC46ACD26AEA31C55515C1BAA7CC774D0789C4AB3EDD8546B29176E79FD33CDEB31A809A98114A924631E013BA239B4A35DDC01CA37AD78EB2856884EB79B33E2395F20E8664CF9D6ADE47E6ABBED67EAA4360929D11DF18B98AB2749F9AEF11B1408AA3EFFD73064879C246D0F4D19DE7C6161C1A444AB06D48BDF4D8B22A6B06F7F0E76D4E78C4CB64AFD6B6166D3B85E651A877342BB55E728FE899852C1C38F39553205739F303D2A55C228AD74054115D4F48F71AC9B2F044F0488406ADB9C0C71214C41E66B0C4D1FFD648FABFBFD1BF399A63904CCD446668DAECD0CB4A76BF6167C8B849EFDD41CA2D49824B74EB5BE28571615AD270DF81A01AAEC4F0CEE4C241392A1A45FD071345371C91D64D7E33C22CF3BA3157304686032F6096735899EEBE5172A1B2FC4401E58511458DB04E46F0822297D1FC163DC5D1240212CFEDB76BD6D5187DB27E3E2FB0022868EDC7657985277C8B48E51BB6C0D32D4A08DF40744C361FA92EAD1000DBA9C6EDE727AE78A08E3DE2315B5714111486C453ED9B5677CFAFFE726AC20E100C29AFFDF5334C72CC0F60686A35BF6D2BDFB0FF38B001A572805610233E193ED8492CE38D047CA1055AAD385FEE63F415FF6437CF70B81C8AC7E792C738C2358C474361EF6445388B6B955C5552ABE867E3956B0343D456D7C36C3B23A0D9C43292E1D306BFC34907F13AA4ED045028B0E260 -sk = 013BAB0212D04ECD54B478DAF72748003A25E2CB060BA6CC50BF95C292B8206B9DA0C5DA5F195B80FBB99C2E8B06926074F3F604B3F6195B5A5B9737876BBA72D4C62F5E42E737D461B40043E6C8A800F5EAE45EEE5080570636B25B9A0BAD3FE2C66637A08DBDD6FC0D6877521F16F2C50698DFA67DA94D1A036F53ABE59AEEF7ECAC46ACD26AEA31C55515C1BAA7CC774D0789C4AB3EDD8546B29176E79FD33CDEB31A809A98114A924631E013BA239B4A35DDC01CA37AD78EB2856884EB79B33E2395F20E8664CF9D6ADE47E6ABBED67EAA4360929D11DF18B98AB2749F9AEF11B1408AA3EFFD73064879C246D0F4D19DE7C6161C1A444AB06D48BDF4D8B22A6B06F7F0E76D4E78C4CB64AFD6B6166D3B85E651A877342BB55E728FE899852C1C38F39553205739F303D2A55C228AD74054115D4F48F71AC9B2F044F0488406ADB9C0C71214C41E66B0C4D1FFD648FABFBFD1BF399A63904CCD446668DAECD0CB4A76BF6167C8B849EFDD41CA2D49824B74EB5BE28571615AD270DF81A01AAEC4F0CEE4C241392A1A45FD071345371C91D64D7E33C22CF3BA3157304686032F6096735899EEBE5172A1B2FC4401E58511458DB04E46F0822297D1FC163DC5D1240212CFEDB76BD6D5187DB27E3E2FB0022868EDC7657985277C8B48E51BB6C0D32D4A08DF40744C361FA92EAD1000DBA9C6EDE727AE78A08E3DE2315B5714111486C453ED9B5677CFAFFE726AC20E100C29AFFDF5334C72CC0F60686A35BF6D2BDFB0FF38B001A572805610233E193ED8492CE38D047CA1055AAD385FEE63F415FF6437CF70B81C8AC7E792C738C2358C474361EF6445388B6B955C5552ABE867E3956B0343D456D7C36C3B23A0D9C43292E1D306BFC34907F13AA4ED045028B0E260 -ct = 53B8C4C6E1E780AB81F9FA581FED8F5E1584EA6DB40BFEDA8B021DCEBA806A110700918D1B334C1E61834CAC574F4FB9D71B1BFA489571A7EC0FDEB0039AF66494447F69A1100A828C3CAD38B9DA73AFF070023DD6C937BDEBD091286F5B13103C6416B77869EFE7D17CD3A9BCC09C210D959AF33604EF4537E34585052B2D192C5CEADD243C101C5F18818F54B45FAA3D75184DAB2BBEBA7F034DB3549FF47180541D91BA4212919138118A6DAF7F588D3E5D7AEE0F65EB87C83428F8BB810C7DB931D2D701F69DCB97512344BE4291E8051519DF2A678ACBC36D288D53B4123C18674B1505A123C5B49CE713E50E238A011248A67B3D034E189C7B2158CE4454E53F18673C74A972DA2EE18C508D19A9F5F09467F373A6D45C4844BB1910B54C3D8CCD43B6F89DA423FBCA2C87821B7D0E312AFA0D1FFFF59B34CB089E4B83236AB3F3348AB599E587FEF91E9DEA3842A60E55D8EA05E5BE617B00F40D7F32AB301BB07A65534AF8517ACFA4255B79279E72B417F7D71BF4ACBFAEE1A51FDAB0364B5644E652BFBA8565DBBA194EB3D2864EF5493F997FC96561C1ED6B8CEA6E03C8CCA6814017D55789738EC4551D00ED5E3DC9F6A64A238AC1A54480636E1B4AECB7CE0DA7328371B264B3B8F34BF8B1E53D055A926C4D86EC18774911F595C840F8E45CCA462DEBEC01E33E1F996E80419C165FB7164424D9B9B3C17843724DFC6A991A5AE3888A1BB4FD4D3DD87E911D49F83260E791D3BC42856942EDA482A97FD47BFF6F947B10A1880F210BE48A912BD54A85702A7225136950DD752E3D13ED87801B36370D749F527C56FCD9939778 -ss = A7E213A4F0A8DDEDEFB8028BA3573D1BA53051317E6D8E8C84FB1329F639FBC7 - -count = 27 -seed = 54770EA1252EA2857D6635151194F5F520ADEA8A41E409FF498D40C271359858FE2B084D5B96BEE087B8E8F4DD4E00C5 -pk = C9041DB1B76291A9412F1A96905CCC237FCF519DECE511CBFD98567EA8F310A676F9FB2AE1434B6E20D82B63CEE309D3315D35D48CBA901108506681B5FD9528B26DFE72D75B3AA14C16026395AE13DEB767ED105323F0133E3786D7F75326A83209D4F2A77C8EAE85C0413A5FDC07B9434A70637CD7BB97AB6FA646B4AD66FBC0989419E101E744CF8D580278E9CD280AF221B4FA48C6E651A8D6B46A8D827A9E69E71C210916725D05D29EFD1884599548A9A7F2F20EA35E019743EA31CDA24D1A6325A537B941C4D4D236E19A3591E7D903A136D8BE502B69351E7387B3FC5060D3C42C5AF9FA64D2EA91C1ACC41A1DC779928AC5EB3847CF884A9C707F0500EDCA4518B7AD7667FE3BDFDC3C3552165042F5F58A41D2D25C3B37EADAC7BF504BC19E7B737FDECCF18AAEF8CD7403954372EB741C2520D074B5FBD925D535C7EBAC5AAFD61306513E3E3B4B34B1DF1045A130361C4E3DFDD71FAE184F82ADAFE3C245C818159F11EEA3F3CEB7FCB50C2606211DC33511D819B7A50C631018EC9C9DEACBE64D59E22DA8AE52694008DB9A2DCC91402DFFCA41BD9080C784ADFC4E7AC2D6C95D502F97E8F74C38E9DF71284997F535ADC7DD17739BE535085C73AF7A3E652B977FABB72F64592AD7C932BC3428C10DB4B13F809A7961962A798FC6ACC2860F9D739BC0B78A8000ABFC55C60A801997793051649F83E768642B236588B4823F1BA27A3C81A8058E14D470842D0358B0C432512681AAB67FCE081037631F4E0BA40CC308C42FFC8D772A2D4F5E04 -sk = CCB073C4B90BE0AD746E26FB093B60C70110BD1DCBCDDB566A8CFFB7B3CAF80E71600A8982C350DF524CDE514431DED7AEC23576530894BCBF0EC0BFEF0BB64F8CCD7F321635F438F55A1BBA934FEC02C9041DB1B76291A9412F1A96905CCC237FCF519DECE511CBFD98567EA8F310A676F9FB2AE1434B6E20D82B63CEE309D3315D35D48CBA901108506681B5FD9528B26DFE72D75B3AA14C16026395AE13DEB767ED105323F0133E3786D7F75326A83209D4F2A77C8EAE85C0413A5FDC07B9434A70637CD7BB97AB6FA646B4AD66FBC0989419E101E744CF8D580278E9CD280AF221B4FA48C6E651A8D6B46A8D827A9E69E71C210916725D05D29EFD1884599548A9A7F2F20EA35E019743EA31CDA24D1A6325A537B941C4D4D236E19A3591E7D903A136D8BE502B69351E7387B3FC5060D3C42C5AF9FA64D2EA91C1ACC41A1DC779928AC5EB3847CF884A9C707F0500EDCA4518B7AD7667FE3BDFDC3C3552165042F5F58A41D2D25C3B37EADAC7BF504BC19E7B737FDECCF18AAEF8CD7403954372EB741C2520D074B5FBD925D535C7EBAC5AAFD61306513E3E3B4B34B1DF1045A130361C4E3DFDD71FAE184F82ADAFE3C245C818159F11EEA3F3CEB7FCB50C2606211DC33511D819B7A50C631018EC9C9DEACBE64D59E22DA8AE52694008DB9A2DCC91402DFFCA41BD9080C784ADFC4E7AC2D6C95D502F97E8F74C38E9DF71284997F535ADC7DD17739BE535085C73AF7A3E652B977FABB72F64592AD7C932BC3428C10DB4B13F809A7961962A798FC6ACC2860F9D739BC0B78A8000ABFC55C60A801997793051649F83E768642B236588B4823F1BA27A3C81A8058E14D470842D0358B0C432512681AAB67FCE081037631F4E0BA40CC308C42FFC8D772A2D4F5E04 -ct = 61334FA8CEF3D3BAF4E30CA17A4EB3D0338272D2034B539A494961CC802D42627C20E6241DF091A2F941B5FACD2A83E7D82A2664D4B4BD738C69AB7127373FEA4DE18BB6DD9E9AB327D62BA22C0D610329D6B011114F4105231D6E58DC4CD9BBA048F0489B04FE02F95C978E114C5514F1C8314C946564E6722972D4406E5135AA75DE815547F8C0E1BB22E1376549F61B0A5B4A6CA86A305CD7D300396F155E0172E4676D40F2F51D9D7CBB383E59C478475BEF97A4F3393609551D0B1B63A1A3862428B22A0A1C08D0DC5A9E0E29CAD7D06B48F418FFDBCAAF5684D430489945F8E572C3F66E58169DDD6023D8132ABDF304B96C94B6F58E2B22B90C418A6635ACAB695CE3B3E815731D9819FC1EAAB5E3997C00335FDF104DE13C8F085FC169A8047699618C2430F353183B1743B64A712EEF92816DDE4E9CE6F1E39162A2B83C2B4403AA504EE26957FD9A01A3BE98E95FA3CF84C858522C270BB05CBC421F5DF71089937C1F8F57A2DD0D83AC83E54C060A9CB2E819CE62E4B0434634B6020529CCC589030DE9848F7B92A4BDABDEF110109802F416FF95F4CBF201CE8079F1C4A8FAB7998D93F7A66D595A89FBA6B09DDC52838626E5C849ED954D53B10A488416517BE2F33DDEE8456D0B833B68009A86283424F9CC04E278AF9239340E328C5DE1D9C11AA9A4266A749A8081475655C687FAB74C318B0FAC0C340DE760EFE4B4327AD52AE928B7379172C7E607612086C8530E09B967CC0259FC9300B13921D2D37D48A5D8C2485B478D812A08F34C2DFED8E25A4480BC343AA5F58F45698F16FA7581558579B9D6E38DAE2717332532 -ss = 51DB4F6AD943370717E83479F265C1A3456334002DFFF6F52CC07BE5462772F5 - -count = 28 -seed = CD6CFE94E9C0A1CC4FFDCD2D7876504BE5F50F1D1CA5CF93482943465B268276056F2781F4DE805C138976CA72621387 -pk = CA8676FA2967729E49DB43D3A7CFE53C515D00B756F7F99D7F4E4021BA35F7DB1802C439F477A747CC4E2CB0DFF94B514F6F13F1B756DF218088F79416357256C5B43E21B521B2E679E11A20D487892CC821C5823CE7A978D6A307B6C33D8C9C50198DFC7B7175EA9779134DEAF25CD4F91EF9C721B0B21D51731FD46985009075B54EA5E7614F296A7DA87B6D1D6EBF2E23E452F89918233D08D5D0C7CCAD927B1DD0578D24E8DB2F4C6145CEB5EBEC9ECD2D75F22A2C2C591CC55160270481AE622BF2AB193B30C07417A02AB7DEF719BC4A9388B19CEBDD622C9DAD90FCC9C9C5D73E9038E6A48BB76DE7CCCC061D7480CD17FD0A5C5AFA71BEDB5CB97EA4A0F8FAD6F371AD12169BBCBBD9ACF6F4CC8135F5A54BDA93C616C6B09D73F4914C669350D8885E58A9C766608B24A246DC9C7C3CEB39BFA70EF20D75AB446A37F0A71E9C53D4FC78D41E7823A94B775F4AD66A200744F9660C85821E1CDA6AB07386578477C531D90FA5148967E2EBF1B51844553EEFF1006BA2CD045A64DBE93A06810699BED01A07001934F62E66383DE7008714218A4C29AC56FC45B6C104B054468FAE594C570BBC076D93F98F463716FF5D7475B9E69EDF1540BCE1ED58D8AA2992D0695FE8B07A4053B9087B4A5A7E1ABA9D4B1DF426349952FB5381E083F4B24A8A4D9401F7CD233F3645CECCF43361938202241141E8CD5F3CFA72DA990D90EC7237EC2AD18A44E051A2E1F146AF5B238AD4867574523664EF60D90477E963D97C0EEAF8482E83C709048F572CD90031 -sk = 2E889F44E28901E9AC7CA6B2FFFCB124C8979401B17064D7E1D51A7E3C3ADBFA0E145E44AAE52CFC609E6F47FD7A6F6AF877190FF52256D0AC5B05B89C3F449F48E7A944F02FA15EAF23A543AFAEFC03CA8676FA2967729E49DB43D3A7CFE53C515D00B756F7F99D7F4E4021BA35F7DB1802C439F477A747CC4E2CB0DFF94B514F6F13F1B756DF218088F79416357256C5B43E21B521B2E679E11A20D487892CC821C5823CE7A978D6A307B6C33D8C9C50198DFC7B7175EA9779134DEAF25CD4F91EF9C721B0B21D51731FD46985009075B54EA5E7614F296A7DA87B6D1D6EBF2E23E452F89918233D08D5D0C7CCAD927B1DD0578D24E8DB2F4C6145CEB5EBEC9ECD2D75F22A2C2C591CC55160270481AE622BF2AB193B30C07417A02AB7DEF719BC4A9388B19CEBDD622C9DAD90FCC9C9C5D73E9038E6A48BB76DE7CCCC061D7480CD17FD0A5C5AFA71BEDB5CB97EA4A0F8FAD6F371AD12169BBCBBD9ACF6F4CC8135F5A54BDA93C616C6B09D73F4914C669350D8885E58A9C766608B24A246DC9C7C3CEB39BFA70EF20D75AB446A37F0A71E9C53D4FC78D41E7823A94B775F4AD66A200744F9660C85821E1CDA6AB07386578477C531D90FA5148967E2EBF1B51844553EEFF1006BA2CD045A64DBE93A06810699BED01A07001934F62E66383DE7008714218A4C29AC56FC45B6C104B054468FAE594C570BBC076D93F98F463716FF5D7475B9E69EDF1540BCE1ED58D8AA2992D0695FE8B07A4053B9087B4A5A7E1ABA9D4B1DF426349952FB5381E083F4B24A8A4D9401F7CD233F3645CECCF43361938202241141E8CD5F3CFA72DA990D90EC7237EC2AD18A44E051A2E1F146AF5B238AD4867574523664EF60D90477E963D97C0EEAF8482E83C709048F572CD90031 -ct = 8CF585EE1F0FD576303E0CC13B44FAAAA8DB5D48DFCAE2E6A9D2EF94925AEC0B3E90E0C9C334DD3CAEF54A165630AACA5687F29F08A9917107C327AE4EA679A6BBFE1B04B6F4778D84280E0AA17E44070FAF412DD73B5E01B0DC98211F326692F33F217364113BDF6F3CDD88B69C69F080ADD60DE0FAE7D1E969A759422B65BC34386F3F496FFB3F3A595E59146A719B0F8EB571A3470D9006A811881E414CEA5F69DFE99A9819C7626D621ACD8D572A8638A862F8B9F0CC9DAF9503A64295D780EE6E0AAD1F9E69BA8E895AA8819D9E80322A3F3016D8BB3C3F6B8BC248AFF18D98B35F75A547F2E550CCA6D8B55AD75F246D03CAC89F85F9D38BFF04FD9E5604D5C758FF6B770D0D94889D7BFA74A808BB1083D7E994A22F28C90AD7D1F41C3E6AADAF8446D30B84467175A91F36208D1E24C1F527CC8497C00A6C99724C150245EADEE2B6B1B06B663C5C9D5372800DE382FCF19367B905A6767BF5EBD3E18CA89C39173BC99F4248AF5CD94D96327B2017FE9437B33A90179F0E3F94584B6E759B7ACB1666871D7F1B528C36C5B64F7ECF9E4EEF1ABDF03FE5E67BAC6CAC756915C0C1A0AF1101933787EE2451C40448EC7FA6A66FB63965E35B5095511055C030DBBF5081EF71B59D1548D8B93AB5389480D51210DE1369AD544A067D3537D25D3D9739388202BE14923A30A26254E7F84965C437000AC2CF967805F1449388F7307842BD1017BAAB4E2DBC31AFF187824AAC572566FB511CF7F84794A068631ADB1B755954B2A701B9401C2523029E622871988CE7098144F104944F8EA395D6FA72C05E04CCFA91506242D2D1EC1331B4 -ss = 9F8E75879E6A84A9A4B921A80FCD6D581EA2988939775C9FA8723516ACD7E164 - -count = 29 -seed = 265EB2DE7099E4BD5614E5DE7F0C2A05C78EF3E8E2DD4AE4CB70F3E5E59C8D1D88248303F07DE0C5508652DA66B47222 -pk = 5A9847CC18931582134223DF717CD4152A0FB43054ABD826ED890C09AAC3701D1D1DA5EF5403267D623B342EF98A8B6EA0955F645F6D7344F06BC2D7D5B5F4728F87563CDC7D17698F1877F05ED95E6787F49F33DAA6610ACC32CE6FAF2880B45E53144B3E8A25D1BF38DE3DD44985FD82453A1E56E15E3F7CB96531251BF2C9CDF9B6BDEE9C2E40CB34D1A2A44AC66B3DC39676A1177B8FFA7018A27C10D0DE9314A43AAA87B93D6EBB6BF21C3B5D727DE7E602EB8FA9DAC72D3804F6CA4EE35EE22D09ECC176487394B2BD20C35E8A704DF832E942225776B28191EA012461CCEA94EFCD6D3202DEF0151EB4A34E108781D09170A635BA67B80D29B77C6DE1B768A467F12FBA5587C3B1B648BE751D95ED0149F7EB3ECC3731BD917368555396A80F9EF9C8F94692FA09598B7D03338F3F0C63B76A27B8E4E89A5D2ECBB37D4945D992D811CB58A05612AB19E460D9E3F5C1C4398FF6B02882731AA4DB4F0447FA2AD399FF60657166D29A779714D0A18E12D71CC84167BE08136A4DB7177721EA3B37D74F169A7916B58AC52AC69164F5C0FD977B221A66244BE4CD9A5FC0DAA8CE33D2D3C03DEEEF00485117E898C4AFF436A35A171A3FF69B80EAC5ED6EC10B97F7E96F084FF8C71D50F2285FDE806DFB100F1A50DC543FF7D52EE7220E277F4D5D97C987893325A26815CD1404713FC5576CC1D94A2B34B23EB40EC9FBEEE7EAD2B01FA12775FE9B0EA03273EA64EF8459D6A0BED24F4BC51FC01D1EE2BA59DD5ABABCC446DF5F233AA7E160530CC3272D -sk = 174AAA36410566DC15A5E62874218D7ABDDE0B2C0F30D877BB80B1ABD5F5A0A450A7A2354F7E5CEFA6F4A4E9A1C411EB9364506E9E1204A8ACB3CB77FBD2C4ED186396657F35AA3708568C07E71712005A9847CC18931582134223DF717CD4152A0FB43054ABD826ED890C09AAC3701D1D1DA5EF5403267D623B342EF98A8B6EA0955F645F6D7344F06BC2D7D5B5F4728F87563CDC7D17698F1877F05ED95E6787F49F33DAA6610ACC32CE6FAF2880B45E53144B3E8A25D1BF38DE3DD44985FD82453A1E56E15E3F7CB96531251BF2C9CDF9B6BDEE9C2E40CB34D1A2A44AC66B3DC39676A1177B8FFA7018A27C10D0DE9314A43AAA87B93D6EBB6BF21C3B5D727DE7E602EB8FA9DAC72D3804F6CA4EE35EE22D09ECC176487394B2BD20C35E8A704DF832E942225776B28191EA012461CCEA94EFCD6D3202DEF0151EB4A34E108781D09170A635BA67B80D29B77C6DE1B768A467F12FBA5587C3B1B648BE751D95ED0149F7EB3ECC3731BD917368555396A80F9EF9C8F94692FA09598B7D03338F3F0C63B76A27B8E4E89A5D2ECBB37D4945D992D811CB58A05612AB19E460D9E3F5C1C4398FF6B02882731AA4DB4F0447FA2AD399FF60657166D29A779714D0A18E12D71CC84167BE08136A4DB7177721EA3B37D74F169A7916B58AC52AC69164F5C0FD977B221A66244BE4CD9A5FC0DAA8CE33D2D3C03DEEEF00485117E898C4AFF436A35A171A3FF69B80EAC5ED6EC10B97F7E96F084FF8C71D50F2285FDE806DFB100F1A50DC543FF7D52EE7220E277F4D5D97C987893325A26815CD1404713FC5576CC1D94A2B34B23EB40EC9FBEEE7EAD2B01FA12775FE9B0EA03273EA64EF8459D6A0BED24F4BC51FC01D1EE2BA59DD5ABABCC446DF5F233AA7E160530CC3272D -ct = F719B70100B299344369099E28EA4688DC1BB5B155B3E8FA8E61D4A6D970C3832D28BE74FFED3B742F83F3A14F8F8CC22C90606575C51F05AB191B063351E3C4E97E5385DFA2DA65AA6389340F2360F59E7B979490064BA118687C04EC619E5FDDE9DE109A89B7AA9944EC3C739CEC0D07FC26E4F15F75DE9EE2D92FB863DAFA371776FC5BEDD615542F62259987F04968436ECA4A3F672817699234B84E2183C373CA1DCE23336852F26CF2FAB9AB9A4A96839D5CCC2C42079A376326E6B0D8903F78641B80184990A1767C009CBA8EB2260EC2F8C2D71616B072BF2178BB0DEB460B34492FDA07652D482AE5B96E5FAB819BF80E384CA6A305D9498FF1FDCDFE38BCF1056D1D16E11FE8621883A3586DABF0DED14FEA1C4C0B987B761886C70CB63304A7019B129C13C53E58F9D83138C190D97B7BEC71A414EA7F9FDB69B2DDA964521D32C4269C9A8D2BC02EF552B7C51387641A812AADD8D6AB7F65157AEE2FEBA99342394275964D6C032BF54A54875BFBC697B3163618DCB5FF1C528E46C0ED57A6C0B3691157BA3B5C16EB5F6440C60341F36E4A27D807DA0BB03E7E156F15B477C9179D77DA75A6CDAFFA219F0CADCEB9FB71E1CCA4AFD6BF589759A8ACD016D34DB3800C7CBC7BA287F7B5A30A6AD8C767499533A4227C580CED8DF3619387555C05AB3D4D96D9D9159D9A1BC452FE60A8352BC5F5D557BB84718BD8FAEF34E795FC636E596045315FE8989FEEEA6C75F5E00318FCC2B3C6934E8BA3AE5D1DCC8B8C465E5161556ED4BC097B0A6A37CE1EF7213A22700FA2D85BEE01926AF4C5E387513E1369C072EB67C1E46CE33D -ss = 8531E180C5DF105DE8D5C100883A17B6FCE95F3CB7BB1C293C0EF16EA96E5FA1 - -count = 30 -seed = 806BBD111F27C2668318387BD0830F65EC21A51AF01985EF48D03D64E1958FF7EE5133A4EBF6DBF36329BCAAF65F40EA -pk = 27443052C1F1CDDE9A3C57FB146043878F97593B78DEEE0B8D4BB8C625BB7AF925CCA9810EE602DFC4A99D24613649EA3DD34F8BDA08D10E7970F02D39C1DFC055C15B4AE5C086CA81E8242CE6D69C108536ECC82DA2F602D3E4E3E00C1B819D5DC6A52209218723469E502FD450A3B5AA310FDAC2A944C0D743E5775D3FF42BCA5624647F52BB72C82F1A1FD77FB87573391003BDFBDFB1F1192E005FB5899E705AE9D5FE42D6E10DC845BE2B0112C8933EAF4725DBC59E26EFF72154DA0854A83925A41E8B7D23F4E724B75D5ECC86CD310239634F21EE7754BAB1DEBB0062A410D96E83B2D6FF7B21EF26EA64437ED9C47D85D3F9AB558BDECC5C8329359A12CE58A16552E37AB9C962E16BDD6767B62D23CF3C483F8300276B306AE091EE0E0D25A55B1ED28BF0CAC52B9FF273D2548BBD1359E7009F91AD1E50E6B88D2304C406F2FDD2FDE4450D720659132381F27F409E846D2759A64034C3E209AE021B2F1CB38F0ADB50049022D442AABDD6962E307BC23E70574DE10E327FF7EE4766C20BA17C5EAEC0E54A063995BC686D38EE38E935F1815CF19BEB97352F938F648A6CDB56B4D0A5EC89EEDBCFA8FCDEC0A7ECF200F991A5E91F16CD9DC30C190E59618303AFBFC5C881B48E83F5EC62660D6CA2DB1986D71AF5F404083A4DB2383E8862A01C72DAB99543107EDEA98A588C6BBFC9212C12B093384E53B69E1BD44B4FD9DF6A75BC51397723EA2402B7AF78F9C40D26870C81A3B97CA3E698C000AFC5E8F267F46B1786079252885F3665608756 -sk = 351FE4313E2DA7FAC83D509F3103CAF7B4C64A4D458FEFDF636785AC361A1390F072D9B5A99F9C7A0A011E4DC10F6B600D611F40BBA75071E7BEE61D23FD5EDA0FAC43B0E0050838815746054B9C570127443052C1F1CDDE9A3C57FB146043878F97593B78DEEE0B8D4BB8C625BB7AF925CCA9810EE602DFC4A99D24613649EA3DD34F8BDA08D10E7970F02D39C1DFC055C15B4AE5C086CA81E8242CE6D69C108536ECC82DA2F602D3E4E3E00C1B819D5DC6A52209218723469E502FD450A3B5AA310FDAC2A944C0D743E5775D3FF42BCA5624647F52BB72C82F1A1FD77FB87573391003BDFBDFB1F1192E005FB5899E705AE9D5FE42D6E10DC845BE2B0112C8933EAF4725DBC59E26EFF72154DA0854A83925A41E8B7D23F4E724B75D5ECC86CD310239634F21EE7754BAB1DEBB0062A410D96E83B2D6FF7B21EF26EA64437ED9C47D85D3F9AB558BDECC5C8329359A12CE58A16552E37AB9C962E16BDD6767B62D23CF3C483F8300276B306AE091EE0E0D25A55B1ED28BF0CAC52B9FF273D2548BBD1359E7009F91AD1E50E6B88D2304C406F2FDD2FDE4450D720659132381F27F409E846D2759A64034C3E209AE021B2F1CB38F0ADB50049022D442AABDD6962E307BC23E70574DE10E327FF7EE4766C20BA17C5EAEC0E54A063995BC686D38EE38E935F1815CF19BEB97352F938F648A6CDB56B4D0A5EC89EEDBCFA8FCDEC0A7ECF200F991A5E91F16CD9DC30C190E59618303AFBFC5C881B48E83F5EC62660D6CA2DB1986D71AF5F404083A4DB2383E8862A01C72DAB99543107EDEA98A588C6BBFC9212C12B093384E53B69E1BD44B4FD9DF6A75BC51397723EA2402B7AF78F9C40D26870C81A3B97CA3E698C000AFC5E8F267F46B1786079252885F3665608756 -ct = 54DC66569E7BE9D42AE680C6D1F9B1CB14A37F24EF88A7D16A76E1123CFABEDDE5BAB03A2845609E0EF6BEA44C79B4CF8EA4BD39FB44BA585026E9DA0B56348ECFB6DD4D90A04ABF1F5280507B0D3F6799E8D9E9D3D5C1A122927649C7658F90062E45316BDA1D51689FF484C0F664C7B948702A58615D49E26A15582C891B5E8410DD509745449709BC4F06BFBEC98909F3F4C1FE0FD345561A52EED671F3EDEAA36108A2D06D07A5E72817A13EBF3A66D1F16BE38D09F7BEA7492DF73F0B7B47834D6BB0F27A7BD51869A657D979D97C9723D37829E51D35CE58557C85B654B8110A344649BDE3535570BEDD6435A2878DAC592632872D5C292F3DDF8C0D959D726FA0A0E4CCD318345B5A6B9A86470AABF9E02FE620697328936AD4C3014AAAC6C77F594E2081642899288E35B59565821E7F9627598CA58AB990EB324F55847355A52D0E28FEE3D7F89841609768E2C623B47E77F7B88D6BF2CF81DF3E2234506097978FBEF2FC3980D924B1094E3BBF5AE494CEEB6BCA2D93F2A32D60700F6ECF13EDEDF2D0C392446704B14D78410BC336E2376CA94CDE499B1D266542B169526B30D2149547948688E1EE60985673A73FB14597DCF479313CA71D7F714C64AD2DE501F875A9DE1A4B62E0FF43AA284A13F847C0BE1D66112B9A0814F12209497FCBBE3AA6CFDD885A7F04227108A2C6956B2A295E09A5C5998DAB81B86008B40089254BE524E213BE9A8548EE7BF519CBDAA06758BA08F39B5B19284FDEFDB37D8443583AD66428DDB66853621CCE6514D1C1B367113E7D61DBB5093C79F83DF29DDB916D2EAD13622B58420CCA75B4BC -ss = 4D99061B6937AA37901AAED330B5ADB04694E8FCCE7D4347B75436827F2B250D - -count = 31 -seed = AD540A9CE816D6FB1661E5483C44F6FDD00C9E7BD1A8CEDA4B4C4D3697D4F78ED0A56954996CCB7DA96ECB8F5CB15809 -pk = 5035B9E8338D6017DA3C6A052F61A5E6B3B4DC71AC0E7C34709DB3C4CDDAC1E593B032F90926BBED53218D8DC76E32DF426C7E14A17A8259045A112DAA10B8ACD65007BC4751138F83557DB665BB94B4ABA4E0BA3BC7E68867C4C603F04FE7EF10D9DB71249D2493E12A00EF6B745694B7C30EBF4454554BBC5089E095DE0338FA0DB77CB1657CB63478D06215D823A7C57D75CC9570E3780FA1B89A75632B2DAD28BFEF52B9177EDAB702D08CC73BB1B514840589B219D0DAFB3E6109A1EDA8FDD1FCC14B78A32A22DF8335D3553E53951EE545B56D46CA6EE9CBD96332B0A22DF3E164C3C2EB05B7A80755F11DC89C7E7DB6920D1204C9C20C6FB483068A8CB7FE2F6A79D4D3D59D3C700F0E1BDB5BBFD82A590F44C30F506C13F368D193DC54158F846F5FC128F6ED950A517C9EB3A61A3CBCB9827E269FC42E4D1AB310717FB944DE3931FBE8D7CE4A0254DDEE448E5449DAEC1FE41E50809D95FD6FC82FC2CE08E4217A19F8A0EC04B6A588B1E0D80C0BF173E3E45EB739A2D2AC897325C0A2B4E7EF2252126F82B65ADFEC99335643D7408F6E2AD111562C487D70D93A1F7ADC9E92CE38BF0C0833BDE1A2F58CC6724AE59FC5F36A3D8DF4961D7D6C05EE1E2C8A3D793B7B3D5C9FC96632DA38936E72392D19EB89336D38C116D38F2BAB0CA7B8855C17A0CA1BD961AACF43E82C0002986C94443F029CB60279D020A273E29E70ACD6DA51F95B8608C11A53A167CF5FE198E1EC981FBEB68D8DBF540501F3BFDFE0DFD3CF82BB60FDA0663ABFFA41EF13 -sk = 9BC5315580207C6C16DCF3A30C48DAF278DE12E8C27DF6733E62F799068AD23D5A4D0A8A41C4F666854E9B13673071CEB2FD61DEF9A850C211E7C50071B1DDAD03868EAFC78673F68DF9B1128BCCB6005035B9E8338D6017DA3C6A052F61A5E6B3B4DC71AC0E7C34709DB3C4CDDAC1E593B032F90926BBED53218D8DC76E32DF426C7E14A17A8259045A112DAA10B8ACD65007BC4751138F83557DB665BB94B4ABA4E0BA3BC7E68867C4C603F04FE7EF10D9DB71249D2493E12A00EF6B745694B7C30EBF4454554BBC5089E095DE0338FA0DB77CB1657CB63478D06215D823A7C57D75CC9570E3780FA1B89A75632B2DAD28BFEF52B9177EDAB702D08CC73BB1B514840589B219D0DAFB3E6109A1EDA8FDD1FCC14B78A32A22DF8335D3553E53951EE545B56D46CA6EE9CBD96332B0A22DF3E164C3C2EB05B7A80755F11DC89C7E7DB6920D1204C9C20C6FB483068A8CB7FE2F6A79D4D3D59D3C700F0E1BDB5BBFD82A590F44C30F506C13F368D193DC54158F846F5FC128F6ED950A517C9EB3A61A3CBCB9827E269FC42E4D1AB310717FB944DE3931FBE8D7CE4A0254DDEE448E5449DAEC1FE41E50809D95FD6FC82FC2CE08E4217A19F8A0EC04B6A588B1E0D80C0BF173E3E45EB739A2D2AC897325C0A2B4E7EF2252126F82B65ADFEC99335643D7408F6E2AD111562C487D70D93A1F7ADC9E92CE38BF0C0833BDE1A2F58CC6724AE59FC5F36A3D8DF4961D7D6C05EE1E2C8A3D793B7B3D5C9FC96632DA38936E72392D19EB89336D38C116D38F2BAB0CA7B8855C17A0CA1BD961AACF43E82C0002986C94443F029CB60279D020A273E29E70ACD6DA51F95B8608C11A53A167CF5FE198E1EC981FBEB68D8DBF540501F3BFDFE0DFD3CF82BB60FDA0663ABFFA41EF13 -ct = 8C5994830D9C80551BF3B5D90659094F08EF4F4D1018C17A49EE957E0CD78A96E6D80D6F0217CAACCC36980DBEDE467144B242A9D8C5E981E9082612D6CDE5B13A9FB234C51EDFA16462A4E772CB022F2B1ECC65D4BA20435377C6621D0D75677EDF0EC01E8775919A2843F0599A652F9C8CDD989B05CC7AA74D2C6596F41623DEACE6E82B0F4CE54D9724777DFCEF0DE62D40E29827B9CAE758EAD7C67303375175B206CCD0F79EF82F51A4FC65D9A264A7015ADDA10B3A9F869E6161C87F89283B64AA25B5B644842DBB55894632A262955FA0C8EB0132745B553A0AB5772F8EAAD80B1241DE3BA65D619EFC66B6B0AE506257FE30398D3DC7F444A5CD5B4E76D7A6AEC2071A49896EBA1AC2EB1D09429061BFE227644E4D1493F6B7747338EA1FBB23859D5CD2F835EF013279FA2ABFE77E0112A153F4B31D64604E0FF86558349268351D79D2451AA923A913388757E522650BB35E882157BD9C1BA9D1C99745A4FA7B2F24F5C88BEB74803025DCAB386EC46DA9143B006B750F0D303E64AF5434EE916A0DE6D2919709CF59E26922341DB12A7947BFC9AFCB02231AB316563BA5F8E1BEF2FF114A6A80E72C53527EBECBA9FFF70FA406949253C79B2C8CE4DC53B68C4F7A2C435873B6C0A2B1AE54DCC0771564EE5155AB0F5EF2B79804859AF51C3F02FEDFD03503FF0273DD6632D542AC8920ED9E7C420DC064C0469923DDE65B7214345D62BFFEEB5307ECE64BDAAC14D158422047CF6430FA508D914AF82B69E8122890F5898BF2ED77817D29ACA346AA2082A202BC5855018A7826005807788092CF9C9541203634474A775A950BDA -ss = 3A328629E9EA491DD8FC925AE18FFF3E9C2CB62291FF4AFC4D4812D08A4CB508 - -count = 32 -seed = 288A5F2684D862A86D2790AFDDDDBAC6FDA934EE7D2E6DA1508BB550838609E8107312B28E00A6C01706374CCD3AEFA7 -pk = 6F9B51F984FA359492D49673FB6B0B4F3DBB40F9B7FAD4DCFF53CA0027A90C159A4D194196407A5888677ECDDD1EDE91987B88410807D1FF7778381D0093E146C97ADE11665753046DAA71D7B1E73ABD6BE162EDDDB38FD27942951B84612CDB4CB6C32A8B9F6171F882D253054DA25C1C4EAFCD2F32EEFB44ECB4A0355277A53D2B3A2F09EE39C1FA6E3D72C496CA6FEABE1612BA779687AD0BB931D3764C6151C96A423972DBDB95C9C115F5FAF805B9C30A7F5056DCA4DA368160D86DB81C7693B85DA7E468B659F8E59EC29817630F6B955F5640A1E96DD40C9FD24AE070A851BAFA6E5F54D036BDD2033C07758AC12800E95A7198206B60F82ECEF64DA178D120362CF1479A11B6C59A1DB7D09112506F6569882A4F4E3A70FF6F097DF51EF518220146D6D910649DD95721D109733468BC00DC4543932416A78842809E9B3EF5448CC6D6770C983051679F4CE6C4055ED25BE28F348F493DD0ECA587E804DA23AC8D36A4E28E7F66EE31FD4D4501D08F913C77BE3A903EAE62A374D53914E634B22739F90CB5C2CDA474E9C57C1141239C1BD81A113B80E76DFFFD302C3EA3D96DF9DEF164905CD7EC114660491BB9A71E61103DF96E4EEF8C7A40AA2A56B84455BC9B2F67CB40FAB8D9AC2FC89C1E76CAAA6A6D524902EF6443884AA88421C695166B293D98BB51260B84CC765AF1DB263297F644872B9D6A12883B1796E125E5E0B0FB555FDBC12DEF51C4120378AC743E04A1B15198092A573A21C600813875981B5FE991ADD615C13B79143FD49B1E -sk = D8B907B34D152FF8603B73051F772DAA71EB902C47B7E2F070508269D757E02E36B817736CBC5F7B1DD6EEF5FE6332FB1A598F3871E5470D440FD2EA631DA28A947AF66FBDDFF91068DB66AAC41540006F9B51F984FA359492D49673FB6B0B4F3DBB40F9B7FAD4DCFF53CA0027A90C159A4D194196407A5888677ECDDD1EDE91987B88410807D1FF7778381D0093E146C97ADE11665753046DAA71D7B1E73ABD6BE162EDDDB38FD27942951B84612CDB4CB6C32A8B9F6171F882D253054DA25C1C4EAFCD2F32EEFB44ECB4A0355277A53D2B3A2F09EE39C1FA6E3D72C496CA6FEABE1612BA779687AD0BB931D3764C6151C96A423972DBDB95C9C115F5FAF805B9C30A7F5056DCA4DA368160D86DB81C7693B85DA7E468B659F8E59EC29817630F6B955F5640A1E96DD40C9FD24AE070A851BAFA6E5F54D036BDD2033C07758AC12800E95A7198206B60F82ECEF64DA178D120362CF1479A11B6C59A1DB7D09112506F6569882A4F4E3A70FF6F097DF51EF518220146D6D910649DD95721D109733468BC00DC4543932416A78842809E9B3EF5448CC6D6770C983051679F4CE6C4055ED25BE28F348F493DD0ECA587E804DA23AC8D36A4E28E7F66EE31FD4D4501D08F913C77BE3A903EAE62A374D53914E634B22739F90CB5C2CDA474E9C57C1141239C1BD81A113B80E76DFFFD302C3EA3D96DF9DEF164905CD7EC114660491BB9A71E61103DF96E4EEF8C7A40AA2A56B84455BC9B2F67CB40FAB8D9AC2FC89C1E76CAAA6A6D524902EF6443884AA88421C695166B293D98BB51260B84CC765AF1DB263297F644872B9D6A12883B1796E125E5E0B0FB555FDBC12DEF51C4120378AC743E04A1B15198092A573A21C600813875981B5FE991ADD615C13B79143FD49B1E -ct = 923A554619B2B73E9DAE41AD2EE2FE363707CEFF1ECFD1C0CF2C981102ADC32D0D720EF47BC8F43FBD6B86038ECC0CDD554EED4EBD061211E009A7E0E625E0C5B5BF4B0FA11F8D7D28720DB295561CFE025272F36F9752C88E9E4EB3594E9CB06021C7A5AB894232847E07A0138CEC1D59F24A378F75A0974FFCA0DF9AED531E6B24D9AA458F65AD505B3AC873FA578328553E39AECEF4956C787B0B37FD7AA0E8F6448C1F873E3CD1FB449EEE5CCCA478DAF13C38B90DD3751CF34DC8189393F6D636EFAD72EE310CD779CED4FB8E06A0786F603BA921CAB799AE9B364C467F85877DB3C37EF309F0B65E29A863D039B2EE44DFABD9D7757AA02E915A498FF354DFD896EF25C193C4D5E0651560EF730077D4EA9D794615E71CED5D48CAA04972FB8704D1A57FA84BDEC72439FB9AAA4AA4561F035449021489067D1E96CF9B52720A1A66AD71843C9E94CDCEB9D264C414020E26B25ED953A4DFB516695705C9F24E4BAC220DB39B8A4E6A30E31C0C82B26344A911C66FA7DC7588491D5C083C985D949034E9B245591497EBEDC1752F710E44FFB223D53633C879FA66172F171404FCA47A4170850AE886FBDA10611CDBE6A3B7B14CDB9A7402F4BA9DAE7AEC3D03BCD12CFBF07B798B3D8BB8DCDD37F6EB9AE33B012C50E5C9C108C88B0CC28B0034D003333E420D0AD0A388900275714BA533EEF0ED41D6C5CBDF30F352B9367771C288EE1ED570D4D3FE2C4B131C1AEC682C5196DBA3551E2413AB8FBB00FF85F224905004E8ACEB08CE2726C45C335E559C2130B4DD25E4A55A27B5ECAAA195D92C77CDF2A5AF6A12643A12D5F80DEF89 -ss = C8F7F0A56DB64B70D4EE4A22263722C76D1AB9178B707DFD931CB81D4906F258 - -count = 33 -seed = 4635DC5BB92EF98CDB6220DF0DD717C7F8158375EAA2B78FC3F0B58E9C9653E92684CAD3461D9158A481DA3D14694C44 -pk = E1074A3F19DBC2207FE11A7B2E4DC0A53C5CA8223A737CCCED74B952AAA644919F4F965428D95BC3203D51BD3C66E12D6E8DBE9268BFC8C45351C001ED9A836E2B5DF3B546F80FCFFCEB81216D8956DA7C79A9BA5CE61726ED6B229D530CEB810DDFE273FE56C7E015F5669C0FD5C2A703C7523E831C9DCEF4266AA2CD3E8DA31615598325867FCE54596DA09E9DF2EB284678782D7819E83C6E75869A813DC0F2EE77ABF6FD41FD45306E48AB36E275F8CA2D4816ABED52E101913DDC8910AC31458436F38BBDFD7FB55411A17D9AE9645D7F91B543868A0EB1259CC9464CBA7F50AF47C14B7E341F89C4C4E55840EAEE3D2C116AC934BE6C169EF07AEC8F94A97AE08BA81AAA7A67D718E2A6D7DC82858D21D4335A79059051AC5F76B26BC1BCB97F7DD9DEC150B1B237599AD7B53B3F42F6352337CA5D2BCA15798E00FB2954481262A0DFA370DBF40BD9D4C70FE7FF5065A7C8C848CC9FAD691214E8DCF59A272E686C59AB68022EB208C3D6B4888ED128B3462E7C5FABC97CD957EF1BA0445608CC3D2D22A8FA3348105740A8B8DF69C54678AC29D382FFEBB189CB244B3CC635F8C24494AC17E2C04301A91BDA36CE156F50601DB2EFAC98B2E29348381DC117BF55B04116749CD79FEEBBB9211826629F8C1B89E3B55083B88402B0DCC2E4B4F75E080085B92B82ABA1AFC236681CB69CC0CE8A51DCD7B779730EFDEFCB423AD4AB5EAA824BCB68A6E587A6CABC91C9EA0D77F37620B490E7F620A2BC6834BAFB26FF8F72ACF52E9BAC457251B104B544 -sk = 684A29E4E5480A5F2533E1526B5FAC8CDF5927F3D85087C71F928C59690EB56575D12195EC32A8686D0600E45D4A7F54219B0D7A3826D193A51B9156ECF2EDD630128521D62DBFDF5BC133D4EFF12A01E1074A3F19DBC2207FE11A7B2E4DC0A53C5CA8223A737CCCED74B952AAA644919F4F965428D95BC3203D51BD3C66E12D6E8DBE9268BFC8C45351C001ED9A836E2B5DF3B546F80FCFFCEB81216D8956DA7C79A9BA5CE61726ED6B229D530CEB810DDFE273FE56C7E015F5669C0FD5C2A703C7523E831C9DCEF4266AA2CD3E8DA31615598325867FCE54596DA09E9DF2EB284678782D7819E83C6E75869A813DC0F2EE77ABF6FD41FD45306E48AB36E275F8CA2D4816ABED52E101913DDC8910AC31458436F38BBDFD7FB55411A17D9AE9645D7F91B543868A0EB1259CC9464CBA7F50AF47C14B7E341F89C4C4E55840EAEE3D2C116AC934BE6C169EF07AEC8F94A97AE08BA81AAA7A67D718E2A6D7DC82858D21D4335A79059051AC5F76B26BC1BCB97F7DD9DEC150B1B237599AD7B53B3F42F6352337CA5D2BCA15798E00FB2954481262A0DFA370DBF40BD9D4C70FE7FF5065A7C8C848CC9FAD691214E8DCF59A272E686C59AB68022EB208C3D6B4888ED128B3462E7C5FABC97CD957EF1BA0445608CC3D2D22A8FA3348105740A8B8DF69C54678AC29D382FFEBB189CB244B3CC635F8C24494AC17E2C04301A91BDA36CE156F50601DB2EFAC98B2E29348381DC117BF55B04116749CD79FEEBBB9211826629F8C1B89E3B55083B88402B0DCC2E4B4F75E080085B92B82ABA1AFC236681CB69CC0CE8A51DCD7B779730EFDEFCB423AD4AB5EAA824BCB68A6E587A6CABC91C9EA0D77F37620B490E7F620A2BC6834BAFB26FF8F72ACF52E9BAC457251B104B544 -ct = 5AB4243D61312DA48428CEC4F6ECF4F76DF54345A443303654880F0A0BA641C289A33E354E0DC39934CF97B4AF8ECB127DA0FC334535B56FCBB4ED4A0138C4EE909BBBFBC17C51034AF28BB353A4A9DC50AE10D3A752A87AB659586F174F476EF23F40263234F9FFD6F3701689DC5BBF12334D9FA9F83C10F8CE051161732FF1E806580699F29FD3EB76DACA01AAAA85468575D9177D959BF95426B59935C52431989E694E1540BDD2BFBB09D0EDE26E1CD9E4E11703AD4A4243BE36FDAC42AB395D2F0F0FE04D7F106B4712105DFF65417CDB7AB8C3DF50B3084417EE359D8A814345E652D1407F279A6E96BF81FBE1A81C65F80D02913D9CA5A7B38284895CDDAD9AF231FB25D6EB5CADFA12571F4E3B3FF65FE590CBB1B83AFCBD57A8D1A8C5E910959CDB20666168ADA02A8CA4E69983500E29DFF349380C9F14CAFA7E56CF12D1C4DD6D23E0FEA3A4F6303CA5956E0C1144D81F65CE8B2AC7E555905973CF874DF077B1429A644861CCAAA0F0B41BFA0E1D8BB08E5EAE08AE77F3BCEC88BD379BCE70BF67006F69A4FDCFED72988C1BC4A6E7AA2958FB73896F4ABB8CD493ACE54339AA4FE6FCAF8F8FADB5432AFAD26685E623AD8E5A865A6E79B858A532526BC24A83E6FE1AB3EA6240898EAB62A73E9C8F34DB059E2CA9FFC2DA100AB620CEB8A474FC036D8FB5B1405D07303368173DEE35FD8DAA2AED79FFDB124AA9C44E484BDDB239BBA2909054A8FBBCE89C298413733DB39E638C51B45B81BBE02B3555043FF6097B14621BF16A594E8CF12D2A43655B029BD7BA0E021CFFD3C60458DC1EB561FCBDA2BE5E0035D0997E31868F -ss = 78696DC7DCF46923FBEC1AED5FD2EF9DC4FFB8045BCCADEA8D7557BC301E756C - -count = 34 -seed = 5DA2C51B4ACF488C8BDED5E985CC4702E4A7BCB248B5AC18AABA529F7F9CBF30EFA776E99F76D5C1686E94F50FB57DAE -pk = 9FCBC1354A4B69594486DBE040223865771590D6E5EF60FFB247E737F14DD39CE54764A4CFBD72A23415AFC4CCACC6135E5BDFEFE50EF0A5F8AF2F5DE204C2AD40F606B24D97CFC9E326A20CB982A6317A74B99CE71BF5A09C0E6B35CD2F2E3A645F7C5E94BAD3302C3587D28CC75AAB87D5D13F523B7754F9FADA02173979FEA05509E3EAAA9FDE220C57A03B7FCC0035D9D642C622FE547E7C7E43B337751766534A8D6F70AD32EDF9951395BEDE1EF9523DDEEA7008AB4B05826D38C22B82E9729647496E98C57BA2898C83C293F92D88FEDD26736F4B054DAA45F1C65883AF372719132B66627FB146A544AAC83F2EA4E5CEAA25BE93660F1F11F91B86BBD34DD5F412C64CFF65B8972240DDCB1147C35FEAA292DD5CA720F055121BD74F71820E7726C728DDABC4E4A29C825FF4FC7C7FFBD5B06BD871E9B133CF8FCC5F8E83C1BE3D3F29272B200A1382D1DBD5D156739BCBD8B67C06C5309CED5FF7D79648B93EB9A735C6389D50B021A36E91818C75789A33E844BDAFEF0ED9BC8DF791AC66DDC768B608556D3B8B68177A36D040CA2A492E048AAAA85E948396E4BF008145B328CA22E00F259B472437E89AE56CEF085D15FCE059698F290363600EB4BC375CD8A94D957612F1B9630A28A0B462144CDB47D52905F1A8CEA02EA532267FE003A8E4685F4716ED14A401A72CE2253B480A55852618FAF3E1FCBF37063AC8AF7E6819260AC93C5B18675DF45AC0648FDD805FB8C1BB9BCC81B223FDD8E75A02D8858B4FBD1544E2CB48D13BFFBAAA420B -sk = D76B3573F596EB286AB5231FEEC7499686B13021BE36CB126C7EBEB9D7030DAF248C0A21EA0BB6D6F56F12300E8584D8E9A34E0E6F52227281151AE4C305FB8FB2894654A15EBA3520C53320159D1C039FCBC1354A4B69594486DBE040223865771590D6E5EF60FFB247E737F14DD39CE54764A4CFBD72A23415AFC4CCACC6135E5BDFEFE50EF0A5F8AF2F5DE204C2AD40F606B24D97CFC9E326A20CB982A6317A74B99CE71BF5A09C0E6B35CD2F2E3A645F7C5E94BAD3302C3587D28CC75AAB87D5D13F523B7754F9FADA02173979FEA05509E3EAAA9FDE220C57A03B7FCC0035D9D642C622FE547E7C7E43B337751766534A8D6F70AD32EDF9951395BEDE1EF9523DDEEA7008AB4B05826D38C22B82E9729647496E98C57BA2898C83C293F92D88FEDD26736F4B054DAA45F1C65883AF372719132B66627FB146A544AAC83F2EA4E5CEAA25BE93660F1F11F91B86BBD34DD5F412C64CFF65B8972240DDCB1147C35FEAA292DD5CA720F055121BD74F71820E7726C728DDABC4E4A29C825FF4FC7C7FFBD5B06BD871E9B133CF8FCC5F8E83C1BE3D3F29272B200A1382D1DBD5D156739BCBD8B67C06C5309CED5FF7D79648B93EB9A735C6389D50B021A36E91818C75789A33E844BDAFEF0ED9BC8DF791AC66DDC768B608556D3B8B68177A36D040CA2A492E048AAAA85E948396E4BF008145B328CA22E00F259B472437E89AE56CEF085D15FCE059698F290363600EB4BC375CD8A94D957612F1B9630A28A0B462144CDB47D52905F1A8CEA02EA532267FE003A8E4685F4716ED14A401A72CE2253B480A55852618FAF3E1FCBF37063AC8AF7E6819260AC93C5B18675DF45AC0648FDD805FB8C1BB9BCC81B223FDD8E75A02D8858B4FBD1544E2CB48D13BFFBAAA420B -ct = 55D450EB9D7BE460EB7F76CE0C87469BA350EC024548F10FC08A668A0A6A4CD5CD9E118788781EB8C4C9DE6F5613DD6ED26E83444EBD71A5C1380469BD05DC6C93D66A9AC785BFEC1394EF2E7E7A5773AFC72044C67ADD4E1BB9F1C6F325AFA7FC03182988AC2439A6613FDFB33CE0698F6BE07D61C360C5A6B9B4F8FB27C3F233DC5EB67EBB911CDEECC44899991FB482FB7FB683308B9D59AD58CEBA40DF68FB960BC7D5519DECA5617F494F9A4BB4EE4E64CC1883E91969CF5F1EEA66C923C59723EA6E4FC1BB2DD8A4954CEA6602B307A9318303EC6D64847FFC077FC69C5329B84A17231D82B2B2F36DC6A9E9F580255DCC6408629FB585465B7747E5195A9CD9664AA4F3359728697C7D7C4C2D1DBC98CD21089C314C05FC3F0F53316E6590203E6430CF9580A7423E2A770629FBBD44C3998E636F49A9D4A8BBAABEB5D182178C1CE1B2140C0C5D729D5948E61A3970D0C35C6A49B2E46DDC5C49E20F9A68EB5BE01AF59EFBED03BC9291DC8870D5270CDFF753684556A61B8B71A7EFBD77C58FECAF31F8A39C3893CC1F09A3531851D7C181D2FF5406115035CEFF5FA2B2ED3C1D5D61C9FAF4F37CCF25DC764521BB3B92A1B449ACF62A94EFBEADBBCB5AE711A3FCCEF3675F46A7A70F79C00F9111A9745566634FFD175DCAF17E617F8BFAF4A7A3A3E83F03F6D2D8B39A4AE74859977E6903449993A249735F46D8B5228FF6F5C86BA4582B076244714BC3D237D08D47E3FDB6F853ABD9EED5C6E2F0C865FA68E236B64B569EB81FE8407F2954C336644712A846783C8A07CAE155F21C08B64CC95DA3F599E075A7D29CEA753FCBF9 -ss = 41F998F447908AD3448A348F8E73441FBA26717A83C1306C22BD8BCD4F8A525D - -count = 35 -seed = 4D2239E84B052109A78DBAB6D80C51A86D38248105970476B74A0B78B9CFAB6283E30D5A406FAE1C7F54F8BAE1110EE4 -pk = 8E867D9E56908C869710BE6AF46CC2C8DAAA135B4ABDFCE4920D436E839B9AD21DBBE6EC16DA4285B730B0A644463B52E5885B49BB05DE410A288DD48A00FF9F5A5E6DBE37A518A03FFEA8EB769CC28E791E9DBF468B9DB9A7FBFE440454FA670DF7D44CD1EFC45A5873BBC2B1B98F1BE580CDAE985CCB6E3089D0022AAC98160F316D25B9198D148ACE72F16BECBD34C3C77CF210C3E7FFC3B9E3B5AD1F3084A3BF7C37B791676044D544BC6375439530F4BF88F268C1934917C23A291F78CF68F575D0D7B707CD24E5A33EA46CEC8577A3BA3C1A6B954C50222AAA1FFD5D515B979DEEE2126A0B3523E40AC2DC5325ED9432AFC8FE4BD8C92691552D882E0574EC29DA90D71C912792309DC8D9A8F190D7B023D69290C656600E4392F3BAC09A7BDE77BD2EE1211B4AD1A637A814D961A7AF276D10B20BB53864B4229733E9ED94DA4FDF4B1FC8AC049B63DB50361057456AD0F82E309B80C5C6C079DEAE98C5B5911749F2FBFF508CDE146B14A788192D10521EF34E0F83DE1DC45AE3365EDC063AC71A7D17BB1B489BDAAF5C5078C42976C8BB1FB013475A0D30AC37CD23D4536B0B573F39DE5A8F0DF97FF72CD8569973C345DB1050E012112A7401C06473BB4C5C45CC1F545F0D92417D9230F6D1368F9C922742361E274FFE4183299CFFCFBA0A9E0268F03EB098BDB9E1C6E6E3EA317CAA02A3AFD136CB9FF56B1A3F72E1665C6924AA597A0F14F88DC461CA6C317021FAAAF41CD4836B45DC154795E43A2D5A93A11B9369ED9F7DF695F06475EC2F6C -sk = B87439FDE81C9E39EEBE7CF741C685785532C1DD23E8EF868B9CE7A541010F3D1646460817A0FCE5836BDFE124A7448E7ADF7B8ECC2652AC6D280E986682DF7100815AA831A61B6869EE6E7B2CA637028E867D9E56908C869710BE6AF46CC2C8DAAA135B4ABDFCE4920D436E839B9AD21DBBE6EC16DA4285B730B0A644463B52E5885B49BB05DE410A288DD48A00FF9F5A5E6DBE37A518A03FFEA8EB769CC28E791E9DBF468B9DB9A7FBFE440454FA670DF7D44CD1EFC45A5873BBC2B1B98F1BE580CDAE985CCB6E3089D0022AAC98160F316D25B9198D148ACE72F16BECBD34C3C77CF210C3E7FFC3B9E3B5AD1F3084A3BF7C37B791676044D544BC6375439530F4BF88F268C1934917C23A291F78CF68F575D0D7B707CD24E5A33EA46CEC8577A3BA3C1A6B954C50222AAA1FFD5D515B979DEEE2126A0B3523E40AC2DC5325ED9432AFC8FE4BD8C92691552D882E0574EC29DA90D71C912792309DC8D9A8F190D7B023D69290C656600E4392F3BAC09A7BDE77BD2EE1211B4AD1A637A814D961A7AF276D10B20BB53864B4229733E9ED94DA4FDF4B1FC8AC049B63DB50361057456AD0F82E309B80C5C6C079DEAE98C5B5911749F2FBFF508CDE146B14A788192D10521EF34E0F83DE1DC45AE3365EDC063AC71A7D17BB1B489BDAAF5C5078C42976C8BB1FB013475A0D30AC37CD23D4536B0B573F39DE5A8F0DF97FF72CD8569973C345DB1050E012112A7401C06473BB4C5C45CC1F545F0D92417D9230F6D1368F9C922742361E274FFE4183299CFFCFBA0A9E0268F03EB098BDB9E1C6E6E3EA317CAA02A3AFD136CB9FF56B1A3F72E1665C6924AA597A0F14F88DC461CA6C317021FAAAF41CD4836B45DC154795E43A2D5A93A11B9369ED9F7DF695F06475EC2F6C -ct = A1E91EAE0CE9B298BED7E2AF228D07D9C547B63079B1451590CBF1BE6818901B512F94CEADFCB8B1300A22D3390BC77B2BDB7D43F32C190D58B6EF0F8F678EB3CBB6AC2755AE6D4A757E8717D8AB7F488A8E0B6E68CC3BFE73EC7C250B378D00CA952DEC0B79B14A3FBEFBE908EBD7AFDE755E04C58E7198D8E2659E01AE8C80160822FB656D1D9C8D935866E6D403CEA329B2C2495B4C60E1E3C3657D7DF26AF467D7E6C1010920E2A4161807B31EBBDFC2185413BEEB6914C27118803C5043C67E42B3A90CF27F79AB19E969B43843FC2FF0A78F46AE1E4E3A1EBB34191A47F7A1BE62CDF2664D9671AA2F9E1116747E9BE6DE5D3D3563D99C1B4378B78D72B246C00153A558B52AAB09FCA457D3040F6D1730A915B2BC1F5C325E618AA62FECC41C67327F92F3F2863E4BDE8674622F1E74F11924214DFFFCC43F07AC2E3DAA9AD0BD9855D418E569CEB3C9E7FCB80BA11BD9DB14A606039551058E17252C87BCE9AA853C1303895BA448837A50DCD5DA17599F10A5676785A42D1FFE3391EF96551A7FACD8D2D3AC9339CAF9C73EBA6858D515EA90B172C7B524AAC36F74A21568F769582F7820593563DE8F61670F669F88BCE418838BDBEDEB937BB2772D7F8690F536DD9B729340D15A8F0A088A7FC9D7540B96ACF01151871044D3D727D837A14EB0A68A8A46AA579E0E3837A5815D961347134279195155D7D927A4B0BF48B1878714B7646D2C47E5FF194D4F3E645DB7A1162745993243BEF5A08E362E678ED770AEDDEBCF4E3335B08D15D7F9CD5506F385E6B50433E768D5C7B0F7E100DD31534648B2FFAE587E806FB13ADF038E -ss = A03F8B99F2B60AE8EC6679DB247508197CD8AC61735605BACDBEB15A320BFFAC - -count = 36 -seed = EE762F5C9021C36446706A88EF16312F4A12C725CD7AFFF1484337C91EDA8E89F7007F3705747D29907B3FB7500E5074 -pk = 720209A2E76F0312177438B8D22611EC2CE360C6206CADA64225D8AF09AD7C85939FBA1C2B59FEF265726496917AB7A803BED112FF1DD14FEDC9DAD6DAA78F986305FD777CB9CD98FBB628E60B080A526CB69AFA91D3FB94EF9728396331209AF0C0D7E65B9858CF932701DF8E8205C598C4B911457F2048486A52554BC55360CC21ACB1DDE3EDCC97703291EE2A5DB544B0BE185CD380ACF509BFF3892AFE7A38840984C444D5CC6E9A9DDD3C8886C0D4AEEAE2AA8AF34486CED02F3EF468FBC8B40FF56E2E255EFA6D31D989F73D85FCD74B6D0EB95A2B55309AED92D4A311F6980E9C91B015047EBB45413794298CCC3910055BC771FBAABFAD11BCE3CC524D0A5F3249398AA0FE139D398E43F519447BF42DF7A9CE34E24DB290159017149DE05556D662548C90131308BDE61B2E14F49C9A8F79100FB44B4C182C03EC9A4443BFDB3DED409B62963A711FED8191CE26D6F17B69889F10EC49632FAD9816AC75BB8C96895F6ADE175A7507D38C10CB37A72504B89C047F63706F6B4DA04CFA805D291F84DA600FB94D4950EEC077150788177CFC18874F528C8962A2BA12336ECFCBA5BFDDAE0D8CDDDBDC90542F5334FC9B5754BCE7F55DEE1249D8695E6C07DE58F2AFED87C50122F0C40BD5BC0A2C47FDD346A5E7E883A801CED84B9D8EF76DAA259785C8039FAC1B82F9E25432BFDB429026E93D814984C74568A029FF0128CF9E5ACBB293580F8DA8E9854022103E5084F51896A0A09F4FC1517CD2274DCCD9E2CE15AF82A4EB6557A684C3152F0716 -sk = 056661B38038DA4FDD7426F32A81576C73ED84843B305168A374F934E27A4E1B79238A80DCFD7C992D84B2DFFA67493E669243D4FA38C46B090BDF86BC548411A77127B247925850220B0BE970AA3500720209A2E76F0312177438B8D22611EC2CE360C6206CADA64225D8AF09AD7C85939FBA1C2B59FEF265726496917AB7A803BED112FF1DD14FEDC9DAD6DAA78F986305FD777CB9CD98FBB628E60B080A526CB69AFA91D3FB94EF9728396331209AF0C0D7E65B9858CF932701DF8E8205C598C4B911457F2048486A52554BC55360CC21ACB1DDE3EDCC97703291EE2A5DB544B0BE185CD380ACF509BFF3892AFE7A38840984C444D5CC6E9A9DDD3C8886C0D4AEEAE2AA8AF34486CED02F3EF468FBC8B40FF56E2E255EFA6D31D989F73D85FCD74B6D0EB95A2B55309AED92D4A311F6980E9C91B015047EBB45413794298CCC3910055BC771FBAABFAD11BCE3CC524D0A5F3249398AA0FE139D398E43F519447BF42DF7A9CE34E24DB290159017149DE05556D662548C90131308BDE61B2E14F49C9A8F79100FB44B4C182C03EC9A4443BFDB3DED409B62963A711FED8191CE26D6F17B69889F10EC49632FAD9816AC75BB8C96895F6ADE175A7507D38C10CB37A72504B89C047F63706F6B4DA04CFA805D291F84DA600FB94D4950EEC077150788177CFC18874F528C8962A2BA12336ECFCBA5BFDDAE0D8CDDDBDC90542F5334FC9B5754BCE7F55DEE1249D8695E6C07DE58F2AFED87C50122F0C40BD5BC0A2C47FDD346A5E7E883A801CED84B9D8EF76DAA259785C8039FAC1B82F9E25432BFDB429026E93D814984C74568A029FF0128CF9E5ACBB293580F8DA8E9854022103E5084F51896A0A09F4FC1517CD2274DCCD9E2CE15AF82A4EB6557A684C3152F0716 -ct = 933845B3895D972351175320E0336AAB1905625CF839D7B9971F7A0674987B7CB21C15B96CF52786FAEC0E0AC339DBD1AE5FE35135AB6F89A3E38578D2C4E1E98F77B7C7DBCC9B18C95A1CEE0C7C75E1FD04F57E4A36103700A1309BBA1A07E44DF5A225FCD14F928436D20481AAAA04518AE81F0BD49D80BDB9614E130E5F2204236FA57B0C67353076F9A995A14F46DC8EE1BD5BCF1FDA7EA17231BEB912AF87760AE67F5636DE6DA9579DA5893E8A5C431AB8A392CF7DB0B9D735D4DF7D696F5B5B80BBDF2638B7234553A316F7A8160E347C04F570F628AF6054C15D3F3FF233FE8D85E4EA77E4997EB5613B8E5E8A3D40641A70168E9A0F2B689B6979AE493D41500CB42574390951B5B09E70C8F5FA194EE2A9ADFBB828EFAD08E074E28C802DE84C3A0F082408AD8EF63B142C32F6023ADBD52C93A15E340B14B63E03494AF87347006377EBDEDA9D4DE0C28CC826B400F85D826EF20684F3D63069D8C5271703DAC9E3C6DF7BC306B21ACFEEFBF1053564CD784572C1F786CEC82FA87DBFBF527BD0DE0E19EFE281B67DFF1EE2F69075D7E3EDF8E11BB127D1BFDFE6EA2B9510C3666AD966284DAF66E5B70B1DDBCA0C86C4FDE98BC8772447AABF1BF7EC9024FE03C59F0C524FF0DDE338B22B0E6E75FA59D3557C10DC799DDEEB80C85D7E2557345E743B56C6C220B228E34453E7C2A23E6D282B81703E02A28A884EB46346A5D8DF4EE150734A4BDFCFB46A9064B11493FC5EB0F7041E6C7B70ABDEED7FCA389C6742AA3DDFFA592B37E3C6A8744F4DE930C4736872679B20B71B9CA1D02F14DA8E24256161AC2D621A43722D6B88 -ss = 228AF7F8303C8994F39B92F62BF8EAAA5D34BE0459D946ACB21CFABFC0714BE5 - -count = 37 -seed = D882BA69AC8BBC88715F1C6387531F53273A5DAB87E66FAA8221A7F628D2BDEEE1CBC59C0E08D0ADD84520A3A70C1389 -pk = 31E409C9E8C5498B444F62C15A9DE8E7A82B0743AF9698E4A68B898FE78F583CAAFE652ACB7FF00B1D39F96580090C34D00544A10AF9EEDB5A3B22B6D3D9598162BFBFD42883B9189BA8AA699BBE41B1F7772C2C202C6C15429DC293D4626F50F4A98CF475BF03B34DCF2E2010F5AE7AB821B0D4BAF7D61A668FD4AFCF43AA445AA938179F451D974E131AF3A73AA1A24987292DC1629B2F69713BE18F10FED32EC8D133B254A65F0A6111A36ABA564B29908CE3AE285E111AFAAD5A819A458101199ACF475A87DCBA7A54AF10B7880468468678F9A8BC2BD73F128EB1C0BDB74872AF2F84A06CAF06660E1ED89A36026656C3A5AAD6D6D1E7ACD2AA6F78C9D32C5324A86AC18ED7236660D9A58BD67229507A74EACAF1C1F9148199804A39EFCB854073560ED9CFF3CCF02A1E53457FD3BD342FF27C8D7B446E222AC8C564684BBB471972A0FAD9A46F618B19E3D7638095E158349C1AFB5F032A0A1AF68003A644D39FA6B2215B0C0F6167E986495D3E8A6882F876BB0007229275118DCC78346A347B046F2EBAE7F84B3B6BCECED6457A1589B0644B5FB213B809542290A5C619264B9C4BEDAB132BEA56B6790274A2D57C0CA001CC99A4D590DD7DABD64179E8AA04471AE85086E964A35175F8E96991A171561E0E19F45187D7FD24DC443B4D40D6A11F918B3054D566971EFB038916E621771D2DA01CD8B76C2213D3ACC71E6AE89F8C7BDDBE3FA064660E12289EC9DAE88586147FA979F7A19D4461895D060A8F68CC8FD2F64C9F63EDD1BD505AF39441 -sk = A1B52D871612A1C611AE0944F9E71858F35D3BD14F20E96A931720668BDF0A6B1F135CF64B6403E103AFAE34DA038613E2853BBFC36BAAFA3C6A95347193F37C130BCFE031E637AE84406A08F8C6F70131E409C9E8C5498B444F62C15A9DE8E7A82B0743AF9698E4A68B898FE78F583CAAFE652ACB7FF00B1D39F96580090C34D00544A10AF9EEDB5A3B22B6D3D9598162BFBFD42883B9189BA8AA699BBE41B1F7772C2C202C6C15429DC293D4626F50F4A98CF475BF03B34DCF2E2010F5AE7AB821B0D4BAF7D61A668FD4AFCF43AA445AA938179F451D974E131AF3A73AA1A24987292DC1629B2F69713BE18F10FED32EC8D133B254A65F0A6111A36ABA564B29908CE3AE285E111AFAAD5A819A458101199ACF475A87DCBA7A54AF10B7880468468678F9A8BC2BD73F128EB1C0BDB74872AF2F84A06CAF06660E1ED89A36026656C3A5AAD6D6D1E7ACD2AA6F78C9D32C5324A86AC18ED7236660D9A58BD67229507A74EACAF1C1F9148199804A39EFCB854073560ED9CFF3CCF02A1E53457FD3BD342FF27C8D7B446E222AC8C564684BBB471972A0FAD9A46F618B19E3D7638095E158349C1AFB5F032A0A1AF68003A644D39FA6B2215B0C0F6167E986495D3E8A6882F876BB0007229275118DCC78346A347B046F2EBAE7F84B3B6BCECED6457A1589B0644B5FB213B809542290A5C619264B9C4BEDAB132BEA56B6790274A2D57C0CA001CC99A4D590DD7DABD64179E8AA04471AE85086E964A35175F8E96991A171561E0E19F45187D7FD24DC443B4D40D6A11F918B3054D566971EFB038916E621771D2DA01CD8B76C2213D3ACC71E6AE89F8C7BDDBE3FA064660E12289EC9DAE88586147FA979F7A19D4461895D060A8F68CC8FD2F64C9F63EDD1BD505AF39441 -ct = 1A47DDAA33F3440CB2130E3D251C7CC30AFBD46CBC8D7E68E1BC8F3E6ACFCCA0B10B6C06DD7F512D34A305BF0BBC0004708FE8C4133C7AC5C61313A2703E970A94E3C0E15A3C1C1418C83DC16A872ED31238B0E1FA45CCDD908521A704117E61E7765E9044790A82E63BE813DBC1E14765D2D1072EBEE2C6C658AFDB095FFD8F2AD522C5C2148A8BF42B128C576BE5CA03F6555AF46F6F2EEE72492E65A834A21540F18DC8CBA627E10B4C736FEC96D0A25F9B6B88DB16C70810D30F7E07013AC8B178D8ECA88C13BC5BFCDE6835A39747C66A04CE84ED6781BB5647DA83B88E2DBA9EDECFF1D2FE30B85DEA6A0147E96EDCF574D7EFDA592902775F416EA9C02DAC37FCE2D7606D8D5C0AA20E462FF92E44B251B5B6ACEF226576DE1C6FDF9FEF16C307206D49FBA2D5B7F105F73A82357DE9F36446266D5DE11A8DE2EC1700D3A1E58750413F931C3391D3984961717E7546A04AFA18453E774F8BC21A911BD37F8EF3725CB35109B2C8A9BA0FBCFC42B4B589D3460669BB4E74226A93E34B979F9E40B5EDEAB0F688D4BF98E357346F48798CFC316B356550327DA066459A740E34995CA439F3BD97109E545BDDC951ACAC431A170BA557AC4D930B4C45CEADE21C2BFA6A8A0515E8D99CE166FE2851C901D54B524A4967546A2D3459230B78E1979D5255150719D7EB6D0D517C80089F69C7F0C3FFE322B208960D56AE4D3DEC2A3BB4469BFF698E01CFE9D8AF0B4B43C8D1A2D5A801EB4F3BA6F105895C306E71F73C06B3CA952C866D9480C6C4429177386B1DE8C630E7FA395E1AD407E0EB7A089E6EA74D4209C193BF4C67367A97137C -ss = 1A8218B58D3BE190E1050D633BB557DCD7C0C697BADF63E85B1D9355818DC3E7 - -count = 38 -seed = 6C3AFF39F5D097096D882F24717718C8A702382DC4AAFFD7629763FDA73C163CF084807BBB0C9F600CD31A7135F48AEC -pk = 6DDDE835276822FDBD716BB7D7E873907629B3204EE71D97422265F89643E113C8C3E2AEABD36C92CADAF72FA3EF06627A038C10F008E75E1DD399514493ACAC5D603F1961DA64A529DD27506F8DFA5ADCF3C9564A7986D48A609A9AAF66CCF61A07940845A26F6E3942E252BBF5CC435481C2C330DC654619A7E43CA1CB03DDCD6659DC2BDC11D03F924443B689CED46174E43E2BF4B2F6EBA0B197918EE81B30ECB26AC536988F59DCBFFF94804C64F91EA6FE96344F9AE86F955C80F76C7BC3AF45BE9A36C3D5C4B489B44412011251BD1E9BC382D7E4A9E3547301ECF530F1CEE2C8302E29AD551363ED8B267F1150EFC056831BD7F85D64E1C9E1B2A114FAB4301B725965FB2660C030A8D5694D5C74279EB7D9FE52B014AC00664ED8B469C03A4C7EA384A319BFB5A5690AE3423F9FD85E370D053D0699B3CA19388F8034C1BBDC975753BD78894D1D87C5201AFBE216CC19AB9E8F9A4C58569F1B86750DD115CCD3DA5A5D50318EC3EAEE5524F7AA62BDD7EEE714BCB4B08BB2D1FEF2904E9A974B00383BE2435E465779C5A372CDB280B2D2EB968F037F2B668ED61C6701461F2B9D0539892D8C53908E3B6AD1747DA642BA258C2C57DF23741AA576E79B385083048357238A7208CBE4D5DF641D27CDA94B82315629E769289C53DA9FD6EB1F6D8051FEAA62874B230748F2DF135D0891921D0A5E53625DA6B4AF155D16F50A1E285BBD6DA2A2C464FDEB38CB508BB06751EB49025A54A65C95605D2F2A1DAFE3A01805552C166044244527CAEF2700 -sk = 952B49C803D6D6FBA69F4375ADCE8594847A00BCAE2179DA49AF2AED0423250262D7033947AE42CA53522A65FBAFE18D3BC3E0CB66164E9A094FE4B44D8977EDC0D0914DABB32055DA762B4A61FCD0036DDDE835276822FDBD716BB7D7E873907629B3204EE71D97422265F89643E113C8C3E2AEABD36C92CADAF72FA3EF06627A038C10F008E75E1DD399514493ACAC5D603F1961DA64A529DD27506F8DFA5ADCF3C9564A7986D48A609A9AAF66CCF61A07940845A26F6E3942E252BBF5CC435481C2C330DC654619A7E43CA1CB03DDCD6659DC2BDC11D03F924443B689CED46174E43E2BF4B2F6EBA0B197918EE81B30ECB26AC536988F59DCBFFF94804C64F91EA6FE96344F9AE86F955C80F76C7BC3AF45BE9A36C3D5C4B489B44412011251BD1E9BC382D7E4A9E3547301ECF530F1CEE2C8302E29AD551363ED8B267F1150EFC056831BD7F85D64E1C9E1B2A114FAB4301B725965FB2660C030A8D5694D5C74279EB7D9FE52B014AC00664ED8B469C03A4C7EA384A319BFB5A5690AE3423F9FD85E370D053D0699B3CA19388F8034C1BBDC975753BD78894D1D87C5201AFBE216CC19AB9E8F9A4C58569F1B86750DD115CCD3DA5A5D50318EC3EAEE5524F7AA62BDD7EEE714BCB4B08BB2D1FEF2904E9A974B00383BE2435E465779C5A372CDB280B2D2EB968F037F2B668ED61C6701461F2B9D0539892D8C53908E3B6AD1747DA642BA258C2C57DF23741AA576E79B385083048357238A7208CBE4D5DF641D27CDA94B82315629E769289C53DA9FD6EB1F6D8051FEAA62874B230748F2DF135D0891921D0A5E53625DA6B4AF155D16F50A1E285BBD6DA2A2C464FDEB38CB508BB06751EB49025A54A65C95605D2F2A1DAFE3A01805552C166044244527CAEF2700 -ct = E3A3288EB87D35E2D2AFE7B07E9A3CB19B645EB294861D803AEA2A5AE22EA9D2EE7DDE6380D7FE23518489E15359DA83BCE140BF6DCE834E5090402E517B060C27E49EDCAF136C806A7E826DB4ACDDC2F47B741D8D5B290A0285A1E14626732AF568471357A06DE364CA5441B16B5C0490F2EEA978BD1F6E6BC88B9A7B18D641FBB6D9D186341A9DBE4EED9D032F842A10A21D1F728CB33D457226CCE290B02CC3247B1CB84D43738B1318072EF3CD62D2AA2C92E11B0131547DA2291FCB3AB2DD4D73783FB4967475853429D121984B0592E7411988DF2F7C4D27505B0351F5AE1977B2CAAACD9DF295217ECEF6CA1F2466117FD33960972CDBF4BAEB45DC76AD1C51923D0878EA20C5D137795B8625BA2D55F45D265B1C4C5D715E6CED7A5461537940ECC7E2DF29CB22C7D4E4404B8391AA0474A391270F47E168458CD23D5D6429F195EB470964D3E924EC3C4D6163E8B7B116467BDBE299385E0158A3E3985F6FA70B6C692662423E0CDA292277DCC0EEC33A47DF263BA248A81338A48DAE9432F9864C3EFCC416BC74FA9E593EC8D1415E8FF060A6359B2B9D7E4F0813ACA20578542187E3BEBEE761C6459CA683D44F9D594BCCB29F2AF9EC7B77667C5560EC9F02F7372B67DCD70D226C21AE8EDE0EFE2F4DD3B3E385A874D3DF556045EA2717AAC848E44632FB3E23F8F8E9E0DE553DEF87CB222069273C49BC8D8DA51AE6CAFBC9218DA3F344B3D7FF9EF1A3A6A6AE964B767CDA430331B3439150A8EB4F2FB00F19D95F649B8004CF9121EBC2ED6C634797A70F965CD390325AC94F7EA5B07EB8239F49D111C1512BA6117B475248 -ss = A100827B09A30655B6CA3B34578B3BAAEB6241D32F00C83FF0E72355C6B1D102 - -count = 39 -seed = CF520B92A2E3677AFD003EC1EC6EF136A709D78F828C9C0DD4946EFBD451C5FAABFC83CA66F9D3D17EE4220553B7A69F -pk = 0866E2C4F2177C57A4D7006FAFF66741CCB9DD736945118C1945C2E378A2F3F278BE1FAFBE7B56466097418E3DF75636734D11B616E8E2C2017BD1206A0B4E78A74D69A2CDD1BC4C77DC6E2A27A26440F4471446666FC7A74E7FC9B8883074480D76BEEB03BD12159D9239D16B9A5BF124B4A9C4280C0A92D6E76F241CC06D1A9792C22F8C2E05F32F27400E09872FE2E832A8162C38F4D1AF9D54F3FA6524D55F7BC7829DE339C814BB75145B726D2C35F38322FF31CAD0C670A74674573B28AAE9D66F8985A73BADFE6387AA66D85EFB26E89C38226052A7FBDEAFB8EC09B98403D47F128DBB12F8BAE542B9D3DAF531BFB8F9557B88B29C274A0C62B2174BE0E37DCCE2CA27C85C207FD100936AE75788D11EADEC364298002011696B86D0736F93087FE7AA8129EA236C7515639AF05A30730870E64E1CCF47394F67D81707AC3B3F115B59225277E96C3E431EC153F58B87D9E5DDDA2EB726C2593B64465E1254EA11DA9363B8BF7E2B0C54A87A18A332430BA9B2284EFAFBE4E0C431556295A7610FC7955758BEED7D0E7B2D7DA54E5D2BD3D3356B974EA879F55D0BD5C80D68C46030403F309B563A793F8D13DDBF18B1A2B1213D74142BCCA0B85238821F23A15087B5E4804DBFF4A143BE34824A53D90F1F41BCD2DC8DB2EB9D68B15CC6091DDCAC0C6074475B85C365485C6D9EAFA54C652C27F3B183392A04B58B625712716917DB39EC99C4B0E42C3DA428898143D77F8DCAB52E325D50AFAD310526D859950C4DD34564E1CF54FD10349D71C116 -sk = 3C815E57E9233E975FA1630208AAB206B71AE0DB37A7A8789AC683D9F9B2D29801C8E376FDB140EE343106C093AF7CB149B316BA79446CEB4E5E0CEDB9B164F9C6828BD9D5A20A8B9E96890A51D201030866E2C4F2177C57A4D7006FAFF66741CCB9DD736945118C1945C2E378A2F3F278BE1FAFBE7B56466097418E3DF75636734D11B616E8E2C2017BD1206A0B4E78A74D69A2CDD1BC4C77DC6E2A27A26440F4471446666FC7A74E7FC9B8883074480D76BEEB03BD12159D9239D16B9A5BF124B4A9C4280C0A92D6E76F241CC06D1A9792C22F8C2E05F32F27400E09872FE2E832A8162C38F4D1AF9D54F3FA6524D55F7BC7829DE339C814BB75145B726D2C35F38322FF31CAD0C670A74674573B28AAE9D66F8985A73BADFE6387AA66D85EFB26E89C38226052A7FBDEAFB8EC09B98403D47F128DBB12F8BAE542B9D3DAF531BFB8F9557B88B29C274A0C62B2174BE0E37DCCE2CA27C85C207FD100936AE75788D11EADEC364298002011696B86D0736F93087FE7AA8129EA236C7515639AF05A30730870E64E1CCF47394F67D81707AC3B3F115B59225277E96C3E431EC153F58B87D9E5DDDA2EB726C2593B64465E1254EA11DA9363B8BF7E2B0C54A87A18A332430BA9B2284EFAFBE4E0C431556295A7610FC7955758BEED7D0E7B2D7DA54E5D2BD3D3356B974EA879F55D0BD5C80D68C46030403F309B563A793F8D13DDBF18B1A2B1213D74142BCCA0B85238821F23A15087B5E4804DBFF4A143BE34824A53D90F1F41BCD2DC8DB2EB9D68B15CC6091DDCAC0C6074475B85C365485C6D9EAFA54C652C27F3B183392A04B58B625712716917DB39EC99C4B0E42C3DA428898143D77F8DCAB52E325D50AFAD310526D859950C4DD34564E1CF54FD10349D71C116 -ct = E9DFA56CC270457CF2F7ED5E7AF10452508DE49896D9F1EA100A7C229379981E3277C94AD61353DDFE6069561AF2BC221567A9E1D942A29E5BFED67D404FF86C43C0FE968936FE22F0E3D1C649E1E13FBD80477A06E49A7822AF7C5B582631FEDFE4D8877B0D57D88DFE3116F385A53EB21FC6E5461A293A1862F9E29B483810A944B36BABF802CA10EC9C7F2D84DC7560BCDE7F2450FFE578ECB612D981C8ED3064616FE780FEA54C66A035C3A8A8884BD3045779DD121C5EC3236BD9EADBF630B52A2816F0C2B8AC529719F30C3E0266AFA25C808774709648FF8C3C96C79141A00AD0F2D1E59EB5BD017F57C38D51A9CC2625A2BBBEDCA9B3ACD4B769745D42E30CA0085B0C188E75F2704538ABFE0C2FB432CD34FCA04918F7BE7087A965F8C2BAC71863C3B8D309A7976EB536768537331E67731F7292C146BEBF56DBAD97741985E9BA2094E0A6F3DB4AC4C0F0FFCEACBF988C3A7F28B24C9500B40CD7A93DC4F62399648AAB394605EEDCFAD71D962BBBC5CD024B087B090A7361F7C47E63986E850EC0A82CBF98D42903CC042A6FFD478D3A311FBEDD48C682E940C3462D3F1093850CCB5A29EFF147B1C7D606B5175014A113855356C86C7DB95961C6CB4A90551EABD077FD4AEE57220A5086D655F22B4920ACCE18A13C23ACC5450F8285D6C1C1F1BDEDD86D2879894AB746A5379CD7F9832EB57D448E721089A8314B026BD9CA7A0C2A7CC09BFDE6F976065DA0DFE82F8DD9BBC8212A1A33D0DD5DD802340F9394D12FA12048BFA8CEA6F51CDA067AB7641CEB470C96E7EB907FE5410DE038568F1F76311B3327B5FD2A61F2CE0F -ss = B002FB1959388037C5C6BD4836F6ECD0C8F1E458150E55F71598508493AD891B - -count = 40 -seed = 197E5D562DE7E01BED4FC597DB28DC6EFDF0179F3A5BDA5F94CAA39D67BAE730540534D59A7A06C8448F628DA8B7859F -pk = 361A539EDC2374CC6DEFCA9A883A116A6222632F4F2014E49E870F9EBCDC72288BAE0CD499BBBE728683C90CCEDFB8F8E27033522224BFB652EDCBA2ECCC55E4267816366F35A105660C8995301470980CB8623F513BBAE758FE234B002A9D2034EE92ED0E8158D47F9E27047F4A81BB0A75BB1F60097167220F19C701469DC4E46F908AA1C0911775CE5DAA2F12674B999F829C6EEDD740D8AD931B52740F6AF2343257294653FE58C0AB188974FCB0AFC7808CAC993A7ED1568D4B6B1D4F2BB1427E398877AF974E858CB7955E4DB3FCF6F401AF6C99A042B6ACB6208B747F86ADB892708AF5E5E4131F72073AC8683DD1647BC4C0CB0A2B607E30C72A4898D318DF3ADA358B4D265C35B7F2E09B338D4AF388BEABE49FF325F7CBF0B2956B8F4F300D71C7D5287A84A84C432D5FED588F7069BDCB53215F5DCEE1F23DD86A00B8D194EE69F7F371FAEF7BEBDF9C1D30397F420019E803C7A2F08DD794EB454B898AC7E574F028DEF70979F59E7FB1B7D8F75FBC996855ECFD8EFDC0581463074760B789A2309738317D49B7000D6D7A1F651BA4FAB57AEE170FAE4145C76000E9CFCD96A99F1318AD91EF091A22265E797388620040D3EFAD0C3B671F43DAAC889E78CDF60E9D0AA539F5B5D4014C1BCB0AA56C07FA8C4C15769E023EC63460917073EC6FBAE1919CE449323CB2037EBE04CCA9BA1EC0C1FDC8E075D833D047884D24F41EA3A663332942D07A568A1D3CC32C35BA2AAF6465366BC3CC5D756F16B76C4A3105C5B3073D441A8222532D91F94D -sk = 588760826DCFBD36D9ABE6AE44A669BB3EBBA6A218EAB69E30F18A3BD536576E0E860576285483BB5FD36E2F944D32C4317BEBC1E441470C1372046A790D79D4F817C85D204EE860346635D4A8393902361A539EDC2374CC6DEFCA9A883A116A6222632F4F2014E49E870F9EBCDC72288BAE0CD499BBBE728683C90CCEDFB8F8E27033522224BFB652EDCBA2ECCC55E4267816366F35A105660C8995301470980CB8623F513BBAE758FE234B002A9D2034EE92ED0E8158D47F9E27047F4A81BB0A75BB1F60097167220F19C701469DC4E46F908AA1C0911775CE5DAA2F12674B999F829C6EEDD740D8AD931B52740F6AF2343257294653FE58C0AB188974FCB0AFC7808CAC993A7ED1568D4B6B1D4F2BB1427E398877AF974E858CB7955E4DB3FCF6F401AF6C99A042B6ACB6208B747F86ADB892708AF5E5E4131F72073AC8683DD1647BC4C0CB0A2B607E30C72A4898D318DF3ADA358B4D265C35B7F2E09B338D4AF388BEABE49FF325F7CBF0B2956B8F4F300D71C7D5287A84A84C432D5FED588F7069BDCB53215F5DCEE1F23DD86A00B8D194EE69F7F371FAEF7BEBDF9C1D30397F420019E803C7A2F08DD794EB454B898AC7E574F028DEF70979F59E7FB1B7D8F75FBC996855ECFD8EFDC0581463074760B789A2309738317D49B7000D6D7A1F651BA4FAB57AEE170FAE4145C76000E9CFCD96A99F1318AD91EF091A22265E797388620040D3EFAD0C3B671F43DAAC889E78CDF60E9D0AA539F5B5D4014C1BCB0AA56C07FA8C4C15769E023EC63460917073EC6FBAE1919CE449323CB2037EBE04CCA9BA1EC0C1FDC8E075D833D047884D24F41EA3A663332942D07A568A1D3CC32C35BA2AAF6465366BC3CC5D756F16B76C4A3105C5B3073D441A8222532D91F94D -ct = 50549477D288277D282C8F47709358B7D76122459B5ED4269BA853D53048B56B93707F5AFEEE4EE3EE4735BB1BF741BC985D0F665281FC470631BAC74049F2C3743550259865184A4767A87FDED82A76A7D8358A5893A2247CD0AB5256565ACB85E2504E8844B4EC6AE7B20B1838C7F46294783ACCA2E02B3022919A86E5996D82A0543CEC76344F7091E1B1B9C8B03E436589EC342031E2D3CFCDE63EBE5D41E6DDC6300C57CD65DF2048CC65AFE8491F68F04F427FD6673B206025B38166BFFBA84DD3DCB077BC8C0195B3A74EB7279280289FF960A547AD3015013151B27BA1233355EEF8E3CE9183D2452F0EC3FCA583865EBDC462C88383E9626FD5E24EEE1A9BBBD8C00A990F56F1EEDFFAFB0ABE8345D5302F9C4B323B6D7FEC16F8293A3CC8B3E01F432C10D8F6B1FDA3B309760A05D26C37658DB8BA2712BDFE8E328479CB4D47650F8C43A5473AA08AD85EDA6D72D8635F0374B515F7DE6856ABE4B9FF8147E8C8602ABA9AC578D8CB6ACA08E6BC62EE8A646A7D54643297835E51958EEFF6E9B570BBE575320FC78592D3023F34CCE5DE7DE4647032296F37051B576D01B24D53C58D7D202DAB3CAA5E928A64192779A34A5087966EEC1C67038DA0E09D700BAECB05188832EB9D5BA20FE65BC94AE0591AB7A24ACE7A7EC36D862DEDAE66F82B22EB39010EF67AD29BA871B889314550069C502CC868193BD823B7541987A6C15DFC053DFB59FD12FB32F92FCA748F5AF0361AC41ACBA221E2B938EBA80C57E711CE3954EEC54E915AD4C3AC443C0BCCBABB0E55B112A69044029E54BA8AE899E2ECA2924FC222ED62394CE51038 -ss = E168D04F9EF20435AAEEB03FA2A556CD628F309F512994AC8D45C5BD9A4C7CEB - -count = 41 -seed = F170583CB451D8A45D105457C02C01A33A40350616ED8515BD49067142F61EFB00F07857E4FFF3FE11E7164C648C76ED -pk = A0CDFA83F19BD1932E2DC1341227BA516B6955E12980D01BDD34EA4AE2FD8EB38F79068BAE6129B677426996AFEB165AA5218501774F11B54A6072CED608FA2B6F8F1CDDB4AE3BE4992383F0847735093B16E6DD2945F68F26F6B957E545B0E46BB3B78FF9A044C2956A3F36A169F071EA208AA5B59049EDE86FAB2BF96B750AF08B68EAC5EAF95FAFED36A728DB68CA29E458F9DB4D41EB6862DF2AF4A86C47BB65521DE99CAEA6DA371E304C3D5608DB6DED47E6FAFAB2C04EA4400E213392A0A1A492480450093856F298291B6305495F9E0CA01503086ECEDCA6F6CE04101CDDF1DEEF31873D63AE6C6618335FF90DBAD5ED09A2412390CAA29EE1A4572D6398044FB33D6256C0A06A97C6A4C598E60A26CFDF7897BA163B1B82D0EBAB25DA84FC57447C3FB36D83B25C08A019615A01ACF3DBB5D1F99EDCDBDFFB6F077B5D704BF77089B3E6941C3F49C642413A34F4A6AEE0445C6CC9C47EFC71B30BC44E131F2BE95C0E17F80C1B27F999BB393302E4210C66966920B1C48A36CC48F70E1A3DA3B6CC69330750BCBC44A95F611262A1BD5E9991E175EF9164ED360451E565B02818DCA7BEBFA237E3370D602C2C9E5CB58EA9A21C2C7C94DB68F18C2AEEB7CE7E6E3A91B68BFFA3FF3C07F42E96BEF6BF7724BC626A3E86F67D85601BD402FB7AABA039A43ACA3725A9E9CDB41C5420B15699DFD438E1A36D0E60751DAAA54879109EE4AE7A67051E194BB8ED6D0620614FCB12B950E1D5AE8CD308FD5625359A418D971AA44CA303BEEDD4E6363C0345 -sk = 47550E9EDACB6DDCE3D9AB81F6B61080DD4F2693854ACB05E0CCC7A4FB6390FBF89D7D99D5C3E0D10D6EF9AF054D842375F695ABB28E3B8EB495100F04306E92641960502A4293989699C6905C9DB300A0CDFA83F19BD1932E2DC1341227BA516B6955E12980D01BDD34EA4AE2FD8EB38F79068BAE6129B677426996AFEB165AA5218501774F11B54A6072CED608FA2B6F8F1CDDB4AE3BE4992383F0847735093B16E6DD2945F68F26F6B957E545B0E46BB3B78FF9A044C2956A3F36A169F071EA208AA5B59049EDE86FAB2BF96B750AF08B68EAC5EAF95FAFED36A728DB68CA29E458F9DB4D41EB6862DF2AF4A86C47BB65521DE99CAEA6DA371E304C3D5608DB6DED47E6FAFAB2C04EA4400E213392A0A1A492480450093856F298291B6305495F9E0CA01503086ECEDCA6F6CE04101CDDF1DEEF31873D63AE6C6618335FF90DBAD5ED09A2412390CAA29EE1A4572D6398044FB33D6256C0A06A97C6A4C598E60A26CFDF7897BA163B1B82D0EBAB25DA84FC57447C3FB36D83B25C08A019615A01ACF3DBB5D1F99EDCDBDFFB6F077B5D704BF77089B3E6941C3F49C642413A34F4A6AEE0445C6CC9C47EFC71B30BC44E131F2BE95C0E17F80C1B27F999BB393302E4210C66966920B1C48A36CC48F70E1A3DA3B6CC69330750BCBC44A95F611262A1BD5E9991E175EF9164ED360451E565B02818DCA7BEBFA237E3370D602C2C9E5CB58EA9A21C2C7C94DB68F18C2AEEB7CE7E6E3A91B68BFFA3FF3C07F42E96BEF6BF7724BC626A3E86F67D85601BD402FB7AABA039A43ACA3725A9E9CDB41C5420B15699DFD438E1A36D0E60751DAAA54879109EE4AE7A67051E194BB8ED6D0620614FCB12B950E1D5AE8CD308FD5625359A418D971AA44CA303BEEDD4E6363C0345 -ct = 5BBEFC27BFD5E40EFE5F18A3E7F3F11DE0FC4FE94F3EF14405D25446013117238302B48C67F29E64133A9CD3C07B6266143EB5554B3BC39E6624294D68D73138D780D4D3360E4944D1979F6A291D1E36292EA1F4D1B2297CBD0AB22E3D36FB1E024E0195268BB5A35080CE621F9A6070B2B9A2461605CA9B5CE51BB2256622EB45D19DB58EC98EF5334E9A3B5ECBC5A5CEF9B995066C1C882764213215097B8EB9171E9B931F86F93ED530897A94C97261E95A8FBFD814C30D3402085E9727CF7C7E5326A7D1F8060EAC883AE57F0DBD87566B20AF69D98A233C0024C8FF93E1D3A828D7CE2CD9BF3A17CC4E37FFDE2831D3BA528A3873E0327455C534DD22A38BD4A7ACD2C4F8D8A642B0E08AB14EBA438207B5C8FB14B15507F5096BF98FB36EC328DFD4D4C547AF658BF62A1C037ED8965470BD85AB9DA01CF3103D0D772C4F0634423A25F42AE0F7E108C768D544D9879807D6165B8885828E493035C0811D750F2A44BC495EB9F48144A75216D82473917B77952C0FBE49A329FCE9BB6AA908593CA86EDE3A33291D237F5B6BC575C07DB7880B32386E9AF1EA7B752B64ED89A8D2822C5DF191AEF884C16B758A9200F68E0E700E99076AAECCA4B7E7D402B2E14AA68BBD6570ABEF79440546F71BF44442500F7EA3A9956743159A904F96A423BDB5B60C9C388E310B04DF6B9E5B9F73B64ECE5DE8A0EDEA3895DA6EFA5A6CF6B6B93AFAFB6591CB33930925A3007586C3DC30779C3C88F37A16F0E036FA83E010E40BF289F2F5D8A7CEDC1491BA6F3F63B312688E041BD4E8424A27CBD70074702F7587279BB69D849FFBF30EDB422786 -ss = 42C434E1950DD73BC7D791973F82DB4BCD84EC988A8FA3C95737BA9B5DC5A597 - -count = 42 -seed = 44A6774B2CAC02DFF210FF861A090561A453DB311F47B6FEDB81811872D5D9489F5FC4103010139AE53FCAED209DC9BE -pk = C97BB99F73700965669142B2D9869EF77A6FD6BBF0EF059F983D6A6C2E3B9D72599E3CF5097193F3B8A978108A12DC8E865FE6CDB28D9376D1456BAD79530654BBF5168A29C0BDB79E031BA93107956970F3223E74490FCE9A41F806C6595F84C7CC415BD39B3AF0C0AAD9ECCABAC292AAD9E0B8875A41BA4A961567FF3953E4B9C1F35E016106A8E91BBDA09EFCAFDDA26EADA1C91ABA164C5373DE13624376E9EC822B9144E7C02E2C192BFF2F3A2F96EE80D90620B93FA793F2346243B4FA4DDF581B820ED6C6677E7B30EBFB15459BB6C426491E54ADE77413F1C83A50493665264AE402B649AB2DCC784A3906758EF6A2133360595AC27247FD4F5F4E6845ED3377DC7924E55E993FEC05DD1C54EA4EE0F87224A8EB3D6F6139A43A6CE64E437AE0EE23D46D0B37A350B4CE81F0CF6D2A05988E412914F839CF2BD3962DDCF0B26DA9809918989154C5510DB2886C06C50A0EA8208BB07C3212DA3B9A2E2ED82D882E515B378A5D24F36E17FE24C1DC1EB2739BA03AC40DC5BAC72D8CD147EF99C74F460FE4B959A3E8566909CC20E198C74D94F4FD0C707E17A7E46B9263EC9A8BCECBD9E12726C472AE52C818F1200195800B4D5E8CFE01702DD0DDD163E4A591DDE787B1726D5690D5C1220F284130760B1F3E2E1C72C5E8363422C24FE60A150D9A92FF9A43F5585349363F1891DECBF9501B96927DF563928FB82DB58ABF9146400F93F16066553C03D41A35C0019E77B5090BB859CC4E0E37F6476AFC5A80C808FBFFB2DF27EA23C117914A120630 -sk = 610AFB64BE8CC1DF288CFB016EE2F44C6C07113DE7F6FEE071FE0C3FE31C6215CD292E4C5F9E1A55E0489BCEFFB204D672A6215F4F3980A646D9F880817C52DDE963EB230D9043216BFC31722EB2A203C97BB99F73700965669142B2D9869EF77A6FD6BBF0EF059F983D6A6C2E3B9D72599E3CF5097193F3B8A978108A12DC8E865FE6CDB28D9376D1456BAD79530654BBF5168A29C0BDB79E031BA93107956970F3223E74490FCE9A41F806C6595F84C7CC415BD39B3AF0C0AAD9ECCABAC292AAD9E0B8875A41BA4A961567FF3953E4B9C1F35E016106A8E91BBDA09EFCAFDDA26EADA1C91ABA164C5373DE13624376E9EC822B9144E7C02E2C192BFF2F3A2F96EE80D90620B93FA793F2346243B4FA4DDF581B820ED6C6677E7B30EBFB15459BB6C426491E54ADE77413F1C83A50493665264AE402B649AB2DCC784A3906758EF6A2133360595AC27247FD4F5F4E6845ED3377DC7924E55E993FEC05DD1C54EA4EE0F87224A8EB3D6F6139A43A6CE64E437AE0EE23D46D0B37A350B4CE81F0CF6D2A05988E412914F839CF2BD3962DDCF0B26DA9809918989154C5510DB2886C06C50A0EA8208BB07C3212DA3B9A2E2ED82D882E515B378A5D24F36E17FE24C1DC1EB2739BA03AC40DC5BAC72D8CD147EF99C74F460FE4B959A3E8566909CC20E198C74D94F4FD0C707E17A7E46B9263EC9A8BCECBD9E12726C472AE52C818F1200195800B4D5E8CFE01702DD0DDD163E4A591DDE787B1726D5690D5C1220F284130760B1F3E2E1C72C5E8363422C24FE60A150D9A92FF9A43F5585349363F1891DECBF9501B96927DF563928FB82DB58ABF9146400F93F16066553C03D41A35C0019E77B5090BB859CC4E0E37F6476AFC5A80C808FBFFB2DF27EA23C117914A120630 -ct = F5DBA183B32B7F8344BBC38009F18CE09569CB9822F64F45F94C1B5B98C497CFDBB11DACF23C9FD34570F6FAE41BB97C123054629094E11BD0B4E449E4DFA5AB477D7E8AEA7D3378F366A7012F8FCBF9225193ADB1F76D833301F8920832EF3AB924DEF54B2E546A95C9B840A7B08866FB7D9D9E3BA028F696B4D68A40C2C878EDD5202C7EB84A023C390EE977A8B085C6B87550C4A5078CC6129672C069BE25BF026FF21F8B529BC31C015256486E5A1311CE3BFA61809584C908291E8D0995709A2529D9DBB5A0064B2EC3F3BF7A19F805450757A0C9086BF00E5EA686404A5540EE873F27C606134EACA4ABF08890618FCD4F876E09250EBF4BBD403AAFFFB208DC8430590ECEB93ACB741F4FFD772186797F0BC14A3210514A5E3343909717A393F27513BE6BDE0E1E46B039C2D840FF74F4BA0248157A64D50CEF75AE56B0D0992E99B74C76B6B3F15972A86B2F35A63938996DBE574038468CF5B1DE671A4509C14A0DE091876E8FFC5D8C1DA7BB73126F72A6AB228692F2A9F17E6115943D17C28115346495CCA93797E64A605CD5AD884C9418363FBF175404586E47E148A4484C949715977E95D8E3CA65D27C011546A9774F2ECBB949D81BDE97FD85681A59C3CF614B2876FB78F10BFBF63F8DA8409A58E71A7ADD697E11E36E31649ED6C3B9BD50E71D7B0E40EB85670B7D4833FC87F2CAAD1AE8C6A3A001DF6BC91A4A12A13393A687C72540FF9D2D7B39DA1296611CBA9F93E1BF249BA0E8378C90C689E6142C4EF2E51601A03A51741658C4281070C72967316465E95EE5F39829B33FE13F98C5BE234AE8738D9943A4C5AF09 -ss = 5C9EF53393459AD3D3EE31C82CFF7AC2B7C48F1BB01F6874A461D2B94D6FD5AD - -count = 43 -seed = 49E1855588B6235DF2A400C4A70AEDF8AB17B6E5E2891AA745F132FA2E7AB0C8117C1DF37C39F5D57624EB77C2B4A091 -pk = 7FE3EA04D3154198AF4894BEBD6DDE1586026718C1F911A3F27572D4BEEF615E3214E056A9CAE83CBEA3505737F75B03541F272977F6E46315A482D5DB35732E6539D25CCE19B07BB4BA9208DC4ED794217585D45C70FB8D90E7D81A5335E3ED081BE00C920CEC81F371042574B1C7A6F820C21C7EDDE3FEE35CDB01F63D58C01D90974BC1FD195DB1BF4057702EDF3540640CA7305AB2B2B52F0AF6491E2E284645BA587EC36B7ED1F18FC24A877CD02D18D853B0271EEC1690946C6992B992A93D27DA45FCAD66A0526669399675D420C6FE22292648AE0F58E4BC1EBDA331C1F706B57CFEDFB4A9B9DC7A27AD5CEBF68BEE7313DD571227BB1A730CF628C4BA4C7CB9CD988351AF09C355C0FFC75623D6FF3E43518FEDDB4C862FA0E72A22BAAD7209656AB64DF3B4055D626443783A9C20E7C71DF13810F39034977B1862E28F4F5D33B35AE59734317DC0474AD0FE67C72310BCD943F319A18D0FC8C044B4D04EE7CC3CA72684C239B774F12D79614C0464E573A613F1685721599EC2D3377BA1341FCCB2382AF11804D3D5E675F47C4F55344E1BFAFDE73F098322DC220666D7828131032166ED7BCB3C077CBBFA391D7AF1E740F328CAFEA09818FF6805FA521DEE4157279118143BB4F58B1EB0D0C9F52B04364CA73D2BF536C97A12A9267B6388FD92B198633394B05B5164AA0B87A7E562DEB10464CCFE4C91F7381F0BA40F7AAD0FBD5E8BBE7753904A62A6B8F9FD0CCB373F6FACBF932BC121BEE3EA5D015E957768E55482F7EA1004D7987FDB56 -sk = E1953800ACAA85AC02A906C72CB8E8D704E8D27820345F88F71E89C1F549AFCC8C64C049C6DFC0F1476CFFD520B055756162F7EC94243DE6B14AC0B9E5FB366C2EBA73D4AED17740C1DC2B67CA15DD017FE3EA04D3154198AF4894BEBD6DDE1586026718C1F911A3F27572D4BEEF615E3214E056A9CAE83CBEA3505737F75B03541F272977F6E46315A482D5DB35732E6539D25CCE19B07BB4BA9208DC4ED794217585D45C70FB8D90E7D81A5335E3ED081BE00C920CEC81F371042574B1C7A6F820C21C7EDDE3FEE35CDB01F63D58C01D90974BC1FD195DB1BF4057702EDF3540640CA7305AB2B2B52F0AF6491E2E284645BA587EC36B7ED1F18FC24A877CD02D18D853B0271EEC1690946C6992B992A93D27DA45FCAD66A0526669399675D420C6FE22292648AE0F58E4BC1EBDA331C1F706B57CFEDFB4A9B9DC7A27AD5CEBF68BEE7313DD571227BB1A730CF628C4BA4C7CB9CD988351AF09C355C0FFC75623D6FF3E43518FEDDB4C862FA0E72A22BAAD7209656AB64DF3B4055D626443783A9C20E7C71DF13810F39034977B1862E28F4F5D33B35AE59734317DC0474AD0FE67C72310BCD943F319A18D0FC8C044B4D04EE7CC3CA72684C239B774F12D79614C0464E573A613F1685721599EC2D3377BA1341FCCB2382AF11804D3D5E675F47C4F55344E1BFAFDE73F098322DC220666D7828131032166ED7BCB3C077CBBFA391D7AF1E740F328CAFEA09818FF6805FA521DEE4157279118143BB4F58B1EB0D0C9F52B04364CA73D2BF536C97A12A9267B6388FD92B198633394B05B5164AA0B87A7E562DEB10464CCFE4C91F7381F0BA40F7AAD0FBD5E8BBE7753904A62A6B8F9FD0CCB373F6FACBF932BC121BEE3EA5D015E957768E55482F7EA1004D7987FDB56 -ct = EAAACB0AB4E3857866E803221174BED29EA687590386ABAE72543F7BAC8E07AB05423B65EF7EC650A8F5AAD8BE75EA1F877F54C300E02A0DAC010E245399F342AC772EC4F573168F3DB342ECF60DE56A694FA154AFDF2BE120AD4FE6C15C5DD8F587C0D5E7F3F540E744FA52BC79BF19F5EF4AFAE21962EA61D13BE03D6173D69A976037201635029840109C17E8FA6FF141123AA3C126EBB9ECDE0B81551E2BBFF2A722B27068F76A7FBA384135C4F2A16F0114615E73431257004368D0C7CC45F24846BA0FB1BFF267E2FCD65C13A5F328EF7DFB73AD4FF3B3808D2F3616418381417C03616871D2177D35E1E4E6287C80A5A2864D1BC32FBFBA1DC0C39D72E53631993653127D662FEC6A69B98C13D941F281EC353C464F48040918369D2B26980C195E0A7A076494A30E2F305BAE3073654467D49483051632BB6A17E552BDBCF63FCC753628AF1E53514A10933AF6E2528600471DB9DD6723DA0056865C23B8921E2EC1FB713BD7043C32B89D21CD3BBC3B80D22161789CA35494955E61AB0C9C1B170298E42A14A466A1047F858B044ECCF923BDAAAB48430A8C22EB5E6A38776BF03CB7B38599D517C8C6B8784628D036BACB2131E6CAC8420F10739594ED29020B78CD87D05542D6F4B2AFF0531C8E6FCD2E66606D18887E917EAF0614381DE956CF9D970E91B54FA410B31058C43A6A63DF00B17244046F648EAA70649FFB96D7828F847A22790EAADD479235A86C3613843F910E6444F864514CBFB5A194FBB141C5A442C31C0190A23C4B42EAC336591AEA6CDAB327459069CE42C77886EC40A037A0CE98D6BCF1144F090FCCCDC3 -ss = 7073D9867E71CF32C57CFF13577E31EE75EDC74D3B4CD56271266921D6074C23 - -count = 44 -seed = DF0E41D2F6F86C1F79D31FD5878E7AB434FC0AF3A0D5F47D2AB3FEF31A42BD949B0E3629DF9F575BEFBB62E829E51DAE -pk = EA179E39A1BAA9063BA77CCCF9FFAF9139E419362F818C173AC1911DD9EEFE0594406C0C30D0910AF8E87CD77872C7B7F8459F7CD5FB50CF0CB14AD97682F7BC9F81DB01588996E86D816F3143F10C05581394A88A33B8B00277D9552E4BFF58C76D15DEBB07E05C8C7FF6B51E266F144D34945CD87BEE2D80D3B75F7B965B5022D1D2F957CA93A44472E93DD3F542B1D0FED3D3B64E8AD75B3146A0F09195EA782FA7F82A6EF309E007980A6F68A96CDC9DD78BD836AC2AE63063064A36146841E5041B813AEEA8145CBB30BA9252EE0A94C4EBF34E94DC9D0CC407AA1F041E775C632E8C075DC8390FB83A4E431CEE59887866DD87B2DF3CCA8F4EC0344C8A8F288765516AF374A03C8C65F968E24BEEB3D043EBD50E103050CFCC355106BAE026C5BDA09C9D8292449F6C5CE060EB678B92B0E45D28177F60F3CA98665CF5C504EC0AA7D99A8E54ADD5BE8653F8892A582017A1A996A6DC40B16D98695DA8BDBFFB722D7632758C931DA06F420411B3DFAB16AF73BB1CB3EE6DBE838626330D5C69EA2A300C3D113764AF733094964C8DB9A070E9F2815D6C524D0ACC924559580F9FB59254EAC0D9BC4C33D52CB1840E9DA29B7A47D42111E5E2F42E09DCB9CBBAC6368C8F23607234E19F09F06E0205D5CDEF4EE9229D0F2338D64D65905DF7DE09686E7C4B7397C68A89F1F9BB1A4BC6DFFC05B5A11FAF6BB9EE47F2DBDDD75B9E3AB731098F6B9E8B30787693EA03B6FC69CCBEFC966B4A2ADC00AB93D810D1DF11B448CABC64052866567EA480024D3A -sk = C719F9B2D16399B7326CE4ECA30DABEFE8FDAAB18E9F6DF888B0A134EF355570E40771856EB77E4633504899FCB86C6A3D433D0B8D60E26F07BD61F1D4ED69BD43ECB0987E039EEFB08896A033E7C703EA179E39A1BAA9063BA77CCCF9FFAF9139E419362F818C173AC1911DD9EEFE0594406C0C30D0910AF8E87CD77872C7B7F8459F7CD5FB50CF0CB14AD97682F7BC9F81DB01588996E86D816F3143F10C05581394A88A33B8B00277D9552E4BFF58C76D15DEBB07E05C8C7FF6B51E266F144D34945CD87BEE2D80D3B75F7B965B5022D1D2F957CA93A44472E93DD3F542B1D0FED3D3B64E8AD75B3146A0F09195EA782FA7F82A6EF309E007980A6F68A96CDC9DD78BD836AC2AE63063064A36146841E5041B813AEEA8145CBB30BA9252EE0A94C4EBF34E94DC9D0CC407AA1F041E775C632E8C075DC8390FB83A4E431CEE59887866DD87B2DF3CCA8F4EC0344C8A8F288765516AF374A03C8C65F968E24BEEB3D043EBD50E103050CFCC355106BAE026C5BDA09C9D8292449F6C5CE060EB678B92B0E45D28177F60F3CA98665CF5C504EC0AA7D99A8E54ADD5BE8653F8892A582017A1A996A6DC40B16D98695DA8BDBFFB722D7632758C931DA06F420411B3DFAB16AF73BB1CB3EE6DBE838626330D5C69EA2A300C3D113764AF733094964C8DB9A070E9F2815D6C524D0ACC924559580F9FB59254EAC0D9BC4C33D52CB1840E9DA29B7A47D42111E5E2F42E09DCB9CBBAC6368C8F23607234E19F09F06E0205D5CDEF4EE9229D0F2338D64D65905DF7DE09686E7C4B7397C68A89F1F9BB1A4BC6DFFC05B5A11FAF6BB9EE47F2DBDDD75B9E3AB731098F6B9E8B30787693EA03B6FC69CCBEFC966B4A2ADC00AB93D810D1DF11B448CABC64052866567EA480024D3A -ct = E08C30A230761F7D5A0DB8BA11E6804BA59048565ACE3DE0910A7B85ACD41C3E915E73C841FA52C8957A8BD82A06576161D81D838B504C1A8D95641927A346A0D2FBE493686650EFC2065B8BFC71ED4D0E7DE066B804FC467A3F3F9E24598BE2CD520B9DAC1B1BB5A28D5D2A35F824F563ED31E4FB5754C6DF8C9E1D9CB5B363537BAE541BE3AA88079ADC9C2AD9F6BB83A05E0E769E17C674B7F640A96C4AC5FB6344BC235402512918252C6F262DE4FD978E61BC6A676E4E655364814933F15C004323DCF82AA080716F6B3F0ABF53CBB186B15338537DFC72DD578AFF245F2C6C97625596C6BCA51461D0DA7B0C494F63AAD043DE99B51745C98E0610ACDE3BBC09A4552ED9D4B404C5FCB1C27C1A7D2B58BC633531286D3AE6EB9BB968B3D3190E1A5B3287129C4ACB8CE6E55B394CA79465866BFCA12E41A34B273ABFFD822E6A49D3B68CC8A94142E25F514C7541DA6A66C761808200DE9634733C7AEEB5781401FFAD17A9ABB9C6B299950ED57D4572697FCAF33CFABBD7BB00E59E6FBE64AC7140AA7B7D42E19FDC95F4ED1CA1B35C76837163B536AD0C083983687836E70BFA0CACF73F5FCA7A34A51BCDB5E6ADDE9123372A501A0339D29F36E3CD4416C8DAD39606249C5819E6C846B9D4755D46A0DB425BEE19EDAA540FCC6B877E0CD91B47CF3546872C01565B9717AAAFFBAA3B42BAEC0A089BEF595C3D7090F0A0C61EBF2F6CC23F6D2205956FAB63AE05978600CBB74750A3413030AFD7B0082C27729A475A7EA91B5643B34BAC4BA22269638573A07371D1606D0143A030FCAC21D53655A4826A60274C1A3C2FD68D357F1C -ss = 91BE7DD57957734D1F99FBB3B8348466866D62661B3A5C635E6A0FE0B26CB238 - -count = 45 -seed = D3C9EBBA6EB03CCB5C9B9D2C8D7F0CFBBF50841E24396CDDF0E56525B38918C2FBE6C34CC1B93F7BCD4F4D5777E1A488 -pk = 6BB300D6E9C072566C0AF39CB74FDD5CA9CDCDC69D6354512657F7E4484A8C35889E2B3108B2663CA5104EDC036F842FA79D14D42CF28D6B28256F4273B87E5F0CFCC67E68315E1C0195DFBB4B3F2EA21E1D1E8A334DA3A9C29B022891373063FF2152ACE06248BFB3A234AFFDCD4B3019C8AB197416DA48BADBC69ACE9D53E1C5E7EB42C8DAC3D59EEE60155C47FD646CAEBB4B6AE1FF57EE67D03FBF783AC2F04CD56228DA900BD6A705E53FE62A50BE57B53F3CA4157FD5B2A612325D53EF93AC0101D35CED0581CE8C1A15D6898C3A3DB5061AAEE14A2CD70B37347EEDB96D070446809BF224C195E1A4CEB43AB31D508C38C3EB069B128D7550ECD5DCF682239B51CA5DF3DED7C1A86AFE0BBC7297CF85E39E9F6A0BE35FC58F92BD3DE7E215CB9B271FCC6796C838B6720465BA8EB91C7C9A9B403F5AC4AD9216672D0DD7A109717B2068F73BBC60EE03ED611AB70D9BB5B18DE3338D86896766F1C533C11456F872924C73D3AA6F3B457D0EEDF30A421E90A4C14CE6F8A26950C800763CE8C5C55055512B7D1D978E894B33689F624F9A50377C1079077501F96D11EF754981EEBDB5A8906EE44280881FDFEAE05CB815A2FB824BEAFF5138B357E167A98855DAF7D7A502E03809F0C460F3EF5B238021315AC83C7A12565C4CF4EBB2406EFF20199A600BF88900F87F9DE1129B2CF860EE61FC66AF23368CFB92495CD641D0D54E75A23EE8801A421C740A5C470688B930B641B1CB83310D5A1EFBE7A723E4A1E60B705FC7718A2691E248D486A5D166 -sk = E9ACBB774BE970206C3A738E243B420805A509FA59FA902044BE2F0D013650D2DED5EDAEC5DE3BF5B4D7C2F2E18E87F499C1968993EFF196753DB8045E2C8BA8EEB442F8E281548F83319144EFE741006BB300D6E9C072566C0AF39CB74FDD5CA9CDCDC69D6354512657F7E4484A8C35889E2B3108B2663CA5104EDC036F842FA79D14D42CF28D6B28256F4273B87E5F0CFCC67E68315E1C0195DFBB4B3F2EA21E1D1E8A334DA3A9C29B022891373063FF2152ACE06248BFB3A234AFFDCD4B3019C8AB197416DA48BADBC69ACE9D53E1C5E7EB42C8DAC3D59EEE60155C47FD646CAEBB4B6AE1FF57EE67D03FBF783AC2F04CD56228DA900BD6A705E53FE62A50BE57B53F3CA4157FD5B2A612325D53EF93AC0101D35CED0581CE8C1A15D6898C3A3DB5061AAEE14A2CD70B37347EEDB96D070446809BF224C195E1A4CEB43AB31D508C38C3EB069B128D7550ECD5DCF682239B51CA5DF3DED7C1A86AFE0BBC7297CF85E39E9F6A0BE35FC58F92BD3DE7E215CB9B271FCC6796C838B6720465BA8EB91C7C9A9B403F5AC4AD9216672D0DD7A109717B2068F73BBC60EE03ED611AB70D9BB5B18DE3338D86896766F1C533C11456F872924C73D3AA6F3B457D0EEDF30A421E90A4C14CE6F8A26950C800763CE8C5C55055512B7D1D978E894B33689F624F9A50377C1079077501F96D11EF754981EEBDB5A8906EE44280881FDFEAE05CB815A2FB824BEAFF5138B357E167A98855DAF7D7A502E03809F0C460F3EF5B238021315AC83C7A12565C4CF4EBB2406EFF20199A600BF88900F87F9DE1129B2CF860EE61FC66AF23368CFB92495CD641D0D54E75A23EE8801A421C740A5C470688B930B641B1CB83310D5A1EFBE7A723E4A1E60B705FC7718A2691E248D486A5D166 -ct = 86615B86948831B09097A88714B92B75A8AFBD103999729A83B22E751B688D1BE92ECC8CF46B790DF81806151B56EEE206B34960F724DAD2125DDB1CB092175C5288FC8AB57EB637452F3C34185EF3255C8756D1D7ACEC3E248953A96C10F56DCA76A20E218D135C51F596D9C435279BF09AE80C13BAC39B28F7DB7CD4705462CD4078FE4E7E46DFD453E5BF0AA5AB26FA2F782D72DB4E747438B79F54106B251088F90FF6D922CED54119269BF617C3681E94591CC34BDBA1598920A399B1B88458075D0FF01F31645914D81CCAD1E2B234A774196D642170AFBA66847D6D1C845B2CBF14A225578DEC68CCA768A68840A5FD5817CEF6D45BE19440AEF2423D7BE71DDD28AA2C88B2D49B8C0195FFF308B18EC9BEBA6745A42128940B1DC351B67F9CD9DD8342C2C758195F139026169BB8942DA5BEC12CB6923E36DDB4562128B2275366D32A6605E8A2C50830441712DDB4D62F0AEE08FEF5244F7F971737C87006E1C633ABB4EF5A1313B875676782FBE9D36AA7AE4D1713C76AF5533BD7B73B7639344AC0140F7E4B688D73F34BC0DA3463F8053AE67E6693C939BA9156B5BB930EA58D5354359EB00D46E2414ED9EE01121F8BB7E3E50206284FF964272AF885A0404FCEF9365B07E6A11D120E991B9C298362C93478151BF899DF0BD045BDFA5FD53CEDB6A8407CE974510EA64FA103063ED8EB40C277B4F909F022C9FD0BFF7FC1AD64DCD60248A701EF686659E1F9EB3828ED4E2BF7D4BEB8854B92AAAB941AFBB88AB1C0C9B91A32246F79E168E03091B3E69FA350CCC345ECC9B2CCF6819E8A2DDDE835C85EF6CBFC5F138E2FEE33 -ss = 7D632857976B5828CA4134D42DDD775C4050823D501713B7AB62413136C5C13E - -count = 46 -seed = 6B3996E8BC6F52879F2B7BE012C44AD555707CB7E5FD8ABB3457A298336D6FDC9EB7853008FF13201D5969A315C7E493 -pk = A615E593BE16AD92C8C000C56A7A09C5B793F477F26D379A3A2D3176AB97243738A80ECE4880500F37B067880903AAEB76D8A09B7B0C766F5D74F28F343A5EB0E605BD546FEAE1EE1DF9D5D30D507A8F53185A5A87698D9FD2F4802D8D293BF87F3FB09471BD5CE72612F712970ADB8F0087E06157C1A28B84AFB9A642D8DE08001F04777F5906920A54DB74672998321A1A9282371B13752B2919D62E90DF1E6E654786FA7E99DDB072AA574AFCFF8D4606977CE38F5C0A1AB1E04216F7667779A3E0E8AB3895C299E7CAD3B867A0BF90A447591C3E8EF5969B0A9974B2EFE21345EE07514A80EF4EDFF33E6397F19A09561D8F3D58B48FA555B7AE3F8F1EA2A728318ED4D20E2AFDFC202B8EE4F40EBBB76E8879B08D754B4EFA008A816BC07833BE03AE55136C4B5B04509A9056075490AFC3FA9A454E8340B86A65B1E96EA1A217D30788C1CEABF35889221058075FDD56E96181E850802AE946521750C0CF87076A074DA61816C4770E32F46A3A6C61EE551AFD294CCF17F3E9FD99D3E67BBCE717BBC685CFA525C110759B52F6AD9109F8F52BCC902D072C4FA90C37AA6813190576152625079216BC99B66FF178319E18DF7DDB088D891D2C0C30AA7E52CF2B7C0335FFE07DEBD2672962B823D1A8309FBA5FC8A66C6F706C7EA2CF82C183D215B556AA9E9BA6057003CB0FCAD674FB23B2466F1CB78EDE0326063705BB2A4D8211F5904EA79C6830733C8B9793669E4BD9366B15E44DCE6464EE54B5F6392E1730983396EC52399960A23C089AC7D63B -sk = C1B3CBFFAD4B306F9AF0CDD3028876486DBE858875C9B6497FE20172A986C82B1C96249919CEDC2369D8D739AB125E0D2CCB82DFEBCD90240A545CDFE07511F2F254CE4E29C707FF6C23D92678583701A615E593BE16AD92C8C000C56A7A09C5B793F477F26D379A3A2D3176AB97243738A80ECE4880500F37B067880903AAEB76D8A09B7B0C766F5D74F28F343A5EB0E605BD546FEAE1EE1DF9D5D30D507A8F53185A5A87698D9FD2F4802D8D293BF87F3FB09471BD5CE72612F712970ADB8F0087E06157C1A28B84AFB9A642D8DE08001F04777F5906920A54DB74672998321A1A9282371B13752B2919D62E90DF1E6E654786FA7E99DDB072AA574AFCFF8D4606977CE38F5C0A1AB1E04216F7667779A3E0E8AB3895C299E7CAD3B867A0BF90A447591C3E8EF5969B0A9974B2EFE21345EE07514A80EF4EDFF33E6397F19A09561D8F3D58B48FA555B7AE3F8F1EA2A728318ED4D20E2AFDFC202B8EE4F40EBBB76E8879B08D754B4EFA008A816BC07833BE03AE55136C4B5B04509A9056075490AFC3FA9A454E8340B86A65B1E96EA1A217D30788C1CEABF35889221058075FDD56E96181E850802AE946521750C0CF87076A074DA61816C4770E32F46A3A6C61EE551AFD294CCF17F3E9FD99D3E67BBCE717BBC685CFA525C110759B52F6AD9109F8F52BCC902D072C4FA90C37AA6813190576152625079216BC99B66FF178319E18DF7DDB088D891D2C0C30AA7E52CF2B7C0335FFE07DEBD2672962B823D1A8309FBA5FC8A66C6F706C7EA2CF82C183D215B556AA9E9BA6057003CB0FCAD674FB23B2466F1CB78EDE0326063705BB2A4D8211F5904EA79C6830733C8B9793669E4BD9366B15E44DCE6464EE54B5F6392E1730983396EC52399960A23C089AC7D63B -ct = 239DF62F111BE10BF18B9EF4E48305D5AE432D1CE0FEECF460642DC903265959C02DBCD1AC282A583B7E47152B343E88C9F70E1D43D6DC1CA2D393CD6AE517C4396F91F31F3DB0B5876B2D367424AEE12D3C3F9AD89C7180FA57069D9F2B7C5D661A5B0086016E1FE746FD2879B67EC02BE0D32DEACE1E284CBB6C70B0CEC6904FCFDC0691404A345947A8A7A118A8AAB9A85F7ED6689B62A03950D4EF1E87B5F7ACD312CA1404755C4749711A66E2E066B9D07202FE195859FAB437D2393B4827353207F40D2BCA1FA2904A857248D2E1175535D99EB09DA68B128374BACBC770799108600D7D23E564DF16B40EB4089FDD137D5D7CA3C015BC8710629E16DC7F9F71BFF7BABC765EB2D341CB1F7951B0427C9C6F13BB286B1F790BEFE6AA53BAB8271EDB84F404E47C797D74F244DD4159C79AFBD94D639C81F8CAE7E0773B90AC4ACE1249E1BA1E8C2B308F129C88758DCAC77198415B1F5CEF77F7938B0744FC7CAC9E6F98CCC8542ABC78A24E36361D32165D716A57D66B7B3DEC8D03CBF93D641738EC876293B7C38EB1FFEC78AB4F5C3985294E3E396D5FC751D39B59C2BA4DA72E258B0C87AFD64E4B41E7C65F0FF0B173D8813666FA3681A095AA5BC780C772D083E6AE14F9FEDA0F08C91ACC0F1D488C2B0F4AD1CFC3F0C6BE3DB3580A7234107055DB881AE938B4CA3FA40128FBE5B778B6508106C4D0501B82F74B4A8A01B4F9759A941E03A0229A50E42405CC2BD72B1C5767DDA57DB96CD1572F0275A8FAFAF18E33FC1D8F1009322D98ACD929A5D52A6B0EAB98837ED67FB808423631948C9273D532BA36ABDDD142277EFBCD -ss = 9D5CC018D88D15BB1A5D3D7AEC6770B93F101F92403A890AE941A63A8734BBBF - -count = 47 -seed = 730B65ECE22DE27D573CE3AEA7CB021C415DF210D228808D91D4F380070FFCB0778B683C71D4853DEB569C822765F2A3 -pk = 8E23CA5B8DD16E8ACFB13EFB2DCAAC8D8EB1BB7CCB619ED45C571369E2C5352C5F160C3A5EF6E3DE4F4ADDC140FD40E02CC502D2050216F7FCF45C11272E2368CCFBE715A3008E7D9574F30335A453CCB2E9B4E153B13534A63EC9478534984291CCA680B95255BBB397E4F0067FD952865C1D80150DD810202B2770F2E5D845BCD1068D71180E4AFADBE7857689865565FFAD58B1C4B2A36F261F911EB5B9FB5EA625771B3F9BE2021F7D66DF5E0B94C26FD09EFB5DF1464720F91F4E1E4D67D6566F85A8B388D031880A03F6ECBEAFD5E6FB62C2016D264FFCA68874E0C96E3D05FD5C9163A6CDA6AB06A2374A7945AE48771BA04C8B46FE7CB4E664269115229172EE96F40DD2E3FD7E0DB25C3A331CC06725A2800B858A0A60EB014C683BFC3F96C348BB0086A51F751F3FDD47D47A087C45B53900C1ABAEA22E77D3FA9D23C973AACBBF6F46FCBADFB66C5E39026315B0DD9247B7AE280778E765FD2E5A3BC489FBCD62876E54B91DF6A9F517A296295363E0B0C423BE04263AD4191AE763A04E5C37207648053DE31A0304CC9E8DC47CF77449EAA42479A18D2B48A91D14E3DDE69AF4FE9885F93F9738A5B3B35B5DDBE43D9FF408AC47C9450A5715B0CEDD39D9D4A5171C16331178B88F35C5C44A3AFD95491120680B9A33002B41085C3879CB9AB26729F0627AB412729A073D659EFD82965211DD1C7FFADE02654170206E9D749A67C34F0B777E0A23EFF1B1C06E49230766B568C1D14164E283E7AB27DDAFBB3BC12F3D3B7E9186D761A31C3AC50D -sk = FF7495B8575B5A98E4FD21FB4C3E58CBB60F14BEF21AA74CF8802E3153F14807BDC370460375A778D1A31D01C42B66367ED8D9E8F84551002F552F0E52102B5D1079345C46623B897C14635FB5051B038E23CA5B8DD16E8ACFB13EFB2DCAAC8D8EB1BB7CCB619ED45C571369E2C5352C5F160C3A5EF6E3DE4F4ADDC140FD40E02CC502D2050216F7FCF45C11272E2368CCFBE715A3008E7D9574F30335A453CCB2E9B4E153B13534A63EC9478534984291CCA680B95255BBB397E4F0067FD952865C1D80150DD810202B2770F2E5D845BCD1068D71180E4AFADBE7857689865565FFAD58B1C4B2A36F261F911EB5B9FB5EA625771B3F9BE2021F7D66DF5E0B94C26FD09EFB5DF1464720F91F4E1E4D67D6566F85A8B388D031880A03F6ECBEAFD5E6FB62C2016D264FFCA68874E0C96E3D05FD5C9163A6CDA6AB06A2374A7945AE48771BA04C8B46FE7CB4E664269115229172EE96F40DD2E3FD7E0DB25C3A331CC06725A2800B858A0A60EB014C683BFC3F96C348BB0086A51F751F3FDD47D47A087C45B53900C1ABAEA22E77D3FA9D23C973AACBBF6F46FCBADFB66C5E39026315B0DD9247B7AE280778E765FD2E5A3BC489FBCD62876E54B91DF6A9F517A296295363E0B0C423BE04263AD4191AE763A04E5C37207648053DE31A0304CC9E8DC47CF77449EAA42479A18D2B48A91D14E3DDE69AF4FE9885F93F9738A5B3B35B5DDBE43D9FF408AC47C9450A5715B0CEDD39D9D4A5171C16331178B88F35C5C44A3AFD95491120680B9A33002B41085C3879CB9AB26729F0627AB412729A073D659EFD82965211DD1C7FFADE02654170206E9D749A67C34F0B777E0A23EFF1B1C06E49230766B568C1D14164E283E7AB27DDAFBB3BC12F3D3B7E9186D761A31C3AC50D -ct = 1434D5ADEB3705D1F75759E210B9D661AC162CE9AF2C0A79E6731D3AA41FAC7D3483CE63F213AEEDF5565DC38607191A730C3880E9D4F4D873576A05C0C33358D4A7F4D95BBB71DF931F88CDB587CD7E64FA7790F803FED92AA1DD659B337CCF71FD0BD2961A0F024C9D4498976EFA6808929029371E17785543AF98F1E77DFFE9AF7272B74BB6060A299D8E503AA9EB395532601A2853E8639199FD3EB75EB903A1A2FF9DACC9036B2C4DD14691968D4682236AB5C1EB615348B35C0C8049E77CF752BCBE707EA12F90E6A290B81FF0D42BEB1FC70ECBDD5D7930AA59DFC0B73F23296498EB9A1DDEF0CC95EA08444E884BF6A2BB5765BEB2ADA4EEAFC136C1DEBCBFD5F883536554D027EFD2B57DDD860C2F4686218415C705F3EA956BF4C87D3176F15D8D44FFE5DEAC3CB5C88D835F301A6B64D40BECCF286092A64F3E0C039DD0076552EA02C30E2554B553AC8D379EFA0786A1CA07A2EBC28C7691E2516CE6213E8FE1522CC379463C9ED2CDA7978E19A90911BA0EF48BF7151746E89E05F9C537026041891057B25912D77A066014BCC79CA1212F7841512E6CB9ED0F500AAD18F9458E40FF1F78942749E8206D8215DAB0B6234BCE58FE66265D960542D82E6C5FADFAF5B681360B47353C4C54B604450E28DE1476CFDE211663F14BFF2DF9AF9813A2D56B7BFA8C8D63F8978C193BAF1219C3A6D764DEC36366771AB29725E02C5B5E8618E6E9E841AB728282FACDC9CB53924C4195AEC0BDE31323D709BA437A003B6F815F03C2BBEEBF6736C6DF0512A09CB7D6156A6CC51F84F2BDC8C8A5994A10DEAEEEB62345A488ED5A640BF2 -ss = 4C1117E3E10F8035448ADAB5EAA7F03B204B4D6319887D11AA75678EA6304FF3 - -count = 48 -seed = 5522A5A891A9A9B5514F4556AFD8DF40B9CEC63A01492F0CB8A1DB073A285A963E4A9FF2376C88662F7D8D241F8ACF17 -pk = DC74114035A37B5328891E908AB48E3D663B9E356835F50D821E9B67C199F43B5A1BB1F6B67390DEBF8E6BD88933FBDD1C88BE423228D3C753D4BBBE6CD5BB05A12FD0F07922C0427AB0FBE5101608A3BE583FF5BD318C85857D8D2567256665F2DF31195D21718008B1AF1270E8910E804E78D1B84370A6D2E51E6F10DB3F35030E9E96E6A8D7D034BD217CBD193A8D9EF1684D0AB0AF90FD8505BBC55D2EBA9D61025167DC674CADDFC70E9F36716BA8563B3344F2D9B5D0B69419D21D03BECBFDD64630EC9EC5CC0B9A98D54A3A8129BF40FA2D02DDA6D38AED591388074A134CD2FBA03DABEE6D819422C80C7224A10C0359BF8FC9442A9CA8B42B074BC327707BCFBD539FAABD2FD813E0F62EF0E0B66085ABE9E692934C86757FB83182362AE7D3AB32BB7034B12CCD4A25C3E46C0BFB8D4F14C41039A4638457BE60B4D8501E258B38BCF3ACFFD40C8DE77FD8FB0C5113278203712FE2CA365B7A67F216B0D0F5E2004DE1BFAA3EF8893E6D1F8BAAB9561AC6C23E0959CFD7F0B33B557BF95F9940C624BD6EF7EB5F25367C766C5DA650E68CBC200B7BFA056DCE8F8D2882560D0BB3C4970905F2437366A958570B7B8B997009BCB90A82D3FA7DAE4D2331D3EB55B7EACD330184803E0359328400499D2D3922360EF8CC47A0055E202BEDEF49ABD84A3F46C0E0DD5347778FBA5727561093B91B41A5B68187822D29F3B4CD0E0BF44D0BFE6E20E2A4DF8A0F4E02B102BD5C80882AABCFB6DBC0E3FA1FCEE6DB6B55B53F2F97D39075CF8A1681511562 -sk = BDC3FBA1C32751139FC45BACFFB3EA97F26573D804A5F27A459293D95190ED8EFD5A08F656A6EB8CD20679930A31CAA6A6331C4B133A6838C223EF9F769F6246B1C126AF949A371C0C30FF2C2FA35300DC74114035A37B5328891E908AB48E3D663B9E356835F50D821E9B67C199F43B5A1BB1F6B67390DEBF8E6BD88933FBDD1C88BE423228D3C753D4BBBE6CD5BB05A12FD0F07922C0427AB0FBE5101608A3BE583FF5BD318C85857D8D2567256665F2DF31195D21718008B1AF1270E8910E804E78D1B84370A6D2E51E6F10DB3F35030E9E96E6A8D7D034BD217CBD193A8D9EF1684D0AB0AF90FD8505BBC55D2EBA9D61025167DC674CADDFC70E9F36716BA8563B3344F2D9B5D0B69419D21D03BECBFDD64630EC9EC5CC0B9A98D54A3A8129BF40FA2D02DDA6D38AED591388074A134CD2FBA03DABEE6D819422C80C7224A10C0359BF8FC9442A9CA8B42B074BC327707BCFBD539FAABD2FD813E0F62EF0E0B66085ABE9E692934C86757FB83182362AE7D3AB32BB7034B12CCD4A25C3E46C0BFB8D4F14C41039A4638457BE60B4D8501E258B38BCF3ACFFD40C8DE77FD8FB0C5113278203712FE2CA365B7A67F216B0D0F5E2004DE1BFAA3EF8893E6D1F8BAAB9561AC6C23E0959CFD7F0B33B557BF95F9940C624BD6EF7EB5F25367C766C5DA650E68CBC200B7BFA056DCE8F8D2882560D0BB3C4970905F2437366A958570B7B8B997009BCB90A82D3FA7DAE4D2331D3EB55B7EACD330184803E0359328400499D2D3922360EF8CC47A0055E202BEDEF49ABD84A3F46C0E0DD5347778FBA5727561093B91B41A5B68187822D29F3B4CD0E0BF44D0BFE6E20E2A4DF8A0F4E02B102BD5C80882AABCFB6DBC0E3FA1FCEE6DB6B55B53F2F97D39075CF8A1681511562 -ct = FF5180A00E8D3999AF930DC3FE565C73CD76E1429BCBDF600D3A80D268DC86764BE58CBA103F6D4C3808B0A8D1229E29FB245A3F36B80108854E845E26544D14AAA77F378F9C045FBED6F1CA39F9A613B2BC17C867AA07F194CC61BB5D30556508157617232E70644908CE2D0EE75D18A82B331F573543E63904DC4217A21EA9ED279B1EB6A272E69B639DEF9D50035384B49B4D5738BCF12E7D6B431BC60EF4AF8809C370F8C36773CD1ECF4AC7EA7A2F016D64AC1FE6AA98211123BED06FC0DEC213929D85C4609BE6E57F2A2EB908C389CE11986C50CA487404958B858D36D94A152886D9184E76057D4DCA954577BA2E0B9B8E5168F4076561134D4C4482873C6A8EE6778544A2285F444625B93820F0288221B6688BD2313C6136433FF4ACEB3B84BA04AA0BDFF5534A11522FB960C5E6D9BA27BA153B009D7024C746C8521DC4E935B72732BB7BDDBDF0D65124EB08E47D47BAAE9B030989D8C939CB5443D2EBFC9C2149E19CDBD80CA40C5F74B07BE5BF1B941F59598AF769B8E97BD971C0342F578B07D32AD30CCF6BF6BD09DB1CE2392B5FE73BEC2E030374F8794D79331969DF21E07312CC562BF3E2281B439F7877601E5BEA2180DC681EAFB233372293F0F2784AE50D4A82DB455F4E622749C7B22B47DF45542C24DA3C4C7E050B73E403D1ED3D39806F4C5BA8FA2439D815E26127B2DF3D8768D900488E2BE98E88A9EE9E8A96DF26FAAEC5B9680175B05BE43254158D4A8463F74913D5E6D5C09F0542B2C77A32D5C92AD68555EB90CC040A6E0C818B83606A4F4AF9E645817AAD4B7EF6FEFE423C394B38D82CF14E1AB6EB5F -ss = 4ACEF422DBB0D1F49DD4367046C29FC7CA96FBD872A025D000DEE4CCBA6B8951 - -count = 49 -seed = 1853E72329353B3F89AE6A1B1EF700DA8ED3C10D19F9E61EE9252E28EBB0E15802EE43083A12A0B7527088832605E3AB -pk = 6A86D41BD20C36A56AD76089DE620F4B6BBB9F9A8B0DBEFE95D1B9694EB3F4CBED172BA94C3671DDE7D37EE39C355B9DA0EBB3A434524C72DFC066DAC3650E3325653476D31D9FB8B17350DFC880137632B0CB45630F6015DDD492345334C115D10986F6573B55121935702BBBC53AEAD879F5F9328D61037D1D9EDA992BDC63C2BDEFAA604CDD28EF2835800451488E15F91CD42F7BE6665AAD2639E738EAED77F7E0B855568148A5DCF89ACF2FF76A5F8420BDBE60E5A6D9EAA30510F82B677BF1C0D790B356AD8D6069A3FA453AE67A61962B84535EB3A737DE19E37FEE1898549471568C443A70D59B27FD07BC16C05B1FBCD7FE44732FAC42AB677464D9240E8D5304A384828367D94DEF4FCEF80CF4BA5E5C02EED88A603D19843929DB0F3929CE0732A56DBC6620338269300DE739AFCF8800DC9DEAA84DA0DF4432896A3E831A69B53222BEFC4328AF0DEA9DC795821DFE46A3F6B07305B38F3C288D4A60F5FD3D1D515BF41AD73B828882C9EE9C9863FBA3453A19FD513447B742301FDE3DA1742C8FA0294A8A4EF0E7FF03C073C265AC1284B5CFF01B06D62E1E7318DF606EEE1CAE5AE5709F5980333CF367B01CB71E3EF93DCD314A0D43B300EDF6AB3BA360C3D4240E3C61635D27FFAB79F2F31DB60F0A7E1ED0307037FAE1463BF2DB4804499B8FA4E9F667F2E4D70B8221A3D7610D7F6E7AE6B8ACDE68112E965C77170C7A4F420DF5E39CDC5EB10AF400392D017C87338285F9F7FD1DE3548AB2FD24BE767D075FFDE951144D0D92389F2E11 -sk = 447F6076A627BBC5AD7773FBFEB14B4BA9AC43A0F8B99FB6DCD5E452AA3C47EC20A7237801F470FCC2BD9FD7BEA8322859B850F7882D362947432913DD068C018947AAE799ACCE17FD368D5E1B6C0D006A86D41BD20C36A56AD76089DE620F4B6BBB9F9A8B0DBEFE95D1B9694EB3F4CBED172BA94C3671DDE7D37EE39C355B9DA0EBB3A434524C72DFC066DAC3650E3325653476D31D9FB8B17350DFC880137632B0CB45630F6015DDD492345334C115D10986F6573B55121935702BBBC53AEAD879F5F9328D61037D1D9EDA992BDC63C2BDEFAA604CDD28EF2835800451488E15F91CD42F7BE6665AAD2639E738EAED77F7E0B855568148A5DCF89ACF2FF76A5F8420BDBE60E5A6D9EAA30510F82B677BF1C0D790B356AD8D6069A3FA453AE67A61962B84535EB3A737DE19E37FEE1898549471568C443A70D59B27FD07BC16C05B1FBCD7FE44732FAC42AB677464D9240E8D5304A384828367D94DEF4FCEF80CF4BA5E5C02EED88A603D19843929DB0F3929CE0732A56DBC6620338269300DE739AFCF8800DC9DEAA84DA0DF4432896A3E831A69B53222BEFC4328AF0DEA9DC795821DFE46A3F6B07305B38F3C288D4A60F5FD3D1D515BF41AD73B828882C9EE9C9863FBA3453A19FD513447B742301FDE3DA1742C8FA0294A8A4EF0E7FF03C073C265AC1284B5CFF01B06D62E1E7318DF606EEE1CAE5AE5709F5980333CF367B01CB71E3EF93DCD314A0D43B300EDF6AB3BA360C3D4240E3C61635D27FFAB79F2F31DB60F0A7E1ED0307037FAE1463BF2DB4804499B8FA4E9F667F2E4D70B8221A3D7610D7F6E7AE6B8ACDE68112E965C77170C7A4F420DF5E39CDC5EB10AF400392D017C87338285F9F7FD1DE3548AB2FD24BE767D075FFDE951144D0D92389F2E11 -ct = D70ECCE068BEF9327ECE8E20430A934C8B54FA7F9245C0E8F9BC71B42C7A20949F4E451C1DCBE3C8096A93A1BE8E86059C66EADE270DAC336B4ECB3AAC07E0BE0E027D327CCDA4B9D094ABE4E95CF1F8038A52E85A2C43D56D50BDFCB812CC0CE265900CF4593BBE9D22DFFA1F37803FDD833F3825F37417304D88100F1EFCB96C9A99FDF39DCC598E5A5F764C9377CBC0542551DCD62CDD6EBE1AEF7601FC33C283EBEF64B91F0238EB2D4D499EE8F9263D1D638607BEBA1B881306F742BB8230052EC52B6832EC8FD80E8FED8F300FCE5977E1DAF15FEE8E3FE6FA497B747541ACD581A50D4B52A82B8A89D8190030366F9060E4711A156715BAAB86A299E66312E35F718476E37FE4534C871D75F28BB183389D0A0F4AF323788AC0B9A6175790CA9C42442AABCC43AF48BEF3C0C57E4D13E2E961B00122DE4DC91EC87BFDD489889FD692D921BAA4984A031ED33444262E00216D86F911459F14F9D22BCB554134E5B245F1561913F6D63C1071D460A554CDA480EC638136848873F6A5C7E33448E6050E9C93FFA0F1C2DF79F59708AED911E2ADED8C6BE8871DC5F2F7DDA795A13928FBC89B2BCEE9C25A08246224CF4B5229509664CC18DC91E6A2A24F9567D943D7AA65DF35C43B3611C4D129C755E147D34383613DC946A7B01AB87A2FDE07D86E3E747BC90A1A40EABC14AEC1026E40BE2490136680D05B7B0F84234AF801E1E6F3B4CCD125514F51EF209B8A73CB3C68C918517CF70073CE4FF73FE0FB5706F0DE70BF529A0B4DD7FD18FB032051325756CD1EC354E28C46AD47EB314727DF8BB7154B879B71D14406EAB43D707F84 -ss = C54E70E7194F597FCEE8B17013B77285223253A43FB6EA82D32C532ED4E4F41C - -count = 50 -seed = 027C3D5847ED4470931141104F25B19AE76117CBB64B224EE424FFB782E9A0E988839E0BDED0DF666FE8E5FCBB5DBC09 -pk = F51F51D2278E6890FCFA73FDAA12F112BC7CFD5B3B88E59B630B7D12D0F44A63A6E0ED43B064663360DD83FF4CA122B7E14CD3A350CEA4CB263F8E283006A84A06F4448FD93DDAAFDC88B8F410E5C2EF8925DF331D0A05F1C79021C99F00CD4FD17ACD0911489E40A895F2F7F8D1BCCEB91EA54E4206C2A6092F069F942821E0F98D72A9ACC0D72D1BE115EA379F85CD8DF484BB6135CEA7DD5EDF99CFA73696C512F26346C659A57BB812DD73E76C5C4587FB8BDF9AAC2A19A1E32FAF3DEAB64093EC175D4932336C2606F804AAA923BA14F25158B30BC6B389ADE5E8FEC02818A2B5B97FADFF918BE47C199AC607FC8B4BF93EF38C689A1F55E8181F48D5563833B5FCEE5173C812DCFF2AE7137261F319CB96CFB80D150D007A07ED5C886A874049D6105EB5F774DDEEFAD84F9B67408468C925E0B8D3544D0B315A19B3BB71EAF837C0029ADACC1CC09EF12CAAF60D86C96CBC49CEAA5DFDA7752BB1ED23714B85D0BC79872090F76ACDCAF53718B79E4F13866AA95261BE911096F5ED80E29579F3AF5FB3E4EFDF9239655EFFC0416D09111F3F376F2DD529ABD91D80DE64F0DEE88E31790F569010CA3D3640679707CADF9235F15EA163A8273BED7FDD34787C10FDF7AB216EFD37C37646CB47C76955598148F22E7645852050CE9B78BB7A2DBA8EEBAC8E532A6D7840D7F43F7DF4BF16A78D13010B3A6BF7F36E132BA9963F474F0A9CF69420D6595AF7EB4CDDDDAD88574132CEDF9F3812998341219D27A68544E9475C6AA6F9350A06D6AE15063E53 -sk = 2D5DF64D62CB07FE630310BB801C658DBF3D97993E68626745DE39D37FBFC2B27B534537ADDABA4ECF14F02AB317D36CB9F0F50222CED7CF029DFF8A0D3D2FD9AD11C88352139F355097E0FFB2E7EE02F51F51D2278E6890FCFA73FDAA12F112BC7CFD5B3B88E59B630B7D12D0F44A63A6E0ED43B064663360DD83FF4CA122B7E14CD3A350CEA4CB263F8E283006A84A06F4448FD93DDAAFDC88B8F410E5C2EF8925DF331D0A05F1C79021C99F00CD4FD17ACD0911489E40A895F2F7F8D1BCCEB91EA54E4206C2A6092F069F942821E0F98D72A9ACC0D72D1BE115EA379F85CD8DF484BB6135CEA7DD5EDF99CFA73696C512F26346C659A57BB812DD73E76C5C4587FB8BDF9AAC2A19A1E32FAF3DEAB64093EC175D4932336C2606F804AAA923BA14F25158B30BC6B389ADE5E8FEC02818A2B5B97FADFF918BE47C199AC607FC8B4BF93EF38C689A1F55E8181F48D5563833B5FCEE5173C812DCFF2AE7137261F319CB96CFB80D150D007A07ED5C886A874049D6105EB5F774DDEEFAD84F9B67408468C925E0B8D3544D0B315A19B3BB71EAF837C0029ADACC1CC09EF12CAAF60D86C96CBC49CEAA5DFDA7752BB1ED23714B85D0BC79872090F76ACDCAF53718B79E4F13866AA95261BE911096F5ED80E29579F3AF5FB3E4EFDF9239655EFFC0416D09111F3F376F2DD529ABD91D80DE64F0DEE88E31790F569010CA3D3640679707CADF9235F15EA163A8273BED7FDD34787C10FDF7AB216EFD37C37646CB47C76955598148F22E7645852050CE9B78BB7A2DBA8EEBAC8E532A6D7840D7F43F7DF4BF16A78D13010B3A6BF7F36E132BA9963F474F0A9CF69420D6595AF7EB4CDDDDAD88574132CEDF9F3812998341219D27A68544E9475C6AA6F9350A06D6AE15063E53 -ct = 7515BB17FDC699E6091DDD810FBA24E05BD134B399B79F121886339445F47F68D8CD7ECAFABC695F8FA1193265CE6A17D8D765B9D87D957D35113C47D4500752DFFEF5B7A15199AE7A3929E1032512FF1062FE8E61D94D52AFE47E39A93FB14F728ECB51A2069DDFA8EA7B45D109F54A22D43E1A775FEFCA7DC950CC4706933CB0A7586B12EA5F5B447E39F00191ECC19AADD931BDDE64C7C1BD1B8845E52D60E6B6CC179814844CE2E911F0D1E64953A2AEDED7C2B63FC610E9B5646AC57D31908D15493B19713BFC61F451A21A655E32D4CF80EF11B5CFBCABFB1B5B7D6749E4656A6A3D0DA7263BDD514A317E432341585072BF5C0E716E159DDF3F6B9A1E55E42E931E51099B5EAF5A7986EA89018803CA1A5867EA9F8450DE4987734B0B17E4CC20586E82D15E35B8B3B9BE29F117CA5181670178DCFFF8591B85D0AE37264161D35FD48C0CB4303A7E57A523622F25A2266A67BF717E584FD9048B484EBA7D424036EE787D1D6CB478A953F3BD6B1FD85158B03F0E9E5D29B5BC3E9C98B5A3FA49AEC97098976F6DBD8E1BEEC45EB7A64645C034CDD86C26888D9F7D11BD18B6F9F151C5106CA152881EAAE69201FBEEBD2DFC95ACE377FB9446D24F89F1441E25BA66614AA42FC293C034CCEE2DA1FF19822862CE2E56743F4D1AD2C82EA6E5DB7280CC3CF7DAF5D8F3B12444EA63EC98D4924BFC310319B177C2B3CE63A844D26C926FB78515B9FFBEBBFCBD60F0842DFCFD050ACF303ABEFE31918BA1B1154335AA2D242E2F0EBC0B0AF4CCFC81B94662BA43A91D2BAC1A74A08C2B6F2380E03BC9804A2CE1751475982893FC4CF73F -ss = 828E97638076B1AE2CE45C961FE4A34315EA7AC451F95731A2A1A569977AE047 - -count = 51 -seed = 450751D4401737459C6D93E6C5F2FBCC4A3AF7CD7250CCF404BBB817A67BAB7B4C9D0EF4570BFE25CF919DA331C31D88 -pk = E9DCB5C5F61215CB1AD2397F85571D5006640CF57680B3302C06A39820C0CABED8B14FDB2067242CCF06D739254D80C23CF11E126DD64262961EB538976C4BECE2BD01D7F004CB3253BD876F6B7C522B2397E4BCC8E9E3FA248B43874F3890F1A41084C19C524C6DCBBD8A0B88976D33AD39DAA75CA1B88B81EACBA2577AB03128C08595B8CF8DDF20A6A6B3E0FBAF4822BDDD1938E3448974A8B47E6B5A682E6B0452015467BE05EB98E346CFE518FBDFCF0B251D622B271FAC34592C34B6D7BFB84D321FA696ED48D67BE35168528E19C47E3F1F480B078D9B88CE3FD6C28382DA96280EF4FD5B47B7EC08EDC782B694FACB82DA086147BA1B3D72479537C7246B4A512E852A25A2EAA642F01BD35EC6E833EB3C8BBB4EB90C37E32A2DC1220C1F26C56CD9295532531FAD57D659E7363A377D902F3C40D30B806EAED2FED9AA38F8879E5F54F273CB77AB6AB72DB19A51706DABBE6A7487E23A6ECC05D84E07E54606038419971F8BCADDC6469FD3B20D944AF9424927A9969A6E4D77CAF17AEAD69126ED4F10B32CE0AA1BC02A7DC0DA6020A9EC69C31A2CBF8D9FB4565BD3DA46FF5E85FB3D476E44B83BE592C5F0B1C5D7FEB7D597B7DA6C3C996EAEEA8DD313BA9B629C82FD598C3935B7E8959CA093E0AD4483CD1C2E8B79EC9743BFFF0CB9246DEF796CD597E10740146276667DCFAF264F7F9464B3E627E6AFC2624A821500E2726B269CF33852A838687329C889D26F6BE8F7995C088751F7185EE8B71AA7FD844A6311136D3157425E79B427A537 -sk = 25056D1B8113BB362DD979D98643D7A7AC9C4F95994C0BA060609B6D07002FF3F48A9254DD40B117941FA35A66BB50296327B725525DEEF70E128CA8045EC45129C76D04EEF82CE39E21F4C96A5A6701E9DCB5C5F61215CB1AD2397F85571D5006640CF57680B3302C06A39820C0CABED8B14FDB2067242CCF06D739254D80C23CF11E126DD64262961EB538976C4BECE2BD01D7F004CB3253BD876F6B7C522B2397E4BCC8E9E3FA248B43874F3890F1A41084C19C524C6DCBBD8A0B88976D33AD39DAA75CA1B88B81EACBA2577AB03128C08595B8CF8DDF20A6A6B3E0FBAF4822BDDD1938E3448974A8B47E6B5A682E6B0452015467BE05EB98E346CFE518FBDFCF0B251D622B271FAC34592C34B6D7BFB84D321FA696ED48D67BE35168528E19C47E3F1F480B078D9B88CE3FD6C28382DA96280EF4FD5B47B7EC08EDC782B694FACB82DA086147BA1B3D72479537C7246B4A512E852A25A2EAA642F01BD35EC6E833EB3C8BBB4EB90C37E32A2DC1220C1F26C56CD9295532531FAD57D659E7363A377D902F3C40D30B806EAED2FED9AA38F8879E5F54F273CB77AB6AB72DB19A51706DABBE6A7487E23A6ECC05D84E07E54606038419971F8BCADDC6469FD3B20D944AF9424927A9969A6E4D77CAF17AEAD69126ED4F10B32CE0AA1BC02A7DC0DA6020A9EC69C31A2CBF8D9FB4565BD3DA46FF5E85FB3D476E44B83BE592C5F0B1C5D7FEB7D597B7DA6C3C996EAEEA8DD313BA9B629C82FD598C3935B7E8959CA093E0AD4483CD1C2E8B79EC9743BFFF0CB9246DEF796CD597E10740146276667DCFAF264F7F9464B3E627E6AFC2624A821500E2726B269CF33852A838687329C889D26F6BE8F7995C088751F7185EE8B71AA7FD844A6311136D3157425E79B427A537 -ct = F302EF3F9F5B75304BF93384717C94D7779781DDDEDC3DED5F44D7BB306C90DC8493B0E1755718C1F63053B7E2910B341FA9C21BB598DC80C150E8719F1E9C55B3C78CD17F76A233046C5ADF5A3047DF2C66A782917789B5124296FD11230D9808BC84E29449C41B2250C3A87827DA8C73B24C5F5D753BC7DFC5A0955CF44AAB66C1D0CC6F70531B15ED90751A36A2A3BCBB214D7F6439C6B8955876160F4D008C2E0822D4A3D2E360BA2C1F60B473D9852ABD73B57854E3BD3D68468C376B568192EB96211BE343DC3BD57267BFFF476A41D2E963AE67AF124ED19A42E9D0E25DA7A2D87D90E6CC25ECF707DF4D7D456DAAD30B2B1FCFB2DCE279DE595C64CCED47BF4F21AA33C801AB78C5756D879C44A02332977A83296F1BCC0F43E6859749C32E0D4D9920A1754F3D415E28EE02CBFF44677EE06338E4C4BFE437AD8CEA1765BDFEAA28969CAB7CDDF123820A7872E0E1FBFAC8675C2C995AFE136B22870F4D0DAEC8684CA52D2B7D2CCE9167FD41ADDE6DDB172E279D49D7E39A3555B857291D6F8571C74297930DF4633DBA5411E52460BD4F218FD0A187EF132FD37A2F79D089152E4100C5A5AEB608071276FCA5AF35BBEFA9F067919F9E8EACDBCCFB31A692DCBE718D5B25EE4AEDC15227B1A113E1166EA3724B5FFDD21096E8A2BDDEEB668DB5CEA1712B9C956177683E4FCDB5D382108D8A3AD88BD468F302AD4E5B0959D919C3E871AB8FA6791E450654DECAAA9F12C4A615C3DD8997C1337A8C15D2AD36DE8FDD985518DBB4A483FC1E81163FE4FFECA51A31DF426AEF0C1D3766AD23DFB2C7DB846561686D5AF52C37F4DD84 -ss = 2798DC47E7CE8E60B363CA03CFF8B45F2EA8A302D781EA9E441E7643D0446DAE - -count = 52 -seed = 5DE720F2D152BF4E1F96A61E7AE5F1BED6B8548E32638C2CCEC9F43B87D1BB43DFCF334F0582984D27E440D519AB662F -pk = 8BAEE6F5EFB85C4A82C457B89CCA7CE86A450E423E902E36FA5714804FBF9D7307939FDD1A8A9C0AABB219FD171EBA0E8BFC27C976BB4F34034849418925E79BDF4B28815761D32444192D7F66B41750DFB60CD1982EAD1C00ACA7D5FC563B7CA3CB95E47AF65F31E8606B1E7564DFF3D979D3EA5023385209C628E5D58C29CAFD15C79BDE7330EEB4050ABCAC7B6848617CA93A93B14D5961820D9E5F7F6E3ABEC8308E4C7826C70062A3AF86E7361BB80F630D2108512506EC732ED606B625B45C6EC4C8EF3209D2A88DBEF67F28DD1A79A5523017B1BD77682D09DEA4F6E08E5370394CD6159EEDDBE17C26FFD1ABA69A6F2CFB3AD4CDBF2A48B048343F3A653E2CDB8F3A369A71E3C3D95BCB26F4CCCFD2FCB5E6395E1F6EC070CE26A7C99718F9127EDDDA20963F7B295D6B1C54FFC1B5D6C144A9DC7584B641A086F4427629337B63F7C47EB55806A70AAB5084482C84D52655408B3AD78237D64AE9BA7226DA0F69036C54ADEEF12B16B0D2DB3F244B802CCAD42168A352004836C8FA1F2958E228E57B6929703919D81A536AA4AFF3CD824C726A05F630A5A3571395D3DA67D89C29B68E76919B9C9B6132707137C8B0BAC4284B209709A83981C23C6B3FBC12486432DA559324E65F596D966046F7E63841CBA48ED450FECF06AD2E166C09F90D6C15B53894D815E492A2075AC777A83C4004125B6B773A1315615BD3DCD75EB719525F87AF367B9E3F245CF623FF7FF4F3299C07B5488FFB704417D7B50A1C8D2E918A511F01C8ADFE3EC45807FE13 -sk = E4D34E12982AEEB1D62FD488D9B9E28557ED3429292239FB4F76FA9098009ACAE6C45C7FC62329B13C8D29844405DB8FF6860DE474BF727ECD19E54E6E1A141BE969CCDB4A327CF359BF5A383E2A90008BAEE6F5EFB85C4A82C457B89CCA7CE86A450E423E902E36FA5714804FBF9D7307939FDD1A8A9C0AABB219FD171EBA0E8BFC27C976BB4F34034849418925E79BDF4B28815761D32444192D7F66B41750DFB60CD1982EAD1C00ACA7D5FC563B7CA3CB95E47AF65F31E8606B1E7564DFF3D979D3EA5023385209C628E5D58C29CAFD15C79BDE7330EEB4050ABCAC7B6848617CA93A93B14D5961820D9E5F7F6E3ABEC8308E4C7826C70062A3AF86E7361BB80F630D2108512506EC732ED606B625B45C6EC4C8EF3209D2A88DBEF67F28DD1A79A5523017B1BD77682D09DEA4F6E08E5370394CD6159EEDDBE17C26FFD1ABA69A6F2CFB3AD4CDBF2A48B048343F3A653E2CDB8F3A369A71E3C3D95BCB26F4CCCFD2FCB5E6395E1F6EC070CE26A7C99718F9127EDDDA20963F7B295D6B1C54FFC1B5D6C144A9DC7584B641A086F4427629337B63F7C47EB55806A70AAB5084482C84D52655408B3AD78237D64AE9BA7226DA0F69036C54ADEEF12B16B0D2DB3F244B802CCAD42168A352004836C8FA1F2958E228E57B6929703919D81A536AA4AFF3CD824C726A05F630A5A3571395D3DA67D89C29B68E76919B9C9B6132707137C8B0BAC4284B209709A83981C23C6B3FBC12486432DA559324E65F596D966046F7E63841CBA48ED450FECF06AD2E166C09F90D6C15B53894D815E492A2075AC777A83C4004125B6B773A1315615BD3DCD75EB719525F87AF367B9E3F245CF623FF7FF4F3299C07B5488FFB704417D7B50A1C8D2E918A511F01C8ADFE3EC45807FE13 -ct = 0B4FBD4A5097A7265728C2EFF1C4B72EF2E075DA4456E65C035D29383822B75A063EC193FBAD0491FEF2984A1DF8F42E8E1CCB40065FA97DCE0BBABA821B925F3209CB8FC39F5EDBAEB3AD04EAF643FED01171B4596D474D17E241305001B8E0B23EAE45E87B1744CA0A4E9E171C844B1CC909E71EC2F23E94243D617C11BED8903EB96C99F980FBC78B349D52C9727857819E9155350B8FCFFF8FCBB74153BCC2C8760BD1C1D3464733BDDD67114781D839477AC685C7E32DAF0155FEDCBC6694D5FA194E7E3BFF071A0A675FC1E262F5AF8DD475A2C2DFD5BC278A6B168564AF053C3DDCBC6926FB049F4DB4782036923D494802022D61D80DF9FEDF9CC35BD5BCE3B0FFFD61FE9E0ABD169446F908137E8C73C8B21B4F1420C2195FA78FF92F5CEF028CA1F3026C6F0965FEA4DBE9DA80602BE51AFC0C34EFE5DEF21052D74AF03A6371206A46157BC39FDB8F2E30C7C44C31474DF5D45CB61AA584F02A55B5FD3BB8B89D48E25512E789C33162F26A82E44196647B219420F579989DDA81167C88BDB8E61E6D72E7780A6850B9457D87020A8326CE2A9D1536BFF653EF3CFA86E56EDCCCAE890F71BAA5560272F0D35A3715B39416023874B717084E7C93A1B05BF097EE04FACF747160C0A52128EFF2E6F0153FFA2353F330807B67707094451DB2BCB2948E464ACEEF3DC350F266D773E621DA3450CE044899E20D7F10577FF07A68C6F6C27D55D6974139597166E714A7EA19790C146E7A864DE051A63EE7C29ADE75BEE3BB5A3D7F8FE04DC8AC15BE2D9AEF3C690E3523FCA19084753A57BF21B5D1F3D87675161FD2C8613BE100BD03 -ss = A9CC3793476808A1248911D3B0D7DCDB32CF92575AF827FF5E71DC9FDE6033AA - -count = 53 -seed = D71729DCBB27D7CB39E9E905025D3E55C8602EFBCC483C9B866EBF82326157833169243C14550AD728BD1470F39C642E -pk = C63CCFC7C0BA0DEFDA9D496A9945355E042274F18BF9B607FA693609B58BCBAAE001071C7916FFE11D517BA54C5FCE7605C7F4BC1588CC1FECF4603F1E67A26BF4FDA95E06640E3CF774E5C13EFDCC21ED11EDB22FB3F503BDAD1938002284C9FF3E6EC928E2B440727E68B88CE804E828A4DE577D626EF6F5D2D6A1174F4CA6C243D46B47BF93780060399530A4685D41D1450399C94654B2E0E2AC1DF7FACDDC78E25BAD03BA413C6545FA427DF909BB1506AB4EB13E0C79F2CF3224869FE5806BB4C5665113DB87251759C1917FD1F3F40BD8C027D4CDF3C140CB6BB6CCF62624B0FF309E9AB19A216B57893F3D4C952B4FFBFE1415901865220CDFE5B42D278F22E0DC858D06499817319C9F016B188489DAD2CF61732F25BBACD99A96BF5CAB58EB2825B7A6100657113B44705C667BD9E48EBFC5EDFD80363A5BEC321D8971CB64FD133E5F7612F2AC7C4B355F5E423F05B64FE135B88CB9A4C3910C3629FAFE612C45517807A91AED59607B05EAEE8C7213E8FA019E7FB2960F221371B6D24CFFEFC714B1686633E68CF19B6E00FD9078007E9E6519D42D4D77DC28A4B9E75632E4265847DF24A365E93173A9F292D5FA4398F320D94C4B14BAC06A1C6F0AEC970C6CF053E7F8C720CFE5D5BB52DC4EFB9415AF80B83314DEA25395F1C4ECFDEE494190FA2017C2FD0ADBE22B47AD7F8DE55EC41E8B7A4B815659F1C11929E03E361B0E813A8EB6CE47FABF9FBC39B513A1C895632AE480BC8A73816CB3BD70F7B9365F7D5995E06E2FC356420407DF56 -sk = CD6A99396EB3539CA663A51E42063A3A262CC1C5A5FCE1566F0597B52AD9FA325A3407F591791A5DB4578B5972093A95BEC3B8E70C1D542C9B5C9789729F89224C20F816F1146AA1493A0CA6BB1E1F02C63CCFC7C0BA0DEFDA9D496A9945355E042274F18BF9B607FA693609B58BCBAAE001071C7916FFE11D517BA54C5FCE7605C7F4BC1588CC1FECF4603F1E67A26BF4FDA95E06640E3CF774E5C13EFDCC21ED11EDB22FB3F503BDAD1938002284C9FF3E6EC928E2B440727E68B88CE804E828A4DE577D626EF6F5D2D6A1174F4CA6C243D46B47BF93780060399530A4685D41D1450399C94654B2E0E2AC1DF7FACDDC78E25BAD03BA413C6545FA427DF909BB1506AB4EB13E0C79F2CF3224869FE5806BB4C5665113DB87251759C1917FD1F3F40BD8C027D4CDF3C140CB6BB6CCF62624B0FF309E9AB19A216B57893F3D4C952B4FFBFE1415901865220CDFE5B42D278F22E0DC858D06499817319C9F016B188489DAD2CF61732F25BBACD99A96BF5CAB58EB2825B7A6100657113B44705C667BD9E48EBFC5EDFD80363A5BEC321D8971CB64FD133E5F7612F2AC7C4B355F5E423F05B64FE135B88CB9A4C3910C3629FAFE612C45517807A91AED59607B05EAEE8C7213E8FA019E7FB2960F221371B6D24CFFEFC714B1686633E68CF19B6E00FD9078007E9E6519D42D4D77DC28A4B9E75632E4265847DF24A365E93173A9F292D5FA4398F320D94C4B14BAC06A1C6F0AEC970C6CF053E7F8C720CFE5D5BB52DC4EFB9415AF80B83314DEA25395F1C4ECFDEE494190FA2017C2FD0ADBE22B47AD7F8DE55EC41E8B7A4B815659F1C11929E03E361B0E813A8EB6CE47FABF9FBC39B513A1C895632AE480BC8A73816CB3BD70F7B9365F7D5995E06E2FC356420407DF56 -ct = 6D5DBED9942D879727D6EE76540F024BD4090082CB4B0BB4F28F469E940CBE52FBC44DC2B16E0274715EB71C132B150ED1AB88DA13507BBF4469524C98E9261D363DBA0C1ED1A86D9642093A875C94DB40812E0ED7FBDB99C0D758D3511D3DBC0E4540267DFCE4F17179ED1EBEE904F77C7993467703291E00039E1FABF3DD3852837B63DBFB0519D597E210EDB8C13BF795A8927F062245D740C521E5E0FC518D8341247AEE37860802D171739B9244081D6F3AFC51EF7C3C532C5DE2C99EEE949F7B7375DFE3D2B5C675B8FE4827C8181F0C6B1D3A7BD5A31ABD448EA30CD3EAC27CA1E11B6ACEBFD4825460ED1F8C01117FEF1EE358C43AD763DE5C8037BDA1F7DC6F302735E0BAEF030A6D63DE20DB8DC12F14CEBE4216540D061007A7812F56607D22A73C0727DD149E70956F4B7AF6261069FFE5C0C68F847C1D2293021EEB23DD64D37DF276B6EBA3972A8BDD69ECBCB94B81AA199C9FF6434BE90EC41D72A525238C26B4E916AC5DF6A4379C0E48D2E417EA7E4CC0298D037EBF1D4464A37332D12354B840C1F7023673FBBBF6A7FBC1D9CFDA31E98FD34A1060762C71E158280AE31E5FCE62FC65AE16033299AE9302693BCBC067C4422E631F7B4B2B5343DAFFC590F5ECA4C82F82C6C4B447526CD1DB28D7F008534D1045E022FDF64C615661BA0DD833889F5717BBA9860134C033014D169CCE2C901AA01777474F538A0796CDE025B63E30FBB0BC1FFB9A0492871F1375F650608F0E9184A747E49DC50C49F56AAFF1A175BCFB19B88F6312933FD9F648D3D921961B94769EB44E6FAE55C83A38573CE243418593A05182E92A3A -ss = AAEE1E32F40266D77EED391768ABCDF3D4232B3752FB153A24FD2810E52397D2 - -count = 54 -seed = A7C2C8EDB3601396BEB2DF0657EC82FD5780A2723581A9E03DEE1CDB018440439BB1142CAB0487C5D136E9AF46338AB7 -pk = 9097AD9405F24E53BE449D3285650E59CE88CF4412468D1D1A4B922EACA855DBAFE948FCFCD35301CE1346AAB3017CA19A01C052FF6A697813F8347C16CB04F7CFC18E44B57E650E3BDE360985EBB10ACFCF4ACD17E9D569E525F05DF32CB882B4AF59A8FD754C90569F5557B47727C9A380BEFD94F2F98F3EF172681F808AC68CF2EAD954AE209E9320E6B228C98D7832BD8326FC49F3056B2AF74A4E01EFB8E131F845347D9CD6A623BBD1857E5721509BDD80DC83A6BE6C8ABF634B71D9DC92687CB8FF94ECF19276B82A1D12F1AB81BDDC361BFE65795F4ED2C31F202D9887B376B61D13BF8D17DB3B8B7AC839925BCB06CE63A030F7EA5556BCB9D2C624DE325577A4478E943C7BB658FD9B5B537B1B9C7CCD3DBD5C38585434CC60C44785AF06B5B660451DEA0DECB5857E26B471DD1960A7E052205D249A41CCB15A42894369EE608BA01C9082BD45206AADC172254AF6DA920BF0E72CF9C7A187CB1D1F19598F254D07277CE1CD319CF8F8B3605FA0BDDFF6400A7FB53524D990B4097252F3610CC34F374641E977304A7AFA008E2B3195656CD4C11D85D716A690FD989879565786D6DD44B61D4103CFE38DAAFCF14D5980BF98083D9CE534B93F6F55B5907EAB7A7D6725B14858C5F3B4D9C83EF4235D4967D28E7144BDA6534E7AB92F82A599AA127226FDE2AA4060A863E9FB46571C5626E79DC3842DB53DED492B990C55EB595788B7438CCAF5E1F87406E37614A3EE8B9891EE26BABBBFFFDC137B456C597D525A8E103B16C99C714D8D7C1244 -sk = 6C8C53ED6F65E6B2E324B84364E10DE42D1C26A106D4D1C99EEE79C78586FB55B9402BF02481CE4B27A52E87FEB92C4399C7F2988D40E942E7496AD15AD2AA8841AC9E53A84C4F6E854A8394306D42019097AD9405F24E53BE449D3285650E59CE88CF4412468D1D1A4B922EACA855DBAFE948FCFCD35301CE1346AAB3017CA19A01C052FF6A697813F8347C16CB04F7CFC18E44B57E650E3BDE360985EBB10ACFCF4ACD17E9D569E525F05DF32CB882B4AF59A8FD754C90569F5557B47727C9A380BEFD94F2F98F3EF172681F808AC68CF2EAD954AE209E9320E6B228C98D7832BD8326FC49F3056B2AF74A4E01EFB8E131F845347D9CD6A623BBD1857E5721509BDD80DC83A6BE6C8ABF634B71D9DC92687CB8FF94ECF19276B82A1D12F1AB81BDDC361BFE65795F4ED2C31F202D9887B376B61D13BF8D17DB3B8B7AC839925BCB06CE63A030F7EA5556BCB9D2C624DE325577A4478E943C7BB658FD9B5B537B1B9C7CCD3DBD5C38585434CC60C44785AF06B5B660451DEA0DECB5857E26B471DD1960A7E052205D249A41CCB15A42894369EE608BA01C9082BD45206AADC172254AF6DA920BF0E72CF9C7A187CB1D1F19598F254D07277CE1CD319CF8F8B3605FA0BDDFF6400A7FB53524D990B4097252F3610CC34F374641E977304A7AFA008E2B3195656CD4C11D85D716A690FD989879565786D6DD44B61D4103CFE38DAAFCF14D5980BF98083D9CE534B93F6F55B5907EAB7A7D6725B14858C5F3B4D9C83EF4235D4967D28E7144BDA6534E7AB92F82A599AA127226FDE2AA4060A863E9FB46571C5626E79DC3842DB53DED492B990C55EB595788B7438CCAF5E1F87406E37614A3EE8B9891EE26BABBBFFFDC137B456C597D525A8E103B16C99C714D8D7C1244 -ct = D41AC91D649A14D23FA853835826FC8A981A530AB0BB19632002FC9546889FE643E05798391BA88B9AE3C8CB21855AA3520AD3ADCE9654ADB9082663A556224D340ABE5B7E767E3BFCB27FC21E68C90545EED0546383B524C89B94BBE322376A3C279C6ADD99F449ED6C88143239E73C0943C6FBFCF8568E3A5AA6AAB462CF6A113AFCCFD33E32B4CED79E5524E00DD1022EA3FFF99C7088E6FB9ED37D273FAEDFAF13A2F452534A19D90949A3A81C30048F8A2A113693D828AF222A07F5659B7129F728A212AF86719DD58AD41B0160BCDFA86864D40A743ED26E963A4C08A20D05858D08465C37F4B430D2649B168EFA0513B3FE9994AAB6DC8B24C941E5F99EC5AD47C4B8418CB4EFB0FBE8ADB10557B7E20C1397BBB4872B52F036FE18B3B5B086E51287F88A03D536B013129F53B3E96D65AF553E6BE0B2C1C8DA0AD850F24B724E30076A7B068303B5AE5248B0B006B5D5A705E5A18956CD6CABEB7DA46D66052D8078A566D7F617C63FC22B331F21C371415F424EDB0F307920F6FB9DB05D81FC2C55D4F3E75A5029EA05F9760B80122B9F6A73702DA53DFFF4359304E465294013562773893AA1AEDC0ECBDB680F673584CAC691621E5A10F76AB4CA02C2335B0984D644C422472F9341A71847BCC5616E6617797F6D8B2B685E308001EDD6FFFD7D3D3060EB83ED8830BAB5787871A0090B0382536853382C353018674AEB9FF2C05C53AE48CFDEE5AFD0BAF0F8AC80B9290F3C96154DB6CB079B8CD1C41D464E28C7A3B731B96F63E7BD76C191A960B79F5602B41C69BC88D2EBEBC8F6A2B586CFB1260BA982D17510884FA14A8D88 -ss = 4853F43FC733C3F60B0A45F127AAA7A7ABD6E2685E492CBFB0D89CB616F3A3FC - -count = 55 -seed = 467F6158CB86B724039FF18C47950AE5C49170163C910FC9A9B30141F86E9C06EBCEC91497BCD156D95758C9F0C6EF91 -pk = 15FB7A9649140074BBE20D49AD24B773F46F44E3EE8021E34EE6C1537434511B8DF27EF3052AC152F333B48B32CD3A9A863B6617126164F27894F239C88CEAC5C603002BA42917573E114351FCD2ACCD8CED0E018DDCAAE8B7367F34DF676738FD5DBDB08E4379092012786806B986087920D58496691196AF9712FBF275B48B9642B0B0A6116AB3F2F3497E031D5AF6AA50A4B7A763C15BD968E20DBA3F8353330D71EA3DBF6ECED48A03EA99CB2304696A4EE20204B9A8BCE1026441955AA672C1CFDA5A997A668E5AC0CCB82FF3551483AA8813D2163772E3F6BFB800D5C6B10FDEA05FDF9FAB23DD7D27B92E40056E7C18A615D0A29C621EDA24AC31B01F43804962221C9E1867668450E7A450A55E1F600285B55E807E3C5DCD59ADC96D02723C2B7305D3A0475E4ACB6F9910ECCE3774B9643B093487477629801BA08BDCCDDAD6204E66625193609443331D1B9C9D7CB8AEF305B4A35644C10B5B2496F2A633C8129DEF8C4B673D1375F66870BB9ADE4C93F67E3AFFDC139ACEA65B73AF5D49A8081986DBE249EDF596E9DCBC4CD9C32EF80ACE11A8C34EF7D6491508D5BF4ACC24BD1F52946DBC048167128986516A68B6F27ADC697D86A34729BAAD98BBDCDDCB8CD33D80B1FEF5B3FF01038E2C43C87245324E3D15F3FD023D3D869590AA205273FBC0ED3727EA5CF19F4FED845D425FA782A9FF73E9D9EBEE002B02DAD086A144C4F0AABD6FBC99AEDD10C83D2D37F6E1CF7129FA05679C32E5FA9D329F91DB414C51B1963E0A4E9104931EDFDC36 -sk = 2107204CD995F1DF14314D5381F8C5440F09A347502E161CFFC0A2EC3DCFBC7324C3DA70FE850E80AA818301D60C70F3038153866DCD5D179E22DB59B8991BB4F9E267712F97DA8BFE5A32BCAFDF920315FB7A9649140074BBE20D49AD24B773F46F44E3EE8021E34EE6C1537434511B8DF27EF3052AC152F333B48B32CD3A9A863B6617126164F27894F239C88CEAC5C603002BA42917573E114351FCD2ACCD8CED0E018DDCAAE8B7367F34DF676738FD5DBDB08E4379092012786806B986087920D58496691196AF9712FBF275B48B9642B0B0A6116AB3F2F3497E031D5AF6AA50A4B7A763C15BD968E20DBA3F8353330D71EA3DBF6ECED48A03EA99CB2304696A4EE20204B9A8BCE1026441955AA672C1CFDA5A997A668E5AC0CCB82FF3551483AA8813D2163772E3F6BFB800D5C6B10FDEA05FDF9FAB23DD7D27B92E40056E7C18A615D0A29C621EDA24AC31B01F43804962221C9E1867668450E7A450A55E1F600285B55E807E3C5DCD59ADC96D02723C2B7305D3A0475E4ACB6F9910ECCE3774B9643B093487477629801BA08BDCCDDAD6204E66625193609443331D1B9C9D7CB8AEF305B4A35644C10B5B2496F2A633C8129DEF8C4B673D1375F66870BB9ADE4C93F67E3AFFDC139ACEA65B73AF5D49A8081986DBE249EDF596E9DCBC4CD9C32EF80ACE11A8C34EF7D6491508D5BF4ACC24BD1F52946DBC048167128986516A68B6F27ADC697D86A34729BAAD98BBDCDDCB8CD33D80B1FEF5B3FF01038E2C43C87245324E3D15F3FD023D3D869590AA205273FBC0ED3727EA5CF19F4FED845D425FA782A9FF73E9D9EBEE002B02DAD086A144C4F0AABD6FBC99AEDD10C83D2D37F6E1CF7129FA05679C32E5FA9D329F91DB414C51B1963E0A4E9104931EDFDC36 -ct = AD6DC098D3843B70817652D1DE6E1C58B868AF65F1BCD11E1BD05A72A047B26AD655CFFA19FAE7B6930F6ABCE65B781C2B5494262EEB51AC09EB9C381246D124905825623000EAD81C890D4FB007C30BEFDAE7436B3A7FBB37527BBDD944832F1F44C327D1787B775A4AA2AC19FE86025AD6C06CAD0868158AB916A4A9C14CDA40B9BFF9ABC943AEB97CEB1CF062EBF81A89C8891E6B30AC015A206D0EAC2000510784D969838F2B1A6453F562E439D97856756CFAE5D002CD9DB73B859B997FA5B8EC9AEB7902B974495F84447E4C1D1218C21C942B39CC87D3E1A927498A43B2CEFD74BE1D45DF6F53C1D1C657A68F1577EDD154B33D89EDC0229482CDEABB796E2EA5B25CC13F3654BE6AA0530D6217DD40FCC2E4F966281ACAD739874F4D274CD11BE31DF811CC45B16B35B881C46E824DB2132F2D0EA4A484BDC671FA217CBC9DF80AA8BCDE64F5FF2F9379ECE900D4AB4AAC7F1B4AC5985B9C4B30DF71C76958BB542D817A7D564D4569E668B676667B6FE1D8606645D3FB46D95DAC76798DB21874D1CE9E1C9BEF9BD1DC373220D08D3B789BC4EE3864CB9158F7F084D4FC1E623003D555903B5DDB8624FC6E1B6A2EB4678D37D5B1585F1C080418DB92D1470651934AD819BA4E4114BAE4C1B7D57500DC3A0DA478A932BE68205B95431BD519A73ED746E984634DE656F190E7D31F3293F79AD5661D114144BC373EC5384B1AAE61ED63BB74AE099868E00BD529875D7FAF22819EE4ADAD1E68254D856EC5D6751574A1488B5AE54D40815D565A9B55AB7725335187ABB0F674AED93D659BDF2683F7819BDBBD6BD758695FE0BEF4D4 -ss = 8C5FA3CE335959851C3C06CAFD39CDB9E1848E8D4F72128FD9842AB5BF244F17 - -count = 56 -seed = 687C02DE1041ABAC7B2C1E6EC2A7C3375552ED5EDB10E3A8139C24CC76BDA44D719D8121A81D47A0B762B4E9EEB85235 -pk = 918C0A876E1A5E33AFF35BEA957DA287F4EDC3BE5997ECAABD3B7E09EF31F9B3AB97E7057E5D79C4DE344634103E64F2FB3B49A5CD12E7412CDAA81D6429FCF1B532B1EA090B9E7625CBCABF6628B834709263814406826D109B4815851B916D253D3F736EF09DF7B1FC8C75B566D0A6E306FB4EEF2F382985E88FDB5C40FB9B8A0830FC2A11E1B49097475ACA1E681A3CAB5A434D3CDA9172F2499D05916C557232187CD0F5784ECE1259A01539F5EAF27362F0BAE56DAFB466773D5A58CDD449D66AB0EEAB5D66234A291251FB3526F1803DF153D957BA3E004551965B741BF5B180E2E622B740FA0F2356EB48A7BF12413D8C3B8A5080E43068A875F5078341FDFB5A88D48D19F9C4CECA06C20DB8AB31430423C639A7FA3104224E02D856779C46E9BB39F0CA737DB6CD92C0E1B90868157BEDF7A2606888774B63F29C7957288529895BA51157DA30BB73FB1009AD67405F626A097C114519A4FEE76FFDBF109FB6FF1E151884F199BAA4F6011696BC4A0FDBF833507A33B9CFC2C4CDB8BAF8F602640C89F731EC88E81D1F529CDE9A841F7BB4F804EE7C9EB8C46A86F5AE26BC6D1A4A0F545CF64199EC6971358C9AFEA036AC9FFE65B6D62557BE8B3D968983F138A201C6BA12D1D3B19775B8ED8773E05C0D4084D64B0E918195BAE4C90F1DF9B271C64F0A93796FF1559DFD7B0624A9475D5BF811055BFCE411A7B8B43095BA99E244021B2148144C3F0521138DA5135371685A3686BD9234D4AB338C49DBF4C5B5EF036DB4AD69CB941B2F41F45F6D -sk = 63A925685A8AC5BBD918FAA33AC397D1FFBCF99135D9DA7C3D6FF7AA4C50AF3D3AFDB8A246A56EE71465591831C371F2EB87467B0559DEDD776BA063EE6D2F93057CAD9DD9E0AEC1A30AE1A0635DF901918C0A876E1A5E33AFF35BEA957DA287F4EDC3BE5997ECAABD3B7E09EF31F9B3AB97E7057E5D79C4DE344634103E64F2FB3B49A5CD12E7412CDAA81D6429FCF1B532B1EA090B9E7625CBCABF6628B834709263814406826D109B4815851B916D253D3F736EF09DF7B1FC8C75B566D0A6E306FB4EEF2F382985E88FDB5C40FB9B8A0830FC2A11E1B49097475ACA1E681A3CAB5A434D3CDA9172F2499D05916C557232187CD0F5784ECE1259A01539F5EAF27362F0BAE56DAFB466773D5A58CDD449D66AB0EEAB5D66234A291251FB3526F1803DF153D957BA3E004551965B741BF5B180E2E622B740FA0F2356EB48A7BF12413D8C3B8A5080E43068A875F5078341FDFB5A88D48D19F9C4CECA06C20DB8AB31430423C639A7FA3104224E02D856779C46E9BB39F0CA737DB6CD92C0E1B90868157BEDF7A2606888774B63F29C7957288529895BA51157DA30BB73FB1009AD67405F626A097C114519A4FEE76FFDBF109FB6FF1E151884F199BAA4F6011696BC4A0FDBF833507A33B9CFC2C4CDB8BAF8F602640C89F731EC88E81D1F529CDE9A841F7BB4F804EE7C9EB8C46A86F5AE26BC6D1A4A0F545CF64199EC6971358C9AFEA036AC9FFE65B6D62557BE8B3D968983F138A201C6BA12D1D3B19775B8ED8773E05C0D4084D64B0E918195BAE4C90F1DF9B271C64F0A93796FF1559DFD7B0624A9475D5BF811055BFCE411A7B8B43095BA99E244021B2148144C3F0521138DA5135371685A3686BD9234D4AB338C49DBF4C5B5EF036DB4AD69CB941B2F41F45F6D -ct = 338D6BFA67711475C079D309D028695A10DA0946EEF0D62F748C1F44578BF085D02C1C0C2F972251480362909B1C10A3999A31698EB841E63C4EAF6E1DD5C6E16ECB094F5643036217F5F3B8A9BEA639F4C980C6A4AFF99EAA0BED650F139873FABCBDC182ACD0209092CABBC19A7D60EED0F305496F0C5546CE9DD4C19DA8D9D20001229BCA858FAB7D76F1E4785EA33765057D3756B5CC49C2EBBF7FE5C4E4541FE18D947993BC9DF109B694E024A50630C99FDC4BE3E48CA45B02C3090F6901AD996C2930470F40D0082187431F7AC6196243FF8D9C4A01F4E2A5C826B539A186EE90D3D0171F883B209093EAA5675323158F2740FB6E3C02E5DF928AA0CB1FAE0717D2A7197B3A3479FB72D1A2D29D3E1CA60752C6B0DC26069B7D9508B6463BD64C42B2D783251D2BF7CE7D4E272380713EB3702A088E4FF96D35AC97379E63AB99E4531BE6DFAF7635149BC03781E34570663E892A5C0375B38F6DDF9AC8BD023DABEAC9E5853F18139AB81477E18E2B8BC520AA1AEF502755031FD67DCEC1A5E1364B71C454BFA26BBD383E6CA2494FF00AF97950255BEC5AAA1F6A8D45F2A1FC64B2768ACE9A87312545A939A8EE8EEBDAA4C6CD534C49C8F862003B592C4D58B7188EDD8D6C719544BF817D439010FF413EA0E6ED94A9BC08C2F655EADDB37CDDF57AB8AE771BA0EFAB7C23CCA8CF6C507EB5665057BFE60BB79E5BF3636638B06E46DA782782D881279361320AE0F96EAEF183487A99F604CC883A8D4C4571479E5C93729206213059FD5D4EF8245A4DC45767708940A3B0331353F3F3B44CB32EB4EAA2F0F7ED30723DD21461B00B -ss = D41874A2E197464EEFE132987F3B7D48B102D828D9783F66FD0D38E84BD323A3 - -count = 57 -seed = 4142237070C216BCBE245A39BD9220533C97651D84832B26727855AD994A0760C52B9319AD404693E4248B8C5FF324B3 -pk = AF164FD987430A7901D7896A23A68E506844813955D965761C1DA2BE415C039B497753E5FC91CEBD75956708A4AD9DBB90B62E157DC0A965CC350A523C01F2A2CF53E5C5677E792BD7E2DAE32A83D329779DB1E5ACE7BBEE7C3C272C214DFAC2D9AF2472F82981B525128E48523207D9B62220B89623BC8206BC21F5A3AC2F406988B402E3E187A11E689143D45A4D405BA00C760ACC0D7FED7807479A84FD781C385AED31AA100ACF88F9EB79737C43D9B6F78BEF6F897425A4AD6A8CD55FB6B68E6199581C9E9F601829FFDF9DBBFD7245C713EA9B6AFD5DE268A21CEC23140C6418F3B29EE7B9BA388BD97D0DC2A31DC191EEDD09FCBEBBCC2F5972A20369BCB7E86DDE8842A5B745CDBE0F3481CD0C5225989D2F8CF6BE261F5DACB1ECA74E2F777C2654AA0F45EEB2CBB51C739D1E30D60233C3E68F97970ECEFD7B1959903191D53FA218E07582B0D36F3888F1FAF700F885659690B120F1CD211F90E03C1CBACCA3362AB6073C9857397541785DD16C2B467831339D4ACB8A913776D0D6E81EA6910E007D532FDDC4C41B6AEEBACA86694E53B4F1EAFF28883C22D5C6F72714F24EFD55DF7034B6D64C83027791AE32375CF54A21D366E783B2ECD7120B9B85C84D8396EE5FE1DF376820C34069A9B3D43A6665ED8AACB4D5E2E48A0FA32B8AF2EAE4574650828C541BAED27F6315836A2CBC3C0442B19F64012542A6ACE9FB98CB6A18B49E56AD7A692340D0D3D60799C406E8E5473A43893C0D23A7CEDD99FEAEDAB114B6B372E6794AF6FD7CAD6A1E -sk = 6A1AEE5E708C1B47F02BDACCE4F56C860F74FC7CFEC1EF3B58285B1C8AD7FEC2230E05B7114FF0395CC6634DB1EAE8258072D09C09F291E92D6620B177DC50D7B992373F9086C7AFDBF4B44A96BBA802AF164FD987430A7901D7896A23A68E506844813955D965761C1DA2BE415C039B497753E5FC91CEBD75956708A4AD9DBB90B62E157DC0A965CC350A523C01F2A2CF53E5C5677E792BD7E2DAE32A83D329779DB1E5ACE7BBEE7C3C272C214DFAC2D9AF2472F82981B525128E48523207D9B62220B89623BC8206BC21F5A3AC2F406988B402E3E187A11E689143D45A4D405BA00C760ACC0D7FED7807479A84FD781C385AED31AA100ACF88F9EB79737C43D9B6F78BEF6F897425A4AD6A8CD55FB6B68E6199581C9E9F601829FFDF9DBBFD7245C713EA9B6AFD5DE268A21CEC23140C6418F3B29EE7B9BA388BD97D0DC2A31DC191EEDD09FCBEBBCC2F5972A20369BCB7E86DDE8842A5B745CDBE0F3481CD0C5225989D2F8CF6BE261F5DACB1ECA74E2F777C2654AA0F45EEB2CBB51C739D1E30D60233C3E68F97970ECEFD7B1959903191D53FA218E07582B0D36F3888F1FAF700F885659690B120F1CD211F90E03C1CBACCA3362AB6073C9857397541785DD16C2B467831339D4ACB8A913776D0D6E81EA6910E007D532FDDC4C41B6AEEBACA86694E53B4F1EAFF28883C22D5C6F72714F24EFD55DF7034B6D64C83027791AE32375CF54A21D366E783B2ECD7120B9B85C84D8396EE5FE1DF376820C34069A9B3D43A6665ED8AACB4D5E2E48A0FA32B8AF2EAE4574650828C541BAED27F6315836A2CBC3C0442B19F64012542A6ACE9FB98CB6A18B49E56AD7A692340D0D3D60799C406E8E5473A43893C0D23A7CEDD99FEAEDAB114B6B372E6794AF6FD7CAD6A1E -ct = 5F3CAC0BDBD5EE7E506D5148E72805F405438AF828EB9EC86FE8900FD895A1314821A7394EC7D957AD249BBA93065D8D54EAD6D1645E38B7FFC7A1BD9ABF759725E1C8A821C758F5DB8B84A2134DE904DC9825D70EBEA539410CD6538A5EC4DF525C0847517278346426AE7A8A815CF55C31D677E0530D9AFB2A7E288FD21F995E1BA8F9DDC11E420F34DC6A10D99C2CCD20814B1397E1D8725EB8445D2413C5B8CF4611F7FB35FCB85456F415DC02EA994459BB9C0525EC14D9101ADAE171C8C88F45AD6A5A5AE8BC57C80ADAA0BB56FEEDC65A82E274C4036D2339DFB25C87982F94507E017D0F4E00EAE9072E2DFB842B84F8642EEA2B4016584AD54822C5CDC6E612365287079051ED61881DD780574430985B0F22AA7307DC43DB5D41B647E5E8BB1571AB7EB45C3A866232EE36B5D61911A74604BB0DA87527F6B05FEF821F791AD814B68E7E8F1F1D5982F746C46177ACD51903CE888FDBBA2EC6A7FFBE1A79843A4658BBEFC0818558AD199AA82C995E8FAB6B3200FBA5E5D61DADA95646E880742DA93FF91CC3E7184D972F823F338F70608C738C1AFAEC2CC410F0C12FAEF7510A28253DC99DBD2DF69B125D39BFE0255059D15B6A02B920BBD75E3453A309C5B22C7143363DDE27D48ED37A879CFA8E0CA5C34B13943E6022E6C747F11818BD74DD5D376BD0B650C1BEA56E0E163D80A384AB3424FE0AC0A107BC7652D6091877E97A82ED384FA2F58700C02D04F525EF4AC354CC08AC74B1E3A03E5B433A29CAC4E64E5B1D4915D82FA6DA5BFC4CDFFED0F8C0B5890DCC2476C71C1FCCCCBB27E16A42DCC1B9662CC21FB3CA5961 -ss = 160593FEC401B6BE109A262AF3CD83B1DB8EBBDFBE7773EE40F8AE6E9399FDBB - -count = 58 -seed = BD334D7B7EB14E00E68863F2E5551A095F8AF10681C28353FD19B9A7E70B8BFE266840860609008A567ABC66316C77CE -pk = C2B5E729F4F5AC62CC826F5BDE38BECE48E510EBCA1B9279EE150DF0F24463A8BC211F716C5BA7683BEEE5B05B5A6590858435892E222B8176D2C1BCB09837E2261630C31C0E4A9EAD090AF29EC2F1E923113E4B51AD0161244795A3A7478726F57F691BB2D272BC4ABA057E0DF5BD6516A6BAABB412FF061E77AD20D94C89FB345F04ECD39E0C950C1302AD78ECD7AB26436AF579DE5EE3BC28C8CA53302AE399CD79F978F25A2DF91238360B3CD74BF39B21167C60316B20A28718295D27F9804301793D04973BDDF1233493044D2D9FE4930DF8265E703A822CFB64629FD545A4DA7C7C69BB8BB8C4E5D2F68597992BBD8C208EEA9A9314A692EE0DB320A59FD24C214F0C8ADA8B12A6265B82B0A0CF06D1D84B825BDF6533AA957E6227FF54B79E12B3ED469333C708B3250AECCE92F80CED3FAA43720E99DFAEC9CC14A193D4863D415A01E35A9ED061C3A28F9F2E52CD35BF45289527470D7147987D6CC4934B3B8413827AE2654A1DA988231837DE5693087D374148C339B5F275C19F21A5435C5D56AD89A2A398428D66FD665CB2F1B046F7922F305B85B0492A3FD3140F89DCCC4624A897E8595FBA498BE2B9D56B673DAC94597B4430A1E946B156E2E1811E2E563AB1E4CBB912EE502C8EB54E3CFAD23AA146B29B79CE8F0013DBDA67E444AF3B399DAEA6FA346BBAEA8B4C69422C024DC619A266D7D825EC7DDF1AB8CE745F776A7C64DB539CC05897481C81945F7F351D3FE57862F5857DEF9B26180535AF58E1D41CD5236E7DC963556A675969 -sk = 6396B328B100E4C7F4BCAE69875EDEA1A1982421558C608C13C592BF7B5D0FEF1100CED48ADD211A5C937B8D6079D8E271AF3F949EDC61F70E60453AEF20DEA99D44DCF0E06FE406A8484BD3CDF02401C2B5E729F4F5AC62CC826F5BDE38BECE48E510EBCA1B9279EE150DF0F24463A8BC211F716C5BA7683BEEE5B05B5A6590858435892E222B8176D2C1BCB09837E2261630C31C0E4A9EAD090AF29EC2F1E923113E4B51AD0161244795A3A7478726F57F691BB2D272BC4ABA057E0DF5BD6516A6BAABB412FF061E77AD20D94C89FB345F04ECD39E0C950C1302AD78ECD7AB26436AF579DE5EE3BC28C8CA53302AE399CD79F978F25A2DF91238360B3CD74BF39B21167C60316B20A28718295D27F9804301793D04973BDDF1233493044D2D9FE4930DF8265E703A822CFB64629FD545A4DA7C7C69BB8BB8C4E5D2F68597992BBD8C208EEA9A9314A692EE0DB320A59FD24C214F0C8ADA8B12A6265B82B0A0CF06D1D84B825BDF6533AA957E6227FF54B79E12B3ED469333C708B3250AECCE92F80CED3FAA43720E99DFAEC9CC14A193D4863D415A01E35A9ED061C3A28F9F2E52CD35BF45289527470D7147987D6CC4934B3B8413827AE2654A1DA988231837DE5693087D374148C339B5F275C19F21A5435C5D56AD89A2A398428D66FD665CB2F1B046F7922F305B85B0492A3FD3140F89DCCC4624A897E8595FBA498BE2B9D56B673DAC94597B4430A1E946B156E2E1811E2E563AB1E4CBB912EE502C8EB54E3CFAD23AA146B29B79CE8F0013DBDA67E444AF3B399DAEA6FA346BBAEA8B4C69422C024DC619A266D7D825EC7DDF1AB8CE745F776A7C64DB539CC05897481C81945F7F351D3FE57862F5857DEF9B26180535AF58E1D41CD5236E7DC963556A675969 -ct = 91E34F38716BB125C943A4F754B07D60AB701817329C1C95F9767B56E2565FB8DB657F4C168EDE33052B34823269EB3B2254ABA379FCD5937A062C845D5C812964AA509F76E477A2CAF20D8D8A65B5782441963720EBD714C701D103725D1A1D75ADD940C8B25CF1BB6B739B95F0F2AED761614D650F535403CB0A58F1A9434D06470F95BE068D9B81188322B17EC37C59D02E0F9EA4002E965BF2BD1E8C48984B8450F81670DC1AD8A9DE576AE39FFA2DBA342094BC14B990DDB76AA2C4B94EEF044D2D3228E79C200E24687743E5391BF6A3A464C3BD084AC32D3A2F84C9DD14F19B67C8784640F6E535582F3A65D7876AA3BDCE726B4B2145B595471FD9B857B063F993CD23D095C1214F67690AA9B4BD59BC31F923477423D169D19C7B998D39A29ABA6C4395FBACE4FEFF79950EA93E43F541920D05414034B14E75484F6696A2754088BB72E5F89303CE89E4B04DCB0AD2102ACC9C70F7D52FE057FC82C0F699CE7035B74533D8477F816D477C3120D30CF1078D54C8964364D14A6162E1E5D39C32501C96F26EC3F0DF80DDBD44DD5EEB16A28519FE3CAED37EE2ECBED6E8AC1E282CA8542D60905F141D757F00703E9FBCDBDB4E9239D309B28DEEAD7F8C69D32AE7CEED776E71FF9010D236CB9490BD701BFD96ABA59F1AE77A7B7C6B6839D1E296A962736ADF0E73A32A4F339EDB5C640243AA7EA6549B1E7A66929E42EE62DAF0828CB172F86CA5E5185656666606ECD313C1187100EF600AA3176BD6E9085BC4B32518E184459EF7DA266D46471CC7ACBECB3F0FEE8660FE4992BC61D5DB495913850B805CA15AE9D5211D3135EB -ss = DDAEBC31AA82FECEE4CF6364556A5D79986BD2BEFFFC519CF1AEDDDB26A04915 - -count = 59 -seed = A0264C58AB1F2CBCB212077FD378D340307ACCB31F1312137CF84E3D3135044D4EAE8BD38BC3E540A0C14D46458F6179 -pk = F2CD33D0403CC1FE95410E1E9312CC7B2601ACB189BF030DADA92A539016451D574EF10F336480F29D31403F863CE4BC69FBC915BDB8A1766C0BE74B61DCC2D57D6F79541096E12A1D14DACF5D45098BA3CEE8739355B5084F9BE5FA273E6ADF284FDDD5A7D3FCBE00105441ACCEB1AC821B77156A8479B15087332989BAD6EE4FCBF3DB10E3C690B8797467DD715F0AF1CB98AED9F5EB1AA35DA482C4DD9C9095EB96BDBCF6900C54466C5B29316B06B91B64725CB6AD6F1A56253088C182909246CBD4EEA14623DD1E76E827E7A86A71A4CAABE2CC10C65455539F3E47778C48038FD98FF23ED294EFBA9148D3CD189AD5387922E16C3779B16FD482F8B015ACF7730176C0480859EE10D0E51EB8EDD9F8BE3746841CA02C2D81591E08434FD99CE87EC0E41B81CEECF9DAE3752B819185672DC6DC844F8B64B76B9EEB61EF012017BC379D3A7061B23F54388AAAC75050694CA7375B18A4E6A18E213C7AAC8FB0BC3A8C46805E18D362A793724E47CFFFBD9C8814E34D1057A0031074D475D44D05653BE73D937CB024D958A57903B588FD82184FA97C04FF6999EC7F84E871B4BCC839E4CE42D2B2AE9E3239A0C5F8BDF230ACD82B3044394BF67AC3CF124695A4EBAC4C8AECDD850766317838FAFB5BBCA0C4258ED985A79B49E42CDEC7CE08CB503A8EFA7E2B598A955CF1C50D2A1FB339BB30187D6450C3A98A3DBD8D2C721F200FB616AD3672E83BE1C66600630FEC9E903E1E56AC88937FF968C858A6878FDB998F2C61DE6C8E50A784257ED9351E42 -sk = A453BCACDD2B0D4646009E5ED451C3C45F08FB827EF733DB3C517A9DC1AF93E67A3CC8AA3239D4C52CE4C95AFDEFF6EFBFACAC10D294EDC0E7CF4535059BFDBABFF7698FF728119CEFE3FA1A6BB2F800F2CD33D0403CC1FE95410E1E9312CC7B2601ACB189BF030DADA92A539016451D574EF10F336480F29D31403F863CE4BC69FBC915BDB8A1766C0BE74B61DCC2D57D6F79541096E12A1D14DACF5D45098BA3CEE8739355B5084F9BE5FA273E6ADF284FDDD5A7D3FCBE00105441ACCEB1AC821B77156A8479B15087332989BAD6EE4FCBF3DB10E3C690B8797467DD715F0AF1CB98AED9F5EB1AA35DA482C4DD9C9095EB96BDBCF6900C54466C5B29316B06B91B64725CB6AD6F1A56253088C182909246CBD4EEA14623DD1E76E827E7A86A71A4CAABE2CC10C65455539F3E47778C48038FD98FF23ED294EFBA9148D3CD189AD5387922E16C3779B16FD482F8B015ACF7730176C0480859EE10D0E51EB8EDD9F8BE3746841CA02C2D81591E08434FD99CE87EC0E41B81CEECF9DAE3752B819185672DC6DC844F8B64B76B9EEB61EF012017BC379D3A7061B23F54388AAAC75050694CA7375B18A4E6A18E213C7AAC8FB0BC3A8C46805E18D362A793724E47CFFFBD9C8814E34D1057A0031074D475D44D05653BE73D937CB024D958A57903B588FD82184FA97C04FF6999EC7F84E871B4BCC839E4CE42D2B2AE9E3239A0C5F8BDF230ACD82B3044394BF67AC3CF124695A4EBAC4C8AECDD850766317838FAFB5BBCA0C4258ED985A79B49E42CDEC7CE08CB503A8EFA7E2B598A955CF1C50D2A1FB339BB30187D6450C3A98A3DBD8D2C721F200FB616AD3672E83BE1C66600630FEC9E903E1E56AC88937FF968C858A6878FDB998F2C61DE6C8E50A784257ED9351E42 -ct = 95CD43927ADF2AC396944353EC5C55CB051567663D51495907CCE98E79B55D67A7FCA9663EACED7CDAE0035BFE4FB9BE17A9DA0F3A8E2CA39D0361D87BA449B33B2364E1BE0C4F0EE223DE899DB5BFEAA4D4E8AEAC4F696B672304A10A5EA5BE25C7D5D2B05E7F98BA6E2D3E2969F888CADB6111F7598B9A067D656E669500CEB47EEAB89CC04DD40C10EF9261A7D96E2881E3339ADD464787E925FA413AC4FDBA267ADBDD5F9ADB32C1B94370730D4B1E03EDC3AB5DCD9E0366B0328D043B7261AA487A4F6F9041AFF0608392115CCE46F856C374B56171C2352F894CD8BC576690E933BBD423382F5A82FF015AD38D30C3F8C5D94139467BE7679A54B125C0ACC3C6390D29C191B40A40A7C12BF9030BC613CBE33F14B6961B3BE8F383631BF2A7A08B6ED8041915175E610CDFA57466E20230A811CE236DA3B4571AE9850BAC7FB5B997330DA6B5D40A673909338CD076083594970C44609C18ACB44263621BD29344C7FB26C341CDA0AC33BE0247C8B3A448355087199D8752520F14C6D9E643B00441B455B64ADAE795D14CC5BBC449EBAFC17893FDE00B637F084C5D0004D65C111C595D01D2095FE6C8B27AADA2D233166B8E043CDBB1350832D0AF24EC8A3C8AAD24FDFE55FC5AAF44E57AC8E05D87F7113E23C365261BF11D36456F076F9B75916A1CC6A01A6C693F74724E1886D8EF1BF10F1DD0B3A128BB1EF3F4B6C2A7B47E4482A136B241A956C60F696FA9EC02671629B75F75BE07336A5B1792FE20C007783F7CE85B363B9A7806CA2F57CC2AB43707776689F1168C4848982512716315C6091739C932C55E6F2551959763BD -ss = E2EFF280E3820BAAF517F9B5C328FDD24447D83950CC4FB37FFE57DC20AD10BE - -count = 60 -seed = 99A9CDBFC674AB3FF2C64CDED7D697A6E27A767434A47AFF7C3FBF3C6A22D6043D27868955286A13EFE3DE36D22EC48E -pk = 13BA81DE657B77787E2CA95BA07A62D47F2031374C794E0D48A4CE4BD4B90F5C5123A6740A8693E14AD506BCEEE50174C7E398EC04B47B7820C0EB43C254681B33DA5579878FE782295C5809942567027E6B300B60D5D4AD2EBBAB63D509821E364DBE3FFBBDA09EFABA2D7B841F69EA8BE96238E7AFA44C6A4B4B10811027E3EE74416D78C4F694B7FA64CE965910BAFC5769C517CB7E98843B20CB716ED6D87E06BC47F8D5ABBDD90C2EF911869DD9DAD5C2C86AD50A9EA0086E1E7ABE853ED2FD1F8247D8F6A7B8CE08A69803C8AA7F3509AC43488C442339F673BB287937928A02AE1194D236C173E479C4441BFB2C0E5DA64A658ED6770C87974341C2FD25F7277B6E174050DF7FBA5DA57266BF315AFEDBDD7381D90A29EC1C0BBCB7858F0CCFECCD9D2B4C6C032B74D11E99571A54F24D02F5760E506517203541146457FCD043B963A91239CB6783595C2FCF417CE31816B6AEB1460A98428C8340BC06A32DB0B72BE0E678125FA67FD1EB28F7FBF58499BF16671430E69B9F018C7508AD90BBF3F168235CE9EF8EA35F7AE21F605BE21415496F0EBBF179AF4915CAEEEC8AA334D2C173AD5512BC20704C42AB8FB99CA3D5239D74AD362C4A46B8B270F0980F8DA3F500D41F39D8BC984D5711AE7500156EBC375C6E269282423BDEC9AFDC4ACD7377E998E517A7E750E25A74592B57EFD614268FCB143553F7E72C21E5E655420838F62B1CA0FA0B6DEF783A7577BECD0C38DB4898868D8DAFC74CF331E25E0D243306F853A8DF112B371D905A8E12 -sk = 47CA2B77C5B717F423222C2730CA5CB9C856BC951D01B2B2C80BD76CCB5539B78F1481D7CAB000E33FA07DE8DC9627A85E76FABB4428A3376E66300CF12A07870991F8D8905ED1F967B747102EDA980213BA81DE657B77787E2CA95BA07A62D47F2031374C794E0D48A4CE4BD4B90F5C5123A6740A8693E14AD506BCEEE50174C7E398EC04B47B7820C0EB43C254681B33DA5579878FE782295C5809942567027E6B300B60D5D4AD2EBBAB63D509821E364DBE3FFBBDA09EFABA2D7B841F69EA8BE96238E7AFA44C6A4B4B10811027E3EE74416D78C4F694B7FA64CE965910BAFC5769C517CB7E98843B20CB716ED6D87E06BC47F8D5ABBDD90C2EF911869DD9DAD5C2C86AD50A9EA0086E1E7ABE853ED2FD1F8247D8F6A7B8CE08A69803C8AA7F3509AC43488C442339F673BB287937928A02AE1194D236C173E479C4441BFB2C0E5DA64A658ED6770C87974341C2FD25F7277B6E174050DF7FBA5DA57266BF315AFEDBDD7381D90A29EC1C0BBCB7858F0CCFECCD9D2B4C6C032B74D11E99571A54F24D02F5760E506517203541146457FCD043B963A91239CB6783595C2FCF417CE31816B6AEB1460A98428C8340BC06A32DB0B72BE0E678125FA67FD1EB28F7FBF58499BF16671430E69B9F018C7508AD90BBF3F168235CE9EF8EA35F7AE21F605BE21415496F0EBBF179AF4915CAEEEC8AA334D2C173AD5512BC20704C42AB8FB99CA3D5239D74AD362C4A46B8B270F0980F8DA3F500D41F39D8BC984D5711AE7500156EBC375C6E269282423BDEC9AFDC4ACD7377E998E517A7E750E25A74592B57EFD614268FCB143553F7E72C21E5E655420838F62B1CA0FA0B6DEF783A7577BECD0C38DB4898868D8DAFC74CF331E25E0D243306F853A8DF112B371D905A8E12 -ct = 7C170687D96BFA69D9EEF29E9B8281612BA3D1E7A5A7E33D75ADD0CDF28AA7062EBB8D27A272C93388E30E1CBE4069E78741CAB8F195B5A6F6FE4C4456F281031121327D02CDF7D7D61B29C31AB772B46C26E1B1172A5B99C7B9770C8064BE52802EC4D073B918DC4A1B0D83886C79A1EC6E51ABCD8697A41453E1C8955775A7312B6DAF0A7418D4BF62DAEFFDB924C7239D503E5BF663A98A88FAAAAFA581DA2A0C42BF446CC8442AFD60B91ECC427036B80C5313265C62658A003DC15DCC205EC7FCB439775CF81E6E1A398C5F5E9A50B9A321B702E3600F791D9CA03747E4EA55DC02962C0FE991DB93D1D25D0FB15418FEE1721EBFCC76275107EBD5F9084A3ECA34672D83FD28997933F664A8E6EB1325A57EFC83A9882A437EE9C99FDA15C2B5BFF792D0B312F0FE3613020BA8DA026496E3129DF3386F509CC5EE7074B152BE11DB6E6E828624C00DFB3A7CDAD92AC284812F8852FA52385B70DB3DFB96664C8CB385A0F3EEEF353802E6EB91FEEA511345D31B4B272A3940A3CD3EA763E70D6C181FEEC41CA0BF308C2115EA4A13CADD1694A228593D9E42709B55A5EA872F572CEB32D0868CF3E8EF3A9DF679B330CB6C01CA8BEE117234A5AE353E314DDE809A36001C0C9E9D582FF26AE05C170A6946680B5E617EA77229E97ACFF1ECB5C134B2DC4476A6C8F2DD9BFBCFBC8D590A798AE21FA3C993B19FF237792683D483FEB0CA1DF3984309D5EFC0C555385ADF5DA0D6140FB5070157E99AC108ED14B27CE99D355B731F8A8D438A07BA629442C082CF640CAC1FD1515246912C87F1A547AE5F628C952BD6262E1FCB4B31C54E -ss = BC6C4B7FB37F8074CED5D09537104E7D2F8A25020E28E13D63D86E9A5619C784 - -count = 61 -seed = C799D57B41F28C5C446DFC58A5AC6499C4BCF3C162AFD2B09A16549826EC2A6F689E44BAFC4ACC82F5D6AEC23F4A3993 -pk = 5EEA261754615A059832CE5D932A39BC7E4B992B90A1CAB083941DE1E38ACAED153BA01093133397AFF88B981B7870D7EF0D0CDC9A69FC785FA72F58201C1886BB949DE7690939828E80EBEA68CA3D8E4F3F2A1A1A829C4AB5F5760CA6528566BE74681B856A7A854F93361A2A1D29B041167B311AF4F9E4BEABDA32A02C6FF1CC39C7ADCA78B9671321F656451AC5D9BECA61D4FB829CADDEB76F2E7D04C9EFD0901DE8AE3CA4FC797B1562DE2D0B10F8D9CF8A27997A4E4F8D230836C3DEF43839056FFE69235BECF753D6ED444D01BA88CBCBE910F449CA61A0297CBA2B0068236DF15913A96A6D1CD82D45B0B6B96C0BD176C9838706E13C8973C534C96EB0A7EC0CB1542042F2B9143DFE6ACEC82C850CB55C905AB2F73AEC8B761AB8DDCF244200ED18CB6EEB5D1A052827E3FB4FD4BBF4A58FCF4AB431BC2BA1D88E9117262296EC512BE045B2F2768E3393923C2020BB1C256232062DCC1F0E8C2A937F1B7F5275D466526AB06A878E92D68DC7F716075613620DBA137D6EE1714718B374167FD6382EF01346A209CEAF967EA3133C1C8331B5C9E6B10A465ED1400A1F7BDF608CFC188E1702DCFB0AC0E53BE22E983AEBC36B11472D09AFB7B19BBE48DE50BB50C4D9D0E8CC18616E3A46A4D5B6B924CC019426C70DE047AF0D165777228C7B18BB1A068A0557EA3F307505022D5FCBBBA2F37DFA08FD4F4406A3CF69B833726CF6808BBB0F7310BC1DE97CC01A75C9CF4791255A6EF457990630C44F6DB5EEBE6CA70F0EB45BC282B51C6891C43B1E -sk = AAF6EB40E596A5E3E8218871E708B089240DCBE7FD3641F0E5E41E071CE49107E2F8D320AC3CB0C52EFDC753282F092BC39BAF4A18783A48EA031A191865EB7885D03687DE2B06E1A480949CC3D986005EEA261754615A059832CE5D932A39BC7E4B992B90A1CAB083941DE1E38ACAED153BA01093133397AFF88B981B7870D7EF0D0CDC9A69FC785FA72F58201C1886BB949DE7690939828E80EBEA68CA3D8E4F3F2A1A1A829C4AB5F5760CA6528566BE74681B856A7A854F93361A2A1D29B041167B311AF4F9E4BEABDA32A02C6FF1CC39C7ADCA78B9671321F656451AC5D9BECA61D4FB829CADDEB76F2E7D04C9EFD0901DE8AE3CA4FC797B1562DE2D0B10F8D9CF8A27997A4E4F8D230836C3DEF43839056FFE69235BECF753D6ED444D01BA88CBCBE910F449CA61A0297CBA2B0068236DF15913A96A6D1CD82D45B0B6B96C0BD176C9838706E13C8973C534C96EB0A7EC0CB1542042F2B9143DFE6ACEC82C850CB55C905AB2F73AEC8B761AB8DDCF244200ED18CB6EEB5D1A052827E3FB4FD4BBF4A58FCF4AB431BC2BA1D88E9117262296EC512BE045B2F2768E3393923C2020BB1C256232062DCC1F0E8C2A937F1B7F5275D466526AB06A878E92D68DC7F716075613620DBA137D6EE1714718B374167FD6382EF01346A209CEAF967EA3133C1C8331B5C9E6B10A465ED1400A1F7BDF608CFC188E1702DCFB0AC0E53BE22E983AEBC36B11472D09AFB7B19BBE48DE50BB50C4D9D0E8CC18616E3A46A4D5B6B924CC019426C70DE047AF0D165777228C7B18BB1A068A0557EA3F307505022D5FCBBBA2F37DFA08FD4F4406A3CF69B833726CF6808BBB0F7310BC1DE97CC01A75C9CF4791255A6EF457990630C44F6DB5EEBE6CA70F0EB45BC282B51C6891C43B1E -ct = 0ACCF97C1A2AD0EBCBD00B1FAFA60AC76ABF5165EBFFB6D5B5BD5CC5F481F153E917383B8DD08C1ACDA5FF2471357B0C6EE67A32AC00D16A8A7ABA2EE590EC6553F70CDDF6E61F95FDB88846E64AF4722F2A868065957A06C84891F9E3011B1168244EA46D2463788453AB79B819547704A3099DB704A075635594585F4F27A91CC5063D5E66C7D57F25ABF2349F495A10DB2355C3F1D1FBDAC0DFBCB7762BF7C988C57CA84ABCF652EC38F1A0DFAF5FE58FE14302EBA8B3AF7C7201F53D56AF03A17CC8C3E4DF1B826F810623446BDB7A74FB76C5724642B3E707DDDFBD484831F53ABFD399E59DD52ECCCB1BFB114EC7B67DE37A262474D8668ABFDE025EBF0D76823CCEDA5D85E7C45C3C5E15F911351C70EDB03F4151F350894DCB6742F3AE01EB24F79ECC82D907C0524C900FF3C8137B4A1C31F491654E7DDBECEB6CBFDE04AE5BFD57C3C8B6CF66E3A727C9AC68D1EE16495D867085B6A98B1D4CBBAA1E524BFA3549C3EBDCB68C6D2E17A33D3AB53AF60D374D2D56633B4D6104D9AA23B079D95F50E67BB49E0FF4084180C80DCFE60D2A084B3BCD2D5F67A21F303225A16FB28A237395CB42B64EB2B612EF47E6B5693139708736B5E5929CA13C9D6ABCF6F5185D68FCD3521D539116446A007AB5F21D6A5F43D4C9997553CC904C20A55FA3BE59ADF6C8BBEBC80B3BFF2783F5199643FA5D95ED7D204DEC3F11FCDF002B7E5ADC22376435B496F0688997FBC7D75A080B21A6C4C14047EDA8DBE73590FC1A2F73F8A5F2EF76231F49F80FCD0C1C2A08045BF2035403A9D408AAA1E6E525A24C59AB839E1AEC8253C582D66117D4C7 -ss = 54DF5956155EB8EC96F4BF24A1E85984B2376FB0CADC4A51DC5B15B78B91C7B9 - -count = 62 -seed = F7AE036A0176A9DE9A036A542DD2840033277C44AE936D10B768566216DE9D4395CD42B116873B69D9804BA6CCBC05D5 -pk = F482771DC2C9858AC8530CD028189A440EC72DDBA264D77E4E5E91D6B1324547BE51D8BDE2EA4FD968B01733BFD16F3150048D9E8B069B501AEAF267D0526F2060F02E9BD861A193D8E97DB3B3004B777C4250CFB47D4E028CF6A12CCC39DF207A7910D32E30B06AD15B4538632D25E18608250C3040BDC77C5F388C86C6E8616A15812A7BA3EC3D4BB72F2EF5448B410834837327D7699664893B633F0FE44329C99DE8E37CBF3B5150450093804F6BE1A234B34ED85E3BC1B906076FD9A2769A268D2A4537A9EB4DAAEC8CC92E9B2D9F100D440E6025C8CFDECD3C308B4047F942F64CE026E84AF864780F4977C01D9FA27B8D95B552F68335638CA3FA2701CF08D42E7DA7C36337CCEA9822834FCA2BE1D01D5111E7D20D0E6584102DCABB5C7D27ACDDEC151673C20EE1B0E7D610352C72CDF9591F0D224FCBDCA4E8DBE7FFEB7E7FCFBA3EFE706BB57E6750CD3F4A2C5373375153070F2DE972E2A83D9452FEFD23FD96F69C9C2F03E14DA3B7B7703FE97641440736D53895CC7B296082595CA7B7F2A4E2274C3C12ACEA860482D556AFD29509E6FC0326CB1A065F0BE1E64B3FBEAAFE63EF9CC159C29BEA02381729CE65FB16FFE5D666FC615BE67FB4661AB963F916763F9E543C6D488E964195AB0213701F3C78988D047EC444AA6859C22D24076C3964A5C4170F5AD3CC78881A1C6C31B39D3957BAD2ACE33D750546BBE6A498596DA101E09BAE00638421CAACF6D91303E5F87F2FE4EC049C2A481DF57BE64B74C72C286ADE8B9217BE19E5B00300 -sk = 6500F32C93415CFDBC0BD31D78D5BE95CB9060C8CFA2013955B56F8B6868B322393308641A9A4647F230201E1389624A296B55192A9819FCB19AB77C25F954454E963EB0D01B937D6DB5EFC6661AF403F482771DC2C9858AC8530CD028189A440EC72DDBA264D77E4E5E91D6B1324547BE51D8BDE2EA4FD968B01733BFD16F3150048D9E8B069B501AEAF267D0526F2060F02E9BD861A193D8E97DB3B3004B777C4250CFB47D4E028CF6A12CCC39DF207A7910D32E30B06AD15B4538632D25E18608250C3040BDC77C5F388C86C6E8616A15812A7BA3EC3D4BB72F2EF5448B410834837327D7699664893B633F0FE44329C99DE8E37CBF3B5150450093804F6BE1A234B34ED85E3BC1B906076FD9A2769A268D2A4537A9EB4DAAEC8CC92E9B2D9F100D440E6025C8CFDECD3C308B4047F942F64CE026E84AF864780F4977C01D9FA27B8D95B552F68335638CA3FA2701CF08D42E7DA7C36337CCEA9822834FCA2BE1D01D5111E7D20D0E6584102DCABB5C7D27ACDDEC151673C20EE1B0E7D610352C72CDF9591F0D224FCBDCA4E8DBE7FFEB7E7FCFBA3EFE706BB57E6750CD3F4A2C5373375153070F2DE972E2A83D9452FEFD23FD96F69C9C2F03E14DA3B7B7703FE97641440736D53895CC7B296082595CA7B7F2A4E2274C3C12ACEA860482D556AFD29509E6FC0326CB1A065F0BE1E64B3FBEAAFE63EF9CC159C29BEA02381729CE65FB16FFE5D666FC615BE67FB4661AB963F916763F9E543C6D488E964195AB0213701F3C78988D047EC444AA6859C22D24076C3964A5C4170F5AD3CC78881A1C6C31B39D3957BAD2ACE33D750546BBE6A498596DA101E09BAE00638421CAACF6D91303E5F87F2FE4EC049C2A481DF57BE64B74C72C286ADE8B9217BE19E5B00300 -ct = 7AA5A74E78FA4BD7A78D173282516D2FEF51DE000FE2E00147686B5DE310F5F7B39A88EF3D6201D510599EDE5AF0BE942B4327BF8F4E30C6D50F0DD4980C3DAD982992930282B7F0D9113E5A861E395C09097CC813151D17439AEAEA5F1604949368BDBF0BD40D360596B32AE7037E95BFEB05B00AFCE979F7C308473ED924888E61F92310D28C6C8647BB38CAF77EE5D0D3D61A737BBE6B37636FEEE3617A95D58EE9570745B4E97F76BB3A47BC0F2C0A722207B51D5E035083A061D871B5E3EBE5F35BA96A0A50189792DC199DDBDFA93D9D4414B2FF696E1D61F492EFDF88C851BAADEE7CEE6D283FE9DAF1A599F41DF9CCDE71C6409EFA49367D998C8EF0FAC44B4A4BCC643256A3D2B5C5C9C1CDF41B30C0C38D32837F05D6AD3207E912313FE3E0ABBC803C73EAE9A04E89D29600CDC391F73A49896F36AF95BE5A7C272312943A80AABFA0A6DD8DE77E5FC37A1DB18262D52AB1DA2EA9FB26501915C4D2AB8C54773A5B40F08A3C8394116B7724B1286398A79D282BBC4141B3C16378B89CBC22C61243011B05D097B7801C6FE3C814297558CF3F23CB02A07CE1AB3A8D060B7562C31453216231D3F9FC99DCC0EC31EDCA9E86C0067AEEE995A5241ECEC880A827A7FB80DB90346A2C1CB965947D91016A6541EC1978F31E58F936D92DE2A46EAE0178D58DBB69717EEBF575689A21C837537B978EB51112D82B3F34FF156EF8F36A7643E2C612DC5B958849B388C06CB9404800EDC06155ADB4B5D73848DD88D640FB65BA00DAC7AEAA9279A5EA2B1A31E80D7044EFBBC1B509E9FFCAD74480C71DC22DE821168CB22A4F400E6D3348 -ss = 1BEA35EECCA0EB3A88C2E9366E1AFE6E263921F4973F8A69E37E2ED15621FA92 - -count = 63 -seed = D995D38F934B6E1A7CA77C9522E3D037676CC939B0C8BD4B84394B3DC91A791F09D2D97199258C9943DA955E7F7B26FC -pk = 106DCA703C5EED03312712347F2B74EC3AA978045200AC5D569D5335DD8AB19A77D469EEEC95DB59DBF748C5EBC592A9A1975F4A2160369B48589A6A7FED06AAF12A3E7D51BC07281F99F05A4B2E76CDD81FA339B3CEB9253051425B9F4796CC9C4D4DE3B5502939323A199888D3307544907941186C994CB55197CABA62CE95CFED06F5399A06279AE1CC2652789F287268B6B72DFC7E112005FE943850A43A64BD8758DFBDE892C09058D90D36E799450CD067D53EB30310A02C269B0DEC00A6D96E9D85D4628C538BA89E164C7ECC09B7959ABE550F3ADA0C05F7666076D7A1BFE924CF64830E4F16E39E00FE2465A2D9B3BB82D369AD4D5C45C089A28351A28079344210CBD6FCC2B90865253B1282319A7A950920CCFB15F105AB559EE4C312D005B1DE64A932FE524376A5D163F442F2F4D5A6E73C8515E23601EF4F9631CF25F1F7B211CB2D60208EE1F762EA39AC8F71141A36BB66007D9E066C76DEB9DD870D7ED9E55DA515A75093B044E3B7B642B50743E510CFFD343913B86F54809658E8098BCCA42BDAD4F386D3E532DCFD29664B2F486A62181CFEFF0A68E756D2D348DE56EE251FA1634D285E49130582001D7A5B8E8AB5760AC6249961501FA2A0452E49798FE005721A5F24DE1311EC59F6A1594D36439EDB21EBA0BBAAE9ED5F6746D695ED0DF54891E9CF1D1795DE86FFDAE8ECCA8AB91E4D89512F7E9B3BB3432544219AA57D66486AA21DC9F2886BBD7B618AC61674B908A356E7DE5C2048E26BAF6AF82D231DADD61B5EA6C9310D4F -sk = 7643CEF2D62CC5AAEECF754653EA62294CD2208E5BF3DDEEA209E3DC45373D49EAC9D531A532770837A854B4F5531F6E0C8D6C10183B30D3435498C2DD142951EBACBC33859B828F9FA95F5C4C114702106DCA703C5EED03312712347F2B74EC3AA978045200AC5D569D5335DD8AB19A77D469EEEC95DB59DBF748C5EBC592A9A1975F4A2160369B48589A6A7FED06AAF12A3E7D51BC07281F99F05A4B2E76CDD81FA339B3CEB9253051425B9F4796CC9C4D4DE3B5502939323A199888D3307544907941186C994CB55197CABA62CE95CFED06F5399A06279AE1CC2652789F287268B6B72DFC7E112005FE943850A43A64BD8758DFBDE892C09058D90D36E799450CD067D53EB30310A02C269B0DEC00A6D96E9D85D4628C538BA89E164C7ECC09B7959ABE550F3ADA0C05F7666076D7A1BFE924CF64830E4F16E39E00FE2465A2D9B3BB82D369AD4D5C45C089A28351A28079344210CBD6FCC2B90865253B1282319A7A950920CCFB15F105AB559EE4C312D005B1DE64A932FE524376A5D163F442F2F4D5A6E73C8515E23601EF4F9631CF25F1F7B211CB2D60208EE1F762EA39AC8F71141A36BB66007D9E066C76DEB9DD870D7ED9E55DA515A75093B044E3B7B642B50743E510CFFD343913B86F54809658E8098BCCA42BDAD4F386D3E532DCFD29664B2F486A62181CFEFF0A68E756D2D348DE56EE251FA1634D285E49130582001D7A5B8E8AB5760AC6249961501FA2A0452E49798FE005721A5F24DE1311EC59F6A1594D36439EDB21EBA0BBAAE9ED5F6746D695ED0DF54891E9CF1D1795DE86FFDAE8ECCA8AB91E4D89512F7E9B3BB3432544219AA57D66486AA21DC9F2886BBD7B618AC61674B908A356E7DE5C2048E26BAF6AF82D231DADD61B5EA6C9310D4F -ct = F598DEC8DFDF9210149B10610007EB99FF08FA7F063F9CCA8C05F5FEE57F729B1A7B127BA01061B785D05A0A7016B8C04C61DB7251046B1FDBECB45A2FD610FB3E6F6A3E2FE1D9F403A7ECC21F6C1E5586C17076DF0B64F4373DDB91326067A832A5BC7B93ADC1BBD9A89600F4BE549A525D9922B426032EC664D7325970E99053D140CCDD5AC6E34F6E5FD383C875F0ADB12A5682423E56B44656FFCBDC63F47188B279F173572A2D2E807B1AB020D600ABBE6DADEFB6CDE4B8EE40D6D09746609BA09F85C80FAF3EFE78FCAF871DE5F1DCF00986D1BAA1323C3EAF5BDA3D307381BE5F5DBE18CC7867E4435083CDBDE90431E3E312B486E8E5091502826000C9B68E8D6FCDF3D087EB0DF9D628ABD261C9DBD9805A0DB00F68ACD59D666104A6B07462875EE1417C3673C64C47AF10E6D5A97E3FF72E3CCFC3B223F12C4A8F2601FDCF59E4A81B8B9DE0B2E12904B0817F2BADEA9CDA26F9E72EE5D4CBE475486439D0EA63A863C254774561D3E9C8783B819DC5949D61D4B2E311983B1B342D77D1F31A73D8CA9F617319F4E2B1CD1930BFC2B972B00EBFF54176D0A949C374242AD39F4007B52958D26BDB636E46522AADCF70FB51F1E6213EC58F716AF47EBD2DCC3A5E33123DF19F53977A472D32DCFC4264064E381A4A7C2468BCA7F406C0FF2704FFC450BE635C098A55185653539B0F8EAE6C1E5770423CDDE85CE815F52276BF9AD0215BCD256578A346C746EC8BFF48B3E78FACCD88C62151CC8F60595ED055A002FB2A6C5AA7BA2B1CC05F5B2765531C107AF151950C50CBA52CED2CF6EB5D972A3950E0FC3830B729A71C5A7066 -ss = 0C77A265D4D025CF8A1234D18336AA4E635A7D5F52C058AEED0A100656D701B3 - -count = 64 -seed = 5929F02A271725CB40200DE32D9D03D8BEA53B53AC83186C42C7F565CCB1CA508305D470850CF86E9B2C61A5B8CA1C93 -pk = C248D6FD6975EB9792FB099604045EEE4CBBAA4C9F18F316F40C23F289221FC194019C8675C2E938E6883F801E35CABA31EE6F8821B24157F042654C927C709D080ADD2FFC5D8D858C653BC22072001FB6AB120BFBBC048771B13A08AD6877714A20648E8D80387192C2ECE2608E7BDB0209FF563741664210047DE903F77E64967F0ACC45CF44AC4C086B35BF76ED2B0E678EEA6D455FE5EA22F21E62B58FB121E85E1B56C9591686274F21B12454EA42C65FA45E653F088081E9205BBAA9F3201B494D96FF74243E8A379051D1F832C0231D5CF79C01DECDE269EFE2DD30E6FE2A5FE39D80E232B14519BC94DE0373DC3ACE4F41C1D2167468D3DFD307D6D96AF10A3D02335238361D28175D45A1D5530CC940277FA678A74E0AEAB71918A92D96A27F6528F51DA77ADB6FF07C91180FB7CA485BD09943E42227226B7B313E1379DB76F7689CF2C9B4A982682FF1F7653FE437199A0A2A1679291113EF48A71B8D5422D94BD92C45853484BE305F4D3E908FE6B0E9120950DE00966864012B2B2C530FDB0512DD4ADBFE9FB41336707A77478837CE8C0FA8A285E1A6ACE96ECDD508D55887DAB2FC656B2AF1C129969E0EEB7FEC451C858BCDA570F534C80093E034B26EA26AFB8E7728C3AF44A690CF2587CDE042662FCB4FD5496C9C853EA551B77036F905B156A210FAECA83E6C85F32C8E293FAA98B9B235AFB9B6AD2EB79E3B1ED9F64405A56885CDC0999083D8D30ADF1C729436329C204EB4126DDC017261A9AEEDA1F42B305F8012C92E0702284C44 -sk = F8EE95521060C03BB8DACC79F7EB7DB640F545F315613A35D447A09E504CB4E13FC3D8392CB53F36ED647364A04E37278A0E0A45B720F4A75C580C9920EBA98D497462F26B431E889F56A33FC9499002C248D6FD6975EB9792FB099604045EEE4CBBAA4C9F18F316F40C23F289221FC194019C8675C2E938E6883F801E35CABA31EE6F8821B24157F042654C927C709D080ADD2FFC5D8D858C653BC22072001FB6AB120BFBBC048771B13A08AD6877714A20648E8D80387192C2ECE2608E7BDB0209FF563741664210047DE903F77E64967F0ACC45CF44AC4C086B35BF76ED2B0E678EEA6D455FE5EA22F21E62B58FB121E85E1B56C9591686274F21B12454EA42C65FA45E653F088081E9205BBAA9F3201B494D96FF74243E8A379051D1F832C0231D5CF79C01DECDE269EFE2DD30E6FE2A5FE39D80E232B14519BC94DE0373DC3ACE4F41C1D2167468D3DFD307D6D96AF10A3D02335238361D28175D45A1D5530CC940277FA678A74E0AEAB71918A92D96A27F6528F51DA77ADB6FF07C91180FB7CA485BD09943E42227226B7B313E1379DB76F7689CF2C9B4A982682FF1F7653FE437199A0A2A1679291113EF48A71B8D5422D94BD92C45853484BE305F4D3E908FE6B0E9120950DE00966864012B2B2C530FDB0512DD4ADBFE9FB41336707A77478837CE8C0FA8A285E1A6ACE96ECDD508D55887DAB2FC656B2AF1C129969E0EEB7FEC451C858BCDA570F534C80093E034B26EA26AFB8E7728C3AF44A690CF2587CDE042662FCB4FD5496C9C853EA551B77036F905B156A210FAECA83E6C85F32C8E293FAA98B9B235AFB9B6AD2EB79E3B1ED9F64405A56885CDC0999083D8D30ADF1C729436329C204EB4126DDC017261A9AEEDA1F42B305F8012C92E0702284C44 -ct = 43D6230FC58B366914820994BFDBEC7BB7CCFE53D38CE8ECC8D0D53B123B2A087867DAF9B77E219653A21CB9C46FBFD6359A29BAB7BFFA9E72CE7E5C793D96F98E34871FF95D5FB68678AA81B31DA196A04763AB4DAEB489A4F3BD6FCC64F357E56BECF3AAFBA8C461E27C59274829DD6769E4DAB4E05CE7683602FA7C252FC22C68834E7CFFD6D13E2A2C80F8A74F8B71C8325881635EA52591024DDDC1ECF61773AB04DE22D2F6160670C57AC29D8813BE1ACDF549557AB18ED455BD9C771B0EBDAA653DE8DA1B44CE2A5271FC110926FA87B67D65F68348994E2FF0EC0577ADADF38460FC3229F66FD4D58E0F1258D195A3A678C2F608D6DEF8BA8628ABBD766BFFD1B90EFDA25605706750FE4062763F0D3FC25AEEB557169BB895E2DDFA650D7F3E4D8429EF3E9EB360D9E4C89B890605925CFE0CA5E489D46F07AA7BEC731C75652577B1E4FA189A322C5124495BDF2176EFC11FCE592919B744130C8AB2F935CF4966BF6E550DCF8F88C9ED06A168A7EA3F0D5736282893E9E465FDA9AE9041C73ADD50CA16D10992C989C5FAF10BC3877DF6AA11EEC8CC672953FFDB1A0B9FC29F84A6C082D4D97DC76963FB46FFDC443E5B1A1C08BB122B0F387F7E170F8626F13C2735217F8D9906B16E5EBE438D24BA340A07951C85A5B4265918022AEAC76C9D1E01A988F145B57EABA6C125B40EC58FD7A22726C142232D2AFF76C44FE6B35A6A746546C8F00E6E9E323656D584AAC9147D547A282D5508792501734CCD5B6B16694243BFC3CE18BB66A31EFC46B620C91F421F36D1F65D83F2D363BE17D0D2B2DA3EC848834D29644C78CD94AF -ss = 643DF928F7681C94AFC18C6CC19F2FA446FAF7D7F38111D42C4BB3EB3F09292E - -count = 65 -seed = 905074033D7B75DEB2D06A2F29144EB377B452534C5710632989F02D45312D156557E96D4486020826DB200153BC4A8B -pk = 60BE950C205ADD610A28C56D5DDB12EB94624B3E0648144C58622CF1A66B93FD7FAA4BEA9AD2C86E59AEE6C729F915C41E6A4F4F54364F5E3372435091DBAC3066CB6BCD7BBA7054D20F9265E62A31A3AF46A9BD6497A0551C6A46E6711B16791B441D1C29A62479F18EA4864658B5E13D8F40E0BE6526AA0E46BC96471E836175B4426A30A76E9357064F9F0392BBD2F941290B0C85DF85ACE5F7CD08A4939D1C01013C528E8343021AB4649998376F1C5AC0A99D4510FBCE1C74423C2F8EF266303C46BC738C367D703BA280CCC15ABCC83C5F1B1D6F7315FA5151FD01649E235C2A3B2303E2B5751C92C6C5DBC1FFFE59CC94F68A0D7616C933AC6F15BB72EE513409FD0EBE24E42286F5CC7D8C0E94494B2490CD3941035C8504D32CF946A418CEF3C34761F7BC3A42B90FA38DE8CAA6AF383ACF4A27E7F039162B28A44226771A74166885E010BE3F8BEB178EEE323184DEBDCF777FE44485C4F52572B86804DF1B4D7B89BE5E2F7573CF6E7DA19FAC483AB7E4602FB6FA7919FB098DA69452105B30861C06CF31DC9A3CF4BA0A7E3D3EFC5F75F4A35996E38673D5ABA8BEB8306C936430733162678A9EAFCEE6B1E25BAC7DE7DCA4D42731DBE59838F93B50B317F77AD03FE8FCEF9043D2F22D164FD3194139A734DDEFE42880833D661EAF062A7E769ED7C5E11B1867523649DE2A5FB3EE781C4F5CA369E91F5509CD9E4FCFA34A39019B35FD9B1853085EA877B9FE49D58C4E3EFB26F15291C49C1772F1D14E5BB721577F3C3B4319EEAB439D7C7401 -sk = B8BD0493A882E3A49B4E0F6256FB1FEA0912562FD9BA26EC3D6C9CC12C8973ABD7E4B5D8021C486B9C3114D7CBBEB7CD49EBA8A61BC2BCAE1F1BEF30A1DAF76DA93BC0A2D45E032A1546012E75DC8D0360BE950C205ADD610A28C56D5DDB12EB94624B3E0648144C58622CF1A66B93FD7FAA4BEA9AD2C86E59AEE6C729F915C41E6A4F4F54364F5E3372435091DBAC3066CB6BCD7BBA7054D20F9265E62A31A3AF46A9BD6497A0551C6A46E6711B16791B441D1C29A62479F18EA4864658B5E13D8F40E0BE6526AA0E46BC96471E836175B4426A30A76E9357064F9F0392BBD2F941290B0C85DF85ACE5F7CD08A4939D1C01013C528E8343021AB4649998376F1C5AC0A99D4510FBCE1C74423C2F8EF266303C46BC738C367D703BA280CCC15ABCC83C5F1B1D6F7315FA5151FD01649E235C2A3B2303E2B5751C92C6C5DBC1FFFE59CC94F68A0D7616C933AC6F15BB72EE513409FD0EBE24E42286F5CC7D8C0E94494B2490CD3941035C8504D32CF946A418CEF3C34761F7BC3A42B90FA38DE8CAA6AF383ACF4A27E7F039162B28A44226771A74166885E010BE3F8BEB178EEE323184DEBDCF777FE44485C4F52572B86804DF1B4D7B89BE5E2F7573CF6E7DA19FAC483AB7E4602FB6FA7919FB098DA69452105B30861C06CF31DC9A3CF4BA0A7E3D3EFC5F75F4A35996E38673D5ABA8BEB8306C936430733162678A9EAFCEE6B1E25BAC7DE7DCA4D42731DBE59838F93B50B317F77AD03FE8FCEF9043D2F22D164FD3194139A734DDEFE42880833D661EAF062A7E769ED7C5E11B1867523649DE2A5FB3EE781C4F5CA369E91F5509CD9E4FCFA34A39019B35FD9B1853085EA877B9FE49D58C4E3EFB26F15291C49C1772F1D14E5BB721577F3C3B4319EEAB439D7C7401 -ct = BFB678D1D383D88AC00D3D9F0820819A775D0403AC86C4EE15C745F1FD0C0C92768130B2A7524E0591343AA0E22B8FEE7380484186A2CCED06FC02E06CF952F907201ED02B08AF4AF293E33C06942BBF1F86E6607BF00734341F63F1AA33E9756812005A6CCE3A79EFEA110565C6A63C71EC96572241F2756023EE5D5C26A5AAD1AAD61951BDE38D1E53ADC7F6CF6C9088DDA9F02152371324C6DEA42154456837B0B7364D5A824F37279FE0789056CA2E62A41BA5E5B0A48D81B65651CB9D846CF816A478A82428605FCE85F6DA6EE450D36BE04D6982B1191DEB8671CE598604FBD96B7F4652F1DACEC0164570ADA4C933212F46105D09F0EB9CD01847162AA2A31F6A0765E51F05F0AEABBF1D644A0C971D6E64774B170F175171F415B14590492A71D65E97212AE62BF1A2B61C258A5A5E1158ECEDCA37AF7346D88DA218D9EFDA1CC850C842D308F4D0117ABD524CF57DA0BE6A221EF4AB1D022BC36AEAA85542BC3E4A9866864736121573C14CEEF7D800A8C3993D1F195345D265E8D1B5E2BE2ADBB82E4BBAA8A86A02D310741842D269EF390B800462B1AD4FCCF35E00A89A1FAFB10FE2E4EA74BBD03A37034D23835276FB4B338323450A6AF4D5E2EDB53E2FBC93970781F44DFF028B84C0CF4AC70FBE3A4E140183CBE65AF8EAE11E5D11CEF3A2D1B967A63FFBD3FB65F4C187566EC72A36000A773F29851844FA26E113FBECB06FB7FFB696FC38248F23F8E5ECA707843149B7AB40525BF6D4D8639FBA76AA265F66FBAE5F287DB72ACA63988E33B8BDDD89E0D71CFDA88E2660EF84019CA5F9254E469FE65428F64EF32CCFF7DE -ss = E39C1892E0D8EBCA1E85DB794E65C5F5954FD6929E64FDCAE0E5B47EF2B46A5B - -count = 66 -seed = A3E2E511AFA7BB560446BDADF67D2EE2E16FFC7BAEAE7EFB8C5455068BBD4E91BF9BE9D98B280072FABA7712C75B26D4 -pk = 4DC123456FF5AE84F07B2C68C9AE20CA77935E79923667505B3A1BFD6C8E01F161183F45EA8A1E7453AA062B1519C93D27778BF8DC3131028AF734FB9391AD66C3B4AABD3B1B6703D29CFB49B32A340B5C076479728101548448A8D7130FC5FC7D16E3A87BDF9F3045A2831400A20730754B9FD5E96617A04B88F052D67F12775A73AA4938BFF263270C737DE1DB372D3A92A7B4B8CB59ACD9F477B0D017C312981FCBB3DD4C2B2C1E6CF361A20F9424485BA0020C6928EA3293274B90085293DB9ADB48D62C8518FECDFBD9EBD3C8B476239D0AD8F903A2A5E96718B31774182C7BEFFC769B89425F96AFCF2BFCB4059116375882FDAC619EBDF7461B76213A5BF15DEAED595347FF00D186307B7B0D57C0EC9BCEB6A3FE5B3B38F5DEA98D7A00B10C7D3E1AFD6F5E8EFBF5124572A9ABEA6D01C58AA4DE6BD960B49CB99C6B2FEB47ECDF100E35071EA61963FE388E225B52C9758569E4A4B4D1D1DDEDEC166FE140C0008CD26EE3AB6AA8B7F430642C8986E439F4155838B418D94DD7CD9135DAFA61098B5B002A74B713D8E38EB6FA0280449DC6887B539C7F7ABB0D837E458D96BFD287DED61F7F0760362535327A4FBB83795F92448755170BF11122D57787F759E3DEBBE2F4E69152F1AF63286BEBA3C1A35D044AB5F8C238E21E250CFD4AC23891711FA8CD034884BFF7514008FD6AD72F4FE4F7E85FBB3072E32664BBD2D12B38F6F85338E5B46869D164F351676D49D2CBA44605A1226FB0A30F4E9B955F5BA5D48E44EA65E5901520D29054A19035 -sk = C0407E41DDF48D333978B89BCF2DB01E4613425B456249E76A6F25B8A2827BF5B2DCA81E3F5F748D23C9D356A2209F6B2D60247B2E45C9808DE497F64F1246436D0AE40E7A499B148DF04878ED8982014DC123456FF5AE84F07B2C68C9AE20CA77935E79923667505B3A1BFD6C8E01F161183F45EA8A1E7453AA062B1519C93D27778BF8DC3131028AF734FB9391AD66C3B4AABD3B1B6703D29CFB49B32A340B5C076479728101548448A8D7130FC5FC7D16E3A87BDF9F3045A2831400A20730754B9FD5E96617A04B88F052D67F12775A73AA4938BFF263270C737DE1DB372D3A92A7B4B8CB59ACD9F477B0D017C312981FCBB3DD4C2B2C1E6CF361A20F9424485BA0020C6928EA3293274B90085293DB9ADB48D62C8518FECDFBD9EBD3C8B476239D0AD8F903A2A5E96718B31774182C7BEFFC769B89425F96AFCF2BFCB4059116375882FDAC619EBDF7461B76213A5BF15DEAED595347FF00D186307B7B0D57C0EC9BCEB6A3FE5B3B38F5DEA98D7A00B10C7D3E1AFD6F5E8EFBF5124572A9ABEA6D01C58AA4DE6BD960B49CB99C6B2FEB47ECDF100E35071EA61963FE388E225B52C9758569E4A4B4D1D1DDEDEC166FE140C0008CD26EE3AB6AA8B7F430642C8986E439F4155838B418D94DD7CD9135DAFA61098B5B002A74B713D8E38EB6FA0280449DC6887B539C7F7ABB0D837E458D96BFD287DED61F7F0760362535327A4FBB83795F92448755170BF11122D57787F759E3DEBBE2F4E69152F1AF63286BEBA3C1A35D044AB5F8C238E21E250CFD4AC23891711FA8CD034884BFF7514008FD6AD72F4FE4F7E85FBB3072E32664BBD2D12B38F6F85338E5B46869D164F351676D49D2CBA44605A1226FB0A30F4E9B955F5BA5D48E44EA65E5901520D29054A19035 -ct = EE8DD7AD12C06F3791A8E4283721BA9EA832D3A8FAAB16992DB5D6BED2A628B9C0E59D80B5E854529FE4714F11FF4C7B79C293A9703177A883802E88A772E12D535AF1568C608D53F132FC61A705681E1E6D16EB8BECC8A7592F8B04DA28C3C19FD760768394C3AE0DAD21A8256BDB1572DBDD8CAFC7B5A4C60F8DCD7841CA146B89543FAAE8447C6FFB6F57D10BE110DBADD5AF6CD13E83D27193787E7D431B0DFE03148601859C75F02782CDD8F28A01178EB19B3B55816C5E01140DDCB74A9C77DC1BAECD7F00F256DD6F81120595B6C3F86C64B2318DAB1DA67FAB1D821548863B441924539F16A832D734963B344B610C336CBF3494AF8A32B9920294598BCEDBE354D3172B2D53B4C18F4E95DEE8787D9AC6083B77970D99E12AAA4C922DD38F2C9732ECDBF4CB92ABCAF61544FC2998CF5008C7B512FA8952D91A24FB57D90E76EFA99DAFA191A530846214F81CABD8884B56C4774592E29737008FF1D808EEDA323988494884E67E44F5D16C9D09DCEF91BDCA305189F73D1D8C702FA07697FCB09EDDB8EC7618AF6350E21BD952B4492423787597AD94BF1F6FCA465FA2770BB300E56573BDD8DF8100352ACC0BA9F1AE227644F0D4038CD31D97BAB544583E986E01C646EF95A31455E4741DB7E48DD1639BF7C16376777273F3F9B370790CDF16B15B52082FE1E6345E076BFA068050AA0BEEFBB157ACFE8D71D213CF69604047BFAC9B23BF18FE36CBC8F8C899329A548FB1E9C815DC440431F6916D300504489EF3F1812C872C65A778A201F90762DA8C2EFDE53B04B0EED1B5173A9DD2E03C8F85CC7E0B70EAACAED18B0E7EEB -ss = D4835589F1FBD94049273F28D19D358ED11331E6F1167B42F48ED20633705506 - -count = 67 -seed = 074AB1A37BA5A0403D8F68D26FB787BC2C90F5EF88F2A6D286C3E6B168ABD85D393D8225618608B8EEB301D26AF53BC0 -pk = BC147B3779F6624049B7DD2BA7E78A329033BA5665AAF1279F96695D7DB1991EF639CC3B045757AF4659F6003710EA441F33297863C97DDA7630F678C398F7A01A36BB62A05439C3BBEF0BBABDA9767C55D8D9A0C79C199D660903015D0E61FFB87094DA18EE616E261AE3E0828C033787880F429D1149FA263F62DA619F6AF7FF6087DE2D0207F363F333785775079CB6F1F9CDEB98A16DE28B633026C263B4DB845DC979EFF1C1326C1C80B7843C4F904DC0832E3EBB4EFF38A84E38CE267DB870EFF1430073A01212CA694A79662C8E5D00B0C28E067DFB3D3CC4CBBF7B0C17975DF306175110F383C431F09A9218F529F07A283DD70925B3AF21E13AEB5A622BEBD3C5CBF2E1D399089DFBA9371B0D9885B76DE8D88F73542F85DB7508122578E7D4B960C772842C452BC44104300F2B6C8902479D03B71B703DFAB5198AECE4DE304546B520BD68603AECB25BF473F7B81DA29E7624E610236C0DF25F202A32F172E6C55482C9A02399BBC4DDBA41D3544C7D5F5960FE519E08CFA56A853EF6D0086EF5D905C2DEBDBCBCCBB55C65BA89659F4A0B9CF5E5AB7B836BE2744D74BB3AC8E53F30C1481D1D1C8520D658A7016BE5A091B279FA4F28536656A3D4814096D87CDAF8314C52F71637202E7F15F8829921EA57CF070277704C18B0BF12A8F7362EA0C070C650A4D1AF4998859C4A641FE7D2072C41C33F1C6478AB9568D49DE213B5F0A43AE8D4E1527F051145227B44E109665802CCFD55378A051154130B0BD4CDB97E86A524C702114B224A5310 -sk = 334382D39164D1989696A2FF77B25A28AF8BEAD9883B5365EB6FCCA7C1781CC9ABA5068AF837BE962F439F233593D193CE5E08F7D66EFB3389885927B89D252397F0169ADCCE240CCE953AC7B438B901BC147B3779F6624049B7DD2BA7E78A329033BA5665AAF1279F96695D7DB1991EF639CC3B045757AF4659F6003710EA441F33297863C97DDA7630F678C398F7A01A36BB62A05439C3BBEF0BBABDA9767C55D8D9A0C79C199D660903015D0E61FFB87094DA18EE616E261AE3E0828C033787880F429D1149FA263F62DA619F6AF7FF6087DE2D0207F363F333785775079CB6F1F9CDEB98A16DE28B633026C263B4DB845DC979EFF1C1326C1C80B7843C4F904DC0832E3EBB4EFF38A84E38CE267DB870EFF1430073A01212CA694A79662C8E5D00B0C28E067DFB3D3CC4CBBF7B0C17975DF306175110F383C431F09A9218F529F07A283DD70925B3AF21E13AEB5A622BEBD3C5CBF2E1D399089DFBA9371B0D9885B76DE8D88F73542F85DB7508122578E7D4B960C772842C452BC44104300F2B6C8902479D03B71B703DFAB5198AECE4DE304546B520BD68603AECB25BF473F7B81DA29E7624E610236C0DF25F202A32F172E6C55482C9A02399BBC4DDBA41D3544C7D5F5960FE519E08CFA56A853EF6D0086EF5D905C2DEBDBCBCCBB55C65BA89659F4A0B9CF5E5AB7B836BE2744D74BB3AC8E53F30C1481D1D1C8520D658A7016BE5A091B279FA4F28536656A3D4814096D87CDAF8314C52F71637202E7F15F8829921EA57CF070277704C18B0BF12A8F7362EA0C070C650A4D1AF4998859C4A641FE7D2072C41C33F1C6478AB9568D49DE213B5F0A43AE8D4E1527F051145227B44E109665802CCFD55378A051154130B0BD4CDB97E86A524C702114B224A5310 -ct = 4F89887713C19F0BEC9410C5A870C9FF924EA5CA038021A4357D6A683160D0E6C39C27FD802DD5C85F82A9D8B2AD258053A86E805E8AC1379977E6B0B92C42E115BD9CBA8D9F39DFF56BE767A8EA9D9568A3E127559A5719586E7A5DB419A050546FEF4D53DB0B40299B9F55EF419312947F8F24CB76F5EF3DF992467D1751FE50524B784C4AD786EDA947E76090B2A6309957BE96B3F177FA48197C96ADEE3C8E6E2D784ACD19AEA86CC9976AAEA1D40B5CF98C4DD893E003E21A622134C8D2D765AE3B4E730245545E27F0F018B99D1BE6F82017B088C81623F28F0B699B04D1D1B0810018793480726E0F58D5E5FE03B772902EBAF52CD9E0844EF3959A8704D17B130F7B4899AC9C42D46039541753E66948CC9872059D40F48A5F506E90715C37B1C0976CAA11D327642DF6185ACA3941F18A8765FC308E1870CE98760D697DBD325CD8D5AEEE8DAC38BE528AB6C9C9AA90965538568CAD943E2FF09B00A6FAB7981982E13EB5141216A1731A21811FFDB57D6B5F3C4160976FBCE82B10F4965CF60037CCDB58BC1FE02418DBEB2B30C427DFD18E78D23D6AC11DC7D1F1336925281AE0ABE655BE7107255C7CE9478C262E77BCFCB8002F581BD8EB8F8507B8B209D239557F688982808B050F5952CD93201544830237C3FE3FA314EF3A622D3B16226302541520059E82C8F659AB25D63E3A3A51EE14BB770C9B98F6AD614B19291A170FFB62C37499B1B3794E10E2F6DA1E8AA6DF2521392E299190B47130C25B06C4C104EB3A715245AB5CA3514A71046ADF90E2EC47A0BFEF518ACDC86AB819DCDAD4AD6931BA2B2F4F598A584037FE -ss = 4ECDE05F4C24C19F931695A8F6DED0DB21469A35A232792A2055E0FA129BF6E6 - -count = 68 -seed = CC0C86CC0ABF86FA21899BE1953913C00E7C46E6B5F730C4E88B3C034012763981D7F14459D3081638080378348856EA -pk = F028C7EFEAC23F7A9B7EE50C73D3041011862083518CA731D6496AEC46BD8A938F5C9BEA5EF04573DD4806BBF1EF8025E74255AB8FEC9A705BC373438D1F43E79FEADAA60CF5E138A54B96862ABE4B21994A4921C53400E856BEA19E5C58DB0812DA8EF2FF7722667D49F0D8A03B462CE8F7E94A2CF99597A5866C82F0A4E50756238EF872741229B52975E5F2B7946502F6F7D39584FADA259533F148B2E2F1E89CF06CA0099B4D25853B9F4F9084CA57927274C095DAA5AE4527269FB200A42F26A6997FAE385FD7162A341B2C8D86796287ABCE75DC9D3B3BA775FBF818F0A08FE774E7D0387021C5CC83D99BCE441BE8345A3741AC15B68265E50A4C9EE9715FFE494A23ACF7A2744768E6E2543B9556D0A230CF6A50F86D6B722272CA5AB49BD0221F4BBA4F6B353317B2BF9640F6F36AA798BD2A61FE0A62BC12D5064F483A833FD203A00058F8A9273E2AE281FC2ACCB443CF5F0F6F9CA03AF90ACFC4045271BA0C79B672CF871F61E49388555E02F3B03865634423B623A61D73A7FB8821996139BC2079C1FBF6036A40EAD5C14A3E0DD35F97E7388380AECC41F3F16513071F10407805F9AC44BFF51B676A2503CA16FCC9ABD340EF3209D3AFB6A09E1098B2C0EEABF1F22F02C32A7363D8A76DB2381565D1B13CE39735129BADC8D97BD2AC18FD3EDE3DDEE362489079B78CE0E28EE620C9A38706A16D4BAC64A6B7141A87C31CC17EAE37DDF77997084431201E353C1A2A03BEF410C607DAD61590C9691143E2E9B5261A515C59771C67F244B60C -sk = 6995143E8EB8A6E93840F76EEC844F67D2B5F75B1839A5040337E61F9806764A0F4DFF8E56F68440836A072412A30D851ACE2C7C6F02D60E7A8420001A63E6C6289AD9FBE5D49083E7078F73238A2402F028C7EFEAC23F7A9B7EE50C73D3041011862083518CA731D6496AEC46BD8A938F5C9BEA5EF04573DD4806BBF1EF8025E74255AB8FEC9A705BC373438D1F43E79FEADAA60CF5E138A54B96862ABE4B21994A4921C53400E856BEA19E5C58DB0812DA8EF2FF7722667D49F0D8A03B462CE8F7E94A2CF99597A5866C82F0A4E50756238EF872741229B52975E5F2B7946502F6F7D39584FADA259533F148B2E2F1E89CF06CA0099B4D25853B9F4F9084CA57927274C095DAA5AE4527269FB200A42F26A6997FAE385FD7162A341B2C8D86796287ABCE75DC9D3B3BA775FBF818F0A08FE774E7D0387021C5CC83D99BCE441BE8345A3741AC15B68265E50A4C9EE9715FFE494A23ACF7A2744768E6E2543B9556D0A230CF6A50F86D6B722272CA5AB49BD0221F4BBA4F6B353317B2BF9640F6F36AA798BD2A61FE0A62BC12D5064F483A833FD203A00058F8A9273E2AE281FC2ACCB443CF5F0F6F9CA03AF90ACFC4045271BA0C79B672CF871F61E49388555E02F3B03865634423B623A61D73A7FB8821996139BC2079C1FBF6036A40EAD5C14A3E0DD35F97E7388380AECC41F3F16513071F10407805F9AC44BFF51B676A2503CA16FCC9ABD340EF3209D3AFB6A09E1098B2C0EEABF1F22F02C32A7363D8A76DB2381565D1B13CE39735129BADC8D97BD2AC18FD3EDE3DDEE362489079B78CE0E28EE620C9A38706A16D4BAC64A6B7141A87C31CC17EAE37DDF77997084431201E353C1A2A03BEF410C607DAD61590C9691143E2E9B5261A515C59771C67F244B60C -ct = DA833767C3C18F3F649C0D028D1BC674ACFD59913CD7F09E1C47689E7A80D1AAD467A4BAA61360C83755C0A528350356B13B739186281008D78C557698C827B2C079E7B68A1940E1AD60F0186F176259AA474D8CF464574A2C0ABE30D339D74896A0BD48830BF8F30FA33C36D776142D8EB786953D038377E54A9FD3230894156E254A1E1DAA26F7655014C3ACDE2DD4C1C7487D1FC8E0797F6CDCB42FFE7FD82D77B5FDFEDEA65CE76FA79ECE6C1F973BE239A573900FE2DA0D78464045BFDEFE0C3E870B7AA446D03D1C5B26F2BDC6C3CF6A94B0039F4A66F026F8847B9861C0C022BBAEAE255CD5407699326F4A653A777AC84EE17007C40E3BD73ABD40E34CFC59F96DCE77E170C84849F830181ABC8836882A46C9CE6E46C8F54B826DD2606DC209F8BD5C12402CE38B6A4C20AFEF864550011EE6D9FE2B7E3BB1895670834A02D44ED4911F4C8688CBABF24CA3B3A39618AC21BBC0F29BF46DC8A29B8F9552C3585D004AFA17E0C4FA061172C2FB313C5233705103A97F48A328489E7CA1FE896762C826A8BE58791D59F8890CA2925C75FB00344F8B08D12574D81820C58EE960D8F8BBA1A3A8420612453594B282FD0FF02EEFDB3EDB2F80517DF1E4CD665909A66CA7DB97FB07FBB749A08A547391804E1F010ACFDCD729CF421AAB6F4BEA4186BE92E91A8A4FDF53D5C60C670D37D090300C699B95C951559BAEE7695EF9A7E3A846A91986FAC3DFFE2733A297B437A303E43189169039454CF6064577A6109EC807E8D578AD8DC151763856F9E8494310E52580E6C3D13C0B7C3397E2FDFAE8CF43121EB94303607DE01FD0F648CA -ss = 436AEEE24290F4A1117A9A52451BE197BFEAFF56944CE8C67F783C1482F5C6F6 - -count = 69 -seed = 6D5A7CC326ECF3983C4E7683F45263A37F692F3BCD2D920E1FD9584350119E74F9A3F905F70D3E20318C1413DE2A0DEA -pk = 73D3FD45017EEDA417CD1FE4CE05E76E392EDCE7DF4C68ADE71104AF634E0036D0E999BBF9AB5C3821A1C256E106EDB5BF1015477EA043492ACDE9254CD0E8ED1D84AD37DE2CBF54CFC8D88AC24673086232F854AF9BAA8AB331664BC9137C5F6A7610604DB88E02E1DEC3FF12B66BB975C82135E6E16AE2502269A77BC92526E5CDB585121818E8AC67FFBF0CBD78E2BF3236CBA01ADFB27240DE5C1B26EAEA502877C57D8D771CDE12D268ABFAF9742AE4A54CBD5E0B8D03D1A156EB24DAFA268A21CD79C5AC42510447C86DE0C793060562C2FA4D1513A5716F275D81ADDE59B55D7466AB4BF6754C766477F798BC8EE7532EC734D57E756C42FD3F9F95BA48838B46865ED20C4C529652032D25EB2310943DBF84921E110057BFDD5EC2B5DF8A4E5DC32384792911E93A5BC33A1D68946F48EA192656E77F96B62059DD1091F47FA3B2EE1AFC4127B474091F86848057EDD495FDC0BFC878204480ACA9072610F932F55BDD4EB18EBFEBF0C04AC3F2BA670840758D159396D0B5AEEFCC579BD171FB46285F41CAA45BFB059ED5A9FE2E1A78370ED18BF9E9E22B3345BE10C153EB950295F74231B0E649A51F7CD28325C735869EA08CAC7CA58A0D2AA495E08D8CAC2D1B694B2F46E7AB48B1FC8794AB5F016834283B869EF6D2C88B92E7D5EFC0992BD1DD9C9D3D10AFC9ED039A6952BB1B97342E51062343195581CF1EE64A89A1568CEBCD1A5E693F08CA5761CCCE988E2543B8573C852F76187C4EB36965374C32F9B07BFF9AD1CE58035C3A4EF66C10 -sk = 995EFF7E0D195C6D0533F3DC194D47E60F9AD14696144CDE694D60A95F3E96B4B28F7E7A15A005F92400CE33DB073D49B53871594A88FC45E0F94207B5F0F2DCF1C724CFFE8D40195AEAAE0FBC78840373D3FD45017EEDA417CD1FE4CE05E76E392EDCE7DF4C68ADE71104AF634E0036D0E999BBF9AB5C3821A1C256E106EDB5BF1015477EA043492ACDE9254CD0E8ED1D84AD37DE2CBF54CFC8D88AC24673086232F854AF9BAA8AB331664BC9137C5F6A7610604DB88E02E1DEC3FF12B66BB975C82135E6E16AE2502269A77BC92526E5CDB585121818E8AC67FFBF0CBD78E2BF3236CBA01ADFB27240DE5C1B26EAEA502877C57D8D771CDE12D268ABFAF9742AE4A54CBD5E0B8D03D1A156EB24DAFA268A21CD79C5AC42510447C86DE0C793060562C2FA4D1513A5716F275D81ADDE59B55D7466AB4BF6754C766477F798BC8EE7532EC734D57E756C42FD3F9F95BA48838B46865ED20C4C529652032D25EB2310943DBF84921E110057BFDD5EC2B5DF8A4E5DC32384792911E93A5BC33A1D68946F48EA192656E77F96B62059DD1091F47FA3B2EE1AFC4127B474091F86848057EDD495FDC0BFC878204480ACA9072610F932F55BDD4EB18EBFEBF0C04AC3F2BA670840758D159396D0B5AEEFCC579BD171FB46285F41CAA45BFB059ED5A9FE2E1A78370ED18BF9E9E22B3345BE10C153EB950295F74231B0E649A51F7CD28325C735869EA08CAC7CA58A0D2AA495E08D8CAC2D1B694B2F46E7AB48B1FC8794AB5F016834283B869EF6D2C88B92E7D5EFC0992BD1DD9C9D3D10AFC9ED039A6952BB1B97342E51062343195581CF1EE64A89A1568CEBCD1A5E693F08CA5761CCCE988E2543B8573C852F76187C4EB36965374C32F9B07BFF9AD1CE58035C3A4EF66C10 -ct = 6243F155039B41041E92BEB49E60AF4A869D11D1D9D5D17A63C7B51FF7263DCEF1211976904649482E3506D7B8BBFD88006C29E0A02B1D8C726B4B687D7CFB25A27DFFAAE4AC6E22AF546A6C805293CA760B92736E8C40E3AC66A57E0C3F434B262C90AE9807FBEFEBA00C35E5889E69B9304B222FA4CB78166D0F404B50D97FC69656D525365F94E6E76106721DEBA836DFB2EA7BA89C94F1E6BA70BC2F2B7A32F1DD3B7653EDE1F659DD05D7D3CFE1DD39749B79CDD65966899D5DD675EDD544EF30EDDE569DC421E41537A077437B519FA3A039CA1421DBC29515F33EEDD553A402D4B27F98934693CC155333CD8B3BF3468FEB3D03B4C5F2BACCE0DF7541569BDD7707E613660D2AB247DBEA61F89ED9D9797F4983D8ED52DF88F658140A9E8E03DDC10937950876B242640AD0E66BDBA978F2C6190B64BD5ABEBD656CEFCE32A76506F434BDD46904A10069DF89AD25F96AA1BD3AC97598DA3094CB436DF6B5D2CFD6EE9611C521E77D6370F63CC68E1569576A18290BE837D1D443DAD5FA22E80182B1B420858BA1C23936A63BF2B94FA3C05A0CB7FAD4AFE9361EA593C4160BAF5164B405C16425C1C48195B69D927DC3B76D3C9E3D580353C380F2EC3775D913139425E5B4BFD9A5F3EE0AF9AF1631BBCE194F366C88D3D95F986F0E4C87297D4219494383F842AAFBCED31E22A345308CB9D7A9810BF094B94567314052120B2665484F308FA9751E2FF0CDE7BBD1715537D391F9AA738E0E0211D1280CCA920E23F9F6B9BDC819545A60D8E2FB79123FAA4F34BB542B649C8AAB3BBF13680470C62F0CC9D6707EB76F1900198A8A52 -ss = 5DDE361F4EEA78A44F19ED387F5548126E26E35AE403F3A42A695817EA665D59 - -count = 70 -seed = F68FC0314DEA88F66AFAA76E6C9B6804B13D4876924410D1F526FAC59A62E26C560B125B1D0F8B461F1FC2E351EFFB4F -pk = 5EF6DC358AF8A72280930D1DA2BE63E18AA7E2806302ED77F7D5BB13941C82C8A1A26A899BAFE62E542A0F06DBDBCAC759AAD11285C4C7C4B05022B89B099090654802D40CA7185437A42A7EEAB66FABE44DD2ECDB3655D40F4347A6375FE67A35D1B04BED6EC2C05655B35FE576446E1B5F256AC7F1A1BD6124E8523D2E6162D25E931E3CD00559903410FF1E7ACA06D083E70767871DFFFFE1030F4CD2B8A008981059C776ACDF82668FEA1246F279C002E58B4709653B9A840E0554301F8C219CB994FA1E216044D4117254AA263C6B6F417E5A947D5B5C3C9FE6BC804E8D5D4897FF1FD5087E40CD72DB8057B536D48A6EFB7262A8E194C34E46FA82D2FB99206294EFBF2F6D3AFC3380A19F8A360A708911DFA2A66767324827B217A9BCDC3BD91701F74A1C7DBD100D94D5CFA0F7D7E2996368BFB51AD25CF989882DA4BFAA66666A6BF764CC38DE795BA33251DA7946C2ED64ECB3711AC78CD6BA7B1C8863B9B69F61A3DD4374936A6E9D285F2EAC953D0D2633349971FA1B8D554F07F12BF61BFDD7AD2A5728D830C6C617EE272A12A6B56820B208E90D14972E6903861612DB8B11E18806C42F1FBAAE2E3AEEA9662CBE3924B974FF4F16E115DB0D9B34B10404D88908B98180EC8A9348597D436B003526D609366C95026D19F5DA0CE6929A547479C07958215370F4893C7B7568E95C68ACE58BC8C95C8445FD0CC1BBAEDF1B2334924990F6CA97D5BDCA168C1F75094B1ADE20D4CD9627F408F7536314CAE52E63E13CE775E0B1B176B50A86DB61 -sk = 3E809EC8DD0FEC0D911A4E3FAC20F70FBB128C5DE94DC7184CA7310AE9157A98D8128601C28B1DEF8D393A0DB283229F7C7383152A814E7CEFE8EF9D9768C473AD3022B265A1EA4CB233CAB79A52FB025EF6DC358AF8A72280930D1DA2BE63E18AA7E2806302ED77F7D5BB13941C82C8A1A26A899BAFE62E542A0F06DBDBCAC759AAD11285C4C7C4B05022B89B099090654802D40CA7185437A42A7EEAB66FABE44DD2ECDB3655D40F4347A6375FE67A35D1B04BED6EC2C05655B35FE576446E1B5F256AC7F1A1BD6124E8523D2E6162D25E931E3CD00559903410FF1E7ACA06D083E70767871DFFFFE1030F4CD2B8A008981059C776ACDF82668FEA1246F279C002E58B4709653B9A840E0554301F8C219CB994FA1E216044D4117254AA263C6B6F417E5A947D5B5C3C9FE6BC804E8D5D4897FF1FD5087E40CD72DB8057B536D48A6EFB7262A8E194C34E46FA82D2FB99206294EFBF2F6D3AFC3380A19F8A360A708911DFA2A66767324827B217A9BCDC3BD91701F74A1C7DBD100D94D5CFA0F7D7E2996368BFB51AD25CF989882DA4BFAA66666A6BF764CC38DE795BA33251DA7946C2ED64ECB3711AC78CD6BA7B1C8863B9B69F61A3DD4374936A6E9D285F2EAC953D0D2633349971FA1B8D554F07F12BF61BFDD7AD2A5728D830C6C617EE272A12A6B56820B208E90D14972E6903861612DB8B11E18806C42F1FBAAE2E3AEEA9662CBE3924B974FF4F16E115DB0D9B34B10404D88908B98180EC8A9348597D436B003526D609366C95026D19F5DA0CE6929A547479C07958215370F4893C7B7568E95C68ACE58BC8C95C8445FD0CC1BBAEDF1B2334924990F6CA97D5BDCA168C1F75094B1ADE20D4CD9627F408F7536314CAE52E63E13CE775E0B1B176B50A86DB61 -ct = 69AB14D607EEE5F4CBA5F924578DDC951CB269E1EC70A7C26A9FB6E9F4A5C455D611E67F6F979986945E3A6B7C735194AF0962CC88C54943F8222D36C8E0CB273D859FB33C302F17417BAB7D70B680B5230F6520AA7D6ADD8FE7D4F2DE0B8C4ECBC4387779F789BDA78CBB9E6B073EDDCEFB588AF9C1F9C4ACCF87A052413180446550BF1BC2A7C3597001AC51D23DD937032AB47D7906561E62AB55F08377C189FA389E329B653716B99D0D78BA28CE13471DEC54EB73208E94D23DD8E2D2CCAABAC399E8D2274E2D8919450453CE27AA6482E69744EC4940E6237DDB81DC326F64229BB84D0B15A0012C381E0C6FA9F732319403F76CC8CBF90A862BA4A9740744C56B4CCE1CC7F2E6B6C9AB9A4DF5BD04421F8870EB551B615C9363334E11E8B9617033712F2A2E0F14A9045EE06AF4479E2D3C66B4EED9DC1FEDD1241483FD8BEC5330632EF6F9C6E096CEDC3F86648342C7F17369E2FD7623A8A3175B5AEC240B36FDAE7FDBE9D66FDA69136FE65A73FB72A2B29F2AD179F5EFA3CF45BAE5061C651A573E8F6B711043194F378DDAEB17E8A022C80BA1A93D0F4C77A95EB437FB481289FFBA4C705C78B79AEEE7BD318B5E1D2462602A116C6D9CFCBA95939D8D95519F5FA3AC84BC47A0A6E257876A2B769638DD1C7686F3A88B551438D9CC6E4B5652F3E3F59E563EE301832DDF818017ECC9F1669A16B22DCB629142413689AB6C9DA7323A492636CAFF847FD94DFFA7042D0343A046DE6BB2276C5254244248A8EDFB4F979FD39B3B26B01ACC1FD7622AD2A6081BFA476A8F4B7DE2C163C26434A539078DC0AAA9E2586E18FAB30928 -ss = BBBEE89DF51764C8983ED543DD446DB770B9B64ACDDA2F974A469846744DAC13 - -count = 71 -seed = A229218B0D51F58D915DF549901548FB0722F352C7470900E7E4D8399205764A319BBDDBD06C00E8C5932722EE5A404D -pk = 0C0F2801F17395003FC1EA04C64A485014709E717A5EF620984DFEFBB9DF1FF33A6D477CF3B190D401BC4B9D0CDBC106367A30AF738E5B90E91700CF11D0F30C27AA41DAA2D95D2FA767AD1F834427C87FD1659D4F5E991737BF92C4A41CAA14CA91664E4A15754C515EB584E96F4FC3DB61CA7DFD224A43A482063B8805F8E9BAE4B0CAF1C5A3960B636F8C1DBA63947D3EBB2A38E146D43FEE18DAB828E3DAFC64E09F06AD9BDF1DDB2CC6580DC0B6C954BD4C9E2960888EA12103F22070382C74F5248678E876D6BA614B19692832A1F584746FA58F7CF11A2CBDFF300BAC69C520B579157B449F154D7A27ECAD9D0340C68FC5944779051E01762E94FC2A42A2F31E84517C632A62EADA33CA35EA3F777A3956EA601E3D31F7FEC92EDD683BCCC700EA66B38F23DC72DE1EC564E9770EFCD2BC23EBA877AB0A8ECBBB78A4B4056F62AF26B780A72B58C1E61554C9539DABA87DEB6926CCFA1C629272BF8DF5FD9E70B311B651FC1836ADED5F6638A151D3A3962A955136F821F0B8029913AF26A5CCB5A7BC7C885B02F1C8A0E94113EED2E25A954E87662FFA25CED2C8873123BF49CBA4F63F156404869FC5F986F24C69A9752937871675786CEF02B36CE71754F940B0AD39F5C7E5FDA7963F7B8615107B7A228312F0423E6372BB690F4FBFF61067112F55DDD783460AEA3141A958F7AD747DAFA4573A2A8ACC344F5AF7700BC6BE23033DD32E73F1565FD2C7006C4DE5B9AE7242A07500077075DCA4BE8350FC83D539AEDC8942830945E5F8A28ACE33 -sk = DBF1C465FFF3D9F783BD9EE61A573715E45691147B8904439B5FFAA64F94FF7BB6D75EAC6C76CED1B0A025B40A55440712AD8424672E761E9BC400D63812006F2EA0901B47297BFEDCEEF84A39C62A000C0F2801F17395003FC1EA04C64A485014709E717A5EF620984DFEFBB9DF1FF33A6D477CF3B190D401BC4B9D0CDBC106367A30AF738E5B90E91700CF11D0F30C27AA41DAA2D95D2FA767AD1F834427C87FD1659D4F5E991737BF92C4A41CAA14CA91664E4A15754C515EB584E96F4FC3DB61CA7DFD224A43A482063B8805F8E9BAE4B0CAF1C5A3960B636F8C1DBA63947D3EBB2A38E146D43FEE18DAB828E3DAFC64E09F06AD9BDF1DDB2CC6580DC0B6C954BD4C9E2960888EA12103F22070382C74F5248678E876D6BA614B19692832A1F584746FA58F7CF11A2CBDFF300BAC69C520B579157B449F154D7A27ECAD9D0340C68FC5944779051E01762E94FC2A42A2F31E84517C632A62EADA33CA35EA3F777A3956EA601E3D31F7FEC92EDD683BCCC700EA66B38F23DC72DE1EC564E9770EFCD2BC23EBA877AB0A8ECBBB78A4B4056F62AF26B780A72B58C1E61554C9539DABA87DEB6926CCFA1C629272BF8DF5FD9E70B311B651FC1836ADED5F6638A151D3A3962A955136F821F0B8029913AF26A5CCB5A7BC7C885B02F1C8A0E94113EED2E25A954E87662FFA25CED2C8873123BF49CBA4F63F156404869FC5F986F24C69A9752937871675786CEF02B36CE71754F940B0AD39F5C7E5FDA7963F7B8615107B7A228312F0423E6372BB690F4FBFF61067112F55DDD783460AEA3141A958F7AD747DAFA4573A2A8ACC344F5AF7700BC6BE23033DD32E73F1565FD2C7006C4DE5B9AE7242A07500077075DCA4BE8350FC83D539AEDC8942830945E5F8A28ACE33 -ct = 6C6728D8F7B59D123A44F645504974C45D866C9B0B415A1184D7176D7B68D0C039A54C538741D7444B4F9D50200F16075FAE2EDC78630179021A8E6EFAE58A3DDFDBE59156AFF1A0F3BCBA0BD9BB6C2F05916698DD919CFEBD26A06DEC5C1BFD1732B5EC5F32390EE6F51A84E617B64E8D3ED012E72621CF5B3EB8DD4EAD1EB5E8144B80936201470B64C4B7296896637D62D780917E3C13E2E6C9F472C3A99BB3C9A2962464C5C6204C8ECA3CE92706B30227B60377555A1C67A13D5927B419D5AE176FCA9F98B5CBA7AEDAD616B608D2B2871D09E79CB5A5FA7DA96CCAEA27223252FF976FBC6720F38E54A21A6A2522316C5835CDFF0BB1B8AEB8DB9EC26BDD4C265C57670AD4C1645DAD2A8C2F323EDD5BAE4E0B5B7B634B21044DF166CBF0525CAA1BDC94F49E3ED9F815714C845B89FC614B6B7237F7E19192BC776574F426BE416A33ED17D6B95CAD78C944E3AAEBEE4252A117D1C0B597C5966B88EBDF2EC243423029BCB1CD9F828AA81613F11FFC9EF37D6F1A68A81B38BFF55BB5B07882E3FC37F658D115D0ADF6863EF760BB9B354833DBCFB634740FDF7EEB065A89F3BAF4A7EC34AE2C7A102C482D19627DDD9FD4A86B9C93415FF6A305C4F080D4A9772AB0933DB581A6F9BF1305CD382E3BE3A75FFBDBE714892AA5E58B8BC5BE82CCD7A7023A4BE7B76F602FDE6BDDF2FEE553E0B0A4F4ACDF70E76F737C6A9F3B0E98EEBB14447FBD579C6C7F31D9B79888015529855BA106DCAB5666DA85B4CD801560DC4E9AC985ACFA4689CB6606D46497D8E7E748E78AED101878A9D0365952DCA7A38D97E334D1AA6C109F8CAFF2CA -ss = A16B54DCCACC968F4A80AD53A969A20C5850E04719C28A07C25ADC6F3EA77D91 - -count = 72 -seed = 6960F21C7350DCF41B4770C551DC8692D8BA2C0B6E162C589166FF22E7A1AC0F94C2F48504A5F7EB0DA094DF427BC98A -pk = FFE009C22AAEE7E82FE604F67CD0E4C1D73DB768FCF60357106BDCF6A04B8CB3266BEA47E9615EEB91A19F833A4B1BFA1CF6DF6354433B0C88E3D9762CECDA34003CD4295E39089EFE26D2DC91E3F4DD40B83171C8562CDE03BAF2A6FA29CD90BED721B5E01B0209E56E351F181A44008C4D635187538DC2514C00058C71A243C3C16DD9CA5FB212B192163215B80C93BF27D6312F930A40BA35656C6658BD0DAA7CB5C3A8CE62A8D452A05B117E7D30C46D1B597209D7619FB9FD214A0C72AA40044C2364EF9FC20F64F7DB7BB0AC570F6F3CF011551447A95D798A8F64A7B0CE48EBA3558AFA0388897CF54DF94BFBE9BE82D8E35FA7769DA128EFF348C283D9944A2496E16522262B30030990668ECE04C9D92AAD68F35E6E5DFC6B8E695703A537A0880D5CF02371E1B921B7315FC239E1CA8D2CDEFCDE8B8EF530398D9A61E49942CC6437FDEB11491EE06198C7C8371608536FC9A6D1238040F24FC24C8313AF17877D66818C549FC0DA630BE16CE4C103D1F68B29AB107F5547D4F8E4ED581D0388241CAAF3770E67E7273C9B911A935931E65B62A7290C87A0A32BDF02D41490942AEE8A73489C8CB6C2462714BC6C4BFFA4045215FCE3A18E550E9232AE394F3383B6FCFA767A9B82D7A1A17ECE487FCA660913BD5B252EF9B381F5F7B77C7FA00C49BCBA9521D92EF5E0C188005B8EB2721C453E0ADACB9AB76591C597BDADA3DBDEF4FD804818F3465E949BBDE0DB53985D24BEF15897248A6932D57FEBA9B0D8E03280D857A7F6206F417C7E910E -sk = 1F7CFD2B70863154E8A69D1758532E86C20CFC763D67C758BD10A13B24E759B5273B38BDDC18488024EC90E62A4110129A42A16D2A93C45439888E76008604C611BEBAEAE425BF69BB34B06612A03502FFE009C22AAEE7E82FE604F67CD0E4C1D73DB768FCF60357106BDCF6A04B8CB3266BEA47E9615EEB91A19F833A4B1BFA1CF6DF6354433B0C88E3D9762CECDA34003CD4295E39089EFE26D2DC91E3F4DD40B83171C8562CDE03BAF2A6FA29CD90BED721B5E01B0209E56E351F181A44008C4D635187538DC2514C00058C71A243C3C16DD9CA5FB212B192163215B80C93BF27D6312F930A40BA35656C6658BD0DAA7CB5C3A8CE62A8D452A05B117E7D30C46D1B597209D7619FB9FD214A0C72AA40044C2364EF9FC20F64F7DB7BB0AC570F6F3CF011551447A95D798A8F64A7B0CE48EBA3558AFA0388897CF54DF94BFBE9BE82D8E35FA7769DA128EFF348C283D9944A2496E16522262B30030990668ECE04C9D92AAD68F35E6E5DFC6B8E695703A537A0880D5CF02371E1B921B7315FC239E1CA8D2CDEFCDE8B8EF530398D9A61E49942CC6437FDEB11491EE06198C7C8371608536FC9A6D1238040F24FC24C8313AF17877D66818C549FC0DA630BE16CE4C103D1F68B29AB107F5547D4F8E4ED581D0388241CAAF3770E67E7273C9B911A935931E65B62A7290C87A0A32BDF02D41490942AEE8A73489C8CB6C2462714BC6C4BFFA4045215FCE3A18E550E9232AE394F3383B6FCFA767A9B82D7A1A17ECE487FCA660913BD5B252EF9B381F5F7B77C7FA00C49BCBA9521D92EF5E0C188005B8EB2721C453E0ADACB9AB76591C597BDADA3DBDEF4FD804818F3465E949BBDE0DB53985D24BEF15897248A6932D57FEBA9B0D8E03280D857A7F6206F417C7E910E -ct = 1937DFD660515A2FF1F3CB359207C168A2582393659926955C68E0A6E2482838744E676F823150A6F448D3E2DD62039AF6DF0A21D49C02FCE27AD36EB1B44338F2492F26FE62F4792EFDE28AAE6A6B1E720859EA7E564C41E4496C7D6E57747D851F13FB66206BE2414668E829B9993D5F07C555BBE437828B605A36D25670DD956B19AC1863109721E21CF8AAE054DD1050C12C71F7BF7C142F5481730A94DB5CF17543BB345C0F35AB237C0018A2F5E42B623B914677109F8514331A82C7732CE2B163A73CCDED29AE5374D39AB962C890A9A139E108AB32C7B5476C8058E960B4BAC43FD7251AEC18D21D98504DF4012F12ED3E0790822C5463769A4910EB55D66788F8617E19E5A90C691097372913481B4AE53DD782C326A1F9E20E15092F7CACF38E8546C860311CD09754071FE22EAD8E01FE666F5E7779AF47F350CA19A39DA58A3C538BEBD826583779CB60B64D97E8D0A5F04AA764BBD78F293E0DA2484761D29A6454B87901211144B55790571AF7BE6F1A1351CC554F3FA82A5FF48B2C67E69A2CA7064B890DE23E92BE5A509331D8A9BB8E2C0548BB2F76C4BD8DA3068B6BE6E2F841F166A797C819980C72784F3158E5021E9295423472E5A70AC79CB4F4529CC238DD315FB3EC797811817C7F024A1FEF209FF3FFF831E61DA06BF48E2BA03E3F949346FD7A85F652635F014297B1C0DAA28CA4AED41EA6AD4B050F1D387B46ADD1C14AB0AFFAAF6B44323B362FFC2AD89964AB83D247A191943C8FEDCC231898BCBA91B11ABCBEFB0202BC57218BC6A9CD313765CDA7673BEE784BE6D5DA439DAAC812DB34902F0D25DF8A46 -ss = 8CB2314A3D7B8BCBD157E04D0907A2EA79512BBFDE626433B4977E3C79C26D79 - -count = 73 -seed = 53DF46012CAD4A745B7A3C06E18CA95E0B839FD8161E3025749A0887549EB0ED6A44EEEA08BD6060D6509DBF7E9DC864 -pk = 49AE457BBBEA8BD72ADB129FC56248691C7A4A9C575E24C62C20A0AD79ABD194B40E0B49BD305CD055480450CEDA5144EA67506FB3B729986C4C5BC7DC4478C8A100C3224A454892B3C1B8ED2FDC950D644B0D96DDA9D879F7C23FC40262B7B3FB76497017A6061D4A93975E9FEE9AA7F71D1E14F71FD5FB5EA69FBEDC9591EB3351A6DD13D13CCD1BE274A2CD59670A23B28CD6D59E3B8F81D4945E8F9A252A33DA4976376667D6B1F933729A83322A3CB0C8E77CFDF003948BF15220248478F86A4378D4F7DB9DA407F65BD5C31E7B9ED77D0A05D56CCCAB332B413F90556EC20553E6DDC59A4107AE093337362229462BD7B38DCEC6D5823170A982E326F47D60FF6F614A4A3D69D8893A8EB9CC942999DB2FB8CE5BC2DB4F5ACB683A5684C681F38B11716DAB8605CC769E832C70ED20F40AE86AA717F3DF93CE2B3CC9B7C44A61D336082F477CB425206F8D161147C65FE61360FD595D3457ACF8756885FCB96593EBE1B95F444BC141F32F80A9503483E884CAAB0BCB3630066BBA7B721B4B72E5617347CF17FCE412051574041D0479FC572F4BD2135957A0F4D605C001BA281A7683CCEB6D51173AE6DB38C27A7E9521ACFEF8EA1F615A0BE87D650A39DE2F8128B41FA73DAE30C4DAA0138D955FB713C80C5DD43990E9B49068A9ADCEE40CB6E0B5F3390BF4CAF422B1CBD90B352624BE0EB3416DFFBC1FCCCF2CAD3C5CB1008E6C2C6E29C328F5B754FD76B5D0C7495A23F662D9E9C796DEA43C209E2E831898FDD1492AE0AA90A10E4965C699E63E -sk = 3A19577908EFD37697B8EDC7FDAF47D1BD3AD01A1B77FAF794BEE5B9C3192A6FA3729672816F3EBA84C9638A79676EEAC0F22C8A48E0C5D50A26FF0844C66B9970C30607EDC2CA4DB2912A5DBB81690049AE457BBBEA8BD72ADB129FC56248691C7A4A9C575E24C62C20A0AD79ABD194B40E0B49BD305CD055480450CEDA5144EA67506FB3B729986C4C5BC7DC4478C8A100C3224A454892B3C1B8ED2FDC950D644B0D96DDA9D879F7C23FC40262B7B3FB76497017A6061D4A93975E9FEE9AA7F71D1E14F71FD5FB5EA69FBEDC9591EB3351A6DD13D13CCD1BE274A2CD59670A23B28CD6D59E3B8F81D4945E8F9A252A33DA4976376667D6B1F933729A83322A3CB0C8E77CFDF003948BF15220248478F86A4378D4F7DB9DA407F65BD5C31E7B9ED77D0A05D56CCCAB332B413F90556EC20553E6DDC59A4107AE093337362229462BD7B38DCEC6D5823170A982E326F47D60FF6F614A4A3D69D8893A8EB9CC942999DB2FB8CE5BC2DB4F5ACB683A5684C681F38B11716DAB8605CC769E832C70ED20F40AE86AA717F3DF93CE2B3CC9B7C44A61D336082F477CB425206F8D161147C65FE61360FD595D3457ACF8756885FCB96593EBE1B95F444BC141F32F80A9503483E884CAAB0BCB3630066BBA7B721B4B72E5617347CF17FCE412051574041D0479FC572F4BD2135957A0F4D605C001BA281A7683CCEB6D51173AE6DB38C27A7E9521ACFEF8EA1F615A0BE87D650A39DE2F8128B41FA73DAE30C4DAA0138D955FB713C80C5DD43990E9B49068A9ADCEE40CB6E0B5F3390BF4CAF422B1CBD90B352624BE0EB3416DFFBC1FCCCF2CAD3C5CB1008E6C2C6E29C328F5B754FD76B5D0C7495A23F662D9E9C796DEA43C209E2E831898FDD1492AE0AA90A10E4965C699E63E -ct = F20D4ED0A2553FC72D8C76C5C7DF62B7F75A9BD16381393A08B921CC892B91D8C78F44C8EB56C8BCEDD6B7EC9B0C5996E8A5EDA3020274B604BCEC439C098ACC73471BA3862003A42CCDBD1D6071AB54E4724E75FC0F86403543FCA78C40EC62CC5D9B42CCA92FD556CD976579D9721AD5FD6607921602B8649CA05FB274EBDEBBECF7E99C9DA079D17687DDD72889C4626B34564723DE80434FF59A516DCE80B6BEFB72F70DED9FF6965C88FAAB515B1F1C042453B44E96BC2A826AB3D015C07FF1F22943C390E76194A29582491CE87272DC488F5F200FAC8D0182D333E168549EC4DAAE0922C1D357AD708C1E7554A08B26B4D7E80B91481E4BBC9438325960048E33B1039D300CC26E3C429E78EABB21C95818E09BB57D01F562A55C3829D5BDE3F4CE6440D1DD315F29BE0259563B527190F5AE127EE2525040BD0B8FA7CD33057C45C21CD5CCCF4CA8A66E6A3B1387CB3F3912A8FC75975348D4B67E7CE6F8188696A65EA7E7867721046A30505039D46341A7E20CCA695AD557D4A1399209354BABD2FB7DAACE71973DCB96021A08F865673A4175456E56DF4E18D37A04B1191D134860BDFD92516547CFB3CAFDDF2C1829D8F0A6EC94BD7154E120828BC9E78358D460A06647E61997E0F8BD70CFCC78CC0AD6C4CC98538167FDBC36DD56E1B2D3A10290FE623FA7DF902A9F48139BDDD0481B4D7BB0063B005DCA2BD35CD9B5307960BC651AABFFA84C9DB5133988A8894663D3AC3BDD61D8F1D66E637C5078959FB224376201E67D9BCFE9B8CEEA389008F2EDCE4AB2C705C60F49983B0B381E1037173DF27466A7627C9942B272A6 -ss = 3BC6E89EB86810163951340118ED66AD0B8B84EA6021DF32384D9EE2ED438716 - -count = 74 -seed = DEB963F8B1D8FBDF499D564BA8D2D47915BB402DA02F17031B37B4039A842AFB9B7E48F37200605992BD2429427A7A4E -pk = 05951FFF0481D50C64B950DEBEC328FA03BC56160E337249E40085CA62463297285326C04CA1329498D9E8C64C285892431C0885426AC0072D19F6E0536FB458C4A7C8E78783DE18B2B023F86B8A9B654393F367CF7BA6CCB70853C6A811522E9DE23FD1AB771DE47AEDBA45FC5254BBFC6E8C3996CF07DF51B6859C8728252D0A0E8BEFCB50E70812B7151A45C5FACEF1192D587C104530C47123C7E3C2AC835CD84CD0B55F520C2A94A32892CCEF5F899C8CBA869D23215F278D0AC256BAF2712733EAC7C5AF7C3DA8A1763ECC1280A7BB8D7B753945A6C8C7C943AF6BCB59AA65330E2985587159836623FEB4F77D85455E6AD247877A37004C8A7771E1AF652A661309176F36B32375059C62828DF7734C1ED6C1CB6BE8537B583DB05137545F44B41DB305B32CE983CC06B7D6B0B7AE65B1434CE87CCFC4A6C1CECAFA4A01537BDC7232E42F5AEB256D2356F026826B0B196C409881DBDB2F5EC9708F23EEEA7D6D3F3626E960F9D155AE8071C2C9C5AF40EFF3F746DEA5B6AB572C74AFC35A025C303858428EFCE81190FBBF490C3F9A5119B6965D2E407782E8F56A04E6D5E59F3C04AC3DE8D9342E5F96D5BB5F83298FE9571355EB70F3774BF9BA98D0D76F8D702855F293AEAC144038D92BDA7E9555B9378E48DC890044615C51A03AA81CF22106D50A695CDB2F65A2FC57D131AE93296A6F743CE44DA901DF2441502066D28316B5620518D58460FD80E5768BDB56DED3DEA43783CD26B18BB774DEA9A627AA105C842D7AA36151419877C657E731 -sk = AE0F65E29F38804A6759F70F4D01E2AAFF7FE1C91EBC4F892DD0DE3AB2E68EA5E03FF73E02A217659F53D8C47556BF3D8C94040F630D63605E2D0F923579370C95E08D6CD768BFBCFEE1CB565A2CE80305951FFF0481D50C64B950DEBEC328FA03BC56160E337249E40085CA62463297285326C04CA1329498D9E8C64C285892431C0885426AC0072D19F6E0536FB458C4A7C8E78783DE18B2B023F86B8A9B654393F367CF7BA6CCB70853C6A811522E9DE23FD1AB771DE47AEDBA45FC5254BBFC6E8C3996CF07DF51B6859C8728252D0A0E8BEFCB50E70812B7151A45C5FACEF1192D587C104530C47123C7E3C2AC835CD84CD0B55F520C2A94A32892CCEF5F899C8CBA869D23215F278D0AC256BAF2712733EAC7C5AF7C3DA8A1763ECC1280A7BB8D7B753945A6C8C7C943AF6BCB59AA65330E2985587159836623FEB4F77D85455E6AD247877A37004C8A7771E1AF652A661309176F36B32375059C62828DF7734C1ED6C1CB6BE8537B583DB05137545F44B41DB305B32CE983CC06B7D6B0B7AE65B1434CE87CCFC4A6C1CECAFA4A01537BDC7232E42F5AEB256D2356F026826B0B196C409881DBDB2F5EC9708F23EEEA7D6D3F3626E960F9D155AE8071C2C9C5AF40EFF3F746DEA5B6AB572C74AFC35A025C303858428EFCE81190FBBF490C3F9A5119B6965D2E407782E8F56A04E6D5E59F3C04AC3DE8D9342E5F96D5BB5F83298FE9571355EB70F3774BF9BA98D0D76F8D702855F293AEAC144038D92BDA7E9555B9378E48DC890044615C51A03AA81CF22106D50A695CDB2F65A2FC57D131AE93296A6F743CE44DA901DF2441502066D28316B5620518D58460FD80E5768BDB56DED3DEA43783CD26B18BB774DEA9A627AA105C842D7AA36151419877C657E731 -ct = CCD305E6FE7BDFECBD7898E039D3BA8053FFEF46A7869D249E35500CCFD7B38EAC75B8CEE8AED18B252CB3B2D83AB3C652B73522C47B1119A7B7E0C791F44D847BB8E62DE54AF97B4C56CF0C16C4615858E5D931B0F0B09EA4A48AA81F235FD1B43782B0DB32D645315639951E8E530AD42B274075144FADB6F35F3848EE373198F09C87CD1BFC74DC9264D7F41A29D163A2BB73A1301C0533718EDA9CB5406AE3B6918F9A60E9429361EC7BB4F5D2A4AE3D4A2988BCAAFE2BB72C034E15C8FF341FD3A0938F2A8E65AB9EAB3B7343D94917141ECF3A142A9543BFDE23FCA78C999A01A3BDE43C3740469DB2C47EE85F53062B380C6D19D1B5825CD0D338E570C4157222C0F686E772A394AAE5E35E183B9AF0952712414F6D4328EABDBE04E69C96FB56A34A3778AA130205BCE4F23D3B9A212D1ECCC9BFEA7DA238BA5D8ECC85B2B99EDEA453E8A965F30D69F9AC206DBE00A894B563A1FB4E92977035F35B2E273D598C47B512CA34EB35E9EC1DFE78B9F5F11E68356C0E9C37658464CE599270F68178C1845486871D4E709E1A9672850BB522C3BE6A3C8C5996594663F8436F9252956A7E992C1EDA0EEE7A27AB1BEF236354E958F618B665FB7A4FAFBA1A8BA77CA337ADBCCB985D5E4E8BDF496F6C5F4B1220B2A6DBF2EB27FFF933B98BDA90EEE958A3C3D480B28A32B3AD501B2009F5E016FD31ED4031B34E0B7FE28D95E0A34D32B012AD00CD7E7DD2089F69B6E0E6FD784CA5F332662E9EAF7FFE890261B535035D072D29D38262C4680F6A6B393C2850FABAAE263CA4CB392BC0BADB7017684419952A1D08904D4E692E5522331F -ss = 9C96C97D3032D9A7283A9F4488D291CC7484F8F6DCA8B17419B04DDBFD9A12E1 - -count = 75 -seed = 8E2995F1B3E43853B18916BB1212ACEB05898E2B177A87ABEB928AD7184E59695C56B2CCCF5DB80853C28A525E327D13 -pk = 077E537B7271895348293B7C34EF117FD286DF34F0E07BC89FD344DB8D1E5D8CF0E7D41F1A7C22BE01B3A3AC8FD919C68E936E4F66F543F365E199C41BAA599D49CE23FA772975E225F2AC3969FDFB32BF4A2F26B388E9C51377EB778159112730151F4F3EDF3197713424588F1BB3B2782FFC9200279B11FBEB4D7204C4504C246DA183F1E15B9C7B89B39FCA508755865B8EABF1D363D279B0F38D8CAE0EDA7926F370BC66F67C31BFDB44DC9CF2B28F9DEC21520DE58B8811161BD33E14E41E13EECF0CB587158CC5661BC79B43EF41AF9CB3F6D3A006FACFFED78B2A8BC6CCACC4694B2D470480D698508016333BE798457F632BE1A79AA2ADBB165CC5CD3020A7AAE9FDC2157B6196836D48709E1F0AD5318BD31531450EC3FBDBC1D00286823EB7FD00B08935E2E6CBC1104803D154DFABF848418147F0429B7CF7A3F532917989106E96A7161E3444712AF249216B01D7C2BA97361FF9B3B3518C0D57B5D1A4023F88EF69640E63BABF6DE29536BFE39E4B28CD08CA1AE6C9DFD9D2080DB9A7AABAC74E103F6AEFB7447C36EE43C91F2A8042B96D33F7922543B88D5E8D78D5B9277986A52FFF1C51EF03B33CB7AF137645D78B05F9ABE26EC423472B168ADC67CBDF8777AC8F3EBC2ABAD44F40C03A00F01C8D1B961242D29B70B4C45A32F6D6463C4720F98C7A9C95C74E037E15A22FB769A8D3F45F93687BCAC6493171E15D0E919AADAC8906FF2E80C3212E02CB9041228E4C94F692E266191C16AC895DE4F7045CEDC85F29C41B24A845DB9D4B2A -sk = 6084A235F79DD093EF6D185B54E69DF33DACEE73A9BF2F379004421A10E3A79D9F684FB055ECE19459EB464E91E126A7A6E3ED11CCEE0046DA234D964C9851104A2A81136C9568A90022AD41A5917000077E537B7271895348293B7C34EF117FD286DF34F0E07BC89FD344DB8D1E5D8CF0E7D41F1A7C22BE01B3A3AC8FD919C68E936E4F66F543F365E199C41BAA599D49CE23FA772975E225F2AC3969FDFB32BF4A2F26B388E9C51377EB778159112730151F4F3EDF3197713424588F1BB3B2782FFC9200279B11FBEB4D7204C4504C246DA183F1E15B9C7B89B39FCA508755865B8EABF1D363D279B0F38D8CAE0EDA7926F370BC66F67C31BFDB44DC9CF2B28F9DEC21520DE58B8811161BD33E14E41E13EECF0CB587158CC5661BC79B43EF41AF9CB3F6D3A006FACFFED78B2A8BC6CCACC4694B2D470480D698508016333BE798457F632BE1A79AA2ADBB165CC5CD3020A7AAE9FDC2157B6196836D48709E1F0AD5318BD31531450EC3FBDBC1D00286823EB7FD00B08935E2E6CBC1104803D154DFABF848418147F0429B7CF7A3F532917989106E96A7161E3444712AF249216B01D7C2BA97361FF9B3B3518C0D57B5D1A4023F88EF69640E63BABF6DE29536BFE39E4B28CD08CA1AE6C9DFD9D2080DB9A7AABAC74E103F6AEFB7447C36EE43C91F2A8042B96D33F7922543B88D5E8D78D5B9277986A52FFF1C51EF03B33CB7AF137645D78B05F9ABE26EC423472B168ADC67CBDF8777AC8F3EBC2ABAD44F40C03A00F01C8D1B961242D29B70B4C45A32F6D6463C4720F98C7A9C95C74E037E15A22FB769A8D3F45F93687BCAC6493171E15D0E919AADAC8906FF2E80C3212E02CB9041228E4C94F692E266191C16AC895DE4F7045CEDC85F29C41B24A845DB9D4B2A -ct = 9AE113E28ED739AFA138C9EC05920BEC3DBA0D0C9C3318A045F31B662DF50D46BB45EF3710E5821D29A8CAAEFC723065812A406BCA5342B88CDBA262420AE080BE33686DDAF7588CED0F07CA1823347AA7C8FC2EE7F3923D7AE049460D24E5220784197A27A106E712E47053559CB14110D5A6D136A28ACD5435D6AD63A54A395CA56A0E298552858A75CE5507911160E90C6407BB06539D9936121A560DBD15095AFD10A0687B293E278624E47777670B853AD4981567137F8D1A47FD6D641346DEEC08DD2D6C8BDB8D6D8D7EB1051B79DB6176AD08C10BD19FF0317081709413424C08A36521B0709270030BF7A3F47ED7C102D9AA7FEF25B76CF94C8AFEF4D78600D571C9D1BE6B574DB4DBF6604C1187D64A50123B7C81033C42833CA390B6681F74613627309923B986BF962A1E9D47BFFF645FD35EB63E1C30CA7B6EC15E5FAEBE11BC880521C380B4139A2CF68C00A3A9090B91B467C1CB353FF181DABE590393B84424C1918F7F8835292CE0E582FE16C27CD968ADE59982EDA3D72112138310C0146640EFF9993CF114B04C8938F991A09BE91EE4CD6AD3F49107E31C79FAC5EDDDC54EE253DB3842E68905FE29F031DA3CB1F314F86B85E13FE83956C6F84A8FB794942C9C6128D2CA65200011826EBC6C438D960056D8ACB8BB6481033BCA457EB57AD125ED0353FE1BF128E13ADEFF51FFF97B6D76F6B8841A9FC5CCF951C49B2DB5E79385AD503A31E2ED8A3FD92984838DEFF9850BF704D0AD58CBCE1917E22560C31BF5EE1DF9F69FBE11A0542AC4BB048F3EAD1CB80BD3AF764C02A46765EBCC55750E57CDEA8F9D226AE77C -ss = 2193074EA86C6435F13AAF99E488F9CD34049D64EDE5A0DE7A84F5DB6474CF2D - -count = 76 -seed = 9218943C51FD2DE47E509AAC67EFF176795102F37D7A2017E3AFD768FCDA7877AF38739B00FCDF227C2FD62EB635942C -pk = 9EA31FE59742CC79C94403195F890147200EA340CA264B528229ADD2FD8832047CD50A0966AB788F51734716FFD4E86856B85058089678C6279C3750AECE7A675B0DDF41AEDC25EE035C1E7106A042C2491161CBB31509CDEB640F03C75D4AE90FD4FCB00D3C3C449AF8F3844CFA7471E5F316674A13E5A6A6347FED322C765B568AA6CD175945D20D3F01F3EAB54354B0F5BE9326D3E37EC1D87CC154042B6C0B8E7AA2F5B4AC49F34FE4CF922FC47152CCAED8EACD7FB4EB19656810B0844239D19DC19E920B98ABF6916623C0C31CCAF33B3F18CCCACD5F2CE498511F49F134D297041354EF7093FB720954005C93B27E8AEC1515FC73D463540AA50AD3CC36DF100E10455C1B202CE77CC698A75CD0B78AC9AA0F1E840302D37504610C63157D9036A278E6DEFF535647AC25EC03F864A539F9FB61B19B09FDADA995D5D3127093BDC3E9DDCAA61C75B9DAF354AF079CBB52EF1DA5AC3FA8F05EA90A0F8B979630CED6D365ECD9D60E54CCFC33B859BE5FB59587456DE9DD1E60F898A7958BFC7BC1FFF196539B5EB1958C3D8859B72147095E71DBAA03ECCAA8FAD885437A8A6F5FEA8BE22AF761DB7442DD8CD08B1B1768DA0F5DD99A6D061FED11F6EBC6F1AE7162F16C8D42885D333A0E2340808F877DA023D03A0BEECFAEB110D3921F43013508F8D180DA79E3234D4A7C1D3E3A33482FEB7A7FEDC9255569D14C99C378C5D5271025F0909EFDECD361421268ED53A9A49E7CBD3A4F3775EE66CAF5B1196B8F97AF3DAEC2F8F7F4F55E17776E31596D -sk = ACD1C0217FAD5CAA4235544DD9DE153AB1880CCF4C76F16F236FAE4E4BFDA04CF03A8ABB0A5010F400AE5722A75BDF5A2F6D5B546B34D73857CB1BFC7E587AA73EFECFB5A325BE44FE5C5D3C4062BC039EA31FE59742CC79C94403195F890147200EA340CA264B528229ADD2FD8832047CD50A0966AB788F51734716FFD4E86856B85058089678C6279C3750AECE7A675B0DDF41AEDC25EE035C1E7106A042C2491161CBB31509CDEB640F03C75D4AE90FD4FCB00D3C3C449AF8F3844CFA7471E5F316674A13E5A6A6347FED322C765B568AA6CD175945D20D3F01F3EAB54354B0F5BE9326D3E37EC1D87CC154042B6C0B8E7AA2F5B4AC49F34FE4CF922FC47152CCAED8EACD7FB4EB19656810B0844239D19DC19E920B98ABF6916623C0C31CCAF33B3F18CCCACD5F2CE498511F49F134D297041354EF7093FB720954005C93B27E8AEC1515FC73D463540AA50AD3CC36DF100E10455C1B202CE77CC698A75CD0B78AC9AA0F1E840302D37504610C63157D9036A278E6DEFF535647AC25EC03F864A539F9FB61B19B09FDADA995D5D3127093BDC3E9DDCAA61C75B9DAF354AF079CBB52EF1DA5AC3FA8F05EA90A0F8B979630CED6D365ECD9D60E54CCFC33B859BE5FB59587456DE9DD1E60F898A7958BFC7BC1FFF196539B5EB1958C3D8859B72147095E71DBAA03ECCAA8FAD885437A8A6F5FEA8BE22AF761DB7442DD8CD08B1B1768DA0F5DD99A6D061FED11F6EBC6F1AE7162F16C8D42885D333A0E2340808F877DA023D03A0BEECFAEB110D3921F43013508F8D180DA79E3234D4A7C1D3E3A33482FEB7A7FEDC9255569D14C99C378C5D5271025F0909EFDECD361421268ED53A9A49E7CBD3A4F3775EE66CAF5B1196B8F97AF3DAEC2F8F7F4F55E17776E31596D -ct = A61E87C17BBC3CAE7658A309DE71567B2F798EB97A54B93A0C2C652DE6F7982C9BA99656FF6736665C2094E15BF33A766D7147CC58C6C138AF15F2343AF6F27F81B5F7C44290F511E329E9F92E7C8387329F4AC67A2D0340FAF1DA64B9333C07F74BA82DC5BEB10C97D3BAEDA0F118032753299A35538D404958C209D3991E3968C2403442BA395B2C8F3BD5411DC68F644747D82753BD60E137FB3989E30B1A1D4F98709499E90A3E095E3802868584F6597058E0D21F1D285A491A43AF641654F405C4E76D4E823117A4FB8DA11A37F07072D07D4E9A9094936960A032EC690A01BFA25A18E8FD83342B4E0DE56F6C7C665EBB4F4CDD8C585637D8D127B2ACE477923E0213BE888730FBD6AD071132F358B36CC27DDC55E428C341A66A588FB632A66C1830CAC8BB3279DC1538A4871A7251C6959B3637F4E5D92FC068CF021E4DF203DD9FEA9C2D4F5F8D5CFE310D05E96167DEE1B5EA1B940B2631E58B8F68789B847C06A5788D7C8E722FCD1BB623DA86FB97120916F39CC1EC1BCED05E7E3F0FC090C4B91E38E199E504CBE83F4D470C638D3CF497E8D2DDCFF7F19A03D1A9E60686A9BB105BC86E41C481C4B5F11D9514010C44A278EADD352F0C6E6CC5269BFEB30ADF671B3A3D433B9D69E87BCAF504B43E2B6D072C9D00FE9C19D6D71C0E22E8643F002678FC2BFD67B3001F66EEC1AAD33F4F925E224280D5C400F13DFB2F5137F75E3078051453DD6EEDA78C59874984057DC3B66766D3AB48E4F3AD7FF6FFFDBAFE32E300C926256CDEC010415DC99BF54D653B3BA8CCF3B8C8EF07DDCB59B132FB741DAA5A7C06E43489E81B3C -ss = B22BAE3C5A03DB642A25672388E7735BF8E23AD6814CFA72F7B9E5F62614F7B4 - -count = 77 -seed = 542E20078ADD5296050AF150360F057F6B9AB3BA835589DD56987DE805F900B906505B5390A0D86CBA28038992DFC59A -pk = 49EBB990C7F8408519C13A9C6CEF765C21C156D224C818BF2895E94B55F8806E0339839AB1A8B7A9F8A9CCAD5EBB16650EC8164AFCA022E094E01765FF49DDE35468755EC176EE6D35C692E848975225F22131172E1AECF4F51CABBD3A5CC73B517A61DA7F3466E2F53849B81BB5D6EE2BA91BDABBE6E2B6FA731F40950237FDA8F0205232810813593722270BC1D9180C10E1526BCADF15B30244B216EA5E311DE6F2344FBC85F1CE38A24DE9977441534D2F79B3FA1317CF509C46458EFA7EED6FA51171BEFA4D6946FFA61F091AC3446DFCDB1D9E7C29884E4758F805CFB54FAE8706C9A28A1F76536E1AC9929DCF70A0A59BD2CDB34D0A82E71FB0005EDCE388FB0F8241A9B2200E8CE97C381EF0B9427727A91A5C26B13B95789DC4A002C19FC15B7E7210F5D7CEB4DADE023FE5DE7A70F63218AFB8ACD717AB3D6864C2B773F45C59171D44B48D8662C3981E629286CD2D9C232A0B738B76B616E1BB955DEC5115810BA52C190C21BB02A6FD3F43EEAA713294DB5E58FFCFE6F53601C2F2DB38EC1FD8651DD7ED702B70F6C9375E4C4A51D79E3C0DE28A5B6801AB8F7BCFF099E77672360FE7B1A036B36A7843A14B7F085004C9F83529F448C61AABE105C281F3E504A64BF40E3909B619997B080DBAF3621ADC5B9464BCFDFA850DAB77A3C676D2BB8537EAD3AF16ED2FED11B61846A622AB1A5FD14BBE9C1F5D862BCE653CCF007E552E418C3D9D3B18CBE1AE95E413E032ECED079AD01F98226067D6551DB612DCDF2017D1502D55EB888BD93F1514 -sk = 241191401A63AFA750F05662E354DDDBC683C776CE3222BEB83E3CF913D7ED7CA59B3BD23B49A95BC1FAD20070FEC930B6060BD827D742B077092E422268E15D85112C0C2683DE1DFA7719ED7F49880249EBB990C7F8408519C13A9C6CEF765C21C156D224C818BF2895E94B55F8806E0339839AB1A8B7A9F8A9CCAD5EBB16650EC8164AFCA022E094E01765FF49DDE35468755EC176EE6D35C692E848975225F22131172E1AECF4F51CABBD3A5CC73B517A61DA7F3466E2F53849B81BB5D6EE2BA91BDABBE6E2B6FA731F40950237FDA8F0205232810813593722270BC1D9180C10E1526BCADF15B30244B216EA5E311DE6F2344FBC85F1CE38A24DE9977441534D2F79B3FA1317CF509C46458EFA7EED6FA51171BEFA4D6946FFA61F091AC3446DFCDB1D9E7C29884E4758F805CFB54FAE8706C9A28A1F76536E1AC9929DCF70A0A59BD2CDB34D0A82E71FB0005EDCE388FB0F8241A9B2200E8CE97C381EF0B9427727A91A5C26B13B95789DC4A002C19FC15B7E7210F5D7CEB4DADE023FE5DE7A70F63218AFB8ACD717AB3D6864C2B773F45C59171D44B48D8662C3981E629286CD2D9C232A0B738B76B616E1BB955DEC5115810BA52C190C21BB02A6FD3F43EEAA713294DB5E58FFCFE6F53601C2F2DB38EC1FD8651DD7ED702B70F6C9375E4C4A51D79E3C0DE28A5B6801AB8F7BCFF099E77672360FE7B1A036B36A7843A14B7F085004C9F83529F448C61AABE105C281F3E504A64BF40E3909B619997B080DBAF3621ADC5B9464BCFDFA850DAB77A3C676D2BB8537EAD3AF16ED2FED11B61846A622AB1A5FD14BBE9C1F5D862BCE653CCF007E552E418C3D9D3B18CBE1AE95E413E032ECED079AD01F98226067D6551DB612DCDF2017D1502D55EB888BD93F1514 -ct = 9F4F2652D29424A545B1423EC43166248F49588258F6CF2307D0335D26CF172CF2FE4AA2DC42DDE14E98245D3482C4427E26EB4361C5D2404D2386EF63593FBDC935AC2D4FAA05E23EB8AC0CDA617289F7E3B34AFF9934A3526EB03CA33DF92D02E1C22EFB3C93813EA2F4E9C37935BB2BE85F173EC9AF42CC2198DD94C9B793BFDC30FD13E45E527F66B708E043A08B0E5FFD6F51EC1BC5E151FC4364578FD77E950552C4A9EB93E7BEF5617D9B1AA4A0134BDD353DB14CC3D7032AE512B1EE75FAF0C04C5911F4218B69DF28A8F0051A6041B3A4D9C54B1E3C4052EF71E21F18A3329CBC021D7881D1A284BB8F085B0E2814649D8CA66C1BEE7EECD7A5D3F468D6F64EFB02DBABFB4220B9C8892512FC4772ED64E5732F4C43E481D138C548DDC74900916C2C00DC629ED0E3E096918CC933A4AED2A50793BF189B7F73D3EFC4B206544A10CECC4BA79051475C6285E7A8F6BD1D06756B7F5BA22376E81D3366634DB67D60BE3912024167F257448585D50A16D20CF5368E6CD197022091CD96ABCBA9CF4638D19D9C798C67B33AB0027AEEC25FA303D8B0A8D7AD9563A4A5A6BF7A37DE7307DC23B8777C4899F8713CC2D664761938EAAF6B305B6CD73BEA41502D8FC89017E7F5606DE25549BFC18553F8EDA9690B4AE282B028E4378BACEC6457A99ACA4808D799344A8D339B7A5AEF36227DCF5FF5B3BB95F1E83251AE1B369BDAF153B09FCC607EB98EF4AC4B500FB1A9949797AB80B6B7AEFECA72110A7BFF1F7E43AC7F0DAC9C1A39F40721655B4C699C723B0A21D555BBC92E7D71E51F1638F06C2CDA1206152E42635A7F35A3AEAC -ss = F5ACBF38290E446BE322E745C3E123CE1EF475BD16D450B49F56251633AAD8BC - -count = 78 -seed = 6A85A61DD08C0733FCBC158ABB49FE0B0D96A50DCCA140A2E9F5A254F1901985844613B1C656C0CB0112620591B88AD0 -pk = 04884DEE02F72E43053F7C3F6C7B7561585E66B156C6B5C71719744A750F42628817127798731190A1B877AD85DADD8D3B253C56197885E300D567BD25FA0DCAD6442C2F568E7117A34270648EEBD13A300F9FFA190C79B9282D8DB1EC2B44FA6935DF723A81FE2BCC449C1B30DFC56A49AF13E578B04C6BF8DEABE983C9AB0FFE3CF6A4E06A2C34946431B9B9A2B74AC76017203021F66295177EB5187543981DBB43413A2F25EC2CA8C583004EA2C4F6D5D2CADF8E444797BF0728B450AE24D6E438372756D2F4D6649D099A4A98451B8DA07AC5A86D556AEF8FA3DB557685CD1942637BEE2CCD9E62071004EB8AD4884CA05EA2BE7BD397432D111EEE1D9EF5CCD50DE7A1762764BEE066399BF381F2E24054483A76BBF76ABC06DD0CD3CA052A1C794E1D1DFD40540F34F65286D47DEA0BAD2A688AF3A11262ACA7F51EA413E29BF951EDD7CDEB39BB0A1D831CE87FA2945302E48429B58C7567DBB2D1F4CA0594A64E95E8C8EE35A98DD332C2E25323D5D3F3DCD118EAA178D5FB6DB76C8A24D027FED4B433D9EEAEFA4EA71852C3A023A33BA6C81D03FF89F36A98C8523DAF0163F0B6961378874CA5C98BC4F21286E7F45F9F08024CFE200539F35A83A5966D0FED1485D24A1A2F9FEC7A721507CFA8337B31AB08FD71A2ECA6DD88DB1576751EA028CFD743BEC5D2912B7134B48291EACD7A5E4F5D0660279865A03F636A4E572C85CD24FA78A484802D20C284E41283B8D0F5FB129DC61A30D177491D12724C0ECB1EC57323CF45F53F89FF290FDD53 -sk = B9A6B0C05677E957D41A34BA03BD06F2A9092E31F63389397D7E70FDE6409D18E99C0E7B82BE89BC3C1EAEE6680AA4EFD394E40C2B3F30523C8117F7C26A8969B6E72DE77006189ADF35F4EBE05AB70304884DEE02F72E43053F7C3F6C7B7561585E66B156C6B5C71719744A750F42628817127798731190A1B877AD85DADD8D3B253C56197885E300D567BD25FA0DCAD6442C2F568E7117A34270648EEBD13A300F9FFA190C79B9282D8DB1EC2B44FA6935DF723A81FE2BCC449C1B30DFC56A49AF13E578B04C6BF8DEABE983C9AB0FFE3CF6A4E06A2C34946431B9B9A2B74AC76017203021F66295177EB5187543981DBB43413A2F25EC2CA8C583004EA2C4F6D5D2CADF8E444797BF0728B450AE24D6E438372756D2F4D6649D099A4A98451B8DA07AC5A86D556AEF8FA3DB557685CD1942637BEE2CCD9E62071004EB8AD4884CA05EA2BE7BD397432D111EEE1D9EF5CCD50DE7A1762764BEE066399BF381F2E24054483A76BBF76ABC06DD0CD3CA052A1C794E1D1DFD40540F34F65286D47DEA0BAD2A688AF3A11262ACA7F51EA413E29BF951EDD7CDEB39BB0A1D831CE87FA2945302E48429B58C7567DBB2D1F4CA0594A64E95E8C8EE35A98DD332C2E25323D5D3F3DCD118EAA178D5FB6DB76C8A24D027FED4B433D9EEAEFA4EA71852C3A023A33BA6C81D03FF89F36A98C8523DAF0163F0B6961378874CA5C98BC4F21286E7F45F9F08024CFE200539F35A83A5966D0FED1485D24A1A2F9FEC7A721507CFA8337B31AB08FD71A2ECA6DD88DB1576751EA028CFD743BEC5D2912B7134B48291EACD7A5E4F5D0660279865A03F636A4E572C85CD24FA78A484802D20C284E41283B8D0F5FB129DC61A30D177491D12724C0ECB1EC57323CF45F53F89FF290FDD53 -ct = D91D06FBA88E8F863F2618E29674A68D41555CE672B9197B0AACB0E99B9B93A98383FCEB096BED4C9ABD6BD1FDDC7D7466BD9530DA52912B58BA4E8250619C3FEBF3B0DADBBF04DE892D28330C93C0FEBC4C3CD9CDD2F8BED09379DB80497D279293B4E62E0EDF9DA3FE0CE60A13AD7337FCAA3D788DF1DD80D97B5CCE3DF088FB9799BFCEFD6A526F22A85A3E8DAD55C523CAF3B83E078BF8E959A22F3CF2FEDF18676ACDAA439FBA1095CEA1B882E5F4D89BB169CA24E2B67B372B3924C6911DB502EDDB32B526BE93190C47148B52B58CC32405DAF7C684D7AD9DCDD526638981044D34C8138848B4C251A4D30B04FFE9043C0D605421991793C6F2FB8B31E5CD6134126F205F11CB1EB6FEDFB86C9552791B1DD7AE21C0006E01A0C63565BDFDDA31E76A96AA223FEB1747DBEC5CC733774E248805809FDF0A06CD234CB3C1C70B1EFBC3F0CE26DD4A02CEFF0CA4DD83A52C55A8DCF2F2DAAEA335F191589732E097869AA15D2ED85ECCC641FA419413BEF635D82822AE02E67892BF672223C8CA79B1673F2B9C378E5F99A787A1F2705DD9ECFEE852D05952E16D1F588154B9802910038A7E2A4F9F72708897E2C519B1834D0532823C3FC26B619B3E4C53B8E8F170FBCC0D91283D6680749339CAA56651C56117081A9A0A3EFA4C7A50062B771AE908C7A316E3AEA2FCE9666C39E42EBC8AD67619CAFA0EEFBE29FBA5BB229D4782A0FB55DE6B8E632361AE1BF1B2B446ADF8D7AC0923F949DB4FDDF9486FAD4BF2943E95880C1D259083BE1797DD365E99E4BF89BA2340AF75E992FD65E97A33B24A7A773C1A6F64DF36CD41B7A6302F -ss = E91077A726D3A16BAF511702ECB961A3E5D2102DD9A1C2C21AE8E6C90F2F587C - -count = 79 -seed = 7F4A56EDA151E7B097CFB8EF980440FFF707AFFBA91867C89522CED6C5FF3BD7F5F00BB49DDD615D9361A7E4EFA42851 -pk = 8942F8F7EE31CFB8B10912D2A0BFB2DCB590433AF2CDDD85B10240EC226C23D2A88159687DC7F6B714A79BD439E508E54D044F8728D48CF8F54FB86D1755ECADD4EF4952521670ECE451A4313D13150C1497078BD04EA25F1357D3937D6812EFB62E51F800B09574BA7D8CFA39B72D9AD596D85A04398EA0BD7E2885B06BF5FBF064D9F79443D2D31EAD55E7F6980DA267FC11D1638F63F107A2A6919BAEF35A0C8728924E4344BE6886D6D6EB95E5CA2C105E9CCFD973710EC7054EFC021FEEEFD4F925B7625062471F577ADCB0792ADA632DA45DD33A29032FF1288A66757BC89E7B4C2BB97995D2492EAE03C175A4FADE23904B8A167A0AC5D42BEC2FCD46C61E24B1E06E49FE3407E1626869A48FEA8D38FF16D81DEA901C6749F983687E6327E21F02508D9BDC975CBC85126D7F785278552C8055D49835B3A6BDE4ED9DF73F2A4EE154040607B7D8BBBCBF606D3952EAA8500F77F43894652A6633C70C672AC1B25B7A64939364993FC8D7204884557A77032F675FED86D1B182555C5998B59C91E382F75E00E2152FCEC1CDEFCE421A5979A2C57E827A55536E9C5FE97843484F29A4DDA461CF94E9A8E5CD14D00D3815AE71844B340ECDD58B4AF8E010F1427C2BAE07B61BDC54D28DCD07EB01E94C14405B0DFB052AA5E22412CC1437179AB8BE1C33537385D0584DF3301BC233F7E5FADA9E88DDC7E8AA2334EFD42A46BCB7F6AA0564C538B823D1001ABB2AF715A4D174653D0A49B0DDF822A21747638F6178F42A40284B222C9320B558EE240F12 -sk = 28A96C71577BA00C94F99FE965BC595A26DB2B3CA6AB5CF8E443CDD8462B17929C35D165453E5FCDC6F9DF64526D9DE698F2BD3E6BAC6C7FDD86601B9BA5F4A503F3E68011F266F54BBD60DB0F99BD028942F8F7EE31CFB8B10912D2A0BFB2DCB590433AF2CDDD85B10240EC226C23D2A88159687DC7F6B714A79BD439E508E54D044F8728D48CF8F54FB86D1755ECADD4EF4952521670ECE451A4313D13150C1497078BD04EA25F1357D3937D6812EFB62E51F800B09574BA7D8CFA39B72D9AD596D85A04398EA0BD7E2885B06BF5FBF064D9F79443D2D31EAD55E7F6980DA267FC11D1638F63F107A2A6919BAEF35A0C8728924E4344BE6886D6D6EB95E5CA2C105E9CCFD973710EC7054EFC021FEEEFD4F925B7625062471F577ADCB0792ADA632DA45DD33A29032FF1288A66757BC89E7B4C2BB97995D2492EAE03C175A4FADE23904B8A167A0AC5D42BEC2FCD46C61E24B1E06E49FE3407E1626869A48FEA8D38FF16D81DEA901C6749F983687E6327E21F02508D9BDC975CBC85126D7F785278552C8055D49835B3A6BDE4ED9DF73F2A4EE154040607B7D8BBBCBF606D3952EAA8500F77F43894652A6633C70C672AC1B25B7A64939364993FC8D7204884557A77032F675FED86D1B182555C5998B59C91E382F75E00E2152FCEC1CDEFCE421A5979A2C57E827A55536E9C5FE97843484F29A4DDA461CF94E9A8E5CD14D00D3815AE71844B340ECDD58B4AF8E010F1427C2BAE07B61BDC54D28DCD07EB01E94C14405B0DFB052AA5E22412CC1437179AB8BE1C33537385D0584DF3301BC233F7E5FADA9E88DDC7E8AA2334EFD42A46BCB7F6AA0564C538B823D1001ABB2AF715A4D174653D0A49B0DDF822A21747638F6178F42A40284B222C9320B558EE240F12 -ct = F00C8F436880B2BBDB85BA3B6F8A4942C94D76C6E8B04E784B182E3190364D0103A39C398A3561CC8E05BAF140FC13A317FE8C0D4FA6C3F1574609347F81B36811243D8AC82A3004AE207A7107D5B356AC894BAE4743332E3DB4751F7546C13152A21BE64B689E9185F0D720BBC35D451308DED5F12E042F04358EC091A2B7CC28ACC83C08946DA410FCDAADBE8545081A67B96B91AD76C9C67AD76446BE6EA7F4C701027CF724809B3008DCD2B0C383DF5B712BB46EE43F2C0463394B460AA7FBAA8B8FAAF182ED541C7740F3AEF3C8C8ECDA6D8749BEB5B93E9F32354E19E15D92A30BB39CFF49055774173638452F56D31D8C31C13562361B83E3C80BEE3AD88619E9672F7D245A652064B02DF009E7DDBCCEA5CF7390F55172C5DEF4A98E5788C9EF704F127F28C3BEF69034B50B94983633B04AD9813820ECB07966D0EBEEB871BD767328DE89C15F76D6E3A2673F5386216974A2CCEA967DCE016BAA1AAAE7E0F23AB532AEABBA4AA8283A698C3E8B1200FC7B703281A401BB70928D11B5A5F27998AF6EA5B2D4ABB330AE5C0A960A58C7E60CA1B50D1D6A53E1A9CE3C33A876BA13B465F86024423D244097ADA457D48E892E0E2638E940287E94E1CDA651B964543559D2807F16E45462BF02E948DE81075B83B4756788107A2BFDCE9A3159C4CD785F59498B75FCC76108D5643A9F3A550F5E93A7A0B48DE33E441CE063668999BCBBFC77B9777643EE027CBFBC3FADB5C07F6BE2FDCE2FEB497308B65F026903A2975F15342B335F0D3DCE4B80744A9C8D8283D18A0555F5AD48B80CD4AA77C06572CCDBDFF1D9049D2D17E23F843E -ss = EF215F75EC5E2F67DE8ABF225E3513EAFFEBE589280EFC35AE0B822DA239F24F - -count = 80 -seed = 09FC004519BCF85B20D25D314A0DFC79E00CB6262A7DDDF9C52473641AFB8CFA0F5DD5F53558184CAAE9EC34B459E98E -pk = 6E48F12D7515976EB80F7260616553575A19698F1FE9507BD3B2528DD096EE0C51DE2743E5D24BB0DB6A313BD699C3B3299D02AFD9A563D808E100CE9036B70AD5768409A0858FD1834699F557129E647989EC0160BD870B128B5EED5B3CBBFB4387BA4798BAA71E585E765189CAC7C828C05F5212D890050A220F5A55868B53E3EE1707664CBE5C0E03BE22F6231AD63EB531A2AA9C7259670E2FDB99BB732272147B563864B9D9CD7E828BC688F3F1DAA57271A8427A7A91D38E65D32BC9C329D8A18101B2604B2DCBC5FC1E458C1B3AEA7CE5EF31A82B27B5A28A77A76FF797C4B437D762E7DEE768002E2D9686E2A44C799CF1432EE92F322FECC6860EFCA22A857A1A6A5A20CC1B25D4BAAF840EB6A37FDB12E228E91842C337AAA35872EA9BFF453E64C39194660AA52D0E27EF47C52C1CB518D449EFAD220394FB4CC4D2E19082A33C8B20804AA32EE1792307823B49CCA024FA751B42A01CE375E27DC6325DF25A22F9CE55EDFC6DC74BF169456A16EF5374A32F70EE07C1C18A61AFEC87501101F89FE2902488A2D5B272B22CD10F0C12FAE418E846252CAD3307B8363D2EC404B19C1456BD75AD33195AE357F9EE009D49F58ABB20F00E0C020567698FD5B61152A70C91ADA239BBDBEEC16FD70CD9F82B6AB0C68DA58EB268457CC05139EAB1FB00112980A286933A948E6B8018874F53369695E05EAD8986AB0298899283F6C71A8C4656A1AE131022F2A2F36EDE212D9A8020C4B5CF0B7EF02D7B188373DCE8D8131072F5BF33CCAC31AF34F13B -sk = C08BA2EF8C3A0A043AFAD931652D7A19E6E8CB670F840DE5F1FA03309B2CA9EC5FE6141A25F7AB9F875F79E0A82D6EA5CDE5A017AB637D5FDB7C42646A1D71DF174E708D6185784938F57441688A68016E48F12D7515976EB80F7260616553575A19698F1FE9507BD3B2528DD096EE0C51DE2743E5D24BB0DB6A313BD699C3B3299D02AFD9A563D808E100CE9036B70AD5768409A0858FD1834699F557129E647989EC0160BD870B128B5EED5B3CBBFB4387BA4798BAA71E585E765189CAC7C828C05F5212D890050A220F5A55868B53E3EE1707664CBE5C0E03BE22F6231AD63EB531A2AA9C7259670E2FDB99BB732272147B563864B9D9CD7E828BC688F3F1DAA57271A8427A7A91D38E65D32BC9C329D8A18101B2604B2DCBC5FC1E458C1B3AEA7CE5EF31A82B27B5A28A77A76FF797C4B437D762E7DEE768002E2D9686E2A44C799CF1432EE92F322FECC6860EFCA22A857A1A6A5A20CC1B25D4BAAF840EB6A37FDB12E228E91842C337AAA35872EA9BFF453E64C39194660AA52D0E27EF47C52C1CB518D449EFAD220394FB4CC4D2E19082A33C8B20804AA32EE1792307823B49CCA024FA751B42A01CE375E27DC6325DF25A22F9CE55EDFC6DC74BF169456A16EF5374A32F70EE07C1C18A61AFEC87501101F89FE2902488A2D5B272B22CD10F0C12FAE418E846252CAD3307B8363D2EC404B19C1456BD75AD33195AE357F9EE009D49F58ABB20F00E0C020567698FD5B61152A70C91ADA239BBDBEEC16FD70CD9F82B6AB0C68DA58EB268457CC05139EAB1FB00112980A286933A948E6B8018874F53369695E05EAD8986AB0298899283F6C71A8C4656A1AE131022F2A2F36EDE212D9A8020C4B5CF0B7EF02D7B188373DCE8D8131072F5BF33CCAC31AF34F13B -ct = B83A427119FBEF4EBA27B531807C1EA04A4373504AC6CB9967630BEF6C2D81716364380CB6191FAE6D7B165981AF82D50595C8FD1F7754A35EE027D4EFBBC539FE69377B40B9BE0CEA8912D675AAF90CCD686AADCE2566810387C3D79F40A1FBCBCE1EEA634C622D8C274A9227AA9FEED6A797AD183A7E85B96E407FBD06568A9F75DE8B22C03D10C3FFF093B320CF499A8130051903DCF6F154A6BE80840B4E20014CF4D4BC177DBF426E7AA078326ACABCE7BEFAC054C611401D66839416FEFE1581378A8716F3680B87CC0639048EEE79183F589978C9DF2360850CCB88816378B8C6B5924DC280C6D4D98137E35E5F8052EA512EC9691B085E0A77FAEAF531A7BAC49689F707EAD5E99AEFFA36F7139D55C46119DA395237A783365F34442C7901D0AF903E794FFAF0E1C504A2B093658B3AC404DED029273379162A648C64A48BDF5A438AEB2BA183D9E4691744D21DFE1E58628D8C52030FB327F7D674DD7FD2D027E723A6456224A1213AC09C6D4DB12365F0DC272BA870D905151021848D416F85FCFAE55742FAB57D09E70FC24000605D9DE62BC229B32F8EE9F869D31838DF9CBB9000296E562A4A11EC1A12CEE4CF14135CD913E87E221ADB16FB2A3DDF39FF20513219DE93A2EC4F9B28D3A953142726FD8E17A717E0B89D3D595920182FDD2C03AD7401E1766D0FCCC72D95B490C116693BFFDC0CD352BE3D47259ADCAE911736880FA90AEFB1E9BD257FE61E466C22A9FE227BC470A0679EA72B5AA02101BAB1B3D9795AAE4875811B72CE9A55C34D69381E2202153DE0EE0B5250CAEDDE90FFCBCEB209BAD4397D1CE33DD440 -ss = 4A14C1B95864A51D1211B0110C208BC620194747173C7AB5FA6FA9506A2B9540 - -count = 81 -seed = E3C41CCA6F04CFE7732FD54DE30CC5CAAC93E2F80E76AED7D24A962A3969C1B6A311459A3EC3E510E3E9B1E4291D4D7D -pk = 041704A36E4E207346FFB4A89B6E7B1FBD03AE2C3DC645B8C1F73CFC10F502AE18882E23954AF62F1F35142FCCA1D696475C88A5C31862ACA4456A64222E342411BB0444C2FC6FF92E4293DFB56CDADDB4195CD1C62911EB359C0534EA45951AE874CB7B31559F7695E373F7A9087896FB08661A7F39C152AF9EC00B8F301AF813907DFDF4F432668CD8E783F23120B791BD0559381BC9D9BDB0C1A71E6C9E6CF59FF7DF4ADA4DC30C3F20CBB2E3C2D6EAD6C8E91E845ED3AC953D130A5B1160413B27169EA6874A7F62F5D9CF365D628C959F8DCD42573E2A12661E14CC0FBB000A808520C2B89501D164E9583ED7524C5089849C541EAB673FA9748EF18A97F982C3921141E58E6977DCDB4F6DB5915EA40C911C33071C5352CE6D38320845477631199B2A8A2F675FAF2E107F1C7A6439C176393A02ACF530DF92708B2AB53A600D65117844DFD5D41486FA08C6F3FB644278186691CFDD4E0DB49A29B332E5230E9825CB09747E6F31DE5016CAC74CBAAC0121E52F35B0854A9C4C307DBD9449ACCF724E3DCC87B47F2D0BCEDFFB1325C4AB8BC90CB296E7346292B12A629043F9D59B87D90856A07B3817B1EAF928BB6D92B660FE5BDE103941F706FC31C6CA2A609886F4988D4161F3D6BB3BAF686CE44FF8117BA74A2279F251405FF9104591A9A2C0C9683A8B7665EA69A8C389413CF8686F7140C64C413C2AB761E19B3090AECDF14AFA78A461FB2E3D4E7E2A1AB49DBD043C63C0C3A0896AF485329B221251272A59DCD1B5E6921B7BF57629EF125F -sk = 0E3B30E102D707538C2671060F603BB0B8A014103F132D63B09ECE07E4A4C75B11EAFECA9E810796C34E8CFCE9D59342884456007B01DDD12EDCE6D10ED87E4CE709B0A4180D920F87F7286402996002041704A36E4E207346FFB4A89B6E7B1FBD03AE2C3DC645B8C1F73CFC10F502AE18882E23954AF62F1F35142FCCA1D696475C88A5C31862ACA4456A64222E342411BB0444C2FC6FF92E4293DFB56CDADDB4195CD1C62911EB359C0534EA45951AE874CB7B31559F7695E373F7A9087896FB08661A7F39C152AF9EC00B8F301AF813907DFDF4F432668CD8E783F23120B791BD0559381BC9D9BDB0C1A71E6C9E6CF59FF7DF4ADA4DC30C3F20CBB2E3C2D6EAD6C8E91E845ED3AC953D130A5B1160413B27169EA6874A7F62F5D9CF365D628C959F8DCD42573E2A12661E14CC0FBB000A808520C2B89501D164E9583ED7524C5089849C541EAB673FA9748EF18A97F982C3921141E58E6977DCDB4F6DB5915EA40C911C33071C5352CE6D38320845477631199B2A8A2F675FAF2E107F1C7A6439C176393A02ACF530DF92708B2AB53A600D65117844DFD5D41486FA08C6F3FB644278186691CFDD4E0DB49A29B332E5230E9825CB09747E6F31DE5016CAC74CBAAC0121E52F35B0854A9C4C307DBD9449ACCF724E3DCC87B47F2D0BCEDFFB1325C4AB8BC90CB296E7346292B12A629043F9D59B87D90856A07B3817B1EAF928BB6D92B660FE5BDE103941F706FC31C6CA2A609886F4988D4161F3D6BB3BAF686CE44FF8117BA74A2279F251405FF9104591A9A2C0C9683A8B7665EA69A8C389413CF8686F7140C64C413C2AB761E19B3090AECDF14AFA78A461FB2E3D4E7E2A1AB49DBD043C63C0C3A0896AF485329B221251272A59DCD1B5E6921B7BF57629EF125F -ct = 4B698A0CDCC0764DDCE2F61B2AF10D843C232D8CC68711722014DB98858400607BA1EF424447CBEDB6AAFB1ED39A1D0D1EBF1C8E6E5EE86564530F78B65B7873C404EAC48811BDEAC7A8CF9762782C1DB5BBE7FA8A99C235EF979EC6BC3A081BB05536277590A822DE6E9C43366ACB7EE3A15FB7ED30A6F3154D4A1165084D91E4253053E46410E9658D1E918D8634904D978B3DA11BED64964EB644F3F0F580EF07F6ACB443CC739DB60245B05DB0B631EE8E43416DC4FDC89A2C51561A4171AECFA47E269B2296F80289A63E06D88E927977227ED5FFA7AEAF6068B6F813A470CA59F08DBDF9C0EA99EA1B0F11EB10C8E3ED8454FDC2393C678E85D4AE0779EC1ED3DA653AB6169CB331ABC1B7F25676D83C0B2C865E45BF3202FF01F211B02E35180193585598A1554F34983B2E171598548972D4ACBCD1B9A48BBCBBA3424DC333384665B6B2EBA8D89218033685264DFCDF3F61AB167189BC855A880E615CBD79E6EE11D3EE7291FCB44F68E5A6AB0DE9E37B8CBD10E7CD59CDFD9A0A9E2AD4572125B6E30D8AAAE127E3F835078C75550C5315582F2EB13D5C0A631AE1D62889EAC3036EC30902AC626CE65A079870D5276B65F17C304A0B148F14A59DA3D8C9F8DE692199163BC943ACE3F046B01DD5766A146C20291DCAFD4155956A481B378A287C6CAFCED72EADED585AD7D0F5FEC0BA4EDF95A6D8FF0F0411218D2BE82FBE4613210D6EC93BBB6F00008787F605EC2A9DF03E6B124F2EB4B980514CCE0DF8F8B95CA1C09F7202D0622B31DE35C06CEBF64B0313A501103E409761707C0834EB51803F006E4ADC254C20B3643DF2D0 -ss = 8C46A9F4111F3A275FAFCE4FCF0BBCF828A0A9006D0A9C632F1B5B8E669D23C4 - -count = 82 -seed = 373FDDE922CFC416ED96B444E445BDD0962E8989F6C50ADF9912A89937C57217D3600B06C95440448E3F601AE69CA5BE -pk = E357B186939C36F8210DC79500913C46A9E810E369EF04C311B4CF5B5CF4F77FA4993177B5F0539A452FA61556D3965D71D5EF74E23DFD47A290FCC09439D1479E9E1A17DB29C1DD4DA63447E0C39CEE3BBB59E5FB40488376590790986BD80C80B8DD7265A5987828DF6CFB6EBECB92D653A0D0743B54B61E41490A443243F844E78D8675300110F7AB3C48940D89D8709C589DD1BD226765E9A12DC41760BFA56739087A37D39BF9F44C6F4CD993473F6DCDEF57892670E337340CFC9FD2B9C32F9A0877E7AEE38780D96C6F707FBD60B20144D0435450302FB39B7C630E9101681874E5B2B8E59B62B8EE3B2C85BC4A31F327C54D027586084756EF92722B21AEBA7ED22B861E1B40FD65FC0F36C844976A84DA5A30EBCF0558BF79843C7A6DB5EF6F710512E639ED27D7CBE7A7E814A17D025C58FD8DE232A8343BE5884248CEE5EFD7AEFBC067D39F997692976DC86AB17092D0AECB6ABCCDDA1BD2E57599AC17772E129863F35D8EDBB37E091351DA3F88584E7E3B2CCC0142FB1736667E1CAE68A703BD6829F441A81E3D97804ADBA77C6F6B9C1262B079FCB1637852AF897F8D2F52EEF0DF9FB26DA750FA610DD769016C5E3EAB042BC8B44EB64E69B187E07DEC64603A030ED13863EE4328457E05475C06E0CE974A1063F5C0E0E38941057F9D40ABA613417FA3EAC57F2613C21BEB47C6486A542F56196501AED4679420F8E1F4D110715A3BED5784528FBA6274E4B7CA43A9F751DA11F53C3962B6E96E4AD9768B623AC6036C38F884845A24B00F -sk = 2478F7D3DE6041E7E5CD11C5E2EF483D1AA6218EB126444091535F6AE532FA7311136E2681DF2EF881B51A092A9BADBE72C9772C169808521C47149578621E28952F0AEFE4CEA4E32A3BC47C86D24C01E357B186939C36F8210DC79500913C46A9E810E369EF04C311B4CF5B5CF4F77FA4993177B5F0539A452FA61556D3965D71D5EF74E23DFD47A290FCC09439D1479E9E1A17DB29C1DD4DA63447E0C39CEE3BBB59E5FB40488376590790986BD80C80B8DD7265A5987828DF6CFB6EBECB92D653A0D0743B54B61E41490A443243F844E78D8675300110F7AB3C48940D89D8709C589DD1BD226765E9A12DC41760BFA56739087A37D39BF9F44C6F4CD993473F6DCDEF57892670E337340CFC9FD2B9C32F9A0877E7AEE38780D96C6F707FBD60B20144D0435450302FB39B7C630E9101681874E5B2B8E59B62B8EE3B2C85BC4A31F327C54D027586084756EF92722B21AEBA7ED22B861E1B40FD65FC0F36C844976A84DA5A30EBCF0558BF79843C7A6DB5EF6F710512E639ED27D7CBE7A7E814A17D025C58FD8DE232A8343BE5884248CEE5EFD7AEFBC067D39F997692976DC86AB17092D0AECB6ABCCDDA1BD2E57599AC17772E129863F35D8EDBB37E091351DA3F88584E7E3B2CCC0142FB1736667E1CAE68A703BD6829F441A81E3D97804ADBA77C6F6B9C1262B079FCB1637852AF897F8D2F52EEF0DF9FB26DA750FA610DD769016C5E3EAB042BC8B44EB64E69B187E07DEC64603A030ED13863EE4328457E05475C06E0CE974A1063F5C0E0E38941057F9D40ABA613417FA3EAC57F2613C21BEB47C6486A542F56196501AED4679420F8E1F4D110715A3BED5784528FBA6274E4B7CA43A9F751DA11F53C3962B6E96E4AD9768B623AC6036C38F884845A24B00F -ct = E98C9651DEA501244945955E4E25C57AD278EF4A61B49DD7E60F084A8A573D6AB5D0002B46FB44F1E249546C04833710F883D87FB6AE1AFBEDD4DF071833997456D68B8404928694FC4C107A70D5234DF92A289E204579EC393F7E223952EE4C09D9A6E6D3A14B813629187CFCC36E9ED1CCF6A96FE08E6D33AEFC745495F6EBA92D33389BA69CFBABE57B42C45B6F24868C84D57BF549A4D3D9BD9B30BC3CE93D7975381054B299EAC6538A7487FD98B0D8815BBE91181CAE12502690050FB4E5DBA5664D229D6278DBA8FDDAE823604262B4BF3BD79BD3B3E959AE62F380F1F931A2CE3A6B335533EE030AB65940A4DDC515D6D76BB5EB57E3E46660256BC2ED07CEAFB854779BD3C7ACBA03BED8925A153B58E064CB227B45DEF5BF520C26F6ACAA0D3C1666025F257B4A54AA769C4688F9AC4E50D741C9CA88BA8E039ED1E1038DC8A93973ED2E5E6CFE6F2F4D2058E84120F535AF233FF0200597574B924ADD9E68CAD09D12B8764D4FC09253B952E0A4F87529523757C73A101D5CB1BA1E69E7B9EC244555097A8700B74E8232941AB254A697F5BC3E8676E878218C4BD3AF2A6DEAD4C962377AFF00291CD1C8DCB48C969FB8EBFAB6799539324EE4979FCC36453479826FB598823EE109CAC375BFAD10B00AAFD967D4A9DB29131BD651F3C3B3D5CF6509838682DE8AC6032125CCBA8A5102B95C8AD8922E42DB60343BC5E4A7AFFFDF71383A7C1DF6D769D159500C8EE6BBE0AA872903FE3C4B7E05B8B0A8FAAFA33A957ECB50DD576C8BE14352BA3CEC551C9125B002ABDACF77D37E18B7BC704F4FCBF7812D3DB385962A25819E5B -ss = 60F62850F54096EF4D8AB44D5050086D48889FEF1D2523B2BAFF585D2E4BDACC - -count = 83 -seed = 16BEF67F7AC3A755C59C816478B75FCC16CE5844DB537791ACCD1EBD49D2824B105FD2E970F728C8F0CF16E439A9AE2F -pk = A4F1F0D3BCB4691FD6DF0AA806F5DBBC4AF3A47AFBB54322DD3AF167990C0021CB5048EBE843FB7F2F0E2286FB118A51131A72DDF244F29027BDACC0AA35B5201E8BF62A6FB9975EA343774742712697F04ED316C7718D8D232318D2C026AAACD25357315B80B2C07108463CF087B8543920832FD1BB3E086C23DD931BF8DC3E644D7D886521E49141ABA61616C0AD9A020C3DB87470A26CE2693FD9E686C856DE27714CDE70AA995E9D1F6BB272D80A375ACCE6B51FDB10B205D500ED999B1F7BD9E9F5A79542FDDEC48C34CED28D85412F7E12C607FFEE47E7596C98D986A8D960ED9694A6A6143CC2F5C32FFCC5ABF00DD9632AF44FEDCD811C9A78914E075A1961B1AA46E3F24F5173BC56847DB2B3EF6E11123E482A4605613E90A553DE7F876AA6074FC3858B0556157882CDF89FCD44088C598B63AB0268FA41BC4886917086905BE1346536B1AF177DCB8D22A5FC935E0214AB750AC844F4A2D0446BC313F2837396230E5EC23A084303D71CEAE7808F10D9F3590E8838DBE5F092E425B8ADB9296D4FD078A5B07A7DCD477DC170B772EBC8CD21A730024756BB11BB5211B6E5796E520C99FA75AE17550903BCAF567242ED49BECF7EDDA5DF6074EF88B1A8616EBA5571CA1C561046EA69DFC49F5457E146A3EB23B328BCCA188541EB92CBE5B7B23D9554F29B56087236F08CD81C446E174773ECBB28FE1D82D95B62F045BF118CA14F8CBDCCCDB740FE7EB8D2BFB1BB154E6B479B0D6520E87B9DDFBB30600AD55978BC8B57EF5DFAA9BAEDF2BF6F -sk = 9D405D3EBDAF35FA8722DE431B669722ACAAEA2FD10B814310B17F78B66147D16CEB14F7662BE0C42779459F69A145C0E2CE9F0BD9A0CD1BF32ED5694CC9AE32F1EEF33ECE28D20086A1FD00DD3EB903A4F1F0D3BCB4691FD6DF0AA806F5DBBC4AF3A47AFBB54322DD3AF167990C0021CB5048EBE843FB7F2F0E2286FB118A51131A72DDF244F29027BDACC0AA35B5201E8BF62A6FB9975EA343774742712697F04ED316C7718D8D232318D2C026AAACD25357315B80B2C07108463CF087B8543920832FD1BB3E086C23DD931BF8DC3E644D7D886521E49141ABA61616C0AD9A020C3DB87470A26CE2693FD9E686C856DE27714CDE70AA995E9D1F6BB272D80A375ACCE6B51FDB10B205D500ED999B1F7BD9E9F5A79542FDDEC48C34CED28D85412F7E12C607FFEE47E7596C98D986A8D960ED9694A6A6143CC2F5C32FFCC5ABF00DD9632AF44FEDCD811C9A78914E075A1961B1AA46E3F24F5173BC56847DB2B3EF6E11123E482A4605613E90A553DE7F876AA6074FC3858B0556157882CDF89FCD44088C598B63AB0268FA41BC4886917086905BE1346536B1AF177DCB8D22A5FC935E0214AB750AC844F4A2D0446BC313F2837396230E5EC23A084303D71CEAE7808F10D9F3590E8838DBE5F092E425B8ADB9296D4FD078A5B07A7DCD477DC170B772EBC8CD21A730024756BB11BB5211B6E5796E520C99FA75AE17550903BCAF567242ED49BECF7EDDA5DF6074EF88B1A8616EBA5571CA1C561046EA69DFC49F5457E146A3EB23B328BCCA188541EB92CBE5B7B23D9554F29B56087236F08CD81C446E174773ECBB28FE1D82D95B62F045BF118CA14F8CBDCCCDB740FE7EB8D2BFB1BB154E6B479B0D6520E87B9DDFBB30600AD55978BC8B57EF5DFAA9BAEDF2BF6F -ct = 565FF76C749334B07E05D036DB9948B1223D840382D16C4A1D22DA6E482D78D368CD0BB837125917C4A8E284467EB0231AD84B3A69F955FC3AD37866AAB529B705D56C440FA81E072248456CB687F21F92BF8926F54CC4D7EE776F24C24328C74707890867394D29C9B84BC52DBDE1174DBD94985E116F1D191BD158CC2A0BFEC5AEA2872CB10C6D1D2AC64A3C9A9B83329EB5A9C82FFD452AD5531DA5B87C1B309D52FC39AEB9A07BE6F2307A198267487D24E092E0C4516DA0E44D0366C2F12CD2CBAF9F0C013C4BE6BA698D9E195F53407C6E4887FB8958D75AD71F1B069C58703681235DDD163B934F56EA74714A58AFE1C9B4C6B15513CB594088C238621279A9EA36089B0C4CAAB949B151CA79788A66F2BF0DF1EE8E0740382D385FD8317EEBA3C6D89948638A598DEC4BDE58B86461185EC13D232DE3DB999F0B03F395F5FB96ABC90EA5B706438A2DFD7D79F100A0D65BD2089FC902B1F79762AD19F65816DA545FE3CE3181A0F8A9D1C9DE4ADF495BD92BE9014F7209591F4D3A056CC207D916E38566249A98F05CF2918DFCAAC68BBA833889987BF54F3E72E2DA4A0C4350015D4CE1F420B25BABA8B295017D62B4FD30FAE5512A139AB505EF42191029F941D960B9D7110A810EFB5DB54B53C87FB52B9F08CF6D88B967B2B80F8F855A78DC3C1B20B0A8771CB6934BBDE64B9B18A248B9948ED7A793FB7AE940167460BA5F1D032BC68FB1066466DCF70F4B1C9779C02D9D633A32B550ED588E3C738EEB58DDE8891D661818AB7417F0DE760D2FF3BAFADF7D31747EB031A6A192486C9C5B2692BD9C7B723A7E0939BBC19EC3FD -ss = 4EEA80450240413B5947E8CC918E91C4F1662655FBBBB2EEDBA9D802B76835F9 - -count = 84 -seed = D0611F9AE5BE4DA5D7EADC9109944348E716CB3DAEE545721EEA8C892E7831CF2E54603146454CBFD92387739E9A78D8 -pk = 357FABF2CBE3D7E413570C13A56A570FB19C115E13C58973ECD430A99F26B9A9CE6F7268948ABBF5A8DA9FAEFDD984EBA46456081A969DBFA813273BF238EA6C264044F002861F960EE46181C9AED04C15237CF8429E7C1FEE759C304468D100078274CB29F792CC1AAE4D8946B30280893F7D2B4A88872F48A55CA2DF2AF9656A65065597CF4C4E83059A772A336FE2A2EECDF843BF352430FB17C6C811EE8B50A6A9512F4731E3E8BD164351E8C13DB927A8961B43F113BB7C493C150776E08824BD262906B1A1FDA7A7BEA8FF49E3EF04E1CE5C331356E89D03A8846357B6F3AABCA0DE8894EFAF4EF3FB6AB54F0027CF923A017A3525EC63EA51CAA180FFD6DCEF2CA184CCBE2BBE25E8A6C04E002E3D2DD1AF01BCF2516CBF4EB2AA12CAD283814F5B3235B4C007471656B488DDB24F86F76AF0F3717A8DDEAFD1B388770EA320F0541C6C0305AABB757C0CD787633A76F27C27CDF41E61A1A77F1DFABE9C25B21DFC17667A9B22C375B7C7B9672AA26962DC0ABB633461144D73247DC0D5B794045C0966754F0E552DE7B7F9B83BE74DB65851A8146A3815E407C0D917CAA48C8CA69EDEA9227E3C0863BA0D68D4C66DD7E092CA41BD7FB532C2DF7EACDF5E5FB45A493D7D50AA3756B7D0A08D8FCB38819463148EA214E3FCE9424D8F6327B6D87B8DE0F56B84E9D1189DBEBC3F69B6E2FEB6CE344F54F662BEDF8FD38ED72C31DAB4C9F5CFEC06B6E8E6AB20B1FADC09B8A5BB66DCBEE045C778DDA6CC3EEA62C42ED175879E10E65CC51ED4FC9DC361 -sk = 9A86490F0615F3EDF789CB0654066E9EE339CC59F968281F3B89213F83C692EDFAEB2EF44D2F608621E831187CE79B2D2F4A20F1568BBE76B0D3D5AF361117140D780101E59B3D63CCCCA74C0793CB03357FABF2CBE3D7E413570C13A56A570FB19C115E13C58973ECD430A99F26B9A9CE6F7268948ABBF5A8DA9FAEFDD984EBA46456081A969DBFA813273BF238EA6C264044F002861F960EE46181C9AED04C15237CF8429E7C1FEE759C304468D100078274CB29F792CC1AAE4D8946B30280893F7D2B4A88872F48A55CA2DF2AF9656A65065597CF4C4E83059A772A336FE2A2EECDF843BF352430FB17C6C811EE8B50A6A9512F4731E3E8BD164351E8C13DB927A8961B43F113BB7C493C150776E08824BD262906B1A1FDA7A7BEA8FF49E3EF04E1CE5C331356E89D03A8846357B6F3AABCA0DE8894EFAF4EF3FB6AB54F0027CF923A017A3525EC63EA51CAA180FFD6DCEF2CA184CCBE2BBE25E8A6C04E002E3D2DD1AF01BCF2516CBF4EB2AA12CAD283814F5B3235B4C007471656B488DDB24F86F76AF0F3717A8DDEAFD1B388770EA320F0541C6C0305AABB757C0CD787633A76F27C27CDF41E61A1A77F1DFABE9C25B21DFC17667A9B22C375B7C7B9672AA26962DC0ABB633461144D73247DC0D5B794045C0966754F0E552DE7B7F9B83BE74DB65851A8146A3815E407C0D917CAA48C8CA69EDEA9227E3C0863BA0D68D4C66DD7E092CA41BD7FB532C2DF7EACDF5E5FB45A493D7D50AA3756B7D0A08D8FCB38819463148EA214E3FCE9424D8F6327B6D87B8DE0F56B84E9D1189DBEBC3F69B6E2FEB6CE344F54F662BEDF8FD38ED72C31DAB4C9F5CFEC06B6E8E6AB20B1FADC09B8A5BB66DCBEE045C778DDA6CC3EEA62C42ED175879E10E65CC51ED4FC9DC361 -ct = 56B22744548EF91C2F0811FCF5BDC62983B37698E2ED28D7DDB0AA79BB42C17B9947DD636E45679350DA9D24F2A15DE3C738B9949D5397CD8A02FF0A5B66D65A2AAD718B04C455294962EBF38F956643679B4357A487CB01BE29228DF92C4E6391072A1C0DC7F5C5B14961F94099FE1DC80594126DB0796BEF36578E7ED1F9906F81DA2C82A6411EBE3EEE3E0A982E28CC36C364C0A8F68008814B563AA3F678F59BF660D537CCA396615027EE545F97B5620B1FF190DFC7B9AE8D6857C2BF31F774B0ACD47D6B888FE872FC53C98CD5C55BBB86D833B8149E6AD1674C066BA52E6318934247F719C5C480163140F5D35C453496272C1481BE03C6D02B7D439DBDE93D052F16A7DEEE3260B107C6191642E1270245AD8DDB3557602C4EF62AFC82BD219CEA91A49D517911A0721F17AD4D3C6EA086A92A2EA2BE3745EEAC7DC161A09E34262B0557103E8C37BCBE342C497D12EEBFCFAEFB6B0DA5F2C2BF3A6AB18A74093B955FB2BB7D08D9B8690910809E41882B9EAC64F570570E8CABE8416B00623A2F9E142403105D8218AEE8C00341A8F788E36EF7B2AC5B63EFD07596586A63B65639B4D996930D960A62320BBA380E9F4888D6C25E3FCEC4D1D08373E790761FA866AD991634AA2BDB3B010430F027F98A0AB6CD332CA1F51B0C52EB2EF64529B0BA219B4271C36F90F56949C3A28D5E5E68B4F597633B854E24EFBC76C3060F4A7C431C3CFDD1CBEAFB72E4FF624826E1BB1616349CE8DD55612F2E135E01382383AA3E4D2AFCB6E01D532BA285602C588915FB3C5132F0C0EFFFAA16DB4074B7536212AC8D9F50FBA334A3C337CD86 -ss = A6AA55F4F84ACE96FCCFD113B3B77E885748F05E84A0F8BB68B5B59AB3813116 - -count = 85 -seed = FBC38D7614D7718E931EDB850D2C6F0C5EEA9EE889B3E25BD69AC255D5B91E885D93E808E66BF9C88C655DC594DA5792 -pk = B07AB0A3019C122650F9943E8C119F20B439E27E835361555429F82F1EDE2260428A1B198DD686B0179DFFEC22CA9CE5C0425054F7D5C7C528D42420A1E31E32CA63B59F6C07FE4F2A439F745983F7B680BDAAC6F8D87D1B1F7AEDE97C6D7D4C60B2CCC554339A990B885C6DC7BC2E90944ECEDA3F74FD97CFAEC5E0118CC07884CF28DD0A0575487A8BA58E27B3CFEFB54AC34470AC154713896CF18F6153CF106D642C549986CDFB21C0244F8452722FC9BF157F876E0D4F3D3D149134609E8A9BFB3108FD3AFF286C288B1237667761631E66984A762634B66E33704EE7329CFA378BE7E0535CF7E8260F70A4EB841AB5AE252DD5E51C3E25E0A3DFB1778794B2076A1C7B33A5CF6001419440329A6FEDAD110E8CE3B20B06809B1A286B5B577793CDF09469A17441B17DCF0BF9D404BF425E327080BB94D1B39EB36BF7DAFD5BBDA1D19C12083E010D2DF159120902DA05C3CA9D6C0CFF7FBFD0E016AA3481A1E391BC2B5941283B5762818AD931A3200A86A1E13E4C5980D94AC647D43DF8D4B7BAD3DC777C2673218D959E2A3397D575BC5966B63063025F2E7F218ADAEE82DFEE66F1C66C717FBE5F7FD88B5797EE5D7427E46528A609D1D0A4BFCEBF7C0683F0790C748BA844EA7A50C2ADDA009B5DBCA46C5CD65DAE4DE0F9B4EFAAC3DB7A742668271900EF149164BE08D88B0F0C198B725CB58380AB32067D4C390156A1DADDD0DE051EB1CF58A752AE90DB0B7E6A3567FC3F88226D8F6E50DBA5D8F6C9700281DB88C35FBFE569CF1064F6974133 -sk = 6DFD9B575872560C7BDC2732C4A28DAC4DB04E535EB8E402C3DFFD145C09CE47A2985C1C4D203778597947D710DEC806E36B0CD949FE460EF141213BFC525E5BEE66291AE5E226AE015D9579E3DFC800B07AB0A3019C122650F9943E8C119F20B439E27E835361555429F82F1EDE2260428A1B198DD686B0179DFFEC22CA9CE5C0425054F7D5C7C528D42420A1E31E32CA63B59F6C07FE4F2A439F745983F7B680BDAAC6F8D87D1B1F7AEDE97C6D7D4C60B2CCC554339A990B885C6DC7BC2E90944ECEDA3F74FD97CFAEC5E0118CC07884CF28DD0A0575487A8BA58E27B3CFEFB54AC34470AC154713896CF18F6153CF106D642C549986CDFB21C0244F8452722FC9BF157F876E0D4F3D3D149134609E8A9BFB3108FD3AFF286C288B1237667761631E66984A762634B66E33704EE7329CFA378BE7E0535CF7E8260F70A4EB841AB5AE252DD5E51C3E25E0A3DFB1778794B2076A1C7B33A5CF6001419440329A6FEDAD110E8CE3B20B06809B1A286B5B577793CDF09469A17441B17DCF0BF9D404BF425E327080BB94D1B39EB36BF7DAFD5BBDA1D19C12083E010D2DF159120902DA05C3CA9D6C0CFF7FBFD0E016AA3481A1E391BC2B5941283B5762818AD931A3200A86A1E13E4C5980D94AC647D43DF8D4B7BAD3DC777C2673218D959E2A3397D575BC5966B63063025F2E7F218ADAEE82DFEE66F1C66C717FBE5F7FD88B5797EE5D7427E46528A609D1D0A4BFCEBF7C0683F0790C748BA844EA7A50C2ADDA009B5DBCA46C5CD65DAE4DE0F9B4EFAAC3DB7A742668271900EF149164BE08D88B0F0C198B725CB58380AB32067D4C390156A1DADDD0DE051EB1CF58A752AE90DB0B7E6A3567FC3F88226D8F6E50DBA5D8F6C9700281DB88C35FBFE569CF1064F6974133 -ct = 8014C8E6B21C62E83314FD35A543634F00B01B2E7C4E69E2235B8623C4F9864075E9ACE7E40A97BC7B7D7B3760DC94A20AAACFB41FB6E9302AEBDC8F4213002053880FE627E881B82F1AF3240CC5103D293B1DE611180CD5C8D2FB6B766BDCAE4A7BC6DB69394A89972D13CA5C4EFA7DE1E606C4727A6EE1CE823F61BD5A0FE34504CE27AD8F19BFA8036F672244BF419A91CCA57A9D7636CDEFB0B108BDB828EBD9F50CED08614C3303E560C442AF9736D0B9ABC40FFC32F7F07E6447B5C6D245B97CFF59BA44AD91334E4672920D4F1315D10F3E64A1442EF3977AACA4097325709E27EDFF23186F7FD453C5E2C00225B4DD7CFFDE68FE1182FE6B95FA20CAADE781B5A62DC7BBAE73DA71FAF0497A21EA091632AC686E42388F17A1B6AC18B6492679CC93C58EDC2D53D8A0B448146BB088C9DF562D20770D1AB7A5604177363D8310F46C32E1448B749D59B8C622EA66AEBD61DB79F7CBBBBC495E01F7FCBE62BEF36AF333F7400342227932D455C837121DEA84906D1FFECCDD8918AD57871D66360E7B11AC61FF63FEABEEE89A4EF7A7948B70D9E26F37DA6C3FE282AA7635BA521148B65931407DCDB286C6A49A67C95BEDE7419EBA3797E0FB7A99A11069AD2FC7492A740B6051B037F3DC0C7B13CB19685DF98ACD75DDFECFF0ADBD5BDE1CC6BDB24B44AC1D613C620BBC3792798AF6AAEC149C377CE1DE8F9042BE9180C2CF7C92BED88BB296C63CEC96F1FBCEA69855EE86DB16DCFF8BF231CD150BFDB97BE8D05A7986AA486F794DD3EAAC8BCE5BE5DA0AC156FDB73A3E782779F9DBB2E2C16E20043DEB3CC70A0F2F02A60A1E4F -ss = B51F055A645FAE20F634F62243B398358544C00F2E93DBF55FA69EA82C00B43A - -count = 86 -seed = 1722219CB5DB47374EB0AF0232C856A57F026F1CB09E5A5799F4C333DD422FF6A0A67C4DA502FAAE727FB2D45DAFCF35 -pk = 7629D4954E6C9A88D538C9244E4B1DA169E4970B68F99EFF53E1B9F264001CB2A611D4D4FF9E2DA1F34CB46716D2844F5C5FAF4754466C7B876DF53E6EBC4E1756114873EF7E1917E6D8CB7D69813B55D1F5E9890648099B6489146993529F215FDF16B33DD99C3662C373428FC0F92299DE54683DF24477309824925CE8F692CEBC315CD657BB44F7B1EDE85B478A3B4DBAE3947BD570349A0E29E16B91D609140A2CFE86E42F98DCB951782EF42DB127331E357FD4CC6EC05D5D6173D3FA18006A8023B0A6A351A9E9DD4ABA65279AEB6C52B290E34A4599F3A7DF14E9D12786F1EB7DF9DAEE0DCA38AB92CFD13491FA241812BB8039E7766AFB90D23D66775B3C86CEBA6181EE4253EC497A876BBEB2CEFFE048F3CFD51710EB3A30E3DE14E6250A505A611843EB31A49B2E4573B622CA372799195AA4553AA7BEFBA720156D4B68F7A877517C1C1FC608DE41540266DAD557475E17F5807F0FF8063AD977A22D4D7D123A2C7006142ED809C6D1AE3962174F9206A46350A5F5127FF540D3DF7F0D9916D5748E10BE5D0FA62CB40D9FA9E079A696DC77F653D5D54C055A91778D4578FBEC17DFCAF29A72B40679A0CF92AB0789417BC78ABAC22FC75D77613DD47B3AF8987F52247B4AFE9EEEEFA6C05637D8492FD509ECDEA08971671611A569D00A0610BAE4839201EE5EEBFD7B37F47DDF29A701D0BCF9CA30D3D30F8E6BFD8E3F3AF8BD0C7CBC1770BBA18E96415795D74A09A3B9C88437FBFB5A3C73CD3A0502104A912C3EFECB1C8D219BF0EC05D855 -sk = 6FCA9F4E384D8418075CC064C70730801BDB8249899D456A77130D5BEEB3662CCE7683F8A03D3CF04E46970FF7D6A12494AE12558346DFC8FD9370BF944A01022AD673C62EDD8B7D17F5459C9D1DBD017629D4954E6C9A88D538C9244E4B1DA169E4970B68F99EFF53E1B9F264001CB2A611D4D4FF9E2DA1F34CB46716D2844F5C5FAF4754466C7B876DF53E6EBC4E1756114873EF7E1917E6D8CB7D69813B55D1F5E9890648099B6489146993529F215FDF16B33DD99C3662C373428FC0F92299DE54683DF24477309824925CE8F692CEBC315CD657BB44F7B1EDE85B478A3B4DBAE3947BD570349A0E29E16B91D609140A2CFE86E42F98DCB951782EF42DB127331E357FD4CC6EC05D5D6173D3FA18006A8023B0A6A351A9E9DD4ABA65279AEB6C52B290E34A4599F3A7DF14E9D12786F1EB7DF9DAEE0DCA38AB92CFD13491FA241812BB8039E7766AFB90D23D66775B3C86CEBA6181EE4253EC497A876BBEB2CEFFE048F3CFD51710EB3A30E3DE14E6250A505A611843EB31A49B2E4573B622CA372799195AA4553AA7BEFBA720156D4B68F7A877517C1C1FC608DE41540266DAD557475E17F5807F0FF8063AD977A22D4D7D123A2C7006142ED809C6D1AE3962174F9206A46350A5F5127FF540D3DF7F0D9916D5748E10BE5D0FA62CB40D9FA9E079A696DC77F653D5D54C055A91778D4578FBEC17DFCAF29A72B40679A0CF92AB0789417BC78ABAC22FC75D77613DD47B3AF8987F52247B4AFE9EEEEFA6C05637D8492FD509ECDEA08971671611A569D00A0610BAE4839201EE5EEBFD7B37F47DDF29A701D0BCF9CA30D3D30F8E6BFD8E3F3AF8BD0C7CBC1770BBA18E96415795D74A09A3B9C88437FBFB5A3C73CD3A0502104A912C3EFECB1C8D219BF0EC05D855 -ct = 96C256C10108ADF521BD7180C226BC3401A732A49BF1835331BB4E041E6C61A676140B5FE3AB0BB6EEE7C4669A337EAF882FF1481BF7A136F5FD0615DD4AFB690D8C5D7ADFA2EA7B16D4235417F064075DFECF2D20A80A41F8F7FAAF8022D961108F57BA2C520D4ACD1C1B94F238CDB6A235C1A2DF5E06E88AF74420CF0D2CAC87FFFED914BC29777679D753F9C4ABD19F79C7030DAF00CBACABF4403973E11DA4B14AD1451555FBD211C7D9CBEE39255D03ABA6E867D062D5497E66519F13C1A3F2D7D6D154A79474D1000C10ED9557ABE4A8809C554EEF24B18941C9862E5DA543DD93B64F345386C36861AC6D852D44737563FB59B5A9E551EBC8753C33FD0D80A0D8883492FDB027B75927A64E21A5BA41716AD126CF283951B5AFC13B0D71B91A666D45CDBC1FA664ADE5D0710AAD016666B62D699AD757B94C403C673CC33E882F294DA467401C47CBA806364ED4C9D133A11520C81700142B545EA35CC4B0A3E66E473C44D093600E7A334CE22E309DC8A5073F1AB09A52A9CDC8BD03B056B4ED7E621C026B833F8902A9C3925A9049F0D8E8FF22FBB447746429DA3B992A3E99226457DB4406AB8848986AC1276E4D025D8FDEE89615D6CAFA09F00F707CE989587966D548FFC387EDBEC2B8B35F726F671E8748AB2FD3A3956D67CEE0F6D2D601814756418F4E459E96999FC2334A9C4A00174B08E7970DE8394583D413629F730642BC8F356E90611CB48571076F87DAA46FA9C0273C4DDF1A7F9F89AD2FC25CE8451D427311B23798996F9D219E3647E53D5A740CB20F0F6BB0A63071658ADDF3EF567EE1CD411D89D4C77EBBC9F3 -ss = B8FAEF117C9BAD91B8BD4D1A37FB64485D9C9A010468E9E4EA5311DB7C8857C6 - -count = 87 -seed = AC139B78FD16CA0F26D6D7F9E15345C888D857B1910CF38D883339B37EAD2DCAC30F7CF10176F23FF34B4488EB79437C -pk = 9B8CB5CB24B5D49CB5545CC058B9A460D1D01A838C834FAB126433A39EA4638264DC835FF19727C6F0BF0B45359CAE18BCCE46F96F9F2D1AF3A8316EA6F494B69C1BF4B6A4FC4BE3C7D43469BA7EBF665FDD70B0F71002B5D3F3A009C755807A7088FDF9BE242750540BE94A5D66A0FD063F3378BEBDF3CC6B0737D5DE3D042E9766CE77B8E50A15468FD37B7BCC9CDC8C306DF81FB4DBD7EFFCAC03A00F33367B96DB5BA30A70DFF464C5662AEE43A35C87241045904D8924C2B626382E9AA4BAE378D7D908282D8638EBE82D6292410EF1B12DFDEA47D1DF6EBD552D1D831AB334F5DCF7088256AF89D4BF33C58D0D87CFDF1F0925EC91EA7B89045A2C54BB6EC722DAC095D58CA5B8F9110176048934520022E10CE3F84551DC8B2D164A89ECFB0C93B60C81F9023140D92D686F0D7D686FF632CF78A6314624A59B1D0520CA05C4DA610577987CE8BD6FDC78F5DE5EF8982606760869351BD0A141F946CACDEBFF0C0256087D42C61E42456ADE4418DD8955A0F7550A3AA5521F02C51931C31065FA3BD7DBC97DB1FC3AE90CEDFBE9C3A5C5972A00AC1805CC84640510DB54C4BEF01809495A677E10528ADB931A67A8B87EC3997C0F1C32F5D91A0DB2EA2DCA3CCBD2F0E1882F95AD46B6F90B37EDF4FC282451F1224193D499002EC45531B45BAE0B772CFC15D7D27CEBCF0DCC654C2DA5FD5E46005E50E74CB18550D68596A5AAD953BCB745564F4523DD89D35967D0F871A400A569B6A9400F67B4C19F1413AEDDF55362004AF1DB53491C38361A1762 -sk = E58F71BF175C0550A67E00E0F7B3B7FC36BC2707BF0C93044A492626DE36301A7F7054814869CF7625E45647BC1547AFF288DBB90699B2AD84893F3B755D9722814394AA8D7C351EC828975853DB53009B8CB5CB24B5D49CB5545CC058B9A460D1D01A838C834FAB126433A39EA4638264DC835FF19727C6F0BF0B45359CAE18BCCE46F96F9F2D1AF3A8316EA6F494B69C1BF4B6A4FC4BE3C7D43469BA7EBF665FDD70B0F71002B5D3F3A009C755807A7088FDF9BE242750540BE94A5D66A0FD063F3378BEBDF3CC6B0737D5DE3D042E9766CE77B8E50A15468FD37B7BCC9CDC8C306DF81FB4DBD7EFFCAC03A00F33367B96DB5BA30A70DFF464C5662AEE43A35C87241045904D8924C2B626382E9AA4BAE378D7D908282D8638EBE82D6292410EF1B12DFDEA47D1DF6EBD552D1D831AB334F5DCF7088256AF89D4BF33C58D0D87CFDF1F0925EC91EA7B89045A2C54BB6EC722DAC095D58CA5B8F9110176048934520022E10CE3F84551DC8B2D164A89ECFB0C93B60C81F9023140D92D686F0D7D686FF632CF78A6314624A59B1D0520CA05C4DA610577987CE8BD6FDC78F5DE5EF8982606760869351BD0A141F946CACDEBFF0C0256087D42C61E42456ADE4418DD8955A0F7550A3AA5521F02C51931C31065FA3BD7DBC97DB1FC3AE90CEDFBE9C3A5C5972A00AC1805CC84640510DB54C4BEF01809495A677E10528ADB931A67A8B87EC3997C0F1C32F5D91A0DB2EA2DCA3CCBD2F0E1882F95AD46B6F90B37EDF4FC282451F1224193D499002EC45531B45BAE0B772CFC15D7D27CEBCF0DCC654C2DA5FD5E46005E50E74CB18550D68596A5AAD953BCB745564F4523DD89D35967D0F871A400A569B6A9400F67B4C19F1413AEDDF55362004AF1DB53491C38361A1762 -ct = 51F8D0392B0FA79A4E6C4EDAE18B314D674C75CAF4760F69050F173435AFA6DF90FB0E7838F856FE410AE6525B5BB60044A38F8C75FA2B492EA3708DDE9692C5DC7FC611EA03D924AB7F17F204818AC959B2287D24386938F52D6F64754A139393D4A647B99AE47EB1C5E7CE0B845717805D8FF23FA0E0CE99D5EA9A68CB6CF2C7783B4F48A41376A8062EF236B792E25ECEEAA6403D7059F1B430B291CCBE41F69EF55DC6ABB325633E37F564E6105E4876ED0BCE2555B7AEEA4B6638B03B123D8C095E6E975DACCB1862EB5D930216EEB4B403B8227467A07E6F758D4547F7A0DE3971C0995DA579019CB0DCC10D4993EF4FE5C323B8220BB6969C212E6FABE72ABF76AD494D0324C535B75F260E4BCF16E53B5A59EDF5FB4117B8689F7401715A423D66CC8890D6BF7F433DE1E43E862B7CC4BD5D99D3F0A1E3E07694376AF7F6DB0AE29D1D917CAC7B74727867BFA60E5B18239AB4ACF9335540F0F916F3738B299DE39AEB573D58C4F573856108697A2CE32961602EBF638C13E7416046BD526A6710AFE5BEA5F1E3FCF10C31E14B11D6569661490FF1C48A41A2C1D428932E6A6B77F6F25165FDFBAC52D589B5E8CF323AF7062EEC2B445F96D52E6749D95C80C9A0DE0706CFC28D5A9167086931056AAF1544FF55B65D58AB35417A52782F6ED29547F83D87D6CBA07B242AB0D686DD61F218467F5507B38231ECFAAC2F49343E48FC3F999FAB5AB94F8DB246C3A8EC0E183504E717F8B157C8604BB1B9A994C7D05A3E930D06912AD02F422A7DFCC34990A494DCED1573C611B3F8B6B836A6C2C47FA0FF9BEA298BDE3A04CA0B129BF3 -ss = EAFACA5348B53B62BC5565C113BE92CD302B694CF1DC54FC30205B4D5DD815ED - -count = 88 -seed = CC7152849C98D5FED2813275D32069E44824ECB14EAEF425CE017448CD9A401C91C06D0F7EED6D22B7BBE8BA6C429EC3 -pk = 5B9752DC03E94B0E0DCAAD5B96CF86A7B29A5BEADAB46904AA02EBFFF4DA14F4DDE9116E95E3ECD38BE2626A397FD2EB9B40E2390D83EB0A338034D11D084B1C771CDFBC2D7D290638D549359CAD4A8CF6F71FFBEAE540578E725DBCBA5A822B76CCA381E91BFC44D7D5F837CE79489B9162B5D3427F17FF370014D75021FC7BF71B694A8752F1F15D4079AD079009CC1D5F0395EA522D232160225FF382A50D022F208C859AF110C40CE8DF1FEE25F372A49C304B9E936FC9FDC53A1D4F85DC962ABF3CAD68DD5F1C25ABC568B093AC64724660ECD14A2D9A91D19145BD2561B7F249933057E1693932B9D7345BD740E22B21E6B4D6C1175C385330F6C47E7BB79A3A2F2A5A079403E15099CF7C7F33D552634AB136E910F00E5218C88A52657FB5913F45893259C1F62B1210A3AE17D42494B1009683729E49005E64B8F927075E9AC7DF8254337413025F2E83DA25039F50C73B8B79CF757659F805F579ED5A9552DF284B0D6EB853BE60750DC0E1554BDAD04ED0292709AB8C18C0BF8953072AFE03BCD9384A4C395230128FD73E0BE5B6C26C2B3D9E64AF5F8433BB76FCE6B7F13DE6DB093CF5ACE0851BDA462D208D2E019010474B7431585D788F54C321D5A60D8CCF787A699EA2DAE9C093B93526286E1A4375CC330063361779D6A02800327713701C4E12833ECF1F588302B4A5C9E17058CAE0A59D2196024A6CDC79735853299A2E48405C990D3CCB56BDC4688C53A2124E023522B86A16EB51AD417832C9AEE6A7F78A588739482B88CE93C56B27 -sk = E3FC575ED51513E62ABA655D24CD9C8F1C6C848AAFFA946C49A53AC3EA59E474D82C2F1BF2E6AEBDE5660FA73356982E12999D8FDAFBB3CB186341D0386DEAD06ABF589AA1E7C22EB20E04C5ADC4D6035B9752DC03E94B0E0DCAAD5B96CF86A7B29A5BEADAB46904AA02EBFFF4DA14F4DDE9116E95E3ECD38BE2626A397FD2EB9B40E2390D83EB0A338034D11D084B1C771CDFBC2D7D290638D549359CAD4A8CF6F71FFBEAE540578E725DBCBA5A822B76CCA381E91BFC44D7D5F837CE79489B9162B5D3427F17FF370014D75021FC7BF71B694A8752F1F15D4079AD079009CC1D5F0395EA522D232160225FF382A50D022F208C859AF110C40CE8DF1FEE25F372A49C304B9E936FC9FDC53A1D4F85DC962ABF3CAD68DD5F1C25ABC568B093AC64724660ECD14A2D9A91D19145BD2561B7F249933057E1693932B9D7345BD740E22B21E6B4D6C1175C385330F6C47E7BB79A3A2F2A5A079403E15099CF7C7F33D552634AB136E910F00E5218C88A52657FB5913F45893259C1F62B1210A3AE17D42494B1009683729E49005E64B8F927075E9AC7DF8254337413025F2E83DA25039F50C73B8B79CF757659F805F579ED5A9552DF284B0D6EB853BE60750DC0E1554BDAD04ED0292709AB8C18C0BF8953072AFE03BCD9384A4C395230128FD73E0BE5B6C26C2B3D9E64AF5F8433BB76FCE6B7F13DE6DB093CF5ACE0851BDA462D208D2E019010474B7431585D788F54C321D5A60D8CCF787A699EA2DAE9C093B93526286E1A4375CC330063361779D6A02800327713701C4E12833ECF1F588302B4A5C9E17058CAE0A59D2196024A6CDC79735853299A2E48405C990D3CCB56BDC4688C53A2124E023522B86A16EB51AD417832C9AEE6A7F78A588739482B88CE93C56B27 -ct = 173D35170149E831AC26A31CA920B76892E8901236F82A06E2248753C1CCB5D1C2956B74B79C4411DCB5118FC4B5DABA7007447596A1B31D0754F4AD4CC7F58DD97E7537AF6437E05DE0078AF1512447A60D68DB87A688AA6CF267C870370201BE360C22D76A3B77EBBBF83F499D7EF48B107FED34E5E2159EF61C9DB893DAC4526854D21E5EE6DEEA125D0824B46730B4AD6ABD09344C9FE1D2CAFCA253A1138EE900DB10B1EA3B511AE984884373C87FE25BDA88A56657B3BE3E5CE3360D6FB4BF9ABF59605AA46B70B1FA91EE53EE427012E97D6EA4207B490B199E4D8DB0323F475E07F13102518C63FC08A814047D6C0FF7161CB9496DE6BC3534D0F04CFE793F5E951DFC01706811D24E1A73502727234D61E20B87D66FBA7D04D732C4E90D8A7E1E3FE4521637EAF75F5CE851A3C764858FEB1B8FCC27C55B262083E61DD5FD33D8BC88FD964E1AD5525A2C3A915BB65ABD7B146DDE2628FD248352351A4B9C67BFBC4070D4CC52C2CA8E967BE5F5DE3CD4928D6419EA08D22A5D57C2D70F47F4B3DA160BCDF062EAF76EA76F5EF1DF30C3504E099DC199DAC0FC13B001BF7C9A488A9275AA42401EFB6325060F8CF939D4FB080323D6D258A95BDD22E1FA1FA9939868C6233370F3E6B371B428F87B150A269F8BC99F7FCD62DBCF964E209ABD13E49BE6C9BBE2F86A30EE8E7D05760CFA488851BE9A991F1C49C1A41AE98DEEB701F1893A3080417D9932C17E7384375DA80AEBEB2F07DFE756078618F78579B52962636157B1BB1B09F5E61106624069027B44E245AA8F0C66AEE7ECEF9F2729C9E2FE281F92A866B391C667AC0E58 -ss = 623C452049FBC352C8332F8BC3060C96A6BBC4EC0691EE5B4792236E0941D288 - -count = 89 -seed = 96D9A06F88FF2C2036FA8E914B89C765E4A510B468DEE40F914F78858C811857EFE9FD0E17C0048E7389E8D996B7E2B0 -pk = A50A1AA5A6C4E8A8940D4E0ABF7B16AB4AB0BCDC0476A6114601A28A62F66F1C38D940BC006215B2EF330E6055DC82B7EBDC95E46E22D842357D2FAAC11EB12567A1ABC32085D30640037FF1FE55B45EB9B62A69E0105F2ADB8DB76E2C44522FFD5796A7791E965EBFCF1A9D6A025E0AA466A03969BEBC4A0D824607DFE4B35192819658E482060B047EC9C79F337CE377FCFC84AF9C22C123D29512EC8ADA6E93B877FF34EFED992DACEBE70BC6963D81766664419C4572A6A4205AEE9DA4846E726C95E0CBFA3AA753BA9698A7921587D0452189EBECD916CFB4F7BB1C901CBF8936F0CC7C98E5623BA1E957B5AB974553B9ED43C5ACB9BC2F1294BB60D7589EED6C802BEF5A3F1C284D909BF48BEC78AE3E3A22663BB6EE2B2A05E94ADA30663D853B28561F8A66A3B5D364FA7C933D79E990375027B99F55D595894768779B8C7A030F7D031EF5214A11524BB94E7EFCFFF142AC499E0538744C68C34E425EED5D743D434416570630121F7C9442B1B7B4BF3D1385429791DC3A12D4E5752FA04CD015A277CE4833FB982BF82E1DC5960D7A0C19F84531F9A94A51BC95F64879CFF12897A36ACCA9A1070692D6CCBBFB60FD2BDF97ACF9D32014FCFA93E2B51ADBE6C707B155E7121C47D4D66B959F9176B42C5B6688A8ED0754C8D3356A2415196B5088B50D72E95F6E711BA62E2525067D35C3805D36DF38F979FB23284F23F2AACBC414F989E347A3BBC74DB43B9FDEE69734B8579958605E1BD4B43624232C6DEF2DC557AA0882B5DDE7CFC9E8DE8A52 -sk = 470B4943F0FE7FD0D8EC5185ABA0D1DB09D112934E4FB4787E2BBC6B88466E7B8B2809FD40008BE70A6B184981101724BC3D5EC5E1956B510B82FD5AD0668A5A4C4CF8794833434B07153F4FCE619D01A50A1AA5A6C4E8A8940D4E0ABF7B16AB4AB0BCDC0476A6114601A28A62F66F1C38D940BC006215B2EF330E6055DC82B7EBDC95E46E22D842357D2FAAC11EB12567A1ABC32085D30640037FF1FE55B45EB9B62A69E0105F2ADB8DB76E2C44522FFD5796A7791E965EBFCF1A9D6A025E0AA466A03969BEBC4A0D824607DFE4B35192819658E482060B047EC9C79F337CE377FCFC84AF9C22C123D29512EC8ADA6E93B877FF34EFED992DACEBE70BC6963D81766664419C4572A6A4205AEE9DA4846E726C95E0CBFA3AA753BA9698A7921587D0452189EBECD916CFB4F7BB1C901CBF8936F0CC7C98E5623BA1E957B5AB974553B9ED43C5ACB9BC2F1294BB60D7589EED6C802BEF5A3F1C284D909BF48BEC78AE3E3A22663BB6EE2B2A05E94ADA30663D853B28561F8A66A3B5D364FA7C933D79E990375027B99F55D595894768779B8C7A030F7D031EF5214A11524BB94E7EFCFFF142AC499E0538744C68C34E425EED5D743D434416570630121F7C9442B1B7B4BF3D1385429791DC3A12D4E5752FA04CD015A277CE4833FB982BF82E1DC5960D7A0C19F84531F9A94A51BC95F64879CFF12897A36ACCA9A1070692D6CCBBFB60FD2BDF97ACF9D32014FCFA93E2B51ADBE6C707B155E7121C47D4D66B959F9176B42C5B6688A8ED0754C8D3356A2415196B5088B50D72E95F6E711BA62E2525067D35C3805D36DF38F979FB23284F23F2AACBC414F989E347A3BBC74DB43B9FDEE69734B8579958605E1BD4B43624232C6DEF2DC557AA0882B5DDE7CFC9E8DE8A52 -ct = 80F2A678D9586068514C42DEEF6B7DAEA43ECF28CC5E9C7D4E17337D6106DCC8D8B34156F7AED23DC236577DCF2EC147C65FA35BA6431C2ECEE5E1656CA1E1B141B610305C7EA10F2CF4E0DCEDF6CC4A8851D9E0012E387147792AC26B00C98B6CA0CA51D51FB1B0CB55A643099F7B3CB4CD4C9E8017E1E624EDEFE5225322A709B592FF2E51981E108F1F93E342F09E1254128756F928668987BA203D647D59E3C9F81A946D10283845BFA5B6000C4072ECADF355313881DDC7E801B3205BECC8FCE83F4C18ADF6993EEE5C40472AD07A353C3A9EBD733899288328AA3AF314E43AFF4E9B7B6B667025434DEE131C37ACECDF09BDC456D65384021DE5F2024BD0960CEAE3D2A5E3E7AD9A82480F3D30529C8C654E263397E220EDCA10FBE0F3EFFF74ED4BBE546EA9F338273B8E012370048BA06A5976E2C19ABE29DE3A564EDEBB92E089DE0ADAF4A6D91FA6E24202B69ABE4EBA264BAA9A04AF40917E0FEC119F2E15FAA2B7390E2030A53CCB4958766E286572E2D156566955B244B0A9408761AB7581C8259665F06E361D6BB6CDEB6AA41B7F3D9F4C9FFAE9DC423007BF5E33360AEC933CF113F45E64B58CBC74111EC55D9FBEC66BE36D1FD0CF120B9EEA442F3DE2BCD516A1F347E0A5566D6266A6F6152E487DC1D3857FF203D518CD6290F5B47620ACDDDB6184C12C714B122CCC75277BB49180DA116CFCB2EF059865B6737B93D8F41D61ABB8C74D57DF7F5722FA68567979C8F539E75F4C9A6FB4E779F5D4C9A0EC16D207DB95613715FF68F0F035F0C27596A032347A2F748C577EBE07C1E6B70EED73289EE99204984656171B8F -ss = 6914DE332BF69D644EF33F1838FEFB16A62069B48C8DEE9308169EF59C7D7E7C - -count = 90 -seed = D26CE360D399BF7B89DC364AA7AC06BB513EAB8F527383E93E30727EDC3F22C262AA0EC70257B39EDFF0630DCDC1B79A -pk = BDC498DAF0B6F7AE3016688ECA094049DF080075463F4B515D0DE9C7C501650D5B6CE955F44CBF134F2E81E8BE69E7E25CE6469F2F95F48860C7CB411B2E646EE84E60075CBCD25297A9713B6D53CD28B703B7D088831BC89C75BA72F15BE84F21059A64DDCA9904E68663F650330B9A0588E851BBC8DB587682C50C3C98405C8DF28533F0681B0640547DE65FF491EEFAD6BA8F81E5F12A5887261CB61819A6EB1E31E387C53F29AB9897995B4CFED2FB644B5D29CE0CADF7C8C2023DAF4EE814312BD2125C0D9BA6FFD0ED1030B0841909B23D970D92D67FA87B68A81B5ED5B77EA65720AEEBD0467C84671CCDD3F04C7181C6F41CADF6007E956F658AF06D2DF2C1CD79C4FD5885390B9FEF1B8954BAC0EA55B195CA47DD5461E027E2F8DB33543B275E3A38482E2A252D24DE36532BEBBD0A907F022F65DAE7F395B9CA17F16CF97E804D6B5596DE583A4DB170359A2A6600186F8773EA46E5533B6C3A0C9C4C0E4EE00A34A2A2C31406481565F0044AF94217F7E3000F9F02F040A8A3B1A2EEFC1E9B7BB7689521F285FF46109537D582874AD1B9D0213B31F9D145340FF96F5080BFF56382A0D513D7B7AE1E47C6B76336BA46C4616C9EAAE375ABEA59709B72CC076A7E5B13E423F582FF7A25F294722B724CD001E16DB5EB94571447773C18A0E506166F8BAB2AE1B6C68270B762DF8F20AF23263ACF8AB6BFFE5557DCA6D0B36B56B7CDB2106680050461BCCE418C836FC9144834A7AD49E16ED674115298411CB1615211F09E9E3F66509FA25EA744 -sk = 6DF4385DB978D27B27D2AA5E452E4152B36F097503D9581AC3390105C5727E7DC95FA08ED106CE84660E8A4C90BD2B22634E40769AA0090A101C5DDDAD45EDC5EBE6C48C21012C2B18C5AA931733DB01BDC498DAF0B6F7AE3016688ECA094049DF080075463F4B515D0DE9C7C501650D5B6CE955F44CBF134F2E81E8BE69E7E25CE6469F2F95F48860C7CB411B2E646EE84E60075CBCD25297A9713B6D53CD28B703B7D088831BC89C75BA72F15BE84F21059A64DDCA9904E68663F650330B9A0588E851BBC8DB587682C50C3C98405C8DF28533F0681B0640547DE65FF491EEFAD6BA8F81E5F12A5887261CB61819A6EB1E31E387C53F29AB9897995B4CFED2FB644B5D29CE0CADF7C8C2023DAF4EE814312BD2125C0D9BA6FFD0ED1030B0841909B23D970D92D67FA87B68A81B5ED5B77EA65720AEEBD0467C84671CCDD3F04C7181C6F41CADF6007E956F658AF06D2DF2C1CD79C4FD5885390B9FEF1B8954BAC0EA55B195CA47DD5461E027E2F8DB33543B275E3A38482E2A252D24DE36532BEBBD0A907F022F65DAE7F395B9CA17F16CF97E804D6B5596DE583A4DB170359A2A6600186F8773EA46E5533B6C3A0C9C4C0E4EE00A34A2A2C31406481565F0044AF94217F7E3000F9F02F040A8A3B1A2EEFC1E9B7BB7689521F285FF46109537D582874AD1B9D0213B31F9D145340FF96F5080BFF56382A0D513D7B7AE1E47C6B76336BA46C4616C9EAAE375ABEA59709B72CC076A7E5B13E423F582FF7A25F294722B724CD001E16DB5EB94571447773C18A0E506166F8BAB2AE1B6C68270B762DF8F20AF23263ACF8AB6BFFE5557DCA6D0B36B56B7CDB2106680050461BCCE418C836FC9144834A7AD49E16ED674115298411CB1615211F09E9E3F66509FA25EA744 -ct = D5C20AB2508B96EE86A836A75764520EEC8069BAC4085CFF0C116E3A2506253B475601AE6F6472A34050BFB03FCF96A63C1573EFDC7A80D30BA0BBA0DA58BEFE4E1168564423882D8D08625C20FEA09FC689388B8A1B6BA58FA6BEC23247EC98E032BF6DBBEA0B9F932B40A5FE5F80B5F887C2D0DB8CAEBD4FE3086AA3B4657C91C078706A3163FE8D21CE2E225936B59424D4C6FFA96CD75B68FB9E90D24F73F14103975A4491F6AC6E5C174F9433EDBCFA1EFBD59EADAFCE529F6751F5E408B693CCB70195F387DC8533D8892CA4DFB97E0BE662BFF131A12ADB704801DE00B7B7AB2DF8DCFF099379B67738C08D64A0253E133B69F3FBECD0D22B05C2255B9F6301500BF4A06300763537B547998FCA69F5EE1DD5364EC326E2A7439AF2853812BCEA62F8F1B74C3DDF69E94E2910788C286551F6F3ECEFE2170FC04D92B5372EAB17DFB859589BB8DDF864CFEA3786FFBB9AF813559AB14CADB2FC745483BFFE77D359DD94D203F6344D8733E94A0D3770496CE866103CA6F2228E8D82D9FEA90979435E5C95C2B9F71843A3A60C3AF3CBDA6EF759D90C0860D06423D2F46F1DFC6358187CD9213F4C9B7E22F597EAAC0CB4023A04D2EC6743613A55BDF01DC8E241A447BE808E756809AE76038843E1E7B54930E68C7B1E0B030C0ECA22B8D526FE7D6E21DFF8283310D4FCAD256D67FDBA91135B57F1010DE43DF2CF803412C00A2CBDE298011445FFAD2A7D49278B048BCC1C7E6D306B486E743AE2D34C7F5EEC5CF42D93504BF224EA92DD4E42ABCD5A5263DDCB145E2E8F885FA4B8EB4516C0ACF8055366393DBE5F4E5A0E49F6BE0B -ss = F0072B8ABE7D3C6B1686702E58B9C9F15D91B3765954B237D851F441E976A94E - -count = 91 -seed = C5856298C3CB6AC9787A0F30938537AB2635B96F6D19CC9522063360E7A5C88E644929D2879180E3E5BCAD2422B7CFC3 -pk = 607AA92125BAB18B13C592C954ED788DF1FB03F561C714E376E62F4A4ADB5D1D619222F965B1CEE2FC37F2AF1BEBFF35FFE88008AFC5129AC52855D786B64F1C9C7CC076D0A9151AEAF6A35B4817867C0C2B33CA4B4274CDAE1D1CF37C50520ACBE26BFF7986AEFCC8A14C193EA0473AEBC95B29CA3926A1D862ABBA6EBB52030FFEF7F8BEC751ECD4D14F417151821F822B7DC92C99C7BBB7159468306FC551C419CA8A0A072C8ADC6624E230704AC2005F9C378908A1B64912A3397B7683873D70B3FA7F3011BA79639FE0D4BC18E0917CC999DFFCE56C8408B03632D6C221AE5F07291E48F1F018C7E06AF7BF949F0962F478BD7B716685A3698D06BACDF834E8F9AB3F23707AC8CF6F99B225853366F140F9DD5E93082600BCCCCF46B2EF7C764D081E12FE7D822B902F54DED9C5FE76345C4E2E3C0FDE968F9CDC5E7A48486DD83B431A34E24FC360BFB3416C38F1393584D51BA7ACD85BBEF257D290A40B156C089C6A48E2F7589DADBDC11225DBB01CE1D1CCC06250BDE3E8C39212626A0E40943E1A08F4886FFCD546F7F32E2AF86AFC56CA71B4F4AC22E0031B5FF5D9DBF0122E609E7E267AB3C04E79D6898334ACE0F91AC6CC0D4778D116AB7BA200EB4DC2078564803AD09669EB237249D5A87A5F7E5A1CF15974D15D0BAE3D5DB06767EDCABA0BAAA52E2202B7142DDE5F11D9FC969FCC10915EB159FD1FE22172E0D59D9DDA1C453A1909F78C3C38654FD38542AD422C9D863F2DB470D3DAB2606971B25ED7487F1DAB68FCAF52D7E6BC30503C -sk = DBACBA825728444921B227CDBA54446B3F6881B47BE9CD02832F78B023B1BEE0E15274A8E2BC08FE818B117BA28C5DFAE74D54FCDF6F20052F79BE333EDC8DDED341361D7317C5D77217C8122A4AB402607AA92125BAB18B13C592C954ED788DF1FB03F561C714E376E62F4A4ADB5D1D619222F965B1CEE2FC37F2AF1BEBFF35FFE88008AFC5129AC52855D786B64F1C9C7CC076D0A9151AEAF6A35B4817867C0C2B33CA4B4274CDAE1D1CF37C50520ACBE26BFF7986AEFCC8A14C193EA0473AEBC95B29CA3926A1D862ABBA6EBB52030FFEF7F8BEC751ECD4D14F417151821F822B7DC92C99C7BBB7159468306FC551C419CA8A0A072C8ADC6624E230704AC2005F9C378908A1B64912A3397B7683873D70B3FA7F3011BA79639FE0D4BC18E0917CC999DFFCE56C8408B03632D6C221AE5F07291E48F1F018C7E06AF7BF949F0962F478BD7B716685A3698D06BACDF834E8F9AB3F23707AC8CF6F99B225853366F140F9DD5E93082600BCCCCF46B2EF7C764D081E12FE7D822B902F54DED9C5FE76345C4E2E3C0FDE968F9CDC5E7A48486DD83B431A34E24FC360BFB3416C38F1393584D51BA7ACD85BBEF257D290A40B156C089C6A48E2F7589DADBDC11225DBB01CE1D1CCC06250BDE3E8C39212626A0E40943E1A08F4886FFCD546F7F32E2AF86AFC56CA71B4F4AC22E0031B5FF5D9DBF0122E609E7E267AB3C04E79D6898334ACE0F91AC6CC0D4778D116AB7BA200EB4DC2078564803AD09669EB237249D5A87A5F7E5A1CF15974D15D0BAE3D5DB06767EDCABA0BAAA52E2202B7142DDE5F11D9FC969FCC10915EB159FD1FE22172E0D59D9DDA1C453A1909F78C3C38654FD38542AD422C9D863F2DB470D3DAB2606971B25ED7487F1DAB68FCAF52D7E6BC30503C -ct = 02F957288B448D9CBE7FB4DEDABDEEF72E1CE4A68727723C06496C74A151D02DEC3EE07990C2E0B23E0E7326AD6C008CF4428F0B456E6492734D20A868D09F8A4039FE88B4534CCC19E05E5CD85AF9FB0D80A1AF05A52F0A8BAA9FE947159046E8310C4C1B98B6D98957D0A7C733CD3F97413C77D20100B5ABC306337AE061C691D10B3EB5DB0D39C3F954D7C5461B48E2765E2F0C9B3C15D3F95E4516F49CB2BFF237AFFEB3F2F09C02C91CC3D7B50BE2E98B2AF2C00EFCCA0FDB0F65FF4FA3E5BD3A3E82709720E7D08185ED5ADA93405E016C0779686CA6B6F60BEA313A5F78F451635AFC657D5FB4C16D249F82B56702E691D0A990BF904C31680B35D74F69033CF376F74A3FA3FDA4DF34FB6A63E94FB727BC01266AA025FF028A279037CE07B877D7BA00F26CFFC8378444DBB083FA481A7E231BF504A7221E3F6E71DEC37E1735090EE745B245845520F6639DB2BB8004FFB955CBCD0B3C2D4F100DE27DA0A8E85169B48ACD0D72E3294A9B8A4CC7F1BF400F196B632E64B2FCBB1DABD838536D500E3A8AD40E71030EBD46148F481B6898FC74321E7925F06A5700E76C62B30B381372B87ECD81035F6C36141D1F68F3117C047FE7626F32593164085F0C751AF353DEF425A8C5BA7EE828E289B53A887702E44A8D64B4306DF63B4906093B27DF461F16F08E5A76857161E89E9D7D55C04A6D3E6E984281F666B810DE2EF95D4E4D93CB51181F2D0BD606F12D49770B056417FA8B9A1F4672CC7C198F9F36B791CE71F8460D8FCE913B87FFF283476A5FD0A4870A7F2789FDF6DC25FF1F7159574F2D564CED41CED09DF544D70DEC11 -ss = A70CA9CADC09966C85907688FA6AECC1C0AE83FF905770A34FC6E2B3F8287AB3 - -count = 92 -seed = A28EAD0A08E7228AEFF602B16A1E752278B8ED1E91DAC67994F5ADC372E1D82F95CC390CD97AB9212275E0566C833FD8 -pk = CB7D596F44ACACA1BFC1AC93421A67874CCD1E863F2169B138EE62AB51873AD5C8A256795AE16111304799B409CAB0EDC00970A1AEBC6543E604E26B23839D8311FE4013406A5560DD535AAAEAB05825FABF62A953249BDD4FAC3696A10AE0B85AD81F8D3CC4E3047007BBFB1B4E2FFAC1D88B229A209324B811FC4EB340EEAD0B9C2650182495133207DA274C5B3B5316EF0E9BEC32030F49BCE0C08C545900FC0EE5AC684A35AB25B786D36F43C5098C16617C6EA701D96A1AB453287C9C9E979BC3225A75F90342092927F7FCB39D422B9C5444E5BB9B07DB3756245B5C9B082BA9B2746AC5B4E6D01778E3D7797AD780C051CFBF26F321683B706C11D7877DBC59CBB12FF2F3F1FC2896C8D82B5FA3031AE588605D886152E86C3F0FB0A59F1019401C1993A01CC1969E07B830EAD84D44E59FF1BDD5873A8511F59FA044F7294E329986B376F1FB85E9C201937D71702188A2F8A8881EFBCF8494D1BDDB1DCD26760BA5F1915013E764E48F1B15664E00B0CBBC7710F8495910FE6A220B660301131E4359E365CB84EF71A9390EF9268796895585FF5516926A655EBDDBCE4DC71B786180DA46604DBF7230B9564AC49E9C507D4363B77B668504AEA4234EF52A1FD412506B6E63A2539F14A801719ACC0736391796C5050BCF23957717131D35A3E47533283A165917B5071DE957B644750A8ED9C26EAE4A0C3394315B1FFB102294E305EC6103BE1BC6636FE1CD57CBC04F6AB80DD3059E8C6D366B6768A92811E79FF182513FC51330A5217AF11CAF19 -sk = 690EB71FD7052B906EAEC09937A8ED374E0B02AFA27C2F14399932BE5839FAD281C38C2CB5CFAFAC81B96A810AB749B61806B6D54C9F8CF4BF1BE0192423288F6A9E55D6AA936CAA943911DE027B9803CB7D596F44ACACA1BFC1AC93421A67874CCD1E863F2169B138EE62AB51873AD5C8A256795AE16111304799B409CAB0EDC00970A1AEBC6543E604E26B23839D8311FE4013406A5560DD535AAAEAB05825FABF62A953249BDD4FAC3696A10AE0B85AD81F8D3CC4E3047007BBFB1B4E2FFAC1D88B229A209324B811FC4EB340EEAD0B9C2650182495133207DA274C5B3B5316EF0E9BEC32030F49BCE0C08C545900FC0EE5AC684A35AB25B786D36F43C5098C16617C6EA701D96A1AB453287C9C9E979BC3225A75F90342092927F7FCB39D422B9C5444E5BB9B07DB3756245B5C9B082BA9B2746AC5B4E6D01778E3D7797AD780C051CFBF26F321683B706C11D7877DBC59CBB12FF2F3F1FC2896C8D82B5FA3031AE588605D886152E86C3F0FB0A59F1019401C1993A01CC1969E07B830EAD84D44E59FF1BDD5873A8511F59FA044F7294E329986B376F1FB85E9C201937D71702188A2F8A8881EFBCF8494D1BDDB1DCD26760BA5F1915013E764E48F1B15664E00B0CBBC7710F8495910FE6A220B660301131E4359E365CB84EF71A9390EF9268796895585FF5516926A655EBDDBCE4DC71B786180DA46604DBF7230B9564AC49E9C507D4363B77B668504AEA4234EF52A1FD412506B6E63A2539F14A801719ACC0736391796C5050BCF23957717131D35A3E47533283A165917B5071DE957B644750A8ED9C26EAE4A0C3394315B1FFB102294E305EC6103BE1BC6636FE1CD57CBC04F6AB80DD3059E8C6D366B6768A92811E79FF182513FC51330A5217AF11CAF19 -ct = 3CE525CA1195F98A8C21312FA7CE586758320A58B508D60EBB14DAA5649CEB3FB212D1A4EAD67ED3E8DFDCA2427A9316358B1D619E9C78E2903F4FC3D58873793710F7AA57EE6A2D713DD002443266408AD0CE0F4B9CCBB4C3516CD9DB3FD669B0C295005E169625C00F48BB1FEF51DC5DB9265D14C1120919CAEA27D6E89E817091D9EC155461D7ADB51AB89FB0E20310E9896AC4D4D0458E35CFDD8514D3DEE9C14DD7A80817AC4AD9F3CD29D93141847935AFB440CAB9EF754A693519B322C912DA9F70A05E45FAA8DB10CDBADA04C9A1265A1EE1943A33D8C977A7C34DB075DD1AA11A08C24E48ACCA899B4E19C62676E11C5538BE572502155B7BB7704195206192F32BD83BE8C71EA5FBDDDB7927AAD2EAB2CC541C403BF13B05AD7E07D6545177E2E6387A6B63FD24102F273F2A6D208BF6148BEDE6F17FE9F048489D39B9641408643EB9112CAA3CDF46B50EDAE0588CF5C71818048272766F922237B62C1358D7EF26ADCA5F44BD15C43F228E94F9786BDF2B6AFCBE339422C30D87D4CCA3E348E9C2167742282A147BB1DF00858398AB3096B3F52A2D4CA0AE5D33E8ADEDAA38C2ED00CCC1AFC17903DDB1EB664E4EDC19032A1FC02FF072FE285065541C5133A33DCFE013B7B3E4671555D22B2376044E6A56E82E519E22FB5E1B4D316DCA6A76870EBC3DB90095706B472CD17C67506489E861BBFACD0724EE4B71ABC91367D64FA4821F93AC8AE6A86E816A75459BB2DAE2E07C26422D1B6799968576765E28C1A269BDB57BD6FA52469C02A645F10DCD5FA285C03FDB119685459419989E7E485B1FAF57CA1483C885AE507BC0 -ss = FF6EBBCDD38D9A61610D7E3E450FC770AA2CE350F7DE4F6EC9838FA77FBD6B90 - -count = 93 -seed = 92877D706DAF88EF3412EB143DB8CD91BC047A9A43B7ACDAA42523560DEE4C172697BE4332042FCAB91135839BF74AB2 -pk = 4844E31EBCFEBE37F7373AA3B43800EECF64139FD37837DC008A9294CEEDCAA0DB3D5685E0FAA0FBC00F831ADCDE17361246E9B43B024BF5248EC3642CA9877C023795463C3A18150F78B9DEDA588450A61A72B6DA4A0EBF0BD8B51DB56FCC37C5D146C563319B60AB06359EA30AF2E5EEB6458FCEA150197B948181E34E7A45BCB560EAC289A4E83793F9529CD7EFAB360C48B6C10AABC01D586DA4256FB46B68D85673A013076A133E5D7EB381C5EA342053834B4FD0CE3514B65A7B8D930D04AFA7885FC3B31AB19D7B9B5D7443E96A307CC27CD68272F66AFC3D9C75B9137CF037101F7206FABA897FB64F924A75EBD392B83D2EDE47D558A39FEB68553C486404308B4C5E23ECC597DB7C9720663CB1FAC5EBD07D0A110C27908357670D6B80A5B873E57FC0DACED4478A168EF1AFD60DD48F31337523DDD7BAAE0A86C0DD85F3E07E31523F61774CA6C6228BB0E2604194E94CF9C27FFE8EDB82346A73E188B7C0E9EDCBD7DAF899172D071C07381587FAC49E8F5131BC94DD5121BE438344B65433A3CC2491D3E16759F3F17DB2688CFD6499AFB6C0C314B942617BEBEA9E2A524E902D1DEE1330D51056AF1B9ED656F400A6C0756FD5DFF56187261636AEFB5A8DE703A38D7DBD810385EE6F37E0ADC4BE2AD7F47278848D406BE2888ABEE8B1FF10D4F30DB42EFF29DAB08AA51FA4146A9F654A4D8D28C59E96343EA595927C115C4329064E80984071F8856D9610886522245C0F4B2C64C89389E8F5179D2C3BD66F08F46ED77A0DB5200A7EAD3F1F -sk = 32E0EA9089FA928482C0770DA545AF1BB871A03CE38604138B0D08EA2A10CA2BC06C5BEF7B6508409DAF847A64C8D30D0974FD3BA7476DC76C46B458A036D8844F53696845942EAA424C6F6CCC89B7014844E31EBCFEBE37F7373AA3B43800EECF64139FD37837DC008A9294CEEDCAA0DB3D5685E0FAA0FBC00F831ADCDE17361246E9B43B024BF5248EC3642CA9877C023795463C3A18150F78B9DEDA588450A61A72B6DA4A0EBF0BD8B51DB56FCC37C5D146C563319B60AB06359EA30AF2E5EEB6458FCEA150197B948181E34E7A45BCB560EAC289A4E83793F9529CD7EFAB360C48B6C10AABC01D586DA4256FB46B68D85673A013076A133E5D7EB381C5EA342053834B4FD0CE3514B65A7B8D930D04AFA7885FC3B31AB19D7B9B5D7443E96A307CC27CD68272F66AFC3D9C75B9137CF037101F7206FABA897FB64F924A75EBD392B83D2EDE47D558A39FEB68553C486404308B4C5E23ECC597DB7C9720663CB1FAC5EBD07D0A110C27908357670D6B80A5B873E57FC0DACED4478A168EF1AFD60DD48F31337523DDD7BAAE0A86C0DD85F3E07E31523F61774CA6C6228BB0E2604194E94CF9C27FFE8EDB82346A73E188B7C0E9EDCBD7DAF899172D071C07381587FAC49E8F5131BC94DD5121BE438344B65433A3CC2491D3E16759F3F17DB2688CFD6499AFB6C0C314B942617BEBEA9E2A524E902D1DEE1330D51056AF1B9ED656F400A6C0756FD5DFF56187261636AEFB5A8DE703A38D7DBD810385EE6F37E0ADC4BE2AD7F47278848D406BE2888ABEE8B1FF10D4F30DB42EFF29DAB08AA51FA4146A9F654A4D8D28C59E96343EA595927C115C4329064E80984071F8856D9610886522245C0F4B2C64C89389E8F5179D2C3BD66F08F46ED77A0DB5200A7EAD3F1F -ct = 51BD77ABD9D3DB71DE8E52323DF7252D4CEEC5DF926ACB40EA2092FAB125DF945685AC14BA5BD62994012E8EEA14A0C739DBC93E98D65D0B13A24CDA0D77474CEE19D281F532DA28F33808B001EC1076FE253CF8F009E6379217A471075EA1E44BA477724DAE6A4D2A60FB03D63B74ECF011FF827FFD2901B8DF86A6C45BCB28A0738C3BFAA8099D85B9CE4F8FBEC94F75C4C9D9969A75366787866C1A1970DBE379510203E72FDDC6F35C4BCC3AE4474964AEB0CCB4B870F79F6C25AB54064A413892BB7D32B8B162D97B1CE64E0EDCC1E0AAF06E4174E0C32242C8369D2DAFF7559E5795AD804E9EB8D83260073DE595039331B0DE0FA43B02BB9D45D3DF648622D9F645271C7F110E0754038C51D718491A230D77D8147208490CC655AFEDC9F6862A4A80F3B2134411EC3FC51210A09C605D330FDA76CC54C6DA9BA251E8BC13D4277063685F2A2BAC732AB1A890EB8A37AA29877356DCFD98297D8B208510C04C617BA0E57635996546508D06C5420560DAF0CFD06D5D137509FC0C127B5216B3388BD3E18893E660F33987BD7F692B1BB2D9ED78201511561D551BF39E368589D1810981686E33AC72953F9926B3D6F1950CE751F1DB2070E62CC3B441768651FD1C169D38612D5FE0AC267A7B7352BA42496DDD1B6FAA2DF33047C44E45769B81C83374CA139F727D64AE9D5A1F1D2F0136EC01E63D6CC73C340B83B8D08E3F05F2AF8FD7A5C755FDAE3455650AC0D5B35098B16B3516521BBCB9934ACB60267E430E34EB10D205877E09E3C1953ED13ADE9B6C7612E06BF5A161D2A26AC2678A9E3F1DDEC8E83B07A711127203175136 -ss = F5526D8ABC4C7F0DC7170F16D117E21B3028BA78B29B0C6B271092133B69C121 - -count = 94 -seed = BB4C0082CA4044B1FF60B036C9B0E0495D58667156786C530BC69D949A13BFAFF53798E456423D7A0E162A60039367D7 -pk = A3DDEAD7A0F983276C623A288A723B23499DDE4AD5087941C16394289A54E9B97D57BB411349300BD82740307298C002E7BE81987F4C6760F65B0A6AC71F11E13FB8904A735C14704219002F8A77DD0B648468023F522D90C5657F945D5DD64B1B21A02A9878EBB998BEFED4AFFD92E3B66FE8640331377B550AF4E6AB0B70719A68B6B3C0A69273062AED5BF6075F0C1FC6EAFC6041ACF70E77AEDEB518591B85024FD2AA38C19C23C5B8B9750F49D8E2B3BC466C2BA53CB75EB9601A08CB0BF19EB9916A6B8C127DFE04BAC02C614A632ABBF59A70071F5EF8EFA730D00024ED57A80122A879855B8BB4CDF6987ADE01C97651F1469309C486744B403BFEA087535184E155ED16B84A91F97E01C7B3333589F8312300BC7802266ABACFBDCE98C480598808AAED326E38CD4E5E5584ACFE7E901974CA782EFC28060594984D5FE7777481A223A872C633ADBBB53453981CE2B906A8D42199FC7AB5F018D5017F601A7FA9D13503B970F9A36589C4E2342F462EE81116530E8CF5DDE6B0AE404630E338FAD07CABC52993A796057984405075F4D657C39EE14013E7D37F24B572F16655BC693065E0B94862D94704509EDEA805ACCDC722C411F4EC9BABB8E696EC66C781DC4A9784D18560A557B18207C0D0452734FD6409B38BE52F4DDF1405B3A6B4696FDC89EC06F3332F0B806D824EDBAE51BEA386DC04BB6FD01FA46E3E79990D7F147D695A1656344FEF19C65E97296515AC2679C2820E8232F75048E453AE1A551E2E5800463899C0F6A4E459008C32 -sk = 6FB2EC719F2A0DEA152BF3F64B9D148F8AB8BA88F64E61F5DB53E12D59F525574F797C007E4061F95C7D56CFC7EE5C49E849DDE3FEA8F25E7876DF2A18515C349C03C3C45314774D82F5211B45FC6100A3DDEAD7A0F983276C623A288A723B23499DDE4AD5087941C16394289A54E9B97D57BB411349300BD82740307298C002E7BE81987F4C6760F65B0A6AC71F11E13FB8904A735C14704219002F8A77DD0B648468023F522D90C5657F945D5DD64B1B21A02A9878EBB998BEFED4AFFD92E3B66FE8640331377B550AF4E6AB0B70719A68B6B3C0A69273062AED5BF6075F0C1FC6EAFC6041ACF70E77AEDEB518591B85024FD2AA38C19C23C5B8B9750F49D8E2B3BC466C2BA53CB75EB9601A08CB0BF19EB9916A6B8C127DFE04BAC02C614A632ABBF59A70071F5EF8EFA730D00024ED57A80122A879855B8BB4CDF6987ADE01C97651F1469309C486744B403BFEA087535184E155ED16B84A91F97E01C7B3333589F8312300BC7802266ABACFBDCE98C480598808AAED326E38CD4E5E5584ACFE7E901974CA782EFC28060594984D5FE7777481A223A872C633ADBBB53453981CE2B906A8D42199FC7AB5F018D5017F601A7FA9D13503B970F9A36589C4E2342F462EE81116530E8CF5DDE6B0AE404630E338FAD07CABC52993A796057984405075F4D657C39EE14013E7D37F24B572F16655BC693065E0B94862D94704509EDEA805ACCDC722C411F4EC9BABB8E696EC66C781DC4A9784D18560A557B18207C0D0452734FD6409B38BE52F4DDF1405B3A6B4696FDC89EC06F3332F0B806D824EDBAE51BEA386DC04BB6FD01FA46E3E79990D7F147D695A1656344FEF19C65E97296515AC2679C2820E8232F75048E453AE1A551E2E5800463899C0F6A4E459008C32 -ct = 9F9FF21B5DC5F2367CCF107A40C5C06B0F3CC5CBE272BB107AD8DDA2FB8F410960C06380850F0E3B797825A72690D3108B77F281375A521C9AC2D900945789552544A4CE3FD221BBD7DA719670094A6C948918808BCEFB7483F9E3B14C126228A0E93C94C4A2CE1DF802CEA112F58FEF1552B578FA5EA7596DCD9D1874D8F8BFEA56BA1E093557B99CAB7AD52880D8DA5CEFC1CA44F2353B8B8EB061414BCE2886E315A99FB33063DBBE8200B4ECA68007146BE77B1C6D0C530D6B1648B7EBB263FFA729F9924C6E53DD84FD7702C7F64ED8EA6E6E212938F992A19C3221C4BE9E1B69FB0E1E71BCEAFD97D26911F95D8BC1422E570847B9F0A1A8968A8903B1689A3B1EFED1510BE6B4D5541A04E71734395B7855022D1B5F16113204788C0626789FA62673E8F01057A3E4B6A154E4EA8C768207109C8D1E3F05D7DCBDF0551B39BBFC71627412F9CDF0F8CAF9F17F92F553A378CFEE99CD7C672CB34C25FC9DC76B640AA8FAFA242F745517161A6C58703DBB21DE7A0C5BFC81976AA03B0FEF21A80FE3780278F00B88D6437FDE5013C8A1B68178BEA30EB0B8AAE374A91194ED388F367620D7FC873608CC0E52213AB27934BD7EFD308BA8846BB14D428131780D861FD293FA0836B7C915E72651F03B2008BE23383E9E3D8C505B5E2EC9ABEDB3634B100669E0790DE983760FC12DF64D20DA636321409DEB396A40FECAF2CE0A338C56F67E6B0BB51DF3284AC0249286D241CCA548BEA13FE924FC81F298B3856F83872EE8D0D078772DAEC795DA6D4F6F2175B90C66FD46B147BAD8FFE74B1E2CCC547E1C605BECE0D4C77FAE6D1297CF -ss = D7F0A7517BD8A4A25AECCAF23FEDE668DB53DB84A6CC09BC6FBB57F88C466A72 - -count = 95 -seed = 121D90E70AF6204445D0DEB28AC0C108262719E9FD3476ACA74BBFDE89FAF04D8D5F89A624E8A75DB80431F0D10AD28F -pk = 50FC5B70312F2FB129B1C13B76AC9791AA9631AE5EEDF9C98E38048ECB6168C67329ED29C2E340B87EB66D788B1ED1ED1E6F472510D712C7ED05852FB91AC3F47D3CE481F8840681E547021FB340DD4C54EB4ECE55920042433CD0E2414C47DE72C46FCFF8C7E000C45FBD515AEE02371F9467F6619761D2D5DDF32109EEA0CF5E8DF1112804FDB29A8369C316FC7C5934D005AC9CBB328FBF538C13110B71F5AB8B09789AFCEF40D81539BACC5062CB9AA3B2C262E21649ADF72351512C0F2E66098465322B7D82DBC89DEC68263939D72B09CB3366FF66111593630930F9049DE1DE0AD52CEF907EEE36B8DEA0F8DDBB9D9A7E642416A6970DBF62E8FB19B7D50EF8D61645A5374BCC796D6BB4D9710A762797BCA2404DD7304A3E396AAC9F6F281B5F136B68205E802A34DE7BC6F8AD637FCABE8E10550301F03C538D795627E4A73ADB77B244D038F71B38B21AE90F5F6877538A32005E3E894E51B0998A64E4C4A870C892100AF3CABC5898949B13B1C256572BDC35B7623F8204EF950BCAD9DFEFFCF0CF9FCEB38149DBB1C9772E7669279038DBACCE5EF5B642E6F2307D84E62E35805FCFEF2EB0A2C45E69306E63F73A9DCBEDDCCCFE95C2909611EA2535B98D39844D632B95A90DEC9EDBBF9A27886A1A4C8116C6A4D7C90E96B085DABCDB169950E0E5A275135F562E92B67C981F3ED0B3E7DA0E3B283D99EDFCB9A9B9AB9590BA3B253BDB4F8D80BAE986C4814641E6E6D5B08C1EC5DBA1D67F6753C8D74C8512D7344090937DE2E6114417AF9D36 -sk = 527FB88C8BD9A4D6031DAD15E63878ABD2B559E7E08D61F69E8E78FCA964EE6AE32D432B4F9F751BDE0496C580A181FFED762AA35454A02D3F1F47EE0394C89C239FAA654A488E65167123A0737F080050FC5B70312F2FB129B1C13B76AC9791AA9631AE5EEDF9C98E38048ECB6168C67329ED29C2E340B87EB66D788B1ED1ED1E6F472510D712C7ED05852FB91AC3F47D3CE481F8840681E547021FB340DD4C54EB4ECE55920042433CD0E2414C47DE72C46FCFF8C7E000C45FBD515AEE02371F9467F6619761D2D5DDF32109EEA0CF5E8DF1112804FDB29A8369C316FC7C5934D005AC9CBB328FBF538C13110B71F5AB8B09789AFCEF40D81539BACC5062CB9AA3B2C262E21649ADF72351512C0F2E66098465322B7D82DBC89DEC68263939D72B09CB3366FF66111593630930F9049DE1DE0AD52CEF907EEE36B8DEA0F8DDBB9D9A7E642416A6970DBF62E8FB19B7D50EF8D61645A5374BCC796D6BB4D9710A762797BCA2404DD7304A3E396AAC9F6F281B5F136B68205E802A34DE7BC6F8AD637FCABE8E10550301F03C538D795627E4A73ADB77B244D038F71B38B21AE90F5F6877538A32005E3E894E51B0998A64E4C4A870C892100AF3CABC5898949B13B1C256572BDC35B7623F8204EF950BCAD9DFEFFCF0CF9FCEB38149DBB1C9772E7669279038DBACCE5EF5B642E6F2307D84E62E35805FCFEF2EB0A2C45E69306E63F73A9DCBEDDCCCFE95C2909611EA2535B98D39844D632B95A90DEC9EDBBF9A27886A1A4C8116C6A4D7C90E96B085DABCDB169950E0E5A275135F562E92B67C981F3ED0B3E7DA0E3B283D99EDFCB9A9B9AB9590BA3B253BDB4F8D80BAE986C4814641E6E6D5B08C1EC5DBA1D67F6753C8D74C8512D7344090937DE2E6114417AF9D36 -ct = F0278F9EF5B8F9F6F1420253214F91146FA49B552E0A7DF1BBFFE4E7BDBCDA42B4A3068ABB78CCA18E0BC61DE88E031328ECDE797EB412CA5CD368386A21E789316BADD24A8FA447C95B93B9AA6A9F7427DE3A876E3A04D06FA41A6AF2506CE369573D1CDB06CDBD8766F5DA7C02D6193DDA18F2D6DF6CA90058BB9AD102B8920121D0498C74F7CD1B919FC13402ADD606B16D390128336A7AF30CC63E720C0F3F4AB369A0930893184405833B14121CFC0690B3B964D88A62146A2BEBF5F5F3A3A38B7FE2E07A01014D7C57FFE0DDFEF0C152FBC3E10E2E105A28390E93B398C3AC8C79490FF2801529AAA483414FEC8EB28D999428D48A45CC5CF6AFBAE2759D9701986A644BDE7B5FF5AF69ABB80D7404A4008168E966EA02DFEFB7DF1066D4CFDEA4770291A9B4341F0CA346816A703EAF6125BB463ECA61CD73F9E65B20AD18A5129F4695EE00A6883406AFC625C66D72285B8D5AD153D427877DB56864D3786B54C23919AEF60F018D339E63A7C87ADD8CA1639D3320236D3093917269163E2F027025AA01DE59657BC397956122987FEE1B9DA3B94D1210E2CA7F845DCE3F0B0D2730B68D712C5FB2CEB660D8B9D2CD68C9EA5B2BDD7579B26625420801CB027E4C646BA8B4094E5800435B89E0B217DE85500BCC40D503CEBD0752A063CB48AB55371A5D1334EEA93CAA1182D676F2C523AF2E9A259611989AC2BD48162F10A3E313E4B12D8DFC375FBE30C5F77BE65E876965850FF96F32BE1802A4A1D82E97FE8AFDB53EE50229618BC13A4E63894BE22FC545BBDA4059FE6675BA76702DEF3993E94E8BE9048E4030C619166D7A8A -ss = 1CE301DB31CAF217E8F86F2C4DE763B97AEB7A2D72064CB63A5569E5C713D54B - -count = 96 -seed = B3AC6503206ACCC2A92CBC210D020A2654726911D11CE676AA04FEAA08AF1D20C654E4105883AE470EC3AB299075D420 -pk = FC37F83331A63916EC11797513CA32F0A6549012F07BEE7162C4A06352885C0F8A56F74745CCCE89E027C8466DEA7EDB747D8EF60FDFB90EAECBBDCF41D14EF9EA8C70FE436A85126735DC0277E0EC30E84D1844D930BA32BEB3EAA9122E327B5AEF76F277DC00AD148DE1072C6FD51F7CB68589893E97257390FD78FA65502A7F47C952DFFA97CA51B8406DD949C94EB133154A6029CCCBB3966F8271F61B06CAF6A446C66EB872503111AFCCCD966BDDE520E4B537619399FB2C10208936A201C0084341A2E505F0712BAB7683EB9A0E521A8F34BD16C2B11A5C0E12A5B49E038059E14A573B032E923E46C8A667845821F4B7AB1124C441FDE54F7F85B9E7322B3BD9590D09820E9670B94304330D6AFC31C70D35525A8E6BA0238376B04A2F245FB1D02A3A7DFAC6280706E049DA5ABF9F8C07ED31E5DBC9AB4C38D6954C206361722E63D2EC91DE02C3BE2454D36E214F3068F4C37172528EC610E7D5DCF6092456E289BC924CCB6ED489B45964E0F03524CE97F315B41BBFDB1F0916EF321C84D8AF4A9CEB6B5CD0D9369A616B12678FCBA937F805D06AEA6F46C6C7EE51068DBEF43D4CA27D3C68C514307898F5A20E509E8898F803384B5E11B99B8944BD1CD14154A02A4DFA89F7663ABF612B8E0DFADF2BF1ABF09F761620D73B079AF8C83772A675325640849341B389A0AEE65FAA87FE883759C50AF8699347CB0B6D9C69F82247FDD0EE2F5FF08D9309BBB8CDFEBD255AFE6866AF77D21C98B942370DE12462886C95271FF18CF274398329D022 -sk = AC6FCFAEEEF795B6EF9E062F02BF42975FA01E7D91BA832F74E05269A72684D05AEDA108EA4D6C6BC0FB958286850422BC357CA67B83C986048E0D0087FA11EC67FDC3F209B930E1FEF9E3B9A0778802FC37F83331A63916EC11797513CA32F0A6549012F07BEE7162C4A06352885C0F8A56F74745CCCE89E027C8466DEA7EDB747D8EF60FDFB90EAECBBDCF41D14EF9EA8C70FE436A85126735DC0277E0EC30E84D1844D930BA32BEB3EAA9122E327B5AEF76F277DC00AD148DE1072C6FD51F7CB68589893E97257390FD78FA65502A7F47C952DFFA97CA51B8406DD949C94EB133154A6029CCCBB3966F8271F61B06CAF6A446C66EB872503111AFCCCD966BDDE520E4B537619399FB2C10208936A201C0084341A2E505F0712BAB7683EB9A0E521A8F34BD16C2B11A5C0E12A5B49E038059E14A573B032E923E46C8A667845821F4B7AB1124C441FDE54F7F85B9E7322B3BD9590D09820E9670B94304330D6AFC31C70D35525A8E6BA0238376B04A2F245FB1D02A3A7DFAC6280706E049DA5ABF9F8C07ED31E5DBC9AB4C38D6954C206361722E63D2EC91DE02C3BE2454D36E214F3068F4C37172528EC610E7D5DCF6092456E289BC924CCB6ED489B45964E0F03524CE97F315B41BBFDB1F0916EF321C84D8AF4A9CEB6B5CD0D9369A616B12678FCBA937F805D06AEA6F46C6C7EE51068DBEF43D4CA27D3C68C514307898F5A20E509E8898F803384B5E11B99B8944BD1CD14154A02A4DFA89F7663ABF612B8E0DFADF2BF1ABF09F761620D73B079AF8C83772A675325640849341B389A0AEE65FAA87FE883759C50AF8699347CB0B6D9C69F82247FDD0EE2F5FF08D9309BBB8CDFEBD255AFE6866AF77D21C98B942370DE12462886C95271FF18CF274398329D022 -ct = 121855DCA45A42006F934DE3E00D481373DEF60AC619166CC412777D7770CE1BF93B40C65B78C5470DCE4988DA3437839F5C550E7E04E90870C207BF1D2A4F681ABA1111CED2A3879B4E6B7CFC287625C585772DA5070DEC1192BFAD740D5B41E9C3379297D0BA852CBF06F93D8B664725900D5D1C29094D2750CAD10176B9316D5A979B60E6134EF31E9A8FA0AE1C0A71F0A8941D336ED3FD7422A26E981304FB71054663386AA8E71F1947C94087D6B8721F415198C03F8BAA0F6B65E7325CCE9CD6C8B95F8E5C2EA9521459D7448C6B9135BA06F62D06AF96189C0375DD03CAE6C71236A187573D8CAF453BF79C9718B3362F2BA5FE60EF9EA71F9940BF743E61041A1BEDC4A70C95B0F9A1C2E485D39C6E5C9D29F8B3892E32F2B7E2A23217645BCE131E8E5A38F5EF408CE3FE700AFDC99BF2823AD8B721CFB98BDC27096123EB2F1D82D75170B507FDCE783D1B03A153F83FFE0A6CBB6D542AD605E55E6764AF07EE249DD8CC760B4EE8D9EDCC6E9F0C9A701B5A207E1288597A78016F116F646564000B39291DE681DFE37C0CBD95628609AFCD3051F0114103E50341AA9AF9BBDC3171AB91966993D5B726AE81502D6FA0B101ECF2D4EA502325DFCEA3D80FCFA1AF2A39EF3D3C8946FB2ACE99C2731F252C9D07FCB75AB2381EFAF1AEA83A2C8AE3C70A55906C25C21F8A0E7D5128864721306F47F85BBE1DF83DB03BABF31B78DC50DA42FE60BD238D7815299198501FA6C67C865D4CC6D0164CAC1D245BAC2B165215777AF85832C8788252BDCE4A6B3FE2B7AD346F1149388CF9412174EE1700913C36DC7BB11DEF0112952D3D0C -ss = 6D33FE9327795188EF4404E03A913F58918AE8A29C34B28C9124B4689E2E63A7 - -count = 97 -seed = 59EFF60B1EF6185DB34EE1E3B1DD2F159106CECEAA79BEB74923B4F5623D5BC52DBF5D2594A1F7C6C64D12CF144E9ED4 -pk = A38493B1BE7FDC1D69AF4013CFBA79F738EBD22A075F2D405DA8054B47912801111D72959C169E66D88431976569119869FAE3015EA79B3AEB1895BE5CA69FB6E87E4074EEBDD646C3EE6C860F12B57D09FC16F895F976672D7A7F58FA52E4538A492694B46A1F6ECA4519F9348F21196A5C132581ACE888323341E83EA44599FDF05B2998799B96CEEC04441A5786E7BC6352B7A0AF9078D9901091AD5DEF1617A74A080BCD9CF5194FFEC0C5E5AE7414AFF8B6D15554FA649CCC508CE7FF1BC088948B38FBCF59E8FAEEE324D974EFEC182CF912DFCD07BC406806EB7532DDB547A159CF2E86E1178DDBD3D6457B35B7F580ED518EFBA5F51F9E132A27BA7D6651FB24526DB86601ADB5E3A05105D320DC8671A1C5E0A0BD686B348520D96EA0DAC511FEDFA9AEB35E83508EE03F8E4A411CB57C515A0C84EC764347DCF683DFEA55063C7671E0D078BFF5012BC9701547441D2DE82658A6A41389EB175FC144EDF58F7564806D4546A2B5E4EDB565893E83198501E1272B3CCA57783FEEE4AB54C5BFBB21A8265577C119793037A4170D8863597291AE649DD2B8702FA09AFEFF9B610BDC9E9481E7203D0F8D4BDFA1155A6F0D8B03FEAAAF5DE170B9A0C78F7F0375D189D6CC8C54CEA71203A02715F330C6F40836E2994D875B73E13F440D9D19B7F5F06AF1C43C32A00BAB865169D6BCBA3F0F765E496DCB29D965DBC93FADA33C92C7FF49D7E5FB01D8B590F451C2D48252350C44A826AE64DA76A0624DFD6F73F15DF28C47B5E5B280A584A0E376A444 -sk = BA2FB9318D4DBE7488057C33E95E6F054583A2800C41BB83083C330A914A12CFE63F8FFDA3565C2424C89B20974B748A65A5ABA75133FCB3156DFB6626A83BABDA6C8966F6CDEA65916F5EB3C99F9E00A38493B1BE7FDC1D69AF4013CFBA79F738EBD22A075F2D405DA8054B47912801111D72959C169E66D88431976569119869FAE3015EA79B3AEB1895BE5CA69FB6E87E4074EEBDD646C3EE6C860F12B57D09FC16F895F976672D7A7F58FA52E4538A492694B46A1F6ECA4519F9348F21196A5C132581ACE888323341E83EA44599FDF05B2998799B96CEEC04441A5786E7BC6352B7A0AF9078D9901091AD5DEF1617A74A080BCD9CF5194FFEC0C5E5AE7414AFF8B6D15554FA649CCC508CE7FF1BC088948B38FBCF59E8FAEEE324D974EFEC182CF912DFCD07BC406806EB7532DDB547A159CF2E86E1178DDBD3D6457B35B7F580ED518EFBA5F51F9E132A27BA7D6651FB24526DB86601ADB5E3A05105D320DC8671A1C5E0A0BD686B348520D96EA0DAC511FEDFA9AEB35E83508EE03F8E4A411CB57C515A0C84EC764347DCF683DFEA55063C7671E0D078BFF5012BC9701547441D2DE82658A6A41389EB175FC144EDF58F7564806D4546A2B5E4EDB565893E83198501E1272B3CCA57783FEEE4AB54C5BFBB21A8265577C119793037A4170D8863597291AE649DD2B8702FA09AFEFF9B610BDC9E9481E7203D0F8D4BDFA1155A6F0D8B03FEAAAF5DE170B9A0C78F7F0375D189D6CC8C54CEA71203A02715F330C6F40836E2994D875B73E13F440D9D19B7F5F06AF1C43C32A00BAB865169D6BCBA3F0F765E496DCB29D965DBC93FADA33C92C7FF49D7E5FB01D8B590F451C2D48252350C44A826AE64DA76A0624DFD6F73F15DF28C47B5E5B280A584A0E376A444 -ct = F5B0D6E539CD53780DF720072105030BA5EFC6762D2AB2DE874E9B0A414E3DA8C6D621631802117225169E40E54285223B360E55B9CC49C3285701A81F974D300FECEC701DECE4DE87BEAADB39717D1011D5FDD4100BED6C601F43E816515A9D91FBFF90FD1BDAB7E1BA4007C699C1EF1F79EA9392116B33523050783693456871EC8CB10A4C25A594900C031E61273ABDB1C3AA4A98360135B6FBE601928B8C85354002A3ADF7CF74913B0F2E1AAD80D6D850BE893271EE147A6C4774ABE747112F93D0D79DDDA9BDE940C61230452C3A82D6E379CADC87273127E540444CCB3A43EAD1F6E90BD8B6B6B0BD8BB71EE274B91A2F3A444B16134D64D45B9E56816A94369CB07156E71D6937EE8D196A29CA77B1ECDBCBF2C4DD681D0E7E8D9E3586385D1A7461708C0FB5490514D4B88812392D48B86A1B6711C8A5AF16BC18E51FAD7F191459F0FB81A5C1A2C59C57F7CA3E0C813D490EA2DDB3675A0949E34F9F400A736C7322099628CAC796646CDD64A50369128B4906B09F907B341594F51A8A910B5B7515E745FB81926E34697415F9A91904A7705B6C7DE14C5521FEF39CDB5783DBA07BE1217ADED977C7E20CB83871F823D7E9058A5A98E78917EA6C1B5EECDC9F5ED4675FFF48E404AEC1468D54A90686237657FC04B0821E3BACDBC0A71F504EFEBB3564C435B4E04BEA19529C915DAF5134F143F901E499B02CB1EDB24B51FD7D5640F555C3452832593EB2FA6FD52E625B4738BBC3EF1CFECF8AF67255905789BC2BDE252D3E5CAB16130943781CBF82C3DDCF0BB733AB18CEF1214844CE0F7BCDEA9FF74E23E82FC50C62E0AE30 -ss = 864742A6F00FCB874217B6159D2090F8C7F45092337EEB3D9185C72429CDD5F5 - -count = 98 -seed = DDDCA9DC31BEA737D3F474E7560B37FACB2F53C803E768FFAADE7669FF94B1D4FBD17068CFFD5DFDD24AADADA4EF6B12 -pk = 89F9A4D500A4ED8541D5DFC8E380F56DF3A404BA93FAAC39A1DDC82E5C76BB8381623BAEFF4DC1C005ED6E7E8AC8A7E3A281C75A015EE3DA6D4A26C9F7747D2F824F03862308AD5DDBF0852835572C1CA4943C9C0E599417905AE2DACD1165C91981526C8AEE0B43297FC6636BBD854D9594D9B58B134B9FCA366C112B19D226937B809C90776011434F56F2CB99611577D3C137A1D6FAC294DA0223E06A32A59921F91B836EDA78793427889AE27435D050EAB7E0C83B2700AA2004DA694B93EDF279978E575FA2A044B53CFD4BC2A4437849099B305AFCF17CB23999E7FE61FB0010E4DFC51EE28B8D9EEA12195443713DD218E367D8DD7D6A366466B175130BD911992638A283B7318F2F4CFDCF328254B747C1CBF8BDC641BD9B158BA9C308BEEA1D37D62CAB0DB351E025DD467CBB205CEB3C7C179C10E0CBB11BEA1963292BD000D53035180F137EC586BFCE4E508AD9E5AE50714E8099688D227A85C4ABDF895281C8405F02B14D8014C50E1E4C3B3F5409144612A3CCC7AAC2BEDC7D1119B0B488665171AFD7EBC5A088B3C100E052413DAC7E5974C128FAFA50AFE4579355C605BDAADADB7F611B120A4C19BC6364FD3BB8C7893182F5DAAA599C3EF65577A05D3600A03C104FC838CEA7E0A7C4559D7A5156CDF74E5EA0046115F4FF31FBA21F9C2DB13DA08256DFE85DB1DE35C4A2863D9A42523AABA8E1A7FD7C2BE3B43041E2AB2EB5A68B402F4FAD50F3EFCE132ED9C6E824B0F9A869155DC7C4DAE275BDCC4B29D03DEC2F5356588E7D78504C -sk = AA6DD1E5799CDF7AF9C4FC632B3EB9D51D66E85C8E0A21EC98664FC51AB63C7DFDA268813EFAB5204EFA60F78BF81D320D01AC09AC06244F7AFBD2D80FD356D9B7FD18E7550346EDFB273F1506762A0389F9A4D500A4ED8541D5DFC8E380F56DF3A404BA93FAAC39A1DDC82E5C76BB8381623BAEFF4DC1C005ED6E7E8AC8A7E3A281C75A015EE3DA6D4A26C9F7747D2F824F03862308AD5DDBF0852835572C1CA4943C9C0E599417905AE2DACD1165C91981526C8AEE0B43297FC6636BBD854D9594D9B58B134B9FCA366C112B19D226937B809C90776011434F56F2CB99611577D3C137A1D6FAC294DA0223E06A32A59921F91B836EDA78793427889AE27435D050EAB7E0C83B2700AA2004DA694B93EDF279978E575FA2A044B53CFD4BC2A4437849099B305AFCF17CB23999E7FE61FB0010E4DFC51EE28B8D9EEA12195443713DD218E367D8DD7D6A366466B175130BD911992638A283B7318F2F4CFDCF328254B747C1CBF8BDC641BD9B158BA9C308BEEA1D37D62CAB0DB351E025DD467CBB205CEB3C7C179C10E0CBB11BEA1963292BD000D53035180F137EC586BFCE4E508AD9E5AE50714E8099688D227A85C4ABDF895281C8405F02B14D8014C50E1E4C3B3F5409144612A3CCC7AAC2BEDC7D1119B0B488665171AFD7EBC5A088B3C100E052413DAC7E5974C128FAFA50AFE4579355C605BDAADADB7F611B120A4C19BC6364FD3BB8C7893182F5DAAA599C3EF65577A05D3600A03C104FC838CEA7E0A7C4559D7A5156CDF74E5EA0046115F4FF31FBA21F9C2DB13DA08256DFE85DB1DE35C4A2863D9A42523AABA8E1A7FD7C2BE3B43041E2AB2EB5A68B402F4FAD50F3EFCE132ED9C6E824B0F9A869155DC7C4DAE275BDCC4B29D03DEC2F5356588E7D78504C -ct = 7BFA487B6FE9E6788E49F1984E5DADFFEB82B61DA68AE74B66CC3F0B53AFB306936BD124966FFF9EFD8C61915AD84DEFFF7F3200D8AA5D6A03299814FD2D6FE7C2FDC97B104C89A44A7FA09C04A3B29126131A402AADA5EEE44D293F40189301A5F4DFB32C0CDF3E72334ADB5BEF76A7A4C63007E3CEA3A5BFC0BE6BDD53F936BAF8FD65F0BBBA033CA02C9D51696343FD4EE82C1DE1743E14F82BB25E2F958BC308B6A4C515624D6093A875627A3A315EFB18E652BEF26668092E374FA728B2C7C4883E10668BC7C860CD08449C4AFD4632B5AA8BBB10E04961918154B2314F38378497299338F15157469150FF94EBC402C4B965A874F624A7158317618CF7B5697BDA8ADEDDE9D6BEF9539A06836A280F6904D400CCD58A3418606CA972F98F596B8A20CC3C00AB088B8BD091E382AF7DFC1369EBEECB4DB7A5A180247905CD5E3F928816D4F4C380577943F0EDC72892248958DF2D1CA6090BCC2BE68CCE8D1BB78BC25A2815573C98E652767C3BCE3CE4587D24B16BC8C60A96002DB06596748586BC819E00CA352B42D6C888FBA87359670D8013A9BC85249C4BDE327C3F80A3CFCC08772506843434C000A70A99015D9A25FED454F08D30649F9424C8A58A695D11A94C63FBEB36B08DE07B8BC35FAD81C71485F377E70F741401FB5766889ADFB9D32FA9CCFFDF20C413F978F5DF6B8B9C69299ED7A10FD9DB2AB1FA891E668647720FE4D2CA9D167724842D53B6587951624DFDA3940B7515A2F17A7D153AC72C355FB1AA7F8E6E577B5EBA4C3F4A5F2A8F887690E75B0897B50AC2340827590BBC7EA13AECFE62C2C08C12DB5F237A -ss = 5CA7F1A531AA82BBF918A7C07F7F155D83E94EFBF4ED58EE7C0E89ED6C80F2C0 - -count = 99 -seed = 2A6F7386B815366F572AEB6C79E272CC21B7095FE09575F18072C9D677DA23BC9C8A4BC393B7524604D299BEDD260C8B -pk = EBAA29717EAAD6E420FE6D421DC5280A5EA3508170512C0AAD4031CC83D246FDA49AE5DE2E07323AB710FF7BF47BD9C1BDBC5E4D7C94B6739239B9015FD16020AB8384C2C942A0D17B215E95FD9C950B2B7FB65435E1ADD129F9429C7A286E3FD8185342D2AE2158B41C5B0CAFD9A690146F92831C9513961A722852E27722FC8DDD83A1E2AF83712E6467496AD1EB79530BD1C80E1307DBD588685C8958E619937EB5FC5DBDEF739476E4BC05C14FDCFF57A94304071138983A810194E4D2842CBB7615AA4A218E1FA13BFC9D96A73EFDF575410B5A95915DA9D5C4C60BFDFA5B0B027C256454FC4443E090E78B55698A23F8FF1719BEE5A6EB743B3F44D6616B2D89B585DF0FBBAEBAC66D5D360D0C35DBC5406C2386CD9E315DAECA8225B72FA4285D8E3FB28A98A04E1020B8283CFF3C1B68140D335511008EB356E29EC385B371EEF97F8DD4EA31F6CEE7739F8A52E32E5DC6BFA21D98A16BA339831DD85F6C7BD8285B9327FC076E5F1807CD8650D2B038EFE10F066BDE2E4A2A4F923F5DB975EE9C004DFEFBA1185B56C8E3CE45C89DC0178F111823D61CC5DEB69450B9B2B67B84EA05BA7D203A6894AD69BA3B967143B9CEF16786338ABFBA5EC3BAF87EFF76FA3BEA43E48BF22586D1F29378C15917A94E00789093444377566F50CF25E814291BB2DBE132FEDEAADD2DB16F9A8006BF755840613B805238645DBBB1C3F342FA31EC2F7F9821EEA1BC4D41202BCFF2183196002D3793315A6A1510157070149DF48AEF83E290040F8D9AE49EC31F03 -sk = 195D6C86A3DF4C21E3007D7F2768B43C74CB3060E0ECA77F0A5D3271542B9A84AE77E0F9F21EABD8C0C6EEA7767F4E10FDE5C2D79B8400BF96B19014B457EC21CB84E70A7F05DEE947808468042CE102EBAA29717EAAD6E420FE6D421DC5280A5EA3508170512C0AAD4031CC83D246FDA49AE5DE2E07323AB710FF7BF47BD9C1BDBC5E4D7C94B6739239B9015FD16020AB8384C2C942A0D17B215E95FD9C950B2B7FB65435E1ADD129F9429C7A286E3FD8185342D2AE2158B41C5B0CAFD9A690146F92831C9513961A722852E27722FC8DDD83A1E2AF83712E6467496AD1EB79530BD1C80E1307DBD588685C8958E619937EB5FC5DBDEF739476E4BC05C14FDCFF57A94304071138983A810194E4D2842CBB7615AA4A218E1FA13BFC9D96A73EFDF575410B5A95915DA9D5C4C60BFDFA5B0B027C256454FC4443E090E78B55698A23F8FF1719BEE5A6EB743B3F44D6616B2D89B585DF0FBBAEBAC66D5D360D0C35DBC5406C2386CD9E315DAECA8225B72FA4285D8E3FB28A98A04E1020B8283CFF3C1B68140D335511008EB356E29EC385B371EEF97F8DD4EA31F6CEE7739F8A52E32E5DC6BFA21D98A16BA339831DD85F6C7BD8285B9327FC076E5F1807CD8650D2B038EFE10F066BDE2E4A2A4F923F5DB975EE9C004DFEFBA1185B56C8E3CE45C89DC0178F111823D61CC5DEB69450B9B2B67B84EA05BA7D203A6894AD69BA3B967143B9CEF16786338ABFBA5EC3BAF87EFF76FA3BEA43E48BF22586D1F29378C15917A94E00789093444377566F50CF25E814291BB2DBE132FEDEAADD2DB16F9A8006BF755840613B805238645DBBB1C3F342FA31EC2F7F9821EEA1BC4D41202BCFF2183196002D3793315A6A1510157070149DF48AEF83E290040F8D9AE49EC31F03 -ct = BB9AD34AE1A18B4DB7C95D6C3731576C20D613A40D49081FA42F8C7FC42A6392608DA514AAAD5A6FAD4D5757F88EB8F2C29391D09F1080D181347F2624861F41BD0CA1723A389124A51023F65D3D61B358EDD73626A2685E48010381AA3E333AC2454BA71255DAD0939CFDCC83C22BB0E75FDC27C0CE34B1D3660AF8FBFD658703FCA2361E7A1BA6246BC86B9A01C9EAC6F1F0841BA80318392412CB79A98062B8F6FC69F4EBA2C255406DC3FDC98D2F19989D5CA4FF368D784075262F9C6BC82D3D9EC0DFDF85625A3668D26107A0286899A7DF0A900BB994A22CB3A0799CACD5799FCB57AA1265B38DB0DDA5B6E534F4A1484DD8ED6E470DDBD0C124067A28C0BCED38D03A417FA5D93BEE3633EE086E31247975CE68A7BB49C5EC5F4BD399F5C846E3DE49694190B0F6AA64D75971B41F6E90EA738EF15409813FFA666B878E4E1C503287B6F9E5BC5D3566AAF532EA1145AD44E8C5DE3263121F06262666F357452D1B236DED751971DEBE588022CF92981424E108050A6611B8D1FDBC1CBAB5E90AE4865B35D05424A3059E8BB25A13A32FF5A847C700D640DAF47F1B7FC577D6E188A39FBA43661F2586A0CFC80C95DC7D2563FF298F833911D771E09B521465A06CBD45A336190D8A0FB27A8018C2C549DE45B5E361899E6133FC5863BC404EEA67ABCB285044BD6BE2128CDE3F53B7FD5FD0646D5CD82A03F763A98EAE9AA585D9DF8A6CBCD3F70AA2A734256BB659578110DE135CF18523FB0E5A6BFBCE80D6D854B25E1CA4CFEEDAFB74AD4FDEDD348DCE502CB0241D44EE4D6CB56B694BD03D725ADFD7659385645B1467401473A5 -ss = 8ABCE489762C5BBC4C2326539BDA39B08CDE688D81EC4F75F11946550E603D57 - diff --git a/ecc/bls12381/constants.go b/ecc/bls12381/constants.go deleted file mode 100644 index 1de10d75..00000000 --- a/ecc/bls12381/constants.go +++ /dev/null @@ -1,340 +0,0 @@ -package bls12381 - -import ( - "errors" - - "github.com/quantumcoinproject/circl/ecc/bls12381/ff" -) - -// Scalar represents positive integers in the range 0 <= x < Order. -type Scalar = ff.Scalar - -const ScalarSize = ff.ScalarSize - -// Order returns the order of the pairing groups, returned as a big-endian slice. -// -// Order = 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001 -func Order() []byte { return ff.ScalarOrder() } - -var ( - bls12381 struct { // Let z be the BLS12 parameter. - minusZ [8]byte // (-z), (integer big-endian). - oneMinusZ [8]byte // (1-z), (integer big-endian). - g1Check [16]byte // (z^2-1)/3, (integer big-endian). - } - g1Params struct{ b, _3b, genX, genY ff.Fp } - g2Params struct{ b, _3b, genX, genY ff.Fp2 } - - // g1Isog11 is an isogeny of degree 11 from g1Iso(a,b) to G1 and is given - // by rational maps: - // g1Iso(a,b) --> G1 - // (x,y,z) |-> (x,y,1) - // (xNum/xDen, y * yNum/yDen, 1) - // (xNum*yDen, y * yNum*xDen, z*xDen*yDen) - // such that - // xNum = \sum ai * x^i * z^(n-1-i), for 0 <= i < n, and n=12. - // xDen = \sum bi * x^i * z^(n-1-i), for 0 <= i < n, and n=11. - // yNum = \sum ci * x^i * z^(n-1-i), for 0 <= i < n, and n=16. - // yDen = \sum di * x^i * z^(n-1-i), for 0 <= i < n, and n=16. - g1Isog11 struct { - a, b ff.Fp - xNum [12]ff.Fp - xDen [11]ff.Fp - yNum [16]ff.Fp - yDen [16]ff.Fp - } - - // g2Isog3 is an isogeny of degree 3 from g2Iso(a,b) to G2 and is given - // by rational maps: - // g2Iso(a,b) --> G2 - // (x,y,z) |-> (x,y,1) - // (xNum/xDen, y * yNum/yDen, 1) - // (xNum*yDen, y * yNum*xDen, z*xDen*yDen) - // such that - // xNum = \sum ai * x^i * z^(n-1-i), for 0 <= i < n, and n=4. - // xDen = \sum bi * x^i * z^(n-1-i), for 0 <= i < n, and n=3. - // yNum = \sum ci * x^i * z^(n-1-i), for 0 <= i < n, and n=4. - // yDen = \sum di * x^i * z^(n-1-i), for 0 <= i < n, and n=4. - g2Isog3 struct { - a, b ff.Fp2 - xNum [4]ff.Fp2 - xDen [3]ff.Fp2 - yNum [4]ff.Fp2 - yDen [4]ff.Fp2 - } - g1sswu struct { - Z ff.Fp // Z = 11. - c1 [48]byte // integer c1 = (p - 3) / 4 (big-endian) - c2 ff.Fp - } - g2sswu struct { - Z ff.Fp2 // -(2 + I) - c1 [95]byte // integer c1 = (p^2 - 9) / 16 (big-endian) - c2 ff.Fp2 // sqrt(-1) - c3 ff.Fp2 // sqrt(c2) - c4 ff.Fp2 // sqrt(Z^3 / c3) - c5 ff.Fp2 // sqrt(Z^3 / (c2 * c3)) - } - g1Sigma struct { - beta0 ff.Fp // beta0 = F(2)^(2*(p-1)/3) where F = GF(p). - beta1 ff.Fp // beta1 = F(2)^(1*(p-1)/3) where F = GF(p). - } - g2Psi struct { - alpha ff.Fp2 // alpha = w^2/Frob(w^2) - beta ff.Fp2 // beta = w^3/Frob(w^3) - } -) - -var ( - errInputLength = errors.New("incorrect input length") - errEncoding = errors.New("incorrect encoding") -) - -func headerEncoding(isCompressed, isInfinity, isBigYCoord byte) byte { - return (isBigYCoord&0x1)<<5 | (isInfinity&0x1)<<6 | (isCompressed&0x1)<<7 -} - -func err(e error) { - if e != nil { - panic(e) - } -} - -func init() { - bls12381.oneMinusZ = [8]byte{ // (big-endian) - 0xd2, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, - } - bls12381.minusZ = [8]byte{ // (big-endian) - 0xd2, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - } - bls12381.g1Check = [16]byte{ // (big-endian) - 0x39, 0x6c, 0x8c, 0x00, 0x55, 0x55, 0xe1, 0x56, - 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x55, - } - initG1Params() - initG2Params() - initG1Isog11() - initG2Isog3() - initG1sswu() - initG2sswu() - initSigma() - initPsi() -} - -func initG1Params() { - g1Params.b.SetUint64(4) - g1Params._3b.SetUint64(12) - err(g1Params.genX.SetString("0x17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb")) - err(g1Params.genY.SetString("0x08b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1")) -} - -func initG2Params() { - g2Params.b[0].SetUint64(4) - g2Params.b[1].SetUint64(4) - g2Params._3b[0].SetUint64(12) - g2Params._3b[1].SetUint64(12) - err(g2Params.genX[0].SetString("0x024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8")) - err(g2Params.genX[1].SetString("0x13e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e")) - err(g2Params.genY[0].SetString("0x0ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801")) - err(g2Params.genY[1].SetString("0x0606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be")) -} - -func initG1Isog11() { - err(g1Isog11.a.SetString("0x144698a3b8e9433d693a02c96d4982b0ea985383ee66a8d8e8981aefd881ac98936f8da0e0f97f5cf428082d584c1d")) - err(g1Isog11.b.SetString("0x12e2908d11688030018b12e8753eee3b2016c1f0f24f4070a0b9c14fcef35ef55a23215a316ceaa5d1cc48e98e172be0")) - err(g1Isog11.xNum[0].SetString("0x11a05f2b1e833340b809101dd99815856b303e88a2d7005ff2627b56cdb4e2c85610c2d5f2e62d6eaeac1662734649b7")) - err(g1Isog11.xNum[1].SetString("0x17294ed3e943ab2f0588bab22147a81c7c17e75b2f6a8417f565e33c70d1e86b4838f2a6f318c356e834eef1b3cb83bb")) - err(g1Isog11.xNum[2].SetString("0x0d54005db97678ec1d1048c5d10a9a1bce032473295983e56878e501ec68e25c958c3e3d2a09729fe0179f9dac9edcb0")) - err(g1Isog11.xNum[3].SetString("0x1778e7166fcc6db74e0609d307e55412d7f5e4656a8dbf25f1b33289f1b330835336e25ce3107193c5b388641d9b6861")) - err(g1Isog11.xNum[4].SetString("0x0e99726a3199f4436642b4b3e4118e5499db995a1257fb3f086eeb65982fac18985a286f301e77c451154ce9ac8895d9")) - err(g1Isog11.xNum[5].SetString("0x1630c3250d7313ff01d1201bf7a74ab5db3cb17dd952799b9ed3ab9097e68f90a0870d2dcae73d19cd13c1c66f652983")) - err(g1Isog11.xNum[6].SetString("0x0d6ed6553fe44d296a3726c38ae652bfb11586264f0f8ce19008e218f9c86b2a8da25128c1052ecaddd7f225a139ed84")) - err(g1Isog11.xNum[7].SetString("0x17b81e7701abdbe2e8743884d1117e53356de5ab275b4db1a682c62ef0f2753339b7c8f8c8f475af9ccb5618e3f0c88e")) - err(g1Isog11.xNum[8].SetString("0x080d3cf1f9a78fc47b90b33563be990dc43b756ce79f5574a2c596c928c5d1de4fa295f296b74e956d71986a8497e317")) - err(g1Isog11.xNum[9].SetString("0x169b1f8e1bcfa7c42e0c37515d138f22dd2ecb803a0c5c99676314baf4bb1b7fa3190b2edc0327797f241067be390c9e")) - err(g1Isog11.xNum[10].SetString("0x10321da079ce07e272d8ec09d2565b0dfa7dccdde6787f96d50af36003b14866f69b771f8c285decca67df3f1605fb7b")) - err(g1Isog11.xNum[11].SetString("0x06e08c248e260e70bd1e962381edee3d31d79d7e22c837bc23c0bf1bc24c6b68c24b1b80b64d391fa9c8ba2e8ba2d229")) - - err(g1Isog11.xDen[0].SetString("0x08ca8d548cff19ae18b2e62f4bd3fa6f01d5ef4ba35b48ba9c9588617fc8ac62b558d681be343df8993cf9fa40d21b1c")) - err(g1Isog11.xDen[1].SetString("0x12561a5deb559c4348b4711298e536367041e8ca0cf0800c0126c2588c48bf5713daa8846cb026e9e5c8276ec82b3bff")) - err(g1Isog11.xDen[2].SetString("0x0b2962fe57a3225e8137e629bff2991f6f89416f5a718cd1fca64e00b11aceacd6a3d0967c94fedcfcc239ba5cb83e19")) - err(g1Isog11.xDen[3].SetString("0x03425581a58ae2fec83aafef7c40eb545b08243f16b1655154cca8abc28d6fd04976d5243eecf5c4130de8938dc62cd8")) - err(g1Isog11.xDen[4].SetString("0x13a8e162022914a80a6f1d5f43e7a07dffdfc759a12062bb8d6b44e833b306da9bd29ba81f35781d539d395b3532a21e")) - err(g1Isog11.xDen[5].SetString("0x0e7355f8e4e667b955390f7f0506c6e9395735e9ce9cad4d0a43bcef24b8982f7400d24bc4228f11c02df9a29f6304a5")) - err(g1Isog11.xDen[6].SetString("0x0772caacf16936190f3e0c63e0596721570f5799af53a1894e2e073062aede9cea73b3538f0de06cec2574496ee84a3a")) - err(g1Isog11.xDen[7].SetString("0x14a7ac2a9d64a8b230b3f5b074cf01996e7f63c21bca68a81996e1cdf9822c580fa5b9489d11e2d311f7d99bbdcc5a5e")) - err(g1Isog11.xDen[8].SetString("0x0a10ecf6ada54f825e920b3dafc7a3cce07f8d1d7161366b74100da67f39883503826692abba43704776ec3a79a1d641")) - err(g1Isog11.xDen[9].SetString("0x095fc13ab9e92ad4476d6e3eb3a56680f682b4ee96f7d03776df533978f31c1593174e4b4b7865002d6384d168ecdd0a")) - g1Isog11.xDen[10].SetOne() - - err(g1Isog11.yNum[0].SetString("0x090d97c81ba24ee0259d1f094980dcfa11ad138e48a869522b52af6c956543d3cd0c7aee9b3ba3c2be9845719707bb33")) - err(g1Isog11.yNum[1].SetString("0x134996a104ee5811d51036d776fb46831223e96c254f383d0f906343eb67ad34d6c56711962fa8bfe097e75a2e41c696")) - err(g1Isog11.yNum[2].SetString("0x00cc786baa966e66f4a384c86a3b49942552e2d658a31ce2c344be4b91400da7d26d521628b00523b8dfe240c72de1f6")) - err(g1Isog11.yNum[3].SetString("0x01f86376e8981c217898751ad8746757d42aa7b90eeb791c09e4a3ec03251cf9de405aba9ec61deca6355c77b0e5f4cb")) - err(g1Isog11.yNum[4].SetString("0x08cc03fdefe0ff135caf4fe2a21529c4195536fbe3ce50b879833fd221351adc2ee7f8dc099040a841b6daecf2e8fedb")) - err(g1Isog11.yNum[5].SetString("0x16603fca40634b6a2211e11db8f0a6a074a7d0d4afadb7bd76505c3d3ad5544e203f6326c95a807299b23ab13633a5f0")) - err(g1Isog11.yNum[6].SetString("0x04ab0b9bcfac1bbcb2c977d027796b3ce75bb8ca2be184cb5231413c4d634f3747a87ac2460f415ec961f8855fe9d6f2")) - err(g1Isog11.yNum[7].SetString("0x0987c8d5333ab86fde9926bd2ca6c674170a05bfe3bdd81ffd038da6c26c842642f64550fedfe935a15e4ca31870fb29")) - err(g1Isog11.yNum[8].SetString("0x09fc4018bd96684be88c9e221e4da1bb8f3abd16679dc26c1e8b6e6a1f20cabe69d65201c78607a360370e577bdba587")) - err(g1Isog11.yNum[9].SetString("0x0e1bba7a1186bdb5223abde7ada14a23c42a0ca7915af6fe06985e7ed1e4d43b9b3f7055dd4eba6f2bafaaebca731c30")) - err(g1Isog11.yNum[10].SetString("0x19713e47937cd1be0dfd0b8f1d43fb93cd2fcbcb6caf493fd1183e416389e61031bf3a5cce3fbafce813711ad011c132")) - err(g1Isog11.yNum[11].SetString("0x18b46a908f36f6deb918c143fed2edcc523559b8aaf0c2462e6bfe7f911f643249d9cdf41b44d606ce07c8a4d0074d8e")) - err(g1Isog11.yNum[12].SetString("0x0b182cac101b9399d155096004f53f447aa7b12a3426b08ec02710e807b4633f06c851c1919211f20d4c04f00b971ef8")) - err(g1Isog11.yNum[13].SetString("0x0245a394ad1eca9b72fc00ae7be315dc757b3b080d4c158013e6632d3c40659cc6cf90ad1c232a6442d9d3f5db980133")) - err(g1Isog11.yNum[14].SetString("0x05c129645e44cf1102a159f748c4a3fc5e673d81d7e86568d9ab0f5d396a7ce46ba1049b6579afb7866b1e715475224b")) - err(g1Isog11.yNum[15].SetString("0x15e6be4e990f03ce4ea50b3b42df2eb5cb181d8f84965a3957add4fa95af01b2b665027efec01c7704b456be69c8b604")) - - err(g1Isog11.yDen[0].SetString("0x16112c4c3a9c98b252181140fad0eae9601a6de578980be6eec3232b5be72e7a07f3688ef60c206d01479253b03663c1")) - err(g1Isog11.yDen[1].SetString("0x1962d75c2381201e1a0cbd6c43c348b885c84ff731c4d59ca4a10356f453e01f78a4260763529e3532f6102c2e49a03d")) - err(g1Isog11.yDen[2].SetString("0x058df3306640da276faaae7d6e8eb15778c4855551ae7f310c35a5dd279cd2eca6757cd636f96f891e2538b53dbf67f2")) - err(g1Isog11.yDen[3].SetString("0x16b7d288798e5395f20d23bf89edb4d1d115c5dbddbcd30e123da489e726af41727364f2c28297ada8d26d98445f5416")) - err(g1Isog11.yDen[4].SetString("0x0be0e079545f43e4b00cc912f8228ddcc6d19c9f0f69bbb0542eda0fc9dec916a20b15dc0fd2ededda39142311a5001d")) - err(g1Isog11.yDen[5].SetString("0x08d9e5297186db2d9fb266eaac783182b70152c65550d881c5ecd87b6f0f5a6449f38db9dfa9cce202c6477faaf9b7ac")) - err(g1Isog11.yDen[6].SetString("0x166007c08a99db2fc3ba8734ace9824b5eecfdfa8d0cf8ef5dd365bc400a0051d5fa9c01a58b1fb93d1a1399126a775c")) - err(g1Isog11.yDen[7].SetString("0x16a3ef08be3ea7ea03bcddfabba6ff6ee5a4375efa1f4fd7feb34fd206357132b920f5b00801dee460ee415a15812ed9")) - err(g1Isog11.yDen[8].SetString("0x1866c8ed336c61231a1be54fd1d74cc4f9fb0ce4c6af5920abc5750c4bf39b4852cfe2f7bb9248836b233d9d55535d4a")) - err(g1Isog11.yDen[9].SetString("0x167a55cda70a6e1cea820597d94a84903216f763e13d87bb5308592e7ea7d4fbc7385ea3d529b35e346ef48bb8913f55")) - err(g1Isog11.yDen[10].SetString("0x04d2f259eea405bd48f010a01ad2911d9c6dd039bb61a6290e591b36e636a5c871a5c29f4f83060400f8b49cba8f6aa8")) - err(g1Isog11.yDen[11].SetString("0x0accbb67481d033ff5852c1e48c50c477f94ff8aefce42d28c0f9a88cea7913516f968986f7ebbea9684b529e2561092")) - err(g1Isog11.yDen[12].SetString("0x0ad6b9514c767fe3c3613144b45f1496543346d98adf02267d5ceef9a00d9b8693000763e3b90ac11e99b138573345cc")) - err(g1Isog11.yDen[13].SetString("0x02660400eb2e4f3b628bdd0d53cd76f2bf565b94e72927c1cb748df27942480e420517bd8714cc80d1fadc1326ed06f7")) - err(g1Isog11.yDen[14].SetString("0x0e0fa1d816ddc03e6b24255e0d7819c171c40f65e273b853324efcd6356caa205ca2f570f13497804415473a1d634b8f")) - g1Isog11.yDen[15].SetOne() -} - -func initG2Isog3() { - err(g2Isog3.a.SetString("0x00", "0xF0")) - err(g2Isog3.b.SetString("0x03F4", "0x03F4")) - - err(g2Isog3.xNum[0].SetString( - "0x5c759507e8e333ebb5b7a9a47d7ed8532c52d39fd3a042a88b58423c50ae15d5c2638e343d9c71c6238aaaaaaaa97d6", - "0x5c759507e8e333ebb5b7a9a47d7ed8532c52d39fd3a042a88b58423c50ae15d5c2638e343d9c71c6238aaaaaaaa97d6", - )) - err(g2Isog3.xNum[1].SetString( - "0x00", - "0x11560bf17baa99bc32126fced787c88f984f87adf7ae0c7f9a208c6b4f20a4181472aaa9cb8d555526a9ffffffffc71a", - )) - err(g2Isog3.xNum[2].SetString( - "0x11560bf17baa99bc32126fced787c88f984f87adf7ae0c7f9a208c6b4f20a4181472aaa9cb8d555526a9ffffffffc71e", - "0x8ab05f8bdd54cde190937e76bc3e447cc27c3d6fbd7063fcd104635a790520c0a395554e5c6aaaa9354ffffffffe38d", - )) - err(g2Isog3.xNum[3].SetString( - "0x171d6541fa38ccfaed6dea691f5fb614cb14b4e7f4e810aa22d6108f142b85757098e38d0f671c7188e2aaaaaaaa5ed1", - "0x00", - )) - - err(g2Isog3.xDen[0].SetString( - "0x00", - "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaa63", - )) - err(g2Isog3.xDen[1].SetString( - "0x0c", - "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaa9f", - )) - g2Isog3.xDen[2].SetOne() - - err(g2Isog3.yNum[0].SetString( - "0x1530477c7ab4113b59a4c18b076d11930f7da5d4a07f649bf54439d87d27e500fc8c25ebf8c92f6812cfc71c71c6d706", - "0x1530477c7ab4113b59a4c18b076d11930f7da5d4a07f649bf54439d87d27e500fc8c25ebf8c92f6812cfc71c71c6d706", - )) - err(g2Isog3.yNum[1].SetString( - "0x00", - "0x5c759507e8e333ebb5b7a9a47d7ed8532c52d39fd3a042a88b58423c50ae15d5c2638e343d9c71c6238aaaaaaaa97be", - )) - err(g2Isog3.yNum[2].SetString( - "0x11560bf17baa99bc32126fced787c88f984f87adf7ae0c7f9a208c6b4f20a4181472aaa9cb8d555526a9ffffffffc71c", - "0x8ab05f8bdd54cde190937e76bc3e447cc27c3d6fbd7063fcd104635a790520c0a395554e5c6aaaa9354ffffffffe38f", - )) - err(g2Isog3.yNum[3].SetString( - "0x124c9ad43b6cf79bfbf7043de3811ad0761b0f37a1e26286b0e977c69aa274524e79097a56dc4bd9e1b371c71c718b10", - "0x00", - )) - - err(g2Isog3.yDen[0].SetString( - "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffa8fb", - "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffa8fb", - )) - err(g2Isog3.yDen[1].SetString( - "0x00", - "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffa9d3", - )) - err(g2Isog3.yDen[2].SetString( - "0x12", - "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaa99", - )) - g2Isog3.yDen[3].SetOne() -} - -func initG1sswu() { - g1sswu.Z.SetUint64(11) - g1sswu.c1 = [48]byte{ // (big-endian) - 0x06, 0x80, 0x44, 0x7a, 0x8e, 0x5f, 0xf9, 0xa6, - 0x92, 0xc6, 0xe9, 0xed, 0x90, 0xd2, 0xeb, 0x35, - 0xd9, 0x1d, 0xd2, 0xe1, 0x3c, 0xe1, 0x44, 0xaf, - 0xd9, 0xcc, 0x34, 0xa8, 0x3d, 0xac, 0x3d, 0x89, - 0x07, 0xaa, 0xff, 0xff, 0xac, 0x54, 0xff, 0xff, - 0xee, 0x7f, 0xbf, 0xff, 0xff, 0xff, 0xea, 0xaa, - } - err(g1sswu.c2.SetString("0x3d689d1e0e762cef9f2bec6130316806b4c80eda6fc10ce77ae83eab1ea8b8b8a407c9c6db195e06f2dbeabc2baeff5")) -} - -func initG2sswu() { - g2sswu.Z[1].SetUint64(1) - g2sswu.Z[0].SetUint64(2) - g2sswu.Z.Neg() - g2sswu.c1 = [95]byte{ // (big-endian) - 0x2a, 0x43, 0x7a, 0x4b, 0x8c, 0x35, 0xfc, 0x74, - 0xbd, 0x27, 0x8e, 0xaa, 0x22, 0xf2, 0x5e, 0x9e, - 0x2d, 0xc9, 0x0e, 0x50, 0xe7, 0x04, 0x6b, 0x46, - 0x6e, 0x59, 0xe4, 0x93, 0x49, 0xe8, 0xbd, 0x05, - 0x0a, 0x62, 0xcf, 0xd1, 0x6d, 0xdc, 0xa6, 0xef, - 0x53, 0x14, 0x93, 0x30, 0x97, 0x8e, 0xf0, 0x11, - 0xd6, 0x86, 0x19, 0xc8, 0x61, 0x85, 0xc7, 0xb2, - 0x92, 0xe8, 0x5a, 0x87, 0x09, 0x1a, 0x04, 0x96, - 0x6b, 0xf9, 0x1e, 0xd3, 0xe7, 0x1b, 0x74, 0x31, - 0x62, 0xc3, 0x38, 0x36, 0x21, 0x13, 0xcf, 0xd7, - 0xce, 0xd6, 0xb1, 0xd7, 0x63, 0x82, 0xea, 0xb2, - 0x6a, 0xa0, 0x00, 0x01, 0xc7, 0x18, 0xe3, - } - err(g2sswu.c2.SetString("0x00", "0x01")) - err(g2sswu.c3.SetString( - "0x135203e60180a68ee2e9c448d77a2cd91c3dedd930b1cf60ef396489f61eb45e304466cf3e67fa0af1ee7b04121bdea2", - "0x6af0e0437ff400b6831e36d6bd17ffe48395dabc2d3435e77f76e17009241c5ee67992f72ec05f4c81084fbede3cc09", - )) - err(g2sswu.c4.SetString( - "0x699be3b8c6870965e5bf892ad5d2cc7b0e85a117402dfd83b7f4a947e02d978498255a2aaec0ac627b5afbdf1bf1c90", - "0x8157cd83046453f5dd0972b6e3949e4288020b5b8a9cc99ca07e27089a2ce2436d965026adad3ef7baba37f2183e9b5", - )) - err(g2sswu.c5.SetString( - "0xf5d0d63d2797471e6d39f306cc0dc0ab85de3bd9f39ce46f3649ac0de9e844417cc8de88716c1fd323fa68040801aea", - "0xab1c2ffdd6c253ca155231eb3e71ba044fd562f6f72bc5bad5ec46a0b7a3b0247cf08ce6c6317f40edbc653a72dee17", - )) -} - -func initSigma() { - err(g1Sigma.beta0.SetString("0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaac")) - err(g1Sigma.beta1.SetString("0x5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffefffe")) -} - -func initPsi() { - // ratioKummer sets z = t/Frob(t) if it falls in Fp2, panics otherwise. - ratioKummer := func(z *ff.Fp2, t *ff.Fp12) { - var r ff.Fp12 - r.Frob(t) - r.Inv(&r) - r.Mul(t, &r) - if r[1].IsZero() != 1 || r[0][1].IsZero() != 1 || r[0][2].IsZero() != 1 { - err(errors.New("failure of result to be in Fp2")) - } - *z = r[0][0] - } - - w := &ff.Fp12{} - w[1].SetOne() - wsq := &ff.Fp12{} - wsq.Sqr(w) - ratioKummer(&g2Psi.alpha, wsq) - wcube := &ff.Fp12{} - wcube.Mul(wsq, w) - ratioKummer(&g2Psi.beta, wcube) -} diff --git a/ecc/bls12381/doc.go b/ecc/bls12381/doc.go deleted file mode 100644 index bf4df68d..00000000 --- a/ecc/bls12381/doc.go +++ /dev/null @@ -1,72 +0,0 @@ -// Package bls12381 provides bilinear pairings using the BLS12-381 curve. -// -// A pairing system consists of three groups G1 and G2 (additive notation) and -// Gt (multiplicative notation) of the same order. -// Scalars can be used interchangeably between groups. -// -// These groups have the same order equal to: -// -// Order = 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001 -// -// # Serialization Format -// -// Elements of G1 and G2 can be encoded in uncompressed form (the x-coordinate -// followed by the y-coordinate) or in compressed form (just the x-coordinate). -// G1 elements occupy 96 bytes in uncompressed form, and 48 bytes in compressed -// form. G2 elements occupy 192 bytes in uncompressed form, and 96 bytes in -// compressed form. -// -// The most-significant three bits of a G1 or G2 encoding should be masked away -// before the coordinates are interpreted. These bits are used to unambiguously -// represent the underlying element: -// -// * The most significant bit, when set, indicates that the point is in -// compressed form. Otherwise, the point is in uncompressed form. -// -// * The second-most significant bit indicates that the point is at infinity. -// If this bit is set, the remaining bits of the group element's encoding -// should be set to zero. -// -// * The third-most significant bit is set if (and only if) this point is in -// compressed form AND it is not the point at infinity AND its y-coordinate -// is the lexicographically largest of the two associated with the encoded -// x-coordinate. -// -// |------------------------------------------------------| -// | Serialization Format | -// |-----|-------|-------|-----------------|--------------| -// | MSB | MSB-1 | MSB-2 | Description | Encoding | -// |-----|-------|-------|-----------------|--------------| -// | | | | Non-compressed, | | -// | 0 | 0 | 0 | Non-Infinity, | e || x || y | -// | | | | Zero. | | -// |-----|-------|-------|-----------------|--------------| -// | | | | Non-compressed, | | -// | 0 | 0 | 1 | Non-Infinity, | Invalid | -// | | | | One. | | -// |-----|-------|-------|-----------------|--------------| -// | | | | Non-compressed, | | -// | 0 | 1 | 0 | Infinity, | e || 0 || 0 | -// | | | | Zero. | | -// |-----|-------|-------|-----------------|--------------| -// | | | | Non-compressed, | | -// | 0 | 1 | 1 | Infinity, | Invalid | -// | | | | One. | | -// |-----|-------|-------|-----------------|--------------| -// | | | | Compressed, | | -// | 1 | 0 | 0 | Non-Infinity, | e || x | -// | | | | Small y-coord | | -// |-----|-------|-------|-----------------|--------------| -// | | | | Compressed, | | -// | 1 | 0 | 1 | Non-Infinity, | e || x | -// | | | | Big y-coord | | -// |-----|-------|-------|-----------------|--------------| -// | | | | Compressed, | | -// | 1 | 1 | 0 | Infinity, | e || 0 | -// | | | | Zero. | | -// |-----|-------|-------|-----------------|--------------| -// | | | | Compressed, | | -// | 1 | 1 | 1 | Infinity, | Invalid | -// | | | | One. | | -// |------------------------------------------------------| -package bls12381 diff --git a/ecc/bls12381/ec2.go b/ecc/bls12381/ec2.go deleted file mode 100644 index 05aa35cd..00000000 --- a/ecc/bls12381/ec2.go +++ /dev/null @@ -1,133 +0,0 @@ -package bls12381 - -import "github.com/quantumcoinproject/circl/ecc/bls12381/ff" - -func doubleAndLine(P *G2, l *line) { - // Reference: - // "Faster Pairing Computations on Curves with High-Degree Twists" by - // Costello-Lange-Naehrig. [Sec. 5] (eprint.iacr.org/2009/615). - // "Complete addition formulas for prime order elliptic curves" by - // Costello-Renes-Batina. [Alg.9] (eprint.iacr.org/2015/1060). - var R G2 - X, Y, Z := &P.x, &P.y, &P.z - X3, Y3, Z3 := &R.x, &R.y, &R.z - isDoubLine := l != nil - _3B := &g2Params._3b - var A, B, C, D, E, F, G, T ff.Fp2 - B.Sqr(Y) // 1. B = Y1^2 - C.Sqr(Z) // 2. C = Z1^2 - D.Mul(_3B, &C) // 3. D = 3b*C - F.Add(Y, Z) // 4. F = (Y1+Z1) - F.Sqr(&F) // F = (Y1+Z1)^2 - F.Sub(&F, &B) // F = (Y1+Z1)^2-B - F.Sub(&F, &C) // F = (Y1+Z1)^2-B-C - if isDoubLine { - A.Sqr(X) // 5. A = X1^2 - E.Add(X, Y) // E = (X1+Y1) - E.Sqr(&E) // E = (X1+Y1)^2 - E.Sub(&E, &A) // E = (X1+Y1)^2-A - E.Sub(&E, &B) // E = (X1+Y1)^2-A-B = 2X*Y - l[0].Add(&A, &A) // 5a. l0 = 2A - l[0].Add(&l[0], &A) // l0 = 3A = 3X1^2 - l[1] = F // 5b. l1 = F - l[1].Neg() // l1 = -F = -2Y1Z1 - l[2].Sub(&D, &B) // 5c. l2 = D-B = 3b*Z1^2-Y1^2 - } else { - E.Mul(X, Y) // 5. E = X*Y - E.Add(&E, &E) // E = 2X*Y - } - T.Add(&D, &D) // 6. T = 2D - G.Add(&T, &D) // 7. G = 3D - X3.Sub(&B, &G) // 8. X3 = (B-G) - X3.Mul(X3, &E) // X3 = E*(B-G) - T.Sqr(&T) // 9 . T = 4D^2 - Y3.Add(&B, &G) // 10. Y3 = (B+G) - Y3.Sqr(Y3) // Y3 = (B+G)^2 - Y3.Sub(Y3, &T) // Y3 = (B+G)^2-4D^2 - Y3.Sub(Y3, &T) // Y3 = (B+G)^2-8D^2 - Y3.Sub(Y3, &T) // Y3 = (B+G)^2-12D^2 - Z3.Mul(&B, &F) // 11. Z3 = B*F - Z3.Add(Z3, Z3) // Z3 = 2B*F - Z3.Add(Z3, Z3) // Z3 = 4B*F - *P = R -} - -func addAndLine(PQ, P, Q *G2, l *line) { - // Reference: - // "Faster Pairing Computations on Curves with High-Degree Twists" by - // Costello-Lange-Naehrig. [Sec. 5] (eprint.iacr.org/2009/615). - // "Complete addition formulas for prime order elliptic curves" by - // Costello-Renes-Batina. [Alg.7] (eprint.iacr.org/2015/1060). - var R G2 - X1, Y1, Z1 := &P.x, &P.y, &P.z - X2, Y2, Z2 := &Q.x, &Q.y, &Q.z - X3, Y3, Z3 := &R.x, &R.y, &R.z - _3B := &g2Params._3b - isAddLine := l != nil - var X1X2, Y1Y2, Z1Z2, _3bZ1Z2 ff.Fp2 - var A, B, C, D, E, F, G ff.Fp2 - t0, t1 := &ff.Fp2{}, &ff.Fp2{} - - X1X2.Mul(X1, X2) - Y1Y2.Mul(Y1, Y2) - Z1Z2.Mul(Z1, Z2) - _3bZ1Z2.Mul(&Z1Z2, _3B) - - A.Add(&X1X2, &X1X2) // A = 2X1X2 - A.Add(&A, &X1X2) // = 3X1X2 - B.Add(&Y1Y2, &_3bZ1Z2) // B = Y1Y2+3bZ1Z2 - C.Sub(&Y1Y2, &_3bZ1Z2) // C = Y1Y2-3bZ1Z2 - - t0.Add(X1, Y1) // t0 = (X1 + Y1) - D.Add(X2, Y2) // D = (X2 + Y2) - D.Mul(&D, t0) // = X1X2 + X1Y2 + X2Y1 + Y1Y2 - D.Sub(&D, &X1X2) // = X1Y2 + X2Y1 + Y1Y2 - D.Sub(&D, &Y1Y2) // = X1Y2 + X2Y1 - - if isAddLine { - var EE, FF ff.Fp2 - t0.Mul(Y1, Z2) // t0 = Y1Z2 - t1.Mul(Y2, Z1) // t1 = Y2Z1 - E.Add(t0, t1) // E = Y1Z2 + Y2Z1 - EE.Sub(t0, t1) // EE = Y1Z2 - Y2Z1 - - t0.Mul(X1, Z2) // t0 = X1Z2 - t1.Mul(X2, Z1) // t1 = X2Z1 - F.Add(t0, t1) // F = X1Z2 + X2Z1 - FF.Sub(t0, t1) // FF = X1Z2 - X2Z1 - - l[0].Mul(&EE, Z2) // l0 = (Y1Z2 - Y2Z1)*Z2 - l[0].Neg() // = -(Y1Z2 - Y2Z1)*Z2 - l[1].Mul(&FF, Z2) // l1 = (X1Z2 - X2Z1)*Z2 - t0.Mul(&FF, Y2) // t0 = (X1Z2 - X2Z1)*Y2 - l[2].Mul(&EE, X2) // l2 = (Y1Z2 - Y2Z1)*X2 - l[2].Sub(&l[2], t0) // = (Y1Z2 - Y2Z1)*X2 - (X1Z2 - X2Z1)*Y2 - } else { - t0.Add(Y1, Z1) // t0 = (Y1 + Z1) - t1.Add(Y2, Z2) // t1 = (Y2 + Z2) - E.Mul(t0, t1) // E = Y1Y2 + Y1Z2 + Y2Z1 + Z1Z2 - E.Sub(&E, &Y1Y2) // = Y1Z2 + Y2Z1 + Z1Z2 - E.Sub(&E, &Z1Z2) // = Y1Z2 + Y2Z1 - - t0.Add(X1, Z1) // t0 = (X1 + Z1) - t1.Add(X2, Z2) // t1 = (X2 + Z2) - F.Mul(t0, t1) // F = X1X2 + X1Z2 + X2Z1 + Z1Z2 - F.Sub(&F, &X1X2) // = X1Z2 + X2Z1 + Z1Z2 - F.Sub(&F, &Z1Z2) // = X1Z2 + X2Z1 - } - G.Mul(&F, _3B) // G = 3b*F - - t0.Mul(&E, &G) // t0 = E*G - X3.Mul(&D, &C) // X3 = D*C - X3.Sub(X3, t0) // = D*C - E*G - - t0.Mul(&A, &G) // t0 = A*G - Y3.Mul(&B, &C) // Y3 = B*C - Y3.Add(Y3, t0) // = B*C + A*G - - t0.Mul(&A, &D) // t0 = A*D - Z3.Mul(&E, &B) // Z3 = E*B - Z3.Add(Z3, t0) // = E*B + A*D - - *PQ = R -} diff --git a/ecc/bls12381/encoding_test.go b/ecc/bls12381/encoding_test.go deleted file mode 100644 index 047ca219..00000000 --- a/ecc/bls12381/encoding_test.go +++ /dev/null @@ -1,89 +0,0 @@ -package bls12381 - -import ( - "bytes" - "io" - "os" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func isEqual(p, q interface{}) bool { - switch P := p.(type) { - case *G1: - return P.IsEqual(q.(*G1)) - case *G2: - return P.IsEqual(q.(*G2)) - default: - panic("bad type") - } -} - -func addGenerator(p interface{}) { - switch P := p.(type) { - case *G1: - P.Add(P, G1Generator()) - case *G2: - P.Add(P, G2Generator()) - default: - panic("bad type") - } -} - -func testSerialVector(t *testing.T, file io.Reader, v *serialVector) { - var bP []byte - bQ := make([]byte, v.length) - v.P.SetIdentity() - for i := 0; i < 1000; i++ { - n, err := file.Read(bQ) - if n != v.length || err != nil { - t.Fatalf("error reading %v file: %v", v.fileName, err) - } - test.CheckNoErr(t, v.Q.SetBytes(bQ), "failed deserialization") - - if !isEqual(v.P, v.Q) { - test.ReportError(t, v.P, v.Q, i) - } - - if v.compressed { - bP = v.P.BytesCompressed() - } else { - bP = v.P.Bytes() - } - if !bytes.Equal(bP, bQ) { - test.ReportError(t, bP, bQ, i) - } - addGenerator(v.P) - } -} - -type serialVector struct { - fileName string - length int - compressed bool - P, Q interface { - SetIdentity() - SetBytes([]byte) error - Bytes() []byte - BytesCompressed() []byte - } -} - -func TestSerializationVector(t *testing.T) { - for _, vv := range []serialVector{ - {"g1_uncompressed", G1Size, false, new(G1), new(G1)}, - {"g1_compressed", G1SizeCompressed, true, new(G1), new(G1)}, - {"g2_uncompressed", G2Size, false, new(G2), new(G2)}, - {"g2_compressed", G2SizeCompressed, true, new(G2), new(G2)}, - } { - v := vv - file, err := os.Open("testdata/" + v.fileName + "_valid_test_vectors.dat") - if err != nil { - t.Fatalf("file %v can not be opened: %v", v.fileName, err) - } - defer file.Close() - - t.Run(v.fileName[:7], func(t *testing.T) { testSerialVector(t, file, &v) }) - } -} diff --git a/ecc/bls12381/ff/common.go b/ecc/bls12381/ff/common.go deleted file mode 100644 index 0062c7e1..00000000 --- a/ecc/bls12381/ff/common.go +++ /dev/null @@ -1,84 +0,0 @@ -// Package ff provides finite fields of characteristic P381. -package ff - -import ( - "crypto/rand" - "crypto/subtle" - "errors" - "io" - "math/big" - - "github.com/quantumcoinproject/circl/internal/conv" -) - -var ( - errInputLength = errors.New("incorrect input length") - errInputRange = errors.New("value out of range [0,order)") - errInputString = errors.New("invalid string") -) - -func errFirst(e ...error) (err error) { - for i := 0; i < len(e); i++ { - if e[i] != nil { - return e[i] - } - } - return -} - -func setString(in string, order []byte) ([]uint64, error) { - inBig, ok := new(big.Int).SetString(in, 0) - if !ok { - return nil, errInputString - } - if inBig.Sign() < 0 || inBig.Cmp(new(big.Int).SetBytes(order)) >= 0 { - return nil, errInputRange - } - inBytes := inBig.FillBytes(make([]byte, len(order))) - return setBytesBounded(inBytes, order) -} - -func setBytesBounded(in []byte, order []byte) ([]uint64, error) { - if isLessThan(in, order) == 0 { - return nil, errInputRange - } - return conv.BytesBe2Uint64Le(in), nil -} - -func setBytesUnbounded(in []byte, order []byte) []uint64 { - inBig := new(big.Int).SetBytes(in) - inBig.Mod(inBig, new(big.Int).SetBytes(order)) - inBytes := inBig.FillBytes(make([]byte, len(order))) - return conv.BytesBe2Uint64Le(inBytes) -} - -// isLessThan returns 1 if 0 <= x < y, otherwise 0. Assumes that slices have the same length. -func isLessThan(x, y []byte) int { - i := 0 - for i < len(x)-1 && x[i] == y[i] { - i++ - } - return 1 - subtle.ConstantTimeLessOrEq(int(y[i]), int(x[i])) -} - -func randomInt(out []uint64, rnd io.Reader, order []byte) error { - r, err := rand.Int(rnd, new(big.Int).SetBytes(order)) - if err == nil { - conv.BigInt2Uint64Le(out, r) - } - return err -} - -// ctUint64Eq returns 1 if the two slices have equal contents and 0 otherwise. -func ctUint64Eq(x, y []uint64) (b int) { - if len(x) == len(y) { - var v uint64 - for i := 0; i < len(x); i++ { - v |= x[i] ^ y[i] - } - return subtle.ConstantTimeEq(int32(v>>32), 0) & subtle.ConstantTimeEq(int32(v), 0) - } - return -} - -func cselectU64(z *uint64, b, x, y uint64) { *z = (x &^ (-b)) | (y & (-b)) } diff --git a/ecc/bls12381/ff/cyclo6.go b/ecc/bls12381/ff/cyclo6.go deleted file mode 100644 index 5eb8a748..00000000 --- a/ecc/bls12381/ff/cyclo6.go +++ /dev/null @@ -1,111 +0,0 @@ -package ff - -// Cyclo6 represents an element of the 6th cyclotomic group. -type Cyclo6 Fp12 - -func (z Cyclo6) String() string { return (Fp12)(z).String() } -func (z Cyclo6) IsEqual(x *Cyclo6) int { return (Fp12)(z).IsEqual((*Fp12)(x)) } -func (z Cyclo6) IsIdentity() int { i := &Fp12{}; i.SetOne(); return z.IsEqual((*Cyclo6)(i)) } -func (z *Cyclo6) Frob(x *Cyclo6) { (*Fp12)(z).Frob((*Fp12)(x)) } -func (z *Cyclo6) Mul(x, y *Cyclo6) { (*Fp12)(z).Mul((*Fp12)(x), (*Fp12)(y)) } -func (z *Cyclo6) Inv(x *Cyclo6) { *z = *x; z[1].Neg() } -func (z *Cyclo6) exp(x *Cyclo6, n []byte) { (*Fp12)(z).Exp((*Fp12)(x), n) } -func (z *Cyclo6) Sqr(x *Cyclo6) { - // Method of Granger-Scott. - // Page 7 of "Faster Squaring in the Cyclotomic Subgroup of Sixth Degree Extensions" - // https://www.iacr.org/archive/pkc2010/60560212/60560212.pdf - var xx, zz Fp12Cubic - xx.FromFp12((*Fp12)(x)) - - a, b, c := &xx[0], &xx[1], &xx[2] - z0, z1, z2 := &zz[0], &zz[1], &zz[2] - - var aa, bb, cc, tt Fp4 - aa.Sqr(a) - bb.Sqr(b) - cc.Sqr(c) - cc.mulT(&cc) - - z0.Add(&aa, &aa) - z0.Add(z0, &aa) - tt.Add(a, a) - tt.Cjg() - z0.Sub(z0, &tt) - - z1.Add(&cc, &cc) - z1.Add(z1, &cc) - tt.Add(b, b) - tt.Cjg() - z1.Add(z1, &tt) - - z2.Add(&bb, &bb) - z2.Add(z2, &bb) - tt.Add(c, c) - tt.Cjg() - z2.Sub(z2, &tt) - - (*Fp12)(z).FromFp12Cubic(&zz) -} - -// PowToX computes z = x^paramX, where paramX is the parameter of the BLS curve. -func (z *Cyclo6) PowToX(x *Cyclo6) { - t := new(Cyclo6) - *t = *x - const lenX = 64 - for i := lenX - 2; i >= 0; i-- { - t.Sqr(t) - // paramX is -2 ^ 63 - 2 ^ 62 - 2 ^ 60 - 2 ^ 57 - 2 ^ 48 - 2 ^ 16 - if (i == 62) || (i == 60) || (i == 57) || (i == 48) || (i == 16) { - t.Mul(t, x) - } - } - z.Inv(t) -} - -// EasyExponentiation calculates g = f^(p^6-1)(p^2+1), where g becomes an -// element of the 6-th cyclotomic group. -func EasyExponentiation(g *Cyclo6, f *Fp12) { - var t0, t1, p Fp12 - p.Frob(f) // p = f^(p) - p.Frob(&p) // p = f^(p^2) - t0.Mul(&p, f) // t0 = f^(p^2 + 1) - t1.Frob(&t0) // t1 = f^(p^2 + 1)*(p) - t1.Frob(&t1) // t1 = f^(p^2 + 1)*(p^2) - t1.Frob(&t1) // t1 = f^(p^2 + 1)*(p^3) - t1.Frob(&t1) // t1 = f^(p^2 + 1)*(p^4) - t1.Frob(&t1) // t1 = f^(p^2 + 1)*(p^5) - t1.Frob(&t1) // t1 = f^(p^2 + 1)*(p^6) - t0.Inv(&t0) // t0 = f^-(p^2 + 1) - t0.Mul(&t0, &t1) // t0 = f^(p^2 + 1)*(p^6 - 1) - - *g = (Cyclo6)(t0) -} - -// HardExponentiation calculates u = g^(Cy_6(p)/r), where u is a root of unity. -func HardExponentiation(u *URoot, g *Cyclo6) { - var t0, t1, _g, g3 Cyclo6 - var c, a0, a1, a2, a3 Cyclo6 - _g.Inv(g) // _g = g^-1 - g3.Sqr(g) // g3 = g^2 - g3.Mul(&g3, g) // g3 = g^3 - t0.PowToX(g) // t0 = g^x - t0.Mul(&t0, &_g) // t0 = g^(x-1) - t1.PowToX(&t0) // t1 = g^(x-1)*x - t0.Inv(&t0) // t0 = g^-(x-1) - a3.Mul(&t1, &t0) // a3 = g^(x-1)*(x-1) - a2.Frob(&a3) // a2 = a3*p - a1.Frob(&a2) // a1 = a2*p = a3*p^2 - t0.Inv(&a3) // t0 = -a3 - a1.Mul(&a1, &t0) // a1 = a3*p^2-a3 - a0.Frob(&a1) // a0 = a3*p^3-a3*p - a0.Mul(&a0, &g3) // a0 = a3*p^3-a3*p+3 - - c.PowToX(&a3) // c = g^(a3*x) - c.Mul(&c, &a2) // c = g^(a3*x+a2) - c.PowToX(&c) // c = g^(a3*x+a2)*x = g^(a3*x^2+a2*x) - c.Mul(&c, &a1) // c = g^(a3*x^2+a2*x+a1) - c.PowToX(&c) // c = g^(a3*x^2+a2*x+a1)*x = g^(a3*x^3+a2*x^2+a1*x) - c.Mul(&c, &a0) // c = g^(a3*x^3+a2*x^2+a1*x+a0) - - *u = (URoot)(c) -} diff --git a/ecc/bls12381/ff/cyclo6_test.go b/ecc/bls12381/ff/cyclo6_test.go deleted file mode 100644 index 64bcbe29..00000000 --- a/ecc/bls12381/ff/cyclo6_test.go +++ /dev/null @@ -1,140 +0,0 @@ -package ff - -import ( - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func randomCyclo6(t testing.TB) *Cyclo6 { - c := &Cyclo6{} - EasyExponentiation(c, randomFp12(t)) - return c -} - -// phi6primeSq evaluates the 6-th cyclotomic polynomial, \phi_6(x) = x^2-x+1, at p^2. -func phi6primeSq() []byte { - one := big.NewInt(1) - p := new(big.Int).SetBytes(fpOrder[:]) // p - p2 := new(big.Int).Mul(p, p) // p^2 - p4 := new(big.Int).Sub(p2, one) // p^2 - 1 - p4.Mul(p4, p2) // p^4 - p^2 - p4.Add(p4, one) // p^4 - p^2 + 1 - return p4.Bytes() -} - -func TestCyclo6(t *testing.T) { - const testTimes = 1 << 10 - t.Run("no_alias", func(t *testing.T) { - var want, got Cyclo6 - x := randomCyclo6(t) - got = *x - got.Sqr(&got) - want = *x - want.Mul(&want, &want) - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - }) - t.Run("order", func(t *testing.T) { - cyclo6Order := phi6primeSq() - var z Cyclo6 - for i := 0; i < 16; i++ { - x := randomCyclo6(t) - z.exp(x, cyclo6Order) - - // x^phi6primeSq = 1 - got := z.IsIdentity() - want := 1 - if got != want { - test.ReportError(t, got, want, x, z) - } - } - }) - t.Run("mul_inv", func(t *testing.T) { - var z Cyclo6 - for i := 0; i < testTimes; i++ { - x := randomCyclo6(t) - y := randomCyclo6(t) - - // x*y*x^1 = y - z.Inv(x) - z.Mul(&z, y) - z.Mul(&z, x) - got := z - want := y - if got.IsEqual(want) == 0 { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("mul_sqr", func(t *testing.T) { - var want, got Cyclo6 - for i := 0; i < testTimes; i++ { - x := randomCyclo6(t) - - // x*x = x^2 - got.Mul(x, x) - want.Sqr(x) - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - } - }) - t.Run("sqr_sqrfasr", func(t *testing.T) { - var want, got Cyclo6 - for i := 0; i < testTimes; i++ { - x := randomCyclo6(t) - - // Specialized square in cyclotomic vs Generic Square in Fp12 - got.Sqr(x) - (*Fp12)(&want).Sqr((*Fp12)(x)) - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - } - }) - - t.Run("invFp12_vs_invCyclo6", func(t *testing.T) { - var want, got Fp12 - var y Cyclo6 - for i := 0; i < testTimes; i++ { - x := randomCyclo6(t) - - y.Inv(x) - got = (Fp12)(y) - want.Inv((*Fp12)(x)) - - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - } - }) -} - -func BenchmarkCyclo6(b *testing.B) { - x := randomCyclo6(b) - y := randomCyclo6(b) - z := randomCyclo6(b) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Mul(x, y) - } - }) - b.Run("Sqr", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Sqr(x) - } - }) - b.Run("Inv", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Inv(x) - } - }) - b.Run("PowToX", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.PowToX(x) - } - }) -} diff --git a/ecc/bls12381/ff/doc.go b/ecc/bls12381/ff/doc.go deleted file mode 100644 index 83cbea43..00000000 --- a/ecc/bls12381/ff/doc.go +++ /dev/null @@ -1,61 +0,0 @@ -// Package ff provides finite fields and groups useful for the BLS12-381 curve. -// -// # Fp -// -// Fp are elements of the prime field GF(p), where -// -// p = 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab -// -// The binary representation takes FpSize = 48 bytes encoded in big-endian form. -// -// # Fp2 -// -// Fp2 are elements of the finite field GF(p^2) = Fp[u]/(u^2+1) represented as -// -// (a[1]u + a[0]) in Fp2, where a[0],a[1] in Fp -// -// The binary representation takes Fp2Size = 96 bytes encoded as a[1] || a[0] -// all in big-endian form. -// -// # Fp4 -// -// Fp4 is GF(p^4)=Fp2[t]/(t^2-(u+1)). We use the representation a[1]v+a[0]. -// There is no fixed external form. -// -// # Fp6 -// -// Fp6 are elements of the finite field GF(p^6) = Fp2[v]/(v^3-u-1) represented as -// -// (a[2]v^2 + a[1]v + a[0]) in Fp6, where a[0],a[1],a[2] in Fp2 -// -// The binary representation takes Fp6Size = 288 bytes encoded as a[2] || a[1] || a[0] -// all in big-endian form. -// -// # Fp12 -// -// Fp12 are elements of the finite field GF(p^12) = Fp6[w]/(w^2-v) represented as -// -// (a[1]w + a[0]) in Fp12, where a[0],a[1] in Fp6 -// -// The binary representation takes Fp12Size = 576 bytes encoded as a[1] || a[0] -// all in big-endian form. -// -// We can also represent this field via Fp4[w]/(w^3-t). This is the struct Fp12alt, -// used to accelerate the pairing calculation. -// -// # Scalar -// -// Scalar are elements of the prime field GF(r), where -// -// r = 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001 -// -// The binary representation takes ScalarSize = 32 bytes encoded in big-endian form. -// -// # Groups -// -// Cyclo6 are elements of the 6th cyclotomic group contained in Fp12. -// For efficient arithmetic see Granger-Scott "Faster Squaring in the Cyclotomic Subgroup of Sixth -// Degree Extensions" (https://eprint.iacr.org/2009/565). -// -// URoot are elements of the r-roots of unity group contained in Fp12. -package ff diff --git a/ecc/bls12381/ff/fp.go b/ecc/bls12381/ff/fp.go deleted file mode 100644 index b88ba26f..00000000 --- a/ecc/bls12381/ff/fp.go +++ /dev/null @@ -1,263 +0,0 @@ -package ff - -import ( - "io" - - "github.com/quantumcoinproject/circl/internal/conv" -) - -// FpSize is the length in bytes of an Fp element. -const FpSize = 48 - -// fpMont represents an element in the Montgomery domain (little-endian). -type fpMont = [FpSize / 8]uint64 - -// fpRaw represents an element in the integers domain (little-endian). -type fpRaw = [FpSize / 8]uint64 - -// Fp represents prime field elements as positive integers less than FpOrder. -type Fp struct{ i fpMont } - -func (z Fp) String() string { x := z.fromMont(); return conv.Uint64Le2Hex(x[:]) } -func (z *Fp) SetUint64(n uint64) { z.toMont(&fpRaw{n}) } -func (z *Fp) SetOne() { z.SetUint64(1) } -func (z *Fp) Random(r io.Reader) error { return randomInt(z.i[:], r, fpOrder[:]) } - -// IsNegative returns 0 if the least absolute residue for z is in [0,(p-1)/2], -// and 1 otherwise. Equivalently, this function returns 1 if z is -// lexicographically larger than -z. -func (z Fp) IsNegative() int { - b, _ := z.MarshalBinary() - return 1 - isLessThan(b, fpOrderPlus1Div2[:]) -} - -// IsZero returns 1 if z == 0 and 0 otherwise. -func (z Fp) IsZero() int { return ctUint64Eq(z.i[:], (&fpMont{})[:]) } - -// IsEqual returns 1 if z == x and 0 otherwise. -func (z Fp) IsEqual(x *Fp) int { return ctUint64Eq(z.i[:], x.i[:]) } -func (z *Fp) Neg() { fiatFpMontSub(&z.i, &fpMont{}, &z.i) } -func (z *Fp) Add(x, y *Fp) { fiatFpMontAdd(&z.i, &x.i, &y.i) } -func (z *Fp) Sub(x, y *Fp) { fiatFpMontSub(&z.i, &x.i, &y.i) } -func (z *Fp) Mul(x, y *Fp) { fiatFpMontMul(&z.i, &x.i, &y.i) } -func (z *Fp) Sqr(x *Fp) { fiatFpMontSquare(&z.i, &x.i) } -func (z *Fp) toMont(in *fpRaw) { fiatFpMontMul(&z.i, in, &fpRSquare) } -func (z Fp) fromMont() (out fpRaw) { fiatFpMontMul(&out, &z.i, &fpMont{1}); return } -func (z Fp) Sgn0() int { return int(z.fromMont()[0]) & 1 } - -// Sqrt returns 1 and sets z=sqrt(x) only if x is a quadratic-residue; otherwise, returns 0 and z is unmodified. -func (z *Fp) Sqrt(x *Fp) int { - var y, y2 Fp - y.ExpVarTime(x, fpOrderPlus1Div4[:]) - y2.Sqr(&y) - isQR := y2.IsEqual(x) - z.CMov(z, &y, isQR) - return isQR -} - -// CMov sets z=x if b == 0 and z=y if b == 1. Its behavior is undefined if b takes any other value. -func (z *Fp) CMov(x, y *Fp, b int) { - mask := -uint64(b & 0x1) - for i := 0; i < FpSize/8; i++ { - z.i[i] = (x.i[i] &^ mask) | (y.i[i] & mask) - } -} - -// FpOrder is the order of the base field for towering returned as a big-endian slice. -// -// FpOrder = 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab. -func FpOrder() []byte { o := fpOrder; return o[:] } - -// ExpVarTime calculates z=x^n, where n is the exponent in big-endian order. -func (z *Fp) ExpVarTime(x *Fp, n []byte) { - zz := new(Fp) - zz.SetOne() - N := 8 * len(n) - for i := 0; i < N; i++ { - zz.Sqr(zz) - bit := 0x1 & (n[i/8] >> uint(7-i%8)) - if bit != 0 { - zz.Mul(zz, x) - } - } - *z = *zz -} - -// SetBytes assigns to z the number modulo FpOrder stored in the slice -// (in big-endian order). -func (z *Fp) SetBytes(data []byte) { - in64 := setBytesUnbounded(data, fpOrder[:]) - s := &fpRaw{} - copy(s[:], in64[:FpSize/8]) - z.toMont(s) -} - -// MarshalBinary returns a slice of FpSize bytes that contains the minimal -// residue of z such that 0 <= z < FpOrder (in big-endian order). -func (z *Fp) MarshalBinary() ([]byte, error) { - x := z.fromMont() - return conv.Uint64Le2BytesBe(x[:]), nil -} - -// UnmarshalBinary reconstructs a Fp from a slice that must have at least -// FpSize bytes and contain a number (in big-endian order) from 0 -// to FpOrder-1. -func (z *Fp) UnmarshalBinary(b []byte) error { - if len(b) < FpSize { - return errInputLength - } - in64, err := setBytesBounded(b[:FpSize], fpOrder[:]) - if err == nil { - s := &fpRaw{} - copy(s[:], in64[:FpSize/8]) - z.toMont(s) - } - return err -} - -// SetString reconstructs a Fp from a numeric string from 0 to FpOrder-1. -func (z *Fp) SetString(s string) error { - in64, err := setString(s, fpOrder[:]) - if err == nil { - s := &fpRaw{} - copy(s[:], in64[:FpSize/8]) - z.toMont(s) - } - return err -} - -func fiatFpMontCmovznzU64(z *uint64, b, x, y uint64) { cselectU64(z, b, x, y) } - -func (z *Fp) Inv(x *Fp) { - // Addition chain found using mmcloughlin/addchain: v0.3.0 - // McLoughlin, Michael Ben. (2021). https://doi.org/10.5281/zenodo.4758226 - var i2, i4, i8, i9, i11, i13, i17, i20, i25, i26, i52, i54, i55, i77, i79, - i86, i93, i103, i105, i119, i123, i137, i149, i151, i169, i177, i191, - i195, i208, i215, i225, i229, i235, i245, i255 Fp - - i2.Sqr(x) - i4.Sqr(&i2) - i8.Sqr(&i4) - i9.Mul(&i8, x) - i11.Mul(&i9, &i2) - i13.Mul(&i11, &i2) - i17.Mul(&i13, &i4) - i20.Mul(&i11, &i9) - i25.Mul(&i17, &i8) - i26.Mul(&i25, x) - i52.Sqr(&i26) - i54.Mul(&i52, &i2) - i55.Mul(&i54, x) - i77.Mul(&i52, &i25) - i79.Mul(&i77, &i2) - i86.Mul(&i77, &i8) - i93.Mul(&i86, &i8) - i103.Mul(&i77, &i26) - i105.Mul(&i103, &i2) - i119.Mul(&i93, &i26) - i123.Mul(&i119, &i4) - i137.Mul(&i86, &i52) - i149.Mul(&i123, &i26) - i151.Mul(&i149, &i2) - i169.Mul(&i149, &i20) - i177.Mul(&i169, &i8) - i191.Mul(&i137, &i54) - i195.Mul(&i191, &i4) - i208.Mul(&i195, &i13) - i215.Mul(&i195, &i20) - i225.Mul(&i208, &i17) - i229.Mul(&i225, &i4) - i235.Mul(&i215, &i20) - i245.Mul(&i225, &i20) - i255.Mul(&i235, &i20) - z.Mul(&i225, &i191) - - for _, s := range []struct { - l int - x *Fp - }{ - {8, &i17}, - {11, &i245}, - {11, &i229}, - {8, &i255}, - {7, &i77}, - {9, &i105}, - {10, &i177}, - {7, &i93}, - {9, &i123}, - {6, &i25}, - {11, &i105}, - {9, &i235}, - {10, &i215}, - {6, &i25}, - {10, &i119}, - {9, &i151}, - {11, &i79}, - {10, &i225}, - {9, &i137}, - {9, &i191}, - {8, &i103}, - {10, &i195}, - {9, &i149}, - {12, &i123}, - {5, &i11}, - {11, &i123}, - {7, &i9}, - {13, &i245}, - {9, &i191}, - {8, &i255}, - {8, &i235}, - {11, &i169}, - {8, &i255}, - {8, &i255}, - {6, &i55}, - {10, &i255}, - {9, &i255}, - {8, &i255}, - {8, &i255}, - {8, &i255}, - {7, &i86}, - {9, &i169}, - } { - for i := 0; i < s.l; i++ { - z.Sqr(z) - } - z.Mul(z, s.x) - } -} - -var ( - // fpOrder is the order of the Fp field (big-endian). - fpOrder = [FpSize]byte{ - 0x1a, 0x01, 0x11, 0xea, 0x39, 0x7f, 0xe6, 0x9a, - 0x4b, 0x1b, 0xa7, 0xb6, 0x43, 0x4b, 0xac, 0xd7, - 0x64, 0x77, 0x4b, 0x84, 0xf3, 0x85, 0x12, 0xbf, - 0x67, 0x30, 0xd2, 0xa0, 0xf6, 0xb0, 0xf6, 0x24, - 0x1e, 0xab, 0xff, 0xfe, 0xb1, 0x53, 0xff, 0xff, - 0xb9, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xab, - } - // fpOrderPlus1Div2 is the half of (fpOrder plus one) used for lexicographically order (big-endian). - fpOrderPlus1Div2 = [FpSize]byte{ - 0x0d, 0x00, 0x88, 0xf5, 0x1c, 0xbf, 0xf3, 0x4d, - 0x25, 0x8d, 0xd3, 0xdb, 0x21, 0xa5, 0xd6, 0x6b, - 0xb2, 0x3b, 0xa5, 0xc2, 0x79, 0xc2, 0x89, 0x5f, - 0xb3, 0x98, 0x69, 0x50, 0x7b, 0x58, 0x7b, 0x12, - 0x0f, 0x55, 0xff, 0xff, 0x58, 0xa9, 0xff, 0xff, - 0xdc, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xd5, 0x56, - } - // fpOrderPlus1Div4 is (fpOrder plus one) divided by four used for square-roots (big-endian). - fpOrderPlus1Div4 = [FpSize]byte{ - 0x06, 0x80, 0x44, 0x7a, 0x8e, 0x5f, 0xf9, 0xa6, - 0x92, 0xc6, 0xe9, 0xed, 0x90, 0xd2, 0xeb, 0x35, - 0xd9, 0x1d, 0xd2, 0xe1, 0x3c, 0xe1, 0x44, 0xaf, - 0xd9, 0xcc, 0x34, 0xa8, 0x3d, 0xac, 0x3d, 0x89, - 0x07, 0xaa, 0xff, 0xff, 0xac, 0x54, 0xff, 0xff, - 0xee, 0x7f, 0xbf, 0xff, 0xff, 0xff, 0xea, 0xab, - } - // fpRSquare is R^2 mod fpOrder, where R=2^384 (little-endian). - fpRSquare = fpMont{ - 0xf4df1f341c341746, 0x0a76e6a609d104f1, - 0x8de5476c4c95b6d5, 0x67eb88a9939d83c0, - 0x9a793e85b519952d, 0x11988fe592cae3aa, - } -) diff --git a/ecc/bls12381/ff/fp12.go b/ecc/bls12381/ff/fp12.go deleted file mode 100644 index 8ebf2f6c..00000000 --- a/ecc/bls12381/ff/fp12.go +++ /dev/null @@ -1,125 +0,0 @@ -package ff - -import ( - "crypto/subtle" - "fmt" -) - -// Fp12Size is the length in bytes of an Fp12 element. -const Fp12Size = 2 * Fp6Size - -// Fp12 represents an element of the field Fp12 = Fp6[w]/(w^2-v)., where v in Fp6. -type Fp12 [2]Fp6 - -func (z Fp12) String() string { return fmt.Sprintf("0: %v\n1: %v", z[0], z[1]) } -func (z *Fp12) SetOne() { z[0].SetOne(); z[1] = Fp6{} } -func (z Fp12) IsZero() int { return z.IsEqual(&Fp12{}) } -func (z Fp12) IsEqual(x *Fp12) int { return z[0].IsEqual(&x[0]) & z[1].IsEqual(&x[1]) } -func (z *Fp12) MulBeta() { t := z[0]; z[0].Sub(&z[0], &z[1]); z[1].Add(&t, &z[1]) } -func (z *Fp12) Frob(x *Fp12) { z[0].Frob(&x[0]); z[1].Frob(&x[1]); z[1].Mul(&z[1], &Fp6{frob12W1}) } -func (z *Fp12) Cjg() { z[1].Neg() } -func (z *Fp12) Neg() { z[0].Neg(); z[1].Neg() } -func (z *Fp12) Add(x, y *Fp12) { z[0].Add(&x[0], &y[0]); z[1].Add(&x[1], &y[1]) } -func (z *Fp12) Sub(x, y *Fp12) { z[0].Sub(&x[0], &y[0]); z[1].Sub(&x[1], &y[1]) } -func (z *Fp12) Mul(x, y *Fp12) { - var x0y0, x1y1, sx, sy, k Fp6 - x0y0.Mul(&x[0], &y[0]) - x1y1.Mul(&x[1], &y[1]) - sx.Add(&x[0], &x[1]) - sy.Add(&y[0], &y[1]) - k.Mul(&sx, &sy) - z[1].Sub(&k, &x0y0) - z[1].Sub(&z[1], &x1y1) - x1y1.MulBeta() - z[0].Add(&x0y0, &x1y1) -} - -func (z *Fp12) Sqr(x *Fp12) { - var x02, x12, k Fp6 - x02.Sqr(&x[0]) - x12.Sqr(&x[1]) - x12.MulBeta() - k.Mul(&x[0], &x[1]) - z[0].Add(&x02, &x12) - z[1].Add(&k, &k) -} - -func (z *Fp12) Inv(x *Fp12) { - var x02, x12, den Fp6 - x02.Sqr(&x[0]) - x12.Sqr(&x[1]) - x12.MulBeta() - den.Sub(&x02, &x12) - den.Inv(&den) - z[0].Mul(&x[0], &den) - z[1].Mul(&x[1], &den) - z[1].Neg() -} - -func (z *Fp12) CMov(x, y *Fp12, b int) { - z[0].CMov(&x[0], &y[0], b) - z[1].CMov(&x[1], &y[1], b) -} - -// Exp calculates z=x^n, where n is the exponent in big-endian order. -func (z *Fp12) Exp(x *Fp12, n []byte) { - zz := new(Fp12) - zz.SetOne() - T := new(Fp12) - var mults [16]Fp12 - mults[0].SetOne() - mults[1] = *x - for i := 1; i < 8; i++ { - mults[2*i] = mults[i] - mults[2*i].Sqr(&mults[2*i]) - mults[2*i+1].Mul(&mults[2*i], x) - } - N := 8 * len(n) - for i := 0; i < N; i += 4 { - zz.Sqr(zz) - zz.Sqr(zz) - zz.Sqr(zz) - zz.Sqr(zz) - idx := 0xf & (n[i/8] >> uint(4-i%8)) - for j := 0; j < 16; j++ { - T.CMov(T, &mults[j], subtle.ConstantTimeByteEq(idx, uint8(j))) - } - zz.Mul(zz, T) - } - *z = *zz -} - -func (z *Fp12) UnmarshalBinary(b []byte) error { - if len(b) < Fp12Size { - return errInputLength - } - return errFirst( - z[1].UnmarshalBinary(b[:Fp6Size]), - z[0].UnmarshalBinary(b[Fp6Size:2*Fp6Size]), - ) -} - -func (z Fp12) MarshalBinary() (b []byte, e error) { - var b0, b1 []byte - if b1, e = z[1].MarshalBinary(); e == nil { - if b0, e = z[0].MarshalBinary(); e == nil { - return append(b1, b0...), e - } - } - return -} - -// frob12W1 is Fp2 = [toMont(frob12W1_0), toMont(frob12W1_1) ], where -// -// frob12W1_0 = 0x1904d3bf02bb0667c231beb4202c0d1f0fd603fd3cbd5f4f7b2443d784bab9c4f67ea53d63e7813d8d0775ed92235fb8 -// frob12W1_1 = 0xfc3e2b36c4e03288e9e902231f9fb854a14787b6c7b36fec0c8ec971f63c5f282d5ac14d6c7ec22cf78a126ddc4af3 -var frob12W1 = Fp2{ - Fp{fpMont{ // (little-endian) - 0x07089552b319d465, 0xc6695f92b50a8313, 0x97e83cccd117228f, - 0xa35baecab2dc29ee, 0x1ce393ea5daace4d, 0x08f2220fb0fb66eb, - }}, - Fp{fpMont{ // (little-endian) - 0xb2f66aad4ce5d646, 0x5842a06bfc497cec, 0xcf4895d42599d394, - 0xc11b9cba40a8e8d0, 0x2e3813cbe5a0de89, 0x110eefda88847faf, - }}, -} diff --git a/ecc/bls12381/ff/fp12_test.go b/ecc/bls12381/ff/fp12_test.go deleted file mode 100644 index 859657ec..00000000 --- a/ecc/bls12381/ff/fp12_test.go +++ /dev/null @@ -1,117 +0,0 @@ -package ff - -import ( - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func randomFp12(t testing.TB) *Fp12 { return &Fp12{*randomFp6(t), *randomFp6(t)} } - -func TestFp12(t *testing.T) { - const testTimes = 1 << 8 - t.Run("no_alias", func(t *testing.T) { - var want, got Fp12 - x := randomFp12(t) - got = *x - got.Sqr(&got) - want = *x - want.Mul(&want, &want) - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - }) - t.Run("mul_inv", func(t *testing.T) { - var z Fp12 - for i := 0; i < testTimes; i++ { - x := randomFp12(t) - y := randomFp12(t) - - // x*y*x^1 - y = 0 - z.Inv(x) - z.Mul(&z, y) - z.Mul(&z, x) - z.Sub(&z, y) - got := z.IsZero() - want := 1 - if got != want { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("mul_sqr", func(t *testing.T) { - var l0, l1, r0, r1 Fp12 - for i := 0; i < testTimes; i++ { - x := randomFp12(t) - y := randomFp12(t) - - // (x+y)(x-y) = (x^2-y^2) - l0.Add(x, y) - l1.Sub(x, y) - l0.Mul(&l0, &l1) - r0.Sqr(x) - r1.Sqr(y) - r0.Sub(&r0, &r1) - got := &l0 - want := &r0 - if got.IsEqual(want) == 0 { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("marshal", func(t *testing.T) { - var b Fp12 - for i := 0; i < testTimes; i++ { - a := randomFp12(t) - s, err := a.MarshalBinary() - test.CheckNoErr(t, err, "MarshalBinary failed") - err = b.UnmarshalBinary(s) - test.CheckNoErr(t, err, "UnmarshalBinary failed") - if b.IsEqual(a) == 0 { - test.ReportError(t, a, b) - } - } - }) - t.Run("frobenius", func(t *testing.T) { - var got, want Fp12 - p := FpOrder() - for i := 0; i < testTimes; i++ { - x := randomFp12(t) - - // Frob(x) == x^p - got.Frob(x) - want.Exp(x, p) - - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - } - }) -} - -func BenchmarkFp12(b *testing.B) { - x := randomFp12(b) - y := randomFp12(b) - z := randomFp12(b) - - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Add(x, y) - } - }) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Mul(x, y) - } - }) - b.Run("Sqr", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Sqr(x) - } - }) - b.Run("Inv", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Inv(x) - } - }) -} diff --git a/ecc/bls12381/ff/fp12cubic.go b/ecc/bls12381/ff/fp12cubic.go deleted file mode 100644 index 05125837..00000000 --- a/ecc/bls12381/ff/fp12cubic.go +++ /dev/null @@ -1,168 +0,0 @@ -package ff - -import "fmt" - -// Fp12Cubic represents elements of Fp4[w]/w^3-t -type Fp12Cubic [3]Fp4 - -// LineValue a represents a[0]+a[1]*w^2+a[2]*w^3, with all values in Fp2. -// This lets us shave off a number of Fp2 multiplications. -type LineValue [3]Fp2 - -func (z Fp12Cubic) String() string { - return fmt.Sprintf("%s + ( %s )*w + ( %s )*w^2", z[0], z[1], z[2]) -} - -func (z Fp12Cubic) IsEqual(x *Fp12Cubic) int { - return z[0].IsEqual(&x[0]) & z[1].IsEqual(&x[1]) & z[2].IsEqual(&x[2]) -} - -func (z *Fp12Cubic) FromFp12(x *Fp12) { - // To understand this function, write everything in Fp2[w]/(w^6-(u+1)). - // v = w^2 - // t = w^3 - z[0][0] = x[0][0] // w^0 - z[1][0] = x[1][0] // w^1 - z[2][0] = x[0][1] // w^2 - z[0][1] = x[1][1] // w^3 - z[1][1] = x[0][2] // w^4 - z[2][1] = x[1][2] // w^5 -} - -func (z *Fp12) FromFp12Cubic(x *Fp12Cubic) { - z[0][0] = x[0][0] // w^0 - z[1][0] = x[1][0] // w^1 - z[0][1] = x[2][0] // w^2 - z[1][1] = x[0][1] // w^3 - z[0][2] = x[1][1] // w^4 - z[1][2] = x[2][1] // w^5 -} - -func (z *Fp12Cubic) Add(x *Fp12Cubic, y *Fp12Cubic) { - z[0].Add(&x[0], &y[0]) - z[1].Add(&x[1], &y[1]) - z[2].Add(&x[2], &y[2]) -} - -func (z *Fp12Cubic) SetOne() { - z[0].SetOne() - z[1] = Fp4{} - z[2] = Fp4{} -} - -func (z *Fp12Cubic) Mul(x *Fp12Cubic, y *Fp12Cubic) { - // This is a Karatsuba like technique: compute x_iy_i, then - // subtract the terms from expressions like (x0+x1)(y0+y1). - // See Multiplication and Squaring in Pairing Friendly Fields - // for more. - var v0, v1, v2, p0, p1, p2, tx, ty Fp4 - v0.Mul(&x[0], &y[0]) - v1.Mul(&x[1], &y[1]) - v2.Mul(&x[2], &y[2]) - - tx.Add(&x[1], &x[2]) - ty.Add(&y[1], &y[2]) - p0.Mul(&tx, &ty) - - tx.Add(&x[0], &x[1]) - ty.Add(&y[0], &y[1]) - p1.Mul(&tx, &ty) - - tx.Add(&x[0], &x[2]) - ty.Add(&y[0], &y[2]) - p2.Mul(&tx, &ty) - - z[0].Sub(&p0, &v1) - z[0].Sub(&z[0], &v2) - z[0].mulT(&z[0]) - z[0].Add(&z[0], &v0) - - z[1].Sub(&p1, &v0) - z[1].Sub(&z[1], &v1) - tx.mulT(&v2) - z[1].Add(&z[1], &tx) - - z[2].Sub(&p2, &v0) - z[2].Add(&z[2], &v1) - z[2].Sub(&z[2], &v2) -} - -func (z *Fp12Cubic) Sqr(x *Fp12Cubic) { - // The Chung-Hasan asymmetric squaring formula. - // We keep the same notation as in Multiplication - // and Squaring on Pairing-Friendly Fields to make - // it easier to compare. - - var s0, s1, s2, s3, s4, t Fp4 - s0.Sqr(&x[0]) // x0^2 - s1.Mul(&x[0], &x[1]) - s1.Add(&s1, &s1) // 2x0x1 - t.Add(&x[0], &x[2]) - t.Sub(&t, &x[1]) - s2.Sqr(&t) // (x0-x1+x2)^2 - s3.Mul(&x[1], &x[2]) - s3.Add(&s3, &s3) // 2x1x2 - s4.Sqr(&x[2]) // x2^2 - - z[0].mulT(&s3) - z[0].Add(&z[0], &s0) - - z[1].mulT(&s4) - z[1].Add(&z[1], &s1) - - z[2].Add(&s1, &s2) - z[2].Add(&z[2], &s3) - z[2].Sub(&z[2], &s0) - z[2].Sub(&z[2], &s4) -} - -func (z *Fp12Cubic) MulLine(x *Fp12Cubic, y *LineValue) { - // Values produced by evaluating a line function - // do not have a linear term, and the quadratic term is - // in Fp2. - - // We copy the Mul method, but remove any multiplies by y1, - // and strength reduce multiplies by y2. - var y0 Fp4 - var y2 Fp2 - var v0, v2, p0, p1, p2, tx, ty Fp4 - - y0[0] = y[0] - y0[1] = y[2] - y2 = y[1] - - v0.Mul(&x[0], &y0) - v2.mulSubfield(&x[2], &y2) - - tx.Add(&x[1], &x[2]) - p0.mulSubfield(&tx, &y2) - - tx.Add(&x[0], &x[1]) - p1.Mul(&tx, &y0) - - tx.Add(&x[0], &x[2]) - ty = y0 - ty[0].Add(&ty[0], &y2) - p2.Mul(&tx, &ty) - - z[0].Sub(&p0, &v2) - z[0].mulT(&z[0]) - z[0].Add(&z[0], &v0) - - z[1].Sub(&p1, &v0) - tx.mulT(&v2) - z[1].Add(&z[1], &tx) - - z[2].Sub(&p2, &v0) - z[2].Sub(&z[2], &v2) -} - -func (z *LineValue) IsZero() int { - return z[0].IsZero() & z[1].IsZero() & z[2].IsZero() -} - -func (z *LineValue) SetOne() { - z[0].SetOne() - z[1] = Fp2{} - z[2] = Fp2{} -} diff --git a/ecc/bls12381/ff/fp12cubic_test.go b/ecc/bls12381/ff/fp12cubic_test.go deleted file mode 100644 index f4c78fc0..00000000 --- a/ecc/bls12381/ff/fp12cubic_test.go +++ /dev/null @@ -1,83 +0,0 @@ -package ff - -import ( - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func TestFP12CubicAdd(t *testing.T) { - const testTimes = 1 << 8 - for i := 0; i < testTimes; i++ { - var xalt, yalt, zalt Fp12Cubic - var z, zcmp Fp12 - x := randomFp12(t) - y := randomFp12(t) - xalt.FromFp12(x) - yalt.FromFp12(y) - zalt.Add(&xalt, &yalt) - z.Add(x, y) - zcmp.FromFp12Cubic(&zalt) - if z.IsEqual(&zcmp) == 0 { - test.ReportError(t, z, zcmp, x, y) - } - } -} - -func TestFP12CubicMul(t *testing.T) { - const testTimes = 1 << 8 - for i := 0; i < testTimes; i++ { - var xalt, yalt, zalt Fp12Cubic - var z, zcmp Fp12 - x := randomFp12(t) - y := randomFp12(t) - xalt.FromFp12(x) - yalt.FromFp12(y) - zalt.Mul(&xalt, &yalt) - z.Mul(x, y) - zcmp.FromFp12Cubic(&zalt) - if z.IsEqual(&zcmp) == 0 { - test.ReportError(t, z, zcmp, x, y) - } - } -} - -func TestFP12AltSqr(t *testing.T) { - const testTimes = 1 << 8 - for i := 0; i < testTimes; i++ { - var xalt, zalt Fp12Cubic - var z, zcmp Fp12 - x := randomFp12(t) - xalt.FromFp12(x) - zalt.Sqr(&xalt) - z.Sqr(x) - zcmp.FromFp12Cubic(&zalt) - if z.IsEqual(&zcmp) == 0 { - test.ReportError(t, z, zcmp, x) - } - } -} - -func TestFP12CubicLine(t *testing.T) { - const testTimes = 1 << 8 - for i := 0; i < testTimes; i++ { - var x, y, z, zcmp Fp12Cubic - var yline LineValue - xnorm := randomFp12(t) - x.FromFp12(xnorm) - - yline[0] = *randomFp2(t) - yline[1] = *randomFp2(t) - yline[2] = *randomFp2(t) - - y[0][0] = yline[0] - y[0][1] = yline[2] - y[2][0] = yline[1] - - zcmp.Mul(&x, &y) - z.MulLine(&x, &yline) - if z.IsEqual(&zcmp) == 0 { - test.ReportError(t, z, zcmp, x) - } - } -} diff --git a/ecc/bls12381/ff/fp2.go b/ecc/bls12381/ff/fp2.go deleted file mode 100644 index 3fb266fe..00000000 --- a/ecc/bls12381/ff/fp2.go +++ /dev/null @@ -1,169 +0,0 @@ -package ff - -import "fmt" - -// Fp2Size is the length in bytes of an Fp2 element. -const Fp2Size = 2 * FpSize - -type Fp2 [2]Fp - -func (z Fp2) String() string { return fmt.Sprintf("0: %v\n1: %v", z[0], z[1]) } -func (z *Fp2) SetOne() { z[0].SetOne(); z[1] = Fp{} } - -// IsNegative returns 1 if z is lexicographically larger than -z; otherwise returns 0. -func (z Fp2) IsNegative() int { return z[1].IsNegative() | (z[1].IsZero() & z[0].IsNegative()) } -func (z Fp2) IsZero() int { return z.IsEqual(&Fp2{}) } -func (z Fp2) IsEqual(x *Fp2) int { return z[0].IsEqual(&x[0]) & z[1].IsEqual(&x[1]) } -func (z *Fp2) MulBeta() { t := z[0]; z[0].Sub(&z[0], &z[1]); z[1].Add(&t, &z[1]) } -func (z *Fp2) Frob(x *Fp2) { *z = *x; z.Cjg() } -func (z *Fp2) Cjg() { z[1].Neg() } -func (z *Fp2) Neg() { z[0].Neg(); z[1].Neg() } -func (z *Fp2) Add(x, y *Fp2) { z[0].Add(&x[0], &y[0]); z[1].Add(&x[1], &y[1]) } -func (z *Fp2) Sub(x, y *Fp2) { z[0].Sub(&x[0], &y[0]); z[1].Sub(&x[1], &y[1]) } -func (z *Fp2) Mul(x, y *Fp2) { - var x0y0, x1y1, sx, sy, k Fp - x0y0.Mul(&x[0], &y[0]) - x1y1.Mul(&x[1], &y[1]) - sx.Add(&x[0], &x[1]) - sy.Add(&y[0], &y[1]) - k.Mul(&sx, &sy) - z[0].Sub(&x0y0, &x1y1) - z[1].Sub(&k, &x0y0) - z[1].Sub(&z[1], &x1y1) -} - -func (z *Fp2) Sqr(x *Fp2) { - var x02, x12, k Fp - x02.Sqr(&x[0]) - x12.Sqr(&x[1]) - k.Mul(&x[0], &x[1]) - z[0].Sub(&x02, &x12) - z[1].Add(&k, &k) -} - -func (z *Fp2) Inv(x *Fp2) { - var x02, x12, den Fp - x02.Sqr(&x[0]) - x12.Sqr(&x[1]) - den.Add(&x02, &x12) - den.Inv(&den) - z[0].Mul(&x[0], &den) - z[1].Mul(&x[1], &den) - z[1].Neg() -} - -func (z Fp2) Sgn0() int { - s0, s1 := z[0].Sgn0(), z[1].Sgn0() - z0 := z[0].IsZero() - return s0 | (z0 & s1) -} - -func (z *Fp2) UnmarshalBinary(b []byte) error { - if len(b) < Fp2Size { - return errInputLength - } - return errFirst( - z[1].UnmarshalBinary(b[:FpSize]), - z[0].UnmarshalBinary(b[FpSize:2*FpSize]), - ) -} - -func (z Fp2) MarshalBinary() (b []byte, e error) { - var b0, b1 []byte - if b1, e = z[1].MarshalBinary(); e == nil { - if b0, e = z[0].MarshalBinary(); e == nil { - return append(b1, b0...), e - } - } - return -} - -// SetString reconstructs a Fp2 element as s0+s1*i, where s0 and s1 are numeric -// strings from 0 to FpOrder-1. -func (z *Fp2) SetString(s0, s1 string) (err error) { - if err = z[0].SetString(s0); err == nil { - err = z[1].SetString(s1) - } - return -} - -func (z *Fp2) CMov(x, y *Fp2, b int) { - z[0].CMov(&x[0], &y[0], b) - z[1].CMov(&x[1], &y[1], b) -} - -// ExpVarTime calculates z=x^n, where n is the exponent in big-endian order. -func (z *Fp2) ExpVarTime(x *Fp2, n []byte) { - zz := new(Fp2) - zz.SetOne() - N := 8 * len(n) - for i := 0; i < N; i++ { - zz.Sqr(zz) - bit := 0x1 & (n[i/8] >> uint(7-i%8)) - if bit != 0 { - zz.Mul(zz, x) - } - } - *z = *zz -} - -// Sqrt returns 1 and sets z=sqrt(x) only if x is a quadratic-residue; otherwise, returns 0 and z is unmodified. -func (z *Fp2) Sqrt(x *Fp2) int { - // "Square-root for q = p^2 = 9 (mod 16)" Appendix I.3 of Hashing to elliptic curves. - // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-hash-to-curve-11#appendix-I.3 - var t, tv1, tv2, tv3, tv4 Fp2 - tv1.ExpVarTime(x, fp2SqrtConst.c4[:]) - tv2.Mul(&fp2SqrtConst.c1, &tv1) - tv3.Mul(&fp2SqrtConst.c2, &tv1) - tv4.Mul(&fp2SqrtConst.c3, &tv1) - - t.Sqr(&tv1) - e1 := t.IsEqual(x) - z.CMov(z, &tv1, e1) - - t.Sqr(&tv2) - e2 := t.IsEqual(x) - z.CMov(z, &tv2, e2) - - t.Sqr(&tv3) - e3 := t.IsEqual(x) - z.CMov(z, &tv3, e3) - - t.Sqr(&tv4) - e4 := t.IsEqual(x) - z.CMov(z, &tv4, e4) - - return e1 | e2 | e3 | e4 -} - -var fp2SqrtConst = struct { - // "Square-root for q = p^2 = 9 (mod 16)" Appendix I.3 of Hashing to elliptic curves. - // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-hash-to-curve-11#appendix-I.3 - c1 Fp2 // c1 = sqrt( -1) = u - c2 Fp2 // c2 = sqrt( c1) - c3 Fp2 // c3 = sqrt(-c1) - c4 [95]byte // c4 = (p^2 + 7) / 16 (big-endian) -}{ - c1: Fp2{ // (little-endian) - Fp{fpMont{}}, - Fp{fpMont{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}}, - }, - c2: Fp2{ // (little-endian) - Fp{fpMont{0x3e2f585da55c9ad1, 0x4294213d86c18183, 0x382844c88b623732, 0x92ad2afd19103e18, 0x1d794e4fac7cf0b9, 0x0bd592fc7d825ec8}}, - Fp{fpMont{0x7bcfa7a25aa30fda, 0xdc17dec12a927e7c, 0x2f088dd86b4ebef1, 0xd1ca2087da74d4a7, 0x2da2596696cebc1d, 0x0e2b7eedbbfd87d2}}, - }, - c3: Fp2{ // (little-endian) - Fp{fpMont{0x7bcfa7a25aa30fda, 0xdc17dec12a927e7c, 0x2f088dd86b4ebef1, 0xd1ca2087da74d4a7, 0x2da2596696cebc1d, 0x0e2b7eedbbfd87d2}}, - Fp{fpMont{0x7bcfa7a25aa30fda, 0xdc17dec12a927e7c, 0x2f088dd86b4ebef1, 0xd1ca2087da74d4a7, 0x2da2596696cebc1d, 0x0e2b7eedbbfd87d2}}, - }, - c4: [95]byte{ // (big-endian) - 0x2a, 0x43, 0x7a, 0x4b, 0x8c, 0x35, 0xfc, 0x74, 0xbd, 0x27, 0x8e, 0xaa, - 0x22, 0xf2, 0x5e, 0x9e, 0x2d, 0xc9, 0x0e, 0x50, 0xe7, 0x04, 0x6b, 0x46, - 0x6e, 0x59, 0xe4, 0x93, 0x49, 0xe8, 0xbd, 0x05, 0x0a, 0x62, 0xcf, 0xd1, - 0x6d, 0xdc, 0xa6, 0xef, 0x53, 0x14, 0x93, 0x30, 0x97, 0x8e, 0xf0, 0x11, - 0xd6, 0x86, 0x19, 0xc8, 0x61, 0x85, 0xc7, 0xb2, 0x92, 0xe8, 0x5a, 0x87, - 0x09, 0x1a, 0x04, 0x96, 0x6b, 0xf9, 0x1e, 0xd3, 0xe7, 0x1b, 0x74, 0x31, - 0x62, 0xc3, 0x38, 0x36, 0x21, 0x13, 0xcf, 0xd7, 0xce, 0xd6, 0xb1, 0xd7, - 0x63, 0x82, 0xea, 0xb2, 0x6a, 0xa0, 0x00, 0x01, 0xc7, 0x18, 0xe4, - }, -} diff --git a/ecc/bls12381/ff/fp2_test.go b/ecc/bls12381/ff/fp2_test.go deleted file mode 100644 index ea6ca2de..00000000 --- a/ecc/bls12381/ff/fp2_test.go +++ /dev/null @@ -1,143 +0,0 @@ -package ff - -import ( - "fmt" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func randomFp2(t testing.TB) *Fp2 { return &Fp2{*randomFp(t), *randomFp(t)} } - -func TestFp2(t *testing.T) { - const testTimes = 1 << 9 - t.Run("no_alias", func(t *testing.T) { - var want, got Fp2 - x := randomFp2(t) - got = *x - got.Sqr(&got) - want = *x - want.Mul(&want, &want) - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - }) - t.Run("mul_inv", func(t *testing.T) { - var z Fp2 - for i := 0; i < testTimes; i++ { - x := randomFp2(t) - y := randomFp2(t) - - // x*y*x^1 - y = 0 - z.Inv(x) - z.Mul(&z, y) - z.Mul(&z, x) - z.Sub(&z, y) - got := z.IsZero() - want := 1 - if got != want { - test.ReportError(t, got, want, x, y, z) - } - } - }) - t.Run("mul_sqr", func(t *testing.T) { - var l0, l1, r0, r1 Fp2 - for i := 0; i < testTimes; i++ { - x := randomFp2(t) - y := randomFp2(t) - - // (x+y)(x-y) = (x^2-y^2) - l0.Add(x, y) - l1.Sub(x, y) - l0.Mul(&l0, &l1) - r0.Sqr(x) - r1.Sqr(y) - r0.Sub(&r0, &r1) - got := &l0 - want := &r0 - if got.IsEqual(want) == 0 { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("sqrt", func(t *testing.T) { - var r, notRoot, got Fp2 - // Check when x has square-root. - for i := 0; i < testTimes; i++ { - x := randomFp2(t) - x.Sqr(x) - - // let x is QR and r = sqrt(x); check (+r)^2 = (-r)^2 = x. - isQR := r.Sqrt(x) - test.CheckOk(isQR == 1, fmt.Sprintf("should be a QR: %v", x), t) - rNeg := r - rNeg.Neg() - - want := x - for _, root := range []*Fp2{&r, &rNeg} { - got.Sqr(root) - if got.IsEqual(want) == 0 { - test.ReportError(t, got, want, x, root) - } - } - } - // Check when x has not square-root. - var uPlus1 Fp2 - uPlus1[0].SetUint64(1) - uPlus1[1].SetUint64(1) - for i := 0; i < testTimes; i++ { - want := randomFp2(t) - x := randomFp2(t) - x.Sqr(x) - x.Mul(x, &uPlus1) // x = (u+1)*(x^2), since u+1 is not QR in Fp2. - - // let x is not QR and r = sqrt(x); check that r was not modified. - got := want - isQR := got.Sqrt(x) - test.CheckOk(isQR == 0, fmt.Sprintf("shouldn't be a QR: %v", x), t) - - if got.IsEqual(want) != 1 { - test.ReportError(t, got, want, x, notRoot) - } - } - }) - t.Run("marshal", func(t *testing.T) { - var b Fp2 - for i := 0; i < testTimes; i++ { - a := randomFp2(t) - s, err := a.MarshalBinary() - test.CheckNoErr(t, err, "MarshalBinary failed") - err = b.UnmarshalBinary(s) - test.CheckNoErr(t, err, "UnmarshalBinary failed") - if b.IsEqual(a) == 0 { - test.ReportError(t, a, b) - } - } - }) -} - -func BenchmarkFp2(b *testing.B) { - x := randomFp2(b) - y := randomFp2(b) - z := randomFp2(b) - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Add(x, y) - } - }) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Mul(x, y) - } - }) - b.Run("Sqr", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Sqr(x) - } - }) - b.Run("Inv", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Inv(x) - } - }) -} diff --git a/ecc/bls12381/ff/fp4.go b/ecc/bls12381/ff/fp4.go deleted file mode 100644 index e230b421..00000000 --- a/ecc/bls12381/ff/fp4.go +++ /dev/null @@ -1,101 +0,0 @@ -package ff - -import "fmt" - -// Fp4Size is the size of an Fp4 element -const Fp4Size = 4 * FpSize - -// Fp4 is obtained by adjoining t, the square root of u+1 to Fp2 -type Fp4 [2]Fp2 - -func (z Fp4) String() string { return fmt.Sprintf("%s + ( %s )*t", z[0], z[1]) } - -func (z *Fp4) SetOne() { - z[0].SetOne() - z[1] = Fp2{} -} - -func (z *Fp4) IsZero() int { - return z.IsEqual(&Fp4{}) -} - -func (z *Fp4) IsEqual(x *Fp4) int { - return z[0].IsEqual(&x[0]) & z[1].IsEqual(&x[1]) -} - -func (z *Fp4) Cjg() { z[1].Neg() } - -func (z *Fp4) Neg() { - z[0].Neg() - z[1].Neg() -} - -func (z *Fp4) Add(x *Fp4, y *Fp4) { - z[0].Add(&x[0], &y[0]) - z[1].Add(&x[1], &y[1]) -} - -func (z *Fp4) Sub(x *Fp4, y *Fp4) { - z[0].Sub(&x[0], &y[0]) - z[1].Sub(&x[1], &y[1]) -} - -func (z *Fp4) Mul(x *Fp4, y *Fp4) { - var x0y0, x1y1, sx, sy, k Fp2 - x0y0.Mul(&x[0], &y[0]) - x1y1.Mul(&x[1], &y[1]) - sx.Add(&x[0], &x[1]) - sy.Add(&y[0], &y[1]) - k.Mul(&sx, &sy) - k.Sub(&k, &x0y0) - k.Sub(&k, &x1y1) - // k is x0y1+x1y0 computed as (x0+x1)(y0+y1)-x0y0-x1y1 - z[1] = k - // Multiply x1y1 by u+1 - z[0][1].Add(&x1y1[0], &x1y1[1]) - z[0][0].Sub(&x1y1[0], &x1y1[1]) - z[0].Add(&z[0], &x0y0) -} - -func (z *Fp4) Sqr(x *Fp4) { - var x0s, x1s, sx, k Fp2 - x0s.Sqr(&x[0]) - x1s.Sqr(&x[1]) - sx.Add(&x[0], &x[1]) - k.Sqr(&sx) - k.Sub(&k, &x0s) - k.Sub(&k, &x1s) - - z[1] = k - // Multiplying x1s by u+1 - z[0][1].Add(&x1s[0], &x1s[1]) - z[0][0].Sub(&x1s[0], &x1s[1]) - z[0].Add(&z[0], &x0s) -} - -func (z *Fp4) Inv(x *Fp4) { - // Compute the inverse via conjugation - var denom, x0sqr, x1sqr Fp2 - x0sqr.Sqr(&x[0]) - x1sqr.Sqr(&x[1]) - denom[1].Add(&x1sqr[0], &x1sqr[1]) - denom[0].Sub(&x1sqr[0], &x1sqr[1]) - denom.Sub(&x0sqr, &denom) - denom.Inv(&denom) - z[0] = x[0] - z[1].Sub(&z[1], &x[1]) - z.mulSubfield(z, &denom) -} - -func (z *Fp4) mulSubfield(x *Fp4, y *Fp2) { - z[0].Mul(&x[0], y) - z[1].Mul(&x[1], y) -} - -func (z *Fp4) mulT(x *Fp4) { - var t Fp4 - t[1] = x[0] - t[0][1].Add(&x[1][0], &x[1][1]) - t[0][0].Sub(&x[1][0], &x[1][1]) - *z = t -} diff --git a/ecc/bls12381/ff/fp6.go b/ecc/bls12381/ff/fp6.go deleted file mode 100644 index 2c373240..00000000 --- a/ecc/bls12381/ff/fp6.go +++ /dev/null @@ -1,182 +0,0 @@ -package ff - -import "fmt" - -// Fp6Size is the length in bytes of an Fp6 element. -const Fp6Size = 3 * Fp2Size - -type Fp6 [3]Fp2 - -func (z Fp6) String() string { return fmt.Sprintf("\n0: %v\n1: %v\n2: %v", z[0], z[1], z[2]) } -func (z *Fp6) SetOne() { z[0].SetOne(); z[1] = Fp2{}; z[2] = Fp2{} } -func (z Fp6) IsZero() int { return z.IsEqual(&Fp6{}) } -func (z Fp6) IsEqual(x *Fp6) int { - return z[0].IsEqual(&x[0]) & z[1].IsEqual(&x[1]) & z[2].IsEqual(&x[2]) -} -func (z *Fp6) Neg() { z[0].Neg(); z[1].Neg(); z[2].Neg() } -func (z *Fp6) Add(x, y *Fp6) { z[0].Add(&x[0], &y[0]); z[1].Add(&x[1], &y[1]); z[2].Add(&x[2], &y[2]) } -func (z *Fp6) Sub(x, y *Fp6) { z[0].Sub(&x[0], &y[0]); z[1].Sub(&x[1], &y[1]); z[2].Sub(&x[2], &y[2]) } -func (z *Fp6) MulBeta() { - t := z[2] - t.MulBeta() - z[2] = z[1] - z[1] = z[0] - z[0] = t -} - -func (z *Fp6) Mul(x, y *Fp6) { - // https://ia.cr/2006/224 (Sec3.1) - // z = x*y mod (v^3-B) - // | v^4 | v^3 || v^2 | v^1 | v^0 | - // |-----|-----||-------|-------|-------| - // | | || -c2 | -c1 | +c0 | - // | | -c2 || +c1 | -c0 | | - // | +c2 | -c1 || -c0 | | | - // | | +c5 || +c4 | +c3 | | - // |-----|-----||-------|-------|-------| - // | | || | B(+c2)| B(-c2)| - // | | || | | B(-c1)| - // | | || | | B(+c5)| - - aL, aM, aH := &x[0], &x[1], &x[2] - bL, bM, bH := &y[0], &y[1], &y[2] - aLM, aLH, aMH := &Fp2{}, &Fp2{}, &Fp2{} - bLM, bLH, bMH := &Fp2{}, &Fp2{}, &Fp2{} - aLM.Add(aL, aM) - aLH.Add(aL, aH) - aMH.Add(aM, aH) - bLM.Add(bL, bM) - bLH.Add(bL, bH) - bMH.Add(bM, bH) - - c0, c1, c2 := &Fp2{}, &Fp2{}, &Fp2{} - c5, c3, c4 := &z[0], &z[1], &z[2] - c0.Mul(aL, bL) - c1.Mul(aM, bM) - c2.Mul(aH, bH) - c3.Mul(aLM, bLM) - c4.Mul(aLH, bLH) - c5.Mul(aMH, bMH) - - z[2].Add(c4, c1) // c4+c1 - z[2].Sub(&z[2], c0) // c4+c1-c0 - z[2].Sub(&z[2], c2) // z2 = c4+c1-c0-c2 - c2.MulBeta() // Bc2 - c2.Sub(c2, c0) // Bc2-c0 - z[1].Sub(c3, c1) // c3-c1 - z[1].Add(&z[1], c2) // z1 = Bc2-c0+c3-c1 - z[0].Sub(c5, c1) // c5-c1 - z[0].MulBeta() // B(c5-c1) - z[0].Sub(&z[0], c2) // z0 = B(c5-c1)-Bc2+c0 = B(c5-c1-c2)+c0 -} - -func (z *Fp6) Sqr(x *Fp6) { - // z = x^2 mod (v^3-B) - // z0 = B(2x1*x2) + x0^2 - // z1 = B(x2^2) + 2x0*x1 - // z2 = 2x0*x2 + x1^2 - - aL, aM, aH := &x[0], &x[1], &x[2] - c0, c2, c4 := &z[0], &z[1], &z[2] - c3, c5, tt := &Fp2{}, &Fp2{}, &Fp2{} - tt.Add(aL, aH) - tt.Sub(tt, aM) - - c3.Mul(aL, aM) - c5.Mul(aM, aH) - c0.Sqr(aL) - c2.Sqr(aH) - c4.Sqr(tt) - - c5.Add(c5, c5) // 2c5 - c3.Add(c3, c3) // 2c3 - tt.Add(c3, c5) // 2c3+2c5 - z[2].Add(tt, c4) // 2c3+2c5+c4 - z[2].Sub(&z[2], c0) // 2c3+2c5+c4-c0 - z[2].Sub(&z[2], c2) // z2 = 2c3+2c5+c4-c0-c2 - c5.MulBeta() // B(2c5) - z[0].Add(c5, c0) // z0 = B(2c5)+c0 - c2.MulBeta() // B(c2) - z[1].Add(c2, c3) // z1 = B(c2)+2c3 -} - -func (z *Fp6) Inv(x *Fp6) { - aL, aM, aH := &x[0], &x[1], &x[2] - c0, c1, c2 := &Fp2{}, &Fp2{}, &Fp2{} - t0, t1, t2 := &Fp2{}, &Fp2{}, &Fp2{} - c0.Sqr(aL) - c1.Sqr(aH) - c2.Sqr(aM) - t0.Mul(aM, aH) - t1.Mul(aL, aM) - t2.Mul(aL, aH) - t0.MulBeta() - c0.Sub(c0, t0) // c0 = aL^2 - B(aM*AH) - c1.MulBeta() - c1.Sub(c1, t1) // c1 = B(aH^2) - aL*AM - c2.Sub(c2, t2) // c1 = aM^2 - aL*AH - - t0.Mul(aM, c2) - t1.Mul(aH, c1) - t2.Mul(aL, c0) - t0.Add(t0, t1) - t0.MulBeta() - t0.Add(t0, t2) - t0.Inv(t0) // den = B(aL*c2 + aM*c1) + aLc0 - z[0].Mul(c0, t0) // z0 = c0/den - z[1].Mul(c1, t0) // z1 = c1/den - z[2].Mul(c2, t0) // z2 = c2/den -} - -func (z *Fp6) Frob(x *Fp6) { - z[0].Frob(&x[0]) - z[1].Frob(&x[1]) - z[2].Frob(&x[2]) - z[1].Mul(&z[1], &Fp2{Fp{}, frob6V1}) - z[2].Mul(&z[2], &Fp2{frob6V2, Fp{}}) -} - -func (z *Fp6) CMov(x, y *Fp6, b int) { - z[0].CMov(&x[0], &y[0], b) - z[1].CMov(&x[1], &y[1], b) - z[2].CMov(&x[2], &y[2], b) -} - -func (z Fp6) MarshalBinary() (b []byte, e error) { - var b0, b1, b2 []byte - if b2, e = z[2].MarshalBinary(); e == nil { - if b1, e = z[1].MarshalBinary(); e == nil { - if b0, e = z[0].MarshalBinary(); e == nil { - return append(append(b2, b1...), b0...), e - } - } - } - return -} - -func (z *Fp6) UnmarshalBinary(b []byte) error { - if len(b) < Fp6Size { - return errInputLength - } - return errFirst( - z[2].UnmarshalBinary(b[0*Fp2Size:1*Fp2Size]), - z[1].UnmarshalBinary(b[1*Fp2Size:2*Fp2Size]), - z[0].UnmarshalBinary(b[2*Fp2Size:3*Fp2Size]), - ) -} - -var ( - // frob6V1 is toMont(v) = 2**384 * v mod fpPrime, where - // v = 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaac - frob6V1 = Fp{fpMont{ - 0xcd03c9e48671f071, 0x5dab22461fcda5d2, 0x587042afd3851b95, - 0x8eb60ebe01bacb9e, 0x03f97d6e83d050d2, 0x18f0206554638741, - }} - - // frob6V2 is toMont(v) = 2**384 * v mod fpPrime, where - // v = 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaad - frob6V2 = Fp{fpMont{ - 0x890dc9e4867545c3, 0x2af322533285a5d5, 0x50880866309b7e2c, - 0xa20d1b8c7e881024, 0x14e4f04fe2db9068, 0x14e56d3f1564853a, - }} -) diff --git a/ecc/bls12381/ff/fp6_test.go b/ecc/bls12381/ff/fp6_test.go deleted file mode 100644 index 6131a17e..00000000 --- a/ecc/bls12381/ff/fp6_test.go +++ /dev/null @@ -1,118 +0,0 @@ -package ff - -import ( - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func randomFp6(t testing.TB) *Fp6 { return &Fp6{*randomFp2(t), *randomFp2(t), *randomFp2(t)} } - -// expVarTime calculates z=x^n, where n is the exponent in big-endian order. -func expVarTime(z, x *Fp6, n []byte) { - zz := new(Fp6) - zz.SetOne() - N := 8 * len(n) - for i := 0; i < N; i++ { - zz.Sqr(zz) - bit := 0x1 & (n[i/8] >> uint(7-i%8)) - if bit != 0 { - zz.Mul(zz, x) - } - } - *z = *zz -} - -func TestFp6(t *testing.T) { - const testTimes = 1 << 10 - t.Run("no_alias", func(t *testing.T) { - var want, got Fp6 - x := randomFp6(t) - got = *x - got.Sqr(&got) - want = *x - want.Mul(&want, &want) - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - }) - t.Run("mul_inv", func(t *testing.T) { - var z Fp6 - for i := 0; i < testTimes; i++ { - x := randomFp6(t) - y := randomFp6(t) - - // x*y*x^1 - y = 0 - z.Inv(x) - z.Mul(&z, y) - z.Mul(&z, x) - z.Sub(&z, y) - got := z.IsZero() - want := 1 - if got != want { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("mul_sqr", func(t *testing.T) { - var l0, l1, r0, r1 Fp6 - for i := 0; i < testTimes; i++ { - x := randomFp6(t) - y := randomFp6(t) - - // (x+y)(x-y) = (x^2-y^2) - l0.Add(x, y) - l1.Sub(x, y) - l0.Mul(&l0, &l1) - r0.Sqr(x) - r1.Sqr(y) - r0.Sub(&r0, &r1) - got := &l0 - want := &r0 - if got.IsEqual(want) == 0 { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("frobenius", func(t *testing.T) { - var got, want Fp6 - p := FpOrder() - for i := 0; i < testTimes; i++ { - x := randomFp6(t) - - // Frob(x) == x^p - got.Frob(x) - expVarTime(&want, x, p) - - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - } - }) -} - -func BenchmarkFp6(b *testing.B) { - x := randomFp6(b) - y := randomFp6(b) - z := randomFp6(b) - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Add(x, y) - } - }) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Mul(x, y) - } - }) - b.Run("Sqr", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Sqr(x) - } - }) - b.Run("Inv", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Inv(x) - } - }) -} diff --git a/ecc/bls12381/ff/fpMont381.go b/ecc/bls12381/ff/fpMont381.go deleted file mode 100644 index a4af8d38..00000000 --- a/ecc/bls12381/ff/fpMont381.go +++ /dev/null @@ -1,1618 +0,0 @@ -// Code generated by gen.go using fiat-crypto. -// -// Autogenerated: './word_by_word_montgomery' --output fpMont381.go --lang Go --package-name ff --doc-prepend-header 'Code generated by gen.go using fiat-crypto.' --package-case lowerCamelCase --public-function-case lowerCamelCase --public-type-case lowerCamelCase --doc-newline-before-package-declaration --no-primitives --widen-carry --no-field-element-typedefs --relax-primitive-carry-to-bitwidth 64 FpMont 64 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab add sub mul square -// -// curve description: FpMont -// -// machine_wordsize = 64 (from "64") -// -// requested operations: add, sub, mul, square -// -// m = 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab (from "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab") -// -// -// -// NOTE: In addition to the bounds specified above each function, all -// -// functions synthesized for this Montgomery arithmetic require the -// -// input to be strictly less than the prime modulus (m), and also -// -// require the input to be in the unique saturated representation. -// -// All functions also ensure that these two properties are true of -// -// return values. -// -// -// -// Computed values: -// -// eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) -// -// bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) + (z[32] << 256) + (z[33] << 0x108) + (z[34] << 0x110) + (z[35] << 0x118) + (z[36] << 0x120) + (z[37] << 0x128) + (z[38] << 0x130) + (z[39] << 0x138) + (z[40] << 0x140) + (z[41] << 0x148) + (z[42] << 0x150) + (z[43] << 0x158) + (z[44] << 0x160) + (z[45] << 0x168) + (z[46] << 0x170) + (z[47] << 0x178) -// -// twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) in -// -// if x1 & (2^384-1) < 2^383 then x1 & (2^384-1) else (x1 & (2^384-1)) - 2^384 - -package ff - -import "math/bits" - -// The function fiatFpMontAdd adds two field elements in the Montgomery domain. -// -// Preconditions: -// -// 0 ≤ eval arg1 < m -// 0 ≤ eval arg2 < m -// -// Postconditions: -// -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// -// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// -// Output Bounds: -// -// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -func fiatFpMontAdd(out1 *[6]uint64, arg1 *[6]uint64, arg2 *[6]uint64) { - var x1 uint64 - var x2 uint64 - x1, x2 = bits.Add64(arg1[0], arg2[0], uint64(0x0)) - var x3 uint64 - var x4 uint64 - x3, x4 = bits.Add64(arg1[1], arg2[1], uint64(x2)) - var x5 uint64 - var x6 uint64 - x5, x6 = bits.Add64(arg1[2], arg2[2], uint64(x4)) - var x7 uint64 - var x8 uint64 - x7, x8 = bits.Add64(arg1[3], arg2[3], uint64(x6)) - var x9 uint64 - var x10 uint64 - x9, x10 = bits.Add64(arg1[4], arg2[4], uint64(x8)) - var x11 uint64 - var x12 uint64 - x11, x12 = bits.Add64(arg1[5], arg2[5], uint64(x10)) - var x13 uint64 - var x14 uint64 - x13, x14 = bits.Sub64(x1, 0xb9feffffffffaaab, uint64(uint64(0x0))) - var x15 uint64 - var x16 uint64 - x15, x16 = bits.Sub64(x3, 0x1eabfffeb153ffff, uint64(x14)) - var x17 uint64 - var x18 uint64 - x17, x18 = bits.Sub64(x5, 0x6730d2a0f6b0f624, uint64(x16)) - var x19 uint64 - var x20 uint64 - x19, x20 = bits.Sub64(x7, 0x64774b84f38512bf, uint64(x18)) - var x21 uint64 - var x22 uint64 - x21, x22 = bits.Sub64(x9, 0x4b1ba7b6434bacd7, uint64(x20)) - var x23 uint64 - var x24 uint64 - x23, x24 = bits.Sub64(x11, 0x1a0111ea397fe69a, uint64(x22)) - var x26 uint64 - _, x26 = bits.Sub64(x12, uint64(0x0), uint64(x24)) - var x27 uint64 - fiatFpMontCmovznzU64(&x27, x26, x13, x1) - var x28 uint64 - fiatFpMontCmovznzU64(&x28, x26, x15, x3) - var x29 uint64 - fiatFpMontCmovznzU64(&x29, x26, x17, x5) - var x30 uint64 - fiatFpMontCmovznzU64(&x30, x26, x19, x7) - var x31 uint64 - fiatFpMontCmovznzU64(&x31, x26, x21, x9) - var x32 uint64 - fiatFpMontCmovznzU64(&x32, x26, x23, x11) - out1[0] = x27 - out1[1] = x28 - out1[2] = x29 - out1[3] = x30 - out1[4] = x31 - out1[5] = x32 -} - -// The function fiatFpMontSub subtracts two field elements in the Montgomery domain. -// -// Preconditions: -// -// 0 ≤ eval arg1 < m -// 0 ≤ eval arg2 < m -// -// Postconditions: -// -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// -// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// -// Output Bounds: -// -// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -func fiatFpMontSub(out1 *[6]uint64, arg1 *[6]uint64, arg2 *[6]uint64) { - var x1 uint64 - var x2 uint64 - x1, x2 = bits.Sub64(arg1[0], arg2[0], uint64(0x0)) - var x3 uint64 - var x4 uint64 - x3, x4 = bits.Sub64(arg1[1], arg2[1], uint64(x2)) - var x5 uint64 - var x6 uint64 - x5, x6 = bits.Sub64(arg1[2], arg2[2], uint64(x4)) - var x7 uint64 - var x8 uint64 - x7, x8 = bits.Sub64(arg1[3], arg2[3], uint64(x6)) - var x9 uint64 - var x10 uint64 - x9, x10 = bits.Sub64(arg1[4], arg2[4], uint64(x8)) - var x11 uint64 - var x12 uint64 - x11, x12 = bits.Sub64(arg1[5], arg2[5], uint64(x10)) - var x13 uint64 - fiatFpMontCmovznzU64(&x13, x12, uint64(0x0), 0xffffffffffffffff) - var x14 uint64 - var x15 uint64 - x14, x15 = bits.Add64(x1, (x13 & 0xb9feffffffffaaab), uint64(0x0)) - var x16 uint64 - var x17 uint64 - x16, x17 = bits.Add64(x3, (x13 & 0x1eabfffeb153ffff), uint64(x15)) - var x18 uint64 - var x19 uint64 - x18, x19 = bits.Add64(x5, (x13 & 0x6730d2a0f6b0f624), uint64(x17)) - var x20 uint64 - var x21 uint64 - x20, x21 = bits.Add64(x7, (x13 & 0x64774b84f38512bf), uint64(x19)) - var x22 uint64 - var x23 uint64 - x22, x23 = bits.Add64(x9, (x13 & 0x4b1ba7b6434bacd7), uint64(x21)) - var x24 uint64 - x24, _ = bits.Add64(x11, (x13 & 0x1a0111ea397fe69a), uint64(x23)) - out1[0] = x14 - out1[1] = x16 - out1[2] = x18 - out1[3] = x20 - out1[4] = x22 - out1[5] = x24 -} - -// The function fiatFpMontMul multiplies two field elements in the Montgomery domain. -// -// Preconditions: -// -// 0 ≤ eval arg1 < m -// 0 ≤ eval arg2 < m -// -// Postconditions: -// -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// -// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// -// Output Bounds: -// -// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -func fiatFpMontMul(out1 *[6]uint64, arg1 *[6]uint64, arg2 *[6]uint64) { - x1 := arg1[1] - x2 := arg1[2] - x3 := arg1[3] - x4 := arg1[4] - x5 := arg1[5] - x6 := arg1[0] - var x7 uint64 - var x8 uint64 - x8, x7 = bits.Mul64(x6, arg2[5]) - var x9 uint64 - var x10 uint64 - x10, x9 = bits.Mul64(x6, arg2[4]) - var x11 uint64 - var x12 uint64 - x12, x11 = bits.Mul64(x6, arg2[3]) - var x13 uint64 - var x14 uint64 - x14, x13 = bits.Mul64(x6, arg2[2]) - var x15 uint64 - var x16 uint64 - x16, x15 = bits.Mul64(x6, arg2[1]) - var x17 uint64 - var x18 uint64 - x18, x17 = bits.Mul64(x6, arg2[0]) - var x19 uint64 - var x20 uint64 - x19, x20 = bits.Add64(x18, x15, uint64(0x0)) - var x21 uint64 - var x22 uint64 - x21, x22 = bits.Add64(x16, x13, uint64(x20)) - var x23 uint64 - var x24 uint64 - x23, x24 = bits.Add64(x14, x11, uint64(x22)) - var x25 uint64 - var x26 uint64 - x25, x26 = bits.Add64(x12, x9, uint64(x24)) - var x27 uint64 - var x28 uint64 - x27, x28 = bits.Add64(x10, x7, uint64(x26)) - x29 := (x28 + x8) - var x30 uint64 - _, x30 = bits.Mul64(x17, 0x89f3fffcfffcfffd) - var x32 uint64 - var x33 uint64 - x33, x32 = bits.Mul64(x30, 0x1a0111ea397fe69a) - var x34 uint64 - var x35 uint64 - x35, x34 = bits.Mul64(x30, 0x4b1ba7b6434bacd7) - var x36 uint64 - var x37 uint64 - x37, x36 = bits.Mul64(x30, 0x64774b84f38512bf) - var x38 uint64 - var x39 uint64 - x39, x38 = bits.Mul64(x30, 0x6730d2a0f6b0f624) - var x40 uint64 - var x41 uint64 - x41, x40 = bits.Mul64(x30, 0x1eabfffeb153ffff) - var x42 uint64 - var x43 uint64 - x43, x42 = bits.Mul64(x30, 0xb9feffffffffaaab) - var x44 uint64 - var x45 uint64 - x44, x45 = bits.Add64(x43, x40, uint64(0x0)) - var x46 uint64 - var x47 uint64 - x46, x47 = bits.Add64(x41, x38, uint64(x45)) - var x48 uint64 - var x49 uint64 - x48, x49 = bits.Add64(x39, x36, uint64(x47)) - var x50 uint64 - var x51 uint64 - x50, x51 = bits.Add64(x37, x34, uint64(x49)) - var x52 uint64 - var x53 uint64 - x52, x53 = bits.Add64(x35, x32, uint64(x51)) - x54 := (x53 + x33) - var x56 uint64 - _, x56 = bits.Add64(x17, x42, uint64(0x0)) - var x57 uint64 - var x58 uint64 - x57, x58 = bits.Add64(x19, x44, uint64(x56)) - var x59 uint64 - var x60 uint64 - x59, x60 = bits.Add64(x21, x46, uint64(x58)) - var x61 uint64 - var x62 uint64 - x61, x62 = bits.Add64(x23, x48, uint64(x60)) - var x63 uint64 - var x64 uint64 - x63, x64 = bits.Add64(x25, x50, uint64(x62)) - var x65 uint64 - var x66 uint64 - x65, x66 = bits.Add64(x27, x52, uint64(x64)) - var x67 uint64 - var x68 uint64 - x67, x68 = bits.Add64(x29, x54, uint64(x66)) - var x69 uint64 - var x70 uint64 - x70, x69 = bits.Mul64(x1, arg2[5]) - var x71 uint64 - var x72 uint64 - x72, x71 = bits.Mul64(x1, arg2[4]) - var x73 uint64 - var x74 uint64 - x74, x73 = bits.Mul64(x1, arg2[3]) - var x75 uint64 - var x76 uint64 - x76, x75 = bits.Mul64(x1, arg2[2]) - var x77 uint64 - var x78 uint64 - x78, x77 = bits.Mul64(x1, arg2[1]) - var x79 uint64 - var x80 uint64 - x80, x79 = bits.Mul64(x1, arg2[0]) - var x81 uint64 - var x82 uint64 - x81, x82 = bits.Add64(x80, x77, uint64(0x0)) - var x83 uint64 - var x84 uint64 - x83, x84 = bits.Add64(x78, x75, uint64(x82)) - var x85 uint64 - var x86 uint64 - x85, x86 = bits.Add64(x76, x73, uint64(x84)) - var x87 uint64 - var x88 uint64 - x87, x88 = bits.Add64(x74, x71, uint64(x86)) - var x89 uint64 - var x90 uint64 - x89, x90 = bits.Add64(x72, x69, uint64(x88)) - x91 := (x90 + x70) - var x92 uint64 - var x93 uint64 - x92, x93 = bits.Add64(x57, x79, uint64(0x0)) - var x94 uint64 - var x95 uint64 - x94, x95 = bits.Add64(x59, x81, uint64(x93)) - var x96 uint64 - var x97 uint64 - x96, x97 = bits.Add64(x61, x83, uint64(x95)) - var x98 uint64 - var x99 uint64 - x98, x99 = bits.Add64(x63, x85, uint64(x97)) - var x100 uint64 - var x101 uint64 - x100, x101 = bits.Add64(x65, x87, uint64(x99)) - var x102 uint64 - var x103 uint64 - x102, x103 = bits.Add64(x67, x89, uint64(x101)) - var x104 uint64 - var x105 uint64 - x104, x105 = bits.Add64(x68, x91, uint64(x103)) - var x106 uint64 - _, x106 = bits.Mul64(x92, 0x89f3fffcfffcfffd) - var x108 uint64 - var x109 uint64 - x109, x108 = bits.Mul64(x106, 0x1a0111ea397fe69a) - var x110 uint64 - var x111 uint64 - x111, x110 = bits.Mul64(x106, 0x4b1ba7b6434bacd7) - var x112 uint64 - var x113 uint64 - x113, x112 = bits.Mul64(x106, 0x64774b84f38512bf) - var x114 uint64 - var x115 uint64 - x115, x114 = bits.Mul64(x106, 0x6730d2a0f6b0f624) - var x116 uint64 - var x117 uint64 - x117, x116 = bits.Mul64(x106, 0x1eabfffeb153ffff) - var x118 uint64 - var x119 uint64 - x119, x118 = bits.Mul64(x106, 0xb9feffffffffaaab) - var x120 uint64 - var x121 uint64 - x120, x121 = bits.Add64(x119, x116, uint64(0x0)) - var x122 uint64 - var x123 uint64 - x122, x123 = bits.Add64(x117, x114, uint64(x121)) - var x124 uint64 - var x125 uint64 - x124, x125 = bits.Add64(x115, x112, uint64(x123)) - var x126 uint64 - var x127 uint64 - x126, x127 = bits.Add64(x113, x110, uint64(x125)) - var x128 uint64 - var x129 uint64 - x128, x129 = bits.Add64(x111, x108, uint64(x127)) - x130 := (x129 + x109) - var x132 uint64 - _, x132 = bits.Add64(x92, x118, uint64(0x0)) - var x133 uint64 - var x134 uint64 - x133, x134 = bits.Add64(x94, x120, uint64(x132)) - var x135 uint64 - var x136 uint64 - x135, x136 = bits.Add64(x96, x122, uint64(x134)) - var x137 uint64 - var x138 uint64 - x137, x138 = bits.Add64(x98, x124, uint64(x136)) - var x139 uint64 - var x140 uint64 - x139, x140 = bits.Add64(x100, x126, uint64(x138)) - var x141 uint64 - var x142 uint64 - x141, x142 = bits.Add64(x102, x128, uint64(x140)) - var x143 uint64 - var x144 uint64 - x143, x144 = bits.Add64(x104, x130, uint64(x142)) - x145 := (x144 + x105) - var x146 uint64 - var x147 uint64 - x147, x146 = bits.Mul64(x2, arg2[5]) - var x148 uint64 - var x149 uint64 - x149, x148 = bits.Mul64(x2, arg2[4]) - var x150 uint64 - var x151 uint64 - x151, x150 = bits.Mul64(x2, arg2[3]) - var x152 uint64 - var x153 uint64 - x153, x152 = bits.Mul64(x2, arg2[2]) - var x154 uint64 - var x155 uint64 - x155, x154 = bits.Mul64(x2, arg2[1]) - var x156 uint64 - var x157 uint64 - x157, x156 = bits.Mul64(x2, arg2[0]) - var x158 uint64 - var x159 uint64 - x158, x159 = bits.Add64(x157, x154, uint64(0x0)) - var x160 uint64 - var x161 uint64 - x160, x161 = bits.Add64(x155, x152, uint64(x159)) - var x162 uint64 - var x163 uint64 - x162, x163 = bits.Add64(x153, x150, uint64(x161)) - var x164 uint64 - var x165 uint64 - x164, x165 = bits.Add64(x151, x148, uint64(x163)) - var x166 uint64 - var x167 uint64 - x166, x167 = bits.Add64(x149, x146, uint64(x165)) - x168 := (x167 + x147) - var x169 uint64 - var x170 uint64 - x169, x170 = bits.Add64(x133, x156, uint64(0x0)) - var x171 uint64 - var x172 uint64 - x171, x172 = bits.Add64(x135, x158, uint64(x170)) - var x173 uint64 - var x174 uint64 - x173, x174 = bits.Add64(x137, x160, uint64(x172)) - var x175 uint64 - var x176 uint64 - x175, x176 = bits.Add64(x139, x162, uint64(x174)) - var x177 uint64 - var x178 uint64 - x177, x178 = bits.Add64(x141, x164, uint64(x176)) - var x179 uint64 - var x180 uint64 - x179, x180 = bits.Add64(x143, x166, uint64(x178)) - var x181 uint64 - var x182 uint64 - x181, x182 = bits.Add64(x145, x168, uint64(x180)) - var x183 uint64 - _, x183 = bits.Mul64(x169, 0x89f3fffcfffcfffd) - var x185 uint64 - var x186 uint64 - x186, x185 = bits.Mul64(x183, 0x1a0111ea397fe69a) - var x187 uint64 - var x188 uint64 - x188, x187 = bits.Mul64(x183, 0x4b1ba7b6434bacd7) - var x189 uint64 - var x190 uint64 - x190, x189 = bits.Mul64(x183, 0x64774b84f38512bf) - var x191 uint64 - var x192 uint64 - x192, x191 = bits.Mul64(x183, 0x6730d2a0f6b0f624) - var x193 uint64 - var x194 uint64 - x194, x193 = bits.Mul64(x183, 0x1eabfffeb153ffff) - var x195 uint64 - var x196 uint64 - x196, x195 = bits.Mul64(x183, 0xb9feffffffffaaab) - var x197 uint64 - var x198 uint64 - x197, x198 = bits.Add64(x196, x193, uint64(0x0)) - var x199 uint64 - var x200 uint64 - x199, x200 = bits.Add64(x194, x191, uint64(x198)) - var x201 uint64 - var x202 uint64 - x201, x202 = bits.Add64(x192, x189, uint64(x200)) - var x203 uint64 - var x204 uint64 - x203, x204 = bits.Add64(x190, x187, uint64(x202)) - var x205 uint64 - var x206 uint64 - x205, x206 = bits.Add64(x188, x185, uint64(x204)) - x207 := (x206 + x186) - var x209 uint64 - _, x209 = bits.Add64(x169, x195, uint64(0x0)) - var x210 uint64 - var x211 uint64 - x210, x211 = bits.Add64(x171, x197, uint64(x209)) - var x212 uint64 - var x213 uint64 - x212, x213 = bits.Add64(x173, x199, uint64(x211)) - var x214 uint64 - var x215 uint64 - x214, x215 = bits.Add64(x175, x201, uint64(x213)) - var x216 uint64 - var x217 uint64 - x216, x217 = bits.Add64(x177, x203, uint64(x215)) - var x218 uint64 - var x219 uint64 - x218, x219 = bits.Add64(x179, x205, uint64(x217)) - var x220 uint64 - var x221 uint64 - x220, x221 = bits.Add64(x181, x207, uint64(x219)) - x222 := (x221 + x182) - var x223 uint64 - var x224 uint64 - x224, x223 = bits.Mul64(x3, arg2[5]) - var x225 uint64 - var x226 uint64 - x226, x225 = bits.Mul64(x3, arg2[4]) - var x227 uint64 - var x228 uint64 - x228, x227 = bits.Mul64(x3, arg2[3]) - var x229 uint64 - var x230 uint64 - x230, x229 = bits.Mul64(x3, arg2[2]) - var x231 uint64 - var x232 uint64 - x232, x231 = bits.Mul64(x3, arg2[1]) - var x233 uint64 - var x234 uint64 - x234, x233 = bits.Mul64(x3, arg2[0]) - var x235 uint64 - var x236 uint64 - x235, x236 = bits.Add64(x234, x231, uint64(0x0)) - var x237 uint64 - var x238 uint64 - x237, x238 = bits.Add64(x232, x229, uint64(x236)) - var x239 uint64 - var x240 uint64 - x239, x240 = bits.Add64(x230, x227, uint64(x238)) - var x241 uint64 - var x242 uint64 - x241, x242 = bits.Add64(x228, x225, uint64(x240)) - var x243 uint64 - var x244 uint64 - x243, x244 = bits.Add64(x226, x223, uint64(x242)) - x245 := (x244 + x224) - var x246 uint64 - var x247 uint64 - x246, x247 = bits.Add64(x210, x233, uint64(0x0)) - var x248 uint64 - var x249 uint64 - x248, x249 = bits.Add64(x212, x235, uint64(x247)) - var x250 uint64 - var x251 uint64 - x250, x251 = bits.Add64(x214, x237, uint64(x249)) - var x252 uint64 - var x253 uint64 - x252, x253 = bits.Add64(x216, x239, uint64(x251)) - var x254 uint64 - var x255 uint64 - x254, x255 = bits.Add64(x218, x241, uint64(x253)) - var x256 uint64 - var x257 uint64 - x256, x257 = bits.Add64(x220, x243, uint64(x255)) - var x258 uint64 - var x259 uint64 - x258, x259 = bits.Add64(x222, x245, uint64(x257)) - var x260 uint64 - _, x260 = bits.Mul64(x246, 0x89f3fffcfffcfffd) - var x262 uint64 - var x263 uint64 - x263, x262 = bits.Mul64(x260, 0x1a0111ea397fe69a) - var x264 uint64 - var x265 uint64 - x265, x264 = bits.Mul64(x260, 0x4b1ba7b6434bacd7) - var x266 uint64 - var x267 uint64 - x267, x266 = bits.Mul64(x260, 0x64774b84f38512bf) - var x268 uint64 - var x269 uint64 - x269, x268 = bits.Mul64(x260, 0x6730d2a0f6b0f624) - var x270 uint64 - var x271 uint64 - x271, x270 = bits.Mul64(x260, 0x1eabfffeb153ffff) - var x272 uint64 - var x273 uint64 - x273, x272 = bits.Mul64(x260, 0xb9feffffffffaaab) - var x274 uint64 - var x275 uint64 - x274, x275 = bits.Add64(x273, x270, uint64(0x0)) - var x276 uint64 - var x277 uint64 - x276, x277 = bits.Add64(x271, x268, uint64(x275)) - var x278 uint64 - var x279 uint64 - x278, x279 = bits.Add64(x269, x266, uint64(x277)) - var x280 uint64 - var x281 uint64 - x280, x281 = bits.Add64(x267, x264, uint64(x279)) - var x282 uint64 - var x283 uint64 - x282, x283 = bits.Add64(x265, x262, uint64(x281)) - x284 := (x283 + x263) - var x286 uint64 - _, x286 = bits.Add64(x246, x272, uint64(0x0)) - var x287 uint64 - var x288 uint64 - x287, x288 = bits.Add64(x248, x274, uint64(x286)) - var x289 uint64 - var x290 uint64 - x289, x290 = bits.Add64(x250, x276, uint64(x288)) - var x291 uint64 - var x292 uint64 - x291, x292 = bits.Add64(x252, x278, uint64(x290)) - var x293 uint64 - var x294 uint64 - x293, x294 = bits.Add64(x254, x280, uint64(x292)) - var x295 uint64 - var x296 uint64 - x295, x296 = bits.Add64(x256, x282, uint64(x294)) - var x297 uint64 - var x298 uint64 - x297, x298 = bits.Add64(x258, x284, uint64(x296)) - x299 := (x298 + x259) - var x300 uint64 - var x301 uint64 - x301, x300 = bits.Mul64(x4, arg2[5]) - var x302 uint64 - var x303 uint64 - x303, x302 = bits.Mul64(x4, arg2[4]) - var x304 uint64 - var x305 uint64 - x305, x304 = bits.Mul64(x4, arg2[3]) - var x306 uint64 - var x307 uint64 - x307, x306 = bits.Mul64(x4, arg2[2]) - var x308 uint64 - var x309 uint64 - x309, x308 = bits.Mul64(x4, arg2[1]) - var x310 uint64 - var x311 uint64 - x311, x310 = bits.Mul64(x4, arg2[0]) - var x312 uint64 - var x313 uint64 - x312, x313 = bits.Add64(x311, x308, uint64(0x0)) - var x314 uint64 - var x315 uint64 - x314, x315 = bits.Add64(x309, x306, uint64(x313)) - var x316 uint64 - var x317 uint64 - x316, x317 = bits.Add64(x307, x304, uint64(x315)) - var x318 uint64 - var x319 uint64 - x318, x319 = bits.Add64(x305, x302, uint64(x317)) - var x320 uint64 - var x321 uint64 - x320, x321 = bits.Add64(x303, x300, uint64(x319)) - x322 := (x321 + x301) - var x323 uint64 - var x324 uint64 - x323, x324 = bits.Add64(x287, x310, uint64(0x0)) - var x325 uint64 - var x326 uint64 - x325, x326 = bits.Add64(x289, x312, uint64(x324)) - var x327 uint64 - var x328 uint64 - x327, x328 = bits.Add64(x291, x314, uint64(x326)) - var x329 uint64 - var x330 uint64 - x329, x330 = bits.Add64(x293, x316, uint64(x328)) - var x331 uint64 - var x332 uint64 - x331, x332 = bits.Add64(x295, x318, uint64(x330)) - var x333 uint64 - var x334 uint64 - x333, x334 = bits.Add64(x297, x320, uint64(x332)) - var x335 uint64 - var x336 uint64 - x335, x336 = bits.Add64(x299, x322, uint64(x334)) - var x337 uint64 - _, x337 = bits.Mul64(x323, 0x89f3fffcfffcfffd) - var x339 uint64 - var x340 uint64 - x340, x339 = bits.Mul64(x337, 0x1a0111ea397fe69a) - var x341 uint64 - var x342 uint64 - x342, x341 = bits.Mul64(x337, 0x4b1ba7b6434bacd7) - var x343 uint64 - var x344 uint64 - x344, x343 = bits.Mul64(x337, 0x64774b84f38512bf) - var x345 uint64 - var x346 uint64 - x346, x345 = bits.Mul64(x337, 0x6730d2a0f6b0f624) - var x347 uint64 - var x348 uint64 - x348, x347 = bits.Mul64(x337, 0x1eabfffeb153ffff) - var x349 uint64 - var x350 uint64 - x350, x349 = bits.Mul64(x337, 0xb9feffffffffaaab) - var x351 uint64 - var x352 uint64 - x351, x352 = bits.Add64(x350, x347, uint64(0x0)) - var x353 uint64 - var x354 uint64 - x353, x354 = bits.Add64(x348, x345, uint64(x352)) - var x355 uint64 - var x356 uint64 - x355, x356 = bits.Add64(x346, x343, uint64(x354)) - var x357 uint64 - var x358 uint64 - x357, x358 = bits.Add64(x344, x341, uint64(x356)) - var x359 uint64 - var x360 uint64 - x359, x360 = bits.Add64(x342, x339, uint64(x358)) - x361 := (x360 + x340) - var x363 uint64 - _, x363 = bits.Add64(x323, x349, uint64(0x0)) - var x364 uint64 - var x365 uint64 - x364, x365 = bits.Add64(x325, x351, uint64(x363)) - var x366 uint64 - var x367 uint64 - x366, x367 = bits.Add64(x327, x353, uint64(x365)) - var x368 uint64 - var x369 uint64 - x368, x369 = bits.Add64(x329, x355, uint64(x367)) - var x370 uint64 - var x371 uint64 - x370, x371 = bits.Add64(x331, x357, uint64(x369)) - var x372 uint64 - var x373 uint64 - x372, x373 = bits.Add64(x333, x359, uint64(x371)) - var x374 uint64 - var x375 uint64 - x374, x375 = bits.Add64(x335, x361, uint64(x373)) - x376 := (x375 + x336) - var x377 uint64 - var x378 uint64 - x378, x377 = bits.Mul64(x5, arg2[5]) - var x379 uint64 - var x380 uint64 - x380, x379 = bits.Mul64(x5, arg2[4]) - var x381 uint64 - var x382 uint64 - x382, x381 = bits.Mul64(x5, arg2[3]) - var x383 uint64 - var x384 uint64 - x384, x383 = bits.Mul64(x5, arg2[2]) - var x385 uint64 - var x386 uint64 - x386, x385 = bits.Mul64(x5, arg2[1]) - var x387 uint64 - var x388 uint64 - x388, x387 = bits.Mul64(x5, arg2[0]) - var x389 uint64 - var x390 uint64 - x389, x390 = bits.Add64(x388, x385, uint64(0x0)) - var x391 uint64 - var x392 uint64 - x391, x392 = bits.Add64(x386, x383, uint64(x390)) - var x393 uint64 - var x394 uint64 - x393, x394 = bits.Add64(x384, x381, uint64(x392)) - var x395 uint64 - var x396 uint64 - x395, x396 = bits.Add64(x382, x379, uint64(x394)) - var x397 uint64 - var x398 uint64 - x397, x398 = bits.Add64(x380, x377, uint64(x396)) - x399 := (x398 + x378) - var x400 uint64 - var x401 uint64 - x400, x401 = bits.Add64(x364, x387, uint64(0x0)) - var x402 uint64 - var x403 uint64 - x402, x403 = bits.Add64(x366, x389, uint64(x401)) - var x404 uint64 - var x405 uint64 - x404, x405 = bits.Add64(x368, x391, uint64(x403)) - var x406 uint64 - var x407 uint64 - x406, x407 = bits.Add64(x370, x393, uint64(x405)) - var x408 uint64 - var x409 uint64 - x408, x409 = bits.Add64(x372, x395, uint64(x407)) - var x410 uint64 - var x411 uint64 - x410, x411 = bits.Add64(x374, x397, uint64(x409)) - var x412 uint64 - var x413 uint64 - x412, x413 = bits.Add64(x376, x399, uint64(x411)) - var x414 uint64 - _, x414 = bits.Mul64(x400, 0x89f3fffcfffcfffd) - var x416 uint64 - var x417 uint64 - x417, x416 = bits.Mul64(x414, 0x1a0111ea397fe69a) - var x418 uint64 - var x419 uint64 - x419, x418 = bits.Mul64(x414, 0x4b1ba7b6434bacd7) - var x420 uint64 - var x421 uint64 - x421, x420 = bits.Mul64(x414, 0x64774b84f38512bf) - var x422 uint64 - var x423 uint64 - x423, x422 = bits.Mul64(x414, 0x6730d2a0f6b0f624) - var x424 uint64 - var x425 uint64 - x425, x424 = bits.Mul64(x414, 0x1eabfffeb153ffff) - var x426 uint64 - var x427 uint64 - x427, x426 = bits.Mul64(x414, 0xb9feffffffffaaab) - var x428 uint64 - var x429 uint64 - x428, x429 = bits.Add64(x427, x424, uint64(0x0)) - var x430 uint64 - var x431 uint64 - x430, x431 = bits.Add64(x425, x422, uint64(x429)) - var x432 uint64 - var x433 uint64 - x432, x433 = bits.Add64(x423, x420, uint64(x431)) - var x434 uint64 - var x435 uint64 - x434, x435 = bits.Add64(x421, x418, uint64(x433)) - var x436 uint64 - var x437 uint64 - x436, x437 = bits.Add64(x419, x416, uint64(x435)) - x438 := (x437 + x417) - var x440 uint64 - _, x440 = bits.Add64(x400, x426, uint64(0x0)) - var x441 uint64 - var x442 uint64 - x441, x442 = bits.Add64(x402, x428, uint64(x440)) - var x443 uint64 - var x444 uint64 - x443, x444 = bits.Add64(x404, x430, uint64(x442)) - var x445 uint64 - var x446 uint64 - x445, x446 = bits.Add64(x406, x432, uint64(x444)) - var x447 uint64 - var x448 uint64 - x447, x448 = bits.Add64(x408, x434, uint64(x446)) - var x449 uint64 - var x450 uint64 - x449, x450 = bits.Add64(x410, x436, uint64(x448)) - var x451 uint64 - var x452 uint64 - x451, x452 = bits.Add64(x412, x438, uint64(x450)) - x453 := (x452 + x413) - var x454 uint64 - var x455 uint64 - x454, x455 = bits.Sub64(x441, 0xb9feffffffffaaab, uint64(uint64(0x0))) - var x456 uint64 - var x457 uint64 - x456, x457 = bits.Sub64(x443, 0x1eabfffeb153ffff, uint64(x455)) - var x458 uint64 - var x459 uint64 - x458, x459 = bits.Sub64(x445, 0x6730d2a0f6b0f624, uint64(x457)) - var x460 uint64 - var x461 uint64 - x460, x461 = bits.Sub64(x447, 0x64774b84f38512bf, uint64(x459)) - var x462 uint64 - var x463 uint64 - x462, x463 = bits.Sub64(x449, 0x4b1ba7b6434bacd7, uint64(x461)) - var x464 uint64 - var x465 uint64 - x464, x465 = bits.Sub64(x451, 0x1a0111ea397fe69a, uint64(x463)) - var x467 uint64 - _, x467 = bits.Sub64(x453, uint64(0x0), uint64(x465)) - var x468 uint64 - fiatFpMontCmovznzU64(&x468, x467, x454, x441) - var x469 uint64 - fiatFpMontCmovznzU64(&x469, x467, x456, x443) - var x470 uint64 - fiatFpMontCmovznzU64(&x470, x467, x458, x445) - var x471 uint64 - fiatFpMontCmovznzU64(&x471, x467, x460, x447) - var x472 uint64 - fiatFpMontCmovznzU64(&x472, x467, x462, x449) - var x473 uint64 - fiatFpMontCmovznzU64(&x473, x467, x464, x451) - out1[0] = x468 - out1[1] = x469 - out1[2] = x470 - out1[3] = x471 - out1[4] = x472 - out1[5] = x473 -} - -// The function fiatFpMontSquare squares a field element in the Montgomery domain. -// -// Preconditions: -// -// 0 ≤ eval arg1 < m -// -// Postconditions: -// -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// -// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// -// Output Bounds: -// -// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -func fiatFpMontSquare(out1 *[6]uint64, arg1 *[6]uint64) { - x1 := arg1[1] - x2 := arg1[2] - x3 := arg1[3] - x4 := arg1[4] - x5 := arg1[5] - x6 := arg1[0] - var x7 uint64 - var x8 uint64 - x8, x7 = bits.Mul64(x6, arg1[5]) - var x9 uint64 - var x10 uint64 - x10, x9 = bits.Mul64(x6, arg1[4]) - var x11 uint64 - var x12 uint64 - x12, x11 = bits.Mul64(x6, arg1[3]) - var x13 uint64 - var x14 uint64 - x14, x13 = bits.Mul64(x6, arg1[2]) - var x15 uint64 - var x16 uint64 - x16, x15 = bits.Mul64(x6, arg1[1]) - var x17 uint64 - var x18 uint64 - x18, x17 = bits.Mul64(x6, arg1[0]) - var x19 uint64 - var x20 uint64 - x19, x20 = bits.Add64(x18, x15, uint64(0x0)) - var x21 uint64 - var x22 uint64 - x21, x22 = bits.Add64(x16, x13, uint64(x20)) - var x23 uint64 - var x24 uint64 - x23, x24 = bits.Add64(x14, x11, uint64(x22)) - var x25 uint64 - var x26 uint64 - x25, x26 = bits.Add64(x12, x9, uint64(x24)) - var x27 uint64 - var x28 uint64 - x27, x28 = bits.Add64(x10, x7, uint64(x26)) - x29 := (x28 + x8) - var x30 uint64 - _, x30 = bits.Mul64(x17, 0x89f3fffcfffcfffd) - var x32 uint64 - var x33 uint64 - x33, x32 = bits.Mul64(x30, 0x1a0111ea397fe69a) - var x34 uint64 - var x35 uint64 - x35, x34 = bits.Mul64(x30, 0x4b1ba7b6434bacd7) - var x36 uint64 - var x37 uint64 - x37, x36 = bits.Mul64(x30, 0x64774b84f38512bf) - var x38 uint64 - var x39 uint64 - x39, x38 = bits.Mul64(x30, 0x6730d2a0f6b0f624) - var x40 uint64 - var x41 uint64 - x41, x40 = bits.Mul64(x30, 0x1eabfffeb153ffff) - var x42 uint64 - var x43 uint64 - x43, x42 = bits.Mul64(x30, 0xb9feffffffffaaab) - var x44 uint64 - var x45 uint64 - x44, x45 = bits.Add64(x43, x40, uint64(0x0)) - var x46 uint64 - var x47 uint64 - x46, x47 = bits.Add64(x41, x38, uint64(x45)) - var x48 uint64 - var x49 uint64 - x48, x49 = bits.Add64(x39, x36, uint64(x47)) - var x50 uint64 - var x51 uint64 - x50, x51 = bits.Add64(x37, x34, uint64(x49)) - var x52 uint64 - var x53 uint64 - x52, x53 = bits.Add64(x35, x32, uint64(x51)) - x54 := (x53 + x33) - var x56 uint64 - _, x56 = bits.Add64(x17, x42, uint64(0x0)) - var x57 uint64 - var x58 uint64 - x57, x58 = bits.Add64(x19, x44, uint64(x56)) - var x59 uint64 - var x60 uint64 - x59, x60 = bits.Add64(x21, x46, uint64(x58)) - var x61 uint64 - var x62 uint64 - x61, x62 = bits.Add64(x23, x48, uint64(x60)) - var x63 uint64 - var x64 uint64 - x63, x64 = bits.Add64(x25, x50, uint64(x62)) - var x65 uint64 - var x66 uint64 - x65, x66 = bits.Add64(x27, x52, uint64(x64)) - var x67 uint64 - var x68 uint64 - x67, x68 = bits.Add64(x29, x54, uint64(x66)) - var x69 uint64 - var x70 uint64 - x70, x69 = bits.Mul64(x1, arg1[5]) - var x71 uint64 - var x72 uint64 - x72, x71 = bits.Mul64(x1, arg1[4]) - var x73 uint64 - var x74 uint64 - x74, x73 = bits.Mul64(x1, arg1[3]) - var x75 uint64 - var x76 uint64 - x76, x75 = bits.Mul64(x1, arg1[2]) - var x77 uint64 - var x78 uint64 - x78, x77 = bits.Mul64(x1, arg1[1]) - var x79 uint64 - var x80 uint64 - x80, x79 = bits.Mul64(x1, arg1[0]) - var x81 uint64 - var x82 uint64 - x81, x82 = bits.Add64(x80, x77, uint64(0x0)) - var x83 uint64 - var x84 uint64 - x83, x84 = bits.Add64(x78, x75, uint64(x82)) - var x85 uint64 - var x86 uint64 - x85, x86 = bits.Add64(x76, x73, uint64(x84)) - var x87 uint64 - var x88 uint64 - x87, x88 = bits.Add64(x74, x71, uint64(x86)) - var x89 uint64 - var x90 uint64 - x89, x90 = bits.Add64(x72, x69, uint64(x88)) - x91 := (x90 + x70) - var x92 uint64 - var x93 uint64 - x92, x93 = bits.Add64(x57, x79, uint64(0x0)) - var x94 uint64 - var x95 uint64 - x94, x95 = bits.Add64(x59, x81, uint64(x93)) - var x96 uint64 - var x97 uint64 - x96, x97 = bits.Add64(x61, x83, uint64(x95)) - var x98 uint64 - var x99 uint64 - x98, x99 = bits.Add64(x63, x85, uint64(x97)) - var x100 uint64 - var x101 uint64 - x100, x101 = bits.Add64(x65, x87, uint64(x99)) - var x102 uint64 - var x103 uint64 - x102, x103 = bits.Add64(x67, x89, uint64(x101)) - var x104 uint64 - var x105 uint64 - x104, x105 = bits.Add64(x68, x91, uint64(x103)) - var x106 uint64 - _, x106 = bits.Mul64(x92, 0x89f3fffcfffcfffd) - var x108 uint64 - var x109 uint64 - x109, x108 = bits.Mul64(x106, 0x1a0111ea397fe69a) - var x110 uint64 - var x111 uint64 - x111, x110 = bits.Mul64(x106, 0x4b1ba7b6434bacd7) - var x112 uint64 - var x113 uint64 - x113, x112 = bits.Mul64(x106, 0x64774b84f38512bf) - var x114 uint64 - var x115 uint64 - x115, x114 = bits.Mul64(x106, 0x6730d2a0f6b0f624) - var x116 uint64 - var x117 uint64 - x117, x116 = bits.Mul64(x106, 0x1eabfffeb153ffff) - var x118 uint64 - var x119 uint64 - x119, x118 = bits.Mul64(x106, 0xb9feffffffffaaab) - var x120 uint64 - var x121 uint64 - x120, x121 = bits.Add64(x119, x116, uint64(0x0)) - var x122 uint64 - var x123 uint64 - x122, x123 = bits.Add64(x117, x114, uint64(x121)) - var x124 uint64 - var x125 uint64 - x124, x125 = bits.Add64(x115, x112, uint64(x123)) - var x126 uint64 - var x127 uint64 - x126, x127 = bits.Add64(x113, x110, uint64(x125)) - var x128 uint64 - var x129 uint64 - x128, x129 = bits.Add64(x111, x108, uint64(x127)) - x130 := (x129 + x109) - var x132 uint64 - _, x132 = bits.Add64(x92, x118, uint64(0x0)) - var x133 uint64 - var x134 uint64 - x133, x134 = bits.Add64(x94, x120, uint64(x132)) - var x135 uint64 - var x136 uint64 - x135, x136 = bits.Add64(x96, x122, uint64(x134)) - var x137 uint64 - var x138 uint64 - x137, x138 = bits.Add64(x98, x124, uint64(x136)) - var x139 uint64 - var x140 uint64 - x139, x140 = bits.Add64(x100, x126, uint64(x138)) - var x141 uint64 - var x142 uint64 - x141, x142 = bits.Add64(x102, x128, uint64(x140)) - var x143 uint64 - var x144 uint64 - x143, x144 = bits.Add64(x104, x130, uint64(x142)) - x145 := (x144 + x105) - var x146 uint64 - var x147 uint64 - x147, x146 = bits.Mul64(x2, arg1[5]) - var x148 uint64 - var x149 uint64 - x149, x148 = bits.Mul64(x2, arg1[4]) - var x150 uint64 - var x151 uint64 - x151, x150 = bits.Mul64(x2, arg1[3]) - var x152 uint64 - var x153 uint64 - x153, x152 = bits.Mul64(x2, arg1[2]) - var x154 uint64 - var x155 uint64 - x155, x154 = bits.Mul64(x2, arg1[1]) - var x156 uint64 - var x157 uint64 - x157, x156 = bits.Mul64(x2, arg1[0]) - var x158 uint64 - var x159 uint64 - x158, x159 = bits.Add64(x157, x154, uint64(0x0)) - var x160 uint64 - var x161 uint64 - x160, x161 = bits.Add64(x155, x152, uint64(x159)) - var x162 uint64 - var x163 uint64 - x162, x163 = bits.Add64(x153, x150, uint64(x161)) - var x164 uint64 - var x165 uint64 - x164, x165 = bits.Add64(x151, x148, uint64(x163)) - var x166 uint64 - var x167 uint64 - x166, x167 = bits.Add64(x149, x146, uint64(x165)) - x168 := (x167 + x147) - var x169 uint64 - var x170 uint64 - x169, x170 = bits.Add64(x133, x156, uint64(0x0)) - var x171 uint64 - var x172 uint64 - x171, x172 = bits.Add64(x135, x158, uint64(x170)) - var x173 uint64 - var x174 uint64 - x173, x174 = bits.Add64(x137, x160, uint64(x172)) - var x175 uint64 - var x176 uint64 - x175, x176 = bits.Add64(x139, x162, uint64(x174)) - var x177 uint64 - var x178 uint64 - x177, x178 = bits.Add64(x141, x164, uint64(x176)) - var x179 uint64 - var x180 uint64 - x179, x180 = bits.Add64(x143, x166, uint64(x178)) - var x181 uint64 - var x182 uint64 - x181, x182 = bits.Add64(x145, x168, uint64(x180)) - var x183 uint64 - _, x183 = bits.Mul64(x169, 0x89f3fffcfffcfffd) - var x185 uint64 - var x186 uint64 - x186, x185 = bits.Mul64(x183, 0x1a0111ea397fe69a) - var x187 uint64 - var x188 uint64 - x188, x187 = bits.Mul64(x183, 0x4b1ba7b6434bacd7) - var x189 uint64 - var x190 uint64 - x190, x189 = bits.Mul64(x183, 0x64774b84f38512bf) - var x191 uint64 - var x192 uint64 - x192, x191 = bits.Mul64(x183, 0x6730d2a0f6b0f624) - var x193 uint64 - var x194 uint64 - x194, x193 = bits.Mul64(x183, 0x1eabfffeb153ffff) - var x195 uint64 - var x196 uint64 - x196, x195 = bits.Mul64(x183, 0xb9feffffffffaaab) - var x197 uint64 - var x198 uint64 - x197, x198 = bits.Add64(x196, x193, uint64(0x0)) - var x199 uint64 - var x200 uint64 - x199, x200 = bits.Add64(x194, x191, uint64(x198)) - var x201 uint64 - var x202 uint64 - x201, x202 = bits.Add64(x192, x189, uint64(x200)) - var x203 uint64 - var x204 uint64 - x203, x204 = bits.Add64(x190, x187, uint64(x202)) - var x205 uint64 - var x206 uint64 - x205, x206 = bits.Add64(x188, x185, uint64(x204)) - x207 := (x206 + x186) - var x209 uint64 - _, x209 = bits.Add64(x169, x195, uint64(0x0)) - var x210 uint64 - var x211 uint64 - x210, x211 = bits.Add64(x171, x197, uint64(x209)) - var x212 uint64 - var x213 uint64 - x212, x213 = bits.Add64(x173, x199, uint64(x211)) - var x214 uint64 - var x215 uint64 - x214, x215 = bits.Add64(x175, x201, uint64(x213)) - var x216 uint64 - var x217 uint64 - x216, x217 = bits.Add64(x177, x203, uint64(x215)) - var x218 uint64 - var x219 uint64 - x218, x219 = bits.Add64(x179, x205, uint64(x217)) - var x220 uint64 - var x221 uint64 - x220, x221 = bits.Add64(x181, x207, uint64(x219)) - x222 := (x221 + x182) - var x223 uint64 - var x224 uint64 - x224, x223 = bits.Mul64(x3, arg1[5]) - var x225 uint64 - var x226 uint64 - x226, x225 = bits.Mul64(x3, arg1[4]) - var x227 uint64 - var x228 uint64 - x228, x227 = bits.Mul64(x3, arg1[3]) - var x229 uint64 - var x230 uint64 - x230, x229 = bits.Mul64(x3, arg1[2]) - var x231 uint64 - var x232 uint64 - x232, x231 = bits.Mul64(x3, arg1[1]) - var x233 uint64 - var x234 uint64 - x234, x233 = bits.Mul64(x3, arg1[0]) - var x235 uint64 - var x236 uint64 - x235, x236 = bits.Add64(x234, x231, uint64(0x0)) - var x237 uint64 - var x238 uint64 - x237, x238 = bits.Add64(x232, x229, uint64(x236)) - var x239 uint64 - var x240 uint64 - x239, x240 = bits.Add64(x230, x227, uint64(x238)) - var x241 uint64 - var x242 uint64 - x241, x242 = bits.Add64(x228, x225, uint64(x240)) - var x243 uint64 - var x244 uint64 - x243, x244 = bits.Add64(x226, x223, uint64(x242)) - x245 := (x244 + x224) - var x246 uint64 - var x247 uint64 - x246, x247 = bits.Add64(x210, x233, uint64(0x0)) - var x248 uint64 - var x249 uint64 - x248, x249 = bits.Add64(x212, x235, uint64(x247)) - var x250 uint64 - var x251 uint64 - x250, x251 = bits.Add64(x214, x237, uint64(x249)) - var x252 uint64 - var x253 uint64 - x252, x253 = bits.Add64(x216, x239, uint64(x251)) - var x254 uint64 - var x255 uint64 - x254, x255 = bits.Add64(x218, x241, uint64(x253)) - var x256 uint64 - var x257 uint64 - x256, x257 = bits.Add64(x220, x243, uint64(x255)) - var x258 uint64 - var x259 uint64 - x258, x259 = bits.Add64(x222, x245, uint64(x257)) - var x260 uint64 - _, x260 = bits.Mul64(x246, 0x89f3fffcfffcfffd) - var x262 uint64 - var x263 uint64 - x263, x262 = bits.Mul64(x260, 0x1a0111ea397fe69a) - var x264 uint64 - var x265 uint64 - x265, x264 = bits.Mul64(x260, 0x4b1ba7b6434bacd7) - var x266 uint64 - var x267 uint64 - x267, x266 = bits.Mul64(x260, 0x64774b84f38512bf) - var x268 uint64 - var x269 uint64 - x269, x268 = bits.Mul64(x260, 0x6730d2a0f6b0f624) - var x270 uint64 - var x271 uint64 - x271, x270 = bits.Mul64(x260, 0x1eabfffeb153ffff) - var x272 uint64 - var x273 uint64 - x273, x272 = bits.Mul64(x260, 0xb9feffffffffaaab) - var x274 uint64 - var x275 uint64 - x274, x275 = bits.Add64(x273, x270, uint64(0x0)) - var x276 uint64 - var x277 uint64 - x276, x277 = bits.Add64(x271, x268, uint64(x275)) - var x278 uint64 - var x279 uint64 - x278, x279 = bits.Add64(x269, x266, uint64(x277)) - var x280 uint64 - var x281 uint64 - x280, x281 = bits.Add64(x267, x264, uint64(x279)) - var x282 uint64 - var x283 uint64 - x282, x283 = bits.Add64(x265, x262, uint64(x281)) - x284 := (x283 + x263) - var x286 uint64 - _, x286 = bits.Add64(x246, x272, uint64(0x0)) - var x287 uint64 - var x288 uint64 - x287, x288 = bits.Add64(x248, x274, uint64(x286)) - var x289 uint64 - var x290 uint64 - x289, x290 = bits.Add64(x250, x276, uint64(x288)) - var x291 uint64 - var x292 uint64 - x291, x292 = bits.Add64(x252, x278, uint64(x290)) - var x293 uint64 - var x294 uint64 - x293, x294 = bits.Add64(x254, x280, uint64(x292)) - var x295 uint64 - var x296 uint64 - x295, x296 = bits.Add64(x256, x282, uint64(x294)) - var x297 uint64 - var x298 uint64 - x297, x298 = bits.Add64(x258, x284, uint64(x296)) - x299 := (x298 + x259) - var x300 uint64 - var x301 uint64 - x301, x300 = bits.Mul64(x4, arg1[5]) - var x302 uint64 - var x303 uint64 - x303, x302 = bits.Mul64(x4, arg1[4]) - var x304 uint64 - var x305 uint64 - x305, x304 = bits.Mul64(x4, arg1[3]) - var x306 uint64 - var x307 uint64 - x307, x306 = bits.Mul64(x4, arg1[2]) - var x308 uint64 - var x309 uint64 - x309, x308 = bits.Mul64(x4, arg1[1]) - var x310 uint64 - var x311 uint64 - x311, x310 = bits.Mul64(x4, arg1[0]) - var x312 uint64 - var x313 uint64 - x312, x313 = bits.Add64(x311, x308, uint64(0x0)) - var x314 uint64 - var x315 uint64 - x314, x315 = bits.Add64(x309, x306, uint64(x313)) - var x316 uint64 - var x317 uint64 - x316, x317 = bits.Add64(x307, x304, uint64(x315)) - var x318 uint64 - var x319 uint64 - x318, x319 = bits.Add64(x305, x302, uint64(x317)) - var x320 uint64 - var x321 uint64 - x320, x321 = bits.Add64(x303, x300, uint64(x319)) - x322 := (x321 + x301) - var x323 uint64 - var x324 uint64 - x323, x324 = bits.Add64(x287, x310, uint64(0x0)) - var x325 uint64 - var x326 uint64 - x325, x326 = bits.Add64(x289, x312, uint64(x324)) - var x327 uint64 - var x328 uint64 - x327, x328 = bits.Add64(x291, x314, uint64(x326)) - var x329 uint64 - var x330 uint64 - x329, x330 = bits.Add64(x293, x316, uint64(x328)) - var x331 uint64 - var x332 uint64 - x331, x332 = bits.Add64(x295, x318, uint64(x330)) - var x333 uint64 - var x334 uint64 - x333, x334 = bits.Add64(x297, x320, uint64(x332)) - var x335 uint64 - var x336 uint64 - x335, x336 = bits.Add64(x299, x322, uint64(x334)) - var x337 uint64 - _, x337 = bits.Mul64(x323, 0x89f3fffcfffcfffd) - var x339 uint64 - var x340 uint64 - x340, x339 = bits.Mul64(x337, 0x1a0111ea397fe69a) - var x341 uint64 - var x342 uint64 - x342, x341 = bits.Mul64(x337, 0x4b1ba7b6434bacd7) - var x343 uint64 - var x344 uint64 - x344, x343 = bits.Mul64(x337, 0x64774b84f38512bf) - var x345 uint64 - var x346 uint64 - x346, x345 = bits.Mul64(x337, 0x6730d2a0f6b0f624) - var x347 uint64 - var x348 uint64 - x348, x347 = bits.Mul64(x337, 0x1eabfffeb153ffff) - var x349 uint64 - var x350 uint64 - x350, x349 = bits.Mul64(x337, 0xb9feffffffffaaab) - var x351 uint64 - var x352 uint64 - x351, x352 = bits.Add64(x350, x347, uint64(0x0)) - var x353 uint64 - var x354 uint64 - x353, x354 = bits.Add64(x348, x345, uint64(x352)) - var x355 uint64 - var x356 uint64 - x355, x356 = bits.Add64(x346, x343, uint64(x354)) - var x357 uint64 - var x358 uint64 - x357, x358 = bits.Add64(x344, x341, uint64(x356)) - var x359 uint64 - var x360 uint64 - x359, x360 = bits.Add64(x342, x339, uint64(x358)) - x361 := (x360 + x340) - var x363 uint64 - _, x363 = bits.Add64(x323, x349, uint64(0x0)) - var x364 uint64 - var x365 uint64 - x364, x365 = bits.Add64(x325, x351, uint64(x363)) - var x366 uint64 - var x367 uint64 - x366, x367 = bits.Add64(x327, x353, uint64(x365)) - var x368 uint64 - var x369 uint64 - x368, x369 = bits.Add64(x329, x355, uint64(x367)) - var x370 uint64 - var x371 uint64 - x370, x371 = bits.Add64(x331, x357, uint64(x369)) - var x372 uint64 - var x373 uint64 - x372, x373 = bits.Add64(x333, x359, uint64(x371)) - var x374 uint64 - var x375 uint64 - x374, x375 = bits.Add64(x335, x361, uint64(x373)) - x376 := (x375 + x336) - var x377 uint64 - var x378 uint64 - x378, x377 = bits.Mul64(x5, arg1[5]) - var x379 uint64 - var x380 uint64 - x380, x379 = bits.Mul64(x5, arg1[4]) - var x381 uint64 - var x382 uint64 - x382, x381 = bits.Mul64(x5, arg1[3]) - var x383 uint64 - var x384 uint64 - x384, x383 = bits.Mul64(x5, arg1[2]) - var x385 uint64 - var x386 uint64 - x386, x385 = bits.Mul64(x5, arg1[1]) - var x387 uint64 - var x388 uint64 - x388, x387 = bits.Mul64(x5, arg1[0]) - var x389 uint64 - var x390 uint64 - x389, x390 = bits.Add64(x388, x385, uint64(0x0)) - var x391 uint64 - var x392 uint64 - x391, x392 = bits.Add64(x386, x383, uint64(x390)) - var x393 uint64 - var x394 uint64 - x393, x394 = bits.Add64(x384, x381, uint64(x392)) - var x395 uint64 - var x396 uint64 - x395, x396 = bits.Add64(x382, x379, uint64(x394)) - var x397 uint64 - var x398 uint64 - x397, x398 = bits.Add64(x380, x377, uint64(x396)) - x399 := (x398 + x378) - var x400 uint64 - var x401 uint64 - x400, x401 = bits.Add64(x364, x387, uint64(0x0)) - var x402 uint64 - var x403 uint64 - x402, x403 = bits.Add64(x366, x389, uint64(x401)) - var x404 uint64 - var x405 uint64 - x404, x405 = bits.Add64(x368, x391, uint64(x403)) - var x406 uint64 - var x407 uint64 - x406, x407 = bits.Add64(x370, x393, uint64(x405)) - var x408 uint64 - var x409 uint64 - x408, x409 = bits.Add64(x372, x395, uint64(x407)) - var x410 uint64 - var x411 uint64 - x410, x411 = bits.Add64(x374, x397, uint64(x409)) - var x412 uint64 - var x413 uint64 - x412, x413 = bits.Add64(x376, x399, uint64(x411)) - var x414 uint64 - _, x414 = bits.Mul64(x400, 0x89f3fffcfffcfffd) - var x416 uint64 - var x417 uint64 - x417, x416 = bits.Mul64(x414, 0x1a0111ea397fe69a) - var x418 uint64 - var x419 uint64 - x419, x418 = bits.Mul64(x414, 0x4b1ba7b6434bacd7) - var x420 uint64 - var x421 uint64 - x421, x420 = bits.Mul64(x414, 0x64774b84f38512bf) - var x422 uint64 - var x423 uint64 - x423, x422 = bits.Mul64(x414, 0x6730d2a0f6b0f624) - var x424 uint64 - var x425 uint64 - x425, x424 = bits.Mul64(x414, 0x1eabfffeb153ffff) - var x426 uint64 - var x427 uint64 - x427, x426 = bits.Mul64(x414, 0xb9feffffffffaaab) - var x428 uint64 - var x429 uint64 - x428, x429 = bits.Add64(x427, x424, uint64(0x0)) - var x430 uint64 - var x431 uint64 - x430, x431 = bits.Add64(x425, x422, uint64(x429)) - var x432 uint64 - var x433 uint64 - x432, x433 = bits.Add64(x423, x420, uint64(x431)) - var x434 uint64 - var x435 uint64 - x434, x435 = bits.Add64(x421, x418, uint64(x433)) - var x436 uint64 - var x437 uint64 - x436, x437 = bits.Add64(x419, x416, uint64(x435)) - x438 := (x437 + x417) - var x440 uint64 - _, x440 = bits.Add64(x400, x426, uint64(0x0)) - var x441 uint64 - var x442 uint64 - x441, x442 = bits.Add64(x402, x428, uint64(x440)) - var x443 uint64 - var x444 uint64 - x443, x444 = bits.Add64(x404, x430, uint64(x442)) - var x445 uint64 - var x446 uint64 - x445, x446 = bits.Add64(x406, x432, uint64(x444)) - var x447 uint64 - var x448 uint64 - x447, x448 = bits.Add64(x408, x434, uint64(x446)) - var x449 uint64 - var x450 uint64 - x449, x450 = bits.Add64(x410, x436, uint64(x448)) - var x451 uint64 - var x452 uint64 - x451, x452 = bits.Add64(x412, x438, uint64(x450)) - x453 := (x452 + x413) - var x454 uint64 - var x455 uint64 - x454, x455 = bits.Sub64(x441, 0xb9feffffffffaaab, uint64(uint64(0x0))) - var x456 uint64 - var x457 uint64 - x456, x457 = bits.Sub64(x443, 0x1eabfffeb153ffff, uint64(x455)) - var x458 uint64 - var x459 uint64 - x458, x459 = bits.Sub64(x445, 0x6730d2a0f6b0f624, uint64(x457)) - var x460 uint64 - var x461 uint64 - x460, x461 = bits.Sub64(x447, 0x64774b84f38512bf, uint64(x459)) - var x462 uint64 - var x463 uint64 - x462, x463 = bits.Sub64(x449, 0x4b1ba7b6434bacd7, uint64(x461)) - var x464 uint64 - var x465 uint64 - x464, x465 = bits.Sub64(x451, 0x1a0111ea397fe69a, uint64(x463)) - var x467 uint64 - _, x467 = bits.Sub64(x453, uint64(0x0), uint64(x465)) - var x468 uint64 - fiatFpMontCmovznzU64(&x468, x467, x454, x441) - var x469 uint64 - fiatFpMontCmovznzU64(&x469, x467, x456, x443) - var x470 uint64 - fiatFpMontCmovznzU64(&x470, x467, x458, x445) - var x471 uint64 - fiatFpMontCmovznzU64(&x471, x467, x460, x447) - var x472 uint64 - fiatFpMontCmovznzU64(&x472, x467, x462, x449) - var x473 uint64 - fiatFpMontCmovznzU64(&x473, x467, x464, x451) - out1[0] = x468 - out1[1] = x469 - out1[2] = x470 - out1[3] = x471 - out1[4] = x472 - out1[5] = x473 -} diff --git a/ecc/bls12381/ff/fp_test.go b/ecc/bls12381/ff/fp_test.go deleted file mode 100644 index 2fda0195..00000000 --- a/ecc/bls12381/ff/fp_test.go +++ /dev/null @@ -1,149 +0,0 @@ -package ff - -import ( - "crypto/rand" - "fmt" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func randomFp(t testing.TB) *Fp { - t.Helper() - f := new(Fp) - err := f.Random(rand.Reader) - if err != nil { - t.Error(err) - } - return f -} - -func TestFp(t *testing.T) { - const testTimes = 1 << 10 - t.Run("no_alias", func(t *testing.T) { - var want, got Fp - x := randomFp(t) - got = *x - got.Sqr(&got) - want = *x - want.Mul(&want, &want) - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - }) - t.Run("mul_inv", func(t *testing.T) { - var z Fp - for i := 0; i < testTimes; i++ { - x := randomFp(t) - y := randomFp(t) - - // x*y*x^1 - y = 0 - z.Inv(x) - z.Mul(&z, y) - z.Mul(&z, x) - z.Sub(&z, y) - got := z.IsZero() - want := 1 - if got != want { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("mul_sqr", func(t *testing.T) { - var l0, l1, r0, r1 Fp - for i := 0; i < testTimes; i++ { - x := randomFp(t) - y := randomFp(t) - - // (x+y)(x-y) = (x^2-y^2) - l0.Add(x, y) - l1.Sub(x, y) - l0.Mul(&l0, &l1) - r0.Sqr(x) - r1.Sqr(y) - r0.Sub(&r0, &r1) - got := &l0 - want := &r0 - if got.IsEqual(want) == 0 { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("sqrt", func(t *testing.T) { - var r, notRoot, got Fp - // Check when x has square-root. - for i := 0; i < testTimes; i++ { - x := randomFp(t) - x.Sqr(x) - - // let x is QR and r = sqrt(x); check (+r)^2 = (-r)^2 = x. - isQR := r.Sqrt(x) - test.CheckOk(isQR == 1, fmt.Sprintf("should be a QR: %v", x), t) - rNeg := r - rNeg.Neg() - - want := x - for _, root := range []*Fp{&r, &rNeg} { - got.Sqr(root) - if got.IsEqual(want) == 0 { - test.ReportError(t, got, want, x, root) - } - } - } - // Check when x has not square-root. - for i := 0; i < testTimes; i++ { - want := randomFp(t) - x := randomFp(t) - x.Sqr(x) - x.Add(x, x) // x = 2*(x^2), since 2 is not QR in Fp. - - // let x is not QR and r = sqrt(x); check that r was not modified. - got := want - isQR := got.Sqrt(x) - test.CheckOk(isQR == 0, fmt.Sprintf("shouldn't be a QR: %v", x), t) - - if got.IsEqual(want) != 1 { - test.ReportError(t, got, want, x, notRoot) - } - } - }) - t.Run("marshal", func(t *testing.T) { - var b Fp - for i := 0; i < testTimes; i++ { - a := randomFp(t) - s, err := a.MarshalBinary() - test.CheckNoErr(t, err, "MarshalBinary failed") - err = b.UnmarshalBinary(s) - test.CheckNoErr(t, err, "UnmarshalBinary failed") - if b.IsEqual(a) == 0 { - test.ReportError(t, a, b) - } - } - }) -} - -func BenchmarkFp(b *testing.B) { - x := randomFp(b) - y := randomFp(b) - z := randomFp(b) - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Add(x, y) - } - }) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Mul(x, y) - } - }) - b.Run("Sqr", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Sqr(x) - } - }) - b.Run("Inv", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Inv(x) - } - }) -} diff --git a/ecc/bls12381/ff/gen.go b/ecc/bls12381/ff/gen.go deleted file mode 100644 index 5b636e2e..00000000 --- a/ecc/bls12381/ff/gen.go +++ /dev/null @@ -1,96 +0,0 @@ -//go:build ignore -// +build ignore - -// Code Generation using fiat-crypto -// -// Download and unpack `ExtractionOCaml-Ubuntu LTS` from -// https://github.com/mit-plv/fiat-crypto/suites/3241842351/artifacts/75305272 -// -// Then run this program specifying the path to the word_by_word_montgomery binary. -// $ FIAT_BINARY= go run gen.go -// -// References: -// [1] Erbsen et al. "Simple High-Level Code For Cryptographic Arithmetic – With -// Proofs, Without Compromises" https://github.com/mit-plv/fiat-crypto - -package main - -import ( - "log" - "os" - "os/exec" - "strings" - "text/template" -) - -const ( - packName = "ff" - headerCIRCL = "Code generated by gen.go using fiat-crypto." -) - -var ( - FIAT_BINARY = "./word_by_word_montgomery" - FIAT_PARAMS = []string{ - "--output", "{{.Name}}.go", - "--lang", "Go", - "--package-name", "{{.PackageName}}", - "--doc-prepend-header", "{{.Header}}", - "--package-case", "lowerCamelCase", - "--public-function-case", "lowerCamelCase", - "--public-type-case", "lowerCamelCase", - "--doc-newline-before-package-declaration", - "--no-primitives", - "--widen-carry", - "--no-field-element-typedefs", - "--relax-primitive-carry-to-bitwidth", "64", - "{{.Prefix}}", "64", "{{.Prime}}", - "add", "sub", "mul", "square", - } -) - -var fields = []struct{ Prefix, Name, Prime, Header, PackageName string }{ - { - Prefix: "FpMont", - Name: "fpMont381", - Prime: "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab", - Header: headerCIRCL, - PackageName: packName, - }, - { - Prefix: "ScMont", - Name: "scMont255", - Prime: "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001", - Header: headerCIRCL, - PackageName: packName, - }, -} - -func main() { - if s := os.Getenv("FIAT_BINARY"); s != "" { - FIAT_BINARY = s - } - - var err error - t := template.New("params") - buf := new(strings.Builder) - - for _, f := range fields { - params := []string{} - - for _, p := range FIAT_PARAMS { - buf.Reset() - t = template.Must(t.Parse(p)) - err = t.Execute(buf, f) - if err != nil { - log.Fatalf("executing template:", err) - } - params = append(params, buf.String()) - } - - cmd := exec.Command(FIAT_BINARY, params...) - out, err := cmd.CombinedOutput() - if len(out) != 0 || err != nil { - log.Fatalf("command output: %s\n command error: %v\n", out, err) - } - } -} diff --git a/ecc/bls12381/ff/scMont255.go b/ecc/bls12381/ff/scMont255.go deleted file mode 100644 index ef739f4b..00000000 --- a/ecc/bls12381/ff/scMont255.go +++ /dev/null @@ -1,834 +0,0 @@ -// Code generated by gen.go using fiat-crypto. -// -// Autogenerated: './word_by_word_montgomery' --output scMont255.go --lang Go --package-name ff --doc-prepend-header 'Code generated by gen.go using fiat-crypto.' --package-case lowerCamelCase --public-function-case lowerCamelCase --public-type-case lowerCamelCase --doc-newline-before-package-declaration --no-primitives --widen-carry --no-field-element-typedefs --relax-primitive-carry-to-bitwidth 64 ScMont 64 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001 add sub mul square -// -// curve description: ScMont -// -// machine_wordsize = 64 (from "64") -// -// requested operations: add, sub, mul, square -// -// m = 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001 (from "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001") -// -// -// -// NOTE: In addition to the bounds specified above each function, all -// -// functions synthesized for this Montgomery arithmetic require the -// -// input to be strictly less than the prime modulus (m), and also -// -// require the input to be in the unique saturated representation. -// -// All functions also ensure that these two properties are true of -// -// return values. -// -// -// -// Computed values: -// -// eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) -// -// bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) -// -// twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) in -// -// if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 - -package ff - -import "math/bits" - -// The function fiatScMontAdd adds two field elements in the Montgomery domain. -// -// Preconditions: -// -// 0 ≤ eval arg1 < m -// 0 ≤ eval arg2 < m -// -// Postconditions: -// -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// -// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// -// Output Bounds: -// -// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -func fiatScMontAdd(out1 *[4]uint64, arg1 *[4]uint64, arg2 *[4]uint64) { - var x1 uint64 - var x2 uint64 - x1, x2 = bits.Add64(arg1[0], arg2[0], uint64(0x0)) - var x3 uint64 - var x4 uint64 - x3, x4 = bits.Add64(arg1[1], arg2[1], uint64(x2)) - var x5 uint64 - var x6 uint64 - x5, x6 = bits.Add64(arg1[2], arg2[2], uint64(x4)) - var x7 uint64 - var x8 uint64 - x7, x8 = bits.Add64(arg1[3], arg2[3], uint64(x6)) - var x9 uint64 - var x10 uint64 - x9, x10 = bits.Sub64(x1, 0xffffffff00000001, uint64(uint64(0x0))) - var x11 uint64 - var x12 uint64 - x11, x12 = bits.Sub64(x3, 0x53bda402fffe5bfe, uint64(x10)) - var x13 uint64 - var x14 uint64 - x13, x14 = bits.Sub64(x5, 0x3339d80809a1d805, uint64(x12)) - var x15 uint64 - var x16 uint64 - x15, x16 = bits.Sub64(x7, 0x73eda753299d7d48, uint64(x14)) - var x18 uint64 - _, x18 = bits.Sub64(x8, uint64(0x0), uint64(x16)) - var x19 uint64 - fiatScMontCmovznzU64(&x19, x18, x9, x1) - var x20 uint64 - fiatScMontCmovznzU64(&x20, x18, x11, x3) - var x21 uint64 - fiatScMontCmovznzU64(&x21, x18, x13, x5) - var x22 uint64 - fiatScMontCmovznzU64(&x22, x18, x15, x7) - out1[0] = x19 - out1[1] = x20 - out1[2] = x21 - out1[3] = x22 -} - -// The function fiatScMontSub subtracts two field elements in the Montgomery domain. -// -// Preconditions: -// -// 0 ≤ eval arg1 < m -// 0 ≤ eval arg2 < m -// -// Postconditions: -// -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// -// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// -// Output Bounds: -// -// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -func fiatScMontSub(out1 *[4]uint64, arg1 *[4]uint64, arg2 *[4]uint64) { - var x1 uint64 - var x2 uint64 - x1, x2 = bits.Sub64(arg1[0], arg2[0], uint64(0x0)) - var x3 uint64 - var x4 uint64 - x3, x4 = bits.Sub64(arg1[1], arg2[1], uint64(x2)) - var x5 uint64 - var x6 uint64 - x5, x6 = bits.Sub64(arg1[2], arg2[2], uint64(x4)) - var x7 uint64 - var x8 uint64 - x7, x8 = bits.Sub64(arg1[3], arg2[3], uint64(x6)) - var x9 uint64 - fiatScMontCmovznzU64(&x9, x8, uint64(0x0), 0xffffffffffffffff) - var x10 uint64 - var x11 uint64 - x10, x11 = bits.Add64(x1, (x9 & 0xffffffff00000001), uint64(0x0)) - var x12 uint64 - var x13 uint64 - x12, x13 = bits.Add64(x3, (x9 & 0x53bda402fffe5bfe), uint64(x11)) - var x14 uint64 - var x15 uint64 - x14, x15 = bits.Add64(x5, (x9 & 0x3339d80809a1d805), uint64(x13)) - var x16 uint64 - x16, _ = bits.Add64(x7, (x9 & 0x73eda753299d7d48), uint64(x15)) - out1[0] = x10 - out1[1] = x12 - out1[2] = x14 - out1[3] = x16 -} - -// The function fiatScMontMul multiplies two field elements in the Montgomery domain. -// -// Preconditions: -// -// 0 ≤ eval arg1 < m -// 0 ≤ eval arg2 < m -// -// Postconditions: -// -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// -// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// -// Output Bounds: -// -// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -func fiatScMontMul(out1 *[4]uint64, arg1 *[4]uint64, arg2 *[4]uint64) { - x1 := arg1[1] - x2 := arg1[2] - x3 := arg1[3] - x4 := arg1[0] - var x5 uint64 - var x6 uint64 - x6, x5 = bits.Mul64(x4, arg2[3]) - var x7 uint64 - var x8 uint64 - x8, x7 = bits.Mul64(x4, arg2[2]) - var x9 uint64 - var x10 uint64 - x10, x9 = bits.Mul64(x4, arg2[1]) - var x11 uint64 - var x12 uint64 - x12, x11 = bits.Mul64(x4, arg2[0]) - var x13 uint64 - var x14 uint64 - x13, x14 = bits.Add64(x12, x9, uint64(0x0)) - var x15 uint64 - var x16 uint64 - x15, x16 = bits.Add64(x10, x7, uint64(x14)) - var x17 uint64 - var x18 uint64 - x17, x18 = bits.Add64(x8, x5, uint64(x16)) - x19 := (x18 + x6) - var x20 uint64 - _, x20 = bits.Mul64(x11, 0xfffffffeffffffff) - var x22 uint64 - var x23 uint64 - x23, x22 = bits.Mul64(x20, 0x73eda753299d7d48) - var x24 uint64 - var x25 uint64 - x25, x24 = bits.Mul64(x20, 0x3339d80809a1d805) - var x26 uint64 - var x27 uint64 - x27, x26 = bits.Mul64(x20, 0x53bda402fffe5bfe) - var x28 uint64 - var x29 uint64 - x29, x28 = bits.Mul64(x20, 0xffffffff00000001) - var x30 uint64 - var x31 uint64 - x30, x31 = bits.Add64(x29, x26, uint64(0x0)) - var x32 uint64 - var x33 uint64 - x32, x33 = bits.Add64(x27, x24, uint64(x31)) - var x34 uint64 - var x35 uint64 - x34, x35 = bits.Add64(x25, x22, uint64(x33)) - x36 := (x35 + x23) - var x38 uint64 - _, x38 = bits.Add64(x11, x28, uint64(0x0)) - var x39 uint64 - var x40 uint64 - x39, x40 = bits.Add64(x13, x30, uint64(x38)) - var x41 uint64 - var x42 uint64 - x41, x42 = bits.Add64(x15, x32, uint64(x40)) - var x43 uint64 - var x44 uint64 - x43, x44 = bits.Add64(x17, x34, uint64(x42)) - var x45 uint64 - var x46 uint64 - x45, x46 = bits.Add64(x19, x36, uint64(x44)) - var x47 uint64 - var x48 uint64 - x48, x47 = bits.Mul64(x1, arg2[3]) - var x49 uint64 - var x50 uint64 - x50, x49 = bits.Mul64(x1, arg2[2]) - var x51 uint64 - var x52 uint64 - x52, x51 = bits.Mul64(x1, arg2[1]) - var x53 uint64 - var x54 uint64 - x54, x53 = bits.Mul64(x1, arg2[0]) - var x55 uint64 - var x56 uint64 - x55, x56 = bits.Add64(x54, x51, uint64(0x0)) - var x57 uint64 - var x58 uint64 - x57, x58 = bits.Add64(x52, x49, uint64(x56)) - var x59 uint64 - var x60 uint64 - x59, x60 = bits.Add64(x50, x47, uint64(x58)) - x61 := (x60 + x48) - var x62 uint64 - var x63 uint64 - x62, x63 = bits.Add64(x39, x53, uint64(0x0)) - var x64 uint64 - var x65 uint64 - x64, x65 = bits.Add64(x41, x55, uint64(x63)) - var x66 uint64 - var x67 uint64 - x66, x67 = bits.Add64(x43, x57, uint64(x65)) - var x68 uint64 - var x69 uint64 - x68, x69 = bits.Add64(x45, x59, uint64(x67)) - var x70 uint64 - var x71 uint64 - x70, x71 = bits.Add64(x46, x61, uint64(x69)) - var x72 uint64 - _, x72 = bits.Mul64(x62, 0xfffffffeffffffff) - var x74 uint64 - var x75 uint64 - x75, x74 = bits.Mul64(x72, 0x73eda753299d7d48) - var x76 uint64 - var x77 uint64 - x77, x76 = bits.Mul64(x72, 0x3339d80809a1d805) - var x78 uint64 - var x79 uint64 - x79, x78 = bits.Mul64(x72, 0x53bda402fffe5bfe) - var x80 uint64 - var x81 uint64 - x81, x80 = bits.Mul64(x72, 0xffffffff00000001) - var x82 uint64 - var x83 uint64 - x82, x83 = bits.Add64(x81, x78, uint64(0x0)) - var x84 uint64 - var x85 uint64 - x84, x85 = bits.Add64(x79, x76, uint64(x83)) - var x86 uint64 - var x87 uint64 - x86, x87 = bits.Add64(x77, x74, uint64(x85)) - x88 := (x87 + x75) - var x90 uint64 - _, x90 = bits.Add64(x62, x80, uint64(0x0)) - var x91 uint64 - var x92 uint64 - x91, x92 = bits.Add64(x64, x82, uint64(x90)) - var x93 uint64 - var x94 uint64 - x93, x94 = bits.Add64(x66, x84, uint64(x92)) - var x95 uint64 - var x96 uint64 - x95, x96 = bits.Add64(x68, x86, uint64(x94)) - var x97 uint64 - var x98 uint64 - x97, x98 = bits.Add64(x70, x88, uint64(x96)) - x99 := (x98 + x71) - var x100 uint64 - var x101 uint64 - x101, x100 = bits.Mul64(x2, arg2[3]) - var x102 uint64 - var x103 uint64 - x103, x102 = bits.Mul64(x2, arg2[2]) - var x104 uint64 - var x105 uint64 - x105, x104 = bits.Mul64(x2, arg2[1]) - var x106 uint64 - var x107 uint64 - x107, x106 = bits.Mul64(x2, arg2[0]) - var x108 uint64 - var x109 uint64 - x108, x109 = bits.Add64(x107, x104, uint64(0x0)) - var x110 uint64 - var x111 uint64 - x110, x111 = bits.Add64(x105, x102, uint64(x109)) - var x112 uint64 - var x113 uint64 - x112, x113 = bits.Add64(x103, x100, uint64(x111)) - x114 := (x113 + x101) - var x115 uint64 - var x116 uint64 - x115, x116 = bits.Add64(x91, x106, uint64(0x0)) - var x117 uint64 - var x118 uint64 - x117, x118 = bits.Add64(x93, x108, uint64(x116)) - var x119 uint64 - var x120 uint64 - x119, x120 = bits.Add64(x95, x110, uint64(x118)) - var x121 uint64 - var x122 uint64 - x121, x122 = bits.Add64(x97, x112, uint64(x120)) - var x123 uint64 - var x124 uint64 - x123, x124 = bits.Add64(x99, x114, uint64(x122)) - var x125 uint64 - _, x125 = bits.Mul64(x115, 0xfffffffeffffffff) - var x127 uint64 - var x128 uint64 - x128, x127 = bits.Mul64(x125, 0x73eda753299d7d48) - var x129 uint64 - var x130 uint64 - x130, x129 = bits.Mul64(x125, 0x3339d80809a1d805) - var x131 uint64 - var x132 uint64 - x132, x131 = bits.Mul64(x125, 0x53bda402fffe5bfe) - var x133 uint64 - var x134 uint64 - x134, x133 = bits.Mul64(x125, 0xffffffff00000001) - var x135 uint64 - var x136 uint64 - x135, x136 = bits.Add64(x134, x131, uint64(0x0)) - var x137 uint64 - var x138 uint64 - x137, x138 = bits.Add64(x132, x129, uint64(x136)) - var x139 uint64 - var x140 uint64 - x139, x140 = bits.Add64(x130, x127, uint64(x138)) - x141 := (x140 + x128) - var x143 uint64 - _, x143 = bits.Add64(x115, x133, uint64(0x0)) - var x144 uint64 - var x145 uint64 - x144, x145 = bits.Add64(x117, x135, uint64(x143)) - var x146 uint64 - var x147 uint64 - x146, x147 = bits.Add64(x119, x137, uint64(x145)) - var x148 uint64 - var x149 uint64 - x148, x149 = bits.Add64(x121, x139, uint64(x147)) - var x150 uint64 - var x151 uint64 - x150, x151 = bits.Add64(x123, x141, uint64(x149)) - x152 := (x151 + x124) - var x153 uint64 - var x154 uint64 - x154, x153 = bits.Mul64(x3, arg2[3]) - var x155 uint64 - var x156 uint64 - x156, x155 = bits.Mul64(x3, arg2[2]) - var x157 uint64 - var x158 uint64 - x158, x157 = bits.Mul64(x3, arg2[1]) - var x159 uint64 - var x160 uint64 - x160, x159 = bits.Mul64(x3, arg2[0]) - var x161 uint64 - var x162 uint64 - x161, x162 = bits.Add64(x160, x157, uint64(0x0)) - var x163 uint64 - var x164 uint64 - x163, x164 = bits.Add64(x158, x155, uint64(x162)) - var x165 uint64 - var x166 uint64 - x165, x166 = bits.Add64(x156, x153, uint64(x164)) - x167 := (x166 + x154) - var x168 uint64 - var x169 uint64 - x168, x169 = bits.Add64(x144, x159, uint64(0x0)) - var x170 uint64 - var x171 uint64 - x170, x171 = bits.Add64(x146, x161, uint64(x169)) - var x172 uint64 - var x173 uint64 - x172, x173 = bits.Add64(x148, x163, uint64(x171)) - var x174 uint64 - var x175 uint64 - x174, x175 = bits.Add64(x150, x165, uint64(x173)) - var x176 uint64 - var x177 uint64 - x176, x177 = bits.Add64(x152, x167, uint64(x175)) - var x178 uint64 - _, x178 = bits.Mul64(x168, 0xfffffffeffffffff) - var x180 uint64 - var x181 uint64 - x181, x180 = bits.Mul64(x178, 0x73eda753299d7d48) - var x182 uint64 - var x183 uint64 - x183, x182 = bits.Mul64(x178, 0x3339d80809a1d805) - var x184 uint64 - var x185 uint64 - x185, x184 = bits.Mul64(x178, 0x53bda402fffe5bfe) - var x186 uint64 - var x187 uint64 - x187, x186 = bits.Mul64(x178, 0xffffffff00000001) - var x188 uint64 - var x189 uint64 - x188, x189 = bits.Add64(x187, x184, uint64(0x0)) - var x190 uint64 - var x191 uint64 - x190, x191 = bits.Add64(x185, x182, uint64(x189)) - var x192 uint64 - var x193 uint64 - x192, x193 = bits.Add64(x183, x180, uint64(x191)) - x194 := (x193 + x181) - var x196 uint64 - _, x196 = bits.Add64(x168, x186, uint64(0x0)) - var x197 uint64 - var x198 uint64 - x197, x198 = bits.Add64(x170, x188, uint64(x196)) - var x199 uint64 - var x200 uint64 - x199, x200 = bits.Add64(x172, x190, uint64(x198)) - var x201 uint64 - var x202 uint64 - x201, x202 = bits.Add64(x174, x192, uint64(x200)) - var x203 uint64 - var x204 uint64 - x203, x204 = bits.Add64(x176, x194, uint64(x202)) - x205 := (x204 + x177) - var x206 uint64 - var x207 uint64 - x206, x207 = bits.Sub64(x197, 0xffffffff00000001, uint64(uint64(0x0))) - var x208 uint64 - var x209 uint64 - x208, x209 = bits.Sub64(x199, 0x53bda402fffe5bfe, uint64(x207)) - var x210 uint64 - var x211 uint64 - x210, x211 = bits.Sub64(x201, 0x3339d80809a1d805, uint64(x209)) - var x212 uint64 - var x213 uint64 - x212, x213 = bits.Sub64(x203, 0x73eda753299d7d48, uint64(x211)) - var x215 uint64 - _, x215 = bits.Sub64(x205, uint64(0x0), uint64(x213)) - var x216 uint64 - fiatScMontCmovznzU64(&x216, x215, x206, x197) - var x217 uint64 - fiatScMontCmovznzU64(&x217, x215, x208, x199) - var x218 uint64 - fiatScMontCmovznzU64(&x218, x215, x210, x201) - var x219 uint64 - fiatScMontCmovznzU64(&x219, x215, x212, x203) - out1[0] = x216 - out1[1] = x217 - out1[2] = x218 - out1[3] = x219 -} - -// The function fiatScMontSquare squares a field element in the Montgomery domain. -// -// Preconditions: -// -// 0 ≤ eval arg1 < m -// -// Postconditions: -// -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// -// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// -// Output Bounds: -// -// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -func fiatScMontSquare(out1 *[4]uint64, arg1 *[4]uint64) { - x1 := arg1[1] - x2 := arg1[2] - x3 := arg1[3] - x4 := arg1[0] - var x5 uint64 - var x6 uint64 - x6, x5 = bits.Mul64(x4, arg1[3]) - var x7 uint64 - var x8 uint64 - x8, x7 = bits.Mul64(x4, arg1[2]) - var x9 uint64 - var x10 uint64 - x10, x9 = bits.Mul64(x4, arg1[1]) - var x11 uint64 - var x12 uint64 - x12, x11 = bits.Mul64(x4, arg1[0]) - var x13 uint64 - var x14 uint64 - x13, x14 = bits.Add64(x12, x9, uint64(0x0)) - var x15 uint64 - var x16 uint64 - x15, x16 = bits.Add64(x10, x7, uint64(x14)) - var x17 uint64 - var x18 uint64 - x17, x18 = bits.Add64(x8, x5, uint64(x16)) - x19 := (x18 + x6) - var x20 uint64 - _, x20 = bits.Mul64(x11, 0xfffffffeffffffff) - var x22 uint64 - var x23 uint64 - x23, x22 = bits.Mul64(x20, 0x73eda753299d7d48) - var x24 uint64 - var x25 uint64 - x25, x24 = bits.Mul64(x20, 0x3339d80809a1d805) - var x26 uint64 - var x27 uint64 - x27, x26 = bits.Mul64(x20, 0x53bda402fffe5bfe) - var x28 uint64 - var x29 uint64 - x29, x28 = bits.Mul64(x20, 0xffffffff00000001) - var x30 uint64 - var x31 uint64 - x30, x31 = bits.Add64(x29, x26, uint64(0x0)) - var x32 uint64 - var x33 uint64 - x32, x33 = bits.Add64(x27, x24, uint64(x31)) - var x34 uint64 - var x35 uint64 - x34, x35 = bits.Add64(x25, x22, uint64(x33)) - x36 := (x35 + x23) - var x38 uint64 - _, x38 = bits.Add64(x11, x28, uint64(0x0)) - var x39 uint64 - var x40 uint64 - x39, x40 = bits.Add64(x13, x30, uint64(x38)) - var x41 uint64 - var x42 uint64 - x41, x42 = bits.Add64(x15, x32, uint64(x40)) - var x43 uint64 - var x44 uint64 - x43, x44 = bits.Add64(x17, x34, uint64(x42)) - var x45 uint64 - var x46 uint64 - x45, x46 = bits.Add64(x19, x36, uint64(x44)) - var x47 uint64 - var x48 uint64 - x48, x47 = bits.Mul64(x1, arg1[3]) - var x49 uint64 - var x50 uint64 - x50, x49 = bits.Mul64(x1, arg1[2]) - var x51 uint64 - var x52 uint64 - x52, x51 = bits.Mul64(x1, arg1[1]) - var x53 uint64 - var x54 uint64 - x54, x53 = bits.Mul64(x1, arg1[0]) - var x55 uint64 - var x56 uint64 - x55, x56 = bits.Add64(x54, x51, uint64(0x0)) - var x57 uint64 - var x58 uint64 - x57, x58 = bits.Add64(x52, x49, uint64(x56)) - var x59 uint64 - var x60 uint64 - x59, x60 = bits.Add64(x50, x47, uint64(x58)) - x61 := (x60 + x48) - var x62 uint64 - var x63 uint64 - x62, x63 = bits.Add64(x39, x53, uint64(0x0)) - var x64 uint64 - var x65 uint64 - x64, x65 = bits.Add64(x41, x55, uint64(x63)) - var x66 uint64 - var x67 uint64 - x66, x67 = bits.Add64(x43, x57, uint64(x65)) - var x68 uint64 - var x69 uint64 - x68, x69 = bits.Add64(x45, x59, uint64(x67)) - var x70 uint64 - var x71 uint64 - x70, x71 = bits.Add64(x46, x61, uint64(x69)) - var x72 uint64 - _, x72 = bits.Mul64(x62, 0xfffffffeffffffff) - var x74 uint64 - var x75 uint64 - x75, x74 = bits.Mul64(x72, 0x73eda753299d7d48) - var x76 uint64 - var x77 uint64 - x77, x76 = bits.Mul64(x72, 0x3339d80809a1d805) - var x78 uint64 - var x79 uint64 - x79, x78 = bits.Mul64(x72, 0x53bda402fffe5bfe) - var x80 uint64 - var x81 uint64 - x81, x80 = bits.Mul64(x72, 0xffffffff00000001) - var x82 uint64 - var x83 uint64 - x82, x83 = bits.Add64(x81, x78, uint64(0x0)) - var x84 uint64 - var x85 uint64 - x84, x85 = bits.Add64(x79, x76, uint64(x83)) - var x86 uint64 - var x87 uint64 - x86, x87 = bits.Add64(x77, x74, uint64(x85)) - x88 := (x87 + x75) - var x90 uint64 - _, x90 = bits.Add64(x62, x80, uint64(0x0)) - var x91 uint64 - var x92 uint64 - x91, x92 = bits.Add64(x64, x82, uint64(x90)) - var x93 uint64 - var x94 uint64 - x93, x94 = bits.Add64(x66, x84, uint64(x92)) - var x95 uint64 - var x96 uint64 - x95, x96 = bits.Add64(x68, x86, uint64(x94)) - var x97 uint64 - var x98 uint64 - x97, x98 = bits.Add64(x70, x88, uint64(x96)) - x99 := (x98 + x71) - var x100 uint64 - var x101 uint64 - x101, x100 = bits.Mul64(x2, arg1[3]) - var x102 uint64 - var x103 uint64 - x103, x102 = bits.Mul64(x2, arg1[2]) - var x104 uint64 - var x105 uint64 - x105, x104 = bits.Mul64(x2, arg1[1]) - var x106 uint64 - var x107 uint64 - x107, x106 = bits.Mul64(x2, arg1[0]) - var x108 uint64 - var x109 uint64 - x108, x109 = bits.Add64(x107, x104, uint64(0x0)) - var x110 uint64 - var x111 uint64 - x110, x111 = bits.Add64(x105, x102, uint64(x109)) - var x112 uint64 - var x113 uint64 - x112, x113 = bits.Add64(x103, x100, uint64(x111)) - x114 := (x113 + x101) - var x115 uint64 - var x116 uint64 - x115, x116 = bits.Add64(x91, x106, uint64(0x0)) - var x117 uint64 - var x118 uint64 - x117, x118 = bits.Add64(x93, x108, uint64(x116)) - var x119 uint64 - var x120 uint64 - x119, x120 = bits.Add64(x95, x110, uint64(x118)) - var x121 uint64 - var x122 uint64 - x121, x122 = bits.Add64(x97, x112, uint64(x120)) - var x123 uint64 - var x124 uint64 - x123, x124 = bits.Add64(x99, x114, uint64(x122)) - var x125 uint64 - _, x125 = bits.Mul64(x115, 0xfffffffeffffffff) - var x127 uint64 - var x128 uint64 - x128, x127 = bits.Mul64(x125, 0x73eda753299d7d48) - var x129 uint64 - var x130 uint64 - x130, x129 = bits.Mul64(x125, 0x3339d80809a1d805) - var x131 uint64 - var x132 uint64 - x132, x131 = bits.Mul64(x125, 0x53bda402fffe5bfe) - var x133 uint64 - var x134 uint64 - x134, x133 = bits.Mul64(x125, 0xffffffff00000001) - var x135 uint64 - var x136 uint64 - x135, x136 = bits.Add64(x134, x131, uint64(0x0)) - var x137 uint64 - var x138 uint64 - x137, x138 = bits.Add64(x132, x129, uint64(x136)) - var x139 uint64 - var x140 uint64 - x139, x140 = bits.Add64(x130, x127, uint64(x138)) - x141 := (x140 + x128) - var x143 uint64 - _, x143 = bits.Add64(x115, x133, uint64(0x0)) - var x144 uint64 - var x145 uint64 - x144, x145 = bits.Add64(x117, x135, uint64(x143)) - var x146 uint64 - var x147 uint64 - x146, x147 = bits.Add64(x119, x137, uint64(x145)) - var x148 uint64 - var x149 uint64 - x148, x149 = bits.Add64(x121, x139, uint64(x147)) - var x150 uint64 - var x151 uint64 - x150, x151 = bits.Add64(x123, x141, uint64(x149)) - x152 := (x151 + x124) - var x153 uint64 - var x154 uint64 - x154, x153 = bits.Mul64(x3, arg1[3]) - var x155 uint64 - var x156 uint64 - x156, x155 = bits.Mul64(x3, arg1[2]) - var x157 uint64 - var x158 uint64 - x158, x157 = bits.Mul64(x3, arg1[1]) - var x159 uint64 - var x160 uint64 - x160, x159 = bits.Mul64(x3, arg1[0]) - var x161 uint64 - var x162 uint64 - x161, x162 = bits.Add64(x160, x157, uint64(0x0)) - var x163 uint64 - var x164 uint64 - x163, x164 = bits.Add64(x158, x155, uint64(x162)) - var x165 uint64 - var x166 uint64 - x165, x166 = bits.Add64(x156, x153, uint64(x164)) - x167 := (x166 + x154) - var x168 uint64 - var x169 uint64 - x168, x169 = bits.Add64(x144, x159, uint64(0x0)) - var x170 uint64 - var x171 uint64 - x170, x171 = bits.Add64(x146, x161, uint64(x169)) - var x172 uint64 - var x173 uint64 - x172, x173 = bits.Add64(x148, x163, uint64(x171)) - var x174 uint64 - var x175 uint64 - x174, x175 = bits.Add64(x150, x165, uint64(x173)) - var x176 uint64 - var x177 uint64 - x176, x177 = bits.Add64(x152, x167, uint64(x175)) - var x178 uint64 - _, x178 = bits.Mul64(x168, 0xfffffffeffffffff) - var x180 uint64 - var x181 uint64 - x181, x180 = bits.Mul64(x178, 0x73eda753299d7d48) - var x182 uint64 - var x183 uint64 - x183, x182 = bits.Mul64(x178, 0x3339d80809a1d805) - var x184 uint64 - var x185 uint64 - x185, x184 = bits.Mul64(x178, 0x53bda402fffe5bfe) - var x186 uint64 - var x187 uint64 - x187, x186 = bits.Mul64(x178, 0xffffffff00000001) - var x188 uint64 - var x189 uint64 - x188, x189 = bits.Add64(x187, x184, uint64(0x0)) - var x190 uint64 - var x191 uint64 - x190, x191 = bits.Add64(x185, x182, uint64(x189)) - var x192 uint64 - var x193 uint64 - x192, x193 = bits.Add64(x183, x180, uint64(x191)) - x194 := (x193 + x181) - var x196 uint64 - _, x196 = bits.Add64(x168, x186, uint64(0x0)) - var x197 uint64 - var x198 uint64 - x197, x198 = bits.Add64(x170, x188, uint64(x196)) - var x199 uint64 - var x200 uint64 - x199, x200 = bits.Add64(x172, x190, uint64(x198)) - var x201 uint64 - var x202 uint64 - x201, x202 = bits.Add64(x174, x192, uint64(x200)) - var x203 uint64 - var x204 uint64 - x203, x204 = bits.Add64(x176, x194, uint64(x202)) - x205 := (x204 + x177) - var x206 uint64 - var x207 uint64 - x206, x207 = bits.Sub64(x197, 0xffffffff00000001, uint64(uint64(0x0))) - var x208 uint64 - var x209 uint64 - x208, x209 = bits.Sub64(x199, 0x53bda402fffe5bfe, uint64(x207)) - var x210 uint64 - var x211 uint64 - x210, x211 = bits.Sub64(x201, 0x3339d80809a1d805, uint64(x209)) - var x212 uint64 - var x213 uint64 - x212, x213 = bits.Sub64(x203, 0x73eda753299d7d48, uint64(x211)) - var x215 uint64 - _, x215 = bits.Sub64(x205, uint64(0x0), uint64(x213)) - var x216 uint64 - fiatScMontCmovznzU64(&x216, x215, x206, x197) - var x217 uint64 - fiatScMontCmovznzU64(&x217, x215, x208, x199) - var x218 uint64 - fiatScMontCmovznzU64(&x218, x215, x210, x201) - var x219 uint64 - fiatScMontCmovznzU64(&x219, x215, x212, x203) - out1[0] = x216 - out1[1] = x217 - out1[2] = x218 - out1[3] = x219 -} diff --git a/ecc/bls12381/ff/scalar.go b/ecc/bls12381/ff/scalar.go deleted file mode 100644 index bd81465f..00000000 --- a/ecc/bls12381/ff/scalar.go +++ /dev/null @@ -1,123 +0,0 @@ -package ff - -import ( - "io" - - "github.com/quantumcoinproject/circl/internal/conv" -) - -// ScalarSize is the length in bytes of a Scalar. -const ScalarSize = 32 - -// scMont represents an element in the Montgomery domain (little-endian). -type scMont = [ScalarSize / 8]uint64 - -// scRaw represents a scalar in the integers domain (little-endian). -type scRaw = [ScalarSize / 8]uint64 - -// Scalar represents positive integers less than ScalarOrder. -type Scalar struct{ i scMont } - -func (z Scalar) String() string { x := z.fromMont(); return conv.Uint64Le2Hex(x[:]) } -func (z *Scalar) Set(x *Scalar) { z.i = x.i } -func (z *Scalar) SetUint64(n uint64) { z.toMont(&scRaw{n}) } -func (z *Scalar) SetOne() { z.SetUint64(1) } -func (z *Scalar) Random(r io.Reader) error { return randomInt(z.i[:], r, scOrder[:]) } -func (z Scalar) IsZero() int { return ctUint64Eq(z.i[:], (&scMont{})[:]) } -func (z Scalar) IsEqual(x *Scalar) int { return ctUint64Eq(z.i[:], x.i[:]) } -func (z *Scalar) Neg() { fiatScMontSub(&z.i, &scMont{}, &z.i) } -func (z *Scalar) Add(x, y *Scalar) { fiatScMontAdd(&z.i, &x.i, &y.i) } -func (z *Scalar) Sub(x, y *Scalar) { fiatScMontSub(&z.i, &x.i, &y.i) } -func (z *Scalar) Mul(x, y *Scalar) { fiatScMontMul(&z.i, &x.i, &y.i) } -func (z *Scalar) Sqr(x *Scalar) { fiatScMontSquare(&z.i, &x.i) } -func (z *Scalar) Inv(x *Scalar) { z.expVarTime(x, scOrderMinus2[:]) } -func (z *Scalar) toMont(in *scRaw) { fiatScMontMul(&z.i, in, &scRSquare) } -func (z Scalar) fromMont() (out scRaw) { fiatScMontMul(&out, &z.i, &scMont{1}); return } - -// ScalarOrder is the order of the scalar field of the pairing groups, order is -// returned as a big-endian slice. -// -// ScalarOrder = 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001 -func ScalarOrder() []byte { o := scOrder; return o[:] } - -// exp calculates z=x^n, where n is in big-endian order. -func (z *Scalar) expVarTime(x *Scalar, n []byte) { - zz := new(Scalar) - zz.SetOne() - N := 8 * len(n) - for i := 0; i < N; i++ { - zz.Sqr(zz) - bit := 0x1 & (n[i/8] >> uint(7-i%8)) - if bit != 0 { - zz.Mul(zz, x) - } - } - z.Set(zz) -} - -// SetBytes assigns to z the number modulo ScalarOrder stored in the slice -// (in big-endian order). -func (z *Scalar) SetBytes(data []byte) { - in64 := setBytesUnbounded(data, scOrder[:]) - s := &scRaw{} - copy(s[:], in64[:ScalarSize/8]) - z.toMont(s) -} - -// MarshalBinary returns a slice of ScalarSize bytes that contains the minimal -// residue of z such that 0 <= z < ScalarOrder (in big-endian order). -func (z *Scalar) MarshalBinary() ([]byte, error) { - x := z.fromMont() - return conv.Uint64Le2BytesBe(x[:]), nil -} - -// UnmarshalBinary reconstructs a Scalar from a slice that must have at least -// ScalarSize bytes and contain a number (in big-endian order) from 0 -// to ScalarOrder-1. -func (z *Scalar) UnmarshalBinary(data []byte) error { - if len(data) < ScalarSize { - return errInputLength - } - in64, err := setBytesBounded(data[:ScalarSize], scOrder[:]) - if err == nil { - s := &scRaw{} - copy(s[:], in64[:ScalarSize/8]) - z.toMont(s) - } - return err -} - -// SetString reconstructs a Fp from a numeric string from 0 to ScalarOrder-1. -func (z *Scalar) SetString(s string) error { - in64, err := setString(s, scOrder[:]) - if err == nil { - s := &scRaw{} - copy(s[:], in64[:ScalarSize/8]) - z.toMont(s) - } - return err -} - -func fiatScMontCmovznzU64(z *uint64, b, x, y uint64) { cselectU64(z, b, x, y) } - -var ( - // scOrder is the order of the Scalar field (big-endian). - scOrder = [ScalarSize]byte{ - 0x73, 0xed, 0xa7, 0x53, 0x29, 0x9d, 0x7d, 0x48, - 0x33, 0x39, 0xd8, 0x08, 0x09, 0xa1, 0xd8, 0x05, - 0x53, 0xbd, 0xa4, 0x02, 0xff, 0xfe, 0x5b, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, - } - // scOrderMinus2 is the scOrder minus two used for inversion (big-endian). - scOrderMinus2 = [ScalarSize]byte{ - 0x73, 0xed, 0xa7, 0x53, 0x29, 0x9d, 0x7d, 0x48, - 0x33, 0x39, 0xd8, 0x08, 0x09, 0xa1, 0xd8, 0x05, - 0x53, 0xbd, 0xa4, 0x02, 0xff, 0xfe, 0x5b, 0xfe, - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - } - // scRSquare is R^2 mod scOrder, where R=2^256 (little-endian). - scRSquare = scMont{ - 0xc999e990f3f29c6d, 0x2b6cedcb87925c23, - 0x05d314967254398f, 0x0748d9d99f59ff11, - } -) diff --git a/ecc/bls12381/ff/scalar_test.go b/ecc/bls12381/ff/scalar_test.go deleted file mode 100644 index 2acaf1a2..00000000 --- a/ecc/bls12381/ff/scalar_test.go +++ /dev/null @@ -1,148 +0,0 @@ -package ff_test - -import ( - "bytes" - "crypto/rand" - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/ecc/bls12381/ff" - "github.com/quantumcoinproject/circl/internal/test" -) - -func randomScalar(t testing.TB) *ff.Scalar { - t.Helper() - s := new(ff.Scalar) - err := s.Random(rand.Reader) - if err != nil { - t.Error(err) - } - return s -} - -func TestScalar(t *testing.T) { - const testTimes = 1 << 10 - t.Run("marshal", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - var y ff.Scalar - x := randomScalar(t) - - bytes, err := x.MarshalBinary() - if err != nil { - test.ReportError(t, x, y, x) - } - err = y.UnmarshalBinary(bytes) - if err != nil { - test.ReportError(t, x, y, x) - } - if x.IsEqual(&y) == 0 { - test.ReportError(t, x, y, x) - } - } - }) - t.Run("no_alias", func(t *testing.T) { - var want, got ff.Scalar - x := randomScalar(t) - got.Set(x) - got.Sqr(&got) - want.Set(x) - want.Mul(&want, &want) - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - }) - t.Run("mul_inv", func(t *testing.T) { - var z ff.Scalar - for i := 0; i < testTimes; i++ { - x := randomScalar(t) - y := randomScalar(t) - // x*y*x^1 - y = 0 - z.Inv(x) - z.Mul(&z, y) - z.Mul(&z, x) - z.Sub(&z, y) - got := z.IsZero() - want := 1 - if got != want { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("mul_sqr", func(t *testing.T) { - var l0, l1, r0, r1 ff.Scalar - for i := 0; i < testTimes; i++ { - x := randomScalar(t) - y := randomScalar(t) - - // (x+y)(x-y) = (x^2-y^2) - l0.Add(x, y) - l1.Sub(x, y) - l0.Mul(&l0, &l1) - r0.Sqr(x) - r1.Sqr(y) - r0.Sub(&r0, &r1) - got := &l0 - want := &r0 - if got.IsEqual(want) == 0 { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("bytes", func(t *testing.T) { - var data [100]byte - _, _ = rand.Read(data[:]) - - var a, b ff.Scalar - var bigA, bigOrder big.Int - bigOrder.SetBytes(ff.ScalarOrder()) - - for i := 0; i < 100; i++ { - a.SetBytes(data[:i]) - - bigA.SetBytes(data[:i]) - bigA.Mod(&bigA, &bigOrder) - bytesA := bigA.Bytes() - b.SetBytes(bytesA) - - if a.IsEqual(&b) == 0 { - test.ReportError(t, a, b) - } - - got, err := a.MarshalBinary() - test.CheckNoErr(t, err, "MarshalBinary failed") - want, err := b.MarshalBinary() - test.CheckNoErr(t, err, "MarshalBinary failed") - - if !bytes.Equal(got, want) { - test.ReportError(t, got, want) - } - } - }) -} - -func BenchmarkScalar(b *testing.B) { - x := randomScalar(b) - y := randomScalar(b) - z := randomScalar(b) - - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Add(x, y) - } - }) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Mul(x, y) - } - }) - b.Run("Sqr", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Sqr(x) - } - }) - b.Run("Inv", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Inv(x) - } - }) -} diff --git a/ecc/bls12381/ff/uroot.go b/ecc/bls12381/ff/uroot.go deleted file mode 100644 index 0e4cf8ce..00000000 --- a/ecc/bls12381/ff/uroot.go +++ /dev/null @@ -1,19 +0,0 @@ -package ff - -// URootSize is the length in bytes of a root of unit. -const URootSize = Fp12Size - -// URoot represents an n-th root of unit, that is an element x in Cyclo6 such -// that x^n=1, where n = ScalarOrder(). -type URoot Cyclo6 - -func (z URoot) String() string { return (Cyclo6)(z).String() } -func (z *URoot) UnmarshalBinary(b []byte) error { return (*Fp12)(z).UnmarshalBinary(b) } -func (z URoot) MarshalBinary() ([]byte, error) { return (Fp12)(z).MarshalBinary() } -func (z *URoot) SetIdentity() { (*Fp12)(z).SetOne() } -func (z URoot) IsEqual(x *URoot) int { return (Cyclo6)(z).IsEqual((*Cyclo6)(x)) } -func (z URoot) IsIdentity() int { i := &URoot{}; i.SetIdentity(); return z.IsEqual(i) } -func (z *URoot) Exp(x *URoot, n []byte) { (*Cyclo6)(z).exp((*Cyclo6)(x), n) } -func (z *URoot) Mul(x, y *URoot) { (*Cyclo6)(z).Mul((*Cyclo6)(x), (*Cyclo6)(y)) } -func (z *URoot) Sqr(x *URoot) { (*Cyclo6)(z).Sqr((*Cyclo6)(x)) } -func (z *URoot) Inv(x *URoot) { (*Cyclo6)(z).Inv((*Cyclo6)(x)) } diff --git a/ecc/bls12381/ff/uroot_test.go b/ecc/bls12381/ff/uroot_test.go deleted file mode 100644 index 73eb93a6..00000000 --- a/ecc/bls12381/ff/uroot_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package ff - -import ( - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func randomURoot(t testing.TB) *URoot { - u := &URoot{} - HardExponentiation(u, randomCyclo6(t)) - return u -} - -func TestURoot(t *testing.T) { - const testTimes = 1 << 8 - t.Run("no_alias", func(t *testing.T) { - var want, got URoot - x := randomURoot(t) - got = *x - got.Sqr(&got) - want = *x - want.Mul(&want, &want) - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - }) - t.Run("order", func(t *testing.T) { - order := ScalarOrder() - - var z URoot - for i := 0; i < 16; i++ { - x := randomURoot(t) - (*Cyclo6)(&z).exp((*Cyclo6)(x), order) - - // x^order = 1 - got := z.IsIdentity() - want := 1 - if got != want { - test.ReportError(t, got, want, x, z) - } - } - }) - t.Run("mul_inv", func(t *testing.T) { - var z URoot - for i := 0; i < testTimes; i++ { - x := randomURoot(t) - y := randomURoot(t) - - // x*y*x^1 = y - z.Inv(x) - z.Mul(&z, y) - z.Mul(&z, x) - got := z - want := y - if got.IsEqual(want) == 0 { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("mul_sqr", func(t *testing.T) { - var want, got URoot - for i := 0; i < testTimes; i++ { - x := randomURoot(t) - - // x*x = x^2 - got.Mul(x, x) - want.Sqr(x) - if got.IsEqual(&want) == 0 { - test.ReportError(t, got, want, x) - } - } - }) -} - -func BenchmarkURoot(b *testing.B) { - x := randomURoot(b) - y := randomURoot(b) - z := randomURoot(b) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Mul(x, y) - } - }) - b.Run("Sqr", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Sqr(x) - } - }) - b.Run("Inv", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Inv(x) - } - }) -} diff --git a/ecc/bls12381/g1.go b/ecc/bls12381/g1.go deleted file mode 100644 index 2302a509..00000000 --- a/ecc/bls12381/g1.go +++ /dev/null @@ -1,425 +0,0 @@ -package bls12381 - -import ( - "crypto" - _ "crypto/sha256" - "crypto/subtle" - "fmt" - "math/big" - - "github.com/quantumcoinproject/circl/ecc/bls12381/ff" - "github.com/quantumcoinproject/circl/expander" -) - -// G1Size is the length in bytes of an element in G1 in uncompressed form.. -const G1Size = 2 * ff.FpSize - -// G1SizeCompressed is the length in bytes of an element in G1 in compressed form. -const G1SizeCompressed = ff.FpSize - -// G1 is a point in the BLS12 curve over Fp. -type G1 struct{ x, y, z ff.Fp } - -func (g G1) String() string { return fmt.Sprintf("x: %v\ny: %v\nz: %v", g.x, g.y, g.z) } - -// Bytes serializes a G1 element in uncompressed form. -func (g G1) Bytes() []byte { return g.encodeBytes(false) } - -// Bytes serializes a G1 element in compressed form. -func (g G1) BytesCompressed() []byte { return g.encodeBytes(true) } - -// SetBytes sets g to the value in bytes, and returns a non-nil error if not in G1. -func (g *G1) SetBytes(b []byte) error { - if len(b) < G1SizeCompressed { - return errInputLength - } - - // Check for invalid prefixes - switch b[0] & 0xE0 { - case 0x20, 0x60, 0xE0: - return errEncoding - } - - isCompressed := int((b[0] >> 7) & 0x1) - isInfinity := int((b[0] >> 6) & 0x1) - isBigYCoord := int((b[0] >> 5) & 0x1) - - if isInfinity == 1 { - l := G1Size - if isCompressed == 1 { - l = G1SizeCompressed - } - zeros := make([]byte, l-1) - if (b[0]&0x1F) != 0 || subtle.ConstantTimeCompare(b[1:l], zeros) != 1 { - return errEncoding - } - g.SetIdentity() - return nil - } - - x := (&[ff.FpSize]byte{})[:] - copy(x, b) - x[0] &= 0x1F - if err := g.x.UnmarshalBinary(x); err != nil { - return err - } - - if isCompressed == 1 { - x3b := &ff.Fp{} - x3b.Sqr(&g.x) - x3b.Mul(x3b, &g.x) - x3b.Add(x3b, &g1Params.b) - if g.y.Sqrt(x3b) == 0 { - return errEncoding - } - if g.y.IsNegative() != isBigYCoord { - g.y.Neg() - } - } else { - if len(b) < G1Size { - return errInputLength - } - if err := g.y.UnmarshalBinary(b[ff.FpSize:G1Size]); err != nil { - return err - } - } - - g.z.SetOne() - if !g.IsOnG1() { - return errEncoding - } - return nil -} - -func (g G1) encodeBytes(compressed bool) []byte { - g.toAffine() - - var isCompressed, isInfinity, isBigYCoord byte - if compressed { - isCompressed = 1 - } - if g.z.IsZero() == 1 { - isInfinity = 1 - } - if isCompressed == 1 && isInfinity == 0 { - isBigYCoord = byte(g.y.IsNegative()) - } - - bytes, _ := g.x.MarshalBinary() - if isCompressed == 0 { - yBytes, _ := g.y.MarshalBinary() - bytes = append(bytes, yBytes...) - } - if isInfinity == 1 { - l := len(bytes) - for i := 0; i < l; i++ { - bytes[i] = 0 - } - } - - bytes[0] = bytes[0]&0x1F | headerEncoding(isCompressed, isInfinity, isBigYCoord) - - return bytes -} - -// Neg inverts g. -func (g *G1) Neg() { g.y.Neg() } - -// SetIdentity assigns g to the identity element. -func (g *G1) SetIdentity() { g.x = ff.Fp{}; g.y.SetOne(); g.z = ff.Fp{} } - -// isValidProjective returns true if the point is not a projective point. -func (g *G1) isValidProjective() bool { return (g.x.IsZero() & g.y.IsZero() & g.z.IsZero()) != 1 } - -// IsOnG1 returns true if the point is in the group G1. -func (g *G1) IsOnG1() bool { return g.isValidProjective() && g.isOnCurve() && g.isRTorsion() } - -// IsIdentity return true if the point is the identity of G1. -func (g *G1) IsIdentity() bool { return g.isValidProjective() && (g.z.IsZero() == 1) } - -// cmov sets g to P if b == 1 -func (g *G1) cmov(P *G1, b int) { - (&g.x).CMov(&g.x, &P.x, b) - (&g.y).CMov(&g.y, &P.y, b) - (&g.z).CMov(&g.z, &P.z, b) -} - -// sigma is an edomorphism defined by (x, y) → (βx, y) for some β ∈ Fp of -// multiplicative order 3. -func (g *G1) sigma(P *G1) { *g = *P; g.x.Mul(&g.x, &g1Sigma.beta0) } - -// sigma2 is sigma(sigma(P)). -func (g *G1) sigma2(P *G1) { *g = *P; g.x.Mul(&g.x, &g1Sigma.beta1) } - -// isRTorsion returns true if point is in the r-torsion subgroup. -func (g *G1) isRTorsion() bool { - // Bowe, "Faster Subgroup Checks for BLS12-381" (https://eprint.iacr.org/2019/814) - Q, _2sP, ssP := &G1{}, &G1{}, &G1{} - coef := bls12381.g1Check[:] - - _2sP.sigma(g) // s(P) - _2sP.Double() // 2*s(P) - ssP.sigma2(g) // s(s(P)) - Q.Add(g, ssP) // P + s(s(P)) - Q.Neg() // -P - s(s(P)) - Q.Add(Q, _2sP) // 2*s(P) - P - s(s(P)) - Q.scalarMultShort(coef, Q) // coef * [2*s(P) - P - s(s(P))] - ssP.Neg() // -s(s(P)) - Q.Add(Q, ssP) // coef * [2*s(P) - P - s(s(P))] - s(s(P)) - - return Q.IsIdentity() -} - -// clearCofactor maps g to a point in the r-torsion subgroup. -// -// This method multiplies g times (1-z) rather than (z-1)^2/3, where z is the -// BLS12 parameter. This is enough to remove points of order -// -// h \in {3, 11, 10177, 859267, 52437899}, -// -// and because there are no points of order h^2. See Section 5 of Wahby-Boneh -// "Fast and simple constant-time hashing to the BLS12-381 elliptic curve" at -// https://eprint.iacr.org/2019/403 -func (g *G1) clearCofactor() { g.scalarMultShort(bls12381.oneMinusZ[:], g) } - -// Double updates g = 2g. -func (g *G1) Double() { - // Reference: - // "Complete addition formulas for prime order elliptic curves" by - // Costello-Renes-Batina. [Alg.9] (eprint.iacr.org/2015/1060). - var R G1 - X, Y, Z := &g.x, &g.y, &g.z - X3, Y3, Z3 := &R.x, &R.y, &R.z - var f0, f1, f2 ff.Fp - t0, t1, t2 := &f0, &f1, &f2 - _3B := &g1Params._3b - t0.Sqr(Y) // 1. t0 = Y * Y - Z3.Add(t0, t0) // 2. Z3 = t0 + t0 - Z3.Add(Z3, Z3) // 3. Z3 = Z3 + Z3 - Z3.Add(Z3, Z3) // 4. Z3 = Z3 + Z3 - t1.Mul(Y, Z) // 5. t1 = Y * Z - t2.Sqr(Z) // 6. t2 = Z * Z - t2.Mul(_3B, t2) // 7. t2 = b3 * t2 - X3.Mul(t2, Z3) // 8. X3 = t2 * Z3 - Y3.Add(t0, t2) // 9. Y3 = t0 + t2 - Z3.Mul(t1, Z3) // 10. Z3 = t1 * Z3 - t1.Add(t2, t2) // 11. t1 = t2 + t2 - t2.Add(t1, t2) // 12. t2 = t1 + t2 - t0.Sub(t0, t2) // 13. t0 = t0 - t2 - Y3.Mul(t0, Y3) // 14. Y3 = t0 * Y3 - Y3.Add(X3, Y3) // 15. Y3 = X3 + Y3 - t1.Mul(X, Y) // 16. t1 = X * Y - X3.Mul(t0, t1) // 17. X3 = t0 * t1 - X3.Add(X3, X3) // 18. X3 = X3 + X3 - *g = R -} - -// Add updates g=P+Q. -func (g *G1) Add(P, Q *G1) { - // Reference: - // "Complete addition formulas for prime order elliptic curves" by - // Costello-Renes-Batina. [Alg.7] (eprint.iacr.org/2015/1060). - var R G1 - X1, Y1, Z1 := &P.x, &P.y, &P.z - X2, Y2, Z2 := &Q.x, &Q.y, &Q.z - X3, Y3, Z3 := &R.x, &R.y, &R.z - _3B := &g1Params._3b - var f0, f1, f2, f3, f4 ff.Fp - t0, t1, t2, t3, t4 := &f0, &f1, &f2, &f3, &f4 - t0.Mul(X1, X2) // 1. t0 = X1 * X2 - t1.Mul(Y1, Y2) // 2. t1 = Y1 * Y2 - t2.Mul(Z1, Z2) // 3. t2 = Z1 * Z2 - t3.Add(X1, Y1) // 4. t3 = X1 + Y1 - t4.Add(X2, Y2) // 5. t4 = X2 + Y2 - t3.Mul(t3, t4) // 6. t3 = t3 * t4 - t4.Add(t0, t1) // 7. t4 = t0 + t1 - t3.Sub(t3, t4) // 8. t3 = t3 - t4 - t4.Add(Y1, Z1) // 9. t4 = Y1 + Z1 - X3.Add(Y2, Z2) // 10. X3 = Y2 + Z2 - t4.Mul(t4, X3) // 11. t4 = t4 * X3 - X3.Add(t1, t2) // 12. X3 = t1 + t2 - t4.Sub(t4, X3) // 13. t4 = t4 - X3 - X3.Add(X1, Z1) // 14. X3 = X1 + Z1 - Y3.Add(X2, Z2) // 15. Y3 = X2 + Z2 - X3.Mul(X3, Y3) // 16. X3 = X3 * Y3 - Y3.Add(t0, t2) // 17. Y3 = t0 + t2 - Y3.Sub(X3, Y3) // 18. Y3 = X3 - Y3 - X3.Add(t0, t0) // 19. X3 = t0 + t0 - t0.Add(X3, t0) // 20. t0 = X3 + t0 - t2.Mul(_3B, t2) // 21. t2 = b3 * t2 - Z3.Add(t1, t2) // 22. Z3 = t1 + t2 - t1.Sub(t1, t2) // 23. t1 = t1 - t2 - Y3.Mul(_3B, Y3) // 24. Y3 = b3 * Y3 - X3.Mul(t4, Y3) // 25. X3 = t4 * Y3 - t2.Mul(t3, t1) // 26. t2 = t3 * t1 - X3.Sub(t2, X3) // 27. X3 = t2 - X3 - Y3.Mul(Y3, t0) // 28. Y3 = Y3 * t0 - t1.Mul(t1, Z3) // 29. t1 = t1 * Z3 - Y3.Add(t1, Y3) // 30. Y3 = t1 + Y3 - t0.Mul(t0, t3) // 31. t0 = t0 * t3 - Z3.Mul(Z3, t4) // 32. Z3 = Z3 * t4 - Z3.Add(Z3, t0) // 33. Z3 = Z3 + t0 - *g = R -} - -// ScalarMult calculates g = kP. -func (g *G1) ScalarMult(k *Scalar, P *G1) { b, _ := k.MarshalBinary(); g.scalarMult(b, P) } - -// scalarMult calculates g = kP, where k is the scalar in big-endian order. -func (g *G1) scalarMult(k []byte, P *G1) { - var Q G1 - Q.SetIdentity() - T := &G1{} - var mults [16]G1 - mults[0].SetIdentity() - mults[1] = *P - for i := 1; i < 8; i++ { - mults[2*i] = mults[i] - mults[2*i].Double() - mults[2*i+1].Add(&mults[2*i], P) - } - N := 8 * len(k) - for i := 0; i < N; i += 4 { - Q.Double() - Q.Double() - Q.Double() - Q.Double() - idx := 0xf & (k[i/8] >> uint(4-i%8)) - for j := 0; j < 16; j++ { - T.cmov(&mults[j], subtle.ConstantTimeByteEq(idx, uint8(j))) - } - Q.Add(&Q, T) - } - *g = Q -} - -// scalarMultShort multiplies by a short, constant scalar k, where k is the -// scalar in big-endian order. Runtime depends on the scalar. -func (g *G1) scalarMultShort(k []byte, P *G1) { - // Since the scalar is short and low Hamming weight not much helps. - var Q G1 - Q.SetIdentity() - N := 8 * len(k) - for i := 0; i < N; i++ { - Q.Double() - bit := 0x1 & (k[i/8] >> uint(7-i%8)) - if bit != 0 { - Q.Add(&Q, P) - } - } - *g = Q -} - -// IsEqual returns true if g and p are equivalent. -func (g *G1) IsEqual(p *G1) bool { - var lx, rx, ly, ry ff.Fp - lx.Mul(&g.x, &p.z) // lx = x1*z2 - rx.Mul(&p.x, &g.z) // rx = x2*z1 - lx.Sub(&lx, &rx) // lx = lx-rx - ly.Mul(&g.y, &p.z) // ly = y1*z2 - ry.Mul(&p.y, &g.z) // ry = y2*z1 - ly.Sub(&ly, &ry) // ly = ly-ry - return g.isValidProjective() && p.isValidProjective() && lx.IsZero() == 1 && ly.IsZero() == 1 -} - -// isOnCurve returns true if g is a valid point on the curve. -func (g *G1) isOnCurve() bool { - var x3, z3, y2 ff.Fp - y2.Sqr(&g.y) // y2 = y^2 - y2.Mul(&y2, &g.z) // y2 = y^2*z - x3.Sqr(&g.x) // x3 = x^2 - x3.Mul(&x3, &g.x) // x3 = x^3 - z3.Sqr(&g.z) // z3 = z^2 - z3.Mul(&z3, &g.z) // z3 = z^3 - z3.Mul(&z3, &g1Params.b) // z3 = 4*z^3 - x3.Add(&x3, &z3) // x3 = x^3 + 4*z^3 - y2.Sub(&y2, &x3) // y2 = y^2*z - (x^3 + 4*z^3) - return y2.IsZero() == 1 -} - -// toAffine updates g with its affine representation. -func (g *G1) toAffine() { - if g.z.IsZero() != 1 { - var invZ ff.Fp - invZ.Inv(&g.z) - g.x.Mul(&g.x, &invZ) - g.y.Mul(&g.y, &invZ) - g.z.SetOne() - } -} - -// EncodeToCurve is a non-uniform encoding from an input byte string (and -// an optional domain separation tag) to elements in G1. This function must not -// be used as a hash function, otherwise use G1.Hash instead. -func (g *G1) Encode(input, dst []byte) { - const L = 64 - pseudo := expander.NewExpanderMD(crypto.SHA256, dst).Expand(input, L) - - bu := new(big.Int).SetBytes(pseudo) - bu.Mod(bu, new(big.Int).SetBytes(ff.FpOrder())) - - var u ff.Fp - u.SetBytes(pseudo[:L]) - - var q isogG1Point - q.sswu(&u) - g.evalIsogG1(&q) - g.clearCofactor() -} - -// Hash produces an element of G1 from the hash of an input byte string and -// an optional domain separation tag. This function is safe to use when a -// random oracle returning points in G1 be required. -func (g *G1) Hash(input, dst []byte) { - const L = 64 - pseudo := expander.NewExpanderMD(crypto.SHA256, dst).Expand(input, 2*L) - - var u0, u1 ff.Fp - u0.SetBytes(pseudo[0*L : 1*L]) - u1.SetBytes(pseudo[1*L : 2*L]) - - var q0, q1 isogG1Point - q0.sswu(&u0) - q1.sswu(&u1) - var p0, p1 G1 - p0.evalIsogG1(&q0) - p1.evalIsogG1(&q1) - g.Add(&p0, &p1) - g.clearCofactor() -} - -// G1Generator returns the generator point of G1. -func G1Generator() *G1 { - var G G1 - G.x = g1Params.genX - G.y = g1Params.genY - G.z.SetOne() - return &G -} - -// affinize converts an entire slice to affine at once -func affinize(points []*G1) (out []G1) { - out = make([]G1, len(points)) - if len(points) == 0 { - return - } - ws := make([]ff.Fp, len(points)+1) - ws[0].SetOne() - for i := 0; i < len(points); i++ { - ws[i+1].Mul(&ws[i], &points[i].z) - } - - w := &ff.Fp{} - w.Inv(&ws[len(points)]) - - zinv := &ff.Fp{} - for i := len(points) - 1; i >= 0; i-- { - zinv.Mul(w, &ws[i]) - w.Mul(w, &points[i].z) - - out[i].x.Mul(&points[i].x, zinv) - out[i].y.Mul(&points[i].y, zinv) - out[i].z.SetOne() - } - return -} diff --git a/ecc/bls12381/g1Isog.go b/ecc/bls12381/g1Isog.go deleted file mode 100644 index 196afc08..00000000 --- a/ecc/bls12381/g1Isog.go +++ /dev/null @@ -1,134 +0,0 @@ -package bls12381 - -import ( - "fmt" - - "github.com/quantumcoinproject/circl/ecc/bls12381/ff" -) - -type isogG1Point struct{ x, y, z ff.Fp } - -func (p isogG1Point) String() string { return fmt.Sprintf("x: %v\ny: %v\nz: %v", p.x, p.y, p.z) } - -// IsOnCurve returns true if g is a valid point on the curve. -func (p *isogG1Point) IsOnCurve() bool { - var x2, x3, z2, z3, y2 ff.Fp - y2.Sqr(&p.y) // y2 = y^2 - y2.Mul(&y2, &p.z) // y2 = y^2*z - z2.Sqr(&p.z) // z2 = z^2 - z3.Mul(&z2, &p.z) // z3 = z^3 - z3.Mul(&z3, &g1Isog11.b) // z3 = B*z^3 - x2.Sqr(&p.x) // x2 = x^2 - x3.Mul(&z2, &g1Isog11.a) // x3 = A*z^2 - x3.Add(&x3, &x2) // x3 = x^2 + A*z^2 - x3.Mul(&x3, &p.x) // x3 = x^3 + A*x*z^2 - x3.Add(&x3, &z3) // x3 = x^3 + A*x*z^2 + Bz^3 - - return y2.IsEqual(&x3) == 1 && *p != isogG1Point{} -} - -// sswu implements the Simplified Shallue-van de Woestijne-Ulas method for -// mapping a field element to a point on the isogenous curve. -func (p *isogG1Point) sswu(u *ff.Fp) { - // Method in Appendix-G.2.1 of - // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-hash-to-curve-11 - tv1, tv2, tv3, tv4 := &ff.Fp{}, &ff.Fp{}, &ff.Fp{}, &ff.Fp{} - xd, x1n, gxd, gx1 := &ff.Fp{}, &ff.Fp{}, &ff.Fp{}, &ff.Fp{} - y, y1, x2n, y2, xn := &ff.Fp{}, &ff.Fp{}, &ff.Fp{}, &ff.Fp{}, &ff.Fp{} - - tv1.Sqr(u) // 1. tv1 = u^2 - tv3.Mul(&g1sswu.Z, tv1) // 2. tv3 = Z * tv1 - tv2.Sqr(tv3) // 3. tv2 = tv3^2 - xd.Add(tv2, tv3) // 4. xd = tv2 + tv3 - tv4.SetOne() // 5. tv4 = 1 - x1n.Add(xd, tv4) // x1n = xd + tv4 - x1n.Mul(x1n, &g1Isog11.b) // 6. x1n = x1n * B - xd.Mul(&g1Isog11.a, xd) // 7. xd = A * xd - xd.Neg() // xd = -xd - e1 := xd.IsZero() // 8. e1 = xd == 0 - tv4.Mul(&g1sswu.Z, &g1Isog11.a) // 9. tv4 = Z * A - xd.CMov(xd, tv4, e1) // xd = CMOV(xd, tv4, e1) - tv2.Sqr(xd) // 10. tv2 = xd^2 - gxd.Mul(tv2, xd) // 11. gxd = tv2 * xd - tv2.Mul(&g1Isog11.a, tv2) // 12. tv2 = A * tv2 - gx1.Sqr(x1n) // 13. gx1 = x1n^2 - gx1.Add(gx1, tv2) // 14. gx1 = gx1 + tv2 - gx1.Mul(gx1, x1n) // 15. gx1 = gx1 * x1n - tv2.Mul(&g1Isog11.b, gxd) // 16. tv2 = B * gxd - gx1.Add(gx1, tv2) // 17. gx1 = gx1 + tv2 - tv4.Sqr(gxd) // 18. tv4 = gxd^2 - tv2.Mul(gx1, gxd) // 19. tv2 = gx1 * gxd - tv4.Mul(tv4, tv2) // 20. tv4 = tv4 * tv2 - y1.ExpVarTime(tv4, g1sswu.c1[:]) // 21. y1 = tv4^c1 - y1.Mul(y1, tv2) // 22. y1 = y1 * tv2 - x2n.Mul(tv3, x1n) // 23. x2n = tv3 * x1n - y2.Mul(y1, &g1sswu.c2) // 24. y2 = y1 * c2 - y2.Mul(y2, tv1) // 25. y2 = y2 * tv1 - y2.Mul(y2, u) // 26. y2 = y2 * u - tv2.Sqr(y1) // 27. tv2 = y1^2 - tv2.Mul(tv2, gxd) // 28. tv2 = tv2 * gxd - e2 := tv2.IsEqual(gx1) // 29. e2 = tv2 == gx1 - xn.CMov(x2n, x1n, e2) // 30. xn = CMOV(x2n, x1n, e2) - y.CMov(y2, y1, e2) // 31. y = CMOV(y2, y1, e2) - e3 := u.Sgn0() ^ y.Sgn0() // 32. e3 = sgn0(u) == sgn0(y) - *tv1 = *y // 33. tv1 = y - tv1.Neg() // tv1 = -y - y.CMov(tv1, y, ^e3) // y = CMOV(tv1, y, e3) - p.x = *xn // 34. return - p.y.Mul(y, xd) // (x,y) = (xn/xd, y/1) - p.z = *xd // (X,Y,Z) = (xn, y*xd, xd) -} - -// evalIsogG1 calculates g = g1Isog11(p), where g1Isog11 is an isogeny of -// degree 11 to the curve used in G1. -func (g *G1) evalIsogG1(p *isogG1Point) { - x, y, z := &p.x, &p.y, &p.z - t, zi := &ff.Fp{}, &ff.Fp{} - xNum, xDen, yNum, yDen := &ff.Fp{}, &ff.Fp{}, &ff.Fp{}, &ff.Fp{} - - ixn := len(g1Isog11.xNum) - 1 - ixd := len(g1Isog11.xDen) - 1 - iyn := len(g1Isog11.yNum) - 1 - iyd := len(g1Isog11.yDen) - 1 - - *xNum = g1Isog11.xNum[ixn] - *xDen = g1Isog11.xDen[ixd] - *yNum = g1Isog11.yNum[iyn] - *yDen = g1Isog11.yDen[iyd] - *zi = *z - - for (ixn | ixd | iyn | iyd) != 0 { - if ixn > 0 { - ixn-- - t.Mul(zi, &g1Isog11.xNum[ixn]) - xNum.Mul(xNum, x) - xNum.Add(xNum, t) - } - if ixd > 0 { - ixd-- - t.Mul(zi, &g1Isog11.xDen[ixd]) - xDen.Mul(xDen, x) - xDen.Add(xDen, t) - } - if iyn > 0 { - iyn-- - t.Mul(zi, &g1Isog11.yNum[iyn]) - yNum.Mul(yNum, x) - yNum.Add(yNum, t) - } - if iyd > 0 { - iyd-- - t.Mul(zi, &g1Isog11.yDen[iyd]) - yDen.Mul(yDen, x) - yDen.Add(yDen, t) - } - - zi.Mul(zi, z) - } - - g.x.Mul(xNum, yDen) - g.y.Mul(yNum, xDen) - g.y.Mul(&g.y, y) - g.z.Mul(xDen, yDen) - g.z.Mul(&g.z, z) -} diff --git a/ecc/bls12381/g1_test.go b/ecc/bls12381/g1_test.go deleted file mode 100644 index 0ee66485..00000000 --- a/ecc/bls12381/g1_test.go +++ /dev/null @@ -1,284 +0,0 @@ -package bls12381 - -import ( - "crypto/rand" - "fmt" - "testing" - - "github.com/quantumcoinproject/circl/ecc/bls12381/ff" - "github.com/quantumcoinproject/circl/internal/test" -) - -func randomScalar(t testing.TB) *Scalar { - s := &Scalar{} - err := s.Random(rand.Reader) - test.CheckNoErr(t, err, "random scalar") - return s -} - -func randomG1(t testing.TB) *G1 { - P := &G1{} - u := &ff.Fp{} - r := &isogG1Point{} - - err := u.Random(rand.Reader) - test.CheckNoErr(t, err, "random fp") - - r.sswu(u) - P.evalIsogG1(r) - P.clearCofactor() - got := P.IsOnG1() - want := true - - if got != want { - test.ReportError(t, got, want, "point not in G1", u) - } - return P -} - -func TestG1Add(t *testing.T) { - const testTimes = 1 << 6 - var Q, R G1 - for i := 0; i < testTimes; i++ { - P := randomG1(t) - Q = *P - R = *P - R.Add(&R, &R) - R.Neg() - Q.Double() - Q.Neg() - got := R - want := Q - if !got.IsEqual(&want) { - test.ReportError(t, got, want, P) - } - } -} - -func TestG1ScalarMult(t *testing.T) { - const testTimes = 1 << 6 - var Q G1 - for i := 0; i < testTimes; i++ { - P := randomG1(t) - k := randomScalar(t) - Q.ScalarMult(k, P) - Q.toAffine() - got := Q.IsOnG1() - want := true - if got != want { - test.ReportError(t, got, want, P, k) - } - } -} - -func TestG1Hash(t *testing.T) { - const testTimes = 1 << 8 - - for _, e := range [...]struct { - Name string - Enc func(p *G1, input, dst []byte) - }{ - {"Encode", func(p *G1, input, dst []byte) { p.Encode(input, dst) }}, - {"Hash", func(p *G1, input, dst []byte) { p.Hash(input, dst) }}, - } { - var msg, dst [4]byte - var p G1 - t.Run(e.Name, func(t *testing.T) { - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(msg[:]) - _, _ = rand.Read(dst[:]) - e.Enc(&p, msg[:], dst[:]) - - got := p.isRTorsion() - want := true - if got != want { - test.ReportError(t, got, want, e.Name, msg, dst) - } - } - }) - } -} - -func BenchmarkG1(b *testing.B) { - P := randomG1(b) - Q := randomG1(b) - k := randomScalar(b) - var msg, dst [4]byte - _, _ = rand.Read(msg[:]) - _, _ = rand.Read(dst[:]) - - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.Add(P, Q) - } - }) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.ScalarMult(k, P) - } - }) - b.Run("Hash", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.Hash(msg[:], dst[:]) - } - }) -} - -func TestG1Serial(t *testing.T) { - mustOk := "must be ok" - mustErr := "must be an error" - t.Run("valid", func(t *testing.T) { - testTimes := 1 << 6 - var got, want G1 - want.SetIdentity() - for i := 0; i < testTimes; i++ { - for _, b := range [][]byte{want.Bytes(), want.BytesCompressed()} { - err := got.SetBytes(b) - test.CheckNoErr(t, err, fmt.Sprintf("failure to deserialize: (P:%v b:%x)", want, b)) - - if !got.IsEqual(&want) { - test.ReportError(t, got, want, b) - } - } - want = *randomG1(t) - } - }) - t.Run("badPrefix", func(t *testing.T) { - q := new(G1) - b := make([]byte, G1Size) - for _, b[0] = range []byte{0x20, 0x60, 0xE0} { - test.CheckIsErr(t, q.SetBytes(b), mustErr) - } - }) - t.Run("badLength", func(t *testing.T) { - q := new(G1) - p := randomG1(t) - b := p.Bytes() - test.CheckIsErr(t, q.SetBytes(b[:0]), mustErr) - test.CheckIsErr(t, q.SetBytes(b[:1]), mustErr) - test.CheckIsErr(t, q.SetBytes(b[:G1Size-1]), mustErr) - test.CheckIsErr(t, q.SetBytes(b[:G1SizeCompressed]), mustErr) - test.CheckNoErr(t, q.SetBytes(b), mustOk) - test.CheckNoErr(t, q.SetBytes(append(b, 0)), mustOk) - b = p.BytesCompressed() - test.CheckIsErr(t, q.SetBytes(b[:0]), mustErr) - test.CheckIsErr(t, q.SetBytes(b[:1]), mustErr) - test.CheckIsErr(t, q.SetBytes(b[:G1SizeCompressed-1]), mustErr) - test.CheckNoErr(t, q.SetBytes(b), mustOk) - test.CheckNoErr(t, q.SetBytes(append(b, 0)), mustOk) - }) - t.Run("badInfinity", func(t *testing.T) { - var badInf, p G1 - badInf.SetIdentity() - b := badInf.Bytes() - b[0] |= 0x1F - err := p.SetBytes(b) - test.CheckIsErr(t, err, mustErr) - b[0] &= 0xE0 - b[1] = 0xFF - err = p.SetBytes(b) - test.CheckIsErr(t, err, mustErr) - }) - t.Run("badCoords", func(t *testing.T) { - bad := (&[ff.FpSize]byte{})[:] - for i := range bad { - bad[i] = 0xFF - } - var e ff.Fp - _ = e.Random(rand.Reader) - good, err := e.MarshalBinary() - test.CheckNoErr(t, err, mustOk) - - // bad x, good y - b := append(bad, good...) - b[0] = b[0]&0x1F | headerEncoding(0, 0, 0) - test.CheckIsErr(t, new(G1).SetBytes(b), mustErr) - - // good x, bad y - b = append(good, bad...) - b[0] = b[0]&0x1F | headerEncoding(0, 0, 0) - test.CheckIsErr(t, new(G1).SetBytes(b), mustErr) - }) - t.Run("noQR", func(t *testing.T) { - var x ff.Fp - x.SetUint64(1) // Let x=1, so x^3+4 = 5, which is not QR. - b, err := x.MarshalBinary() - test.CheckNoErr(t, err, mustOk) - b[0] = b[0]&0x1F | headerEncoding(1, 0, 0) - test.CheckIsErr(t, new(G1).SetBytes(b), mustErr) - }) - t.Run("notInG1", func(t *testing.T) { - // p=(0,1) is not on curve. - var x, y ff.Fp - y.SetUint64(1) - bx, err := x.MarshalBinary() - test.CheckNoErr(t, err, mustOk) - by, err := y.MarshalBinary() - test.CheckNoErr(t, err, mustOk) - b := append(bx, by...) - b[0] = b[0]&0x1F | headerEncoding(0, 0, 0) - test.CheckIsErr(t, new(G1).SetBytes(b), mustErr) - }) -} - -func TestG1Affinize(t *testing.T) { - N := 20 - testTimes := 1 << 6 - g1 := make([]*G1, N) - for i := 0; i < testTimes; i++ { - for j := 0; j < N; j++ { - g1[j] = randomG1(t) - } - g2 := affinize(g1) - for j := 0; j < N; j++ { - g1[j].toAffine() - if !g1[j].IsEqual(&g2[j]) { - t.Fatal("failure to preserve points") - } - if g2[j].z.IsEqual(&g1[j].z) != 1 { - t.Fatal("failure to make affine") - } - } - } -} - -func TestG1Torsion(t *testing.T) { - if !G1Generator().isRTorsion() { - t.Fatalf("G1 generator is not r-torsion") - } -} - -func TestG1Bytes(t *testing.T) { - got := new(G1) - id := new(G1) - id.SetIdentity() - g := G1Generator() - minusG := G1Generator() - minusG.Neg() - - type testCase struct { - header byte - length int - point *G1 - toBytes func(G1) []byte - } - - for i, v := range []testCase{ - {headerEncoding(0, 0, 0), G1Size, randomG1(t), (G1).Bytes}, - {headerEncoding(0, 0, 0), G1Size, g, (G1).Bytes}, - {headerEncoding(1, 0, 0), G1SizeCompressed, g, (G1).BytesCompressed}, - {headerEncoding(1, 0, 1), G1SizeCompressed, minusG, (G1).BytesCompressed}, - {headerEncoding(0, 1, 0), G1Size, id, (G1).Bytes}, - {headerEncoding(1, 1, 0), G1SizeCompressed, id, (G1).BytesCompressed}, - } { - b := v.toBytes(*v.point) - test.CheckOk(len(b) == v.length, fmt.Sprintf("bad encoding size (case:%v point:%v b:%x)", i, v.point, b), t) - test.CheckOk(b[0]&0xE0 == v.header, fmt.Sprintf("bad encoding header (case:%v point:%v b:%x)", i, v.point, b), t) - - err := got.SetBytes(b) - want := v.point - if err != nil || !got.IsEqual(want) { - test.ReportError(t, got, want, i, b) - } - } -} diff --git a/ecc/bls12381/g2.go b/ecc/bls12381/g2.go deleted file mode 100644 index 9d25604f..00000000 --- a/ecc/bls12381/g2.go +++ /dev/null @@ -1,334 +0,0 @@ -package bls12381 - -import ( - "crypto" - "crypto/subtle" - "fmt" - - "github.com/quantumcoinproject/circl/ecc/bls12381/ff" - "github.com/quantumcoinproject/circl/expander" -) - -// G2Size is the length in bytes of an element in G2 in uncompressed form.. -const G2Size = 2 * ff.Fp2Size - -// G2SizeCompressed is the length in bytes of an element in G2 in compressed form. -const G2SizeCompressed = ff.Fp2Size - -// G2 is a point in the twist of the BLS12 curve over Fp2. -type G2 struct{ x, y, z ff.Fp2 } - -func (g G2) String() string { return fmt.Sprintf("x: %v\ny: %v\nz: %v", g.x, g.y, g.z) } - -// Bytes serializes a G2 element in uncompressed form. -func (g G2) Bytes() []byte { return g.encodeBytes(false) } - -// Bytes serializes a G2 element in compressed form. -func (g G2) BytesCompressed() []byte { return g.encodeBytes(true) } - -// SetBytes sets g to the value in bytes, and returns a non-nil error if not in G2. -func (g *G2) SetBytes(b []byte) error { - if len(b) < G2SizeCompressed { - return errInputLength - } - - // Check for invalid prefixes - switch b[0] & 0xE0 { - case 0x20, 0x60, 0xE0: - return errEncoding - } - - isCompressed := int((b[0] >> 7) & 0x1) - isInfinity := int((b[0] >> 6) & 0x1) - isBigYCoord := int((b[0] >> 5) & 0x1) - - if isInfinity == 1 { - l := G2Size - if isCompressed == 1 { - l = G2SizeCompressed - } - zeros := make([]byte, l-1) - if (b[0]&0x1F) != 0 || subtle.ConstantTimeCompare(b[1:l], zeros) != 1 { - return errEncoding - } - g.SetIdentity() - return nil - } - - x := (&[ff.Fp2Size]byte{})[:] - copy(x, b) - x[0] &= 0x1F - if err := g.x.UnmarshalBinary(x); err != nil { - return err - } - - if isCompressed == 1 { - x3b := &ff.Fp2{} - x3b.Sqr(&g.x) - x3b.Mul(x3b, &g.x) - x3b.Add(x3b, &g2Params.b) - if g.y.Sqrt(x3b) == 0 { - return errEncoding - } - if g.y.IsNegative() != isBigYCoord { - g.y.Neg() - } - } else { - if len(b) < G2Size { - return errInputLength - } - if err := g.y.UnmarshalBinary(b[ff.Fp2Size:G2Size]); err != nil { - return err - } - } - - g.z.SetOne() - if !g.IsOnG2() { - return errEncoding - } - return nil -} - -func (g G2) encodeBytes(compressed bool) []byte { - g.toAffine() - var isCompressed, isInfinity, isBigYCoord byte - if compressed { - isCompressed = 1 - } - if g.z.IsZero() == 1 { - isInfinity = 1 - } - if isCompressed == 1 && isInfinity == 0 { - isBigYCoord = byte(g.y.IsNegative()) - } - - bytes, _ := g.x.MarshalBinary() - if isCompressed == 0 { - yBytes, _ := g.y.MarshalBinary() - bytes = append(bytes, yBytes...) - } - if isInfinity == 1 { - l := len(bytes) - for i := 0; i < l; i++ { - bytes[i] = 0 - } - } - - bytes[0] = bytes[0]&0x1F | headerEncoding(isCompressed, isInfinity, isBigYCoord) - - return bytes -} - -// Neg inverts g. -func (g *G2) Neg() { g.y.Neg() } - -// SetIdentity assigns g to the identity element. -func (g *G2) SetIdentity() { g.x = ff.Fp2{}; g.y.SetOne(); g.z = ff.Fp2{} } - -// isValidProjective returns true if the point is not a projective point. -func (g *G2) isValidProjective() bool { return (g.x.IsZero() & g.y.IsZero() & g.z.IsZero()) != 1 } - -// IsOnG2 returns true if the point is in the group G2. -func (g *G2) IsOnG2() bool { return g.isValidProjective() && g.isOnCurve() && g.isRTorsion() } - -// IsIdentity return true if the point is the identity of G2. -func (g *G2) IsIdentity() bool { return g.isValidProjective() && (g.z.IsZero() == 1) } - -// cmov sets g to P if b == 1 -func (g *G2) cmov(P *G2, b int) { - (&g.x).CMov(&g.x, &P.x, b) - (&g.y).CMov(&g.y, &P.y, b) - (&g.z).CMov(&g.z, &P.z, b) -} - -// isRTorsion returns true if point is in the r-torsion subgroup. -func (g *G2) isRTorsion() bool { - // Bowe, "Faster Subgroup Checks for BLS12-381" (https://eprint.iacr.org/2019/814) - _z := bls12381.minusZ[:] - Q := *g - Q.psi() // Q = \psi(g) - Q.scalarMultShort(_z, &Q) // Q = -[z]\psi(g) - Q.Add(&Q, g) // Q = -[z]\psi(g)+g - Q.psi() // Q = -[z]\psi^2(g)+\psi(g) - Q.psi() // Q = -[z]\psi^3(g)+\psi^2(g) - - return Q.IsEqual(g) // Equivalent to verification equation in paper -} - -// psi is the Galbraith-Scott endomorphism. See https://eprint.iacr.org/2008/117. -func (g *G2) psi() { - g.x.Frob(&g.x) - g.y.Frob(&g.y) - g.z.Frob(&g.z) - g.x.Mul(&g2Psi.alpha, &g.x) - g.y.Mul(&g2Psi.beta, &g.y) -} - -// clearCofactor maps g to a point in the r-torsion subgroup. -// -// This method multiplies g times a multiple of the cofactor as proposed by -// Fuentes-Knapp-Rodríguez at https://doi.org/10.1007/978-3-642-28496-0_25. -// -// The explicit formulas for BLS curves are in Section 4.1 of Budroni-Pintore -// "Efficient hash maps to G2 on BLS curves" at https://eprint.iacr.org/2017/419 -// -// h(a)P = [x^2-x-1]P + [x-1]ψ(P) + ψ^2(2P) -func (g *G2) clearCofactor() { - x := bls12381.minusZ[:] - xP, psiP := &G2{}, &G2{} - _2P := *g - - _2P.Double() // 2P - _2P.psi() // ψ(2P) - _2P.psi() // ψ^2(2P) - xP.scalarMultShort(x, g) // -xP - xP.Add(xP, g) // -xP + P = [-x+1]P - *psiP = *xP // - psiP.psi() // ψ(-xP + P) = [-x+1]ψ(P) - xP.scalarMultShort(x, xP) // x^2P - xP = [x^2-x]P - g.Add(g, psiP) // P + [-x+1]ψ(P) - g.Neg() // -P + [x-1]ψ(P) - g.Add(g, xP) // [x^2-x-1]P + [x-1]ψ(P) - g.Add(g, &_2P) // [x^2-x-1]P + [x-1]ψ(P) + 2ψ^2(P) -} - -// Double updates g = 2g. -func (g *G2) Double() { doubleAndLine(g, nil) } - -// Add updates g=P+Q. -func (g *G2) Add(P, Q *G2) { addAndLine(g, P, Q, nil) } - -// ScalarMult calculates g = kP. -func (g *G2) ScalarMult(k *Scalar, P *G2) { b, _ := k.MarshalBinary(); g.scalarMult(b, P) } - -// scalarMult calculates g = kP, where k is the scalar in big-endian order. -func (g *G2) scalarMult(k []byte, P *G2) { - var Q G2 - Q.SetIdentity() - T := &G2{} - var mults [16]G2 - mults[0].SetIdentity() - mults[1] = *P - for i := 1; i < 8; i++ { - mults[2*i] = mults[i] - mults[2*i].Double() - mults[2*i+1].Add(&mults[2*i], P) - } - N := 8 * len(k) - for i := 0; i < N; i += 4 { - Q.Double() - Q.Double() - Q.Double() - Q.Double() - idx := 0xf & (k[i/8] >> uint(4-i%8)) - for j := 0; j < 16; j++ { - T.cmov(&mults[j], subtle.ConstantTimeByteEq(idx, uint8(j))) - } - Q.Add(&Q, T) - } - *g = Q -} - -// scalarMultShort multiplies by a short, constant scalar k, where k is the -// scalar in big-endian order. Runtime depends on the scalar. -func (g *G2) scalarMultShort(k []byte, P *G2) { - // Since the scalar is short and low Hamming weight not much helps. - var Q G2 - Q.SetIdentity() - N := 8 * len(k) - for i := 0; i < N; i++ { - Q.Double() - bit := 0x1 & (k[i/8] >> uint(7-i%8)) - if bit != 0 { - Q.Add(&Q, P) - } - } - *g = Q -} - -// IsEqual returns true if g and p are equivalent. -func (g *G2) IsEqual(p *G2) bool { - var lx, rx, ly, ry ff.Fp2 - lx.Mul(&g.x, &p.z) // lx = x1*z2 - rx.Mul(&p.x, &g.z) // rx = x2*z1 - lx.Sub(&lx, &rx) // lx = lx-rx - ly.Mul(&g.y, &p.z) // ly = y1*z2 - ry.Mul(&p.y, &g.z) // ry = y2*z1 - ly.Sub(&ly, &ry) // ly = ly-ry - return lx.IsZero() == 1 && ly.IsZero() == 1 -} - -// EncodeToCurve is a non-uniform encoding from an input byte string (and -// an optional domain separation tag) to elements in G2. This function must not -// be used as a hash function, otherwise use G2.Hash instead. -func (g *G2) Encode(input, dst []byte) { - const L = 64 - pseudo := expander.NewExpanderMD(crypto.SHA256, dst).Expand(input, 2*L) - - var u ff.Fp2 - u[0].SetBytes(pseudo[0*L : 1*L]) - u[1].SetBytes(pseudo[1*L : 2*L]) - - var q isogG2Point - q.sswu(&u) - g.evalIsogG2(&q) - g.clearCofactor() -} - -// Hash produces an element of G2 from the hash of an input byte string and -// an optional domain separation tag. This function is safe to use when a -// random oracle returning points in G2 be required. -func (g *G2) Hash(input, dst []byte) { - const L = 64 - pseudo := expander.NewExpanderMD(crypto.SHA256, dst).Expand(input, 4*L) - - var u0, u1 ff.Fp2 - u0[0].SetBytes(pseudo[0*L : 1*L]) - u0[1].SetBytes(pseudo[1*L : 2*L]) - u1[0].SetBytes(pseudo[2*L : 3*L]) - u1[1].SetBytes(pseudo[3*L : 4*L]) - - var q0, q1 isogG2Point - q0.sswu(&u0) - q1.sswu(&u1) - var p0, p1 G2 - p0.evalIsogG2(&q0) - p1.evalIsogG2(&q1) - g.Add(&p0, &p1) - g.clearCofactor() -} - -// isOnCurve returns true if g is a valid point on the curve. -func (g *G2) isOnCurve() bool { - var x3, z3, y2 ff.Fp2 - y2.Sqr(&g.y) // y2 = y^2 - y2.Mul(&y2, &g.z) // y2 = y^2*z - x3.Sqr(&g.x) // x3 = x^2 - x3.Mul(&x3, &g.x) // x3 = x^3 - z3.Sqr(&g.z) // z3 = z^2 - z3.Mul(&z3, &g.z) // z3 = z^3 - z3.Mul(&z3, &g2Params.b) // z3 = (4+4i)*z^3 - x3.Add(&x3, &z3) // x3 = x^3 + (4+4i)*z^3 - y2.Sub(&y2, &x3) // y2 = y^2*z - (x^3 + (4+4i)*z^3) - return y2.IsZero() == 1 -} - -// toAffine updates g with its affine representation. -func (g *G2) toAffine() { - if g.z.IsZero() != 1 { - var invZ ff.Fp2 - invZ.Inv(&g.z) - g.x.Mul(&g.x, &invZ) - g.y.Mul(&g.y, &invZ) - g.z.SetOne() - } -} - -// G2Generator returns the generator point of G2. -func G2Generator() *G2 { - var G G2 - G.x = g2Params.genX - G.y = g2Params.genY - G.z.SetOne() - return &G -} diff --git a/ecc/bls12381/g2Isog.go b/ecc/bls12381/g2Isog.go deleted file mode 100644 index e85ecaf0..00000000 --- a/ecc/bls12381/g2Isog.go +++ /dev/null @@ -1,170 +0,0 @@ -package bls12381 - -import ( - "fmt" - - "github.com/quantumcoinproject/circl/ecc/bls12381/ff" -) - -type isogG2Point struct{ x, y, z ff.Fp2 } - -func (p isogG2Point) String() string { return fmt.Sprintf("x: %v\ny: %v\nz: %v", p.x, p.y, p.z) } - -// IsOnCurve returns true if g is a valid point on the curve. -func (p *isogG2Point) IsOnCurve() bool { - var x2, x3, z2, z3, y2 ff.Fp2 - y2.Sqr(&p.y) // y2 = y^2 - y2.Mul(&y2, &p.z) // y2 = y^2*z - z2.Sqr(&p.z) // z2 = z^2 - z3.Mul(&z2, &p.z) // z3 = z^3 - z3.Mul(&z3, &g2Isog3.b) // z3 = B*z^3 - x2.Sqr(&p.x) // x2 = x^2 - x3.Mul(&z2, &g2Isog3.a) // x3 = A*z^2 - x3.Add(&x3, &x2) // x3 = x^2 + A*z^2 - x3.Mul(&x3, &p.x) // x3 = x^3 + A*x*z^2 - x3.Add(&x3, &z3) // x3 = x^3 + A*x*z^2 + Bz^3 - - return y2.IsEqual(&x3) == 1 && *p != isogG2Point{} -} - -// sswu implements the Simplified Shallue-van de Woestijne-Ulas method for -// mapping a field element to a point on the isogenous curve. -func (p *isogG2Point) sswu(u *ff.Fp2) { - // Method in Appendix-G.2.3 of - // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-hash-to-curve-11 - tv1, tv2, tv3, tv4 := &ff.Fp2{}, &ff.Fp2{}, &ff.Fp2{}, &ff.Fp2{} - tv5, xd, x1n, gxd := &ff.Fp2{}, &ff.Fp2{}, &ff.Fp2{}, &ff.Fp2{} - gx1, y, xn, gx2 := &ff.Fp2{}, &ff.Fp2{}, &ff.Fp2{}, &ff.Fp2{} - - tv1.Sqr(u) // 1. tv1 = u^2 - tv3.Mul(&g2sswu.Z, tv1) // 2. tv3 = Z * tv1 - tv5.Sqr(tv3) // 3. tv5 = tv3^2 - xd.Add(tv5, tv3) // 4. xd = tv5 + tv3 - tv2.SetOne() // 5. tv2 = 1 - x1n.Add(xd, tv2) // x1n = xd + tv2 - x1n.Mul(x1n, &g2Isog3.b) // 6. x1n = x1n * B - xd.Mul(&g2Isog3.a, xd) // 7. xd = A * xd - xd.Neg() // xd = -xd - e1 := xd.IsZero() // 8. e1 = xd == 0 - tv2.Mul(&g2sswu.Z, &g2Isog3.a) // 9. tv2 = Z * A - xd.CMov(xd, tv2, e1) // xd = CMOV(xd, tv2, e1) - tv2.Sqr(xd) // 10. tv2 = xd^2 - gxd.Mul(tv2, xd) // 11. gxd = tv2 * xd - tv2.Mul(&g2Isog3.a, tv2) // 12. tv2 = A * tv2 - gx1.Sqr(x1n) // 13. gx1 = x1n^2 - gx1.Add(gx1, tv2) // 14. gx1 = gx1 + tv2 - gx1.Mul(gx1, x1n) // 15. gx1 = gx1 * x1n - tv2.Mul(&g2Isog3.b, gxd) // 16. tv2 = B * gxd - gx1.Add(gx1, tv2) // 17. gx1 = gx1 + tv2 - tv4.Sqr(gxd) // 18. tv4 = gxd^2 - tv2.Mul(tv4, gxd) // 19. tv2 = tv4 * gxd - tv4.Sqr(tv4) // 20. tv4 = tv4^2 - tv2.Mul(tv2, tv4) // 21. tv2 = tv2 * tv4 - tv2.Mul(tv2, gx1) // 22. tv2 = tv2 * gx1 - tv4.Sqr(tv4) // 23. tv4 = tv4^2 - tv4.Mul(tv2, tv4) // 24. tv4 = tv2 * tv4 - y.ExpVarTime(tv4, g2sswu.c1[:]) // 25. y = tv4^c1 - y.Mul(y, tv2) // 26. y = y * tv2 - tv4.Mul(y, &g2sswu.c2) // 27. tv4 = y * c2 - tv2.Sqr(tv4) // 28. tv2 = tv4^2 - tv2.Mul(tv2, gxd) // 29. tv2 = tv2 * gxd - e2 := tv2.IsEqual(gx1) // 30. e2 = tv2 == gx1 - y.CMov(y, tv4, e2) // 31. y = CMOV(y, tv4, e2) - tv4.Mul(y, &g2sswu.c3) // 32. tv4 = y * c3 - tv2.Sqr(tv4) // 33. tv2 = tv4^2 - tv2.Mul(tv2, gxd) // 34. tv2 = tv2 * gxd - e3 := tv2.IsEqual(gx1) // 35. e3 = tv2 == gx1 - y.CMov(y, tv4, e3) // 36. y = CMOV(y, tv4, e3) - tv4.Mul(tv4, &g2sswu.c2) // 37. tv4 = tv4 * c2 - tv2.Sqr(tv4) // 38. tv2 = tv4^2 - tv2.Mul(tv2, gxd) // 39. tv2 = tv2 * gxd - e4 := tv2.IsEqual(gx1) // 40. e4 = tv2 == gx1 - y.CMov(y, tv4, e4) // 41. y = CMOV(y, tv4, e4) - gx2.Mul(gx1, tv5) // 42. gx2 = gx1 * tv5 - gx2.Mul(gx2, tv3) // 43. gx2 = gx2 * tv3 - tv5.Mul(y, tv1) // 44. tv5 = y * tv1 - tv5.Mul(tv5, u) // 45. tv5 = tv5 * u - tv1.Mul(tv5, &g2sswu.c4) // 46. tv1 = tv5 * c4 - tv4.Mul(tv1, &g2sswu.c2) // 47. tv4 = tv1 * c2 - tv2.Sqr(tv4) // 48. tv2 = tv4^2 - tv2.Mul(tv2, gxd) // 49. tv2 = tv2 * gxd - e5 := tv2.IsEqual(gx2) // 50. e5 = tv2 == gx2 - tv1.CMov(tv1, tv4, e5) // 51. tv1 = CMOV(tv1, tv4, e5) - tv4.Mul(tv5, &g2sswu.c5) // 52. tv4 = tv5 * c5 - tv2.Sqr(tv4) // 53. tv2 = tv4^2 - tv2.Mul(tv2, gxd) // 54. tv2 = tv2 * gxd - e6 := tv2.IsEqual(gx2) // 55. e6 = tv2 == gx2 - tv1.CMov(tv1, tv4, e6) // 56. tv1 = CMOV(tv1, tv4, e6) - tv4.Mul(tv4, &g2sswu.c2) // 57. tv4 = tv4 * c2 - tv2.Sqr(tv4) // 58. tv2 = tv4^2 - tv2.Mul(tv2, gxd) // 59. tv2 = tv2 * gxd - e7 := tv2.IsEqual(gx2) // 60. e7 = tv2 == gx2 - tv1.CMov(tv1, tv4, e7) // 61. tv1 = CMOV(tv1, tv4, e7) - tv2.Sqr(y) // 62. tv2 = y^2 - tv2.Mul(tv2, gxd) // 63. tv2 = tv2 * gxd - e8 := tv2.IsEqual(gx1) // 64. e8 = tv2 == gx1 - y.CMov(tv1, y, e8) // 65. y = CMOV(tv1, y, e8) - tv2.Mul(tv3, x1n) // 66. tv2 = tv3 * x1n - xn.CMov(tv2, x1n, e8) // 67. xn = CMOV(tv2, x1n, e8) - e9 := 1 ^ u.Sgn0() ^ y.Sgn0() // 68. e9 = sgn0(u) == sgn0(y) - *tv1 = *y // 69. tv1 = y - tv1.Neg() // tv1 = -y - y.CMov(tv1, y, e9) // y = CMOV(tv1, y, e9) - p.x = *xn // 70. return - p.y.Mul(y, xd) // (x,y) = (xn/xd, y/1) - p.z = *xd // (X,Y,Z) = (xn, y*xd, xd) -} - -// evalIsogG2 calculates g = g2Isog3(p), where g2Isog3 is an isogeny of -// degree 3 to the curve used in G2. -func (g *G2) evalIsogG2(p *isogG2Point) { - x, y, z := &p.x, &p.y, &p.z - t, zi := &ff.Fp2{}, &ff.Fp2{} - xNum, xDen, yNum, yDen := &ff.Fp2{}, &ff.Fp2{}, &ff.Fp2{}, &ff.Fp2{} - - ixn := len(g2Isog3.xNum) - 1 - ixd := len(g2Isog3.xDen) - 1 - iyn := len(g2Isog3.yNum) - 1 - iyd := len(g2Isog3.yDen) - 1 - - *xNum = g2Isog3.xNum[ixn] - *xDen = g2Isog3.xDen[ixd] - *yNum = g2Isog3.yNum[iyn] - *yDen = g2Isog3.yDen[iyd] - *zi = *z - - for (ixn | ixd | iyn | iyd) != 0 { - if ixn > 0 { - ixn-- - t.Mul(zi, &g2Isog3.xNum[ixn]) - xNum.Mul(xNum, x) - xNum.Add(xNum, t) - } - if ixd > 0 { - ixd-- - t.Mul(zi, &g2Isog3.xDen[ixd]) - xDen.Mul(xDen, x) - xDen.Add(xDen, t) - } - if iyn > 0 { - iyn-- - t.Mul(zi, &g2Isog3.yNum[iyn]) - yNum.Mul(yNum, x) - yNum.Add(yNum, t) - } - if iyd > 0 { - iyd-- - t.Mul(zi, &g2Isog3.yDen[iyd]) - yDen.Mul(yDen, x) - yDen.Add(yDen, t) - } - - zi.Mul(zi, z) - } - - g.x.Mul(xNum, yDen) - g.y.Mul(yNum, xDen) - g.y.Mul(&g.y, y) - g.z.Mul(xDen, yDen) - g.z.Mul(&g.z, z) -} diff --git a/ecc/bls12381/g2_test.go b/ecc/bls12381/g2_test.go deleted file mode 100644 index 15a07733..00000000 --- a/ecc/bls12381/g2_test.go +++ /dev/null @@ -1,248 +0,0 @@ -package bls12381 - -import ( - "crypto/rand" - "fmt" - "testing" - - "github.com/quantumcoinproject/circl/ecc/bls12381/ff" - "github.com/quantumcoinproject/circl/internal/test" -) - -func randomG2(t testing.TB) *G2 { - var P G2 - k := randomScalar(t) - P.ScalarMult(k, G2Generator()) - if !P.isOnCurve() { - t.Helper() - t.Fatal("not on curve") - } - return &P -} - -func TestG2Add(t *testing.T) { - const testTimes = 1 << 6 - var Q, R G2 - for i := 0; i < testTimes; i++ { - P := randomG2(t) - Q = *P - R = *P - R.Add(&R, &R) - R.Neg() - Q.Double() - Q.Neg() - got := R - want := Q - if !got.IsEqual(&want) { - test.ReportError(t, got, want, P) - } - } -} - -func TestG2ScalarMult(t *testing.T) { - const testTimes = 1 << 6 - var Q G2 - for i := 0; i < testTimes; i++ { - P := randomG2(t) - k := randomScalar(t) - Q.ScalarMult(k, P) - Q.toAffine() - got := Q.IsOnG2() - want := true - if got != want { - test.ReportError(t, got, want, P) - } - } -} - -func TestG2Hash(t *testing.T) { - const testTimes = 1 << 8 - - for _, e := range [...]struct { - Name string - Enc func(p *G2, input, dst []byte) - }{ - {"Encode", func(p *G2, input, dst []byte) { p.Encode(input, dst) }}, - {"Hash", func(p *G2, input, dst []byte) { p.Hash(input, dst) }}, - } { - var msg, dst [4]byte - var p G2 - t.Run(e.Name, func(t *testing.T) { - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(msg[:]) - _, _ = rand.Read(dst[:]) - e.Enc(&p, msg[:], dst[:]) - - got := p.isRTorsion() - want := true - if got != want { - test.ReportError(t, got, want, e.Name, msg, dst) - } - } - }) - } -} - -func TestG2Serial(t *testing.T) { - mustOk := "must be ok" - mustErr := "must be an error" - t.Run("valid", func(t *testing.T) { - testTimes := 1 << 6 - var got, want G2 - want.SetIdentity() - for i := 0; i < testTimes; i++ { - for _, b := range [][]byte{want.Bytes(), want.BytesCompressed()} { - err := got.SetBytes(b) - test.CheckNoErr(t, err, fmt.Sprintf("failure to deserialize: (P:%v b:%x)", want, b)) - - if !got.IsEqual(&want) { - test.ReportError(t, got, want, b) - } - } - want = *randomG2(t) - } - }) - t.Run("badPrefix", func(t *testing.T) { - q := new(G2) - b := make([]byte, G2Size) - for _, b[0] = range []byte{0x20, 0x60, 0xE0} { - test.CheckIsErr(t, q.SetBytes(b), mustErr) - } - }) - t.Run("badLength", func(t *testing.T) { - q := new(G2) - p := randomG2(t) - b := p.Bytes() - test.CheckIsErr(t, q.SetBytes(b[:0]), mustErr) - test.CheckIsErr(t, q.SetBytes(b[:1]), mustErr) - test.CheckIsErr(t, q.SetBytes(b[:G2Size-1]), mustErr) - test.CheckIsErr(t, q.SetBytes(b[:G2SizeCompressed]), mustErr) - test.CheckNoErr(t, q.SetBytes(b), mustOk) - test.CheckNoErr(t, q.SetBytes(append(b, 0)), mustOk) - b = p.BytesCompressed() - test.CheckIsErr(t, q.SetBytes(b[:0]), mustErr) - test.CheckIsErr(t, q.SetBytes(b[:1]), mustErr) - test.CheckIsErr(t, q.SetBytes(b[:G2SizeCompressed-1]), mustErr) - test.CheckNoErr(t, q.SetBytes(b), mustOk) - test.CheckNoErr(t, q.SetBytes(append(b, 0)), mustOk) - }) - t.Run("badInfinity", func(t *testing.T) { - var badInf, p G2 - badInf.SetIdentity() - b := badInf.Bytes() - b[0] |= 0x1F - err := p.SetBytes(b) - test.CheckIsErr(t, err, mustErr) - b[0] &= 0xE0 - b[1] = 0xFF - err = p.SetBytes(b) - test.CheckIsErr(t, err, mustErr) - }) - t.Run("badCoords", func(t *testing.T) { - bad := (&[ff.Fp2Size]byte{})[:] - for i := range bad { - bad[i] = 0xFF - } - var e ff.Fp2 - _ = e[0].Random(rand.Reader) - _ = e[1].Random(rand.Reader) - good, err := e.MarshalBinary() - test.CheckNoErr(t, err, mustOk) - - // bad x, good y - b := append(bad, good...) - b[0] = b[0]&0x1F | headerEncoding(0, 0, 0) - test.CheckIsErr(t, new(G2).SetBytes(b), mustErr) - - // good x, bad y - b = append(good, bad...) - b[0] = b[0]&0x1F | headerEncoding(0, 0, 0) - test.CheckIsErr(t, new(G2).SetBytes(b), mustErr) - }) - t.Run("noQR", func(t *testing.T) { - var x ff.Fp2 - // Let x=0, so x^3+4*(u+1) = 4*(u+1), which is not QR because (u+1) is not. - b, err := x.MarshalBinary() - test.CheckNoErr(t, err, mustOk) - b[0] = b[0]&0x1F | headerEncoding(1, 0, 0) - test.CheckIsErr(t, new(G2).SetBytes(b), mustErr) - }) - t.Run("notInG2", func(t *testing.T) { - // p=(0,1) is not on curve. - var x, y ff.Fp2 - y[0].SetUint64(1) - bx, err := x.MarshalBinary() - test.CheckNoErr(t, err, mustOk) - by, err := y.MarshalBinary() - test.CheckNoErr(t, err, mustOk) - b := append(bx, by...) - b[0] = b[0]&0x1F | headerEncoding(0, 0, 0) - test.CheckIsErr(t, new(G2).SetBytes(b), mustErr) - }) -} - -func BenchmarkG2(b *testing.B) { - P := randomG2(b) - Q := randomG2(b) - k := randomScalar(b) - var msg, dst [4]byte - _, _ = rand.Read(msg[:]) - _, _ = rand.Read(dst[:]) - - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.Add(P, Q) - } - }) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.ScalarMult(k, P) - } - }) - b.Run("Hash", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.Hash(msg[:], dst[:]) - } - }) -} - -func TestG2Torsion(t *testing.T) { - if !G2Generator().isRTorsion() { - t.Fatalf("G2 generator is not r-torsion") - } -} - -func TestG2Bytes(t *testing.T) { - got := new(G2) - id := new(G2) - id.SetIdentity() - g := G2Generator() - minusG := G2Generator() - minusG.Neg() - - type testCase struct { - header byte - length int - point *G2 - toBytes func(G2) []byte - } - - for i, v := range []testCase{ - {headerEncoding(0, 0, 0), G2Size, randomG2(t), (G2).Bytes}, - {headerEncoding(0, 0, 0), G2Size, g, (G2).Bytes}, - {headerEncoding(1, 0, 0), G2SizeCompressed, g, (G2).BytesCompressed}, - {headerEncoding(1, 0, 1), G2SizeCompressed, minusG, (G2).BytesCompressed}, - {headerEncoding(0, 1, 0), G2Size, id, (G2).Bytes}, - {headerEncoding(1, 1, 0), G2SizeCompressed, id, (G2).BytesCompressed}, - } { - b := v.toBytes(*v.point) - test.CheckOk(len(b) == v.length, fmt.Sprintf("bad encoding size (case:%v point:%v b:%x)", i, v.point, b), t) - test.CheckOk(b[0]&0xE0 == v.header, fmt.Sprintf("bad encoding header (case:%v point:%v b:%x)", i, v.point, b), t) - - err := got.SetBytes(b) - want := v.point - if err != nil || !got.IsEqual(want) { - test.ReportError(t, got, want, i, b) - } - } -} diff --git a/ecc/bls12381/gt.go b/ecc/bls12381/gt.go deleted file mode 100644 index 95531878..00000000 --- a/ecc/bls12381/gt.go +++ /dev/null @@ -1,22 +0,0 @@ -package bls12381 - -import "github.com/quantumcoinproject/circl/ecc/bls12381/ff" - -// GtSize is the length in bytes of an element in Gt. -const GtSize = ff.URootSize - -// Gt represents an element of the output (multiplicative) group of a pairing. -type Gt struct{ i ff.URoot } - -func (z Gt) String() string { return z.i.String() } -func (z *Gt) UnmarshalBinary(b []byte) error { return z.i.UnmarshalBinary(b) } -func (z Gt) MarshalBinary() ([]byte, error) { return z.i.MarshalBinary() } -func (z *Gt) SetIdentity() { z.i.SetIdentity() } -func (z Gt) IsEqual(x *Gt) bool { return z.i.IsEqual(&x.i) == 1 } -func (z Gt) IsIdentity() bool { i := &Gt{}; i.SetIdentity(); return z.IsEqual(i) } -func (z *Gt) Mul(x, y *Gt) { z.i.Mul(&x.i, &y.i) } -func (z *Gt) Sqr(x *Gt) { z.i.Sqr(&x.i) } -func (z *Gt) Inv(x *Gt) { z.i.Inv(&x.i) } - -// Exp calculates z=x^n, where n is the exponent in big-endian order. -func (z *Gt) Exp(x *Gt, n *Scalar) { b, _ := n.MarshalBinary(); z.i.Exp(&x.i, b) } diff --git a/ecc/bls12381/gt_test.go b/ecc/bls12381/gt_test.go deleted file mode 100644 index 00a6882d..00000000 --- a/ecc/bls12381/gt_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package bls12381 - -import ( - "crypto/rand" - "testing" -) - -func BenchmarkGt(b *testing.B) { - sc := &Scalar{} - err := sc.Random(rand.Reader) - if err != nil { - b.Fatal(err) - } - - g1 := G1Generator() - g2 := G2Generator() - e1 := Pair(g1, g2) - - g1.ScalarMult(sc, g1) - e2 := Pair(g1, g2) - e3 := &Gt{} - - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - e3.Mul(e1, e2) - } - }) - b.Run("Exp", func(b *testing.B) { - for i := 0; i < b.N; i++ { - e3.Exp(e1, sc) - } - }) -} diff --git a/ecc/bls12381/hash_test.go b/ecc/bls12381/hash_test.go deleted file mode 100644 index 8a9aab02..00000000 --- a/ecc/bls12381/hash_test.go +++ /dev/null @@ -1,133 +0,0 @@ -package bls12381 - -import ( - "encoding/hex" - "encoding/json" - "io" - "os" - "path/filepath" - "strings" - "testing" - - "github.com/quantumcoinproject/circl/ecc/bls12381/ff" - "github.com/quantumcoinproject/circl/internal/test" -) - -type vectorHash struct { - SuiteID string `json:"ciphersuite"` - CurveName string `json:"curve"` - DST string `json:"dst"` - IsRandomOracle bool `json:"randomOracle"` - Vectors []struct { - P point `json:"P"` - Msg string `json:"msg"` - } `json:"vectors"` - Field struct { - M string `json:"m"` - P string `json:"p"` - } `json:"field"` -} - -type elm string - -func (e elm) toBytes(t *testing.T) (out []byte) { - var buf [ff.FpSize]byte - for _, s := range strings.Split(string(e), ",") { - x, err := hex.DecodeString(s[2:]) - if err != nil { - t.Fatal(err) - } - copy(buf[ff.FpSize-len(x):ff.FpSize], x) - out = append(append([]byte{}, buf[:]...), out...) - } - return -} - -type point struct { - X elm `json:"x"` - Y elm `json:"y"` -} - -func (p point) toBytes(t *testing.T) []byte { return append(p.X.toBytes(t), p.Y.toBytes(t)...) } - -type hasher interface { - Encode(_, _ []byte) - Hash(_, _ []byte) - SetBytes([]byte) error - IsEqualTo(_ hasher) bool - IsRTorsion() bool -} - -type g1Hasher struct{ *G1 } - -func (g g1Hasher) IsEqualTo(x hasher) bool { return g.IsEqual(x.(g1Hasher).G1) } -func (g g1Hasher) IsRTorsion() bool { return g.IsOnG1() } - -type g2Hasher struct{ *G2 } - -func (g g2Hasher) IsEqualTo(x hasher) bool { return g.IsEqual(x.(g2Hasher).G2) } -func (g g2Hasher) IsRTorsion() bool { return g.IsOnG2() } - -func (v *vectorHash) test(t *testing.T) { - var got, want hasher - if v.Field.M == "0x1" { - got, want = g1Hasher{new(G1)}, g1Hasher{new(G1)} - } else if v.Field.M == "0x2" { - got, want = g2Hasher{new(G2)}, g2Hasher{new(G2)} - } - - dst := []byte(v.DST) - - doHash := got.Encode - if v.IsRandomOracle { - doHash = got.Hash - } - - for i, vi := range v.Vectors { - input := []byte(vi.Msg) - doHash(input, dst) - - err := want.SetBytes(vi.P.toBytes(t)) - test.CheckNoErr(t, err, "bad deserialization") - - if !got.IsEqualTo(want) || !got.IsRTorsion() { - test.ReportError(t, got, want, v.SuiteID, i) - } - } -} - -func readFile(t *testing.T, fileName string) *vectorHash { - jsonFile, err := os.Open(fileName) - if err != nil { - t.Fatalf("File %v can not be opened. Error: %v", fileName, err) - } - defer jsonFile.Close() - input, err := io.ReadAll(jsonFile) - if err != nil { - t.Fatalf("File %v can not be loaded. Error: %v", fileName, err) - } - v := new(vectorHash) - err = json.Unmarshal(input, v) - if err != nil { - t.Fatalf("File %v can not be parsed. Error: %v", fileName, err) - } - return v -} - -func TestHashVectors(t *testing.T) { - // Test vectors from draft-irtf-cfrg-hash-to-curve: - // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-hash-to-curve-11 - // - // JSON files can be found at: - // https://github.com/cfrg/draft-irtf-cfrg-hash-to-curve/tree/draft-irtf-cfrg-hash-to-curve-10/poc/vectors - - fileNames, err := filepath.Glob("./testdata/BLS12381*.json") - if err != nil { - t.Fatal(err) - } - - for _, fileName := range fileNames { - v := readFile(t, fileName) - t.Run(v.SuiteID, v.test) - } -} diff --git a/ecc/bls12381/pair.go b/ecc/bls12381/pair.go deleted file mode 100644 index 575c57a9..00000000 --- a/ecc/bls12381/pair.go +++ /dev/null @@ -1,131 +0,0 @@ -package bls12381 - -import "github.com/quantumcoinproject/circl/ecc/bls12381/ff" - -// Pair calculates the ate-pairing of P and Q. -func Pair(P *G1, Q *G2) *Gt { - affP := *P - affP.toAffine() - mi := &ff.Fp12{} - miller(mi, &affP, Q) - e := &Gt{} - finalExp(e, mi) - return e -} - -func miller(f *ff.Fp12, P *G1, Q *G2) { - g := &ff.LineValue{} - acc := &ff.Fp12Cubic{} - acc.SetOne() - T := &G2{} - *T = *Q - l := &line{} - const lenX = 64 - for i := lenX - 2; i >= 0; i-- { - acc.Sqr(acc) - doubleAndLine(T, l) - evalLine(g, l, P) - acc.MulLine(acc, g) - // paramX is -2 ^ 63 - 2 ^ 62 - 2 ^ 60 - 2 ^ 57 - 2 ^ 48 - 2 ^ 16 - if (i == 62) || (i == 60) || (i == 57) || (i == 48) || (i == 16) { - addAndLine(T, T, Q, l) - evalLine(g, l, P) - acc.MulLine(acc, g) - } - } - f.FromFp12Cubic(acc) - f.Cjg() // inverts f as paramX is negative. -} - -// line contains the coefficients of a sparse element of Fp12. -// Evaluating the line on P' = (xP',yP') results in -// -// f = evalLine(P') = l[0]*xP' + l[1]*yP' + l[2] \in Fp12. -type line [3]ff.Fp2 - -// evalLine updates f = f * line(P'), where f lives in Fp12 = Fp6[w]/(w^2-v) -// and P' is the image of P on the twist curve. -func evalLine(f *ff.LineValue, l *line, P *G1) { - // Send P \in E to the twist - // E --> E' - // (xP,yP) |-> (xP*w^2,yP*w^3) = (xP',yP') - // - // f = line(P') = l[0]*xP' + l[1]*yP' + l[2] \in Fp12. - // = l[0]*xP*w^2 + l[1]*yP*w^3 + l[2] \in Fp12. - - // First perform the products: l[0]*xP and l[1]*yP \in Fp2. - var xP, yP ff.Fp2 - xP[0] = P.x - yP[0] = P.y - f[1].Mul(&l[0], &xP) - f[2].Mul(&l[1], &yP) - f[0] = l[2] - - if f.IsZero() == 1 { - f.SetOne() - } -} - -func finalExp(g *Gt, f *ff.Fp12) { - c := &ff.Cyclo6{} - ff.EasyExponentiation(c, f) - ff.HardExponentiation(&g.i, c) -} - -// ProdPair calculates the product of pairings: -// -// e = \Prod_i pair(Pi, Qi)^ni -// = \Prod_i pair(ni*Pi, Qi) -// = \Prod_i pair(Pi, ni*Qi) -// -// For efficiency, it performs operations in G1. -func ProdPair(P []*G1, Q []*G2, n []*Scalar) *Gt { - if len(P) != len(Q) || len(P) != len(n) { - panic("mismatch length of inputs") - } - - scaled := make([]*G1, len(P)) - for i := range P { - scaled[i] = new(G1) - scaled[i].ScalarMult(n[i], P[i]) - } - - affineP := affinize(scaled) - - mi := new(ff.Fp12) - out := new(ff.Fp12) - out.SetOne() - - for i := range affineP { - miller(mi, &affineP[i], Q[i]) - out.Mul(out, mi) - } - - e := &Gt{} - finalExp(e, out) - return e -} - -// ProdPairFrac computes the product e(P, Q)^sign where sign is 1 or -1 -func ProdPairFrac(P []*G1, Q []*G2, signs []int) *Gt { - if len(P) != len(Q) || len(P) != len(signs) { - panic("mismatch length of inputs") - } - - mi := new(ff.Fp12) - out := new(ff.Fp12) - out.SetOne() - - affineP := affinize(P) - for i := range affineP { - if signs[i] == -1 { - affineP[i].Neg() - } - miller(mi, &affineP[i], Q[i]) - out.Mul(mi, out) - } - - e := &Gt{} - finalExp(e, out) - return e -} diff --git a/ecc/bls12381/pair_test.go b/ecc/bls12381/pair_test.go deleted file mode 100644 index 89a4c2a0..00000000 --- a/ecc/bls12381/pair_test.go +++ /dev/null @@ -1,235 +0,0 @@ -package bls12381 - -import ( - "fmt" - "math/rand" - "testing" - - "github.com/quantumcoinproject/circl/ecc/bls12381/ff" - "github.com/quantumcoinproject/circl/internal/test" -) - -func TestProdPair(t *testing.T) { - const testTimes = 1 << 5 - const N = 3 - - listG1 := [N]*G1{} - listG2 := [N]*G2{} - listSc := [N]*Scalar{} - var ePQn, got Gt - - for i := 0; i < testTimes; i++ { - got.SetIdentity() - for j := 0; j < N; j++ { - listG1[j] = randomG1(t) - listG2[j] = randomG2(t) - listSc[j] = randomScalar(t) - - ePQ := Pair(listG1[j], listG2[j]) - ePQn.Exp(ePQ, listSc[j]) - got.Mul(&got, &ePQn) - } - - want := ProdPair(listG1[:], listG2[:], listSc[:]) - - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } - } -} - -func TestProdPairFrac(t *testing.T) { - const testTimes = 1 << 5 - const N = 5 - - listG1 := [N]*G1{} - listG2 := [N]*G2{} - listSc := [N]*Scalar{} - listSigns := [N]int{} - var ePQn, got Gt - - for i := 0; i < testTimes; i++ { - got.SetIdentity() - for j := 0; j < N; j++ { - listG1[j] = randomG1(t) - listG2[j] = randomG2(t) - listSc[j] = &Scalar{} - coin := rand.Int31n(2) //nolint - switch coin { - case 0: - listSc[j].SetOne() - listSc[j].Neg() - listSigns[j] = -1 - - case 1: - listSc[j].SetOne() - listSigns[j] = 1 - } - - ePQ := Pair(listG1[j], listG2[j]) - ePQn.Exp(ePQ, listSc[j]) - got.Mul(&got, &ePQn) - } - - want := ProdPairFrac(listG1[:], listG2[:], listSigns[:]) - - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } - } -} - -func TestInputs(t *testing.T) { - t.Run("Pair", func(t *testing.T) { - P := *randomG1(t) - Q := *randomG2(t) - oldP := P - oldQ := Q - _ = Pair(&P, &Q) - test.CheckOk(P == oldP, "the point P was overwritten", t) - test.CheckOk(Q == oldQ, "the point Q was overwritten", t) - }) - - t.Run("ProdPair", func(t *testing.T) { - P0, P1 := *randomG1(t), *randomG1(t) - Q0, Q1 := *randomG2(t), *randomG2(t) - n0, n1 := *randomScalar(t), *randomScalar(t) - - oldP0, oldP1 := P0, P1 - oldQ0, oldQ1 := Q0, Q1 - oldn0, oldn1 := n0, n1 - - _ = ProdPair([]*G1{&P0, &P1}, []*G2{&Q0, &Q1}, []*Scalar{&n0, &n1}) - - test.CheckOk(P0 == oldP0, "the point P0 was overwritten", t) - test.CheckOk(P1 == oldP1, "the point P1 was overwritten", t) - test.CheckOk(Q0 == oldQ0, "the point Q0 was overwritten", t) - test.CheckOk(Q1 == oldQ1, "the point Q1 was overwritten", t) - test.CheckOk(n0 == oldn0, "the scalar n0 was overwritten", t) - test.CheckOk(n1 == oldn1, "the scalar n1 was overwritten", t) - }) - - t.Run("ProdPairFrac", func(t *testing.T) { - P0, P1 := *randomG1(t), *randomG1(t) - Q0, Q1 := *randomG2(t), *randomG2(t) - - oldP0, oldP1 := P0, P1 - oldQ0, oldQ1 := Q0, Q1 - - _ = ProdPairFrac([]*G1{&P0, &P1}, []*G2{&Q0, &Q1}, []int{1, -1}) - - test.CheckOk(P0 == oldP0, "the point P0 was overwritten", t) - test.CheckOk(P1 == oldP1, "the point P1 was overwritten", t) - test.CheckOk(Q0 == oldQ0, "the point Q0 was overwritten", t) - test.CheckOk(Q1 == oldQ1, "the point Q1 was overwritten", t) - }) -} - -func TestPairBilinear(t *testing.T) { - testTimes := 1 << 5 - for i := 0; i < testTimes; i++ { - g1 := G1Generator() - g2 := G2Generator() - a := randomScalar(t) - b := randomScalar(t) - - ab := &Scalar{} - ab.Mul(a, b) - p := &G1{} - q := &G2{} - p.ScalarMult(a, g1) - q.ScalarMult(b, g2) - lhs := Pair(p, q) - tmp := Pair(g1, g2) - rhs := &Gt{} - rhs.Exp(tmp, ab) - if !lhs.IsEqual(rhs) { - test.ReportError(t, lhs, rhs) - } - } -} - -func TestPairIdentity(t *testing.T) { - g1id := &G1{} - g2id := &G2{} - g1 := G1Generator() - g2 := G2Generator() - g1id.SetIdentity() - g2id.SetIdentity() - one := &Gt{} - one.SetIdentity() - ans := Pair(g1id, g2) - if !ans.IsEqual(one) { - test.ReportError(t, ans, one) - } - ans = Pair(g1, g2id) - if !ans.IsEqual(one) { - test.ReportError(t, ans, one) - } -} - -func BenchmarkMiller(b *testing.B) { - g1 := G1Generator() - g2 := G2Generator() - mi := new(ff.Fp12) - b.ResetTimer() - for i := 0; i < b.N; i++ { - miller(mi, g1, g2) - } -} - -func BenchmarkFinalExpo(b *testing.B) { - g1 := G1Generator() - g2 := G2Generator() - mi := new(ff.Fp12) - miller(mi, g1, g2) - c := &ff.Cyclo6{} - u := &ff.URoot{} - g := &Gt{} - - ff.EasyExponentiation(c, mi) - - b.Run("EasyExp", func(b *testing.B) { - for i := 0; i < b.N; i++ { - ff.EasyExponentiation(c, mi) - } - }) - b.Run("HardExp", func(b *testing.B) { - for i := 0; i < b.N; i++ { - ff.HardExponentiation(u, c) - } - }) - b.Run("FinalExp", func(b *testing.B) { - for i := 0; i < b.N; i++ { - finalExp(g, mi) - } - }) -} - -func BenchmarkPair(b *testing.B) { - g1 := G1Generator() - g2 := G2Generator() - - const N = 3 - listG1 := [N]*G1{} - listG2 := [N]*G2{} - listExp := [N]*Scalar{} - for i := 0; i < N; i++ { - listG1[i] = new(G1) - *listG1[i] = *g1 - listG2[i] = new(G2) - *listG2[i] = *g2 - listExp[i] = randomScalar(b) - } - - b.Run("Pair", func(b *testing.B) { - for i := 0; i < b.N; i++ { - Pair(g1, g2) - } - }) - b.Run(fmt.Sprintf("ProdPair%v", N), func(b *testing.B) { - for i := 0; i < b.N; i++ { - ProdPair(listG1[:], listG2[:], listExp[:]) - } - }) -} diff --git a/ecc/bls12381/psi_test.go b/ecc/bls12381/psi_test.go deleted file mode 100644 index 2451103c..00000000 --- a/ecc/bls12381/psi_test.go +++ /dev/null @@ -1,121 +0,0 @@ -package bls12381 - -import ( - "testing" - - "github.com/quantumcoinproject/circl/ecc/bls12381/ff" -) - -func checkE(t *testing.T, x *ff.Fp12, y *ff.Fp12) { - four := &ff.Fp12{} - four[0][0][0].SetUint64(4) - - xcube := &ff.Fp12{} - xcube.Mul(x, x) - xcube.Mul(xcube, x) - - ysq := &ff.Fp12{} - ysq.Mul(y, y) - - check := &ff.Fp12{} - check.Add(xcube, four) - if check.IsEqual(ysq) != 1 { - t.Log("failure of isogeny to E to verify") - t.Fail() - } -} - -func checkEprime(t *testing.T, x *ff.Fp12, y *ff.Fp12) { - four := &ff.Fp12{} - four[0][0][0].SetUint64(4) - ysq := &ff.Fp12{} - xcube := &ff.Fp12{} - uplusOne := &ff.Fp12{} - uplusOne[0][0][1].SetOne() - uplusOne[0][0][0].SetOne() - - b := &ff.Fp12{} - b.Mul(uplusOne, four) - - check := &ff.Fp12{} - ysq.Mul(y, y) - - xcube.Mul(x, x) - xcube.Mul(x, xcube) - check.Add(xcube, b) - if check.IsEqual(ysq) != 1 { - t.Log("failure to return to original curve") - t.Fail() - } -} - -func TestPsi(t *testing.T) { - xp12 := &ff.Fp12{} - yp12 := &ff.Fp12{} - Q := &G2{} - P := randomG2(t) - *Q = *P - P.toAffine() - Q.psi() - Q.toAffine() - w := &ff.Fp12{} - w[1].SetOne() - wsq := &ff.Fp12{} - wsq.Sqr(w) - wcube := &ff.Fp12{} - wcube.Mul(wsq, w) - wsqInv := &ff.Fp12{} - wsqInv.Inv(wsq) - wcubInv := &ff.Fp12{} - wcubInv.Inv(wcube) - - uplusOne := &ff.Fp12{} - uplusOne[0][0][1].SetOne() - uplusOne[0][0][0].SetOne() - wsix := &ff.Fp12{} - wsix.Mul(wcube, wcube) - if wsix.IsEqual(uplusOne) != 1 { - t.Log("w^6 is not u+1") - t.Fail() - } - - xp12[0][0] = P.x - yp12[0][0] = P.y - // E' is yp^2=xp^3+4(u+1) - t.Log("testing input") - checkEprime(t, xp12, yp12) - // let x12 = xp/w^2 - // let y12 = yp/w^3 - // Then y12^2=x12^3+4 - - x12 := &ff.Fp12{} - y12 := &ff.Fp12{} - - x12.Mul(xp12, wsqInv) - y12.Mul(yp12, wcubInv) - t.Log("testing intermediate") - checkE(t, x12, y12) - // Do Frobenius - x12.Frob(x12) - y12.Frob(y12) - t.Log("testing post frobenius") - checkE(t, x12, y12) - // And return to original - x12.Mul(x12, wsq) - y12.Mul(y12, wcube) - - // Now we should have y^2=x^3+4(u+1) - checkEprime(t, x12, y12) - qx12 := &ff.Fp12{} - qx12[0][0] = Q.x - qy12 := &ff.Fp12{} - qy12[0][0] = Q.y - if x12.IsEqual(qx12) != 1 { - t.Log("failure in evaluation of x") - t.Fail() - } - if y12.IsEqual(qy12) != 1 { - t.Log("failure in evaluation of y") - t.Fail() - } -} diff --git a/ecc/bls12381/testdata/BLS12381G1_XMD-SHA-256_SSWU_NU_.json b/ecc/bls12381/testdata/BLS12381G1_XMD-SHA-256_SSWU_NU_.json deleted file mode 100644 index cc3d17a3..00000000 --- a/ecc/bls12381/testdata/BLS12381G1_XMD-SHA-256_SSWU_NU_.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "L": "0x40", - "Z": "0xb", - "ciphersuite": "BLS12381G1_XMD:SHA-256_SSWU_NU_", - "curve": "BLS12-381 G1", - "dst": "QUUX-V01-CS02-with-BLS12381G1_XMD:SHA-256_SSWU_NU_", - "expand": "XMD", - "field": { - "m": "0x1", - "p": "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab" - }, - "hash": "sha256", - "k": "0x80", - "map": { - "name": "SSWU" - }, - "randomOracle": false, - "vectors": [ - { - "P": { - "x": "0x184bb665c37ff561a89ec2122dd343f20e0f4cbcaec84e3c3052ea81d1834e192c426074b02ed3dca4e7676ce4ce48ba", - "y": "0x04407b8d35af4dacc809927071fc0405218f1401a6d15af775810e4e460064bcc9468beeba82fdc751be70476c888bf3" - }, - "Q": { - "x": "0x11398d3b324810a1b093f8e35aa8571cced95858207e7f49c4fd74656096d61d8a2f9a23cdb18a4dd11cd1d66f41f709", - "y": "0x19316b6fb2ba7717355d5d66a361899057e1e84a6823039efc7beccefe09d023fb2713b1c415fcf278eb0c39a89b4f72" - }, - "msg": "", - "u": [ - "0x156c8a6a2c184569d69a76be144b5cdc5141d2d2ca4fe341f011e25e3969c55ad9e9b9ce2eb833c81a908e5fa4ac5f03" - ] - }, - { - "P": { - "x": "0x009769f3ab59bfd551d53a5f846b9984c59b97d6842b20a2c565baa167945e3d026a3755b6345df8ec7e6acb6868ae6d", - "y": "0x1532c00cf61aa3d0ce3e5aa20c3b531a2abd2c770a790a2613818303c6b830ffc0ecf6c357af3317b9575c567f11cd2c" - }, - "Q": { - "x": "0x1998321bc27ff6d71df3051b5aec12ff47363d81a5e9d2dff55f444f6ca7e7d6af45c56fd029c58237c266ef5cda5254", - "y": "0x034d274476c6307ae584f951c82e7ea85b84f72d28f4d6471732356121af8d62a49bc263e8eb913a6cf6f125995514ee" - }, - "msg": "abc", - "u": [ - "0x147e1ed29f06e4c5079b9d14fc89d2820d32419b990c1c7bb7dbea2a36a045124b31ffbde7c99329c05c559af1c6cc82" - ] - }, - { - "P": { - "x": "0x1974dbb8e6b5d20b84df7e625e2fbfecb2cdb5f77d5eae5fb2955e5ce7313cae8364bc2fff520a6c25619739c6bdcb6a", - "y": "0x15f9897e11c6441eaa676de141c8d83c37aab8667173cbe1dfd6de74d11861b961dccebcd9d289ac633455dfcc7013a3" - }, - "Q": { - "x": "0x17d502fa43bd6a4cad2859049a0c3ecefd60240d129be65da271a4c03a9c38fa78163b9d2a919d2beb57df7d609b4919", - "y": "0x109019902ae93a8732abecf2ff7fecd2e4e305eb91f41c9c3267f16b6c19de138c7272947f25512745da6c466cdfd1ac" - }, - "msg": "abcdef0123456789", - "u": [ - "0x04090815ad598a06897dd89bcda860f25837d54e897298ce31e6947378134d3761dc59a572154963e8c954919ecfa82d" - ] - }, - { - "P": { - "x": "0x0a7a047c4a8397b3446450642c2ac64d7239b61872c9ae7a59707a8f4f950f101e766afe58223b3bff3a19a7f754027c", - "y": "0x1383aebba1e4327ccff7cf9912bda0dbc77de048b71ef8c8a81111d71dc33c5e3aa6edee9cf6f5fe525d50cc50b77cc9" - }, - "Q": { - "x": "0x112eb92dd2b3aa9cd38b08de4bef603f2f9fb0ca226030626a9a2e47ad1e9847fe0a5ed13766c339e38f514bba143b21", - "y": "0x17542ce2f8d0a54f2c5ba8c4b14e10b22d5bcd7bae2af3c965c8c872b571058c720eac448276c99967ded2bf124490e1" - }, - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "u": [ - "0x08dccd088ca55b8bfbc96fb50bb25c592faa867a8bb78d4e94a8cc2c92306190244532e91feba2b7fed977e3c3bb5a1f" - ] - }, - { - "P": { - "x": "0x0e7a16a975904f131682edbb03d9560d3e48214c9986bd50417a77108d13dc957500edf96462a3d01e62dc6cd468ef11", - "y": "0x0ae89e677711d05c30a48d6d75e76ca9fb70fe06c6dd6ff988683d89ccde29ac7d46c53bb97a59b1901abf1db66052db" - }, - "Q": { - "x": "0x1775d400a1bacc1c39c355da7e96d2d1c97baa9430c4a3476881f8521c09a01f921f592607961efc99c4cd46bd78ca19", - "y": "0x1109b5d59f65964315de65a7a143e86eabc053104ed289cf480949317a5685fad7254ff8e7fe6d24d3104e5d55ad6370" - }, - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "u": [ - "0x0dd824886d2123a96447f6c56e3a3fa992fbfefdba17b6673f9f630ff19e4d326529db37e1c1be43f905bf9202e0278d" - ] - } - ] -} diff --git a/ecc/bls12381/testdata/BLS12381G1_XMD-SHA-256_SSWU_RO_.json b/ecc/bls12381/testdata/BLS12381G1_XMD-SHA-256_SSWU_RO_.json deleted file mode 100644 index 46c7574f..00000000 --- a/ecc/bls12381/testdata/BLS12381G1_XMD-SHA-256_SSWU_RO_.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "L": "0x40", - "Z": "0xb", - "ciphersuite": "BLS12381G1_XMD:SHA-256_SSWU_RO_", - "curve": "BLS12-381 G1", - "dst": "QUUX-V01-CS02-with-BLS12381G1_XMD:SHA-256_SSWU_RO_", - "expand": "XMD", - "field": { - "m": "0x1", - "p": "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab" - }, - "hash": "sha256", - "k": "0x80", - "map": { - "name": "SSWU" - }, - "randomOracle": true, - "vectors": [ - { - "P": { - "x": "0x052926add2207b76ca4fa57a8734416c8dc95e24501772c814278700eed6d1e4e8cf62d9c09db0fac349612b759e79a1", - "y": "0x08ba738453bfed09cb546dbb0783dbb3a5f1f566ed67bb6be0e8c67e2e81a4cc68ee29813bb7994998f3eae0c9c6a265" - }, - "Q0": { - "x": "0x11a3cce7e1d90975990066b2f2643b9540fa40d6137780df4e753a8054d07580db3b7f1f03396333d4a359d1fe3766fe", - "y": "0x0eeaf6d794e479e270da10fdaf768db4c96b650a74518fc67b04b03927754bac66f3ac720404f339ecdcc028afa091b7" - }, - "Q1": { - "x": "0x160003aaf1632b13396dbad518effa00fff532f604de1a7fc2082ff4cb0afa2d63b2c32da1bef2bf6c5ca62dc6b72f9c", - "y": "0x0d8bb2d14e20cf9f6036152ed386d79189415b6d015a20133acb4e019139b94e9c146aaad5817f866c95d609a361735e" - }, - "msg": "", - "u": [ - "0x0ba14bd907ad64a016293ee7c2d276b8eae71f25a4b941eece7b0d89f17f75cb3ae5438a614fb61d6835ad59f29c564f", - "0x019b9bd7979f12657976de2884c7cce192b82c177c80e0ec604436a7f538d231552f0d96d9f7babe5fa3b19b3ff25ac9" - ] - }, - { - "P": { - "x": "0x03567bc5ef9c690c2ab2ecdf6a96ef1c139cc0b2f284dca0a9a7943388a49a3aee664ba5379a7655d3c68900be2f6903", - "y": "0x0b9c15f3fe6e5cf4211f346271d7b01c8f3b28be689c8429c85b67af215533311f0b8dfaaa154fa6b88176c229f2885d" - }, - "Q0": { - "x": "0x125435adce8e1cbd1c803e7123f45392dc6e326d292499c2c45c5865985fd74fe8f042ecdeeec5ecac80680d04317d80", - "y": "0x0e8828948c989126595ee30e4f7c931cbd6f4570735624fd25aef2fa41d3f79cfb4b4ee7b7e55a8ce013af2a5ba20bf2" - }, - "Q1": { - "x": "0x11def93719829ecda3b46aa8c31fc3ac9c34b428982b898369608e4f042babee6c77ab9218aad5c87ba785481eff8ae4", - "y": "0x0007c9cef122ccf2efd233d6eb9bfc680aa276652b0661f4f820a653cec1db7ff69899f8e52b8e92b025a12c822a6ce6" - }, - "msg": "abc", - "u": [ - "0x0d921c33f2bad966478a03ca35d05719bdf92d347557ea166e5bba579eea9b83e9afa5c088573c2281410369fbd32951", - "0x003574a00b109ada2f26a37a91f9d1e740dffd8d69ec0c35e1e9f4652c7dba61123e9dd2e76c655d956e2b3462611139" - ] - }, - { - "P": { - "x": "0x11e0b079dea29a68f0383ee94fed1b940995272407e3bb916bbf268c263ddd57a6a27200a784cbc248e84f357ce82d98", - "y": "0x03a87ae2caf14e8ee52e51fa2ed8eefe80f02457004ba4d486d6aa1f517c0889501dc7413753f9599b099ebcbbd2d709" - }, - "Q0": { - "x": "0x08834484878c217682f6d09a4b51444802fdba3d7f2df9903a0ddadb92130ebbfa807fffa0eabf257d7b48272410afff", - "y": "0x0b318f7ecf77f45a0f038e62d7098221d2dbbca2a394164e2e3fe953dc714ac2cde412d8f2d7f0c03b259e6795a2508e" - }, - "Q1": { - "x": "0x158418ed6b27e2549f05531a8281b5822b31c3bf3144277fbb977f8d6e2694fedceb7011b3c2b192f23e2a44b2bd106e", - "y": "0x1879074f344471fac5f839e2b4920789643c075792bec5af4282c73f7941cda5aa77b00085eb10e206171b9787c4169f" - }, - "msg": "abcdef0123456789", - "u": [ - "0x062d1865eb80ebfa73dcfc45db1ad4266b9f3a93219976a3790ab8d52d3e5f1e62f3b01795e36834b17b70e7b76246d4", - "0x0cdc3e2f271f29c4ff75020857ce6c5d36008c9b48385ea2f2bf6f96f428a3deb798aa033cd482d1cdc8b30178b08e3a" - ] - }, - { - "P": { - "x": "0x15f68eaa693b95ccb85215dc65fa81038d69629f70aeee0d0f677cf22285e7bf58d7cb86eefe8f2e9bc3f8cb84fac488", - "y": "0x1807a1d50c29f430b8cafc4f8638dfeeadf51211e1602a5f184443076715f91bb90a48ba1e370edce6ae1062f5e6dd38" - }, - "Q0": { - "x": "0x0cbd7f84ad2c99643fea7a7ac8f52d63d66cefa06d9a56148e58b984b3dd25e1f41ff47154543343949c64f88d48a710", - "y": "0x052c00e4ed52d000d94881a5638ae9274d3efc8bc77bc0e5c650de04a000b2c334a9e80b85282a00f3148dfdface0865" - }, - "Q1": { - "x": "0x06493fb68f0d513af08be0372f849436a787e7b701ae31cb964d968021d6ba6bd7d26a38aaa5a68e8c21a6b17dc8b579", - "y": "0x02e98f2ccf5802b05ffaac7c20018bc0c0b2fd580216c4aa2275d2909dc0c92d0d0bdc979226adeb57a29933536b6bb4" - }, - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "u": [ - "0x010476f6a060453c0b1ad0b628f3e57c23039ee16eea5e71bb87c3b5419b1255dc0e5883322e563b84a29543823c0e86", - "0x0b1a912064fb0554b180e07af7e787f1f883a0470759c03c1b6509eb8ce980d1670305ae7b928226bb58fdc0a419f46e" - ] - }, - { - "P": { - "x": "0x082aabae8b7dedb0e78aeb619ad3bfd9277a2f77ba7fad20ef6aabdc6c31d19ba5a6d12283553294c1825c4b3ca2dcfe", - "y": "0x05b84ae5a942248eea39e1d91030458c40153f3b654ab7872d779ad1e942856a20c438e8d99bc8abfbf74729ce1f7ac8" - }, - "Q0": { - "x": "0x0cf97e6dbd0947857f3e578231d07b309c622ade08f2c08b32ff372bd90db19467b2563cc997d4407968d4ac80e154f8", - "y": "0x127f0cddf2613058101a5701f4cb9d0861fd6c2a1b8e0afe194fccf586a3201a53874a2761a9ab6d7220c68661a35ab3" - }, - "Q1": { - "x": "0x092f1acfa62b05f95884c6791fba989bbe58044ee6355d100973bf9553ade52b47929264e6ae770fb264582d8dce512a", - "y": "0x028e6d0169a72cfedb737be45db6c401d3adfb12c58c619c82b93a5dfcccef12290de530b0480575ddc8397cda0bbebf" - }, - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "u": [ - "0x0a8ffa7447f6be1c5a2ea4b959c9454b431e29ccc0802bc052413a9c5b4f9aac67a93431bd480d15be1e057c8a08e8c6", - "0x05d487032f602c90fa7625dbafe0f4a49ef4a6b0b33d7bb349ff4cf5410d297fd6241876e3e77b651cfc8191e40a68b7" - ] - } - ] -} diff --git a/ecc/bls12381/testdata/BLS12381G2_XMD-SHA-256_SSWU_NU_.json b/ecc/bls12381/testdata/BLS12381G2_XMD-SHA-256_SSWU_NU_.json deleted file mode 100644 index 7695cfc2..00000000 --- a/ecc/bls12381/testdata/BLS12381G2_XMD-SHA-256_SSWU_NU_.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "L": "0x40", - "Z": "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaa9,0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaaa", - "ciphersuite": "BLS12381G2_XMD:SHA-256_SSWU_NU_", - "curve": "BLS12-381 G2", - "dst": "QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_NU_", - "expand": "XMD", - "field": { - "m": "0x2", - "p": "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab" - }, - "hash": "sha256", - "k": "0x80", - "map": { - "name": "SSWU" - }, - "randomOracle": false, - "vectors": [ - { - "P": { - "x": "0x00e7f4568a82b4b7dc1f14c6aaa055edf51502319c723c4dc2688c7fe5944c213f510328082396515734b6612c4e7bb7,0x126b855e9e69b1f691f816e48ac6977664d24d99f8724868a184186469ddfd4617367e94527d4b74fc86413483afb35b", - "y": "0x0caead0fd7b6176c01436833c79d305c78be307da5f6af6c133c47311def6ff1e0babf57a0fb5539fce7ee12407b0a42,0x1498aadcf7ae2b345243e281ae076df6de84455d766ab6fcdaad71fab60abb2e8b980a440043cd305db09d283c895e3d" - }, - "Q": { - "x": "0x18ed3794ad43c781816c523776188deafba67ab773189b8f18c49bc7aa841cd81525171f7a5203b2a340579192403bef,0x0727d90785d179e7b5732c8a34b660335fed03b913710b60903cf4954b651ed3466dc3728e21855ae822d4a0f1d06587", - "y": "0x00764a5cf6c5f61c52c838523460eb2168b5a5b43705e19cb612e006f29b717897facfd15dd1c8874c915f6d53d0342d,0x19290bb9797c12c1d275817aa2605ebe42275b66860f0e4d04487ebc2e47c50b36edd86c685a60c20a2bd584a82b011a" - }, - "msg": "", - "u": [ - "0x07355d25caf6e7f2f0cb2812ca0e513bd026ed09dda65b177500fa31714e09ea0ded3a078b526bed3307f804d4b93b04,0x02829ce3c021339ccb5caf3e187f6370e1e2a311dec9b75363117063ab2015603ff52c3d3b98f19c2f65575e99e8b78c" - ] - }, - { - "P": { - "x": "0x108ed59fd9fae381abfd1d6bce2fd2fa220990f0f837fa30e0f27914ed6e1454db0d1ee957b219f61da6ff8be0d6441f,0x0296238ea82c6d4adb3c838ee3cb2346049c90b96d602d7bb1b469b905c9228be25c627bffee872def773d5b2a2eb57d", - "y": "0x033f90f6057aadacae7963b0a0b379dd46750c1c94a6357c99b65f63b79e321ff50fe3053330911c56b6ceea08fee656,0x153606c417e59fb331b7ae6bce4fbf7c5190c33ce9402b5ebe2b70e44fca614f3f1382a3625ed5493843d0b0a652fc3f" - }, - "Q": { - "x": "0x0f40e1d5025ecef0d850aa0bb7bbeceab21a3d4e85e6bee857805b09693051f5b25428c6be343edba5f14317fcc30143,0x02e0d261f2b9fee88b82804ec83db330caa75fbb12719cfa71ccce1c532dc4e1e79b0a6a281ed8d3817524286c8bc04c", - "y": "0x0cf4a4adc5c66da0bca4caddc6a57ecd97c8252d7526a8ff478e0dfed816c4d321b5c3039c6683ae9b1e6a3a38c9c0ae,0x11cad1646bb3768c04be2ab2bbe1f80263b7ff6f8f9488f5bc3b6850e5a3e97e20acc583613c69cf3d2bfe8489744ebb" - }, - "msg": "abc", - "u": [ - "0x138879a9559e24cecee8697b8b4ad32cced053138ab913b99872772dc753a2967ed50aabc907937aefb2439ba06cc50c,0x0a1ae7999ea9bab1dcc9ef8887a6cb6e8f1e22566015428d220b7eec90ffa70ad1f624018a9ad11e78d588bd3617f9f2" - ] - }, - { - "P": { - "x": "0x038af300ef34c7759a6caaa4e69363cafeed218a1f207e93b2c70d91a1263d375d6730bd6b6509dcac3ba5b567e85bf3,0x0da75be60fb6aa0e9e3143e40c42796edf15685cafe0279afd2a67c3dff1c82341f17effd402e4f1af240ea90f4b659b", - "y": "0x19b148cbdf163cf0894f29660d2e7bfb2b68e37d54cc83fd4e6e62c020eaa48709302ef8e746736c0e19342cc1ce3df4,0x0492f4fed741b073e5a82580f7c663f9b79e036b70ab3e51162359cec4e77c78086fe879b65ca7a47d34374c8315ac5e" - }, - "Q": { - "x": "0x13a9d4a738a85c9f917c7be36b240915434b58679980010499b9ae8d7a1bf7fbe617a15b3cd6060093f40d18e0f19456,0x16fa88754e7670366a859d6f6899ad765bf5a177abedb2740aacc9252c43f90cd0421373fbd5b2b76bb8f5c4886b5d37", - "y": "0x0a7fa7d82c46797039398253e8765a4194100b330dfed6d7fbb46d6fbf01e222088779ac336e3675c7a7a0ee05bbb6e3,0x0c6ee170ab766d11fa9457cef53253f2628010b2cffc102b3b28351eb9df6c281d3cfc78e9934769d661b72a5265338d" - }, - "msg": "abcdef0123456789", - "u": [ - "0x18c16fe362b7dbdfa102e42bdfd3e2f4e6191d479437a59db4eb716986bf08ee1f42634db66bde97d6c16bbfd342b3b8,0x0e37812ce1b146d998d5f92bdd5ada2a31bfd63dfe18311aa91637b5f279dd045763166aa1615e46a50d8d8f475f184e" - ] - }, - { - "P": { - "x": "0x0c5ae723be00e6c3f0efe184fdc0702b64588fe77dda152ab13099a3bacd3876767fa7bbad6d6fd90b3642e902b208f9,0x12c8c05c1d5fc7bfa847f4d7d81e294e66b9a78bc9953990c358945e1f042eedafce608b67fdd3ab0cb2e6e263b9b1ad", - "y": "0x04e77ddb3ede41b5ec4396b7421dd916efc68a358a0d7425bddd253547f2fb4830522358491827265dfc5bcc1928a569,0x11c624c56dbe154d759d021eec60fab3d8b852395a89de497e48504366feedd4662d023af447d66926a28076813dd646" - }, - "Q": { - "x": "0x0a08b2f639855dfdeaaed972702b109e2241a54de198b2b4cd12ad9f88fa419a6086a58d91fc805de812ea29bee427c2,0x04a7442e4cb8b42ef0f41dac9ee74e65ecad3ce0851f0746dc47568b0e7a8134121ed09ba054509232c49148aef62cda", - "y": "0x05d60b1f04212b2c87607458f71d770f43973511c260f0540eef3a565f42c7ce59aa1cea684bb2a7bcab84acd2f36c8c,0x1017aa5747ba15505ece266a86b0ca9c712f41a254b76ca04094ca442ce45ecd224bd5544cd16685d0d1b9d156dd0531" - }, - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "u": [ - "0x08d4a0997b9d52fecf99427abb721f0fa779479963315fe21c6445250de7183e3f63bfdf86570da8929489e421d4ee95,0x16cb4ccad91ec95aab070f22043916cd6a59c4ca94097f7f510043d48515526dc8eaaea27e586f09151ae613688d5a89" - ] - }, - { - "P": { - "x": "0x0ea4e7c33d43e17cc516a72f76437c4bf81d8f4eac69ac355d3bf9b71b8138d55dc10fd458be115afa798b55dac34be1,0x1565c2f625032d232f13121d3cfb476f45275c303a037faa255f9da62000c2c864ea881e2bcddd111edc4a3c0da3e88d", - "y": "0x043b6f5fe4e52c839148dc66f2b3751e69a0f6ebb3d056d6465d50d4108543ecd956e10fa1640dfd9bc0030cc2558d28,0x0f8991d2a1ad662e7b6f58ab787947f1fa607fce12dde171bc17903b012091b657e15333e11701edcf5b63ba2a561247" - }, - "Q": { - "x": "0x19592c812d5a50c5601062faba14c7d670711745311c879de1235a0a11c75aab61327bf2d1725db07ec4d6996a682886,0x0eef4fa41ddc17ed47baf447a2c498548f3c72a02381313d13bef916e240b61ce125539090d62d9fbb14a900bf1b8e90", - "y": "0x1260d6e0987eae96af9ebe551e08de22b37791d53f4db9e0d59da736e66699735793e853e26362531fe4adf99c1883e3,0x0dbace5df0a4ac4ac2f45d8fdf8aee45484576fdd6efc4f98ab9b9f4112309e628255e183022d98ea5ed6e47ca00306c" - }, - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "u": [ - "0x03f80ce4ff0ca2f576d797a3660e3f65b274285c054feccc3215c879e2c0589d376e83ede13f93c32f05da0f68fd6a10,0x006488a837c5413746d868d1efb7232724da10eca410b07d8b505b9363bdccf0a1fc0029bad07d65b15ccfe6dd25e20d" - ] - } - ] -} diff --git a/ecc/bls12381/testdata/BLS12381G2_XMD-SHA-256_SSWU_RO_.json b/ecc/bls12381/testdata/BLS12381G2_XMD-SHA-256_SSWU_RO_.json deleted file mode 100644 index 5807ee6f..00000000 --- a/ecc/bls12381/testdata/BLS12381G2_XMD-SHA-256_SSWU_RO_.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "L": "0x40", - "Z": "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaa9,0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaaa", - "ciphersuite": "BLS12381G2_XMD:SHA-256_SSWU_RO_", - "curve": "BLS12-381 G2", - "dst": "QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_RO_", - "expand": "XMD", - "field": { - "m": "0x2", - "p": "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab" - }, - "hash": "sha256", - "k": "0x80", - "map": { - "name": "SSWU" - }, - "randomOracle": true, - "vectors": [ - { - "P": { - "x": "0x0141ebfbdca40eb85b87142e130ab689c673cf60f1a3e98d69335266f30d9b8d4ac44c1038e9dcdd5393faf5c41fb78a,0x05cb8437535e20ecffaef7752baddf98034139c38452458baeefab379ba13dff5bf5dd71b72418717047f5b0f37da03d", - "y": "0x0503921d7f6a12805e72940b963c0cf3471c7b2a524950ca195d11062ee75ec076daf2d4bc358c4b190c0c98064fdd92,0x12424ac32561493f3fe3c260708a12b7c620e7be00099a974e259ddc7d1f6395c3c811cdd19f1e8dbf3e9ecfdcbab8d6" - }, - "Q0": { - "x": "0x019ad3fc9c72425a998d7ab1ea0e646a1f6093444fc6965f1cad5a3195a7b1e099c050d57f45e3fa191cc6d75ed7458c,0x171c88b0b0efb5eb2b88913a9e74fe111a4f68867b59db252ce5868af4d1254bfab77ebde5d61cd1a86fb2fe4a5a1c1d", - "y": "0x0ba10604e62bdd9eeeb4156652066167b72c8d743b050fb4c1016c31b505129374f76e03fa127d6a156213576910fef3,0x0eb22c7a543d3d376e9716a49b72e79a89c9bfe9feee8533ed931cbb5373dde1fbcd7411d8052e02693654f71e15410a" - }, - "Q1": { - "x": "0x113d2b9cd4bd98aee53470b27abc658d91b47a78a51584f3d4b950677cfb8a3e99c24222c406128c91296ef6b45608be,0x13855912321c5cb793e9d1e88f6f8d342d49c0b0dbac613ee9e17e3c0b3c97dfbb5a49cc3fb45102fdbaf65e0efe2632", - "y": "0x0fd3def0b7574a1d801be44fde617162aa2e89da47f464317d9bb5abc3a7071763ce74180883ad7ad9a723a9afafcdca,0x056f617902b3c0d0f78a9a8cbda43a26b65f602f8786540b9469b060db7b38417915b413ca65f875c130bebfaa59790c" - }, - "msg": "", - "u": [ - "0x03dbc2cce174e91ba93cbb08f26b917f98194a2ea08d1cce75b2b9cc9f21689d80bd79b594a613d0a68eb807dfdc1cf8,0x05a2acec64114845711a54199ea339abd125ba38253b70a92c876df10598bd1986b739cad67961eb94f7076511b3b39a", - "0x02f99798e8a5acdeed60d7e18e9120521ba1f47ec090984662846bc825de191b5b7641148c0dbc237726a334473eee94,0x145a81e418d4010cc027a68f14391b30074e89e60ee7a22f87217b2f6eb0c4b94c9115b436e6fa4607e95a98de30a435" - ] - }, - { - "P": { - "x": "0x02c2d18e033b960562aae3cab37a27ce00d80ccd5ba4b7fe0e7a210245129dbec7780ccc7954725f4168aff2787776e6,0x139cddbccdc5e91b9623efd38c49f81a6f83f175e80b06fc374de9eb4b41dfe4ca3a230ed250fbe3a2acf73a41177fd8", - "y": "0x1787327b68159716a37440985269cf584bcb1e621d3a7202be6ea05c4cfe244aeb197642555a0645fb87bf7466b2ba48,0x00aa65dae3c8d732d10ecd2c50f8a1baf3001578f71c694e03866e9f3d49ac1e1ce70dd94a733534f106d4cec0eddd16" - }, - "Q0": { - "x": "0x12b2e525281b5f4d2276954e84ac4f42cf4e13b6ac4228624e17760faf94ce5706d53f0ca1952f1c5ef75239aeed55ad,0x05d8a724db78e570e34100c0bc4a5fa84ad5839359b40398151f37cff5a51de945c563463c9efbdda569850ee5a53e77", - "y": "0x02eacdc556d0bdb5d18d22f23dcb086dd106cad713777c7e6407943edbe0b3d1efe391eedf11e977fac55f9b94f2489c,0x04bbe48bfd5814648d0b9e30f0717b34015d45a861425fabc1ee06fdfce36384ae2c808185e693ae97dcde118f34de41" - }, - "Q1": { - "x": "0x19f18cc5ec0c2f055e47c802acc3b0e40c337256a208001dde14b25afced146f37ea3d3ce16834c78175b3ed61f3c537,0x15b0dadc256a258b4c68ea43605dffa6d312eef215c19e6474b3e101d33b661dfee43b51abbf96fee68fc6043ac56a58", - "y": "0x05e47c1781286e61c7ade887512bd9c2cb9f640d3be9cf87ea0bad24bd0ebfe946497b48a581ab6c7d4ca74b5147287f,0x19f98db2f4a1fcdf56a9ced7b320ea9deecf57c8e59236b0dc21f6ee7229aa9705ce9ac7fe7a31c72edca0d92370c096" - }, - "msg": "abc", - "u": [ - "0x15f7c0aa8f6b296ab5ff9c2c7581ade64f4ee6f1bf18f55179ff44a2cf355fa53dd2a2158c5ecb17d7c52f63e7195771,0x01c8067bf4c0ba709aa8b9abc3d1cef589a4758e09ef53732d670fd8739a7274e111ba2fcaa71b3d33df2a3a0c8529dd", - "0x187111d5e088b6b9acfdfad078c4dacf72dcd17ca17c82be35e79f8c372a693f60a033b461d81b025864a0ad051a06e4,0x08b852331c96ed983e497ebc6dee9b75e373d923b729194af8e72a051ea586f3538a6ebb1e80881a082fa2b24df9f566" - ] - }, - { - "P": { - "x": "0x121982811d2491fde9ba7ed31ef9ca474f0e1501297f68c298e9f4c0028add35aea8bb83d53c08cfc007c1e005723cd0,0x190d119345b94fbd15497bcba94ecf7db2cbfd1e1fe7da034d26cbba169fb3968288b3fafb265f9ebd380512a71c3f2c", - "y": "0x05571a0f8d3c08d094576981f4a3b8eda0a8e771fcdcc8ecceaf1356a6acf17574518acb506e435b639353c2e14827c8,0x0bb5e7572275c567462d91807de765611490205a941a5a6af3b1691bfe596c31225d3aabdf15faff860cb4ef17c7c3be" - }, - "Q0": { - "x": "0x0f48f1ea1318ddb713697708f7327781fb39718971d72a9245b9731faaca4dbaa7cca433d6c434a820c28b18e20ea208,0x06051467c8f85da5ba2540974758f7a1e0239a5981de441fdd87680a995649c211054869c50edbac1f3a86c561ba3162", - "y": "0x168b3d6df80069dbbedb714d41b32961ad064c227355e1ce5fac8e105de5e49d77f0c64867f3834848f152497eb76333,0x134e0e8331cee8cb12f9c2d0742714ed9eee78a84d634c9a95f6a7391b37125ed48bfc6e90bf3546e99930ff67cc97bc" - }, - "Q1": { - "x": "0x004fd03968cd1c99a0dd84551f44c206c84dcbdb78076c5bfee24e89a92c8508b52b88b68a92258403cbe1ea2da3495f,0x1674338ea298281b636b2eb0fe593008d03171195fd6dcd4531e8a1ed1f02a72da238a17a635de307d7d24aa2d969a47", - "y": "0x0dc7fa13fff6b12558419e0a1e94bfc3cfaf67238009991c5f24ee94b632c3d09e27eca329989aee348a67b50d5e236c,0x169585e164c131103d85324f2d7747b23b91d66ae5d947c449c8194a347969fc6bbd967729768da485ba71868df8aed2" - }, - "msg": "abcdef0123456789", - "u": [ - "0x0313d9325081b415bfd4e5364efaef392ecf69b087496973b229303e1816d2080971470f7da112c4eb43053130b785e1,0x062f84cb21ed89406890c051a0e8b9cf6c575cf6e8e18ecf63ba86826b0ae02548d83b483b79e48512b82a6c0686df8f", - "0x1739123845406baa7be5c5dc74492051b6d42504de008c635f3535bb831d478a341420e67dcc7b46b2e8cba5379cca97,0x01897665d9cb5db16a27657760bbea7951f67ad68f8d55f7113f24ba6ddd82caef240a9bfa627972279974894701d975" - ] - }, - { - "P": { - "x": "0x19a84dd7248a1066f737cc34502ee5555bd3c19f2ecdb3c7d9e24dc65d4e25e50d83f0f77105e955d78f4762d33c17da,0x0934aba516a52d8ae479939a91998299c76d39cc0c035cd18813bec433f587e2d7a4fef038260eef0cef4d02aae3eb91", - "y": "0x14f81cd421617428bc3b9fe25afbb751d934a00493524bc4e065635b0555084dd54679df1536101b2c979c0152d09192,0x09bcccfa036b4847c9950780733633f13619994394c23ff0b32fa6b795844f4a0673e20282d07bc69641cee04f5e5662" - }, - "Q0": { - "x": "0x09eccbc53df677f0e5814e3f86e41e146422834854a224bf5a83a50e4cc0a77bfc56718e8166ad180f53526ea9194b57,0x0c3633943f91daee715277bd644fba585168a72f96ded64fc5a384cce4ec884a4c3c30f08e09cd2129335dc8f67840ec", - "y": "0x0eb6186a0457d5b12d132902d4468bfeb7315d83320b6c32f1c875f344efcba979952b4aa418589cb01af712f98cc555,0x119e3cf167e69eb16c1c7830e8df88856d48be12e3ff0a40791a5cd2f7221311d4bf13b1847f371f467357b3f3c0b4c7" - }, - "Q1": { - "x": "0x0eb3aabc1ddfce17ff18455fcc7167d15ce6b60ddc9eb9b59f8d40ab49420d35558686293d046fc1e42f864b7f60e381,0x198bdfb19d7441ebcca61e8ff774b29d17da16547d2c10c273227a635cacea3f16826322ae85717630f0867539b5ed8b", - "y": "0x0aaf1dee3adf3ed4c80e481c09b57ea4c705e1b8d25b897f0ceeec3990748716575f92abff22a1c8f4582aff7b872d52,0x0d058d9061ed27d4259848a06c96c5ca68921a5d269b078650c882cb3c2bd424a8702b7a6ee4e0ead9982baf6843e924" - }, - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "u": [ - "0x025820cefc7d06fd38de7d8e370e0da8a52498be9b53cba9927b2ef5c6de1e12e12f188bbc7bc923864883c57e49e253,0x034147b77ce337a52e5948f66db0bab47a8d038e712123bb381899b6ab5ad20f02805601e6104c29df18c254b8618c7b", - "0x0930315cae1f9a6017c3f0c8f2314baa130e1cf13f6532bff0a8a1790cd70af918088c3db94bda214e896e1543629795,0x10c4df2cacf67ea3cb3108b00d4cbd0b3968031ebc8eac4b1ebcefe84d6b715fde66bef0219951ece29d1facc8a520ef" - ] - }, - { - "P": { - "x": "0x01a6ba2f9a11fa5598b2d8ace0fbe0a0eacb65deceb476fbbcb64fd24557c2f4b18ecfc5663e54ae16a84f5ab7f62534,0x11fca2ff525572795a801eed17eb12785887c7b63fb77a42be46ce4a34131d71f7a73e95fee3f812aea3de78b4d01569", - "y": "0x0b6798718c8aed24bc19cb27f866f1c9effcdbf92397ad6448b5c9db90d2b9da6cbabf48adc1adf59a1a28344e79d57e,0x03a47f8e6d1763ba0cad63d6114c0accbef65707825a511b251a660a9b3994249ae4e63fac38b23da0c398689ee2ab52" - }, - "Q0": { - "x": "0x17cadf8d04a1a170f8347d42856526a24cc466cb2ddfd506cff01191666b7f944e31244d662c904de5440516a2b09004,0x0d13ba91f2a8b0051cf3279ea0ee63a9f19bc9cb8bfcc7d78b3cbd8cc4fc43ba726774b28038213acf2b0095391c523e", - "y": "0x17ef19497d6d9246fa94d35575c0f8d06ee02f21a284dbeaa78768cb1e25abd564e3381de87bda26acd04f41181610c5,0x12c3c913ba4ed03c24f0721a81a6be7430f2971ffca8fd1729aafe496bb725807531b44b34b59b3ae5495e5a2dcbd5c8" - }, - "Q1": { - "x": "0x16ec57b7fe04c71dfe34fb5ad84dbce5a2dbbd6ee085f1d8cd17f45e8868976fc3c51ad9eeda682c7869024d24579bfd,0x13103f7aace1ae1420d208a537f7d3a9679c287208026e4e3439ab8cd534c12856284d95e27f5e1f33eec2ce656533b0", - "y": "0x0958b2c4c2c10fcef5a6c59b9e92c4a67b0fae3e2e0f1b6b5edad9c940b8f3524ba9ebbc3f2ceb3cfe377655b3163bd7,0x0ccb594ed8bd14ca64ed9cb4e0aba221be540f25dd0d6ba15a4a4be5d67bcf35df7853b2d8dad3ba245f1ea3697f66aa" - }, - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "u": [ - "0x190b513da3e66fc9a3587b78c76d1d132b1152174d0b83e3c1114066392579a45824c5fa17649ab89299ddd4bda54935,0x12ab625b0fe0ebd1367fe9fac57bb1168891846039b4216b9d94007b674de2d79126870e88aeef54b2ec717a887dcf39", - "0x0e6a42010cf435fb5bacc156a585e1ea3294cc81d0ceb81924d95040298380b164f702275892cedd81b62de3aba3f6b5,0x117d9a0defc57a33ed208428cb84e54c85a6840e7648480ae428838989d25d97a0af8e3255be62b25c2a85630d2dddd8" - ] - } - ] -} diff --git a/ecc/bls12381/testdata/g1_compressed_valid_test_vectors.dat b/ecc/bls12381/testdata/g1_compressed_valid_test_vectors.dat deleted file mode 100644 index ea8cd676..00000000 Binary files a/ecc/bls12381/testdata/g1_compressed_valid_test_vectors.dat and /dev/null differ diff --git a/ecc/bls12381/testdata/g1_uncompressed_valid_test_vectors.dat b/ecc/bls12381/testdata/g1_uncompressed_valid_test_vectors.dat deleted file mode 100644 index 86abfba9..00000000 Binary files a/ecc/bls12381/testdata/g1_uncompressed_valid_test_vectors.dat and /dev/null differ diff --git a/ecc/bls12381/testdata/g2_compressed_valid_test_vectors.dat b/ecc/bls12381/testdata/g2_compressed_valid_test_vectors.dat deleted file mode 100644 index a40bbe25..00000000 Binary files a/ecc/bls12381/testdata/g2_compressed_valid_test_vectors.dat and /dev/null differ diff --git a/ecc/bls12381/testdata/g2_uncompressed_valid_test_vectors.dat b/ecc/bls12381/testdata/g2_uncompressed_valid_test_vectors.dat deleted file mode 100644 index 92e4bc52..00000000 Binary files a/ecc/bls12381/testdata/g2_uncompressed_valid_test_vectors.dat and /dev/null differ diff --git a/ecc/doc.go b/ecc/doc.go deleted file mode 100644 index ab758514..00000000 --- a/ecc/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package ecc provides implementation of arithmetic on some elliptic curves. -package ecc diff --git a/ecc/fourq/curve.go b/ecc/fourq/curve.go deleted file mode 100644 index 8ea29739..00000000 --- a/ecc/fourq/curve.go +++ /dev/null @@ -1,98 +0,0 @@ -package fourq - -import ( - "math/big" - - "github.com/quantumcoinproject/circl/internal/conv" -) - -// Size of scalars used for point multiplication. -const Size = 32 - -// Point represents an affine point of the curve. The identity is (0,1). -type Point struct{ X, Y Fq } - -func (P Point) String() string { return "(x: " + P.X.String() + ", y: " + P.Y.String() + ")" } - -// CurveParams contains the parameters of the elliptic curve. -type CurveParams struct { - Name string // The canonical name of the curve. - P *big.Int // The order of the underlying field Fp. - N *big.Int // The order of the generator point. - G Point // This is the generator point. -} - -// Params returns the parameters for the curve. -func Params() *CurveParams { - params := CurveParams{Name: "FourQ"} - params.P = conv.Uint64Le2BigInt(prime[:]) - params.N = conv.Uint64Le2BigInt(orderGenerator[:]) - params.G.X = genX - params.G.Y = genY - return ¶ms -} - -// IsOnCurve reports whether the given P=(x,y) lies on the curve. -func (P *Point) IsOnCurve() bool { - var _P pointR1 - P.toR1(&_P) - return _P.IsOnCurve() -} - -// SetGenerator assigns to P the generator point G. -func (P *Point) SetGenerator() { P.X = genX; P.Y = genY } - -// SetIdentity assigns to P the identity element. -func (P *Point) SetIdentity() { - var _P pointR1 - _P.SetIdentity() - P.fromR1(&_P) -} - -// IsIdentity returns true if P is the identity element. -func (P *Point) IsIdentity() bool { - var _P pointR1 - P.toR1(&_P) - return _P.IsIdentity() -} - -// Add calculates a point addition P = Q + R. -func (P *Point) Add(Q, R *Point) { - var _Q, _R pointR1 - var _R2 pointR2 - Q.toR1(&_Q) - R.toR1(&_R) - _R2.FromR1(&_R) - _Q.add(&_R2) - P.fromR1(&_Q) -} - -// ScalarMult calculates P = k*Q, where Q is an N-torsion point. -func (P *Point) ScalarMult(k *[Size]byte, Q *Point) { - var _P, _Q pointR1 - Q.toR1(&_Q) - _Q.ClearCofactor() - _P.ScalarMult(k, &_Q) - P.fromR1(&_P) -} - -// ScalarBaseMult calculates P = k*G, where G is the generator point. -func (P *Point) ScalarBaseMult(k *[Size]byte) { - var _P pointR1 - _P.ScalarBaseMult(k) - P.fromR1(&_P) -} - -func (P *Point) fromR1(Q *pointR1) { - Q.ToAffine() - P.X = Q.X - P.Y = Q.Y -} - -func (P *Point) toR1(projP *pointR1) { - projP.X = P.X - projP.Y = P.Y - projP.Ta = P.X - projP.Tb = P.Y - projP.Z.setOne() -} diff --git a/ecc/fourq/curve_test.go b/ecc/fourq/curve_test.go deleted file mode 100644 index 696a754d..00000000 --- a/ecc/fourq/curve_test.go +++ /dev/null @@ -1,108 +0,0 @@ -package fourq - -import ( - "crypto/rand" - "testing" - - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/internal/test" -) - -func (P *Point) random() { - var _P pointR1 - _P.random() - P.fromR1(&_P) -} - -func TestMarshal(t *testing.T) { - testTimes := 1 << 10 - var buf, k [Size]byte - var P, Q, R Point - t.Run("k*um(P)=kP", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - P.random() - _, _ = rand.Read(k[:]) - - P.Marshal(&buf) - if ok := Q.Unmarshal(&buf); !ok { - test.ReportError(t, ok, true) - } - Q.ScalarMult(&k, &Q) - R.ScalarMult(&k, &P) - - got := Q.X - want := R.X - if got != want { - test.ReportError(t, got, want, P, k) - } - got = Q.Y - want = R.Y - if got != want { - test.ReportError(t, got, want, P, k) - } - } - }) - t.Run("m(kP)~=m(-kP)", func(t *testing.T) { - c := Params() - var minusK, encQ, encR [Size]byte - for i := 0; i < testTimes; i++ { - P.random() - bigK, _ := rand.Int(rand.Reader, c.N) - conv.BigInt2BytesLe(k[:], bigK) - bigK.Neg(bigK).Mod(bigK, c.N) - conv.BigInt2BytesLe(minusK[:], bigK) - Q.ScalarMult(&k, &P) - R.ScalarMult(&minusK, &P) - Q.Marshal(&encQ) - R.Marshal(&encR) - - got := encQ[31] >> 7 - want := 1 - (encR[31] >> 7) - encQ[31] &= 0x7F - encR[31] &= 0x7F - - if encQ != encR { - test.ReportError(t, encQ, encR, P, k) - } - if got != want { - test.ReportError(t, got, want, P, k) - } - } - }) -} - -func BenchmarkCurve(b *testing.B) { - var P, Q, R Point - var k [32]byte - - _, _ = rand.Read(k[:]) - P.ScalarBaseMult(&k) - _, _ = rand.Read(k[:]) - Q.ScalarBaseMult(&k) - _, _ = rand.Read(k[:]) - R.ScalarBaseMult(&k) - - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.Add(&Q, &R) - } - }) - - b.Run("Double", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.Add(&Q, &Q) - } - }) - - b.Run("ScalarBaseMult", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.ScalarBaseMult(&k) - } - }) - - b.Run("ScalarMult", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.ScalarMult(&k, &Q) - } - }) -} diff --git a/ecc/fourq/doc.go b/ecc/fourq/doc.go deleted file mode 100644 index a6a771b5..00000000 --- a/ecc/fourq/doc.go +++ /dev/null @@ -1,9 +0,0 @@ -// Package fourq provides elliptic curve operations over FourQ curve. -// -// FourQ is a high-speed elliptic curve at the 128-bit security level. This package -// contains an AMD64-optimized implementation. In particular, this package does -// not implement FourQ's endomorphisms or lattice reduction techniques. -// -// References: -// - https://eprint.iacr.org/2015/565 -package fourq diff --git a/ecc/fourq/fp.go b/ecc/fourq/fp.go deleted file mode 100644 index 976bac47..00000000 --- a/ecc/fourq/fp.go +++ /dev/null @@ -1,113 +0,0 @@ -package fourq - -import ( - "math/big" - - "github.com/quantumcoinproject/circl/internal/conv" -) - -var modulusP = Fp{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, -} - -// SizeFp is the length in bytes to represent an element in the base field. -const SizeFp = 16 - -// Fp is an element (in littleEndian order) of prime field GF(2^127-1). -type Fp [SizeFp]byte - -func (f *Fp) String() string { return conv.BytesLe2Hex(f[:]) } -func (f *Fp) isZero() bool { fpMod(f); return *f == Fp{} } -func (f *Fp) toBigInt() *big.Int { fpMod(f); return conv.BytesLe2BigInt(f[:]) } -func (f *Fp) setBigInt(b *big.Int) { conv.BigInt2BytesLe((*f)[:], b); fpMod(f) } -func (f *Fp) toBytes(buf []byte) { - if len(buf) == SizeFp { - fpMod(f) - copy(buf, f[:]) - } -} - -func (f *Fp) fromBytes(buf []byte) bool { - if len(buf) == SizeFp { - if (buf[SizeFp-1] >> 7) == 0 { - copy(f[:], buf) - fpMod(f) - return true - } - } - return false -} -func fpNeg(c, a *Fp) { fpSub(c, &modulusP, a) } - -// fqSgn returns the sign of an element. -// -// -1 if x > (p+1)/2 -// 0 if x == 0 -// +1 if x > (p+1)/2. -func fpSgn(c *Fp) int { - s := 0 - if !c.isZero() { - b := int(c[SizeFp-1]>>6) & 0x1 - s = 1 - (b << 1) - } - return s -} - -// fpTwo1251 sets c = a^(2^125-1). -func fpTwo1251(c, a *Fp) { - t1, t2, t3, t4, t5 := &Fp{}, &Fp{}, &Fp{}, &Fp{}, &Fp{} - - fpSqr(t2, a) - fpMul(t2, t2, a) - fpSqr(t3, t2) - fpSqr(t3, t3) - fpMul(t3, t3, t2) - fpSqr(t4, t3) - fpSqr(t4, t4) - fpSqr(t4, t4) - fpSqr(t4, t4) - fpMul(t4, t4, t3) - fpSqr(t5, t4) - for i := 0; i < 7; i++ { - fpSqr(t5, t5) - } - fpMul(t5, t5, t4) - fpSqr(t2, t5) - for i := 0; i < 15; i++ { - fpSqr(t2, t2) - } - fpMul(t2, t2, t5) - fpSqr(t1, t2) - for i := 0; i < 31; i++ { - fpSqr(t1, t1) - } - fpMul(t1, t1, t2) - for i := 0; i < 32; i++ { - fpSqr(t1, t1) - } - fpMul(t1, t2, t1) - for i := 0; i < 16; i++ { - fpSqr(t1, t1) - } - fpMul(t1, t1, t5) - for i := 0; i < 8; i++ { - fpSqr(t1, t1) - } - fpMul(t1, t1, t4) - for i := 0; i < 4; i++ { - fpSqr(t1, t1) - } - fpMul(t1, t1, t3) - fpSqr(t1, t1) - fpMul(c, a, t1) -} - -// fpInv sets z to a^(-1) mod p. -func fpInv(z, a *Fp) { - t := &Fp{} - fpTwo1251(t, a) - fpSqr(t, t) - fpSqr(t, t) - fpMul(z, t, a) -} diff --git a/ecc/fourq/fp_amd64.go b/ecc/fourq/fp_amd64.go deleted file mode 100644 index da1ba4b2..00000000 --- a/ecc/fourq/fp_amd64.go +++ /dev/null @@ -1,28 +0,0 @@ -//go:build amd64 && !purego -// +build amd64,!purego - -package fourq - -import ( - "golang.org/x/sys/cpu" -) - -var hasBMI2 = cpu.X86.HasBMI2 //nolint - -//go:noescape -func fpMod(c *Fp) - -//go:noescape -func fpAdd(c, a, b *Fp) - -//go:noescape -func fpSub(c, a, b *Fp) - -//go:noescape -func fpMul(c, a, b *Fp) - -//go:noescape -func fpSqr(c, a *Fp) - -//go:noescape -func fpHlf(c, a *Fp) diff --git a/ecc/fourq/fp_amd64.h b/ecc/fourq/fp_amd64.h deleted file mode 100644 index 17b5cf30..00000000 --- a/ecc/fourq/fp_amd64.h +++ /dev/null @@ -1,85 +0,0 @@ -// CHECK_BMI2 triggers bmi2 if supported, -// otherwise it fallbacks to legacy code. -#define CHECK_BMI2(label, legacy, bmi2) \ - CMPB ·hasBMI2(SB), $0 \ - JE label \ - bmi2 \ - RET \ - label: \ - legacy \ - RET - -#define _fpReduce(c0, c1) \ - BTRQ $63, c1 \ - ADCQ $0, c0 \ - ADCQ $0, c1 - -// _fpMod: c = c mod p -// Uses: AX, DX, FLAGS -// Instr: x86_64 -#define _fpMod(c) \ - MOVQ 0+c, AX \ - MOVQ 8+c, DX \ - SUBQ ·modulusP+0(SB), AX \ - SBBQ ·modulusP+8(SB), DX \ - BTRQ $63, DX \ - SBBQ $0, AX \ - SBBQ $0, DX \ - _fpReduce(AX, DX) \ - _fpReduce(AX, DX) \ - MOVQ AX, 0+c \ - MOVQ DX, 8+c - -// _fpAdd: c = a + b -// Uses: AX, DX, FLAGS -// Instr: x86_64 -#define _fpAdd(c,a,b) \ - MOVQ 0+a, AX \ - MOVQ 8+a, DX \ - ADDQ 0+b, AX \ - ADCQ 8+b, DX \ - _fpReduce(AX, DX) \ - MOVQ AX, 0+c \ - MOVQ DX, 8+c - -// _fpSub: c = a - b -// Uses: AX, DX, FLAGS -// Instr: x86_64 -#define _fpSub(c,a,b) \ - MOVQ 0+a, AX \ - MOVQ 8+a, DX \ - SUBQ 0+b, AX \ - SBBQ 8+b, DX \ - BTRQ $63, DX \ - SBBQ $0, AX \ - SBBQ $0, DX \ - MOVQ AX, 0+c \ - MOVQ DX, 8+c - -#define _fpMulLeg(C2, C1, C0, a, b) \ - MOVQ $0, C2 \ - MOVQ 0+b, CX \ - MOVQ 0+a, AX \ - MULQ CX \ - MOVQ AX, C0 \ - MOVQ DX, C1 \ - MOVQ 8+a, AX \ - MULQ CX \ - SHLQ $1,DX \ - ADDQ DX,C0 \ - ADCQ AX, C1 \ - ADCQ $0, C2 \ - MOVQ 8+b, CX \ - MOVQ 0+a, AX \ - MULQ CX \ - SHLQ $1,DX \ - ADDQ DX,C0 \ - ADCQ AX, C1 \ - ADCQ $0, C2 \ - MOVQ 8+a, AX \ - MULQ CX \ - SHLQ $1,AX,DX \ - SHLQ $1,AX \ - ADDQ AX,C0 \ - ADCQ DX, C1 \ - ADCQ $0, C2 diff --git a/ecc/fourq/fp_amd64.s b/ecc/fourq/fp_amd64.s deleted file mode 100644 index 9543bd26..00000000 --- a/ecc/fourq/fp_amd64.s +++ /dev/null @@ -1,100 +0,0 @@ -// +build amd64,!purego - -#include "textflag.h" -#include "fp_amd64.h" - -// fpModp sets e to zero if it is equal to p. This is the only case where c -// will not naturally be reduced to canonical form. -// func fpMod(c *fp) -TEXT ·fpMod(SB),0,$0-8 - MOVQ c+0(FP), DI - _fpMod(0(DI)) - RET - -// func fpAdd(c, a, b *fp) -TEXT ·fpAdd(SB),0,$0-24 - MOVQ c+0(FP), DI - MOVQ a+8(FP), SI - MOVQ b+16(FP), BX - _fpAdd(0(DI), 0(SI), 0(BX)) - RET - -// func fpSub(c, a, b *fp) -TEXT ·fpSub(SB),0,$0-24 - MOVQ c+0(FP), DI - MOVQ a+8(FP), SI - MOVQ b+16(FP), BX - _fpSub(0(DI), 0(SI), 0(BX)) - RET - -// func fpHlf(c, a *fp) -TEXT ·fpHlf(SB),0,$0-16 - MOVQ a+8(FP), DI - MOVQ 0(DI), AX - MOVQ 8(DI), BX - - SHLQ $1, BX - SHRQ $1, AX, BX - SHRQ $1, BX, AX - SHRQ $1, BX - - MOVQ c+0(FP), DI - MOVQ AX, 0(DI) - MOVQ BX, 8(DI) - RET - -// func fpMul(c, a, b *fp) -TEXT ·fpMul(SB),0,$0-24 - MOVQ a+8(FP), DI - MOVQ b+16(FP), SI - _fpMulLeg(R10, R9, R8, 0(DI), 0(SI)) - SHLQ $1, R10 - BTRQ $63, R9 - ADCQ R10, R8 - ADCQ $0, R9 - _fpReduce(R8, R9) - - MOVQ c+0(FP), DI - MOVQ R8, 0(DI) - MOVQ R9, 8(DI) - RET - -// func fpSqr(c, a *fp) -TEXT ·fpSqr(SB),0,$0-16 - MOVQ a+8(FP), DI - MOVQ $0, CX - - MOVQ 0(DI), AX - MULQ 0(DI) - MOVQ AX, R8 - MOVQ DX, R9 - - MOVQ 0(DI), AX - MULQ 8(DI) - SHLQ $1, DX - ADDQ DX, R8 - ADCQ AX, R9 - ADCQ $0, CX - ADDQ DX, R8 - ADCQ AX, R9 - ADCQ $0, CX - - MOVQ 8(DI), AX - MULQ 8(DI) - SHLQ $1, DX - SHLQ $1, AX - ADCQ $0, DX - ADDQ AX, R8 - ADCQ DX, R9 - ADCQ $0, CX - - SHLQ $1, CX - BTRQ $63, R9 - ADCQ CX, R8 - ADCQ $0, R9 - _fpReduce(R8, R9) - - MOVQ c+0(FP), DI - MOVQ R8, 0(DI) - MOVQ R9, 8(DI) - RET diff --git a/ecc/fourq/fp_generic.go b/ecc/fourq/fp_generic.go deleted file mode 100644 index dc7f5508..00000000 --- a/ecc/fourq/fp_generic.go +++ /dev/null @@ -1,97 +0,0 @@ -//go:build go1.12 -// +build go1.12 - -package fourq - -import ( - "encoding/binary" - "math/bits" -) - -func fpModGeneric(c *Fp) { fpSubGeneric(c, c, &modulusP) } - -func fpAddGeneric(c, a, b *Fp) { - a0 := binary.LittleEndian.Uint64(a[0*8 : 1*8]) - a1 := binary.LittleEndian.Uint64(a[1*8 : 2*8]) - - b0 := binary.LittleEndian.Uint64(b[0*8 : 1*8]) - b1 := binary.LittleEndian.Uint64(b[1*8 : 2*8]) - - c0, x := bits.Add64(a0, b0, 0) - c1, _ := bits.Add64(a1, b1, x) - c1, x = bits.Add64(c1, c1, 0) - c0, x = bits.Add64(c0, 0, x) - c1, _ = bits.Add64(c1>>1, 0, x) - - binary.LittleEndian.PutUint64(c[0*8:1*8], c0) - binary.LittleEndian.PutUint64(c[1*8:2*8], c1) -} - -func fpSubGeneric(c, a, b *Fp) { - a0 := binary.LittleEndian.Uint64(a[0*8 : 1*8]) - a1 := binary.LittleEndian.Uint64(a[1*8 : 2*8]) - - b0 := binary.LittleEndian.Uint64(b[0*8 : 1*8]) - b1 := binary.LittleEndian.Uint64(b[1*8 : 2*8]) - - c0, x := bits.Sub64(a0, b0, 0) - c1, _ := bits.Sub64(a1, b1, x) - c1, x = bits.Add64(c1, c1, 0) - c0, x = bits.Sub64(c0, 0, x) - c1, _ = bits.Sub64(c1>>1, 0, x) - - binary.LittleEndian.PutUint64(c[0*8:1*8], c0) - binary.LittleEndian.PutUint64(c[1*8:2*8], c1) -} - -func fpMulGeneric(c, a, b *Fp) { - a0 := binary.LittleEndian.Uint64(a[0*8 : 1*8]) - a1 := binary.LittleEndian.Uint64(a[1*8 : 2*8]) - - b0 := binary.LittleEndian.Uint64(b[0*8 : 1*8]) - b1 := binary.LittleEndian.Uint64(b[1*8 : 2*8]) - - c1, c0 := bits.Mul64(a0, b0) - hi, lo := bits.Mul64(a0, b1) - c0, x := bits.Add64(c0, hi<<1, 0) - c1, x = bits.Add64(c1, lo, x) - c2, _ := bits.Add64(0, 0, x) - - hi, lo = bits.Mul64(a1, b0) - c0, x = bits.Add64(c0, hi<<1, 0) - c1, x = bits.Add64(c1, lo, x) - c2, _ = bits.Add64(c2, 0, x) - - hi, lo = bits.Mul64(a1, b1) - lo, x = bits.Add64(lo, lo, 0) - hi, _ = bits.Add64(hi, hi, x) - - c0, x = bits.Add64(c0, lo, 0) - c1, x = bits.Add64(c1, hi, x) - c2, _ = bits.Add64(c2, 0, x) - - c1, x = bits.Add64(c1, c1, 0) - c0, x = bits.Add64(c0, c2<<1, x) - c1, _ = bits.Add64(c1>>1, 0, x) - - c1, x = bits.Add64(c1, c1, 0) - c0, x = bits.Add64(c0, 0, x) - c1, _ = bits.Add64(c1>>1, 0, x) - - binary.LittleEndian.PutUint64(c[0*8:1*8], c0) - binary.LittleEndian.PutUint64(c[1*8:2*8], c1) -} - -func fpSqrGeneric(c, a *Fp) { fpMulGeneric(c, a, a) } - -func fpHlfGeneric(c, a *Fp) { - a0 := binary.LittleEndian.Uint64(a[0*8 : 1*8]) - a1 := binary.LittleEndian.Uint64(a[1*8 : 2*8]) - - hlf := a0 & 0x1 - c0 := (a1 << 63) | (a0 >> 1) - c1 := (hlf << 62) | (a1 >> 1) - - binary.LittleEndian.PutUint64(c[0*8:1*8], c0) - binary.LittleEndian.PutUint64(c[1*8:2*8], c1) -} diff --git a/ecc/fourq/fp_noasm.go b/ecc/fourq/fp_noasm.go deleted file mode 100644 index aa35f521..00000000 --- a/ecc/fourq/fp_noasm.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build !amd64 || purego -// +build !amd64 purego - -package fourq - -func fpMod(c *Fp) { fpModGeneric(c) } -func fpAdd(c, a, b *Fp) { fpAddGeneric(c, a, b) } -func fpSub(c, a, b *Fp) { fpSubGeneric(c, a, b) } -func fpMul(c, a, b *Fp) { fpMulGeneric(c, a, b) } -func fpSqr(c, a *Fp) { fpSqrGeneric(c, a) } -func fpHlf(c, a *Fp) { fpHlfGeneric(c, a) } diff --git a/ecc/fourq/fp_test.go b/ecc/fourq/fp_test.go deleted file mode 100644 index de1828ed..00000000 --- a/ecc/fourq/fp_test.go +++ /dev/null @@ -1,339 +0,0 @@ -package fourq - -import ( - "crypto/rand" - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -type ( - tFpAdd = func(z, x, y *Fp) - tFpSub = func(z, x, y *Fp) - tFpMul = func(z, x, y *Fp) - tFpSqr = func(z, x *Fp) - tFpHlf = func(z, x *Fp) - tFpModp = func(z *Fp) -) - -func getModulus() *big.Int { - p := big.NewInt(1) - return p.Lsh(p, 127).Sub(p, big.NewInt(1)) -} - -func TestFpSign(t *testing.T) { - const testTimes = 1 << 9 - P := getModulus() - x := &Fp{} - var P1div2 big.Int - P1div2.Add(P, big.NewInt(1)).Rsh(&P1div2, 1) // (p+1)/2 - - // Verifying Sign(0) = 0 - x.setBigInt(big.NewInt(0)) - got := fpSgn(x) - want := 0 - if got != want { - test.ReportError(t, got, want, x) - } - - // Verifying Sign(P) = 0 - x.setBigInt(P) - got = fpSgn(x) - want = 0 - if got != want { - test.ReportError(t, got, want, x) - } - - // Verifying Sign( (p+1)/2 ) = -1 - x.setBigInt(&P1div2) - got = fpSgn(x) - want = -1 - if got != want { - test.ReportError(t, got, want, x) - } - - // Verifying x be a non-zero positive - for i := 0; i < testTimes; i++ { - bigX, _ := rand.Int(rand.Reader, &P1div2) - x.setBigInt(bigX) - got = fpSgn(x) - want = 1 - if got != want { - test.ReportError(t, got, want, x) - } - } - // Verifying x be a non-zero negative - for i := 0; i < testTimes; i++ { - bigX, _ := rand.Int(rand.Reader, &P1div2) - bigX.Add(bigX, &P1div2) - x.setBigInt(bigX) - got = fpSgn(x) - want = -1 - if got != want { - test.ReportError(t, got, want, x) - } - } -} - -func TestFpIsZero(t *testing.T) { - P := getModulus() - x := &Fp{} - // Verifying x=0 - x.setBigInt(big.NewInt(0)) - got := x.isZero() - want := true - if got != want { - test.ReportError(t, got, want, x) - } - - // Verifying x=P goes to 0 - x.setBigInt(P) - got = x.isZero() - want = true - if got != want { - test.ReportError(t, got, want, x) - } - - // Verifying x!=0 - _, _ = rand.Read(x[:]) - got = x.isZero() - want = false - if got != want { - test.ReportError(t, got, want, x) - } -} - -func testFpModp(t *testing.T, f tFpModp) { - const testTimes = 1 << 9 - P := getModulus() - x := &Fp{} - var bigX big.Int - // Verifying x=P goes to 0 - bigX.Set(P) - x.setBigInt(&bigX) - f(x) - got := x.toBigInt() - want := big.NewInt(0) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } - - // Verifying x=P+1 goes to 1 - bigX.Add(P, big.NewInt(1)) - x.setBigInt(&bigX) - f(x) - got = x.toBigInt() - want = big.NewInt(1) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } - - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(x[:]) - - bigX := x.toBigInt() - - fpMod(x) - got := x.toBigInt() - - want := bigX.Mod(bigX, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } - } -} - -func TestFpNeg(t *testing.T) { - const testTimes = 1 << 9 - P := getModulus() - x, z := &Fp{}, &Fp{} - for i := 0; i < testTimes; i++ { - bigX, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX) - fpNeg(z, x) - got := z.toBigInt() - - want := bigX.Neg(bigX) - want = want.Mod(want, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } - } -} - -func testFpHlf(t *testing.T, f tFpHlf) { - const testTimes = 1 << 9 - P := getModulus() - x, z := &Fp{}, &Fp{} - invTwo := big.NewInt(2) - invTwo.ModInverse(invTwo, P) - for i := 0; i < testTimes; i++ { - bigX, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX) - f(z, x) - got := z.toBigInt() - - want := bigX.Mul(bigX, invTwo) - want = want.Mod(want, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } - } -} - -func testFpAdd(t *testing.T, f tFpAdd) { - const testTimes = 1 << 9 - P := getModulus() - x, y, z := &Fp{}, &Fp{}, &Fp{} - for i := 0; i < testTimes; i++ { - bigX, _ := rand.Int(rand.Reader, P) - bigY, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX) - y.setBigInt(bigY) - f(z, x, y) - got := z.toBigInt() - - want := bigX.Add(bigX, bigY) - want = want.Mod(want, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x, y) - } - } -} - -func testFpSub(t *testing.T, f tFpSub) { - const testTimes = 1 << 9 - P := getModulus() - x, y, z := &Fp{}, &Fp{}, &Fp{} - for i := 0; i < testTimes; i++ { - bigX, _ := rand.Int(rand.Reader, P) - bigY, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX) - y.setBigInt(bigY) - f(z, x, y) - got := z.toBigInt() - - want := bigX.Sub(bigX, bigY) - want = want.Mod(want, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x, y) - } - } -} - -func testFpMul(t *testing.T, f tFpMul) { - const testTimes = 1 << 9 - P := getModulus() - x, y, z := &Fp{}, &Fp{}, &Fp{} - for i := 0; i < testTimes; i++ { - bigX, _ := rand.Int(rand.Reader, P) - bigY, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX) - y.setBigInt(bigY) - f(z, x, y) - got := z.toBigInt() - - want := bigX.Mul(bigX, bigY) - want = want.Mod(want, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x, y) - } - } -} - -func testFpSqr(t *testing.T, f tFpSqr) { - const testTimes = 1 << 9 - P := getModulus() - x, z := &Fp{}, &Fp{} - for i := 0; i < testTimes; i++ { - bigX, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX) - f(z, x) - got := z.toBigInt() - - want := bigX.Mul(bigX, bigX) - want = want.Mod(want, P) - - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } - } -} - -func TestFpInv(t *testing.T) { - const testTimes = 1 << 9 - P := getModulus() - x, z := &Fp{}, &Fp{} - for i := 0; i < testTimes; i++ { - bigX, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX) - fpInv(z, x) - got := z.toBigInt() - - want := bigX.ModInverse(bigX, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } - } -} - -func TestFpGeneric(t *testing.T) { - t.Run("Add", func(t *testing.T) { testFpAdd(t, fpAddGeneric) }) - t.Run("Sub", func(t *testing.T) { testFpSub(t, fpSubGeneric) }) - t.Run("Mul", func(t *testing.T) { testFpMul(t, fpMulGeneric) }) - t.Run("Sqr", func(t *testing.T) { testFpSqr(t, fpSqrGeneric) }) - t.Run("Hlf", func(t *testing.T) { testFpHlf(t, fpHlfGeneric) }) - t.Run("Modp", func(t *testing.T) { testFpModp(t, fpModGeneric) }) -} - -func TestFpNative(t *testing.T) { - t.Run("Add", func(t *testing.T) { testFpAdd(t, fpAdd) }) - t.Run("Sub", func(t *testing.T) { testFpSub(t, fpSub) }) - t.Run("Mul", func(t *testing.T) { testFpMul(t, fpMul) }) - t.Run("Sqr", func(t *testing.T) { testFpSqr(t, fpSqr) }) - t.Run("Hlf", func(t *testing.T) { testFpHlf(t, fpHlf) }) - t.Run("Modp", func(t *testing.T) { testFpModp(t, fpMod) }) -} - -func BenchmarkFp(b *testing.B) { - x, y, z := &Fp{}, &Fp{}, &Fp{} - p := getModulus() - n, _ := rand.Int(rand.Reader, p) - x.setBigInt(n) - n, _ = rand.Int(rand.Reader, p) - y.setBigInt(n) - - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fpAdd(z, x, y) - } - }) - b.Run("Sub", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fpSub(z, x, y) - } - }) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fpMul(z, x, y) - } - }) - b.Run("Sqr", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fpSqr(z, x) - } - }) - b.Run("Inv", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fpInv(z, x) - } - }) -} diff --git a/ecc/fourq/fq.go b/ecc/fourq/fq.go deleted file mode 100644 index a8624e5f..00000000 --- a/ecc/fourq/fq.go +++ /dev/null @@ -1,115 +0,0 @@ -package fourq - -import ( - "crypto/subtle" - "math/big" -) - -// Fq implements operations of a field of size q=p^2 as a quadratic -// extension of the base field where i^2=-1. -// An element in Fq is represented as f[0]+f[1]*i, where f[0],f[1] are in Fp. -type Fq [2]Fp - -func (e *Fq) String() string { return e[1].String() + " *i+ " + e[0].String() } -func (e *Fq) toBigInt() (f0, f1 *big.Int) { return e[0].toBigInt(), e[1].toBigInt() } -func (e *Fq) setBigInt(f0, f1 *big.Int) { e[0].setBigInt(f0); e[1].setBigInt(f1) } -func (e *Fq) setZero() { var z Fp; e[0] = z; e[1] = z } -func (e *Fq) setOne() { e.setZero(); e[0][0] = 1 } -func (e *Fq) isZero() bool { return e[0].isZero() && e[1].isZero() } - -func (e *Fq) toBytes(buf []byte) { - if len(buf) == 2*SizeFp { - e[0].toBytes(buf[:SizeFp]) - e[1].toBytes(buf[SizeFp:]) - } -} - -func (e *Fq) fromBytes(buf []byte) bool { - if len(buf) == 2*SizeFp { - return e[0].fromBytes(buf[:SizeFp]) && - e[1].fromBytes(buf[SizeFp:]) - } - return false -} - -func fqSgn(c *Fq) int { - s0 := fpSgn(&c[0]) - s1 := fpSgn(&c[1]) - return subtle.ConstantTimeSelect(s0&0x1, s0, s1) -} -func fqCopy(c, a *Fq) { *c = *a } -func fqNeg(c, a *Fq) { fpNeg(&c[0], &a[0]); fpNeg(&c[1], &a[1]) } - -// fqSqrt calculates c = sqrt(u/v) such that sgn(c)=s. -func fqSqrt(c, u, v *Fq, s int) { - t0, t1, t, r := &Fp{}, &Fp{}, &Fp{}, &Fp{} - a, b, g := &Fp{}, &Fp{}, &Fp{} - - // a = u0*v0 + u1*v1 - fpMul(a, &u[0], &v[0]) - fpMul(t0, &u[1], &v[1]) - fpAdd(a, a, t0) - - // b = v0^2 + v1^2 - fpSqr(b, &v[0]) - fpSqr(t0, &v[1]) - fpAdd(b, b, t0) - - // g = u1*v0 - u0*v1 - fpMul(g, &u[1], &v[0]) - fpMul(t0, &u[0], &v[1]) - fpSub(g, g, t0) - - // t = 2(a + sqrt(a^2+g^2)) = 2*(a + (a^2+g^2)^(2^125)) - // if t=0; then t = 2*(a - (a^2+g^2)^(2^125)) - fpSqr(t0, a) - fpSqr(t1, g) - fpAdd(t0, t0, t1) - for i := 0; i < 125; i++ { - fpSqr(t0, t0) - } - fpAdd(t, a, t0) - if t.isZero() { - fpSub(t, a, t0) - } - fpAdd(t, t, t) - - // r = (t*b^3)^(2^125-1) - fpSqr(r, b) - fpMul(r, r, b) - fpMul(r, r, t) - fpTwo1251(r, r) - - // x0 = (r*b*t)/2 - // x1 = (r*b*g) - fpMul(&c[1], r, b) - fpMul(&c[0], &c[1], t) - fpHlf(&c[0], &c[0]) - fpMul(&c[1], &c[1], g) - - // if b*(2*x0)^2 == t then (x0,x1) <- (x1,x0) - fpAdd(t0, &c[0], &c[0]) - fpSqr(t0, t0) - fpMul(t0, t0, b) - fpSub(t0, t0, t) - if !t0.isZero() { - *t0 = c[0] - c[0] = c[1] - c[1] = *t0 - } - - if fqSgn(c) != s { - fqNeg(c, c) - } -} - -func fqInv(c, a *Fq) { - t1, t2 := &Fp{}, &Fp{} - fpSqr(t1, &a[0]) - fpSqr(t2, &a[1]) - fpAdd(t1, t1, t2) - fpInv(t1, t1) - fpMul(&c[0], &a[0], t1) - fpNeg(t1, t1) - fpMul(&c[1], &a[1], t1) -} diff --git a/ecc/fourq/fq_amd64.go b/ecc/fourq/fq_amd64.go deleted file mode 100644 index af880cdd..00000000 --- a/ecc/fourq/fq_amd64.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build amd64 && !purego -// +build amd64,!purego - -package fourq - -//go:noescape -func fqCmov(c, a *Fq, b int) - -//go:noescape -func fqAdd(c, a, b *Fq) - -//go:noescape -func fqSub(c, a, b *Fq) - -//go:noescape -func fqMul(c, a, b *Fq) - -//go:noescape -func fqSqr(c, a *Fq) diff --git a/ecc/fourq/fq_amd64.h b/ecc/fourq/fq_amd64.h deleted file mode 100644 index 241b1d23..00000000 --- a/ecc/fourq/fq_amd64.h +++ /dev/null @@ -1,217 +0,0 @@ -#include "fp_amd64.h" - -#define _fqAdd(c,a,b) \ - _fpAdd( 0+c, 0+a, 0+b) \ - _fpAdd(16+c,16+a,16+b) - -#define _fqSub(c,a,b) \ - _fpSub( 0+c, 0+a, 0+b) \ - _fpSub(16+c,16+a,16+b) - -#define _fqMulBmi2(c, a, b) \ - MOVL $0, R15 \ - \ // T0 = a0 * b0, R11:R10:R9:R8 <- 0+ra:8+ra * 0+rb:8+rb - MOVQ 0+b, DX \ - MULXQ 0+a, R8, R9 \ - MULXQ 8+a, R10, AX \ - ADDQ R10, R9 \ - MOVQ 8+b, DX \ - MULXQ 8+a, R10, R11 \ - ADCQ AX, R10 \ - MULXQ 0+a, DX, AX \ - ADCQ $0, R11 \ - ADDQ DX, R9 \ - \ - \ // T1 = a1 * b1, R15:R14:R13:R12 <- 16+ra:24+ra * 16+rb:24+rb - MOVQ 16+b, DX \ - MULXQ 16+a, R12, R13 \ - ADCQ AX, R10 \ - MULXQ 24+a, R14, AX \ - ADCQ $0, R11 \ - MOVQ 24+b, DX \ - ADDQ R14, R13 \ - MULXQ 24+a, R14, R15 \ - ADCQ AX, R14 \ - ADCQ $0, R15 \ - MULXQ 16+a, DX, AX \ - ADDQ DX, R13 \ - ADCQ AX, R14 \ - ADCQ $0, R15 \ - \ - \ // c0 = T0 - T1 = a0*b0 - a1*b1 - SUBQ R12, R8 \ - SBBQ R13, R9 \ - SBBQ R14, R10 \ - SBBQ R15, R11 \ - \ - SHLQ $1, R10, R11 \ - SHLQ $1, R9, R10 \ - MOVQ 16+b, DX \ - BTRQ $63, R9 \ - \ - \ // T0 = a0 * b1, R15:R14:R13:R12 <- 0+ra:8+ra * 16+rb:24+rb - MULXQ 0+a, R12, R13 \ - BTRQ $63, R11 \ - SBBQ $0, R10 \ - SBBQ $0, R11 \ - MULXQ 8+a, R14, AX \ - ADDQ R14, R13 \ - MOVQ 24+b, DX \ - MULXQ 8+a, R14, R15 \ - ADCQ AX, R14 \ - ADCQ $0, R15 \ - MULXQ 0+a, DX, AX \ - ADDQ DX, R13 \ - ADCQ AX, R14 \ - ADCQ $0, R15 \ - \ - \ // Reducing and storing c0 - ADDQ R8, R10 \ - ADCQ R9, R11 \ - BTRQ $63, R11 \ - ADCQ $0, R10 \ - ADCQ $0, R11 \ - \ - \ // T1 = a1 * b0, R12:R11:R10:R9 <- 16+ra:24+ra * 0+rb:8+rb - MOVQ 0+b, DX \ - MULXQ 16+a, R8, R9 \ - MOVQ R10, 0+c \ - MULXQ 24+a, R10, AX \ - ADDQ R10, R9 \ - MOVQ 8+b, DX \ - MOVQ R11, 8+c \ - MULXQ 24+a, R10, R11 \ - ADCQ AX, R10 \ - ADCQ $0, R11 \ - MULXQ 16+a, DX, AX \ - ADDQ DX, R9 \ - ADCQ AX, R10 \ - ADCQ $0, R11 \ - \ - \ // c1 = T0 + T1 = a0*b1 + a1*b0 - ADDQ R12, R8 \ - ADCQ R13, R9 \ - ADCQ R14, R10 \ - ADCQ R15, R11 \ - \ - \ // Reducing and storing c1 - SHLQ $1, R10, R11 \ - SHLQ $1, R9, R10 \ - BTRQ $63, R9 \ - BTRQ $63, R11 \ - ADCQ R10, R8 \ - ADCQ R11, R9 \ - BTRQ $63, R9 \ - ADCQ $0, R8 \ - ADCQ $0, R9 \ - MOVQ R8, 16+c \ - MOVQ R9, 24+c - -#define _fqMulLeg(c, a, b) \ - _fpMulLeg(R10, R9, R8, 0+a, 0+b) \ - _fpMulLeg(R13,R12,R11,16+a,16+b) \ - MOVQ $0,R14 \ - SUBQ R11, R8 \ - SBBQ R12, R9 \ - SBBQ R13,R10 \ - SBBQ $0,R14 \ - SHLQ $1,R10 \ - BTRQ $63, R9 \ - ADCQ R10, R8 \ - ADCQ R14, R9 \ - MOVQ R8, R14 \ - MOVQ R9, R15 \ - _fpMulLeg(R10, R9, R8, 0+a,16+b) \ - _fpMulLeg(R13,R12,R11,16+a, 0+b) \ - ADDQ R11, R8 \ - ADCQ R12, R9 \ - ADCQ R13,R10 \ - SHLQ $1,R10 \ - BTRQ $63, R9 \ - ADCQ R10, R8 \ - ADCQ $0, R9 \ - MOVQ R14, 0+c \ - MOVQ R15, 8+c \ - MOVQ R8,16+c \ - MOVQ R9,24+c - -#define _fqSqrBmi2(c,a) \ - \ // t0 = R9:R8 = a0 + a1, R14:CX = a1 - MOVQ 0+a, R10 \ - MOVQ 16+a, R14 \ - SUBQ R14, R10 \ - MOVQ 8+a, R11 \ - MOVQ 24+a, CX \ - SBBQ CX, R11 \ - \ - BTRQ $63, R11 \ - SBBQ $0, R10 \ - \ - \ // t1 = R11:R10 = a0 - a1 - MOVQ R10, DX \ - MOVQ 0+a, R8 \ - ADDQ R14, R8 \ - MOVQ 8+a, R9 \ - ADCQ CX, R9 \ - \ - \ // c0 = t0 * t1 = (a0 + a1)*(a0 - a1), CX:R14:R13:R12 <- R9:R8 * R11:R10 - MULXQ R8, R12, R13 \ - SBBQ $0, R11 \ - MULXQ R9, R14, AX \ - MOVQ R11, DX \ - ADDQ R14, R13 \ - MULXQ R9, R14, CX \ - MOVQ 8+a, R9 \ - ADCQ AX, R14 \ - ADCQ $0, CX \ - MULXQ R8, DX, AX \ - MOVQ 0+a, R8 \ - ADDQ DX, R13 \ - ADCQ AX, R14 \ - ADCQ $0, CX \ - \ - \ // t2 = R9:R8 = 2*a0 - ADDQ R8, R8 \ - ADCQ R9, R9 \ - \ - \ // Reducing and storing c0 - SHLQ $1, R14, CX \ - SHLQ $1, R13, R14 \ - BTRQ $63, R13 \ - BTRQ $63, CX \ - ADCQ R14, R12 \ - ADCQ CX, R13 \ - BTRQ $63, R13 \ - ADCQ $0, R12 \ - ADCQ $0, R13 \ - MOVQ R12, 0+c \ - MOVQ R13, 8+c \ - \ - \ // c1 = 2a0 * a1, CX:R14:R11:R10 <- R9:R8 * 16+ra:24+ra - MOVQ 16+a, DX \ - MULXQ R8, R10, R11 \ - MULXQ R9, R14, AX \ - ADDQ R14, R11 \ - MOVQ 24+a, DX \ - MULXQ R9, R14, CX \ - ADCQ AX, R14 \ - ADCQ $0, CX \ - MULXQ R8, DX, AX \ - ADDQ DX, R11 \ - ADCQ AX, R14 \ - ADCQ $0, CX \ - \ - \ // Reduce and store c1 - SHLQ $1, R14, CX \ - SHLQ $1, R11, R14 \ - BTRQ $63, R11 \ - BTRQ $63, CX \ - ADCQ R14, R10 \ - ADCQ CX, R11 \ - BTRQ $63, R11 \ - ADCQ $0, R10 \ - ADCQ $0, R11 \ - MOVQ R10, 16+c \ - MOVQ R11, 24+c - -#define _fqSqrLeg(c,a) _fqMulLeg(c,a,a) diff --git a/ecc/fourq/fq_amd64.s b/ecc/fourq/fq_amd64.s deleted file mode 100644 index 415fc135..00000000 --- a/ecc/fourq/fq_amd64.s +++ /dev/null @@ -1,56 +0,0 @@ -// +build amd64,!purego - -#include "fq_amd64.h" - -#define fqMulLegacy \ - _fqMulLeg(0(DI),0(SI),0(BX)) -#define fqMulBmi2 \ - _fqMulBmi2(0(DI),0(SI),0(BX)) - -#define fqSqrLegacy \ - _fqSqrLeg(0(DI),0(SI)) -#define fqSqrBmi2 \ - _fqSqrBmi2(0(DI),0(SI)) - -// func fqCmov(c, a *fq, b int) -TEXT ·fqCmov(SB),0,$0-24 - MOVQ c+0(FP), DI - MOVQ a+8(FP), SI - MOVQ b+16(FP), BX - TESTQ BX, BX - MOVQ 0(DI), AX; MOVQ 0(SI), DX; CMOVQNE DX, AX; MOVQ AX, 0(DI); - MOVQ 8(DI), AX; MOVQ 8(SI), DX; CMOVQNE DX, AX; MOVQ AX, 8(DI); - MOVQ 16(DI), AX; MOVQ 16(SI), DX; CMOVQNE DX, AX; MOVQ AX, 16(DI); - MOVQ 24(DI), AX; MOVQ 24(SI), DX; CMOVQNE DX, AX; MOVQ AX, 24(DI); - RET - -// func fqAdd(c, a, b *fq) -TEXT ·fqAdd(SB),0,$0-24 - MOVQ c+0(FP), DI - MOVQ a+8(FP), SI - MOVQ b+16(FP), BX - _fqAdd(0(DI), 0(SI), 0(BX)) - RET - -// func fqSub(c, a, b *fq) -TEXT ·fqSub(SB),0,$0-24 - MOVQ c+0(FP), DI - MOVQ a+8(FP), SI - MOVQ b+16(FP), BX - _fqSub(0(DI), 0(SI), 0(BX)) - RET - -// func fqMul(c, a, b *fq) -TEXT ·fqMul(SB),0,$0-24 - MOVQ c+0(FP), DI - MOVQ a+8(FP), SI - MOVQ b+16(FP), BX - CHECK_BMI2(LFQMUL, fqMulLegacy, fqMulBmi2) - RET - -// func fqSqr(c, a *fq) -TEXT ·fqSqr(SB),0,$0-16 - MOVQ c+0(FP), DI - MOVQ a+8(FP), SI - CHECK_BMI2(LFQSQR, fqSqrLegacy, fqSqrBmi2) - RET diff --git a/ecc/fourq/fq_generic.go b/ecc/fourq/fq_generic.go deleted file mode 100644 index 9285e887..00000000 --- a/ecc/fourq/fq_generic.go +++ /dev/null @@ -1,30 +0,0 @@ -package fourq - -func fqAddGeneric(c, a, b *Fq) { - fpAddGeneric(&c[0], &a[0], &b[0]) - fpAddGeneric(&c[1], &a[1], &b[1]) -} - -func fqSubGeneric(c, a, b *Fq) { - fpSubGeneric(&c[0], &a[0], &b[0]) - fpSubGeneric(&c[1], &a[1], &b[1]) -} - -func fqMulGeneric(c, a, b *Fq) { - var a0b0, a0b1, a1b0, a1b1 Fp - fpMulGeneric(&a0b0, &a[0], &b[0]) - fpMulGeneric(&a0b1, &a[0], &b[1]) - fpMulGeneric(&a1b0, &a[1], &b[0]) - fpMulGeneric(&a1b1, &a[1], &b[1]) - fpSubGeneric(&c[0], &a0b0, &a1b1) - fpAddGeneric(&c[1], &a0b1, &a1b0) -} - -func fqSqrGeneric(c, a *Fq) { - var aa0, a01, aa1 Fp - fpSqrGeneric(&aa0, &a[0]) - fpMulGeneric(&a01, &a[0], &a[1]) - fpSqrGeneric(&aa1, &a[1]) - fpSubGeneric(&c[0], &aa0, &aa1) - fpAddGeneric(&c[1], &a01, &a01) -} diff --git a/ecc/fourq/fq_noasm.go b/ecc/fourq/fq_noasm.go deleted file mode 100644 index 1c7716a9..00000000 --- a/ecc/fourq/fq_noasm.go +++ /dev/null @@ -1,15 +0,0 @@ -//go:build !amd64 || purego -// +build !amd64 purego - -package fourq - -import "crypto/subtle" - -func fqCmov(c, a *Fq, b int) { - subtle.ConstantTimeCopy(b, c[0][:], a[0][:]) - subtle.ConstantTimeCopy(b, c[1][:], a[1][:]) -} -func fqAdd(c, a, b *Fq) { fqAddGeneric(c, a, b) } -func fqSub(c, a, b *Fq) { fqSubGeneric(c, a, b) } -func fqMul(c, a, b *Fq) { fqMulGeneric(c, a, b) } -func fqSqr(c, a *Fq) { fqSqrGeneric(c, a) } diff --git a/ecc/fourq/fq_test.go b/ecc/fourq/fq_test.go deleted file mode 100644 index a620e3dc..00000000 --- a/ecc/fourq/fq_test.go +++ /dev/null @@ -1,361 +0,0 @@ -package fourq - -import ( - "crypto/rand" - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -type ( - tFqAdd = func(z, x, y *Fq) - tFqSub = func(z, x, y *Fq) - tFqMul = func(z, x, y *Fq) - tFqSqr = func(z, x *Fq) -) - -func TestFqOne(t *testing.T) { - x := &Fq{} - x.setOne() - got0, got1 := x.toBigInt() - want0, want1 := big.NewInt(1), big.NewInt(0) - if got0.Cmp(want0) != 0 { - test.ReportError(t, got0, want0, x) - } - if got1.Cmp(want1) != 0 { - test.ReportError(t, got1, want1, x) - } -} - -func TestFqSign(t *testing.T) { - testTimes := 1 << 9 - x := &Fq{} - P := getModulus() - var P1div2 big.Int - P1div2.Add(P, big.NewInt(1)).Rsh(&P1div2, 1) // (p+1)/2 - - // Verifying Sign(0) = 0 - x.setBigInt(big.NewInt(0), big.NewInt(0)) - got := fqSgn(x) - want := 0 - if got != want { - test.ReportError(t, got, want, x) - } - - // Verifying Sign(P) = 0 - x.setBigInt(P, P) - got = fqSgn(x) - want = 0 - if got != want { - test.ReportError(t, got, want, x) - } - - // Verifying Sign( (p+1)/2 ) = -1 - x.setBigInt(&P1div2, &P1div2) - got = fqSgn(x) - want = -1 - if got != want { - test.ReportError(t, got, want, x) - } - - // Verifying x be a non-zero positive - for i := 0; i < testTimes; i++ { - bigX1, _ := rand.Int(rand.Reader, &P1div2) - x.setBigInt(P, bigX1) - got = fqSgn(x) - want = 1 - if got != want { - test.ReportError(t, got, want, x) - } - } - // Verifying x be a non-zero positive - for i := 0; i < testTimes; i++ { - bigX0, _ := rand.Int(rand.Reader, &P1div2) - bigX1, _ := rand.Int(rand.Reader, &P1div2) - x.setBigInt(bigX0, bigX1) - got = fqSgn(x) - want = 1 - if got != want { - test.ReportError(t, got, want, x) - } - } - // Verifying x be a non-zero negative - for i := 0; i < testTimes; i++ { - bigX1, _ := rand.Int(rand.Reader, &P1div2) - bigX1.Add(bigX1, &P1div2) - x.setBigInt(P, bigX1) - got = fqSgn(x) - want = -1 - if got != want { - test.ReportError(t, got, want, x) - } - } - // Verifying x be a non-zero negative - for i := 0; i < testTimes; i++ { - bigX0, _ := rand.Int(rand.Reader, &P1div2) - bigX1, _ := rand.Int(rand.Reader, &P1div2) - bigX0.Add(bigX0, &P1div2) - bigX1.Add(bigX1, &P1div2) - x.setBigInt(bigX0, bigX1) - got = fqSgn(x) - want = -1 - if got != want { - test.ReportError(t, got, want, x) - } - } -} - -func TestFqIsZero(t *testing.T) { - x := &Fq{} - P := getModulus() - // Verifying x=0 - x.setBigInt(big.NewInt(0), big.NewInt(0)) - got := x.isZero() - want := true - if got != want { - test.ReportError(t, got, want, x) - } - - // Verifying x=P goes to 0 - x.setBigInt(P, P) - got = x.isZero() - want = true - if got != want { - test.ReportError(t, got, want, x) - } - - // Verifying x!=0 - bigX0, _ := rand.Int(rand.Reader, P) - bigX1, _ := rand.Int(rand.Reader, P) - x.setBigInt(bigX0, bigX1) - got = x.isZero() - want = false - if got != want { - test.ReportError(t, got, want, x) - } -} - -func TestFqNeg(t *testing.T) { - testTimes := 1 << 9 - x, z := &Fq{}, &Fq{} - P := getModulus() - for i := 0; i < testTimes; i++ { - bigX0, _ := rand.Int(rand.Reader, P) - bigX1, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX0, bigX1) - fqNeg(z, x) - got0, got1 := z.toBigInt() - - want0 := bigX0.Neg(bigX0) - want1 := bigX1.Neg(bigX1) - want0 = want0.Mod(want0, P) - want1 = want1.Mod(want1, P) - if got0.Cmp(want0) != 0 { - test.ReportError(t, got0, want0, x) - } - if got1.Cmp(want1) != 0 { - test.ReportError(t, got1, want1, x) - } - } -} - -func testFqAdd(t *testing.T, f tFqAdd) { - testTimes := 1 << 9 - x, y, z := &Fq{}, &Fq{}, &Fq{} - P := getModulus() - for i := 0; i < testTimes; i++ { - bigX0, _ := rand.Int(rand.Reader, P) - bigX1, _ := rand.Int(rand.Reader, P) - bigY0, _ := rand.Int(rand.Reader, P) - bigY1, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX0, bigX1) - y.setBigInt(bigY0, bigY1) - f(z, x, y) - got0, got1 := z.toBigInt() - - want0 := bigX0.Add(bigX0, bigY0) - want1 := bigX1.Add(bigX1, bigY1) - want0 = want0.Mod(want0, P) - want1 = want1.Mod(want1, P) - - if got0.Cmp(want0) != 0 { - test.ReportError(t, got0, want0, x, y) - } - if got1.Cmp(want1) != 0 { - test.ReportError(t, got1, want1, x, y) - } - } -} - -func testFqSub(t *testing.T, f tFqSub) { - testTimes := 1 << 9 - x, y, z := &Fq{}, &Fq{}, &Fq{} - P := getModulus() - for i := 0; i < testTimes; i++ { - bigX0, _ := rand.Int(rand.Reader, P) - bigX1, _ := rand.Int(rand.Reader, P) - bigY0, _ := rand.Int(rand.Reader, P) - bigY1, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX0, bigX1) - y.setBigInt(bigY0, bigY1) - f(z, x, y) - got0, got1 := z.toBigInt() - - want0 := bigX0.Sub(bigX0, bigY0) - want1 := bigX1.Sub(bigX1, bigY1) - want0 = want0.Mod(want0, P) - want1 = want1.Mod(want1, P) - - if got0.Cmp(want0) != 0 { - test.ReportError(t, got0, want0, x, y) - } - if got1.Cmp(want1) != 0 { - test.ReportError(t, got1, want1, x, y) - } - } -} - -func testFqMul(t *testing.T, f tFqMul) { - testTimes := 1 << 9 - x, y, z := &Fq{}, &Fq{}, &Fq{} - P := getModulus() - for i := 0; i < testTimes; i++ { - bigX0, _ := rand.Int(rand.Reader, P) - bigX1, _ := rand.Int(rand.Reader, P) - bigY0, _ := rand.Int(rand.Reader, P) - bigY1, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX0, bigX1) - y.setBigInt(bigY0, bigY1) - f(z, x, y) - got0, got1 := z.toBigInt() - - x0y0 := new(big.Int).Mul(bigX0, bigY0) - x0y1 := new(big.Int).Mul(bigX0, bigY1) - x1y0 := new(big.Int).Mul(bigX1, bigY0) - x1y1 := new(big.Int).Mul(bigX1, bigY1) - want0 := x0y0.Sub(x0y0, x1y1) - want1 := x1y0.Add(x1y0, x0y1) - want0 = want0.Mod(want0, P) - want1 = want1.Mod(want1, P) - - if got0.Cmp(want0) != 0 { - test.ReportError(t, got0, want0, x, y) - } - if got1.Cmp(want1) != 0 { - test.ReportError(t, got1, want1, x, y) - } - } -} - -func testFqSqr(t *testing.T, f tFqSqr) { - testTimes := 1 << 9 - x, z := &Fq{}, &Fq{} - P := getModulus() - for i := 0; i < testTimes; i++ { - bigX0, _ := rand.Int(rand.Reader, P) - bigX1, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX0, bigX1) - f(z, x) - got0, got1 := z.toBigInt() - - x0x0 := new(big.Int).Mul(bigX0, bigX0) - x0x1 := new(big.Int).Mul(bigX0, bigX1) - x1x1 := new(big.Int).Mul(bigX1, bigX1) - want0 := x0x0.Sub(x0x0, x1x1) - want1 := x0x1.Lsh(x0x1, 1) - want0 = want0.Mod(want0, P) - want1 = want1.Mod(want1, P) - - if got0.Cmp(want0) != 0 { - test.ReportError(t, got0, want0, x) - } - if got1.Cmp(want1) != 0 { - test.ReportError(t, got1, want1, x) - } - } -} - -func TestFqInv(t *testing.T) { - testTimes := 1 << 9 - x, z := &Fq{}, &Fq{} - P := getModulus() - for i := 0; i < testTimes; i++ { - bigX0, _ := rand.Int(rand.Reader, P) - bigX1, _ := rand.Int(rand.Reader, P) - - x.setBigInt(bigX0, bigX1) - fqInv(z, x) - got0, got1 := z.toBigInt() - - x0x0 := new(big.Int).Mul(bigX0, bigX0) - x1x1 := new(big.Int).Mul(bigX1, bigX1) - inv := x0x0.Add(x0x0, x1x1) - inv.ModInverse(inv, P) - want0 := bigX0.Mul(bigX0, inv) - want1 := bigX1.Mul(bigX1, inv).Neg(bigX1) - want0 = want0.Mod(want0, P) - want1 = want1.Mod(want1, P) - - if got0.Cmp(want0) != 0 { - test.ReportError(t, got0, want0, x) - } - if got1.Cmp(want1) != 0 { - test.ReportError(t, got1, want1, x) - } - } -} - -func TestFqGeneric(t *testing.T) { - t.Run("Add", func(t *testing.T) { testFqAdd(t, fqAddGeneric) }) - t.Run("Sub", func(t *testing.T) { testFqSub(t, fqSubGeneric) }) - t.Run("Mul", func(t *testing.T) { testFqMul(t, fqMulGeneric) }) - t.Run("Sqr", func(t *testing.T) { testFqSqr(t, fqSqrGeneric) }) -} - -func TestFqNative(t *testing.T) { - t.Run("Add", func(t *testing.T) { testFqAdd(t, fqAdd) }) - t.Run("Sub", func(t *testing.T) { testFqSub(t, fqSub) }) - t.Run("Mul", func(t *testing.T) { testFqMul(t, fqMul) }) - t.Run("Sqr", func(t *testing.T) { testFqSqr(t, fqSqr) }) -} - -func BenchmarkFq(b *testing.B) { - x, y, z := &Fq{}, &Fq{}, &Fq{} - - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fqAdd(z, x, y) - } - }) - b.Run("Sub", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fqSub(z, x, y) - } - }) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fqMul(z, x, y) - } - }) - b.Run("Sqr", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fqSqr(z, x) - } - }) - b.Run("Inv", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fqInv(z, x) - } - }) - b.Run("Sqrt", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fqSqrt(z, x, y, 1) - } - }) -} diff --git a/ecc/fourq/params.go b/ecc/fourq/params.go deleted file mode 100644 index 15f17efa..00000000 --- a/ecc/fourq/params.go +++ /dev/null @@ -1,49 +0,0 @@ -package fourq - -// All values in little endian -var ( - - // prime is the modulus 2^127-1 - prime = [2]uint64{ - 0xFFFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFF, - } - - // orderGenerator is the size of the largest subgroup. - orderGenerator = [4]uint64{ - 0x2fb2540ec7768ce7, 0xdfbd004dfe0f7999, - 0xf05397829cbc14e5, 0x0029cbc14e5e0a72, - } - - paramD = Fq{ - Fp{ - 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - Fp{ - 0x8d, 0x0c, 0xfc, 0xf1, 0x88, 0x14, 0x82, 0xb3, - 0xfc, 0xe0, 0x57, 0x66, 0x84, 0x2f, 0x47, 0x5e, - }, - } - - genX = Fq{ - Fp{ - 0xaa, 0x33, 0x38, 0x7b, 0xad, 0x92, 0x65, 0x28, - 0x05, 0xb3, 0x2f, 0x7c, 0x23, 0x72, 0x34, 0x1a, - }, - Fp{ - 0xf6, 0x77, 0xac, 0x60, 0xb3, 0x9f, 0x86, 0x96, - 0x9c, 0xaa, 0x78, 0x28, 0x3f, 0x55, 0x1f, 0x1e, - }, - } - - genY = Fq{ - Fp{ - 0x87, 0xb2, 0xcb, 0x2b, 0x46, 0xa2, 0x24, 0xb9, - 0x5a, 0x78, 0x20, 0xa1, 0x9b, 0xee, 0x3f, 0x0e, - }, - Fp{ - 0x5c, 0x8b, 0x4c, 0x84, 0x44, 0xc3, 0xa7, 0x49, - 0x42, 0x02, 0x0e, 0x63, 0xf8, 0x4a, 0x1c, 0x6e, - }, - } -) diff --git a/ecc/fourq/point.go b/ecc/fourq/point.go deleted file mode 100644 index 94974a45..00000000 --- a/ecc/fourq/point.go +++ /dev/null @@ -1,368 +0,0 @@ -package fourq - -import ( - "crypto/subtle" - "encoding/binary" - "math/bits" -) - -type pointR1 struct { - X, Y, Z, Ta, Tb Fq // (x,y,z,t=ta*tb) -} - -type pointR3 struct { - addYX Fq // y + x - subYX Fq // y - x - dt2 Fq // 2*d*t -} - -type pointR2 struct { - pointR3 - z2 Fq // 2 * z -} - -// subYDiv16 update x = (x - y) / 16. -func subYDiv16(x *[5]uint64, y int64) { - s := uint64(y >> 63) - x0, b0 := bits.Sub64((*x)[0], uint64(y), 0) - x1, b1 := bits.Sub64((*x)[1], s, b0) - x2, b2 := bits.Sub64((*x)[2], s, b1) - x3, b3 := bits.Sub64((*x)[3], s, b2) - x4, _ := bits.Sub64((*x)[4], s, b3) - (*x)[0] = (x0 >> 4) | (x1 << 60) - (*x)[1] = (x1 >> 4) | (x2 << 60) - (*x)[2] = (x2 >> 4) | (x3 << 60) - (*x)[3] = (x3 >> 4) | (x4 << 60) - (*x)[4] = (x4 >> 4) -} - -// condAddOrderN updates x = x+order if x is even, otherwise x remains unchanged. -func condAddOrderN(x *[5]uint64) { - var o [4]uint64 - isOdd := (x[0] & 0x1) - 1 - for i := range orderGenerator { - o[i] = isOdd & orderGenerator[i] - } - x0, c0 := bits.Add64((*x)[0], o[0], 0) - x1, c1 := bits.Add64((*x)[1], o[1], c0) - x2, c2 := bits.Add64((*x)[2], o[2], c1) - x3, c3 := bits.Add64((*x)[3], o[3], c2) - x4, _ := bits.Add64((*x)[4], 0, c3) - (*x)[0] = x0 - (*x)[1] = x1 - (*x)[2] = x2 - (*x)[3] = x3 - (*x)[4] = x4 -} - -func recodeScalar(d *[65]int8, k *[32]byte) { - var m [5]uint64 - m[0] = binary.LittleEndian.Uint64(k[0:8]) - m[1] = binary.LittleEndian.Uint64(k[8:16]) - m[2] = binary.LittleEndian.Uint64(k[16:24]) - m[3] = binary.LittleEndian.Uint64(k[24:32]) - condAddOrderN(&m) - for i := 0; i < 64; i++ { - d[i] = int8((m[0] & 0x1f) - 16) - subYDiv16(&m, int64(d[i])) - } - d[64] = int8(m[0]) -} - -func (P *pointR1) oddMultiples(T *[8]pointR2) { - var _2P, R pointR1 - var _p2P pointR2 - _2P.copy(P) - _2P.double() - _p2P.FromR1(&_2P) - R.copy(P) - T[0].FromR1(P) - for i := 1; i < 8; i++ { - R.add(&_p2P) - T[i].FromR1(&R) - } -} - -// scalarMult calculates P = k*Q. -func (P *pointR1) ScalarMult(k *[32]byte, Q *pointR1) { - var TabQ [8]pointR2 - var S pointR2 - var d [65]int8 - Q.oddMultiples(&TabQ) - recodeScalar(&d, k) - P.SetIdentity() - for i := 64; i >= 0; i-- { - P.double() - P.double() - P.double() - P.double() - mask := d[i] >> 7 - absDi := (d[i] + mask) ^ mask - inx := int((absDi - 1) >> 1) - sig := int((d[i] >> 7) & 0x1) - for j := range TabQ { - S.cmov(&TabQ[j], int((uint64(uint32(inx^j))-1)>>63)) - } - S.cneg(sig) - P.add(&S) - } -} - -// absolute returns always a positive value. -func absolute(x int32) int32 { - mask := x >> 31 - return (x + mask) ^ mask -} - -// div2subY update x = (x/2) - y. -func div2subY(x *[5]uint64, y int64) { - s := uint64(y >> 63) - x0 := (*x)[0] - x1 := (*x)[1] - x2 := (*x)[2] - x3 := (*x)[3] - x0 = (x0 >> 1) | (x1 << 63) - x1 = (x1 >> 1) | (x2 << 63) - x2 = (x2 >> 1) | (x3 << 63) - x3 = (x3 >> 1) - - x0, b0 := bits.Sub64(x0, uint64(y), 0) - x1, b1 := bits.Sub64(x1, s, b0) - x2, b2 := bits.Sub64(x2, s, b1) - x3, _ = bits.Sub64(x3, s, b2) - (*x)[0] = x0 - (*x)[1] = x1 - (*x)[2] = x2 - (*x)[3] = x3 -} - -// mLSBRecoding is the odd-only modified LSB-set. -// -// Reference: -// -// "Efficient and secure algorithms for GLV-based scalar multiplication and -// their implementation on GLV–GLS curves" by (Faz-Hernandez et al.) -// http://doi.org/10.1007/s13389-014-0085-7. -func mLSBRecoding(L []int8, k []byte) { - const e = (fxT + fxW*fxV - 1) / (fxW * fxV) - const d = e * fxV - const l = d * fxW - if len(L) == (l + 1) { - var m [5]uint64 - m[0] = binary.LittleEndian.Uint64(k[0:8]) - m[1] = binary.LittleEndian.Uint64(k[8:16]) - m[2] = binary.LittleEndian.Uint64(k[16:24]) - m[3] = binary.LittleEndian.Uint64(k[24:32]) - condAddOrderN(&m) - - L[d-1] = 1 - for i := 0; i < d-1; i++ { - kip1 := (m[(i+1)/64] >> (uint(i+1) % 64)) & 0x1 - L[i] = int8(kip1<<1) - 1 - } - { // right-shift by d - const right = (d % 64) - const left = 64 - (d % 64) - const lim = (5*64 - d) / 64 - const j = d / 64 - for i := 0; i < lim; i++ { - m[i] = (m[i+j] >> right) | (m[i+j+1] << left) - } - m[lim] = m[lim+j] >> right - } - for i := d; i < l; i++ { - L[i] = L[i%d] * int8(m[0]&0x1) - div2subY(&m, int64(L[i]>>1)) - } - L[l] = int8(m[0]) - } -} - -func (P *pointR1) ScalarBaseMult(scalar *[Size]byte) { - var S pointR3 - const e = (fxT + fxW*fxV - 1) / (fxW * fxV) - const d = e * fxV - const l = d * fxW - - var L [l + 1]int8 - mLSBRecoding(L[:], scalar[:]) - P.SetIdentity() - for ii := e - 1; ii >= 0; ii-- { - P.double() - for j := 0; j < fxV; j++ { - dig := L[fxW*d-j*e+ii-e] - for i := (fxW-1)*d - j*e + ii - e; i >= (2*d - j*e + ii - e); i = i - d { - dig = 2*dig + L[i] - } - idx := absolute(int32(dig)) - sig := L[d-j*e+ii-e] - Tabj := &tableBaseFixed[fxV-j-1] - for k := 0; k < fx2w1; k++ { - S.cmov(&Tabj[k], subtle.ConstantTimeEq(int32(k), idx)) - } - S.cneg(subtle.ConstantTimeEq(int32(sig), -1)) - P.mixAdd(&S) - } - } -} - -func (P *pointR1) copy(Q *pointR1) { - fqCopy(&P.X, &Q.X) - fqCopy(&P.Y, &Q.Y) - fqCopy(&P.Ta, &Q.Ta) - fqCopy(&P.Tb, &Q.Tb) - fqCopy(&P.Z, &Q.Z) -} - -func (P *pointR1) SetIdentity() { - P.X.setZero() - P.Y.setOne() - P.Ta.setZero() - P.Tb.setZero() - P.Z.setOne() -} - -func (P *pointR1) IsIdentity() bool { - t0, t1 := &Fq{}, &Fq{} - fqMul(t0, &P.Ta, &P.Tb) - fqSub(t1, &P.Y, &P.Z) - return P.X.isZero() && t0.isZero() && t1.isZero() -} - -func (P *pointR1) ToAffine() { - fqInv(&P.Z, &P.Z) - fqMul(&P.X, &P.X, &P.Z) - fqMul(&P.Y, &P.Y, &P.Z) - fqMul(&P.Ta, &P.X, &P.Y) - P.Tb.setOne() - P.Z.setOne() -} - -// Marshal encodes a point P into out buffer. -func (P *Point) Marshal(out *[Size]byte) { - P.Y.toBytes(out[:]) - // b=0 if x is positive or zero - // b=1 if x is negative - b := (1 - fqSgn(&P.X)) >> 1 - out[Size-1] |= byte(b) << 7 -} - -// Unmarshal retrieves a point P from the input buffer. On success, returns true. -func (P *Point) Unmarshal(in *[Size]byte) bool { - var Q Point - s := in[Size-1] >> 7 - in[Size-1] &= 0x7F - ok := Q.Y.fromBytes(in[:]) - in[Size-1] |= s << 7 - if !ok { - return false - } - - t0, t1, one := &Fq{}, &Fq{}, &Fq{} - one.setOne() - fqSqr(t0, &Q.Y) // t0 = y^2 - fqMul(t1, t0, ¶mD) // t1 = d*y^2 - fqSub(t0, t0, one) // t0 = y^2 - 1 - fqAdd(t1, t1, one) // t1 = d*y^2 + 1 - fqSqrt(&Q.X, t0, t1, 1-2*int(s)) // x = sqrt(t0/t1) - - if !Q.IsOnCurve() { - fpNeg(&Q.X[1], &Q.X[1]) - } - if !Q.IsOnCurve() { - return false - } - - *P = Q - return true -} - -func (P *pointR1) IsOnCurve() bool { - t0, lhs, rhs := &Fq{}, &Fq{}, &Fq{} - // Check z != 0 - eq0 := !P.Z.isZero() - - // Check Eq 1: -X^2 + Y^2 == Z^2 + dT^2 - fqAdd(t0, &P.Y, &P.X) // t0 = y + x - fqSub(lhs, &P.Y, &P.X) // lhs = y - x - fqMul(lhs, lhs, t0) // lhs = y^2 - x^2 - fqMul(rhs, &P.Ta, &P.Tb) // rhs = T = Ta * Tb - fqSqr(rhs, rhs) // rhs = T^2 - fqMul(rhs, rhs, ¶mD) // rhs = dT^2 - fqSqr(t0, &P.Z) // t0 = Z^2 - fqAdd(rhs, rhs, t0) // rhs = Z^2 + dT^2 - fqSub(t0, lhs, rhs) // t0 = (-X^2 + Y^2) - (Z^2 + dT^2) - eq1 := t0.isZero() - - // Check Eq 2: (Ta*Tb)*Z == X*Y - fqMul(lhs, &P.Ta, &P.Tb) // lhs = Ta*Tb = T - fqMul(lhs, lhs, &P.Z) // lhs = T * Z - fqMul(rhs, &P.X, &P.Y) // rhs = X * Y - fqSub(t0, lhs, rhs) // t0 = Ta*Tb*Z - X*Y - eq2 := t0.isZero() - - return eq0 && eq1 && eq2 -} - -func (P *pointR1) isEqual(Q *pointR1) bool { - l, r := &Fq{}, &Fq{} - fqMul(l, &P.X, &Q.Z) // l = X1*Z2 - fqMul(r, &Q.X, &P.Z) // r = X2*Z1 - fqSub(l, l, r) // l = l-r - b := l.isZero() - fqMul(l, &P.Y, &Q.Z) // l = Y1*Z2 - fqMul(r, &Q.Y, &P.Z) // r = Y2*Z1 - fqSub(l, l, r) // l = l-r - b = b && l.isZero() - fqMul(l, &P.Ta, &P.Tb) // l = T1 = Ta1*Tb1 - fqMul(l, l, &Q.Z) // l = T1*Z2 - fqMul(r, &Q.Ta, &Q.Tb) // r = T2 = Ta2*Tb2 - fqMul(r, r, &P.Z) // r = T2*Z1 - fqSub(l, l, r) // l = l-r - b = b && l.isZero() - return b && !P.Z.isZero() && !Q.Z.isZero() -} - -func (P *pointR1) ClearCofactor() { - var Q pointR2 - Q.FromR1(P) - P.double() - P.add(&Q) - P.double() - P.double() - P.double() - P.double() - P.add(&Q) - P.double() - P.double() - P.double() -} - -func (P *pointR2) FromR1(Q *pointR1) { - fqAdd(&P.addYX, &Q.Y, &Q.X) - fqSub(&P.subYX, &Q.Y, &Q.X) - fqAdd(&P.z2, &Q.Z, &Q.Z) - fqMul(&P.dt2, &Q.Ta, &Q.Tb) - fqMul(&P.dt2, &P.dt2, ¶mD) - fqAdd(&P.dt2, &P.dt2, &P.dt2) -} - -func (P *pointR2) cmov(Q *pointR2, b int) { - P.pointR3.cmov(&Q.pointR3, b) - fqCmov(&P.z2, &Q.z2, b) -} - -func (P *pointR3) cneg(b int) { - var t Fq - fqCopy(&t, &P.addYX) - fqCmov(&P.addYX, &P.subYX, b) - fqCmov(&P.subYX, &t, b) - fqNeg(&t, &P.dt2) - fqCmov(&P.dt2, &t, b) -} - -func (P *pointR3) cmov(Q *pointR3, b int) { - fqCmov(&P.addYX, &Q.addYX, b) - fqCmov(&P.subYX, &Q.subYX, b) - fqCmov(&P.dt2, &Q.dt2, b) -} diff --git a/ecc/fourq/point_amd64.go b/ecc/fourq/point_amd64.go deleted file mode 100644 index aeb7272d..00000000 --- a/ecc/fourq/point_amd64.go +++ /dev/null @@ -1,36 +0,0 @@ -//go:build amd64 && !purego -// +build amd64,!purego - -package fourq - -import "unsafe" - -const ( // constants used in assembly implementation - _x = unsafe.Offsetof(pointR1{}.X) - _y = unsafe.Offsetof(pointR1{}.Y) - _z = unsafe.Offsetof(pointR1{}.Z) - _ta = unsafe.Offsetof(pointR1{}.Ta) - _tb = unsafe.Offsetof(pointR1{}.Tb) - _addYXR2 = unsafe.Offsetof(pointR2{}.addYX) - _subYXR2 = unsafe.Offsetof(pointR2{}.subYX) - _z2R2 = unsafe.Offsetof(pointR2{}.z2) - _dt2R2 = unsafe.Offsetof(pointR2{}.dt2) - _addYXR3 = unsafe.Offsetof(pointR3{}.addYX) - _subYXR3 = unsafe.Offsetof(pointR3{}.subYX) - _dt2R3 = unsafe.Offsetof(pointR3{}.dt2) - _ = _x + _y + _z + _ta + _tb + _addYXR2 + _subYXR2 + - _z2R2 + _dt2R2 + _addYXR3 + _subYXR3 + _dt2R3 -) - -func (P *pointR1) double() { doubleAmd64(P) } -func (P *pointR1) add(Q *pointR2) { addAmd64(P, Q) } -func (P *pointR1) mixAdd(Q *pointR3) { mixAddAmd64(P, Q) } - -//go:noescape -func doubleAmd64(P *pointR1) - -//go:noescape -func addAmd64(P *pointR1, Q *pointR2) - -//go:noescape -func mixAddAmd64(P *pointR1, Q *pointR3) diff --git a/ecc/fourq/point_amd64.h b/ecc/fourq/point_amd64.h deleted file mode 100644 index b87c2938..00000000 --- a/ecc/fourq/point_amd64.h +++ /dev/null @@ -1,93 +0,0 @@ -#define doubleLeg \ - _fqAdd(e,Px,Py) \ - _fqSqrLeg(a,Px) \ - _fqSqrLeg(b,Py) \ - _fqSqrLeg(c,Pz) \ - _fqAdd(c,c,c) \ - _fqAdd(d,a,b) \ - _fqSqrLeg(e,e) \ - _fqSub(e,e,d) \ - _fqSub(f,b,a) \ - _fqSub(g,c,f) \ - _fqMulLeg(Pz,f,g) \ - _fqMulLeg(Px,e,g) \ - _fqMulLeg(Py,d,f) - -#define doubleBmi2 \ - _fqAdd(e,Px,Py) \ - _fqSqrBmi2(a,Px) \ - _fqSqrBmi2(b,Py) \ - _fqSqrBmi2(c,Pz) \ - _fqAdd(c,c,c) \ - _fqAdd(d,a,b) \ - _fqSqrBmi2(e,e) \ - _fqSub(e,e,d) \ - _fqSub(f,b,a) \ - _fqSub(g,c,f) \ - _fqMulBmi2(Pz,f,g) \ - _fqMulBmi2(Px,e,g) \ - _fqMulBmi2(Py,d,f) - -#define addLeg \ - _fqMulLeg(c, Pta, Ptb) \ - _fqSub(h, b, a) \ - _fqAdd(b, b, a) \ - _fqMulLeg(a, h, subYX) \ - _fqMulLeg(b, b, addYX) \ - _fqSub(e, b, a) \ - _fqAdd(h, b, a) \ - _fqMulLeg(d, Pz, z2) \ - _fqMulLeg(c, c, dt2) \ - _fqSub(f, d, c) \ - _fqAdd(g, d, c) \ - _fqMulLeg(Pz, f, g) \ - _fqMulLeg(Px, e, f) \ - _fqMulLeg(Py, g, h) - -#define addBmi2 \ - _fqMulBmi2(c, Pta, Ptb) \ - _fqSub(h, b, a) \ - _fqAdd(b, b, a) \ - _fqMulBmi2(a, h, subYX) \ - _fqMulBmi2(b, b, addYX) \ - _fqSub(e, b, a) \ - _fqAdd(h, b, a) \ - _fqMulBmi2(d, Pz, z2) \ - _fqMulBmi2(c, c, dt2) \ - _fqSub(f, d, c) \ - _fqAdd(g, d, c) \ - _fqMulBmi2(Pz, f, g) \ - _fqMulBmi2(Px, e, f) \ - _fqMulBmi2(Py, g, h) - -#define mixAddLeg \ - _fqMulLeg(c, Pta, Ptb) \ - _fqSub(h, b, a) \ - _fqAdd(b, b, a) \ - _fqMulLeg(a, h, subYX) \ - _fqMulLeg(b, b, addYX) \ - _fqSub(e, b, a) \ - _fqAdd(h, b, a) \ - _fqAdd(d, Pz, Pz) \ - _fqMulLeg(c, c, dt2) \ - _fqSub(f, d, c) \ - _fqAdd(g, d, c) \ - _fqMulLeg(Pz, f, g) \ - _fqMulLeg(Px, e, f) \ - _fqMulLeg(Py, g, h) - -#define mixAddBmi2 \ - _fqMulBmi2(c, Pta, Ptb) \ - _fqSub(h, b, a) \ - _fqAdd(b, b, a) \ - _fqMulBmi2(a, h, subYX) \ - _fqMulBmi2(b, b, addYX) \ - _fqSub(e, b, a) \ - _fqAdd(h, b, a) \ - _fqAdd(d, Pz, Pz) \ - _fqMulBmi2(c, c, dt2) \ - _fqSub(f, d, c) \ - _fqAdd(g, d, c) \ - _fqMulBmi2(Pz, f, g) \ - _fqMulBmi2(Px, e, f) \ - _fqMulBmi2(Py, g, h) diff --git a/ecc/fourq/point_amd64.s b/ecc/fourq/point_amd64.s deleted file mode 100644 index f4dd5dd5..00000000 --- a/ecc/fourq/point_amd64.s +++ /dev/null @@ -1,112 +0,0 @@ -// +build amd64,!purego - -#include "go_asm.h" -#include "fq_amd64.h" -#include "point_amd64.h" - -// func doubleAmd64(P *pointR1) -TEXT ·doubleAmd64(SB),0,$0-8 - MOVQ P+0(FP), DI - #define Px const__x +0(DI) - #define Py const__y +0(DI) - #define Pz const__z +0(DI) - #define Pta const__ta+0(DI) - #define Ptb const__tb+0(DI) - #define a Px - #define b Py - #define c Pz - #define d Pta - #define e Ptb - #define f b - #define g a - CHECK_BMI2(LDOUBLE, doubleLeg, doubleBmi2) - #undef Px - #undef Py - #undef Pz - #undef Pta - #undef Ptb - #undef a - #undef b - #undef c - #undef d - #undef e - #undef f - #undef g - -// func addAmd64(P *pointR1, R *pointR2) -TEXT ·addAmd64(SB),0,$32-16 - MOVQ P+0(FP), DI - MOVQ Q+8(FP), SI - #define addYX const__addYXR2+0(SI) - #define subYX const__subYXR2+0(SI) - #define z2 const__z2R2 +0(SI) - #define dt2 const__dt2R2 +0(SI) - #define Px const__x +0(DI) - #define Py const__y +0(DI) - #define Pz const__z +0(DI) - #define Pta const__ta+0(DI) - #define Ptb const__tb+0(DI) - #define a Px - #define b Py - #define c 0(SP) - #define d b - #define e Pta - #define f a - #define g b - #define h Ptb - CHECK_BMI2(LDADD, addLeg, addBmi2) - #undef addYX - #undef subYX - #undef z2 - #undef dt2 - #undef Px - #undef Py - #undef Pz - #undef Pta - #undef Ptb - #undef a - #undef b - #undef c - #undef d - #undef e - #undef f - #undef g - #undef h - -// func mixAddAmd64(P *pointR1, Q *pointR3) -TEXT ·mixAddAmd64(SB),0,$32-16 - MOVQ P+0(FP), DI - MOVQ Q+8(FP), SI - #define addYX const__addYXR3+0(SI) - #define subYX const__subYXR3+0(SI) - #define dt2 const__dt2R3 +0(SI) - #define Px const__x +0(DI) - #define Py const__y +0(DI) - #define Pz const__z +0(DI) - #define Pta const__ta+0(DI) - #define Ptb const__tb+0(DI) - #define a Px - #define b Py - #define c 0(SP) - #define d b - #define e Pta - #define f a - #define g b - #define h Ptb - CHECK_BMI2(LDMIXADD, mixAddLeg, mixAddBmi2) - #undef addYX - #undef subYX - #undef dt2 - #undef Px - #undef Py - #undef Pz - #undef Pta - #undef Ptb - #undef a - #undef b - #undef c - #undef d - #undef e - #undef f - #undef g - #undef h diff --git a/ecc/fourq/point_generic.go b/ecc/fourq/point_generic.go deleted file mode 100644 index 792cd31c..00000000 --- a/ecc/fourq/point_generic.go +++ /dev/null @@ -1,99 +0,0 @@ -//go:build !amd64 || purego -// +build !amd64 purego - -package fourq - -func doubleGeneric(P *pointR1) { - Px := &P.X - Py := &P.Y - Pz := &P.Z - Pta := &P.Ta - Ptb := &P.Tb - a := Px - b := Py - c := Pz - d := Pta - e := Ptb - f := b - g := a - fqAdd(e, Px, Py) - fqSqr(a, Px) - fqSqr(b, Py) - fqSqr(c, Pz) - fqAdd(c, c, c) - fqAdd(d, a, b) - fqSqr(e, e) - fqSub(e, e, d) - fqSub(f, b, a) - fqSub(g, c, f) - fqMul(Pz, f, g) - fqMul(Px, e, g) - fqMul(Py, d, f) -} - -func addGeneric(P *pointR1, Q *pointR2) { - addYX := &Q.addYX - subYX := &Q.subYX - z2 := &Q.z2 - dt2 := &Q.dt2 - Px := &P.X - Py := &P.Y - Pz := &P.Z - Pta := &P.Ta - Ptb := &P.Tb - a := Px - b := Py - c := &Fq{} - d := b - e := Pta - f := a - g := b - h := Ptb - fqMul(c, Pta, Ptb) - fqSub(h, b, a) - fqAdd(b, b, a) - fqMul(a, h, subYX) - fqMul(b, b, addYX) - fqSub(e, b, a) - fqAdd(h, b, a) - fqMul(d, Pz, z2) - fqMul(c, c, dt2) - fqSub(f, d, c) - fqAdd(g, d, c) - fqMul(Pz, f, g) - fqMul(Px, e, f) - fqMul(Py, g, h) -} - -func mixAddGeneric(P *pointR1, Q *pointR3) { - addYX := &Q.addYX - subYX := &Q.subYX - dt2 := &Q.dt2 - Px := &P.X - Py := &P.Y - Pz := &P.Z - Pta := &P.Ta - Ptb := &P.Tb - a := Px - b := Py - c := &Fq{} - d := b - e := Pta - f := a - g := b - h := Ptb - fqMul(c, Pta, Ptb) - fqSub(h, b, a) - fqAdd(b, b, a) - fqMul(a, h, subYX) - fqMul(b, b, addYX) - fqSub(e, b, a) - fqAdd(h, b, a) - fqAdd(d, Pz, Pz) - fqMul(c, c, dt2) - fqSub(f, d, c) - fqAdd(g, d, c) - fqMul(Pz, f, g) - fqMul(Px, e, f) - fqMul(Py, g, h) -} diff --git a/ecc/fourq/point_noasm.go b/ecc/fourq/point_noasm.go deleted file mode 100644 index 22c26954..00000000 --- a/ecc/fourq/point_noasm.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build !amd64 || purego -// +build !amd64 purego - -package fourq - -func (P *pointR1) double() { doubleGeneric(P) } -func (P *pointR1) add(Q *pointR2) { addGeneric(P, Q) } -func (P *pointR1) mixAdd(Q *pointR3) { mixAddGeneric(P, Q) } diff --git a/ecc/fourq/point_test.go b/ecc/fourq/point_test.go deleted file mode 100644 index 6fd0a89d..00000000 --- a/ecc/fourq/point_test.go +++ /dev/null @@ -1,344 +0,0 @@ -package fourq - -import ( - "crypto/rand" - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/internal/test" -) - -func (P *pointR1) random() { - var k [Size]byte - _, _ = rand.Read(k[:]) - P.ScalarBaseMult(&k) -} - -func TestPoint(t *testing.T) { - const testTimes = 1 << 10 - t.Run("IsOnCurve(ok)", func(t *testing.T) { - var gen Point - var goodGen pointR1 - gen.SetGenerator() - gen.toR1(&goodGen) - test.CheckOk(goodGen.IsOnCurve(), "valid point should pass", t) - }) - - t.Run("IsOnCurve(zero)", func(t *testing.T) { - var allZeros pointR1 - test.CheckOk(!allZeros.IsOnCurve(), "invalid point should be detected", t) - }) - - t.Run("IsOnCurve(bad)", func(t *testing.T) { - var badGen pointR1 - badGen.X = genX - badGen.Y = genY - test.CheckOk(!badGen.IsOnCurve(), "invalid point should be detected", t) - }) - - t.Run("IsEqual", func(t *testing.T) { - var badGen pointR1 - badGen.X = genX - badGen.Y = genY - var gen Point - var goodGen pointR1 - gen.SetGenerator() - gen.toR1(&goodGen) - test.CheckOk(!badGen.isEqual(&goodGen), "invalid point shouldn't match generator", t) - test.CheckOk(!goodGen.isEqual(&badGen), "invalid point shouldn't match generator", t) - test.CheckOk(goodGen.isEqual(&goodGen), "valid point should match generator", t) - test.CheckOk(!badGen.isEqual(&badGen), "invalid point shouldn't match anything", t) - }) - - t.Run("isEqual(fail-w/random)", func(t *testing.T) { - var badG pointR1 - badG.X = genX - badG.Y = genY - test.CheckOk(!badG.IsOnCurve(), "invalid point should be detected", t) - - var k [Size]byte - var got, want pointR1 - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(k[:]) - got.ScalarMult(&k, &badG) - want.random() - if got.isEqual(&want) { - test.ReportError(t, got, want, k) - } - } - }) -} - -func TestPointAddition(t *testing.T) { - const testTimes = 1 << 10 - var P, Q pointR1 - _16P := &pointR1{} - S := &pointR2{} - for i := 0; i < testTimes; i++ { - P.random() - _16P.copy(&P) - S.FromR1(&P) - // 16P = 2^4P - for j := 0; j < 4; j++ { - _16P.double() - } - // 16P = P+P...+P - Q.SetIdentity() - for j := 0; j < 16; j++ { - Q.add(S) - } - got := _16P.isEqual(&Q) - want := true - if got != want { - test.ReportError(t, got, want, P) - } - } -} - -func TestOddMultiples(t *testing.T) { - const testTimes = 1 << 10 - var P, Q, R pointR1 - var Tab [8]pointR2 - for i := 0; i < testTimes; i++ { - P.random() - // T = [1P, 3P, 5P, 7P, 9P, 11P, 13P, 15P] - P.oddMultiples(&Tab) - // Q = sum of all T[i] == 64P - Q.SetIdentity() - for j := range Tab { - Q.add(&Tab[j]) - } - // R = (2^6)P == 64P - R = P - for j := 0; j < 6; j++ { - R.double() - } - got := Q.isEqual(&R) - want := true - if got != want { - test.ReportError(t, got, want, P) - } - } -} - -func TestScalarMult(t *testing.T) { - const testTimes = 1 << 10 - var P, Q pointR1 - var k [Size]byte - - t.Run("0P=0", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - P.random() - Q.ScalarMult(&k, &P) - got := Q.IsIdentity() - want := true - if got != want { - test.ReportError(t, got, want, P) - } - } - }) - t.Run("order*P=0", func(t *testing.T) { - conv.BigInt2BytesLe(k[:], conv.Uint64Le2BigInt(orderGenerator[:])) - for i := 0; i < testTimes; i++ { - P.random() - Q.ScalarMult(&k, &P) - got := Q.IsIdentity() - want := true - if got != want { - test.ReportError(t, got, want, P) - } - } - }) - t.Run("cofactor*P=clear(P)", func(t *testing.T) { - conv.BigInt2BytesLe(k[:], big.NewInt(392)) - for i := 0; i < testTimes; i++ { - P.random() - Q.ScalarMult(&k, &P) - P.ClearCofactor() - got := Q.isEqual(&P) - want := true - if got != want { - test.ReportError(t, got, want, P) - } - } - }) - t.Run("mult", func(t *testing.T) { - var G Point - G.SetGenerator() - var gen pointR1 - G.toR1(&gen) - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(k[:]) - P.ScalarMult(&k, &gen) - Q.ScalarBaseMult(&k) - got := Q.isEqual(&P) - want := true - if got != want { - test.ReportError(t, got, want, k) - } - } - }) - t.Run("mult-non_curve_point_issue", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(k[:]) - Q.random() - P.ScalarMult(&k, &Q) - if !P.IsOnCurve() { - t.Fatalf("Point is not on curve: %X\n", P) - } - } - }) - t.Run("unmarshal-faulty-point", func(t *testing.T) { - // This test demonstrates that it is possible to find points which are unmarshalled - // successfully, but are not on the curve. - var marshalledPoint [Size]byte - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(marshalledPoint[:]) - unmarshalledP := Point{} - ok := unmarshalledP.Unmarshal(&marshalledPoint) - isOnCurve := unmarshalledP.IsOnCurve() - switch true { - case ok && !isOnCurve: - t.Fatalf("unmarshal ok, but not on curve: %v\n", unmarshalledP) - case !ok && isOnCurve: - t.Fatalf("unmarshal failed with a point on curve: %v\n", unmarshalledP) - } - } - }) -} - -func TestScalar(t *testing.T) { - const testTimes = 1 << 12 - var xx [5]uint64 - two256 := big.NewInt(1) - two256.Lsh(two256, 256) - two64 := big.NewInt(1) - two64.Lsh(two64, 64) - bigOrder := conv.Uint64Le2BigInt(orderGenerator[:]) - - t.Run("subYdiv16", func(t *testing.T) { - want := new(big.Int) - for i := 0; i < testTimes; i++ { - bigX, _ := rand.Int(rand.Reader, two256) - conv.BigInt2Uint64Le(xx[:], bigX) - x := xx - bigY, _ := rand.Int(rand.Reader, two64) - y := bigY.Int64() - bigY.SetInt64(y) - - subYDiv16(&x, y) - got := conv.Uint64Le2BigInt(x[:]) - - want.Sub(bigX, bigY).Rsh(want, 4) - - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, bigX, y) - } - } - }) - - t.Run("div2subY", func(t *testing.T) { - want := new(big.Int) - for i := 0; i < testTimes; i++ { - bigX, _ := rand.Int(rand.Reader, two256) - conv.BigInt2Uint64Le(xx[:], bigX) - x := xx - bigY, _ := rand.Int(rand.Reader, two64) - y := bigY.Int64() - bigY.SetInt64(y) - - div2subY(&x, y) - got := conv.Uint64Le2BigInt(x[:]) - - want.Rsh(bigX, 1).Sub(want, bigY) - - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, bigX, y) - } - } - }) - - t.Run("condAddOrderN", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - bigX, _ := rand.Int(rand.Reader, two256) - conv.BigInt2Uint64Le(xx[:], bigX) - x := xx - - condAddOrderN(&x) - got := conv.Uint64Le2BigInt(x[:]) - - want := bigX - if want.Bit(0) == 0 { - want.Add(want, bigOrder) - } - - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } - } - }) - - t.Run("recode", func(t *testing.T) { - var k [32]byte - var d [65]int8 - got := new(big.Int) - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(k[:]) - - recodeScalar(&d, &k) - got.SetInt64(0) - for j := len(d) - 1; j >= 0; j-- { - got.Lsh(got, 4).Add(got, big.NewInt(int64(d[j]))) - } - - want := conv.BytesLe2BigInt(k[:]) - if want.Bit(0) == 0 { - want.Add(want, bigOrder) - } - - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, k) - } - } - }) -} - -func BenchmarkPoint(b *testing.B) { - var P, R pointR1 - var Q pointR2 - var k [Size]byte - - _, _ = rand.Read(k[:]) - - P.random() - R.random() - Q.FromR1(&R) - R.random() - - b.Run("affine", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.ToAffine() - } - }) - b.Run("double", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.double() - } - }) - b.Run("add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.add(&Q) - } - }) - b.Run("scmulBase", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.ScalarBaseMult(&k) - } - }) - b.Run("scmul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.ScalarMult(&k, &R) - } - }) -} diff --git a/ecc/fourq/tableBase.go b/ecc/fourq/tableBase.go deleted file mode 100644 index 34785d65..00000000 --- a/ecc/fourq/tableBase.go +++ /dev/null @@ -1,131 +0,0 @@ -package fourq - -const ( - // This is the size of the largest scalar k = 2^256 - 1 + order - fxT = 257 - // Number of tables - fxV = 2 - // Window size - fxW = 3 - // Number of points per table - fx2w1 = (1 << (uint(fxW) - 1)) -) - -var tableBaseFixed = [fxV][fx2w1]pointR3{ - { - { - addYX: Fq{ - [SizeFp]byte{0x31, 0xe6, 0x03, 0xa7, 0xf3, 0x34, 0x8a, 0xe1, 0x5f, 0x2b, 0x50, 0x1d, 0xbf, 0x60, 0x74, 0x28}, - [SizeFp]byte{0x53, 0x03, 0xf9, 0xe4, 0xf7, 0x62, 0x2e, 0xe0, 0xde, 0xac, 0x86, 0x8b, 0x37, 0xa0, 0x3b, 0x0c}, - }, - subYX: Fq{ - [SizeFp]byte{0xdc, 0x7e, 0x93, 0xb0, 0x98, 0x0f, 0xbf, 0x90, 0x55, 0xc5, 0xf0, 0x24, 0x78, 0x7c, 0x0b, 0x74}, - [SizeFp]byte{0x66, 0x13, 0xa0, 0x23, 0x91, 0x23, 0x21, 0xb3, 0xa5, 0x57, 0x95, 0x3a, 0xb9, 0xf5, 0xfc, 0x4f}, - }, - dt2: Fq{ - [SizeFp]byte{0xbb, 0x42, 0xda, 0xab, 0xcb, 0xfc, 0x7a, 0x29, 0xc6, 0x97, 0x6c, 0x55, 0x37, 0xd1, 0x48, 0x59}, - [SizeFp]byte{0x4c, 0x68, 0x30, 0x33, 0x39, 0x9a, 0x18, 0xa8, 0x27, 0x1f, 0x34, 0x0a, 0x72, 0x2b, 0xaf, 0x0c}, - }, - }, - { - addYX: Fq{ - [SizeFp]byte{0x6a, 0x23, 0x5d, 0xcf, 0x2e, 0xf2, 0x8b, 0x5f, 0x5a, 0x2a, 0x6f, 0xa0, 0xef, 0xa7, 0x76, 0x32}, - [SizeFp]byte{0x57, 0xad, 0x0b, 0x1a, 0x60, 0xc4, 0x43, 0xdf, 0x6a, 0xbc, 0x31, 0xe6, 0x55, 0xd5, 0xc4, 0x4b}, - }, - subYX: Fq{ - [SizeFp]byte{0xf7, 0xab, 0xbf, 0xd2, 0x55, 0x8c, 0x13, 0xfe, 0xca, 0x64, 0x65, 0x03, 0xa9, 0x93, 0x29, 0x64}, - [SizeFp]byte{0xb5, 0x9b, 0xdd, 0x17, 0xb1, 0x5a, 0x0e, 0xbc, 0x22, 0x41, 0x77, 0x11, 0x25, 0x6f, 0xa1, 0x68}, - }, - dt2: Fq{ - [SizeFp]byte{0xb6, 0x76, 0xfe, 0x14, 0xa1, 0x31, 0x4e, 0xc8, 0xc4, 0x5f, 0x2c, 0x8d, 0x05, 0x23, 0xa8, 0x16}, - [SizeFp]byte{0x9d, 0x45, 0x6d, 0x97, 0xd7, 0x0a, 0x22, 0x5a, 0x7a, 0x71, 0x2c, 0x06, 0x6d, 0xeb, 0x9a, 0x7d}, - }, - }, - { - addYX: Fq{ - [SizeFp]byte{0x46, 0x6b, 0x69, 0xeb, 0x7f, 0x13, 0x9a, 0x2b, 0x40, 0x0a, 0xc1, 0xdc, 0xfa, 0x66, 0xf0, 0x39}, - [SizeFp]byte{0x77, 0x9c, 0xd9, 0x0a, 0x0e, 0x65, 0xb3, 0xc6, 0xbd, 0x1d, 0x7f, 0xe0, 0xf8, 0x5a, 0x4f, 0x55}, - }, - subYX: Fq{ - [SizeFp]byte{0xc1, 0x88, 0xb5, 0x09, 0xd0, 0xc5, 0x63, 0x62, 0x8e, 0x0e, 0x6b, 0xeb, 0xfd, 0x49, 0x27, 0x7a}, - [SizeFp]byte{0x8c, 0x38, 0x5e, 0x06, 0x05, 0x17, 0x5e, 0xe4, 0x2f, 0xda, 0x4b, 0x9f, 0x94, 0x68, 0x4d, 0x5b}, - }, - dt2: Fq{ - [SizeFp]byte{0x6f, 0x84, 0xf3, 0x3f, 0x08, 0x26, 0x0c, 0xb4, 0xfa, 0xc7, 0x9e, 0xe6, 0x2f, 0xef, 0x3f, 0x53}, - [SizeFp]byte{0x47, 0xd1, 0x71, 0x88, 0x9d, 0x2e, 0xcd, 0x4e, 0x94, 0x03, 0x49, 0xbe, 0x0b, 0x1a, 0x91, 0x6d}, - }, - }, - { - addYX: Fq{ - [SizeFp]byte{0x73, 0x9b, 0x3b, 0x99, 0x69, 0x39, 0x8c, 0xda, 0xf2, 0x3d, 0xba, 0xad, 0x7c, 0x75, 0xeb, 0x26}, - [SizeFp]byte{0x18, 0x56, 0xe6, 0xa9, 0xa4, 0x10, 0xf3, 0x13, 0x33, 0x25, 0x04, 0x60, 0x2a, 0x00, 0x62, 0x18}, - }, - subYX: Fq{ - [SizeFp]byte{0x6d, 0xcd, 0x87, 0xca, 0xce, 0xd1, 0xda, 0xb4, 0x5f, 0xd9, 0x0c, 0x21, 0x45, 0x3d, 0xf4, 0x38}, - [SizeFp]byte{0xc1, 0xe5, 0x03, 0xa6, 0x64, 0x57, 0x30, 0x13, 0xc7, 0xf8, 0xaa, 0xf2, 0xcd, 0x8f, 0x57, 0x6e}, - }, - dt2: Fq{ - [SizeFp]byte{0x05, 0x02, 0xcb, 0x13, 0xd6, 0x24, 0xa0, 0x20, 0xa9, 0xe0, 0xe0, 0xdd, 0x90, 0x6f, 0xd0, 0x7c}, - [SizeFp]byte{0xfc, 0x91, 0x59, 0x14, 0x5b, 0xa4, 0x8e, 0xf5, 0xe1, 0xc0, 0x4c, 0x82, 0xce, 0xe2, 0xf6, 0x41}, - }, - }, - }, - { - { - addYX: Fq{ - [SizeFp]byte{0x60, 0x31, 0xb8, 0xc2, 0xb0, 0x7f, 0x36, 0xdb, 0x8c, 0xe8, 0xfc, 0x0a, 0x1b, 0xf3, 0x2e, 0x21}, - [SizeFp]byte{0x5e, 0x89, 0xd9, 0xf0, 0xfc, 0x47, 0xe5, 0x20, 0x10, 0xe6, 0x26, 0xf2, 0x67, 0xdb, 0xcc, 0x42}, - }, - subYX: Fq{ - [SizeFp]byte{0x0e, 0x3b, 0xad, 0x12, 0x15, 0xa3, 0x40, 0x9e, 0x73, 0x97, 0x99, 0x43, 0x28, 0x74, 0xfe, 0x6d}, - [SizeFp]byte{0x92, 0x93, 0x68, 0xe8, 0xf5, 0xaf, 0x70, 0x4f, 0x1b, 0x4a, 0x36, 0x13, 0x21, 0x89, 0xee, 0x5f}, - }, - dt2: Fq{ - [SizeFp]byte{0x41, 0xc5, 0x53, 0xc7, 0xf7, 0xa4, 0x99, 0x82, 0x00, 0x49, 0x7f, 0x5f, 0xbe, 0x40, 0xc2, 0x7f}, - [SizeFp]byte{0xa6, 0x22, 0xe3, 0x40, 0x6e, 0xc7, 0xee, 0x4c, 0xff, 0x36, 0xf4, 0x01, 0x4b, 0x52, 0x54, 0x77}, - }, - }, - { - addYX: Fq{ - [SizeFp]byte{0x35, 0x58, 0xef, 0x56, 0xbc, 0xbb, 0xdf, 0xf9, 0x59, 0x2e, 0xf2, 0x2f, 0x4d, 0x89, 0xd8, 0x1d}, - [SizeFp]byte{0x6c, 0xde, 0xe6, 0xde, 0x89, 0x39, 0x24, 0x3a, 0xce, 0x8e, 0xf5, 0x46, 0x33, 0x2b, 0xa8, 0x12}, - }, - subYX: Fq{ - [SizeFp]byte{0x60, 0x72, 0x41, 0xb1, 0x06, 0xaf, 0x7d, 0x08, 0x6e, 0xee, 0xb7, 0x5e, 0x23, 0x95, 0xbf, 0x79}, - [SizeFp]byte{0x34, 0x42, 0xdc, 0x3a, 0x73, 0x96, 0x94, 0xbe, 0xb9, 0x5d, 0xb4, 0x4b, 0x10, 0x48, 0x5e, 0x25}, - }, - dt2: Fq{ - [SizeFp]byte{0x44, 0xff, 0xf4, 0x38, 0x90, 0x9d, 0xf4, 0x14, 0x9f, 0x4d, 0x5c, 0xab, 0xee, 0x68, 0xba, 0x0d}, - [SizeFp]byte{0x45, 0x95, 0xe5, 0x91, 0x20, 0x15, 0x7b, 0xe8, 0x1f, 0x89, 0x12, 0x51, 0xd3, 0xfa, 0x82, 0x0d}, - }, - }, - { - addYX: Fq{ - [SizeFp]byte{0x0c, 0xa3, 0xf8, 0x33, 0x76, 0x28, 0x4f, 0x2d, 0x26, 0xcc, 0x29, 0x77, 0x1a, 0xb3, 0x6e, 0x41}, - [SizeFp]byte{0xef, 0xc8, 0x87, 0x5d, 0x26, 0x5d, 0x2f, 0xd1, 0x5c, 0xe0, 0x04, 0x58, 0x1c, 0xa9, 0x80, 0x4d}, - }, - subYX: Fq{ - [SizeFp]byte{0x0a, 0xff, 0x06, 0x42, 0xe4, 0x76, 0xc5, 0xfa, 0xcd, 0x2a, 0xfb, 0x4c, 0xfa, 0x22, 0x0a, 0x7d}, - [SizeFp]byte{0xd9, 0x5c, 0x89, 0x6d, 0x63, 0xe8, 0x0a, 0xb3, 0x29, 0xa4, 0xb9, 0x42, 0x12, 0x1d, 0xea, 0x00}, - }, - dt2: Fq{ - [SizeFp]byte{0xb3, 0x59, 0x9d, 0x40, 0xdb, 0x32, 0x11, 0x41, 0x10, 0xa1, 0xbf, 0xf1, 0x7a, 0xe3, 0xdd, 0x11}, - [SizeFp]byte{0x2c, 0xcc, 0x5c, 0x98, 0x1c, 0xd5, 0x95, 0xd2, 0x96, 0x51, 0xb1, 0x82, 0xb2, 0x7f, 0xe7, 0x6a}, - }, - }, - { - addYX: Fq{ - [SizeFp]byte{0x07, 0xe9, 0xb9, 0x83, 0xeb, 0xf2, 0x9f, 0xd7, 0x43, 0x7c, 0xc2, 0xb0, 0x32, 0x70, 0xd0, 0x52}, - [SizeFp]byte{0xf9, 0x70, 0x82, 0x31, 0x7a, 0x9a, 0x9f, 0x75, 0xe9, 0x6c, 0x87, 0x73, 0x97, 0x1a, 0x5a, 0x22}, - }, - subYX: Fq{ - [SizeFp]byte{0x0b, 0x3b, 0xe5, 0x98, 0xdc, 0xf6, 0xd1, 0xf5, 0xb7, 0x7e, 0x34, 0x22, 0x35, 0x60, 0x41, 0x53}, - [SizeFp]byte{0x1f, 0xf4, 0xcc, 0x56, 0xbb, 0x76, 0x3e, 0xd9, 0x3b, 0x63, 0x82, 0x25, 0x98, 0x12, 0x80, 0x02}, - }, - dt2: Fq{ - [SizeFp]byte{0xeb, 0xdc, 0x9a, 0x7a, 0x70, 0x61, 0x5d, 0x6e, 0x41, 0x05, 0xd4, 0x0b, 0x4a, 0x63, 0x2a, 0x3b}, - [SizeFp]byte{0xab, 0x52, 0xe0, 0xb1, 0x3f, 0x8a, 0xb0, 0x2d, 0x55, 0xf8, 0x1c, 0xeb, 0xc1, 0x1b, 0xc8, 0x35}, - }, - }, - }, -} diff --git a/ecc/goldilocks/constants.go b/ecc/goldilocks/constants.go deleted file mode 100644 index daa1ec40..00000000 --- a/ecc/goldilocks/constants.go +++ /dev/null @@ -1,71 +0,0 @@ -package goldilocks - -import fp "github.com/quantumcoinproject/circl/math/fp448" - -var ( - // genX is the x-coordinate of the generator of Goldilocks curve. - genX = fp.Elt{ - 0x5e, 0xc0, 0x0c, 0xc7, 0x2b, 0xa8, 0x26, 0x26, - 0x8e, 0x93, 0x00, 0x8b, 0xe1, 0x80, 0x3b, 0x43, - 0x11, 0x65, 0xb6, 0x2a, 0xf7, 0x1a, 0xae, 0x12, - 0x64, 0xa4, 0xd3, 0xa3, 0x24, 0xe3, 0x6d, 0xea, - 0x67, 0x17, 0x0f, 0x47, 0x70, 0x65, 0x14, 0x9e, - 0xda, 0x36, 0xbf, 0x22, 0xa6, 0x15, 0x1d, 0x22, - 0xed, 0x0d, 0xed, 0x6b, 0xc6, 0x70, 0x19, 0x4f, - } - // genY is the y-coordinate of the generator of Goldilocks curve. - genY = fp.Elt{ - 0x14, 0xfa, 0x30, 0xf2, 0x5b, 0x79, 0x08, 0x98, - 0xad, 0xc8, 0xd7, 0x4e, 0x2c, 0x13, 0xbd, 0xfd, - 0xc4, 0x39, 0x7c, 0xe6, 0x1c, 0xff, 0xd3, 0x3a, - 0xd7, 0xc2, 0xa0, 0x05, 0x1e, 0x9c, 0x78, 0x87, - 0x40, 0x98, 0xa3, 0x6c, 0x73, 0x73, 0xea, 0x4b, - 0x62, 0xc7, 0xc9, 0x56, 0x37, 0x20, 0x76, 0x88, - 0x24, 0xbc, 0xb6, 0x6e, 0x71, 0x46, 0x3f, 0x69, - } - // paramD is -39081 in Fp. - paramD = fp.Elt{ - 0x56, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - } - // order is 2^446-0x8335dc163bb124b65129c96fde933d8d723a70aadc873d6d54a7bb0d, - // which is the number of points in the prime subgroup. - order = Scalar{ - 0xf3, 0x44, 0x58, 0xab, 0x92, 0xc2, 0x78, 0x23, - 0x55, 0x8f, 0xc5, 0x8d, 0x72, 0xc2, 0x6c, 0x21, - 0x90, 0x36, 0xd6, 0xae, 0x49, 0xdb, 0x4e, 0xc4, - 0xe9, 0x23, 0xca, 0x7c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, - } - // residue448 is 2^448 mod order. - residue448 = [4]uint64{ - 0x721cf5b5529eec34, 0x7a4cf635c8e9c2ab, 0xeec492d944a725bf, 0x20cd77058, - } - // invFour is 1/4 mod order. - invFour = Scalar{ - 0x3d, 0x11, 0xd6, 0xaa, 0xa4, 0x30, 0xde, 0x48, - 0xd5, 0x63, 0x71, 0xa3, 0x9c, 0x30, 0x5b, 0x08, - 0xa4, 0x8d, 0xb5, 0x6b, 0xd2, 0xb6, 0x13, 0x71, - 0xfa, 0x88, 0x32, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - } - // paramDTwist is -39082 in Fp. The D parameter of the twist curve. - paramDTwist = fp.Elt{ - 0x55, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - } -) diff --git a/ecc/goldilocks/curve.go b/ecc/goldilocks/curve.go deleted file mode 100644 index 5ef68b9c..00000000 --- a/ecc/goldilocks/curve.go +++ /dev/null @@ -1,84 +0,0 @@ -// Package goldilocks provides elliptic curve operations over the goldilocks curve. -package goldilocks - -import fp "github.com/quantumcoinproject/circl/math/fp448" - -// Curve is the Goldilocks curve x^2+y^2=z^2-39081x^2y^2. -type Curve struct{} - -// Identity returns the identity point. -func (Curve) Identity() *Point { - return &Point{ - y: fp.One(), - z: fp.One(), - } -} - -// IsOnCurve returns true if the point lies on the curve. -func (Curve) IsOnCurve(P *Point) bool { - x2, y2, t, t2, z2 := &fp.Elt{}, &fp.Elt{}, &fp.Elt{}, &fp.Elt{}, &fp.Elt{} - rhs, lhs := &fp.Elt{}, &fp.Elt{} - // Check z != 0 - eq0 := !fp.IsZero(&P.z) - - fp.Mul(t, &P.ta, &P.tb) // t = ta*tb - fp.Sqr(x2, &P.x) // x^2 - fp.Sqr(y2, &P.y) // y^2 - fp.Sqr(z2, &P.z) // z^2 - fp.Sqr(t2, t) // t^2 - fp.Add(lhs, x2, y2) // x^2 + y^2 - fp.Mul(rhs, t2, ¶mD) // dt^2 - fp.Add(rhs, rhs, z2) // z^2 + dt^2 - fp.Sub(lhs, lhs, rhs) // x^2 + y^2 - (z^2 + dt^2) - eq1 := fp.IsZero(lhs) - - fp.Mul(lhs, &P.x, &P.y) // xy - fp.Mul(rhs, t, &P.z) // tz - fp.Sub(lhs, lhs, rhs) // xy - tz - eq2 := fp.IsZero(lhs) - - return eq0 && eq1 && eq2 -} - -// Generator returns the generator point. -func (Curve) Generator() *Point { - return &Point{ - x: genX, - y: genY, - z: fp.One(), - ta: genX, - tb: genY, - } -} - -// Order returns the number of points in the prime subgroup. -func (Curve) Order() Scalar { return order } - -// Double returns 2P. -func (Curve) Double(P *Point) *Point { R := *P; R.Double(); return &R } - -// Add returns P+Q. -func (Curve) Add(P, Q *Point) *Point { R := *P; R.Add(Q); return &R } - -// ScalarMult returns kP. This function runs in constant time. -func (e Curve) ScalarMult(k *Scalar, P *Point) *Point { - k4 := &Scalar{} - k4.divBy4(k) - return e.pull(twistCurve{}.ScalarMult(k4, e.push(P))) -} - -// ScalarBaseMult returns kG where G is the generator point. This function runs in constant time. -func (e Curve) ScalarBaseMult(k *Scalar) *Point { - k4 := &Scalar{} - k4.divBy4(k) - return e.pull(twistCurve{}.ScalarBaseMult(k4)) -} - -// CombinedMult returns mG+nP, where G is the generator point. This function is non-constant time. -func (e Curve) CombinedMult(m, n *Scalar, P *Point) *Point { - m4 := &Scalar{} - n4 := &Scalar{} - m4.divBy4(m) - n4.divBy4(n) - return e.pull(twistCurve{}.CombinedMult(m4, n4, twistCurve{}.pull(P))) -} diff --git a/ecc/goldilocks/curve_test.go b/ecc/goldilocks/curve_test.go deleted file mode 100644 index 90b2b983..00000000 --- a/ecc/goldilocks/curve_test.go +++ /dev/null @@ -1,113 +0,0 @@ -package goldilocks_test - -import ( - "crypto/rand" - "testing" - - "github.com/quantumcoinproject/circl/ecc/goldilocks" - "github.com/quantumcoinproject/circl/internal/test" -) - -func TestScalarMult(t *testing.T) { - const testTimes = 1 << 8 - var e goldilocks.Curve - k := &goldilocks.Scalar{} - zero := &goldilocks.Scalar{} - - t.Run("rG=0", func(t *testing.T) { - order := e.Order() - for i := 0; i < testTimes; i++ { - got := e.ScalarBaseMult(&order) - got.ToAffine() - want := e.Identity() - - if !e.IsOnCurve(got) || !e.IsOnCurve(want) || !got.IsEqual(want) { - want.ToAffine() - test.ReportError(t, got, want) - } - } - }) - t.Run("rP=0", func(t *testing.T) { - order := e.Order() - for i := 0; i < testTimes; i++ { - P := randomPoint() - - got := e.ScalarMult(&order, P) - got.ToAffine() - want := e.Identity() - - if !e.IsOnCurve(got) || !e.IsOnCurve(want) || !got.IsEqual(want) { - want.ToAffine() - test.ReportError(t, got, want, P, order) - } - } - }) - t.Run("kG", func(t *testing.T) { - I := e.Identity() - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(k[:]) - - got := e.ScalarBaseMult(k) - want := e.CombinedMult(k, zero, I) // k*G + 0*I - - if !e.IsOnCurve(got) || !e.IsOnCurve(want) || !got.IsEqual(want) { - test.ReportError(t, got, want, k) - } - } - }) - t.Run("kP", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - P := randomPoint() - _, _ = rand.Read(k[:]) - - got := e.ScalarMult(k, P) - want := e.CombinedMult(zero, k, P) - - if !e.IsOnCurve(got) || !e.IsOnCurve(want) || !got.IsEqual(want) { - test.ReportError(t, got, want, P, k) - } - } - }) - t.Run("kG+lP", func(t *testing.T) { - G := e.Generator() - l := &goldilocks.Scalar{} - for i := 0; i < testTimes; i++ { - P := randomPoint() - _, _ = rand.Read(k[:]) - _, _ = rand.Read(l[:]) - - kG := e.ScalarMult(k, G) - lP := e.ScalarMult(l, P) - got := e.Add(kG, lP) - want := e.CombinedMult(k, l, P) - - if !e.IsOnCurve(got) || !e.IsOnCurve(want) || !got.IsEqual(want) { - test.ReportError(t, got, want, P, k, l) - } - } - }) -} - -func BenchmarkCurve(b *testing.B) { - var e goldilocks.Curve - var k, l goldilocks.Scalar - _, _ = rand.Read(k[:]) - _, _ = rand.Read(l[:]) - P := randomPoint() - - b.Run("ScalarMult", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P = e.ScalarMult(&k, P) - } - }) - b.Run("ScalarBaseMult", func(b *testing.B) { - for i := 0; i < b.N; i++ { - e.ScalarBaseMult(&k) - } - }) - b.Run("CombinedMult", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P = e.CombinedMult(&k, &l, P) - } - }) -} diff --git a/ecc/goldilocks/isogeny.go b/ecc/goldilocks/isogeny.go deleted file mode 100644 index c90cb427..00000000 --- a/ecc/goldilocks/isogeny.go +++ /dev/null @@ -1,52 +0,0 @@ -package goldilocks - -import fp "github.com/quantumcoinproject/circl/math/fp448" - -func (Curve) pull(P *twistPoint) *Point { return twistCurve{}.push(P) } -func (twistCurve) pull(P *Point) *twistPoint { return Curve{}.push(P) } - -// push sends a point on the Goldilocks curve to a point on the twist curve. -func (Curve) push(P *Point) *twistPoint { - Q := &twistPoint{} - Px, Py, Pz := &P.x, &P.y, &P.z - a, b, c, d, e, f, g, h := &Q.x, &Q.y, &Q.z, &fp.Elt{}, &Q.ta, &Q.x, &Q.y, &Q.tb - fp.Add(e, Px, Py) // x+y - fp.Sqr(a, Px) // A = x^2 - fp.Sqr(b, Py) // B = y^2 - fp.Sqr(c, Pz) // z^2 - fp.Add(c, c, c) // C = 2*z^2 - *d = *a // D = A - fp.Sqr(e, e) // (x+y)^2 - fp.Sub(e, e, a) // (x+y)^2-A - fp.Sub(e, e, b) // E = (x+y)^2-A-B - fp.Add(h, b, d) // H = B+D - fp.Sub(g, b, d) // G = B-D - fp.Sub(f, c, h) // F = C-H - fp.Mul(&Q.z, f, g) // Z = F * G - fp.Mul(&Q.x, e, f) // X = E * F - fp.Mul(&Q.y, g, h) // Y = G * H, // T = E * H - return Q -} - -// push sends a point on the twist curve to a point on the Goldilocks curve. -func (twistCurve) push(P *twistPoint) *Point { - Q := &Point{} - Px, Py, Pz := &P.x, &P.y, &P.z - a, b, c, d, e, f, g, h := &Q.x, &Q.y, &Q.z, &fp.Elt{}, &Q.ta, &Q.x, &Q.y, &Q.tb - fp.Add(e, Px, Py) // x+y - fp.Sqr(a, Px) // A = x^2 - fp.Sqr(b, Py) // B = y^2 - fp.Sqr(c, Pz) // z^2 - fp.Add(c, c, c) // C = 2*z^2 - fp.Neg(d, a) // D = -A - fp.Sqr(e, e) // (x+y)^2 - fp.Sub(e, e, a) // (x+y)^2-A - fp.Sub(e, e, b) // E = (x+y)^2-A-B - fp.Add(h, b, d) // H = B+D - fp.Sub(g, b, d) // G = B-D - fp.Sub(f, c, h) // F = C-H - fp.Mul(&Q.z, f, g) // Z = F * G - fp.Mul(&Q.x, e, f) // X = E * F - fp.Mul(&Q.y, g, h) // Y = G * H, // T = E * H - return Q -} diff --git a/ecc/goldilocks/isogeny_test.go b/ecc/goldilocks/isogeny_test.go deleted file mode 100644 index 8dd68e7d..00000000 --- a/ecc/goldilocks/isogeny_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package goldilocks - -import ( - "crypto/rand" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func randomPoint() *Point { - var k Scalar - _, _ = rand.Read(k[:]) - return Curve{}.ScalarBaseMult(&k) -} - -func TestIsogeny(t *testing.T) { - const testTimes = 1 << 10 - var gold Curve - var twist twistCurve - - for i := 0; i < testTimes; i++ { - P := randomPoint() - Q := gold.pull(gold.push(P)) // phi^-(phi^+(P)) - got := Q - want := gold.Double(gold.Double(P)) // 4P - if !got.IsEqual(want) { - test.ReportError(t, got, want, P) - } - got = twist.push(twist.pull(Q)) // phi^-(phi^+(Q)) - want = gold.Double(gold.Double(Q)) // 4Q - if !got.IsEqual(want) { - test.ReportError(t, got, want, P) - } - } -} diff --git a/ecc/goldilocks/point.go b/ecc/goldilocks/point.go deleted file mode 100644 index c47afccc..00000000 --- a/ecc/goldilocks/point.go +++ /dev/null @@ -1,171 +0,0 @@ -package goldilocks - -import ( - "errors" - "fmt" - - fp "github.com/quantumcoinproject/circl/math/fp448" -) - -// Point is a point on the Goldilocks Curve. -type Point struct{ x, y, z, ta, tb fp.Elt } - -func (P Point) String() string { - return fmt.Sprintf("x: %v\ny: %v\nz: %v\nta: %v\ntb: %v", P.x, P.y, P.z, P.ta, P.tb) -} - -// FromAffine creates a point from affine coordinates. -func FromAffine(x, y *fp.Elt) (*Point, error) { - P := &Point{ - x: *x, - y: *y, - z: fp.One(), - ta: *x, - tb: *y, - } - if !(Curve{}).IsOnCurve(P) { - return P, errors.New("point not on curve") - } - return P, nil -} - -// isLessThan returns true if 0 <= x < y, and assumes that slices are of the -// same length and are interpreted in little-endian order. -func isLessThan(x, y []byte) bool { - i := len(x) - 1 - for i > 0 && x[i] == y[i] { - i-- - } - return x[i] < y[i] -} - -// FromBytes returns a point from the input buffer. -func FromBytes(in []byte) (*Point, error) { - if len(in) < fp.Size+1 { - return nil, errors.New("wrong input length") - } - err := errors.New("invalid decoding") - P := &Point{} - signX := in[fp.Size] >> 7 - copy(P.y[:], in[:fp.Size]) - p := fp.P() - if !isLessThan(P.y[:], p[:]) { - return nil, err - } - - u, v := &fp.Elt{}, &fp.Elt{} - one := fp.One() - fp.Sqr(u, &P.y) // u = y^2 - fp.Mul(v, u, ¶mD) // v = dy^2 - fp.Sub(u, u, &one) // u = y^2-1 - fp.Sub(v, v, &one) // v = dy^2-1 - isQR := fp.InvSqrt(&P.x, u, v) // x = sqrt(u/v) - if !isQR { - return nil, err - } - fp.Modp(&P.x) // x = x mod p - if fp.IsZero(&P.x) && signX == 1 { - return nil, err - } - if signX != (P.x[0] & 1) { - fp.Neg(&P.x, &P.x) - } - P.ta = P.x - P.tb = P.y - P.z = fp.One() - return P, nil -} - -// IsIdentity returns true is P is the identity Point. -func (P *Point) IsIdentity() bool { - return fp.IsZero(&P.x) && !fp.IsZero(&P.y) && !fp.IsZero(&P.z) && P.y == P.z -} - -// IsEqual returns true if P is equivalent to Q. -func (P *Point) IsEqual(Q *Point) bool { - l, r := &fp.Elt{}, &fp.Elt{} - fp.Mul(l, &P.x, &Q.z) - fp.Mul(r, &Q.x, &P.z) - fp.Sub(l, l, r) - b := fp.IsZero(l) - fp.Mul(l, &P.y, &Q.z) - fp.Mul(r, &Q.y, &P.z) - fp.Sub(l, l, r) - b = b && fp.IsZero(l) - fp.Mul(l, &P.ta, &P.tb) - fp.Mul(l, l, &Q.z) - fp.Mul(r, &Q.ta, &Q.tb) - fp.Mul(r, r, &P.z) - fp.Sub(l, l, r) - b = b && fp.IsZero(l) - return b -} - -// Neg obtains the inverse of the Point. -func (P *Point) Neg() { fp.Neg(&P.x, &P.x); fp.Neg(&P.ta, &P.ta) } - -// ToAffine returns the x,y affine coordinates of P. -func (P *Point) ToAffine() (x, y fp.Elt) { - fp.Inv(&P.z, &P.z) // 1/z - fp.Mul(&P.x, &P.x, &P.z) // x/z - fp.Mul(&P.y, &P.y, &P.z) // y/z - fp.Modp(&P.x) - fp.Modp(&P.y) - fp.SetOne(&P.z) - P.ta = P.x - P.tb = P.y - return P.x, P.y -} - -// ToBytes stores P into a slice of bytes. -func (P *Point) ToBytes(out []byte) error { - if len(out) < fp.Size+1 { - return errors.New("invalid decoding") - } - x, y := P.ToAffine() - out[fp.Size] = (x[0] & 1) << 7 - return fp.ToBytes(out[:fp.Size], &y) -} - -// MarshalBinary encodes the receiver into a binary form and returns the result. -func (P *Point) MarshalBinary() (data []byte, err error) { - data = make([]byte, fp.Size+1) - err = P.ToBytes(data[:fp.Size+1]) - return data, err -} - -// UnmarshalBinary must be able to decode the form generated by MarshalBinary. -func (P *Point) UnmarshalBinary(data []byte) error { Q, err := FromBytes(data); *P = *Q; return err } - -// Double sets P = 2Q. -func (P *Point) Double() { P.Add(P) } - -// Add sets P =P+Q.. -func (P *Point) Add(Q *Point) { - // This is formula (5) from "Twisted Edwards Curves Revisited" by - // Hisil H., Wong K.KH., Carter G., Dawson E. (2008) - // https://doi.org/10.1007/978-3-540-89255-7_20 - x1, y1, z1, ta1, tb1 := &P.x, &P.y, &P.z, &P.ta, &P.tb - x2, y2, z2, ta2, tb2 := &Q.x, &Q.y, &Q.z, &Q.ta, &Q.tb - x3, y3, z3, E, H := &P.x, &P.y, &P.z, &P.ta, &P.tb - A, B, C, D := &fp.Elt{}, &fp.Elt{}, &fp.Elt{}, &fp.Elt{} - t1, t2, F, G := C, D, &fp.Elt{}, &fp.Elt{} - fp.Mul(t1, ta1, tb1) // t1 = ta1*tb1 - fp.Mul(t2, ta2, tb2) // t2 = ta2*tb2 - fp.Mul(A, x1, x2) // A = x1*x2 - fp.Mul(B, y1, y2) // B = y1*y2 - fp.Mul(C, t1, t2) // t1*t2 - fp.Mul(C, C, ¶mD) // C = d*t1*t2 - fp.Mul(D, z1, z2) // D = z1*z2 - fp.Add(F, x1, y1) // x1+y1 - fp.Add(E, x2, y2) // x2+y2 - fp.Mul(E, E, F) // (x1+y1)*(x2+y2) - fp.Sub(E, E, A) // (x1+y1)*(x2+y2)-A - fp.Sub(E, E, B) // E = (x1+y1)*(x2+y2)-A-B - fp.Sub(F, D, C) // F = D-C - fp.Add(G, D, C) // G = D+C - fp.Sub(H, B, A) // H = B-A - fp.Mul(z3, F, G) // Z = F * G - fp.Mul(x3, E, F) // X = E * F - fp.Mul(y3, G, H) // Y = G * H, T = E * H -} diff --git a/ecc/goldilocks/point_test.go b/ecc/goldilocks/point_test.go deleted file mode 100644 index 200c924f..00000000 --- a/ecc/goldilocks/point_test.go +++ /dev/null @@ -1,114 +0,0 @@ -package goldilocks_test - -import ( - "crypto/rand" - "encoding" - "testing" - - "github.com/quantumcoinproject/circl/ecc/goldilocks" - "github.com/quantumcoinproject/circl/internal/test" -) - -func randomPoint() *goldilocks.Point { - var k goldilocks.Scalar - _, _ = rand.Read(k[:]) - return goldilocks.Curve{}.ScalarBaseMult(&k) -} - -func TestPoint(t *testing.T) { - c := goldilocks.Curve{} - t.Run("IsOnCurve(ok)", func(t *testing.T) { - goodGen := c.Generator() - test.CheckOk(c.IsOnCurve(goodGen), "valid point should pass", t) - }) - - t.Run("IsOnCurve(zero)", func(t *testing.T) { - var allZeros goldilocks.Point - test.CheckOk(!c.IsOnCurve(&allZeros), "invalid point should be detected", t) - }) -} - -func TestPointAdd(t *testing.T) { - const testTimes = 1 << 10 - var e goldilocks.Curve - for i := 0; i < testTimes; i++ { - P := randomPoint() - // 16P = 2^4P - got := e.Double(e.Double(e.Double(e.Double(P)))) - // 16P = P+P...+P - Q := e.Identity() - for j := 0; j < 16; j++ { - Q = e.Add(Q, P) - } - want := Q - if !e.IsOnCurve(got) || !e.IsOnCurve(want) || !got.IsEqual(want) { - test.ReportError(t, got, want, P) - } - } -} - -func TestPointNeg(t *testing.T) { - const testTimes = 1 << 10 - var e goldilocks.Curve - for i := 0; i < testTimes; i++ { - P := randomPoint() - Q := *P - Q.Neg() - R := e.Add(P, &Q) - got := R.IsIdentity() - want := true - if got != want { - test.ReportError(t, got, want, P) - } - } -} - -func TestPointAffine(t *testing.T) { - const testTimes = 1 << 10 - for i := 0; i < testTimes; i++ { - got := randomPoint() - x, y := got.ToAffine() - want, err := goldilocks.FromAffine(&x, &y) - if !got.IsEqual(want) || err != nil { - test.ReportError(t, got, want) - } - } -} - -func TestPointMarshal(t *testing.T) { - const testTimes = 1 << 10 - var want error - for i := 0; i < testTimes; i++ { - var P interface{} = randomPoint() - mar, _ := P.(encoding.BinaryMarshaler) - data, got := mar.MarshalBinary() - if got != want { - test.ReportError(t, got, want, P) - } - unmar, _ := P.(encoding.BinaryUnmarshaler) - got = unmar.UnmarshalBinary(data) - if got != want { - test.ReportError(t, got, want, P) - } - } -} - -func BenchmarkPoint(b *testing.B) { - P := randomPoint() - Q := randomPoint() - b.Run("ToAffine", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.ToAffine() - } - }) - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.Add(Q) - } - }) - b.Run("Double", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.Double() - } - }) -} diff --git a/ecc/goldilocks/scalar.go b/ecc/goldilocks/scalar.go deleted file mode 100644 index f98117b2..00000000 --- a/ecc/goldilocks/scalar.go +++ /dev/null @@ -1,203 +0,0 @@ -package goldilocks - -import ( - "encoding/binary" - "math/bits" -) - -// ScalarSize is the size (in bytes) of scalars. -const ScalarSize = 56 // 448 / 8 - -// _N is the number of 64-bit words to store scalars. -const _N = 7 // 448 / 64 - -// Scalar represents a positive integer stored in little-endian order. -type Scalar [ScalarSize]byte - -type scalar64 [_N]uint64 - -func (z *scalar64) fromScalar(x *Scalar) { - z[0] = binary.LittleEndian.Uint64(x[0*8 : 1*8]) - z[1] = binary.LittleEndian.Uint64(x[1*8 : 2*8]) - z[2] = binary.LittleEndian.Uint64(x[2*8 : 3*8]) - z[3] = binary.LittleEndian.Uint64(x[3*8 : 4*8]) - z[4] = binary.LittleEndian.Uint64(x[4*8 : 5*8]) - z[5] = binary.LittleEndian.Uint64(x[5*8 : 6*8]) - z[6] = binary.LittleEndian.Uint64(x[6*8 : 7*8]) -} - -func (z *scalar64) toScalar(x *Scalar) { - binary.LittleEndian.PutUint64(x[0*8:1*8], z[0]) - binary.LittleEndian.PutUint64(x[1*8:2*8], z[1]) - binary.LittleEndian.PutUint64(x[2*8:3*8], z[2]) - binary.LittleEndian.PutUint64(x[3*8:4*8], z[3]) - binary.LittleEndian.PutUint64(x[4*8:5*8], z[4]) - binary.LittleEndian.PutUint64(x[5*8:6*8], z[5]) - binary.LittleEndian.PutUint64(x[6*8:7*8], z[6]) -} - -// add calculates z = x + y. Assumes len(z) > max(len(x),len(y)). -func add(z, x, y []uint64) uint64 { - l, L, zz := len(x), len(y), y - if l > L { - l, L, zz = L, l, x - } - c := uint64(0) - for i := 0; i < l; i++ { - z[i], c = bits.Add64(x[i], y[i], c) - } - for i := l; i < L; i++ { - z[i], c = bits.Add64(zz[i], 0, c) - } - return c -} - -// sub calculates z = x - y. Assumes len(z) > max(len(x),len(y)). -func sub(z, x, y []uint64) uint64 { - l, L, zz := len(x), len(y), y - if l > L { - l, L, zz = L, l, x - } - c := uint64(0) - for i := 0; i < l; i++ { - z[i], c = bits.Sub64(x[i], y[i], c) - } - for i := l; i < L; i++ { - z[i], c = bits.Sub64(zz[i], 0, c) - } - return c -} - -// mulWord calculates z = x * y. Assumes len(z) >= len(x)+1. -func mulWord(z, x []uint64, y uint64) { - for i := range z { - z[i] = 0 - } - carry := uint64(0) - for i := range x { - hi, lo := bits.Mul64(x[i], y) - lo, cc := bits.Add64(lo, z[i], 0) - hi, _ = bits.Add64(hi, 0, cc) - z[i], cc = bits.Add64(lo, carry, 0) - carry, _ = bits.Add64(hi, 0, cc) - } - z[len(x)] = carry -} - -// Cmov moves x into z if b=1. -func (z *scalar64) Cmov(b uint64, x *scalar64) { - m := uint64(0) - b - for i := range z { - z[i] = (z[i] &^ m) | (x[i] & m) - } -} - -// leftShift shifts to the left the words of z returning the more significant word. -func (z *scalar64) leftShift(low uint64) uint64 { - high := z[_N-1] - for i := _N - 1; i > 0; i-- { - z[i] = z[i-1] - } - z[0] = low - return high -} - -// reduceOneWord calculates z = z + 2^448*x such that the result fits in a Scalar. -func (z *scalar64) reduceOneWord(x uint64) { - prod := (&scalar64{})[:] - mulWord(prod, residue448[:], x) - cc := add(z[:], z[:], prod) - mulWord(prod, residue448[:], cc) - add(z[:], z[:], prod) -} - -// modOrder reduces z mod order. -func (z *scalar64) modOrder() { - var o64, x scalar64 - o64.fromScalar(&order) - // Performs: while (z >= order) { z = z-order } - // At most 8 (eight) iterations reduce 3 bits by subtracting. - for i := 0; i < 8; i++ { - c := sub(x[:], z[:], o64[:]) // (c || x) = z-order - z.Cmov(1-c, &x) // if c != 0 { z = x } - } -} - -// FromBytes stores z = x mod order, where x is a number stored in little-endian order. -func (z *Scalar) FromBytes(x []byte) { - n := len(x) - nCeil := (n + 7) >> 3 - for i := range z { - z[i] = 0 - } - if nCeil < _N { - copy(z[:], x) - return - } - copy(z[:], x[8*(nCeil-_N):]) - var z64 scalar64 - z64.fromScalar(z) - for i := nCeil - _N - 1; i >= 0; i-- { - low := binary.LittleEndian.Uint64(x[8*i:]) - high := z64.leftShift(low) - z64.reduceOneWord(high) - } - z64.modOrder() - z64.toScalar(z) -} - -// divBy4 calculates z = x/4 mod order. -func (z *Scalar) divBy4(x *Scalar) { z.Mul(x, &invFour) } - -// Red reduces z mod order. -func (z *Scalar) Red() { var t scalar64; t.fromScalar(z); t.modOrder(); t.toScalar(z) } - -// Neg calculates z = -z mod order. -func (z *Scalar) Neg() { z.Sub(&order, z) } - -// Add calculates z = x+y mod order. -func (z *Scalar) Add(x, y *Scalar) { - var z64, x64, y64, t scalar64 - x64.fromScalar(x) - y64.fromScalar(y) - c := add(z64[:], x64[:], y64[:]) - add(t[:], z64[:], residue448[:]) - z64.Cmov(c, &t) - z64.modOrder() - z64.toScalar(z) -} - -// Sub calculates z = x-y mod order. -func (z *Scalar) Sub(x, y *Scalar) { - var z64, x64, y64, t scalar64 - x64.fromScalar(x) - y64.fromScalar(y) - c := sub(z64[:], x64[:], y64[:]) - sub(t[:], z64[:], residue448[:]) - z64.Cmov(c, &t) - z64.modOrder() - z64.toScalar(z) -} - -// Mul calculates z = x*y mod order. -func (z *Scalar) Mul(x, y *Scalar) { - var z64, x64, y64 scalar64 - prod := (&[_N + 1]uint64{})[:] - x64.fromScalar(x) - y64.fromScalar(y) - mulWord(prod, x64[:], y64[_N-1]) - copy(z64[:], prod[:_N]) - z64.reduceOneWord(prod[_N]) - for i := _N - 2; i >= 0; i-- { - h := z64.leftShift(0) - z64.reduceOneWord(h) - mulWord(prod, x64[:], y64[i]) - c := add(z64[:], z64[:], prod[:_N]) - z64.reduceOneWord(prod[_N] + c) - } - z64.modOrder() - z64.toScalar(z) -} - -// IsZero returns true if z=0. -func (z *Scalar) IsZero() bool { z.Red(); return *z == Scalar{} } diff --git a/ecc/goldilocks/scalar_test.go b/ecc/goldilocks/scalar_test.go deleted file mode 100644 index e9b68937..00000000 --- a/ecc/goldilocks/scalar_test.go +++ /dev/null @@ -1,108 +0,0 @@ -package goldilocks_test - -import ( - "crypto/rand" - "encoding/binary" - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/ecc/goldilocks" - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/internal/test" -) - -func TestReduceModOrder(t *testing.T) { - order := goldilocks.Curve{}.Order() - bigOrder := conv.BytesLe2BigInt(order[:]) - const max = 3*goldilocks.ScalarSize - 1 - var b [max]byte - _, _ = rand.Read(b[:]) - var z goldilocks.Scalar - for i := 0; i < max; i++ { - x := b[0:i] - bigX := conv.BytesLe2BigInt(x) - - z.FromBytes(x) - got := conv.BytesLe2BigInt(z[:]) - got.Mod(got, bigOrder) - - want := bigX.Mod(bigX, bigOrder) - - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x, i) - } - } -} - -func testOp(t *testing.T, - f func(z, x, y *goldilocks.Scalar), - g func(z, x, y *big.Int), -) { - const testTimes = 1 << 8 - var x, y, z goldilocks.Scalar - order := goldilocks.Curve{}.Order() - want := new(big.Int) - bigOrder := conv.BytesLe2BigInt(order[:]) - - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(x[:]) - _, _ = rand.Read(y[:]) - bigX := conv.BytesLe2BigInt(x[:]) - bigY := conv.BytesLe2BigInt(y[:]) - - f(&z, &x, &y) - got := conv.BytesLe2BigInt(z[:]) - - g(want, bigX, bigY) - want.Mod(want, bigOrder) - if got.Cmp(want) != 0 { - test.ReportError(t, got.Text(16), want.Text(16), - conv.BytesLe2Hex(x[:]), - conv.BytesLe2Hex(y[:])) - } - } -} - -func TestScalar(t *testing.T) { - t.Run("Add", func(t *testing.T) { - testOp(t, - func(z, x, y *goldilocks.Scalar) { z.Add(x, y) }, - func(z, x, y *big.Int) { z.Add(x, y) }) - }) - t.Run("Sub", func(t *testing.T) { - testOp(t, - func(z, x, y *goldilocks.Scalar) { z.Sub(x, y) }, - func(z, x, y *big.Int) { z.Sub(x, y) }) - }) - t.Run("Mul", func(t *testing.T) { - testOp(t, - func(z, x, y *goldilocks.Scalar) { z.Mul(x, y) }, - func(z, x, y *big.Int) { z.Mul(x, y) }) - }) -} - -func BenchmarkScalar(b *testing.B) { - var k [2 * goldilocks.ScalarSize]byte - var x, y, z goldilocks.Scalar - _ = binary.Read(rand.Reader, binary.LittleEndian, x[:]) - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Add(&x, &y) - } - }) - b.Run("Sub", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Sub(&x, &y) - } - }) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Mul(&x, &y) - } - }) - b.Run("Red", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.FromBytes(k[:]) - } - }) -} diff --git a/ecc/goldilocks/twist.go b/ecc/goldilocks/twist.go deleted file mode 100644 index 9d518edc..00000000 --- a/ecc/goldilocks/twist.go +++ /dev/null @@ -1,138 +0,0 @@ -package goldilocks - -import ( - "crypto/subtle" - "math/bits" - - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/math" - fp "github.com/quantumcoinproject/circl/math/fp448" -) - -// twistCurve is -x^2+y^2=1-39082x^2y^2 and is 4-isogenous to Goldilocks. -type twistCurve struct{} - -// Identity returns the identity point. -func (twistCurve) Identity() *twistPoint { - return &twistPoint{ - y: fp.One(), - z: fp.One(), - } -} - -// subYDiv16 update x = (x - y) / 16. -func subYDiv16(x *scalar64, y int64) { - s := uint64(y >> 63) - x0, b0 := bits.Sub64((*x)[0], uint64(y), 0) - x1, b1 := bits.Sub64((*x)[1], s, b0) - x2, b2 := bits.Sub64((*x)[2], s, b1) - x3, b3 := bits.Sub64((*x)[3], s, b2) - x4, b4 := bits.Sub64((*x)[4], s, b3) - x5, b5 := bits.Sub64((*x)[5], s, b4) - x6, _ := bits.Sub64((*x)[6], s, b5) - x[0] = (x0 >> 4) | (x1 << 60) - x[1] = (x1 >> 4) | (x2 << 60) - x[2] = (x2 >> 4) | (x3 << 60) - x[3] = (x3 >> 4) | (x4 << 60) - x[4] = (x4 >> 4) | (x5 << 60) - x[5] = (x5 >> 4) | (x6 << 60) - x[6] = (x6 >> 4) -} - -func recodeScalar(d *[113]int8, k *Scalar) { - var k64 scalar64 - k64.fromScalar(k) - for i := 0; i < 112; i++ { - d[i] = int8((k64[0] & 0x1f) - 16) - subYDiv16(&k64, int64(d[i])) - } - d[112] = int8(k64[0]) -} - -// ScalarMult returns kP. -func (e twistCurve) ScalarMult(k *Scalar, P *twistPoint) *twistPoint { - var TabP [8]preTwistPointProy - var S preTwistPointProy - var d [113]int8 - - var isZero int - if k.IsZero() { - isZero = 1 - } - subtle.ConstantTimeCopy(isZero, k[:], order[:]) - - minusK := *k - isEven := 1 - int(k[0]&0x1) - minusK.Neg() - subtle.ConstantTimeCopy(isEven, k[:], minusK[:]) - recodeScalar(&d, k) - - P.oddMultiples(TabP[:]) - Q := e.Identity() - for i := 112; i >= 0; i-- { - Q.Double() - Q.Double() - Q.Double() - Q.Double() - mask := d[i] >> 7 - absDi := (d[i] + mask) ^ mask - inx := int32((absDi - 1) >> 1) - sig := int((d[i] >> 7) & 0x1) - for j := range TabP { - S.cmov(&TabP[j], uint(subtle.ConstantTimeEq(inx, int32(j)))) - } - S.cneg(sig) - Q.mixAdd(&S) - } - Q.cneg(uint(isEven)) - return Q -} - -const ( - omegaFix = 7 - omegaVar = 5 -) - -// CombinedMult returns mG+nP. -func (e twistCurve) CombinedMult(m, n *Scalar, P *twistPoint) *twistPoint { - nafFix := math.OmegaNAF(conv.BytesLe2BigInt(m[:]), omegaFix) - nafVar := math.OmegaNAF(conv.BytesLe2BigInt(n[:]), omegaVar) - - if len(nafFix) > len(nafVar) { - nafVar = append(nafVar, make([]int32, len(nafFix)-len(nafVar))...) - } else if len(nafFix) < len(nafVar) { - nafFix = append(nafFix, make([]int32, len(nafVar)-len(nafFix))...) - } - - var TabQ [1 << (omegaVar - 2)]preTwistPointProy - P.oddMultiples(TabQ[:]) - Q := e.Identity() - for i := len(nafFix) - 1; i >= 0; i-- { - Q.Double() - // Generator point - if nafFix[i] != 0 { - idxM := absolute(nafFix[i]) >> 1 - R := tabVerif[idxM] - if nafFix[i] < 0 { - R.neg() - } - Q.mixAddZ1(&R) - } - // Variable input point - if nafVar[i] != 0 { - idxN := absolute(nafVar[i]) >> 1 - S := TabQ[idxN] - if nafVar[i] < 0 { - S.neg() - } - Q.mixAdd(&S) - } - } - return Q -} - -// absolute returns always a positive value. -func absolute(x int32) int32 { - mask := x >> 31 - return (x + mask) ^ mask -} diff --git a/ecc/goldilocks/twistPoint.go b/ecc/goldilocks/twistPoint.go deleted file mode 100644 index 64a19004..00000000 --- a/ecc/goldilocks/twistPoint.go +++ /dev/null @@ -1,135 +0,0 @@ -package goldilocks - -import ( - "fmt" - - fp "github.com/quantumcoinproject/circl/math/fp448" -) - -type twistPoint struct{ x, y, z, ta, tb fp.Elt } - -type preTwistPointAffine struct{ addYX, subYX, dt2 fp.Elt } - -type preTwistPointProy struct { - preTwistPointAffine - z2 fp.Elt -} - -func (P *twistPoint) String() string { - return fmt.Sprintf("x: %v\ny: %v\nz: %v\nta: %v\ntb: %v", P.x, P.y, P.z, P.ta, P.tb) -} - -// cneg conditionally negates the point if b=1. -func (P *twistPoint) cneg(b uint) { - t := &fp.Elt{} - fp.Neg(t, &P.x) - fp.Cmov(&P.x, t, b) - fp.Neg(t, &P.ta) - fp.Cmov(&P.ta, t, b) -} - -// Double updates P with 2P. -func (P *twistPoint) Double() { - // This is formula (7) from "Twisted Edwards Curves Revisited" by - // Hisil H., Wong K.KH., Carter G., Dawson E. (2008) - // https://doi.org/10.1007/978-3-540-89255-7_20 - Px, Py, Pz, Pta, Ptb := &P.x, &P.y, &P.z, &P.ta, &P.tb - a, b, c, e, f, g, h := Px, Py, Pz, Pta, Px, Py, Ptb - fp.Add(e, Px, Py) // x+y - fp.Sqr(a, Px) // A = x^2 - fp.Sqr(b, Py) // B = y^2 - fp.Sqr(c, Pz) // z^2 - fp.Add(c, c, c) // C = 2*z^2 - fp.Add(h, a, b) // H = A+B - fp.Sqr(e, e) // (x+y)^2 - fp.Sub(e, e, h) // E = (x+y)^2-A-B - fp.Sub(g, b, a) // G = B-A - fp.Sub(f, c, g) // F = C-G - fp.Mul(Pz, f, g) // Z = F * G - fp.Mul(Px, e, f) // X = E * F - fp.Mul(Py, g, h) // Y = G * H, T = E * H -} - -// mixAdd calculates P= P+Q, where Q is a precomputed point with Z_Q = 1. -func (P *twistPoint) mixAddZ1(Q *preTwistPointAffine) { - fp.Add(&P.z, &P.z, &P.z) // D = 2*z1 (z2=1) - P.coreAddition(Q) -} - -// coreAddition calculates P=P+Q for curves with A=-1. -func (P *twistPoint) coreAddition(Q *preTwistPointAffine) { - // This is the formula following (5) from "Twisted Edwards Curves Revisited" by - // Hisil H., Wong K.KH., Carter G., Dawson E. (2008) - // https://doi.org/10.1007/978-3-540-89255-7_20 - Px, Py, Pz, Pta, Ptb := &P.x, &P.y, &P.z, &P.ta, &P.tb - addYX2, subYX2, dt2 := &Q.addYX, &Q.subYX, &Q.dt2 - a, b, c, d, e, f, g, h := Px, Py, &fp.Elt{}, Pz, Pta, Px, Py, Ptb - fp.Mul(c, Pta, Ptb) // t1 = ta*tb - fp.Sub(h, Py, Px) // y1-x1 - fp.Add(b, Py, Px) // y1+x1 - fp.Mul(a, h, subYX2) // A = (y1-x1)*(y2-x2) - fp.Mul(b, b, addYX2) // B = (y1+x1)*(y2+x2) - fp.Mul(c, c, dt2) // C = 2*D*t1*t2 - fp.Sub(e, b, a) // E = B-A - fp.Add(h, b, a) // H = B+A - fp.Sub(f, d, c) // F = D-C - fp.Add(g, d, c) // G = D+C - fp.Mul(Pz, f, g) // Z = F * G - fp.Mul(Px, e, f) // X = E * F - fp.Mul(Py, g, h) // Y = G * H, T = E * H -} - -func (P *preTwistPointAffine) neg() { - P.addYX, P.subYX = P.subYX, P.addYX - fp.Neg(&P.dt2, &P.dt2) -} - -func (P *preTwistPointAffine) cneg(b int) { - t := &fp.Elt{} - fp.Cswap(&P.addYX, &P.subYX, uint(b)) - fp.Neg(t, &P.dt2) - fp.Cmov(&P.dt2, t, uint(b)) -} - -func (P *preTwistPointAffine) cmov(Q *preTwistPointAffine, b uint) { - fp.Cmov(&P.addYX, &Q.addYX, b) - fp.Cmov(&P.subYX, &Q.subYX, b) - fp.Cmov(&P.dt2, &Q.dt2, b) -} - -// mixAdd calculates P= P+Q, where Q is a precomputed point with Z_Q != 1. -func (P *twistPoint) mixAdd(Q *preTwistPointProy) { - fp.Mul(&P.z, &P.z, &Q.z2) // D = 2*z1*z2 - P.coreAddition(&Q.preTwistPointAffine) -} - -// oddMultiples calculates T[i] = (2*i-1)P for 0 < i < len(T). -func (P *twistPoint) oddMultiples(T []preTwistPointProy) { - if n := len(T); n > 0 { - T[0].FromTwistPoint(P) - _2P := *P - _2P.Double() - R := &preTwistPointProy{} - R.FromTwistPoint(&_2P) - for i := 1; i < n; i++ { - P.mixAdd(R) - T[i].FromTwistPoint(P) - } - } -} - -// cmov conditionally moves Q into P if b=1. -func (P *preTwistPointProy) cmov(Q *preTwistPointProy, b uint) { - P.preTwistPointAffine.cmov(&Q.preTwistPointAffine, b) - fp.Cmov(&P.z2, &Q.z2, b) -} - -// FromTwistPoint precomputes some coordinates of Q for missed addition. -func (P *preTwistPointProy) FromTwistPoint(Q *twistPoint) { - fp.Add(&P.addYX, &Q.y, &Q.x) // addYX = X + Y - fp.Sub(&P.subYX, &Q.y, &Q.x) // subYX = Y - X - fp.Mul(&P.dt2, &Q.ta, &Q.tb) // T = ta*tb - fp.Mul(&P.dt2, &P.dt2, ¶mDTwist) // D*T - fp.Add(&P.dt2, &P.dt2, &P.dt2) // dt2 = 2*D*T - fp.Add(&P.z2, &Q.z, &Q.z) // z2 = 2*Z -} diff --git a/ecc/goldilocks/twistTables.go b/ecc/goldilocks/twistTables.go deleted file mode 100644 index f85dde12..00000000 --- a/ecc/goldilocks/twistTables.go +++ /dev/null @@ -1,216 +0,0 @@ -package goldilocks - -import fp "github.com/quantumcoinproject/circl/math/fp448" - -var tabFixMult = [fxV][fx2w1]preTwistPointAffine{ - { - { - addYX: fp.Elt{0x65, 0x4a, 0xdd, 0xdf, 0xb4, 0x79, 0x60, 0xc8, 0xa1, 0x70, 0xb4, 0x3a, 0x1e, 0x0c, 0x9b, 0x19, 0xe5, 0x48, 0x3f, 0xd7, 0x44, 0x18, 0x18, 0x14, 0x14, 0x27, 0x45, 0xd0, 0x2b, 0x24, 0xd5, 0x93, 0xc3, 0x74, 0x4c, 0x50, 0x70, 0x43, 0x26, 0x05, 0x08, 0x24, 0xca, 0x78, 0x30, 0xc1, 0x06, 0x8d, 0xd4, 0x86, 0x42, 0xf0, 0x14, 0xde, 0x08, 0x05}, - subYX: fp.Elt{0x64, 0x4a, 0xdd, 0xdf, 0xb4, 0x79, 0x60, 0xc8, 0xa1, 0x70, 0xb4, 0x3a, 0x1e, 0x0c, 0x9b, 0x19, 0xe5, 0x48, 0x3f, 0xd7, 0x44, 0x18, 0x18, 0x14, 0x14, 0x27, 0x45, 0xd0, 0x2d, 0x24, 0xd5, 0x93, 0xc3, 0x74, 0x4c, 0x50, 0x70, 0x43, 0x26, 0x05, 0x08, 0x24, 0xca, 0x78, 0x30, 0xc1, 0x06, 0x8d, 0xd4, 0x86, 0x42, 0xf0, 0x14, 0xde, 0x08, 0x05}, - dt2: fp.Elt{0x1a, 0x33, 0xea, 0x64, 0x45, 0x1c, 0xdf, 0x17, 0x1d, 0x16, 0x34, 0x28, 0xd6, 0x61, 0x19, 0x67, 0x79, 0xb4, 0x13, 0xcf, 0x3e, 0x7c, 0x0e, 0x72, 0xda, 0xf1, 0x5f, 0xda, 0xe6, 0xcf, 0x42, 0xd3, 0xb6, 0x17, 0xc2, 0x68, 0x13, 0x2d, 0xd9, 0x60, 0x3e, 0xae, 0xf0, 0x5b, 0x96, 0xf0, 0xcd, 0xaf, 0xea, 0xb7, 0x0d, 0x59, 0x16, 0xa7, 0xff, 0x55}, - }, - { - addYX: fp.Elt{0xca, 0xd8, 0x7d, 0x86, 0x1a, 0xef, 0xad, 0x11, 0xe3, 0x27, 0x41, 0x7e, 0x7f, 0x3e, 0xa9, 0xd2, 0xb5, 0x4e, 0x50, 0xe0, 0x77, 0x91, 0xc2, 0x13, 0x52, 0x73, 0x41, 0x09, 0xa6, 0x57, 0x9a, 0xc8, 0xa8, 0x90, 0x9d, 0x26, 0x14, 0xbb, 0xa1, 0x2a, 0xf7, 0x45, 0x43, 0x4e, 0xea, 0x35, 0x62, 0xe1, 0x08, 0x85, 0x46, 0xb8, 0x24, 0x05, 0x2d, 0xab}, - subYX: fp.Elt{0x9b, 0xe6, 0xd3, 0xe5, 0xfe, 0x50, 0x36, 0x3c, 0x3c, 0x6d, 0x74, 0x1d, 0x74, 0xc0, 0xde, 0x5b, 0x45, 0x27, 0xe5, 0x12, 0xee, 0x63, 0x35, 0x6b, 0x13, 0xe2, 0x41, 0x6b, 0x3a, 0x05, 0x2b, 0xb1, 0x89, 0x26, 0xb6, 0xc6, 0xd1, 0x84, 0xff, 0x0e, 0x9b, 0xa3, 0xfb, 0x21, 0x36, 0x6b, 0x01, 0xf7, 0x9f, 0x7c, 0xeb, 0xf5, 0x18, 0x7a, 0x2a, 0x70}, - dt2: fp.Elt{0x09, 0xad, 0x99, 0x1a, 0x38, 0xd3, 0xdf, 0x22, 0x37, 0x32, 0x61, 0x8b, 0xf3, 0x19, 0x48, 0x08, 0xe8, 0x49, 0xb6, 0x4a, 0xa7, 0xed, 0xa4, 0xa2, 0xee, 0x86, 0xd7, 0x31, 0x5e, 0xce, 0x95, 0x76, 0x86, 0x42, 0x1c, 0x9d, 0x07, 0x14, 0x8c, 0x34, 0x18, 0x9c, 0x6d, 0x3a, 0xdf, 0xa9, 0xe8, 0x36, 0x7e, 0xe4, 0x95, 0xbe, 0xb5, 0x09, 0xf8, 0x9c}, - }, - { - addYX: fp.Elt{0x51, 0xdb, 0x49, 0xa8, 0x9f, 0xe3, 0xd7, 0xec, 0x0d, 0x0f, 0x49, 0xe8, 0xb6, 0xc5, 0x0f, 0x5a, 0x1c, 0xce, 0x54, 0x0d, 0xb1, 0x8d, 0x5b, 0xbf, 0xf4, 0xaa, 0x34, 0x77, 0xc4, 0x5d, 0x59, 0xb6, 0xc5, 0x0e, 0x5a, 0xd8, 0x5b, 0x30, 0xc2, 0x1d, 0xec, 0x85, 0x1c, 0x42, 0xbe, 0x24, 0x2e, 0x50, 0x55, 0x44, 0xb2, 0x3a, 0x01, 0xaa, 0x98, 0xfb}, - subYX: fp.Elt{0xe7, 0x29, 0xb7, 0xd0, 0xaa, 0x4f, 0x32, 0x53, 0x56, 0xde, 0xbc, 0xd1, 0x92, 0x5d, 0x19, 0xbe, 0xa3, 0xe3, 0x75, 0x48, 0xe0, 0x7a, 0x1b, 0x54, 0x7a, 0xb7, 0x41, 0x77, 0x84, 0x38, 0xdd, 0x14, 0x9f, 0xca, 0x3f, 0xa3, 0xc8, 0xa7, 0x04, 0x70, 0xf1, 0x4d, 0x3d, 0xb3, 0x84, 0x79, 0xcb, 0xdb, 0xe4, 0xc5, 0x42, 0x9b, 0x57, 0x19, 0xf1, 0x2d}, - dt2: fp.Elt{0x20, 0xb4, 0x94, 0x9e, 0xdf, 0x31, 0x44, 0x0b, 0xc9, 0x7b, 0x75, 0x40, 0x9d, 0xd1, 0x96, 0x39, 0x70, 0x71, 0x15, 0xc8, 0x93, 0xd5, 0xc5, 0xe5, 0xba, 0xfe, 0xee, 0x08, 0x6a, 0x98, 0x0a, 0x1b, 0xb2, 0xaa, 0x3a, 0xf4, 0xa4, 0x79, 0xf9, 0x8e, 0x4d, 0x65, 0x10, 0x9b, 0x3a, 0x6e, 0x7c, 0x87, 0x94, 0x92, 0x11, 0x65, 0xbf, 0x1a, 0x09, 0xde}, - }, - { - addYX: fp.Elt{0xf3, 0x84, 0x76, 0x77, 0xa5, 0x6b, 0x27, 0x3b, 0x83, 0x3d, 0xdf, 0xa0, 0xeb, 0x32, 0x6d, 0x58, 0x81, 0x57, 0x64, 0xc2, 0x21, 0x7c, 0x9b, 0xea, 0xe6, 0xb0, 0x93, 0xf9, 0xe7, 0xc3, 0xed, 0x5a, 0x8e, 0xe2, 0xb4, 0x72, 0x76, 0x66, 0x0f, 0x22, 0x29, 0x94, 0x3e, 0x63, 0x48, 0x5e, 0x80, 0xcb, 0xac, 0xfa, 0x95, 0xb6, 0x4b, 0xc4, 0x95, 0x33}, - subYX: fp.Elt{0x0c, 0x55, 0xd1, 0x5e, 0x5f, 0xbf, 0xbf, 0xe2, 0x4c, 0xfc, 0x37, 0x4a, 0xc4, 0xb1, 0xf4, 0x83, 0x61, 0x93, 0x60, 0x8e, 0x9f, 0x31, 0xf0, 0xa0, 0x41, 0xff, 0x1d, 0xe2, 0x7f, 0xca, 0x40, 0xd6, 0x88, 0xe8, 0x91, 0x61, 0xe2, 0x11, 0x18, 0x83, 0xf3, 0x25, 0x2f, 0x3f, 0x49, 0x40, 0xd4, 0x83, 0xe2, 0xd7, 0x74, 0x6a, 0x16, 0x86, 0x4e, 0xab}, - dt2: fp.Elt{0xdd, 0x58, 0x65, 0xd8, 0x9f, 0xdd, 0x70, 0x7f, 0x0f, 0xec, 0xbd, 0x5c, 0x5c, 0x9b, 0x7e, 0x1b, 0x9f, 0x79, 0x36, 0x1f, 0xfd, 0x79, 0x10, 0x1c, 0x52, 0xf3, 0x22, 0xa4, 0x1f, 0x71, 0x6e, 0x63, 0x14, 0xf4, 0xa7, 0x3e, 0xbe, 0xad, 0x43, 0x30, 0x38, 0x8c, 0x29, 0xc6, 0xcf, 0x50, 0x75, 0x21, 0xe5, 0x78, 0xfd, 0xb0, 0x9a, 0xc4, 0x6d, 0xd4}, - }, - }, - { - { - addYX: fp.Elt{0x7a, 0xa1, 0x38, 0xa6, 0xfd, 0x0e, 0x96, 0xd5, 0x26, 0x76, 0x86, 0x70, 0x80, 0x30, 0xa6, 0x67, 0xeb, 0xf4, 0x39, 0xdb, 0x22, 0xf5, 0x9f, 0x98, 0xe4, 0xb5, 0x3a, 0x0c, 0x59, 0xbf, 0x85, 0xc6, 0xf0, 0x0b, 0x1c, 0x41, 0x38, 0x09, 0x01, 0xdb, 0xd6, 0x3c, 0xb7, 0xf1, 0x08, 0x6b, 0x4b, 0x9e, 0x63, 0x53, 0x83, 0xd3, 0xab, 0xa3, 0x72, 0x0d}, - subYX: fp.Elt{0x84, 0x68, 0x25, 0xe8, 0xe9, 0x8f, 0x91, 0xbf, 0xf7, 0xa4, 0x30, 0xae, 0xea, 0x9f, 0xdd, 0x56, 0x64, 0x09, 0xc9, 0x54, 0x68, 0x4e, 0x33, 0xc5, 0x6f, 0x7b, 0x2d, 0x52, 0x2e, 0x42, 0xbe, 0xbe, 0xf5, 0x64, 0xbf, 0x77, 0x54, 0xdf, 0xb0, 0x10, 0xd2, 0x16, 0x5d, 0xce, 0xaf, 0x9f, 0xfb, 0xa3, 0x63, 0x50, 0xcb, 0xc0, 0xd0, 0x88, 0x44, 0xa3}, - dt2: fp.Elt{0xc3, 0x8b, 0xa5, 0xf1, 0x44, 0xe4, 0x41, 0xcd, 0x75, 0xe3, 0x17, 0x69, 0x5b, 0xb9, 0xbb, 0xee, 0x82, 0xbb, 0xce, 0x57, 0xdf, 0x2a, 0x9c, 0x12, 0xab, 0x66, 0x08, 0x68, 0x05, 0x1b, 0x87, 0xee, 0x5d, 0x1e, 0x18, 0x14, 0x22, 0x4b, 0x99, 0x61, 0x75, 0x28, 0xe7, 0x65, 0x1c, 0x36, 0xb6, 0x18, 0x09, 0xa8, 0xdf, 0xef, 0x30, 0x35, 0xbc, 0x58}, - }, - { - addYX: fp.Elt{0xc5, 0xd3, 0x0e, 0x6f, 0xaf, 0x06, 0x69, 0xc4, 0x07, 0x9e, 0x58, 0x6e, 0x3f, 0x49, 0xd9, 0x0a, 0x3c, 0x2c, 0x37, 0xcd, 0x27, 0x4d, 0x87, 0x91, 0x7a, 0xb0, 0x28, 0xad, 0x2f, 0x68, 0x92, 0x05, 0x97, 0xf1, 0x30, 0x5f, 0x4c, 0x10, 0x20, 0x30, 0xd3, 0x08, 0x3f, 0xc1, 0xc6, 0xb7, 0xb5, 0xd1, 0x71, 0x7b, 0xa8, 0x0a, 0xd8, 0xf5, 0x17, 0xcf}, - subYX: fp.Elt{0x64, 0xd4, 0x8f, 0x91, 0x40, 0xab, 0x6e, 0x1a, 0x62, 0x83, 0xdc, 0xd7, 0x30, 0x1a, 0x4a, 0x2a, 0x4c, 0x54, 0x86, 0x19, 0x81, 0x5d, 0x04, 0x52, 0xa3, 0xca, 0x82, 0x38, 0xdc, 0x1e, 0xf0, 0x7a, 0x78, 0x76, 0x49, 0x4f, 0x71, 0xc4, 0x74, 0x2f, 0xf0, 0x5b, 0x2e, 0x5e, 0xac, 0xef, 0x17, 0xe4, 0x8e, 0x6e, 0xed, 0x43, 0x23, 0x61, 0x99, 0x49}, - dt2: fp.Elt{0x64, 0x90, 0x72, 0x76, 0xf8, 0x2c, 0x7d, 0x57, 0xf9, 0x30, 0x5e, 0x7a, 0x10, 0x74, 0x19, 0x39, 0xd9, 0xaf, 0x0a, 0xf1, 0x43, 0xed, 0x88, 0x9c, 0x8b, 0xdc, 0x9b, 0x1c, 0x90, 0xe7, 0xf7, 0xa3, 0xa5, 0x0d, 0xc6, 0xbc, 0x30, 0xfb, 0x91, 0x1a, 0x51, 0xba, 0x2d, 0xbe, 0x89, 0xdf, 0x1d, 0xdc, 0x53, 0xa8, 0x82, 0x8a, 0xd3, 0x8d, 0x16, 0x68}, - }, - { - addYX: fp.Elt{0xef, 0x5c, 0xe3, 0x74, 0xbf, 0x13, 0x4a, 0xbf, 0x66, 0x73, 0x64, 0xb7, 0xd4, 0xce, 0x98, 0x82, 0x05, 0xfa, 0x98, 0x0c, 0x0a, 0xae, 0xe5, 0x6b, 0x9f, 0xac, 0xbb, 0x6e, 0x1f, 0xcf, 0xff, 0xa6, 0x71, 0x9a, 0xa8, 0x7a, 0x9e, 0x64, 0x1f, 0x20, 0x4a, 0x61, 0xa2, 0xd6, 0x50, 0xe3, 0xba, 0x81, 0x0c, 0x50, 0x59, 0x69, 0x59, 0x15, 0x55, 0xdb}, - subYX: fp.Elt{0xe8, 0x77, 0x4d, 0xe8, 0x66, 0x3d, 0xc1, 0x00, 0x3c, 0xf2, 0x25, 0x00, 0xdc, 0xb2, 0xe5, 0x9b, 0x12, 0x89, 0xf3, 0xd6, 0xea, 0x85, 0x60, 0xfe, 0x67, 0x91, 0xfd, 0x04, 0x7c, 0xe0, 0xf1, 0x86, 0x06, 0x11, 0x66, 0xee, 0xd4, 0xd5, 0xbe, 0x3b, 0x0f, 0xe3, 0x59, 0xb3, 0x4f, 0x00, 0xb6, 0xce, 0x80, 0xc1, 0x61, 0xf7, 0xaf, 0x04, 0x6a, 0x3c}, - dt2: fp.Elt{0x00, 0xd7, 0x32, 0x93, 0x67, 0x70, 0x6f, 0xd7, 0x69, 0xab, 0xb1, 0xd3, 0xdc, 0xd6, 0xa8, 0xdd, 0x35, 0x25, 0xca, 0xd3, 0x8a, 0x6d, 0xce, 0xfb, 0xfd, 0x2b, 0x83, 0xf0, 0xd4, 0xac, 0x66, 0xfb, 0x72, 0x87, 0x7e, 0x55, 0xb7, 0x91, 0x58, 0x10, 0xc3, 0x11, 0x7e, 0x15, 0xfe, 0x7c, 0x55, 0x90, 0xa3, 0x9e, 0xed, 0x9a, 0x7f, 0xa7, 0xb7, 0xeb}, - }, - { - addYX: fp.Elt{0x25, 0x0f, 0xc2, 0x09, 0x9c, 0x10, 0xc8, 0x7c, 0x93, 0xa7, 0xbe, 0xe9, 0x26, 0x25, 0x7c, 0x21, 0xfe, 0xe7, 0x5f, 0x3c, 0x02, 0x83, 0xa7, 0x9e, 0xdf, 0xc0, 0x94, 0x2b, 0x7d, 0x1a, 0xd0, 0x1d, 0xcc, 0x2e, 0x7d, 0xd4, 0x85, 0xe7, 0xc1, 0x15, 0x66, 0xd6, 0xd6, 0x32, 0xb8, 0xf7, 0x63, 0xaa, 0x3b, 0xa5, 0xea, 0x49, 0xad, 0x88, 0x9b, 0x66}, - subYX: fp.Elt{0x09, 0x97, 0x79, 0x36, 0x41, 0x56, 0x9b, 0xdf, 0x15, 0xd8, 0x43, 0x28, 0x17, 0x5b, 0x96, 0xc9, 0xcf, 0x39, 0x1f, 0x13, 0xf7, 0x4d, 0x1d, 0x1f, 0xda, 0x51, 0x56, 0xe7, 0x0a, 0x5a, 0x65, 0xb6, 0x2a, 0x87, 0x49, 0x86, 0xc2, 0x2b, 0xcd, 0xfe, 0x07, 0xf6, 0x4c, 0xe2, 0x1d, 0x9b, 0xd8, 0x82, 0x09, 0x5b, 0x11, 0x10, 0x62, 0x56, 0x89, 0xbd}, - dt2: fp.Elt{0xd9, 0x15, 0x73, 0xf2, 0x96, 0x35, 0x53, 0xb0, 0xe7, 0xa8, 0x0b, 0x93, 0x35, 0x0b, 0x3a, 0x00, 0xf5, 0x18, 0xb1, 0xc3, 0x12, 0x3f, 0x91, 0x17, 0xc1, 0x4c, 0x15, 0x5a, 0x86, 0x92, 0x11, 0xbd, 0x44, 0x40, 0x5a, 0x7b, 0x15, 0x89, 0xba, 0xc1, 0xc1, 0xbc, 0x43, 0x45, 0xe6, 0x52, 0x02, 0x73, 0x0a, 0xd0, 0x2a, 0x19, 0xda, 0x47, 0xa8, 0xff}, - }, - }, -} - -// tabVerif contains the odd multiples of P. The entry T[i] = (2i+1)P, where -// P = phi(G) and G is the generator of the Goldilocks curve, and phi is a -// 4-degree isogeny. -var tabVerif = [1 << (omegaFix - 2)]preTwistPointAffine{ - { /* 1P*/ - addYX: fp.Elt{0x65, 0x4a, 0xdd, 0xdf, 0xb4, 0x79, 0x60, 0xc8, 0xa1, 0x70, 0xb4, 0x3a, 0x1e, 0x0c, 0x9b, 0x19, 0xe5, 0x48, 0x3f, 0xd7, 0x44, 0x18, 0x18, 0x14, 0x14, 0x27, 0x45, 0xd0, 0x2b, 0x24, 0xd5, 0x93, 0xc3, 0x74, 0x4c, 0x50, 0x70, 0x43, 0x26, 0x05, 0x08, 0x24, 0xca, 0x78, 0x30, 0xc1, 0x06, 0x8d, 0xd4, 0x86, 0x42, 0xf0, 0x14, 0xde, 0x08, 0x05}, - subYX: fp.Elt{0x64, 0x4a, 0xdd, 0xdf, 0xb4, 0x79, 0x60, 0xc8, 0xa1, 0x70, 0xb4, 0x3a, 0x1e, 0x0c, 0x9b, 0x19, 0xe5, 0x48, 0x3f, 0xd7, 0x44, 0x18, 0x18, 0x14, 0x14, 0x27, 0x45, 0xd0, 0x2d, 0x24, 0xd5, 0x93, 0xc3, 0x74, 0x4c, 0x50, 0x70, 0x43, 0x26, 0x05, 0x08, 0x24, 0xca, 0x78, 0x30, 0xc1, 0x06, 0x8d, 0xd4, 0x86, 0x42, 0xf0, 0x14, 0xde, 0x08, 0x05}, - dt2: fp.Elt{0x1a, 0x33, 0xea, 0x64, 0x45, 0x1c, 0xdf, 0x17, 0x1d, 0x16, 0x34, 0x28, 0xd6, 0x61, 0x19, 0x67, 0x79, 0xb4, 0x13, 0xcf, 0x3e, 0x7c, 0x0e, 0x72, 0xda, 0xf1, 0x5f, 0xda, 0xe6, 0xcf, 0x42, 0xd3, 0xb6, 0x17, 0xc2, 0x68, 0x13, 0x2d, 0xd9, 0x60, 0x3e, 0xae, 0xf0, 0x5b, 0x96, 0xf0, 0xcd, 0xaf, 0xea, 0xb7, 0x0d, 0x59, 0x16, 0xa7, 0xff, 0x55}, - }, - { /* 3P*/ - addYX: fp.Elt{0xd1, 0xe9, 0xa8, 0x33, 0x20, 0x76, 0x18, 0x08, 0x45, 0x2a, 0xc9, 0x67, 0x2a, 0xc3, 0x15, 0x24, 0xf9, 0x74, 0x21, 0x30, 0x99, 0x59, 0x8b, 0xb2, 0xf0, 0xa4, 0x07, 0xe2, 0x6a, 0x36, 0x8d, 0xd9, 0xd2, 0x4a, 0x7f, 0x73, 0x50, 0x39, 0x3d, 0xaa, 0xa7, 0x51, 0x73, 0x0d, 0x2b, 0x8b, 0x96, 0x47, 0xac, 0x3c, 0x5d, 0xaa, 0x39, 0x9c, 0xcf, 0xd5}, - subYX: fp.Elt{0x6b, 0x11, 0x5d, 0x1a, 0xf9, 0x41, 0x9d, 0xc5, 0x30, 0x3e, 0xad, 0x25, 0x2c, 0x04, 0x45, 0xea, 0xcc, 0x67, 0x07, 0x85, 0xe9, 0xda, 0x0e, 0xb5, 0x40, 0xb7, 0x32, 0xb4, 0x49, 0xdd, 0xff, 0xaa, 0xfc, 0xbb, 0x19, 0xca, 0x8b, 0x79, 0x2b, 0x8f, 0x8d, 0x00, 0x33, 0xc2, 0xad, 0xe9, 0xd3, 0x12, 0xa8, 0xaa, 0x87, 0x62, 0xad, 0x2d, 0xff, 0xa4}, - dt2: fp.Elt{0xb0, 0xaf, 0x3b, 0xea, 0xf0, 0x42, 0x0b, 0x5e, 0x88, 0xd3, 0x98, 0x08, 0x87, 0x59, 0x72, 0x0a, 0xc2, 0xdf, 0xcb, 0x7f, 0x59, 0xb5, 0x4c, 0x63, 0x68, 0xe8, 0x41, 0x38, 0x67, 0x4f, 0xe9, 0xc6, 0xb2, 0x6b, 0x08, 0xa7, 0xf7, 0x0e, 0xcd, 0xea, 0xca, 0x3d, 0xaf, 0x8e, 0xda, 0x4b, 0x2e, 0xd2, 0x88, 0x64, 0x8d, 0xc5, 0x5f, 0x76, 0x0f, 0x3d}, - }, - { /* 5P*/ - addYX: fp.Elt{0xe5, 0x65, 0xc9, 0xe2, 0x75, 0xf0, 0x7d, 0x1a, 0xba, 0xa4, 0x40, 0x4b, 0x93, 0x12, 0xa2, 0x80, 0x95, 0x0d, 0x03, 0x93, 0xe8, 0xa5, 0x4d, 0xe2, 0x3d, 0x81, 0xf5, 0xce, 0xd4, 0x2d, 0x25, 0x59, 0x16, 0x5c, 0xe7, 0xda, 0xc7, 0x45, 0xd2, 0x7e, 0x2c, 0x38, 0xd4, 0x37, 0x64, 0xb2, 0xc2, 0x28, 0xc5, 0x72, 0x16, 0x32, 0x45, 0x36, 0x6f, 0x9f}, - subYX: fp.Elt{0x09, 0xf4, 0x7e, 0xbd, 0x89, 0xdb, 0x19, 0x58, 0xe1, 0x08, 0x00, 0x8a, 0xf4, 0x5f, 0x2a, 0x32, 0x40, 0xf0, 0x2c, 0x3f, 0x5d, 0xe4, 0xfc, 0x89, 0x11, 0x24, 0xb4, 0x2f, 0x97, 0xad, 0xac, 0x8f, 0x19, 0xab, 0xfa, 0x12, 0xe5, 0xf9, 0x50, 0x4e, 0x50, 0x6f, 0x32, 0x30, 0x88, 0xa6, 0xe5, 0x48, 0x28, 0xa2, 0x1b, 0x9f, 0xcd, 0xe2, 0x43, 0x38}, - dt2: fp.Elt{0xa9, 0xcc, 0x53, 0x39, 0x86, 0x02, 0x60, 0x75, 0x34, 0x99, 0x57, 0xbd, 0xfc, 0x5a, 0x8e, 0xce, 0x5e, 0x98, 0x22, 0xd0, 0xa5, 0x24, 0xff, 0x90, 0x28, 0x9f, 0x58, 0xf3, 0x39, 0xe9, 0xba, 0x36, 0x23, 0xfb, 0x7f, 0x41, 0xcc, 0x2b, 0x5a, 0x25, 0x3f, 0x4c, 0x2a, 0xf1, 0x52, 0x6f, 0x2f, 0x07, 0xe3, 0x88, 0x81, 0x77, 0xdd, 0x7c, 0x88, 0x82}, - }, - { /* 7P*/ - addYX: fp.Elt{0xf7, 0xee, 0x88, 0xfd, 0x3a, 0xbf, 0x7e, 0x28, 0x39, 0x23, 0x79, 0xe6, 0x5c, 0x56, 0xcb, 0xb5, 0x48, 0x6a, 0x80, 0x6d, 0x37, 0x60, 0x6c, 0x10, 0x35, 0x49, 0x4b, 0x46, 0x60, 0xd4, 0x79, 0xd4, 0x53, 0xd3, 0x67, 0x88, 0xd0, 0x41, 0xd5, 0x43, 0x85, 0xc8, 0x71, 0xe3, 0x1c, 0xb6, 0xda, 0x22, 0x64, 0x8f, 0x80, 0xac, 0xad, 0x7d, 0xd5, 0x82}, - subYX: fp.Elt{0x92, 0x40, 0xc1, 0x83, 0x21, 0x9b, 0xd5, 0x7d, 0x3f, 0x29, 0xb6, 0x26, 0xef, 0x12, 0xb9, 0x27, 0x39, 0x42, 0x37, 0x97, 0x09, 0x9a, 0x08, 0xe1, 0x68, 0xb6, 0x7a, 0x3f, 0x9f, 0x45, 0xf8, 0x37, 0x19, 0x83, 0x97, 0xe6, 0x73, 0x30, 0x32, 0x35, 0xcf, 0xae, 0x5c, 0x12, 0x68, 0xdf, 0x6e, 0x2b, 0xde, 0x83, 0xa0, 0x44, 0x74, 0x2e, 0x4a, 0xe9}, - dt2: fp.Elt{0xcb, 0x22, 0x0a, 0xda, 0x6b, 0xc1, 0x8a, 0x29, 0xa1, 0xac, 0x8b, 0x5b, 0x8b, 0x32, 0x20, 0xf2, 0x21, 0xae, 0x0c, 0x43, 0xc4, 0xd7, 0x19, 0x37, 0x3d, 0x79, 0x25, 0x98, 0x6c, 0x9c, 0x22, 0x31, 0x2a, 0x55, 0x9f, 0xda, 0x5e, 0xa8, 0x13, 0xdb, 0x8e, 0x2e, 0x16, 0x39, 0xf4, 0x91, 0x6f, 0xec, 0x71, 0x71, 0xc9, 0x10, 0xf2, 0xa4, 0x8f, 0x11}, - }, - { /* 9P*/ - addYX: fp.Elt{0x85, 0xdd, 0x37, 0x62, 0x74, 0x8e, 0x33, 0x5b, 0x25, 0x12, 0x1b, 0xe7, 0xdf, 0x47, 0xe5, 0x12, 0xfd, 0x3a, 0x3a, 0xf5, 0x5d, 0x4c, 0xa2, 0x29, 0x3c, 0x5c, 0x2f, 0xee, 0x18, 0x19, 0x0a, 0x2b, 0xef, 0x67, 0x50, 0x7a, 0x0d, 0x29, 0xae, 0x55, 0x82, 0xcd, 0xd6, 0x41, 0x90, 0xb4, 0x13, 0x31, 0x5d, 0x11, 0xb8, 0xaa, 0x12, 0x86, 0x08, 0xac}, - subYX: fp.Elt{0xcc, 0x37, 0x8d, 0x83, 0x5f, 0xfd, 0xde, 0xd5, 0xf7, 0xf1, 0xae, 0x0a, 0xa7, 0x0b, 0xeb, 0x6d, 0x19, 0x8a, 0xb6, 0x1a, 0x59, 0xd8, 0xff, 0x3c, 0xbc, 0xbc, 0xef, 0x9c, 0xda, 0x7b, 0x75, 0x12, 0xaf, 0x80, 0x8f, 0x2c, 0x3c, 0xaa, 0x0b, 0x17, 0x86, 0x36, 0x78, 0x18, 0xc8, 0x8a, 0xf6, 0xb8, 0x2c, 0x2f, 0x57, 0x2c, 0x62, 0x57, 0xf6, 0x90}, - dt2: fp.Elt{0x83, 0xbc, 0xa2, 0x07, 0xa5, 0x38, 0x96, 0xea, 0xfe, 0x11, 0x46, 0x1d, 0x3b, 0xcd, 0x42, 0xc5, 0xee, 0x67, 0x04, 0x72, 0x08, 0xd8, 0xd9, 0x96, 0x07, 0xf7, 0xac, 0xc3, 0x64, 0xf1, 0x98, 0x2c, 0x55, 0xd7, 0x7d, 0xc8, 0x6c, 0xbd, 0x2c, 0xff, 0x15, 0xd6, 0x6e, 0xb8, 0x17, 0x8e, 0xa8, 0x27, 0x66, 0xb1, 0x73, 0x79, 0x96, 0xff, 0x29, 0x10}, - }, - { /* 11P*/ - addYX: fp.Elt{0x76, 0xcb, 0x9b, 0x0c, 0x5b, 0xfe, 0xe1, 0x2a, 0xdd, 0x6f, 0x6c, 0xdd, 0x6f, 0xb4, 0xc0, 0xc2, 0x1b, 0x4b, 0x38, 0xe8, 0x66, 0x8c, 0x1e, 0x31, 0x63, 0xb9, 0x94, 0xcd, 0xc3, 0x8c, 0x44, 0x25, 0x7b, 0xd5, 0x39, 0x80, 0xfc, 0x01, 0xaa, 0xf7, 0x2a, 0x61, 0x8a, 0x25, 0xd2, 0x5f, 0xc5, 0x66, 0x38, 0xa4, 0x17, 0xcf, 0x3e, 0x11, 0x0f, 0xa3}, - subYX: fp.Elt{0xe0, 0xb6, 0xd1, 0x9c, 0x71, 0x49, 0x2e, 0x7b, 0xde, 0x00, 0xda, 0x6b, 0xf1, 0xec, 0xe6, 0x7a, 0x15, 0x38, 0x71, 0xe9, 0x7b, 0xdb, 0xf8, 0x98, 0xc0, 0x91, 0x2e, 0x53, 0xee, 0x92, 0x87, 0x25, 0xc9, 0xb0, 0xbb, 0x33, 0x15, 0x46, 0x7f, 0xfd, 0x4f, 0x8b, 0x77, 0x05, 0x96, 0xb6, 0xe2, 0x08, 0xdb, 0x0d, 0x09, 0xee, 0x5b, 0xd1, 0x2a, 0x63}, - dt2: fp.Elt{0x8f, 0x7b, 0x57, 0x8c, 0xbf, 0x06, 0x0d, 0x43, 0x21, 0x92, 0x94, 0x2d, 0x6a, 0x38, 0x07, 0x0f, 0xa0, 0xf1, 0xe3, 0xd8, 0x2a, 0xbf, 0x46, 0xc6, 0x9e, 0x1f, 0x8f, 0x2b, 0x46, 0x84, 0x0b, 0x74, 0xed, 0xff, 0xf8, 0xa5, 0x94, 0xae, 0xf1, 0x67, 0xb1, 0x9b, 0xdd, 0x4a, 0xd0, 0xdb, 0xc2, 0xb5, 0x58, 0x49, 0x0c, 0xa9, 0x1d, 0x7d, 0xa9, 0xd3}, - }, - { /* 13P*/ - addYX: fp.Elt{0x73, 0x84, 0x2e, 0x31, 0x1f, 0xdc, 0xed, 0x9f, 0x74, 0xfa, 0xe0, 0x35, 0xb1, 0x85, 0x6a, 0x8d, 0x86, 0xd0, 0xff, 0xd6, 0x08, 0x43, 0x73, 0x1a, 0xd5, 0xf8, 0x43, 0xd4, 0xb3, 0xe5, 0x3f, 0xa8, 0x84, 0x17, 0x59, 0x65, 0x4e, 0xe6, 0xee, 0x54, 0x9c, 0xda, 0x5e, 0x7e, 0x98, 0x29, 0x6d, 0x73, 0x34, 0x1f, 0x99, 0x80, 0x54, 0x54, 0x81, 0x0b}, - subYX: fp.Elt{0xb1, 0xe5, 0xbb, 0x80, 0x22, 0x9c, 0x81, 0x6d, 0xaf, 0x27, 0x65, 0x6f, 0x7e, 0x9c, 0xb6, 0x8d, 0x35, 0x5c, 0x2e, 0x20, 0x48, 0x7a, 0x28, 0xf0, 0x97, 0xfe, 0xb7, 0x71, 0xce, 0xd6, 0xad, 0x3a, 0x81, 0xf6, 0x74, 0x5e, 0xf3, 0xfd, 0x1b, 0xd4, 0x1e, 0x7c, 0xc2, 0xb7, 0xc8, 0xa6, 0xc9, 0x89, 0x03, 0x47, 0xec, 0x24, 0xd6, 0x0e, 0xec, 0x9c}, - dt2: fp.Elt{0x91, 0x0a, 0x43, 0x34, 0x20, 0xc2, 0x64, 0xf7, 0x4e, 0x48, 0xc8, 0xd2, 0x95, 0x83, 0xd1, 0xa4, 0xfb, 0x4e, 0x41, 0x3b, 0x0d, 0xd5, 0x07, 0xd9, 0xf1, 0x13, 0x16, 0x78, 0x54, 0x57, 0xd0, 0xf1, 0x4f, 0x20, 0xac, 0xcf, 0x9c, 0x3b, 0x33, 0x0b, 0x99, 0x54, 0xc3, 0x7f, 0x3e, 0x57, 0x26, 0x86, 0xd5, 0xa5, 0x2b, 0x8d, 0xe3, 0x19, 0x36, 0xf7}, - }, - { /* 15P*/ - addYX: fp.Elt{0x23, 0x69, 0x47, 0x14, 0xf9, 0x9a, 0x50, 0xff, 0x64, 0xd1, 0x50, 0x35, 0xc3, 0x11, 0xd3, 0x19, 0xcf, 0x87, 0xda, 0x30, 0x0b, 0x50, 0xda, 0xc0, 0xe0, 0x25, 0x00, 0xe5, 0x68, 0x93, 0x04, 0xc2, 0xaf, 0xbd, 0x2f, 0x36, 0x5f, 0x47, 0x96, 0x10, 0xa8, 0xbd, 0xe4, 0x88, 0xac, 0x80, 0x52, 0x61, 0x73, 0xe9, 0x63, 0xdd, 0x99, 0xad, 0x20, 0x5b}, - subYX: fp.Elt{0x1b, 0x5e, 0xa2, 0x2a, 0x25, 0x0f, 0x86, 0xc0, 0xb1, 0x2e, 0x0c, 0x13, 0x40, 0x8d, 0xf0, 0xe6, 0x00, 0x55, 0x08, 0xc5, 0x7d, 0xf4, 0xc9, 0x31, 0x25, 0x3a, 0x99, 0x69, 0xdd, 0x67, 0x63, 0x9a, 0xd6, 0x89, 0x2e, 0xa1, 0x19, 0xca, 0x2c, 0xd9, 0x59, 0x5f, 0x5d, 0xc3, 0x6e, 0x62, 0x36, 0x12, 0x59, 0x15, 0xe1, 0xdc, 0xa4, 0xad, 0xc9, 0xd0}, - dt2: fp.Elt{0xbc, 0xea, 0xfc, 0xaf, 0x66, 0x23, 0xb7, 0x39, 0x6b, 0x2a, 0x96, 0xa8, 0x54, 0x43, 0xe9, 0xaa, 0x32, 0x40, 0x63, 0x92, 0x5e, 0xdf, 0x35, 0xc2, 0x9f, 0x24, 0x0c, 0xed, 0xfc, 0xde, 0x73, 0x8f, 0xa7, 0xd5, 0xa3, 0x2b, 0x18, 0x1f, 0xb0, 0xf8, 0xeb, 0x55, 0xd9, 0xc3, 0xfd, 0x28, 0x7c, 0x4f, 0xce, 0x0d, 0xf7, 0xae, 0xc2, 0x83, 0xc3, 0x78}, - }, - { /* 17P*/ - addYX: fp.Elt{0x71, 0xe6, 0x60, 0x93, 0x37, 0xdb, 0x01, 0xa5, 0x4c, 0xba, 0xe8, 0x8e, 0xd5, 0xf9, 0xd3, 0x98, 0xe5, 0xeb, 0xab, 0x3a, 0x15, 0x8b, 0x35, 0x60, 0xbe, 0xe5, 0x9c, 0x2d, 0x10, 0x9b, 0x2e, 0xcf, 0x65, 0x64, 0xea, 0x8f, 0x72, 0xce, 0xf5, 0x18, 0xe5, 0xe2, 0xf0, 0x0e, 0xae, 0x04, 0xec, 0xa0, 0x20, 0x65, 0x63, 0x07, 0xb1, 0x9f, 0x03, 0x97}, - subYX: fp.Elt{0x9e, 0x41, 0x64, 0x30, 0x95, 0x7f, 0x3a, 0x89, 0x7b, 0x0a, 0x79, 0x59, 0x23, 0x9a, 0x3b, 0xfe, 0xa4, 0x13, 0x08, 0xb2, 0x2e, 0x04, 0x50, 0x10, 0x30, 0xcd, 0x2e, 0xa4, 0x91, 0x71, 0x50, 0x36, 0x4a, 0x02, 0xf4, 0x8d, 0xa3, 0x36, 0x1b, 0xf4, 0x52, 0xba, 0x15, 0x04, 0x8b, 0x80, 0x25, 0xd9, 0xae, 0x67, 0x20, 0xd9, 0x88, 0x8f, 0x97, 0xa6}, - dt2: fp.Elt{0xb5, 0xe7, 0x46, 0xbd, 0x55, 0x23, 0xa0, 0x68, 0xc0, 0x12, 0xd9, 0xf1, 0x0a, 0x75, 0xe2, 0xda, 0xf4, 0x6b, 0xca, 0x14, 0xe4, 0x9f, 0x0f, 0xb5, 0x3c, 0xa6, 0xa5, 0xa2, 0x63, 0x94, 0xd1, 0x1c, 0x39, 0x58, 0x57, 0x02, 0x27, 0x98, 0xb6, 0x47, 0xc6, 0x61, 0x4b, 0x5c, 0xab, 0x6f, 0x2d, 0xab, 0xe3, 0xc1, 0x69, 0xf9, 0x12, 0xb0, 0xc8, 0xd5}, - }, - { /* 19P*/ - addYX: fp.Elt{0x19, 0x7d, 0xd5, 0xac, 0x79, 0xa2, 0x82, 0x9b, 0x28, 0x31, 0x22, 0xc0, 0x73, 0x02, 0x76, 0x17, 0x10, 0x70, 0x79, 0x57, 0xc9, 0x84, 0x62, 0x8e, 0x04, 0x04, 0x61, 0x67, 0x08, 0x48, 0xb4, 0x4b, 0xde, 0x53, 0x8c, 0xff, 0x36, 0x1b, 0x62, 0x86, 0x5d, 0xe1, 0x9b, 0xb1, 0xe5, 0xe8, 0x44, 0x64, 0xa1, 0x68, 0x3f, 0xa8, 0x45, 0x52, 0x91, 0xed}, - subYX: fp.Elt{0x42, 0x1a, 0x36, 0x1f, 0x90, 0x15, 0x24, 0x8d, 0x24, 0x80, 0xe6, 0xfe, 0x1e, 0xf0, 0xad, 0xaf, 0x6a, 0x93, 0xf0, 0xa6, 0x0d, 0x5d, 0xea, 0xf6, 0x62, 0x96, 0x7a, 0x05, 0x76, 0x85, 0x74, 0x32, 0xc7, 0xc8, 0x64, 0x53, 0x62, 0xe7, 0x54, 0x84, 0xe0, 0x40, 0x66, 0x19, 0x70, 0x40, 0x95, 0x35, 0x68, 0x64, 0x43, 0xcd, 0xba, 0x29, 0x32, 0xa8}, - dt2: fp.Elt{0x3e, 0xf6, 0xd6, 0xe4, 0x99, 0xeb, 0x20, 0x66, 0x08, 0x2e, 0x26, 0x64, 0xd7, 0x76, 0xf3, 0xb4, 0xc5, 0xa4, 0x35, 0x92, 0xd2, 0x99, 0x70, 0x5a, 0x1a, 0xe9, 0xe9, 0x3d, 0x3b, 0xe1, 0xcd, 0x0e, 0xee, 0x24, 0x13, 0x03, 0x22, 0xd6, 0xd6, 0x72, 0x08, 0x2b, 0xde, 0xfd, 0x93, 0xed, 0x0c, 0x7f, 0x5e, 0x31, 0x22, 0x4d, 0x80, 0x78, 0xc0, 0x48}, - }, - { /* 21P*/ - addYX: fp.Elt{0x8f, 0x72, 0xd2, 0x9e, 0xc4, 0xcd, 0x2c, 0xbf, 0xa8, 0xd3, 0x24, 0x62, 0x28, 0xee, 0x39, 0x0a, 0x19, 0x3a, 0x58, 0xff, 0x21, 0x2e, 0x69, 0x6c, 0x6e, 0x18, 0xd0, 0xcd, 0x61, 0xc1, 0x18, 0x02, 0x5a, 0xe9, 0xe3, 0xef, 0x1f, 0x8e, 0x10, 0xe8, 0x90, 0x2b, 0x48, 0xcd, 0xee, 0x38, 0xbd, 0x3a, 0xca, 0xbc, 0x2d, 0xe2, 0x3a, 0x03, 0x71, 0x02}, - subYX: fp.Elt{0xf8, 0xa4, 0x32, 0x26, 0x66, 0xaf, 0x3b, 0x53, 0xe7, 0xb0, 0x91, 0x92, 0xf5, 0x3c, 0x74, 0xce, 0xf2, 0xdd, 0x68, 0xa9, 0xf4, 0xcd, 0x5f, 0x60, 0xab, 0x71, 0xdf, 0xcd, 0x5c, 0x5d, 0x51, 0x72, 0x3a, 0x96, 0xea, 0xd6, 0xde, 0x54, 0x8e, 0x55, 0x4c, 0x08, 0x4c, 0x60, 0xdd, 0x34, 0xa9, 0x6f, 0xf3, 0x04, 0x02, 0xa8, 0xa6, 0x4e, 0x4d, 0x62}, - dt2: fp.Elt{0x76, 0x4a, 0xae, 0x38, 0x62, 0x69, 0x72, 0xdc, 0xe8, 0x43, 0xbe, 0x1d, 0x61, 0xde, 0x31, 0xc3, 0x42, 0x8f, 0x33, 0x9d, 0xca, 0xc7, 0x9c, 0xec, 0x6a, 0xe2, 0xaa, 0x01, 0x49, 0x78, 0x8d, 0x72, 0x4f, 0x38, 0xea, 0x52, 0xc2, 0xd3, 0xc9, 0x39, 0x71, 0xba, 0xb9, 0x09, 0x9b, 0xa3, 0x7f, 0x45, 0x43, 0x65, 0x36, 0x29, 0xca, 0xe7, 0x5c, 0x5f}, - }, - { /* 23P*/ - addYX: fp.Elt{0x89, 0x42, 0x35, 0x48, 0x6d, 0x74, 0xe5, 0x1f, 0xc3, 0xdd, 0x28, 0x5b, 0x84, 0x41, 0x33, 0x9f, 0x42, 0xf3, 0x1d, 0x5d, 0x15, 0x6d, 0x76, 0x33, 0x36, 0xaf, 0xe9, 0xdd, 0xfa, 0x63, 0x4f, 0x7a, 0x9c, 0xeb, 0x1c, 0x4f, 0x34, 0x65, 0x07, 0x54, 0xbb, 0x4c, 0x8b, 0x62, 0x9d, 0xd0, 0x06, 0x99, 0xb3, 0xe9, 0xda, 0x85, 0x19, 0xb0, 0x3d, 0x3c}, - subYX: fp.Elt{0xbb, 0x99, 0xf6, 0xbf, 0xaf, 0x2c, 0x22, 0x0d, 0x7a, 0xaa, 0x98, 0x6f, 0x01, 0x82, 0x99, 0xcf, 0x88, 0xbd, 0x0e, 0x3a, 0x89, 0xe0, 0x9c, 0x8c, 0x17, 0x20, 0xc4, 0xe0, 0xcf, 0x43, 0x7a, 0xef, 0x0d, 0x9f, 0x87, 0xd4, 0xfb, 0xf2, 0x96, 0xb8, 0x03, 0xe8, 0xcb, 0x5c, 0xec, 0x65, 0x5f, 0x49, 0xa4, 0x7c, 0x85, 0xb4, 0xf6, 0xc7, 0xdb, 0xa3}, - dt2: fp.Elt{0x11, 0xf3, 0x32, 0xa3, 0xa7, 0xb2, 0x7d, 0x51, 0x82, 0x44, 0xeb, 0xa2, 0x7d, 0x72, 0xcb, 0xc6, 0xf6, 0xc7, 0xb2, 0x38, 0x0e, 0x0f, 0x4f, 0x29, 0x00, 0xe4, 0x5b, 0x94, 0x46, 0x86, 0x66, 0xa1, 0x83, 0xb3, 0xeb, 0x15, 0xb6, 0x31, 0x50, 0x28, 0xeb, 0xed, 0x0d, 0x32, 0x39, 0xe9, 0x23, 0x81, 0x99, 0x3e, 0xff, 0x17, 0x4c, 0x11, 0x43, 0xd1}, - }, - { /* 25P*/ - addYX: fp.Elt{0xce, 0xe7, 0xf8, 0x94, 0x8f, 0x96, 0xf8, 0x96, 0xe6, 0x72, 0x20, 0x44, 0x2c, 0xa7, 0xfc, 0xba, 0xc8, 0xe1, 0xbb, 0xc9, 0x16, 0x85, 0xcd, 0x0b, 0xe5, 0xb5, 0x5a, 0x7f, 0x51, 0x43, 0x63, 0x8b, 0x23, 0x8e, 0x1d, 0x31, 0xff, 0x46, 0x02, 0x66, 0xcc, 0x9e, 0x4d, 0xa2, 0xca, 0xe2, 0xc7, 0xfd, 0x22, 0xb1, 0xdb, 0xdf, 0x6f, 0xe6, 0xa5, 0x82}, - subYX: fp.Elt{0xd0, 0xf5, 0x65, 0x40, 0xec, 0x8e, 0x65, 0x42, 0x78, 0xc1, 0x65, 0xe4, 0x10, 0xc8, 0x0b, 0x1b, 0xdd, 0x96, 0x68, 0xce, 0xee, 0x45, 0x55, 0xd8, 0x6e, 0xd3, 0xe6, 0x77, 0x19, 0xae, 0xc2, 0x8d, 0x8d, 0x3e, 0x14, 0x3f, 0x6d, 0x00, 0x2f, 0x9b, 0xd1, 0x26, 0x60, 0x28, 0x0f, 0x3a, 0x47, 0xb3, 0xe6, 0x68, 0x28, 0x24, 0x25, 0xca, 0xc8, 0x06}, - dt2: fp.Elt{0x54, 0xbb, 0x60, 0x92, 0xdb, 0x8f, 0x0f, 0x38, 0xe0, 0xe6, 0xe4, 0xc9, 0xcc, 0x14, 0x62, 0x01, 0xc4, 0x2b, 0x0f, 0xcf, 0xed, 0x7d, 0x8e, 0xa4, 0xd9, 0x73, 0x0b, 0xba, 0x0c, 0xaf, 0x0c, 0xf9, 0xe2, 0xeb, 0x29, 0x2a, 0x53, 0xdf, 0x2c, 0x5a, 0xfa, 0x8f, 0xc1, 0x01, 0xd7, 0xb1, 0x45, 0x73, 0x92, 0x32, 0x83, 0x85, 0x12, 0x74, 0x89, 0x44}, - }, - { /* 27P*/ - addYX: fp.Elt{0x0b, 0x73, 0x3c, 0xc2, 0xb1, 0x2e, 0xe1, 0xa7, 0xf5, 0xc9, 0x7a, 0xfb, 0x3d, 0x2d, 0xac, 0x59, 0xdb, 0xfa, 0x36, 0x11, 0xd1, 0x13, 0x04, 0x51, 0x1d, 0xab, 0x9b, 0x6b, 0x93, 0xfe, 0xda, 0xb0, 0x8e, 0xb4, 0x79, 0x11, 0x21, 0x0f, 0x65, 0xb9, 0xbb, 0x79, 0x96, 0x2a, 0xfd, 0x30, 0xe0, 0xb4, 0x2d, 0x9a, 0x55, 0x25, 0x5d, 0xd4, 0xad, 0x2a}, - subYX: fp.Elt{0x9e, 0xc5, 0x04, 0xfe, 0xec, 0x3c, 0x64, 0x1c, 0xed, 0x95, 0xed, 0xae, 0xaf, 0x5c, 0x6e, 0x08, 0x9e, 0x02, 0x29, 0x59, 0x7e, 0x5f, 0xc4, 0x9a, 0xd5, 0x32, 0x72, 0x86, 0xe1, 0x4e, 0x3c, 0xce, 0x99, 0x69, 0x3b, 0xc4, 0xdd, 0x4d, 0xb7, 0xbb, 0xda, 0x3b, 0x1a, 0x99, 0xaa, 0x62, 0x15, 0xc1, 0xf0, 0xb6, 0x6c, 0xec, 0x56, 0xc1, 0xff, 0x0c}, - dt2: fp.Elt{0x2f, 0xf1, 0x3f, 0x7a, 0x2d, 0x56, 0x19, 0x7f, 0xea, 0xbe, 0x59, 0x2e, 0x13, 0x67, 0x81, 0xfb, 0xdb, 0xc8, 0xa3, 0x1d, 0xd5, 0xe9, 0x13, 0x8b, 0x29, 0xdf, 0xcf, 0x9f, 0xe7, 0xd9, 0x0b, 0x70, 0xd3, 0x15, 0x57, 0x4a, 0xe9, 0x50, 0x12, 0x1b, 0x81, 0x4b, 0x98, 0x98, 0xa8, 0x31, 0x1d, 0x27, 0x47, 0x38, 0xed, 0x57, 0x99, 0x26, 0xb2, 0xee}, - }, - { /* 29P*/ - addYX: fp.Elt{0x1c, 0xb2, 0xb2, 0x67, 0x3b, 0x8b, 0x3d, 0x5a, 0x30, 0x7e, 0x38, 0x7e, 0x3c, 0x3d, 0x28, 0x56, 0x59, 0xd8, 0x87, 0x53, 0x8b, 0xe6, 0x6c, 0x5d, 0xe5, 0x0a, 0x33, 0x10, 0xce, 0xa2, 0x17, 0x0d, 0xe8, 0x76, 0xee, 0x68, 0xa8, 0x72, 0x54, 0xbd, 0xa6, 0x24, 0x94, 0x6e, 0x77, 0xc7, 0x53, 0xb7, 0x89, 0x1c, 0x7a, 0xe9, 0x78, 0x9a, 0x74, 0x5f}, - subYX: fp.Elt{0x76, 0x96, 0x1c, 0xcf, 0x08, 0x55, 0xd8, 0x1e, 0x0d, 0xa3, 0x59, 0x95, 0x32, 0xf4, 0xc2, 0x8e, 0x84, 0x5e, 0x4b, 0x04, 0xda, 0x71, 0xc9, 0x78, 0x52, 0xde, 0x14, 0xb4, 0x31, 0xf4, 0xd4, 0xb8, 0x58, 0xc5, 0x20, 0xe8, 0xdd, 0x15, 0xb5, 0xee, 0xea, 0x61, 0xe0, 0xf5, 0xd6, 0xae, 0x55, 0x59, 0x05, 0x3e, 0xaf, 0x74, 0xac, 0x1f, 0x17, 0x82}, - dt2: fp.Elt{0x59, 0x24, 0xcd, 0xfc, 0x11, 0x7e, 0x85, 0x18, 0x3d, 0x69, 0xf7, 0x71, 0x31, 0x66, 0x98, 0x42, 0x95, 0x00, 0x8c, 0xb2, 0xae, 0x39, 0x7e, 0x85, 0xd6, 0xb0, 0x02, 0xec, 0xce, 0xfc, 0x25, 0xb2, 0xe3, 0x99, 0x8e, 0x5b, 0x61, 0x96, 0x2e, 0x6d, 0x96, 0x57, 0x71, 0xa5, 0x93, 0x41, 0x0e, 0x6f, 0xfd, 0x0a, 0xbf, 0xa9, 0xf7, 0x56, 0xa9, 0x3e}, - }, - { /* 31P*/ - addYX: fp.Elt{0xa2, 0x2e, 0x0c, 0x17, 0x4d, 0xcc, 0x85, 0x2c, 0x18, 0xa0, 0xd2, 0x08, 0xba, 0x11, 0xfa, 0x47, 0x71, 0x86, 0xaf, 0x36, 0x6a, 0xd7, 0xfe, 0xb9, 0xb0, 0x2f, 0x89, 0x98, 0x49, 0x69, 0xf8, 0x6a, 0xad, 0x27, 0x5e, 0x0a, 0x22, 0x60, 0x5e, 0x5d, 0xca, 0x06, 0x51, 0x27, 0x99, 0x29, 0x85, 0x68, 0x98, 0xe1, 0xc4, 0x21, 0x50, 0xa0, 0xe9, 0xc1}, - subYX: fp.Elt{0x4d, 0x70, 0xee, 0x91, 0x92, 0x3f, 0xb7, 0xd3, 0x1d, 0xdb, 0x8d, 0x6e, 0x16, 0xf5, 0x65, 0x7d, 0x5f, 0xb5, 0x6c, 0x59, 0x26, 0x70, 0x4b, 0xf2, 0xfc, 0xe7, 0xdf, 0x86, 0xfe, 0xa5, 0xa7, 0xa6, 0x5d, 0xfb, 0x06, 0xe9, 0xf9, 0xcc, 0xc0, 0x37, 0xcc, 0xd8, 0x09, 0x04, 0xd2, 0xa5, 0x1d, 0xd7, 0xb7, 0xce, 0x92, 0xac, 0x3c, 0xad, 0xfb, 0xae}, - dt2: fp.Elt{0x17, 0xa3, 0x9a, 0xc7, 0x86, 0x2a, 0x51, 0xf7, 0x96, 0x79, 0x49, 0x22, 0x2e, 0x5a, 0x01, 0x5c, 0xb5, 0x95, 0xd4, 0xe8, 0xcb, 0x00, 0xca, 0x2d, 0x55, 0xb6, 0x34, 0x36, 0x0b, 0x65, 0x46, 0xf0, 0x49, 0xfc, 0x87, 0x86, 0xe5, 0xc3, 0x15, 0xdb, 0x32, 0xcd, 0xf2, 0xd3, 0x82, 0x4c, 0xe6, 0x61, 0x8a, 0xaf, 0xd4, 0x9e, 0x0f, 0x5a, 0xf2, 0x81}, - }, - { /* 33P*/ - addYX: fp.Elt{0x88, 0x10, 0xc0, 0xcb, 0xf5, 0x77, 0xae, 0xa5, 0xbe, 0xf6, 0xcd, 0x2e, 0x8b, 0x7e, 0xbd, 0x79, 0x62, 0x4a, 0xeb, 0x69, 0xc3, 0x28, 0xaa, 0x72, 0x87, 0xa9, 0x25, 0x87, 0x46, 0xea, 0x0e, 0x62, 0xa3, 0x6a, 0x1a, 0xe2, 0xba, 0xdc, 0x81, 0x10, 0x33, 0x01, 0xf6, 0x16, 0x89, 0x80, 0xc6, 0xcd, 0xdb, 0xdc, 0xba, 0x0e, 0x09, 0x4a, 0x35, 0x4a}, - subYX: fp.Elt{0x86, 0xb2, 0x2b, 0xd0, 0xb8, 0x4a, 0x6d, 0x66, 0x7b, 0x32, 0xdf, 0x3b, 0x1a, 0x19, 0x1f, 0x63, 0xee, 0x1f, 0x3d, 0x1c, 0x5c, 0x14, 0x60, 0x5b, 0x72, 0x49, 0x07, 0xb1, 0x0d, 0x72, 0xc6, 0x35, 0xf0, 0xbc, 0x5e, 0xda, 0x80, 0x6b, 0x64, 0x5b, 0xe5, 0x34, 0x54, 0x39, 0xdd, 0xe6, 0x3c, 0xcb, 0xe5, 0x29, 0x32, 0x06, 0xc6, 0xb1, 0x96, 0x34}, - dt2: fp.Elt{0x85, 0x86, 0xf5, 0x84, 0x86, 0xe6, 0x77, 0x8a, 0x71, 0x85, 0x0c, 0x4f, 0x81, 0x5b, 0x29, 0x06, 0xb5, 0x2e, 0x26, 0x71, 0x07, 0x78, 0x07, 0xae, 0xbc, 0x95, 0x46, 0xc3, 0x65, 0xac, 0xe3, 0x76, 0x51, 0x7d, 0xd4, 0x85, 0x31, 0xe3, 0x43, 0xf3, 0x1b, 0x7c, 0xf7, 0x6b, 0x2c, 0xf8, 0x1c, 0xbb, 0x8d, 0xca, 0xab, 0x4b, 0xba, 0x7f, 0xa4, 0xe2}, - }, - { /* 35P*/ - addYX: fp.Elt{0x1a, 0xee, 0xe7, 0xa4, 0x8a, 0x9d, 0x53, 0x80, 0xc6, 0xb8, 0x4e, 0xdc, 0x89, 0xe0, 0xc4, 0x2b, 0x60, 0x52, 0x6f, 0xec, 0x81, 0xd2, 0x55, 0x6b, 0x1b, 0x6f, 0x17, 0x67, 0x8e, 0x42, 0x26, 0x4c, 0x65, 0x23, 0x29, 0xc6, 0x7b, 0xcd, 0x9f, 0xad, 0x4b, 0x42, 0xd3, 0x0c, 0x75, 0xc3, 0x8a, 0xf5, 0xbe, 0x9e, 0x55, 0xf7, 0x47, 0x5d, 0xbd, 0x3a}, - subYX: fp.Elt{0x0d, 0xa8, 0x3b, 0xf9, 0xc7, 0x7e, 0xc6, 0x86, 0x94, 0xc0, 0x01, 0xff, 0x27, 0xce, 0x43, 0xac, 0xe5, 0xe1, 0xd2, 0x8d, 0xc1, 0x22, 0x31, 0xbe, 0xe1, 0xaf, 0xf9, 0x4a, 0x78, 0xa1, 0x0c, 0xaa, 0xd4, 0x80, 0xe4, 0x09, 0x8d, 0xfb, 0x1d, 0x52, 0xc8, 0x60, 0x2d, 0xf2, 0xa2, 0x89, 0x02, 0x56, 0x3d, 0x56, 0x27, 0x85, 0xc7, 0xf0, 0x2b, 0x9a}, - dt2: fp.Elt{0x62, 0x7c, 0xc7, 0x6b, 0x2c, 0x9d, 0x0a, 0x7c, 0xe5, 0x50, 0x3c, 0xe6, 0x87, 0x1c, 0x82, 0x30, 0x67, 0x3c, 0x39, 0xb6, 0xa0, 0x31, 0xfb, 0x03, 0x7b, 0xa1, 0x58, 0xdf, 0x12, 0x76, 0x5d, 0x5d, 0x0a, 0x8f, 0x9b, 0x37, 0x32, 0xc3, 0x60, 0x33, 0xea, 0x9f, 0x0a, 0x99, 0xfa, 0x20, 0xd0, 0x33, 0x21, 0xc3, 0x94, 0xd4, 0x86, 0x49, 0x7c, 0x4e}, - }, - { /* 37P*/ - addYX: fp.Elt{0xc7, 0x0c, 0x71, 0xfe, 0x55, 0xd1, 0x95, 0x8f, 0x43, 0xbb, 0x6b, 0x74, 0x30, 0xbd, 0xe8, 0x6f, 0x1c, 0x1b, 0x06, 0x62, 0xf5, 0xfc, 0x65, 0xa0, 0xeb, 0x81, 0x12, 0xc9, 0x64, 0x66, 0x61, 0xde, 0xf3, 0x6d, 0xd4, 0xae, 0x8e, 0xb1, 0x72, 0xe0, 0xcd, 0x37, 0x01, 0x28, 0x52, 0xd7, 0x39, 0x46, 0x0c, 0x55, 0xcf, 0x47, 0x70, 0xef, 0xa1, 0x17}, - subYX: fp.Elt{0x8d, 0x58, 0xde, 0x83, 0x88, 0x16, 0x0e, 0x12, 0x42, 0x03, 0x50, 0x60, 0x4b, 0xdf, 0xbf, 0x95, 0xcc, 0x7d, 0x18, 0x17, 0x7e, 0x31, 0x5d, 0x8a, 0x66, 0xc1, 0xcf, 0x14, 0xea, 0xf4, 0xf4, 0xe5, 0x63, 0x2d, 0x32, 0x86, 0x9b, 0xed, 0x1f, 0x4f, 0x03, 0xaf, 0x33, 0x92, 0xcb, 0xaf, 0x9c, 0x05, 0x0d, 0x47, 0x1b, 0x42, 0xba, 0x13, 0x22, 0x98}, - dt2: fp.Elt{0xb5, 0x48, 0xeb, 0x7d, 0x3d, 0x10, 0x9f, 0x59, 0xde, 0xf8, 0x1c, 0x4f, 0x7d, 0x9d, 0x40, 0x4d, 0x9e, 0x13, 0x24, 0xb5, 0x21, 0x09, 0xb7, 0xee, 0x98, 0x5c, 0x56, 0xbc, 0x5e, 0x2b, 0x78, 0x38, 0x06, 0xac, 0xe3, 0xe0, 0xfa, 0x2e, 0xde, 0x4f, 0xd2, 0xb3, 0xfb, 0x2d, 0x71, 0x84, 0xd1, 0x9d, 0x12, 0x5b, 0x35, 0xc8, 0x03, 0x68, 0x67, 0xc7}, - }, - { /* 39P*/ - addYX: fp.Elt{0xb6, 0x65, 0xfb, 0xa7, 0x06, 0x35, 0xbb, 0xe0, 0x31, 0x8d, 0x91, 0x40, 0x98, 0xab, 0x30, 0xe4, 0xca, 0x12, 0x59, 0x89, 0xed, 0x65, 0x5d, 0x7f, 0xae, 0x69, 0xa0, 0xa4, 0xfa, 0x78, 0xb4, 0xf7, 0xed, 0xae, 0x86, 0x78, 0x79, 0x64, 0x24, 0xa6, 0xd4, 0xe1, 0xf6, 0xd3, 0xa0, 0x89, 0xba, 0x20, 0xf4, 0x54, 0x0d, 0x8f, 0xdb, 0x1a, 0x79, 0xdb}, - subYX: fp.Elt{0xe1, 0x82, 0x0c, 0x4d, 0xde, 0x9f, 0x40, 0xf0, 0xc1, 0xbd, 0x8b, 0xd3, 0x24, 0x03, 0xcd, 0xf2, 0x92, 0x7d, 0xe2, 0x68, 0x7f, 0xf1, 0xbe, 0x69, 0xde, 0x34, 0x67, 0x4c, 0x85, 0x3b, 0xec, 0x98, 0xcc, 0x4d, 0x3e, 0xc0, 0x96, 0x27, 0xe6, 0x75, 0xfc, 0xdf, 0x37, 0xc0, 0x1e, 0x27, 0xe0, 0xf6, 0xc2, 0xbd, 0xbc, 0x3d, 0x9b, 0x39, 0xdc, 0xe2}, - dt2: fp.Elt{0xd8, 0x29, 0xa7, 0x39, 0xe3, 0x9f, 0x2f, 0x0e, 0x4b, 0x24, 0x21, 0x70, 0xef, 0xfd, 0x91, 0xea, 0xbf, 0xe1, 0x72, 0x90, 0xcc, 0xc9, 0x84, 0x0e, 0xad, 0xd5, 0xe6, 0xbb, 0xc5, 0x99, 0x7f, 0xa4, 0xf0, 0x2e, 0xcc, 0x95, 0x64, 0x27, 0x19, 0xd8, 0x4c, 0x27, 0x0d, 0xff, 0xb6, 0x29, 0xe2, 0x6c, 0xfa, 0xbb, 0x4d, 0x9c, 0xbb, 0xaf, 0xa5, 0xec}, - }, - { /* 41P*/ - addYX: fp.Elt{0xd6, 0x33, 0x3f, 0x9f, 0xcf, 0xfd, 0x4c, 0xd1, 0xfe, 0xe5, 0xeb, 0x64, 0x27, 0xae, 0x7a, 0xa2, 0x82, 0x50, 0x6d, 0xaa, 0xe3, 0x5d, 0xe2, 0x48, 0x60, 0xb3, 0x76, 0x04, 0xd9, 0x19, 0xa7, 0xa1, 0x73, 0x8d, 0x38, 0xa9, 0xaf, 0x45, 0xb5, 0xb2, 0x62, 0x9b, 0xf1, 0x35, 0x7b, 0x84, 0x66, 0xeb, 0x06, 0xef, 0xf1, 0xb2, 0x2d, 0x6a, 0x61, 0x15}, - subYX: fp.Elt{0x86, 0x50, 0x42, 0xf7, 0xda, 0x59, 0xb2, 0xcf, 0x0d, 0x3d, 0xee, 0x8e, 0x53, 0x5d, 0xf7, 0x9e, 0x6a, 0x26, 0x2d, 0xc7, 0x8c, 0x8e, 0x18, 0x50, 0x6d, 0xb7, 0x51, 0x4c, 0xa7, 0x52, 0x6e, 0x0e, 0x0a, 0x16, 0x74, 0xb2, 0x81, 0x8b, 0x56, 0x27, 0x22, 0x84, 0xf4, 0x56, 0xc5, 0x06, 0xe1, 0x8b, 0xca, 0x2d, 0xdb, 0x9a, 0xf6, 0x10, 0x9c, 0x51}, - dt2: fp.Elt{0x1f, 0x16, 0xa2, 0x78, 0x96, 0x1b, 0x85, 0x9c, 0x76, 0x49, 0xd4, 0x0f, 0xac, 0xb0, 0xf4, 0xd0, 0x06, 0x2c, 0x7e, 0x6d, 0x6e, 0x8e, 0xc7, 0x9f, 0x18, 0xad, 0xfc, 0x88, 0x0c, 0x0c, 0x09, 0x05, 0x05, 0xa0, 0x79, 0x72, 0x32, 0x72, 0x87, 0x0f, 0x49, 0x87, 0x0c, 0xb4, 0x12, 0xc2, 0x09, 0xf8, 0x9f, 0x30, 0x72, 0xa9, 0x47, 0x13, 0x93, 0x49}, - }, - { /* 43P*/ - addYX: fp.Elt{0xcc, 0xb1, 0x4c, 0xd3, 0xc0, 0x9e, 0x9e, 0x4d, 0x6d, 0x28, 0x0b, 0xa5, 0x94, 0xa7, 0x2e, 0xc2, 0xc7, 0xaf, 0x29, 0x73, 0xc9, 0x68, 0xea, 0x0f, 0x34, 0x37, 0x8d, 0x96, 0x8f, 0x3a, 0x3d, 0x73, 0x1e, 0x6d, 0x9f, 0xcf, 0x8d, 0x83, 0xb5, 0x71, 0xb9, 0xe1, 0x4b, 0x67, 0x71, 0xea, 0xcf, 0x56, 0xe5, 0xeb, 0x72, 0x15, 0x2f, 0x9e, 0xa8, 0xaa}, - subYX: fp.Elt{0xf4, 0x3e, 0x85, 0x1c, 0x1a, 0xef, 0x50, 0xd1, 0xb4, 0x20, 0xb2, 0x60, 0x05, 0x98, 0xfe, 0x47, 0x3b, 0xc1, 0x76, 0xca, 0x2c, 0x4e, 0x5a, 0x42, 0xa3, 0xf7, 0x20, 0xaa, 0x57, 0x39, 0xee, 0x34, 0x1f, 0xe1, 0x68, 0xd3, 0x7e, 0x06, 0xc4, 0x6c, 0xc7, 0x76, 0x2b, 0xe4, 0x1c, 0x48, 0x44, 0xe6, 0xe5, 0x44, 0x24, 0x8d, 0xb3, 0xb6, 0x88, 0x32}, - dt2: fp.Elt{0x18, 0xa7, 0xba, 0xd0, 0x44, 0x6f, 0x33, 0x31, 0x00, 0xf8, 0xf6, 0x12, 0xe3, 0xc5, 0xc7, 0xb5, 0x91, 0x9c, 0x91, 0xb5, 0x75, 0x18, 0x18, 0x8a, 0xab, 0xed, 0x24, 0x11, 0x2e, 0xce, 0x5a, 0x0f, 0x94, 0x5f, 0x2e, 0xca, 0xd3, 0x80, 0xea, 0xe5, 0x34, 0x96, 0x67, 0x8b, 0x6a, 0x26, 0x5e, 0xc8, 0x9d, 0x2c, 0x5e, 0x6c, 0xa2, 0x0c, 0xbf, 0xf0}, - }, - { /* 45P*/ - addYX: fp.Elt{0xb3, 0xbf, 0xa3, 0x85, 0xee, 0xf6, 0x58, 0x02, 0x78, 0xc4, 0x30, 0xd6, 0x57, 0x59, 0x8c, 0x88, 0x08, 0x7c, 0xbc, 0xbe, 0x0a, 0x74, 0xa9, 0xde, 0x69, 0xe7, 0x41, 0xd8, 0xbf, 0x66, 0x8d, 0x3d, 0x28, 0x00, 0x8c, 0x47, 0x65, 0x34, 0xfe, 0x86, 0x9e, 0x6a, 0xf2, 0x41, 0x6a, 0x94, 0xc4, 0x88, 0x75, 0x23, 0x0d, 0x52, 0x69, 0xee, 0x07, 0x89}, - subYX: fp.Elt{0x22, 0x3c, 0xa1, 0x70, 0x58, 0x97, 0x93, 0xbe, 0x59, 0xa8, 0x0b, 0x8a, 0x46, 0x2a, 0x38, 0x1e, 0x08, 0x6b, 0x61, 0x9f, 0xf2, 0x4a, 0x8b, 0x80, 0x68, 0x6e, 0xc8, 0x92, 0x60, 0xf3, 0xc9, 0x89, 0xb2, 0x6d, 0x63, 0xb0, 0xeb, 0x83, 0x15, 0x63, 0x0e, 0x64, 0xbb, 0xb8, 0xfe, 0xb4, 0x81, 0x90, 0x01, 0x28, 0x10, 0xb9, 0x74, 0x6e, 0xde, 0xa4}, - dt2: fp.Elt{0x1a, 0x23, 0x45, 0xa8, 0x6f, 0x4e, 0xa7, 0x4a, 0x0c, 0xeb, 0xb0, 0x43, 0xf9, 0xef, 0x99, 0x60, 0x5b, 0xdb, 0x66, 0xc0, 0x86, 0x71, 0x43, 0xb1, 0x22, 0x7b, 0x1c, 0xe7, 0x8d, 0x09, 0x1d, 0x83, 0x76, 0x9c, 0xd3, 0x5a, 0xdd, 0x42, 0xd9, 0x2f, 0x2d, 0xba, 0x7a, 0xc2, 0xd9, 0x6b, 0xd4, 0x7a, 0xf1, 0xd5, 0x5f, 0x6b, 0x85, 0xbf, 0x0b, 0xf1}, - }, - { /* 47P*/ - addYX: fp.Elt{0xb2, 0x83, 0xfa, 0x1f, 0xd2, 0xce, 0xb6, 0xf2, 0x2d, 0xea, 0x1b, 0xe5, 0x29, 0xa5, 0x72, 0xf9, 0x25, 0x48, 0x4e, 0xf2, 0x50, 0x1b, 0x39, 0xda, 0x34, 0xc5, 0x16, 0x13, 0xb4, 0x0c, 0xa1, 0x00, 0x79, 0x7a, 0xf5, 0x8b, 0xf3, 0x70, 0x14, 0xb6, 0xfc, 0x9a, 0x47, 0x68, 0x1e, 0x42, 0x70, 0x64, 0x2a, 0x84, 0x3e, 0x3d, 0x20, 0x58, 0xf9, 0x6a}, - subYX: fp.Elt{0xd9, 0xee, 0xc0, 0xc4, 0xf5, 0xc2, 0x86, 0xaf, 0x45, 0xd2, 0xd2, 0x87, 0x1b, 0x64, 0xd5, 0xe0, 0x8c, 0x44, 0x00, 0x4f, 0x43, 0x89, 0x04, 0x48, 0x4a, 0x0b, 0xca, 0x94, 0x06, 0x2f, 0x23, 0x5b, 0x6c, 0x8d, 0x44, 0x66, 0x53, 0xf5, 0x5a, 0x20, 0x72, 0x28, 0x58, 0x84, 0xcc, 0x73, 0x22, 0x5e, 0xd1, 0x0b, 0x56, 0x5e, 0x6a, 0xa3, 0x11, 0x91}, - dt2: fp.Elt{0x6e, 0x9f, 0x88, 0xa8, 0x68, 0x2f, 0x12, 0x37, 0x88, 0xfc, 0x92, 0x8f, 0x24, 0xeb, 0x5b, 0x2a, 0x2a, 0xd0, 0x14, 0x40, 0x4c, 0xa9, 0xa4, 0x03, 0x0c, 0x45, 0x48, 0x13, 0xe8, 0xa6, 0x37, 0xab, 0xc0, 0x06, 0x38, 0x6c, 0x96, 0x73, 0x40, 0x6c, 0xc6, 0xea, 0x56, 0xc6, 0xe9, 0x1a, 0x69, 0xeb, 0x7a, 0xd1, 0x33, 0x69, 0x58, 0x2b, 0xea, 0x2f}, - }, - { /* 49P*/ - addYX: fp.Elt{0x58, 0xa8, 0x05, 0x41, 0x00, 0x9d, 0xaa, 0xd9, 0x98, 0xcf, 0xb9, 0x41, 0xb5, 0x4a, 0x8d, 0xe2, 0xe7, 0xc0, 0x72, 0xef, 0xc8, 0x28, 0x6b, 0x68, 0x9d, 0xc9, 0xdf, 0x05, 0x8b, 0xd0, 0x04, 0x74, 0x79, 0x45, 0x52, 0x05, 0xa3, 0x6e, 0x35, 0x3a, 0xe3, 0xef, 0xb2, 0xdc, 0x08, 0x6f, 0x4e, 0x76, 0x85, 0x67, 0xba, 0x23, 0x8f, 0xdd, 0xaf, 0x09}, - subYX: fp.Elt{0xb4, 0x38, 0xc8, 0xff, 0x4f, 0x65, 0x2a, 0x7e, 0xad, 0xb1, 0xc6, 0xb9, 0x3d, 0xd6, 0xf7, 0x14, 0xcf, 0xf6, 0x98, 0x75, 0xbb, 0x47, 0x83, 0x90, 0xe7, 0xe1, 0xf6, 0x14, 0x99, 0x7e, 0xfa, 0xe4, 0x77, 0x24, 0xe3, 0xe7, 0xf0, 0x1e, 0xdb, 0x27, 0x4e, 0x16, 0x04, 0xf2, 0x08, 0x52, 0xfc, 0xec, 0x55, 0xdb, 0x2e, 0x67, 0xe1, 0x94, 0x32, 0x89}, - dt2: fp.Elt{0x00, 0xad, 0x03, 0x35, 0x1a, 0xb1, 0x88, 0xf0, 0xc9, 0x11, 0xe4, 0x12, 0x52, 0x61, 0xfd, 0x8a, 0x1b, 0x6a, 0x0a, 0x4c, 0x42, 0x46, 0x22, 0x0e, 0xa5, 0xf9, 0xe2, 0x50, 0xf2, 0xb2, 0x1f, 0x20, 0x78, 0x10, 0xf6, 0xbf, 0x7f, 0x0c, 0x9c, 0xad, 0x40, 0x8b, 0x82, 0xd4, 0xba, 0x69, 0x09, 0xac, 0x4b, 0x6d, 0xc4, 0x49, 0x17, 0x81, 0x57, 0x3b}, - }, - { /* 51P*/ - addYX: fp.Elt{0x0d, 0xfe, 0xb4, 0x35, 0x11, 0xbd, 0x1d, 0x6b, 0xc2, 0xc5, 0x3b, 0xd2, 0x23, 0x2c, 0x72, 0xe3, 0x48, 0xb1, 0x48, 0x73, 0xfb, 0xa3, 0x21, 0x6e, 0xc0, 0x09, 0x69, 0xac, 0xe1, 0x60, 0xbc, 0x24, 0x03, 0x99, 0x63, 0x0a, 0x00, 0xf0, 0x75, 0xf6, 0x92, 0xc5, 0xd6, 0xdb, 0x51, 0xd4, 0x7d, 0xe6, 0xf4, 0x11, 0x79, 0xd7, 0xc3, 0xaf, 0x48, 0xd0}, - subYX: fp.Elt{0xf4, 0x4f, 0xaf, 0x31, 0xe3, 0x10, 0x89, 0x95, 0xf0, 0x8a, 0xf6, 0x31, 0x9f, 0x48, 0x02, 0xba, 0x42, 0x2b, 0x3c, 0x22, 0x8b, 0xcc, 0x12, 0x98, 0x6e, 0x7a, 0x64, 0x3a, 0xc4, 0xca, 0x32, 0x2a, 0x72, 0xf8, 0x2c, 0xcf, 0x78, 0x5e, 0x7a, 0x75, 0x6e, 0x72, 0x46, 0x48, 0x62, 0x28, 0xac, 0x58, 0x1a, 0xc6, 0x59, 0x88, 0x2a, 0x44, 0x9e, 0x83}, - dt2: fp.Elt{0xb3, 0xde, 0x36, 0xfd, 0xeb, 0x1b, 0xd4, 0x24, 0x1b, 0x08, 0x8c, 0xfe, 0xa9, 0x41, 0xa1, 0x64, 0xf2, 0x6d, 0xdb, 0xf9, 0x94, 0xae, 0x86, 0x71, 0xab, 0x10, 0xbf, 0xa3, 0xb2, 0xa0, 0xdf, 0x10, 0x8c, 0x74, 0xce, 0xb3, 0xfc, 0xdb, 0xba, 0x15, 0xf6, 0x91, 0x7a, 0x9c, 0x36, 0x1e, 0x45, 0x07, 0x3c, 0xec, 0x1a, 0x61, 0x26, 0x93, 0xe3, 0x50}, - }, - { /* 53P*/ - addYX: fp.Elt{0xc5, 0x50, 0xc5, 0x83, 0xb0, 0xbd, 0xd9, 0xf6, 0x6d, 0x15, 0x5e, 0xc1, 0x1a, 0x33, 0xa0, 0xce, 0x13, 0x70, 0x3b, 0xe1, 0x31, 0xc6, 0xc4, 0x02, 0xec, 0x8c, 0xd5, 0x9c, 0x97, 0xd3, 0x12, 0xc4, 0xa2, 0xf9, 0xd5, 0xfb, 0x22, 0x69, 0x94, 0x09, 0x2f, 0x59, 0xce, 0xdb, 0xf2, 0xf2, 0x00, 0xe0, 0xa9, 0x08, 0x44, 0x2e, 0x8b, 0x6b, 0xf5, 0xb3}, - subYX: fp.Elt{0x90, 0xdd, 0xec, 0xa2, 0x65, 0xb7, 0x61, 0xbc, 0xaa, 0x70, 0xa2, 0x15, 0xd8, 0xb0, 0xf8, 0x8e, 0x23, 0x3d, 0x9f, 0x46, 0xa3, 0x29, 0x20, 0xd1, 0xa1, 0x15, 0x81, 0xc6, 0xb6, 0xde, 0xbe, 0x60, 0x63, 0x24, 0xac, 0x15, 0xfb, 0xeb, 0xd3, 0xea, 0x57, 0x13, 0x86, 0x38, 0x1e, 0x22, 0xf4, 0x8c, 0x5d, 0xaf, 0x1b, 0x27, 0x21, 0x4f, 0xa3, 0x63}, - dt2: fp.Elt{0x07, 0x15, 0x87, 0xc4, 0xfd, 0xa1, 0x97, 0x7a, 0x07, 0x1f, 0x56, 0xcc, 0xe3, 0x6a, 0x01, 0x90, 0xce, 0xf9, 0xfa, 0x50, 0xb2, 0xe0, 0x87, 0x8b, 0x6c, 0x63, 0x6c, 0xf6, 0x2a, 0x09, 0xef, 0xef, 0xd2, 0x31, 0x40, 0x25, 0xf6, 0x84, 0xcb, 0xe0, 0xc4, 0x23, 0xc1, 0xcb, 0xe2, 0x02, 0x83, 0x2d, 0xed, 0x74, 0x74, 0x8b, 0xf8, 0x7c, 0x81, 0x18}, - }, - { /* 55P*/ - addYX: fp.Elt{0x9e, 0xe5, 0x59, 0x95, 0x63, 0x2e, 0xac, 0x8b, 0x03, 0x3c, 0xc1, 0x8e, 0xe1, 0x5b, 0x56, 0x3c, 0x16, 0x41, 0xe4, 0xc2, 0x60, 0x0c, 0x6d, 0x65, 0x9f, 0xfc, 0x27, 0x68, 0x43, 0x44, 0x05, 0x12, 0x6c, 0xda, 0x04, 0xef, 0xcf, 0xcf, 0xdc, 0x0a, 0x1a, 0x7f, 0x12, 0xd3, 0xeb, 0x02, 0xb6, 0x04, 0xca, 0xd6, 0xcb, 0xf0, 0x22, 0xba, 0x35, 0x6d}, - subYX: fp.Elt{0x09, 0x6d, 0xf9, 0x64, 0x4c, 0xe6, 0x41, 0xff, 0x01, 0x4d, 0xce, 0x1e, 0xfa, 0x38, 0xa2, 0x25, 0x62, 0xff, 0x03, 0x39, 0x18, 0x91, 0xbb, 0x9d, 0xce, 0x02, 0xf0, 0xf1, 0x3c, 0x55, 0x18, 0xa9, 0xab, 0x4d, 0xd2, 0x35, 0xfd, 0x8d, 0xa9, 0xb2, 0xad, 0xb7, 0x06, 0x6e, 0xc6, 0x69, 0x49, 0xd6, 0x98, 0x98, 0x0b, 0x22, 0x81, 0x6b, 0xbd, 0xa0}, - dt2: fp.Elt{0x22, 0xf4, 0x85, 0x5d, 0x2b, 0xf1, 0x55, 0xa5, 0xd6, 0x27, 0x86, 0x57, 0x12, 0x1f, 0x16, 0x0a, 0x5a, 0x9b, 0xf2, 0x38, 0xb6, 0x28, 0xd8, 0x99, 0x0c, 0x89, 0x1d, 0x7f, 0xca, 0x21, 0x17, 0x1a, 0x0b, 0x02, 0x5f, 0x77, 0x2f, 0x73, 0x30, 0x7c, 0xc8, 0xd7, 0x2b, 0xcc, 0xe7, 0xf3, 0x21, 0xac, 0x53, 0xa7, 0x11, 0x5d, 0xd8, 0x1d, 0x9b, 0xf5}, - }, - { /* 57P*/ - addYX: fp.Elt{0x94, 0x63, 0x5d, 0xef, 0xfd, 0x6d, 0x25, 0x4e, 0x6d, 0x29, 0x03, 0xed, 0x24, 0x28, 0x27, 0x57, 0x47, 0x3e, 0x6a, 0x1a, 0xfe, 0x37, 0xee, 0x5f, 0x83, 0x29, 0x14, 0xfd, 0x78, 0x25, 0x8a, 0xe1, 0x02, 0x38, 0xd8, 0xca, 0x65, 0x55, 0x40, 0x7d, 0x48, 0x2c, 0x7c, 0x7e, 0x60, 0xb6, 0x0c, 0x6d, 0xf7, 0xe8, 0xb3, 0x62, 0x53, 0xd6, 0x9c, 0x2b}, - subYX: fp.Elt{0x47, 0x25, 0x70, 0x62, 0xf5, 0x65, 0x93, 0x62, 0x08, 0xac, 0x59, 0x66, 0xdb, 0x08, 0xd9, 0x1a, 0x19, 0xaf, 0xf4, 0xef, 0x02, 0xa2, 0x78, 0xa9, 0x55, 0x1c, 0xfa, 0x08, 0x11, 0xcb, 0xa3, 0x71, 0x74, 0xb1, 0x62, 0xe7, 0xc7, 0xf3, 0x5a, 0xb5, 0x8b, 0xd4, 0xf6, 0x10, 0x57, 0x79, 0x72, 0x2f, 0x13, 0x86, 0x7b, 0x44, 0x5f, 0x48, 0xfd, 0x88}, - dt2: fp.Elt{0x10, 0x02, 0xcd, 0x05, 0x9a, 0xc3, 0x32, 0x6d, 0x10, 0x3a, 0x74, 0xba, 0x06, 0xc4, 0x3b, 0x34, 0xbc, 0x36, 0xed, 0xa3, 0xba, 0x9a, 0xdb, 0x6d, 0xd4, 0x69, 0x99, 0x97, 0xd0, 0xe4, 0xdd, 0xf5, 0xd4, 0x7c, 0xd3, 0x4e, 0xab, 0xd1, 0x3b, 0xbb, 0xe9, 0xc7, 0x6a, 0x94, 0x25, 0x61, 0xf0, 0x06, 0xc5, 0x12, 0xa8, 0x86, 0xe5, 0x35, 0x46, 0xeb}, - }, - { /* 59P*/ - addYX: fp.Elt{0x9e, 0x95, 0x11, 0xc6, 0xc7, 0xe8, 0xee, 0x5a, 0x26, 0xa0, 0x72, 0x72, 0x59, 0x91, 0x59, 0x16, 0x49, 0x99, 0x7e, 0xbb, 0xd7, 0x15, 0xb4, 0xf2, 0x40, 0xf9, 0x5a, 0x4d, 0xc8, 0xa0, 0xe2, 0x34, 0x7b, 0x34, 0xf3, 0x99, 0xbf, 0xa9, 0xf3, 0x79, 0xc1, 0x1a, 0x0c, 0xf4, 0x86, 0x74, 0x4e, 0xcb, 0xbc, 0x90, 0xad, 0xb6, 0x51, 0x6d, 0xaa, 0x33}, - subYX: fp.Elt{0x9f, 0xd1, 0xc5, 0xa2, 0x6c, 0x24, 0x88, 0x15, 0x71, 0x68, 0xf6, 0x07, 0x45, 0x02, 0xc4, 0x73, 0x7e, 0x75, 0x87, 0xca, 0x7c, 0xf0, 0x92, 0x00, 0x75, 0xd6, 0x5a, 0xdd, 0xe0, 0x64, 0x16, 0x9d, 0x62, 0x80, 0x33, 0x9f, 0xf4, 0x8e, 0x1a, 0x15, 0x1c, 0xd3, 0x0f, 0x4d, 0x4f, 0x62, 0x2d, 0xd7, 0xa5, 0x77, 0xe3, 0xea, 0xf0, 0xfb, 0x1a, 0xdb}, - dt2: fp.Elt{0x6a, 0xa2, 0xb1, 0xaa, 0xfb, 0x5a, 0x32, 0x4e, 0xff, 0x47, 0x06, 0xd5, 0x9a, 0x4f, 0xce, 0x83, 0x5b, 0x82, 0x34, 0x3e, 0x47, 0xb8, 0xf8, 0xe9, 0x7c, 0x67, 0x69, 0x8d, 0x9c, 0xb7, 0xde, 0x57, 0xf4, 0x88, 0x41, 0x56, 0x0c, 0x87, 0x1e, 0xc9, 0x2f, 0x54, 0xbf, 0x5c, 0x68, 0x2c, 0xd9, 0xc4, 0xef, 0x53, 0x73, 0x1e, 0xa6, 0x38, 0x02, 0x10}, - }, - { /* 61P*/ - addYX: fp.Elt{0x08, 0x80, 0x4a, 0xc9, 0xb7, 0xa8, 0x88, 0xd9, 0xfc, 0x6a, 0xc0, 0x3e, 0xc2, 0x33, 0x4d, 0x2b, 0x2a, 0xa3, 0x6d, 0x72, 0x3e, 0xdc, 0x34, 0x68, 0x08, 0xbf, 0x27, 0xef, 0xf4, 0xff, 0xe2, 0x0c, 0x31, 0x0c, 0xa2, 0x0a, 0x1f, 0x65, 0xc1, 0x4c, 0x61, 0xd3, 0x1b, 0xbc, 0x25, 0xb1, 0xd0, 0xd4, 0x89, 0xb2, 0x53, 0xfb, 0x43, 0xa5, 0xaf, 0x04}, - subYX: fp.Elt{0xe3, 0xe1, 0x37, 0xad, 0x58, 0xa9, 0x55, 0x81, 0xee, 0x64, 0x21, 0xb9, 0xf5, 0x4c, 0x35, 0xea, 0x4a, 0xd3, 0x26, 0xaa, 0x90, 0xd4, 0x60, 0x46, 0x09, 0x4b, 0x4a, 0x62, 0xf9, 0xcd, 0xe1, 0xee, 0xbb, 0xc2, 0x09, 0x0b, 0xb0, 0x96, 0x8e, 0x43, 0x77, 0xaf, 0x25, 0x20, 0x5e, 0x47, 0xe4, 0x1d, 0x50, 0x69, 0x74, 0x08, 0xd7, 0xb9, 0x90, 0x13}, - dt2: fp.Elt{0x51, 0x91, 0x95, 0x64, 0x03, 0x16, 0xfd, 0x6e, 0x26, 0x94, 0x6b, 0x61, 0xe7, 0xd9, 0xe0, 0x4a, 0x6d, 0x7c, 0xfa, 0xc0, 0xe2, 0x43, 0x23, 0x53, 0x70, 0xf5, 0x6f, 0x73, 0x8b, 0x81, 0xb0, 0x0c, 0xee, 0x2e, 0x46, 0xf2, 0x8d, 0xa6, 0xfb, 0xb5, 0x1c, 0x33, 0xbf, 0x90, 0x59, 0xc9, 0x7c, 0xb8, 0x6f, 0xad, 0x75, 0x02, 0x90, 0x8e, 0x59, 0x75}, - }, - { /* 63P*/ - addYX: fp.Elt{0x36, 0x4d, 0x77, 0x04, 0xb8, 0x7d, 0x4a, 0xd1, 0xc5, 0xbb, 0x7b, 0x50, 0x5f, 0x8d, 0x9d, 0x62, 0x0f, 0x66, 0x71, 0xec, 0x87, 0xc5, 0x80, 0x82, 0xc8, 0xf4, 0x6a, 0x94, 0x92, 0x5b, 0xb0, 0x16, 0x9b, 0xb2, 0xc9, 0x6f, 0x2b, 0x2d, 0xee, 0x95, 0x73, 0x2e, 0xc2, 0x1b, 0xc5, 0x55, 0x36, 0x86, 0x24, 0xf8, 0x20, 0x05, 0x0d, 0x93, 0xd7, 0x76}, - subYX: fp.Elt{0x7f, 0x01, 0xeb, 0x2e, 0x48, 0x4d, 0x1d, 0xf1, 0x06, 0x7e, 0x7c, 0x2a, 0x43, 0xbf, 0x28, 0xac, 0xe9, 0x58, 0x13, 0xc8, 0xbf, 0x8e, 0xc0, 0xef, 0xe8, 0x4f, 0x46, 0x8a, 0xe7, 0xc0, 0xf6, 0x0f, 0x0a, 0x03, 0x48, 0x91, 0x55, 0x39, 0x2a, 0xe3, 0xdc, 0xf6, 0x22, 0x9d, 0x4d, 0x71, 0x55, 0x68, 0x25, 0x6e, 0x95, 0x52, 0xee, 0x4c, 0xd9, 0x01}, - dt2: fp.Elt{0xac, 0x33, 0x3f, 0x7c, 0x27, 0x35, 0x15, 0x91, 0x33, 0x8d, 0xf9, 0xc4, 0xf4, 0xf3, 0x90, 0x09, 0x75, 0x69, 0x62, 0x9f, 0x61, 0x35, 0x83, 0x92, 0x04, 0xef, 0x96, 0x38, 0x80, 0x9e, 0x88, 0xb3, 0x67, 0x95, 0xbe, 0x79, 0x3c, 0x35, 0xd8, 0xdc, 0xb2, 0x3e, 0x2d, 0xe6, 0x46, 0xbe, 0x81, 0xf3, 0x32, 0x0e, 0x37, 0x23, 0x75, 0x2a, 0x3d, 0xa0}, - }, -} diff --git a/ecc/goldilocks/twist_basemult.go b/ecc/goldilocks/twist_basemult.go deleted file mode 100644 index 3cbf6bc0..00000000 --- a/ecc/goldilocks/twist_basemult.go +++ /dev/null @@ -1,62 +0,0 @@ -package goldilocks - -import ( - "crypto/subtle" - - mlsb "github.com/quantumcoinproject/circl/math/mlsbset" -) - -const ( - // MLSBRecoding parameters - fxT = 448 - fxV = 2 - fxW = 3 - fx2w1 = 1 << (uint(fxW) - 1) -) - -// ScalarBaseMult returns kG where G is the generator point. -func (e twistCurve) ScalarBaseMult(k *Scalar) *twistPoint { - m, err := mlsb.New(fxT, fxV, fxW) - if err != nil { - panic(err) - } - if m.IsExtended() { - panic("not extended") - } - - var isZero int - if k.IsZero() { - isZero = 1 - } - subtle.ConstantTimeCopy(isZero, k[:], order[:]) - - minusK := *k - isEven := 1 - int(k[0]&0x1) - minusK.Neg() - subtle.ConstantTimeCopy(isEven, k[:], minusK[:]) - c, err := m.Encode(k[:]) - if err != nil { - panic(err) - } - - gP := c.Exp(groupMLSB{}) - P := gP.(*twistPoint) - P.cneg(uint(isEven)) - return P -} - -type groupMLSB struct{} - -func (e groupMLSB) ExtendedEltP() mlsb.EltP { return nil } -func (e groupMLSB) Sqr(x mlsb.EltG) { x.(*twistPoint).Double() } -func (e groupMLSB) Mul(x mlsb.EltG, y mlsb.EltP) { x.(*twistPoint).mixAddZ1(y.(*preTwistPointAffine)) } -func (e groupMLSB) Identity() mlsb.EltG { return twistCurve{}.Identity() } -func (e groupMLSB) NewEltP() mlsb.EltP { return &preTwistPointAffine{} } -func (e groupMLSB) Lookup(a mlsb.EltP, v uint, s, u int32) { - Tabj := &tabFixMult[v] - P := a.(*preTwistPointAffine) - for k := range Tabj { - P.cmov(&Tabj[k], uint(subtle.ConstantTimeEq(int32(k), u))) - } - P.cneg(int(s >> 31)) -} diff --git a/ecc/p384/LICENSE b/ecc/p384/LICENSE deleted file mode 100644 index 4e5596db..00000000 --- a/ecc/p384/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2018, Brendan McMillion. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors -may be used to endorse or promote products derived from this software without -specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ecc/p384/arith.go b/ecc/p384/arith.go deleted file mode 100644 index 58eb5483..00000000 --- a/ecc/p384/arith.go +++ /dev/null @@ -1,149 +0,0 @@ -//go:build (!purego && arm64) || (!purego && amd64) -// +build !purego,arm64 !purego,amd64 - -package p384 - -import ( - "math/big" - - "github.com/quantumcoinproject/circl/internal/conv" -) - -const sizeFp = 48 - -type fp384 [sizeFp]byte - -func (e fp384) BigInt() *big.Int { return conv.BytesLe2BigInt(e[:]) } -func (e fp384) String() string { return conv.BytesLe2Hex(e[:]) } - -func (e *fp384) SetBigInt(b *big.Int) { - if b.BitLen() > 384 || b.Sign() < 0 { - b = new(big.Int).Mod(b, p.BigInt()) - } - conv.BigInt2BytesLe(e[:], b) -} - -func montEncode(c, a *fp384) { fp384Mul(c, a, &r2) } -func montDecode(c, a *fp384) { fp384Mul(c, a, &fp384{1}) } -func fp384Sqr(c, a *fp384) { fp384Mul(c, a, a) } - -func fp384Inv(z, x *fp384) { - t0, t1, t2, t3, t4 := &fp384{}, &fp384{}, &fp384{}, &fp384{}, &fp384{} - /* alpha_1 */ - fp384Sqr(t4, x) - /* alpha_2 */ - fp384Mul(t4, t4, x) - /* alpha_3 */ - fp384Sqr(t0, t4) - fp384Mul(t0, t0, x) - /* alpha_6 */ - fp384Sqr(t1, t0) - fp384Sqr(t1, t1) - fp384Sqr(t1, t1) - fp384Mul(t1, t1, t0) - /* alpha_12 */ - fp384Sqr(t2, t1) - for i := 0; i < 5; i++ { - fp384Sqr(t2, t2) - } - fp384Mul(t2, t2, t1) - /* alpha_15 */ - for i := 0; i < 3; i++ { - fp384Sqr(t2, t2) - } - fp384Mul(t2, t2, t0) - /* alpha_30 */ - fp384Sqr(t1, t2) - for i := 0; i < 14; i++ { - fp384Sqr(t1, t1) - } - fp384Mul(t1, t1, t2) - /* alpha_60 */ - fp384Sqr(t3, t1) - for i := 0; i < 29; i++ { - fp384Sqr(t3, t3) - } - fp384Mul(t3, t3, t1) - /* T_3 = alpha_30^(2^2) */ - fp384Sqr(t1, t1) - fp384Sqr(t1, t1) - /* alpha_32 */ - *t0 = *t1 - fp384Mul(t0, t0, t4) - /* T_3 = a^(2^32-3) = (alpha_30)^(2^2)*alpha_1 */ - fp384Mul(t1, t1, x) - /* alpha_120 */ - fp384Sqr(t4, t3) - for i := 0; i < 59; i++ { - fp384Sqr(t4, t4) - } - fp384Mul(t4, t4, t3) - /* alpha_240 */ - fp384Sqr(t3, t4) - for i := 0; i < 119; i++ { - fp384Sqr(t3, t3) - } - fp384Mul(t3, t3, t4) - /* alpha_255 */ - for i := 0; i < 15; i++ { - fp384Sqr(t3, t3) - } - fp384Mul(t3, t3, t2) - /* T_5 = a^(2^288-2^32-1) = (alpha_255)^(2^33)*alpha_32 */ - for i := 0; i < 33; i++ { - fp384Sqr(t3, t3) - } - fp384Mul(t3, t3, t0) - /* T_1 = a^(2^384-2^128-2^96+2^32-3) = (T_1)^(2^96)*T_3 */ - fp384Sqr(t4, t3) - for i := 0; i < 95; i++ { - fp384Sqr(t4, t4) - } - fp384Mul(z, t4, t1) -} - -//go:noescape -func fp384Cmov(x, y *fp384, b int) - -//go:noescape -func fp384Neg(c, a *fp384) - -//go:noescape -func fp384Add(c, a, b *fp384) - -//go:noescape -func fp384Sub(c, a, b *fp384) - -//go:noescape -func fp384Mul(c, a, b *fp384) - -var ( - // p is the order of the base field, represented as little-endian 64-bit words. - p = fp384{ - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - } - // pp satisfies r*rp - p*pp = 1 where rp and pp are both integers. - pp = fp384{ //nolint - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, - 0xfa, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, - } - // r2 is R^2 where R = 2^384 mod p. - r2 = fp384{ - 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - } - // bb is the Montgomery encoding of the curve parameter B. - bb = fp384{ - 0xcc, 0x2d, 0x41, 0x9d, 0x71, 0x88, 0x11, 0x08, 0xec, 0x32, 0x4c, 0x7a, - 0xd8, 0xad, 0x29, 0xf7, 0x2e, 0x02, 0x20, 0x19, 0x9b, 0x20, 0xf2, 0x77, - 0xe2, 0x8a, 0x93, 0x94, 0xee, 0x4b, 0x37, 0xe3, 0x94, 0x20, 0x02, 0x1f, - 0xf4, 0x21, 0x2b, 0xb6, 0xf9, 0xbf, 0x4f, 0x60, 0x4b, 0x11, 0x08, 0xcd, - } -) diff --git a/ecc/p384/arith_amd64.go b/ecc/p384/arith_amd64.go deleted file mode 100644 index 2e9d8fdd..00000000 --- a/ecc/p384/arith_amd64.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build amd64 && !purego -// +build amd64,!purego - -package p384 - -import "golang.org/x/sys/cpu" - -var hasBMI2 = cpu.X86.HasBMI2 //nolint diff --git a/ecc/p384/arith_amd64.s b/ecc/p384/arith_amd64.s deleted file mode 100644 index eaf6fb7a..00000000 --- a/ecc/p384/arith_amd64.s +++ /dev/null @@ -1,730 +0,0 @@ -// +build amd64,!purego - -#include "textflag.h" - -#define storeBlock(a0,a1,a2,a3,a4,a5, r) \ - MOVQ a0, 0+r \ - MOVQ a1, 8+r \ - MOVQ a2, 16+r \ - MOVQ a3, 24+r \ - MOVQ a4, 32+r \ - MOVQ a5, 40+r - -#define loadBlock(r, a0,a1,a2,a3,a4,a5) \ - MOVQ 0+r, a0 \ - MOVQ 8+r, a1 \ - MOVQ 16+r, a2 \ - MOVQ 24+r, a3 \ - MOVQ 32+r, a4 \ - MOVQ 40+r, a5 - -#define fp384Carry(a0,a1,a2,a3,a4,a5,a6, b0,b1,b2,b3,b4,b5,b6) \ - \ // b = a-p - MOVQ a0, b0 \ - MOVQ a1, b1 \ - MOVQ a2, b2 \ - MOVQ a3, b3 \ - MOVQ a4, b4 \ - MOVQ a5, b5 \ - MOVQ a6, b6 \ - \ - SUBQ ·p+0(SB), b0 \ - SBBQ ·p+8(SB), b1 \ - SBBQ ·p+16(SB), b2 \ - SBBQ ·p+24(SB), b3 \ - SBBQ ·p+32(SB), b4 \ - SBBQ ·p+40(SB), b5 \ - SBBQ $0, b6 \ - \ - \ // if b is negative then return a - \ // else return b - CMOVQCC b0, a0 \ - CMOVQCC b1, a1 \ - CMOVQCC b2, a2 \ - CMOVQCC b3, a3 \ - CMOVQCC b4, a4 \ - CMOVQCC b5, a5 - -#define mul(a0,a1,a2,a3,a4,a5, rb, stack) \ - \ // a0 - MOVQ a0, AX \ - MULQ 0+rb \ - MOVQ AX, R8 \ - MOVQ DX, R9 \ - MOVQ a0, AX \ - MULQ 8+rb \ - ADDQ AX, R9 \ - ADCQ $0, DX \ - MOVQ DX, R10 \ - MOVQ a0, AX \ - MULQ 16+rb \ - ADDQ AX, R10 \ - ADCQ $0, DX \ - MOVQ DX, R11 \ - MOVQ a0, AX \ - MULQ 24+rb \ - ADDQ AX, R11 \ - ADCQ $0, DX \ - MOVQ DX, R12 \ - MOVQ a0, AX \ - MULQ 32+rb \ - ADDQ AX, R12 \ - ADCQ $0, DX \ - MOVQ DX, R13 \ - MOVQ a0, AX \ - MULQ 40+rb \ - ADDQ AX, R13 \ - ADCQ $0, DX \ - MOVQ DX, R14 \ - \ - storeBlock(R8,R9,R10,R11,R12,R13, 0+stack) \ - MOVQ R14, 48+stack \ - \ - \ // a1 - MOVQ a1, AX \ - MULQ 0+rb \ - MOVQ AX, R8 \ - MOVQ DX, R9 \ - MOVQ a1, AX \ - MULQ 8+rb \ - ADDQ AX, R9 \ - ADCQ $0, DX \ - MOVQ DX, R10 \ - MOVQ a1, AX \ - MULQ 16+rb \ - ADDQ AX, R10 \ - ADCQ $0, DX \ - MOVQ DX, R11 \ - MOVQ a1, AX \ - MULQ 24+rb \ - ADDQ AX, R11 \ - ADCQ $0, DX \ - MOVQ DX, R12 \ - MOVQ a1, AX \ - MULQ 32+rb \ - ADDQ AX, R12 \ - ADCQ $0, DX \ - MOVQ DX, R13 \ - MOVQ a1, AX \ - MULQ 40+rb \ - ADDQ AX, R13 \ - ADCQ $0, DX \ - MOVQ DX, R14 \ - \ - ADDQ 8+stack, R8 \ - ADCQ 16+stack, R9 \ - ADCQ 24+stack, R10 \ - ADCQ 32+stack, R11 \ - ADCQ 40+stack, R12 \ - ADCQ 48+stack, R13 \ - ADCQ $0, R14 \ - storeBlock(R8,R9,R10,R11,R12,R13, 8+stack) \ - MOVQ R14, 56+stack \ - \ - \ // a2 - MOVQ a2, AX \ - MULQ 0+rb \ - MOVQ AX, R8 \ - MOVQ DX, R9 \ - MOVQ a2, AX \ - MULQ 8+rb \ - ADDQ AX, R9 \ - ADCQ $0, DX \ - MOVQ DX, R10 \ - MOVQ a2, AX \ - MULQ 16+rb \ - ADDQ AX, R10 \ - ADCQ $0, DX \ - MOVQ DX, R11 \ - MOVQ a2, AX \ - MULQ 24+rb \ - ADDQ AX, R11 \ - ADCQ $0, DX \ - MOVQ DX, R12 \ - MOVQ a2, AX \ - MULQ 32+rb \ - ADDQ AX, R12 \ - ADCQ $0, DX \ - MOVQ DX, R13 \ - MOVQ a2, AX \ - MULQ 40+rb \ - ADDQ AX, R13 \ - ADCQ $0, DX \ - MOVQ DX, R14 \ - \ - ADDQ 16+stack, R8 \ - ADCQ 24+stack, R9 \ - ADCQ 32+stack, R10 \ - ADCQ 40+stack, R11 \ - ADCQ 48+stack, R12 \ - ADCQ 56+stack, R13 \ - ADCQ $0, R14 \ - storeBlock(R8,R9,R10,R11,R12,R13, 16+stack) \ - MOVQ R14, 64+stack \ - \ - \ // a3 - MOVQ a3, AX \ - MULQ 0+rb \ - MOVQ AX, R8 \ - MOVQ DX, R9 \ - MOVQ a3, AX \ - MULQ 8+rb \ - ADDQ AX, R9 \ - ADCQ $0, DX \ - MOVQ DX, R10 \ - MOVQ a3, AX \ - MULQ 16+rb \ - ADDQ AX, R10 \ - ADCQ $0, DX \ - MOVQ DX, R11 \ - MOVQ a3, AX \ - MULQ 24+rb \ - ADDQ AX, R11 \ - ADCQ $0, DX \ - MOVQ DX, R12 \ - MOVQ a3, AX \ - MULQ 32+rb \ - ADDQ AX, R12 \ - ADCQ $0, DX \ - MOVQ DX, R13 \ - MOVQ a3, AX \ - MULQ 40+rb \ - ADDQ AX, R13 \ - ADCQ $0, DX \ - MOVQ DX, R14 \ - \ - ADDQ 24+stack, R8 \ - ADCQ 32+stack, R9 \ - ADCQ 40+stack, R10 \ - ADCQ 48+stack, R11 \ - ADCQ 56+stack, R12 \ - ADCQ 64+stack, R13 \ - ADCQ $0, R14 \ - storeBlock(R8,R9,R10,R11,R12,R13, 24+stack) \ - MOVQ R14, 72+stack \ - \ - \ // a4 - MOVQ a4, AX \ - MULQ 0+rb \ - MOVQ AX, R8 \ - MOVQ DX, R9 \ - MOVQ a4, AX \ - MULQ 8+rb \ - ADDQ AX, R9 \ - ADCQ $0, DX \ - MOVQ DX, R10 \ - MOVQ a4, AX \ - MULQ 16+rb \ - ADDQ AX, R10 \ - ADCQ $0, DX \ - MOVQ DX, R11 \ - MOVQ a4, AX \ - MULQ 24+rb \ - ADDQ AX, R11 \ - ADCQ $0, DX \ - MOVQ DX, R12 \ - MOVQ a4, AX \ - MULQ 32+rb \ - ADDQ AX, R12 \ - ADCQ $0, DX \ - MOVQ DX, R13 \ - MOVQ a4, AX \ - MULQ 40+rb \ - ADDQ AX, R13 \ - ADCQ $0, DX \ - MOVQ DX, R14 \ - \ - ADDQ 32+stack, R8 \ - ADCQ 40+stack, R9 \ - ADCQ 48+stack, R10 \ - ADCQ 56+stack, R11 \ - ADCQ 64+stack, R12 \ - ADCQ 72+stack, R13 \ - ADCQ $0, R14 \ - storeBlock(R8,R9,R10,R11,R12,R13, 32+stack) \ - MOVQ R14, 80+stack \ - \ - \ // a5 - MOVQ a5, AX \ - MULQ 0+rb \ - MOVQ AX, R8 \ - MOVQ DX, R9 \ - MOVQ a5, AX \ - MULQ 8+rb \ - ADDQ AX, R9 \ - ADCQ $0, DX \ - MOVQ DX, R10 \ - MOVQ a5, AX \ - MULQ 16+rb \ - ADDQ AX, R10 \ - ADCQ $0, DX \ - MOVQ DX, R11 \ - MOVQ a5, AX \ - MULQ 24+rb \ - ADDQ AX, R11 \ - ADCQ $0, DX \ - MOVQ DX, R12 \ - MOVQ a5, AX \ - MULQ 32+rb \ - ADDQ AX, R12 \ - ADCQ $0, DX \ - MOVQ DX, R13 \ - MOVQ a5, AX \ - MULQ 40+rb \ - ADDQ AX, R13 \ - ADCQ $0, DX \ - MOVQ DX, R14 \ - \ - ADDQ 40+stack, R8 \ - ADCQ 48+stack, R9 \ - ADCQ 56+stack, R10 \ - ADCQ 64+stack, R11 \ - ADCQ 72+stack, R12 \ - ADCQ 80+stack, R13 \ - ADCQ $0, R14 \ - storeBlock(R8,R9,R10,R11,R12,R13, 40+stack) \ - MOVQ R14, 88+stack - -#define fp384Reduce(stack) \ - \ // m = (T * P') mod R, store m in R8:R9:R10:R11:R12:R13 - MOVQ ·pp+0(SB), AX \ - MULQ 0+stack \ - MOVQ AX, R8 ; MOVQ R8, 96+stack\ - MOVQ DX, R9 \ - MOVQ ·pp+0(SB), AX \ - MULQ 8+stack \ - ADDQ AX, R9 \ - ADCQ $0, DX \ - MOVQ DX, R10 \ - MOVQ ·pp+0(SB), AX \ - MULQ 16+stack \ - ADDQ AX, R10 \ - ADCQ $0, DX \ - MOVQ DX, R11 \ - MOVQ ·pp+0(SB), AX \ - MULQ 24+stack \ - ADDQ AX, R11 \ - ADCQ $0, DX \ - MOVQ DX, R12 \ - MOVQ ·pp+0(SB), AX \ - MULQ 32+stack \ - ADDQ AX, R12 \ - ADCQ $0, DX \ - MOVQ DX, R13 \ - MOVQ ·pp+0(SB), AX \ - MULQ 40+stack \ - ADDQ AX, R13 \ - \ - ADDQ 0+stack, R9 \ - ADCQ 8+stack, R10 \ - ADCQ 16+stack, R11 \ - ADCQ 24+stack, R12 \ - ADCQ 32+stack, R13 \ - \ - MOVQ ·pp+16(SB), AX \ - MULQ 0+stack \ - MOVQ AX, R14 \ - MOVQ DX, R8 \ - MOVQ ·pp+16(SB), AX \ - MULQ 8+stack \ - ADDQ AX, R8 \ - ADCQ $0, DX \ - MOVQ DX, BX \ - MOVQ ·pp+16(SB), AX \ - MULQ 16+stack \ - ADDQ AX, BX \ - ADCQ $0, DX \ - MOVQ DX, CX \ - MOVQ ·pp+16(SB), AX \ - MULQ 24+stack \ - ADDQ AX, CX \ - \ - ADDQ R14, R10 \ - ADCQ R8, R11 \ - ADCQ BX, R12 \ - ADCQ CX, R13 \ - \ - MOVQ ·pp+24(SB), AX \ - MULQ 0+stack \ - MOVQ AX, R14 \ - MOVQ DX, R8 \ - MOVQ ·pp+24(SB), AX \ - MULQ 8+stack \ - ADDQ AX, R8 \ - ADCQ $0, DX \ - MOVQ DX, BX \ - MOVQ ·pp+24(SB), AX \ - MULQ 16+stack \ - ADDQ AX, BX \ - \ - ADDQ R14, R11 \ - ADCQ R8, R12 \ - ADCQ BX, R13 \ - \ - MOVQ ·pp+32(SB), AX \ - MULQ 0+stack \ - MOVQ AX, R14 \ - MOVQ DX, R8 \ - MOVQ ·pp+32(SB), AX \ - MULQ 8+stack \ - ADDQ AX, R8 \ - \ - ADDQ R14, R12 \ - ADCQ R8, R13 \ - \ - MOVQ ·pp+40(SB), AX \ - MULQ 0+stack \ - ADDQ AX, R13 \ - \ - MOVQ 96+stack, R8 \ - \ - storeBlock(R8,R9,R10,R11,R12,R13, 96+stack) \ - \ - \ // m * P - mul(·p+0(SB),·p+8(SB),·p+16(SB),·p+24(SB),·p+32(SB),·p+40(SB), 96+stack, 144+stack) \ - \ - \ // Add the 768-bit intermediate to m*N - MOVQ $0, R15 \ - loadBlock(144+stack, R8,R9,R10,R11,R12,R13) \ - loadBlock(192+stack, R14,SI,AX,BX,CX,DX) \ - \ - ADDQ 0+stack, R8 \ - ADCQ 8+stack, R9 \ - ADCQ 16+stack, R10 \ - ADCQ 24+stack, R11 \ - ADCQ 32+stack, R12 \ - ADCQ 40+stack, R13 \ - ADCQ 48+stack, R14 \ - ADCQ 56+stack, SI \ - ADCQ 64+stack, AX \ - ADCQ 72+stack, BX \ - ADCQ 80+stack, CX \ - ADCQ 88+stack, DX \ - ADCQ $0, R15 \ - \ - fp384Carry(R14,SI,AX,BX,CX,DX,R15, R8,R9,R10,R11,R12,R13,DI) - -#define mulBMI2(a0,a1,a2,a3,a4,a5, rb, stack) \ - MOVQ a0, DX \ - MULXQ 0+rb, R8, R9; MOVQ R8, 0+stack; MOVQ $0, R8 \ - MULXQ 8+rb, AX, R10 \ - ADDQ AX, R9 \ - MULXQ 16+rb, AX, R11 \ - ADCQ AX, R10 \ - MULXQ 24+rb, AX, R12 \ - ADCQ AX, R11 \ - MULXQ 32+rb, AX, R13 \ - ADCQ AX, R12 \ - MULXQ 40+rb, AX, R14 \ - ADCQ AX, R13 \ - ADCQ $0, R14 \ - \ - MOVQ a1, DX \ - MULXQ 0+rb, AX, BX \ - ADDQ AX, R9; MOVQ R9, 8+stack; MOVL $0, R9 \ - ADCQ BX, R10 \ - MULXQ 16+rb, AX, BX \ - ADCQ AX, R11 \ - ADCQ BX, R12 \ - MULXQ 32+rb, AX, BX \ - ADCQ AX, R13 \ - ADCQ BX, R14 \ - ADCQ $0, R8 \ - MULXQ 8+rb, AX, BX \ - ADDQ AX, R10 \ - ADCQ BX, R11 \ - MULXQ 24+rb, AX, BX \ - ADCQ AX, R12 \ - ADCQ BX, R13 \ - MULXQ 40+rb, AX, BX \ - ADCQ AX, R14 \ - ADCQ BX, R8 \ - ADCQ $0, R9 \ - \ - MOVQ a2, DX \ - MULXQ 0+rb, AX, BX \ - ADDQ AX, R10; MOVQ R10, 16+stack; MOVL $0, R10 \ - ADCQ BX, R11 \ - MULXQ 16+rb, AX, BX \ - ADCQ AX, R12 \ - ADCQ BX, R13 \ - MULXQ 32+rb, AX, BX \ - ADCQ AX, R14 \ - ADCQ BX, R8 \ - ADCQ $0, R9 \ - MULXQ 8+rb, AX, BX \ - ADDQ AX, R11 \ - ADCQ BX, R12 \ - MULXQ 24+rb, AX, BX \ - ADCQ AX, R13 \ - ADCQ BX, R14 \ - MULXQ 40+rb, AX, BX \ - ADCQ AX, R8 \ - ADCQ BX, R9 \ - ADCQ $0, R10 \ - \ - MOVQ a3, DX \ - MULXQ 0+rb, AX, BX \ - ADDQ AX, R11; MOVQ R11, 24+stack; MOVL $0, R11 \ - ADCQ BX, R12 \ - MULXQ 16+rb, AX, BX \ - ADCQ AX, R13 \ - ADCQ BX, R14 \ - MULXQ 32+rb, AX, BX \ - ADCQ AX, R8 \ - ADCQ BX, R9 \ - ADCQ $0, R10 \ - MULXQ 8+rb, AX, BX \ - ADDQ AX, R12 \ - ADCQ BX, R13 \ - MULXQ 24+rb, AX, BX \ - ADCQ AX, R14 \ - ADCQ BX, R8 \ - MULXQ 40+rb, AX, BX \ - ADCQ AX, R9 \ - ADCQ BX, R10 \ - ADCQ $0, R11 \ - \ - MOVQ a4, DX \ - MULXQ 0+rb, AX, BX \ - ADDQ AX, R12; MOVQ R12, 32+stack; MOVL $0, R12 \ - ADCQ BX, R13 \ - MULXQ 16+rb, AX, BX \ - ADCQ AX, R14 \ - ADCQ BX, R8 \ - MULXQ 32+rb, AX, BX \ - ADCQ AX, R9 \ - ADCQ BX, R10 \ - ADCQ $0, R11 \ - MULXQ 8+rb, AX, BX \ - ADDQ AX, R13 \ - ADCQ BX, R14 \ - MULXQ 24+rb, AX, BX \ - ADCQ AX, R8 \ - ADCQ BX, R9 \ - MULXQ 40+rb, AX, BX \ - ADCQ AX, R10 \ - ADCQ BX, R11 \ - ADCQ $0, R12 \ - \ - MOVQ a5, DX \ - MULXQ 0+rb, AX, BX \ - ADDQ AX, R13; MOVQ R13, 40+stack \ - ADCQ BX, R14 \ - MULXQ 16+rb, AX, BX \ - ADCQ AX, R8 \ - ADCQ BX, R9 \ - MULXQ 32+rb, AX, BX \ - ADCQ AX, R10 \ - ADCQ BX, R11 \ - ADCQ $0, R12 \ - MULXQ 8+rb, AX, BX \ - ADDQ AX, R14 \ - ADCQ BX, R8 \ - MULXQ 24+rb, AX, BX \ - ADCQ AX, R9 \ - ADCQ BX, R10 \ - MULXQ 40+rb, AX, BX \ - ADCQ AX, R11 \ - ADCQ BX, R12 - -#define fp384ReduceBMI2(stack) \ - \ // m = (T * P') mod R, store m in R8:R9:R10:R11:R12:R13 - MOVQ ·pp+0(SB), DX \ - MULXQ 0+stack, R8, R9 \ - MULXQ 8+stack, AX, R10 \ - ADDQ AX, R9 \ - MULXQ 16+stack, AX, R11 \ - ADCQ AX, R10 \ - MULXQ 24+stack, AX, R12 \ - ADCQ AX, R11 \ - MULXQ 32+stack, AX, R13 \ - ADCQ AX, R12 \ - MULXQ 40+stack, AX, BX \ - ADCQ AX, R13 \ - \ - ADDQ 0+stack, R9 \ - ADCQ 8+stack, R10 \ - ADCQ 16+stack, R11 \ - ADCQ 24+stack, R12 \ - ADCQ 32+stack, R13 \ - \ - MOVQ ·pp+16(SB), DX \ - MULXQ 0+stack, AX, BX \ - ADDQ AX, R10 \ - ADCQ BX, R11 \ - MULXQ 16+stack, AX, BX \ - ADCQ AX, R12 \ - ADCQ BX, R13 \ - MULXQ 8+stack, AX, BX \ - ADDQ AX, R11 \ - ADCQ BX, R12 \ - MULXQ 24+stack, AX, BX \ - ADCQ AX, R13 \ - \ - MOVQ ·pp+24(SB), DX \ - MULXQ 0+stack, AX, BX \ - ADDQ AX, R11 \ - ADCQ BX, R12 \ - MULXQ 16+stack, AX, BX \ - ADCQ AX, R13 \ - MULXQ 8+stack, AX, BX \ - ADDQ AX, R12 \ - ADCQ BX, R13 \ - \ - MOVQ ·pp+32(SB), DX \ - MULXQ 0+stack, AX, BX \ - ADDQ AX, R12 \ - ADCQ BX, R13 \ - MULXQ 8+stack, AX, BX \ - ADDQ AX, R13 \ - \ - MOVQ ·pp+40(SB), DX \ - MULXQ 0+stack, AX, BX \ - ADDQ AX, R13 \ - \ - storeBlock(R8,R9,R10,R11,R12,R13, 96+stack) \ - \ - \ // m * P - mulBMI2(·p+0(SB),·p+8(SB),·p+16(SB),·p+24(SB),·p+32(SB),·p+40(SB), 96+stack, 144+stack) \ - \ - \ // Add the 768-bit intermediate to m*N - loadBlock(144+stack, AX,R13,BX,CX,DX,DI) \ - \ - ADDQ 0+stack, AX \ - ADCQ 8+stack, R13 \ - ADCQ 16+stack, BX \ - ADCQ 24+stack, CX \ - ADCQ 32+stack, DX \ - ADCQ 40+stack, DI \ - ADCQ 48+stack, R14 \ - ADCQ 56+stack, R8 \ - ADCQ 64+stack, R9 \ - ADCQ 72+stack, R10 \ - ADCQ 80+stack, R11 \ - ADCQ 88+stack, R12 \ - MOVQ $0, 0+stack \ - ADCQ $0, 0+stack \ - \ - fp384Carry(R14,R8,R9,R10,R11,R12, 0+stack, AX,R13,BX,CX,DX,DI,SI) - -TEXT ·fp384Neg(SB), NOSPLIT, $0-16 - MOVQ ·p+0(SB), R8 - MOVQ ·p+8(SB), R9 - MOVQ ·p+16(SB), R10 - MOVQ ·p+24(SB), R11 - MOVQ ·p+32(SB), R12 - MOVQ ·p+40(SB), R13 - - MOVQ a+8(FP), DI - SUBQ 0(DI), R8 - SBBQ 8(DI), R9 - SBBQ 16(DI), R10 - SBBQ 24(DI), R11 - SBBQ 32(DI), R12 - SBBQ 40(DI), R13 - - MOVQ $0, R15 - fp384Carry(R8,R9,R10,R11,R12,R13,R15, R14,AX,BX,CX,DX,DI,SI) - - MOVQ c+0(FP), DI - storeBlock(R8,R9,R10,R11,R12,R13, 0(DI)) - RET - -TEXT ·fp384Add(SB), NOSPLIT, $0-24 - MOVQ a+8(FP), DI - MOVQ b+16(FP), SI - - loadBlock(0(DI), R8,R9,R10,R11,R12,R13) - MOVQ $0, R15 - - ADDQ 0(SI), R8 - ADCQ 8(SI), R9 - ADCQ 16(SI), R10 - ADCQ 24(SI), R11 - ADCQ 32(SI), R12 - ADCQ 40(SI), R13 - ADCQ $0, R15 - - fp384Carry(R8,R9,R10,R11,R12,R13,R15, R14,AX,BX,CX,DX,DI,SI) - - MOVQ c+0(FP), DI - storeBlock(R8,R9,R10,R11,R12,R13, 0(DI)) - RET - -TEXT ·fp384Sub(SB), NOSPLIT, $0-24 - MOVQ ·p+0(SB), R8 - MOVQ ·p+8(SB), R9 - MOVQ ·p+16(SB), R10 - MOVQ ·p+24(SB), R11 - MOVQ ·p+32(SB), R12 - MOVQ ·p+40(SB), R13 - - MOVQ b+16(FP), DI - SUBQ 0(DI), R8 - SBBQ 8(DI), R9 - SBBQ 16(DI), R10 - SBBQ 24(DI), R11 - SBBQ 32(DI), R12 - SBBQ 40(DI), R13 - - MOVQ $0, R15 - MOVQ a+8(FP), DI - ADDQ 0(DI), R8 - ADCQ 8(DI), R9 - ADCQ 16(DI), R10 - ADCQ 24(DI), R11 - ADCQ 32(DI), R12 - ADCQ 40(DI), R13 - ADCQ $0, R15 - - fp384Carry(R8,R9,R10,R11,R12,R13,R15, R14,AX,BX,CX,DX,DI,SI) - - MOVQ c+0(FP), DI - storeBlock(R8,R9,R10,R11,R12,R13, 0(DI)) - RET - -TEXT ·fp384Mul(SB), NOSPLIT, $240-24 - MOVQ a+8(FP), DI - MOVQ b+16(FP), SI - - // Jump to a slightly different implementation if MULX isn't supported. - CMPB ·hasBMI2(SB), $0 - JE nobmi2Mul - - // T = a * b - mulBMI2(0(DI),8(DI),16(DI),24(DI),32(DI),40(DI), 0(SI), 0(SP)) - storeBlock(R14,R8,R9,R10,R11,R12, 48(SP)) - - // Reduce T. - fp384ReduceBMI2(0(SP)) - - MOVQ c+0(FP), DI - storeBlock(R14,R8,R9,R10,R11,R12, 0(DI)) - JMP end - -nobmi2Mul: - // T = a * b - mul(0(DI),8(DI),16(DI),24(DI),32(DI),40(DI), 0(SI), 0(SP)) - - // Reduce T. - fp384Reduce(0(SP)) - - MOVQ c+0(FP), DI - storeBlock(R14,SI,AX,BX,CX,DX, 0(DI)) - -end: - RET - -TEXT ·fp384Cmov(SB), NOSPLIT, $0 - MOVQ x+0(FP), DI - MOVQ y+8(FP), SI - MOVQ b+16(FP), BX - TESTQ BX, BX - MOVQ 0(DI), AX; MOVQ 0(SI), DX; CMOVQNE DX, AX; MOVQ AX, 0(DI); - MOVQ 8(DI), AX; MOVQ 8(SI), DX; CMOVQNE DX, AX; MOVQ AX, 8(DI); - MOVQ 16(DI), AX; MOVQ 16(SI), DX; CMOVQNE DX, AX; MOVQ AX, 16(DI); - MOVQ 24(DI), AX; MOVQ 24(SI), DX; CMOVQNE DX, AX; MOVQ AX, 24(DI); - MOVQ 32(DI), AX; MOVQ 32(SI), DX; CMOVQNE DX, AX; MOVQ AX, 32(DI); - MOVQ 40(DI), AX; MOVQ 40(SI), DX; CMOVQNE DX, AX; MOVQ AX, 40(DI); - RET diff --git a/ecc/p384/arith_arm64.s b/ecc/p384/arith_arm64.s deleted file mode 100644 index a02e76d5..00000000 --- a/ecc/p384/arith_arm64.s +++ /dev/null @@ -1,511 +0,0 @@ -// +build arm64,!purego - -#include "textflag.h" - -TEXT ·fp384Cmov(SB), NOSPLIT, $0 - MOVD x+0(FP), R0 - MOVD y+8(FP), R1 - MOVW b+16(FP), R2 - CMP $0, R2 - LDP 0(R0), (R3, R5) - LDP 0(R1), (R4, R6) - CSEL NE,R4,R3,R7 - CSEL NE,R6,R5,R8 - STP (R7, R8), 0(R0) - LDP 16(R0), (R3, R5) - LDP 16(R1), (R4, R6) - CSEL NE,R4,R3,R7 - CSEL NE,R6,R5,R8 - STP (R7, R8), 16(R0) - LDP 32(R0), (R3, R5) - LDP 32(R1), (R4, R6) - CSEL NE,R4,R3,R7 - CSEL NE,R6,R5,R8 - STP (R7, R8), 32(R0) - RET - -// Compute c = -a mod p -TEXT ·fp384Neg(SB), NOSPLIT, $0-16 - MOVD c+0(FP), R0 - MOVD a+8(FP), R1 - - // Load p in R2-R7, a in R8-R13 - // Compute p-a in R8-R13 - LDP ·p+0(SB), (R2, R3) - LDP 0(R1), (R8, R9) - SUBS R8, R2, R8 - SBCS R9, R3, R9 - LDP ·p+16(SB), (R4, R5) - LDP 16(R1), (R10, R11) - SBCS R10, R4, R10 - SBCS R11, R5, R11 - LDP ·p+32(SB), (R6, R7) - LDP 32(R1), (R12, R13) - SBCS R12, R6, R12 - SBC R13, R7, R13 - - // Compute (p-a)-p in R2-R7 - SUBS R2, R8, R2 - SBCS R3, R9, R3 - SBCS R4, R10, R4 - SBCS R5, R11, R5 - SBCS R6, R12, R6 - SBCS R7, R13, R7 - - // If (p-a)-p < 0 (nearly always), return p-a - // Only return (p-a)-p for a = 0 - // Store result in c - CSEL CC, R8, R2, R2 - CSEL CC, R9, R3, R3 - STP (R2, R3), 0(R0) - CSEL CC, R10, R4, R4 - CSEL CC, R11, R5, R5 - STP (R4, R5), 16(R0) - CSEL CC, R12, R6, R6 - CSEL CC, R13, R7, R7 - STP (R6, R7), 32(R0) - - RET - -// Compute c = a+b mod p -TEXT ·fp384Add(SB), NOSPLIT, $0-24 - MOVD c+0(FP), R0 - MOVD a+8(FP), R1 - MOVD b+16(FP), R2 - - // Load a in R3-R8, b in R9-R14 - // Compute a+b in R3-R9 - LDP 0(R1), (R3, R4) - LDP 0(R2), (R9, R10) - ADDS R9, R3 - ADCS R10, R4 - LDP 16(R1), (R5, R6) - LDP 16(R2), (R11, R12) - ADCS R11, R5 - ADCS R12, R6 - LDP 32(R1), (R7, R8) - LDP 32(R2), (R13, R14) - ADCS R13, R7 - ADCS R14, R8 - ADC ZR, ZR, R9 - - // Load p in R10-R15 - LDP ·p+ 0(SB), (R10, R11) - LDP ·p+16(SB), (R12, R13) - LDP ·p+32(SB), (R14, R15) - - // Compute a+b-p in R10-R16 - SUBS R10, R3, R10 - SBCS R11, R4, R11 - SBCS R12, R5, R12 - SBCS R13, R6, R13 - SBCS R14, R7, R14 - SBCS R15, R8, R15 - SBCS ZR, R9, R16 - - // If a+b-p is negative, return a+b - // Store result in c - CSEL CC, R3, R10, R3 - CSEL CC, R4, R11, R4 - STP (R3, R4), 0(R0) - CSEL CC, R5, R12, R5 - CSEL CC, R6, R13, R6 - STP (R5, R6), 16(R0) - CSEL CC, R7, R14, R7 - CSEL CC, R8, R15, R8 - STP (R7, R8), 32(R0) - - RET - -// Compute c = a-b mod p -TEXT ·fp384Sub(SB), NOSPLIT, $0-24 - MOVD c+0(FP), R0 - MOVD a+8(FP), R1 - MOVD b+16(FP), R2 - - // Load a in R3-R8, b in R9-R14 - // Compute a-b in R3-R9 - LDP 0(R1), (R3, R4) - LDP 0(R2), (R9, R10) - SUBS R9, R3 - SBCS R10, R4 - LDP 16(R1), (R5, R6) - LDP 16(R2), (R11, R12) - SBCS R11, R5 - SBCS R12, R6 - LDP 32(R1), (R7, R8) - LDP 32(R2), (R13, R14) - SBCS R13, R7 - SBCS R14, R8 - SBC ZR, ZR, R9 - - // Load p in R10-R15 - // If a-b < 0, (a-b)+p to R3-R8 - // Store result in c - LDP ·p+ 0(SB), (R10, R11) - AND R9, R10 - LDP ·p+16(SB), (R12, R13) - AND R9, R11 - AND R9, R12 - LDP ·p+32(SB), (R14, R15) - AND R9, R13 - AND R9, R14 - AND R9, R15 - - ADDS R10, R3 - ADCS R11, R4 - STP (R3, R4), 0(R0) - ADCS R12, R5 - ADCS R13, R6 - STP (R5, R6), 16(R0) - ADCS R14, R7 - ADC R15, R8 - STP (R7, R8), 32(R0) - - RET - -// Expects that A0*B0 is already in C0(low),C3(high) and A0*B1 in C1(low),C2(high) -// C0 is not actually touched -// Result of (A0-A2) * (B0-B2) will be in C0-C5 -// Inputs remain intact -#define mul192x192comba(A0,A1,A2, B0,B1,B2, C0,C1,C2,C3,C4,C5, S0,S1,S2,S3) \ - MUL A1, B0, S2 \ - UMULH A1, B0, S3 \ - \ - ADDS C3, C1 \ - ADCS ZR, C2 \ - ADC ZR, ZR, C3 \ - \ - MUL A0, B2, S0 \ - UMULH A0, B2, S1 \ - \ - ADDS S2, C1 \ - ADCS S3, C2 \ - ADC ZR, C3 \ - \ - MUL A1, B1, S2 \ - UMULH A1, B1, S3 \ - \ - ADDS S0, C2 \ - ADCS S1, C3 \ - ADC ZR, ZR, C4 \ - \ - MUL A2, B0, S0 \ - UMULH A2, B0, S1 \ - \ - ADDS S2, C2 \ - ADCS S3, C3 \ - ADC ZR, C4 \ - \ - MUL A1, B2, S2 \ - UMULH A1, B2, S3 \ - \ - ADDS S0, C2 \ - ADCS S1, C3 \ - ADC ZR, C4 \ - \ - MUL A2, B1, S0 \ - UMULH A2, B1, S1 \ - \ - ADDS S2, C3 \ - ADCS S3, C4 \ - ADC ZR, ZR, C5 \ - \ - MUL A2, B2, S2 \ - UMULH A2, B2, S3 \ - \ - ADDS S0, C3 \ - ADCS S1, C4 \ - ADC ZR, C5 \ - \ - ADDS S2, C4 \ - ADC S3, C5 - - -// Assumes that there are at least 96 bytes left on the stack -// Expects that X and Y point to input -// X and Y get overwritten, Z0 will be in Y -#define mul384x384karatsuba(X,Y, Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8,Z9,Z10,Z11, T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12) \ - /* Load a in Z1-Z6, b in T12,Z7-Z11 */ \ - LDP 0(X), ( Z1, Z2) \ - LDP 0(Y), (T12, Z7) \ - MUL Z1, Z7, T1 \ - UMULH Z1, T12, T3 \ - LDP 16(X), ( Z3, Z4) \ - LDP 16(Y), ( Z8, Z9) \ - MUL Z1, T12, T0 \ - UMULH Z1, Z7, T2 \ - LDP 32(X), ( Z5, Z6) \ - LDP 32(Y), (Z10, Z11) \ - \ - /* Compute aL*bL in T0-T5 */ \ - mul192x192comba(Z1,Z2,Z3, T12,Z7,Z8, T0,T1,T2,T3,T4,T5, T6,T7,T8,T9) \ - \ - /* Compute aH*bH in T6-T11, destroys aL and bL */ \ - MUL Z4, Z10, T7 \ - MUL Z4, Z9, T6 \ - UMULH Z4, Z9, T9 \ - UMULH Z4, Z10, T8 \ - mul192x192comba(Z4,Z5,Z6, Z9,Z10,Z11, T6,T7,T8,T9,T10,T11, Z1,Z2,T12,Z7) \ - \ - /* Compute aL*bL + aH*bH in Z1-Z6,T12, destroys aH */ \ - ADDS T0, T6, Z1 \ - ADCS T1, T7, Z2 \ - ADCS T2, T8, Z3 \ - ADCS T3, T9, Z4 \ - ADCS T4, T10, Z5 \ - ADCS T5, T11, Z6 \ - ADC ZR, ZR, T12 \ - \ - /* Add to T0-T11 and store on stack */ \ - STP ( T0, T1), -16(RSP) \ - ADDS Z1, T3 \ - STP ( T2, T3), -32(RSP) \ - ADCS Z2, T4 \ - ADCS Z3, T5 \ - STP ( T4, T5), -48(RSP) \ - ADCS Z4, T6 \ - ADCS Z5, T7 \ - STP ( T6, T7), -64(RSP) \ - ADCS Z6, T8 \ - ADC ZR, T12 \ - STP ( T8, T9), -80(RSP) \ - STP (T10, T11), -96(RSP) \ - \ - /* Load a to Z1-Z6 */ \ - LDP 0(X), (Z1, Z2) \ - LDP 16(X), (Z3, Z4) \ - LDP 32(X), (Z5, Z6) \ - \ - /* Compute |aL-aH| to Z1-Z3, keep borrow in X */ \ - SUBS Z4, Z1 \ - SBCS Z5, Z2 \ - SBCS Z6, Z3 \ - SBC ZR, ZR, X \ - NEGS Z1, Z4 \ - NGCS Z2, Z5 \ - NGC Z3, Z6 \ - ADDS $1, X \ - \ - /* Load b to Z7-Z11,T0 */ \ - LDP 0(Y), ( Z7, Z8) \ - LDP 16(Y), ( Z9, Z10) \ - LDP 32(Y), (Z11, T0) \ - \ - CSEL EQ, Z4, Z1, Z1 \ - CSEL EQ, Z5, Z2 ,Z2 \ - CSEL EQ, Z6, Z3, Z3 \ - \ - /* Compute |bH-bL| to Z7-Z9, keep borrow in Y */ \ - SUBS Z7, Z10 \ - SBCS Z8, Z11 \ - SBCS Z9, T0 \ - SBC ZR, ZR, Y \ - NEGS Z10, Z7 \ - NGCS Z11, Z8 \ - NGC T0, Z9 \ - ADDS $1, Y \ - CSEL EQ, Z7, Z10, Z7 \ - CSEL EQ, Z8, Z11, Z8 \ - CSEL EQ, Z9, T0, Z9 \ - \ - /* Combine borrows */ \ - EOR Y, X \ - \ - /* Compute |aL-aH|*|bH-bL| to Z10,Z11,T0-T3 */ \ - MUL Z1, Z8, Z11 \ - MUL Z1, Z7, Z10 \ - UMULH Z1, Z8, T0 \ - UMULH Z1, Z7, T1 \ - mul192x192comba(Z1,Z2,Z3, Z7,Z8,Z9, Z10,Z11,T0,T1,T2,T3, T4,T5,T6,T7) \ - \ - /* The result has to be negated if exactly one of the operands was negative */ \ - NEGS Z10, Y \ - NGCS Z11, Z1 \ - NGCS T0, Z2 \ - NGCS T1, Z3 \ - NGCS T2, Z4 \ - NGCS T3, Z5 \ - NGC ZR, T4 \ - \ - AND T4, X \ - CMP $1, X \ - CSEL EQ, Y, Z10, Z10 \ - CSEL EQ, Z1, Z11, Z11 \ - CSEL EQ, Z2, T0, T0 \ - CSEL EQ, Z3, T1, T1 \ - CSEL EQ, Z4, T2, T2 \ - CSEL EQ, Z5, T3, T3 \ - \ - /* Add that to the middle part */ \ - LDP -16(RSP), ( Y, Z1) \ - LDP -32(RSP), ( Z2, Z3) \ - LDP -48(RSP), ( Z4, Z5) \ - ADDS Z10, Z3 \ - ADCS Z11, Z4 \ - LDP -64(RSP), ( Z6, Z7) \ - ADCS T0, Z5 \ - ADCS T1, Z6 \ - LDP -80(RSP), ( Z8, Z9) \ - ADCS T2, Z7 \ - ADCS T3, Z8 \ - LDP -96(RSP), (Z10, Z11) \ - ADCS T12, Z9 \ - ADCS ZR, Z10 \ - ADC ZR, Z11 \ - SUBS X, Z9 \ - SBCS ZR, Z10 \ - SBC ZR, Z11 - -// Compute c = a*b*R^-1 mod p -TEXT ·fp384Mul(SB), NOSPLIT, $200-24 - MOVD c+0(FP), R0 - MOVD a+8(FP), R1 - MOVD b+16(FP), R2 - - // Compute a*b in R2-R13 - mul384x384karatsuba(R1, R2, R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13, R14,R15,R16,R17,R19,R20,R21,R22,R23,R24,R25,R26,R27) - - // Store a*b on the stack - STP ( R2, R3), -112(RSP) - STP ( R4, R5), -128(RSP) - STP ( R6, R7), -144(RSP) - STP ( R8, R9), -160(RSP) - STP (R10, R11), -176(RSP) - STP (R12, R13), -192(RSP) - - // Compute m = a*b*pp mod 2^384 in R19-R24 - // Store it temporarily in c - MOVD ·pp+0(SB), R14 - MUL R14, R2, R19 - UMULH R14, R2, R20 - - MUL R14, R3, R16 - UMULH R14, R3, R21 - ADDS R16, R20 - ADC ZR, R21 - - MUL R14, R4, R16 - UMULH R14, R4, R22 - ADDS R16, R21 - ADC ZR, R22 - - MUL R14, R5, R16 - UMULH R14, R5, R23 - ADDS R16, R22 - ADC ZR, R23 - - MUL R14, R6, R16 - UMULH R14, R6, R24 - ADDS R16, R23 - ADC ZR, R24 - - MADD R14, R24, R7, R24 - - // ·pp+8(SB) = 1, so we can just add - ADDS R2, R20 - STP (R19, R20), 0(R0) - ADCS R3, R21 - ADCS R4, R22 - ADCS R5, R23 - ADC R6, R24 - - LDP ·pp+16(SB), (R14, R15) - MUL R14, R2, R8 - UMULH R14, R2, R9 - - MUL R14, R3, R16 - UMULH R14, R3, R10 - ADDS R16, R9 - ADC ZR, R10 - - MUL R14, R4, R16 - UMULH R14, R4, R11 - ADDS R16, R10 - ADC ZR, R11 - - MUL R14, R5, R16 - ADD R16, R11 - - ADDS R8, R21 - ADCS R9, R22 - ADCS R10, R23 - ADC R11, R24 - - MUL R15, R2, R8 - UMULH R15, R2, R9 - - MUL R15, R3, R16 - UMULH R15, R3, R10 - ADDS R16, R9 - ADC ZR, R10 - - MADD R15, R10, R4, R10 - - ADDS R8, R22 - STP (R21, R22), 16(R0) - ADCS R9, R23 - ADC R10, R24 - - LDP ·pp+32(SB), (R14, R15) - MUL R14, R2, R8 - UMULH R14, R2, R9 - - MADD R14, R9, R3, R9 - - ADDS R8, R23 - ADC R9, R24 - - MADD R15, R24, R2, R24 - STP (R23, R24), 32(R0) - - // Compute m*p in R1-R12 - MOVD $·p(SB), R1 - mul384x384karatsuba(R0, R1, R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12, R13,R14,R15,R16,R17,R19,R20,R21,R22,R23,R24,R25,R26) - - // Add a*b to m*p in R1-R12,R26 - LDP -112(RSP), (R13, R14) - ADDS R13, R1 - LDP -128(RSP), (R15, R16) - ADCS R14, R2 - ADCS R15, R3 - LDP -144(RSP), (R17, R19) - ADCS R16, R4 - ADCS R17, R5 - LDP -160(RSP), (R20, R21) - ADCS R19, R6 - ADCS R20, R7 - LDP -176(RSP), (R22, R23) - ADCS R21, R8 - ADCS R22, R9 - LDP -192(RSP), (R24, R25) - ADCS R23, R10 - ADCS R24, R11 - ADCS R25, R12 - ADC ZR, ZR, R26 - - // Reduce the top half mod p - LDP ·p+ 0(SB), (R13, R14) - SUBS R13, R7, R13 - LDP ·p+16(SB), (R15, R16) - SBCS R14, R8, R14 - SBCS R15, R9, R15 - LDP ·p+32(SB), (R17, R19) - SBCS R16, R10, R16 - SBCS R17, R11, R17 - SBCS R19, R12, R19 - SBCS ZR, R26 - - // Store result in c - MOVD c+0(FP), R0 - CSEL CC, R7, R13, R7 - CSEL CC, R8, R14, R8 - STP ( R7, R8), 0(R0) - CSEL CC, R9, R15, R9 - CSEL CC, R10, R16, R10 - STP ( R9, R10), 16(R0) - CSEL CC, R11, R17, R11 - CSEL CC, R12, R19, R12 - STP (R11, R12), 32(R0) - - RET diff --git a/ecc/p384/arith_test.go b/ecc/p384/arith_test.go deleted file mode 100644 index 5f0e8bdb..00000000 --- a/ecc/p384/arith_test.go +++ /dev/null @@ -1,239 +0,0 @@ -//go:build (!purego && arm64) || (!purego && amd64) -// +build !purego,arm64 !purego,amd64 - -package p384 - -import ( - "crypto/elliptic" - "crypto/rand" - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func TestFpCmov(t *testing.T) { - var x, y, z fp384 - for _, b := range []int{-2, -1, 1, 2} { - _, _ = rand.Read(x[:]) - _, _ = rand.Read(y[:]) - z = x - fp384Cmov(&z, &y, b) - got := z - want := y - if got != want { - test.ReportError(t, got, want, b, x, y) - } - } - _, _ = rand.Read(x[:]) - _, _ = rand.Read(y[:]) - z = x - fp384Cmov(&z, &y, 0) - got := z - want := x - if got != want { - test.ReportError(t, got, want, 0, x, y) - } -} - -func TestFpNegZero(t *testing.T) { - zero, x := &fp384{}, &fp384{} - fp384Neg(x, zero) - got := x.BigInt() - want := zero.BigInt() - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } -} - -func TestFpSetBigInt(t *testing.T) { - P := elliptic.P384().Params().P - - neg := big.NewInt(-0xFF) // negative - zero := big.NewInt(0) // zero - one := big.NewInt(1) // one - two96 := new(big.Int).Lsh(one, 96) // 2^96 - two384 := new(big.Int).Lsh(one, 384) // 2^384 - two384two96 := new(big.Int).Sub(two384, two96) // 2^384-2^96 - two768 := new(big.Int).Lsh(one, 768) // 2^768 - - for id, b := range []*big.Int{ - neg, zero, one, two96, two384, two384two96, two768, - } { - var x fp384 - x.SetBigInt(b) - got := x.BigInt() - if b.BitLen() > 384 || b.Sign() < 0 { - b.Mod(b, P) - } - want := b - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, id) - } - } -} - -func TestMulZero(t *testing.T) { - x, zero := &fp384{}, &fp384{} - _, _ = rand.Read(x[:]) - - fp384Mul(x, x, zero) - got := x.BigInt() - want := zero.BigInt() - - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } -} - -func TestFp(t *testing.T) { - P := elliptic.P384().Params().P - x, y, z := &fp384{}, &fp384{}, &fp384{} - testTimes := 1 << 12 - var bigR, bigR2, bigRinv big.Int - one := big.NewInt(1) - bigR.Lsh(one, 384).Mod(&bigR, P) - bigR2.Lsh(one, 2*384).Mod(&bigR2, P) - bigRinv.ModInverse(&bigR, P) - - t.Run("Encode", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(x[:]) - bigX := x.BigInt() - // fp384 - montEncode(z, x) - got := z.BigInt() - // big.Int - want := bigX.Mul(bigX, &bigR).Mod(bigX, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } - } - }) - t.Run("Decode", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(x[:]) - bigX := x.BigInt() - // fp384 - montDecode(z, x) - got := z.BigInt() - // big.Int - want := bigX.Mul(bigX, new(big.Int).ModInverse(&bigR, P)).Mod(bigX, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } - } - }) - t.Run("Neg", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(x[:]) - bigX := x.BigInt() - // fp384 - fp384Neg(z, x) - got := z.BigInt() - // big.Int - want := bigX.Neg(bigX).Mod(bigX, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } - } - }) - t.Run("Add", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(x[:]) - _, _ = rand.Read(y[:]) - bigX := x.BigInt() - bigY := y.BigInt() - // fp384 - fp384Add(z, x, y) - got := z.BigInt() - // big.Int - want := bigX.Add(bigX, bigY) - want = want.Mod(want, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("Sub", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(x[:]) - _, _ = rand.Read(y[:]) - bigX := x.BigInt() - bigY := y.BigInt() - // fp384 - fp384Sub(z, x, y) - got := z.BigInt() - // big.Int - want := bigX.Sub(bigX, bigY) - want = want.Mod(want, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("Mul", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(x[:]) - _, _ = rand.Read(y[:]) - bigX := x.BigInt() - bigY := y.BigInt() - // fp384 - fp384Mul(z, x, y) - got := z.BigInt() - // big.Int - want := bigX.Mul(bigX, bigY).Mul(bigX, &bigRinv).Mod(bigX, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x, y) - } - } - }) - t.Run("Inv", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(x[:]) - bigX := x.BigInt() - // fp384 - fp384Inv(z, x) - got := z.BigInt() - // big.Int - want := bigX.ModInverse(bigX, P).Mul(bigX, &bigR2).Mod(bigX, P) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, x) - } - } - }) -} - -func BenchmarkFp(b *testing.B) { - x, y, z := &fp384{}, &fp384{}, &fp384{} - - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fp384Add(z, x, y) - } - }) - - b.Run("Sub", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fp384Sub(z, x, y) - } - }) - - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fp384Mul(z, x, y) - } - }) - - b.Run("Sqr", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fp384Sqr(z, x) - } - }) - - b.Run("Inv", func(b *testing.B) { - for i := 0; i < b.N; i++ { - fp384Inv(z, x) - } - }) -} diff --git a/ecc/p384/doc.go b/ecc/p384/doc.go deleted file mode 100644 index 807676fb..00000000 --- a/ecc/p384/doc.go +++ /dev/null @@ -1,10 +0,0 @@ -// Package p384 provides optimized elliptic curve operations on the P-384 curve. -// -// These are some improvements over crypto/elliptic package: -// - Around 10x faster in amd64 architecture. -// - Reduced number of memory allocations. -// - Native support for arm64 architecture. -// - ScalarMult is performed using a constant-time algorithm. -// - ScalarBaseMult fallbacks into ScalarMult. -// - A new method included for double-point multiplication. -package p384 diff --git a/ecc/p384/opt_test.go b/ecc/p384/opt_test.go deleted file mode 100644 index 7cb74c7a..00000000 --- a/ecc/p384/opt_test.go +++ /dev/null @@ -1,108 +0,0 @@ -//go:build (!purego && arm64) || (!purego && amd64) -// +build !purego,arm64 !purego,amd64 - -package p384 - -import ( - "bytes" - "crypto/elliptic" - "crypto/rand" - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func TestInternals(t *testing.T) { - t.Run("reduceScalar", func(t *testing.T) { - var c curve - order := c.Params().N - var buffer [3 * sizeFp]byte - - for i := 0; i < sizeFp; i++ { - buffer[i] = 0xFF - } - _, err := rand.Read(buffer[sizeFp:]) - if err != nil { - t.Fatal(err) - } - - for i := 0; i < 3*sizeFp; i++ { - k := buffer[:i] - got := c.reduceScalar(k) - - bigK := new(big.Int).SetBytes(k) - bigK.Mod(bigK, order) - want := bigK.FillBytes(make([]byte, sizeFp)) - - if !bytes.Equal(got, want) { - test.ReportError(t, got, want, k) - } - } - }) - - t.Run("absolute", func(t *testing.T) { - cases := []int32{-2, -1, 0, 1, 2} - expected := []int32{2, 1, 0, 1, 2} - for i := range cases { - got := absolute(cases[i]) - want := expected[i] - if got != want { - test.ReportError(t, got, want, cases[i]) - } - } - }) - - t.Run("toOdd", func(t *testing.T) { - var c curve - k := []byte{0xF0} - oddK, _ := c.toOdd(k) - got := len(oddK) - want := 48 - if got != want { - test.ReportError(t, got, want) - } - - oddK[sizeFp-1] = 0x0 - smallOddK, _ := c.toOdd(oddK) - got = len(smallOddK) - want = 48 - if got != want { - test.ReportError(t, got, want) - } - }) - - t.Run("special k", func(t *testing.T) { - cases := []struct { // known cases that require complete addition - w uint - k int - }{ - {w: 2, k: 2}, - {w: 5, k: 6}, - {w: 6, k: 38}, - {w: 7, k: 102}, - {w: 9, k: 230}, - {w: 12, k: 742}, - {w: 14, k: 4838}, - {w: 17, k: 21222}, - {w: 19, k: 152294}, - } - - var c curve - - StdCurve := elliptic.P384() - params := StdCurve.Params() - for _, caseI := range cases { - k := big.NewInt(int64(caseI.k)).Bytes() - gotX, gotY := c.scalarMultOmega(params.Gx, params.Gy, k, caseI.w) - wantX, wantY := StdCurve.ScalarMult(params.Gx, params.Gy, k) - - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, caseI) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY, caseI) - } - } - }) -} diff --git a/ecc/p384/p384.go b/ecc/p384/p384.go deleted file mode 100644 index 75005d08..00000000 --- a/ecc/p384/p384.go +++ /dev/null @@ -1,28 +0,0 @@ -package p384 - -import ( - "crypto/elliptic" - "math/big" -) - -// Curve is used to provide the extended functionality and performance of -// elliptic.Curve interface. -type Curve interface { - elliptic.Curve - // IsAtInfinity returns True is the point is the identity point. - IsAtInfinity(X, Y *big.Int) bool - // CombinedMult calculates P=mG+nQ, where G is the generator and - // Q=(Qx,Qy). The scalars m and n are positive integers in big-endian form. - // Runs in non-constant time to be used in signature verification. - CombinedMult(Qx, Qy *big.Int, m, n []byte) (Px, Py *big.Int) -} - -// Params returns the parameters for the curve. Note: The value returned by -// this function fallbacks to the stdlib implementation of elliptic curve -// operations. Use this method to only recover elliptic curve parameters. -func (c curve) Params() *elliptic.CurveParams { return elliptic.P384().Params() } - -// IsAtInfinity returns True is the point is the identity point. -func (c curve) IsAtInfinity(x, y *big.Int) bool { - return x.Sign() == 0 && y.Sign() == 0 -} diff --git a/ecc/p384/p384_generic.go b/ecc/p384/p384_generic.go deleted file mode 100644 index 9b14feae..00000000 --- a/ecc/p384/p384_generic.go +++ /dev/null @@ -1,21 +0,0 @@ -//go:build purego || (!amd64 && !arm64) -// +build purego !amd64,!arm64 - -package p384 - -import ( - "crypto/elliptic" - "math/big" -) - -type curve struct{ elliptic.Curve } - -func P384() Curve { return curve{elliptic.P384()} } - -// CombinedMult calculates P=mG+nQ, where G is the generator and Q=(x,y,z). -// The scalars m and n are integers in big-endian form. Non-constant time. -func (c curve) CombinedMult(xQ, yQ *big.Int, m, n []byte) (xP, yP *big.Int) { - x1, y1 := c.ScalarBaseMult(m) - x2, y2 := c.ScalarMult(xQ, yQ, n) - return c.Add(x1, y1, x2, y2) -} diff --git a/ecc/p384/p384_test.go b/ecc/p384/p384_test.go deleted file mode 100644 index c1331f80..00000000 --- a/ecc/p384/p384_test.go +++ /dev/null @@ -1,257 +0,0 @@ -package p384_test - -import ( - "crypto/elliptic" - "crypto/rand" - "fmt" - "testing" - - "github.com/quantumcoinproject/circl/ecc/p384" - "github.com/quantumcoinproject/circl/internal/test" -) - -func TestIsOnCurveTrue(t *testing.T) { - CirclCurve := p384.P384() - k := make([]byte, 384/8) - for i := 0; i < 128; i++ { - _, _ = rand.Read(k) - x, y := elliptic.P384().ScalarBaseMult(k) - - got := CirclCurve.IsOnCurve(x, y) - want := true - if got != want { - test.ReportError(t, got, want, k) - } - - x = x.Neg(x) - got = CirclCurve.IsOnCurve(x, y) - want = false - if got != want { - test.ReportError(t, got, want, k) - } - } -} - -func TestAffine(t *testing.T) { - const testTimes = 1 << 7 - CirclCurve := p384.P384() - StdCurve := elliptic.P384() - params := StdCurve.Params() - - t.Run("Addition", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - K1, _ := rand.Int(rand.Reader, params.N) - K2, _ := rand.Int(rand.Reader, params.N) - X1, Y1 := StdCurve.ScalarBaseMult(K1.Bytes()) - X2, Y2 := StdCurve.ScalarBaseMult(K2.Bytes()) - wantX, wantY := StdCurve.Add(X1, Y1, X2, Y2) - gotX, gotY := CirclCurve.Add(X1, Y1, X2, Y2) - - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, K1, K2) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - } - }) - - t.Run("Double", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - k, _ := rand.Int(rand.Reader, params.N) - x, y := StdCurve.ScalarBaseMult(k.Bytes()) - wantX, wantY := StdCurve.Double(x, y) - - gotX, gotY := CirclCurve.Double(x, y) - - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, k) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - } - }) -} - -func TestScalarBaseMult(t *testing.T) { - const testTimes = 1 << 6 - CirclCurve := p384.P384() - StdCurve := elliptic.P384() - - t.Run("0P", func(t *testing.T) { - k := make([]byte, 500) - for i := 0; i < len(k); i += 20 { - gotX, gotY := CirclCurve.ScalarBaseMult(k[:i]) - wantX, wantY := StdCurve.ScalarBaseMult(k[:i]) - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, k[:i]) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - } - }) - - t.Run("kP", func(t *testing.T) { - k := make([]byte, 48) - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(k) - gotX, gotY := CirclCurve.ScalarBaseMult(k) - wantX, wantY := StdCurve.ScalarBaseMult(k) - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, k) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - } - }) - - t.Run("kSmall", func(t *testing.T) { - k := make([]byte, 16) - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(k) - gotX, gotY := CirclCurve.ScalarBaseMult(k) - wantX, wantY := StdCurve.ScalarBaseMult(k) - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, k) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - } - }) - - t.Run("kLarge", func(t *testing.T) { - k := make([]byte, 384) - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(k) - gotX, gotY := CirclCurve.ScalarBaseMult(k) - wantX, wantY := StdCurve.ScalarBaseMult(k) - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, k) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - } - }) -} - -func TestScalarMult(t *testing.T) { - const testTimes = 1 << 6 - CirclCurve := p384.P384() - StdCurve := elliptic.P384() - params := StdCurve.Params() - - t.Run("k=0", func(t *testing.T) { - k := []byte{0x0} - gotX, gotY := CirclCurve.ScalarMult(params.Gx, params.Gy, k) - got := CirclCurve.IsAtInfinity(gotX, gotY) - want := true - if got != want { - test.ReportError(t, got, want) - } - }) - - t.Run("random k", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - k, _ := rand.Int(rand.Reader, params.N) - gotX, gotY := CirclCurve.ScalarMult(params.Gx, params.Gy, k.Bytes()) - wantX, wantY := StdCurve.ScalarMult(params.Gx, params.Gy, k.Bytes()) - - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, k) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - } - }) - - t.Run("wrong P", func(t *testing.T) { - for i := 0; i < testTimes; i++ { - k, _ := rand.Int(rand.Reader, params.N) - x, _ := rand.Int(rand.Reader, params.P) - y, _ := rand.Int(rand.Reader, params.P) - - got := CirclCurve.IsOnCurve(x, y) && CirclCurve.IsOnCurve(CirclCurve.ScalarMult(x, y, k.Bytes())) - want := StdCurve.IsOnCurve(x, y) && StdCurve.IsOnCurve(StdCurve.ScalarMult(x, y, k.Bytes())) - - if got != want { - test.ReportError(t, got, want, k, x, y) - } - } - }) -} - -func TestCombinedMult(t *testing.T) { - const testTimes = 1 << 7 - CirclCurve := p384.P384() - StdCurve := elliptic.P384() - params := StdCurve.Params() - - for i := 0; i < testTimes; i++ { - K, _ := rand.Int(rand.Reader, params.N) - X, Y := StdCurve.ScalarBaseMult(K.Bytes()) - - K1, _ := rand.Int(rand.Reader, params.N) - K2, _ := rand.Int(rand.Reader, params.N) - x1, y1 := StdCurve.ScalarBaseMult(K1.Bytes()) - x2, y2 := StdCurve.ScalarMult(X, Y, K2.Bytes()) - wantX, wantY := StdCurve.Add(x1, y1, x2, y2) - - gotX, gotY := CirclCurve.CombinedMult(X, Y, K1.Bytes(), K2.Bytes()) - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, K, K1, K2) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - } -} - -func BenchmarkScalarMult(b *testing.B) { - curve := p384.P384() - params := curve.Params() - - K, _ := rand.Int(rand.Reader, params.N) - M, _ := rand.Int(rand.Reader, params.N) - N, _ := rand.Int(rand.Reader, params.N) - k := K.Bytes() - m := M.Bytes() - n := N.Bytes() - - b.Run("kG", func(b *testing.B) { - for i := 0; i < b.N; i++ { - curve.ScalarBaseMult(k) - } - }) - b.Run("kP", func(b *testing.B) { - for i := 0; i < b.N; i++ { - curve.ScalarMult(params.Gx, params.Gy, k) - } - }) - b.Run("kG+lP", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _ = curve.CombinedMult(params.Gx, params.Gy, m, n) - } - }) -} - -func Example_p384() { - // import "github.com/quantumcoinproject/circl/ecc/p384" - // import "crypto/elliptic" - circl := p384.P384() - stdlib := elliptic.P384() - - params := circl.Params() - K, _ := rand.Int(rand.Reader, params.N) - k := K.Bytes() - - x1, y1 := circl.ScalarBaseMult(k) - x2, y2 := stdlib.ScalarBaseMult(k) - fmt.Printf("%v, %v", x1.Cmp(x2) == 0, y1.Cmp(y2) == 0) - // Output: true, true -} diff --git a/ecc/p384/p384opt.go b/ecc/p384/p384opt.go deleted file mode 100644 index 72019d7a..00000000 --- a/ecc/p384/p384opt.go +++ /dev/null @@ -1,181 +0,0 @@ -//go:build (!purego && arm64) || (!purego && amd64) -// +build !purego,arm64 !purego,amd64 - -package p384 - -import ( - "crypto/subtle" - "math/big" - - "github.com/quantumcoinproject/circl/math" -) - -type curve struct{} - -// P384 returns a Curve which implements P-384 (see FIPS 186-3, section D.2.4). -func P384() Curve { return curve{} } - -// IsOnCurve reports whether the given (x,y) lies on the curve. -func (c curve) IsOnCurve(x, y *big.Int) bool { - x1, y1 := &fp384{}, &fp384{} - x1.SetBigInt(x) - y1.SetBigInt(y) - montEncode(x1, x1) - montEncode(y1, y1) - - y2, x3 := &fp384{}, &fp384{} - fp384Sqr(y2, y1) - fp384Sqr(x3, x1) - fp384Mul(x3, x3, x1) - - threeX := &fp384{} - fp384Add(threeX, x1, x1) - fp384Add(threeX, threeX, x1) - - fp384Sub(x3, x3, threeX) - fp384Add(x3, x3, &bb) - - return *y2 == *x3 -} - -// Add returns the sum of (x1,y1) and (x2,y2). -func (c curve) Add(x1, y1, x2, y2 *big.Int) (x, y *big.Int) { - P := newAffinePoint(x1, y1).toJacobian() - P.mixadd(P, newAffinePoint(x2, y2)) - return P.toAffine().toInt() -} - -// Double returns 2*(x,y). -func (c curve) Double(x1, y1 *big.Int) (x, y *big.Int) { - P := newAffinePoint(x1, y1).toJacobian() - P.double() - return P.toAffine().toInt() -} - -// reduceScalar shorten a scalar modulo the order of the curve. -func (c curve) reduceScalar(k []byte) []byte { - bigK := new(big.Int).SetBytes(k) - bigK.Mod(bigK, c.Params().N) - return bigK.FillBytes(make([]byte, sizeFp)) -} - -// toOdd performs k = (-k mod N) if k is even. -func (c curve) toOdd(k []byte) ([]byte, int) { - var X, Y big.Int - X.SetBytes(k) - Y.Neg(&X).Mod(&Y, c.Params().N) - isEven := 1 - int(X.Bit(0)) - x := X.Bytes() - y := Y.Bytes() - - if len(x) < len(y) { - x = append(make([]byte, len(y)-len(x)), x...) - } else if len(x) > len(y) { - y = append(make([]byte, len(x)-len(y)), y...) - } - subtle.ConstantTimeCopy(isEven, x, y) - return x, isEven -} - -// ScalarMult returns (Qx,Qy)=k*(Px,Py) where k is a number in big-endian form. -func (c curve) ScalarMult(x1, y1 *big.Int, k []byte) (x, y *big.Int) { - return c.scalarMultOmega(x1, y1, k, 5) -} - -func (c curve) scalarMultOmega(x1, y1 *big.Int, k []byte, omega uint) (x, y *big.Int) { - k = c.reduceScalar(k) - oddK, isEvenK := c.toOdd(k) - - var scalar big.Int - scalar.SetBytes(oddK) - if scalar.Sign() == 0 { - return new(big.Int), new(big.Int) - } - const bitsN = uint(384) - L := math.SignedDigit(&scalar, omega, bitsN) - - var R jacobianPoint - Q := zeroPoint().toJacobian() - TabP := newAffinePoint(x1, y1).oddMultiples(omega) - for i := len(L) - 1; i > 0; i-- { - for j := uint(0); j < omega-1; j++ { - Q.double() - } - idx := absolute(L[i]) >> 1 - for j := range TabP { - R.cmov(&TabP[j], subtle.ConstantTimeEq(int32(j), idx)) - } - R.cneg(int(L[i]>>31) & 1) - Q.add(Q, &R) - } - // Calculate the last iteration using complete addition formula. - for j := uint(0); j < omega-1; j++ { - Q.double() - } - idx := absolute(L[0]) >> 1 - for j := range TabP { - R.cmov(&TabP[j], subtle.ConstantTimeEq(int32(j), idx)) - } - R.cneg(int(L[0]>>31) & 1) - QQ := Q.toProjective() - QQ.completeAdd(QQ, R.toProjective()) - QQ.cneg(isEvenK) - return QQ.toAffine().toInt() -} - -// ScalarBaseMult returns k*G, where G is the base point of the group -// and k is an integer in big-endian form. -func (c curve) ScalarBaseMult(k []byte) (x, y *big.Int) { - params := c.Params() - return c.ScalarMult(params.Gx, params.Gy, k) -} - -// CombinedMult calculates P=mG+nQ, where G is the generator and Q=(x,y,z). -// The scalars m and n are integers in big-endian form. Non-constant time. -func (c curve) CombinedMult(xQ, yQ *big.Int, m, n []byte) (xP, yP *big.Int) { - const nOmega = uint(5) - var k big.Int - k.SetBytes(m) - nafM := math.OmegaNAF(&k, baseOmega) - k.SetBytes(n) - nafN := math.OmegaNAF(&k, nOmega) - - if len(nafM) > len(nafN) { - nafN = append(nafN, make([]int32, len(nafM)-len(nafN))...) - } else if len(nafM) < len(nafN) { - nafM = append(nafM, make([]int32, len(nafN)-len(nafM))...) - } - - TabQ := newAffinePoint(xQ, yQ).oddMultiples(nOmega) - var jR jacobianPoint - var aR affinePoint - P := zeroPoint().toJacobian() - for i := len(nafN) - 1; i >= 0; i-- { - P.double() - // Generator point - if nafM[i] != 0 { - idxM := absolute(nafM[i]) >> 1 - aR = baseOddMultiples[idxM] - if nafM[i] < 0 { - aR.neg() - } - P.mixadd(P, &aR) - } - // Input point - if nafN[i] != 0 { - idxN := absolute(nafN[i]) >> 1 - jR = TabQ[idxN] - if nafN[i] < 0 { - jR.neg() - } - P.add(P, &jR) - } - } - return P.toAffine().toInt() -} - -// absolute returns always a positive value. -func absolute(x int32) int32 { - mask := x >> 31 - return (x + mask) ^ mask -} diff --git a/ecc/p384/point.go b/ecc/p384/point.go deleted file mode 100644 index e20b57b0..00000000 --- a/ecc/p384/point.go +++ /dev/null @@ -1,358 +0,0 @@ -//go:build (!purego && arm64) || (!purego && amd64) -// +build !purego,arm64 !purego,amd64 - -package p384 - -import ( - "fmt" - "math/big" -) - -// affinePoint represents an affine point of the curve. The point at -// infinity is (0,0) leveraging that it is not an affine point. -type affinePoint struct{ x, y fp384 } - -func newAffinePoint(x, y *big.Int) *affinePoint { - var P affinePoint - P.x.SetBigInt(x) - P.y.SetBigInt(y) - montEncode(&P.x, &P.x) - montEncode(&P.y, &P.y) - return &P -} - -func zeroPoint() *affinePoint { return &affinePoint{} } - -func (ap affinePoint) String() string { - if ap.isZero() { - return "inf" - } - return fmt.Sprintf("x: %v\ny: %v", ap.x, ap.y) -} - -func (ap *affinePoint) isZero() bool { - zero := fp384{} - return ap.x == zero && ap.y == zero -} - -func (ap *affinePoint) neg() { fp384Neg(&ap.y, &ap.y) } - -func (ap *affinePoint) toInt() (x, y *big.Int) { - var x1, y1 fp384 - montDecode(&x1, &ap.x) - montDecode(&y1, &ap.y) - return x1.BigInt(), y1.BigInt() -} - -func (ap *affinePoint) toJacobian() *jacobianPoint { - var P jacobianPoint - if ap.isZero() { - montEncode(&P.x, &fp384{1}) - montEncode(&P.y, &fp384{1}) - } else { - P.x = ap.x - P.y = ap.y - montEncode(&P.z, &fp384{1}) - } - return &P -} - -func (ap *affinePoint) toProjective() *projectivePoint { - var P projectivePoint - if ap.isZero() { - montEncode(&P.y, &fp384{1}) - } else { - P.x = ap.x - P.y = ap.y - montEncode(&P.z, &fp384{1}) - } - return &P -} - -// OddMultiples calculates the points iP for i={1,3,5,7,..., 2^(n-1)-1} -// Ensure that 1 < n < 31, otherwise it returns an empty slice. -func (ap affinePoint) oddMultiples(n uint) []jacobianPoint { - var t []jacobianPoint - if n > 1 && n < 31 { - P := ap.toJacobian() - s := int32(1) << (n - 1) - t = make([]jacobianPoint, s) - t[0] = *P - _2P := *P - _2P.double() - for i := int32(1); i < s; i++ { - t[i].add(&t[i-1], &_2P) - } - } - return t -} - -// p2Point is a point in P^2 -type p2Point struct{ x, y, z fp384 } - -func (P *p2Point) String() string { - return fmt.Sprintf("x: %v\ny: %v\nz: %v", P.x, P.y, P.z) -} - -func (P *p2Point) neg() { fp384Neg(&P.y, &P.y) } - -// condNeg if P is negated if b=1. -func (P *p2Point) cneg(b int) { - var mY fp384 - fp384Neg(&mY, &P.y) - fp384Cmov(&P.y, &mY, b) -} - -// cmov sets P to Q if b=1. -func (P *p2Point) cmov(Q *p2Point, b int) { - fp384Cmov(&P.x, &Q.x, b) - fp384Cmov(&P.y, &Q.y, b) - fp384Cmov(&P.z, &Q.z, b) -} - -func (P *p2Point) toInt() (x, y, z *big.Int) { - var x1, y1, z1 fp384 - montDecode(&x1, &P.x) - montDecode(&y1, &P.y) - montDecode(&z1, &P.z) - return x1.BigInt(), y1.BigInt(), z1.BigInt() -} - -// jacobianPoint represents a point in Jacobian coordinates. The point at -// infinity is any point (x,y,0) such that x and y are different from 0. -type jacobianPoint struct{ p2Point } - -func (P *jacobianPoint) isZero() bool { - zero := fp384{} - return P.x != zero && P.y != zero && P.z == zero -} - -func (P *jacobianPoint) toAffine() *affinePoint { - var aP affinePoint - z, z2 := &fp384{}, &fp384{} - fp384Inv(z, &P.z) - fp384Sqr(z2, z) - fp384Mul(&aP.x, &P.x, z2) - fp384Mul(&aP.y, &P.y, z) - fp384Mul(&aP.y, &aP.y, z2) - return &aP -} - -func (P *jacobianPoint) cmov(Q *jacobianPoint, b int) { P.p2Point.cmov(&Q.p2Point, b) } - -// add calculates P=Q+R such that Q and R are different than the identity point, -// and Q!==R. This function cannot be used for doublings. -func (P *jacobianPoint) add(Q, R *jacobianPoint) { - if Q.isZero() { - *P = *R - return - } else if R.isZero() { - *P = *Q - return - } - - // Cohen-Miyagi-Ono (1998) - // https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-add-1998-cmo-2 - X1, Y1, Z1 := &Q.x, &Q.y, &Q.z - X2, Y2, Z2 := &R.x, &R.y, &R.z - Z1Z1, Z2Z2, U1, U2 := &fp384{}, &fp384{}, &fp384{}, &fp384{} - H, HH, HHH, RR := &fp384{}, &fp384{}, &fp384{}, &fp384{} - V, t4, t5, t6, t7, t8 := &fp384{}, &fp384{}, &fp384{}, &fp384{}, &fp384{}, &fp384{} - t0, t1, t2, t3, S1, S2 := &fp384{}, &fp384{}, &fp384{}, &fp384{}, &fp384{}, &fp384{} - fp384Sqr(Z1Z1, Z1) // Z1Z1 = Z1 ^ 2 - fp384Sqr(Z2Z2, Z2) // Z2Z2 = Z2 ^ 2 - fp384Mul(U1, X1, Z2Z2) // U1 = X1 * Z2Z2 - fp384Mul(U2, X2, Z1Z1) // U2 = X2 * Z1Z1 - fp384Mul(t0, Z2, Z2Z2) // t0 = Z2 * Z2Z2 - fp384Mul(S1, Y1, t0) // S1 = Y1 * t0 - fp384Mul(t1, Z1, Z1Z1) // t1 = Z1 * Z1Z1 - fp384Mul(S2, Y2, t1) // S2 = Y2 * t1 - fp384Sub(H, U2, U1) // H = U2 - U1 - fp384Sqr(HH, H) // HH = H ^ 2 - fp384Mul(HHH, H, HH) // HHH = H * HH - fp384Sub(RR, S2, S1) // r = S2 - S1 - fp384Mul(V, U1, HH) // V = U1 * HH - fp384Sqr(t2, RR) // t2 = r ^ 2 - fp384Add(t3, V, V) // t3 = V + V - fp384Sub(t4, t2, HHH) // t4 = t2 - HHH - fp384Sub(&P.x, t4, t3) // X3 = t4 - t3 - fp384Sub(t5, V, &P.x) // t5 = V - X3 - fp384Mul(t6, S1, HHH) // t6 = S1 * HHH - fp384Mul(t7, RR, t5) // t7 = r * t5 - fp384Sub(&P.y, t7, t6) // Y3 = t7 - t6 - fp384Mul(t8, Z2, H) // t8 = Z2 * H - fp384Mul(&P.z, Z1, t8) // Z3 = Z1 * t8 -} - -// mixadd calculates P=Q+R such that P and Q different than the identity point, -// and Q not in {P,-P, O}. -func (P *jacobianPoint) mixadd(Q *jacobianPoint, R *affinePoint) { - if Q.isZero() { - *P = *R.toJacobian() - return - } else if R.isZero() { - *P = *Q - return - } - - z1z1, u2 := &fp384{}, &fp384{} - fp384Sqr(z1z1, &Q.z) - fp384Mul(u2, &R.x, z1z1) - - s2 := &fp384{} - fp384Mul(s2, &R.y, &Q.z) - fp384Mul(s2, s2, z1z1) - if Q.x == *u2 { - if Q.y != *s2 { - *P = *(zeroPoint().toJacobian()) - return - } - *P = *Q - P.double() - return - } - - h, r := &fp384{}, &fp384{} - fp384Sub(h, u2, &Q.x) - fp384Mul(&P.z, h, &Q.z) - fp384Sub(r, s2, &Q.y) - - h2, h3 := &fp384{}, &fp384{} - fp384Sqr(h2, h) - fp384Mul(h3, h2, h) - h3y1 := &fp384{} - fp384Mul(h3y1, h3, &Q.y) - - h2x1 := &fp384{} - fp384Mul(h2x1, h2, &Q.x) - - fp384Sqr(&P.x, r) - fp384Sub(&P.x, &P.x, h3) - fp384Sub(&P.x, &P.x, h2x1) - fp384Sub(&P.x, &P.x, h2x1) - - fp384Sub(&P.y, h2x1, &P.x) - fp384Mul(&P.y, &P.y, r) - fp384Sub(&P.y, &P.y, h3y1) -} - -func (P *jacobianPoint) double() { - delta, gamma, alpha, alpha2 := &fp384{}, &fp384{}, &fp384{}, &fp384{} - fp384Sqr(delta, &P.z) - fp384Sqr(gamma, &P.y) - fp384Sub(alpha, &P.x, delta) - fp384Add(alpha2, &P.x, delta) - fp384Mul(alpha, alpha, alpha2) - *alpha2 = *alpha - fp384Add(alpha, alpha, alpha) - fp384Add(alpha, alpha, alpha2) - - beta := &fp384{} - fp384Mul(beta, &P.x, gamma) - - beta8 := &fp384{} - fp384Sqr(&P.x, alpha) - fp384Add(beta8, beta, beta) - fp384Add(beta8, beta8, beta8) - fp384Add(beta8, beta8, beta8) - fp384Sub(&P.x, &P.x, beta8) - - fp384Add(&P.z, &P.y, &P.z) - fp384Sqr(&P.z, &P.z) - fp384Sub(&P.z, &P.z, gamma) - fp384Sub(&P.z, &P.z, delta) - - fp384Add(beta, beta, beta) - fp384Add(beta, beta, beta) - fp384Sub(beta, beta, &P.x) - - fp384Mul(&P.y, alpha, beta) - - fp384Sqr(gamma, gamma) - fp384Add(gamma, gamma, gamma) - fp384Add(gamma, gamma, gamma) - fp384Add(gamma, gamma, gamma) - fp384Sub(&P.y, &P.y, gamma) -} - -func (P *jacobianPoint) toProjective() *projectivePoint { - var hP projectivePoint - hP.y = P.y - fp384Mul(&hP.x, &P.x, &P.z) - fp384Sqr(&hP.z, &P.z) - fp384Mul(&hP.z, &hP.z, &P.z) - return &hP -} - -// projectivePoint represents a point in projective homogeneous coordinates. -// The point at infinity is (0,y,0) such that y is different from 0. -type projectivePoint struct{ p2Point } - -func (P *projectivePoint) isZero() bool { - zero := fp384{} - return P.x == zero && P.y != zero && P.z == zero -} - -func (P *projectivePoint) toAffine() *affinePoint { - var aP affinePoint - z := &fp384{} - fp384Inv(z, &P.z) - fp384Mul(&aP.x, &P.x, z) - fp384Mul(&aP.y, &P.y, z) - return &aP -} - -// add calculates P=Q+R using complete addition formula for prime groups. -func (P *projectivePoint) completeAdd(Q, R *projectivePoint) { - // Reference: - // "Complete addition formulas for prime order elliptic curves" by - // Costello-Renes-Batina. [Alg.4] (eprint.iacr.org/2015/1060). - X1, Y1, Z1 := &Q.x, &Q.y, &Q.z - X2, Y2, Z2 := &R.x, &R.y, &R.z - X3, Y3, Z3 := &fp384{}, &fp384{}, &fp384{} - t0, t1, t2, t3, t4 := &fp384{}, &fp384{}, &fp384{}, &fp384{}, &fp384{} - fp384Mul(t0, X1, X2) // 1. t0 ← X1 · X2 - fp384Mul(t1, Y1, Y2) // 2. t1 ← Y1 · Y2 - fp384Mul(t2, Z1, Z2) // 3. t2 ← Z1 · Z2 - fp384Add(t3, X1, Y1) // 4. t3 ← X1 + Y1 - fp384Add(t4, X2, Y2) // 5. t4 ← X2 + Y2 - fp384Mul(t3, t3, t4) // 6. t3 ← t3 · t4 - fp384Add(t4, t0, t1) // 7. t4 ← t0 + t1 - fp384Sub(t3, t3, t4) // 8. t3 ← t3 − t4 - fp384Add(t4, Y1, Z1) // 9. t4 ← Y1 + Z1 - fp384Add(X3, Y2, Z2) // 10. X3 ← Y2 + Z2 - fp384Mul(t4, t4, X3) // 11. t4 ← t4 · X3 - fp384Add(X3, t1, t2) // 12. X3 ← t1 + t2 - fp384Sub(t4, t4, X3) // 13. t4 ← t4 − X3 - fp384Add(X3, X1, Z1) // 14. X3 ← X1 + Z1 - fp384Add(Y3, X2, Z2) // 15. Y3 ← X2 + Z2 - fp384Mul(X3, X3, Y3) // 16. X3 ← X3 · Y3 - fp384Add(Y3, t0, t2) // 17. Y3 ← t0 + t2 - fp384Sub(Y3, X3, Y3) // 18. Y3 ← X3 − Y3 - fp384Mul(Z3, &bb, t2) // 19. Z3 ← b · t2 - fp384Sub(X3, Y3, Z3) // 20. X3 ← Y3 − Z3 - fp384Add(Z3, X3, X3) // 21. Z3 ← X3 + X3 - fp384Add(X3, X3, Z3) // 22. X3 ← X3 + Z3 - fp384Sub(Z3, t1, X3) // 23. Z3 ← t1 − X3 - fp384Add(X3, t1, X3) // 24. X3 ← t1 + X3 - fp384Mul(Y3, &bb, Y3) // 25. Y3 ← b · Y3 - fp384Add(t1, t2, t2) // 26. t1 ← t2 + t2 - fp384Add(t2, t1, t2) // 27. t2 ← t1 + t2 - fp384Sub(Y3, Y3, t2) // 28. Y3 ← Y3 − t2 - fp384Sub(Y3, Y3, t0) // 29. Y3 ← Y3 − t0 - fp384Add(t1, Y3, Y3) // 30. t1 ← Y3 + Y3 - fp384Add(Y3, t1, Y3) // 31. Y3 ← t1 + Y3 - fp384Add(t1, t0, t0) // 32. t1 ← t0 + t0 - fp384Add(t0, t1, t0) // 33. t0 ← t1 + t0 - fp384Sub(t0, t0, t2) // 34. t0 ← t0 − t2 - fp384Mul(t1, t4, Y3) // 35. t1 ← t4 · Y3 - fp384Mul(t2, t0, Y3) // 36. t2 ← t0 · Y3 - fp384Mul(Y3, X3, Z3) // 37. Y3 ← X3 · Z3 - fp384Add(Y3, Y3, t2) // 38. Y3 ← Y3 + t2 - fp384Mul(X3, t3, X3) // 39. X3 ← t3 · X3 - fp384Sub(X3, X3, t1) // 40. X3 ← X3 − t1 - fp384Mul(Z3, t4, Z3) // 41. Z3 ← t4 · Z3 - fp384Mul(t1, t3, t0) // 42. t1 ← t3 · t0 - fp384Add(Z3, Z3, t1) // 43. Z3 ← Z3 + t1 - P.x, P.y, P.z = *X3, *Y3, *Z3 -} diff --git a/ecc/p384/point_test.go b/ecc/p384/point_test.go deleted file mode 100644 index d300dae0..00000000 --- a/ecc/p384/point_test.go +++ /dev/null @@ -1,428 +0,0 @@ -//go:build (!purego && arm64) || (!purego && amd64) -// +build !purego,arm64 !purego,amd64 - -package p384 - -import ( - "crypto/ecdh" - "crypto/elliptic" - "crypto/rand" - "encoding/binary" - "slices" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -func randomAffine() *affinePoint { - sk, err := ecdh.P384().GenerateKey(rand.Reader) - if err != nil { - panic(err) - } - - b := sk.PublicKey().Bytes() - x, y := b[1:1+sizeFp], b[1+sizeFp:1+2*sizeFp] - slices.Reverse(x) - slices.Reverse(y) - p := new(affinePoint) - montEncode(&p.x, (*fp384)(x)) - montEncode(&p.y, (*fp384)(y)) - return p -} - -func randomJacobian() *jacobianPoint { - params := elliptic.P384().Params() - P := randomAffine().toJacobian() - z, _ := rand.Int(rand.Reader, params.P) - var l fp384 - l.SetBigInt(z) - fp384Mul(&P.z, &P.z, &l) // z = z * l^1 - fp384Mul(&P.y, &P.y, &l) - fp384Sqr(&l, &l) - fp384Mul(&P.x, &P.x, &l) // x = x * l^2 - fp384Mul(&P.y, &P.y, &l) // y = y * l^3 - return P -} - -func randomProjective() *projectivePoint { - return randomJacobian().toProjective() -} - -func TestPointDouble(t *testing.T) { - t.Run("2∞=∞", func(t *testing.T) { - Z := zeroPoint().toJacobian() - Z.double() - got := Z.isZero() - want := true - if got != want { - test.ReportError(t, got, want) - } - }) - - t.Run("2P=P+P", func(t *testing.T) { - StdCurve := elliptic.P384() - for i := 0; i < 128; i++ { - P := randomJacobian() - - x1, y1 := P.toAffine().toInt() - wantX, wantY := StdCurve.Double(x1, y1) - - P.double() - gotX, gotY := P.toAffine().toInt() - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, P) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - } - }) -} - -func TestPointAdd(t *testing.T) { - StdCurve := elliptic.P384() - Q, R := &jacobianPoint{}, &jacobianPoint{} - Z := zeroPoint().toJacobian() - P := randomJacobian() - - t.Run("∞+∞=∞", func(t *testing.T) { - R.add(Z, Z) - got := R.isZero() - want := true - if got != want { - test.ReportError(t, got, want) - } - }) - - t.Run("∞+P=P", func(t *testing.T) { - R.add(Z, P) - gotX, gotY := R.toAffine().toInt() - wantX, wantY := P.toAffine().toInt() - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, P) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY, P) - } - }) - - t.Run("P+∞=P", func(t *testing.T) { - R.add(P, Z) - gotX, gotY := R.toAffine().toInt() - wantX, wantY := P.toAffine().toInt() - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, P) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY, P) - } - }) - - t.Run("P+(-P)=∞", func(t *testing.T) { - *Q = *P - Q.neg() - R.add(P, Q) - got := R.isZero() - want := true - if got != want { - test.ReportError(t, got, want, P) - } - }) - - t.Run("P+P=2P", func(t *testing.T) { - // This verifies that add function cannot be used for doublings. - for i := 0; i < 128; i++ { - P = randomJacobian() - - R.add(P, P) - gotX, gotY := R.toAffine().toInt() - wantX, wantY := zeroPoint().toInt() - - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, P) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY, P) - } - } - }) - - t.Run("P+Q=R", func(t *testing.T) { - for i := 0; i < 128; i++ { - P = randomJacobian() - Q = randomJacobian() - - x1, y1 := P.toAffine().toInt() - x2, y2 := Q.toAffine().toInt() - wantX, wantY := StdCurve.Add(x1, y1, x2, y2) - - R.add(P, Q) - gotX, gotY := R.toAffine().toInt() - - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, P, Q) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY, P, Q) - } - } - }) -} - -func TestPointCompleteAdd(t *testing.T) { - StdCurve := elliptic.P384() - Q, R := &projectivePoint{}, &projectivePoint{} - Z := zeroPoint().toProjective() - P := randomProjective() - - t.Run("∞+∞=∞", func(t *testing.T) { - R.completeAdd(Z, Z) - got := R.isZero() - want := true - if got != want { - test.ReportError(t, got, want) - } - }) - - t.Run("∞+P=P", func(t *testing.T) { - R.completeAdd(Z, P) - gotX, gotY := R.toAffine().toInt() - wantX, wantY := P.toAffine().toInt() - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, P) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY, P) - } - }) - - t.Run("P+∞=P", func(t *testing.T) { - R.completeAdd(P, Z) - gotX, gotY := R.toAffine().toInt() - wantX, wantY := P.toAffine().toInt() - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, P) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY, P) - } - }) - - t.Run("P+(-P)=∞", func(t *testing.T) { - *Q = *P - Q.cneg(1) - R.completeAdd(P, Q) - got := R.isZero() - want := true - if got != want { - test.ReportError(t, got, want, P) - } - }) - - t.Run("P+P=2P", func(t *testing.T) { - // This verifies that completeAdd can be used for doublings. - for i := 0; i < 128; i++ { - P := randomJacobian() - PP := P.toProjective() - - R.completeAdd(PP, PP) - P.double() - - gotX, gotY := R.toAffine().toInt() - wantX, wantY := P.toAffine().toInt() - - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, P) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY, P) - } - } - }) - - t.Run("P+Q=R", func(t *testing.T) { - for i := 0; i < 128; i++ { - P := randomProjective() - Q := randomProjective() - - x1, y1 := P.toAffine().toInt() - x2, y2 := Q.toAffine().toInt() - wantX, wantY := StdCurve.Add(x1, y1, x2, y2) - - R.completeAdd(P, Q) - gotX, gotY := R.toAffine().toInt() - - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, P, Q) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY, P, Q) - } - } - }) -} - -func TestPointMixAdd(t *testing.T) { - StdCurve := elliptic.P384() - aZ := zeroPoint() - jZ := zeroPoint().toJacobian() - R := &jacobianPoint{} - aQ := &affinePoint{} - aP := randomAffine() - jP := randomJacobian() - - t.Run("∞+∞=∞", func(t *testing.T) { - R.mixadd(jZ, aZ) - got := R.isZero() - want := true - if got != want { - test.ReportError(t, got, want) - } - }) - - t.Run("∞+P=P", func(t *testing.T) { - R.mixadd(jZ, aP) - gotX, gotY := R.toAffine().toInt() - wantX, wantY := aP.toInt() - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, aP) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - }) - - t.Run("P+∞=P", func(t *testing.T) { - R.mixadd(jP, aZ) - gotX, gotY, gotZ := R.toInt() - wantX, wantY, wantZ := jP.toInt() - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, jP) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - if gotZ.Cmp(wantZ) != 0 { - test.ReportError(t, gotZ, wantZ) - } - }) - - t.Run("P+(-P)=∞", func(t *testing.T) { - aQ = jP.toAffine() - aQ.neg() - R.mixadd(jP, aQ) - got := R.isZero() - want := true - if got != want { - test.ReportError(t, got, want, jP) - } - }) - - t.Run("P+P=2P", func(t *testing.T) { - for i := 0; i < 128; i++ { - aQ := randomAffine() - jQ := aQ.toJacobian() - - x, y := aQ.toInt() - wantX, wantY := StdCurve.Double(x, y) - - R.mixadd(jQ, aQ) - gotX, gotY := R.toAffine().toInt() - - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, aQ) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - } - }) - - t.Run("P+Q=R", func(t *testing.T) { - for i := 0; i < 128; i++ { - aP = randomAffine() - jP = randomJacobian() - - x1, y1 := jP.toAffine().toInt() - x2, y2 := aP.toInt() - wantX, wantY := StdCurve.Add(x1, y1, x2, y2) - - R.mixadd(jP, aP) - gotX, gotY := R.toAffine().toInt() - - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, jP, aP) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - } - }) -} - -func TestOddMultiples(t *testing.T) { - t.Run("invalidOmega", func(t *testing.T) { - for w := uint(0); w < 2; w++ { - P := randomAffine() - PP := P.oddMultiples(w) - got := len(PP) - want := 0 - if got != want { - test.ReportError(t, got, want, w) - } - } - }) - - t.Run("validOmega", func(t *testing.T) { - StdCurve := elliptic.P384() - var jOdd [4]byte - for i := 0; i < 32; i++ { - P := randomAffine() - X, Y := P.toInt() - for w := uint(2); w < 10; w++ { - PP := P.oddMultiples(w) - for j, jP := range PP { - binary.BigEndian.PutUint32(jOdd[:], uint32(2*j+1)) - wantX, wantY := StdCurve.ScalarMult(X, Y, jOdd[:]) - gotX, gotY := jP.toAffine().toInt() - if gotX.Cmp(wantX) != 0 { - test.ReportError(t, gotX, wantX, w, j) - } - if gotY.Cmp(wantY) != 0 { - test.ReportError(t, gotY, wantY) - } - } - } - } - }) -} - -func BenchmarkPoint(b *testing.B) { - P := randomJacobian() - Q := randomJacobian() - R := randomJacobian() - QQ := randomProjective() - RR := randomProjective() - aR := randomAffine() - - b.Run("addition", func(b *testing.B) { - for i := 0; i < b.N; i++ { - R.add(P, Q) - } - }) - b.Run("fullAddition", func(b *testing.B) { - for i := 0; i < b.N; i++ { - RR.completeAdd(RR, QQ) - } - }) - b.Run("mixadd", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.mixadd(P, aR) - } - }) - b.Run("double", func(b *testing.B) { - for i := 0; i < b.N; i++ { - P.double() - } - }) -} diff --git a/ecc/p384/tableBase.go b/ecc/p384/tableBase.go deleted file mode 100644 index 5132565e..00000000 --- a/ecc/p384/tableBase.go +++ /dev/null @@ -1,331 +0,0 @@ -//go:build (!purego && arm64) || (!purego && amd64) -// +build !purego,arm64 !purego,amd64 - -package p384 - -const baseOmega = uint(7) - -// baseOddMultiples has [2*i+1] * G at position i. -// Each coordinate has been multiplied by R=2^384 -var baseOddMultiples = [1 << (baseOmega - 1)]affinePoint{ - // 1P - { - x: fp384{0x28, 0xb5, 0xc0, 0x49, 0x66, 0x75, 0xd0, 0x3d, 0x38, 0xce, 0xd6, 0xa0, 0xe2, 0x78, 0xe3, 0x20, 0x6e, 0x4d, 0x1b, 0x54, 0xfc, 0x3a, 0x9c, 0x87, 0xff, 0xe, 0xa3, 0x59, 0x84, 0x86, 0x54, 0x64, 0x2b, 0xde, 0x4e, 0x61, 0x23, 0xf7, 0x2f, 0x81, 0x13, 0x15, 0x9e, 0x29, 0xc2, 0xad, 0x3a, 0x4d}, - y: fp384{0xfe, 0xa4, 0x3, 0x4b, 0xad, 0x3d, 0x4, 0x23, 0xac, 0xa9, 0xb4, 0x7b, 0xbf, 0xa8, 0xbf, 0xa1, 0x50, 0xb0, 0x83, 0x2e, 0x56, 0xe7, 0xad, 0x8b, 0xd9, 0xff, 0xf4, 0x68, 0x19, 0x52, 0xc3, 0xc6, 0x40, 0xa8, 0x69, 0x39, 0x26, 0x2, 0x80, 0xdd, 0xe9, 0xc5, 0x15, 0x5a, 0xc2, 0xab, 0x78, 0x2b}, - }, - // 3P - { - x: fp384{0x73, 0x40, 0xdc, 0xc1, 0xe6, 0xdb, 0xe4, 0x5, 0x9c, 0x77, 0x4f, 0xf0, 0xff, 0xa9, 0x4e, 0xc5, 0xf0, 0xcc, 0x70, 0xa1, 0xe9, 0x34, 0x20, 0x6b, 0x3e, 0x6c, 0x1c, 0xd5, 0x32, 0xd7, 0x48, 0x3a, 0x70, 0xa4, 0x3a, 0x26, 0x2d, 0x7e, 0x6f, 0xe3, 0xac, 0xc3, 0xc1, 0xe7, 0x68, 0xfe, 0x83, 0xd2}, - y: fp384{0x57, 0xe1, 0x4e, 0xc0, 0x21, 0x48, 0x28, 0x7e, 0x6d, 0xe3, 0xe0, 0x7a, 0xa7, 0x89, 0xd7, 0x92, 0x46, 0x74, 0xf6, 0x4e, 0xc0, 0x63, 0x26, 0x13, 0xb4, 0xd0, 0xe1, 0xd2, 0x5a, 0x2d, 0x1, 0x68, 0x39, 0xb3, 0x2, 0x51, 0xb1, 0x68, 0xdb, 0xf6, 0xaf, 0x92, 0x32, 0x98, 0xfc, 0x65, 0x54, 0x46}, - }, - // 5P - { - x: fp384{0xdf, 0xf0, 0xf1, 0x68, 0xba, 0x5e, 0x59, 0xbb, 0x66, 0x34, 0x87, 0xcc, 0xcb, 0xc0, 0x85, 0xc1, 0x3b, 0x70, 0x3c, 0x29, 0xb5, 0xb1, 0x1e, 0x7f, 0xe6, 0x5, 0xcc, 0xaa, 0xf5, 0x2c, 0xdb, 0x60, 0xc6, 0xe4, 0xe8, 0xe2, 0x87, 0xb9, 0x76, 0xc6, 0xfb, 0x8f, 0x17, 0x1d, 0xb1, 0x26, 0xbb, 0xe1}, - y: fp384{0x21, 0xfa, 0x73, 0x70, 0xa0, 0x4b, 0x69, 0x2b, 0x66, 0x45, 0xf3, 0x72, 0x2e, 0x6e, 0xc1, 0x22, 0x99, 0x5b, 0xc3, 0x1, 0x31, 0x1b, 0xb6, 0x80, 0x11, 0x4, 0x2c, 0x98, 0xaf, 0x7f, 0x23, 0x4b, 0x6d, 0x23, 0xde, 0x24, 0x40, 0x94, 0xc5, 0xe6, 0xa3, 0xe4, 0x9, 0xe2, 0xd6, 0xc9, 0xb1, 0x4d}, - }, - // 7P - { - x: fp384{0x2b, 0x22, 0x69, 0x7d, 0xd1, 0xb9, 0x13, 0xdf, 0xb1, 0x74, 0x47, 0x87, 0x5f, 0x41, 0xe6, 0x4c, 0x95, 0xaa, 0x1f, 0x21, 0xf8, 0xdc, 0x1e, 0x73, 0xed, 0x53, 0x97, 0x65, 0xd1, 0x15, 0x42, 0x5f, 0x55, 0xdf, 0xb2, 0x9d, 0x58, 0xdb, 0x93, 0xf8, 0x5b, 0x2, 0x89, 0x1c, 0x81, 0x9f, 0x2c, 0x93}, - y: fp384{0x1e, 0xa6, 0x6, 0x77, 0x20, 0xb2, 0x96, 0x9, 0x79, 0x1c, 0x64, 0xa8, 0xd5, 0x49, 0x53, 0x13, 0x44, 0x8, 0x13, 0x50, 0x6f, 0xd7, 0xaa, 0x65, 0x80, 0xf7, 0xff, 0x1, 0x4, 0x7c, 0xf3, 0xf, 0x6, 0x7, 0x3b, 0x69, 0x8e, 0x23, 0x7f, 0xf5, 0x3e, 0x9b, 0x6c, 0xaf, 0xb6, 0x16, 0xa, 0xd9}, - }, - // 9P - { - x: fp384{0x2f, 0xb9, 0x53, 0x23, 0xe, 0x20, 0x5d, 0x2f, 0xf9, 0xe4, 0xd7, 0x3f, 0x29, 0x87, 0x5d, 0xe3, 0x5d, 0x74, 0x6d, 0xa9, 0x33, 0x48, 0x9, 0x26, 0x3f, 0xff, 0xbf, 0x3c, 0xc1, 0x1d, 0x35, 0xdc, 0x6a, 0x4d, 0xd5, 0xda, 0xc6, 0x64, 0xd4, 0x26, 0x6a, 0x6c, 0x63, 0x53, 0x1d, 0x1d, 0xab, 0x5c}, - y: fp384{0xb0, 0xc0, 0x8e, 0xb1, 0x72, 0x30, 0x81, 0xf2, 0x2f, 0xaa, 0x42, 0xd7, 0x70, 0xe2, 0x77, 0x37, 0xc2, 0xa7, 0x3c, 0x3, 0xc7, 0x61, 0xf0, 0x27, 0xd8, 0xd0, 0xea, 0x68, 0xcc, 0xac, 0xec, 0xa6, 0x54, 0xa7, 0x69, 0xee, 0xf4, 0x29, 0x94, 0x7d, 0xc6, 0xf5, 0xe8, 0x31, 0x34, 0x63, 0x70, 0xe7}, - }, - // 11P - { - x: fp384{0x7d, 0x8c, 0x8b, 0xb6, 0x19, 0x8b, 0x70, 0xc7, 0xba, 0x7a, 0x37, 0x44, 0x7c, 0x7, 0x32, 0x45, 0x4f, 0xd6, 0xda, 0x6c, 0x70, 0x67, 0xcc, 0xd, 0x2, 0x66, 0x7b, 0x14, 0x56, 0xbf, 0xb8, 0x1, 0x79, 0x1d, 0x56, 0xf0, 0x85, 0x98, 0xd8, 0xf8, 0x37, 0xc4, 0xa9, 0x7b, 0xfc, 0xe9, 0x19, 0x9c}, - y: fp384{0x25, 0xba, 0xc4, 0xbd, 0x46, 0xb1, 0x4e, 0x76, 0x83, 0x4b, 0x14, 0xac, 0x6b, 0xe4, 0x4f, 0x60, 0x80, 0xe7, 0x77, 0x8a, 0x29, 0x13, 0xe8, 0x3c, 0x2e, 0x68, 0x9e, 0xfe, 0x36, 0xf, 0x7, 0x2e, 0x7a, 0x28, 0x53, 0x3a, 0xc, 0x1d, 0x82, 0x41, 0x18, 0xf9, 0x33, 0x35, 0x9f, 0x2f, 0xa6, 0x9a}, - }, - // 13P - { - x: fp384{0xfb, 0xbd, 0xcc, 0x75, 0x7e, 0xeb, 0x7a, 0x9b, 0x95, 0x9a, 0x74, 0xf6, 0xc5, 0x28, 0x5e, 0xb2, 0xae, 0xd4, 0xb7, 0x33, 0x46, 0x8e, 0x7a, 0x8a, 0x56, 0xbd, 0xc1, 0xd9, 0xa8, 0x3, 0x52, 0xdb, 0x97, 0xdf, 0x22, 0xed, 0x65, 0x72, 0x65, 0xd2, 0x94, 0x3c, 0xf2, 0x8c, 0xe1, 0x56, 0x1c, 0xb5}, - y: fp384{0x2d, 0x81, 0x3d, 0x6c, 0x59, 0x94, 0xd3, 0xf4, 0xc2, 0xe0, 0xca, 0x87, 0x1a, 0x8f, 0xe8, 0xd8, 0xe3, 0xf, 0x4d, 0xcf, 0x48, 0x2a, 0x9a, 0x78, 0x60, 0x8d, 0xc3, 0xfe, 0x2d, 0xac, 0xfe, 0xb7, 0xc3, 0xe, 0x49, 0x3b, 0x1c, 0xbd, 0xfd, 0x81, 0xe1, 0x79, 0x69, 0xcc, 0xb7, 0xad, 0x17, 0x46}, - }, - // 15P - { - x: fp384{0xa9, 0xf4, 0x9, 0x47, 0x88, 0xd8, 0x6a, 0x44, 0xd8, 0xab, 0x3d, 0xec, 0xe2, 0x10, 0x72, 0x2b, 0x34, 0x7b, 0xe0, 0x50, 0x95, 0xf1, 0xcc, 0x83, 0x75, 0x30, 0x9b, 0x78, 0x17, 0x9, 0x50, 0x59, 0x93, 0x59, 0x8, 0xeb, 0xd4, 0x1f, 0xc0, 0xf, 0x6b, 0x2, 0x3, 0x49, 0x6f, 0xd2, 0x62, 0xfb}, - y: fp384{0xbb, 0x89, 0xe9, 0x6f, 0x9d, 0xcc, 0x9, 0x23, 0x86, 0xd5, 0x4b, 0x14, 0xbd, 0x9c, 0x60, 0x61, 0xc, 0x61, 0x6, 0xde, 0xa0, 0xd3, 0x23, 0x4b, 0x70, 0xf4, 0x98, 0xd8, 0x66, 0x28, 0xdc, 0xdd, 0x97, 0x57, 0xc, 0x40, 0x41, 0xfc, 0x33, 0x87, 0x16, 0x27, 0xbc, 0xd0, 0xfe, 0xc6, 0x68, 0x5a}, - }, - // 17P - { - x: fp384{0xd0, 0x3c, 0x4a, 0x4b, 0x30, 0xe1, 0x3, 0x89, 0x3e, 0xf4, 0xf1, 0x8f, 0x4c, 0xea, 0xa4, 0x3e, 0xd, 0xa1, 0x55, 0xf6, 0x2a, 0x3f, 0xfc, 0xe6, 0xfc, 0xfe, 0x4f, 0x52, 0x7d, 0x73, 0xe3, 0x7b, 0x5e, 0x45, 0x30, 0x53, 0x55, 0x28, 0x69, 0x9f, 0x70, 0xce, 0x75, 0xe4, 0x6e, 0x16, 0x4f, 0x52}, - y: fp384{0x55, 0xf0, 0x12, 0x6c, 0xcd, 0x69, 0xcc, 0x3f, 0xda, 0xc0, 0xb9, 0xd5, 0xff, 0xb6, 0x23, 0x4e, 0x83, 0xf1, 0x6b, 0x33, 0x93, 0x69, 0xce, 0x49, 0x4a, 0x50, 0x54, 0x4a, 0x85, 0x6d, 0x7d, 0xf8, 0x7a, 0x67, 0xc2, 0xb3, 0xf1, 0x5d, 0xeb, 0x25, 0xc9, 0x64, 0xb1, 0x55, 0x6f, 0x98, 0x37, 0xac}, - }, - // 19P - { - x: fp384{0x8, 0x4c, 0xa8, 0xba, 0x4a, 0xed, 0xa2, 0x82, 0x12, 0xc9, 0xa8, 0x41, 0x5f, 0xcc, 0xc4, 0x22, 0x5e, 0xad, 0x4a, 0x15, 0x3b, 0x9c, 0x10, 0xca, 0x8e, 0x53, 0x38, 0xfc, 0x98, 0x12, 0x89, 0x23, 0xae, 0x2, 0x98, 0x53, 0x9c, 0x63, 0xb6, 0xb3, 0x6, 0xd7, 0x90, 0x3, 0x45, 0x1f, 0xf, 0xfa}, - y: fp384{0xd0, 0x21, 0xdc, 0xb0, 0x5d, 0x8e, 0xb7, 0x46, 0xac, 0x2e, 0xda, 0xc3, 0x3c, 0x2d, 0xc7, 0xa8, 0x43, 0xf6, 0xf2, 0x6f, 0x78, 0xb3, 0x70, 0x91, 0xc3, 0x30, 0x7f, 0xb6, 0x9b, 0x79, 0x5a, 0x3f, 0x72, 0xb6, 0x64, 0x82, 0x77, 0xdc, 0xd1, 0x15, 0x64, 0x77, 0x57, 0xe9, 0x23, 0x7b, 0xd4, 0xa1}, - }, - // 21P - { - x: fp384{0x2f, 0xce, 0x22, 0x4, 0x51, 0x5e, 0x26, 0x8, 0x21, 0x9e, 0x2f, 0xdd, 0x96, 0xd4, 0xe0, 0x88, 0x5d, 0xf7, 0x77, 0x61, 0xa0, 0x8a, 0x12, 0x30, 0x69, 0xbe, 0x9e, 0xbd, 0x62, 0xab, 0x59, 0x2e, 0x37, 0xe5, 0xf0, 0x5d, 0x6c, 0xf, 0x1a, 0x1b, 0xb5, 0x12, 0xc0, 0xda, 0x26, 0xc6, 0x16, 0xab}, - y: fp384{0xe7, 0x5d, 0x8c, 0x0, 0x4b, 0x21, 0x14, 0x80, 0xea, 0x7b, 0xf1, 0x38, 0x9e, 0xa, 0x74, 0xaa, 0x98, 0x90, 0x14, 0x8a, 0x49, 0xbb, 0x2e, 0x26, 0x59, 0xcd, 0x27, 0x85, 0x1e, 0x11, 0x54, 0xb4, 0x17, 0x58, 0xea, 0xac, 0x5a, 0xd1, 0x6a, 0x26, 0xba, 0xcc, 0x53, 0x13, 0x41, 0x4f, 0x82, 0x21}, - }, - // 23P - { - x: fp384{0x3b, 0x68, 0xe3, 0x12, 0x4d, 0xe7, 0xb4, 0xd1, 0xf6, 0x8e, 0x9b, 0x56, 0xb, 0xd2, 0xe, 0x99, 0x18, 0xa, 0x9c, 0x42, 0x25, 0xdd, 0xd3, 0xb9, 0x83, 0x17, 0x35, 0x2a, 0xab, 0xb8, 0x75, 0x1c, 0xf0, 0x32, 0x54, 0x90, 0x2b, 0xca, 0xe4, 0x61, 0x24, 0xf2, 0xa8, 0xee, 0x69, 0x6a, 0x82, 0x80}, - y: fp384{0xad, 0xab, 0x52, 0xec, 0x6b, 0x3a, 0xc3, 0x7f, 0x13, 0x48, 0x5e, 0xa6, 0xf0, 0xa3, 0xcc, 0xb, 0xbe, 0xce, 0x27, 0xa5, 0x32, 0xa1, 0xd8, 0x7a, 0x7e, 0x2c, 0xf2, 0xea, 0x50, 0x89, 0x13, 0xf0, 0xc1, 0x18, 0x67, 0x56, 0x37, 0x24, 0x2d, 0x28, 0x59, 0x25, 0x21, 0xe2, 0xd, 0xcb, 0xfc, 0x9d}, - }, - // 25P - { - x: fp384{0x83, 0x3b, 0xce, 0x58, 0x27, 0x72, 0x93, 0x1e, 0x36, 0xfb, 0xb3, 0x3c, 0xfa, 0xd, 0x28, 0xbb, 0x4a, 0x17, 0xbe, 0xe2, 0xd2, 0xf3, 0xd0, 0x57, 0x1e, 0xbe, 0x8a, 0x20, 0x99, 0x1b, 0xd5, 0x9b, 0x24, 0x80, 0x24, 0xde, 0x50, 0xab, 0x9, 0x38, 0x31, 0x73, 0xbb, 0xa5, 0x2c, 0x6e, 0x9c, 0xc2}, - y: fp384{0x5, 0x4f, 0x12, 0x61, 0x2e, 0xfd, 0x44, 0x99, 0x91, 0xe3, 0x9, 0x90, 0x4e, 0xbc, 0xcc, 0x83, 0xcc, 0xa3, 0x24, 0x94, 0x5, 0x8f, 0x62, 0x1, 0x44, 0x43, 0x8e, 0xea, 0x1d, 0xf5, 0xa2, 0xd6, 0x6e, 0xc9, 0xeb, 0x4c, 0x3d, 0x1a, 0x3e, 0xda, 0xdc, 0x9, 0x78, 0xe9, 0x42, 0xfb, 0xe6, 0x1f}, - }, - // 27P - { - x: fp384{0xe4, 0x66, 0x7d, 0x46, 0xd2, 0x82, 0x44, 0xa0, 0x1d, 0x29, 0x78, 0x4d, 0x93, 0x12, 0x19, 0xcf, 0xf9, 0x96, 0x23, 0x48, 0x68, 0x41, 0xd, 0x8e, 0xd0, 0x14, 0x8f, 0xd1, 0xd5, 0xe2, 0x28, 0x72, 0xfe, 0x58, 0x6a, 0x9c, 0x50, 0x8d, 0x7e, 0x2f, 0xec, 0x5a, 0x3e, 0x37, 0xe, 0x78, 0xca, 0xe8}, - y: fp384{0xf8, 0xe9, 0x68, 0x1b, 0xd6, 0xd1, 0xaa, 0x42, 0xf4, 0xf8, 0xe2, 0x69, 0xf5, 0xd7, 0xa6, 0x58, 0xea, 0x1b, 0xda, 0x31, 0xfe, 0xad, 0x79, 0xd7, 0x85, 0x5a, 0xc8, 0x38, 0x6, 0x54, 0x26, 0x7d, 0xdf, 0x3c, 0x4d, 0xd4, 0x95, 0x71, 0xe6, 0x67, 0xd7, 0x4e, 0x13, 0xc5, 0xb, 0xa, 0x82, 0x17}, - }, - // 29P - { - x: fp384{0x70, 0x14, 0x2, 0xd3, 0xc5, 0x6a, 0x9d, 0x1, 0xd6, 0x43, 0x4, 0x78, 0x66, 0x6b, 0x84, 0x25, 0x47, 0x76, 0xc9, 0x55, 0xed, 0x15, 0x3c, 0xce, 0xf, 0xeb, 0x3f, 0xe, 0x49, 0x2d, 0xc2, 0x3d, 0xe4, 0x26, 0xdf, 0xa7, 0xcb, 0xb7, 0x65, 0x20, 0x1f, 0xea, 0x7c, 0x18, 0xe8, 0xa, 0xb0, 0xc8}, - y: fp384{0xd3, 0xde, 0x5d, 0x86, 0xa0, 0x84, 0x52, 0x1a, 0xe2, 0x3d, 0xc8, 0x20, 0x49, 0x16, 0x3c, 0x29, 0xb3, 0x51, 0xe8, 0xcc, 0x26, 0x8d, 0x17, 0xab, 0xfb, 0x5, 0x45, 0x40, 0xb, 0xb1, 0x6d, 0x8e, 0x33, 0x20, 0xc8, 0x90, 0x71, 0x7e, 0xf5, 0xf6, 0x6c, 0xf1, 0x77, 0x59, 0x1, 0x1c, 0x2a, 0x1d}, - }, - // 31P - { - x: fp384{0xa4, 0x6, 0x89, 0x7c, 0x31, 0x89, 0x9c, 0xa3, 0xe6, 0x1e, 0x82, 0x9e, 0xdd, 0xec, 0xe7, 0xb6, 0xe6, 0x4f, 0xdf, 0xf0, 0x40, 0x83, 0xcf, 0x2e, 0x65, 0x49, 0xc1, 0x53, 0xc9, 0x7d, 0x2f, 0xd4, 0x85, 0x82, 0xba, 0xe3, 0xa3, 0x51, 0xfb, 0x1a, 0xd1, 0x5, 0x33, 0xa, 0x4, 0xc4, 0x7, 0x6c}, - y: fp384{0xda, 0xc1, 0x7f, 0x12, 0x88, 0x32, 0xb8, 0xda, 0x8, 0x4b, 0x4c, 0x37, 0x9b, 0x69, 0xa, 0xbc, 0xdd, 0x20, 0xeb, 0x42, 0xab, 0x9b, 0x2a, 0x40, 0x1c, 0x7a, 0x5a, 0x4, 0x4f, 0x46, 0xdd, 0xd7, 0xc4, 0xec, 0xbe, 0x36, 0x6d, 0xd, 0x3d, 0x5b, 0x9d, 0xa1, 0x98, 0x63, 0x75, 0x3e, 0x5a, 0x47}, - }, - // 33P - { - x: fp384{0x63, 0xba, 0xb3, 0x2f, 0x38, 0x3a, 0x33, 0x61, 0x86, 0x3c, 0x94, 0x5b, 0x9d, 0xd, 0x33, 0xdf, 0xaf, 0xf3, 0x5e, 0x95, 0xee, 0xc7, 0xc7, 0xbb, 0xfb, 0x9e, 0xf0, 0x60, 0xc1, 0x1f, 0x63, 0xda, 0x0, 0xc4, 0xd5, 0x41, 0x26, 0x62, 0xaf, 0x68, 0x9d, 0x3e, 0x83, 0x6c, 0xa4, 0x97, 0x9e, 0xcc}, - y: fp384{0x76, 0x5e, 0x62, 0x3a, 0x8e, 0x3e, 0xd7, 0x7f, 0x5e, 0xe5, 0x9, 0xc2, 0x24, 0x61, 0xbf, 0x13, 0x91, 0xb, 0xb9, 0x48, 0xea, 0x7c, 0x46, 0x8, 0xba, 0xa, 0x6f, 0xbb, 0xb9, 0x6e, 0x41, 0x8a, 0x72, 0x10, 0xc3, 0xb8, 0xa1, 0x93, 0xcc, 0x6f, 0xd7, 0xda, 0x57, 0x90, 0x61, 0x2b, 0xfd, 0xa7}, - }, - // 35P - { - x: fp384{0x9b, 0xec, 0x20, 0x37, 0x43, 0xb5, 0xa5, 0x58, 0xb4, 0x2f, 0x7c, 0x2d, 0xd5, 0x0, 0x38, 0xbb, 0xa, 0xbd, 0xe6, 0xdd, 0x20, 0x86, 0x50, 0x4a, 0xfd, 0x83, 0x25, 0xa0, 0x73, 0x62, 0xf1, 0x65, 0x23, 0x85, 0xc7, 0x4f, 0xe3, 0xd8, 0x2b, 0x83, 0xc6, 0x7b, 0x41, 0xe9, 0x75, 0x9f, 0x14, 0xd6}, - y: fp384{0x2a, 0xb5, 0xee, 0x3d, 0xe9, 0x26, 0xb0, 0xfe, 0x56, 0x9, 0x5e, 0xa5, 0x88, 0x80, 0xe1, 0xc, 0xa2, 0x92, 0x80, 0x98, 0x98, 0x89, 0x1, 0x50, 0xee, 0x5e, 0xf3, 0x28, 0xab, 0x9f, 0xf1, 0x22, 0x5c, 0xd3, 0xcc, 0x52, 0x7f, 0x87, 0x8a, 0xac, 0x26, 0x3f, 0xe2, 0x30, 0xd8, 0x8a, 0x3a, 0xb1}, - }, - // 37P - { - x: fp384{0xa3, 0x61, 0x4f, 0xe4, 0x7d, 0xd5, 0x2, 0x2, 0xf2, 0xe, 0x63, 0xb5, 0x4b, 0x70, 0x27, 0x40, 0x5d, 0x4a, 0xb5, 0xf5, 0xdf, 0xe2, 0x29, 0xa1, 0x86, 0x2b, 0x48, 0x97, 0x75, 0xa, 0xb6, 0xac, 0x14, 0x71, 0xf2, 0x7e, 0xe8, 0xed, 0x61, 0x92, 0xb5, 0x58, 0xfc, 0xde, 0xf3, 0x28, 0xba, 0x1e}, - y: fp384{0x9e, 0x58, 0xe5, 0x8b, 0xc9, 0xc0, 0x91, 0x6c, 0xee, 0x4b, 0x59, 0x14, 0xd5, 0x43, 0x16, 0x2f, 0x34, 0xa0, 0x2c, 0x5d, 0x43, 0x12, 0xa9, 0x2e, 0x1f, 0x7d, 0x4, 0x94, 0xa8, 0x49, 0x6, 0xb5, 0x37, 0xa3, 0x8c, 0x63, 0xb5, 0xcb, 0x4f, 0x28, 0x85, 0xbf, 0x85, 0xfe, 0xb7, 0x7, 0xe, 0xfa}, - }, - // 39P - { - x: fp384{0x42, 0xe, 0x6e, 0x50, 0x80, 0x4f, 0x89, 0x7d, 0x46, 0x2c, 0x3d, 0x8e, 0x4a, 0x24, 0x84, 0xd9, 0x6f, 0x0, 0x7f, 0x2b, 0x64, 0xdf, 0x7e, 0x6d, 0x30, 0x62, 0x9b, 0xde, 0x6d, 0xcd, 0xa1, 0x36, 0x65, 0x6, 0x6c, 0xb7, 0x40, 0x50, 0x98, 0xc9, 0xc2, 0x1f, 0x9b, 0xb8, 0xd6, 0xf4, 0x7d, 0x58}, - y: fp384{0x7a, 0xae, 0x71, 0x6a, 0x47, 0x38, 0x6, 0x4c, 0x47, 0x47, 0x29, 0xe8, 0xb3, 0xa, 0x2b, 0x7b, 0xb8, 0x53, 0x31, 0xb5, 0x3a, 0x55, 0x5c, 0x34, 0xe2, 0x9f, 0x6d, 0x43, 0x53, 0xe4, 0x46, 0xb6, 0x40, 0x3, 0xd6, 0x1c, 0x5f, 0x35, 0x95, 0x1a, 0xfb, 0x68, 0x49, 0x7, 0x28, 0xc1, 0x7b, 0x2d}, - }, - // 41P - { - x: fp384{0x4c, 0xd1, 0xa6, 0xbc, 0x87, 0x8e, 0x14, 0xad, 0x1e, 0x20, 0x6a, 0x45, 0x4d, 0xd2, 0xdf, 0x41, 0xf3, 0x68, 0xd, 0xa8, 0x33, 0x29, 0xa8, 0x73, 0x35, 0xa0, 0x2c, 0x85, 0x8d, 0x6c, 0x74, 0x89, 0xae, 0x71, 0xfd, 0x95, 0x88, 0x77, 0xbc, 0xe3, 0x5d, 0x24, 0x92, 0xda, 0x2c, 0xcd, 0x64, 0x87}, - y: fp384{0xe2, 0x23, 0xeb, 0x82, 0x47, 0x2c, 0xfe, 0xa2, 0x6e, 0x9d, 0x3c, 0xf, 0xe0, 0x62, 0xc7, 0x5a, 0x31, 0x6f, 0x64, 0x21, 0xe1, 0xc, 0x86, 0x57, 0x9a, 0x58, 0x9f, 0x4f, 0xc3, 0xd6, 0xc9, 0xbd, 0x2e, 0x27, 0x93, 0xd1, 0xc7, 0x52, 0x99, 0x67, 0xc5, 0xf1, 0x18, 0xeb, 0x2e, 0x70, 0xea, 0x82}, - }, - // 43P - { - x: fp384{0x44, 0x6d, 0x84, 0x0, 0x55, 0x93, 0xfa, 0x37, 0x8c, 0xbc, 0x78, 0x5, 0xc5, 0x2f, 0x11, 0x9, 0x3d, 0x94, 0xc4, 0x39, 0xb2, 0xf5, 0xd9, 0xda, 0x86, 0xbd, 0x6d, 0x41, 0xf0, 0xf5, 0x14, 0x73, 0x56, 0xfb, 0xfe, 0x1, 0xa9, 0x95, 0xf0, 0x5c, 0x93, 0xb3, 0xda, 0x22, 0xad, 0x8b, 0x17, 0x35}, - y: fp384{0xa7, 0xf1, 0xba, 0x36, 0x1b, 0xfc, 0x79, 0xcf, 0x98, 0x54, 0x9e, 0x74, 0x2d, 0xe4, 0x7e, 0x1b, 0xbb, 0x14, 0xe3, 0xed, 0xa9, 0x8a, 0xe7, 0xbc, 0xdf, 0x28, 0x6, 0xbd, 0xf6, 0xe0, 0xf8, 0xaa, 0x48, 0xf9, 0xcb, 0x15, 0x94, 0xb0, 0x74, 0xa9, 0x78, 0x2b, 0x63, 0xc9, 0x63, 0x1f, 0x3f, 0x8f}, - }, - // 45P - { - x: fp384{0x5b, 0xda, 0xdd, 0x4f, 0x56, 0x11, 0xc4, 0xd4, 0x12, 0x91, 0xad, 0x73, 0xc6, 0x65, 0xaf, 0xd4, 0x59, 0x8f, 0xeb, 0x39, 0xbb, 0xe0, 0xe8, 0xff, 0x13, 0xcf, 0x6f, 0x8d, 0xe, 0xc, 0x4, 0xb0, 0x99, 0xb5, 0x2b, 0x1f, 0xc6, 0xc0, 0xe1, 0x99, 0x5, 0x34, 0xac, 0xb2, 0x58, 0xc8, 0x94, 0x9c}, - y: fp384{0x5d, 0xd8, 0xee, 0x6e, 0xd7, 0x78, 0x88, 0x8f, 0x3f, 0xca, 0xfc, 0x51, 0x43, 0xf5, 0xb2, 0x62, 0x18, 0x69, 0xb5, 0xe5, 0xa9, 0x44, 0x3b, 0xeb, 0x93, 0x4e, 0x23, 0xb7, 0x76, 0x66, 0xf9, 0x16, 0x9e, 0xf1, 0x2a, 0xbd, 0x22, 0x77, 0x47, 0x17, 0x85, 0xa4, 0x83, 0xdb, 0x79, 0x29, 0xeb, 0x42}, - }, - // 47P - { - x: fp384{0xca, 0x68, 0xc6, 0xf0, 0x7d, 0x8f, 0x88, 0x6f, 0x6c, 0xc6, 0xd, 0x5f, 0x78, 0x88, 0xc7, 0x65, 0xa0, 0x7, 0x5b, 0x5f, 0x12, 0x85, 0xb1, 0xbf, 0xd0, 0xac, 0x78, 0xd8, 0xf7, 0xbf, 0xa, 0x78, 0x50, 0xf9, 0xc, 0x57, 0xb1, 0x21, 0x4f, 0x50, 0x71, 0x33, 0x23, 0xda, 0xc5, 0x37, 0x5b, 0xea}, - y: fp384{0xd1, 0x7e, 0x43, 0x22, 0xbd, 0xe8, 0x7a, 0x48, 0xb7, 0xf9, 0x9c, 0x24, 0x58, 0x17, 0x70, 0x9c, 0xff, 0x34, 0xfb, 0x98, 0xa8, 0x62, 0x65, 0xf8, 0x91, 0xfc, 0xe0, 0x65, 0xa2, 0xa1, 0xee, 0xdf, 0x23, 0xfc, 0x20, 0x2e, 0x91, 0x6, 0xf0, 0xee, 0x8b, 0x2a, 0xa7, 0xdf, 0xc7, 0xfe, 0x9d, 0xac}, - }, - // 49P - { - x: fp384{0xc6, 0x36, 0x71, 0x69, 0xef, 0x3a, 0x5c, 0xfa, 0xb8, 0x6f, 0xea, 0xa5, 0x63, 0xaf, 0xa5, 0x8e, 0xa4, 0x65, 0xe3, 0x42, 0x65, 0x15, 0x69, 0xa6, 0x86, 0x33, 0x6e, 0x5b, 0x11, 0x6c, 0xc5, 0x47, 0x56, 0x3f, 0xa0, 0xce, 0x2b, 0x83, 0x97, 0x11, 0x9e, 0xea, 0xe4, 0x50, 0xb2, 0xb, 0x47, 0xb}, - y: fp384{0x12, 0x57, 0xb2, 0x13, 0x43, 0xc7, 0x13, 0x31, 0x48, 0x7d, 0x49, 0xd2, 0x4e, 0x17, 0x6c, 0x8d, 0xe8, 0xeb, 0xc9, 0x49, 0xee, 0x86, 0x44, 0xfc, 0xd3, 0xbd, 0x82, 0x7f, 0xd5, 0xed, 0x87, 0x24, 0x2f, 0xbe, 0x57, 0x5b, 0x41, 0x64, 0x1e, 0x77, 0xdb, 0x2b, 0x8b, 0xe2, 0x18, 0xc5, 0x1c, 0x2d}, - }, - // 51P - { - x: fp384{0x8d, 0xac, 0x70, 0x20, 0xc7, 0xca, 0x4c, 0x2c, 0xb8, 0x22, 0x4a, 0xec, 0xca, 0xc0, 0x47, 0x19, 0xd9, 0x78, 0x5a, 0x8c, 0x59, 0xfb, 0xe0, 0xa5, 0xe7, 0x4d, 0xa8, 0x41, 0xd2, 0xe8, 0x4a, 0x46, 0x27, 0xbc, 0xaa, 0xda, 0xe9, 0x16, 0xba, 0x3d, 0x3c, 0xcb, 0x35, 0x4f, 0x50, 0x4a, 0x63, 0x16}, - y: fp384{0x4f, 0xc8, 0x6e, 0xb1, 0xf9, 0x8b, 0xc1, 0xad, 0x35, 0xdd, 0x59, 0x73, 0x7e, 0x6, 0x4d, 0x32, 0xf0, 0x43, 0x5, 0x57, 0xc3, 0xc0, 0xea, 0xda, 0x36, 0x7d, 0x88, 0x3c, 0x0, 0x40, 0x22, 0xb, 0xd, 0x1a, 0x3f, 0x37, 0xe2, 0x89, 0x94, 0xc6, 0x97, 0xd, 0xaa, 0xcb, 0x7d, 0x4, 0x8b, 0x51}, - }, - // 53P - { - x: fp384{0xef, 0x49, 0xde, 0xfb, 0xc6, 0xdd, 0x1b, 0x3b, 0xcc, 0x15, 0x9, 0x8a, 0x26, 0x7c, 0xed, 0xda, 0xa2, 0x22, 0x4, 0xf, 0x61, 0x10, 0x1, 0xb, 0x16, 0x4b, 0xc5, 0xa7, 0x74, 0x5c, 0x48, 0xcf, 0xe2, 0xaa, 0xc3, 0x15, 0xe6, 0xc4, 0x2e, 0x64, 0xea, 0x83, 0xf3, 0xe0, 0x10, 0x8f, 0xba, 0xa8}, - y: fp384{0x1, 0x85, 0x61, 0x95, 0xb4, 0x54, 0x20, 0x2a, 0x8b, 0xfa, 0x9e, 0x8, 0x42, 0x64, 0xec, 0xeb, 0x3e, 0xa8, 0x2f, 0x4e, 0x9a, 0xa1, 0x86, 0x57, 0x63, 0x99, 0x6, 0x39, 0xd1, 0x1a, 0xc7, 0xd2, 0xe2, 0x65, 0x17, 0x48, 0x9a, 0x3d, 0xc9, 0xad, 0x85, 0x94, 0xcc, 0x7e, 0xeb, 0xe3, 0xf2, 0xed}, - }, - // 55P - { - x: fp384{0x67, 0x33, 0x9f, 0x6, 0x60, 0x5f, 0xab, 0xbc, 0x3c, 0xec, 0x18, 0x17, 0xbc, 0x22, 0x66, 0xfd, 0xd6, 0x42, 0xa1, 0xe3, 0x67, 0x78, 0xfb, 0xa4, 0xb3, 0xae, 0x5f, 0x8, 0xbf, 0xd8, 0x78, 0x60, 0x4f, 0x55, 0xf4, 0x60, 0xda, 0xbf, 0x5c, 0xfa, 0x8, 0xd4, 0xc, 0x69, 0xd1, 0xd5, 0xfc, 0xb3}, - y: fp384{0x84, 0x78, 0x1f, 0x28, 0x7d, 0xee, 0xbd, 0x4e, 0xa7, 0x63, 0xa, 0x18, 0xaa, 0x23, 0xaf, 0x82, 0x61, 0x9f, 0x7, 0x3d, 0x7c, 0x10, 0xe3, 0x8d, 0xf8, 0x34, 0x23, 0xbe, 0xcb, 0xb5, 0xc6, 0x17, 0x6, 0xfa, 0xd0, 0x97, 0x39, 0xe7, 0x91, 0x6a, 0xd4, 0xee, 0xce, 0x14, 0x73, 0x25, 0x60, 0x74}, - }, - // 57P - { - x: fp384{0x5c, 0x86, 0x7f, 0xf9, 0x1c, 0xa6, 0x4b, 0xb1, 0xd, 0x8b, 0x4b, 0x69, 0xc1, 0xe4, 0xba, 0x73, 0x62, 0xbf, 0x4b, 0xac, 0xdf, 0x67, 0x49, 0xa1, 0xe0, 0x46, 0xf4, 0x9b, 0x50, 0xd1, 0x9d, 0x1e, 0xef, 0xce, 0x99, 0x1c, 0xeb, 0xf3, 0x52, 0xc0, 0x89, 0xc1, 0x78, 0x7a, 0xa0, 0x7f, 0x4d, 0x81}, - y: fp384{0x5d, 0xb0, 0x74, 0xab, 0x83, 0xa4, 0x1, 0xa1, 0x65, 0x7b, 0x73, 0xa1, 0x58, 0xc2, 0x88, 0x77, 0x3c, 0xa1, 0x9, 0xe8, 0xb7, 0xba, 0x60, 0xd, 0x5b, 0x1d, 0xc8, 0x73, 0xc4, 0x7b, 0x42, 0x8f, 0xfc, 0xc1, 0x52, 0x29, 0x55, 0x30, 0xe1, 0xd2, 0x63, 0xdf, 0x26, 0x4b, 0x9a, 0x3b, 0x82, 0xa}, - }, - // 59P - { - x: fp384{0xc9, 0x64, 0xbf, 0x27, 0xe2, 0x7c, 0x46, 0xaf, 0x4c, 0x97, 0x29, 0xf9, 0x97, 0x68, 0xca, 0xdf, 0x38, 0x27, 0x32, 0x5c, 0x59, 0x3b, 0x47, 0x64, 0x15, 0xe3, 0xd0, 0x1e, 0xcf, 0x17, 0xa9, 0x96, 0xb9, 0x4d, 0xe6, 0xd, 0x5b, 0x43, 0x3, 0x37, 0x46, 0xb6, 0x67, 0x92, 0x67, 0x39, 0xa0, 0x9b}, - y: fp384{0xbe, 0x2f, 0x52, 0x3a, 0xae, 0x2a, 0xc, 0xdf, 0xf0, 0xef, 0x35, 0xb3, 0x41, 0xb7, 0xbd, 0x41, 0x3, 0x97, 0x5, 0x7b, 0xdd, 0x2e, 0xcf, 0xac, 0xce, 0x3c, 0x46, 0x28, 0x30, 0x4b, 0xb3, 0x6f, 0x19, 0xca, 0xe3, 0xd9, 0xb, 0xba, 0xd9, 0x96, 0xc1, 0x55, 0x46, 0x50, 0x12, 0x6f, 0x33, 0xff}, - }, - // 61P - { - x: fp384{0xe0, 0xa6, 0x60, 0xfc, 0xd3, 0x1f, 0xda, 0x48, 0xe8, 0x41, 0x22, 0x22, 0x34, 0x5a, 0xfb, 0x54, 0x80, 0xe0, 0x2a, 0x77, 0x4f, 0xe3, 0x35, 0x60, 0xd0, 0x82, 0x29, 0x33, 0xf2, 0x7f, 0xf7, 0x5f, 0xfd, 0x51, 0xfe, 0x0, 0x73, 0x46, 0x66, 0x23, 0x6, 0xa0, 0x6b, 0xef, 0x49, 0xa0, 0x3e, 0xc9}, - y: fp384{0x66, 0x12, 0x38, 0x7d, 0x17, 0xf1, 0x40, 0x66, 0xac, 0xf4, 0xe9, 0x6a, 0xcd, 0x32, 0x4d, 0x39, 0xeb, 0x3, 0xd3, 0x70, 0x53, 0x88, 0xa7, 0xe6, 0x67, 0x57, 0x27, 0xe5, 0xff, 0x19, 0xda, 0xd, 0x23, 0x6d, 0x46, 0x1, 0x72, 0xc7, 0xa6, 0xb0, 0x29, 0x98, 0xc6, 0x1f, 0x45, 0x11, 0xcc, 0xc4}, - }, - // 63P - { - x: fp384{0xc0, 0x89, 0xed, 0xaa, 0xd7, 0xe6, 0xc0, 0xc5, 0x96, 0x18, 0x9a, 0x14, 0xd6, 0xea, 0xe8, 0x6c, 0x8f, 0x9f, 0x94, 0x8c, 0x45, 0xf7, 0x50, 0x7a, 0xaa, 0x71, 0x2b, 0x6e, 0xf7, 0x35, 0x7e, 0xcd, 0x7a, 0x9f, 0x4, 0x9a, 0x51, 0x9e, 0x15, 0xf6, 0x1e, 0x2d, 0xe5, 0xf1, 0xb0, 0xf0, 0x9b, 0x1c}, - y: fp384{0x80, 0x2c, 0x20, 0x18, 0xf5, 0xc1, 0xb6, 0x3b, 0x1a, 0x7b, 0xcd, 0x1e, 0x62, 0x5f, 0x3a, 0x8d, 0x19, 0x7f, 0xd1, 0x88, 0xe8, 0x34, 0xb0, 0x3b, 0x8d, 0x4, 0xd4, 0x97, 0x49, 0xbd, 0x89, 0xdc, 0x22, 0xdf, 0x35, 0x37, 0x8e, 0x7b, 0xaf, 0xf5, 0xe8, 0x89, 0xa6, 0xa0, 0x12, 0x37, 0xbb, 0x52}, - }, - // 65P - { - x: fp384{0x79, 0x96, 0x9b, 0x83, 0x54, 0x94, 0x46, 0x8e, 0x9f, 0x27, 0x1d, 0xd, 0x3b, 0xa4, 0xcd, 0xbe, 0x80, 0x3c, 0xb6, 0xed, 0x15, 0xdc, 0x9e, 0xcf, 0x2, 0xf0, 0xd5, 0xbd, 0x8a, 0xec, 0x97, 0x45, 0x53, 0x22, 0xb, 0x65, 0xb2, 0x50, 0x3, 0x8b, 0x6f, 0x26, 0xd4, 0x5f, 0x6a, 0x3a, 0x4c, 0xb8}, - y: fp384{0xf9, 0x79, 0xfc, 0x30, 0x3d, 0xd8, 0x16, 0xe, 0xd3, 0x95, 0xd9, 0x3a, 0x83, 0x87, 0xa4, 0xb6, 0x66, 0xc2, 0x2b, 0xde, 0x2c, 0x4b, 0x78, 0xab, 0xdd, 0x66, 0x9d, 0x88, 0x6d, 0x3d, 0x76, 0x19, 0x87, 0xf0, 0xf9, 0xc8, 0x24, 0x6c, 0x86, 0xa2, 0xc9, 0xb1, 0x5b, 0xa5, 0x28, 0x25, 0x6f, 0xea}, - }, - // 67P - { - x: fp384{0xca, 0x72, 0x17, 0x8b, 0xbc, 0x5c, 0xfc, 0x6e, 0x68, 0x4f, 0x63, 0xb, 0x3b, 0xdd, 0xc7, 0xea, 0x85, 0x61, 0x5d, 0xa5, 0xda, 0x5e, 0xd7, 0x65, 0xf7, 0xd8, 0xf3, 0x6e, 0x7e, 0x63, 0x6e, 0x55, 0x25, 0x9d, 0x90, 0x90, 0x4d, 0x3e, 0xaf, 0xf9, 0x5a, 0x3, 0x53, 0xe1, 0x48, 0xca, 0x62, 0xe4}, - y: fp384{0xd1, 0x9e, 0x10, 0xa, 0x7b, 0x3b, 0x76, 0x52, 0x6, 0x5d, 0x78, 0x42, 0xa6, 0xb1, 0x4a, 0x10, 0xbc, 0xe4, 0x59, 0x3f, 0xed, 0x35, 0x7e, 0x1a, 0x3, 0xc0, 0xeb, 0xc6, 0x46, 0xb7, 0x90, 0x59, 0xf9, 0xc5, 0x62, 0x13, 0xf0, 0x6b, 0x6a, 0x9, 0x94, 0x49, 0x79, 0xac, 0x8a, 0xcb, 0x22, 0x83}, - }, - // 69P - { - x: fp384{0x52, 0x27, 0xc, 0x67, 0x74, 0xdf, 0xd3, 0xf8, 0x28, 0x5e, 0x11, 0xa1, 0x59, 0x28, 0xcb, 0x5c, 0x1b, 0x98, 0x19, 0xf, 0xaa, 0xc8, 0x66, 0xcc, 0x65, 0xfd, 0xab, 0x25, 0xb1, 0xc8, 0xbc, 0xd4, 0xca, 0x3c, 0xdd, 0x4f, 0x16, 0xee, 0x86, 0x2c, 0xf4, 0x35, 0xf7, 0xa3, 0x78, 0x5d, 0xd6, 0x59}, - y: fp384{0xce, 0x55, 0xc, 0x7c, 0x28, 0xde, 0x5a, 0x3, 0x4d, 0x99, 0xd3, 0x45, 0x62, 0x9d, 0x76, 0x57, 0xa4, 0x23, 0xd4, 0x2b, 0x89, 0xe4, 0x3a, 0xd1, 0xbc, 0x66, 0xed, 0x82, 0x48, 0xee, 0xce, 0xa, 0x32, 0x7a, 0x16, 0x73, 0x8b, 0x9e, 0x2c, 0x6f, 0x7a, 0xbd, 0x1d, 0x27, 0x0, 0x1, 0xcd, 0xfb}, - }, - // 71P - { - x: fp384{0xb1, 0xfc, 0xfe, 0xef, 0x45, 0xce, 0x2e, 0xc4, 0x41, 0x14, 0xb1, 0xab, 0xb3, 0x31, 0x57, 0xbf, 0x92, 0xa, 0x8d, 0xe5, 0xcf, 0x15, 0xba, 0x93, 0x54, 0xac, 0x8, 0x35, 0x14, 0xde, 0xbb, 0x27, 0xda, 0x5d, 0x25, 0xfe, 0x38, 0x37, 0x12, 0x2b, 0x70, 0xcd, 0x7e, 0x53, 0x5a, 0xaa, 0x4f, 0xb}, - y: fp384{0xc6, 0x83, 0xec, 0xdd, 0x84, 0xd0, 0x44, 0x6a, 0x3d, 0x52, 0x1, 0x8, 0x4d, 0x3c, 0x79, 0x86, 0x19, 0xe3, 0xb3, 0x25, 0x50, 0x28, 0x4f, 0x15, 0x3a, 0x37, 0x64, 0xce, 0xf1, 0xda, 0x44, 0x21, 0x66, 0x95, 0x13, 0x7, 0xee, 0x24, 0xb9, 0xbd, 0x1c, 0xd0, 0x2a, 0x73, 0x28, 0xea, 0xa7, 0xf9}, - }, - // 73P - { - x: fp384{0x2, 0xa7, 0x51, 0xd8, 0x32, 0x5c, 0x38, 0x43, 0x3b, 0x96, 0xe8, 0x1d, 0xb1, 0xa9, 0xc2, 0xa9, 0x24, 0x9b, 0x8b, 0xdf, 0xb, 0x23, 0x8d, 0x5b, 0xc2, 0x31, 0x37, 0x2d, 0x25, 0xa9, 0x29, 0x90, 0xd2, 0xa7, 0xca, 0xe8, 0x4d, 0xb0, 0x8d, 0xb0, 0x3c, 0x67, 0xf4, 0x2b, 0xe7, 0x83, 0x9d, 0xb8}, - y: fp384{0x24, 0x44, 0xf2, 0xe1, 0xbf, 0x39, 0xfd, 0xa8, 0x16, 0xd6, 0xe8, 0xe1, 0xd6, 0xb6, 0x89, 0x9f, 0x6e, 0x21, 0x1d, 0x4f, 0x7b, 0xc8, 0x9f, 0xaf, 0x59, 0x5a, 0x26, 0x92, 0x3, 0x1e, 0xe2, 0x4, 0x73, 0x63, 0xb8, 0x87, 0x3, 0x74, 0x15, 0xb, 0x62, 0xa1, 0x98, 0x7c, 0x3b, 0xaf, 0x65, 0x6f}, - }, - // 75P - { - x: fp384{0xde, 0x3, 0x73, 0x86, 0x14, 0x40, 0x5d, 0x6b, 0xef, 0xb7, 0xa, 0x42, 0xa, 0xc4, 0xcb, 0xc8, 0x96, 0x9a, 0x54, 0x91, 0x89, 0xcf, 0x28, 0x5b, 0x66, 0x8f, 0x2f, 0x39, 0xb4, 0x31, 0x46, 0x5d, 0xc8, 0xb5, 0x67, 0xf3, 0x3d, 0xe2, 0x7e, 0x4a, 0x15, 0x7a, 0xca, 0xe6, 0xf, 0xae, 0xe0, 0xa1}, - y: fp384{0x7c, 0xa2, 0x9f, 0x13, 0xe1, 0x5e, 0x65, 0x2a, 0x1, 0xb9, 0xfa, 0x50, 0xc4, 0xc2, 0x31, 0xa5, 0x71, 0xed, 0xa, 0x43, 0x69, 0xab, 0x62, 0x67, 0x1d, 0x2e, 0x40, 0xf0, 0xe3, 0x39, 0xe2, 0x64, 0x45, 0xe4, 0x7f, 0x95, 0x42, 0x0, 0x87, 0xd7, 0x62, 0x65, 0x7d, 0x41, 0x62, 0xd8, 0x42, 0xfd}, - }, - // 77P - { - x: fp384{0x3f, 0x1a, 0x50, 0x2a, 0xc1, 0x34, 0x21, 0x9f, 0xa7, 0x93, 0x47, 0x33, 0x40, 0x9b, 0x4a, 0x11, 0x25, 0x61, 0x2a, 0x21, 0xc0, 0xb6, 0xcc, 0x27, 0xa3, 0x78, 0xce, 0x98, 0xb9, 0x30, 0xa9, 0xc, 0x27, 0x26, 0xa1, 0x28, 0xb, 0x6, 0x2e, 0x74, 0x16, 0x98, 0x5c, 0xfa, 0x7, 0x36, 0xd2, 0x63}, - y: fp384{0xdc, 0x91, 0x1f, 0xec, 0xa4, 0xcb, 0x4d, 0x77, 0x23, 0x1d, 0x4d, 0xf3, 0x2e, 0x7e, 0xcd, 0x34, 0x3d, 0x3c, 0xfd, 0x49, 0xe, 0x85, 0x0, 0x15, 0xb2, 0xcf, 0xc9, 0x30, 0x0, 0x95, 0x3, 0xdd, 0xa6, 0x41, 0x29, 0x57, 0xe5, 0xc3, 0x61, 0xce, 0x2e, 0xfd, 0x2c, 0x30, 0x75, 0x10, 0x4b, 0xd4}, - }, - // 79P - { - x: fp384{0x24, 0xc2, 0xa6, 0xe9, 0xd4, 0xd9, 0x11, 0xca, 0x85, 0x45, 0xb7, 0xc3, 0x48, 0xc2, 0xda, 0x2c, 0x71, 0x55, 0xca, 0x4, 0xa2, 0x1, 0x89, 0xe5, 0xf0, 0x1, 0x5d, 0xd1, 0x2d, 0x31, 0x1c, 0x49, 0x7c, 0xcb, 0x69, 0x70, 0x8a, 0x81, 0xcc, 0xb3, 0xda, 0x12, 0x39, 0xd5, 0xa5, 0x45, 0xb2, 0x23}, - y: fp384{0x63, 0xb1, 0xb0, 0xa6, 0x8b, 0x83, 0xf7, 0x30, 0x52, 0x55, 0x77, 0x32, 0x3e, 0xeb, 0x52, 0xa0, 0xc1, 0x5e, 0xb9, 0xee, 0xe9, 0x43, 0x32, 0x40, 0xb3, 0x2e, 0x63, 0x8, 0x1b, 0x30, 0x7b, 0x61, 0xf9, 0x81, 0x2, 0xf3, 0xc9, 0x66, 0x1c, 0x94, 0x55, 0xb2, 0x7a, 0x1d, 0xf8, 0x28, 0x97, 0x4b}, - }, - // 81P - { - x: fp384{0x82, 0xf6, 0x6, 0xdb, 0xcb, 0xd3, 0xbd, 0x3c, 0x85, 0x87, 0xc0, 0x86, 0x3e, 0x47, 0x45, 0xde, 0xfb, 0x1b, 0x7b, 0xe0, 0x60, 0x35, 0xcb, 0xd8, 0xaf, 0x38, 0xf1, 0xea, 0x8f, 0x11, 0xc3, 0xf2, 0xaf, 0x6f, 0x43, 0x9f, 0x85, 0x8a, 0x23, 0x11, 0x4f, 0x34, 0xdf, 0x7c, 0xe3, 0xc2, 0x84, 0x9}, - y: fp384{0x4f, 0x58, 0x82, 0xc3, 0x17, 0x3c, 0x8, 0xe1, 0x40, 0xa2, 0x6f, 0x73, 0xd4, 0x14, 0x9a, 0x95, 0x7d, 0x63, 0xf2, 0x18, 0xf0, 0xd2, 0xad, 0x56, 0x8d, 0x27, 0xdd, 0xe5, 0x5e, 0x7a, 0x4, 0x1, 0xa7, 0x6, 0x27, 0xae, 0x63, 0x8d, 0xe3, 0x5d, 0x7e, 0xb8, 0x45, 0x97, 0x60, 0xb7, 0xd7, 0x9d}, - }, - // 83P - { - x: fp384{0x71, 0x40, 0xe9, 0x44, 0xbf, 0xf0, 0x61, 0x8e, 0xb4, 0x5e, 0xf0, 0xd2, 0x7e, 0x84, 0xcf, 0x44, 0xeb, 0x94, 0x66, 0x4a, 0xd, 0xaa, 0x87, 0x84, 0xb5, 0xaa, 0xa4, 0xc7, 0xa1, 0x8c, 0xb8, 0xee, 0x26, 0x89, 0xa, 0x52, 0x3, 0xaa, 0x5b, 0xc2, 0x5, 0x78, 0x3d, 0xc0, 0x6a, 0xb1, 0x75, 0xa0}, - y: fp384{0xc3, 0x70, 0xd9, 0x13, 0x8a, 0xa4, 0x57, 0xc3, 0x3e, 0x64, 0x9, 0x60, 0x70, 0x13, 0x3c, 0x4e, 0x29, 0x4, 0xe6, 0x49, 0x57, 0xa9, 0x21, 0xcf, 0xda, 0xbc, 0x51, 0x22, 0xba, 0x62, 0xa2, 0xa, 0xe4, 0x78, 0x3c, 0x56, 0xd0, 0x7c, 0x2a, 0xb7, 0xf9, 0x1c, 0xce, 0x69, 0xda, 0xfe, 0x3d, 0x77}, - }, - // 85P - { - x: fp384{0x2d, 0x76, 0x6, 0x9b, 0xdf, 0x2c, 0x5d, 0x93, 0x5a, 0x25, 0x7, 0x82, 0xb8, 0xbb, 0x48, 0x21, 0xd8, 0x53, 0x31, 0x5, 0xdd, 0xca, 0xbd, 0x7b, 0x57, 0x6a, 0x25, 0x73, 0xff, 0xaa, 0x53, 0xd9, 0x1, 0x6f, 0x4e, 0x11, 0xe1, 0x8f, 0xa0, 0xb0, 0x4d, 0x4d, 0xe6, 0x46, 0x54, 0x2, 0x35, 0xc8}, - y: fp384{0x57, 0xc1, 0xdb, 0x0, 0xd8, 0xba, 0xcf, 0xe7, 0x69, 0xe9, 0xfb, 0x71, 0x2, 0xae, 0x2a, 0x39, 0x14, 0xe3, 0xeb, 0xb, 0x2a, 0xa7, 0x22, 0x74, 0xf2, 0x52, 0xaf, 0x2c, 0xd2, 0x55, 0xd4, 0xc3, 0x95, 0x51, 0x89, 0xe2, 0x9f, 0x83, 0x31, 0xa2, 0x13, 0xf2, 0x93, 0xc9, 0x92, 0x8d, 0x21, 0x6c}, - }, - // 87P - { - x: fp384{0x2e, 0x37, 0xa0, 0x4a, 0x2e, 0xa0, 0x11, 0x4f, 0x75, 0x77, 0x96, 0x10, 0x30, 0x47, 0x42, 0x59, 0x95, 0x91, 0x80, 0x8b, 0xba, 0xc1, 0xe, 0xdf, 0xf1, 0x3a, 0x3c, 0x9a, 0x8d, 0x92, 0xa, 0xf3, 0x2e, 0x6b, 0x7b, 0x38, 0x20, 0x3, 0x84, 0xc4, 0x22, 0xbb, 0x0, 0xa5, 0x17, 0x34, 0x1b, 0x1c}, - y: fp384{0xf2, 0x66, 0x32, 0xbf, 0xc7, 0xe6, 0xe, 0x69, 0x81, 0x96, 0x90, 0xa7, 0x74, 0x6d, 0x24, 0x18, 0x8f, 0xa8, 0x84, 0xf9, 0x54, 0x24, 0xdf, 0xde, 0x9, 0x9f, 0x55, 0xe7, 0x75, 0x41, 0x94, 0x31, 0xb7, 0x4d, 0x7b, 0xe, 0x88, 0x81, 0xac, 0xbd, 0x68, 0xfe, 0x96, 0xe9, 0xae, 0x6f, 0x4, 0x9f}, - }, - // 89P - { - x: fp384{0xac, 0xd4, 0x71, 0x2d, 0x4b, 0x9, 0x62, 0xc, 0xe0, 0x63, 0xf1, 0x4b, 0xdc, 0x9f, 0xa4, 0x18, 0x1f, 0x72, 0x96, 0x0, 0xb, 0xf3, 0x3d, 0x46, 0x7b, 0x5b, 0xe5, 0xc8, 0x4a, 0x64, 0xd3, 0x67, 0xb6, 0xe2, 0xe0, 0x19, 0x9d, 0xd2, 0x3d, 0xd6, 0x61, 0x73, 0x4b, 0x16, 0xde, 0x5, 0xd1, 0xd0}, - y: fp384{0x8e, 0x18, 0x17, 0x2, 0x4e, 0x5c, 0x86, 0xe5, 0x7e, 0xcf, 0x93, 0x20, 0x1b, 0xb7, 0x61, 0x78, 0x3c, 0x25, 0xaa, 0x2d, 0x51, 0xf0, 0xcc, 0x65, 0xc0, 0xe4, 0x4d, 0xb, 0x9, 0x1, 0x77, 0x14, 0xd9, 0x62, 0xb9, 0x40, 0x35, 0x24, 0x28, 0x1d, 0xf3, 0x37, 0xdf, 0xb8, 0x39, 0xe9, 0xc7, 0x1}, - }, - // 91P - { - x: fp384{0x58, 0x8, 0xba, 0x9c, 0x9c, 0x40, 0xea, 0x5d, 0x63, 0x3f, 0xae, 0x14, 0x1b, 0x42, 0xc2, 0x35, 0x8a, 0x61, 0xc2, 0xbb, 0x34, 0xe5, 0xf6, 0xa4, 0x5f, 0x4f, 0xd7, 0x42, 0x7d, 0x97, 0x4b, 0xb0, 0xb7, 0x3e, 0xdc, 0x59, 0x27, 0x38, 0xe7, 0xe7, 0xb0, 0x23, 0xf2, 0x8b, 0x34, 0x52, 0xf, 0xeb}, - y: fp384{0x58, 0x51, 0xc7, 0xf, 0x67, 0x51, 0x1c, 0x99, 0x6d, 0x2c, 0xde, 0x3f, 0x1a, 0x81, 0x12, 0xd0, 0x3d, 0x34, 0x36, 0x92, 0x31, 0xb3, 0xd0, 0x9, 0xa0, 0xcb, 0xa2, 0x63, 0xc8, 0xe0, 0x78, 0xcb, 0x78, 0x84, 0xb8, 0x9a, 0xbd, 0xb3, 0x9, 0xb, 0xe2, 0xc6, 0x16, 0xf1, 0x3, 0xc7, 0xca, 0x47}, - }, - // 93P - { - x: fp384{0xaf, 0x80, 0x2d, 0xe3, 0x71, 0x4d, 0xd1, 0xeb, 0x5e, 0x67, 0x80, 0x53, 0x4f, 0xc2, 0x1c, 0x1b, 0xcd, 0x42, 0x61, 0xb1, 0x64, 0x47, 0x63, 0x1c, 0xe, 0xb0, 0xfd, 0x7c, 0xde, 0x45, 0x35, 0x7a, 0x54, 0x51, 0xd1, 0xcf, 0x89, 0x16, 0xf9, 0x2d, 0xd7, 0xa2, 0xa, 0x43, 0xb3, 0x55, 0x33, 0x81}, - y: fp384{0x7e, 0xca, 0xf2, 0x85, 0xc9, 0xe2, 0xdc, 0x16, 0x79, 0xbb, 0x3a, 0xe0, 0xf7, 0x3, 0xe3, 0xd9, 0x98, 0x66, 0xb0, 0x3c, 0x10, 0xa8, 0x7c, 0xfe, 0xcb, 0xd, 0x67, 0x71, 0x5b, 0x42, 0x2a, 0x57, 0xe5, 0x68, 0xa2, 0x90, 0x54, 0x39, 0x1b, 0xc7, 0x9, 0x9d, 0xbf, 0x66, 0x8f, 0xf3, 0x71, 0xc0}, - }, - // 95P - { - x: fp384{0x91, 0x3c, 0xbc, 0xd, 0x63, 0xf2, 0xc0, 0xf, 0xb1, 0xcb, 0xc0, 0x9b, 0x16, 0xca, 0x74, 0x9f, 0x77, 0x89, 0xf9, 0xe, 0x9d, 0x7b, 0x60, 0x4a, 0x79, 0x2b, 0x7d, 0xa2, 0xef, 0xb, 0xe9, 0xb, 0xe1, 0x23, 0x7f, 0xad, 0xb5, 0xb, 0x7b, 0x25, 0xe4, 0xd1, 0xea, 0x2f, 0xe5, 0x2f, 0xf4, 0xb8}, - y: fp384{0x92, 0xb5, 0x93, 0x5f, 0x31, 0xe4, 0x78, 0xde, 0x7d, 0x61, 0x79, 0xfd, 0xeb, 0xe7, 0x5f, 0x50, 0xfb, 0xf9, 0x99, 0xdd, 0x14, 0x3f, 0xcc, 0x45, 0x91, 0xb5, 0xc7, 0x3b, 0xe8, 0x64, 0xf, 0x8c, 0xf9, 0x93, 0xab, 0x55, 0xed, 0x4d, 0x36, 0x65, 0x6e, 0x28, 0xdf, 0x42, 0xa5, 0x4b, 0x6d, 0xbb}, - }, - // 97P - { - x: fp384{0xe2, 0x54, 0x5c, 0x7f, 0x5d, 0x3, 0xd2, 0x7c, 0x2c, 0x49, 0x49, 0x4a, 0x0, 0xdb, 0xf0, 0xc1, 0x98, 0x8f, 0x27, 0x65, 0x30, 0x3e, 0x27, 0x8f, 0x9d, 0x9d, 0xef, 0x6f, 0xd1, 0x1e, 0x24, 0x10, 0x16, 0x96, 0x6, 0xac, 0x1b, 0xe5, 0xb1, 0x87, 0x7f, 0x80, 0xd, 0x17, 0xcd, 0x1a, 0x8, 0x8c}, - y: fp384{0x98, 0xb5, 0x73, 0x1c, 0xea, 0x51, 0x50, 0x0, 0xf4, 0x5b, 0x86, 0xd6, 0x12, 0x55, 0xeb, 0xe4, 0xd3, 0x5d, 0xe0, 0x30, 0xf4, 0x4e, 0xd2, 0xd7, 0x9e, 0xa3, 0x89, 0x78, 0xed, 0xe4, 0x47, 0xcb, 0x64, 0x69, 0xf5, 0xc4, 0x91, 0x24, 0x3e, 0x4c, 0x6, 0x30, 0xf0, 0xc4, 0x8e, 0xb7, 0xc6, 0x83}, - }, - // 99P - { - x: fp384{0xa1, 0x84, 0x5f, 0xb0, 0xa9, 0x35, 0x38, 0x6e, 0x4e, 0x17, 0xaa, 0x41, 0xf, 0x9e, 0x4f, 0xbb, 0x69, 0xa4, 0x8b, 0x70, 0x7c, 0x17, 0x41, 0x1b, 0xbd, 0xf8, 0xc8, 0x79, 0xb4, 0xe6, 0xb2, 0xb9, 0xbd, 0xd6, 0xd9, 0x82, 0x9, 0xae, 0x9c, 0xd4, 0x3a, 0x22, 0x28, 0xbb, 0x0, 0x5f, 0x8c, 0x64}, - y: fp384{0xa5, 0xc4, 0x8c, 0x5d, 0x76, 0x85, 0xf4, 0x4, 0x8d, 0xa3, 0xa0, 0x81, 0xdd, 0x96, 0x30, 0xfe, 0xe1, 0x47, 0x82, 0x70, 0x8f, 0x13, 0x75, 0x66, 0x8, 0xea, 0xa0, 0xd1, 0xd8, 0x59, 0xf7, 0xd6, 0x98, 0xd, 0x19, 0x76, 0xb1, 0x93, 0x74, 0x1f, 0xbd, 0x63, 0x2d, 0x32, 0x8b, 0x69, 0xe1, 0x3}, - }, - // 101P - { - x: fp384{0xac, 0xde, 0x8a, 0x9b, 0xf6, 0xc6, 0x66, 0x8e, 0x70, 0x6d, 0xc6, 0x50, 0xfe, 0xf5, 0x39, 0xb5, 0x1a, 0xfb, 0xcc, 0x2e, 0x2c, 0xcd, 0xdd, 0x73, 0xfc, 0x5c, 0x8b, 0x8b, 0xad, 0x1f, 0x3b, 0xd7, 0x10, 0x87, 0xa1, 0x47, 0x35, 0x94, 0xdd, 0x9c, 0xdb, 0x14, 0xc8, 0x7b, 0xbf, 0x92, 0x23, 0x7e}, - y: fp384{0xe8, 0x74, 0x8f, 0x6c, 0xc0, 0x93, 0x41, 0x91, 0x4d, 0xc0, 0x67, 0x1d, 0x21, 0xdc, 0xed, 0xff, 0x93, 0x86, 0xd6, 0xa, 0x85, 0x41, 0xef, 0x1f, 0x54, 0x80, 0x3e, 0xf5, 0x9a, 0x1d, 0x3e, 0xa7, 0x4, 0xc1, 0xe, 0x42, 0x6f, 0x65, 0x9b, 0x90, 0xde, 0xe1, 0x2, 0x17, 0x36, 0x2d, 0x87, 0x73}, - }, - // 103P - { - x: fp384{0x5f, 0x5d, 0x35, 0x21, 0xaa, 0xab, 0x4c, 0xd2, 0xbd, 0x2, 0xd4, 0xaf, 0xe, 0xb1, 0xcb, 0xdd, 0xe1, 0x1d, 0xc2, 0x29, 0x43, 0xd1, 0xf0, 0xd3, 0xfc, 0x84, 0x3d, 0xf2, 0x94, 0x5a, 0xd9, 0x1a, 0xd, 0x53, 0xda, 0xe3, 0x2, 0x79, 0x3a, 0x11, 0x48, 0x10, 0x67, 0x64, 0x8e, 0xa8, 0xd, 0x59}, - y: fp384{0xda, 0xf0, 0x5b, 0x92, 0x82, 0x82, 0xa5, 0xf4, 0xb, 0x6e, 0x2e, 0xe6, 0xe7, 0xe4, 0x52, 0x1a, 0xfd, 0x4d, 0x6f, 0xd8, 0x4e, 0xbb, 0xeb, 0x97, 0xc3, 0xd1, 0xfa, 0x58, 0xc3, 0xd1, 0x1b, 0x60, 0x52, 0x5, 0xe4, 0x2d, 0xa6, 0xd5, 0xe2, 0xd6, 0xed, 0xdb, 0x73, 0x72, 0x37, 0x71, 0x9e, 0xc}, - }, - // 105P - { - x: fp384{0x45, 0x28, 0x80, 0xe5, 0x85, 0x19, 0xe9, 0xe6, 0xbc, 0x1, 0xe2, 0xa6, 0xae, 0xd6, 0x67, 0xc3, 0xbe, 0x23, 0x2c, 0xdd, 0xe5, 0x30, 0x7f, 0x7, 0xe3, 0x75, 0x50, 0x27, 0x9c, 0xf3, 0x2e, 0x86, 0x42, 0x65, 0x80, 0x1a, 0x44, 0x75, 0x2c, 0x2, 0x9c, 0xd0, 0xeb, 0x99, 0x3a, 0x3e, 0xab, 0xd0}, - y: fp384{0xb8, 0x28, 0x90, 0xd9, 0x60, 0xef, 0x67, 0x7d, 0x6b, 0x13, 0xad, 0xa9, 0x4f, 0x36, 0xcf, 0xa5, 0x8c, 0xff, 0x1f, 0xa9, 0xa9, 0x23, 0x2c, 0x37, 0x60, 0x25, 0x20, 0x47, 0x95, 0x7a, 0xd5, 0xd3, 0x23, 0x19, 0x2f, 0x15, 0x45, 0xf1, 0xba, 0xce, 0xa5, 0x73, 0x89, 0x6d, 0x2c, 0xe7, 0x3a, 0xcc}, - }, - // 107P - { - x: fp384{0x23, 0x3f, 0x36, 0xf4, 0xe1, 0xe8, 0x18, 0xd7, 0x90, 0x14, 0x76, 0x4f, 0x20, 0x1e, 0xc2, 0x73, 0x46, 0x5d, 0x7, 0xa0, 0x25, 0xec, 0xc6, 0x27, 0xd0, 0x40, 0x3f, 0x75, 0x56, 0xf4, 0xd4, 0xcc, 0x22, 0x16, 0xa9, 0x60, 0x49, 0x4c, 0x99, 0x50, 0x48, 0xb, 0x74, 0x3f, 0x79, 0x4d, 0x96, 0x77}, - y: fp384{0x2, 0xed, 0x47, 0xf6, 0xe2, 0x55, 0xc9, 0xf4, 0x79, 0x3d, 0x19, 0xe4, 0x9a, 0xc7, 0x4f, 0x84, 0x9f, 0x3f, 0x7f, 0xa2, 0xd1, 0x74, 0x83, 0x48, 0x63, 0x94, 0x65, 0xb8, 0x45, 0xad, 0xd6, 0x95, 0x39, 0x8e, 0x43, 0xc7, 0x78, 0x9f, 0xd9, 0xe1, 0xf2, 0xed, 0xfc, 0x2a, 0x17, 0xa7, 0x82, 0x51}, - }, - // 109P - { - x: fp384{0xfa, 0xb1, 0xde, 0xb2, 0x27, 0x2e, 0xfc, 0xe, 0x4b, 0x18, 0xc1, 0x3c, 0x83, 0x35, 0x7d, 0x9c, 0xc8, 0xbd, 0xdc, 0xa8, 0xf8, 0xc5, 0x41, 0x58, 0xbb, 0x3a, 0xd9, 0xf0, 0x8a, 0xa5, 0x11, 0xa9, 0x87, 0xf8, 0xcf, 0xb9, 0x33, 0x8c, 0xd1, 0x3c, 0x3, 0x24, 0x3f, 0xf1, 0xbb, 0x27, 0x3c, 0x6e}, - y: fp384{0xe6, 0x3a, 0x53, 0xea, 0x12, 0x17, 0x39, 0x5b, 0x5, 0x4c, 0x29, 0x54, 0xb, 0xd9, 0xcd, 0x35, 0xf4, 0xda, 0x60, 0xf5, 0xb4, 0x7f, 0xb5, 0x2d, 0x1d, 0x41, 0xa1, 0xf5, 0xca, 0x33, 0xad, 0x75, 0x68, 0x75, 0x7c, 0x7f, 0x4e, 0x9a, 0xe1, 0x87, 0x5, 0x77, 0x8c, 0x19, 0x56, 0x6c, 0xc4, 0xf4}, - }, - // 111P - { - x: fp384{0xb8, 0x74, 0xbe, 0x5, 0x48, 0xb7, 0xb3, 0x8d, 0xab, 0x5f, 0x76, 0x0, 0x50, 0x80, 0xe0, 0x8, 0xd9, 0x7f, 0x44, 0x50, 0xb, 0x72, 0x44, 0x67, 0x3, 0xbe, 0x27, 0xc7, 0x12, 0x20, 0x55, 0x27, 0x7f, 0x66, 0x2, 0x8b, 0x51, 0x7b, 0x90, 0xc3, 0x14, 0xef, 0xbd, 0xb9, 0xbc, 0xaa, 0x58, 0xa1}, - y: fp384{0x6f, 0xc5, 0x9c, 0xf4, 0x3, 0xfa, 0xdd, 0xaa, 0x96, 0xfb, 0x5, 0xe3, 0xe4, 0xbe, 0x95, 0x10, 0x19, 0x26, 0xc3, 0x93, 0xbc, 0x54, 0xff, 0xa2, 0x85, 0x26, 0xeb, 0x4a, 0xf9, 0xe1, 0xf8, 0xcc, 0xfe, 0xd9, 0x0, 0x23, 0xb8, 0x47, 0x4b, 0xc6, 0xa9, 0x9d, 0x27, 0x8, 0x68, 0x77, 0xca, 0x9}, - }, - // 113P - { - x: fp384{0x12, 0xda, 0xb, 0x9b, 0xb7, 0x86, 0x5b, 0xf8, 0x72, 0x35, 0xe3, 0xbb, 0xd1, 0x16, 0xc6, 0xd2, 0x7f, 0xd2, 0x2b, 0x85, 0xef, 0x15, 0x22, 0xe7, 0xc5, 0x7f, 0x9b, 0x13, 0x9, 0x5b, 0x81, 0xe9, 0xc2, 0xa0, 0x7f, 0x8d, 0x4, 0xdb, 0x5b, 0x4a, 0x86, 0xa9, 0x86, 0xff, 0x17, 0xcd, 0x9f, 0x86}, - y: fp384{0xbe, 0xf6, 0xda, 0x91, 0x17, 0x52, 0x78, 0x32, 0x4, 0x4d, 0x66, 0xd6, 0xf1, 0x7, 0xc0, 0xb9, 0x29, 0x20, 0xb1, 0xe7, 0x2a, 0x72, 0x98, 0x69, 0x67, 0xbb, 0x31, 0xfc, 0xd9, 0xde, 0x7f, 0xbf, 0x57, 0x77, 0xb8, 0x31, 0x7c, 0xd1, 0xe, 0x3d, 0x4b, 0x94, 0xf7, 0x55, 0xf2, 0x3d, 0xb, 0xa1}, - }, - // 115P - { - x: fp384{0x56, 0x8f, 0x49, 0x34, 0x3b, 0x67, 0x4e, 0xaa, 0x6d, 0x45, 0x43, 0xa0, 0xb3, 0xf7, 0x20, 0x91, 0x26, 0x88, 0xa4, 0x26, 0xf3, 0x68, 0xe8, 0x33, 0xfd, 0x6b, 0x40, 0x32, 0xf4, 0xcc, 0x7a, 0xa9, 0x46, 0x7, 0xc5, 0x23, 0x41, 0x2a, 0x44, 0x84, 0x2d, 0x98, 0x50, 0x73, 0x65, 0x69, 0x4c, 0x27}, - y: fp384{0xaa, 0x9e, 0xdc, 0x95, 0xfb, 0xb7, 0x6, 0x31, 0x41, 0xe2, 0x7a, 0xec, 0xb1, 0x1d, 0xbf, 0x3e, 0x86, 0x5b, 0x8a, 0x84, 0xb8, 0x39, 0xdc, 0x0, 0xc6, 0x2e, 0x31, 0xf6, 0x3a, 0x34, 0x9a, 0xdf, 0x3, 0x1f, 0x12, 0xcf, 0x32, 0x9e, 0x2, 0x75, 0xdb, 0x11, 0x5a, 0xcf, 0xf6, 0xbd, 0xc5, 0xc0}, - }, - // 117P - { - x: fp384{0x9a, 0x55, 0x23, 0x7, 0xa8, 0xe7, 0xcc, 0xfd, 0x70, 0xd0, 0x29, 0xa2, 0xe, 0xb3, 0x32, 0x95, 0x61, 0x79, 0x85, 0xfe, 0x94, 0x52, 0x3e, 0x61, 0x8d, 0x73, 0xea, 0x9a, 0x9a, 0x74, 0x9e, 0xad, 0x53, 0xba, 0xac, 0x23, 0xae, 0x6b, 0x7a, 0x51, 0x8b, 0x56, 0x23, 0x78, 0xcd, 0x74, 0x67, 0xf2}, - y: fp384{0x4d, 0x11, 0x53, 0xae, 0xa1, 0x67, 0x7, 0x94, 0x7b, 0x5, 0x8c, 0xeb, 0x4b, 0x3a, 0xcb, 0xc6, 0x0, 0xf6, 0xae, 0x6, 0x5f, 0xc0, 0x99, 0x6d, 0x81, 0x84, 0x79, 0xb2, 0x8d, 0x9b, 0x72, 0xa6, 0x5b, 0x58, 0xf1, 0xbf, 0x82, 0x65, 0x54, 0x7a, 0x73, 0x97, 0xb0, 0x82, 0xb0, 0x9a, 0x50, 0x70}, - }, - // 119P - { - x: fp384{0xd1, 0xd8, 0x29, 0x73, 0xac, 0x95, 0x25, 0x73, 0xc4, 0xbc, 0x73, 0xab, 0x8d, 0x7, 0xf9, 0x59, 0xde, 0x9d, 0xcf, 0x21, 0xb4, 0xe7, 0x55, 0xcd, 0x27, 0xab, 0x5f, 0x87, 0xa1, 0xb, 0x63, 0xa4, 0xcd, 0xf4, 0x9c, 0xec, 0xb8, 0x7f, 0x16, 0x13, 0x77, 0x5, 0x8b, 0x99, 0x57, 0x5c, 0xfc, 0xd2}, - y: fp384{0x6f, 0x1b, 0xf5, 0x5f, 0xc1, 0x60, 0x13, 0x76, 0xeb, 0x9c, 0xcf, 0x6, 0xf2, 0x96, 0xdb, 0xb2, 0x46, 0x8f, 0xdc, 0x99, 0x48, 0xa6, 0x77, 0xd6, 0xe5, 0xb7, 0x9, 0x91, 0xbc, 0xca, 0x9e, 0xeb, 0xa3, 0xb7, 0x21, 0x92, 0xac, 0xb1, 0x1b, 0x9a, 0xcd, 0xa5, 0x40, 0x8a, 0x28, 0x36, 0x65, 0xb1}, - }, - // 121P - { - x: fp384{0x8d, 0xfa, 0x9d, 0x18, 0x40, 0xba, 0x98, 0x51, 0x1e, 0xab, 0x96, 0xa8, 0xe3, 0x16, 0x9a, 0x8c, 0xe4, 0x44, 0x67, 0xba, 0xd6, 0xd5, 0x33, 0x6c, 0x8a, 0x77, 0x72, 0x77, 0xd4, 0xfb, 0x9a, 0xc2, 0xe0, 0xf7, 0x29, 0x93, 0x95, 0x3c, 0xdf, 0x65, 0x81, 0xdb, 0x91, 0x38, 0x1e, 0x3f, 0xcd, 0x79}, - y: fp384{0x9b, 0x1, 0x84, 0xd7, 0xb, 0x8f, 0xaa, 0xca, 0x62, 0x8e, 0x2, 0xe9, 0x6b, 0x4f, 0x40, 0xf5, 0x85, 0x89, 0x4d, 0xae, 0x54, 0x7a, 0x50, 0x95, 0x1b, 0xf2, 0x16, 0xb7, 0xa8, 0x39, 0x1d, 0x9c, 0x7e, 0x5b, 0x26, 0xf8, 0xf9, 0xd, 0x3d, 0x47, 0x16, 0x9, 0x4d, 0xc6, 0xa1, 0xed, 0xae, 0x11}, - }, - // 123P - { - x: fp384{0x80, 0xb, 0x4c, 0xc, 0x48, 0x98, 0x11, 0x15, 0xfe, 0x18, 0x10, 0x2a, 0x4a, 0x7d, 0xb0, 0x46, 0x7b, 0x90, 0x80, 0xea, 0xeb, 0xc3, 0xa9, 0x14, 0x5, 0x44, 0x95, 0x42, 0xee, 0x5, 0x3d, 0x4b, 0xd2, 0x18, 0x4, 0x55, 0x78, 0xfd, 0xd6, 0xd4, 0xa6, 0x82, 0xdc, 0x21, 0x63, 0x4f, 0x4a, 0x8e}, - y: fp384{0xd9, 0xb9, 0x78, 0xa1, 0xf7, 0xd7, 0xe4, 0x1b, 0x9f, 0x8c, 0x78, 0x70, 0x4, 0xba, 0xc6, 0x83, 0xe8, 0xf7, 0x30, 0x9f, 0x3e, 0xaf, 0x82, 0x5a, 0x7b, 0x44, 0x8f, 0x49, 0xf, 0xab, 0x86, 0x8a, 0x33, 0xcf, 0x5c, 0xc2, 0xec, 0xbc, 0xba, 0x3, 0xdd, 0x8a, 0x79, 0x1a, 0xed, 0x62, 0xc4, 0x74}, - }, - // 125P - { - x: fp384{0xbb, 0x44, 0xfb, 0x3c, 0xbc, 0xb8, 0x12, 0x96, 0xda, 0x6a, 0x9d, 0x71, 0x77, 0x56, 0xf2, 0x70, 0xe2, 0x14, 0xf6, 0x46, 0xaa, 0x65, 0xea, 0x50, 0x6d, 0x35, 0x50, 0x34, 0xcf, 0xa8, 0x36, 0x94, 0xac, 0x3, 0x67, 0x3, 0xad, 0xeb, 0xd6, 0x7a, 0xae, 0x48, 0xcf, 0x45, 0xb2, 0xda, 0xb2, 0x3}, - y: fp384{0x1e, 0x6, 0x17, 0x41, 0x2a, 0x3d, 0x95, 0x21, 0xa4, 0x55, 0x4f, 0xed, 0x30, 0xb7, 0x3f, 0xdf, 0x8e, 0xab, 0x19, 0xe1, 0x41, 0x36, 0xf5, 0xec, 0xaa, 0x87, 0x91, 0x21, 0xbc, 0x41, 0x1f, 0x55, 0x2, 0x58, 0x9, 0xb0, 0x4b, 0xa7, 0xd5, 0x7c, 0xcb, 0x5c, 0xf3, 0x72, 0xf5, 0xbf, 0x33, 0x89}, - }, - // 127P - { - x: fp384{0xec, 0x1, 0xa1, 0xec, 0x46, 0x32, 0x75, 0xf7, 0xaf, 0x4, 0x96, 0x56, 0x4c, 0xfa, 0xac, 0x2a, 0x79, 0x62, 0x2c, 0x52, 0x34, 0x8f, 0xf2, 0xee, 0xf, 0x1e, 0x23, 0x74, 0x38, 0xe6, 0xfd, 0x96, 0x9d, 0xf0, 0xe0, 0xd6, 0x1b, 0xb1, 0x2b, 0xa9, 0xb4, 0x5d, 0x39, 0xf, 0x74, 0x4e, 0xe3, 0xbb}, - y: fp384{0xf9, 0x3c, 0x94, 0xbf, 0xdd, 0x59, 0x6e, 0xaa, 0xaa, 0xd5, 0x8a, 0x1, 0xbe, 0xbd, 0x98, 0x56, 0x19, 0xc5, 0x67, 0xa4, 0x44, 0x2a, 0xd2, 0x88, 0xe, 0xb, 0x18, 0xad, 0x39, 0xe3, 0x29, 0x9e, 0x94, 0x2f, 0x7b, 0x36, 0x2e, 0x83, 0xd6, 0xf3, 0x69, 0x80, 0x94, 0xe3, 0x61, 0x2a, 0xe9, 0xc7}, - }, -} diff --git a/expander/expander.go b/expander/expander.go deleted file mode 100644 index 14309007..00000000 --- a/expander/expander.go +++ /dev/null @@ -1,147 +0,0 @@ -// Package expander generates arbitrary bytes from an XOF or Hash function. -package expander - -import ( - "crypto" - "encoding/binary" - "errors" - "io" - - "github.com/quantumcoinproject/circl/xof" -) - -type Expander interface { - // Expand generates a pseudo-random byte string of a determined length by - // expanding an input string. - Expand(in []byte, length uint) (pseudo []byte) -} - -type expanderMD struct { - h crypto.Hash - dst []byte -} - -// NewExpanderMD returns a hash function based on a Merkle-Damgård hash function. -func NewExpanderMD(h crypto.Hash, dst []byte) *expanderMD { - return &expanderMD{h, dst} -} - -func (e *expanderMD) calcDSTPrime() []byte { - var dstPrime []byte - if l := len(e.dst); l > maxDSTLength { - H := e.h.New() - mustWrite(H, longDSTPrefix[:]) - mustWrite(H, e.dst) - dstPrime = H.Sum(nil) - } else { - dstPrime = make([]byte, l, l+1) - copy(dstPrime, e.dst) - } - return append(dstPrime, byte(len(dstPrime))) -} - -func (e *expanderMD) Expand(in []byte, n uint) []byte { - H := e.h.New() - bLen := uint(H.Size()) - ell := (n + (bLen - 1)) / bLen - if ell > 255 { - panic(errorLongOutput) - } - - zPad := make([]byte, H.BlockSize()) - libStr := []byte{0, 0} - libStr[0] = byte((n >> 8) & 0xFF) - libStr[1] = byte(n & 0xFF) - dstPrime := e.calcDSTPrime() - - mustWrite(H, zPad) - mustWrite(H, in) - mustWrite(H, libStr) - mustWrite(H, []byte{0}) - mustWrite(H, dstPrime) - b0 := H.Sum(nil) - - H.Reset() - mustWrite(H, b0) - mustWrite(H, []byte{1}) - mustWrite(H, dstPrime) - bi := H.Sum(nil) - pseudo := append([]byte{}, bi...) - for i := uint(2); i <= ell; i++ { - H.Reset() - for i := range b0 { - bi[i] ^= b0[i] - } - mustWrite(H, bi) - mustWrite(H, []byte{byte(i)}) - mustWrite(H, dstPrime) - bi = H.Sum(nil) - pseudo = append(pseudo, bi...) - } - return pseudo[0:n] -} - -// expanderXOF is based on an extendable output function. -type expanderXOF struct { - id xof.ID - kSecLevel uint - dst []byte -} - -// NewExpanderXOF returns an Expander based on an extendable output function. -// The kSecLevel parameter is the target security level in bits, and dst is -// a domain separation string. -func NewExpanderXOF(id xof.ID, kSecLevel uint, dst []byte) *expanderXOF { - return &expanderXOF{id, kSecLevel, dst} -} - -// Expand panics if output's length is longer than 2^16 bytes. -func (e *expanderXOF) Expand(in []byte, n uint) []byte { - bLen := []byte{0, 0} - binary.BigEndian.PutUint16(bLen, uint16(n)) - pseudo := make([]byte, n) - dstPrime := e.calcDSTPrime() - - H := e.id.New() - mustWrite(H, in) - mustWrite(H, bLen) - mustWrite(H, dstPrime) - mustReadFull(H, pseudo) - return pseudo -} - -func (e *expanderXOF) calcDSTPrime() []byte { - var dstPrime []byte - if l := len(e.dst); l > maxDSTLength { - H := e.id.New() - mustWrite(H, longDSTPrefix[:]) - mustWrite(H, e.dst) - max := ((2 * e.kSecLevel) + 7) / 8 - dstPrime = make([]byte, max, max+1) - mustReadFull(H, dstPrime) - } else { - dstPrime = make([]byte, l, l+1) - copy(dstPrime, e.dst) - } - return append(dstPrime, byte(len(dstPrime))) -} - -func mustWrite(w io.Writer, b []byte) { - if n, err := w.Write(b); err != nil || n != len(b) { - panic(err) - } -} - -func mustReadFull(r io.Reader, b []byte) { - if n, err := io.ReadFull(r, b); err != nil || n != len(b) { - panic(err) - } -} - -const maxDSTLength = 255 - -var ( - longDSTPrefix = [17]byte{'H', '2', 'C', '-', 'O', 'V', 'E', 'R', 'S', 'I', 'Z', 'E', '-', 'D', 'S', 'T', '-'} - - errorLongOutput = errors.New("requested too many bytes") -) diff --git a/expander/expander_test.go b/expander/expander_test.go deleted file mode 100644 index 86893319..00000000 --- a/expander/expander_test.go +++ /dev/null @@ -1,115 +0,0 @@ -package expander_test - -import ( - "bytes" - "crypto" - _ "crypto/sha256" - _ "crypto/sha512" - "encoding/hex" - "encoding/json" - "fmt" - "os" - "path/filepath" - "strconv" - "testing" - - "github.com/quantumcoinproject/circl/expander" - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/xof" -) - -func TestExpander(t *testing.T) { - fileNames, err := filepath.Glob("./testdata/*.json") - if err != nil { - t.Fatal(err) - } - - for _, fileName := range fileNames { - f, err := os.Open(fileName) - if err != nil { - t.Fatal(err) - } - dec := json.NewDecoder(f) - var v vectorExpanderSuite - err = dec.Decode(&v) - if err != nil { - t.Fatal(err) - } - f.Close() - - t.Run(v.Name+"/"+v.Hash, func(t *testing.T) { testExpander(t, &v) }) - } -} - -func testExpander(t *testing.T, vs *vectorExpanderSuite) { - var exp expander.Expander - switch vs.Hash { - case "SHA256": - exp = expander.NewExpanderMD(crypto.SHA256, []byte(vs.DST)) - case "SHA512": - exp = expander.NewExpanderMD(crypto.SHA512, []byte(vs.DST)) - case "SHAKE128": - exp = expander.NewExpanderXOF(xof.SHAKE128, vs.K, []byte(vs.DST)) - case "SHAKE256": - exp = expander.NewExpanderXOF(xof.SHAKE256, vs.K, []byte(vs.DST)) - default: - t.Skip("hash not supported: " + vs.Hash) - } - - for i, v := range vs.Tests { - lenBytes, err := strconv.ParseUint(v.Len, 0, 64) - if err != nil { - t.Fatal(err) - } - - got := exp.Expand([]byte(v.Msg), uint(lenBytes)) - want, err := hex.DecodeString(v.UniformBytes) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(got, want) { - test.ReportError(t, got, want, i) - } - } -} - -type vectorExpanderSuite struct { - DST string `json:"DST"` - Hash string `json:"hash"` - Name string `json:"name"` - K uint `json:"k"` - Tests []struct { - DstPrime string `json:"DST_prime"` - Len string `json:"len_in_bytes"` - Msg string `json:"msg"` - MsgPrime string `json:"msg_prime"` - UniformBytes string `json:"uniform_bytes"` - } `json:"tests"` -} - -func BenchmarkExpander(b *testing.B) { - in := []byte("input") - dst := []byte("dst") - - for _, v := range []struct { - Name string - Exp expander.Expander - }{ - {"XMD", expander.NewExpanderMD(crypto.SHA256, dst)}, - {"XOF", expander.NewExpanderXOF(xof.SHAKE128, 0, dst)}, - } { - exp := v.Exp - for l := 8; l <= 10; l++ { - max := int64(1) << uint(l) - - b.Run(fmt.Sprintf("%v/%v", v.Name, max), func(b *testing.B) { - b.SetBytes(max) - b.ResetTimer() - for i := 0; i < b.N; i++ { - exp.Expand(in, uint(max)) - } - }) - } - } -} diff --git a/expander/testdata/expand_message_xmd_SHA256_256.json b/expander/testdata/expand_message_xmd_SHA256_256.json deleted file mode 100644 index b5e2aa3f..00000000 --- a/expander/testdata/expand_message_xmd_SHA256_256.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "DST": "QUUX-V01-CS02-with-expander-SHA256-128-long-DST-1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", - "hash": "SHA256", - "k": 128, - "name": "expand_message_xmd", - "tests": [ - { - "DST_prime": "412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "len_in_bytes": "0x20", - "msg": "", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "uniform_bytes": "e8dc0c8b686b7ef2074086fbdd2f30e3f8bfbd3bdf177f73f04b97ce618a3ed3" - }, - { - "DST_prime": "412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "len_in_bytes": "0x20", - "msg": "abc", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616263002000412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "uniform_bytes": "52dbf4f36cf560fca57dedec2ad924ee9c266341d8f3d6afe5171733b16bbb12" - }, - { - "DST_prime": "412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "len_in_bytes": "0x20", - "msg": "abcdef0123456789", - "msg_prime": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061626364656630313233343536373839002000412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "uniform_bytes": "35387dcf22618f3728e6c686490f8b431f76550b0b2c61cbc1ce7001536f4521" - }, - { - "DST_prime": "412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "len_in_bytes": "0x20", - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713132385f7171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171002000412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "uniform_bytes": "01b637612bb18e840028be900a833a74414140dde0c4754c198532c3a0ba42bc" - }, - { - "DST_prime": "412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "len_in_bytes": "0x20", - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613531325f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161002000412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "uniform_bytes": "20cce7033cabc5460743180be6fa8aac5a103f56d481cf369a8accc0c374431b" - }, - { - "DST_prime": "412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "len_in_bytes": "0x80", - "msg": "", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "uniform_bytes": "14604d85432c68b757e485c8894db3117992fc57e0e136f71ad987f789a0abc287c47876978e2388a02af86b1e8d1342e5ce4f7aaa07a87321e691f6fba7e0072eecc1218aebb89fb14a0662322d5edbd873f0eb35260145cd4e64f748c5dfe60567e126604bcab1a3ee2dc0778102ae8a5cfd1429ebc0fa6bf1a53c36f55dfc" - }, - { - "DST_prime": "412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "len_in_bytes": "0x80", - "msg": "abc", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616263008000412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "uniform_bytes": "1a30a5e36fbdb87077552b9d18b9f0aee16e80181d5b951d0471d55b66684914aef87dbb3626eaabf5ded8cd0686567e503853e5c84c259ba0efc37f71c839da2129fe81afdaec7fbdc0ccd4c794727a17c0d20ff0ea55e1389d6982d1241cb8d165762dbc39fb0cee4474d2cbbd468a835ae5b2f20e4f959f56ab24cd6fe267" - }, - { - "DST_prime": "412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "len_in_bytes": "0x80", - "msg": "abcdef0123456789", - "msg_prime": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061626364656630313233343536373839008000412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "uniform_bytes": "d2ecef3635d2397f34a9f86438d772db19ffe9924e28a1caf6f1c8f15603d4028f40891044e5c7e39ebb9b31339979ff33a4249206f67d4a1e7c765410bcd249ad78d407e303675918f20f26ce6d7027ed3774512ef5b00d816e51bfcc96c3539601fa48ef1c07e494bdc37054ba96ecb9dbd666417e3de289d4f424f502a982" - }, - { - "DST_prime": "412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "len_in_bytes": "0x80", - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713132385f7171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171008000412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "uniform_bytes": "ed6e8c036df90111410431431a232d41a32c86e296c05d426e5f44e75b9a50d335b2412bc6c91e0a6dc131de09c43110d9180d0a70f0d6289cb4e43b05f7ee5e9b3f42a1fad0f31bac6a625b3b5c50e3a83316783b649e5ecc9d3b1d9471cb5024b7ccf40d41d1751a04ca0356548bc6e703fca02ab521b505e8e45600508d32" - }, - { - "DST_prime": "412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "len_in_bytes": "0x80", - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613531325f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161008000412717974da474d0f8c420f320ff81e8432adb7c927d9bd082b4fb4d16c0a23620", - "uniform_bytes": "78b53f2413f3c688f07732c10e5ced29a17c6a16f717179ffbe38d92d6c9ec296502eb9889af83a1928cd162e845b0d3c5424e83280fed3d10cffb2f8431f14e7a23f4c68819d40617589e4c41169d0b56e0e3535be1fd71fbb08bb70c5b5ffed953d6c14bf7618b35fc1f4c4b30538236b4b08c9fbf90462447a8ada60be495" - } - ] -} diff --git a/expander/testdata/expand_message_xmd_SHA256_38.json b/expander/testdata/expand_message_xmd_SHA256_38.json deleted file mode 100644 index e6a8c748..00000000 --- a/expander/testdata/expand_message_xmd_SHA256_38.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "DST": "QUUX-V01-CS02-with-expander-SHA256-128", - "hash": "SHA256", - "k": 128, - "name": "expand_message_xmd", - "tests": [ - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "len_in_bytes": "0x20", - "msg": "", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "uniform_bytes": "68a985b87eb6b46952128911f2a4412bbc302a9d759667f87f7a21d803f07235" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "len_in_bytes": "0x20", - "msg": "abc", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616263002000515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "uniform_bytes": "d8ccab23b5985ccea865c6c97b6e5b8350e794e603b4b97902f53a8a0d605615" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "len_in_bytes": "0x20", - "msg": "abcdef0123456789", - "msg_prime": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061626364656630313233343536373839002000515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "uniform_bytes": "eff31487c770a893cfb36f912fbfcbff40d5661771ca4b2cb4eafe524333f5c1" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "len_in_bytes": "0x20", - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713132385f7171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171002000515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "uniform_bytes": "b23a1d2b4d97b2ef7785562a7e8bac7eed54ed6e97e29aa51bfe3f12ddad1ff9" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "len_in_bytes": "0x20", - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613531325f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161002000515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "uniform_bytes": "4623227bcc01293b8c130bf771da8c298dede7383243dc0993d2d94823958c4c" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "len_in_bytes": "0x80", - "msg": "", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "uniform_bytes": "af84c27ccfd45d41914fdff5df25293e221afc53d8ad2ac06d5e3e29485dadbee0d121587713a3e0dd4d5e69e93eb7cd4f5df4cd103e188cf60cb02edc3edf18eda8576c412b18ffb658e3dd6ec849469b979d444cf7b26911a08e63cf31f9dcc541708d3491184472c2c29bb749d4286b004ceb5ee6b9a7fa5b646c993f0ced" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "len_in_bytes": "0x80", - "msg": "abc", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616263008000515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "uniform_bytes": "abba86a6129e366fc877aab32fc4ffc70120d8996c88aee2fe4b32d6c7b6437a647e6c3163d40b76a73cf6a5674ef1d890f95b664ee0afa5359a5c4e07985635bbecbac65d747d3d2da7ec2b8221b17b0ca9dc8a1ac1c07ea6a1e60583e2cb00058e77b7b72a298425cd1b941ad4ec65e8afc50303a22c0f99b0509b4c895f40" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "len_in_bytes": "0x80", - "msg": "abcdef0123456789", - "msg_prime": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061626364656630313233343536373839008000515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "uniform_bytes": "ef904a29bffc4cf9ee82832451c946ac3c8f8058ae97d8d629831a74c6572bd9ebd0df635cd1f208e2038e760c4994984ce73f0d55ea9f22af83ba4734569d4bc95e18350f740c07eef653cbb9f87910d833751825f0ebefa1abe5420bb52be14cf489b37fe1a72f7de2d10be453b2c9d9eb20c7e3f6edc5a60629178d9478df" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "len_in_bytes": "0x80", - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713132385f7171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171008000515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "uniform_bytes": "80be107d0884f0d881bb460322f0443d38bd222db8bd0b0a5312a6fedb49c1bbd88fd75d8b9a09486c60123dfa1d73c1cc3169761b17476d3c6b7cbbd727acd0e2c942f4dd96ae3da5de368d26b32286e32de7e5a8cb2949f866a0b80c58116b29fa7fabb3ea7d520ee603e0c25bcaf0b9a5e92ec6a1fe4e0391d1cdbce8c68a" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "len_in_bytes": "0x80", - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "msg_prime": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613531325f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161008000515555582d5630312d435330322d776974682d657870616e6465722d5348413235362d31323826", - "uniform_bytes": "546aff5444b5b79aa6148bd81728704c32decb73a3ba76e9e75885cad9def1d06d6792f8a7d12794e90efed817d96920d728896a4510864370c207f99bd4a608ea121700ef01ed879745ee3e4ceef777eda6d9e5e38b90c86ea6fb0b36504ba4a45d22e86f6db5dd43d98a294bebb9125d5b794e9d2a81181066eb954966a487" - } - ] -} diff --git a/expander/testdata/expand_message_xmd_SHA512_38.json b/expander/testdata/expand_message_xmd_SHA512_38.json deleted file mode 100644 index 18dadd1b..00000000 --- a/expander/testdata/expand_message_xmd_SHA512_38.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "DST": "QUUX-V01-CS02-with-expander-SHA512-256", - "hash": "SHA512", - "k": 256, - "name": "expand_message_xmd", - "tests": [ - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "len_in_bytes": "0x20", - "msg": "", - "msg_prime": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "uniform_bytes": "6b9a7312411d92f921c6f68ca0b6380730a1a4d982c507211a90964c394179ba" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "len_in_bytes": "0x20", - "msg": "abc", - "msg_prime": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616263002000515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "uniform_bytes": "0da749f12fbe5483eb066a5f595055679b976e93abe9be6f0f6318bce7aca8dc" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "len_in_bytes": "0x20", - "msg": "abcdef0123456789", - "msg_prime": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061626364656630313233343536373839002000515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "uniform_bytes": "087e45a86e2939ee8b91100af1583c4938e0f5fc6c9db4b107b83346bc967f58" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "len_in_bytes": "0x20", - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "msg_prime": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713132385f7171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171002000515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "uniform_bytes": "7336234ee9983902440f6bc35b348352013becd88938d2afec44311caf8356b3" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "len_in_bytes": "0x20", - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "msg_prime": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613531325f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161002000515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "uniform_bytes": "57b5f7e766d5be68a6bfe1768e3c2b7f1228b3e4b3134956dd73a59b954c66f4" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "len_in_bytes": "0x80", - "msg": "", - "msg_prime": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "uniform_bytes": "41b037d1734a5f8df225dd8c7de38f851efdb45c372887be655212d07251b921b052b62eaed99b46f72f2ef4cc96bfaf254ebbbec091e1a3b9e4fb5e5b619d2e0c5414800a1d882b62bb5cd1778f098b8eb6cb399d5d9d18f5d5842cf5d13d7eb00a7cff859b605da678b318bd0e65ebff70bec88c753b159a805d2c89c55961" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "len_in_bytes": "0x80", - "msg": "abc", - "msg_prime": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616263008000515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "uniform_bytes": "7f1dddd13c08b543f2e2037b14cefb255b44c83cc397c1786d975653e36a6b11bdd7732d8b38adb4a0edc26a0cef4bb45217135456e58fbca1703cd6032cb1347ee720b87972d63fbf232587043ed2901bce7f22610c0419751c065922b488431851041310ad659e4b23520e1772ab29dcdeb2002222a363f0c2b1c972b3efe1" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "len_in_bytes": "0x80", - "msg": "abcdef0123456789", - "msg_prime": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061626364656630313233343536373839008000515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "uniform_bytes": "3f721f208e6199fe903545abc26c837ce59ac6fa45733f1baaf0222f8b7acb0424814fcb5eecf6c1d38f06e9d0a6ccfbf85ae612ab8735dfdf9ce84c372a77c8f9e1c1e952c3a61b7567dd0693016af51d2745822663d0c2367e3f4f0bed827feecc2aaf98c949b5ed0d35c3f1023d64ad1407924288d366ea159f46287e61ac" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "len_in_bytes": "0x80", - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "msg_prime": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713132385f7171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171008000515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "uniform_bytes": "b799b045a58c8d2b4334cf54b78260b45eec544f9f2fb5bd12fb603eaee70db7317bf807c406e26373922b7b8920fa29142703dd52bdf280084fb7ef69da78afdf80b3586395b433dc66cde048a258e476a561e9deba7060af40adf30c64249ca7ddea79806ee5beb9a1422949471d267b21bc88e688e4014087a0b592b695ed" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "len_in_bytes": "0x80", - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "msg_prime": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613531325f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161008000515555582d5630312d435330322d776974682d657870616e6465722d5348413531322d32353626", - "uniform_bytes": "05b0bfef265dcee87654372777b7c44177e2ae4c13a27f103340d9cd11c86cb2426ffcad5bd964080c2aee97f03be1ca18e30a1f14e27bc11ebbd650f305269cc9fb1db08bf90bfc79b42a952b46daf810359e7bc36452684784a64952c343c52e5124cd1f71d474d5197fefc571a92929c9084ffe1112cf5eea5192ebff330b" - } - ] -} diff --git a/expander/testdata/expand_message_xof_SHAKE128_256.json b/expander/testdata/expand_message_xof_SHAKE128_256.json deleted file mode 100644 index e750a805..00000000 --- a/expander/testdata/expand_message_xof_SHAKE128_256.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "DST": "QUUX-V01-CS02-with-expander-SHAKE128-long-DST-111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", - "hash": "SHAKE128", - "k": 128, - "name": "expand_message_xof", - "tests": [ - { - "DST_prime": "acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "len_in_bytes": "0x20", - "msg": "", - "msg_prime": "0020acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "uniform_bytes": "827c6216330a122352312bccc0c8d6e7a146c5257a776dbd9ad9d75cd880fc53" - }, - { - "DST_prime": "acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "len_in_bytes": "0x20", - "msg": "abc", - "msg_prime": "6162630020acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "uniform_bytes": "690c8d82c7213b4282c6cb41c00e31ea1d3e2005f93ad19bbf6da40f15790c5c" - }, - { - "DST_prime": "acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "len_in_bytes": "0x20", - "msg": "abcdef0123456789", - "msg_prime": "616263646566303132333435363738390020acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "uniform_bytes": "979e3a15064afbbcf99f62cc09fa9c85028afcf3f825eb0711894dcfc2f57057" - }, - { - "DST_prime": "acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "len_in_bytes": "0x20", - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "msg_prime": "713132385f71717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171710020acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "uniform_bytes": "c5a9220962d9edc212c063f4f65b609755a1ed96e62f9db5d1fd6adb5a8dc52b" - }, - { - "DST_prime": "acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "len_in_bytes": "0x20", - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "msg_prime": "613531325f61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161610020acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "uniform_bytes": "f7b96a5901af5d78ce1d071d9c383cac66a1dfadb508300ec6aeaea0d62d5d62" - }, - { - "DST_prime": "acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "len_in_bytes": "0x80", - "msg": "", - "msg_prime": "0080acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "uniform_bytes": "3890dbab00a2830be398524b71c2713bbef5f4884ac2e6f070b092effdb19208c7df943dc5dcbaee3094a78c267ef276632ee2c8ea0c05363c94b6348500fae4208345dd3475fe0c834c2beac7fa7bc181692fb728c0a53d809fc8111495222ce0f38468b11becb15b32060218e285c57a60162c2c8bb5b6bded13973cd41819" - }, - { - "DST_prime": "acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "len_in_bytes": "0x80", - "msg": "abc", - "msg_prime": "6162630080acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "uniform_bytes": "41b7ffa7a301b5c1441495ebb9774e2a53dbbf4e54b9a1af6a20fd41eafd69ef7b9418599c5545b1ee422f363642b01d4a53449313f68da3e49dddb9cd25b97465170537d45dcbdf92391b5bdff344db4bd06311a05bca7dcd360b6caec849c299133e5c9194f4e15e3e23cfaab4003fab776f6ac0bfae9144c6e2e1c62e7d57" - }, - { - "DST_prime": "acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "len_in_bytes": "0x80", - "msg": "abcdef0123456789", - "msg_prime": "616263646566303132333435363738390080acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "uniform_bytes": "55317e4a21318472cd2290c3082957e1242241d9e0d04f47026f03401643131401071f01aa03038b2783e795bdfa8a3541c194ad5de7cb9c225133e24af6c86e748deb52e560569bd54ef4dac03465111a3a44b0ea490fb36777ff8ea9f1a8a3e8e0de3cf0880b4b2f8dd37d3a85a8b82375aee4fa0e909f9763319b55778e71" - }, - { - "DST_prime": "acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "len_in_bytes": "0x80", - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "msg_prime": "713132385f71717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171710080acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "uniform_bytes": "19fdd2639f082e31c77717ac9bb032a22ff0958382b2dbb39020cdc78f0da43305414806abf9a561cb2d0067eb2f7bc544482f75623438ed4b4e39dd9e6e2909dd858bd8f1d57cd0fce2d3150d90aa67b4498bdf2df98c0100dd1a173436ba5d0df6be1defb0b2ce55ccd2f4fc05eb7cb2c019c35d5398b85adc676da4238bc7" - }, - { - "DST_prime": "acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "len_in_bytes": "0x80", - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "msg_prime": "613531325f61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161610080acb9736c0867fdfbd6385519b90fc8c034b5af04a958973212950132d035792f20", - "uniform_bytes": "945373f0b3431a103333ba6a0a34f1efab2702efde41754c4cb1d5216d5b0a92a67458d968562bde7fa6310a83f53dda1383680a276a283438d58ceebfa7ab7ba72499d4a3eddc860595f63c93b1c5e823ea41fc490d938398a26db28f61857698553e93f0574eb8c5017bfed6249491f9976aaa8d23d9485339cc85ca329308" - } - ] -} diff --git a/expander/testdata/expand_message_xof_SHAKE128_36.json b/expander/testdata/expand_message_xof_SHAKE128_36.json deleted file mode 100644 index ee014c55..00000000 --- a/expander/testdata/expand_message_xof_SHAKE128_36.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "DST": "QUUX-V01-CS02-with-expander-SHAKE128", - "hash": "SHAKE128", - "k": 128, - "name": "expand_message_xof", - "tests": [ - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "len_in_bytes": "0x20", - "msg": "", - "msg_prime": "0020515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "uniform_bytes": "86518c9cd86581486e9485aa74ab35ba150d1c75c88e26b7043e44e2acd735a2" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "len_in_bytes": "0x20", - "msg": "abc", - "msg_prime": "6162630020515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "uniform_bytes": "8696af52a4d862417c0763556073f47bc9b9ba43c99b505305cb1ec04a9ab468" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "len_in_bytes": "0x20", - "msg": "abcdef0123456789", - "msg_prime": "616263646566303132333435363738390020515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "uniform_bytes": "912c58deac4821c3509dbefa094df54b34b8f5d01a191d1d3108a2c89077acca" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "len_in_bytes": "0x20", - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "msg_prime": "713132385f71717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171710020515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "uniform_bytes": "1adbcc448aef2a0cebc71dac9f756b22e51839d348e031e63b33ebb50faeaf3f" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "len_in_bytes": "0x20", - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "msg_prime": "613531325f61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161610020515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "uniform_bytes": "df3447cc5f3e9a77da10f819218ddf31342c310778e0e4ef72bbaecee786a4fe" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "len_in_bytes": "0x80", - "msg": "", - "msg_prime": "0080515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "uniform_bytes": "7314ff1a155a2fb99a0171dc71b89ab6e3b2b7d59e38e64419b8b6294d03ffee42491f11370261f436220ef787f8f76f5b26bdcd850071920ce023f3ac46847744f4612b8714db8f5db83205b2e625d95afd7d7b4d3094d3bdde815f52850bb41ead9822e08f22cf41d615a303b0d9dde73263c049a7b9898208003a739a2e57" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "len_in_bytes": "0x80", - "msg": "abc", - "msg_prime": "6162630080515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "uniform_bytes": "c952f0c8e529ca8824acc6a4cab0e782fc3648c563ddb00da7399f2ae35654f4860ec671db2356ba7baa55a34a9d7f79197b60ddae6e64768a37d699a78323496db3878c8d64d909d0f8a7de4927dcab0d3dbbc26cb20a49eceb0530b431cdf47bc8c0fa3e0d88f53b318b6739fbed7d7634974f1b5c386d6230c76260d5337a" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "len_in_bytes": "0x80", - "msg": "abcdef0123456789", - "msg_prime": "616263646566303132333435363738390080515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "uniform_bytes": "19b65ee7afec6ac06a144f2d6134f08eeec185f1a890fe34e68f0e377b7d0312883c048d9b8a1d6ecc3b541cb4987c26f45e0c82691ea299b5e6889bbfe589153016d8131717ba26f07c3c14ffbef1f3eff9752e5b6183f43871a78219a75e7000fbac6a7072e2b83c790a3a5aecd9d14be79f9fd4fb180960a3772e08680495" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "len_in_bytes": "0x80", - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "msg_prime": "713132385f71717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171710080515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "uniform_bytes": "ca1b56861482b16eae0f4a26212112362fcc2d76dcc80c93c4182ed66c5113fe41733ed68be2942a3487394317f3379856f4822a611735e50528a60e7ade8ec8c71670fec6661e2c59a09ed36386513221688b35dc47e3c3111ee8c67ff49579089d661caa29db1ef10eb6eace575bf3dc9806e7c4016bd50f3c0e2a6481ee6d" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "len_in_bytes": "0x80", - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "msg_prime": "613531325f61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161610080515555582d5630312d435330322d776974682d657870616e6465722d5348414b4531323824", - "uniform_bytes": "9d763a5ce58f65c91531b4100c7266d479a5d9777ba761693d052acd37d149e7ac91c796a10b919cd74a591a1e38719fb91b7203e2af31eac3bff7ead2c195af7d88b8bc0a8adf3d1e90ab9bed6ddc2b7f655dd86c730bdeaea884e73741097142c92f0e3fc1811b699ba593c7fbd81da288a29d423df831652e3a01a9374999" - } - ] -} diff --git a/expander/testdata/expand_message_xof_SHAKE256_36.json b/expander/testdata/expand_message_xof_SHAKE256_36.json deleted file mode 100644 index 7714dd39..00000000 --- a/expander/testdata/expand_message_xof_SHAKE256_36.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "DST": "QUUX-V01-CS02-with-expander-SHAKE256", - "hash": "SHAKE256", - "k": 256, - "name": "expand_message_xof", - "tests": [ - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "len_in_bytes": "0x20", - "msg": "", - "msg_prime": "0020515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "uniform_bytes": "2ffc05c48ed32b95d72e807f6eab9f7530dd1c2f013914c8fed38c5ccc15ad76" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "len_in_bytes": "0x20", - "msg": "abc", - "msg_prime": "6162630020515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "uniform_bytes": "b39e493867e2767216792abce1f2676c197c0692aed061560ead251821808e07" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "len_in_bytes": "0x20", - "msg": "abcdef0123456789", - "msg_prime": "616263646566303132333435363738390020515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "uniform_bytes": "245389cf44a13f0e70af8665fe5337ec2dcd138890bb7901c4ad9cfceb054b65" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "len_in_bytes": "0x20", - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "msg_prime": "713132385f71717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171710020515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "uniform_bytes": "719b3911821e6428a5ed9b8e600f2866bcf23c8f0515e52d6c6c019a03f16f0e" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "len_in_bytes": "0x20", - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "msg_prime": "613531325f61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161610020515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "uniform_bytes": "9181ead5220b1963f1b5951f35547a5ea86a820562287d6ca4723633d17ccbbc" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "len_in_bytes": "0x80", - "msg": "", - "msg_prime": "0080515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "uniform_bytes": "7a1361d2d7d82d79e035b8880c5a3c86c5afa719478c007d96e6c88737a3f631dd74a2c88df79a4cb5e5d9f7504957c70d669ec6bfedc31e01e2bacc4ff3fdf9b6a00b17cc18d9d72ace7d6b81c2e481b4f73f34f9a7505dccbe8f5485f3d20c5409b0310093d5d6492dea4e18aa6979c23c8ea5de01582e9689612afbb353df" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "len_in_bytes": "0x80", - "msg": "abc", - "msg_prime": "6162630080515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "uniform_bytes": "a54303e6b172909783353ab05ef08dd435a558c3197db0c132134649708e0b9b4e34fb99b92a9e9e28fc1f1d8860d85897a8e021e6382f3eea10577f968ff6df6c45fe624ce65ca25932f679a42a404bc3681efe03fcd45ef73bb3a8f79ba784f80f55ea8a3c367408f30381299617f50c8cf8fbb21d0f1e1d70b0131a7b6fbe" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "len_in_bytes": "0x80", - "msg": "abcdef0123456789", - "msg_prime": "616263646566303132333435363738390080515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "uniform_bytes": "e42e4d9538a189316e3154b821c1bafb390f78b2f010ea404e6ac063deb8c0852fcd412e098e231e43427bd2be1330bb47b4039ad57b30ae1fc94e34993b162ff4d695e42d59d9777ea18d3848d9d336c25d2acb93adcad009bcfb9cde12286df267ada283063de0bb1505565b2eb6c90e31c48798ecdc71a71756a9110ff373" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "len_in_bytes": "0x80", - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "msg_prime": "713132385f71717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171710080515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "uniform_bytes": "4ac054dda0a38a65d0ecf7afd3c2812300027c8789655e47aecf1ecc1a2426b17444c7482c99e5907afd9c25b991990490bb9c686f43e79b4471a23a703d4b02f23c669737a886a7ec28bddb92c3a98de63ebf878aa363a501a60055c048bea11840c4717beae7eee28c3cfa42857b3d130188571943a7bd747de831bd6444e0" - }, - { - "DST_prime": "515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "len_in_bytes": "0x80", - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "msg_prime": "613531325f61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161610080515555582d5630312d435330322d776974682d657870616e6465722d5348414b4532353624", - "uniform_bytes": "09afc76d51c2cccbc129c2315df66c2be7295a231203b8ab2dd7f95c2772c68e500bc72e20c602abc9964663b7a03a389be128c56971ce81001a0b875e7fd17822db9d69792ddf6a23a151bf470079c518279aef3e75611f8f828994a9988f4a8a256ddb8bae161e658d5a2a09bcfe839c6396dc06ee5c8ff3c22d3b1f9deb7e" - } - ] -} diff --git a/go.mod b/go.mod index 6305afb8..1351f953 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,8 @@ module github.com/quantumcoinproject/circl -go 1.22.0 +go 1.26 require ( - github.com/bwesterb/go-ristretto v1.2.3 golang.org/x/crypto v0.11.1-0.20230711161743-2e82bdd1719d golang.org/x/sys v0.10.0 ) diff --git a/go.sum b/go.sum index ba71db1b..d8de2341 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -github.com/bwesterb/go-ristretto v1.2.3 h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= golang.org/x/crypto v0.11.1-0.20230711161743-2e82bdd1719d h1:LiA25/KWKuXfIq5pMIBq1s5hz3HQxhJJSu/SUGlD+SM= golang.org/x/crypto v0.11.1-0.20230711161743-2e82bdd1719d/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= diff --git a/group/group.go b/group/group.go deleted file mode 100644 index 4b4303e9..00000000 --- a/group/group.go +++ /dev/null @@ -1,142 +0,0 @@ -// Package group provides prime-order groups based on elliptic curves. -package group - -import ( - "encoding" - "errors" - "io" - "math/big" -) - -// Params stores the size in bytes of elements and scalars. -type Params struct { - ElementLength uint // Length in bytes of an element. - CompressedElementLength uint // Length in bytes of a compressed element. - ScalarLength uint // Length in bytes of a scalar. -} - -// Group represents an additive prime-order group based on elliptic curves. -type Group interface { - Params() *Params // Params returns parameters for the group - // Creates an element of the group set to the identity of the group. - NewElement() Element - // Creates a scalar of the group set to zero. - NewScalar() Scalar - // Creates an element of the group set to the identity of the group. - Identity() Element - // Creates an element of the group set to the generator of the group. - Generator() Element - // RandomElement creates an element chosen at random (using randomness - // from rnd) from the set of group elements. Use crypto/rand.Reader as - // a cryptographically secure random number generator - RandomElement(rnd io.Reader) Element - // RandomScalar creates a scalar chosen at random (using randomness - // from rnd) from the set of group scalars. Use crypto/rand.Reader as - // a cryptographically secure random number generator - RandomScalar(rnd io.Reader) Scalar - // RandomNonZeroScalar creates a scalar chosen at random (using randomness - // from rnd) from the set of group scalars. Use crypto/rand.Reader as - // a cryptographically secure random number generator. It is guaranteed - // the scalar is not zero. - RandomNonZeroScalar(io.Reader) Scalar - // HashToElement hashes a message (msg) using a domain separation string - // (dst) producing a group element with uniform distribution. - HashToElement(msg, dst []byte) Element - // HashToElementNonUniform hashes a message (msg) using a domain separation - // string (dst) producing a group element with nonuniform distribution. - HashToElementNonUniform(msg, dst []byte) Element - // HashToScalar hashes a message (msg) using a domain separation string - // (dst) producing a group scalar with uniform distribution. - HashToScalar(msg, dst []byte) Scalar -} - -// Element represents an element of a prime-order group. -type Element interface { - // Returns the group that the element belongs to. - Group() Group - // Set the receiver to x, and returns the receiver. - Set(x Element) Element - // Copy returns a new element equal to the receiver. - Copy() Element - // IsIdentity returns true if the receiver is the identity element of the - // group. - IsIdentity() bool - // IsEqual returns true if the receiver is equal to x. - IsEqual(x Element) bool - // CMov sets the receiver to x if b=1; the receiver is unmodified if b=0; - // otherwise panics if b is not 0 or 1. In all the cases, it returns the - // receiver. - CMov(b int, x Element) Element - // CSelect sets the receiver to x if b=1; sets the receiver to y if b=0; - // otherwise panics if b is not 0 or 1. In all the cases, it returns the - // receiver. - CSelect(b int, x, y Element) Element - // Add sets the receiver to x + y, and returns the receiver. - Add(x, y Element) Element - // Dbl sets the receiver to 2 * x, and returns the receiver. - Dbl(x Element) Element - // Neg sets the receiver to -x, and returns the receiver. - Neg(x Element) Element - // Mul sets the receiver to s * x, and returns the receiver. - Mul(x Element, s Scalar) Element - // MulGen sets the receiver to s * Generator(), and returns the receiver. - MulGen(s Scalar) Element - // BinaryMarshaler returns a byte representation of the element. - encoding.BinaryMarshaler - // BinaryUnmarshaler recovers an element from a byte representation - // produced either by encoding.BinaryMarshaler or MarshalBinaryCompress. - encoding.BinaryUnmarshaler - // MarshalBinaryCompress returns a byte representation of an element in a - // compact form whenever the group supports it; otherwise, returns the - // same byte representation produced by encoding.BinaryMarshaler. - MarshalBinaryCompress() ([]byte, error) -} - -// Scalar represents a scalar of a prime-order group. -type Scalar interface { - // Returns the group that the scalar belongs to. - Group() Group - // Set the receiver to x, and returns the receiver. - Set(x Scalar) Scalar - // Copy returns a new scalar equal to the receiver. - Copy() Scalar - // IsZero returns true if the receiver is equal to zero. - IsZero() bool - // IsEqual returns true if the receiver is equal to x. - IsEqual(x Scalar) bool - // SetUint64 sets the receiver to x, and returns the receiver. - SetUint64(x uint64) Scalar - // SetBigInt sets the receiver to x, and returns the receiver. - // Warning: operations on big.Int are not constant time. Do not use them - // for cryptography unless you're sure it's safe in your use-case. - SetBigInt(b *big.Int) Scalar - // CMov sets the receiver to x if b=1; the receiver is unmodified if b=0; - // otherwise panics if b is not 0 or 1. In all the cases, it returns the - // receiver. - CMov(b int, x Scalar) Scalar - // CSelect sets the receiver to x if b=1; sets the receiver to y if b=0; - // otherwise panics if b is not 0 or 1. In all the cases, it returns the - // receiver. - CSelect(b int, x, y Scalar) Scalar - // Add sets the receiver to x + y, and returns the receiver. - Add(x, y Scalar) Scalar - // Sub sets the receiver to x - y, and returns the receiver. - Sub(x, y Scalar) Scalar - // Mul sets the receiver to x * y, and returns the receiver. - Mul(x, y Scalar) Scalar - // Neg sets the receiver to -x, and returns the receiver. - Neg(x Scalar) Scalar - // Inv sets the receiver to 1/x, and returns the receiver. - Inv(x Scalar) Scalar - // BinaryMarshaler returns a byte representation of the scalar. - encoding.BinaryMarshaler - // BinaryUnmarshaler recovers a scalar from a byte representation produced - // by encoding.BinaryMarshaler. - encoding.BinaryUnmarshaler -} - -var ( - ErrType = errors.New("group: type mismatch") - ErrUnmarshal = errors.New("group: error unmarshaling") - ErrSelector = errors.New("group: selector must be 0 or 1") -) diff --git a/group/group_test.go b/group/group_test.go deleted file mode 100644 index a3cc3c3c..00000000 --- a/group/group_test.go +++ /dev/null @@ -1,374 +0,0 @@ -package group_test - -import ( - "bytes" - "crypto/rand" - "fmt" - "testing" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/internal/test" -) - -var allGroups = []group.Group{ - group.P256, - group.P384, - group.P521, - group.Ristretto255, -} - -func TestGroup(t *testing.T) { - const testTimes = 1 << 7 - for _, g := range allGroups { - n := g.(fmt.Stringer).String() - t.Run(n+"/Add", func(tt *testing.T) { testAdd(tt, testTimes, g) }) - t.Run(n+"/Neg", func(tt *testing.T) { testNeg(tt, testTimes, g) }) - t.Run(n+"/Mul", func(tt *testing.T) { testMul(tt, testTimes, g) }) - t.Run(n+"/MulGen", func(tt *testing.T) { testMulGen(tt, testTimes, g) }) - t.Run(n+"/CMov", func(tt *testing.T) { testCMov(tt, testTimes, g) }) - t.Run(n+"/CSelect", func(tt *testing.T) { testCSelect(tt, testTimes, g) }) - t.Run(n+"/Order", func(tt *testing.T) { testOrder(tt, testTimes, g) }) - t.Run(n+"/Marshal", func(tt *testing.T) { testMarshal(tt, testTimes, g) }) - t.Run(n+"/Scalar", func(tt *testing.T) { testScalar(tt, testTimes, g) }) - } -} - -func testAdd(t *testing.T, testTimes int, g group.Group) { - Q := g.NewElement() - for i := 0; i < testTimes; i++ { - P := g.RandomElement(rand.Reader) - - got := Q.Dbl(P).Dbl(Q).Dbl(Q).Dbl(Q) // Q = 16P - - R := g.Identity() - for j := 0; j < 16; j++ { - R.Add(R, P) - } - want := R // R = 16P = P+P...+P - if !got.IsEqual(want) { - test.ReportError(t, got, want, P) - } - } -} - -func testNeg(t *testing.T, testTimes int, g group.Group) { - Q := g.NewElement() - for i := 0; i < testTimes; i++ { - P := g.RandomElement(rand.Reader) - Q.Neg(P) - Q.Add(Q, P) - got := Q.IsIdentity() - want := true - if got != want { - test.ReportError(t, got, want, P) - } - } -} - -func testMul(t *testing.T, testTimes int, g group.Group) { - Q := g.NewElement() - kInv := g.NewScalar() - for i := 0; i < testTimes; i++ { - P := g.RandomElement(rand.Reader) - k := g.RandomScalar(rand.Reader) - kInv.Inv(k) - - Q.Mul(P, k) - Q.Mul(Q, kInv) - - got := P - want := Q - if !got.IsEqual(want) { - test.ReportError(t, got, want, P, k) - } - } -} - -func testMulGen(t *testing.T, testTimes int, g group.Group) { - G := g.Generator() - P := g.NewElement() - Q := g.NewElement() - for i := 0; i < testTimes; i++ { - k := g.RandomScalar(rand.Reader) - - P.Mul(G, k) - Q.MulGen(k) - - got := P - want := Q - if !got.IsEqual(want) { - test.ReportError(t, got, want, P, k) - } - } -} - -func testCMov(t *testing.T, testTimes int, g group.Group) { - P := g.RandomElement(rand.Reader) - Q := g.RandomElement(rand.Reader) - - err := test.CheckPanic(func() { P.CMov(0, Q) }) - test.CheckIsErr(t, err, "shouldn't fail with 0") - err = test.CheckPanic(func() { P.CMov(1, Q) }) - test.CheckIsErr(t, err, "shouldn't fail with 1") - err = test.CheckPanic(func() { P.CMov(2, Q) }) - test.CheckNoErr(t, err, "should fail with dif 0,1") - - for i := 0; i < testTimes; i++ { - P = g.RandomElement(rand.Reader) - Q = g.RandomElement(rand.Reader) - - want := P.Copy() - got := P.CMov(0, Q) - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } - - want = Q.Copy() - got = P.CMov(1, Q) - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } - } -} - -func testCSelect(t *testing.T, testTimes int, g group.Group) { - P := g.RandomElement(rand.Reader) - Q := g.RandomElement(rand.Reader) - R := g.RandomElement(rand.Reader) - - err := test.CheckPanic(func() { P.CSelect(0, Q, R) }) - test.CheckIsErr(t, err, "shouldn't fail with 0") - err = test.CheckPanic(func() { P.CSelect(1, Q, R) }) - test.CheckIsErr(t, err, "shouldn't fail with 1") - err = test.CheckPanic(func() { P.CSelect(2, Q, R) }) - test.CheckNoErr(t, err, "should fail with dif 0,1") - - for i := 0; i < testTimes; i++ { - P = g.RandomElement(rand.Reader) - Q = g.RandomElement(rand.Reader) - R = g.RandomElement(rand.Reader) - - want := R.Copy() - got := P.CSelect(0, Q, R) - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } - - want = Q.Copy() - got = P.CSelect(1, Q, R) - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } - } -} - -func testOrder(t *testing.T, testTimes int, g group.Group) { - I := g.Identity() - Q := g.NewElement() - minusOne := g.NewScalar().SetUint64(1) - minusOne.Neg(minusOne) - for i := 0; i < testTimes; i++ { - P := g.RandomElement(rand.Reader) - - Q.Mul(P, minusOne) - got := Q.Add(Q, P) - want := I - if !got.IsEqual(want) { - test.ReportError(t, got, want, P) - } - } -} - -func isZero(b []byte) bool { - for i := 0; i < len(b); i++ { - if b[i] != 0x00 { - return false - } - } - return true -} - -func testMarshal(t *testing.T, testTimes int, g group.Group) { - params := g.Params() - I := g.Identity() - got, err := I.MarshalBinary() - test.CheckNoErr(t, err, "error on MarshalBinary") - if !isZero(got) { - test.ReportError(t, got, "Non-zero identity") - } - if l := uint(len(got)); !(l == 1 || l == params.ElementLength) { - test.ReportError(t, l, params.ElementLength) - } - got, err = I.MarshalBinaryCompress() - test.CheckNoErr(t, err, "error on MarshalBinaryCompress") - if !isZero(got) { - test.ReportError(t, got, "Non-zero identity") - } - if l := uint(len(got)); !(l == 1 || l == params.CompressedElementLength) { - test.ReportError(t, l, params.CompressedElementLength) - } - II := g.NewElement() - err = II.UnmarshalBinary(got) - if err != nil || !I.IsEqual(II) { - test.ReportError(t, I, II) - } - - got1 := g.NewElement() - got2 := g.NewElement() - for i := 0; i < testTimes; i++ { - x := g.RandomElement(rand.Reader) - enc1, err1 := x.MarshalBinary() - enc2, err2 := x.MarshalBinaryCompress() - test.CheckNoErr(t, err1, "error on marshalling") - test.CheckNoErr(t, err2, "error on marshalling compress") - - err1 = got1.UnmarshalBinary(enc1) - err2 = got2.UnmarshalBinary(enc2) - test.CheckNoErr(t, err1, "error on unmarshalling") - test.CheckNoErr(t, err2, "error on unmarshalling compress") - if !x.IsEqual(got1) { - test.ReportError(t, got1, x) - } - if !x.IsEqual(got2) { - test.ReportError(t, got2, x) - } - if l := uint(len(enc1)); l != params.ElementLength { - test.ReportError(t, l, params.ElementLength) - } - if l := uint(len(enc2)); l != params.CompressedElementLength { - test.ReportError(t, l, params.CompressedElementLength) - } - } -} - -func testScalar(t *testing.T, testTimes int, g group.Group) { - a := g.RandomScalar(rand.Reader) - b := g.RandomScalar(rand.Reader) - c := g.NewScalar() - d := g.NewScalar() - e := g.NewScalar() - f := g.NewScalar() - one := g.NewScalar() - one.SetUint64(1) - params := g.Params() - - err := test.CheckPanic(func() { a.CMov(0, b) }) - test.CheckIsErr(t, err, "shouldn't fail with 0") - err = test.CheckPanic(func() { a.CMov(1, b) }) - test.CheckIsErr(t, err, "shouldn't fail with 1") - err = test.CheckPanic(func() { a.CMov(2, b) }) - test.CheckNoErr(t, err, "should fail with dif 0,1") - - err = test.CheckPanic(func() { a.CSelect(0, b, c) }) - test.CheckIsErr(t, err, "shouldn't fail with 0") - err = test.CheckPanic(func() { a.CSelect(1, b, c) }) - test.CheckIsErr(t, err, "shouldn't fail with 1") - err = test.CheckPanic(func() { a.CSelect(2, b, c) }) - test.CheckNoErr(t, err, "should fail with dif 0,1") - - for i := 0; i < testTimes; i++ { - a = g.RandomScalar(rand.Reader) - b = g.RandomScalar(rand.Reader) - c.Add(a, b) - d.Sub(a, b) - e.Mul(c, d) - e.Add(e, one) - - c.Mul(a, a) - d.Mul(b, b) - d.Neg(d) - f.Add(c, d) - f.Add(f, one) - enc1, err1 := e.MarshalBinary() - enc2, err2 := f.MarshalBinary() - if err1 != nil || err2 != nil || !bytes.Equal(enc1, enc2) { - test.ReportError(t, enc1, enc2, a, b) - } - if l := uint(len(enc1)); l != params.ScalarLength { - test.ReportError(t, l, params.ScalarLength) - } - - want := c.Copy() - got := c.CMov(0, a) - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } - - want = b.Copy() - got = d.CMov(1, b) - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } - - want = b.Copy() - got = e.CSelect(0, a, b) - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } - - want = a.Copy() - got = f.CSelect(1, a, b) - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } - } - - c.Inv(a) - c.Mul(c, a) - c.Sub(c, one) - if !c.IsZero() { - test.ReportError(t, c, one, a) - } -} - -func BenchmarkElement(b *testing.B) { - for _, g := range allGroups { - x := g.RandomElement(rand.Reader) - y := g.RandomElement(rand.Reader) - n := g.RandomScalar(rand.Reader) - name := g.(fmt.Stringer).String() - b.Run(name+"/Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - x.Add(x, y) - } - }) - b.Run(name+"/Dbl", func(b *testing.B) { - for i := 0; i < b.N; i++ { - x.Dbl(x) - } - }) - b.Run(name+"/Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - y.Mul(x, n) - } - }) - b.Run(name+"/MulGen", func(b *testing.B) { - for i := 0; i < b.N; i++ { - x.MulGen(n) - } - }) - } -} - -func BenchmarkScalar(b *testing.B) { - for _, g := range allGroups { - x := g.RandomScalar(rand.Reader) - y := g.RandomScalar(rand.Reader) - name := g.(fmt.Stringer).String() - b.Run(name+"/Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - x.Add(x, y) - } - }) - b.Run(name+"/Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - x.Mul(x, y) - } - }) - b.Run(name+"/Inv", func(b *testing.B) { - for i := 0; i < b.N; i++ { - y.Inv(x) - } - }) - } -} diff --git a/group/hash.go b/group/hash.go deleted file mode 100644 index d770577d..00000000 --- a/group/hash.go +++ /dev/null @@ -1,18 +0,0 @@ -package group - -import ( - "math/big" - - "github.com/quantumcoinproject/circl/expander" -) - -// HashToField generates a set of elements {u1,..., uN} = Hash(b) where each -// u in GF(p) and L is the security parameter. -func HashToField(u []big.Int, b []byte, e expander.Expander, p *big.Int, L uint) { - count := uint(len(u)) - bytes := e.Expand(b, count*L) - for i := range u { - j := uint(i) * L - u[i].Mod(u[i].SetBytes(bytes[j:j+L]), p) - } -} diff --git a/group/hash_test.go b/group/hash_test.go deleted file mode 100644 index d5c1e75c..00000000 --- a/group/hash_test.go +++ /dev/null @@ -1,135 +0,0 @@ -package group_test - -import ( - "encoding/hex" - "encoding/json" - "fmt" - "os" - "path/filepath" - "testing" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/internal/test" -) - -func TestHashToElement(t *testing.T) { - fileNames, err := filepath.Glob("./testdata/P*.json") - if err != nil { - t.Fatal(err) - } - - for _, fileName := range fileNames { - f, err := os.Open(fileName) - if err != nil { - t.Fatal(err) - } - dec := json.NewDecoder(f) - var v vectorSuite - err = dec.Decode(&v) - if err != nil { - t.Fatal(err) - } - f.Close() - - t.Run(v.Ciphersuite, func(t *testing.T) { testHashing(t, &v) }) - } -} - -func testHashing(t *testing.T, vs *vectorSuite) { - var G group.Group - switch vs.Ciphersuite[0:4] { - case "P256": - G = group.P256 - case "P384": - G = group.P384 - case "P521": - G = group.P521 - default: - t.Fatal("non supported suite") - } - - hashFunc := G.HashToElement - if !vs.RandomOracle { - hashFunc = G.HashToElementNonUniform - } - - want := G.NewElement() - for i, v := range vs.Vectors { - got := hashFunc([]byte(v.Msg), []byte(vs.Dst)) - err := want.UnmarshalBinary(v.P.toBytes()) - if err != nil { - t.Fatal(err) - } - - if !got.IsEqual(want) { - test.ReportError(t, got, want, i) - } - } -} - -type vectorSuite struct { - L string `json:"L"` - Z string `json:"Z"` - Ciphersuite string `json:"ciphersuite"` - Curve string `json:"curve"` - Dst string `json:"dst"` - Expand string `json:"expand"` - Field struct { - M string `json:"m"` - P string `json:"p"` - } `json:"field"` - Hash string `json:"hash"` - K string `json:"k"` - Map struct { - Name string `json:"name"` - } `json:"map"` - RandomOracle bool `json:"randomOracle"` - Vectors []vector `json:"vectors"` -} - -type point struct { - X string `json:"x"` - Y string `json:"y"` -} - -func (p point) toBytes() []byte { - x, err := hex.DecodeString(p.X[2:]) - if err != nil { - panic(err) - } - y, err := hex.DecodeString(p.Y[2:]) - if err != nil { - panic(err) - } - return append(append([]byte{0x04}, x...), y...) -} - -type vector struct { - P point `json:"P"` - Q0 point `json:"Q0,omitempty"` - Q1 point `json:"Q1,omitempty"` - Q point `json:"Q,omitempty"` - Msg string `json:"msg"` - U []string `json:"u"` -} - -func BenchmarkHash(b *testing.B) { - for _, g := range allGroups { - name := g.(fmt.Stringer).String() - b.Run(name+"/HashToElement", func(b *testing.B) { - for i := 0; i < b.N; i++ { - g.HashToElement(nil, nil) - } - }) - b.Run(name+"/HashToElementNonUniform", func(b *testing.B) { - for i := 0; i < b.N; i++ { - g.HashToElementNonUniform(nil, nil) - } - }) - b.Run(name+"/HashToScalar", func(b *testing.B) { - for i := 0; i < b.N; i++ { - g.HashToScalar(nil, nil) - } - }) - } -} diff --git a/group/ristretto255.go b/group/ristretto255.go deleted file mode 100644 index cdcc11c8..00000000 --- a/group/ristretto255.go +++ /dev/null @@ -1,263 +0,0 @@ -package group - -import ( - "crypto" - _ "crypto/sha512" - "fmt" - "io" - "math/big" - - r255 "github.com/bwesterb/go-ristretto" - "github.com/quantumcoinproject/circl/expander" - "github.com/quantumcoinproject/circl/internal/conv" -) - -// Ristretto255 is a quotient group generated from the edwards25519 curve. -var Ristretto255 Group = ristrettoGroup{} - -type ristrettoGroup struct{} - -func (g ristrettoGroup) String() string { - return "ristretto255" -} - -func (g ristrettoGroup) Params() *Params { - return &Params{32, 32, 32} -} - -type ristrettoElement struct { - p r255.Point -} - -type ristrettoScalar struct { - s r255.Scalar -} - -func (g ristrettoGroup) NewElement() Element { - return g.Identity() -} - -func (g ristrettoGroup) NewScalar() Scalar { - return &ristrettoScalar{ - s: r255.Scalar{}, - } -} - -func (g ristrettoGroup) Identity() Element { - var zero r255.Point - zero.SetZero() - return &ristrettoElement{ - p: zero, - } -} - -func (g ristrettoGroup) Generator() Element { - var base r255.Point - base.SetBase() - return &ristrettoElement{ - p: base, - } -} - -func (g ristrettoGroup) RandomElement(r io.Reader) Element { - var x r255.Point - x.Rand() - return &ristrettoElement{ - p: x, - } -} - -func (g ristrettoGroup) RandomScalar(io.Reader) Scalar { - var x r255.Scalar - x.Rand() - return &ristrettoScalar{ - s: x, - } -} - -func (g ristrettoGroup) RandomNonZeroScalar(io.Reader) Scalar { - var s r255.Scalar - for { - s.Rand() - if s.IsNonZeroI() == 1 { - return &ristrettoScalar{s} - } - } -} - -func (g ristrettoGroup) HashToElementNonUniform(b, dst []byte) Element { - return g.HashToElement(b, dst) -} - -func (g ristrettoGroup) HashToElement(msg, dst []byte) Element { - // Compliant with draft-irtf-cfrg-hash-to-curve. - // Appendix B - Hashing to ristretto255 - // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-hash-to-curve-14#appendix-B - // SuiteID: ristretto255_XMD:SHA-512_R255MAP_RO_ - var buf [32]byte - xmd := expander.NewExpanderMD(crypto.SHA512, dst) - uniformBytes := xmd.Expand(msg, 64) - copy(buf[:], uniformBytes[:32]) - p0 := new(r255.Point).SetElligator(&buf) - copy(buf[:], uniformBytes[32:]) - p1 := new(r255.Point).SetElligator(&buf) - p0.Add(p0, p1) - - return &ristrettoElement{*p0} -} - -func (g ristrettoGroup) HashToScalar(msg, dst []byte) Scalar { - // Adapted to be compliant with draft-irtf-cfrg-voprf - // Section 4.1.1 - OPRF(ristretto255, SHA-512) - // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-voprf-09#section-4.1.1 - var uniformBytes [64]byte - xmd := expander.NewExpanderMD(crypto.SHA512, dst) - copy(uniformBytes[:], xmd.Expand(msg, 64)) - s := g.NewScalar() - s.(*ristrettoScalar).s.SetReduced(&uniformBytes) - return s -} - -func (e *ristrettoElement) Group() Group { return Ristretto255 } - -func (e *ristrettoElement) String() string { return fmt.Sprintf("%x", e.p.Bytes()) } - -func (e *ristrettoElement) IsIdentity() bool { - var zero r255.Point - zero.SetZero() - return e.p.Equals(&zero) -} - -func (e *ristrettoElement) IsEqual(x Element) bool { - return e.p.Equals(&x.(*ristrettoElement).p) -} - -func (e *ristrettoElement) Set(x Element) Element { - e.p.Set(&x.(*ristrettoElement).p) - return e -} - -func (e *ristrettoElement) Copy() Element { - return &ristrettoElement{*new(r255.Point).Set(&e.p)} -} - -func (e *ristrettoElement) CMov(v int, x Element) Element { - if !(v == 0 || v == 1) { - panic(ErrSelector) - } - e.p.ConditionalSet(&x.(*ristrettoElement).p, int32(v)) - return e -} - -func (e *ristrettoElement) CSelect(v int, x Element, y Element) Element { - if !(v == 0 || v == 1) { - panic(ErrSelector) - } - e.p.ConditionalSet(&x.(*ristrettoElement).p, int32(v)) - e.p.ConditionalSet(&y.(*ristrettoElement).p, int32(1-v)) - return e -} - -func (e *ristrettoElement) Add(x Element, y Element) Element { - e.p.Add(&x.(*ristrettoElement).p, &y.(*ristrettoElement).p) - return e -} - -func (e *ristrettoElement) Dbl(x Element) Element { - return e.Add(x, x) -} - -func (e *ristrettoElement) Neg(x Element) Element { - e.p.Neg(&x.(*ristrettoElement).p) - return e -} - -func (e *ristrettoElement) Mul(x Element, y Scalar) Element { - e.p.ScalarMult(&x.(*ristrettoElement).p, &y.(*ristrettoScalar).s) - return e -} - -func (e *ristrettoElement) MulGen(x Scalar) Element { - e.p.ScalarMultBase(&x.(*ristrettoScalar).s) - return e -} - -func (e *ristrettoElement) MarshalBinaryCompress() ([]byte, error) { - return e.p.MarshalBinary() -} - -func (e *ristrettoElement) MarshalBinary() ([]byte, error) { - return e.p.MarshalBinary() -} - -func (e *ristrettoElement) UnmarshalBinary(data []byte) error { - return e.p.UnmarshalBinary(data) -} - -func (s *ristrettoScalar) Group() Group { return Ristretto255 } -func (s *ristrettoScalar) String() string { return conv.BytesLe2Hex(s.s.Bytes()) } -func (s *ristrettoScalar) SetUint64(n uint64) Scalar { s.s.SetUint64(n); return s } -func (s *ristrettoScalar) SetBigInt(x *big.Int) Scalar { s.s.SetBigInt(x); return s } -func (s *ristrettoScalar) IsZero() bool { return s.s.IsNonZeroI() == 0 } -func (s *ristrettoScalar) IsEqual(x Scalar) bool { - return s.s.Equals(&x.(*ristrettoScalar).s) -} - -func (s *ristrettoScalar) Set(x Scalar) Scalar { - s.s.Set(&x.(*ristrettoScalar).s) - return s -} - -func (s *ristrettoScalar) Copy() Scalar { - return &ristrettoScalar{*new(r255.Scalar).Set(&s.s)} -} - -func (s *ristrettoScalar) CMov(v int, x Scalar) Scalar { - if !(v == 0 || v == 1) { - panic(ErrSelector) - } - s.s.ConditionalSet(&x.(*ristrettoScalar).s, int32(v)) - return s -} - -func (s *ristrettoScalar) CSelect(v int, x Scalar, y Scalar) Scalar { - if !(v == 0 || v == 1) { - panic(ErrSelector) - } - s.s.ConditionalSet(&x.(*ristrettoScalar).s, int32(v)) - s.s.ConditionalSet(&y.(*ristrettoScalar).s, int32(1-v)) - return s -} - -func (s *ristrettoScalar) Add(x Scalar, y Scalar) Scalar { - s.s.Add(&x.(*ristrettoScalar).s, &y.(*ristrettoScalar).s) - return s -} - -func (s *ristrettoScalar) Sub(x Scalar, y Scalar) Scalar { - s.s.Sub(&x.(*ristrettoScalar).s, &y.(*ristrettoScalar).s) - return s -} - -func (s *ristrettoScalar) Mul(x Scalar, y Scalar) Scalar { - s.s.Mul(&x.(*ristrettoScalar).s, &y.(*ristrettoScalar).s) - return s -} - -func (s *ristrettoScalar) Neg(x Scalar) Scalar { - s.s.Neg(&x.(*ristrettoScalar).s) - return s -} - -func (s *ristrettoScalar) Inv(x Scalar) Scalar { - s.s.Inverse(&x.(*ristrettoScalar).s) - return s -} - -func (s *ristrettoScalar) MarshalBinary() ([]byte, error) { - return s.s.MarshalBinary() -} - -func (s *ristrettoScalar) UnmarshalBinary(data []byte) error { - return s.s.UnmarshalBinary(data) -} diff --git a/group/ristretto255_test.go b/group/ristretto255_test.go deleted file mode 100644 index 9f7a3231..00000000 --- a/group/ristretto255_test.go +++ /dev/null @@ -1,145 +0,0 @@ -package group - -import ( - "bytes" - "crypto/rand" - "encoding/hex" - "testing" -) - -// https://tools.ietf.org/html/draft-irtf-cfrg-ristretto255-decaf448-00#appendix-A.1 -func TestGeneratorMultiples(t *testing.T) { - encVec := []string{ - "0000000000000000000000000000000000000000000000000000000000000000", - "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919", - "94741f5d5d52755ece4f23f044ee27d5d1ea1e2bd196b462166b16152a9d0259", - "da80862773358b466ffadfe0b3293ab3d9fd53c5ea6c955358f568322daf6a57", - "e882b131016b52c1d3337080187cf768423efccbb517bb495ab812c4160ff44e", - "f64746d3c92b13050ed8d80236a7f0007c3b3f962f5ba793d19a601ebb1df403", - "44f53520926ec81fbd5a387845beb7df85a96a24ece18738bdcfa6a7822a176d", - "903293d8f2287ebe10e2374dc1a53e0bc887e592699f02d077d5263cdd55601c", - "02622ace8f7303a31cafc63f8fc48fdc16e1c8c8d234b2f0d6685282a9076031", - "20706fd788b2720a1ed2a5dad4952b01f413bcf0e7564de8cdc816689e2db95f", - "bce83f8ba5dd2fa572864c24ba1810f9522bc6004afe95877ac73241cafdab42", - "e4549ee16b9aa03099ca208c67adafcafa4c3f3e4e5303de6026e3ca8ff84460", - "aa52e000df2e16f55fb1032fc33bc42742dad6bd5a8fc0be0167436c5948501f", - "46376b80f409b29dc2b5f6f0c52591990896e5716f41477cd30085ab7f10301e", - "e0c418f7c8d9c4cdd7395b93ea124f3ad99021bb681dfc3302a9d99a2e53e64e", - } - - g := Ristretto255 - base := g.NewElement() - encBase, err := hex.DecodeString(encVec[0]) - if err != nil { - t.Fatal("DecodeString") - } - err = base.UnmarshalBinary(encBase) - if err != nil { - t.Fatal("UnmarshalBinary") - } - if !base.IsIdentity() { - t.Fatal("Base element is not identity") - } - - for i := 1; i < len(encVec); i++ { - base.Add(base, g.Generator()) - baseEnc, err := base.MarshalBinary() - if err != nil { - t.Fatalf("MarshalBinary %d", i) - } - if hex.EncodeToString(baseEnc) != encVec[i] { - t.Fatalf("Multiple %d mismatch", i) - } - } -} - -// https://tools.ietf.org/html/draft-irtf-cfrg-ristretto255-decaf448-00#appendix-A.2 -func TestInvalidEncodings(t *testing.T) { - encVec := []string{ - // Non-canonical field encodings. - "00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", - // The internal ristretto255 implementation ignores the MSB, so the following two encodings fail. - // "f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", - // "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", - // Negative field elements. - "0100000000000000000000000000000000000000000000000000000000000000", - "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", - "ed57ffd8c914fb201471d1c3d245ce3c746fcbe63a3679d51b6a516ebebe0e20", - "c34c4e1826e5d403b78e246e88aa051c36ccf0aafebffe137d148a2bf9104562", - "c940e5a4404157cfb1628b108db051a8d439e1a421394ec4ebccb9ec92a8ac78", - "47cfc5497c53dc8e61c91d17fd626ffb1c49e2bca94eed052281b510b1117a24", - "f1c6165d33367351b0da8f6e4511010c68174a03b6581212c71c0e1d026c3c72", - "87260f7a2f12495118360f02c26a470f450dadf34a413d21042b43b9d93e1309", - // Non-square x^2. - "26948d35ca62e643e26a83177332e6b6afeb9d08e4268b650f1f5bbd8d81d371", - "4eac077a713c57b4f4397629a4145982c661f48044dd3f96427d40b147d9742f", - "de6a7b00deadc788eb6b6c8d20c0ae96c2f2019078fa604fee5b87d6e989ad7b", - "bcab477be20861e01e4a0e295284146a510150d9817763caf1a6f4b422d67042", - "2a292df7e32cababbd9de088d1d1abec9fc0440f637ed2fba145094dc14bea08", - "f4a9e534fc0d216c44b218fa0c42d99635a0127ee2e53c712f70609649fdff22", - "8268436f8c4126196cf64b3c7ddbda90746a378625f9813dd9b8457077256731", - "2810e5cbc2cc4d4eece54f61c6f69758e289aa7ab440b3cbeaa21995c2f4232b", - // Negative xy value. - "3eb858e78f5a7254d8c9731174a94f76755fd3941c0ac93735c07ba14579630e", - "a45fdc55c76448c049a1ab33f17023edfb2be3581e9c7aade8a6125215e04220", - "d483fe813c6ba647ebbfd3ec41adca1c6130c2beeee9d9bf065c8d151c5f396e", - "8a2e1d30050198c65a54483123960ccc38aef6848e1ec8f5f780e8523769ba32", - "32888462f8b486c68ad7dd9610be5192bbeaf3b443951ac1a8118419d9fa097b", - "227142501b9d4355ccba290404bde41575b037693cef1f438c47f8fbf35d1165", - "5c37cc491da847cfeb9281d407efc41e15144c876e0170b499a96a22ed31e01e", - "445425117cb8c90edcbc7c1cc0e74f747f2c1efa5630a967c64f287792a48a4b", - // s = -1, which causes y = 0. - "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", - } - - for i, enc := range encVec { - raw, err := hex.DecodeString(enc) - if err != nil { - t.Fatal("DecodeString") - } - err = Ristretto255.NewElement().UnmarshalBinary(raw) - if err == nil { - t.Fatalf("Decode succeeded for vector %d: %v", i, enc) - } - } -} - -func TestRistrettoElGamal(t *testing.T) { - g := Ristretto255 - pk := g.NewElement() - sk := g.RandomScalar(rand.Reader) - pk.MulGen(sk) - - // El'Gamal encrypt a random element p into a ciphertext-pair (c1,c2) - p := g.RandomElement(rand.Reader) - r := g.RandomScalar(rand.Reader) - c2 := g.NewElement() - c1 := g.NewElement() - c2.MulGen(r) - c1.Mul(pk, r) - c1.Add(c1, p) - - // Decrypt (c1,c2) back to p - b := g.NewElement() - p2 := g.NewElement() - b.Mul(c2, sk) - p2.Add(c1, b.Neg(b)) - - if !p.IsEqual(p2) { - t.Fatal("Encryption/decryption failed") - } - - pEnc, err := p.MarshalBinary() - if err != nil { - t.Fatal("MarshalBinary") - } - p2Enc, err := p2.MarshalBinary() - if err != nil { - t.Fatal("MarshalBinary") - } - if !bytes.Equal(pEnc, p2Enc) { - t.Fatal("Unequal encodings") - } -} diff --git a/group/short.go b/group/short.go deleted file mode 100644 index d44a0c25..00000000 --- a/group/short.go +++ /dev/null @@ -1,475 +0,0 @@ -package group - -import ( - "crypto" - "crypto/elliptic" - _ "crypto/sha256" - _ "crypto/sha512" - "crypto/subtle" - "fmt" - "io" - "math/big" - - "github.com/quantumcoinproject/circl/ecc/p384" - "github.com/quantumcoinproject/circl/expander" -) - -var ( - // P256 is the group generated by P-256 elliptic curve. - P256 Group = wG{elliptic.P256()} - // P384 is the group generated by P-384 elliptic curve. - P384 Group = wG{p384.P384()} - // P521 is the group generated by P-521 elliptic curve. - P521 Group = wG{elliptic.P521()} -) - -type wG struct { - c elliptic.Curve -} - -func (g wG) String() string { return g.c.Params().Name } -func (g wG) NewElement() Element { return g.zeroElement() } -func (g wG) NewScalar() Scalar { return g.zeroScalar() } -func (g wG) Identity() Element { return g.zeroElement() } -func (g wG) zeroScalar() *wScl { return &wScl{g, make([]byte, (g.c.Params().BitSize+7)/8)} } -func (g wG) zeroElement() *wElt { return &wElt{g, new(big.Int), new(big.Int)} } -func (g wG) Generator() Element { return &wElt{g, g.c.Params().Gx, g.c.Params().Gy} } -func (g wG) RandomElement(rd io.Reader) Element { - b := make([]byte, (g.c.Params().BitSize+7)/8) - if n, err := io.ReadFull(rd, b); err != nil || n != len(b) { - panic(err) - } - return g.HashToElement(b, nil) -} - -func (g wG) RandomScalar(rd io.Reader) Scalar { - b := make([]byte, (g.c.Params().BitSize+7)/8) - if n, err := io.ReadFull(rd, b); err != nil || n != len(b) { - panic(err) - } - return g.HashToScalar(b, nil) -} - -func (g wG) RandomNonZeroScalar(rd io.Reader) Scalar { - zero := g.zeroScalar() - for { - s := g.RandomScalar(rd) - if !s.IsEqual(zero) { - return s - } - } -} - -func (g wG) cvtElt(e Element) *wElt { - if e == nil { - return g.zeroElement() - } - ee, ok := e.(*wElt) - if !ok || g.c.Params().BitSize != ee.c.Params().BitSize { - panic(ErrType) - } - return ee -} - -func (g wG) cvtScl(s Scalar) *wScl { - if s == nil { - return g.zeroScalar() - } - ss, ok := s.(*wScl) - if !ok || g.c.Params().BitSize != ss.c.Params().BitSize { - panic(ErrType) - } - return ss -} - -func (g wG) Params() *Params { - fieldLen := uint((g.c.Params().BitSize + 7) / 8) - return &Params{ - ElementLength: 1 + 2*fieldLen, - CompressedElementLength: 1 + fieldLen, - ScalarLength: fieldLen, - } -} - -func (g wG) HashToElementNonUniform(b, dst []byte) Element { - var u [1]big.Int - mapping, h, L := g.mapToCurveParams() - xmd := expander.NewExpanderMD(h, dst) - HashToField(u[:], b, xmd, g.c.Params().P, L) - return mapping(&u[0]) -} - -func (g wG) HashToElement(b, dst []byte) Element { - var u [2]big.Int - mapping, h, L := g.mapToCurveParams() - xmd := expander.NewExpanderMD(h, dst) - HashToField(u[:], b, xmd, g.c.Params().P, L) - Q0 := mapping(&u[0]) - Q1 := mapping(&u[1]) - return Q0.Add(Q0, Q1) -} - -func (g wG) HashToScalar(b, dst []byte) Scalar { - var u [1]big.Int - _, h, L := g.mapToCurveParams() - xmd := expander.NewExpanderMD(h, dst) - HashToField(u[:], b, xmd, g.c.Params().N, L) - s := g.NewScalar().(*wScl) - s.fromBig(&u[0]) - return s -} - -type wElt struct { - wG - x, y *big.Int -} - -func (e *wElt) Group() Group { return e.wG } -func (e *wElt) String() string { return fmt.Sprintf("x: 0x%v\ny: 0x%v", e.x.Text(16), e.y.Text(16)) } -func (e *wElt) IsIdentity() bool { return e.x.Sign() == 0 && e.y.Sign() == 0 } -func (e *wElt) IsEqual(o Element) bool { - oo := e.cvtElt(o) - return e.x.Cmp(oo.x) == 0 && e.y.Cmp(oo.y) == 0 -} - -func (e *wElt) Set(a Element) Element { - aa := e.cvtElt(a) - e.x.Set(aa.x) - e.y.Set(aa.y) - return e -} - -func (e *wElt) Copy() Element { return e.wG.zeroElement().Set(e) } - -func (e *wElt) CMov(v int, a Element) Element { - if !(v == 0 || v == 1) { - panic(ErrSelector) - } - aa := e.cvtElt(a) - l := (e.wG.c.Params().BitSize + 7) / 8 - bufE := make([]byte, l) - bufA := make([]byte, l) - e.x.FillBytes(bufE) - aa.x.FillBytes(bufA) - subtle.ConstantTimeCopy(v, bufE, bufA) - e.x.SetBytes(bufE) - - e.y.FillBytes(bufE) - aa.y.FillBytes(bufA) - subtle.ConstantTimeCopy(v, bufE, bufA) - e.y.SetBytes(bufE) - - return e -} - -func (e *wElt) CSelect(v int, a Element, b Element) Element { - if !(v == 0 || v == 1) { - panic(ErrSelector) - } - aa, bb := e.cvtElt(a), e.cvtElt(b) - l := (e.wG.c.Params().BitSize + 7) / 8 - bufE := make([]byte, l) - bufA := make([]byte, l) - bufB := make([]byte, l) - - e.x.FillBytes(bufE) - aa.x.FillBytes(bufA) - bb.x.FillBytes(bufB) - for i := range bufE { - bufE[i] = byte(subtle.ConstantTimeSelect(v, int(bufA[i]), int(bufB[i]))) - } - e.x.SetBytes(bufE) - - e.y.FillBytes(bufE) - aa.y.FillBytes(bufA) - bb.y.FillBytes(bufB) - for i := range bufE { - bufE[i] = byte(subtle.ConstantTimeSelect(v, int(bufA[i]), int(bufB[i]))) - } - e.y.SetBytes(bufE) - - return e -} - -func (e *wElt) Add(a, b Element) Element { - aa, bb := e.cvtElt(a), e.cvtElt(b) - e.x, e.y = e.c.Add(aa.x, aa.y, bb.x, bb.y) - return e -} - -func (e *wElt) Dbl(a Element) Element { - aa := e.cvtElt(a) - e.x, e.y = e.c.Double(aa.x, aa.y) - return e -} - -func (e *wElt) Neg(a Element) Element { - aa := e.cvtElt(a) - e.x.Set(aa.x) - e.y.Neg(aa.y).Mod(e.y, e.c.Params().P) - return e -} - -func (e *wElt) Mul(a Element, s Scalar) Element { - aa, ss := e.cvtElt(a), e.cvtScl(s) - e.x, e.y = e.c.ScalarMult(aa.x, aa.y, ss.k) - return e -} - -func (e *wElt) MulGen(s Scalar) Element { - ss := e.cvtScl(s) - e.x, e.y = e.c.ScalarBaseMult(ss.k) - return e -} - -func (e *wElt) MarshalBinary() ([]byte, error) { - if e.IsIdentity() { - return []byte{0x0}, nil - } - e.x.Mod(e.x, e.c.Params().P) - e.y.Mod(e.y, e.c.Params().P) - return elliptic.Marshal(e.wG.c, e.x, e.y), nil -} - -func (e *wElt) MarshalBinaryCompress() ([]byte, error) { - if e.IsIdentity() { - return []byte{0x0}, nil - } - e.x.Mod(e.x, e.c.Params().P) - e.y.Mod(e.y, e.c.Params().P) - return elliptic.MarshalCompressed(e.wG.c, e.x, e.y), nil -} - -func (e *wElt) UnmarshalBinary(b []byte) error { - byteLen := (e.c.Params().BitSize + 7) / 8 - l := len(b) - switch { - case l == 1 && b[0] == 0x00: // point at infinity - e.x.SetInt64(0) - e.y.SetInt64(0) - case l == 1+byteLen && (b[0] == 0x02 || b[0] == 0x03): // compressed - x, y := elliptic.UnmarshalCompressed(e.wG.c, b) - if x == nil { - return ErrUnmarshal - } - e.x, e.y = x, y - case l == 1+2*byteLen && b[0] == 0x04: // uncompressed - x, y := elliptic.Unmarshal(e.wG.c, b) - if x == nil { - return ErrUnmarshal - } - e.x, e.y = x, y - default: - return ErrUnmarshal - } - return nil -} - -type wScl struct { - wG - k []byte -} - -func (s *wScl) Group() Group { return s.wG } -func (s *wScl) String() string { return fmt.Sprintf("0x%x", s.k) } -func (s *wScl) SetUint64(n uint64) Scalar { s.fromBig(new(big.Int).SetUint64(n)); return s } -func (s *wScl) SetBigInt(x *big.Int) Scalar { s.fromBig(x); return s } -func (s *wScl) IsZero() bool { - return subtle.ConstantTimeCompare(s.k, make([]byte, (s.wG.c.Params().BitSize+7)/8)) == 1 -} - -func (s *wScl) IsEqual(a Scalar) bool { - aa := s.cvtScl(a) - return subtle.ConstantTimeCompare(s.k, aa.k) == 1 -} - -func (s *wScl) fromBig(b *big.Int) { - k := new(big.Int).Mod(b, s.c.Params().N) - if err := s.UnmarshalBinary(k.Bytes()); err != nil { - panic(err) - } -} - -func (s *wScl) Set(a Scalar) Scalar { - aa := s.cvtScl(a) - if err := s.UnmarshalBinary(aa.k); err != nil { - panic(err) - } - return s -} - -func (s *wScl) Copy() Scalar { return s.wG.zeroScalar().Set(s) } - -func (s *wScl) CMov(v int, a Scalar) Scalar { - if !(v == 0 || v == 1) { - panic(ErrSelector) - } - aa := s.cvtScl(a) - subtle.ConstantTimeCopy(v, s.k, aa.k) - return s -} - -func (s *wScl) CSelect(v int, a Scalar, b Scalar) Scalar { - if !(v == 0 || v == 1) { - panic(ErrSelector) - } - aa, bb := s.cvtScl(a), s.cvtScl(b) - for i := range s.k { - s.k[i] = byte(subtle.ConstantTimeSelect(v, int(aa.k[i]), int(bb.k[i]))) - } - return s -} - -func (s *wScl) Add(a, b Scalar) Scalar { - aa, bb := s.cvtScl(a), s.cvtScl(b) - r := new(big.Int) - r.SetBytes(aa.k).Add(r, new(big.Int).SetBytes(bb.k)) - s.fromBig(r) - return s -} - -func (s *wScl) Sub(a, b Scalar) Scalar { - aa, bb := s.cvtScl(a), s.cvtScl(b) - r := new(big.Int) - r.SetBytes(aa.k).Sub(r, new(big.Int).SetBytes(bb.k)) - s.fromBig(r) - return s -} - -func (s *wScl) Mul(a, b Scalar) Scalar { - aa, bb := s.cvtScl(a), s.cvtScl(b) - r := new(big.Int) - r.SetBytes(aa.k).Mul(r, new(big.Int).SetBytes(bb.k)) - s.fromBig(r) - return s -} - -func (s *wScl) Neg(a Scalar) Scalar { - aa := s.cvtScl(a) - r := new(big.Int) - r.SetBytes(aa.k).Neg(r) - s.fromBig(r) - return s -} - -func (s *wScl) Inv(a Scalar) Scalar { - aa := s.cvtScl(a) - r := new(big.Int) - r.SetBytes(aa.k).ModInverse(r, s.c.Params().N) - s.fromBig(r) - return s -} - -func (s *wScl) MarshalBinary() (data []byte, err error) { - data = make([]byte, (s.c.Params().BitSize+7)/8) - copy(data, s.k) - return data, nil -} - -func (s *wScl) UnmarshalBinary(b []byte) error { - l := (s.c.Params().BitSize + 7) / 8 - s.k = make([]byte, l) - copy(s.k[l-len(b):l], b) - return nil -} - -func (g wG) mapToCurveParams() (mapping func(u *big.Int) *wElt, h crypto.Hash, L uint) { - var Z, C2 big.Int - switch g.c.Params().BitSize { - case 256: - Z.SetInt64(-10) - C2.SetString("0x78bc71a02d89ec07214623f6d0f955072c7cc05604a5a6e23ffbf67115fa5301", 0) - h = crypto.SHA256 - L = 48 - case 384: - Z.SetInt64(-12) - C2.SetString("0x19877cc1041b7555743c0ae2e3a3e61fb2aaa2e0e87ea557a563d8b598a0940d0a697a9e0b9e92cfaa314f583c9d066", 0) - h = crypto.SHA384 - L = 72 - case 521: - Z.SetInt64(-4) - C2.SetInt64(8) - h = crypto.SHA512 - L = 98 - default: - panic("curve not supported") - } - return func(u *big.Int) *wElt { return g.sswu3mod4Map(u, &Z, &C2) }, h, L -} - -func (g wG) sswu3mod4Map(u *big.Int, Z, C2 *big.Int) *wElt { - tv1 := new(big.Int) - tv2 := new(big.Int) - tv3 := new(big.Int) - tv4 := new(big.Int) - xn := new(big.Int) - xd := new(big.Int) - x1n := new(big.Int) - x2n := new(big.Int) - gx1 := new(big.Int) - gxd := new(big.Int) - y1 := new(big.Int) - y2 := new(big.Int) - x := new(big.Int) - y := new(big.Int) - - A := big.NewInt(-3) - B := g.c.Params().B - p := g.c.Params().P - c1 := new(big.Int) - c1.Sub(p, big.NewInt(3)).Rsh(c1, 2) // 1. c1 = (q - 3) / 4 - - add := func(c, a, b *big.Int) { c.Add(a, b).Mod(c, p) } - mul := func(c, a, b *big.Int) { c.Mul(a, b).Mod(c, p) } - sqr := func(c, a *big.Int) { c.Mul(a, a).Mod(c, p) } - exp := func(c, a, b *big.Int) { c.Exp(a, b, p) } - sgn := func(a *big.Int) uint { a.Mod(a, p); return a.Bit(0) } - cmv := func(c, a, b *big.Int, k bool) { - if k { - c.Set(b) - } else { - c.Set(a) - } - } - - sqr(tv1, u) // 1. tv1 = u^2 - mul(tv3, Z, tv1) // 2. tv3 = Z * tv1 - sqr(tv2, tv3) // 3. tv2 = tv3^2 - add(xd, tv2, tv3) // 4. xd = tv2 + tv3 - add(x1n, xd, big.NewInt(1)) // 5. x1n = xd + 1 - mul(x1n, x1n, B) // 6. x1n = x1n * B - tv4.Neg(A) // - mul(xd, tv4, xd) // 7. xd = -A * xd - e1 := xd.Sign() == 0 // 8. e1 = xd == 0 - mul(tv4, Z, A) // - cmv(xd, xd, tv4, e1) // 9. xd = CMOV(xd, Z * A, e1) - sqr(tv2, xd) // 10. tv2 = xd^2 - mul(gxd, tv2, xd) // 11. gxd = tv2 * xd - mul(tv2, A, tv2) // 12. tv2 = A * tv2 - sqr(gx1, x1n) // 13. gx1 = x1n^2 - add(gx1, gx1, tv2) // 14. gx1 = gx1 + tv2 - mul(gx1, gx1, x1n) // 15. gx1 = gx1 * x1n - mul(tv2, B, gxd) // 16. tv2 = B * gxd - add(gx1, gx1, tv2) // 17. gx1 = gx1 + tv2 - sqr(tv4, gxd) // 18. tv4 = gxd^2 - mul(tv2, gx1, gxd) // 19. tv2 = gx1 * gxd - mul(tv4, tv4, tv2) // 20. tv4 = tv4 * tv2 - exp(y1, tv4, c1) // 21. y1 = tv4^c1 - mul(y1, y1, tv2) // 22. y1 = y1 * tv2 - mul(x2n, tv3, x1n) // 23. x2n = tv3 * x1n - mul(y2, y1, C2) // 24. y2 = y1 * c2 - mul(y2, y2, tv1) // 25. y2 = y2 * tv1 - mul(y2, y2, u) // 26. y2 = y2 * u - sqr(tv2, y1) // 27. tv2 = y1^2 - mul(tv2, tv2, gxd) // 28. tv2 = tv2 * gxd - e2 := tv2.Cmp(gx1) == 0 // 29. e2 = tv2 == gx1 - cmv(xn, x2n, x1n, e2) // 30. xn = CMOV(x2n, x1n, e2) - cmv(y, y2, y1, e2) // 31. y = CMOV(y2, y1, e2) - e3 := sgn(u) == sgn(y) // 32. e3 = sgn0(u) == sgn0(y) - tv1.Neg(y) // - cmv(y, tv1, y, e3) // 33. y = CMOV(-y, y, e3) - tv1.ModInverse(xd, p) // - mul(x, xn, tv1) // 34. return (xn, xd, y, 1) - y.Mod(y, p) - return &wElt{g, x, y} -} diff --git a/group/testdata/P256_XMD-SHA-256_SSWU_NU_.json b/group/testdata/P256_XMD-SHA-256_SSWU_NU_.json deleted file mode 100644 index f88c4605..00000000 --- a/group/testdata/P256_XMD-SHA-256_SSWU_NU_.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "L": "0x30", - "Z": "0xffffffff00000001000000000000000000000000fffffffffffffffffffffff5", - "ciphersuite": "P256_XMD:SHA-256_SSWU_NU_", - "curve": "NIST P-256", - "dst": "QUUX-V01-CS02-with-P256_XMD:SHA-256_SSWU_NU_", - "expand": "XMD", - "field": { - "m": "0x1", - "p": "0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff" - }, - "hash": "sha256", - "k": "0x80", - "map": { - "name": "SSWU" - }, - "randomOracle": false, - "vectors": [ - { - "P": { - "x": "0xf871caad25ea3b59c16cf87c1894902f7e7b2c822c3d3f73596c5ace8ddd14d1", - "y": "0x87b9ae23335bee057b99bac1e68588b18b5691af476234b8971bc4f011ddc99b" - }, - "Q": { - "x": "0xf871caad25ea3b59c16cf87c1894902f7e7b2c822c3d3f73596c5ace8ddd14d1", - "y": "0x87b9ae23335bee057b99bac1e68588b18b5691af476234b8971bc4f011ddc99b" - }, - "msg": "", - "u": [ - "0xb22d487045f80e9edcb0ecc8d4bf77833e2bf1f3a54004d7df1d57f4802d311f" - ] - }, - { - "P": { - "x": "0xfc3f5d734e8dce41ddac49f47dd2b8a57257522a865c124ed02b92b5237befa4", - "y": "0xfe4d197ecf5a62645b9690599e1d80e82c500b22ac705a0b421fac7b47157866" - }, - "Q": { - "x": "0xfc3f5d734e8dce41ddac49f47dd2b8a57257522a865c124ed02b92b5237befa4", - "y": "0xfe4d197ecf5a62645b9690599e1d80e82c500b22ac705a0b421fac7b47157866" - }, - "msg": "abc", - "u": [ - "0xc7f96eadac763e176629b09ed0c11992225b3a5ae99479760601cbd69c221e58" - ] - }, - { - "P": { - "x": "0xf164c6674a02207e414c257ce759d35eddc7f55be6d7f415e2cc177e5d8faa84", - "y": "0x3aa274881d30db70485368c0467e97da0e73c18c1d00f34775d012b6fcee7f97" - }, - "Q": { - "x": "0xf164c6674a02207e414c257ce759d35eddc7f55be6d7f415e2cc177e5d8faa84", - "y": "0x3aa274881d30db70485368c0467e97da0e73c18c1d00f34775d012b6fcee7f97" - }, - "msg": "abcdef0123456789", - "u": [ - "0x314e8585fa92068b3ea2c3bab452d4257b38be1c097d58a21890456c2929614d" - ] - }, - { - "P": { - "x": "0x324532006312be4f162614076460315f7a54a6f85544da773dc659aca0311853", - "y": "0x8d8197374bcd52de2acfefc8a54fe2c8d8bebd2a39f16be9b710e4b1af6ef883" - }, - "Q": { - "x": "0x324532006312be4f162614076460315f7a54a6f85544da773dc659aca0311853", - "y": "0x8d8197374bcd52de2acfefc8a54fe2c8d8bebd2a39f16be9b710e4b1af6ef883" - }, - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "u": [ - "0x752d8eaa38cd785a799a31d63d99c2ae4261823b4a367b133b2c6627f48858ab" - ] - }, - { - "P": { - "x": "0x5c4bad52f81f39c8e8de1260e9a06d72b8b00a0829a8ea004a610b0691bea5d9", - "y": "0xc801e7c0782af1f74f24fc385a8555da0582032a3ce038de637ccdcb16f7ef7b" - }, - "Q": { - "x": "0x5c4bad52f81f39c8e8de1260e9a06d72b8b00a0829a8ea004a610b0691bea5d9", - "y": "0xc801e7c0782af1f74f24fc385a8555da0582032a3ce038de637ccdcb16f7ef7b" - }, - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "u": [ - "0x0e1527840b9df2dfbef966678ff167140f2b27c4dccd884c25014dce0e41dfa3" - ] - } - ] -} diff --git a/group/testdata/P256_XMD-SHA-256_SSWU_RO_.json b/group/testdata/P256_XMD-SHA-256_SSWU_RO_.json deleted file mode 100644 index cf5736ad..00000000 --- a/group/testdata/P256_XMD-SHA-256_SSWU_RO_.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "L": "0x30", - "Z": "0xffffffff00000001000000000000000000000000fffffffffffffffffffffff5", - "ciphersuite": "P256_XMD:SHA-256_SSWU_RO_", - "curve": "NIST P-256", - "dst": "QUUX-V01-CS02-with-P256_XMD:SHA-256_SSWU_RO_", - "expand": "XMD", - "field": { - "m": "0x1", - "p": "0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff" - }, - "hash": "sha256", - "k": "0x80", - "map": { - "name": "SSWU" - }, - "randomOracle": true, - "vectors": [ - { - "P": { - "x": "0x2c15230b26dbc6fc9a37051158c95b79656e17a1a920b11394ca91c44247d3e4", - "y": "0x8a7a74985cc5c776cdfe4b1f19884970453912e9d31528c060be9ab5c43e8415" - }, - "Q0": { - "x": "0xab640a12220d3ff283510ff3f4b1953d09fad35795140b1c5d64f313967934d5", - "y": "0xdccb558863804a881d4fff3455716c836cef230e5209594ddd33d85c565b19b1" - }, - "Q1": { - "x": "0x51cce63c50d972a6e51c61334f0f4875c9ac1cd2d3238412f84e31da7d980ef5", - "y": "0xb45d1a36d00ad90e5ec7840a60a4de411917fbe7c82c3949a6e699e5a1b66aac" - }, - "msg": "", - "u": [ - "0xad5342c66a6dd0ff080df1da0ea1c04b96e0330dd89406465eeba11582515009", - "0x8c0f1d43204bd6f6ea70ae8013070a1518b43873bcd850aafa0a9e220e2eea5a" - ] - }, - { - "P": { - "x": "0x0bb8b87485551aa43ed54f009230450b492fead5f1cc91658775dac4a3388a0f", - "y": "0x5c41b3d0731a27a7b14bc0bf0ccded2d8751f83493404c84a88e71ffd424212e" - }, - "Q0": { - "x": "0x5219ad0ddef3cc49b714145e91b2f7de6ce0a7a7dc7406c7726c7e373c58cb48", - "y": "0x7950144e52d30acbec7b624c203b1996c99617d0b61c2442354301b191d93ecf" - }, - "Q1": { - "x": "0x019b7cb4efcfeaf39f738fe638e31d375ad6837f58a852d032ff60c69ee3875f", - "y": "0x589a62d2b22357fed5449bc38065b760095ebe6aeac84b01156ee4252715446e" - }, - "msg": "abc", - "u": [ - "0xafe47f2ea2b10465cc26ac403194dfb68b7f5ee865cda61e9f3e07a537220af1", - "0x379a27833b0bfe6f7bdca08e1e83c760bf9a338ab335542704edcd69ce9e46e0" - ] - }, - { - "P": { - "x": "0x65038ac8f2b1def042a5df0b33b1f4eca6bff7cb0f9c6c1526811864e544ed80", - "y": "0xcad44d40a656e7aff4002a8de287abc8ae0482b5ae825822bb870d6df9b56ca3" - }, - "Q0": { - "x": "0xa17bdf2965eb88074bc01157e644ed409dac97cfcf0c61c998ed0fa45e79e4a2", - "y": "0x4f1bc80c70d411a3cc1d67aeae6e726f0f311639fee560c7f5a664554e3c9c2e" - }, - "Q1": { - "x": "0x7da48bb67225c1a17d452c983798113f47e438e4202219dd0715f8419b274d66", - "y": "0xb765696b2913e36db3016c47edb99e24b1da30e761a8a3215dc0ec4d8f96e6f9" - }, - "msg": "abcdef0123456789", - "u": [ - "0x0fad9d125a9477d55cf9357105b0eb3a5c4259809bf87180aa01d651f53d312c", - "0xb68597377392cd3419d8fcc7d7660948c8403b19ea78bbca4b133c9d2196c0fb" - ] - }, - { - "P": { - "x": "0x4be61ee205094282ba8a2042bcb48d88dfbb609301c49aa8b078533dc65a0b5d", - "y": "0x98f8df449a072c4721d241a3b1236d3caccba603f916ca680f4539d2bfb3c29e" - }, - "Q0": { - "x": "0xc76aaa823aeadeb3f356909cb08f97eee46ecb157c1f56699b5efebddf0e6398", - "y": "0x776a6f45f528a0e8d289a4be12c4fab80762386ec644abf2bffb9b627e4352b1" - }, - "Q1": { - "x": "0x418ac3d85a5ccc4ea8dec14f750a3a9ec8b85176c95a7022f391826794eb5a75", - "y": "0xfd6604f69e9d9d2b74b072d14ea13050db72c932815523305cb9e807cc900aff" - }, - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "u": [ - "0x3bbc30446f39a7befad080f4d5f32ed116b9534626993d2cc5033f6f8d805919", - "0x76bb02db019ca9d3c1e02f0c17f8baf617bbdae5c393a81d9ce11e3be1bf1d33" - ] - }, - { - "P": { - "x": "0x457ae2981f70ca85d8e24c308b14db22f3e3862c5ea0f652ca38b5e49cd64bc5", - "y": "0xecb9f0eadc9aeed232dabc53235368c1394c78de05dd96893eefa62b0f4757dc" - }, - "Q0": { - "x": "0xd88b989ee9d1295df413d4456c5c850b8b2fb0f5402cc5c4c7e815412e926db8", - "y": "0xbb4a1edeff506cf16def96afff41b16fc74f6dbd55c2210e5b8f011ba32f4f40" - }, - "Q1": { - "x": "0xa281e34e628f3a4d2a53fa87ff973537d68ad4fbc28d3be5e8d9f6a2571c5a4b", - "y": "0xf6ed88a7aab56a488100e6f1174fa9810b47db13e86be999644922961206e184" - }, - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "u": [ - "0x4ebc95a6e839b1ae3c63b847798e85cb3c12d3817ec6ebc10af6ee51adb29fec", - "0x4e21af88e22ea80156aff790750121035b3eefaa96b425a8716e0d20b4e269ee" - ] - } - ] -} diff --git a/group/testdata/P384_XMD-SHA-384_SSWU_NU_.json b/group/testdata/P384_XMD-SHA-384_SSWU_NU_.json deleted file mode 100644 index f0614d49..00000000 --- a/group/testdata/P384_XMD-SHA-384_SSWU_NU_.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "L": "0x48", - "Z": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffff3", - "ciphersuite": "P384_XMD:SHA-384_SSWU_NU_", - "curve": "NIST P-384", - "dst": "QUUX-V01-CS02-with-P384_XMD:SHA-384_SSWU_NU_", - "expand": "XMD", - "field": { - "m": "0x1", - "p": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff" - }, - "hash": "sha384", - "k": "0xc0", - "map": { - "name": "SSWU" - }, - "randomOracle": false, - "vectors": [ - { - "P": { - "x": "0xde5a893c83061b2d7ce6a0d8b049f0326f2ada4b966dc7e72927256b033ef61058029a3bfb13c1c7ececd6641881ae20", - "y": "0x63f46da6139785674da315c1947e06e9a0867f5608cf24724eb3793a1f5b3809ee28eb21a0c64be3be169afc6cdb38ca" - }, - "Q": { - "x": "0xde5a893c83061b2d7ce6a0d8b049f0326f2ada4b966dc7e72927256b033ef61058029a3bfb13c1c7ececd6641881ae20", - "y": "0x63f46da6139785674da315c1947e06e9a0867f5608cf24724eb3793a1f5b3809ee28eb21a0c64be3be169afc6cdb38ca" - }, - "msg": "", - "u": [ - "0xbc7dc1b2cdc5d588a66de3276b0f24310d4aca4977efda7d6272e1be25187b001493d267dc53b56183c9e28282368e60" - ] - }, - { - "P": { - "x": "0x1f08108b87e703c86c872ab3eb198a19f2b708237ac4be53d7929fb4bd5194583f40d052f32df66afe5249c9915d139b", - "y": "0x1369dc8d5bf038032336b989994874a2270adadb67a7fcc32f0f8824bc5118613f0ac8de04a1041d90ff8a5ad555f96c" - }, - "Q": { - "x": "0x1f08108b87e703c86c872ab3eb198a19f2b708237ac4be53d7929fb4bd5194583f40d052f32df66afe5249c9915d139b", - "y": "0x1369dc8d5bf038032336b989994874a2270adadb67a7fcc32f0f8824bc5118613f0ac8de04a1041d90ff8a5ad555f96c" - }, - "msg": "abc", - "u": [ - "0x9de6cf41e6e41c03e4a7784ac5c885b4d1e49d6de390b3cdd5a1ac5dd8c40afb3dfd7bb2686923bab644134483fc1926" - ] - }, - { - "P": { - "x": "0x4dac31ec8a82ee3c02ba2d7c9fa431f1e59ffe65bf977b948c59e1d813c2d7963c7be81aa6db39e78ff315a10115c0d0", - "y": "0x845333cdb5702ad5c525e603f302904d6fc84879f0ef2ee2014a6b13edd39131bfd66f7bd7cdc2d9ccf778f0c8892c3f" - }, - "Q": { - "x": "0x4dac31ec8a82ee3c02ba2d7c9fa431f1e59ffe65bf977b948c59e1d813c2d7963c7be81aa6db39e78ff315a10115c0d0", - "y": "0x845333cdb5702ad5c525e603f302904d6fc84879f0ef2ee2014a6b13edd39131bfd66f7bd7cdc2d9ccf778f0c8892c3f" - }, - "msg": "abcdef0123456789", - "u": [ - "0x84e2d430a5e2543573e58e368af41821ca3ccc97baba7e9aab51a84543d5a0298638a22ceee6090d9d642921112af5b7" - ] - }, - { - "P": { - "x": "0x13c1f8c52a492183f7c28e379b0475486718a7e3ac1dfef39283b9ce5fb02b73f70c6c1f3dfe0c286b03e2af1af12d1d", - "y": "0x57e101887e73e40eab8963324ed16c177d55eb89f804ec9df06801579820420b5546b579008df2145fd770f584a1a54c" - }, - "Q": { - "x": "0x13c1f8c52a492183f7c28e379b0475486718a7e3ac1dfef39283b9ce5fb02b73f70c6c1f3dfe0c286b03e2af1af12d1d", - "y": "0x57e101887e73e40eab8963324ed16c177d55eb89f804ec9df06801579820420b5546b579008df2145fd770f584a1a54c" - }, - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "u": [ - "0x504e4d5a529333b9205acaa283107bd1bffde753898f7744161f7dd19ba57fbb6a64214a2e00ddd2613d76cd508ddb30" - ] - }, - { - "P": { - "x": "0xaf129727a4207a8cb9e9dce656d88f79fce25edbcea350499d65e9bf1204537bdde73c7cefb752a6ed5ebcd44e183302", - "y": "0xce68a3d5e161b2e6a968e4ddaa9e51504ad1516ec170c7eef3ca6b5327943eca95d90b23b009ba45f58b72906f2a99e2" - }, - "Q": { - "x": "0xaf129727a4207a8cb9e9dce656d88f79fce25edbcea350499d65e9bf1204537bdde73c7cefb752a6ed5ebcd44e183302", - "y": "0xce68a3d5e161b2e6a968e4ddaa9e51504ad1516ec170c7eef3ca6b5327943eca95d90b23b009ba45f58b72906f2a99e2" - }, - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "u": [ - "0x7b01ce9b8c5a60d9fbc202d6dde92822e46915d8c17e03fcb92ece1ed6074d01e149fc9236def40d673de903c1d4c166" - ] - } - ] -} diff --git a/group/testdata/P384_XMD-SHA-384_SSWU_RO_.json b/group/testdata/P384_XMD-SHA-384_SSWU_RO_.json deleted file mode 100644 index bdd9cfaa..00000000 --- a/group/testdata/P384_XMD-SHA-384_SSWU_RO_.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "L": "0x48", - "Z": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffff3", - "ciphersuite": "P384_XMD:SHA-384_SSWU_RO_", - "curve": "NIST P-384", - "dst": "QUUX-V01-CS02-with-P384_XMD:SHA-384_SSWU_RO_", - "expand": "XMD", - "field": { - "m": "0x1", - "p": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff" - }, - "hash": "sha384", - "k": "0xc0", - "map": { - "name": "SSWU" - }, - "randomOracle": true, - "vectors": [ - { - "P": { - "x": "0xeb9fe1b4f4e14e7140803c1d99d0a93cd823d2b024040f9c067a8eca1f5a2eeac9ad604973527a356f3fa3aeff0e4d83", - "y": "0x0c21708cff382b7f4643c07b105c2eaec2cead93a917d825601e63c8f21f6abd9abc22c93c2bed6f235954b25048bb1a" - }, - "Q0": { - "x": "0xe4717e29eef38d862bee4902a7d21b44efb58c464e3e1f0d03894d94de310f8ffc6de86786dd3e15a1541b18d4eb2846", - "y": "0x6b95a6e639822312298a47526bb77d9cd7bcf76244c991c8cd70075e2ee6e8b9a135c4a37e3c0768c7ca871c0ceb53d4" - }, - "Q1": { - "x": "0x509527cfc0750eedc53147e6d5f78596c8a3b7360e0608e2fab0563a1670d58d8ae107c9f04bcf90e89489ace5650efd", - "y": "0x33337b13cb35e173fdea4cb9e8cce915d836ff57803dbbeb7998aa49d17df2ff09b67031773039d09fbd9305a1566bc4" - }, - "msg": "", - "u": [ - "0x25c8d7dc1acd4ee617766693f7f8829396065d1b447eedb155871feffd9c6653279ac7e5c46edb7010a0e4ff64c9f3b4", - "0x59428be4ed69131df59a0c6a8e188d2d4ece3f1b2a3a02602962b47efa4d7905945b1e2cc80b36aa35c99451073521ac" - ] - }, - { - "P": { - "x": "0xe02fc1a5f44a7519419dd314e29863f30df55a514da2d655775a81d413003c4d4e7fd59af0826dfaad4200ac6f60abe1", - "y": "0x01f638d04d98677d65bef99aef1a12a70a4cbb9270ec55248c04530d8bc1f8f90f8a6a859a7c1f1ddccedf8f96d675f6" - }, - "Q0": { - "x": "0xfc853b69437aee9a19d5acf96a4ee4c5e04cf7b53406dfaa2afbdd7ad2351b7f554e4bbc6f5db4177d4d44f933a8f6ee", - "y": "0x7e042547e01834c9043b10f3a8221c4a879cb156f04f72bfccab0c047a304e30f2aa8b2e260d34c4592c0c33dd0c6482" - }, - "Q1": { - "x": "0x57912293709b3556b43a2dfb137a315d256d573b82ded120ef8c782d607c05d930d958e50cb6dc1cc480b9afc38c45f1", - "y": "0xde9387dab0eef0bda219c6f168a92645a84665c4f2137c14270fb424b7532ff84843c3da383ceea24c47fa343c227bb8" - }, - "msg": "abc", - "u": [ - "0x53350214cb6bef0b51abb791b1c4209a2b4c16a0c67e1ab1401017fad774cd3b3f9a8bcdf7f6229dd8dd5a075cb149a0", - "0xc0473083898f63e03f26f14877a2407bd60c75ad491e7d26cbc6cc5ce815654075ec6b6898c7a41d74ceaf720a10c02e" - ] - }, - { - "P": { - "x": "0xbdecc1c1d870624965f19505be50459d363c71a699a496ab672f9a5d6b78676400926fbceee6fcd1780fe86e62b2aa89", - "y": "0x57cf1f99b5ee00f3c201139b3bfe4dd30a653193778d89a0accc5e0f47e46e4e4b85a0595da29c9494c1814acafe183c" - }, - "Q0": { - "x": "0x0ceece45b73f89844671df962ad2932122e878ad2259e650626924e4e7f132589341dec1480ebcbbbe3509d11fb570b7", - "y": "0xfafd71a3115298f6be4ae5c6dfc96c400cfb55760f185b7b03f3fa45f3f91eb65d27628b3c705cafd0466fafa54883ce" - }, - "Q1": { - "x": "0xdea1be8d3f9be4cbf4fab9d71d549dde76875b5d9b876832313a083ec81e528cbc2a0a1d0596b3bcb0ba77866b129776", - "y": "0xeb15fe71662214fb03b65541f40d3eb0f4cf5c3b559f647da138c9f9b7484c48a08760e02c16f1992762cb7298fa52cf" - }, - "msg": "abcdef0123456789", - "u": [ - "0xaab7fb87238cf6b2ab56cdcca7e028959bb2ea599d34f68484139dde85ec6548a6e48771d17956421bdb7790598ea52e", - "0x26e8d833552d7844d167833ca5a87c35bcfaa5a0d86023479fb28e5cd6075c18b168bf1f5d2a0ea146d057971336d8d1" - ] - }, - { - "P": { - "x": "0x03c3a9f401b78c6c36a52f07eeee0ec1289f178adf78448f43a3850e0456f5dd7f7633dd31676d990eda32882ab486c0", - "y": "0xcc183d0d7bdfd0a3af05f50e16a3f2de4abbc523215bf57c848d5ea662482b8c1f43dc453a93b94a8026db58f3f5d878" - }, - "Q0": { - "x": "0x051a22105e0817a35d66196338c8d85bd52690d79bba373ead8a86dd9899411513bb9f75273f6483395a7847fb21edb4", - "y": "0xf168295c1bbcff5f8b01248e9dbc885335d6d6a04aea960f7384f746ba6502ce477e624151cc1d1392b00df0f5400c06" - }, - "Q1": { - "x": "0x6ad7bc8ed8b841efd8ad0765c8a23d0b968ec9aa360a558ff33500f164faa02bee6c704f5f91507c4c5aad2b0dc5b943", - "y": "0x47313cc0a873ade774048338fc34ca5313f96bbf6ae22ac6ef475d85f03d24792dc6afba8d0b4a70170c1b4f0f716629" - }, - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "u": [ - "0x04c00051b0de6e726d228c85bf243bf5f4789efb512b22b498cde3821db9da667199b74bd5a09a79583c6d353a3bb41c", - "0x97580f218255f899f9204db64cd15e6a312cb4d8182375d1e5157c8f80f41d6a1a4b77fb1ded9dce56c32058b8d5202b" - ] - }, - { - "P": { - "x": "0x7b18d210b1f090ac701f65f606f6ca18fb8d081e3bc6cbd937c5604325f1cdea4c15c10a54ef303aabf2ea58bd9947a4", - "y": "0xea857285a33abb516732915c353c75c576bf82ccc96adb63c094dde580021eddeafd91f8c0bfee6f636528f3d0c47fd2" - }, - "Q0": { - "x": "0x42e6666f505e854187186bad3011598d9278b9d6e3e4d2503c3d236381a56748dec5d139c223129b324df53fa147c4df", - "y": "0x8ee51dbda46413bf621838cc935d18d617881c6f33f3838a79c767a1e5618e34b22f79142df708d2432f75c7366c8512" - }, - "Q1": { - "x": "0x4ff01ceeba60484fa1bc0d825fe1e5e383d8f79f1e5bb78e5fb26b7a7ef758153e31e78b9d60ce75c5e32e43869d4e12", - "y": "0x0f84b978fac8ceda7304b47e229d6037d32062e597dc7a9b95bcd9af441f3c56c619a901d21635f9ec6ab4710b9fcd0e" - }, - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "u": [ - "0x480cb3ac2c389db7f9dac9c396d2647ae946db844598971c26d1afd53912a1491199c0a5902811e4b809c26fcd37a014", - "0xd28435eb34680e148bf3908536e42231cba9e1f73ae2c6902a222a89db5c49c97db2f8fa4d4cd6e424b17ac60bdb9bb6" - ] - } - ] -} diff --git a/group/testdata/P521_XMD-SHA-512_SSWU_NU_.json b/group/testdata/P521_XMD-SHA-512_SSWU_NU_.json deleted file mode 100644 index 2c93d77b..00000000 --- a/group/testdata/P521_XMD-SHA-512_SSWU_NU_.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "L": "0x62", - "Z": "0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", - "ciphersuite": "P521_XMD:SHA-512_SSWU_NU_", - "curve": "NIST P-521", - "dst": "QUUX-V01-CS02-with-P521_XMD:SHA-512_SSWU_NU_", - "expand": "XMD", - "field": { - "m": "0x1", - "p": "0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - }, - "hash": "sha512", - "k": "0x100", - "map": { - "name": "SSWU" - }, - "randomOracle": false, - "vectors": [ - { - "P": { - "x": "0x01ec604b4e1e3e4c7449b7a41e366e876655538acf51fd40d08b97be066f7d020634e906b1b6942f9174b417027c953d75fb6ec64b8cee2a3672d4f1987d13974705", - "y": "0x00944fc439b4aad2463e5c9cfa0b0707af3c9a42e37c5a57bb4ecd12fef9fb21508568aedcdd8d2490472df4bbafd79081c81e99f4da3286eddf19be47e9c4cf0e91" - }, - "Q": { - "x": "0x01ec604b4e1e3e4c7449b7a41e366e876655538acf51fd40d08b97be066f7d020634e906b1b6942f9174b417027c953d75fb6ec64b8cee2a3672d4f1987d13974705", - "y": "0x00944fc439b4aad2463e5c9cfa0b0707af3c9a42e37c5a57bb4ecd12fef9fb21508568aedcdd8d2490472df4bbafd79081c81e99f4da3286eddf19be47e9c4cf0e91" - }, - "msg": "", - "u": [ - "0x01e4947fe62a4e47792cee2798912f672fff820b2556282d9843b4b465940d7683a986f93ccb0e9a191fbc09a6e770a564490d2a4ae51b287ca39f69c3d910ba6a4f" - ] - }, - { - "P": { - "x": "0x00c720ab56aa5a7a4c07a7732a0a4e1b909e32d063ae1b58db5f0eb5e09f08a9884bff55a2bef4668f715788e692c18c1915cd034a6b998311fcf46924ce66a2be9a", - "y": "0x003570e87f91a4f3c7a56be2cb2a078ffc153862a53d5e03e5dad5bccc6c529b8bab0b7dbb157499e1949e4edab21cf5d10b782bc1e945e13d7421ad8121dbc72b1d" - }, - "Q": { - "x": "0x00c720ab56aa5a7a4c07a7732a0a4e1b909e32d063ae1b58db5f0eb5e09f08a9884bff55a2bef4668f715788e692c18c1915cd034a6b998311fcf46924ce66a2be9a", - "y": "0x003570e87f91a4f3c7a56be2cb2a078ffc153862a53d5e03e5dad5bccc6c529b8bab0b7dbb157499e1949e4edab21cf5d10b782bc1e945e13d7421ad8121dbc72b1d" - }, - "msg": "abc", - "u": [ - "0x0019b85ef78596efc84783d42799e80d787591fe7432dee1d9fa2b7651891321be732ddf653fa8fefa34d86fb728db569d36b5b6ed3983945854b2fc2dc6a75aa25b" - ] - }, - { - "P": { - "x": "0x00bcaf32a968ff7971b3bbd9ce8edfbee1309e2019d7ff373c38387a782b005dce6ceffccfeda5c6511c8f7f312f343f3a891029c5858f45ee0bf370aba25fc990cc", - "y": "0x00923517e767532d82cb8a0b59705eec2b7779ce05f9181c7d5d5e25694ef8ebd4696343f0bc27006834d2517215ecf79482a84111f50c1bae25044fe1dd77744bbd" - }, - "Q": { - "x": "0x00bcaf32a968ff7971b3bbd9ce8edfbee1309e2019d7ff373c38387a782b005dce6ceffccfeda5c6511c8f7f312f343f3a891029c5858f45ee0bf370aba25fc990cc", - "y": "0x00923517e767532d82cb8a0b59705eec2b7779ce05f9181c7d5d5e25694ef8ebd4696343f0bc27006834d2517215ecf79482a84111f50c1bae25044fe1dd77744bbd" - }, - "msg": "abcdef0123456789", - "u": [ - "0x01dba0d7fa26a562ee8a9014ebc2cca4d66fd9de036176aca8fc11ef254cd1bc208847ab7701dbca7af328b3f601b11a1737a899575a5c14f4dca5aaca45e9935e07" - ] - }, - { - "P": { - "x": "0x001ac69014869b6c4ad7aa8c443c255439d36b0e48a0f57b03d6fe9c40a66b4e2eaed2a93390679a5cc44b3a91862b34b673f0e92c83187da02bf3db967d867ce748", - "y": "0x00d5603d530e4d62b30fccfa1d90c2206654d74291c1db1c25b86a051ee3fffc294e5d56f2e776853406bd09206c63d40f37ad8829524cf89ad70b5d6e0b4a3b7341" - }, - "Q": { - "x": "0x001ac69014869b6c4ad7aa8c443c255439d36b0e48a0f57b03d6fe9c40a66b4e2eaed2a93390679a5cc44b3a91862b34b673f0e92c83187da02bf3db967d867ce748", - "y": "0x00d5603d530e4d62b30fccfa1d90c2206654d74291c1db1c25b86a051ee3fffc294e5d56f2e776853406bd09206c63d40f37ad8829524cf89ad70b5d6e0b4a3b7341" - }, - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "u": [ - "0x00844da980675e1244cb209dcf3ea0aabec23bd54b2cda69fff86eb3acc318bf3d01bae96e9cd6f4c5ceb5539df9a7ad7fcc5e9d54696081ba9782f3a0f6d14987e3" - ] - }, - { - "P": { - "x": "0x01801de044c517a80443d2bd4f503a9e6866750d2f94a22970f62d721f96e4310e4a828206d9cdeaa8f2d476705cc3bbc490a6165c687668f15ec178a17e3d27349b", - "y": "0x0068889ea2e1442245fe42bfda9e58266828c0263119f35a61631a3358330f3bb84443fcb54fcd53a1d097fccbe310489b74ee143fc2938959a83a1f7dd4a6fd395b" - }, - "Q": { - "x": "0x01801de044c517a80443d2bd4f503a9e6866750d2f94a22970f62d721f96e4310e4a828206d9cdeaa8f2d476705cc3bbc490a6165c687668f15ec178a17e3d27349b", - "y": "0x0068889ea2e1442245fe42bfda9e58266828c0263119f35a61631a3358330f3bb84443fcb54fcd53a1d097fccbe310489b74ee143fc2938959a83a1f7dd4a6fd395b" - }, - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "u": [ - "0x01aab1fb7e5cd44ba4d9f32353a383cb1bb9eb763ed40b32bdd5f666988970205998c0e44af6e2b5f6f8e48e969b3f649cae3c6ab463e1b274d968d91c02f00cce91" - ] - } - ] -} diff --git a/group/testdata/P521_XMD-SHA-512_SSWU_RO_.json b/group/testdata/P521_XMD-SHA-512_SSWU_RO_.json deleted file mode 100644 index 0736b8bc..00000000 --- a/group/testdata/P521_XMD-SHA-512_SSWU_RO_.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "L": "0x62", - "Z": "0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", - "ciphersuite": "P521_XMD:SHA-512_SSWU_RO_", - "curve": "NIST P-521", - "dst": "QUUX-V01-CS02-with-P521_XMD:SHA-512_SSWU_RO_", - "expand": "XMD", - "field": { - "m": "0x1", - "p": "0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - }, - "hash": "sha512", - "k": "0x100", - "map": { - "name": "SSWU" - }, - "randomOracle": true, - "vectors": [ - { - "P": { - "x": "0x00fd767cebb2452030358d0e9cf907f525f50920c8f607889a6a35680727f64f4d66b161fafeb2654bea0d35086bec0a10b30b14adef3556ed9f7f1bc23cecc9c088", - "y": "0x0169ba78d8d851e930680322596e39c78f4fe31b97e57629ef6460ddd68f8763fd7bd767a4e94a80d3d21a3c2ee98347e024fc73ee1c27166dc3fe5eeef782be411d" - }, - "Q0": { - "x": "0x00b70ae99b6339fffac19cb9bfde2098b84f75e50ac1e80d6acb954e4534af5f0e9c4a5b8a9c10317b8e6421574bae2b133b4f2b8c6ce4b3063da1d91d34fa2b3a3c", - "y": "0x007f368d98a4ddbf381fb354de40e44b19e43bb11a1278759f4ea7b485e1b6db33e750507c071250e3e443c1aaed61f2c28541bb54b1b456843eda1eb15ec2a9b36e" - }, - "Q1": { - "x": "0x01143d0e9cddcdacd6a9aafe1bcf8d218c0afc45d4451239e821f5d2a56df92be942660b532b2aa59a9c635ae6b30e803c45a6ac871432452e685d661cd41cf67214", - "y": "0x00ff75515df265e996d702a5380defffab1a6d2bc232234c7bcffa433cd8aa791fbc8dcf667f08818bffa739ae25773b32073213cae9a0f2a917a0b1301a242dda0c" - }, - "msg": "", - "u": [ - "0x01e5f09974e5724f25286763f00ce76238c7a6e03dc396600350ee2c4135fb17dc555be99a4a4bae0fd303d4f66d984ed7b6a3ba386093752a855d26d559d69e7e9e", - "0x00ae593b42ca2ef93ac488e9e09a5fe5a2f6fb330d18913734ff602f2a761fcaaf5f596e790bcc572c9140ec03f6cccc38f767f1c1975a0b4d70b392d95a0c7278aa" - ] - }, - { - "P": { - "x": "0x002f89a1677b28054b50d15e1f81ed6669b5a2158211118ebdef8a6efc77f8ccaa528f698214e4340155abc1fa08f8f613ef14a043717503d57e267d57155cf784a4", - "y": "0x010e0be5dc8e753da8ce51091908b72396d3deed14ae166f66d8ebf0a4e7059ead169ea4bead0232e9b700dd380b316e9361cfdba55a08c73545563a80966ecbb86d" - }, - "Q0": { - "x": "0x01b254e1c99c835836f0aceebba7d77750c48366ecb07fb658e4f5b76e229ae6ca5d271bb0006ffcc42324e15a6d3daae587f9049de2dbb0494378ffb60279406f56", - "y": "0x01845f4af72fc2b1a5a2fe966f6a97298614288b456cfc385a425b686048b25c952fbb5674057e1eb055d04568c0679a8e2dda3158dc16ac598dbb1d006f5ad915b0" - }, - "Q1": { - "x": "0x007f08e813c620e527c961b717ffc74aac7afccb9158cebc347d5715d5c2214f952c97e194f11d114d80d3481ed766ac0a3dba3eb73f6ff9ccb9304ad10bbd7b4a36", - "y": "0x0022468f92041f9970a7cc025d71d5b647f822784d29ca7b3bc3b0829d6bb8581e745f8d0cc9dc6279d0450e779ac2275c4c3608064ad6779108a7828ebd9954caeb" - }, - "msg": "abc", - "u": [ - "0x003d00c37e95f19f358adeeaa47288ec39998039c3256e13c2a4c00a7cb61a34c8969472960150a27276f2390eb5e53e47ab193351c2d2d9f164a85c6a5696d94fe8", - "0x01f3cbd3df3893a45a2f1fecdac4d525eb16f345b03e2820d69bc580f5cbe9cb89196fdf720ef933c4c0361fcfe29940fd0db0a5da6bafb0bee8876b589c41365f15" - ] - }, - { - "P": { - "x": "0x006e200e276a4a81760099677814d7f8794a4a5f3658442de63c18d2244dcc957c645e94cb0754f95fcf103b2aeaf94411847c24187b89fb7462ad3679066337cbc4", - "y": "0x001dd8dfa9775b60b1614f6f169089d8140d4b3e4012949b52f98db2deff3e1d97bf73a1fa4d437d1dcdf39b6360cc518d8ebcc0f899018206fded7617b654f6b168" - }, - "Q0": { - "x": "0x0021482e8622aac14da60e656043f79a6a110cbae5012268a62dd6a152c41594549f373910ebed170ade892dd5a19f5d687fae7095a461d583f8c4295f7aaf8cd7da", - "y": "0x0177e2d8c6356b7de06e0b5712d8387d529b848748e54a8bc0ef5f1475aa569f8f492fa85c3ad1c5edc51faf7911f11359bfa2a12d2ef0bd73df9cb5abd1b101c8b1" - }, - "Q1": { - "x": "0x00abeafb16fdbb5eb95095678d5a65c1f293291dfd20a3751dbe05d0a9bfe2d2eef19449fe59ec32cdd4a4adc3411177c0f2dffd0159438706159a1bbd0567d9b3d0", - "y": "0x007cc657f847db9db651d91c801741060d63dab4056d0a1d3524e2eb0e819954d8f677aa353bd056244a88f00017e00c3ce8beeedb4382d83d74418bd48930c6c182" - }, - "msg": "abcdef0123456789", - "u": [ - "0x00183ee1a9bbdc37181b09ec336bcaa34095f91ef14b66b1485c166720523dfb81d5c470d44afcb52a87b704dbc5c9bc9d0ef524dec29884a4795f55c1359945baf3", - "0x00504064fd137f06c81a7cf0f84aa7e92b6b3d56c2368f0a08f44776aa8930480da1582d01d7f52df31dca35ee0a7876500ece3d8fe0293cd285f790c9881c998d5e" - ] - }, - { - "P": { - "x": "0x01b264a630bd6555be537b000b99a06761a9325c53322b65bdc41bf196711f9708d58d34b3b90faf12640c27b91c70a507998e55940648caa8e71098bf2bc8d24664", - "y": "0x01ea9f445bee198b3ee4c812dcf7b0f91e0881f0251aab272a12201fd89b1a95733fd2a699c162b639e9acdcc54fdc2f6536129b6beb0432be01aa8da02df5e59aaa" - }, - "Q0": { - "x": "0x0005eac7b0b81e38727efcab1e375f6779aea949c3e409b53a1d37aa2acbac87a7e6ad24aafbf3c52f82f7f0e21b872e88c55e17b7fa21ce08a94ea2121c42c2eb73", - "y": "0x00a173b6a53a7420dbd61d4a21a7c0a52de7a5c6ce05f31403bef747d16cc8604a039a73bdd6e114340e55dacd6bea8e217ffbadfb8c292afa3e1b2afc839a6ce7bb" - }, - "Q1": { - "x": "0x01881e3c193a69e4d88d8180a6879b74782a0bc7e529233e9f84bf7f17d2f319c36920ffba26f9e57a1e045cc7822c834c239593b6e142a694aa00c757b0db79e5e8", - "y": "0x01558b16d396d866e476e001f2dd0758927655450b84e12f154032c7c2a6db837942cd9f44b814f79b4d729996ced61eec61d85c675139cbffe3fbf071d2c21cfecb" - }, - "msg": "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", - "u": [ - "0x0159871e222689aad7694dc4c3480a49807b1eedd9c8cb4ae1b219d5ba51655ea5b38e2e4f56b36bf3e3da44a7b139849d28f598c816fe1bc7ed15893b22f63363c3", - "0x004ef0cffd475152f3858c0a8ccbdf7902d8261da92744e98df9b7fadb0a5502f29c5086e76e2cf498f47321434a40b1504911552ce44ad7356a04e08729ad9411f5" - ] - }, - { - "P": { - "x": "0x00c12bc3e28db07b6b4d2a2b1167ab9e26fc2fa85c7b0498a17b0347edf52392856d7e28b8fa7a2dd004611159505835b687ecf1a764857e27e9745848c436ef3925", - "y": "0x01cd287df9a50c22a9231beb452346720bb163344a41c5f5a24e8335b6ccc595fd436aea89737b1281aecb411eb835f0b939073fdd1dd4d5a2492e91ef4a3c55bcbd" - }, - "Q0": { - "x": "0x00041f6eb92af8777260718e4c22328a7d74203350c6c8f5794d99d5789766698f459b83d5068276716f01429934e40af3d1111a22780b1e07e72238d2207e5386be", - "y": "0x001c712f0182813942b87cab8e72337db017126f52ed797dd234584ac9ae7e80dfe7abea11db02cf1855312eae1447dbaecc9d7e8c880a5e76a39f6258074e1bc2e0" - }, - "Q1": { - "x": "0x0125c0b69bcf55eab49280b14f707883405028e05c927cd7625d4e04115bd0e0e6323b12f5d43d0d6d2eff16dbcf244542f84ec058911260dc3bb6512ab5db285fbd", - "y": "0x008bddfb803b3f4c761458eb5f8a0aee3e1f7f68e9d7424405fa69172919899317fb6ac1d6903a432d967d14e0f80af63e7035aaae0c123e56862ce969456f99f102" - }, - "msg": "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "u": [ - "0x0033d06d17bc3b9a3efc081a05d65805a14a3050a0dd4dfb4884618eb5c73980a59c5a246b18f58ad022dd3630faa22889fbb8ba1593466515e6ab4aeb7381c26334", - "0x0092290ab99c3fea1a5b8fb2ca49f859994a04faee3301cefab312d34227f6a2d0c3322cf76861c6a3683bdaa2dd2a6daa5d6906c663e065338b2344d20e313f1114" - ] - } - ] -} diff --git a/kem/frodo/doc.go b/kem/frodo/doc.go deleted file mode 100644 index bf4f4b6f..00000000 --- a/kem/frodo/doc.go +++ /dev/null @@ -1,11 +0,0 @@ -// Package frodo provides the key encapsulation mechanism FrodoKEM. -// -// Compatible with the implementation submitted to round 3 of the -// NIST PQC competition [1]. This implementation draws heavily from the PQClean -// implementation [2]. -// -// References: -// -// [1] https://frodokem.org/files/FrodoKEM-specification-20210604.pdf -// [2] https://github.com/PQClean/PQClean/tree/master/crypto_kem/frodokem640shake/clean -package frodo diff --git a/kem/frodo/frodo640shake/frodo.go b/kem/frodo/frodo640shake/frodo.go deleted file mode 100644 index 28c25724..00000000 --- a/kem/frodo/frodo640shake/frodo.go +++ /dev/null @@ -1,547 +0,0 @@ -// Package frodo640shake implements the variant FrodoKEM-640 with SHAKE. -package frodo640shake - -import ( - "bytes" - cryptoRand "crypto/rand" - "crypto/subtle" - "io" - - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/kem" -) - -const ( - paramN = 640 - - // Denoted by 'mbar' in the FrodoKEM spec. - paramNbar = 8 - - logQ = 15 - logQMask = ((1 << logQ) - 1) - seedASize = 16 - pkHashSize = 16 - - // Denoted by 'B' in the FrodoKEM spec. - extractedBits = 2 - - messageSize = 16 - matrixBpPackedSize = (logQ * (paramN * paramNbar)) / 8 -) - -const ( - // Size of seed for NewKeyFromSeed. - // = len(s) + len(seedSE) + len(z). - KeySeedSize = SharedKeySize + SharedKeySize + 16 - - // Size of seed for EncapsulateTo. - EncapsulationSeedSize = 16 - - // Size of the established shared key. - SharedKeySize = 16 - - // Size of the encapsulated shared key. - CiphertextSize = 9720 - - // Size of a packed public key. - PublicKeySize = 9616 - - // Size of a packed private key. - PrivateKeySize = 19888 -) - -// Multi-dimensional arrays are stored in 1-dimensional arrays in -// row-major order. -type ( - nByNU16 [paramN * paramN]uint16 - nByNbarU16 [paramN * paramNbar]uint16 - nbarByNU16 [paramNbar * paramN]uint16 - nbarByNbarU16 [paramNbar * paramNbar]uint16 -) - -// Type of a FrodoKEM-640-SHAKE public key -type PublicKey struct { - seedA [seedASize]byte - matrixB nByNbarU16 -} - -// Type of a FrodoKEM-640-SHAKE private key -type PrivateKey struct { - hashInputIfDecapsFail [SharedKeySize]byte - pk *PublicKey - - // matrixS stores transpose(S) - matrixS nByNbarU16 - - // H(packed(pk)) - hpk [pkHashSize]byte -} - -// NewKeyFromSeed derives a public/private keypair deterministically -// from the given seed. -// -// Panics if seed is not of length KeySeedSize. -func newKeyFromSeed(seed []byte) (*PublicKey, *PrivateKey) { - if len(seed) != KeySeedSize { - panic("seed must be of length KeySeedSize") - } - - var sk PrivateKey - var pk PublicKey - - var E nByNbarU16 - var byteSE [2 * (len(sk.matrixS) + len(E))]byte - - var A nByNU16 - - // Generate the secret value s, and the seed for S, E, and A. Add seedA to the public key - shake128 := sha3.NewShake128() - _, _ = shake128.Write(seed[2*SharedKeySize:]) - _, _ = shake128.Read(pk.seedA[:]) - - shake128.Reset() - _, _ = shake128.Write([]byte{0x5F}) - _, _ = shake128.Write(seed[SharedKeySize : 2*SharedKeySize]) - _, _ = shake128.Read(byteSE[:]) - - i := 0 - for i < len(sk.matrixS) { - sk.matrixS[i] = uint16(byteSE[i*2]) | (uint16(byteSE[(i*2)+1]) << 8) - i++ - } - sample(sk.matrixS[:]) - - for j := range E { - E[j] = uint16(byteSE[i*2]) | (uint16(byteSE[(i*2)+1]) << 8) - i++ - } - sample(E[:]) - - expandSeedIntoA(&A, &pk.seedA, &shake128) - mulAddASPlusE(&pk.matrixB, &A, &sk.matrixS, &E) - - // Populate the private key - copy(sk.hashInputIfDecapsFail[:], seed[0:SharedKeySize]) - sk.pk = &pk - - // Add H(pk) to the private key - shake128.Reset() - var ppk [PublicKeySize]byte - pk.Pack(ppk[:]) - _, _ = shake128.Write(ppk[:]) - _, _ = shake128.Read(sk.hpk[:]) - - return &pk, &sk -} - -// GenerateKeyPair generates public and private keys using entropy from rand. -// If rand is nil, crypto/rand.Reader will be used. -func generateKeyPair(rand io.Reader) (*PublicKey, *PrivateKey, error) { - var seed [KeySeedSize]byte - if rand == nil { - rand = cryptoRand.Reader - } - _, err := io.ReadFull(rand, seed[:]) - if err != nil { - return nil, nil, err - } - pk, sk := newKeyFromSeed(seed[:]) - return pk, sk, err -} - -// EncapsulateTo generates a shared key and a ciphertext containing said key -// from the public key and the randomness from seed and writes the shared key -// to ss and ciphertext to ct. -// -// Panics if ss, ct, or seed are not of length SharedKeySize, CiphertextSize -// and EncapsulationSeedSize respectively. -// -// seed may be nil, in which case crypto/rand.Reader is used to generate one. -func (pk *PublicKey) EncapsulateTo(ct []byte, ss []byte, seed []byte) { - if seed == nil { - seed = make([]byte, EncapsulationSeedSize) - if _, err := cryptoRand.Read(seed[:]); err != nil { - panic(err) - } - } - if len(seed) != EncapsulationSeedSize { - panic("seed must be of length EncapsulationSeedSize") - } - if len(ct) != CiphertextSize { - panic("ct must be of length CiphertextSize") - } - if len(ss) != SharedKeySize { - panic("ss must be of length SharedKeySize") - } - - var G2out [2 * SharedKeySize]byte - - var SpEpEpp [(paramN * paramNbar) + (paramN * paramNbar) + (paramNbar * paramNbar)]uint16 - var byteSpEpEpp [2 * len(SpEpEpp)]byte - Sp := SpEpEpp[:paramN*paramNbar] - Ep := SpEpEpp[paramN*paramNbar : 2*paramN*paramNbar] - Epp := SpEpEpp[2*paramN*paramNbar:] - - var Bp nbarByNU16 - - var V nbarByNbarU16 - var C nbarByNbarU16 - - var A nByNU16 - - var hpk [pkHashSize]byte - - var mu [messageSize]byte - copy(mu[:], seed[:messageSize]) - - // compute hpk = G_1(packed(pk)) - shake128 := sha3.NewShake128() - var ppk [PublicKeySize]byte - pk.Pack(ppk[:]) - _, _ = shake128.Write(ppk[:]) - _, _ = shake128.Read(hpk[:]) - - // compute (seedSE || k) = G_2(hpk || mu) - shake128.Reset() - _, _ = shake128.Write(hpk[:]) - _, _ = shake128.Write(mu[:]) - _, _ = shake128.Read(G2out[:]) - - // Generate Sp, Ep, Epp, and A, and compute: - // Bp = Sp*A + Ep - // V = Sp*B + Epp - shake128.Reset() - _, _ = shake128.Write([]byte{0x96}) - _, _ = shake128.Write(G2out[:SharedKeySize]) - _, _ = shake128.Read(byteSpEpEpp[:]) - for i := range SpEpEpp { - SpEpEpp[i] = uint16(byteSpEpEpp[i*2]) | (uint16(byteSpEpEpp[(i*2)+1]) << 8) - } - sample(SpEpEpp[:]) - - expandSeedIntoA(&A, &pk.seedA, &shake128) - mulAddSAPlusE(&Bp, Sp, &A, Ep) - - mulAddSBPlusE(&V, Sp, &pk.matrixB, Epp) - - // Encode mu, and compute C = V + enc(mu) (mod q) - encodeMessage(&C, &mu) - add(&C, &V, &C) - - // Prepare the ciphertext - pack(ct[:matrixBpPackedSize], Bp[:]) - pack(ct[matrixBpPackedSize:], C[:]) - - // Compute ss = F(ct||k) - shake128.Reset() - _, _ = shake128.Write(ct[:]) - _, _ = shake128.Write(G2out[SharedKeySize:]) - _, _ = shake128.Read(ss[:]) -} - -// DecapsulateTo computes the shared key that is encapsulated in ct -// from the private key. -// -// Panics if ct or ss are not of length CiphertextSize and SharedKeySize -// respectively. -func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { - if len(ct) != CiphertextSize { - panic("ct must be of length CiphertextSize") - } - if len(ss) != SharedKeySize { - panic("ss must be of length SharedKeySize") - } - - var Bp nbarByNU16 - var C nbarByNbarU16 - - var W nbarByNbarU16 - var CC nbarByNbarU16 - var BBp nbarByNU16 - - var SpEpEpp [(paramN * paramNbar) + (paramN * paramNbar) + (paramNbar * paramNbar)]uint16 - var byteSpEpEpp [2 * len(SpEpEpp)]byte - Sp := SpEpEpp[:paramN*paramNbar] - Ep := SpEpEpp[paramN*paramNbar : 2*paramN*paramNbar] - Epp := SpEpEpp[2*paramN*paramNbar:] - - var A nByNU16 - - var muprime [messageSize]byte - var G2out [2 * SharedKeySize]byte - - kprime := G2out[SharedKeySize:] - - // Compute W = C - Bp*S (mod q), and decode the randomness mu - unpack(Bp[:], ct[0:matrixBpPackedSize]) - unpack(C[:], ct[matrixBpPackedSize:]) - mulBS(&W, &Bp, &sk.matrixS) - sub(&W, &C, &W) - - decodeMessage(&muprime, &W) - - // Generate (seedSE' || k') = G_2(hpk || mu') - shake128 := sha3.NewShake128() - _, _ = shake128.Write(sk.hpk[:]) - _, _ = shake128.Write(muprime[:]) - _, _ = shake128.Read(G2out[:]) - - // Generate Sp, Ep, Epp, A, and compute BBp = Sp*A + Ep. - shake128.Reset() - _, _ = shake128.Write([]byte{0x96}) - _, _ = shake128.Write(G2out[:SharedKeySize]) - _, _ = shake128.Read(byteSpEpEpp[:]) - for i := range SpEpEpp { - SpEpEpp[i] = uint16(byteSpEpEpp[i*2]) | (uint16(byteSpEpEpp[(i*2)+1]) << 8) - } - - sample(SpEpEpp[:]) - - expandSeedIntoA(&A, &sk.pk.seedA, &shake128) - mulAddSAPlusE(&BBp, Sp[:], &A, Ep[:]) - - // Reduce BBp modulo q - for i := range BBp { - BBp[i] = BBp[i] & logQMask - } - - // compute W = Sp*B + Epp - mulAddSBPlusE(&W, Sp, &sk.pk.matrixB, Epp) - - // Encode mu, and compute CC = W + enc(mu') (mod q) - encodeMessage(&CC, &muprime) - add(&CC, &W, &CC) - - // Prepare input to F - - // If (Bp == BBp & C == CC) then ss = F(ct || k'), else ss = F(ct || s) - // Needs to avoid branching on secret data as per: - // Qian Guo, Thomas Johansson, Alexander Nilsson. A key-recovery timing attack on post-quantum - // primitives using the Fujisaki-Okamoto transformation and its application on FrodoKEM. In CRYPTO 2020. - selector := ctCompareU16(Bp[:], BBp[:]) | ctCompareU16(C[:], CC[:]) - // If (selector == 0) then load k' to do ss = F(ct || k'), else if (selector == 1) load s to do ss = F(ct || s) - subtle.ConstantTimeCopy(selector, kprime[:], sk.hashInputIfDecapsFail[:]) - - shake128.Reset() - _, _ = shake128.Write(ct[:]) - _, _ = shake128.Write(kprime[:]) - _, _ = shake128.Read(ss[:]) -} - -// Packs sk to buf. -// -// Panics if buf is not of size PrivateKeySize. -func (sk *PrivateKey) Pack(buf []byte) { - if len(buf) != PrivateKeySize { - panic("buf must be of length PrivateKeySize") - } - - copy(buf[:SharedKeySize], sk.hashInputIfDecapsFail[:]) - buf = buf[SharedKeySize:] - - sk.pk.Pack(buf[:PublicKeySize]) - buf = buf[PublicKeySize:] - - j := 0 - for i := range sk.matrixS { - buf[j] = byte(sk.matrixS[i]) - buf[j+1] = byte(sk.matrixS[i] >> 8) - j += 2 - } - buf = buf[j:] - - copy(buf[:], sk.hpk[:]) -} - -// Unpacks sk from buf. -// -// Panics if buf is not of size PrivateKeySize. -func (sk *PrivateKey) Unpack(buf []byte) { - if len(buf) != PrivateKeySize { - panic("buf must be of length PrivateKeySize") - } - - copy(sk.hashInputIfDecapsFail[:], buf[:SharedKeySize]) - buf = buf[SharedKeySize:] - - sk.pk = new(PublicKey) - sk.pk.Unpack(buf[:PublicKeySize]) - buf = buf[PublicKeySize:] - - for i := range sk.matrixS { - sk.matrixS[i] = uint16(buf[i*2]) | (uint16(buf[(i*2)+1]) << 8) - } - buf = buf[len(sk.matrixS)*2:] - - copy(sk.hpk[:], buf[:]) -} - -// Packs pk to buf. -// -// Panics if buf is not of size PublicKeySize. -func (pk *PublicKey) Pack(buf []byte) { - if len(buf) != PublicKeySize { - panic("buf must be of length PublicKeySize") - } - - copy(buf[:seedASize], pk.seedA[:]) - pack(buf[seedASize:], pk.matrixB[:]) -} - -// TODO: Unpacks pk from buf. -// -// Panics if buf is not of size PublicKeySize. -func (pk *PublicKey) Unpack(buf []byte) { - if len(buf) != PublicKeySize { - panic("buf must be of length PublicKeySize") - } - - copy(pk.seedA[:], buf[:seedASize]) - unpack(pk.matrixB[:], buf[seedASize:]) -} - -// Boilerplate down below for the KEM scheme API. - -type scheme struct{} - -var sch kem.Scheme = &scheme{} - -// Scheme returns a KEM interface. -func Scheme() kem.Scheme { return sch } - -func (scheme) Name() string { return "FrodoKEM-640-SHAKE" } -func (*scheme) PublicKeySize() int { return PublicKeySize } -func (*scheme) PrivateKeySize() int { return PrivateKeySize } -func (*scheme) SeedSize() int { return KeySeedSize } -func (*scheme) SharedKeySize() int { return SharedKeySize } -func (*scheme) CiphertextSize() int { return CiphertextSize } -func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } - -func (sk *PrivateKey) Scheme() kem.Scheme { return sch } -func (pk *PublicKey) Scheme() kem.Scheme { return sch } - -func (sk *PrivateKey) MarshalBinary() ([]byte, error) { - var ret [PrivateKeySize]byte - sk.Pack(ret[:]) - return ret[:], nil -} - -func (sk *PrivateKey) Equal(other kem.PrivateKey) bool { - oth, ok := other.(*PrivateKey) - if !ok { - return false - } - if sk.pk == nil && oth.pk == nil { - return true - } - if sk.pk == nil || oth.pk == nil { - return false - } - return ctCompareU16(sk.matrixS[:], oth.matrixS[:]) == 0 && - subtle.ConstantTimeCompare(sk.hashInputIfDecapsFail[:], oth.hashInputIfDecapsFail[:]) == 1 && - sk.pk.Equal(oth.pk) && - bytes.Equal(sk.hpk[:], oth.hpk[:]) -} - -func (pk *PublicKey) Equal(other kem.PublicKey) bool { - oth, ok := other.(*PublicKey) - if !ok { - return false - } - if pk == nil && oth == nil { - return true - } - if pk == nil || oth == nil { - return false - } - - for i := range pk.matrixB { - if (pk.matrixB[i] & logQMask) != (oth.matrixB[i] & logQMask) { - return false - } - } - return bytes.Equal(pk.seedA[:], oth.seedA[:]) -} - -func (sk *PrivateKey) Public() kem.PublicKey { - return sk.pk -} - -func (pk *PublicKey) MarshalBinary() ([]byte, error) { - var ret [PublicKeySize]byte - pk.Pack(ret[:]) - return ret[:], nil -} - -func (*scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { - return generateKeyPair(cryptoRand.Reader) -} - -func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { - if len(seed) != KeySeedSize { - panic(kem.ErrSeedSize) - } - return newKeyFromSeed(seed[:]) -} - -func (*scheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { - ct = make([]byte, CiphertextSize) - ss = make([]byte, SharedKeySize) - - pub, ok := pk.(*PublicKey) - if !ok { - return nil, nil, kem.ErrTypeMismatch - } - pub.EncapsulateTo(ct, ss, nil) - return -} - -func (*scheme) EncapsulateDeterministically( - pk kem.PublicKey, seed []byte, -) (ct, ss []byte, err error) { - if len(seed) != EncapsulationSeedSize { - return nil, nil, kem.ErrSeedSize - } - - ct = make([]byte, CiphertextSize) - ss = make([]byte, SharedKeySize) - - pub, ok := pk.(*PublicKey) - if !ok { - return nil, nil, kem.ErrTypeMismatch - } - pub.EncapsulateTo(ct, ss, seed) - return -} - -func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { - if len(ct) != CiphertextSize { - return nil, kem.ErrCiphertextSize - } - - priv, ok := sk.(*PrivateKey) - if !ok { - return nil, kem.ErrTypeMismatch - } - ss := make([]byte, SharedKeySize) - priv.DecapsulateTo(ss, ct) - return ss, nil -} - -func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { - if len(buf) != PublicKeySize { - return nil, kem.ErrPubKeySize - } - var ret PublicKey - ret.Unpack(buf) - return &ret, nil -} - -func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { - if len(buf) != PrivateKeySize { - return nil, kem.ErrPrivKeySize - } - var ret PrivateKey - ret.Unpack(buf) - return &ret, nil -} diff --git a/kem/frodo/frodo640shake/matrix_shake.go b/kem/frodo/frodo640shake/matrix_shake.go deleted file mode 100644 index 5be45e8c..00000000 --- a/kem/frodo/frodo640shake/matrix_shake.go +++ /dev/null @@ -1,55 +0,0 @@ -package frodo640shake - -import ( - "github.com/quantumcoinproject/circl/internal/sha3" -) - -func expandSeedIntoA(A *nByNU16, seed *[seedASize]byte, xof *sha3.State) { - var ARow [paramN * 2]byte - var seedSeparated [2 + seedASize]byte - - copy(seedSeparated[2:], seed[:]) - - for i := 0; i < paramN; i++ { - seedSeparated[0] = byte(i) - seedSeparated[1] = byte(i >> 8) - - xof.Reset() - _, _ = xof.Write(seedSeparated[:]) - _, _ = xof.Read(ARow[:]) - - for j := 0; j < paramN; j++ { - // No need to reduce modulo 2^15, extra bits are removed - // later on via packing or explicit reduction. - A[(i*paramN)+j] = uint16(ARow[j*2]) | (uint16(ARow[(j*2)+1]) << 8) - } - } -} - -func mulAddASPlusE(out *nByNbarU16, A *nByNU16, s *nByNbarU16, e *nByNbarU16) { - for i := 0; i < paramN; i++ { - for k := 0; k < paramNbar; k++ { - sum := e[i*paramNbar+k] - for j := 0; j < paramN; j++ { - sum += A[i*paramN+j] * s[k*paramN+j] - } - // No need to reduce modulo 2^15, extra bits are removed - // later on via packing or explicit reduction. - out[i*paramNbar+k] += sum - } - } -} - -func mulAddSAPlusE(out *nbarByNU16, s []uint16, A *nByNU16, e []uint16) { - for i := 0; i < paramN; i++ { - for k := 0; k < paramNbar; k++ { - sum := e[k*paramN+i] - for j := 0; j < paramN; j++ { - sum += A[j*paramN+i] * s[k*paramN+j] - } - // No need to reduce modulo 2^15, extra bits are removed - // later on via packing or explicit reduction. - out[k*paramN+i] += sum - } - } -} diff --git a/kem/frodo/frodo640shake/noise.go b/kem/frodo/frodo640shake/noise.go deleted file mode 100644 index 934ed9e4..00000000 --- a/kem/frodo/frodo640shake/noise.go +++ /dev/null @@ -1,26 +0,0 @@ -package frodo640shake - -const cdfTableLen = 13 - -var cdfTable [cdfTableLen]uint16 = [cdfTableLen]uint16{4643, 13363, 20579, 25843, 29227, 31145, 32103, 32525, 32689, 32745, 32762, 32766, 32767} - -// Take a uniformly distributed sample, and produce a sample in the FrodoKEM -// discrete Gaussian distribution using inverse transform sampling. -func sample(sampled []uint16) { - for i := 0; i < len(sampled); i++ { - var gaussianSample uint16 = 0 - sign := sampled[i] & 1 - unifSample := sampled[i] >> 1 - - for j := 0; j < cdfTableLen-1; j++ { - gaussianSample += (cdfTable[j] - unifSample) >> 15 - } - // If sign = 1, -sign = 0xFFFF and the bits of gaussianSample - // are flipped. Since gaussianSample is uint16, we have: - // - // flippedBits(gaussianSample) + 1 ≡ -gaussianSample (mod 2^16), - // - // and so the sign of gaussianSample is flipped. - sampled[i] = ((-sign) ^ gaussianSample) + sign - } -} diff --git a/kem/frodo/frodo640shake/util.go b/kem/frodo/frodo640shake/util.go deleted file mode 100644 index b060a673..00000000 --- a/kem/frodo/frodo640shake/util.go +++ /dev/null @@ -1,159 +0,0 @@ -package frodo640shake - -func add(out *nbarByNbarU16, lhs *nbarByNbarU16, rhs *nbarByNbarU16) { - for i := 0; i < len(out); i++ { - out[i] = (lhs[i] + rhs[i]) & logQMask - } -} - -func sub(out *nbarByNbarU16, lhs *nbarByNbarU16, rhs *nbarByNbarU16) { - for i := 0; i < len(out); i++ { - out[i] = (lhs[i] - rhs[i]) & logQMask - } -} - -func pack(out []byte, in []uint16) { - j := 0 - for i := 0; (i * 8) < len(in); i++ { - in0 := in[i*8] & logQMask - in1 := in[(i*8)+1] & logQMask - in2 := in[(i*8)+2] & logQMask - in3 := in[(i*8)+3] & logQMask - in4 := in[(i*8)+4] & logQMask - in5 := in[(i*8)+5] & logQMask - in6 := in[(i*8)+6] & logQMask - in7 := in[(i*8)+7] & logQMask - - out[j] |= byte(in0 >> 7) - out[j+1] = (byte(in0&0x7F) << 1) | byte(in1>>14) - - out[j+2] = byte(in1 >> 6) - out[j+3] = (byte(in1&0x3F) << 2) | byte(in2>>13) - - out[j+4] = byte(in2 >> 5) - out[j+5] = (byte(in2&0x1F) << 3) | byte(in3>>12) - - out[j+6] = byte(in3 >> 4) - out[j+7] = (byte(in3&0x0F) << 4) | byte(in4>>11) - - out[j+8] = byte(in4 >> 3) - out[j+9] = (byte(in4&0x07) << 5) | byte(in5>>10) - - out[j+10] = byte(in5 >> 2) - out[j+11] = (byte(in5&0x03) << 6) | byte(in6>>9) - - out[j+12] = byte(in6 >> 1) - out[j+13] = (byte(in6&0x01) << 7) | byte(in7>>8) - - out[j+14] = byte(in7) - j += 15 - } -} - -func unpack(out []uint16, in []byte) { - j := 0 - for i := 0; (i * 15) < len(in); i++ { - in0 := in[i*15] - in1 := in[(i*15)+1] - in2 := in[(i*15)+2] - in3 := in[(i*15)+3] - in4 := in[(i*15)+4] - in5 := in[(i*15)+5] - in6 := in[(i*15)+6] - in7 := in[(i*15)+7] - in8 := in[(i*15)+8] - in9 := in[(i*15)+9] - in10 := in[(i*15)+10] - in11 := in[(i*15)+11] - in12 := in[(i*15)+12] - in13 := in[(i*15)+13] - in14 := in[(i*15)+14] - - out[j] = (uint16(in0) << 7) | (uint16(in1&0xFE) >> 1) - out[j+1] = (uint16(in1&0x1) << 14) | (uint16(in2) << 6) | (uint16(in3&0xFC) >> 2) - - out[j+2] = (uint16(in3&0x03) << 13) | (uint16(in4) << 5) | (uint16(in5&0xF8) >> 3) - out[j+3] = (uint16(in5&0x07) << 12) | (uint16(in6) << 4) | (uint16(in7&0xF0) >> 4) - - out[j+4] = (uint16(in7&0x0F) << 11) | (uint16(in8) << 3) | (uint16(in9&0xE0) >> 5) - out[j+5] = (uint16(in9&0x1F) << 10) | (uint16(in10) << 2) | (uint16(in11&0xC0) >> 6) - - out[j+6] = (uint16(in11&0x3F) << 9) | (uint16(in12) << 1) | (uint16(in13&0x80) >> 7) - out[j+7] = (uint16(in13&0x7F) << 8) | uint16(in14) - j += 8 - } -} - -func encodeMessage(out *nbarByNbarU16, msg *[messageSize]byte) { - extractedBitsMask := uint16((1 << extractedBits) - 1) - outPos := 0 - - for i := 0; (i * 2) < len(msg); i++ { - in := uint16(msg[i*2]) | (uint16(msg[(i*2)+1]) << 8) - for j := 0; j < (16 / extractedBits); j++ { // 16 = bit size of out[i] - out[outPos] = (in & extractedBitsMask) << (logQ - extractedBits) - outPos++ - - in >>= extractedBits - } - } -} - -func decodeMessage(out *[messageSize]byte, msg *nbarByNbarU16) { - extractedBitsMask := uint16((1 << extractedBits) - 1) - msgPos := 0 - - for i := 0; i < len(out); i++ { - for j := 0; j < (8 / extractedBits); j++ { - temp := (msg[msgPos] & logQMask) + (1 << (logQ - extractedBits - 1)) - temp >>= (logQ - extractedBits) - temp &= extractedBitsMask - out[i] |= byte(temp) << (j * extractedBits) - msgPos++ - } - } -} - -func mulAddSBPlusE(out *nbarByNbarU16, s []uint16, b *nByNbarU16, e []uint16) { - // Multiply by s on the left - // Inputs: b (N x N_BAR), s (N_BAR x N), e (N_BAR x N_BAR) - // Output: out = s*b + e (N_BAR x N_BAR) - - for k := 0; k < paramNbar; k++ { - for i := 0; i < paramNbar; i++ { - out[k*paramNbar+i] = e[k*paramNbar+i] - for j := 0; j < paramN; j++ { - out[k*paramNbar+i] += s[k*paramN+j] * b[j*paramNbar+i] - } - out[k*paramNbar+i] = out[k*paramNbar+i] & logQMask - } - } -} - -func mulBS(out *nbarByNbarU16, b *nbarByNU16, s *nByNbarU16) { - for i := 0; i < paramNbar; i++ { - for j := 0; j < paramNbar; j++ { - out[i*paramNbar+j] = 0 - for k := 0; k < paramN; k++ { - out[i*paramNbar+j] += b[i*paramN+k] * s[j*paramN+k] - } - out[i*paramNbar+j] = out[i*paramNbar+j] & logQMask - } - } -} - -func ctCompareU16(lhs []uint16, rhs []uint16) int { - // Compare lhs and rhs in constant time. - // Returns 0 if they are equal, 1 otherwise. - if len(lhs) != len(rhs) { - return 1 - } - - var v uint16 - - for i := range lhs { - v |= lhs[i] ^ rhs[i] - } - - return int((v | -v) >> 15) -} diff --git a/kem/frodo/kat_test.go b/kem/frodo/kat_test.go deleted file mode 100644 index a0f6b1d9..00000000 --- a/kem/frodo/kat_test.go +++ /dev/null @@ -1,76 +0,0 @@ -package frodo - -// Code to generate the NIST "PQCsignKAT" test vectors. -// See PQCsignKAT_sign.c and randombytes.c in the reference implementation. - -import ( - "bytes" - "crypto/sha256" - "fmt" - "testing" - - "github.com/quantumcoinproject/circl/internal/nist" - "github.com/quantumcoinproject/circl/kem/schemes" -) - -func TestPQCgenKATKem(t *testing.T) { - kats := []struct { - name string - want string - }{ - // Computed from: - // https://github.com/microsoft/PQCrypto-LWEKE/blob/66fc7744c3aae6acfc5fcc587ec7f2cdec48d216/KAT/PQCkemKAT_19888_shake.rsp - {"FrodoKEM-640-SHAKE", "604a10cfc871dfaed9cb5b057c644ab03b16852cea7f39bc7f9831513b5b1cfa"}, - } - for _, kat := range kats { - t.Run(kat.name, func(t *testing.T) { - testPQCgenKATKem(t, kat.name, kat.want) - }) - } -} - -func testPQCgenKATKem(t *testing.T, name, expected string) { - scheme := schemes.ByName(name) - if scheme == nil { - t.Fatal() - } - - var seed [48]byte - kseed := make([]byte, scheme.SeedSize()) - eseed := make([]byte, scheme.EncapsulationSeedSize()) - for i := 0; i < 48; i++ { - seed[i] = byte(i) - } - f := sha256.New() - g := nist.NewDRBG(&seed) - fmt.Fprintf(f, "# %s\n\n", name) - for i := 0; i < 100; i++ { - g.Fill(seed[:]) - fmt.Fprintf(f, "count = %d\n", i) - fmt.Fprintf(f, "seed = %X\n", seed) - g2 := nist.NewDRBG(&seed) - - g2.Fill(kseed[:]) - - pk, sk := scheme.DeriveKeyPair(kseed) - ppk, _ := pk.MarshalBinary() - psk, _ := sk.MarshalBinary() - - g2.Fill(eseed) - ct, ss, err := scheme.EncapsulateDeterministically(pk, eseed) - if err != nil { - t.Fatal(err) - } - ss2, _ := scheme.Decapsulate(sk, ct) - if !bytes.Equal(ss, ss2) { - t.Fatal() - } - fmt.Fprintf(f, "pk = %X\n", ppk) - fmt.Fprintf(f, "sk = %X\n", psk) - fmt.Fprintf(f, "ct = %X\n", ct) - fmt.Fprintf(f, "ss = %X\n\n", ss) - } - if fmt.Sprintf("%x", f.Sum(nil)) != expected { - t.Fatal() - } -} diff --git a/kem/schemes/schemes.go b/kem/schemes/schemes.go index f0170e1a..4c42190e 100644 --- a/kem/schemes/schemes.go +++ b/kem/schemes/schemes.go @@ -12,7 +12,6 @@ // // Post-quantum kems: // -// FrodoKEM-640-SHAKE // Kyber512, Kyber768, Kyber1024 package schemes @@ -21,7 +20,6 @@ import ( "github.com/quantumcoinproject/circl/hpke" "github.com/quantumcoinproject/circl/kem" - "github.com/quantumcoinproject/circl/kem/frodo/frodo640shake" "github.com/quantumcoinproject/circl/kem/hybrid" "github.com/quantumcoinproject/circl/kem/kyber/kyber1024" "github.com/quantumcoinproject/circl/kem/kyber/kyber512" @@ -38,7 +36,6 @@ var allSchemes = [...]kem.Scheme{ hpke.KEM_P521_HKDF_SHA512.Scheme(), hpke.KEM_X25519_HKDF_SHA256.Scheme(), hpke.KEM_X448_HKDF_SHA512.Scheme(), - frodo640shake.Scheme(), kyber512.Scheme(), kyber768.Scheme(), kyber1024.Scheme(), diff --git a/kem/schemes/schemes_test.go b/kem/schemes/schemes_test.go index de45dfe1..ae33066b 100644 --- a/kem/schemes/schemes_test.go +++ b/kem/schemes/schemes_test.go @@ -147,7 +147,6 @@ func Example_schemes() { // HPKE_KEM_P521_HKDF_SHA512 // HPKE_KEM_X25519_HKDF_SHA256 // HPKE_KEM_X448_HKDF_SHA512 - // FrodoKEM-640-SHAKE // Kyber512 // Kyber768 // Kyber1024 diff --git a/kem/sike/doc.go b/kem/sike/doc.go deleted file mode 100644 index 18882371..00000000 --- a/kem/sike/doc.go +++ /dev/null @@ -1,10 +0,0 @@ -//go:generate go run gen.go - -// Package sike is deprecated, it contains the SIKE key encapsulation mechanism. -// -// # DEPRECATION NOTICE -// -// SIDH and SIKE are deprecated as were shown vulnerable to a key recovery -// attack by Castryck-Decru's paper (https://eprint.iacr.org/2022/975). New -// systems should not rely on this package. This package is frozen. -package sike diff --git a/kem/sike/gen.go b/kem/sike/gen.go deleted file mode 100644 index 603fc9a4..00000000 --- a/kem/sike/gen.go +++ /dev/null @@ -1,76 +0,0 @@ -//go:build ignore -// +build ignore - -// Autogenerates wrappers from templates to prevent too much duplicated code -// between the code for different modes. -package main - -import ( - "bytes" - "fmt" - "go/format" - "io/ioutil" - "strings" - "text/template" -) - -type Instance struct { - Bits int -} - -func (m Instance) Pkg() string { - return strings.ToLower(m.Name()) -} - -func (m Instance) Name() string { - return fmt.Sprintf("SIKEp%d", m.Bits) -} - -func (m Instance) Field() string { - return fmt.Sprintf("Fp%d", m.Bits) -} - -var ( - Instances = []Instance{ - {Bits: 434}, - {Bits: 503}, - {Bits: 751}, - } - TemplateWarning = "// Code generated from" -) - -func main() { - generatePackageFiles() -} - -// Generates instance/sike.go from templates/pkg.templ.go -func generatePackageFiles() { - tl, err := template.ParseFiles("templates/pkg.templ.go") - if err != nil { - panic(err) - } - - for _, mode := range Instances { - buf := new(bytes.Buffer) - err := tl.Execute(buf, mode) - if err != nil { - panic(err) - } - - // Formating output code - code, err := format.Source(buf.Bytes()) - if err != nil { - panic("error formating code") - } - - res := string(code) - offset := strings.Index(res, TemplateWarning) - if offset == -1 { - panic("Missing template warning in pkg.templ.go") - } - err = ioutil.WriteFile(mode.Pkg()+"/sike.go", []byte(res[offset:]), 0o644) - if err != nil { - panic(err) - } - } -} diff --git a/kem/sike/sikep434/sike.go b/kem/sike/sikep434/sike.go deleted file mode 100644 index a1ece579..00000000 --- a/kem/sike/sikep434/sike.go +++ /dev/null @@ -1,209 +0,0 @@ -// Code generated from pkg.templ.go. DO NOT EDIT. - -// Package sikep434 is deprecated, it implements the key encapsulation mechanism SIKEp434. -// -// # DEPRECATION NOTICE -// -// SIDH and SIKE are deprecated as were shown vulnerable to a key recovery -// attack by Castryck-Decru's paper (https://eprint.iacr.org/2022/975). New -// systems should not rely on this package. This package is frozen. -package sikep434 - -import ( - "bytes" - cryptoRand "crypto/rand" - "crypto/subtle" - "io" - - "github.com/quantumcoinproject/circl/dh/sidh" - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/kem" -) - -// Deprecated: not cryptographically secure. -type PrivateKey struct { - sk *sidh.PrivateKey - pk *sidh.PublicKey -} - -// Deprecated: not cryptographically secure. -type PublicKey sidh.PublicKey - -const ( - SeedSize = 32 - EncapsulationSeedSize = 32 -) - -type scheme struct{} - -var sch kem.Scheme = &scheme{} - -// Scheme returns a KEM interface. -// -// Deprecated: not cryptographically secure. -func Scheme() kem.Scheme { return sch } - -var params *sidh.KEM - -func (*scheme) Name() string { return "SIKEp434" } -func (*scheme) PublicKeySize() int { return params.PublicKeySize() } -func (*scheme) PrivateKeySize() int { return params.PrivateKeySize() } -func (*scheme) SeedSize() int { return SeedSize } -func (*scheme) SharedKeySize() int { return params.SharedSecretSize() } -func (*scheme) CiphertextSize() int { return params.CiphertextSize() } -func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } - -func (sk *PrivateKey) Scheme() kem.Scheme { return sch } -func (pk *PublicKey) Scheme() kem.Scheme { return sch } - -func (sk *PrivateKey) MarshalBinary() ([]byte, error) { - ret := make([]byte, sk.sk.Size()) - sk.sk.Export(ret) - return ret, nil -} - -func (sk *PrivateKey) Equal(other kem.PrivateKey) bool { - oth, ok := other.(*PrivateKey) - if !ok { - return false - } - a, _ := sk.MarshalBinary() - b, _ := oth.MarshalBinary() - return subtle.ConstantTimeCompare(a, b) == 1 -} - -func (sk *PrivateKey) Public() kem.PublicKey { - if sk.pk == nil { - sk.pk = sidh.NewPublicKey(sidh.Fp434, sidh.KeyVariantSike) - sk.sk.GeneratePublicKey(sk.pk) - } - return (*PublicKey)(sk.pk) -} - -func (pk *PublicKey) Equal(other kem.PublicKey) bool { - oth, ok := other.(*PublicKey) - if !ok { - return false - } - a, _ := pk.MarshalBinary() - b, _ := oth.MarshalBinary() - return bytes.Equal(a, b) -} - -func (pk *PublicKey) MarshalBinary() ([]byte, error) { - cpk := (*sidh.PublicKey)(pk) - ret := make([]byte, cpk.Size()) - cpk.Export(ret) - return ret, nil -} - -// Deprecated: not cryptographically secure. -func GenerateKeyPair(rand io.Reader) (kem.PublicKey, kem.PrivateKey, error) { - sk := sidh.NewPrivateKey(sidh.Fp434, sidh.KeyVariantSike) - - if err := sk.Generate(rand); err != nil { - return nil, nil, err - } - priv := &PrivateKey{sk: sk} - - return priv.Public(), priv, nil -} - -func (*scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { - return GenerateKeyPair(cryptoRand.Reader) -} - -func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { - if len(seed) != SeedSize { - panic(kem.ErrSeedSize) - } - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - pk, sk, err := GenerateKeyPair(&h) - - if err != nil { - panic(err) - } - - return pk, sk -} - -func (sch *scheme) Encapsulate(pk kem.PublicKey) (ct []byte, ss []byte, err error) { - var seed [EncapsulationSeedSize]byte - if _, err := cryptoRand.Read(seed[:]); err != nil { - return nil, nil, err - } - return sch.EncapsulateDeterministically(pk, seed[:]) -} - -func (sch *scheme) EncapsulateDeterministically(pk kem.PublicKey, seed []byte) (ct []byte, ss []byte, err error) { - if len(seed) != EncapsulationSeedSize { - return nil, nil, kem.ErrSeedSize - } - - pub, ok := pk.(*PublicKey) - if !ok { - return nil, nil, kem.ErrTypeMismatch - } - - ct = make([]byte, sch.CiphertextSize()) - ss = make([]byte, sch.SharedKeySize()) - - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - ctx := sidh.NewSike434(&h) - - if err := ctx.Encapsulate(ct, ss, (*sidh.PublicKey)(pub)); err != nil { - return nil, nil, err - } - return ct, ss, nil -} - -func (sch *scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { - if len(ct) != sch.CiphertextSize() { - return nil, kem.ErrCiphertextSize - } - - priv, ok := sk.(*PrivateKey) - if !ok { - return nil, kem.ErrTypeMismatch - } - - sikePub := sidh.NewPublicKey(sidh.Fp434, sidh.KeyVariantSike) - priv.sk.GeneratePublicKey(sikePub) - - ss := make([]byte, sch.SharedKeySize()) - - ctx := sidh.NewSike434(nil) - if err := ctx.Decapsulate(ss, priv.sk, sikePub, ct); err != nil { - return nil, err - } - - return ss, nil -} - -func (sch *scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { - if len(buf) != sch.PublicKeySize() { - return nil, kem.ErrPubKeySize - } - pk := sidh.NewPublicKey(sidh.Fp434, sidh.KeyVariantSike) - if err := pk.Import(buf); err != nil { - return nil, err - } - return (*PublicKey)(pk), nil -} - -func (sch *scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { - if len(buf) != sch.PrivateKeySize() { - return nil, kem.ErrPrivKeySize - } - sk := sidh.NewPrivateKey(sidh.Fp434, sidh.KeyVariantSike) - if err := sk.Import(buf); err != nil { - return nil, err - } - return &PrivateKey{sk: sk}, nil -} - -func init() { - params = sidh.NewSike434(nil) -} diff --git a/kem/sike/sikep503/sike.go b/kem/sike/sikep503/sike.go deleted file mode 100644 index 571cef51..00000000 --- a/kem/sike/sikep503/sike.go +++ /dev/null @@ -1,209 +0,0 @@ -// Code generated from pkg.templ.go. DO NOT EDIT. - -// Package sikep503 is deprecated, it implements the key encapsulation mechanism SIKEp503. -// -// # DEPRECATION NOTICE -// -// SIDH and SIKE are deprecated as were shown vulnerable to a key recovery -// attack by Castryck-Decru's paper (https://eprint.iacr.org/2022/975). New -// systems should not rely on this package. This package is frozen. -package sikep503 - -import ( - "bytes" - cryptoRand "crypto/rand" - "crypto/subtle" - "io" - - "github.com/quantumcoinproject/circl/dh/sidh" - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/kem" -) - -// Deprecated: not cryptographically secure. -type PrivateKey struct { - sk *sidh.PrivateKey - pk *sidh.PublicKey -} - -// Deprecated: not cryptographically secure. -type PublicKey sidh.PublicKey - -const ( - SeedSize = 32 - EncapsulationSeedSize = 32 -) - -type scheme struct{} - -var sch kem.Scheme = &scheme{} - -// Scheme returns a KEM interface. -// -// Deprecated: not cryptographically secure. -func Scheme() kem.Scheme { return sch } - -var params *sidh.KEM - -func (*scheme) Name() string { return "SIKEp503" } -func (*scheme) PublicKeySize() int { return params.PublicKeySize() } -func (*scheme) PrivateKeySize() int { return params.PrivateKeySize() } -func (*scheme) SeedSize() int { return SeedSize } -func (*scheme) SharedKeySize() int { return params.SharedSecretSize() } -func (*scheme) CiphertextSize() int { return params.CiphertextSize() } -func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } - -func (sk *PrivateKey) Scheme() kem.Scheme { return sch } -func (pk *PublicKey) Scheme() kem.Scheme { return sch } - -func (sk *PrivateKey) MarshalBinary() ([]byte, error) { - ret := make([]byte, sk.sk.Size()) - sk.sk.Export(ret) - return ret, nil -} - -func (sk *PrivateKey) Equal(other kem.PrivateKey) bool { - oth, ok := other.(*PrivateKey) - if !ok { - return false - } - a, _ := sk.MarshalBinary() - b, _ := oth.MarshalBinary() - return subtle.ConstantTimeCompare(a, b) == 1 -} - -func (sk *PrivateKey) Public() kem.PublicKey { - if sk.pk == nil { - sk.pk = sidh.NewPublicKey(sidh.Fp503, sidh.KeyVariantSike) - sk.sk.GeneratePublicKey(sk.pk) - } - return (*PublicKey)(sk.pk) -} - -func (pk *PublicKey) Equal(other kem.PublicKey) bool { - oth, ok := other.(*PublicKey) - if !ok { - return false - } - a, _ := pk.MarshalBinary() - b, _ := oth.MarshalBinary() - return bytes.Equal(a, b) -} - -func (pk *PublicKey) MarshalBinary() ([]byte, error) { - cpk := (*sidh.PublicKey)(pk) - ret := make([]byte, cpk.Size()) - cpk.Export(ret) - return ret, nil -} - -// Deprecated: not cryptographically secure. -func GenerateKeyPair(rand io.Reader) (kem.PublicKey, kem.PrivateKey, error) { - sk := sidh.NewPrivateKey(sidh.Fp503, sidh.KeyVariantSike) - - if err := sk.Generate(rand); err != nil { - return nil, nil, err - } - priv := &PrivateKey{sk: sk} - - return priv.Public(), priv, nil -} - -func (*scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { - return GenerateKeyPair(cryptoRand.Reader) -} - -func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { - if len(seed) != SeedSize { - panic(kem.ErrSeedSize) - } - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - pk, sk, err := GenerateKeyPair(&h) - - if err != nil { - panic(err) - } - - return pk, sk -} - -func (sch *scheme) Encapsulate(pk kem.PublicKey) (ct []byte, ss []byte, err error) { - var seed [EncapsulationSeedSize]byte - if _, err := cryptoRand.Read(seed[:]); err != nil { - return nil, nil, err - } - return sch.EncapsulateDeterministically(pk, seed[:]) -} - -func (sch *scheme) EncapsulateDeterministically(pk kem.PublicKey, seed []byte) (ct []byte, ss []byte, err error) { - if len(seed) != EncapsulationSeedSize { - return nil, nil, kem.ErrSeedSize - } - - pub, ok := pk.(*PublicKey) - if !ok { - return nil, nil, kem.ErrTypeMismatch - } - - ct = make([]byte, sch.CiphertextSize()) - ss = make([]byte, sch.SharedKeySize()) - - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - ctx := sidh.NewSike503(&h) - - if err := ctx.Encapsulate(ct, ss, (*sidh.PublicKey)(pub)); err != nil { - return nil, nil, err - } - return ct, ss, nil -} - -func (sch *scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { - if len(ct) != sch.CiphertextSize() { - return nil, kem.ErrCiphertextSize - } - - priv, ok := sk.(*PrivateKey) - if !ok { - return nil, kem.ErrTypeMismatch - } - - sikePub := sidh.NewPublicKey(sidh.Fp503, sidh.KeyVariantSike) - priv.sk.GeneratePublicKey(sikePub) - - ss := make([]byte, sch.SharedKeySize()) - - ctx := sidh.NewSike503(nil) - if err := ctx.Decapsulate(ss, priv.sk, sikePub, ct); err != nil { - return nil, err - } - - return ss, nil -} - -func (sch *scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { - if len(buf) != sch.PublicKeySize() { - return nil, kem.ErrPubKeySize - } - pk := sidh.NewPublicKey(sidh.Fp503, sidh.KeyVariantSike) - if err := pk.Import(buf); err != nil { - return nil, err - } - return (*PublicKey)(pk), nil -} - -func (sch *scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { - if len(buf) != sch.PrivateKeySize() { - return nil, kem.ErrPrivKeySize - } - sk := sidh.NewPrivateKey(sidh.Fp503, sidh.KeyVariantSike) - if err := sk.Import(buf); err != nil { - return nil, err - } - return &PrivateKey{sk: sk}, nil -} - -func init() { - params = sidh.NewSike503(nil) -} diff --git a/kem/sike/sikep751/sike.go b/kem/sike/sikep751/sike.go deleted file mode 100644 index ef74b629..00000000 --- a/kem/sike/sikep751/sike.go +++ /dev/null @@ -1,209 +0,0 @@ -// Code generated from pkg.templ.go. DO NOT EDIT. - -// Package sikep751 is deprecated, it implements the key encapsulation mechanism SIKEp751. -// -// # DEPRECATION NOTICE -// -// SIDH and SIKE are deprecated as were shown vulnerable to a key recovery -// attack by Castryck-Decru's paper (https://eprint.iacr.org/2022/975). New -// systems should not rely on this package. This package is frozen. -package sikep751 - -import ( - "bytes" - cryptoRand "crypto/rand" - "crypto/subtle" - "io" - - "github.com/quantumcoinproject/circl/dh/sidh" - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/kem" -) - -// Deprecated: not cryptographically secure. -type PrivateKey struct { - sk *sidh.PrivateKey - pk *sidh.PublicKey -} - -// Deprecated: not cryptographically secure. -type PublicKey sidh.PublicKey - -const ( - SeedSize = 32 - EncapsulationSeedSize = 32 -) - -type scheme struct{} - -var sch kem.Scheme = &scheme{} - -// Scheme returns a KEM interface. -// -// Deprecated: not cryptographically secure. -func Scheme() kem.Scheme { return sch } - -var params *sidh.KEM - -func (*scheme) Name() string { return "SIKEp751" } -func (*scheme) PublicKeySize() int { return params.PublicKeySize() } -func (*scheme) PrivateKeySize() int { return params.PrivateKeySize() } -func (*scheme) SeedSize() int { return SeedSize } -func (*scheme) SharedKeySize() int { return params.SharedSecretSize() } -func (*scheme) CiphertextSize() int { return params.CiphertextSize() } -func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } - -func (sk *PrivateKey) Scheme() kem.Scheme { return sch } -func (pk *PublicKey) Scheme() kem.Scheme { return sch } - -func (sk *PrivateKey) MarshalBinary() ([]byte, error) { - ret := make([]byte, sk.sk.Size()) - sk.sk.Export(ret) - return ret, nil -} - -func (sk *PrivateKey) Equal(other kem.PrivateKey) bool { - oth, ok := other.(*PrivateKey) - if !ok { - return false - } - a, _ := sk.MarshalBinary() - b, _ := oth.MarshalBinary() - return subtle.ConstantTimeCompare(a, b) == 1 -} - -func (sk *PrivateKey) Public() kem.PublicKey { - if sk.pk == nil { - sk.pk = sidh.NewPublicKey(sidh.Fp751, sidh.KeyVariantSike) - sk.sk.GeneratePublicKey(sk.pk) - } - return (*PublicKey)(sk.pk) -} - -func (pk *PublicKey) Equal(other kem.PublicKey) bool { - oth, ok := other.(*PublicKey) - if !ok { - return false - } - a, _ := pk.MarshalBinary() - b, _ := oth.MarshalBinary() - return bytes.Equal(a, b) -} - -func (pk *PublicKey) MarshalBinary() ([]byte, error) { - cpk := (*sidh.PublicKey)(pk) - ret := make([]byte, cpk.Size()) - cpk.Export(ret) - return ret, nil -} - -// Deprecated: not cryptographically secure. -func GenerateKeyPair(rand io.Reader) (kem.PublicKey, kem.PrivateKey, error) { - sk := sidh.NewPrivateKey(sidh.Fp751, sidh.KeyVariantSike) - - if err := sk.Generate(rand); err != nil { - return nil, nil, err - } - priv := &PrivateKey{sk: sk} - - return priv.Public(), priv, nil -} - -func (*scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { - return GenerateKeyPair(cryptoRand.Reader) -} - -func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { - if len(seed) != SeedSize { - panic(kem.ErrSeedSize) - } - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - pk, sk, err := GenerateKeyPair(&h) - - if err != nil { - panic(err) - } - - return pk, sk -} - -func (sch *scheme) Encapsulate(pk kem.PublicKey) (ct []byte, ss []byte, err error) { - var seed [EncapsulationSeedSize]byte - if _, err := cryptoRand.Read(seed[:]); err != nil { - return nil, nil, err - } - return sch.EncapsulateDeterministically(pk, seed[:]) -} - -func (sch *scheme) EncapsulateDeterministically(pk kem.PublicKey, seed []byte) (ct []byte, ss []byte, err error) { - if len(seed) != EncapsulationSeedSize { - return nil, nil, kem.ErrSeedSize - } - - pub, ok := pk.(*PublicKey) - if !ok { - return nil, nil, kem.ErrTypeMismatch - } - - ct = make([]byte, sch.CiphertextSize()) - ss = make([]byte, sch.SharedKeySize()) - - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - ctx := sidh.NewSike751(&h) - - if err := ctx.Encapsulate(ct, ss, (*sidh.PublicKey)(pub)); err != nil { - return nil, nil, err - } - return ct, ss, nil -} - -func (sch *scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { - if len(ct) != sch.CiphertextSize() { - return nil, kem.ErrCiphertextSize - } - - priv, ok := sk.(*PrivateKey) - if !ok { - return nil, kem.ErrTypeMismatch - } - - sikePub := sidh.NewPublicKey(sidh.Fp751, sidh.KeyVariantSike) - priv.sk.GeneratePublicKey(sikePub) - - ss := make([]byte, sch.SharedKeySize()) - - ctx := sidh.NewSike751(nil) - if err := ctx.Decapsulate(ss, priv.sk, sikePub, ct); err != nil { - return nil, err - } - - return ss, nil -} - -func (sch *scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { - if len(buf) != sch.PublicKeySize() { - return nil, kem.ErrPubKeySize - } - pk := sidh.NewPublicKey(sidh.Fp751, sidh.KeyVariantSike) - if err := pk.Import(buf); err != nil { - return nil, err - } - return (*PublicKey)(pk), nil -} - -func (sch *scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { - if len(buf) != sch.PrivateKeySize() { - return nil, kem.ErrPrivKeySize - } - sk := sidh.NewPrivateKey(sidh.Fp751, sidh.KeyVariantSike) - if err := sk.Import(buf); err != nil { - return nil, err - } - return &PrivateKey{sk: sk}, nil -} - -func init() { - params = sidh.NewSike751(nil) -} diff --git a/kem/sike/templates/pkg.templ.go b/kem/sike/templates/pkg.templ.go deleted file mode 100644 index ee2b7257..00000000 --- a/kem/sike/templates/pkg.templ.go +++ /dev/null @@ -1,214 +0,0 @@ -// +build ignore -// The previous line (and this one up to the warning below) is removed by the -// template generator. - -// Code generated from pkg.templ.go. DO NOT EDIT. - -// Package {{.Pkg}} is deprecated, it implements the key encapsulation mechanism {{.Name}}. -// -// # DEPRECATION NOTICE -// -// SIDH and SIKE are deprecated as were shown vulnerable to a key recovery -// attack by Castryck-Decru's paper (https://eprint.iacr.org/2022/975). New -// systems should not rely on this package. This package is frozen. -package {{.Pkg}} - -import ( - "bytes" - cryptoRand "crypto/rand" - "crypto/subtle" - "io" - - "github.com/quantumcoinproject/circl/dh/sidh" - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/kem" -) - - -// Deprecated: not cryptographically secure. -type PrivateKey struct { - sk *sidh.PrivateKey - pk *sidh.PublicKey -} - -// Deprecated: not cryptographically secure. -type PublicKey sidh.PublicKey - -const ( - SeedSize = 32 - EncapsulationSeedSize = 32 -) - -type scheme struct{} - -var sch kem.Scheme = &scheme{} - -// Scheme returns a KEM interface. -// -// Deprecated: not cryptographically secure. -func Scheme() kem.Scheme { return sch } - -var params *sidh.KEM - -func (*scheme) Name() string { return "{{.Name}}" } -func (*scheme) PublicKeySize() int { return params.PublicKeySize() } -func (*scheme) PrivateKeySize() int { return params.PrivateKeySize() } -func (*scheme) SeedSize() int { return SeedSize } -func (*scheme) SharedKeySize() int { return params.SharedSecretSize() } -func (*scheme) CiphertextSize() int { return params.CiphertextSize() } -func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } - -func (sk *PrivateKey) Scheme() kem.Scheme { return sch } -func (pk *PublicKey) Scheme() kem.Scheme { return sch } - -func (sk *PrivateKey) MarshalBinary() ([]byte, error) { - ret := make([]byte, sk.sk.Size()) - sk.sk.Export(ret) - return ret, nil -} - -func (sk *PrivateKey) Equal(other kem.PrivateKey) bool { - oth, ok := other.(*PrivateKey) - if !ok { - return false - } - a, _ := sk.MarshalBinary() - b, _ := oth.MarshalBinary() - return subtle.ConstantTimeCompare(a, b) == 1 -} - -func (sk *PrivateKey) Public() kem.PublicKey { - if sk.pk == nil { - sk.pk = sidh.NewPublicKey(sidh.{{.Field}}, sidh.KeyVariantSike) - sk.sk.GeneratePublicKey(sk.pk) - } - return (*PublicKey)(sk.pk) -} - -func (pk *PublicKey) Equal(other kem.PublicKey) bool { - oth, ok := other.(*PublicKey) - if !ok { - return false - } - a, _ := pk.MarshalBinary() - b, _ := oth.MarshalBinary() - return bytes.Equal(a, b) -} - -func (pk *PublicKey) MarshalBinary() ([]byte, error) { - cpk := (*sidh.PublicKey)(pk) - ret := make([]byte, cpk.Size()) - cpk.Export(ret) - return ret, nil -} - -// Deprecated: not cryptographically secure. -func GenerateKeyPair(rand io.Reader) (kem.PublicKey, kem.PrivateKey, error) { - sk := sidh.NewPrivateKey(sidh.{{.Field}}, sidh.KeyVariantSike) - - if err := sk.Generate(rand); err != nil { - return nil, nil, err - } - priv := &PrivateKey{sk: sk} - - return priv.Public(), priv, nil -} - -func (*scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { - return GenerateKeyPair(cryptoRand.Reader) -} - -func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { - if len(seed) != SeedSize { - panic(kem.ErrSeedSize) - } - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - pk, sk, err := GenerateKeyPair(&h) - - if err != nil { - panic(err) - } - - return pk, sk -} - -func (sch *scheme) Encapsulate(pk kem.PublicKey) (ct []byte, ss []byte, err error) { - var seed [EncapsulationSeedSize]byte - if _, err := cryptoRand.Read(seed[:]); err != nil { - return nil, nil, err - } - return sch.EncapsulateDeterministically(pk, seed[:]) -} - -func (sch *scheme) EncapsulateDeterministically(pk kem.PublicKey, seed []byte) (ct []byte, ss []byte, err error) { - if len(seed) != EncapsulationSeedSize { - return nil, nil, kem.ErrSeedSize - } - - pub, ok := pk.(*PublicKey) - if !ok { - return nil, nil, kem.ErrTypeMismatch - } - - ct = make([]byte, sch.CiphertextSize()) - ss = make([]byte, sch.SharedKeySize()) - - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - ctx := sidh.NewSike{{.Bits}}(&h) - - if err := ctx.Encapsulate(ct, ss, (*sidh.PublicKey)(pub)); err != nil { - return nil, nil, err - } - return ct, ss, nil -} - -func (sch *scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { - if len(ct) != sch.CiphertextSize() { - return nil, kem.ErrCiphertextSize - } - - priv, ok := sk.(*PrivateKey) - if !ok { - return nil, kem.ErrTypeMismatch - } - - sikePub := sidh.NewPublicKey(sidh.{{.Field}}, sidh.KeyVariantSike) - priv.sk.GeneratePublicKey(sikePub) - - ss := make([]byte, sch.SharedKeySize()) - - ctx := sidh.NewSike{{.Bits}}(nil) - if err := ctx.Decapsulate(ss, priv.sk, sikePub, ct); err != nil { - return nil, err - } - - return ss, nil -} - -func (sch *scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { - if len(buf) != sch.PublicKeySize() { - return nil, kem.ErrPubKeySize - } - pk := sidh.NewPublicKey(sidh.{{.Field}}, sidh.KeyVariantSike) - if err := pk.Import(buf); err != nil { - return nil, err - } - return (*PublicKey)(pk), nil -} - -func (sch *scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { - if len(buf) != sch.PrivateKeySize() { - return nil, kem.ErrPrivKeySize - } - sk := sidh.NewPrivateKey(sidh.{{.Field}}, sidh.KeyVariantSike) - if err := sk.Import(buf); err != nil { - return nil, err - } - return &PrivateKey{sk: sk}, nil -} - -func init() { - params = sidh.NewSike{{.Bits}}(nil) -} diff --git a/math/mlsbset/mlsbset.go b/math/mlsbset/mlsbset.go deleted file mode 100644 index 7578201d..00000000 --- a/math/mlsbset/mlsbset.go +++ /dev/null @@ -1,122 +0,0 @@ -// Package mlsbset provides a constant-time exponentiation method with precomputation. -// -// References: "Efficient and secure algorithms for GLV-based scalar -// multiplication and their implementation on GLV–GLS curves" by (Faz-Hernandez et al.) -// - https://doi.org/10.1007/s13389-014-0085-7 -// - https://eprint.iacr.org/2013/158 -package mlsbset - -import ( - "errors" - "fmt" - "math/big" - - "github.com/quantumcoinproject/circl/internal/conv" -) - -// EltG is a group element. -type EltG interface{} - -// EltP is a precomputed group element. -type EltP interface{} - -// Group defines the operations required by MLSBSet exponentiation method. -type Group interface { - Identity() EltG // Returns the identity of the group. - Sqr(x EltG) // Calculates x = x^2. - Mul(x EltG, y EltP) // Calculates x = x*y. - NewEltP() EltP // Returns an arbitrary precomputed element. - ExtendedEltP() EltP // Returns the precomputed element x^(2^(w*d)). - Lookup(a EltP, v uint, s, u int32) // Sets a = s*T[v][u]. -} - -// Params contains the parameters of the encoding. -type Params struct { - T uint // T is the maximum size (in bits) of exponents. - V uint // V is the number of tables. - W uint // W is the window size. - E uint // E is the number of digits per table. - D uint // D is the number of digits in total. - L uint // L is the length of the code. -} - -// Encoder allows to convert integers into valid powers. -type Encoder struct{ p Params } - -// New produces an encoder of the MLSBSet algorithm. -func New(t, v, w uint) (Encoder, error) { - if !(t > 1 && v >= 1 && w >= 2) { - return Encoder{}, errors.New("t>1, v>=1, w>=2") - } - e := (t + w*v - 1) / (w * v) - d := e * v - l := d * w - return Encoder{Params{t, v, w, e, d, l}}, nil -} - -// Encode converts an odd integer k into a valid power for exponentiation. -func (m Encoder) Encode(k []byte) (*Power, error) { - if len(k) == 0 { - return nil, errors.New("empty slice") - } - if !(len(k) <= int(m.p.L+7)>>3) { - return nil, errors.New("k too big") - } - if k[0]%2 == 0 { - return nil, errors.New("k must be odd") - } - ap := int((m.p.L+7)/8) - len(k) - k = append(k, make([]byte, ap)...) - s := m.signs(k) - b := make([]int32, m.p.L-m.p.D) - c := conv.BytesLe2BigInt(k) - c.Rsh(c, m.p.D) - var bi big.Int - for i := m.p.D; i < m.p.L; i++ { - c0 := int32(c.Bit(0)) - b[i-m.p.D] = s[i%m.p.D] * c0 - bi.SetInt64(int64(b[i-m.p.D] >> 1)) - c.Rsh(c, 1) - c.Sub(c, &bi) - } - carry := int(c.Int64()) - return &Power{m, s, b, carry}, nil -} - -// signs calculates the set of signs. -func (m Encoder) signs(k []byte) []int32 { - s := make([]int32, m.p.D) - s[m.p.D-1] = 1 - for i := uint(1); i < m.p.D; i++ { - ki := int32((k[i>>3] >> (i & 0x7)) & 0x1) - s[i-1] = 2*ki - 1 - } - return s -} - -// GetParams returns the complementary parameters of the encoding. -func (m Encoder) GetParams() Params { return m.p } - -// tableSize returns the size of each table. -func (m Encoder) tableSize() uint { return 1 << (m.p.W - 1) } - -// Elts returns the total number of elements that must be precomputed. -func (m Encoder) Elts() uint { return m.p.V * m.tableSize() } - -// IsExtended returns true if the element x^(2^(wd)) must be calculated. -func (m Encoder) IsExtended() bool { q := m.p.T / (m.p.V * m.p.W); return m.p.T == q*m.p.V*m.p.W } - -// Ops returns the number of squares and multiplications executed during an exponentiation. -func (m Encoder) Ops() (S uint, M uint) { - S = m.p.E - M = m.p.E * m.p.V - if m.IsExtended() { - M++ - } - return -} - -func (m Encoder) String() string { - return fmt.Sprintf("T: %v W: %v V: %v e: %v d: %v l: %v wv|t: %v", - m.p.T, m.p.W, m.p.V, m.p.E, m.p.D, m.p.L, m.IsExtended()) -} diff --git a/math/mlsbset/mlsbset_test.go b/math/mlsbset/mlsbset_test.go deleted file mode 100644 index b3a2e804..00000000 --- a/math/mlsbset/mlsbset_test.go +++ /dev/null @@ -1,154 +0,0 @@ -package mlsbset_test - -import ( - "crypto/rand" - "errors" - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/math/mlsbset" -) - -func TestExp(t *testing.T) { - T := uint(126) - for v := uint(1); v <= 5; v++ { - for w := uint(2); w <= 5; w++ { - m, err := mlsbset.New(T, v, w) - if err != nil { - test.ReportError(t, err, nil) - } - testExp(t, m) - } - } -} - -func testExp(t *testing.T, m mlsbset.Encoder) { - const testTimes = 1 << 8 - params := m.GetParams() - TBytes := (params.T + 7) / 8 - topBits := (byte(1) << (params.T % 8)) - 1 - k := make([]byte, TBytes) - for i := 0; i < testTimes; i++ { - _, _ = rand.Read(k) - k[0] |= 1 - k[TBytes-1] &= topBits - - c, err := m.Encode(k) - if err != nil { - test.ReportError(t, err, nil) - } - - g := zzAdd{m.GetParams()} - a := c.Exp(g) - - got := a.(*big.Int) - want := conv.BytesLe2BigInt(k) - if got.Cmp(want) != 0 { - test.ReportError(t, got, want, m) - } - } -} - -type zzAdd struct{ set mlsbset.Params } - -func (zzAdd) Identity() mlsbset.EltG { return big.NewInt(0) } -func (zzAdd) NewEltP() mlsbset.EltP { return new(big.Int) } -func (zzAdd) Sqr(x mlsbset.EltG) { - a := x.(*big.Int) - a.Add(a, a) -} - -func (zzAdd) Mul(x mlsbset.EltG, y mlsbset.EltP) { - a := x.(*big.Int) - b := y.(*big.Int) - a.Add(a, b) -} - -func (z zzAdd) ExtendedEltP() mlsbset.EltP { - a := big.NewInt(1) - a.Lsh(a, z.set.W*z.set.D) - return a -} - -func (z zzAdd) Lookup(x mlsbset.EltP, idTable uint, sgnElt int32, idElt int32) { - a := x.(*big.Int) - a.SetInt64(1) - a.Lsh(a, z.set.E*idTable) // 2^(e*v) - sum := big.NewInt(0) - for i := int(z.set.W - 2); i >= 0; i-- { - ui := big.NewInt(int64((idElt >> uint(i)) & 0x1)) - sum.Add(sum, ui) - sum.Lsh(sum, z.set.D) - } - sum.Add(sum, big.NewInt(1)) - a.Mul(a, sum) - if sgnElt == -1 { - a.Neg(a) - } -} - -func TestEncodeErr(t *testing.T) { - t.Run("mArgs", func(t *testing.T) { - _, got := mlsbset.New(0, 0, 0) - want := errors.New("t>1, v>=1, w>=2") - if got.Error() != want.Error() { - test.ReportError(t, got, want) - } - }) - t.Run("kOdd", func(t *testing.T) { - m, _ := mlsbset.New(16, 2, 2) - k := make([]byte, 2) - _, got := m.Encode(k) - want := errors.New("k must be odd") - if got.Error() != want.Error() { - test.ReportError(t, got, want) - } - }) - t.Run("kBig", func(t *testing.T) { - m, _ := mlsbset.New(16, 2, 2) - k := make([]byte, 4) - _, got := m.Encode(k) - want := errors.New("k too big") - if got.Error() != want.Error() { - test.ReportError(t, got, want) - } - }) - t.Run("kEmpty", func(t *testing.T) { - m, _ := mlsbset.New(16, 2, 2) - k := []byte{} - _, got := m.Encode(k) - want := errors.New("empty slice") - if got.Error() != want.Error() { - test.ReportError(t, got, want) - } - }) -} - -func BenchmarkEncode(b *testing.B) { - t, v, w := uint(256), uint(2), uint(3) - m, _ := mlsbset.New(t, v, w) - params := m.GetParams() - TBytes := (params.T + 7) / 8 - topBits := (byte(1) << (params.T % 8)) - 1 - - k := make([]byte, TBytes) - _, _ = rand.Read(k) - k[0] |= 1 - k[TBytes-1] &= topBits - - c, _ := m.Encode(k) - g := zzAdd{params} - - b.Run("Encode", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _ = m.Encode(k) - } - }) - b.Run("Exp", func(b *testing.B) { - for i := 0; i < b.N; i++ { - c.Exp(g) - } - }) -} diff --git a/math/mlsbset/power.go b/math/mlsbset/power.go deleted file mode 100644 index 3f214c30..00000000 --- a/math/mlsbset/power.go +++ /dev/null @@ -1,64 +0,0 @@ -package mlsbset - -import "fmt" - -// Power is a valid exponent produced by the MLSBSet encoding algorithm. -type Power struct { - set Encoder // parameters of code. - s []int32 // set of signs. - b []int32 // set of digits. - c int // carry is {0,1}. -} - -// Exp is calculates x^k, where x is a predetermined element of a group G. -func (p *Power) Exp(G Group) EltG { - a, b := G.Identity(), G.NewEltP() - for e := int(p.set.p.E - 1); e >= 0; e-- { - G.Sqr(a) - for v := uint(0); v < p.set.p.V; v++ { - sgnElt, idElt := p.Digit(v, uint(e)) - G.Lookup(b, v, sgnElt, idElt) - G.Mul(a, b) - } - } - if p.set.IsExtended() && p.c == 1 { - G.Mul(a, G.ExtendedEltP()) - } - return a -} - -// Digit returns the (v,e)-th digit and its sign. -func (p *Power) Digit(v, e uint) (sgn, dig int32) { - sgn = p.bit(0, v, e) - dig = 0 - for i := p.set.p.W - 1; i > 0; i-- { - dig = 2*dig + p.bit(i, v, e) - } - mask := dig >> 31 - dig = (dig + mask) ^ mask - return sgn, dig -} - -// bit returns the (w,v,e)-th bit of the code. -func (p *Power) bit(w, v, e uint) int32 { - if !(w < p.set.p.W && - v < p.set.p.V && - e < p.set.p.E) { - panic(fmt.Errorf("indexes outside (%v,%v,%v)", w, v, e)) - } - if w == 0 { - return p.s[p.set.p.E*v+e] - } - return p.b[p.set.p.D*(w-1)+p.set.p.E*v+e] -} - -func (p *Power) String() string { - dig := "" - for j := uint(0); j < p.set.p.V; j++ { - for i := uint(0); i < p.set.p.E; i++ { - s, d := p.Digit(j, i) - dig += fmt.Sprintf("(%2v,%2v) = %+2v %+2v\n", j, i, s, d) - } - } - return fmt.Sprintf("len: %v\ncarry: %v\ndigits:\n%v", len(p.b)+len(p.s), p.c, dig) -} diff --git a/math/polynomial/polynomial.go b/math/polynomial/polynomial.go deleted file mode 100644 index 78aab620..00000000 --- a/math/polynomial/polynomial.go +++ /dev/null @@ -1,163 +0,0 @@ -// Package polynomial provides representations of polynomials over the scalars -// of a group. -package polynomial - -import "github.com/quantumcoinproject/circl/group" - -// Polynomial stores a polynomial over the set of scalars of a group. -type Polynomial struct { - // Internal representation is in polynomial basis: - // Thus, - // p(x) = \sum_i^k c[i] x^i, - // where k = len(c)-1 is the degree of the polynomial. - c []group.Scalar -} - -// New creates a new polynomial given its coefficients in ascending order. -// Thus, -// -// p(x) = \sum_i^k c[i] x^i, -// -// where k = len(c)-1 is the degree of the polynomial. -// -// The zero polynomial has degree equal to -1 and can be instantiated passing -// nil to New. -func New(coeffs []group.Scalar) (p Polynomial) { - if l := len(coeffs); l != 0 { - p.c = make([]group.Scalar, l) - for i := range coeffs { - p.c[i] = coeffs[i].Copy() - } - } - - return -} - -// Degree returns the degree of the polynomial. The zero polynomial has degree -// equal to -1. -func (p Polynomial) Degree() int { - i := len(p.c) - 1 - for i > 0 && p.c[i].IsZero() { - i-- - } - return i -} - -// Evaluate returns the evaluation of p on x. -func (p Polynomial) Evaluate(x group.Scalar) group.Scalar { - px := x.Group().NewScalar() - if l := len(p.c); l != 0 { - px.Set(p.c[l-1]) - for i := l - 2; i >= 0; i-- { - px.Mul(px, x) - px.Add(px, p.c[i]) - } - } - return px -} - -// Coefficient returns a deep-copy of the n-th polynomial's coefficient. -// Note coefficients are sorted in ascending order with respect to the degree. -func (p Polynomial) Coefficient(n uint) group.Scalar { - if int(n) >= len(p.c) { - panic("polynomial: invalid index for coefficient") - } - return p.c[n].Copy() -} - -// LagrangePolynomial stores a Lagrange polynomial over the set of scalars of a group. -type LagrangePolynomial struct { - // Internal representation is in Lagrange basis: - // Thus, - // p(x) = \sum_i^k y[i] L_j(x), where k is the degree of the polynomial, - // L_j(x) = \prod_i^k (x-x[i])/(x[j]-x[i]), - // y[i] = p(x[i]), and - // all x[i] are different. - x, y []group.Scalar -} - -// NewLagrangePolynomial creates a polynomial in Lagrange basis given a list -// of nodes (x) and values (y), such that: -// -// p(x) = \sum_i^k y[i] L_j(x), where k is the degree of the polynomial, -// L_j(x) = \prod_i^k (x-x[i])/(x[j]-x[i]), -// y[i] = p(x[i]), and -// all x[i] are different. -// -// It panics if one of these conditions does not hold. -// -// The zero polynomial has degree equal to -1 and can be instantiated passing -// (nil,nil) to NewLagrangePolynomial. -func NewLagrangePolynomial(x, y []group.Scalar) (l LagrangePolynomial) { - if len(x) != len(y) { - panic("lagrange: invalid length") - } - - if !areAllDifferent(x) { - panic("lagrange: x[i] must be different") - } - - if n := len(x); n != 0 { - l.x, l.y = make([]group.Scalar, n), make([]group.Scalar, n) - for i := range x { - l.x[i], l.y[i] = x[i].Copy(), y[i].Copy() - } - } - - return -} - -func (l LagrangePolynomial) Degree() int { return len(l.x) - 1 } - -func (l LagrangePolynomial) Evaluate(x group.Scalar) group.Scalar { - px := x.Group().NewScalar() - tmp := x.Group().NewScalar() - for i := range l.x { - LjX := baseRatio(uint(i), l.x, x) - tmp.Mul(l.y[i], LjX) - px.Add(px, tmp) - } - - return px -} - -// LagrangeBase returns the j-th Lagrange polynomial base evaluated at x. -// Thus, L_j(x) = \prod (x - x[i]) / (x[j] - x[i]) for 0 <= i < k, and i != j. -func LagrangeBase(jth uint, xi []group.Scalar, x group.Scalar) group.Scalar { - if jth >= uint(len(xi)) { - panic("lagrange: invalid index") - } - return baseRatio(jth, xi, x) -} - -func baseRatio(jth uint, xi []group.Scalar, x group.Scalar) group.Scalar { - num := x.Copy() - num.SetUint64(1) - den := x.Copy() - den.SetUint64(1) - - tmp := x.Copy() - for i := range xi { - if uint(i) != jth { - num.Mul(num, tmp.Sub(x, xi[i])) - den.Mul(den, tmp.Sub(xi[jth], xi[i])) - } - } - - return num.Mul(num, den.Inv(den)) -} - -func areAllDifferent(x []group.Scalar) bool { - m := make(map[string]struct{}) - for i := range x { - k, err := x[i].MarshalBinary() - if err != nil { - panic(err) - } - if _, exists := m[string(k)]; exists { - return false - } - m[string(k)] = struct{}{} - } - return true -} diff --git a/math/polynomial/polynomial_test.go b/math/polynomial/polynomial_test.go deleted file mode 100644 index f4d45d82..00000000 --- a/math/polynomial/polynomial_test.go +++ /dev/null @@ -1,131 +0,0 @@ -package polynomial_test - -import ( - "testing" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/math/polynomial" -) - -func TestPolyDegree(t *testing.T) { - g := group.P256 - - t.Run("zeroPoly", func(t *testing.T) { - p := polynomial.New(nil) - test.CheckOk(p.Degree() == -1, "it should be -1", t) - p = polynomial.New([]group.Scalar{}) - test.CheckOk(p.Degree() == -1, "it should be -1", t) - }) - - t.Run("constantPoly", func(t *testing.T) { - c := []group.Scalar{ - g.NewScalar().SetUint64(0), - g.NewScalar().SetUint64(0), - } - p := polynomial.New(c) - test.CheckOk(p.Degree() == 0, "it should be 0", t) - }) - - t.Run("linearPoly", func(t *testing.T) { - c := []group.Scalar{ - g.NewScalar().SetUint64(0), - g.NewScalar().SetUint64(1), - g.NewScalar().SetUint64(0), - } - p := polynomial.New(c) - test.CheckOk(p.Degree() == 1, "it should be 1", t) - }) -} - -func TestPolyEval(t *testing.T) { - g := group.P256 - c := []group.Scalar{ - g.NewScalar(), - g.NewScalar(), - g.NewScalar(), - } - c[0].SetUint64(5) - c[1].SetUint64(5) - c[2].SetUint64(2) - p := polynomial.New(c) - - x := g.NewScalar() - x.SetUint64(10) - - got := p.Evaluate(x) - want := g.NewScalar() - want.SetUint64(255) - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } -} - -func TestLagrange(t *testing.T) { - g := group.P256 - c := []group.Scalar{ - g.NewScalar(), - g.NewScalar(), - g.NewScalar(), - } - c[0].SetUint64(1234) - c[1].SetUint64(166) - c[2].SetUint64(94) - p := polynomial.New(c) - - x := []group.Scalar{g.NewScalar(), g.NewScalar(), g.NewScalar()} - x[0].SetUint64(2) - x[1].SetUint64(4) - x[2].SetUint64(5) - - y := []group.Scalar{} - for i := range x { - y = append(y, p.Evaluate(x[i])) - } - - zero := g.NewScalar() - l := polynomial.NewLagrangePolynomial(x, y) - test.CheckOk(l.Degree() == p.Degree(), "bad degree", t) - - got := l.Evaluate(zero) - want := p.Evaluate(zero) - - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } - - // Test Kronecker's delta of LagrangeBase. - // Thus: - // L_j(x[i]) = { 1, if i == j; - // { 0, otherwise. - one := g.NewScalar() - one.SetUint64(1) - for j := range x { - for i := range x { - got := polynomial.LagrangeBase(uint(j), x, x[i]) - - if i == j { - want = one - } else { - want = zero - } - - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } - } - } - - // Test that inputs are different length - err := test.CheckPanic(func() { polynomial.NewLagrangePolynomial(x, y[:1]) }) - test.CheckNoErr(t, err, "should panic") - - // Test that nodes must be different. - x[0].Set(x[1]) - err = test.CheckPanic(func() { polynomial.NewLagrangePolynomial(x, y) }) - test.CheckNoErr(t, err, "should panic") - - // Test LagrangeBase wrong index - err = test.CheckPanic(func() { polynomial.LagrangeBase(10, x, zero) }) - test.CheckNoErr(t, err, "should panic") -} diff --git a/oprf/client.go b/oprf/client.go deleted file mode 100644 index b2c33dbf..00000000 --- a/oprf/client.go +++ /dev/null @@ -1,169 +0,0 @@ -package oprf - -import ( - "crypto/rand" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/zk/dleq" -) - -type client struct{ params } - -type Client struct { - client -} - -type VerifiableClient struct { - client - pkS *PublicKey -} - -type PartialObliviousClient struct { - client - pkS *PublicKey -} - -func (c client) Blind(inputs [][]byte) (*FinalizeData, *EvaluationRequest, error) { - if len(inputs) == 0 { - return nil, nil, ErrInvalidInput - } - - blinds := make([]Blind, len(inputs)) - for i := range inputs { - blinds[i] = c.params.group.RandomScalar(rand.Reader) - } - - return c.blind(inputs, blinds) -} - -func (c client) DeterministicBlind(inputs [][]byte, blinds []Blind) (*FinalizeData, *EvaluationRequest, error) { - if len(inputs) == 0 { - return nil, nil, ErrInvalidInput - } - if len(inputs) != len(blinds) { - return nil, nil, ErrInvalidInput - } - - return c.blind(inputs, blinds) -} - -func (c client) blind(inputs [][]byte, blinds []Blind) (*FinalizeData, *EvaluationRequest, error) { - blindedElements := make([]Blinded, len(inputs)) - dst := c.params.getDST(hashToGroupDST) - for i := range inputs { - point := c.params.group.HashToElement(inputs[i], dst) - if point.IsIdentity() { - return nil, nil, ErrInvalidInput - } - blindedElements[i] = c.params.group.NewElement().Mul(point, blinds[i]) - } - - evalReq := &EvaluationRequest{blindedElements} - finData := &FinalizeData{inputs, blinds, evalReq} - - return finData, evalReq, nil -} - -func (c client) unblind(serUnblindeds [][]byte, blindeds []group.Element, blind []Blind) (err error) { - invBlind := c.params.group.NewScalar() - U := c.params.group.NewElement() - - for i := range blindeds { - invBlind.Inv(blind[i]) - U.Mul(blindeds[i], invBlind) - serUnblindeds[i], err = U.MarshalBinaryCompress() - if err != nil { - return err - } - } - - return nil -} - -func (c client) validate(f *FinalizeData, e *Evaluation) (err error) { - if l := len(f.blinds); len(f.evalReq.Elements) != l || len(e.Elements) != l { - err = ErrInvalidInput - } - - return -} - -func (c client) finalize(f *FinalizeData, e *Evaluation, info []byte) ([][]byte, error) { - unblindedElements := make([][]byte, len(f.blinds)) - err := c.unblind(unblindedElements, e.Elements, f.blinds) - if err != nil { - return nil, err - } - - h := c.params.hash.New() - outputs := make([][]byte, len(f.inputs)) - for i := range f.inputs { - outputs[i] = c.params.finalizeHash(h, f.inputs[i], info, unblindedElements[i]) - } - - return outputs, nil -} - -func (c Client) Finalize(f *FinalizeData, e *Evaluation) (outputs [][]byte, err error) { - if err = c.validate(f, e); err != nil { - return nil, err - } - - return c.client.finalize(f, e, nil) -} - -func (c VerifiableClient) Finalize(f *FinalizeData, e *Evaluation) (outputs [][]byte, err error) { - if err := c.validate(f, e); err != nil { - return nil, err - } - - if !(dleq.Verifier{Params: c.getDLEQParams()}).VerifyBatch( - c.params.group.Generator(), - c.pkS.e, - f.evalReq.Elements, - e.Elements, - e.Proof, - ) { - return nil, ErrInvalidProof - } - - return c.client.finalize(f, e, nil) -} - -func (c PartialObliviousClient) Finalize(f *FinalizeData, e *Evaluation, info []byte) (outputs [][]byte, err error) { - if err = c.validate(f, e); err != nil { - return nil, err - } - - tweakedKey, err := c.pointFromInfo(info) - if err != nil { - return nil, err - } - - if !(dleq.Verifier{Params: c.getDLEQParams()}).VerifyBatch( - c.params.group.Generator(), - tweakedKey, - e.Elements, - f.evalReq.Elements, - e.Proof, - ) { - return nil, ErrInvalidProof - } - - return c.client.finalize(f, e, info) -} - -func (c PartialObliviousClient) pointFromInfo(info []byte) (group.Element, error) { - m, err := c.params.scalarFromInfo(info) - if err != nil { - return nil, err - } - - T := c.params.group.NewElement().MulGen(m) - tweakedKey := c.params.group.NewElement().Add(T, c.pkS.e) - if tweakedKey.IsIdentity() { - return nil, ErrInvalidInfo - } - - return tweakedKey, nil -} diff --git a/oprf/keys.go b/oprf/keys.go deleted file mode 100644 index a53eb203..00000000 --- a/oprf/keys.go +++ /dev/null @@ -1,99 +0,0 @@ -package oprf - -import ( - "encoding/binary" - "io" - - "github.com/quantumcoinproject/circl/group" -) - -type PrivateKey struct { - p params - k group.Scalar - pub *PublicKey -} - -type PublicKey struct { - p params - e group.Element -} - -func (k *PrivateKey) MarshalBinary() ([]byte, error) { return k.k.MarshalBinary() } -func (k *PublicKey) MarshalBinary() ([]byte, error) { return k.e.MarshalBinaryCompress() } - -func (k *PrivateKey) UnmarshalBinary(s Suite, data []byte) error { - p, ok := s.(params) - if !ok { - return ErrInvalidSuite - } - k.p = p - k.k = k.p.group.NewScalar() - - return k.k.UnmarshalBinary(data) -} - -func (k *PublicKey) UnmarshalBinary(s Suite, data []byte) error { - p, ok := s.(params) - if !ok { - return ErrInvalidSuite - } - k.p = p - k.e = k.p.group.NewElement() - - return k.e.UnmarshalBinary(data) -} - -func (k *PrivateKey) Public() *PublicKey { - if k.pub == nil { - k.pub = &PublicKey{k.p, k.p.group.NewElement().MulGen(k.k)} - } - - return k.pub -} - -// GenerateKey generates a private key compatible with the suite. -func GenerateKey(s Suite, rnd io.Reader) (*PrivateKey, error) { - if rnd == nil { - return nil, io.ErrNoProgress - } - - p, ok := s.(params) - if !ok { - return nil, ErrInvalidSuite - } - privateKey := p.group.RandomScalar(rnd) - - return &PrivateKey{p, privateKey, nil}, nil -} - -// DeriveKey generates a private key from a 32-byte seed and an optional info string. -func DeriveKey(s Suite, mode Mode, seed, info []byte) (*PrivateKey, error) { - const maxTries = 255 - p, ok := s.(params) - if !ok { - return nil, ErrInvalidSuite - } - if !isValidMode(mode) { - return nil, ErrInvalidMode - } - if len(seed) != 32 { - return nil, ErrInvalidSeed - } - p.m = mode - - lenInfo := []byte{0, 0} - binary.BigEndian.PutUint16(lenInfo, uint16(len(info))) - deriveInput := append(append(append([]byte{}, seed...), lenInfo...), info...) - - dst := p.getDST(deriveKeyPairDST) - zero := p.group.NewScalar() - privateKey := p.group.NewScalar() - for counter := byte(0); privateKey.IsEqual(zero); counter++ { - if counter > maxTries { - return nil, ErrDeriveKeyPairError - } - privateKey = p.group.HashToScalar(append(deriveInput, counter), dst) - } - - return &PrivateKey{p, privateKey, nil}, nil -} diff --git a/oprf/oprf.go b/oprf/oprf.go deleted file mode 100644 index 3870f7e8..00000000 --- a/oprf/oprf.go +++ /dev/null @@ -1,289 +0,0 @@ -// Package oprf provides Verifiable, Oblivious Pseudo-Random Functions. -// -// An Oblivious Pseudorandom Function (OPRFs) is a two-party protocol for -// computing the output of a PRF. One party (the server) holds the PRF secret -// key, and the other (the client) holds the PRF input. -// -// This package is compatible with the OPRF specification at RFC-9497 [1]. -// -// # Protocol Overview -// -// This diagram shows the steps of the protocol that are common for all operation modes. -// -// Client(info*) Server(sk, pk, info*) -// ================================================================= -// finData, evalReq = Blind(input) -// -// evalReq -// ----------> -// -// evaluation = Evaluate(evalReq, info*) -// -// evaluation -// <---------- -// -// output = Finalize(finData, evaluation, info*) -// -// # Operation Modes -// -// Each operation mode provides different properties to the PRF. -// -// Base Mode: Provides obliviousness to the PRF evaluation, i.e., it ensures -// that the server does not learn anything about the client's input and output -// during the Evaluation step. -// -// Verifiable Mode: Extends the Base mode allowing the client to verify that -// Server used the private key that corresponds to the public key. -// -// Partial Oblivious Mode: Extends the Verifiable mode by including shared -// public information to the PRF input. -// -// All three modes can perform batches of PRF evaluations, so passing an array -// of inputs will produce an array of outputs. -// -// # References -// -// [1] RFC-9497: https://www.rfc-editor.org/info/rfc9497 -package oprf - -import ( - "crypto" - "encoding/binary" - "errors" - "hash" - "io" - "math" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/zk/dleq" -) - -const ( - version = "OPRFV1-" - finalizeDST = "Finalize" - hashToGroupDST = "HashToGroup-" - hashToScalarDST = "HashToScalar-" - deriveKeyPairDST = "DeriveKeyPair" - infoLabel = "Info" -) - -type Mode = uint8 - -const ( - BaseMode Mode = 0x00 - VerifiableMode Mode = 0x01 - PartialObliviousMode Mode = 0x02 -) - -func isValidMode(m Mode) bool { - return m == BaseMode || m == VerifiableMode || m == PartialObliviousMode -} - -type Suite interface { - Identifier() string - Group() group.Group - Hash() crypto.Hash - cannotBeImplementedExternally() -} - -var ( - // SuiteRistretto255 represents the OPRF with Ristretto255 and SHA-512 - SuiteRistretto255 Suite = params{identifier: "ristretto255-SHA512", group: group.Ristretto255, hash: crypto.SHA512} - // SuiteP256 represents the OPRF with P-256 and SHA-256. - SuiteP256 Suite = params{identifier: "P256-SHA256", group: group.P256, hash: crypto.SHA256} - // SuiteP384 represents the OPRF with P-384 and SHA-384. - SuiteP384 Suite = params{identifier: "P384-SHA384", group: group.P384, hash: crypto.SHA384} - // SuiteP521 represents the OPRF with P-521 and SHA-512. - SuiteP521 Suite = params{identifier: "P521-SHA512", group: group.P521, hash: crypto.SHA512} -) - -func GetSuite(identifier string) (Suite, error) { - for _, suite := range []Suite{SuiteRistretto255, SuiteP256, SuiteP384, SuiteP521} { - if suite.Identifier() == identifier { - return suite, nil - } - } - return nil, ErrInvalidSuite -} - -func NewClient(s Suite) Client { - p := s.(params) - p.m = BaseMode - - return Client{client{p}} -} - -func NewVerifiableClient(s Suite, server *PublicKey) VerifiableClient { - p, ok := s.(params) - if !ok || server == nil { - panic(ErrNoKey) - } - p.m = VerifiableMode - - return VerifiableClient{client{p}, server} -} - -func NewPartialObliviousClient(s Suite, server *PublicKey) PartialObliviousClient { - p, ok := s.(params) - if !ok || server == nil { - panic(ErrNoKey) - } - p.m = PartialObliviousMode - - return PartialObliviousClient{client{p}, server} -} - -func NewServer(s Suite, key *PrivateKey) Server { - p, ok := s.(params) - if !ok || key == nil { - panic(ErrNoKey) - } - p.m = BaseMode - - return Server{server{p, key}} -} - -func NewVerifiableServer(s Suite, key *PrivateKey) VerifiableServer { - p, ok := s.(params) - if !ok || key == nil { - panic(ErrNoKey) - } - p.m = VerifiableMode - - return VerifiableServer{server{p, key}} -} - -func NewPartialObliviousServer(s Suite, key *PrivateKey) PartialObliviousServer { - p, ok := s.(params) - if !ok || key == nil { - panic(ErrNoKey) - } - p.m = PartialObliviousMode - - return PartialObliviousServer{server{p, key}} -} - -type params struct { - m Mode - group group.Group - hash crypto.Hash - identifier string -} - -func (p params) cannotBeImplementedExternally() {} - -func (p params) String() string { return p.Identifier() } -func (p params) Group() group.Group { return p.group } -func (p params) Hash() crypto.Hash { return p.hash } -func (p params) Identifier() string { return p.identifier } - -func (p params) getDST(name string) []byte { - return append(append(append(append( - []byte{}, - []byte(name)...), - []byte(version)...), - []byte{p.m, byte('-')}...), - []byte(p.identifier)...) -} - -func (p params) scalarFromInfo(info []byte) (group.Scalar, error) { - if len(info) > math.MaxUint16 { - return nil, ErrInvalidInfo - } - lenInfo := []byte{0, 0} - binary.BigEndian.PutUint16(lenInfo, uint16(len(info))) - framedInfo := append(append(append([]byte{}, - []byte(infoLabel)...), - lenInfo...), - info...) - - return p.group.HashToScalar(framedInfo, p.getDST(hashToScalarDST)), nil -} - -func (p params) finalizeHash(h hash.Hash, input, info, element []byte) []byte { - h.Reset() - lenBuf := []byte{0, 0} - - binary.BigEndian.PutUint16(lenBuf, uint16(len(input))) - mustWrite(h, lenBuf) - mustWrite(h, input) - - if p.m == PartialObliviousMode { - binary.BigEndian.PutUint16(lenBuf, uint16(len(info))) - mustWrite(h, lenBuf) - mustWrite(h, info) - } - - binary.BigEndian.PutUint16(lenBuf, uint16(len(element))) - mustWrite(h, lenBuf) - mustWrite(h, element) - - mustWrite(h, []byte(finalizeDST)) - - return h.Sum(nil) -} - -func (p params) getDLEQParams() (out dleq.Params) { - out.G = p.group - out.H = p.hash - out.DST = p.getDST("") - - return -} - -func mustWrite(h io.Writer, bytes []byte) { - bytesLen, err := h.Write(bytes) - if err != nil { - panic(err) - } - if len(bytes) != bytesLen { - panic("oprf: failed to write") - } -} - -var ( - ErrInvalidSuite = errors.New("oprf: invalid suite") - ErrInvalidMode = errors.New("oprf: invalid mode") - ErrDeriveKeyPairError = errors.New("oprf: key pair derivation failed") - ErrInvalidInput = errors.New("oprf: invalid input") - ErrInvalidSeed = errors.New("oprf: invalid seed size") - ErrInvalidInfo = errors.New("oprf: invalid info") - ErrInvalidProof = errors.New("oprf: proof verification failed") - ErrInverseZero = errors.New("oprf: inverting a zero value") - ErrNoKey = errors.New("oprf: must provide a key") -) - -type ( - Blind = group.Scalar - Blinded = group.Element - Evaluated = group.Element -) - -// FinalizeData encapsulates data needed for Finalize step. -type FinalizeData struct { - inputs [][]byte - blinds []Blind - evalReq *EvaluationRequest -} - -// CopyBlinds copies the serialized blinds to use when deterministically -// invoking DeterministicBlind. -func (f FinalizeData) CopyBlinds() []Blind { - out := make([]Blind, len(f.blinds)) - for i, b := range f.blinds { - out[i] = b.Copy() - } - return out -} - -// EvaluationRequest contains the blinded elements to be evaluated by the Server. -type EvaluationRequest struct { - Elements []Blinded -} - -// Evaluation contains a list of elements produced during server's evaluation, and -// for verifiable modes it also includes a proof. -type Evaluation struct { - Elements []Evaluated - Proof *dleq.Proof -} diff --git a/oprf/oprf_test.go b/oprf/oprf_test.go deleted file mode 100644 index 7f5ba142..00000000 --- a/oprf/oprf_test.go +++ /dev/null @@ -1,354 +0,0 @@ -package oprf - -import ( - "bytes" - "crypto/rand" - "encoding" - "encoding/binary" - "fmt" - "testing" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/internal/test" -) - -type commonClient interface { - blind(inputs [][]byte, blinds []Blind) (*FinalizeData, *EvaluationRequest, error) - DeterministicBlind(inputs [][]byte, blinds []Blind) (*FinalizeData, *EvaluationRequest, error) - Blind(inputs [][]byte) (*FinalizeData, *EvaluationRequest, error) - Finalize(d *FinalizeData, e *Evaluation) ([][]byte, error) -} - -type c1 struct { - PartialObliviousClient - info []byte -} - -func (c *c1) Finalize(f *FinalizeData, e *Evaluation) ([][]byte, error) { - return c.PartialObliviousClient.Finalize(f, e, c.info) -} - -type commonServer interface { - Evaluate(req *EvaluationRequest) (*Evaluation, error) - FullEvaluate(input []byte) ([]byte, error) - VerifyFinalize(input, expectedOutput []byte) bool - PublicKey() *PublicKey -} - -type s1 struct { - PartialObliviousServer - info []byte -} - -func (s *s1) Evaluate(req *EvaluationRequest) (*Evaluation, error) { - return s.PartialObliviousServer.Evaluate(req, s.info) -} - -func (s *s1) FullEvaluate(input []byte) ([]byte, error) { - return s.PartialObliviousServer.FullEvaluate(input, s.info) -} - -func (s *s1) VerifyFinalize(input, expectedOutput []byte) bool { - return s.PartialObliviousServer.VerifyFinalize(input, s.info, expectedOutput) -} - -type canMarshal interface { - encoding.BinaryMarshaler - UnmarshalBinary(id Suite, data []byte) (err error) -} - -func testMarshal(t *testing.T, suite Suite, x, y canMarshal, name string) { - t.Helper() - - wantBytes, err := x.MarshalBinary() - test.CheckNoErr(t, err, "error on marshaling "+name) - - err = y.UnmarshalBinary(suite, wantBytes) - test.CheckNoErr(t, err, "error on unmarshaling "+name) - - gotBytes, err := x.MarshalBinary() - test.CheckNoErr(t, err, "error on marshaling "+name) - - if !bytes.Equal(gotBytes, wantBytes) { - test.ReportError(t, gotBytes, wantBytes) - } -} - -func elementsMarshalBinary(g group.Group, e []group.Element) ([]byte, error) { - output := make([]byte, 2, 2+len(e)*int(g.Params().CompressedElementLength)) - binary.BigEndian.PutUint16(output[0:2], uint16(len(e))) - - for i := range e { - ei, err := e[i].MarshalBinaryCompress() - if err != nil { - return nil, err - } - output = append(output, ei...) - } - - return output, nil -} - -func testAPI(t *testing.T, server commonServer, client commonClient) { - t.Helper() - - inputs := [][]byte{{0x00}, {0xFF}} - finData, evalReq, err := client.Blind(inputs) - test.CheckNoErr(t, err, "invalid blinding of client") - - blinds := finData.CopyBlinds() - _, detEvalReq, err := client.DeterministicBlind(inputs, blinds) - test.CheckNoErr(t, err, "invalid deterministic blinding of client") - test.CheckOk(len(detEvalReq.Elements) == len(evalReq.Elements), "invalid number of evaluations", t) - for i := range evalReq.Elements { - test.CheckOk(evalReq.Elements[i].IsEqual(detEvalReq.Elements[i]), "invalid blinded element mismatch", t) - } - - eval, err := server.Evaluate(evalReq) - test.CheckNoErr(t, err, "invalid evaluation of server") - test.CheckOk(eval != nil, "invalid evaluation of server: no evaluation", t) - - clientOutputs, err := client.Finalize(finData, eval) - test.CheckNoErr(t, err, "invalid finalize of client") - test.CheckOk(clientOutputs != nil, "invalid finalize of client: no outputs", t) - - for i := range inputs { - valid := server.VerifyFinalize(inputs[i], clientOutputs[i]) - test.CheckOk(valid, "invalid verification from the server", t) - - serverOutput, err := server.FullEvaluate(inputs[i]) - test.CheckNoErr(t, err, "FullEvaluate failed") - - if !bytes.Equal(serverOutput, clientOutputs[i]) { - test.ReportError(t, serverOutput, clientOutputs[i]) - } - } -} - -func TestAPI(t *testing.T) { - info := []byte("shared info") - - for _, suite := range []Suite{ - SuiteRistretto255, - SuiteP256, - SuiteP384, - SuiteP521, - } { - t.Run(suite.(fmt.Stringer).String(), func(t *testing.T) { - private, err := GenerateKey(suite, rand.Reader) - test.CheckNoErr(t, err, "failed private key generation") - testMarshal(t, suite, private, new(PrivateKey), "PrivateKey") - public := private.Public() - testMarshal(t, suite, public, new(PublicKey), "PublicKey") - - t.Run("OPRF", func(t *testing.T) { - s := NewServer(suite, private) - c := NewClient(suite) - testAPI(t, s, c) - }) - - t.Run("VOPRF", func(t *testing.T) { - s := NewVerifiableServer(suite, private) - c := NewVerifiableClient(suite, s.PublicKey()) - testAPI(t, s, c) - }) - - t.Run("POPRF", func(t *testing.T) { - s := &s1{NewPartialObliviousServer(suite, private), info} - c := &c1{NewPartialObliviousClient(suite, s.PublicKey()), info} - testAPI(t, s, c) - }) - }) - } -} - -func TestErrors(t *testing.T) { - goodID := SuiteP256 - strErrNil := "must be nil" - strErrK := "must fail key" - strErrC := "must fail client" - strErrS := "must fail server" - - t.Run("badID", func(t *testing.T) { - var badID Suite - - k, err := GenerateKey(badID, rand.Reader) - test.CheckIsErr(t, err, strErrK) - test.CheckOk(k == nil, strErrNil, t) - - k, err = DeriveKey(badID, BaseMode, nil, nil) - test.CheckIsErr(t, err, strErrK) - test.CheckOk(k == nil, strErrNil, t) - - err = new(PrivateKey).UnmarshalBinary(badID, nil) - test.CheckIsErr(t, err, strErrK) - - err = new(PublicKey).UnmarshalBinary(badID, nil) - test.CheckIsErr(t, err, strErrK) - - err = test.CheckPanic(func() { NewClient(badID) }) - test.CheckNoErr(t, err, strErrC) - - err = test.CheckPanic(func() { NewServer(badID, nil) }) - test.CheckNoErr(t, err, strErrS) - - err = test.CheckPanic(func() { NewVerifiableClient(badID, nil) }) - test.CheckNoErr(t, err, strErrC) - - err = test.CheckPanic(func() { NewVerifiableServer(badID, nil) }) - test.CheckNoErr(t, err, strErrS) - - err = test.CheckPanic(func() { NewPartialObliviousClient(badID, nil) }) - test.CheckNoErr(t, err, strErrC) - - err = test.CheckPanic(func() { NewPartialObliviousServer(badID, nil) }) - test.CheckNoErr(t, err, strErrS) - }) - - t.Run("nilPubKey", func(t *testing.T) { - err := test.CheckPanic(func() { NewVerifiableClient(goodID, nil) }) - test.CheckNoErr(t, err, strErrC) - }) - - t.Run("nilCalls", func(t *testing.T) { - c := NewClient(goodID) - finData, evalReq, err := c.Blind(nil) - test.CheckIsErr(t, err, strErrC) - test.CheckOk(finData == nil, strErrNil, t) - test.CheckOk(evalReq == nil, strErrNil, t) - - var emptyEval Evaluation - finData, _, _ = c.Blind([][]byte{[]byte("in0"), []byte("in1")}) - out, err := c.Finalize(finData, &emptyEval) - test.CheckIsErr(t, err, strErrC) - test.CheckOk(out == nil, strErrNil, t) - }) - - t.Run("invalidProof", func(t *testing.T) { - key, _ := GenerateKey(goodID, rand.Reader) - s := NewVerifiableServer(goodID, key) - c := NewVerifiableClient(goodID, key.Public()) - - finData, evalReq, _ := c.Blind([][]byte{[]byte("in0"), []byte("in1")}) - _, _ = s.Evaluate(evalReq) - _, evalReq, _ = c.Blind([][]byte{[]byte("in0"), []byte("in2")}) - badEV, _ := s.Evaluate(evalReq) - _, err := c.Finalize(finData, badEV) - test.CheckIsErr(t, err, strErrC) - }) - - t.Run("badKeyGen", func(t *testing.T) { - key, err := GenerateKey(goodID, nil) - test.CheckIsErr(t, err, strErrNil) - test.CheckOk(key == nil, strErrNil, t) - - key, err = DeriveKey(goodID, Mode(8), nil, nil) - test.CheckIsErr(t, err, strErrK) - test.CheckOk(key == nil, strErrNil, t) - }) -} - -func Example_oprf() { - suite := SuiteP256 - // Server(sk, pk, info*) - private, _ := GenerateKey(suite, rand.Reader) - server := NewServer(suite, private) - // Client(info*) - client := NewClient(suite) - // ================================================================= - // finData, evalReq = Blind(input) - inputs := [][]byte{[]byte("first input"), []byte("second input")} - finData, evalReq, _ := client.Blind(inputs) - // - // evalReq - // ----------> - // - // evaluation = Evaluate(evalReq, info*) - evaluation, _ := server.Evaluate(evalReq) - // - // evaluation - // <---------- - // - // output = Finalize(finData, evaluation, info*) - outputs, err := client.Finalize(finData, evaluation) - fmt.Print(err == nil && len(inputs) == len(outputs)) - // Output: true -} - -func BenchmarkAPI(b *testing.B) { - for _, suite := range []Suite{ - SuiteRistretto255, - SuiteP256, - SuiteP384, - SuiteP521, - } { - key, err := GenerateKey(suite, rand.Reader) - test.CheckNoErr(b, err, "failed key generation") - - b.Run("OPRF/"+suite.Identifier(), func(b *testing.B) { - s := NewServer(suite, key) - c := NewClient(suite) - benchAPI(b, s, c) - }) - - b.Run("VOPRF/"+suite.Identifier(), func(b *testing.B) { - s := NewVerifiableServer(suite, key) - c := NewVerifiableClient(suite, s.PublicKey()) - benchAPI(b, s, c) - }) - - b.Run("POPRF/"+suite.Identifier(), func(b *testing.B) { - info := []byte("shared info") - s := &s1{NewPartialObliviousServer(suite, key), info} - c := &c1{NewPartialObliviousClient(suite, s.PublicKey()), info} - benchAPI(b, s, c) - }) - } -} - -func benchAPI(b *testing.B, server commonServer, client commonClient) { - b.Helper() - inputs := [][]byte{[]byte("first input"), []byte("second input")} - finData, evalReq, err := client.Blind(inputs) - test.CheckNoErr(b, err, "failed client request") - - eval, err := server.Evaluate(evalReq) - test.CheckNoErr(b, err, "failed server evaluate") - - clientOutputs, err := client.Finalize(finData, eval) - test.CheckNoErr(b, err, "failed client finalize") - - b.Run("Client/Request", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _, _ = client.Blind(inputs) - } - }) - - b.Run("Server/Evaluate", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _ = server.Evaluate(evalReq) - } - }) - - b.Run("Client/Finalize", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _ = client.Finalize(finData, eval) - } - }) - - b.Run("Server/VerifyFinalize", func(b *testing.B) { - for i := 0; i < b.N; i++ { - for j := range inputs { - server.VerifyFinalize(inputs[j], clientOutputs[j]) - } - } - }) - - b.Run("Server/FullEvaluate", func(b *testing.B) { - for i := 0; i < b.N; i++ { - for j := range inputs { - _, _ = server.FullEvaluate(inputs[j]) - } - } - }) -} diff --git a/oprf/server.go b/oprf/server.go deleted file mode 100644 index 7e3265cf..00000000 --- a/oprf/server.go +++ /dev/null @@ -1,146 +0,0 @@ -package oprf - -import ( - "crypto/rand" - "crypto/subtle" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/zk/dleq" -) - -type server struct { - params - privateKey *PrivateKey -} - -type Server struct{ server } - -type VerifiableServer struct{ server } - -type PartialObliviousServer struct{ server } - -func (s server) PublicKey() *PublicKey { return s.privateKey.Public() } - -func (s server) evaluate(elements []Blinded, secret Blind) []Evaluated { - evaluations := make([]Evaluated, len(elements)) - for i := range elements { - evaluations[i] = s.params.group.NewElement().Mul(elements[i], secret) - } - - return evaluations -} - -func (s Server) Evaluate(req *EvaluationRequest) (*Evaluation, error) { - evaluations := s.server.evaluate(req.Elements, s.privateKey.k) - - return &Evaluation{evaluations, nil}, nil -} - -func (s VerifiableServer) Evaluate(req *EvaluationRequest) (*Evaluation, error) { - evaluations := s.server.evaluate(req.Elements, s.privateKey.k) - - proof, err := dleq.Prover{Params: s.getDLEQParams()}.ProveBatch( - s.privateKey.k, - s.params.group.Generator(), - s.PublicKey().e, - req.Elements, - evaluations, - rand.Reader, - ) - if err != nil { - return nil, err - } - - return &Evaluation{evaluations, proof}, nil -} - -func (s PartialObliviousServer) Evaluate(req *EvaluationRequest, info []byte) (*Evaluation, error) { - keyProof, evalSecret, err := s.secretFromInfo(info) - if err != nil { - return nil, err - } - - evaluations := s.server.evaluate(req.Elements, evalSecret) - - proof, err := dleq.Prover{Params: s.getDLEQParams()}.ProveBatch( - keyProof, - s.params.group.Generator(), - s.params.group.NewElement().MulGen(keyProof), - evaluations, - req.Elements, - rand.Reader, - ) - if err != nil { - return nil, err - } - - return &Evaluation{evaluations, proof}, nil -} - -func (s server) secretFromInfo(info []byte) (t, tInv group.Scalar, err error) { - m, err := s.params.scalarFromInfo(info) - if err != nil { - return nil, nil, err - } - t = s.params.group.NewScalar().Add(m, s.privateKey.k) - - if zero := s.params.group.NewScalar(); t.IsEqual(zero) { - return nil, nil, ErrInverseZero - } - tInv = s.params.group.NewScalar().Inv(t) - - return t, tInv, nil -} - -func (s server) fullEvaluate(input, info []byte) ([]byte, error) { - evalSecret := s.privateKey.k - if s.params.m == PartialObliviousMode { - var err error - _, evalSecret, err = s.secretFromInfo(info) - if err != nil { - return nil, err - } - } - - element := s.params.group.HashToElement(input, s.params.getDST(hashToGroupDST)) - evaluation := s.params.group.NewElement().Mul(element, evalSecret) - serEval, err := evaluation.MarshalBinaryCompress() - if err != nil { - return nil, err - } - - return s.finalizeHash(s.params.hash.New(), input, info, serEval), nil -} - -func (s Server) FullEvaluate(input []byte) (output []byte, err error) { - return s.fullEvaluate(input, nil) -} - -func (s VerifiableServer) FullEvaluate(input []byte) (output []byte, err error) { - return s.fullEvaluate(input, nil) -} - -func (s PartialObliviousServer) FullEvaluate(input, info []byte) (output []byte, err error) { - return s.fullEvaluate(input, info) -} - -func (s server) verifyFinalize(input, info, expectedOutput []byte) bool { - gotOutput, err := s.fullEvaluate(input, info) - if err != nil { - return false - } - - return subtle.ConstantTimeCompare(gotOutput, expectedOutput) == 1 -} - -func (s Server) VerifyFinalize(input, expectedOutput []byte) bool { - return s.verifyFinalize(input, nil, expectedOutput) -} - -func (s VerifiableServer) VerifyFinalize(input, expectedOutput []byte) bool { - return s.verifyFinalize(input, nil, expectedOutput) -} - -func (s PartialObliviousServer) VerifyFinalize(input, info, expectedOutput []byte) bool { - return s.verifyFinalize(input, info, expectedOutput) -} diff --git a/oprf/testdata/rfc9497.json b/oprf/testdata/rfc9497.json deleted file mode 100644 index 4b215426..00000000 --- a/oprf/testdata/rfc9497.json +++ /dev/null @@ -1,632 +0,0 @@ -[ - { - "groupDST": "48617368546f47726f75702d4f50524656312d002d72697374726574746f3235352d534841353132", - "hash": "SHA512", - "identifier": "ristretto255-SHA512", - "keyInfo": "74657374206b6579", - "mode": 0, - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "5ebcea5ee37023ccb9fc2d2019f9d7737be85591ae8652ffa9ef0f4d37063b0e", - "vectors": [ - { - "Batch": 1, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f6706", - "BlindedElement": "609a0ae68c15a3cf6903766461307e5c8bb2f95e7e6550e1ffa2dc99e412803c", - "EvaluationElement": "7ec6578ae5120958eb2db1745758ff379e77cb64fe77b0b2d8cc917ea0869c7e", - "Input": "00", - "Output": "527759c3d9366f277d8c6020418d96bb393ba2afb20ff90df23fb7708264e2f3ab9135e3bd69955851de4b1f9fe8a0973396719b7912ba9ee8aa7d0b5e24bcf6" - }, - { - "Batch": 1, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f6706", - "BlindedElement": "da27ef466870f5f15296299850aa088629945a17d1f5b7f5ff043f76b3c06418", - "EvaluationElement": "b4cbf5a4f1eeda5a63ce7b77c7d23f461db3fcab0dd28e4e17cecb5c90d02c25", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "f4a74c9c592497375e796aa837e907b1a045d34306a749db9f34221f7e750cb4f2a6413a6bf6fa5e19ba6348eb673934a722a7ede2e7621306d18951e7cf2c73" - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d012d72697374726574746f3235352d534841353132", - "hash": "SHA512", - "identifier": "ristretto255-SHA512", - "keyInfo": "74657374206b6579", - "mode": 1, - "pkSm": "c803e2cc6b05fc15064549b5920659ca4a77b2cca6f04f6b357009335476ad4e", - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "e6f73f344b79b379f1a0dd37e07ff62e38d9f71345ce62ae3a9bc60b04ccd909", - "vectors": [ - { - "Batch": 1, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f6706", - "BlindedElement": "863f330cc1a1259ed5a5998a23acfd37fb4351a793a5b3c090b642ddc439b945", - "EvaluationElement": "aa8fa048764d5623868679402ff6108d2521884fa138cd7f9c7669a9a014267e", - "Input": "00", - "Output": "b58cfbe118e0cb94d79b5fd6a6dafb98764dff49c14e1770b566e42402da1a7da4d8527693914139caee5bd03903af43a491351d23b430948dd50cde10d32b3c", - "Proof": { - "proof": "ddef93772692e535d1a53903db24367355cc2cc78de93b3be5a8ffcc6985dd066d4346421d17bf5117a2a1ff0fcb2a759f58a539dfbe857a40bce4cf49ec600d", - "r": "222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d9881aa6f61d645fc0e" - } - }, - { - "Batch": 1, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f6706", - "BlindedElement": "cc0b2a350101881d8a4cba4c80241d74fb7dcbfde4a61fde2f91443c2bf9ef0c", - "EvaluationElement": "60a59a57208d48aca71e9e850d22674b611f752bed48b36f7a91b372bd7ad468", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "8a9a2f3c7f085b65933594309041fc1898d42d0858e59f90814ae90571a6df60356f4610bf816f27afdd84f47719e480906d27ecd994985890e5f539e7ea74b6", - "Proof": { - "proof": "401a0da6264f8cf45bb2f5264bc31e109155600babb3cd4e5af7d181a2c9dc0a67154fabf031fd936051dec80b0b6ae29c9503493dde7393b722eafdf5a50b02", - "r": "222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d9881aa6f61d645fc0e" - } - }, - { - "Batch": 2, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f6706,222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d9881aa6f61d645fc0e", - "BlindedElement": "863f330cc1a1259ed5a5998a23acfd37fb4351a793a5b3c090b642ddc439b945,90a0145ea9da29254c3a56be4fe185465ebb3bf2a1801f7124bbbadac751e654", - "EvaluationElement": "aa8fa048764d5623868679402ff6108d2521884fa138cd7f9c7669a9a014267e,cc5ac221950a49ceaa73c8db41b82c20372a4c8d63e5dded2db920b7eee36a2a", - "Input": "00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "b58cfbe118e0cb94d79b5fd6a6dafb98764dff49c14e1770b566e42402da1a7da4d8527693914139caee5bd03903af43a491351d23b430948dd50cde10d32b3c,8a9a2f3c7f085b65933594309041fc1898d42d0858e59f90814ae90571a6df60356f4610bf816f27afdd84f47719e480906d27ecd994985890e5f539e7ea74b6", - "Proof": { - "proof": "cc203910175d786927eeb44ea847328047892ddf8590e723c37205cb74600b0a5ab5337c8eb4ceae0494c2cf89529dcf94572ed267473d567aeed6ab873dee08", - "r": "419c4f4f5052c53c45f3da494d2b67b220d02118e0857cdbcf037f9ea84bbe0c" - } - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d022d72697374726574746f3235352d534841353132", - "hash": "SHA512", - "identifier": "ristretto255-SHA512", - "keyInfo": "74657374206b6579", - "mode": 2, - "pkSm": "c647bef38497bc6ec077c22af65b696efa43bff3b4a1975a3e8e0a1c5a79d631", - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "145c79c108538421ac164ecbe131942136d5570b16d8bf41a24d4337da981e07", - "vectors": [ - { - "Batch": 1, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f6706", - "BlindedElement": "c8713aa89241d6989ac142f22dba30596db635c772cbf25021fdd8f3d461f715", - "EvaluationElement": "1a4b860d808ff19624731e67b5eff20ceb2df3c3c03b906f5693e2078450d874", - "Info": "7465737420696e666f", - "Input": "00", - "Output": "ca688351e88afb1d841fde4401c79efebb2eb75e7998fa9737bd5a82a152406d38bd29f680504e54fd4587eddcf2f37a2617ac2fbd2993f7bdf45442ace7d221", - "Proof": { - "proof": "41ad1a291aa02c80b0915fbfbb0c0afa15a57e2970067a602ddb9e8fd6b7100de32e1ecff943a36f0b10e3dae6bd266cdeb8adf825d86ef27dbc6c0e30c52206", - "r": "222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d9881aa6f61d645fc0e" - } - }, - { - "Batch": 1, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f6706", - "BlindedElement": "f0f0b209dd4d5f1844dac679acc7761b91a2e704879656cb7c201e82a99ab07d", - "EvaluationElement": "8c3c9d064c334c6991e99f286ea2301d1bde170b54003fb9c44c6d7bd6fc1540", - "Info": "7465737420696e666f", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "7c6557b276a137922a0bcfc2aa2b35dd78322bd500235eb6d6b6f91bc5b56a52de2d65612d503236b321f5d0bebcbc52b64b92e426f29c9b8b69f52de98ae507", - "Proof": { - "proof": "4c39992d55ffba38232cdac88fe583af8a85441fefd7d1d4a8d0394cd1de77018bf135c174f20281b3341ab1f453fe72b0293a7398703384bed822bfdeec8908", - "r": "222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d9881aa6f61d645fc0e" - } - }, - { - "Batch": 2, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec4c1f6706,222a5e897cf59db8145db8d16e597e8facb80ae7d4e26d9881aa6f61d645fc0e", - "BlindedElement": "c8713aa89241d6989ac142f22dba30596db635c772cbf25021fdd8f3d461f715,423a01c072e06eb1cce96d23acce06e1ea64a609d7ec9e9023f3049f2d64e50c", - "EvaluationElement": "1a4b860d808ff19624731e67b5eff20ceb2df3c3c03b906f5693e2078450d874,aa1f16e903841036e38075da8a46655c94fc92341887eb5819f46312adfc0504", - "Info": "7465737420696e666f", - "Input": "00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "ca688351e88afb1d841fde4401c79efebb2eb75e7998fa9737bd5a82a152406d38bd29f680504e54fd4587eddcf2f37a2617ac2fbd2993f7bdf45442ace7d221,7c6557b276a137922a0bcfc2aa2b35dd78322bd500235eb6d6b6f91bc5b56a52de2d65612d503236b321f5d0bebcbc52b64b92e426f29c9b8b69f52de98ae507", - "Proof": { - "proof": "43fdb53be399cbd3561186ae480320caa2b9f36cca0e5b160c4a677b8bbf4301b28f12c36aa8e11e5a7ef551da0781e863a6dc8c0b2bf5a149c9e00621f02006", - "r": "419c4f4f5052c53c45f3da494d2b67b220d02118e0857cdbcf037f9ea84bbe0c" - } - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d002d64656361663434382d5348414b45323536", - "hash": "SHAKE_256", - "identifier": "decaf448-SHAKE256", - "keyInfo": "74657374206b6579", - "mode": 0, - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "e8b1375371fd11ebeb224f832dcc16d371b4188951c438f751425699ed29ecc80c6c13e558ccd67634fd82eac94aa8d1f0d7fee990695d1e", - "vectors": [ - { - "Batch": 1, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa3833a26e9388336361686ff1f83df55046504dfecad8549ba112", - "BlindedElement": "e0ae01c4095f08e03b19baf47ffdc19cb7d98e583160522a3c7d6a0b2111cd93a126a46b7b41b730cd7fc943d4e28e590ed33ae475885f6c", - "EvaluationElement": "50ce4e60eed006e22e7027454b5a4b8319eb2bc8ced609eb19eb3ad42fb19e06ba12d382cbe7ae342a0cad6ead0ef8f91f00bb7f0cd9c0a2", - "Input": "00", - "Output": "37d3f7922d9388a15b561de5829bbf654c4089ede89c0ce0f3f85bcdba09e382ce0ab3507e021f9e79706a1798ffeac68ebd5cf62e5eb9838c7068351d97ae37" - }, - { - "Batch": 1, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa3833a26e9388336361686ff1f83df55046504dfecad8549ba112", - "BlindedElement": "86a88dc5c6331ecfcb1d9aacb50a68213803c462e377577cacc00af28e15f0ddbc2e3d716f2f39ef95f3ec1314a2c64d940a9f295d8f13bb", - "EvaluationElement": "162e9fa6e9d527c3cd734a31bf122a34dbd5bcb7bb23651f1768a7a9274cc116c03b58afa6f0dede3994a60066c76370e7328e7062fd5819", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "a2a652290055cb0f6f8637a249ee45e32ef4667db0b4c80c0a70d2a64164d01525cfdad5d870a694ec77972b9b6ec5d2596a5223e5336913f945101f0137f55e" - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d012d64656361663434382d5348414b45323536", - "hash": "SHAKE_256", - "identifier": "decaf448-SHAKE256", - "keyInfo": "74657374206b6579", - "mode": 1, - "pkSm": "945fc518c47695cf65217ace04b86ac5e4cbe26ca649d52854bb16c494ce09069d6add96b20d4b0ae311a87c9a73e3a146b525763ab2f955", - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "e3c01519a076a326a0eb566343e9b21c115fa18e6e85577ddbe890b33104fcc2835ddfb14a928dc3f5d79b936e17c76b99e0bf6a1680930e", - "vectors": [ - { - "Batch": 1, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa3833a26e9388336361686ff1f83df55046504dfecad8549ba112", - "BlindedElement": "7261bbc335c664ba788f1b1a1a4cd5190cc30e787ef277665ac1d314f8861e3ec11854ce3ddd42035d9e0f5cddde324c332d8c880abc00eb", - "EvaluationElement": "ca1491a526c28d880806cf0fb0122222392cf495657be6e4c9d203bceffa46c86406caf8217859d3fb259077af68e5d41b3699410781f467", - "Input": "00", - "Output": "e2ac40b634f36cccd8262b285adff7c9dcc19cd308564a5f4e581d1a8535773b86fa4fc9f2203c370763695c5093aea4a7aedec4488b1340ba3bf663a23098c1", - "Proof": { - "proof": "f84bbeee47aedf43558dae4b95b3853635a9fc1a9ea7eac9b454c64c66c4f49cd1c72711c7ac2e06c681e16ea693d5500bbd7b56455df52f69e00b76b4126961e1562fdbaaac40b7701065cbeece3febbfe09e00160f81775d36daed99d8a2a10be0759e01b7ee81217203416c9db208", - "r": "b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b" - } - }, - { - "Batch": 1, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa3833a26e9388336361686ff1f83df55046504dfecad8549ba112", - "BlindedElement": "88287e553939090b888ddc15913e1807dc4757215555e1c3a79488ef311594729c7fa74c772a732b78440b7d66d0aa35f3bb316f1d93e1b2", - "EvaluationElement": "c00978c73e8e4ee1d447ab0d3ad1754055e72cc85c08e3a0db170909a9c61cbff1f1e7015f289e3038b0f341faea5d7780c130106065c231", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "862952380e07ec840d9f6e6f909c5a25d16c3dacb586d89a181b4aa7380c959baa8c480fe8e6c64e089d68ea7aeeb5817bd524d7577905b5bab487690048c941", - "Proof": { - "proof": "7a2831a6b237e11ac1657d440df93bc5ce00f552e6020a99d5c956ffc4d07b5ade3e82ecdc257fd53d76239e733e0a1313e84ce16cc0d82734806092a693d7e8d3c420c2cb6ccd5d0ca32514fb78e9ad0973ebdcb52eba438fc73948d76339ee710121d83e2fe6f001cfdf551aff9f36", - "r": "b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b" - } - }, - { - "Batch": 2, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa3833a26e9388336361686ff1f83df55046504dfecad8549ba112,b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b", - "BlindedElement": "7261bbc335c664ba788f1b1a1a4cd5190cc30e787ef277665ac1d314f8861e3ec11854ce3ddd42035d9e0f5cddde324c332d8c880abc00eb,2e15f393c035492a1573627a3606e528c6294c767c8d43b8c691ef70a52cc7dc7d1b53fe458350a270abb7c231b87ba58266f89164f714d9", - "EvaluationElement": "ca1491a526c28d880806cf0fb0122222392cf495657be6e4c9d203bceffa46c86406caf8217859d3fb259077af68e5d41b3699410781f467,8ec68e9871b296e81c55647ce64a04fe75d19932f1400544cd601468c60f998408bbb546601d4a636e8be279e558d70b95c8d4a4f61892be", - "Input": "00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "e2ac40b634f36cccd8262b285adff7c9dcc19cd308564a5f4e581d1a8535773b86fa4fc9f2203c370763695c5093aea4a7aedec4488b1340ba3bf663a23098c1,862952380e07ec840d9f6e6f909c5a25d16c3dacb586d89a181b4aa7380c959baa8c480fe8e6c64e089d68ea7aeeb5817bd524d7577905b5bab487690048c941", - "Proof": { - "proof": "167d922f0a6ffa845eed07f8aa97b6ac746d902ecbeb18f49c009adc0521eab1e4d275b74a2dc266b7a194c854e85e7eb54a9a36376dfc04ec7f3bd55fc9618c3970cb548e064f8a2f06183a5702933dbc3e4c25a73438f2108ee1981c306181003c7ea92fce963ec7b4ba4f270e6d38", - "r": "63798726803c9451ba405f00ef3acb633ddf0c420574a2ec6cbf28f840800e355c9fbaac10699686de2724ed22e797a00f3bd93d105a7f23" - } - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d022d64656361663434382d5348414b45323536", - "hash": "SHAKE_256", - "identifier": "decaf448-SHAKE256", - "keyInfo": "74657374206b6579", - "mode": 2, - "pkSm": "6c9d12723a5bbcf305522cc04b4a34d9ced2e12831826018ea7b5dcf5452647ad262113059bf0f6e4354319951b9d513c74f29cb0eec38c1", - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "792a10dcbd3ba4a52a054f6f39186623208695301e7adb9634b74709ab22de402990eb143fd7c67ac66be75e0609705ecea800992aac8e19", - "vectors": [ - { - "Batch": 1, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa3833a26e9388336361686ff1f83df55046504dfecad8549ba112", - "BlindedElement": "161183c13c6cb33b0e4f9b7365f8c5c12d13c72f8b62d276ca09368d093dce9b42198276b9e9d870ac392dda53efd28d1b7e6e8c060cdc42", - "EvaluationElement": "06ec89dfde25bb2a6f0145ac84b91ac277b35de39ad1d6f402a8e46414952ce0d9ea1311a4ece283e2b01558c7078b040cfaa40dd63b3e6c", - "Info": "7465737420696e666f", - "Input": "00", - "Output": "4423f6dcc1740688ea201de57d76824d59cd6b859e1f9884b7eebc49b0b971358cf9cb075df1536a8ea31bcf55c3e31c2ba9cfa8efe54448d17091daeb9924ed", - "Proof": { - "proof": "66caee75bf2460429f620f6ad3e811d524cb8ddd848a435fc5d89af48877abf6506ee341a0b6f67c2d76cd021e5f3d1c9abe5aa9f0dce016da746135fedba2af41ed1d01659bfd6180d96bc1b7f320c0cb6926011ce392ecca748662564892bae66516acaac6ca39aadf6fcca95af406", - "r": "b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b" - } - }, - { - "Batch": 1, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa3833a26e9388336361686ff1f83df55046504dfecad8549ba112", - "BlindedElement": "12082b6a381c6c51e85d00f2a3d828cdeab3f5cb19a10b9c014c33826764ab7e7cfb8b4ff6f411bddb2d64e62a472af1cd816e5b712790c6", - "EvaluationElement": "f2919b7eedc05ab807c221fce2b12c4ae9e19e6909c4784564b690d1972d2994ca623f273afc67444d84ea40cbc58fcdab7945f321a52848", - "Info": "7465737420696e666f", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "8691905500510843902c44bdd9730ab9dc3925aa58ff9dd42765a2baf633126de0c3adb93bef5652f38e5827b6396e87643960163a560fc4ac9738c8de4e4a8d", - "Proof": { - "proof": "a295677c54d1bc4286330907fc2490a7de163da26f9ce03a462a452fea422b19ade296ba031359b3b6841e48455d20519ad01b4ac4f0b92e76d3cf16fbef0a3f72791a8401ef2d7081d361e502e96b2c60608b9fa566f43d4611c2f161d83aabef7f8017332b26ed1daaf80440772022", - "r": "b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b" - } - }, - { - "Batch": 2, - "Blind": "64d37aed22a27f5191de1c1d69fadb899d8862b58eb4220029e036ec65fa3833a26e9388336361686ff1f83df55046504dfecad8549ba112,b1b748135d405ce48c6973401d9455bb8ccd18b01d0295c0627f67661200dbf9569f73fbb3925daa043a070e5f953d80bb464ea369e5522b", - "BlindedElement": "161183c13c6cb33b0e4f9b7365f8c5c12d13c72f8b62d276ca09368d093dce9b42198276b9e9d870ac392dda53efd28d1b7e6e8c060cdc42,fc8847d43fb4cea4e408f585661a8f2867533fa91d22155d3127a22f18d3b007add480f7d300bca93fa47fe87ae06a57b7d0f0d4c30b12f0", - "EvaluationElement": "06ec89dfde25bb2a6f0145ac84b91ac277b35de39ad1d6f402a8e46414952ce0d9ea1311a4ece283e2b01558c7078b040cfaa40dd63b3e6c,2e74c626d07de49b1c8c21d87120fd78105f485e36816af9bde3e3efbeef76815326062fd333925b66c5ce5a20f100bf01770c16609f990a", - "Info": "7465737420696e666f", - "Input": "00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "4423f6dcc1740688ea201de57d76824d59cd6b859e1f9884b7eebc49b0b971358cf9cb075df1536a8ea31bcf55c3e31c2ba9cfa8efe54448d17091daeb9924ed,8691905500510843902c44bdd9730ab9dc3925aa58ff9dd42765a2baf633126de0c3adb93bef5652f38e5827b6396e87643960163a560fc4ac9738c8de4e4a8d", - "Proof": { - "proof": "fd94db736f97ea4efe9d0d4ad2933072697a6bbeb32834057b23edf7c7009f011dfa72157f05d2a507c2bbf0b54cad99ab99de05921c021fda7d70e65bcecdb05f9a30154127ace983c74d10fd910b554c5e95f6bd1565fd1f3dbbe3c523ece5c72d57a559b7be1368c4786db4a3c910", - "r": "63798726803c9451ba405f00ef3acb633ddf0c420574a2ec6cbf28f840800e355c9fbaac10699686de2724ed22e797a00f3bd93d105a7f23" - } - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d002d503235362d534841323536", - "hash": "SHA256", - "identifier": "P256-SHA256", - "keyInfo": "74657374206b6579", - "mode": 0, - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "159749d750713afe245d2d39ccfaae8381c53ce92d098a9375ee70739c7ac0bf", - "vectors": [ - { - "Batch": 1, - "Blind": "3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "03723a1e5c09b8b9c18d1dcbca29e8007e95f14f4732d9346d490ffc195110368d", - "EvaluationElement": "030de02ffec47a1fd53efcdd1c6faf5bdc270912b8749e783c7ca75bb412958832", - "Input": "00", - "Output": "a0b34de5fa4c5b6da07e72af73cc507cceeb48981b97b7285fc375345fe495dd" - }, - { - "Batch": 1, - "Blind": "3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "03cc1df781f1c2240a64d1c297b3f3d16262ef5d4cf102734882675c26231b0838", - "EvaluationElement": "03a0395fe3828f2476ffcd1f4fe540e5a8489322d398be3c4e5a869db7fcb7c52c", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "c748ca6dd327f0ce85f4ae3a8cd6d4d5390bbb804c9e12dcf94f853fece3dcce" - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d012d503235362d534841323536", - "hash": "SHA256", - "identifier": "P256-SHA256", - "keyInfo": "74657374206b6579", - "mode": 1, - "pkSm": "03e17e70604bcabe198882c0a1f27a92441e774224ed9c702e51dd17038b102462", - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "ca5d94c8807817669a51b196c34c1b7f8442fde4334a7121ae4736364312fca6", - "vectors": [ - { - "Batch": 1, - "Blind": "3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "02dd05901038bb31a6fae01828fd8d0e49e35a486b5c5d4b4994013648c01277da", - "EvaluationElement": "0209f33cab60cf8fe69239b0afbcfcd261af4c1c5632624f2e9ba29b90ae83e4a2", - "Input": "00", - "Output": "0412e8f78b02c415ab3a288e228978376f99927767ff37c5718d420010a645a1", - "Proof": { - "proof": "e7c2b3c5c954c035949f1f74e6bce2ed539a3be267d1481e9ddb178533df4c2664f69d065c604a4fd953e100b856ad83804eb3845189babfa5a702090d6fc5fa", - "r": "f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1" - } - }, - { - "Batch": 1, - "Blind": "3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "03cd0f033e791c4d79dfa9c6ed750f2ac009ec46cd4195ca6fd3800d1e9b887dbd", - "EvaluationElement": "030d2985865c693bf7af47ba4d3a3813176576383d19aff003ef7b0784a0d83cf1", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "771e10dcd6bcd3664e23b8f2a710cfaaa8357747c4a8cbba03133967b5c24f18", - "Proof": { - "proof": "2787d729c57e3d9512d3aa9e8708ad226bc48e0f1750b0767aaff73482c44b8d2873d74ec88aebd3504961acea16790a05c542d9fbff4fe269a77510db00abab", - "r": "f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1" - } - }, - { - "Batch": 2, - "Blind": "3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364,f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1", - "BlindedElement": "02dd05901038bb31a6fae01828fd8d0e49e35a486b5c5d4b4994013648c01277da,03462e9ae64cae5b83ba98a6b360d942266389ac369b923eb3d557213b1922f8ab", - "EvaluationElement": "0209f33cab60cf8fe69239b0afbcfcd261af4c1c5632624f2e9ba29b90ae83e4a2,02bb24f4d838414aef052a8f044a6771230ca69c0a5677540fff738dd31bb69771", - "Input": "00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "0412e8f78b02c415ab3a288e228978376f99927767ff37c5718d420010a645a1,771e10dcd6bcd3664e23b8f2a710cfaaa8357747c4a8cbba03133967b5c24f18", - "Proof": { - "proof": "bdcc351707d02a72ce49511c7db990566d29d6153ad6f8982fad2b435d6ce4d60da1e6b3fa740811bde34dd4fe0aa1b5fe6600d0440c9ddee95ea7fad7a60cf2", - "r": "350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba51943c8026877963" - } - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d022d503235362d534841323536", - "hash": "SHA256", - "identifier": "P256-SHA256", - "keyInfo": "74657374206b6579", - "mode": 2, - "pkSm": "030d7ff077fddeec965db14b794f0cc1ba9019b04a2f4fcc1fa525dedf72e2a3e3", - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "6ad2173efa689ef2c27772566ad7ff6e2d59b3b196f00219451fb2c89ee4dae2", - "vectors": [ - { - "Batch": 1, - "Blind": "3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "031563e127099a8f61ed51eeede05d747a8da2be329b40ba1f0db0b2bd9dd4e2c0", - "EvaluationElement": "02c5e5300c2d9e6ba7f3f4ad60500ad93a0157e6288eb04b67e125db024a2c74d2", - "Info": "7465737420696e666f", - "Input": "00", - "Output": "193a92520bd8fd1f37accb918040a57108daa110dc4f659abe212636d245c592", - "Proof": { - "proof": "f8a33690b87736c854eadfcaab58a59b8d9c03b569110b6f31f8bf7577f3fbb85a8a0c38468ccde1ba942be501654adb106167c8eb178703ccb42bccffb9231a", - "r": "f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1" - } - }, - { - "Batch": 1, - "Blind": "3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "021a440ace8ca667f261c10ac7686adc66a12be31e3520fca317643a1eee9dcd4d", - "EvaluationElement": "0208ca109cbae44f4774fc0bdd2783efdcb868cb4523d52196f700210e777c5de3", - "Info": "7465737420696e666f", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "1e6d164cfd835d88a31401623549bf6b9b306628ef03a7962921d62bc5ffce8c", - "Proof": { - "proof": "043a8fb7fc7fd31e35770cabda4753c5bf0ecc1e88c68d7d35a62bf2631e875af4613641be2d1875c31d1319d191c4bbc0d04875f4fd03c31d3d17dd8e069b69", - "r": "f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1" - } - }, - { - "Batch": 2, - "Blind": "3338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364,f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1", - "BlindedElement": "031563e127099a8f61ed51eeede05d747a8da2be329b40ba1f0db0b2bd9dd4e2c0,03ca4ff41c12fadd7a0bc92cf856732b21df652e01a3abdf0fa8847da053db213c", - "EvaluationElement": "02c5e5300c2d9e6ba7f3f4ad60500ad93a0157e6288eb04b67e125db024a2c74d2,02f0b6bcd467343a8d8555a99dc2eed0215c71898c5edb77a3d97ddd0dbad478e8", - "Info": "7465737420696e666f", - "Input": "00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "193a92520bd8fd1f37accb918040a57108daa110dc4f659abe212636d245c592,1e6d164cfd835d88a31401623549bf6b9b306628ef03a7962921d62bc5ffce8c", - "Proof": { - "proof": "8fbd85a32c13aba79db4b42e762c00687d6dbf9c8cb97b2a225645ccb00d9d7580b383c885cdfd07df448d55e06f50f6173405eee5506c0ed0851ff718d13e68", - "r": "350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba51943c8026877963" - } - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d002d503338342d534841333834", - "hash": "SHA384", - "identifier": "P384-SHA384", - "keyInfo": "74657374206b6579", - "mode": 0, - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "dfe7ddc41a4646901184f2b432616c8ba6d452f9bcd0c4f75a5150ef2b2ed02ef40b8b92f60ae591bcabd72a6518f188", - "vectors": [ - { - "Batch": 1, - "Blind": "504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "02a36bc90e6db34096346eaf8b7bc40ee1113582155ad3797003ce614c835a874343701d3f2debbd80d97cbe45de6e5f1f", - "EvaluationElement": "03af2a4fc94770d7a7bf3187ca9cc4faf3732049eded2442ee50fbddda58b70ae2999366f72498cdbc43e6f2fc184afe30", - "Input": "00", - "Output": "ed84ad3f31a552f0456e58935fcc0a3039db42e7f356dcb32aa6d487b6b815a07d5813641fb1398c03ddab5763874357" - }, - { - "Batch": 1, - "Blind": "504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "02def6f418e3484f67a124a2ce1bfb19de7a4af568ede6a1ebb2733882510ddd43d05f2b1ab5187936a55e50a847a8b900", - "EvaluationElement": "034e9b9a2960b536f2ef47d8608b21597ba400d5abfa1825fd21c36b75f927f396bf3716c96129d1fa4a77fa1d479c8d7b", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "dd4f29da869ab9355d60617b60da0991e22aaab243a3460601e48b075859d1c526d36597326f1b985778f781a1682e75" - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d012d503338342d534841333834", - "hash": "SHA384", - "identifier": "P384-SHA384", - "keyInfo": "74657374206b6579", - "mode": 1, - "pkSm": "031d689686c611991b55f1a1d8f4305ccd6cb719446f660a30db61b7aa87b46acf59b7c0d4a9077b3da21c25dd482229a0", - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "051646b9e6e7a71ae27c1e1d0b87b4381db6d3595eeeb1adb41579adbf992f4278f9016eafc944edaa2b43183581779d", - "vectors": [ - { - "Batch": 1, - "Blind": "504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "02d338c05cbecb82de13d6700f09cb61190543a7b7e2c6cd4fca56887e564ea82653b27fdad383995ea6d02cf26d0e24d9", - "EvaluationElement": "02a7bba589b3e8672aa19e8fd258de2e6aae20101c8d761246de97a6b5ee9cf105febce4327a326255a3c604f63f600ef6", - "Input": "00", - "Output": "3333230886b562ffb8329a8be08fea8025755372817ec969d114d1203d026b4a622beab60220bf19078bca35a529b35c", - "Proof": { - "proof": "bfc6cf3859127f5fe25548859856d6b7fa1c7459f0ba5712a806fc091a3000c42d8ba34ff45f32a52e40533efd2a03bc87f3bf4f9f58028297ccb9ccb18ae7182bcd1ef239df77e3be65ef147f3acf8bc9cbfc5524b702263414f043e3b7ca2e", - "r": "803d955f0e073a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1" - } - }, - { - "Batch": 1, - "Blind": "504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "02f27469e059886f221be5f2cca03d2bdc61e55221721c3b3e56fc012e36d31ae5f8dc058109591556a6dbd3a8c69c433b", - "EvaluationElement": "03f16f903947035400e96b7f531a38d4a07ac89a80f89d86a1bf089c525a92c7f4733729ca30c56ce78b1ab4f7d92db8b4", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "b91c70ea3d4d62ba922eb8a7d03809a441e1c3c7af915cbc2226f485213e895942cd0f8580e6d99f82221e66c40d274f", - "Proof": { - "proof": "d005d6daaad7571414c1e0c75f7e57f2113ca9f4604e84bc90f9be52da896fff3bee496dcde2a578ae9df315032585f801fb21c6080ac05672b291e575a40295b306d967717b28e08fcc8ad1cab47845d16af73b3e643ddcc191208e71c64630", - "r": "803d955f0e073a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1" - } - }, - { - "Batch": 2, - "Blind": "504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364,803d955f0e073a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1", - "BlindedElement": "02d338c05cbecb82de13d6700f09cb61190543a7b7e2c6cd4fca56887e564ea82653b27fdad383995ea6d02cf26d0e24d9,02fa02470d7f151018b41e82223c32fad824de6ad4b5ce9f8e9f98083c9a726de9a1fc39d7a0cb6f4f188dd9cea01474cd", - "EvaluationElement": "02a7bba589b3e8672aa19e8fd258de2e6aae20101c8d761246de97a6b5ee9cf105febce4327a326255a3c604f63f600ef6,028e9e115625ff4c2f07bf87ce3fd73fc77994a7a0c1df03d2a630a3d845930e2e63a165b114d98fe34e61b68d23c0b50a", - "Input": "00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "3333230886b562ffb8329a8be08fea8025755372817ec969d114d1203d026b4a622beab60220bf19078bca35a529b35c,b91c70ea3d4d62ba922eb8a7d03809a441e1c3c7af915cbc2226f485213e895942cd0f8580e6d99f82221e66c40d274f", - "Proof": { - "proof": "6d8dcbd2fc95550a02211fb78afd013933f307d21e7d855b0b1ed0af78076d8137ad8b0a1bfa05676d325249c1dbb9a52bd81b1c2b7b0efc77cf7b278e1c947f6283f1d4c513053fc0ad19e026fb0c30654b53d9cea4b87b037271b5d2e2d0ea", - "r": "a097e722ed2427de86966910acba9f5c350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba51943c8026877963" - } - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d022d503338342d534841333834", - "hash": "SHA384", - "identifier": "P384-SHA384", - "keyInfo": "74657374206b6579", - "mode": 2, - "pkSm": "02f00f0f1de81e5d6cf18140d4926ffdc9b1898c48dc49657ae36eb1e45deb8b951aaf1f10c82d2eaa6d02aafa3f10d2b6", - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "5b2690d6954b8fbb159f19935d64133f12770c00b68422559c65431942d721ff79d47d7a75906c30b7818ec0f38b7fb2", - "vectors": [ - { - "Batch": 1, - "Blind": "504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "03859b36b95e6564faa85cd3801175eda2949707f6aa0640ad093cbf8ad2f58e762f08b56b2a1b42a64953aaf49cbf1ae3", - "EvaluationElement": "0220710e2e00306453f5b4f574cb6a512453f35c45080d09373e190c19ce5b185914fbf36582d7e0754bb7c8b683205b91", - "Info": "7465737420696e666f", - "Input": "00", - "Output": "0188653cfec38119a6c7dd7948b0f0720460b4310e40824e048bf82a16527303ed449a08caf84272c3bbc972ede797df", - "Proof": { - "proof": "82a17ef41c8b57f1e3122311b4d5cd39a63df0f67443ef18d961f9b659c1601ced8d3c64b294f604319ca80230380d437a49c7af0d620e22116669c008ebb767d90283d573b49cdb49e3725889620924c2c4b047a2a6225a3ba27e640ebddd33", - "r": "803d955f0e073a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1" - } - }, - { - "Batch": 1, - "Blind": "504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "03f7efcb4aaf000263369d8a0621cb96b81b3206e99876de2a00699ed4c45acf3969cd6e2319215395955d3f8d8cc1c712", - "EvaluationElement": "034993c818369927e74b77c400376fd1ae29b6ac6c6ddb776cf10e4fbc487826531b3cf0b7c8ca4d92c7af90c9def85ce6", - "Info": "7465737420696e666f", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "ff2a527a21cc43b251a567382677f078c6e356336aec069dea8ba36995343ca3b33bb5d6cf15be4d31a7e6d75b30d3f5", - "Proof": { - "proof": "693471b5dff0cd6a5c00ea34d7bf127b2795164e3bdb5f39a1e5edfbd13e443bc516061cd5b8449a473c2ceeccada9f3e5b57302e3d7bc5e28d38d6e3a3056e1e73b6cc030f5180f8a1ffa45aa923ee66d2ad0a07b500f2acc7fb99b5506465c", - "r": "803d955f0e073a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1" - } - }, - { - "Batch": 2, - "Blind": "504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364,803d955f0e073a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1", - "BlindedElement": "03859b36b95e6564faa85cd3801175eda2949707f6aa0640ad093cbf8ad2f58e762f08b56b2a1b42a64953aaf49cbf1ae3,021a65d618d645f1a20bc33b06deaa7e73d6d634c8a56a3d02b53a732b69a5c53c5a207ea33d5afdcde9a22d59726bce51", - "EvaluationElement": "0220710e2e00306453f5b4f574cb6a512453f35c45080d09373e190c19ce5b185914fbf36582d7e0754bb7c8b683205b91,02017657b315ec65ef861505e596c8645d94685dd7602cdd092a8f1c1c0194a5d0485fe47d071d972ab514370174cc23f5", - "Info": "7465737420696e666f", - "Input": "00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "0188653cfec38119a6c7dd7948b0f0720460b4310e40824e048bf82a16527303ed449a08caf84272c3bbc972ede797df,ff2a527a21cc43b251a567382677f078c6e356336aec069dea8ba36995343ca3b33bb5d6cf15be4d31a7e6d75b30d3f5", - "Proof": { - "proof": "4a0b2fe96d5b2a046a0447fe079b77859ef11a39a3520d6ff7c626aad9b473b724fb0cf188974ec961710a62162a83e97e0baa9eeada73397032d928b3e97b1ea92ad9458208302be3681b8ba78bcc17745bac00f84e0fdc98a6a8cba009c080", - "r": "a097e722ed2427de86966910acba9f5c350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba51943c8026877963" - } - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d002d503532312d534841353132", - "hash": "SHA512", - "identifier": "P521-SHA512", - "keyInfo": "74657374206b6579", - "mode": 0, - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "0153441b8faedb0340439036d6aed06d1217b34c42f17f8db4c5cc610a4a955d698a688831b16d0dc7713a1aa3611ec60703bffc7dc9c84e3ed673b3dbe1d5fccea6", - "vectors": [ - { - "Batch": 1, - "Blind": "00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "0300e78bf846b0e1e1a3c320e353d758583cd876df56100a3a1e62bacba470fa6e0991be1be80b721c50c5fd0c672ba764457acc18c6200704e9294fbf28859d916351", - "EvaluationElement": "030166371cf827cb2fb9b581f97907121a16e2dc5d8b10ce9f0ede7f7d76a0d047657735e8ad07bcda824907b3e5479bd72cdef6b839b967ba5c58b118b84d26f2ba07", - "Input": "00", - "Output": "26232de6fff83f812adadadb6cc05d7bbeee5dca043dbb16b03488abb9981d0a1ef4351fad52dbd7e759649af393348f7b9717566c19a6b8856284d69375c809" - }, - { - "Batch": 1, - "Blind": "00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "0300c28e57e74361d87e0c1874e5f7cc1cc796d61f9cad50427cf54655cdb455613368d42b27f94bf66f59f53c816db3e95e68e1b113443d66a99b3693bab88afb556b", - "EvaluationElement": "0301ad453607e12d0cc11a3359332a40c3a254eaa1afc64296528d55bed07ba322e72e22cf3bcb50570fd913cb54f7f09c17aff8787af75f6a7faf5640cbb2d9620a6e", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "ad1f76ef939042175e007738906ac0336bbd1d51e287ebaa66901abdd324ea3ffa40bfc5a68e7939c2845e0fd37a5a6e76dadb9907c6cc8579629757fd4d04ba" - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d012d503532312d534841353132", - "hash": "SHA512", - "identifier": "P521-SHA512", - "keyInfo": "74657374206b6579", - "mode": 1, - "pkSm": "0301505d646f6e4c9102451eb39730c4ba1c4087618641edbdba4a60896b07fd0c9414ce553cbf25b81dfcca50a8f6724ab7a2bc4d0cf736967a287bb6084cc0678ac0", - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "015c7fc1b4a0b1390925bae915bd9f3d72009d44d9241b962428aad5d13f22803311e7102632a39addc61ea440810222715c9d2f61f03ea424ec9ab1fe5e31cf9238", - "vectors": [ - { - "Batch": 1, - "Blind": "00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "0301d6e4fb545e043ddb6aee5d5ceeee1b44102615ab04430c27dd0f56988dedcb1df32ef384f160e0e76e718605f14f3f582f9357553d153b996795b4b3628a4f6380", - "EvaluationElement": "03013fdeaf887f3d3d283a79e696a54b66ff0edcb559265e204a958acf840e0930cc147e2a6835148d8199eebc26c03e9394c9762a1c991dde40bca0f8ca003eefb045", - "Input": "00", - "Output": "5e003d9b2fb540b3d4bab5fedd154912246da1ee5e557afd8f56415faa1a0fadff6517da802ee254437e4f60907b4cda146e7ba19e249eef7be405549f62954b", - "Proof": { - "proof": "0077fcc8ec6d059d7759b0a61f871e7c1dadc65333502e09a51994328f79e5bda3357b9a4f410a1760a3612c2f8f27cb7cb032951c047cc66da60da583df7b247edd0188e5eb99c71799af1d80d643af16ffa1545acd9e9233fbb370455b10eb257ea12a1667c1b4ee5b0ab7c93d50ae89602006960f083ca9adc4f6276c0ad60440393c", - "r": "015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e073a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1" - } - }, - { - "Batch": 1, - "Blind": "00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "03005b05e656cb609ce5ff5faf063bb746d662d67bbd07c062638396f52f0392180cf2365cabb0ece8e19048961d35eeae5d5fa872328dce98df076ee154dd191c615e", - "EvaluationElement": "0301b19fcf482b1fff04754e282292ed736c5f0aa080d4f42663cd3a416c6596f03129e8e096d8671fe5b0d19838312c511d2ce08d431e43e3ef06199d8cab7426238d", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "fa15eebba81ecf40954f7135cb76f69ef22c6bae394d1a4362f9b03066b54b6604d39f2e53369ca6762a3d9787e230e832aa85955af40ecb8deebb009a8cf474", - "Proof": { - "proof": "01ec9fece444caa6a57032e8963df0e945286f88fbdf233fb5101f0924f7ea89c47023f5f72f240e61991fd33a299b5b38c45a5e2dd1a67b072e59dfe86708a359c701e38d383c60cf6969463bcf13251bedad47b7941f52e409a3591398e27924410b18a301c0e19f527cad504fa08388050ac634e1b05c5216d337742f2754e1fc502f", - "r": "015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e073a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1" - } - }, - { - "Batch": 2, - "Blind": "00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364,015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e073a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1", - "BlindedElement": "0301d6e4fb545e043ddb6aee5d5ceeee1b44102615ab04430c27dd0f56988dedcb1df32ef384f160e0e76e718605f14f3f582f9357553d153b996795b4b3628a4f6380,0301403b597538b939b450c93586ba275f9711ba07e42364bac1d5769c6824a8b55be6f9a536df46d952b11ab2188363b3d6737635d9543d4dba14a6e19421b9245bf5", - "EvaluationElement": "03013fdeaf887f3d3d283a79e696a54b66ff0edcb559265e204a958acf840e0930cc147e2a6835148d8199eebc26c03e9394c9762a1c991dde40bca0f8ca003eefb045,03001f96424497e38c46c904978c2fa1636c5c3dd2e634a85d8a7265977c5dce1f02c7e6c118479f0751767b91a39cce6561998258591b5d7c1bb02445a9e08e4f3e8d", - "Input": "00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "5e003d9b2fb540b3d4bab5fedd154912246da1ee5e557afd8f56415faa1a0fadff6517da802ee254437e4f60907b4cda146e7ba19e249eef7be405549f62954b,fa15eebba81ecf40954f7135cb76f69ef22c6bae394d1a4362f9b03066b54b6604d39f2e53369ca6762a3d9787e230e832aa85955af40ecb8deebb009a8cf474", - "Proof": { - "proof": "00b4d215c8405e57c7a4b53398caf55f1f1623aaeb22408ddb9ea29130909b3f95dbb1ff366e81e86e918f9f2fd8b80dbb344cd498c9499d112905e585417e0068c600fe5dea18b389ef6c4cc062935607b8ccbbb9a84fba3143868a3e8a58efa0bf6ca642804d09dc06e980f64837811227c4267b217f1099a4e28b0854f4e5ee659796", - "r": "01ec21c7bb69b0734cb48dfd68433dd93b0fa097e722ed2427de86966910acba9f5c350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba51943c8026877963" - } - } - ] - }, - { - "groupDST": "48617368546f47726f75702d4f50524656312d022d503532312d534841353132", - "hash": "SHA512", - "identifier": "P521-SHA512", - "keyInfo": "74657374206b6579", - "mode": 2, - "pkSm": "0301de8ceb9ffe9237b1bba87c320ea0bebcfc3447fe6f278065c6c69886d692d1126b79b6844f829940ace9b52a5e26882cf7cbc9e57503d4cca3cd834584729f812a", - "seed": "a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3", - "skSm": "014893130030ce69cf714f536498a02ff6b396888f9bb507985c32928c4427d6d39de10ef509aca4240e8569e3a88debc0d392e3361bcd934cb9bdd59e339dff7b27", - "vectors": [ - { - "Batch": 1, - "Blind": "00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "020095cff9d7ecf65bdfee4ea92d6e748d60b02de34ad98094f82e25d33a8bf50138ccc2cc633556f1a97d7ea9438cbb394df612f041c485a515849d5ebb2238f2f0e2", - "EvaluationElement": "0301408e9c5be3ffcc1c16e5ae8f8aa68446223b0804b11962e856af5a6d1c65ebbb5db7278c21db4e8cc06d89a35b6804fb1738a295b691638af77aa1327253f26d01", - "Info": "7465737420696e666f", - "Input": "00", - "Output": "808ae5b87662eaaf0b39151dd85991b94c96ef214cb14a68bf5c143954882d330da8953a80eea20788e552bc8bbbfff3100e89f9d6e341197b122c46a208733b", - "Proof": { - "proof": "0106a89a61eee9dd2417d2849a8e2167bc5f56e3aed5a3ff23e22511fa1b37a29ed44d1bbfd6907d99cfbc558a56aec709282415a864a281e49dc53792a4a638a0660034306d64be12a94dcea5a6d664cf76681911c8b9a84d49bf12d4893307ec14436bd05f791f82446c0de4be6c582d373627b51886f76c4788256e3da7ec8fa18a86", - "r": "015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e073a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1" - } - }, - { - "Batch": 1, - "Blind": "00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364", - "BlindedElement": "030112ea89cf9cf589496189eafc5f9eb13c9f9e170d6ecde7c5b940541cb1a9c5cfeec908b67efe16b81ca00d0ce216e34b3d5f46a658d3fd8573d671bdb6515ed508", - "EvaluationElement": "0200ebc49df1e6fa61f412e6c391e6f074400ecdd2f56c4a8c03fe0f91d9b551f40d4b5258fd891952e8c9b28003bcfa365122e54a5714c8949d5d202767b31b4bf1f6", - "Info": "7465737420696e666f", - "Input": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "27032e24b1a52a82ab7f4646f3c5df0f070f499db98b9c5df33972bd5af5762c3638afae7912a6c1acdb1ae2ab2fa670bd5486c645a0e55412e08d33a4a0d6e3", - "Proof": { - "proof": "0082162c71a7765005cae202d4bd14b84dae63c29067e886b82506992bd994a1c3aac0c1c5309222fe1af8287b6443ed6df5c2e0b0991faddd3564c73c7597aecd9a003b1f1e3c65f28e58ab4e767cfb4adbcaf512441645f4c2aed8bf67d132d966006d35fa71a34145414bf3572c1de1a46c266a344dd9e22e7fb1e90ffba1caf556d9", - "r": "015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e073a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1" - } - }, - { - "Batch": 2, - "Blind": "00d1dccf7a51bafaf75d4a866d53d8cafe4d504650f53df8f16f6861633388936ea23338fa65ec36e0290022b48eb562889d89dbfa691d1cde91517fa222ed7ad364,015e80ae32363b32cb76ad4b95a5a34e46bb803d955f0e073a04aa5d92b3fb739f56f9db001266677f62c095021db018cd8cbb55941d4073698ce45c405d1348b7b1", - "BlindedElement": "020095cff9d7ecf65bdfee4ea92d6e748d60b02de34ad98094f82e25d33a8bf50138ccc2cc633556f1a97d7ea9438cbb394df612f041c485a515849d5ebb2238f2f0e2,0201a328cf9f3fdeb86b6db242dd4cbb436b3a488b70b72d2fbbd1e5f50d7b0878b157d6f278c6a95c488f3ad52d6898a421658a82fe7ceb000b01aedea7967522d525", - "EvaluationElement": "0301408e9c5be3ffcc1c16e5ae8f8aa68446223b0804b11962e856af5a6d1c65ebbb5db7278c21db4e8cc06d89a35b6804fb1738a295b691638af77aa1327253f26d01,020062ab51ac3aa829e0f5b7ae50688bcf5f63a18a83a6e0da538666b8d50c7ea2b4ef31f4ac669302318dbebe46660acdda695da30c22cee7ca21f6984a720504502e", - "Info": "7465737420696e666f", - "Input": "00,5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", - "Output": "808ae5b87662eaaf0b39151dd85991b94c96ef214cb14a68bf5c143954882d330da8953a80eea20788e552bc8bbbfff3100e89f9d6e341197b122c46a208733b,27032e24b1a52a82ab7f4646f3c5df0f070f499db98b9c5df33972bd5af5762c3638afae7912a6c1acdb1ae2ab2fa670bd5486c645a0e55412e08d33a4a0d6e3", - "Proof": { - "proof": "00731738844f739bca0cca9d1c8bea204bed4fd00285785738b985763741de5cdfa275152d52b6a2fdf7792ef3779f39ba34581e56d62f78ecad5b7f8083f384961501cd4b43713253c022692669cf076b1d382ecd8293c1de69ea569737f37a24772ab73517983c1e3db5818754ba1f008076267b8058b6481949ae346cdc17a8455fe2", - "r": "01ec21c7bb69b0734cb48dfd68433dd93b0fa097e722ed2427de86966910acba9f5c350e8040f828bf6ceca27405420cdf3d63cb3aef005f40ba51943c8026877963" - } - } - ] - } -] diff --git a/oprf/vectors_test.go b/oprf/vectors_test.go deleted file mode 100644 index 2b3c7758..00000000 --- a/oprf/vectors_test.go +++ /dev/null @@ -1,253 +0,0 @@ -package oprf - -import ( - "bytes" - "encoding" - "encoding/binary" - "encoding/hex" - "encoding/json" - "fmt" - "io" - "os" - "strings" - "testing" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/zk/dleq" -) - -type vector struct { - Identifier string `json:"identifier"` - Mode Mode `json:"mode"` - Hash string `json:"hash"` - PkSm string `json:"pkSm"` - SkSm string `json:"skSm"` - Seed string `json:"seed"` - KeyInfo string `json:"keyInfo"` - GroupDST string `json:"groupDST"` - Vectors []struct { - Batch int `json:"Batch"` - Blind string `json:"Blind"` - Info string `json:"Info"` - BlindedElement string `json:"BlindedElement"` - EvaluationElement string `json:"EvaluationElement"` - Proof struct { - Proof string `json:"proof"` - R string `json:"r"` - } `json:"Proof"` - Input string `json:"Input"` - Output string `json:"Output"` - } `json:"vectors"` -} - -func toBytes(t *testing.T, s, errMsg string) []byte { - t.Helper() - bytes, err := hex.DecodeString(s) - test.CheckNoErr(t, err, "decoding "+errMsg) - - return bytes -} - -func toListBytes(t *testing.T, s, errMsg string) [][]byte { - t.Helper() - strs := strings.Split(s, ",") - out := make([][]byte, len(strs)) - for i := range strs { - out[i] = toBytes(t, strs[i], errMsg) - } - - return out -} - -func flattenList(t *testing.T, s, errMsg string) []byte { - t.Helper() - strs := strings.Split(s, ",") - out := []byte{0, 0} - binary.BigEndian.PutUint16(out, uint16(len(strs))) - for i := range strs { - out = append(out, toBytes(t, strs[i], errMsg)...) - } - - return out -} - -func toScalar(t *testing.T, g group.Group, s, errMsg string) group.Scalar { - t.Helper() - r := g.NewScalar() - rBytes := toBytes(t, s, errMsg) - err := r.UnmarshalBinary(rBytes) - test.CheckNoErr(t, err, errMsg) - - return r -} - -func readFile(t *testing.T, fileName string) []vector { - t.Helper() - jsonFile, err := os.Open(fileName) - if err != nil { - t.Fatalf("File %v can not be opened. Error: %v", fileName, err) - } - defer jsonFile.Close() - input, err := io.ReadAll(jsonFile) - if err != nil { - t.Fatalf("File %v can not be read. Error: %v", fileName, err) - } - - var v []vector - err = json.Unmarshal(input, &v) - if err != nil { - t.Fatalf("File %v can not be loaded. Error: %v", fileName, err) - } - - return v -} - -func (v *vector) SetUpParties(t *testing.T) (id params, s commonServer, c commonClient) { - suite, err := GetSuite(v.Identifier) - test.CheckNoErr(t, err, "suite id") - seed := toBytes(t, v.Seed, "seed for key derivation") - test.CheckOk(len(seed) == 32, ErrInvalidSeed.Error(), t) - keyInfo := toBytes(t, v.KeyInfo, "info for key derivation") - privateKey, err := DeriveKey(suite, v.Mode, seed, keyInfo) - test.CheckNoErr(t, err, "deriving key") - - got, err := privateKey.MarshalBinary() - test.CheckNoErr(t, err, "serializing private key") - want := toBytes(t, v.SkSm, "private key") - v.compareBytes(t, got, want) - - switch v.Mode { - case BaseMode: - s = NewServer(suite, privateKey) - c = NewClient(suite) - case VerifiableMode: - s = NewVerifiableServer(suite, privateKey) - c = NewVerifiableClient(suite, s.PublicKey()) - case PartialObliviousMode: - var info []byte - s = &s1{NewPartialObliviousServer(suite, privateKey), info} - c = &c1{NewPartialObliviousClient(suite, s.PublicKey()), info} - } - - return suite.(params), s, c -} - -func (v *vector) compareLists(t *testing.T, got, want [][]byte) { - t.Helper() - for i := range got { - if !bytes.Equal(got[i], want[i]) { - test.ReportError(t, got[i], want[i], v.Identifier, v.Mode, i) - } - } -} - -func (v *vector) compareBytes(t *testing.T, got, want []byte) { - t.Helper() - if !bytes.Equal(got, want) { - test.ReportError(t, got, want, v.Identifier, v.Mode) - } -} - -func (v *vector) test(t *testing.T) { - params, server, client := v.SetUpParties(t) - - for i, vi := range v.Vectors { - if v.Mode == PartialObliviousMode { - info := toBytes(t, vi.Info, "info") - ss := server.(*s1) - cc := client.(*c1) - ss.info = info - cc.info = info - } - - inputs := toListBytes(t, vi.Input, "input") - blindsBytes := toListBytes(t, vi.Blind, "blind") - - blinds := make([]Blind, len(blindsBytes)) - for j := range blindsBytes { - blinds[j] = params.group.NewScalar() - err := blinds[j].UnmarshalBinary(blindsBytes[j]) - test.CheckNoErr(t, err, "invalid blind") - } - - finData, evalReq, err := client.blind(inputs, blinds) - test.CheckNoErr(t, err, "invalid client request") - evalReqBytes, err := elementsMarshalBinary(params.group, evalReq.Elements) - test.CheckNoErr(t, err, "bad serialization") - v.compareBytes(t, evalReqBytes, flattenList(t, vi.BlindedElement, "blindedElement")) - - eval, err := server.Evaluate(evalReq) - test.CheckNoErr(t, err, "invalid evaluation") - elemBytes, err := elementsMarshalBinary(params.group, eval.Elements) - test.CheckNoErr(t, err, "invalid evaluations marshaling") - v.compareBytes(t, elemBytes, flattenList(t, vi.EvaluationElement, "evaluation")) - - if v.Mode == VerifiableMode || v.Mode == PartialObliviousMode { - randomness := toScalar(t, params.group, vi.Proof.R, "invalid proof random scalar") - var proof encoding.BinaryMarshaler - switch v.Mode { - case VerifiableMode: - ss := server.(VerifiableServer) - prover := dleq.Prover{Params: ss.getDLEQParams()} - proof, err = prover.ProveBatchWithRandomness( - ss.privateKey.k, - ss.params.group.Generator(), - server.PublicKey().e, - evalReq.Elements, - eval.Elements, - randomness) - case PartialObliviousMode: - ss := server.(*s1) - keyProof, _, _ := ss.secretFromInfo(ss.info) - prover := dleq.Prover{Params: ss.getDLEQParams()} - proof, err = prover.ProveBatchWithRandomness( - keyProof, - ss.params.group.Generator(), - ss.params.group.NewElement().MulGen(keyProof), - eval.Elements, - evalReq.Elements, - randomness) - } - test.CheckNoErr(t, err, "failed proof generation") - proofBytes, errr := proof.MarshalBinary() - test.CheckNoErr(t, errr, "failed proof marshaling") - v.compareBytes(t, proofBytes, toBytes(t, vi.Proof.Proof, "proof")) - } - - outputs, err := client.Finalize(finData, eval) - test.CheckNoErr(t, err, "invalid finalize") - expectedOutputs := toListBytes(t, vi.Output, "output") - v.compareLists(t, - outputs, - expectedOutputs, - ) - - for j := range inputs { - output, err := server.FullEvaluate(inputs[j]) - test.CheckNoErr(t, err, "invalid full evaluate") - got := output - want := expectedOutputs[j] - if !bytes.Equal(got, want) { - test.ReportError(t, got, want, v.Identifier, v.Mode, i, j) - } - - test.CheckOk(server.VerifyFinalize(inputs[j], output), "verify finalize", t) - } - } -} - -func TestVectors(t *testing.T) { - // RFC-9497 published at https://www.rfc-editor.org/info/rfc9497 - // Test vectors at https://github.com/cfrg/draft-irtf-cfrg-voprf - v := readFile(t, "testdata/rfc9497.json") - - for i := range v { - suite, err := GetSuite(v[i].Identifier) - if err != nil { - t.Log(v[i].Identifier + " not supported yet") - continue - } - t.Run(fmt.Sprintf("%v/Mode%v", suite, v[i].Mode), v[i].test) - } -} diff --git a/ot/doc.go b/ot/doc.go deleted file mode 100644 index 6e1da00c..00000000 --- a/ot/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package ot provides oblivious-transfer protocols. -package ot diff --git a/ot/simot/simot_test.go b/ot/simot/simot_test.go deleted file mode 100644 index f2968df5..00000000 --- a/ot/simot/simot_test.go +++ /dev/null @@ -1,231 +0,0 @@ -// Reference: https://eprint.iacr.org/2015/267.pdf (1 out of 2 OT case) -// Sender has 2 messages m0, m1 -// Receiver receives mc based on the choice bit c - -package simot - -import ( - "bytes" - "crypto/rand" - "testing" - - "github.com/quantumcoinproject/circl/group" -) - -const testSimOTCount = 100 - -func simOT(myGroup group.Group, sender *Sender, receiver *Receiver, m0, m1 []byte, choice, index int) error { - // Initialization - A := sender.InitSender(myGroup, m0, m1, index) - - // Round 1 - // Sender sends A to receiver - B := receiver.Round1Receiver(myGroup, choice, index, A) - - // Round 2 - // Receiver sends B to sender - e0, e1 := sender.Round2Sender(B) - - // Round 3 - // Sender sends e0 e1 to receiver - errDec := receiver.Round3Receiver(e0, e1, receiver.c) - if errDec != nil { - return errDec - } - - return nil -} - -func testNegativeSimOT(t *testing.T, myGroup group.Group, choice int) { - var sender Sender - var receiver Receiver - m0 := make([]byte, myGroup.Params().ScalarLength) - m1 := make([]byte, myGroup.Params().ScalarLength) - _, errRand := rand.Read(m0) - if errRand != nil { - panic(errRand) - } - _, errRand = rand.Read(m1) - if errRand != nil { - panic(errRand) - } - - // Initialization - A := sender.InitSender(myGroup, m0, m1, 0) - - // Round 1 - B := receiver.Round1Receiver(myGroup, choice, 0, A) - - // Round 2 - e0, e1 := sender.Round2Sender(B) - // Round 3 - - // Here we pass in the flipped choice bit, to prove the decryption will fail - // The receiver will not learn anything about m_{1-c} - errDec := receiver.Round3Receiver(e0, e1, 1-choice) - if errDec == nil { - t.Error("SimOT decryption failed", errDec) - } - - if choice == 0 { - equal0 := bytes.Compare(sender.m0, receiver.mc) - if equal0 == 0 { - t.Error("Receiver decryption should fail") - } - equal1 := bytes.Compare(sender.m1, receiver.mc) - if equal1 == 0 { - t.Error("Receiver decryption should fail") - } - } else { - equal0 := bytes.Compare(sender.m0, receiver.mc) - if equal0 == 0 { - t.Error("Receiver decryption should fail") - } - equal1 := bytes.Compare(sender.m1, receiver.mc) - if equal1 == 0 { - t.Error("Receiver decryption should fail") - } - } -} - -// Input: myGroup, the group we operate in -func testSimOT(t *testing.T, myGroup group.Group, choice int) { - var sender Sender - var receiver Receiver - - m0 := make([]byte, myGroup.Params().ScalarLength) - m1 := make([]byte, myGroup.Params().ScalarLength) - _, errRand := rand.Read(m0) - if errRand != nil { - panic(errRand) - } - _, errRand = rand.Read(m1) - if errRand != nil { - panic(errRand) - } - - errDec := simOT(myGroup, &sender, &receiver, m0, m1, choice, 0) - if errDec != nil { - t.Error("AES GCM Decryption failed") - } - - if choice == 0 { - equal0 := bytes.Compare(sender.m0, receiver.mc) - if equal0 != 0 { - t.Error("Receiver decryption failed") - } - } else { - equal1 := bytes.Compare(sender.m1, receiver.mc) - if equal1 != 0 { - t.Error("Receiver decryption failed") - } - } -} - -func benchmarSimOT(b *testing.B, myGroup group.Group) { - var sender Sender - var receiver Receiver - m0 := make([]byte, myGroup.Params().ScalarLength) - m1 := make([]byte, myGroup.Params().ScalarLength) - _, errRand := rand.Read(m0) - if errRand != nil { - panic(errRand) - } - _, errRand = rand.Read(m1) - if errRand != nil { - panic(errRand) - } - - for iter := 0; iter < b.N; iter++ { - errDec := simOT(myGroup, &sender, &receiver, m0, m1, iter%2, 0) - if errDec != nil { - b.Error("AES GCM Decryption failed") - } - } -} - -func benchmarkSimOTRound(b *testing.B, myGroup group.Group) { - var sender Sender - var receiver Receiver - m0 := make([]byte, myGroup.Params().ScalarLength) - m1 := make([]byte, myGroup.Params().ScalarLength) - _, errRand := rand.Read(m0) - if errRand != nil { - panic(errRand) - } - _, errRand = rand.Read(m1) - if errRand != nil { - panic(errRand) - } - - b.Run("Sender-Initialization", func(b *testing.B) { - for i := 0; i < b.N; i++ { - sender.InitSender(myGroup, m0, m1, 0) - } - }) - - A := sender.InitSender(myGroup, m0, m1, 0) - - b.Run("Receiver-Round1", func(b *testing.B) { - for i := 0; i < b.N; i++ { - receiver.Round1Receiver(myGroup, 0, 0, A) - } - }) - - B := receiver.Round1Receiver(myGroup, 0, 0, A) - - b.Run("Sender-Round2", func(b *testing.B) { - for i := 0; i < b.N; i++ { - sender.Round2Sender(B) - } - }) - - e0, e1 := sender.Round2Sender(B) - - b.Run("Receiver-Round3", func(b *testing.B) { - for i := 0; i < b.N; i++ { - errDec := receiver.Round3Receiver(e0, e1, receiver.c) - if errDec != nil { - b.Error("Receiver-Round3 decryption failed") - } - } - }) - - errDec := receiver.Round3Receiver(e0, e1, receiver.c) - if errDec != nil { - b.Error("Receiver-Round3 decryption failed") - } - - // Confirm - equal0 := bytes.Compare(sender.m0, receiver.mc) - if equal0 != 0 { - b.Error("Receiver decryption failed") - } -} - -func TestSimOT(t *testing.T) { - t.Run("SimOT", func(t *testing.T) { - for i := 0; i < testSimOTCount; i++ { - currGroup := group.P256 - choice := i % 2 - testSimOT(t, currGroup, choice) - } - }) - t.Run("SimOTNegative", func(t *testing.T) { - for i := 0; i < testSimOTCount; i++ { - currGroup := group.P256 - choice := i % 2 - testNegativeSimOT(t, currGroup, choice) - } - }) -} - -func BenchmarkSimOT(b *testing.B) { - currGroup := group.P256 - benchmarSimOT(b, currGroup) -} - -func BenchmarkSimOTRound(b *testing.B) { - currGroup := group.P256 - benchmarkSimOTRound(b, currGroup) -} diff --git a/ot/simot/simotlocal.go b/ot/simot/simotlocal.go deleted file mode 100644 index b85b01af..00000000 --- a/ot/simot/simotlocal.go +++ /dev/null @@ -1,238 +0,0 @@ -package simot - -import ( - "crypto/aes" - "crypto/cipher" - "crypto/rand" - "crypto/subtle" - "errors" - "io" - - "github.com/quantumcoinproject/circl/group" - "golang.org/x/crypto/sha3" -) - -const keyLength = 16 - -// AES GCM encryption, we don't need to pad because our input is fixed length -// Need to use authenticated encryption to defend against tampering on ciphertext -// Input: key, plaintext message -// Output: ciphertext -func aesEncGCM(key, plaintext []byte) []byte { - block, err := aes.NewCipher(key) - if err != nil { - panic(err) - } - - aesgcm, err := cipher.NewGCM(block) - if err != nil { - panic(err.Error()) - } - - nonce := make([]byte, aesgcm.NonceSize()) - if _, err := io.ReadFull(rand.Reader, nonce); err != nil { - panic(err) - } - - ciphertext := aesgcm.Seal(nonce, nonce, plaintext, nil) - return ciphertext -} - -// AES GCM decryption -// Input: key, ciphertext message -// Output: plaintext -func aesDecGCM(key, ciphertext []byte) ([]byte, error) { - block, err := aes.NewCipher(key) - if err != nil { - panic(err) - } - aesgcm, err := cipher.NewGCM(block) - if err != nil { - panic(err.Error()) - } - nonceSize := aesgcm.NonceSize() - if len(ciphertext) < nonceSize { - return nil, errors.New("ciphertext too short") - } - - nonce, encryptedMessage := ciphertext[:nonceSize], ciphertext[nonceSize:] - - plaintext, err := aesgcm.Open(nil, nonce, encryptedMessage, nil) - - return plaintext, err -} - -// Initialization - -// Input: myGroup, the group we operate in -// Input: m0, m1 the 2 message of the sender -// Input: index, the index of this SimOT -// Output: A = [a]G, a the sender randomness -func (sender *Sender) InitSender(myGroup group.Group, m0, m1 []byte, index int) group.Element { - sender.a = myGroup.RandomNonZeroScalar(rand.Reader) - sender.k0 = make([]byte, keyLength) - sender.k1 = make([]byte, keyLength) - sender.m0 = m0 - sender.m1 = m1 - sender.index = index - sender.A = myGroup.NewElement() - sender.A.MulGen(sender.a) - sender.myGroup = myGroup - return sender.A.Copy() -} - -// Round 1 - -// ---- sender should send A to receiver ---- - -// Input: myGroup, the group we operate in -// Input: choice, the receiver choice bit -// Input: index, the index of this SimOT -// Input: A, from sender -// Output: B = [b]G if c == 0, B = A+[b]G if c == 1 (Implementation in constant time). b, the receiver randomness -func (receiver *Receiver) Round1Receiver(myGroup group.Group, choice int, index int, A group.Element) group.Element { - receiver.b = myGroup.RandomNonZeroScalar(rand.Reader) - receiver.c = choice - receiver.kR = make([]byte, keyLength) - receiver.index = index - receiver.A = A - receiver.myGroup = myGroup - - bG := myGroup.NewElement() - bG.MulGen(receiver.b) - AorI := myGroup.NewElement() - AorI.CMov(choice, A) - receiver.B = myGroup.NewElement() - receiver.B.Add(bG, AorI) - - return receiver.B.Copy() -} - -// Round 2 - -// ---- receiver should send B to sender ---- - -// Input: B from the receiver -// Output: e0, e1, encryption of m0 and m1 under key k0, k1 -func (sender *Sender) Round2Sender(B group.Element) ([]byte, []byte) { - sender.B = B - - aB := sender.myGroup.NewElement() - aB.Mul(sender.B, sender.a) - maA := sender.myGroup.NewElement() - maA.Mul(sender.A, sender.a) - maA.Neg(maA) - aBaA := sender.myGroup.NewElement() - aBaA.Add(aB, maA) - - // Hash the whole transcript A|B|... - AByte, errByte := sender.A.MarshalBinary() - if errByte != nil { - panic(errByte) - } - BByte, errByte := sender.B.MarshalBinary() - if errByte != nil { - panic(errByte) - } - aBByte, errByte := aB.MarshalBinary() - if errByte != nil { - panic(errByte) - } - hashByte0 := append(AByte, BByte...) - hashByte0 = append(hashByte0, aBByte...) - - s := sha3.NewShake128() - _, errWrite := s.Write(hashByte0) - if errWrite != nil { - panic(errWrite) - } - _, errRead := s.Read(sender.k0) - if errRead != nil { - panic(errRead) - } - - aBaAByte, errByte := aBaA.MarshalBinary() - if errByte != nil { - panic(errByte) - } - hashByte1 := append(AByte, BByte...) - hashByte1 = append(hashByte1, aBaAByte...) - s = sha3.NewShake128() - _, errWrite = s.Write(hashByte1) - if errWrite != nil { - panic(errWrite) - } - _, errRead = s.Read(sender.k1) - if errRead != nil { - panic(errRead) - } - - e0 := aesEncGCM(sender.k0, sender.m0) - sender.e0 = e0 - - e1 := aesEncGCM(sender.k1, sender.m1) - sender.e1 = e1 - - return sender.e0, sender.e1 -} - -// Round 3 - -// ---- sender should send e0, e1 to receiver ---- - -// Input: e0, e1: encryption of m0 and m1 from the sender -// Input: choice, choice bit of receiver -// Choose e0 or e1 based on choice bit in constant time -func (receiver *Receiver) Round3Receiver(e0, e1 []byte, choice int) error { - receiver.ec = make([]byte, len(e1)) - // If c == 1, copy e1 - subtle.ConstantTimeCopy(choice, receiver.ec, e1) - // If c == 0, copy e0 - subtle.ConstantTimeCopy(1-choice, receiver.ec, e0) - - AByte, errByte := receiver.A.MarshalBinary() - if errByte != nil { - panic(errByte) - } - BByte, errByte := receiver.B.MarshalBinary() - if errByte != nil { - panic(errByte) - } - bA := receiver.myGroup.NewElement() - bA.Mul(receiver.A, receiver.b) - bAByte, errByte := bA.MarshalBinary() - if errByte != nil { - panic(errByte) - } - // Hash the whole transcript so far - hashByte := append(AByte, BByte...) - hashByte = append(hashByte, bAByte...) - - s := sha3.NewShake128() - _, errWrite := s.Write(hashByte) - if errWrite != nil { - panic(errWrite) - } - _, errRead := s.Read(receiver.kR) // kR, decryption key of mc - if errRead != nil { - panic(errRead) - } - mc, errDec := aesDecGCM(receiver.kR, receiver.ec) - if errDec != nil { - return errDec - } - receiver.mc = mc - return nil -} - -func (receiver *Receiver) Returnmc() []byte { - return receiver.mc -} - -func (sender *Sender) Returne0e1() ([]byte, []byte) { - return sender.e0, sender.e1 -} - -func (sender *Sender) Returnm0m1() ([]byte, []byte) { - return sender.m0, sender.m1 -} diff --git a/ot/simot/simotparty.go b/ot/simot/simotparty.go deleted file mode 100644 index 51b279a3..00000000 --- a/ot/simot/simotparty.go +++ /dev/null @@ -1,29 +0,0 @@ -package simot - -import "github.com/quantumcoinproject/circl/group" - -type Sender struct { - index int // Indicate which OT - m0 []byte // The M0 message from sender - m1 []byte // The M1 message from sender - a group.Scalar // The randomness of the sender - A group.Element // [a]G - B group.Element // The random group element from the receiver - k0 []byte // The encryption key of M0 - k1 []byte // The encryption key of M1 - e0 []byte // The encryption of M0 under k0 - e1 []byte // The encryption of M1 under k1 - myGroup group.Group // The elliptic curve we operate in -} - -type Receiver struct { - index int // Indicate which OT - c int // The choice bit of the receiver - A group.Element // The random group element from the sender - b group.Scalar // The randomness of the receiver - B group.Element // B = [b]G if c == 0, B = A+[b]G if c == 1 - kR []byte // The decryption key of receiver - ec []byte // The encryption of mc - mc []byte // The decrypted message from sender - myGroup group.Group // The elliptic curve we operate in -} diff --git a/pki/pki.go b/pki/pki.go deleted file mode 100644 index f8d77b0b..00000000 --- a/pki/pki.go +++ /dev/null @@ -1,182 +0,0 @@ -package pki - -import ( - "crypto/x509/pkix" - "encoding/asn1" - "encoding/pem" - "errors" - "strings" - - "github.com/quantumcoinproject/circl/sign" - "github.com/quantumcoinproject/circl/sign/schemes" -) - -var ( - allSchemesByOID map[string]sign.Scheme - allSchemesByTLS map[uint]sign.Scheme -) - -type pkixPrivKey struct { - Version int - Algorithm pkix.AlgorithmIdentifier - PrivateKey []byte -} - -func init() { - allSchemesByOID = make(map[string]sign.Scheme) - allSchemesByTLS = make(map[uint]sign.Scheme) - for _, scheme := range schemes.All() { - if cert, ok := scheme.(CertificateScheme); ok { - allSchemesByOID[cert.Oid().String()] = scheme - } - if tlsScheme, ok := scheme.(TLSScheme); ok { - allSchemesByTLS[tlsScheme.TLSIdentifier()] = scheme - } - } -} - -func SchemeByOid(oid asn1.ObjectIdentifier) sign.Scheme { return allSchemesByOID[oid.String()] } - -func SchemeByTLSID(id uint) sign.Scheme { return allSchemesByTLS[id] } - -// Additional methods when the signature scheme is supported in X509. -type CertificateScheme interface { - // Return the appropriate OIDs for this instance. It is implicitly - // assumed that the encoding is simple: e.g. uses the same OID for - // signature and public key like Ed25519. - Oid() asn1.ObjectIdentifier -} - -// Additional methods when the signature scheme is supported in TLS. -type TLSScheme interface { - TLSIdentifier() uint -} - -func UnmarshalPEMPublicKey(data []byte) (sign.PublicKey, error) { - block, rest := pem.Decode(data) - if len(rest) != 0 { - return nil, errors.New("trailing data") - } - if !strings.HasSuffix(block.Type, "PUBLIC KEY") { - return nil, errors.New("pem block type is not public key") - } - - return UnmarshalPKIXPublicKey(block.Bytes) -} - -func UnmarshalPKIXPublicKey(data []byte) (sign.PublicKey, error) { - var pkix struct { - Raw asn1.RawContent - Algorithm pkix.AlgorithmIdentifier - PublicKey asn1.BitString - } - if rest, err := asn1.Unmarshal(data, &pkix); err != nil { - return nil, err - } else if len(rest) != 0 { - return nil, errors.New("trailing data") - } - scheme := SchemeByOid(pkix.Algorithm.Algorithm) - if scheme == nil { - return nil, errors.New("unsupported public key algorithm") - } - return scheme.UnmarshalBinaryPublicKey(pkix.PublicKey.RightAlign()) -} - -func UnmarshalPEMPrivateKey(data []byte) (sign.PrivateKey, error) { - block, rest := pem.Decode(data) - if len(rest) != 0 { - return nil, errors.New("trailing") - } - if !strings.HasSuffix(block.Type, "PRIVATE KEY") { - return nil, errors.New("pem block type is not private key") - } - - return UnmarshalPKIXPrivateKey(block.Bytes) -} - -func UnmarshalPKIXPrivateKey(data []byte) (sign.PrivateKey, error) { - var pkix pkixPrivKey - if rest, err := asn1.Unmarshal(data, &pkix); err != nil { - return nil, err - } else if len(rest) != 0 { - return nil, errors.New("trailing data") - } - scheme := SchemeByOid(pkix.Algorithm.Algorithm) - if scheme == nil { - return nil, errors.New("unsupported public key algorithm") - } - var sk []byte - if rest, err := asn1.Unmarshal(pkix.PrivateKey, &sk); err != nil { - return nil, err - } else if len(rest) > 0 { - return nil, errors.New("trailing data") - } - return scheme.UnmarshalBinaryPrivateKey(sk) -} - -func MarshalPEMPublicKey(pk sign.PublicKey) ([]byte, error) { - data, err := MarshalPKIXPublicKey(pk) - if err != nil { - return nil, err - } - str := pem.EncodeToMemory(&pem.Block{ - Type: "PUBLIC KEY", - Bytes: data, - }) - return str, nil -} - -func MarshalPKIXPublicKey(pk sign.PublicKey) ([]byte, error) { - data, err := pk.MarshalBinary() - if err != nil { - return nil, err - } - - scheme := pk.Scheme() - return asn1.Marshal(struct { - pkix.AlgorithmIdentifier - asn1.BitString - }{ - pkix.AlgorithmIdentifier{ - Algorithm: scheme.(CertificateScheme).Oid(), - }, - asn1.BitString{ - Bytes: data, - BitLength: len(data) * 8, - }, - }) -} - -func MarshalPEMPrivateKey(sk sign.PrivateKey) ([]byte, error) { - data, err := MarshalPKIXPrivateKey(sk) - if err != nil { - return nil, err - } - str := pem.EncodeToMemory(&pem.Block{ - Type: sk.Scheme().Name() + " PRIVATE KEY", - Bytes: data, - }, - ) - return str, nil -} - -func MarshalPKIXPrivateKey(sk sign.PrivateKey) ([]byte, error) { - data, err := sk.MarshalBinary() - if err != nil { - return nil, err - } - - data, err = asn1.Marshal(data) - if err != nil { - return nil, err - } - - scheme := sk.Scheme() - return asn1.Marshal(pkixPrivKey{ - 0, - pkix.AlgorithmIdentifier{ - Algorithm: scheme.(CertificateScheme).Oid(), - }, - data, - }) -} diff --git a/pki/pki_test.go b/pki/pki_test.go deleted file mode 100644 index 8fd710ff..00000000 --- a/pki/pki_test.go +++ /dev/null @@ -1,55 +0,0 @@ -package pki_test - -import ( - "testing" - - "github.com/quantumcoinproject/circl/pki" - "github.com/quantumcoinproject/circl/sign/schemes" -) - -func TestPEM(t *testing.T) { - for _, scheme := range schemes.All() { - t.Run(scheme.Name(), func(t *testing.T) { - if scheme == nil { - t.Fatal() - } - - _, ok := scheme.(pki.CertificateScheme) - if !ok { - return - } - - pk, sk, err := scheme.GenerateKey() - if err != nil { - t.Fatal(err) - } - - packedPk, err := pki.MarshalPEMPublicKey(pk) - if err != nil { - t.Fatal(err) - } - - pk2, err := pki.UnmarshalPEMPublicKey(packedPk) - if err != nil { - t.Fatal(err) - } - if !pk.Equal(pk2) { - t.Fatal() - } - - packedSk, err := pki.MarshalPEMPrivateKey(sk) - if err != nil { - t.Fatal(err) - } - - sk2, err := pki.UnmarshalPEMPrivateKey(packedSk) - if err != nil { - t.Fatal(err) - } - - if !sk.Equal(sk2) { - t.Fatal() - } - }) - } -} diff --git a/secretsharing/example_test.go b/secretsharing/example_test.go deleted file mode 100644 index 23a9d980..00000000 --- a/secretsharing/example_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package secretsharing_test - -import ( - "crypto/rand" - "fmt" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/secretsharing" -) - -func ExampleSecretSharing() { - g := group.P256 - t := uint(2) - n := uint(5) - - secret := g.RandomScalar(rand.Reader) - ss := secretsharing.New(rand.Reader, t, secret) - shares := ss.Share(n) - - got, err := secretsharing.Recover(t, shares[:t]) - fmt.Printf("Recover secret: %v\nError: %v\n", secret.IsEqual(got), err) - - got, err = secretsharing.Recover(t, shares[:t+1]) - fmt.Printf("Recover secret: %v\nError: %v\n", secret.IsEqual(got), err) - // Output: - // Recover secret: false - // Error: secretsharing: number of shares (n=2) must be above the threshold (t=2) - // Recover secret: true - // Error: -} - -func ExampleVerify() { - g := group.P256 - t := uint(2) - n := uint(5) - - secret := g.RandomScalar(rand.Reader) - ss := secretsharing.New(rand.Reader, t, secret) - shares := ss.Share(n) - coms := ss.CommitSecret() - - for i := range shares { - ok := secretsharing.Verify(t, shares[i], coms) - fmt.Printf("Share %v is valid: %v\n", i, ok) - } - - got, err := secretsharing.Recover(t, shares) - fmt.Printf("Recover secret: %v\nError: %v\n", secret.IsEqual(got), err) - // Output: - // Share 0 is valid: true - // Share 1 is valid: true - // Share 2 is valid: true - // Share 3 is valid: true - // Share 4 is valid: true - // Recover secret: true - // Error: -} diff --git a/secretsharing/ss.go b/secretsharing/ss.go deleted file mode 100644 index 8fce1b99..00000000 --- a/secretsharing/ss.go +++ /dev/null @@ -1,145 +0,0 @@ -// Package secretsharing provides methods to split secrets into shares. -// -// Let n be the number of parties, and t the number of corrupted parties such -// that 0 <= t < n. A (t,n) secret sharing allows to split a secret into n -// shares, such that the secret can be recovered from any subset of at least t+1 -// different shares. -// -// A Shamir secret sharing [1] relies on Lagrange polynomial interpolation. -// A Feldman secret sharing [2] extends Shamir's by committing the secret, -// which allows to verify that a share is part of the committed secret. -// -// New returns a SecretSharing compatible with Shamir secret sharing. -// The SecretSharing can be verifiable (compatible with Feldman secret sharing) -// using the CommitSecret and Verify functions. -// -// In this implementation, secret sharing is defined over the scalar field of -// a prime order group. -// -// References -// -// [1] Shamir, How to share a secret. https://dl.acm.org/doi/10.1145/359168.359176/ -// [2] Feldman, A practical scheme for non-interactive verifiable secret sharing. https://ieeexplore.ieee.org/document/4568297/ -package secretsharing - -import ( - "fmt" - "io" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/math/polynomial" -) - -// Share represents a share of a secret. -type Share struct { - // ID uniquely identifies a share in a secret sharing instance. ID is never zero. - ID group.Scalar - // Value stores the share generated by a secret sharing instance. - Value group.Scalar -} - -// SecretCommitment is the set of commitments generated by splitting a secret. -type SecretCommitment = []group.Element - -// SecretSharing provides a (t,n) Shamir's secret sharing. It allows splitting -// a secret into n shares, such that the secret can be only recovered from -// any subset of t+1 shares. -type SecretSharing struct { - g group.Group - t uint - poly polynomial.Polynomial -} - -// New returns a SecretSharing providing a (t,n) Shamir's secret sharing. -// It allows splitting a secret into n shares, such that the secret is -// only recovered from any subset of at least t+1 shares. -func New(rnd io.Reader, t uint, secret group.Scalar) SecretSharing { - c := make([]group.Scalar, t+1) - c[0] = secret.Copy() - g := secret.Group() - for i := 1; i < len(c); i++ { - c[i] = g.RandomScalar(rnd) - } - - return SecretSharing{g: g, t: t, poly: polynomial.New(c)} -} - -// Share creates n shares with an ID monotonically increasing from 1 to n. -func (ss SecretSharing) Share(n uint) []Share { - shares := make([]Share, n) - id := ss.g.NewScalar() - for i := range shares { - shares[i] = ss.ShareWithID(id.SetUint64(uint64(i + 1))) - } - - return shares -} - -// ShareWithID creates one share of the secret using the ID as identifier. -// Notice that shares with the same ID are considered equal. -// Panics, if the ID is zero. -func (ss SecretSharing) ShareWithID(id group.Scalar) Share { - if id.IsZero() { - panic("secretsharing: id cannot be zero") - } - - return Share{ - ID: id.Copy(), - Value: ss.poly.Evaluate(id), - } -} - -// CommitSecret creates a commitment to the secret for further verifying shares. -func (ss SecretSharing) CommitSecret() SecretCommitment { - c := make(SecretCommitment, ss.poly.Degree()+1) - for i := range c { - c[i] = ss.g.NewElement().MulGen(ss.poly.Coefficient(uint(i))) - } - return c -} - -// Verify returns true if the share s was produced by sharing a secret with -// threshold t and commitment of the secret c. -func Verify(t uint, s Share, c SecretCommitment) bool { - if len(c) != int(t+1) { - return false - } - if s.ID.IsZero() { - return false - } - - g := s.ID.Group() - lc := len(c) - 1 - sum := g.NewElement().Set(c[lc]) - for i := lc - 1; i >= 0; i-- { - sum.Mul(sum, s.ID) - sum.Add(sum, c[i]) - } - polI := g.NewElement().MulGen(s.Value) - return polI.IsEqual(sum) -} - -// Recover returns a secret provided more than t different shares are given. -// Returns an error if the number of shares is not above the threshold t. -// Panics if some shares are duplicated, i.e., shares must have different IDs. -func Recover(t uint, shares []Share) (secret group.Scalar, err error) { - if l := len(shares); l <= int(t) { - return nil, errThreshold(t, uint(l)) - } - - x := make([]group.Scalar, t+1) - px := make([]group.Scalar, t+1) - for i := range shares[:t+1] { - x[i] = shares[i].ID - px[i] = shares[i].Value - } - - l := polynomial.NewLagrangePolynomial(x, px) - zero := shares[0].ID.Group().NewScalar() - - return l.Evaluate(zero), nil -} - -func errThreshold(t, n uint) error { - return fmt.Errorf("secretsharing: number of shares (n=%v) must be above the threshold (t=%v)", n, t) -} diff --git a/secretsharing/ss_test.go b/secretsharing/ss_test.go deleted file mode 100644 index aa756a76..00000000 --- a/secretsharing/ss_test.go +++ /dev/null @@ -1,146 +0,0 @@ -package secretsharing_test - -import ( - "crypto/rand" - "testing" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/secretsharing" -) - -func TestSecretSharing(tt *testing.T) { - g := group.P256 - t := uint(2) - n := uint(5) - - secret := g.RandomScalar(rand.Reader) - ss := secretsharing.New(rand.Reader, t, secret) - shares := ss.Share(n) - test.CheckOk(len(shares) == int(n), "bad num shares", tt) - coms := ss.CommitSecret() - - tt.Run("subsetSize", func(ttt *testing.T) { - // Test any possible subset size. - for k := 0; k <= int(n); k++ { - got, err := secretsharing.Recover(t, shares[:k]) - if !(int(t) < k && k <= int(n)) { - test.CheckIsErr(ttt, err, "should not recover secret") - test.CheckOk(got == nil, "not nil secret", ttt) - } else { - test.CheckNoErr(ttt, err, "should recover secret") - want := secret - if !got.IsEqual(want) { - test.ReportError(ttt, got, want, t, k, n) - } - } - } - }) - - tt.Run("verifyShares", func(ttt *testing.T) { - for i := range shares { - test.CheckOk(secretsharing.Verify(t, shares[i], coms) == true, "failed one share", ttt) - } - }) - - tt.Run("badShares", func(ttt *testing.T) { - badShares := make([]secretsharing.Share, len(shares)) - for i := range shares { - badShares[i].ID = shares[i].ID.Copy() - badShares[i].Value = shares[i].Value.Copy() - badShares[i].Value.SetUint64(9) - } - - for i := range badShares { - test.CheckOk(secretsharing.Verify(t, badShares[i], coms) == false, "verify must fail due to bad shares", ttt) - } - }) - - tt.Run("badCommitments", func(ttt *testing.T) { - badComs := make(secretsharing.SecretCommitment, len(coms)) - for i := range coms { - badComs[i] = coms[i].Copy() - badComs[i].Dbl(badComs[i]) - } - - for i := range shares { - test.CheckOk(secretsharing.Verify(t, shares[i], badComs) == false, "verify must fail due to bad commitment", ttt) - } - }) -} - -func TestShareWithID(tt *testing.T) { - g := group.P256 - t := uint(2) - n := uint(5) - secret := g.RandomScalar(rand.Reader) - ss := secretsharing.New(rand.Reader, t, secret) - - tt.Run("recoverOk", func(ttt *testing.T) { - // SecretSharing can create shares at will, not exactly n many. - shares := []secretsharing.Share{ - ss.ShareWithID(g.RandomScalar(rand.Reader)), - ss.ShareWithID(g.RandomScalar(rand.Reader)), - ss.ShareWithID(g.RandomScalar(rand.Reader)), - } - got, err := secretsharing.Recover(t, shares) - test.CheckNoErr(tt, err, "failed to recover the secret") - want := secret - if !got.IsEqual(want) { - test.ReportError(tt, got, want, t, n) - } - }) - - tt.Run("duplicatedFail", func(ttt *testing.T) { - // Panics if trying to recover duplicated shares. - share := ss.ShareWithID(g.RandomScalar(rand.Reader)) - sameShares := []secretsharing.Share{share, share, share} - err := test.CheckPanic(func() { - got, err := secretsharing.Recover(t, sameShares) - test.CheckIsErr(tt, err, "must fail to recover the secret") - test.CheckOk(got == nil, "must not recover", tt) - }) - test.CheckOk(err == nil, "must panic", tt) - }) -} - -func BenchmarkSecretSharing(b *testing.B) { - g := group.P256 - t := uint(3) - n := uint(5) - - secret := g.RandomScalar(rand.Reader) - ss := secretsharing.New(rand.Reader, t, secret) - shares := ss.Share(n) - coms := ss.CommitSecret() - - b.Run("New", func(b *testing.B) { - for i := 0; i < b.N; i++ { - secretsharing.New(rand.Reader, t, secret) - } - }) - - b.Run("Share", func(b *testing.B) { - for i := 0; i < b.N; i++ { - ss.Share(n) - } - }) - - b.Run("Recover", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _ = secretsharing.Recover(t, shares) - } - }) - - b.Run("CommitSecret", func(b *testing.B) { - for i := 0; i < b.N; i++ { - ss.CommitSecret() - } - }) - - b.Run("Verify", func(b *testing.B) { - for i := 0; i < b.N; i++ { - secretsharing.Verify(t, shares[0], coms) - } - }) -} diff --git a/seed_expander.go b/seed_expander.go deleted file mode 100644 index e69de29b..00000000 diff --git a/sign/bls/bls.go b/sign/bls/bls.go deleted file mode 100644 index 5b9fd65c..00000000 --- a/sign/bls/bls.go +++ /dev/null @@ -1,420 +0,0 @@ -// Package bls provides BLS signatures using the BLS12-381 pairing curve. -// -// This packages implements the IETF/CFRG draft for BLS signatures [1]. -// Currently only the BASIC mode (one of the three modes specified -// in the draft) is supported. The pairing function is instantiated -// with the BLS12-381 curve. -// -// # Groups -// -// The BLS signature scheme can be instantiated with keys in one of the -// two groups: G1 or G2, which correspond to the input domain of a pairing -// function e(G1,G2) -> Gt. -// Thus, choosing keys in G1 implies that signature values are internally -// represented in G2; or viceversa. Use the types KeyG1SigG2 or KeyG2SigG1 -// to express this preference. -// -// # Serialization -// -// The serialization of elements in G1 and G2 follows the recommendation -// given in [2], in order to be compatible with other implementations of -// BLS12-381 curve. -// -// # References -// -// [1] https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-bls-signature-05 -// -// [2] https://github.com/zkcrypto/bls12_381/blob/0.7.0/src/notes/serialization.rs -package bls - -import ( - "crypto" - "crypto/sha256" - "encoding/binary" - "errors" - "io" - - GG "github.com/quantumcoinproject/circl/ecc/bls12381" - "golang.org/x/crypto/hkdf" -) - -var ( - ErrInvalid = errors.New("bls: invalid BLS instance") - ErrInvalidKey = errors.New("bls: invalid key") - ErrKeyGen = errors.New("bls: too many unsuccessful key generation tries") - ErrShortIKM = errors.New("bls: IKM material shorter than 32 bytes") - ErrAggregate = errors.New("bls: error while aggregating signatures") -) - -const ( - dstG1 = "BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_" - dstG2 = "BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_" -) - -type Signature = []byte - -type ( - // G1 group used for keys defined in pairing group G1. - G1 struct{ g GG.G1 } - // G2 group used for keys defined in pairing group G2. - G2 struct{ g GG.G2 } - // KeyG1SigG2 sets the keys to G1 and signatures to G2. - KeyG1SigG2 = G1 - // KeyG2SigG1 sets the keys to G2 and signatures to G1. - KeyG2SigG1 = G2 -) - -func (f *G1) setBytes(b []byte) error { return f.g.SetBytes(b) } -func (f *G2) setBytes(b []byte) error { return f.g.SetBytes(b) } - -func (f *G1) hash(msg []byte) { f.g.Hash(msg, []byte(dstG1)) } -func (f *G2) hash(msg []byte) { f.g.Hash(msg, []byte(dstG2)) } - -// KeyGroup determines the group used for keys, while the other -// group is used for signatures. -type KeyGroup interface{ G1 | G2 } - -type PrivateKey[K KeyGroup] struct { - key GG.Scalar - pub *PublicKey[K] -} - -type PublicKey[K KeyGroup] struct{ key K } - -func (k *PrivateKey[K]) Public() crypto.PublicKey { return k.PublicKey() } - -// PublicKey computes the corresponding public key. The key is cached -// for further invocations to this function. -func (k *PrivateKey[K]) PublicKey() *PublicKey[K] { - if k.pub == nil { - k.pub = new(PublicKey[K]) - switch any(k).(type) { - case *PrivateKey[G1]: - kk := any(&k.pub.key).(*G1) - kk.g.ScalarMult(&k.key, GG.G1Generator()) - case *PrivateKey[G2]: - kk := any(&k.pub.key).(*G2) - kk.g.ScalarMult(&k.key, GG.G2Generator()) - default: - panic(ErrInvalid) - } - } - - return k.pub -} - -func (k *PrivateKey[K]) Equal(x crypto.PrivateKey) bool { - xx, ok := x.(*PrivateKey[K]) - if !ok { - return false - } - - switch any(k).(type) { - case *PrivateKey[G1], *PrivateKey[G2]: - return k.key.IsEqual(&xx.key) == 1 - default: - panic(ErrInvalid) - } -} - -// Validate explicitly determines if a private key is valid. -func (k *PrivateKey[K]) Validate() bool { - switch any(k).(type) { - case *PrivateKey[G1], *PrivateKey[G2]: - return k.key.IsZero() == 0 - default: - panic(ErrInvalid) - } -} - -// MarshalBinary returns a slice with the representation of -// the underlying PrivateKey scalar (in big-endian order). -func (k *PrivateKey[K]) MarshalBinary() ([]byte, error) { - switch any(k).(type) { - case *PrivateKey[G1], *PrivateKey[G2]: - return k.key.MarshalBinary() - default: - panic(ErrInvalid) - } -} - -func (k *PrivateKey[K]) UnmarshalBinary(data []byte) error { - switch any(k).(type) { - case *PrivateKey[G1], *PrivateKey[G2]: - if err := k.key.UnmarshalBinary(data); err != nil { - return err - } - if !k.Validate() { - return ErrInvalidKey - } - k.pub = nil - return nil - default: - panic(ErrInvalid) - } -} - -// Validate explicitly determines if a public key is valid. -func (k *PublicKey[K]) Validate() bool { - switch any(k).(type) { - case *PublicKey[G1]: - kk := any(k.key).(G1) - return !kk.g.IsIdentity() && kk.g.IsOnG1() - case *PublicKey[G2]: - kk := any(k.key).(G2) - return !kk.g.IsIdentity() && kk.g.IsOnG2() - default: - panic(ErrInvalid) - } -} - -func (k *PublicKey[K]) Equal(x crypto.PublicKey) bool { - xx, ok := x.(*PublicKey[K]) - if !ok { - return false - } - - switch any(k).(type) { - case *PublicKey[G1]: - xxx := any(xx.key).(G1) - kk := any(k.key).(G1) - return kk.g.IsEqual(&xxx.g) - case *PublicKey[G2]: - xxx := any(xx.key).(G2) - kk := any(k.key).(G2) - return kk.g.IsEqual(&xxx.g) - default: - panic(ErrInvalid) - } -} - -// MarshalBinary returns a slice with the compressed -// representation of the underlying element in G1 or G2. -func (k *PublicKey[K]) MarshalBinary() ([]byte, error) { - switch any(k).(type) { - case *PublicKey[G1]: - kk := any(k.key).(G1) - return kk.g.BytesCompressed(), nil - case *PublicKey[G2]: - kk := any(k.key).(G2) - return kk.g.BytesCompressed(), nil - default: - panic(ErrInvalid) - } -} - -func (k *PublicKey[K]) UnmarshalBinary(data []byte) error { - switch any(k).(type) { - case *PublicKey[G1]: - kk := any(&k.key).(*G1) - return kk.setBytes(data) - case *PublicKey[G2]: - kk := any(&k.key).(*G2) - return kk.setBytes(data) - default: - panic(ErrInvalid) - } -} - -// KeyGen derives a private key for the specified group (G1 or G2). -// The length of ikm material should be at least 32 bytes length. -// The salt value should be either empty or a uniformly random -// bytes whose length equals the output length of SHA-256. -func KeyGen[K KeyGroup](ikm, salt, keyInfo []byte) (*PrivateKey[K], error) { - // Implements recommended method at: - // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-bls-signature-05#name-keygen - if len(ikm) < 32 { - return nil, ErrShortIKM - } - - ikmZero := make([]byte, len(ikm)+1) - keyInfoTwo := make([]byte, len(keyInfo)+2) - copy(ikmZero, ikm) - copy(keyInfoTwo, keyInfo) - const L = uint16(48) - binary.BigEndian.PutUint16(keyInfoTwo[len(keyInfo):], L) - OKM := make([]byte, L) - - var ss GG.Scalar - for tries := 8; tries > 0; tries-- { - rd := hkdf.New(sha256.New, ikmZero, salt, keyInfoTwo) - n, err := io.ReadFull(rd, OKM) - if n != len(OKM) || err != nil { - return nil, err - } - - ss.SetBytes(OKM) - - if ss.IsZero() == 1 { - digest := sha256.Sum256(salt) - salt = digest[:] - } else { - return &PrivateKey[K]{key: ss, pub: nil}, nil - } - } - - return nil, ErrKeyGen -} - -// Sign computes a signature of a message using a key (defined in -// G1 or G1). -func Sign[K KeyGroup](k *PrivateKey[K], msg []byte) Signature { - if !k.Validate() { - panic(ErrInvalidKey) - } - - switch any(k).(type) { - case *PrivateKey[G1]: - var Q GG.G2 - Q.Hash(msg, []byte(dstG2)) - Q.ScalarMult(&k.key, &Q) - return Q.BytesCompressed() - case *PrivateKey[G2]: - var Q GG.G1 - Q.Hash(msg, []byte(dstG1)) - Q.ScalarMult(&k.key, &Q) - return Q.BytesCompressed() - default: - panic(ErrInvalid) - } -} - -// Verify returns true if the signature of a message is valid for the -// corresponding public key. -func Verify[K KeyGroup](pub *PublicKey[K], msg []byte, sig Signature) bool { - var ( - a, b interface { - setBytes([]byte) error - hash([]byte) - } - listG1 [2]*GG.G1 - listG2 [2]*GG.G2 - ) - - switch any(pub).(type) { - case *PublicKey[G1]: - aa, bb := new(G2), new(G2) - a, b = aa, bb - k := any(pub.key).(G1) - listG1[0], listG1[1] = &k.g, GG.G1Generator() - listG2[0], listG2[1] = &aa.g, &bb.g - case *PublicKey[G2]: - aa, bb := new(G1), new(G1) - a, b = aa, bb - k := any(pub.key).(G2) - listG2[0], listG2[1] = &k.g, GG.G2Generator() - listG1[0], listG1[1] = &aa.g, &bb.g - default: - panic(ErrInvalid) - } - - err := b.setBytes(sig) - if err != nil { - return false - } - if !pub.Validate() { - return false - } - a.hash(msg) - - res := GG.ProdPairFrac(listG1[:], listG2[:], []int{1, -1}) - return res.IsIdentity() -} - -// Aggregate produces a unified signature given a list of signatures. -// To specify the group of keys pass either G1{} or G2{} as the first -// parameter. -func Aggregate[K KeyGroup](k K, sigs []Signature) (Signature, error) { - if len(sigs) == 0 { - return nil, ErrAggregate - } - - switch any(k).(type) { - case G1: - var P, Q GG.G2 - P.SetIdentity() - for _, sig := range sigs { - if err := Q.SetBytes(sig); err != nil { - return nil, err - } - P.Add(&P, &Q) - } - return P.BytesCompressed(), nil - - case G2: - var P, Q GG.G1 - P.SetIdentity() - for _, sig := range sigs { - if err := Q.SetBytes(sig); err != nil { - return nil, err - } - P.Add(&P, &Q) - } - return P.BytesCompressed(), nil - - default: - panic(ErrInvalid) - } -} - -// VerifyAggregate returns true if the aggregated signature is valid for -// the list of messages and public keys provided. The slices must have -// equal size and have at least one element. -func VerifyAggregate[K KeyGroup](pubs []*PublicKey[K], msgs [][]byte, aggSig Signature) bool { - if len(pubs) != len(msgs) || len(pubs) == 0 { - return false - } - - for _, p := range pubs { - if !p.Validate() { - return false - } - } - - n := len(pubs) - listG1 := make([]*GG.G1, n+1) - listG2 := make([]*GG.G2, n+1) - listSigns := make([]int, n+1) - - listG1[n] = GG.G1Generator() - listG2[n] = GG.G2Generator() - listSigns[n] = -1 - - switch any(pubs).(type) { - case []*PublicKey[G1]: - for i := range msgs { - listG2[i] = new(GG.G2) - listG2[i].Hash(msgs[i], []byte(dstG2)) - - xP := any(pubs[i].key).(G1) - listG1[i] = &xP.g - listSigns[i] = 1 - } - - err := listG2[n].SetBytes(aggSig) - if err != nil { - return false - } - - case []*PublicKey[G2]: - for i := range msgs { - listG1[i] = new(GG.G1) - listG1[i].Hash(msgs[i], []byte(dstG1)) - - xP := any(pubs[i].key).(G2) - listG2[i] = &xP.g - listSigns[i] = 1 - } - - err := listG1[n].SetBytes(aggSig) - if err != nil { - return false - } - - default: - panic(ErrInvalid) - } - - C := GG.ProdPairFrac(listG1, listG2, listSigns) - return C.IsIdentity() -} diff --git a/sign/bls/bls_test.go b/sign/bls/bls_test.go deleted file mode 100644 index 71299d19..00000000 --- a/sign/bls/bls_test.go +++ /dev/null @@ -1,219 +0,0 @@ -package bls_test - -import ( - "bytes" - "crypto/rand" - "crypto/rsa" - "encoding" - "fmt" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/sign/bls" -) - -func TestBls(t *testing.T) { - t.Run("G1/API", testBls[bls.G1]) - t.Run("G2/API", testBls[bls.G2]) - t.Run("G1/Marshal", testMarshalKeys[bls.G1]) - t.Run("G2/Marshal", testMarshalKeys[bls.G2]) - t.Run("G1/Errors", testErrors[bls.G1]) - t.Run("G2/Errors", testErrors[bls.G2]) - t.Run("G1/Aggregation", testAggregation[bls.G1]) - t.Run("G2/Aggregation", testAggregation[bls.G2]) -} - -func testBls[K bls.KeyGroup](t *testing.T) { - const testTimes = 1 << 7 - msg := []byte("hello world") - keyInfo := []byte("KeyInfo for BLS") - salt := [32]byte{} - ikm := [32]byte{} - _, _ = rand.Reader.Read(ikm[:]) - _, _ = rand.Reader.Read(salt[:]) - - for i := 0; i < testTimes; i++ { - _, _ = rand.Reader.Read(ikm[:]) - - priv, err := bls.KeyGen[K](ikm[:], salt[:], keyInfo) - test.CheckNoErr(t, err, "failed to keygen") - signature := bls.Sign(priv, msg) - pub := priv.Public().(*bls.PublicKey[K]) - test.CheckOk(bls.Verify(pub, msg, signature), "failed verification", t) - } -} - -func testMarshalKeys[K bls.KeyGroup](t *testing.T) { - ikm := [32]byte{} - priv, err := bls.KeyGen[K](ikm[:], nil, nil) - test.CheckNoErr(t, err, "failed to keygen") - pub := priv.PublicKey() - - auxPriv := new(bls.PrivateKey[K]) - auxPub := new(bls.PublicKey[K]) - - t.Run("PrivateKey", func(t *testing.T) { - testMarshal[K](t, priv, auxPriv) - test.CheckOk(priv.Equal(auxPriv), "private keys do not match", t) - }) - t.Run("PublicKey", func(t *testing.T) { - testMarshal[K](t, pub, auxPub) - test.CheckOk(pub.Equal(auxPub), "public keys do not match", t) - }) -} - -func testMarshal[K bls.KeyGroup]( - t *testing.T, - left, right interface { - encoding.BinaryMarshaler - encoding.BinaryUnmarshaler - }, -) { - want, err := left.MarshalBinary() - test.CheckNoErr(t, err, "failed to marshal") - - err = right.UnmarshalBinary(want) - test.CheckNoErr(t, err, "failed to unmarshal") - - got, err := right.MarshalBinary() - test.CheckNoErr(t, err, "failed to marshal") - - if !bytes.Equal(got, want) { - test.ReportError(t, got, want) - } - - err = right.UnmarshalBinary(nil) - test.CheckIsErr(t, err, "should fail: empty input") -} - -func testErrors[K bls.KeyGroup](t *testing.T) { - // Short IKM - _, err := bls.KeyGen[K](nil, nil, nil) - test.CheckIsErr(t, err, "should fail: short ikm") - - // Bad Signature size - ikm := [32]byte{} - priv, err := bls.KeyGen[K](ikm[:], nil, nil) - test.CheckNoErr(t, err, "failed to keygen") - pub := priv.PublicKey() - test.CheckOk(bls.Verify(pub, nil, nil) == false, "should fail: bad signature", t) - - // Bad public key - msg := []byte("hello") - sig := bls.Sign[K](priv, msg) - pub = new(bls.PublicKey[K]) - test.CheckOk(pub.Validate() == false, "should fail: bad public key", t) - test.CheckOk(bls.Verify(pub, msg, sig) == false, "should fail: bad signature", t) - - // Bad private key - priv = new(bls.PrivateKey[K]) - test.CheckOk(priv.Validate() == false, "should fail: bad private key", t) - err = test.CheckPanic(func() { bls.Sign(priv, msg) }) - test.CheckNoErr(t, err, "sign should panic") - - // Wrong comparisons - test.CheckOk(priv.Equal(new(rsa.PrivateKey)) == false, "should fail: bad private key types", t) - test.CheckOk(pub.Equal(new(rsa.PublicKey)) == false, "should fail: bad public key types", t) - - // Aggregate nil - _, err = bls.Aggregate[K](*new(K), nil) - test.CheckIsErr(t, err, "should fail: empty signatures") - - // VerifyAggregate nil - test.CheckOk(bls.VerifyAggregate([]*bls.PublicKey[K]{}, nil, nil) == false, "should fail: empty keys", t) - - // VerifyAggregate empty signature - test.CheckOk(bls.VerifyAggregate([]*bls.PublicKey[K]{pub}, [][]byte{msg}, nil) == false, "should fail: empty signature", t) -} - -func testAggregation[K bls.KeyGroup](t *testing.T) { - const N = 3 - - ikm := [32]byte{} - _, _ = rand.Reader.Read(ikm[:]) - - msgs := make([][]byte, N) - sigs := make([]bls.Signature, N) - pubKeys := make([]*bls.PublicKey[K], N) - - for i := range sigs { - priv, err := bls.KeyGen[K](ikm[:], nil, nil) - test.CheckNoErr(t, err, "failed to keygen") - pubKeys[i] = priv.PublicKey() - - msgs[i] = []byte(fmt.Sprintf("Message number: %v", i)) - sigs[i] = bls.Sign(priv, msgs[i]) - } - - aggSig, err := bls.Aggregate(*new(K), sigs) - test.CheckNoErr(t, err, "failed to aggregate") - - ok := bls.VerifyAggregate(pubKeys, msgs, aggSig) - test.CheckOk(ok, "failed to verify aggregated signature", t) -} - -func BenchmarkBls(b *testing.B) { - b.Run("G1", benchmarkBls[bls.G1]) - b.Run("G2", benchmarkBls[bls.G2]) -} - -func benchmarkBls[K bls.KeyGroup](b *testing.B) { - msg := []byte("hello world") - keyInfo := []byte("KeyInfo for BLS") - salt := [32]byte{} - ikm := [32]byte{} - _, _ = rand.Reader.Read(ikm[:]) - _, _ = rand.Reader.Read(salt[:]) - - priv, _ := bls.KeyGen[K](ikm[:], salt[:], keyInfo) - - const N = 3 - msgs := make([][]byte, N) - sigs := make([]bls.Signature, N) - pubKeys := make([]*bls.PublicKey[K], N) - - for i := range sigs { - pubKeys[i] = priv.PublicKey() - - msgs[i] = []byte(fmt.Sprintf("Message number: %v", i)) - sigs[i] = bls.Sign(priv, msgs[i]) - } - - b.Run("Keygen", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _ = rand.Reader.Read(ikm[:]) - _, _ = bls.KeyGen[K](ikm[:], salt[:], keyInfo) - } - }) - - b.Run("Sign", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _ = bls.Sign(priv, msg) - } - }) - - b.Run("Verify", func(b *testing.B) { - pub := priv.PublicKey() - signature := bls.Sign(priv, msg) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - bls.Verify(pub, msg, signature) - } - }) - - b.Run("Aggregate3", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _ = bls.Aggregate(*new(K), sigs) - } - }) - - b.Run("VerifyAggregate3", func(b *testing.B) { - aggSig, _ := bls.Aggregate(*new(K), sigs) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - _ = bls.VerifyAggregate(pubKeys, msgs, aggSig) - } - }) -} diff --git a/sign/bls/testdata/sig_g1_basic_P256.txt.zip b/sign/bls/testdata/sig_g1_basic_P256.txt.zip deleted file mode 100644 index 087d6a18..00000000 Binary files a/sign/bls/testdata/sig_g1_basic_P256.txt.zip and /dev/null differ diff --git a/sign/bls/testdata/sig_g1_basic_P521.txt.zip b/sign/bls/testdata/sig_g1_basic_P521.txt.zip deleted file mode 100644 index 32088846..00000000 Binary files a/sign/bls/testdata/sig_g1_basic_P521.txt.zip and /dev/null differ diff --git a/sign/bls/testdata/sig_g2_basic_P256.txt.zip b/sign/bls/testdata/sig_g2_basic_P256.txt.zip deleted file mode 100644 index 20919fe1..00000000 Binary files a/sign/bls/testdata/sig_g2_basic_P256.txt.zip and /dev/null differ diff --git a/sign/bls/testdata/sig_g2_basic_P521.txt.zip b/sign/bls/testdata/sig_g2_basic_P521.txt.zip deleted file mode 100644 index c80da1c1..00000000 Binary files a/sign/bls/testdata/sig_g2_basic_P521.txt.zip and /dev/null differ diff --git a/sign/bls/vectors_test.go b/sign/bls/vectors_test.go deleted file mode 100644 index 23acb2fe..00000000 --- a/sign/bls/vectors_test.go +++ /dev/null @@ -1,67 +0,0 @@ -package bls_test - -import ( - "archive/zip" - "bufio" - "encoding/hex" - "fmt" - "strings" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/sign/bls" -) - -func TestVectors(t *testing.T) { - // Test vectors taken from: - // Repository: https://github.com/kwantam/bls_sigs_ref/tree/sgn0_fix/test-vectors - // Branch: sig0_fix - // Path: /test-vectors/sig_[g1|g2]_basic/[name] - // Compression: zip - - for _, name := range []string{"P256", "P521"} { - t.Run(name+"/G1", func(t *testing.T) { testVector[bls.KeyG2SigG1](t, "g1", name) }) - t.Run(name+"/G2", func(t *testing.T) { testVector[bls.KeyG1SigG2](t, "g2", name) }) - } -} - -func testVector[K bls.KeyGroup](t *testing.T, group, name string) { - nameFile := fmt.Sprintf("./testdata/sig_%v_basic_%v.txt.zip", group, name) - zipFile, err := zip.OpenReader(nameFile) - test.CheckNoErr(t, err, "error opening zipped file") - - for _, f := range zipFile.File { - unzipped, err := f.Open() - test.CheckNoErr(t, err, "error opening unzipped file") - - scanner := bufio.NewScanner(unzipped) - for scanner.Scan() { - line := scanner.Text() - inputs := strings.Split(line, " ") - if len(inputs) != 3 { - t.Fatalf("bad input length") - } - - msg, err := hex.DecodeString(inputs[0]) - test.CheckNoErr(t, err, "error decoding msg") - seed, err := hex.DecodeString(inputs[1]) - test.CheckNoErr(t, err, "error decoding sk") - wantSig := inputs[2] - - salt := []byte("BLS-SIG-KEYGEN-SALT-") - keyInfo := []byte("") - priv, err := bls.KeyGen[K](seed, salt, keyInfo) - test.CheckNoErr(t, err, "error generating priv key") - - sig := bls.Sign(priv, msg) - gotSig := hex.EncodeToString(sig) - - if gotSig != wantSig { - test.ReportError(t, gotSig, wantSig, msg) - } - - pub := priv.PublicKey() - test.CheckOk(bls.Verify(pub, msg, sig), "cannot verify", t) - } - } -} diff --git a/sign/dilithium/dilithium.go b/sign/dilithium/dilithium.go index c16133a1..e513c2df 100644 --- a/sign/dilithium/dilithium.go +++ b/sign/dilithium/dilithium.go @@ -19,13 +19,4 @@ // To choose a scheme at runtime, use the generic signatures API under // // github.com/quantumcoinproject/circl/sign/schemes -// -// The packages -// -// github.com/quantumcoinproject/circl/sign/eddilithium2 -// github.com/quantumcoinproject/circl/sign/eddilithium3 -// -// implement hybrids of Dilithium2 with Ed25519 respectively and -// Dilithium3 with Ed448. These packages are a drop in replacements for the -// mode subpackages of this package. package dilithium diff --git a/sign/ed448/ed448.go b/sign/ed448/ed448.go deleted file mode 100644 index 1c09172a..00000000 --- a/sign/ed448/ed448.go +++ /dev/null @@ -1,411 +0,0 @@ -// Package ed448 implements Ed448 signature scheme as described in RFC-8032. -// -// This package implements two signature variants. -// -// | Scheme Name | Sign Function | Verification | Context | -// |-------------|-------------------|---------------|-------------------| -// | Ed448 | Sign | Verify | Yes, can be empty | -// | Ed448Ph | SignPh | VerifyPh | Yes, can be empty | -// | All above | (PrivateKey).Sign | VerifyAny | As above | -// -// Specific functions for sign and verify are defined. A generic signing -// function for all schemes is available through the crypto.Signer interface, -// which is implemented by the PrivateKey type. A correspond all-in-one -// verification method is provided by the VerifyAny function. -// -// Both schemes require a context string for domain separation. This parameter -// is passed using a SignerOptions struct defined in this package. -// -// References: -// -// - RFC8032: https://rfc-editor.org/rfc/rfc8032.txt -// - EdDSA for more curves: https://eprint.iacr.org/2015/677 -// - High-speed high-security signatures: https://doi.org/10.1007/s13389-012-0027-1 -package ed448 - -import ( - "bytes" - "crypto" - cryptoRand "crypto/rand" - "crypto/subtle" - "errors" - "fmt" - "io" - "strconv" - - "github.com/quantumcoinproject/circl/ecc/goldilocks" - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/sign" -) - -const ( - // ContextMaxSize is the maximum length (in bytes) allowed for context. - ContextMaxSize = 255 - // PublicKeySize is the length in bytes of Ed448 public keys. - PublicKeySize = 57 - // PrivateKeySize is the length in bytes of Ed448 private keys. - PrivateKeySize = 114 - // SignatureSize is the length in bytes of signatures. - SignatureSize = 114 - // SeedSize is the size, in bytes, of private key seeds. These are the private key representations used by RFC 8032. - SeedSize = 57 -) - -const ( - paramB = 456 / 8 // Size of keys in bytes. - hashSize = 2 * paramB // Size of the hash function's output. -) - -// SignerOptions implements crypto.SignerOpts and augments with parameters -// that are specific to the Ed448 signature schemes. -type SignerOptions struct { - // Hash must be crypto.Hash(0) for both Ed448 and Ed448Ph. - crypto.Hash - - // Context is an optional domain separation string for signing. - // Its length must be less or equal than 255 bytes. - Context string - - // Scheme is an identifier for choosing a signature scheme. - Scheme SchemeID -} - -// SchemeID is an identifier for each signature scheme. -type SchemeID uint - -const ( - ED448 SchemeID = iota - ED448Ph -) - -// PublicKey is the type of Ed448 public keys. -type PublicKey []byte - -// Equal reports whether pub and x have the same value. -func (pub PublicKey) Equal(x crypto.PublicKey) bool { - xx, ok := x.(PublicKey) - return ok && bytes.Equal(pub, xx) -} - -// PrivateKey is the type of Ed448 private keys. It implements crypto.Signer. -type PrivateKey []byte - -// Equal reports whether priv and x have the same value. -func (priv PrivateKey) Equal(x crypto.PrivateKey) bool { - xx, ok := x.(PrivateKey) - return ok && subtle.ConstantTimeCompare(priv, xx) == 1 -} - -// Public returns the PublicKey corresponding to priv. -func (priv PrivateKey) Public() crypto.PublicKey { - publicKey := make([]byte, PublicKeySize) - copy(publicKey, priv[SeedSize:]) - return PublicKey(publicKey) -} - -// Seed returns the private key seed corresponding to priv. It is provided for -// interoperability with RFC 8032. RFC 8032's private keys correspond to seeds -// in this package. -func (priv PrivateKey) Seed() []byte { - seed := make([]byte, SeedSize) - copy(seed, priv[:SeedSize]) - return seed -} - -func (priv PrivateKey) Scheme() sign.Scheme { return sch } - -func (pub PublicKey) Scheme() sign.Scheme { return sch } - -func (priv PrivateKey) MarshalBinary() (data []byte, err error) { - privateKey := make(PrivateKey, PrivateKeySize) - copy(privateKey, priv) - return privateKey, nil -} - -func (pub PublicKey) MarshalBinary() (data []byte, err error) { - publicKey := make(PublicKey, PublicKeySize) - copy(publicKey, pub) - return publicKey, nil -} - -// Sign creates a signature of a message given a key pair. -// This function supports all the two signature variants defined in RFC-8032, -// namely Ed448 (or pure EdDSA) and Ed448Ph. -// The opts.HashFunc() must return zero to the specify Ed448 variant. This can -// be achieved by passing crypto.Hash(0) as the value for opts. -// Use an Options struct to pass a bool indicating that the ed448Ph variant -// should be used. -// The struct can also be optionally used to pass a context string for signing. -func (priv PrivateKey) Sign( - rand io.Reader, - message []byte, - opts crypto.SignerOpts, -) (signature []byte, err error) { - var ctx string - var scheme SchemeID - - if o, ok := opts.(SignerOptions); ok { - ctx = o.Context - scheme = o.Scheme - } - - switch true { - case scheme == ED448 && opts.HashFunc() == crypto.Hash(0): - return Sign(priv, message, ctx), nil - case scheme == ED448Ph && opts.HashFunc() == crypto.Hash(0): - return SignPh(priv, message, ctx), nil - default: - return nil, errors.New("ed448: bad hash algorithm") - } -} - -// GenerateKey generates a public/private key pair using entropy from rand. -// If rand is nil, crypto/rand.Reader will be used. -func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) { - if rand == nil { - rand = cryptoRand.Reader - } - - seed := make(PrivateKey, SeedSize) - if _, err := io.ReadFull(rand, seed); err != nil { - return nil, nil, err - } - - privateKey := NewKeyFromSeed(seed) - publicKey := make([]byte, PublicKeySize) - copy(publicKey, privateKey[SeedSize:]) - - return publicKey, privateKey, nil -} - -// NewKeyFromSeed calculates a private key from a seed. It will panic if -// len(seed) is not SeedSize. This function is provided for interoperability -// with RFC 8032. RFC 8032's private keys correspond to seeds in this -// package. -func NewKeyFromSeed(seed []byte) PrivateKey { - privateKey := make([]byte, PrivateKeySize) - newKeyFromSeed(privateKey, seed) - return privateKey -} - -func newKeyFromSeed(privateKey, seed []byte) { - if l := len(seed); l != SeedSize { - panic("ed448: bad seed length: " + strconv.Itoa(l)) - } - - var h [hashSize]byte - H := sha3.NewShake256() - _, _ = H.Write(seed) - _, _ = H.Read(h[:]) - s := &goldilocks.Scalar{} - deriveSecretScalar(s, h[:paramB]) - - copy(privateKey[:SeedSize], seed) - _ = goldilocks.Curve{}.ScalarBaseMult(s).ToBytes(privateKey[SeedSize:]) -} - -func signAll(signature []byte, privateKey PrivateKey, message, ctx []byte, preHash bool) { - if len(ctx) > ContextMaxSize { - panic(fmt.Errorf("ed448: bad context length: %v", len(ctx))) - } - - H := sha3.NewShake256() - var PHM []byte - - if preHash { - var h [64]byte - _, _ = H.Write(message) - _, _ = H.Read(h[:]) - PHM = h[:] - H.Reset() - } else { - PHM = message - } - - // 1. Hash the 57-byte private key using SHAKE256(x, 114). - var h [hashSize]byte - _, _ = H.Write(privateKey[:SeedSize]) - _, _ = H.Read(h[:]) - s := &goldilocks.Scalar{} - deriveSecretScalar(s, h[:paramB]) - prefix := h[paramB:] - - // 2. Compute SHAKE256(dom4(F, C) || prefix || PH(M), 114). - var rPM [hashSize]byte - H.Reset() - - writeDom(&H, ctx, preHash) - - _, _ = H.Write(prefix) - _, _ = H.Write(PHM) - _, _ = H.Read(rPM[:]) - - // 3. Compute the point [r]B. - r := &goldilocks.Scalar{} - r.FromBytes(rPM[:]) - R := (&[paramB]byte{})[:] - if err := (goldilocks.Curve{}.ScalarBaseMult(r).ToBytes(R)); err != nil { - panic(err) - } - // 4. Compute SHAKE256(dom4(F, C) || R || A || PH(M), 114) - var hRAM [hashSize]byte - H.Reset() - - writeDom(&H, ctx, preHash) - - _, _ = H.Write(R) - _, _ = H.Write(privateKey[SeedSize:]) - _, _ = H.Write(PHM) - _, _ = H.Read(hRAM[:]) - - // 5. Compute S = (r + k * s) mod order. - k := &goldilocks.Scalar{} - k.FromBytes(hRAM[:]) - S := &goldilocks.Scalar{} - S.Mul(k, s) - S.Add(S, r) - - // 6. The signature is the concatenation of R and S. - copy(signature[:paramB], R[:]) - copy(signature[paramB:], S[:]) -} - -// Sign signs the message with privateKey and returns a signature. -// This function supports the signature variant defined in RFC-8032: Ed448, -// also known as the pure version of EdDSA. -// It will panic if len(privateKey) is not PrivateKeySize. -func Sign(priv PrivateKey, message []byte, ctx string) []byte { - signature := make([]byte, SignatureSize) - signAll(signature, priv, message, []byte(ctx), false) - return signature -} - -// SignPh creates a signature of a message given a keypair. -// This function supports the signature variant defined in RFC-8032: Ed448ph, -// meaning it internally hashes the message using SHAKE-256. -// Context could be passed to this function, which length should be no more than -// 255. It can be empty. -func SignPh(priv PrivateKey, message []byte, ctx string) []byte { - signature := make([]byte, SignatureSize) - signAll(signature, priv, message, []byte(ctx), true) - return signature -} - -func verify(public PublicKey, message, signature, ctx []byte, preHash bool) bool { - if len(public) != PublicKeySize || - len(signature) != SignatureSize || - len(ctx) > ContextMaxSize || - !isLessThanOrder(signature[paramB:]) { - return false - } - - P, err := goldilocks.FromBytes(public) - if err != nil { - return false - } - - H := sha3.NewShake256() - var PHM []byte - - if preHash { - var h [64]byte - _, _ = H.Write(message) - _, _ = H.Read(h[:]) - PHM = h[:] - H.Reset() - } else { - PHM = message - } - - var hRAM [hashSize]byte - R := signature[:paramB] - - writeDom(&H, ctx, preHash) - - _, _ = H.Write(R) - _, _ = H.Write(public) - _, _ = H.Write(PHM) - _, _ = H.Read(hRAM[:]) - - k := &goldilocks.Scalar{} - k.FromBytes(hRAM[:]) - S := &goldilocks.Scalar{} - S.FromBytes(signature[paramB:]) - - encR := (&[paramB]byte{})[:] - P.Neg() - _ = goldilocks.Curve{}.CombinedMult(S, k, P).ToBytes(encR) - return bytes.Equal(R, encR) -} - -// VerifyAny returns true if the signature is valid. Failure cases are invalid -// signature, or when the public key cannot be decoded. -// This function supports all the two signature variants defined in RFC-8032, -// namely Ed448 (or pure EdDSA) and Ed448Ph. -// The opts.HashFunc() must return zero, this can be achieved by passing -// crypto.Hash(0) as the value for opts. -// Use a SignerOptions struct to pass a context string for signing. -func VerifyAny(public PublicKey, message, signature []byte, opts crypto.SignerOpts) bool { - var ctx string - var scheme SchemeID - if o, ok := opts.(SignerOptions); ok { - ctx = o.Context - scheme = o.Scheme - } - - switch true { - case scheme == ED448 && opts.HashFunc() == crypto.Hash(0): - return Verify(public, message, signature, ctx) - case scheme == ED448Ph && opts.HashFunc() == crypto.Hash(0): - return VerifyPh(public, message, signature, ctx) - default: - return false - } -} - -// Verify returns true if the signature is valid. Failure cases are invalid -// signature, or when the public key cannot be decoded. -// This function supports the signature variant defined in RFC-8032: Ed448, -// also known as the pure version of EdDSA. -func Verify(public PublicKey, message, signature []byte, ctx string) bool { - return verify(public, message, signature, []byte(ctx), false) -} - -// VerifyPh returns true if the signature is valid. Failure cases are invalid -// signature, or when the public key cannot be decoded. -// This function supports the signature variant defined in RFC-8032: Ed448ph, -// meaning it internally hashes the message using SHAKE-256. -// Context could be passed to this function, which length should be no more than -// 255. It can be empty. -func VerifyPh(public PublicKey, message, signature []byte, ctx string) bool { - return verify(public, message, signature, []byte(ctx), true) -} - -func deriveSecretScalar(s *goldilocks.Scalar, h []byte) { - h[0] &= 0xFC // The two least significant bits of the first octet are cleared, - h[paramB-1] = 0x00 // all eight bits the last octet are cleared, and - h[paramB-2] |= 0x80 // the highest bit of the second to last octet is set. - s.FromBytes(h[:paramB]) -} - -// isLessThanOrder returns true if 0 <= x < order and if the last byte of x is zero. -func isLessThanOrder(x []byte) bool { - order := goldilocks.Curve{}.Order() - i := len(order) - 1 - for i > 0 && x[i] == order[i] { - i-- - } - return x[paramB-1] == 0 && x[i] < order[i] -} - -func writeDom(h io.Writer, ctx []byte, preHash bool) { - dom4 := "SigEd448" - _, _ = h.Write([]byte(dom4)) - - if preHash { - _, _ = h.Write([]byte{byte(0x01), byte(len(ctx))}) - } else { - _, _ = h.Write([]byte{byte(0x00), byte(len(ctx))}) - } - _, _ = h.Write(ctx) -} diff --git a/sign/ed448/ed448_test.go b/sign/ed448/ed448_test.go deleted file mode 100644 index cf9bba59..00000000 --- a/sign/ed448/ed448_test.go +++ /dev/null @@ -1,325 +0,0 @@ -package ed448_test - -import ( - "bytes" - "crypto" - "crypto/rand" - "errors" - "fmt" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/sign/ed448" -) - -type zeroReader struct{} - -func (zeroReader) Read(buf []byte) (int, error) { - for i := range buf { - buf[i] = 0 - } - return len(buf), nil -} - -func TestEqual(t *testing.T) { - public, private, _ := ed448.GenerateKey(rand.Reader) - - if !public.Equal(public) { - t.Errorf("public key is not equal to itself: %q", public) - } - if !public.Equal(crypto.Signer(private).Public()) { - t.Errorf("private.Public() is not Equal to public: %q", public) - } - if !private.Equal(private) { - t.Errorf("private key is not equal to itself: %q", private) - } - - otherPub, otherPriv, _ := ed448.GenerateKey(rand.Reader) - if public.Equal(otherPub) { - t.Errorf("different public keys are Equal") - } - if private.Equal(otherPriv) { - t.Errorf("different private keys are Equal") - } -} - -func TestWrongPublicKey(t *testing.T) { - wrongPublicKeys := [...][ed448.PublicKeySize]byte{ - { // y = p - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - }, - { // y > p - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - }, - { // x^2 = u/v = (y^2-1)/(dy^2-1) is not a quadratic residue - 0xa4, 0x8b, 0xae, 0x31, 0x1b, 0x3a, 0xe5, 0x62, - 0x3d, 0x6f, 0x2d, 0xbe, 0x8b, 0xb4, 0xd3, 0x21, - 0x0f, 0x04, 0x0a, 0x7e, 0xf2, 0x25, 0x87, 0xc3, - 0xc0, 0x1e, 0xe1, 0xf4, 0x6d, 0xc7, 0x28, 0x8f, - 0x8b, 0xb9, 0x9f, 0x3d, 0x02, 0xb0, 0xc0, 0xa8, - 0xe7, 0xe3, 0x4f, 0xb2, 0x82, 0x64, 0x98, 0x4a, - 0x84, 0x73, 0xd7, 0x57, 0x6a, 0x39, 0x90, 0xa3, - }, - { // y = 1 and x^2 = u/v = 0, and the sign of X is 1 - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - }, - { // y = -1 and x^2 = u/v = 0, and the sign of X is 1 - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - }, - } - sig := (&[ed448.SignatureSize]byte{})[:] - for _, public := range wrongPublicKeys { - got := ed448.Verify(public[:], []byte(""), sig, "") - want := false - if got != want { - test.ReportError(t, got, want, public) - } - } -} - -func TestSigner(t *testing.T) { - seed := (&[ed448.SeedSize]byte{})[:] - _, _ = rand.Read(seed) - key := ed448.NewKeyFromSeed(seed) - - priv := key.Seed() - if !bytes.Equal(seed, priv) { - got := priv - want := seed - test.ReportError(t, got, want) - } - - signer := crypto.Signer(key) - ops := crypto.Hash(0) - msg := make([]byte, 16) - _, _ = rand.Read(msg) - sig, err := signer.Sign(nil, msg, ops) - if err != nil { - got := err - var want error - test.ReportError(t, got, want) - } - if len(sig) != ed448.SignatureSize { - got := len(sig) - want := ed448.SignatureSize - test.ReportError(t, got, want) - } - - for _, o := range []ed448.SignerOptions{ - {Scheme: ed448.ED448, Hash: crypto.Hash(0), Context: ""}, - {Scheme: ed448.ED448, Hash: crypto.Hash(0), Context: "non-empty"}, - {Scheme: ed448.ED448Ph, Hash: crypto.Hash(0), Context: ""}, - {Scheme: ed448.ED448Ph, Hash: crypto.Hash(0), Context: "non-empty"}, - } { - testSigner(t, key, o) - } -} - -func testSigner(t *testing.T, signer crypto.Signer, ops ed448.SignerOptions) { - msg := make([]byte, 64) - _, _ = rand.Read(msg) - - sig, err := signer.Sign(nil, msg, ops) - if err != nil { - got := err - var want error - test.ReportError(t, got, want, ops) - } - - if len(sig) != ed448.SignatureSize { - got := len(sig) - want := ed448.SignatureSize - test.ReportError(t, got, want, ops) - } - - pubSigner, ok := signer.Public().(ed448.PublicKey) - if !ok { - got := ok - want := true - test.ReportError(t, got, want, ops) - } - - got := ed448.VerifyAny(pubSigner, msg, sig, ops) - want := true - if got != want { - test.ReportError(t, got, want, ops) - } -} - -type badReader struct{} - -func (badReader) Read([]byte) (n int, err error) { return 0, errors.New("cannot read") } - -func TestErrors(t *testing.T) { - t.Run("badHash", func(t *testing.T) { - var msg [16]byte - ops := crypto.SHA224 - _, priv, _ := ed448.GenerateKey(nil) - _, got := priv.Sign(nil, msg[:], ops) - want := errors.New("ed448: bad hash algorithm") - if got.Error() != want.Error() { - test.ReportError(t, got, want) - } - }) - t.Run("badReader", func(t *testing.T) { - _, _, got := ed448.GenerateKey(badReader{}) - want := errors.New("cannot read") - if got.Error() != want.Error() { - test.ReportError(t, got, want) - } - }) - t.Run("wrongSeedSize", func(t *testing.T) { - var seed [256]byte - var want error - got := test.CheckPanic(func() { ed448.NewKeyFromSeed(seed[:]) }) - if got != want { - test.ReportError(t, got, want) - } - }) - t.Run("bigContext", func(t *testing.T) { - var msg [16]byte - var ctx [256]byte - var want error - _, priv, _ := ed448.GenerateKey(nil) - got := test.CheckPanic(func() { ed448.Sign(priv, msg[:], string(ctx[:])) }) - if got != want { - test.ReportError(t, got, want) - } - }) -} - -func BenchmarkKeyGeneration(b *testing.B) { - var zero zeroReader - for i := 0; i < b.N; i++ { - if _, _, err := ed448.GenerateKey(zero); err != nil { - b.Fatal(err) - } - } -} - -func BenchmarkNewKeyFromSeed(b *testing.B) { - seed := make([]byte, ed448.SeedSize) - b.ReportAllocs() - for i := 0; i < b.N; i++ { - _ = ed448.NewKeyFromSeed(seed) - } -} - -func BenchmarkSigning(b *testing.B) { - var zero zeroReader - _, priv, err := ed448.GenerateKey(zero) - if err != nil { - b.Fatal(err) - } - message := []byte("Hello, world!") - ctx := "a context string" - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - ed448.Sign(priv, message, ctx) - } -} - -func BenchmarkVerification(b *testing.B) { - var zero zeroReader - pub, priv, err := ed448.GenerateKey(zero) - if err != nil { - b.Fatal(err) - } - message := []byte("Hello, world!") - ctx := "a context string" - signature := ed448.Sign(priv, message, ctx) - b.ResetTimer() - for i := 0; i < b.N; i++ { - ed448.Verify(pub, message, signature, ctx) - } -} - -func BenchmarkEd448Ph(b *testing.B) { - msg := make([]byte, 128) - _, _ = rand.Read(msg) - - b.Run("Sign", func(b *testing.B) { - _, key, _ := ed448.GenerateKey(rand.Reader) - ctx := "" - b.ResetTimer() - for i := 0; i < b.N; i++ { - _ = ed448.SignPh(key, msg, ctx) - } - }) - b.Run("Verify", func(b *testing.B) { - pub, priv, _ := ed448.GenerateKey(rand.Reader) - ctx := "" - sig := ed448.SignPh(priv, msg, ctx) - b.ResetTimer() - for i := 0; i < b.N; i++ { - ed448.VerifyPh(pub, msg, sig, ctx) - } - }) -} - -func Example_ed448() { - // import "github.com/quantumcoinproject/circl/sign/ed448" - // import "crypto/rand" - - // Generating Alice's key pair - pub, priv, err := ed448.GenerateKey(rand.Reader) - if err != nil { - panic("error on generating keys") - } - - // Alice signs a message. - message := []byte("A message to be signed") - ctx := "This is a context string" - signature := ed448.Sign(priv, message, ctx) - - // Anyone can verify the signature using Alice's public key. - ok := ed448.Verify(pub, message, signature, ctx) - fmt.Println(ok) - // Output: true -} - -func ExampleSignPh() { - // import "github.com/quantumcoinproject/circl/sign/ed448" - // import "crypto/rand" - - // Generating Alice's key pair - pub, priv, err := ed448.GenerateKey(rand.Reader) - if err != nil { - panic("error on generating keys") - } - - // Alice signs a message. - message := []byte("A message to be signed") - ctx := "This is a context string" - signature := ed448.SignPh(priv, message, ctx) - - // Anyone can verify the signature using Alice's public key. - ok := ed448.VerifyPh(pub, message, signature, ctx) - fmt.Println(ok) - // Output: true -} diff --git a/sign/ed448/rfc8032_test.go b/sign/ed448/rfc8032_test.go deleted file mode 100644 index a2667e8f..00000000 --- a/sign/ed448/rfc8032_test.go +++ /dev/null @@ -1,532 +0,0 @@ -package ed448_test - -import ( - "bytes" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/sign/ed448" -) - -type vector struct { - name string - scheme string - sk []byte - pk []byte - sig []byte - msg []byte - msgLen uint - ph bool - ctx []byte - ctxLen uint -} - -var vectorsEd448 = [...]vector{ - { - name: "-----Blank", - scheme: "Ed448Pure", - sk: []byte{ - 0x6c, 0x82, 0xa5, 0x62, 0xcb, 0x80, 0x8d, 0x10, 0xd6, 0x32, 0xbe, 0x89, 0xc8, 0x51, 0x3e, 0xbf, - 0x6c, 0x92, 0x9f, 0x34, 0xdd, 0xfa, 0x8c, 0x9f, 0x63, 0xc9, 0x96, 0x0e, 0xf6, 0xe3, 0x48, 0xa3, - 0x52, 0x8c, 0x8a, 0x3f, 0xcc, 0x2f, 0x04, 0x4e, 0x39, 0xa3, 0xfc, 0x5b, 0x94, 0x49, 0x2f, 0x8f, - 0x03, 0x2e, 0x75, 0x49, 0xa2, 0x00, 0x98, 0xf9, 0x5b, - }, - pk: []byte{ - 0x5f, 0xd7, 0x44, 0x9b, 0x59, 0xb4, 0x61, 0xfd, 0x2c, 0xe7, 0x87, 0xec, 0x61, 0x6a, 0xd4, 0x6a, - 0x1d, 0xa1, 0x34, 0x24, 0x85, 0xa7, 0x0e, 0x1f, 0x8a, 0x0e, 0xa7, 0x5d, 0x80, 0xe9, 0x67, 0x78, - 0xed, 0xf1, 0x24, 0x76, 0x9b, 0x46, 0xc7, 0x06, 0x1b, 0xd6, 0x78, 0x3d, 0xf1, 0xe5, 0x0f, 0x6c, - 0xd1, 0xfa, 0x1a, 0xbe, 0xaf, 0xe8, 0x25, 0x61, 0x80, - }, - msg: []byte{}, - msgLen: 0, - ph: false, - sig: []byte{ - 0x53, 0x3a, 0x37, 0xf6, 0xbb, 0xe4, 0x57, 0x25, 0x1f, 0x02, 0x3c, 0x0d, 0x88, 0xf9, 0x76, 0xae, - 0x2d, 0xfb, 0x50, 0x4a, 0x84, 0x3e, 0x34, 0xd2, 0x07, 0x4f, 0xd8, 0x23, 0xd4, 0x1a, 0x59, 0x1f, - 0x2b, 0x23, 0x3f, 0x03, 0x4f, 0x62, 0x82, 0x81, 0xf2, 0xfd, 0x7a, 0x22, 0xdd, 0xd4, 0x7d, 0x78, - 0x28, 0xc5, 0x9b, 0xd0, 0xa2, 0x1b, 0xfd, 0x39, 0x80, 0xff, 0x0d, 0x20, 0x28, 0xd4, 0xb1, 0x8a, - 0x9d, 0xf6, 0x3e, 0x00, 0x6c, 0x5d, 0x1c, 0x2d, 0x34, 0x5b, 0x92, 0x5d, 0x8d, 0xc0, 0x0b, 0x41, - 0x04, 0x85, 0x2d, 0xb9, 0x9a, 0xc5, 0xc7, 0xcd, 0xda, 0x85, 0x30, 0xa1, 0x13, 0xa0, 0xf4, 0xdb, - 0xb6, 0x11, 0x49, 0xf0, 0x5a, 0x73, 0x63, 0x26, 0x8c, 0x71, 0xd9, 0x58, 0x08, 0xff, 0x2e, 0x65, - 0x26, 0x00, - }, - ctx: []byte{}, - ctxLen: 0, - }, - { - name: "-----1 octet", - scheme: "Ed448Pure", - sk: []byte{ - 0xc4, 0xea, 0xb0, 0x5d, 0x35, 0x70, 0x07, 0xc6, 0x32, 0xf3, 0xdb, 0xb4, 0x84, 0x89, 0x92, 0x4d, - 0x55, 0x2b, 0x08, 0xfe, 0x0c, 0x35, 0x3a, 0x0d, 0x4a, 0x1f, 0x00, 0xac, 0xda, 0x2c, 0x46, 0x3a, - 0xfb, 0xea, 0x67, 0xc5, 0xe8, 0xd2, 0x87, 0x7c, 0x5e, 0x3b, 0xc3, 0x97, 0xa6, 0x59, 0x94, 0x9e, - 0xf8, 0x02, 0x1e, 0x95, 0x4e, 0x0a, 0x12, 0x27, 0x4e, - }, - pk: []byte{ - 0x43, 0xba, 0x28, 0xf4, 0x30, 0xcd, 0xff, 0x45, 0x6a, 0xe5, 0x31, 0x54, 0x5f, 0x7e, 0xcd, 0x0a, - 0xc8, 0x34, 0xa5, 0x5d, 0x93, 0x58, 0xc0, 0x37, 0x2b, 0xfa, 0x0c, 0x6c, 0x67, 0x98, 0xc0, 0x86, - 0x6a, 0xea, 0x01, 0xeb, 0x00, 0x74, 0x28, 0x02, 0xb8, 0x43, 0x8e, 0xa4, 0xcb, 0x82, 0x16, 0x9c, - 0x23, 0x51, 0x60, 0x62, 0x7b, 0x4c, 0x3a, 0x94, 0x80, - }, - msg: []byte{ - 0x03, - }, - msgLen: 1, - ph: false, - sig: []byte{ - 0x26, 0xb8, 0xf9, 0x17, 0x27, 0xbd, 0x62, 0x89, 0x7a, 0xf1, 0x5e, 0x41, 0xeb, 0x43, 0xc3, 0x77, - 0xef, 0xb9, 0xc6, 0x10, 0xd4, 0x8f, 0x23, 0x35, 0xcb, 0x0b, 0xd0, 0x08, 0x78, 0x10, 0xf4, 0x35, - 0x25, 0x41, 0xb1, 0x43, 0xc4, 0xb9, 0x81, 0xb7, 0xe1, 0x8f, 0x62, 0xde, 0x8c, 0xcd, 0xf6, 0x33, - 0xfc, 0x1b, 0xf0, 0x37, 0xab, 0x7c, 0xd7, 0x79, 0x80, 0x5e, 0x0d, 0xbc, 0xc0, 0xaa, 0xe1, 0xcb, - 0xce, 0xe1, 0xaf, 0xb2, 0xe0, 0x27, 0xdf, 0x36, 0xbc, 0x04, 0xdc, 0xec, 0xbf, 0x15, 0x43, 0x36, - 0xc1, 0x9f, 0x0a, 0xf7, 0xe0, 0xa6, 0x47, 0x29, 0x05, 0xe7, 0x99, 0xf1, 0x95, 0x3d, 0x2a, 0x0f, - 0xf3, 0x34, 0x8a, 0xb2, 0x1a, 0xa4, 0xad, 0xaf, 0xd1, 0xd2, 0x34, 0x44, 0x1c, 0xf8, 0x07, 0xc0, - 0x3a, 0x00, - }, - ctx: []byte{}, - ctxLen: 0, - }, - { - name: "-----1 octet (with context)", - scheme: "Ed448Pure", - sk: []byte{ - 0xc4, 0xea, 0xb0, 0x5d, 0x35, 0x70, 0x07, 0xc6, 0x32, 0xf3, 0xdb, 0xb4, 0x84, 0x89, 0x92, 0x4d, - 0x55, 0x2b, 0x08, 0xfe, 0x0c, 0x35, 0x3a, 0x0d, 0x4a, 0x1f, 0x00, 0xac, 0xda, 0x2c, 0x46, 0x3a, - 0xfb, 0xea, 0x67, 0xc5, 0xe8, 0xd2, 0x87, 0x7c, 0x5e, 0x3b, 0xc3, 0x97, 0xa6, 0x59, 0x94, 0x9e, - 0xf8, 0x02, 0x1e, 0x95, 0x4e, 0x0a, 0x12, 0x27, 0x4e, - }, - pk: []byte{ - 0x43, 0xba, 0x28, 0xf4, 0x30, 0xcd, 0xff, 0x45, 0x6a, 0xe5, 0x31, 0x54, 0x5f, 0x7e, 0xcd, 0x0a, - 0xc8, 0x34, 0xa5, 0x5d, 0x93, 0x58, 0xc0, 0x37, 0x2b, 0xfa, 0x0c, 0x6c, 0x67, 0x98, 0xc0, 0x86, - 0x6a, 0xea, 0x01, 0xeb, 0x00, 0x74, 0x28, 0x02, 0xb8, 0x43, 0x8e, 0xa4, 0xcb, 0x82, 0x16, 0x9c, - 0x23, 0x51, 0x60, 0x62, 0x7b, 0x4c, 0x3a, 0x94, 0x80, - }, - msg: []byte{ - 0x03, - }, - msgLen: 1, - ph: false, - sig: []byte{ - 0xd4, 0xf8, 0xf6, 0x13, 0x17, 0x70, 0xdd, 0x46, 0xf4, 0x08, 0x67, 0xd6, 0xfd, 0x5d, 0x50, 0x55, - 0xde, 0x43, 0x54, 0x1f, 0x8c, 0x5e, 0x35, 0xab, 0xbc, 0xd0, 0x01, 0xb3, 0x2a, 0x89, 0xf7, 0xd2, - 0x15, 0x1f, 0x76, 0x47, 0xf1, 0x1d, 0x8c, 0xa2, 0xae, 0x27, 0x9f, 0xb8, 0x42, 0xd6, 0x07, 0x21, - 0x7f, 0xce, 0x6e, 0x04, 0x2f, 0x68, 0x15, 0xea, 0x00, 0x0c, 0x85, 0x74, 0x1d, 0xe5, 0xc8, 0xda, - 0x11, 0x44, 0xa6, 0xa1, 0xab, 0xa7, 0xf9, 0x6d, 0xe4, 0x25, 0x05, 0xd7, 0xa7, 0x29, 0x85, 0x24, - 0xfd, 0xa5, 0x38, 0xfc, 0xcb, 0xbb, 0x75, 0x4f, 0x57, 0x8c, 0x1c, 0xad, 0x10, 0xd5, 0x4d, 0x0d, - 0x54, 0x28, 0x40, 0x7e, 0x85, 0xdc, 0xbc, 0x98, 0xa4, 0x91, 0x55, 0xc1, 0x37, 0x64, 0xe6, 0x6c, - 0x3c, 0x00, - }, - ctx: []byte{ - 0x66, 0x6f, 0x6f, - }, - ctxLen: 3, - }, - { - name: "-----11 octets", - scheme: "Ed448Pure", - sk: []byte{ - 0xcd, 0x23, 0xd2, 0x4f, 0x71, 0x42, 0x74, 0xe7, 0x44, 0x34, 0x32, 0x37, 0xb9, 0x32, 0x90, 0xf5, - 0x11, 0xf6, 0x42, 0x5f, 0x98, 0xe6, 0x44, 0x59, 0xff, 0x20, 0x3e, 0x89, 0x85, 0x08, 0x3f, 0xfd, - 0xf6, 0x05, 0x00, 0x55, 0x3a, 0xbc, 0x0e, 0x05, 0xcd, 0x02, 0x18, 0x4b, 0xdb, 0x89, 0xc4, 0xcc, - 0xd6, 0x7e, 0x18, 0x79, 0x51, 0x26, 0x7e, 0xb3, 0x28, - }, - pk: []byte{ - 0xdc, 0xea, 0x9e, 0x78, 0xf3, 0x5a, 0x1b, 0xf3, 0x49, 0x9a, 0x83, 0x1b, 0x10, 0xb8, 0x6c, 0x90, - 0xaa, 0xc0, 0x1c, 0xd8, 0x4b, 0x67, 0xa0, 0x10, 0x9b, 0x55, 0xa3, 0x6e, 0x93, 0x28, 0xb1, 0xe3, - 0x65, 0xfc, 0xe1, 0x61, 0xd7, 0x1c, 0xe7, 0x13, 0x1a, 0x54, 0x3e, 0xa4, 0xcb, 0x5f, 0x7e, 0x9f, - 0x1d, 0x8b, 0x00, 0x69, 0x64, 0x47, 0x00, 0x14, 0x00, - }, - msg: []byte{ - 0x0c, 0x3e, 0x54, 0x40, 0x74, 0xec, 0x63, 0xb0, 0x26, 0x5e, 0x0c, - }, - msgLen: 11, - ph: false, - sig: []byte{ - 0x1f, 0x0a, 0x88, 0x88, 0xce, 0x25, 0xe8, 0xd4, 0x58, 0xa2, 0x11, 0x30, 0x87, 0x9b, 0x84, 0x0a, - 0x90, 0x89, 0xd9, 0x99, 0xaa, 0xba, 0x03, 0x9e, 0xaf, 0x3e, 0x3a, 0xfa, 0x09, 0x0a, 0x09, 0xd3, - 0x89, 0xdb, 0xa8, 0x2c, 0x4f, 0xf2, 0xae, 0x8a, 0xc5, 0xcd, 0xfb, 0x7c, 0x55, 0xe9, 0x4d, 0x5d, - 0x96, 0x1a, 0x29, 0xfe, 0x01, 0x09, 0x94, 0x1e, 0x00, 0xb8, 0xdb, 0xde, 0xea, 0x6d, 0x3b, 0x05, - 0x10, 0x68, 0xdf, 0x72, 0x54, 0xc0, 0xcd, 0xc1, 0x29, 0xcb, 0xe6, 0x2d, 0xb2, 0xdc, 0x95, 0x7d, - 0xbb, 0x47, 0xb5, 0x1f, 0xd3, 0xf2, 0x13, 0xfb, 0x86, 0x98, 0xf0, 0x64, 0x77, 0x42, 0x50, 0xa5, - 0x02, 0x89, 0x61, 0xc9, 0xbf, 0x8f, 0xfd, 0x97, 0x3f, 0xe5, 0xd5, 0xc2, 0x06, 0x49, 0x2b, 0x14, - 0x0e, 0x00, - }, - ctx: []byte{}, - ctxLen: 0, - }, - { - name: "-----12 octets", - scheme: "Ed448Pure", - sk: []byte{ - 0x25, 0x8c, 0xdd, 0x4a, 0xda, 0x32, 0xed, 0x9c, 0x9f, 0xf5, 0x4e, 0x63, 0x75, 0x6a, 0xe5, 0x82, - 0xfb, 0x8f, 0xab, 0x2a, 0xc7, 0x21, 0xf2, 0xc8, 0xe6, 0x76, 0xa7, 0x27, 0x68, 0x51, 0x3d, 0x93, - 0x9f, 0x63, 0xdd, 0xdb, 0x55, 0x60, 0x91, 0x33, 0xf2, 0x9a, 0xdf, 0x86, 0xec, 0x99, 0x29, 0xdc, - 0xcb, 0x52, 0xc1, 0xc5, 0xfd, 0x2f, 0xf7, 0xe2, 0x1b, - }, - pk: []byte{ - 0x3b, 0xa1, 0x6d, 0xa0, 0xc6, 0xf2, 0xcc, 0x1f, 0x30, 0x18, 0x77, 0x40, 0x75, 0x6f, 0x5e, 0x79, - 0x8d, 0x6b, 0xc5, 0xfc, 0x01, 0x5d, 0x7c, 0x63, 0xcc, 0x95, 0x10, 0xee, 0x3f, 0xd4, 0x4a, 0xdc, - 0x24, 0xd8, 0xe9, 0x68, 0xb6, 0xe4, 0x6e, 0x6f, 0x94, 0xd1, 0x9b, 0x94, 0x53, 0x61, 0x72, 0x6b, - 0xd7, 0x5e, 0x14, 0x9e, 0xf0, 0x98, 0x17, 0xf5, 0x80, - }, - msg: []byte{ - 0x64, 0xa6, 0x5f, 0x3c, 0xde, 0xdc, 0xdd, 0x66, 0x81, 0x1e, 0x29, 0x15, - }, - msgLen: 12, - ph: false, - sig: []byte{ - 0x7e, 0xee, 0xab, 0x7c, 0x4e, 0x50, 0xfb, 0x79, 0x9b, 0x41, 0x8e, 0xe5, 0xe3, 0x19, 0x7f, 0xf6, - 0xbf, 0x15, 0xd4, 0x3a, 0x14, 0xc3, 0x43, 0x89, 0xb5, 0x9d, 0xd1, 0xa7, 0xb1, 0xb8, 0x5b, 0x4a, - 0xe9, 0x04, 0x38, 0xac, 0xa6, 0x34, 0xbe, 0xa4, 0x5e, 0x3a, 0x26, 0x95, 0xf1, 0x27, 0x0f, 0x07, - 0xfd, 0xcd, 0xf7, 0xc6, 0x2b, 0x8e, 0xfe, 0xaf, 0x00, 0xb4, 0x5c, 0x2c, 0x96, 0xba, 0x45, 0x7e, - 0xb1, 0xa8, 0xbf, 0x07, 0x5a, 0x3d, 0xb2, 0x8e, 0x5c, 0x24, 0xf6, 0xb9, 0x23, 0xed, 0x4a, 0xd7, - 0x47, 0xc3, 0xc9, 0xe0, 0x3c, 0x70, 0x79, 0xef, 0xb8, 0x7c, 0xb1, 0x10, 0xd3, 0xa9, 0x98, 0x61, - 0xe7, 0x20, 0x03, 0xcb, 0xae, 0x6d, 0x6b, 0x8b, 0x82, 0x7e, 0x4e, 0x6c, 0x14, 0x30, 0x64, 0xff, - 0x3c, 0x00, - }, - ctx: []byte{}, - ctxLen: 0, - }, - { - name: "-----13 octets", - scheme: "Ed448Pure", - sk: []byte{ - 0x7e, 0xf4, 0xe8, 0x45, 0x44, 0x23, 0x67, 0x52, 0xfb, 0xb5, 0x6b, 0x8f, 0x31, 0xa2, 0x3a, 0x10, - 0xe4, 0x28, 0x14, 0xf5, 0xf5, 0x5c, 0xa0, 0x37, 0xcd, 0xcc, 0x11, 0xc6, 0x4c, 0x9a, 0x3b, 0x29, - 0x49, 0xc1, 0xbb, 0x60, 0x70, 0x03, 0x14, 0x61, 0x17, 0x32, 0xa6, 0xc2, 0xfe, 0xa9, 0x8e, 0xeb, - 0xc0, 0x26, 0x6a, 0x11, 0xa9, 0x39, 0x70, 0x10, 0x0e, - }, - pk: []byte{ - 0xb3, 0xda, 0x07, 0x9b, 0x0a, 0xa4, 0x93, 0xa5, 0x77, 0x20, 0x29, 0xf0, 0x46, 0x7b, 0xae, 0xbe, - 0xe5, 0xa8, 0x11, 0x2d, 0x9d, 0x3a, 0x22, 0x53, 0x23, 0x61, 0xda, 0x29, 0x4f, 0x7b, 0xb3, 0x81, - 0x5c, 0x5d, 0xc5, 0x9e, 0x17, 0x6b, 0x4d, 0x9f, 0x38, 0x1c, 0xa0, 0x93, 0x8e, 0x13, 0xc6, 0xc0, - 0x7b, 0x17, 0x4b, 0xe6, 0x5d, 0xfa, 0x57, 0x8e, 0x80, - }, - msg: []byte{ - 0x64, 0xa6, 0x5f, 0x3c, 0xde, 0xdc, 0xdd, 0x66, 0x81, 0x1e, 0x29, 0x15, 0xe7, - }, - msgLen: 13, - ph: false, - sig: []byte{ - 0x6a, 0x12, 0x06, 0x6f, 0x55, 0x33, 0x1b, 0x6c, 0x22, 0xac, 0xd5, 0xd5, 0xbf, 0xc5, 0xd7, 0x12, - 0x28, 0xfb, 0xda, 0x80, 0xae, 0x8d, 0xec, 0x26, 0xbd, 0xd3, 0x06, 0x74, 0x3c, 0x50, 0x27, 0xcb, - 0x48, 0x90, 0x81, 0x0c, 0x16, 0x2c, 0x02, 0x74, 0x68, 0x67, 0x5e, 0xcf, 0x64, 0x5a, 0x83, 0x17, - 0x6c, 0x0d, 0x73, 0x23, 0xa2, 0xcc, 0xde, 0x2d, 0x80, 0xef, 0xe5, 0xa1, 0x26, 0x8e, 0x8a, 0xca, - 0x1d, 0x6f, 0xbc, 0x19, 0x4d, 0x3f, 0x77, 0xc4, 0x49, 0x86, 0xeb, 0x4a, 0xb4, 0x17, 0x79, 0x19, - 0xad, 0x8b, 0xec, 0x33, 0xeb, 0x47, 0xbb, 0xb5, 0xfc, 0x6e, 0x28, 0x19, 0x6f, 0xd1, 0xca, 0xf5, - 0x6b, 0x4e, 0x7e, 0x0b, 0xa5, 0x51, 0x92, 0x34, 0xd0, 0x47, 0x15, 0x5a, 0xc7, 0x27, 0xa1, 0x05, - 0x31, 0x00, - }, - ctx: []byte{}, - ctxLen: 0, - }, - { - name: "-----64 octets", - scheme: "Ed448Pure", - sk: []byte{ - 0xd6, 0x5d, 0xf3, 0x41, 0xad, 0x13, 0xe0, 0x08, 0x56, 0x76, 0x88, 0xba, 0xed, 0xda, 0x8e, 0x9d, - 0xcd, 0xc1, 0x7d, 0xc0, 0x24, 0x97, 0x4e, 0xa5, 0xb4, 0x22, 0x7b, 0x65, 0x30, 0xe3, 0x39, 0xbf, - 0xf2, 0x1f, 0x99, 0xe6, 0x8c, 0xa6, 0x96, 0x8f, 0x3c, 0xca, 0x6d, 0xfe, 0x0f, 0xb9, 0xf4, 0xfa, - 0xb4, 0xfa, 0x13, 0x5d, 0x55, 0x42, 0xea, 0x3f, 0x01, - }, - pk: []byte{ - 0xdf, 0x97, 0x05, 0xf5, 0x8e, 0xdb, 0xab, 0x80, 0x2c, 0x7f, 0x83, 0x63, 0xcf, 0xe5, 0x56, 0x0a, - 0xb1, 0xc6, 0x13, 0x2c, 0x20, 0xa9, 0xf1, 0xdd, 0x16, 0x34, 0x83, 0xa2, 0x6f, 0x8a, 0xc5, 0x3a, - 0x39, 0xd6, 0x80, 0x8b, 0xf4, 0xa1, 0xdf, 0xbd, 0x26, 0x1b, 0x09, 0x9b, 0xb0, 0x3b, 0x3f, 0xb5, - 0x09, 0x06, 0xcb, 0x28, 0xbd, 0x8a, 0x08, 0x1f, 0x00, - }, - msg: []byte{ - 0xbd, 0x0f, 0x6a, 0x37, 0x47, 0xcd, 0x56, 0x1b, 0xdd, 0xdf, 0x46, 0x40, 0xa3, 0x32, 0x46, 0x1a, - 0x4a, 0x30, 0xa1, 0x2a, 0x43, 0x4c, 0xd0, 0xbf, 0x40, 0xd7, 0x66, 0xd9, 0xc6, 0xd4, 0x58, 0xe5, - 0x51, 0x22, 0x04, 0xa3, 0x0c, 0x17, 0xd1, 0xf5, 0x0b, 0x50, 0x79, 0x63, 0x1f, 0x64, 0xeb, 0x31, - 0x12, 0x18, 0x2d, 0xa3, 0x00, 0x58, 0x35, 0x46, 0x11, 0x13, 0x71, 0x8d, 0x1a, 0x5e, 0xf9, 0x44, - }, - msgLen: 64, - ph: false, - sig: []byte{ - 0x55, 0x4b, 0xc2, 0x48, 0x08, 0x60, 0xb4, 0x9e, 0xab, 0x85, 0x32, 0xd2, 0xa5, 0x33, 0xb7, 0xd5, - 0x78, 0xef, 0x47, 0x3e, 0xeb, 0x58, 0xc9, 0x8b, 0xb2, 0xd0, 0xe1, 0xce, 0x48, 0x8a, 0x98, 0xb1, - 0x8d, 0xfd, 0xe9, 0xb9, 0xb9, 0x07, 0x75, 0xe6, 0x7f, 0x47, 0xd4, 0xa1, 0xc3, 0x48, 0x20, 0x58, - 0xef, 0xc9, 0xf4, 0x0d, 0x2c, 0xa0, 0x33, 0xa0, 0x80, 0x1b, 0x63, 0xd4, 0x5b, 0x3b, 0x72, 0x2e, - 0xf5, 0x52, 0xba, 0xd3, 0xb4, 0xcc, 0xb6, 0x67, 0xda, 0x35, 0x01, 0x92, 0xb6, 0x1c, 0x50, 0x8c, - 0xf7, 0xb6, 0xb5, 0xad, 0xad, 0xc2, 0xc8, 0xd9, 0xa4, 0x46, 0xef, 0x00, 0x3f, 0xb0, 0x5c, 0xba, - 0x5f, 0x30, 0xe8, 0x8e, 0x36, 0xec, 0x27, 0x03, 0xb3, 0x49, 0xca, 0x22, 0x9c, 0x26, 0x70, 0x83, - 0x39, 0x00, - }, - ctx: []byte{}, - ctxLen: 0, - }, - { - name: "-----256 octets", - scheme: "Ed448Pure", - sk: []byte{ - 0x2e, 0xc5, 0xfe, 0x3c, 0x17, 0x04, 0x5a, 0xbd, 0xb1, 0x36, 0xa5, 0xe6, 0xa9, 0x13, 0xe3, 0x2a, - 0xb7, 0x5a, 0xe6, 0x8b, 0x53, 0xd2, 0xfc, 0x14, 0x9b, 0x77, 0xe5, 0x04, 0x13, 0x2d, 0x37, 0x56, - 0x9b, 0x7e, 0x76, 0x6b, 0xa7, 0x4a, 0x19, 0xbd, 0x61, 0x62, 0x34, 0x3a, 0x21, 0xc8, 0x59, 0x0a, - 0xa9, 0xce, 0xbc, 0xa9, 0x01, 0x4c, 0x63, 0x6d, 0xf5, - }, - pk: []byte{ - 0x79, 0x75, 0x6f, 0x01, 0x4d, 0xcf, 0xe2, 0x07, 0x9f, 0x5d, 0xd9, 0xe7, 0x18, 0xbe, 0x41, 0x71, - 0xe2, 0xef, 0x24, 0x86, 0xa0, 0x8f, 0x25, 0x18, 0x6f, 0x6b, 0xff, 0x43, 0xa9, 0x93, 0x6b, 0x9b, - 0xfe, 0x12, 0x40, 0x2b, 0x08, 0xae, 0x65, 0x79, 0x8a, 0x3d, 0x81, 0xe2, 0x2e, 0x9e, 0xc8, 0x0e, - 0x76, 0x90, 0x86, 0x2e, 0xf3, 0xd4, 0xed, 0x3a, 0x00, - }, - msg: []byte{ - 0x15, 0x77, 0x75, 0x32, 0xb0, 0xbd, 0xd0, 0xd1, 0x38, 0x9f, 0x63, 0x6c, 0x5f, 0x6b, 0x9b, 0xa7, - 0x34, 0xc9, 0x0a, 0xf5, 0x72, 0x87, 0x7e, 0x2d, 0x27, 0x2d, 0xd0, 0x78, 0xaa, 0x1e, 0x56, 0x7c, - 0xfa, 0x80, 0xe1, 0x29, 0x28, 0xbb, 0x54, 0x23, 0x30, 0xe8, 0x40, 0x9f, 0x31, 0x74, 0x50, 0x41, - 0x07, 0xec, 0xd5, 0xef, 0xac, 0x61, 0xae, 0x75, 0x04, 0xda, 0xbe, 0x2a, 0x60, 0x2e, 0xde, 0x89, - 0xe5, 0xcc, 0xa6, 0x25, 0x7a, 0x7c, 0x77, 0xe2, 0x7a, 0x70, 0x2b, 0x3a, 0xe3, 0x9f, 0xc7, 0x69, - 0xfc, 0x54, 0xf2, 0x39, 0x5a, 0xe6, 0xa1, 0x17, 0x8c, 0xab, 0x47, 0x38, 0xe5, 0x43, 0x07, 0x2f, - 0xc1, 0xc1, 0x77, 0xfe, 0x71, 0xe9, 0x2e, 0x25, 0xbf, 0x03, 0xe4, 0xec, 0xb7, 0x2f, 0x47, 0xb6, - 0x4d, 0x04, 0x65, 0xaa, 0xea, 0x4c, 0x7f, 0xad, 0x37, 0x25, 0x36, 0xc8, 0xba, 0x51, 0x6a, 0x60, - 0x39, 0xc3, 0xc2, 0xa3, 0x9f, 0x0e, 0x4d, 0x83, 0x2b, 0xe4, 0x32, 0xdf, 0xa9, 0xa7, 0x06, 0xa6, - 0xe5, 0xc7, 0xe1, 0x9f, 0x39, 0x79, 0x64, 0xca, 0x42, 0x58, 0x00, 0x2f, 0x7c, 0x05, 0x41, 0xb5, - 0x90, 0x31, 0x6d, 0xbc, 0x56, 0x22, 0xb6, 0xb2, 0xa6, 0xfe, 0x7a, 0x4a, 0xbf, 0xfd, 0x96, 0x10, - 0x5e, 0xca, 0x76, 0xea, 0x7b, 0x98, 0x81, 0x6a, 0xf0, 0x74, 0x8c, 0x10, 0xdf, 0x04, 0x8c, 0xe0, - 0x12, 0xd9, 0x01, 0x01, 0x5a, 0x51, 0xf1, 0x89, 0xf3, 0x88, 0x81, 0x45, 0xc0, 0x36, 0x50, 0xaa, - 0x23, 0xce, 0x89, 0x4c, 0x3b, 0xd8, 0x89, 0xe0, 0x30, 0xd5, 0x65, 0x07, 0x1c, 0x59, 0xf4, 0x09, - 0xa9, 0x98, 0x1b, 0x51, 0x87, 0x8f, 0xd6, 0xfc, 0x11, 0x06, 0x24, 0xdc, 0xbc, 0xde, 0x0b, 0xf7, - 0xa6, 0x9c, 0xcc, 0xe3, 0x8f, 0xab, 0xdf, 0x86, 0xf3, 0xbe, 0xf6, 0x04, 0x48, 0x19, 0xde, 0x11, - }, - msgLen: 256, - ph: false, - sig: []byte{ - 0xc6, 0x50, 0xdd, 0xbb, 0x06, 0x01, 0xc1, 0x9c, 0xa1, 0x14, 0x39, 0xe1, 0x64, 0x0d, 0xd9, 0x31, - 0xf4, 0x3c, 0x51, 0x8e, 0xa5, 0xbe, 0xa7, 0x0d, 0x3d, 0xcd, 0xe5, 0xf4, 0x19, 0x1f, 0xe5, 0x3f, - 0x00, 0xcf, 0x96, 0x65, 0x46, 0xb7, 0x2b, 0xcc, 0x7d, 0x58, 0xbe, 0x2b, 0x9b, 0xad, 0xef, 0x28, - 0x74, 0x39, 0x54, 0xe3, 0xa4, 0x4a, 0x23, 0xf8, 0x80, 0xe8, 0xd4, 0xf1, 0xcf, 0xce, 0x2d, 0x7a, - 0x61, 0x45, 0x2d, 0x26, 0xda, 0x05, 0x89, 0x6f, 0x0a, 0x50, 0xda, 0x66, 0xa2, 0x39, 0xa8, 0xa1, - 0x88, 0xb6, 0xd8, 0x25, 0xb3, 0x30, 0x5a, 0xd7, 0x7b, 0x73, 0xfb, 0xac, 0x08, 0x36, 0xec, 0xc6, - 0x09, 0x87, 0xfd, 0x08, 0x52, 0x7c, 0x1a, 0x8e, 0x80, 0xd5, 0x82, 0x3e, 0x65, 0xca, 0xfe, 0x2a, - 0x3d, 0x00, - }, - ctx: []byte{}, - ctxLen: 0, - }, - { - name: "-----1023 octets", - scheme: "Ed448Pure", - sk: []byte{ - 0x87, 0x2d, 0x09, 0x37, 0x80, 0xf5, 0xd3, 0x73, 0x0d, 0xf7, 0xc2, 0x12, 0x66, 0x4b, 0x37, 0xb8, - 0xa0, 0xf2, 0x4f, 0x56, 0x81, 0x0d, 0xaa, 0x83, 0x82, 0xcd, 0x4f, 0xa3, 0xf7, 0x76, 0x34, 0xec, - 0x44, 0xdc, 0x54, 0xf1, 0xc2, 0xed, 0x9b, 0xea, 0x86, 0xfa, 0xfb, 0x76, 0x32, 0xd8, 0xbe, 0x19, - 0x9e, 0xa1, 0x65, 0xf5, 0xad, 0x55, 0xdd, 0x9c, 0xe8, - }, - pk: []byte{ - 0xa8, 0x1b, 0x2e, 0x8a, 0x70, 0xa5, 0xac, 0x94, 0xff, 0xdb, 0xcc, 0x9b, 0xad, 0xfc, 0x3f, 0xeb, - 0x08, 0x01, 0xf2, 0x58, 0x57, 0x8b, 0xb1, 0x14, 0xad, 0x44, 0xec, 0xe1, 0xec, 0x0e, 0x79, 0x9d, - 0xa0, 0x8e, 0xff, 0xb8, 0x1c, 0x5d, 0x68, 0x5c, 0x0c, 0x56, 0xf6, 0x4e, 0xec, 0xae, 0xf8, 0xcd, - 0xf1, 0x1c, 0xc3, 0x87, 0x37, 0x83, 0x8c, 0xf4, 0x00, - }, - msg: []byte{ - 0x6d, 0xdf, 0x80, 0x2e, 0x1a, 0xae, 0x49, 0x86, 0x93, 0x5f, 0x7f, 0x98, 0x1b, 0xa3, 0xf0, 0x35, - 0x1d, 0x62, 0x73, 0xc0, 0xa0, 0xc2, 0x2c, 0x9c, 0x0e, 0x83, 0x39, 0x16, 0x8e, 0x67, 0x54, 0x12, - 0xa3, 0xde, 0xbf, 0xaf, 0x43, 0x5e, 0xd6, 0x51, 0x55, 0x80, 0x07, 0xdb, 0x43, 0x84, 0xb6, 0x50, - 0xfc, 0xc0, 0x7e, 0x3b, 0x58, 0x6a, 0x27, 0xa4, 0xf7, 0xa0, 0x0a, 0xc8, 0xa6, 0xfe, 0xc2, 0xcd, - 0x86, 0xae, 0x4b, 0xf1, 0x57, 0x0c, 0x41, 0xe6, 0xa4, 0x0c, 0x93, 0x1d, 0xb2, 0x7b, 0x2f, 0xaa, - 0x15, 0xa8, 0xce, 0xdd, 0x52, 0xcf, 0xf7, 0x36, 0x2c, 0x4e, 0x6e, 0x23, 0xda, 0xec, 0x0f, 0xbc, - 0x3a, 0x79, 0xb6, 0x80, 0x6e, 0x31, 0x6e, 0xfc, 0xc7, 0xb6, 0x81, 0x19, 0xbf, 0x46, 0xbc, 0x76, - 0xa2, 0x60, 0x67, 0xa5, 0x3f, 0x29, 0x6d, 0xaf, 0xdb, 0xdc, 0x11, 0xc7, 0x7f, 0x77, 0x77, 0xe9, - 0x72, 0x66, 0x0c, 0xf4, 0xb6, 0xa9, 0xb3, 0x69, 0xa6, 0x66, 0x5f, 0x02, 0xe0, 0xcc, 0x9b, 0x6e, - 0xdf, 0xad, 0x13, 0x6b, 0x4f, 0xab, 0xe7, 0x23, 0xd2, 0x81, 0x3d, 0xb3, 0x13, 0x6c, 0xfd, 0xe9, - 0xb6, 0xd0, 0x44, 0x32, 0x2f, 0xee, 0x29, 0x47, 0x95, 0x2e, 0x03, 0x1b, 0x73, 0xab, 0x5c, 0x60, - 0x33, 0x49, 0xb3, 0x07, 0xbd, 0xc2, 0x7b, 0xc6, 0xcb, 0x8b, 0x8b, 0xbd, 0x7b, 0xd3, 0x23, 0x21, - 0x9b, 0x80, 0x33, 0xa5, 0x81, 0xb5, 0x9e, 0xad, 0xeb, 0xb0, 0x9b, 0x3c, 0x4f, 0x3d, 0x22, 0x77, - 0xd4, 0xf0, 0x34, 0x36, 0x24, 0xac, 0xc8, 0x17, 0x80, 0x47, 0x28, 0xb2, 0x5a, 0xb7, 0x97, 0x17, - 0x2b, 0x4c, 0x5c, 0x21, 0xa2, 0x2f, 0x9c, 0x78, 0x39, 0xd6, 0x43, 0x00, 0x23, 0x2e, 0xb6, 0x6e, - 0x53, 0xf3, 0x1c, 0x72, 0x3f, 0xa3, 0x7f, 0xe3, 0x87, 0xc7, 0xd3, 0xe5, 0x0b, 0xdf, 0x98, 0x13, - 0xa3, 0x0e, 0x5b, 0xb1, 0x2c, 0xf4, 0xcd, 0x93, 0x0c, 0x40, 0xcf, 0xb4, 0xe1, 0xfc, 0x62, 0x25, - 0x92, 0xa4, 0x95, 0x88, 0x79, 0x44, 0x94, 0xd5, 0x6d, 0x24, 0xea, 0x4b, 0x40, 0xc8, 0x9f, 0xc0, - 0x59, 0x6c, 0xc9, 0xeb, 0xb9, 0x61, 0xc8, 0xcb, 0x10, 0xad, 0xde, 0x97, 0x6a, 0x5d, 0x60, 0x2b, - 0x1c, 0x3f, 0x85, 0xb9, 0xb9, 0xa0, 0x01, 0xed, 0x3c, 0x6a, 0x4d, 0x3b, 0x14, 0x37, 0xf5, 0x20, - 0x96, 0xcd, 0x19, 0x56, 0xd0, 0x42, 0xa5, 0x97, 0xd5, 0x61, 0xa5, 0x96, 0xec, 0xd3, 0xd1, 0x73, - 0x5a, 0x8d, 0x57, 0x0e, 0xa0, 0xec, 0x27, 0x22, 0x5a, 0x2c, 0x4a, 0xaf, 0xf2, 0x63, 0x06, 0xd1, - 0x52, 0x6c, 0x1a, 0xf3, 0xca, 0x6d, 0x9c, 0xf5, 0xa2, 0xc9, 0x8f, 0x47, 0xe1, 0xc4, 0x6d, 0xb9, - 0xa3, 0x32, 0x34, 0xcf, 0xd4, 0xd8, 0x1f, 0x2c, 0x98, 0x53, 0x8a, 0x09, 0xeb, 0xe7, 0x69, 0x98, - 0xd0, 0xd8, 0xfd, 0x25, 0x99, 0x7c, 0x7d, 0x25, 0x5c, 0x6d, 0x66, 0xec, 0xe6, 0xfa, 0x56, 0xf1, - 0x11, 0x44, 0x95, 0x0f, 0x02, 0x77, 0x95, 0xe6, 0x53, 0x00, 0x8f, 0x4b, 0xd7, 0xca, 0x2d, 0xee, - 0x85, 0xd8, 0xe9, 0x0f, 0x3d, 0xc3, 0x15, 0x13, 0x0c, 0xe2, 0xa0, 0x03, 0x75, 0xa3, 0x18, 0xc7, - 0xc3, 0xd9, 0x7b, 0xe2, 0xc8, 0xce, 0x5b, 0x6d, 0xb4, 0x1a, 0x62, 0x54, 0xff, 0x26, 0x4f, 0xa6, - 0x15, 0x5b, 0xae, 0xe3, 0xb0, 0x77, 0x3c, 0x0f, 0x49, 0x7c, 0x57, 0x3f, 0x19, 0xbb, 0x4f, 0x42, - 0x40, 0x28, 0x1f, 0x0b, 0x1f, 0x4f, 0x7b, 0xe8, 0x57, 0xa4, 0xe5, 0x9d, 0x41, 0x6c, 0x06, 0xb4, - 0xc5, 0x0f, 0xa0, 0x9e, 0x18, 0x10, 0xdd, 0xc6, 0xb1, 0x46, 0x7b, 0xae, 0xac, 0x5a, 0x36, 0x68, - 0xd1, 0x1b, 0x6e, 0xca, 0xa9, 0x01, 0x44, 0x00, 0x16, 0xf3, 0x89, 0xf8, 0x0a, 0xcc, 0x4d, 0xb9, - 0x77, 0x02, 0x5e, 0x7f, 0x59, 0x24, 0x38, 0x8c, 0x7e, 0x34, 0x0a, 0x73, 0x2e, 0x55, 0x44, 0x40, - 0xe7, 0x65, 0x70, 0xf8, 0xdd, 0x71, 0xb7, 0xd6, 0x40, 0xb3, 0x45, 0x0d, 0x1f, 0xd5, 0xf0, 0x41, - 0x0a, 0x18, 0xf9, 0xa3, 0x49, 0x4f, 0x70, 0x7c, 0x71, 0x7b, 0x79, 0xb4, 0xbf, 0x75, 0xc9, 0x84, - 0x00, 0xb0, 0x96, 0xb2, 0x16, 0x53, 0xb5, 0xd2, 0x17, 0xcf, 0x35, 0x65, 0xc9, 0x59, 0x74, 0x56, - 0xf7, 0x07, 0x03, 0x49, 0x7a, 0x07, 0x87, 0x63, 0x82, 0x9b, 0xc0, 0x1b, 0xb1, 0xcb, 0xc8, 0xfa, - 0x04, 0xea, 0xdc, 0x9a, 0x6e, 0x3f, 0x66, 0x99, 0x58, 0x7a, 0x9e, 0x75, 0xc9, 0x4e, 0x5b, 0xab, - 0x00, 0x36, 0xe0, 0xb2, 0xe7, 0x11, 0x39, 0x2c, 0xff, 0x00, 0x47, 0xd0, 0xd6, 0xb0, 0x5b, 0xd2, - 0xa5, 0x88, 0xbc, 0x10, 0x97, 0x18, 0x95, 0x42, 0x59, 0xf1, 0xd8, 0x66, 0x78, 0xa5, 0x79, 0xa3, - 0x12, 0x0f, 0x19, 0xcf, 0xb2, 0x96, 0x3f, 0x17, 0x7a, 0xeb, 0x70, 0xf2, 0xd4, 0x84, 0x48, 0x26, - 0x26, 0x2e, 0x51, 0xb8, 0x02, 0x71, 0x27, 0x20, 0x68, 0xef, 0x5b, 0x38, 0x56, 0xfa, 0x85, 0x35, - 0xaa, 0x2a, 0x88, 0xb2, 0xd4, 0x1f, 0x2a, 0x0e, 0x2f, 0xda, 0x76, 0x24, 0xc2, 0x85, 0x02, 0x72, - 0xac, 0x4a, 0x2f, 0x56, 0x1f, 0x8f, 0x2f, 0x7a, 0x31, 0x8b, 0xfd, 0x5c, 0xaf, 0x96, 0x96, 0x14, - 0x9e, 0x4a, 0xc8, 0x24, 0xad, 0x34, 0x60, 0x53, 0x8f, 0xdc, 0x25, 0x42, 0x1b, 0xee, 0xc2, 0xcc, - 0x68, 0x18, 0x16, 0x2d, 0x06, 0xbb, 0xed, 0x0c, 0x40, 0xa3, 0x87, 0x19, 0x23, 0x49, 0xdb, 0x67, - 0xa1, 0x18, 0xba, 0xda, 0x6c, 0xd5, 0xab, 0x01, 0x40, 0xee, 0x27, 0x32, 0x04, 0xf6, 0x28, 0xaa, - 0xd1, 0xc1, 0x35, 0xf7, 0x70, 0x27, 0x9a, 0x65, 0x1e, 0x24, 0xd8, 0xc1, 0x4d, 0x75, 0xa6, 0x05, - 0x9d, 0x76, 0xb9, 0x6a, 0x6f, 0xd8, 0x57, 0xde, 0xf5, 0xe0, 0xb3, 0x54, 0xb2, 0x7a, 0xb9, 0x37, - 0xa5, 0x81, 0x5d, 0x16, 0xb5, 0xfa, 0xe4, 0x07, 0xff, 0x18, 0x22, 0x2c, 0x6d, 0x1e, 0xd2, 0x63, - 0xbe, 0x68, 0xc9, 0x5f, 0x32, 0xd9, 0x08, 0xbd, 0x89, 0x5c, 0xd7, 0x62, 0x07, 0xae, 0x72, 0x64, - 0x87, 0x56, 0x7f, 0x9a, 0x67, 0xda, 0xd7, 0x9a, 0xbe, 0xc3, 0x16, 0xf6, 0x83, 0xb1, 0x7f, 0x2d, - 0x02, 0xbf, 0x07, 0xe0, 0xac, 0x8b, 0x5b, 0xc6, 0x16, 0x2c, 0xf9, 0x46, 0x97, 0xb3, 0xc2, 0x7c, - 0xd1, 0xfe, 0xa4, 0x9b, 0x27, 0xf2, 0x3b, 0xa2, 0x90, 0x18, 0x71, 0x96, 0x25, 0x06, 0x52, 0x0c, - 0x39, 0x2d, 0xa8, 0xb6, 0xad, 0x0d, 0x99, 0xf7, 0x01, 0x3f, 0xbc, 0x06, 0xc2, 0xc1, 0x7a, 0x56, - 0x95, 0x00, 0xc8, 0xa7, 0x69, 0x64, 0x81, 0xc1, 0xcd, 0x33, 0xe9, 0xb1, 0x4e, 0x40, 0xb8, 0x2e, - 0x79, 0xa5, 0xf5, 0xdb, 0x82, 0x57, 0x1b, 0xa9, 0x7b, 0xae, 0x3a, 0xd3, 0xe0, 0x47, 0x95, 0x15, - 0xbb, 0x0e, 0x2b, 0x0f, 0x3b, 0xfc, 0xd1, 0xfd, 0x33, 0x03, 0x4e, 0xfc, 0x62, 0x45, 0xed, 0xdd, - 0x7e, 0xe2, 0x08, 0x6d, 0xda, 0xe2, 0x60, 0x0d, 0x8c, 0xa7, 0x3e, 0x21, 0x4e, 0x8c, 0x2b, 0x0b, - 0xdb, 0x2b, 0x04, 0x7c, 0x6a, 0x46, 0x4a, 0x56, 0x2e, 0xd7, 0x7b, 0x73, 0xd2, 0xd8, 0x41, 0xc4, - 0xb3, 0x49, 0x73, 0x55, 0x12, 0x57, 0x71, 0x3b, 0x75, 0x36, 0x32, 0xef, 0xba, 0x34, 0x81, 0x69, - 0xab, 0xc9, 0x0a, 0x68, 0xf4, 0x26, 0x11, 0xa4, 0x01, 0x26, 0xd7, 0xcb, 0x21, 0xb5, 0x86, 0x95, - 0x56, 0x81, 0x86, 0xf7, 0xe5, 0x69, 0xd2, 0xff, 0x0f, 0x9e, 0x74, 0x5d, 0x04, 0x87, 0xdd, 0x2e, - 0xb9, 0x97, 0xca, 0xfc, 0x5a, 0xbf, 0x9d, 0xd1, 0x02, 0xe6, 0x2f, 0xf6, 0x6c, 0xba, 0x87, - }, - msgLen: 1023, - ph: false, - sig: []byte{ - 0xe3, 0x01, 0x34, 0x5a, 0x41, 0xa3, 0x9a, 0x4d, 0x72, 0xff, 0xf8, 0xdf, 0x69, 0xc9, 0x80, 0x75, - 0xa0, 0xcc, 0x08, 0x2b, 0x80, 0x2f, 0xc9, 0xb2, 0xb6, 0xbc, 0x50, 0x3f, 0x92, 0x6b, 0x65, 0xbd, - 0xdf, 0x7f, 0x4c, 0x8f, 0x1c, 0xb4, 0x9f, 0x63, 0x96, 0xaf, 0xc8, 0xa7, 0x0a, 0xbe, 0x6d, 0x8a, - 0xef, 0x0d, 0xb4, 0x78, 0xd4, 0xc6, 0xb2, 0x97, 0x00, 0x76, 0xc6, 0xa0, 0x48, 0x4f, 0xe7, 0x6d, - 0x76, 0xb3, 0xa9, 0x76, 0x25, 0xd7, 0x9f, 0x1c, 0xe2, 0x40, 0xe7, 0xc5, 0x76, 0x75, 0x0d, 0x29, - 0x55, 0x28, 0x28, 0x6f, 0x71, 0x9b, 0x41, 0x3d, 0xe9, 0xad, 0xa3, 0xe8, 0xeb, 0x78, 0xed, 0x57, - 0x36, 0x03, 0xce, 0x30, 0xd8, 0xbb, 0x76, 0x17, 0x85, 0xdc, 0x30, 0xdb, 0xc3, 0x20, 0x86, 0x9e, - 0x1a, 0x00, - }, - ctx: []byte{}, - ctxLen: 0, - }, - { - name: "-----TEST abc", - scheme: "Ed448Ph", - sk: []byte{ - 0x83, 0x3f, 0xe6, 0x24, 0x09, 0x23, 0x7b, 0x9d, 0x62, 0xec, 0x77, 0x58, 0x75, 0x20, 0x91, 0x1e, - 0x9a, 0x75, 0x9c, 0xec, 0x1d, 0x19, 0x75, 0x5b, 0x7d, 0xa9, 0x01, 0xb9, 0x6d, 0xca, 0x3d, 0x42, - 0xef, 0x78, 0x22, 0xe0, 0xd5, 0x10, 0x41, 0x27, 0xdc, 0x05, 0xd6, 0xdb, 0xef, 0xde, 0x69, 0xe3, - 0xab, 0x2c, 0xec, 0x7c, 0x86, 0x7c, 0x6e, 0x2c, 0x49, - }, - pk: []byte{ - 0x25, 0x9b, 0x71, 0xc1, 0x9f, 0x83, 0xef, 0x77, 0xa7, 0xab, 0xd2, 0x65, 0x24, 0xcb, 0xdb, 0x31, - 0x61, 0xb5, 0x90, 0xa4, 0x8f, 0x7d, 0x17, 0xde, 0x3e, 0xe0, 0xba, 0x9c, 0x52, 0xbe, 0xb7, 0x43, - 0xc0, 0x94, 0x28, 0xa1, 0x31, 0xd6, 0xb1, 0xb5, 0x73, 0x03, 0xd9, 0x0d, 0x81, 0x32, 0xc2, 0x76, - 0xd5, 0xed, 0x3d, 0x5d, 0x01, 0xc0, 0xf5, 0x38, 0x80, - }, - msg: []byte{ - 0x61, 0x62, 0x63, - }, - msgLen: 3, - ph: true, - sig: []byte{ - 0x82, 0x2f, 0x69, 0x01, 0xf7, 0x48, 0x0f, 0x3d, 0x5f, 0x56, 0x2c, 0x59, 0x29, 0x94, 0xd9, 0x69, - 0x36, 0x02, 0x87, 0x56, 0x14, 0x48, 0x32, 0x56, 0x50, 0x56, 0x00, 0xbb, 0xc2, 0x81, 0xae, 0x38, - 0x1f, 0x54, 0xd6, 0xbc, 0xe2, 0xea, 0x91, 0x15, 0x74, 0x93, 0x2f, 0x52, 0xa4, 0xe6, 0xca, 0xdd, - 0x78, 0x76, 0x93, 0x75, 0xec, 0x3f, 0xfd, 0x1b, 0x80, 0x1a, 0x0d, 0x9b, 0x3f, 0x40, 0x30, 0xcd, - 0x43, 0x39, 0x64, 0xb6, 0x45, 0x7e, 0xa3, 0x94, 0x76, 0x51, 0x12, 0x14, 0xf9, 0x74, 0x69, 0xb5, - 0x7d, 0xd3, 0x2d, 0xbc, 0x56, 0x0a, 0x9a, 0x94, 0xd0, 0x0b, 0xff, 0x07, 0x62, 0x04, 0x64, 0xa3, - 0xad, 0x20, 0x3d, 0xf7, 0xdc, 0x7c, 0xe3, 0x60, 0xc3, 0xcd, 0x36, 0x96, 0xd9, 0xd9, 0xfa, 0xb9, - 0x0f, 0x00, - }, - ctx: []byte{}, - ctxLen: 0, - }, - { - name: "-----TEST abc (with context)", - scheme: "Ed448Ph", - sk: []byte{ - 0x83, 0x3f, 0xe6, 0x24, 0x09, 0x23, 0x7b, 0x9d, 0x62, 0xec, 0x77, 0x58, 0x75, 0x20, 0x91, 0x1e, - 0x9a, 0x75, 0x9c, 0xec, 0x1d, 0x19, 0x75, 0x5b, 0x7d, 0xa9, 0x01, 0xb9, 0x6d, 0xca, 0x3d, 0x42, - 0xef, 0x78, 0x22, 0xe0, 0xd5, 0x10, 0x41, 0x27, 0xdc, 0x05, 0xd6, 0xdb, 0xef, 0xde, 0x69, 0xe3, - 0xab, 0x2c, 0xec, 0x7c, 0x86, 0x7c, 0x6e, 0x2c, 0x49, - }, - pk: []byte{ - 0x25, 0x9b, 0x71, 0xc1, 0x9f, 0x83, 0xef, 0x77, 0xa7, 0xab, 0xd2, 0x65, 0x24, 0xcb, 0xdb, 0x31, - 0x61, 0xb5, 0x90, 0xa4, 0x8f, 0x7d, 0x17, 0xde, 0x3e, 0xe0, 0xba, 0x9c, 0x52, 0xbe, 0xb7, 0x43, - 0xc0, 0x94, 0x28, 0xa1, 0x31, 0xd6, 0xb1, 0xb5, 0x73, 0x03, 0xd9, 0x0d, 0x81, 0x32, 0xc2, 0x76, - 0xd5, 0xed, 0x3d, 0x5d, 0x01, 0xc0, 0xf5, 0x38, 0x80, - }, - msg: []byte{ - 0x61, 0x62, 0x63, - }, - msgLen: 3, - ph: true, - sig: []byte{ - 0xc3, 0x22, 0x99, 0xd4, 0x6e, 0xc8, 0xff, 0x02, 0xb5, 0x45, 0x40, 0x98, 0x28, 0x14, 0xdc, 0xe9, - 0xa0, 0x58, 0x12, 0xf8, 0x19, 0x62, 0xb6, 0x49, 0xd5, 0x28, 0x09, 0x59, 0x16, 0xa2, 0xaa, 0x48, - 0x10, 0x65, 0xb1, 0x58, 0x04, 0x23, 0xef, 0x92, 0x7e, 0xcf, 0x0a, 0xf5, 0x88, 0x8f, 0x90, 0xda, - 0x0f, 0x6a, 0x9a, 0x85, 0xad, 0x5d, 0xc3, 0xf2, 0x80, 0xd9, 0x12, 0x24, 0xba, 0x99, 0x11, 0xa3, - 0x65, 0x3d, 0x00, 0xe4, 0x84, 0xe2, 0xce, 0x23, 0x25, 0x21, 0x48, 0x1c, 0x86, 0x58, 0xdf, 0x30, - 0x4b, 0xb7, 0x74, 0x5a, 0x73, 0x51, 0x4c, 0xdb, 0x9b, 0xf3, 0xe1, 0x57, 0x84, 0xab, 0x71, 0x28, - 0x4f, 0x8d, 0x07, 0x04, 0xa6, 0x08, 0xc5, 0x4a, 0x6b, 0x62, 0xd9, 0x7b, 0xeb, 0x51, 0x1d, 0x13, - 0x21, 0x00, - }, - ctx: []byte{ - 0x66, 0x6f, 0x6f, - }, - ctxLen: 3, - }, -} - -func (v vector) isPure() bool { return v.scheme == "Ed448Pure" } -func (v vector) isPreHashed() bool { return v.scheme == "Ed448Ph" } -func (v vector) matchMsgLen() bool { return uint(len(v.msg)) == v.msgLen } -func (v vector) matchCtxLen() bool { return uint(len(v.ctx)) == v.ctxLen } - -func (v vector) testPublicKey(t *testing.T) { - keys := ed448.NewKeyFromSeed(v.sk) - got := keys.Public().(ed448.PublicKey) - want := v.pk - - if !bytes.Equal(got, want) { - test.ReportError(t, got, want, v.name) - } -} - -func (v vector) testSign(t *testing.T) { - private := ed448.NewKeyFromSeed(v.sk) - - var got []byte - - if v.ph { - got = ed448.SignPh(private, v.msg, string(v.ctx)) - } else { - got = ed448.Sign(private, v.msg, string(v.ctx)) - } - - want := v.sig - if !bytes.Equal(got, want) { - test.ReportError(t, got, want, v.name) - } -} - -func (v vector) testVerify(t *testing.T) { - var got bool - - if v.ph { - got = ed448.VerifyPh(v.pk, v.msg, v.sig, string(v.ctx)) - } else { - got = ed448.Verify(v.pk, v.msg, v.sig, string(v.ctx)) - } - - want := true - - if got != want { - test.ReportError(t, got, want, v.name) - } -} - -func TestEd448(t *testing.T) { - for _, v := range vectorsEd448 { - got := (v.isPure() || v.isPreHashed()) && v.matchMsgLen() && v.matchCtxLen() - want := true - if got != want { - test.ReportError(t, got, want, v.sk) - } - v.testPublicKey(t) - v.testSign(t) - v.testVerify(t) - } -} diff --git a/sign/ed448/signapi.go b/sign/ed448/signapi.go deleted file mode 100644 index 57e17c0d..00000000 --- a/sign/ed448/signapi.go +++ /dev/null @@ -1,87 +0,0 @@ -package ed448 - -import ( - "crypto/rand" - "encoding/asn1" - - "github.com/quantumcoinproject/circl/sign" -) - -var sch sign.Scheme = &scheme{} - -// Scheme returns a signature interface. -func Scheme() sign.Scheme { return sch } - -type scheme struct{} - -func (*scheme) Name() string { return "Ed448" } -func (*scheme) PublicKeySize() int { return PublicKeySize } -func (*scheme) PrivateKeySize() int { return PrivateKeySize } -func (*scheme) SignatureSize() int { return SignatureSize } -func (*scheme) SeedSize() int { return SeedSize } -func (*scheme) TLSIdentifier() uint { return 0x0808 } -func (*scheme) SupportsContext() bool { return true } -func (*scheme) Oid() asn1.ObjectIdentifier { - return asn1.ObjectIdentifier{1, 3, 101, 113} -} - -func (*scheme) GenerateKey() (sign.PublicKey, sign.PrivateKey, error) { - return GenerateKey(rand.Reader) -} - -func (*scheme) Sign( - sk sign.PrivateKey, - message []byte, - opts *sign.SignatureOpts, -) []byte { - priv, ok := sk.(PrivateKey) - if !ok { - panic(sign.ErrTypeMismatch) - } - ctx := "" - if opts != nil { - ctx = opts.Context - } - return Sign(priv, message, ctx) -} - -func (*scheme) Verify( - pk sign.PublicKey, - message, signature []byte, - opts *sign.SignatureOpts, -) bool { - pub, ok := pk.(PublicKey) - if !ok { - panic(sign.ErrTypeMismatch) - } - ctx := "" - if opts != nil { - ctx = opts.Context - } - return Verify(pub, message, signature, ctx) -} - -func (*scheme) DeriveKey(seed []byte) (sign.PublicKey, sign.PrivateKey) { - privateKey := NewKeyFromSeed(seed) - publicKey := make(PublicKey, PublicKeySize) - copy(publicKey, privateKey[SeedSize:]) - return publicKey, privateKey -} - -func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (sign.PublicKey, error) { - if len(buf) < PublicKeySize { - return nil, sign.ErrPubKeySize - } - pub := make(PublicKey, PublicKeySize) - copy(pub, buf[:PublicKeySize]) - return pub, nil -} - -func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (sign.PrivateKey, error) { - if len(buf) < PrivateKeySize { - return nil, sign.ErrPrivKeySize - } - priv := make(PrivateKey, PrivateKeySize) - copy(priv, buf[:PrivateKeySize]) - return priv, nil -} diff --git a/sign/ed448/testdata/wycheproof_Ed448.json b/sign/ed448/testdata/wycheproof_Ed448.json deleted file mode 100644 index 6d791044..00000000 --- a/sign/ed448/testdata/wycheproof_Ed448.json +++ /dev/null @@ -1,908 +0,0 @@ -{ - "algorithm" : "EDDSA", - "generatorVersion" : "0.8r12", - "numberOfTests" : 86, - "header" : [ - "Test vectors of type EddsaVerify are intended for testing", - "the verification of Eddsa signatures." - ], - "notes" : { - "SignatureMalleability" : "EdDSA signatures are non-malleable, if implemented accordingly. Failing to check the range of S allows to modify signatures. See RFC 8032, Section 5.2.7 and Section 8.4." - }, - "schema" : "eddsa_verify_schema.json", - "testGroups" : [ - { - "jwk" : { - "crv" : "Ed448", - "d" : "iDAeB2UY01N_kwLuD1Ij5LY-HwFgB9PC69_sX3CZfoEZxrrQrnuAP0h5HKjsVJqiobhi96UVkLnV", - "kid" : "none", - "kty" : "OKP", - "x" : "QZYQpTSvEn9YOwSBjNt_D_MAsCXy4BaCvK4z_Wkc7gOVEd8M3caQ7peEJuizjlDOWvfc-6UPcEwA" - }, - "key" : { - "curve" : "edwards448", - "keySize" : 448, - "pk" : "419610a534af127f583b04818cdb7f0ff300b025f2e01682bcae33fd691cee039511df0cddc690ee978426e8b38e50ce5af7dcfba50f704c00", - "sk" : "88301e076518d3537f9302ee0f5223e4b63e1f016007d3c2ebdfec5f70997e8119c6bad0ae7b803f48791ca8ec549aa2a1b862f7a51590b9d5", - "type" : "EDDSAKeyPair" - }, - "keyDer" : "3043300506032b6571033a00419610a534af127f583b04818cdb7f0ff300b025f2e01682bcae33fd691cee039511df0cddc690ee978426e8b38e50ce5af7dcfba50f704c00", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAQZYQpTSvEn9YOwSBjNt/D/MAsCXy4BaCvK4z/Wkc7gOVEd8M3caQ7peEJuizjlDOWvfc+6UPcEwA\n-----END PUBLIC KEY-----\n", - "type" : "EddsaVerify", - "tests" : [ - { - "tcId" : 1, - "comment" : "", - "msg" : "", - "sig" : "cf7953007666e12f73af9ec92e3e018da5ee5a8d5b17f5100a354c58f1d5f4bb37ab835c52f72374c72d612689149cf6d36a70db6dc5a6c400b597348e0e31e51e65bb144e63c892a367b4c055c036aa6cd7e728cdd2a098963bda863903e6dd025b5a5d891209f4e28537694804e50b0800", - "result" : "valid", - "flags" : [] - }, - { - "tcId" : 2, - "comment" : "", - "msg" : "78", - "sig" : "c56e94d5c9ca860c244f33db556bf6b3cec38b024b77604a35d6a07211b1316b9a027133c374b86f72665cc45ce01583a2e0f2775c6172da801acef168717cab1196cddfb149359dfef589756257cc2d6b02fc516d8d41b4adaa3f11428f41410ef0dc3c1b008d3d052173d4389508ed0100", - "result" : "valid", - "flags" : [] - }, - { - "tcId" : 3, - "comment" : "", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f28031d67d699a188a9ca46b4eabe2107aef237ca609cb462e24c91d25d286402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd982600", - "result" : "valid", - "flags" : [] - }, - { - "tcId" : 4, - "comment" : "", - "msg" : "48656c6c6f", - "sig" : "442e33780f199dd7bc71d1335f74df7f3a0ec789e21a175c1bffddb6e50091998d969ac8194b3acefb7702f6c222f84f7eeca3b80406f1fe80687915e7925bf52deb47b6b779e26d30eec7c5fef03580f280a089eefd0bacc9fbbb6a4d73a591d1671d192e6bbcfdb79ad3db5673a1263000", - "result" : "valid", - "flags" : [] - }, - { - "tcId" : 5, - "comment" : "", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff28060a05236fc9c1682b0e55b60a082c9a57bffe61ef4dda5ce65df539805122b3a09a05976d41ad68ab52df85428152c57da93531e5d16920e00", - "result" : "valid", - "flags" : [] - }, - { - "tcId" : 6, - "comment" : "", - "msg" : "000000000000000000000000", - "sig" : "a8ca64d1ab00eae77fd2854d8422db3ae12fca91c14f274f30a44df98590786ec4cbb96a9564fc1b9b16c22d2bd00aa65f0876323729f5ac809fb0b89a4d3f27afbabb596851d835173d60ea34e0875359f3d6adb13cef1395b7eaa5f9147583ff38b4deb183062874915bf194ae61072300", - "result" : "valid", - "flags" : [] - }, - { - "tcId" : 7, - "comment" : "", - "msg" : "6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", - "sig" : "b205d3e24ccef64c1e86f15f48ddfa682453503489475188b04a8f55860b3c8a9c01e6de820bb7d9b15daff8de25a4a870e987157a115ec1802da0d0606da12842ea7eab658b5eea6dd1f3a641a5174425578003cd318b8d6b8dcb4de954b5078d1912c578ad8281515d6df3672b94173f00", - "result" : "valid", - "flags" : [] - }, - { - "tcId" : 8, - "comment" : "", - "msg" : "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60", - "sig" : "3492ef66e5fdf1503e9e206c5c2f0d4b7891aad793575527d2251e0df1b97c2feac188bc382ce3c92c4bc36ba2695f32bedadd480eaa932300d0db1f9a9c60844d2ea5aea64933c7be46c4f9d21cb48b39eae23d08496de7ce9501197185cc5d4ff8aa4b018ce7ad321f6a7d778c4a070400", - "result" : "valid", - "flags" : [] - }, - { - "tcId" : 9, - "comment" : "", - "msg" : "ffffffffffffffffffffffffffffffff", - "sig" : "545e1905af1b5886552eaf78e17304c6f83fcfb3444df2d1ea056486db615e3bb29131bb0c1fd295364dc515dae581967148eb23c6c9012e806d3623baff00548c648e3cb3756aaaaf659f2fb7dd2e71c7611448593ca63f2a98913ab7f182e6820eaf1334e2745e0e7bc0dccab98de71600", - "result" : "valid", - "flags" : [] - }, - { - "tcId" : 10, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 11, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 12, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f24458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3f", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 13, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f34458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3f", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 14, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 15, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 16, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 17, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f24458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3f", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 18, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f34458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3f", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 19, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 20, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "f34458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 21, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "f34458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3f0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 22, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "f34458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3ff24458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3f", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 23, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "f34458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3ff34458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3f", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 24, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "f34458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 25, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 26, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 27, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffff24458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3f", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 28, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffff34458ab92c27823558fc58d72c26c219036d6ae49db4ec4e923ca7cffffffffffffffffffffffffffffffffffffffffffffffffffffff3f", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 29, - "comment" : "special values for r and s", - "msg" : "3f", - "sig" : "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 30, - "comment" : "empty signature", - "msg" : "54657374", - "sig" : "", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 31, - "comment" : "s missing", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f280", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 32, - "comment" : "signature too short", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f28031d67d699a188a9ca46b4eabe2107aef237ca609cb462e24c91d25d286402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd98", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 33, - "comment" : "signature too long", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f28031d67d699a188a9ca46b4eabe2107aef237ca609cb462e24c91d25d286402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd9826002020", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 34, - "comment" : "include pk in signature", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f28031d67d699a188a9ca46b4eabe2107aef237ca609cb462e24c91d25d286402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd982600419610a534af127f583b04818cdb7f0ff300b025f2e01682bcae33fd691cee039511df0cddc690ee978426e8b38e50ce5af7dcfba50f704c00", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 35, - "comment" : "prepending 0 byte to signature", - "msg" : "54657374", - "sig" : "005d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f28031d67d699a188a9ca46b4eabe2107aef237ca609cb462e24c91d25d286402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd982600", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 36, - "comment" : "prepending 0 byte to s", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f2800031d67d699a188a9ca46b4eabe2107aef237ca609cb462e24c91d25d286402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd982600", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 37, - "comment" : "appending 0 byte to signature", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f28031d67d699a188a9ca46b4eabe2107aef237ca609cb462e24c91d25d286402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd98260000", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 38, - "comment" : "removing 0 byte from signature", - "msg" : "5465737430", - "sig" : "dbd6384516ab6b0eb2d609414564ec217383b66040dfb0676128251ae24c1d7c179c21a9ee307dc13f8fe6550bc40187f093da85617bcf5d009d3ee8b798ad978b6e683bc4e911940ea82ea0b7e95dc24fe0b29e44663211892c2aaa3451379d22c289b94378f11fb700f1689d4a00d73e", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 39, - "comment" : "removing 0 byte from signature", - "msg" : "546573743535", - "sig" : "ce2b2fff0bf445a36813cf2a76e0cc5619a4f16ee53f0fe3cd46fc0414db7248b32fbda54bbb37e708d6238076ea12bf850b964b044520bb80fbaf0e1d1ed3bcab261462df5e7f2de73ac9cbae26dfa29015039acf90575961fc9b91b9ca276dae7d5fa805bd202c5579a0f4c66e801400", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 40, - "comment" : "dropping byte from signature", - "msg" : "546573743633", - "sig" : "c283ed36d78c275a5d02f7939aed2c4ef68320ae1bf6fc25e834b758046a6d52a480216a942dfe771f3bd307f4ce7d3f446e0824961bd5de80cda42b5cc38e6ec3d53f386978b9877d3c98a28ac8fc66630ffd178933a18de1aee23cab5011c9ff4c9277311b4c6c33acb8e82b8c693c00", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 41, - "comment" : "removing leading 0 byte from signature", - "msg" : "54657374333631", - "sig" : "62e629bd2b8f595df401c362c766216d45de89fceecd99c69d323b5c53ad5ac3ea7224963feba2f2895551d94f548248ef8597d2a959f880d59934a5e8f07847834d66ba1a6b09de5dba692172b13f768f0c29e8196144c130d2353445d63cbd0b690794fdad30a48e8bb7cc2504f80700", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 42, - "comment" : "modified bit 0 in R", - "msg" : "313233343030", - "sig" : "5cb94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff280afc33a525116cc12e0d1c3a1fde6de518a6544f360d0fe18d5be7770b057a2bf792db4b7648fa84a6eaecae909e33fa59c5dfe4804ba2623", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 43, - "comment" : "modified bit 1 in R", - "msg" : "313233343030", - "sig" : "5fb94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff280f91386c3e9dd9e7c9af7ca6bbef8b7a44ae3d68eeade449d7dfbb31de8419eb943e2ecbcdd06df5227e82b9ded519a56e70f0a1c0fc17b06", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 44, - "comment" : "modified bit 2 in R", - "msg" : "313233343030", - "sig" : "59b94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff280f1aab07b4ad069dfafc01b4532e1e44cbf7177e1bdda197fc87434046db5b935afd9114ac5e1138eaead23c3b59dba9026d2da4a86fe800b", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 45, - "comment" : "modified bit 7 in R", - "msg" : "313233343030", - "sig" : "ddb94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff2807668402b7b093fc754019324077c1f842a7d2e35adf7b87094115cec459ad5419e162988ef42b1988d9b944d9d5a7ce09c6f342afa500839", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 46, - "comment" : "modified bit 8 in R", - "msg" : "313233343030", - "sig" : "5db84c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff280279b70338586b9e13e669191cc0dfc2a937d50a6118758de04a4ca41f4877abdb971afa87fe4b83bc243b8dfd2cb368aa389a4cb11e83e31", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 47, - "comment" : "modified bit 16 in R", - "msg" : "313233343030", - "sig" : "5db94d53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff280c7b847556b3a6f9447483899ab730a23004c695054dd57b1c3214fa87f632f39c8ff1471f0532b8eee4154930e1ca30d574b8f9e85b0432b", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 48, - "comment" : "modified bit 31 in R", - "msg" : "313233343030", - "sig" : "5db94cd3101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff2800b017917472b130a1cc1c8e995a252617d5ddaf1f3d48930b4876fa0d2cfedec90a8c85c8274892a1ca3b6cfce63ebfebc307210b844ae0c", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 49, - "comment" : "modified bit 32 in R", - "msg" : "313233343030", - "sig" : "5db94c53111f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff2805f38f6371860fcc4f2ec515afd35cb05d8941e2448cc469a15b8537e758b16d46b123581613462c2bb20d8a07299ab795d0998e1e4277931", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 50, - "comment" : "modified bit 63 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f529f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff28017111ba6fefd45e2490f1d53a184007fa073470706d7f4a9606fcad2954e74c32116ba7701d225b76e55164e64df3245c1031f0df734bd31", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 51, - "comment" : "modified bit 64 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6d1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff2808d7d0aa1fd81d0e31789921771c654338f96f0b557b615e3da55670271608a0e022e4e8cf393e309f8f6412281b6147e7fce42b089eb1e0c", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 52, - "comment" : "modified bit 97 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ca4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff280b08d3be6ebf4e60bf6d74e105ea2fa9b965c62816bbd22ea3bb0c1acfd12300523ca76f94b6f789488a957fbeb212d713baccf95fd594f3d", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 53, - "comment" : "modified bit 127 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7606fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff280a23f54857e9b0f72b2ef90d2768834590464d75933ed08c454faa762b3702a2b631c33c339d05b2e24c20a8214f99af31f93f80f416a1129", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 54, - "comment" : "modified bit 240 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0881a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff280734bdc399273d3403d934ceaae16e87a68c6bff6b77d8037ff41c97922498a58e704c29ab519d41bab70735f71fc26f589361e2b21754300", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 55, - "comment" : "modified bit 247 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0800a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff280ba961cc8d0765c99d57470ee1c0c77f0a562a198fd0175eddb0c033e0fb8525328c5e2c516e2b00f73609c7f769195eb1a02ff54090d781f", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 56, - "comment" : "modified bit 248 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a97b8e55858df4cf2291a7303ffda446b82a117b4dd408cff280e72685907da9e5a64e4142ed02fc0c6bf95763201db5942aac055fa87e6fdd32e483fd21ed4110d5d7ef619b740fef2ad8a71fe821e42a2a", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 57, - "comment" : "modified bit 253 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880887b8e55858df4cf2291a7303ffda446b82a117b4dd408cff280500646d67c74f13471f0ad034da530f7238fe7897e532af8ec2977643a410b1d054934df567e170276389e66b3f3ccb3c15aed239d04f72b", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 58, - "comment" : "modified bit 254 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880e87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff2807bb153b8e350aa736a91c921217578539600c1299ab76522ef8f6902d79c93f274073ee6beafe6200ecaf59f7cd11bb1c833f24bf30ed52d", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 59, - "comment" : "modified bit 255 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880287b8e55858df4cf2291a7303ffda446b82a117b4dd408cff2804a67b22be599d6433b87ea961c82c457ab50f64ac6b7efb0b2f90988927f83742303c278f8248e02d5679b41ed505aba0fb51110d0def810", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 60, - "comment" : "modified bit 440 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff3807f452efb0cd97dab5506028b7b876830dee02a9c0cbd140dcde509638d4d546c30856b2151bdf79930df5bbb11f2beb66bcdc25ad75f2116", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 61, - "comment" : "modified bit 441 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff0808d78231bb3c9a87c5b8d168fe05f8197503a3d73a6d700f436b5a76ab866388baa6930191a077aca7970058932c88b7f9e6ecb13c89dcd1d", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 62, - "comment" : "modified bit 447 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cf72809e5a8406063fb3545f0fb627f841b2e3a85ad5d378018e8b58fe58e14ee5520d57abc9140e9c5a75a8b09ac3334dd0cad69b48771284321d", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 63, - "comment" : "modified bit 448 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff2811adf92201088e051ee48b57aecf46edfc68e5baeed5ae4910ba5681d370f75ab593811e18293ef0808581c254196bcbf2b4c454136a6711b", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 64, - "comment" : "modified bit 449 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff2825e06c3999e8308be439c40940b0075d3e4f65147c1608cbe6e9c432e33bed6686f9393ae2568f0ad60febcb4b6179c0d90d034e7c3c46810", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 65, - "comment" : "modified bit 454 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff2c02456bbd141df048dbf1843be6d5fef402483314c2af547b361a09f3319489eaede43404df9faf634c1298d678b5261c808b0be3726013e39", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 66, - "comment" : "modified bit 455 in R", - "msg" : "313233343030", - "sig" : "5db94c53101f521f6c1f43b60ea4d7e06fbd49c2e8afaf4fcc289e645e0880a87b8e55858df4cf2291a7303ffda446b82a117b4dd408cff2007106d2a896a7fec6dee53eea272d9b6e738c340295416b50f39a9463a5635450b9f93c4c06737affd42ae06cee5879c96c0bd58a91345503", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 67, - "comment" : "R==0", - "msg" : "313233343030", - "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027ab98ab862e4e7ec3361a45ac1993e9b47d9ac40db91faed752399cee0413122b47346594fd7d2c8949b43e4cabaf17d8339ea0e307023f", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 68, - "comment" : "invalid R", - "msg" : "313233343030", - "sig" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd11bae33a0999fd3fd2bed6fa5577685e8fd595e79c006e58fd35f69f91b1d853553fb4006019a07725aa37773883dbe12253812887ac828", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 69, - "comment" : "all bits flipped in R", - "msg" : "313233343030", - "sig" : "a246b3acefe0ade093e0bc49f15b281f9042b63d175050b033d7619ba1f77f578471aa7a720b30dd6e58cfc0025bb947d5ee84b22bf7300d7f334e48141af0fade1469f5dedb851c9e725d27bd65012bada05e70cde641aad9ce0bea4983164f73816b6f13095e6b93eb03e850cad0cf0d", - "result" : "invalid", - "flags" : [] - }, - { - "tcId" : 70, - "comment" : "checking malleability ", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f280241bd6142ddb02c0f9fa133955d3e610b4b27cb814227de8b241ef4e86402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd9866", - "result" : "invalid", - "flags" : [ - "SignatureMalleability" - ] - }, - { - "tcId" : 71, - "comment" : "checking malleability ", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f28017602ec0bf9d7be34e8ad9c6c795533244e952675efdcbac9c65b9cb85402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd98a6", - "result" : "invalid", - "flags" : [ - "SignatureMalleability" - ] - }, - { - "tcId" : 72, - "comment" : "checking malleability ", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f280fde9de16e5226d2af9a864e2ac1a2d756456ffc4f1b3693570ad4dc584402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd9826", - "result" : "invalid", - "flags" : [ - "SignatureMalleability" - ] - }, - { - "tcId" : 73, - "comment" : "checking malleability ", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f280c9fd3fc42f2d50b84de67a197724e0faa43058801821a546173d76b882402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd9826", - "result" : "invalid", - "flags" : [ - "SignatureMalleability" - ] - }, - { - "tcId" : 74, - "comment" : "checking malleability ", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f28031d67d699a188a9ca46b4eabe2107aef237ca609cb462e24c91d25d286402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd9866", - "result" : "invalid", - "flags" : [ - "SignatureMalleability" - ] - }, - { - "tcId" : 75, - "comment" : "checking malleability ", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f28031d67d699a188a9ca46b4eabe2107aef237ca609cb462e24c91d25d286402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd98a6", - "result" : "invalid", - "flags" : [ - "SignatureMalleability" - ] - }, - { - "tcId" : 76, - "comment" : "checking malleability ", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f28031d67d699a188a9ca46b4eabe2107aef237ca609cb462e24c91d25d286402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd9826", - "result" : "invalid", - "flags" : [ - "SignatureMalleability" - ] - }, - { - "tcId" : 77, - "comment" : "checking malleability ", - "msg" : "54657374", - "sig" : "5d053ff5b71f6ec3284525d35d77933178c8e19879886d08eccc6c7d27e9e5b5e02537dbc4d4723506e8d171fc1733857573dd02d18f48f28030d67d699a188a9ca46b4eabe2107aef237ca609cb462e24c91d25d285402b6ef7862b78a386950246ff38d6d2f458136d12e3c97fdd9826", - "result" : "invalid", - "flags" : [ - "SignatureMalleability" - ] - } - ] - }, - { - "jwk" : { - "crv" : "Ed448", - "d" : "bIKlYsuAjRDWMr6JyFE-v2ySnzTd-oyfY8mWDvbjSKNSjIo_zC8ETjmj_FuUSS-PAy51SaIAmPlb", - "kid" : "none", - "kty" : "OKP", - "x" : "X9dEm1m0Yf0s54fsYWrUah2hNCSFpw4fig6nXYDpZ3jt8SR2m0bHBhvWeD3x5Q9s0foavq_oJWGA" - }, - "key" : { - "curve" : "edwards448", - "keySize" : 448, - "pk" : "5fd7449b59b461fd2ce787ec616ad46a1da1342485a70e1f8a0ea75d80e96778edf124769b46c7061bd6783df1e50f6cd1fa1abeafe8256180", - "sk" : "6c82a562cb808d10d632be89c8513ebf6c929f34ddfa8c9f63c9960ef6e348a3528c8a3fcc2f044e39a3fc5b94492f8f032e7549a20098f95b", - "type" : "EDDSAKeyPair" - }, - "keyDer" : "3043300506032b6571033a005fd7449b59b461fd2ce787ec616ad46a1da1342485a70e1f8a0ea75d80e96778edf124769b46c7061bd6783df1e50f6cd1fa1abeafe8256180", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAX9dEm1m0Yf0s54fsYWrUah2hNCSFpw4fig6nXYDpZ3jt8SR2m0bHBhvWeD3x5Q9s0foavq/oJWGA\n-----END PUBLIC KEY-----\n", - "type" : "EddsaVerify", - "tests" : [ - { - "tcId" : 78, - "comment" : "RFC 8032", - "msg" : "", - "sig" : "533a37f6bbe457251f023c0d88f976ae2dfb504a843e34d2074fd823d41a591f2b233f034f628281f2fd7a22ddd47d7828c59bd0a21bfd3980ff0d2028d4b18a9df63e006c5d1c2d345b925d8dc00b4104852db99ac5c7cdda8530a113a0f4dbb61149f05a7363268c71d95808ff2e652600", - "result" : "valid", - "flags" : [] - } - ] - }, - { - "jwk" : { - "crv" : "Ed448", - "d" : "xOqwXTVwB8Yy89u0hImSTVUrCP4MNToNSh8ArNosRjr76mfF6NKHfF47w5emWZSe-AIelU4KEidO", - "kid" : "none", - "kty" : "OKP", - "x" : "Q7oo9DDN_0Vq5TFUX37NCsg0pV2TWMA3K_oMbGeYwIZq6gHrAHQoArhDjqTLghacI1FgYntMOpSA" - }, - "key" : { - "curve" : "edwards448", - "keySize" : 448, - "pk" : "43ba28f430cdff456ae531545f7ecd0ac834a55d9358c0372bfa0c6c6798c0866aea01eb00742802b8438ea4cb82169c235160627b4c3a9480", - "sk" : "c4eab05d357007c632f3dbb48489924d552b08fe0c353a0d4a1f00acda2c463afbea67c5e8d2877c5e3bc397a659949ef8021e954e0a12274e", - "type" : "EDDSAKeyPair" - }, - "keyDer" : "3043300506032b6571033a0043ba28f430cdff456ae531545f7ecd0ac834a55d9358c0372bfa0c6c6798c0866aea01eb00742802b8438ea4cb82169c235160627b4c3a9480", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAQ7oo9DDN/0Vq5TFUX37NCsg0pV2TWMA3K/oMbGeYwIZq6gHrAHQoArhDjqTLghacI1FgYntMOpSA\n-----END PUBLIC KEY-----\n", - "type" : "EddsaVerify", - "tests" : [ - { - "tcId" : 79, - "comment" : "RFC 8032: 1 octet", - "msg" : "03", - "sig" : "26b8f91727bd62897af15e41eb43c377efb9c610d48f2335cb0bd0087810f4352541b143c4b981b7e18f62de8ccdf633fc1bf037ab7cd779805e0dbcc0aae1cbcee1afb2e027df36bc04dcecbf154336c19f0af7e0a6472905e799f1953d2a0ff3348ab21aa4adafd1d234441cf807c03a00", - "result" : "valid", - "flags" : [] - }, - { - "tcId" : 80, - "comment" : "RFC 8032: 1 octet with context", - "msg" : "03", - "sig" : "d4f8f6131770dd46f40867d6fd5d5055de43541f8c5e35abbcd001b32a89f7d2151f7647f11d8ca2ae279fb842d607217fce6e042f6815ea000c85741de5c8da1144a6a1aba7f96de42505d7a7298524fda538fccbbb754f578c1cad10d54d0d5428407e85dcbc98a49155c13764e66c3c00", - "result" : "invalid", - "flags" : [] - } - ] - }, - { - "jwk" : { - "crv" : "Ed448", - "d" : "zSPST3FCdOdENDI3uTKQ9RH2Ql-Y5kRZ_yA-iYUIP_32BQBVOrwOBc0CGEvbicTM1n4YeVEmfrMo", - "kid" : "none", - "kty" : "OKP", - "x" : "3OqeePNaG_NJmoMbELhskKrAHNhLZ6AQm1WjbpMoseNl_OFh1xznExpUPqTLX36fHYsAaWRHABQA" - }, - "key" : { - "curve" : "edwards448", - "keySize" : 448, - "pk" : "dcea9e78f35a1bf3499a831b10b86c90aac01cd84b67a0109b55a36e9328b1e365fce161d71ce7131a543ea4cb5f7e9f1d8b00696447001400", - "sk" : "cd23d24f714274e744343237b93290f511f6425f98e64459ff203e8985083ffdf60500553abc0e05cd02184bdb89c4ccd67e187951267eb328", - "type" : "EDDSAKeyPair" - }, - "keyDer" : "3043300506032b6571033a00dcea9e78f35a1bf3499a831b10b86c90aac01cd84b67a0109b55a36e9328b1e365fce161d71ce7131a543ea4cb5f7e9f1d8b00696447001400", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoA3OqeePNaG/NJmoMbELhskKrAHNhLZ6AQm1WjbpMoseNl/OFh1xznExpUPqTLX36fHYsAaWRHABQA\n-----END PUBLIC KEY-----\n", - "type" : "EddsaVerify", - "tests" : [ - { - "tcId" : 81, - "comment" : "RFC 8032: 11 bytes", - "msg" : "0c3e544074ec63b0265e0c", - "sig" : "1f0a8888ce25e8d458a21130879b840a9089d999aaba039eaf3e3afa090a09d389dba82c4ff2ae8ac5cdfb7c55e94d5d961a29fe0109941e00b8dbdeea6d3b051068df7254c0cdc129cbe62db2dc957dbb47b51fd3f213fb8698f064774250a5028961c9bf8ffd973fe5d5c206492b140e00", - "result" : "valid", - "flags" : [] - } - ] - }, - { - "jwk" : { - "crv" : "Ed448", - "d" : "JYzdStoy7Zyf9U5jdWrlgvuPqyrHIfLI5nanJ2hRPZOfY93bVWCRM_Ka34bsmSncy1LBxf0v9-Ib", - "kid" : "none", - "kty" : "OKP", - "x" : "O6FtoMbyzB8wGHdAdW9eeY1rxfwBXXxjzJUQ7j_UStwk2OlotuRub5TRm5RTYXJr114UnvCYF_WA" - }, - "key" : { - "curve" : "edwards448", - "keySize" : 448, - "pk" : "3ba16da0c6f2cc1f30187740756f5e798d6bc5fc015d7c63cc9510ee3fd44adc24d8e968b6e46e6f94d19b945361726bd75e149ef09817f580", - "sk" : "258cdd4ada32ed9c9ff54e63756ae582fb8fab2ac721f2c8e676a72768513d939f63dddb55609133f29adf86ec9929dccb52c1c5fd2ff7e21b", - "type" : "EDDSAKeyPair" - }, - "keyDer" : "3043300506032b6571033a003ba16da0c6f2cc1f30187740756f5e798d6bc5fc015d7c63cc9510ee3fd44adc24d8e968b6e46e6f94d19b945361726bd75e149ef09817f580", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAO6FtoMbyzB8wGHdAdW9eeY1rxfwBXXxjzJUQ7j/UStwk2OlotuRub5TRm5RTYXJr114UnvCYF/WA\n-----END PUBLIC KEY-----\n", - "type" : "EddsaVerify", - "tests" : [ - { - "tcId" : 82, - "comment" : "RFC 8032: 12 bytes", - "msg" : "64a65f3cdedcdd66811e2915", - "sig" : "7eeeab7c4e50fb799b418ee5e3197ff6bf15d43a14c34389b59dd1a7b1b85b4ae90438aca634bea45e3a2695f1270f07fdcdf7c62b8efeaf00b45c2c96ba457eb1a8bf075a3db28e5c24f6b923ed4ad747c3c9e03c7079efb87cb110d3a99861e72003cbae6d6b8b827e4e6c143064ff3c00", - "result" : "valid", - "flags" : [] - } - ] - }, - { - "jwk" : { - "crv" : "Ed448", - "d" : "fvToRUQjZ1L7tWuPMaI6EOQoFPX1XKA3zcwRxkyaOylJwbtgcAMUYRcypsL-qY7rwCZqEak5cBAO", - "kid" : "none", - "kty" : "OKP", - "x" : "s9oHmwqkk6V3ICnwRnuuvuWoES2dOiJTI2HaKU97s4FcXcWeF2tNnzgcoJOOE8bAexdL5l36V46A" - }, - "key" : { - "curve" : "edwards448", - "keySize" : 448, - "pk" : "b3da079b0aa493a5772029f0467baebee5a8112d9d3a22532361da294f7bb3815c5dc59e176b4d9f381ca0938e13c6c07b174be65dfa578e80", - "sk" : "7ef4e84544236752fbb56b8f31a23a10e42814f5f55ca037cdcc11c64c9a3b2949c1bb60700314611732a6c2fea98eebc0266a11a93970100e", - "type" : "EDDSAKeyPair" - }, - "keyDer" : "3043300506032b6571033a00b3da079b0aa493a5772029f0467baebee5a8112d9d3a22532361da294f7bb3815c5dc59e176b4d9f381ca0938e13c6c07b174be65dfa578e80", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAs9oHmwqkk6V3ICnwRnuuvuWoES2dOiJTI2HaKU97s4FcXcWeF2tNnzgcoJOOE8bAexdL5l36V46A\n-----END PUBLIC KEY-----\n", - "type" : "EddsaVerify", - "tests" : [ - { - "tcId" : 83, - "comment" : "RFC 8032: 13 bytes", - "msg" : "64a65f3cdedcdd66811e2915e7", - "sig" : "6a12066f55331b6c22acd5d5bfc5d71228fbda80ae8dec26bdd306743c5027cb4890810c162c027468675ecf645a83176c0d7323a2ccde2d80efe5a1268e8aca1d6fbc194d3f77c44986eb4ab4177919ad8bec33eb47bbb5fc6e28196fd1caf56b4e7e0ba5519234d047155ac727a1053100", - "result" : "valid", - "flags" : [] - } - ] - }, - { - "jwk" : { - "crv" : "Ed448", - "d" : "1l3zQa0T4AhWdoi67dqOnc3BfcAkl06ltCJ7ZTDjOb_yH5nmjKaWjzzKbf4PufT6tPoTXVVC6j8B", - "kid" : "none", - "kty" : "OKP", - "x" : "35cF9Y7bq4Asf4Njz-VWCrHGEywgqfHdFjSDom-KxTo51oCL9KHfvSYbCZuwOz-1CQbLKL2KCB8A" - }, - "key" : { - "curve" : "edwards448", - "keySize" : 448, - "pk" : "df9705f58edbab802c7f8363cfe5560ab1c6132c20a9f1dd163483a26f8ac53a39d6808bf4a1dfbd261b099bb03b3fb50906cb28bd8a081f00", - "sk" : "d65df341ad13e008567688baedda8e9dcdc17dc024974ea5b4227b6530e339bff21f99e68ca6968f3cca6dfe0fb9f4fab4fa135d5542ea3f01", - "type" : "EDDSAKeyPair" - }, - "keyDer" : "3043300506032b6571033a00df9705f58edbab802c7f8363cfe5560ab1c6132c20a9f1dd163483a26f8ac53a39d6808bf4a1dfbd261b099bb03b3fb50906cb28bd8a081f00", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoA35cF9Y7bq4Asf4Njz+VWCrHGEywgqfHdFjSDom+KxTo51oCL9KHfvSYbCZuwOz+1CQbLKL2KCB8A\n-----END PUBLIC KEY-----\n", - "type" : "EddsaVerify", - "tests" : [ - { - "tcId" : 84, - "comment" : "RFC 8032: 64 bytes", - "msg" : "bd0f6a3747cd561bdddf4640a332461a4a30a12a434cd0bf40d766d9c6d458e5512204a30c17d1f50b5079631f64eb3112182da3005835461113718d1a5ef944", - "sig" : "554bc2480860b49eab8532d2a533b7d578ef473eeb58c98bb2d0e1ce488a98b18dfde9b9b90775e67f47d4a1c3482058efc9f40d2ca033a0801b63d45b3b722ef552bad3b4ccb667da350192b61c508cf7b6b5adadc2c8d9a446ef003fb05cba5f30e88e36ec2703b349ca229c2670833900", - "result" : "valid", - "flags" : [] - } - ] - }, - { - "jwk" : { - "crv" : "Ed448", - "d" : "LsX-PBcEWr2xNqXmqRPjKrda5otT0vwUm3flBBMtN1abfnZrp0oZvWFiNDohyFkKqc68qQFMY231", - "kid" : "none", - "kty" : "OKP", - "x" : "eXVvAU3P4gefXdnnGL5BceLvJIagjyUYb2v_Q6mTa5v-EkArCK5leYo9geIunsgOdpCGLvPU7ToA" - }, - "key" : { - "curve" : "edwards448", - "keySize" : 448, - "pk" : "79756f014dcfe2079f5dd9e718be4171e2ef2486a08f25186f6bff43a9936b9bfe12402b08ae65798a3d81e22e9ec80e7690862ef3d4ed3a00", - "sk" : "2ec5fe3c17045abdb136a5e6a913e32ab75ae68b53d2fc149b77e504132d37569b7e766ba74a19bd6162343a21c8590aa9cebca9014c636df5", - "type" : "EDDSAKeyPair" - }, - "keyDer" : "3043300506032b6571033a0079756f014dcfe2079f5dd9e718be4171e2ef2486a08f25186f6bff43a9936b9bfe12402b08ae65798a3d81e22e9ec80e7690862ef3d4ed3a00", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAeXVvAU3P4gefXdnnGL5BceLvJIagjyUYb2v/Q6mTa5v+EkArCK5leYo9geIunsgOdpCGLvPU7ToA\n-----END PUBLIC KEY-----\n", - "type" : "EddsaVerify", - "tests" : [ - { - "tcId" : 85, - "comment" : "RFC 8032: 256 bytes", - "msg" : "15777532b0bdd0d1389f636c5f6b9ba734c90af572877e2d272dd078aa1e567cfa80e12928bb542330e8409f3174504107ecd5efac61ae7504dabe2a602ede89e5cca6257a7c77e27a702b3ae39fc769fc54f2395ae6a1178cab4738e543072fc1c177fe71e92e25bf03e4ecb72f47b64d0465aaea4c7fad372536c8ba516a6039c3c2a39f0e4d832be432dfa9a706a6e5c7e19f397964ca4258002f7c0541b590316dbc5622b6b2a6fe7a4abffd96105eca76ea7b98816af0748c10df048ce012d901015a51f189f3888145c03650aa23ce894c3bd889e030d565071c59f409a9981b51878fd6fc110624dcbcde0bf7a69ccce38fabdf86f3bef6044819de11", - "sig" : "c650ddbb0601c19ca11439e1640dd931f43c518ea5bea70d3dcde5f4191fe53f00cf966546b72bcc7d58be2b9badef28743954e3a44a23f880e8d4f1cfce2d7a61452d26da05896f0a50da66a239a8a188b6d825b3305ad77b73fbac0836ecc60987fd08527c1a8e80d5823e65cafe2a3d00", - "result" : "valid", - "flags" : [] - } - ] - }, - { - "jwk" : { - "crv" : "Ed448", - "d" : "hy0JN4D103MN98ISZks3uKDyT1aBDaqDgs1Po_d2NOxE3FTxwu2b6ob6-3Yy2L4ZnqFl9a1V3Zzo", - "kid" : "none", - "kty" : "OKP", - "x" : "qBsuinClrJT_28ybrfw_6wgB8lhXi7EUrUTs4ewOeZ2gjv-4HF1oXAxW9k7srvjN8RzDhzeDjPQA" - }, - "key" : { - "curve" : "edwards448", - "keySize" : 448, - "pk" : "a81b2e8a70a5ac94ffdbcc9badfc3feb0801f258578bb114ad44ece1ec0e799da08effb81c5d685c0c56f64eecaef8cdf11cc38737838cf400", - "sk" : "872d093780f5d3730df7c212664b37b8a0f24f56810daa8382cd4fa3f77634ec44dc54f1c2ed9bea86fafb7632d8be199ea165f5ad55dd9ce8", - "type" : "EDDSAKeyPair" - }, - "keyDer" : "3043300506032b6571033a00a81b2e8a70a5ac94ffdbcc9badfc3feb0801f258578bb114ad44ece1ec0e799da08effb81c5d685c0c56f64eecaef8cdf11cc38737838cf400", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAqBsuinClrJT/28ybrfw/6wgB8lhXi7EUrUTs4ewOeZ2gjv+4HF1oXAxW9k7srvjN8RzDhzeDjPQA\n-----END PUBLIC KEY-----\n", - "type" : "EddsaVerify", - "tests" : [ - { - "tcId" : 86, - "comment" : "RFC 8032: 1023 bytes", - "msg" : "6ddf802e1aae4986935f7f981ba3f0351d6273c0a0c22c9c0e8339168e675412a3debfaf435ed651558007db4384b650fcc07e3b586a27a4f7a00ac8a6fec2cd86ae4bf1570c41e6a40c931db27b2faa15a8cedd52cff7362c4e6e23daec0fbc3a79b6806e316efcc7b68119bf46bc76a26067a53f296dafdbdc11c77f7777e972660cf4b6a9b369a6665f02e0cc9b6edfad136b4fabe723d2813db3136cfde9b6d044322fee2947952e031b73ab5c603349b307bdc27bc6cb8b8bbd7bd323219b8033a581b59eadebb09b3c4f3d2277d4f0343624acc817804728b25ab797172b4c5c21a22f9c7839d64300232eb66e53f31c723fa37fe387c7d3e50bdf9813a30e5bb12cf4cd930c40cfb4e1fc622592a49588794494d56d24ea4b40c89fc0596cc9ebb961c8cb10adde976a5d602b1c3f85b9b9a001ed3c6a4d3b1437f52096cd1956d042a597d561a596ecd3d1735a8d570ea0ec27225a2c4aaff26306d1526c1af3ca6d9cf5a2c98f47e1c46db9a33234cfd4d81f2c98538a09ebe76998d0d8fd25997c7d255c6d66ece6fa56f11144950f027795e653008f4bd7ca2dee85d8e90f3dc315130ce2a00375a318c7c3d97be2c8ce5b6db41a6254ff264fa6155baee3b0773c0f497c573f19bb4f4240281f0b1f4f7be857a4e59d416c06b4c50fa09e1810ddc6b1467baeac5a3668d11b6ecaa901440016f389f80acc4db977025e7f5924388c7e340a732e554440e76570f8dd71b7d640b3450d1fd5f0410a18f9a3494f707c717b79b4bf75c98400b096b21653b5d217cf3565c9597456f70703497a078763829bc01bb1cbc8fa04eadc9a6e3f6699587a9e75c94e5bab0036e0b2e711392cff0047d0d6b05bd2a588bc109718954259f1d86678a579a3120f19cfb2963f177aeb70f2d4844826262e51b80271272068ef5b3856fa8535aa2a88b2d41f2a0e2fda7624c2850272ac4a2f561f8f2f7a318bfd5caf9696149e4ac824ad3460538fdc25421beec2cc6818162d06bbed0c40a387192349db67a118bada6cd5ab0140ee273204f628aad1c135f770279a651e24d8c14d75a6059d76b96a6fd857def5e0b354b27ab937a5815d16b5fae407ff18222c6d1ed263be68c95f32d908bd895cd76207ae726487567f9a67dad79abec316f683b17f2d02bf07e0ac8b5bc6162cf94697b3c27cd1fea49b27f23ba2901871962506520c392da8b6ad0d99f7013fbc06c2c17a569500c8a7696481c1cd33e9b14e40b82e79a5f5db82571ba97bae3ad3e0479515bb0e2b0f3bfcd1fd33034efc6245eddd7ee2086ddae2600d8ca73e214e8c2b0bdb2b047c6a464a562ed77b73d2d841c4b34973551257713b753632efba348169abc90a68f42611a40126d7cb21b58695568186f7e569d2ff0f9e745d0487dd2eb997cafc5abf9dd102e62ff66cba87", - "sig" : "e301345a41a39a4d72fff8df69c98075a0cc082b802fc9b2b6bc503f926b65bddf7f4c8f1cb49f6396afc8a70abe6d8aef0db478d4c6b2970076c6a0484fe76d76b3a97625d79f1ce240e7c576750d295528286f719b413de9ada3e8eb78ed573603ce30d8bb761785dc30dbc320869e1a00", - "result" : "valid", - "flags" : [] - } - ] - } - ] -} diff --git a/sign/ed448/wycheproof_test.go b/sign/ed448/wycheproof_test.go deleted file mode 100644 index 8ba8589f..00000000 --- a/sign/ed448/wycheproof_test.go +++ /dev/null @@ -1,116 +0,0 @@ -package ed448_test - -import ( - "bytes" - "encoding/hex" - "encoding/json" - "io" - "os" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/sign/ed448" -) - -type group struct { - Key struct { - Curve string `json:"curve"` - Size int `json:"keySize"` - Pk string `json:"pk"` - Sk string `json:"sk"` - Type string `json:"type"` - } `json:"key"` - Type string `json:"type"` - Tests []struct { - TcID int `json:"tcId"` - Comment string `json:"comment"` - Msg string `json:"msg"` - Sig string `json:"sig"` - Result string `json:"result"` - Flags []string `json:"flags"` - } `json:"tests"` -} - -type Wycheproof struct { - Alg string `json:"algorithm"` - Version string `json:"generatorVersion"` - Num int `json:"numberOfTests"` - Groups []group `json:"testGroups"` -} - -func (kat *Wycheproof) readFile(t *testing.T, fileName string) { - jsonFile, err := os.Open(fileName) - if err != nil { - t.Fatalf("File %v can not be opened. Error: %v", fileName, err) - } - defer jsonFile.Close() - input, err := io.ReadAll(jsonFile) - if err != nil { - t.Fatalf("File %v can not be read. Error: %v", fileName, err) - } - - err = json.Unmarshal(input, &kat) - if err != nil { - t.Fatalf("File %v can not be loaded. Error: %v", fileName, err) - } -} - -func (kat *Wycheproof) keyPair(t *testing.T) { - for i, g := range kat.Groups { - if g.Key.Curve != "edwards448" { - t.Errorf("Curve not expected %v", g.Key.Curve) - } - private, _ := hex.DecodeString(g.Key.Sk) - public, _ := hex.DecodeString(g.Key.Pk) - keys := ed448.NewKeyFromSeed(private) - got := keys.Public().(ed448.PublicKey) - want := public - - if !bytes.Equal(got, want) { - test.ReportError(t, got, want, i, g.Key.Sk) - } - } -} - -func (kat *Wycheproof) verify(t *testing.T) { - ctx := []byte{} - - for i, g := range kat.Groups { - for _, gT := range g.Tests { - isValid := gT.Result == "valid" - private, _ := hex.DecodeString(g.Key.Sk) - public, _ := hex.DecodeString(g.Key.Pk) - sig, _ := hex.DecodeString(gT.Sig) - msg, _ := hex.DecodeString(gT.Msg) - - priv := ed448.NewKeyFromSeed(private) - got := priv.Public().(ed448.PublicKey) - want := public - if !bytes.Equal(got, want) { - test.ReportError(t, got, want, i, gT.TcID) - } - if isValid { - got := ed448.Sign(priv, msg, string(ctx)) - want := sig - if !bytes.Equal(got, want) { - test.ReportError(t, got, want, i, gT.TcID) - } - } - { - got := ed448.Verify(priv.Public().(ed448.PublicKey), msg, sig, string(ctx)) - want := isValid - if got != want { - test.ReportError(t, got, want, i, gT.TcID) - } - } - } - } -} - -func TestWycheproof(t *testing.T) { - // Test vectors from Wycheproof v0.4.12 - var kat Wycheproof - kat.readFile(t, "testdata/wycheproof_Ed448.json") - t.Run("EDDSAKeyPair", kat.keyPair) - t.Run("EDDSAVerify", kat.verify) -} diff --git a/sign/eddilithium2/eddilithium.go b/sign/eddilithium2/eddilithium.go deleted file mode 100644 index c8ffb737..00000000 --- a/sign/eddilithium2/eddilithium.go +++ /dev/null @@ -1,239 +0,0 @@ -// Package eddilithium2 implements the hybrid signature scheme Ed25519-Dilithium2. -package eddilithium2 - -import ( - "crypto" - cryptoRand "crypto/rand" - "errors" - "io" - - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/sign" - "github.com/quantumcoinproject/circl/sign/dilithium/mode2" - "github.com/quantumcoinproject/circl/sign/ed25519" -) - -const ( - // SeedSize is the length of the seed for NewKeyFromSeed - SeedSize = mode2.SeedSize // = ed25519.SeedSize = 32 - - // PublicKeySize is the length in bytes of the packed public key. - PublicKeySize = mode2.PublicKeySize + ed25519.PublicKeySize - - // PrivateKeySize is the length in bytes of the packed public key. - PrivateKeySize = mode2.PrivateKeySize + ed25519.SeedSize - - // SignatureSize is the length in bytes of the signatures. - SignatureSize = mode2.SignatureSize + ed25519.SignatureSize -) - -// PublicKey is the type of an EdDilithium2 public key. -type PublicKey struct { - e ed25519.PublicKey - d mode2.PublicKey -} - -// PrivateKey is the type of an EdDilithium2 private key. -type PrivateKey struct { - e ed25519.PrivateKey - d mode2.PrivateKey -} - -// GenerateKey generates a public/private key pair using entropy from rand. -// If rand is nil, crypto/rand.Reader will be used. -func GenerateKey(rand io.Reader) (*PublicKey, *PrivateKey, error) { - var seed [SeedSize]byte - if rand == nil { - rand = cryptoRand.Reader - } - _, err := io.ReadFull(rand, seed[:]) - if err != nil { - return nil, nil, err - } - - pk, sk := NewKeyFromSeed(&seed) - return pk, sk, nil -} - -// NewKeyFromSeed derives a public/private key pair using the given seed. -func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { - var seed1 [32]byte - var seed2 [ed25519.SeedSize]byte - - // Internally, Ed25519 and Dilithium hash the seeds they are passed again - // with different hash functions, so it would be safe to use exactly the - // same seed for Ed25519 and Dilithium here. However, in general, when - // combining any two signature schemes it might not be the case that this - // is safe. Setting a bad example here isn't worth the tiny gain in - // performance. - - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - _, _ = h.Read(seed1[:]) - _, _ = h.Read(seed2[:]) - dpk, dsk := mode2.NewKeyFromSeed(&seed1) - esk := ed25519.NewKeyFromSeed(seed2[:]) - - return &PublicKey{esk.Public().(ed25519.PublicKey), *dpk}, &PrivateKey{esk, *dsk} -} - -// SignTo signs the given message and writes the signature into signature. -// It will panic if signature is not of length at least SignatureSize. -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { - mode2.SignTo( - &sk.d, - msg, - signature[:mode2.SignatureSize], - ) - esig := ed25519.Sign( - sk.e, - msg, - ) - copy(signature[mode2.SignatureSize:], esig[:]) -} - -// Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { - if !mode2.Verify( - &pk.d, - msg, - signature[:mode2.SignatureSize], - ) { - return false - } - if !ed25519.Verify( - pk.e, - msg, - signature[mode2.SignatureSize:], - ) { - return false - } - return true -} - -// Unpack unpacks pk to the public key encoded in buf. -func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { - var tmp [mode2.PublicKeySize]byte - copy(tmp[:], buf[:mode2.PublicKeySize]) - pk.d.Unpack(&tmp) - pk.e = make([]byte, ed25519.PublicKeySize) - copy(pk.e, buf[mode2.PublicKeySize:]) -} - -// Unpack sets sk to the private key encoded in buf. -func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { - var tmp [mode2.PrivateKeySize]byte - copy(tmp[:], buf[:mode2.PrivateKeySize]) - sk.d.Unpack(&tmp) - sk.e = ed25519.NewKeyFromSeed(buf[mode2.PrivateKeySize:]) -} - -// Pack packs the public key into buf. -func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { - var tmp [mode2.PublicKeySize]byte - pk.d.Pack(&tmp) - copy(buf[:mode2.PublicKeySize], tmp[:]) - copy(buf[mode2.PublicKeySize:], pk.e) -} - -// Pack packs the private key into buf. -func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { - var tmp [mode2.PrivateKeySize]byte - sk.d.Pack(&tmp) - copy(buf[:mode2.PrivateKeySize], tmp[:]) - copy(buf[mode2.PrivateKeySize:], sk.e.Seed()) -} - -// Bytes packs the public key. -func (pk *PublicKey) Bytes() []byte { - return append(pk.d.Bytes(), pk.e...) -} - -// Bytes packs the private key. -func (sk *PrivateKey) Bytes() []byte { - return append(sk.d.Bytes(), sk.e.Seed()...) -} - -// MarshalBinary packs the public key. -func (pk *PublicKey) MarshalBinary() ([]byte, error) { - return pk.Bytes(), nil -} - -// MarshalBinary packs the private key. -func (sk *PrivateKey) MarshalBinary() ([]byte, error) { - return sk.Bytes(), nil -} - -// UnmarshalBinary the public key from data. -func (pk *PublicKey) UnmarshalBinary(data []byte) error { - if len(data) != PublicKeySize { - return errors.New("packed public key must be of eddilithium2.PublicKeySize bytes") - } - var buf [PublicKeySize]byte - copy(buf[:], data) - pk.Unpack(&buf) - return nil -} - -// UnmarshalBinary unpacks the private key from data. -func (sk *PrivateKey) UnmarshalBinary(data []byte) error { - if len(data) != PrivateKeySize { - return errors.New("packed private key must be of eddilithium2.PrivateKeySize bytes") - } - var buf [PrivateKeySize]byte - copy(buf[:], data) - sk.Unpack(&buf) - return nil -} - -func (sk *PrivateKey) Scheme() sign.Scheme { return sch } -func (pk *PublicKey) Scheme() sign.Scheme { return sch } - -func (sk *PrivateKey) Equal(other crypto.PrivateKey) bool { - castOther, ok := other.(*PrivateKey) - if !ok { - return false - } - return castOther.e.Equal(sk.e) && castOther.d.Equal(&sk.d) -} - -func (pk *PublicKey) Equal(other crypto.PublicKey) bool { - castOther, ok := other.(*PublicKey) - if !ok { - return false - } - return castOther.e.Equal(pk.e) && castOther.d.Equal(&pk.d) -} - -// Sign signs the given message. -// -// opts.HashFunc() must return zero, which can be achieved by passing -// crypto.Hash(0) for opts. rand is ignored. Will only return an error -// if opts.HashFunc() is non-zero. -// -// This function is used to make PrivateKey implement the crypto.Signer -// interface. The package-level SignTo function might be more convenient -// to use. -func (sk *PrivateKey) Sign( - rand io.Reader, msg []byte, opts crypto.SignerOpts, -) (signature []byte, err error) { - var sig [SignatureSize]byte - - if opts.HashFunc() != crypto.Hash(0) { - return nil, errors.New("eddilithium2: cannot sign hashed message") - } - - SignTo(sk, msg, sig[:]) - return sig[:], nil -} - -// Public computes the public key corresponding to this private key. -// -// Returns a *PublicKey. The type crypto.PublicKey is used to make -// PrivateKey implement the crypto.Signer interface. -func (sk *PrivateKey) Public() crypto.PublicKey { - return &PublicKey{ - sk.e.Public().(ed25519.PublicKey), - *sk.d.Public().(*mode2.PublicKey), - } -} diff --git a/sign/eddilithium2/eddilithium_test.go b/sign/eddilithium2/eddilithium_test.go deleted file mode 100644 index 219199e5..00000000 --- a/sign/eddilithium2/eddilithium_test.go +++ /dev/null @@ -1,109 +0,0 @@ -package eddilithium2_test - -import ( - "encoding/binary" - "testing" - - "github.com/quantumcoinproject/circl/sign/eddilithium2" -) - -func BenchmarkVerify(b *testing.B) { - // Note that Dilithium precomputes quite a bit during Unpacking/Keygen - // instead of at the moment of verification (as compared to the reference - // implementation. A fair comparison thus should sum verification - // times with unpacking times.) - var seed [32]byte - var msg [8]byte - var sig [eddilithium2.SignatureSize]byte - pk, sk := eddilithium2.NewKeyFromSeed(&seed) - eddilithium2.SignTo(sk, msg[:], sig[:]) - b.ResetTimer() - for i := 0; i < b.N; i++ { - // We should generate a new signature for every verify attempt, - // as this influences the time a little bit. This difference, however, - // is small and generating a new signature in between creates a lot - // pressure on the allocator which makes an accurate measurement hard. - eddilithium2.Verify(pk, msg[:], sig[:]) - } -} - -func BenchmarkSign(b *testing.B) { - // Note that Dilithium precomputes quite a bit during Unpacking/Keygen - // instead of at the moment of signing (as compared to the reference - // implementation. A fair comparison thus should sum sign times with - // unpacking times.) - var seed [32]byte - var msg [8]byte - var sig [eddilithium2.SignatureSize]byte - _, sk := eddilithium2.NewKeyFromSeed(&seed) - b.ResetTimer() - for i := 0; i < b.N; i++ { - binary.LittleEndian.PutUint64(msg[:], uint64(i)) - eddilithium2.SignTo(sk, msg[:], sig[:]) - } -} - -func BenchmarkGenerateKey(b *testing.B) { - var seed [32]byte - for i := 0; i < b.N; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - eddilithium2.NewKeyFromSeed(&seed) - } -} - -func BenchmarkPublicFromPrivate(b *testing.B) { - var seed [32]byte - for i := 0; i < b.N; i++ { - b.StopTimer() - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - _, sk := eddilithium2.NewKeyFromSeed(&seed) - b.StartTimer() - sk.Public() - } -} - -func TestSignThenVerifyAndPkSkPacking(t *testing.T) { - var seed [eddilithium2.SeedSize]byte - var sig [eddilithium2.SignatureSize]byte - var msg [8]byte - var pkb [eddilithium2.PublicKeySize]byte - var skb [eddilithium2.PrivateKeySize]byte - var pk2 eddilithium2.PublicKey - var sk2 eddilithium2.PrivateKey - for i := uint64(0); i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], i) - pk, sk := eddilithium2.NewKeyFromSeed(&seed) - for j := uint64(0); j < 10; j++ { - binary.LittleEndian.PutUint64(msg[:], j) - eddilithium2.SignTo(sk, msg[:], sig[:]) - if !eddilithium2.Verify(pk, msg[:], sig[:]) { - t.Fatal() - } - } - pk.Pack(&pkb) - pk2.Unpack(&pkb) - if !pk.Equal(&pk2) { - t.Fatal() - } - sk.Pack(&skb) - sk2.Unpack(&skb) - if !sk.Equal(&sk2) { - t.Fatal() - } - } -} - -func TestPublicFromPrivate(t *testing.T) { - var seed [eddilithium2.SeedSize]byte - for i := uint64(0); i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], i) - pk, sk := eddilithium2.NewKeyFromSeed(&seed) - pk2 := sk.Public().(*eddilithium2.PublicKey) - var pkb1, pkb2 [eddilithium2.PublicKeySize]byte - pk.Pack(&pkb1) - pk2.Pack(&pkb2) - if pkb1 != pkb2 { - t.Fatal() - } - } -} diff --git a/sign/eddilithium2/example_test.go b/sign/eddilithium2/example_test.go deleted file mode 100644 index c262e18d..00000000 --- a/sign/eddilithium2/example_test.go +++ /dev/null @@ -1,45 +0,0 @@ -package eddilithium2_test - -import ( - "fmt" - - "github.com/quantumcoinproject/circl/sign/eddilithium2" -) - -func Example() { - // Generates a keypair. - pk, sk, err := eddilithium2.GenerateKey(nil) - if err != nil { - panic(err) - } - - // (Alternatively one can derive a keypair from a seed, - // see NewKeyFromSeed().) - - // Packs public and private key - var packedSk [eddilithium2.PrivateKeySize]byte - var packedPk [eddilithium2.PublicKeySize]byte - sk.Pack(&packedSk) - pk.Pack(&packedPk) - - // Load it again - var sk2 eddilithium2.PrivateKey - var pk2 eddilithium2.PublicKey - sk2.Unpack(&packedSk) - pk2.Unpack(&packedPk) - - // Creates a signature on our message with the generated private key. - msg := []byte("Some message") - var signature [eddilithium2.SignatureSize]byte - eddilithium2.SignTo(&sk2, msg, signature[:]) - - // Checks whether a signature is correct - if !eddilithium2.Verify(&pk2, msg, signature[:]) { - panic("incorrect signature") - } - - fmt.Printf("O.K.") - - // Output: - // O.K. -} diff --git a/sign/eddilithium2/signapi.go b/sign/eddilithium2/signapi.go deleted file mode 100644 index d3d543ae..00000000 --- a/sign/eddilithium2/signapi.go +++ /dev/null @@ -1,93 +0,0 @@ -package eddilithium2 - -import ( - "crypto/rand" - "encoding/asn1" - - "github.com/quantumcoinproject/circl/sign" -) - -var sch sign.Scheme = &scheme{} - -// Scheme returns a signature interface. -func Scheme() sign.Scheme { return sch } - -type scheme struct{} - -func (*scheme) Name() string { return "Ed25519-Dilithium2" } -func (*scheme) PublicKeySize() int { return PublicKeySize } -func (*scheme) PrivateKeySize() int { return PrivateKeySize } -func (*scheme) SignatureSize() int { return SignatureSize } -func (*scheme) SeedSize() int { return SeedSize } -func (*scheme) TLSIdentifier() uint { return 0xfe61 /* temp*/ } -func (*scheme) SupportsContext() bool { return false } -func (*scheme) Oid() asn1.ObjectIdentifier { - return asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 44363, 45, 9} -} - -func (*scheme) GenerateKey() (sign.PublicKey, sign.PrivateKey, error) { - return GenerateKey(rand.Reader) -} - -func (*scheme) Sign( - sk sign.PrivateKey, - message []byte, - opts *sign.SignatureOpts, -) []byte { - priv, ok := sk.(*PrivateKey) - if !ok { - panic(sign.ErrTypeMismatch) - } - if opts != nil && opts.Context != "" { - panic(sign.ErrContextNotSupported) - } - var sig [SignatureSize]byte - SignTo(priv, message, sig[:]) - return sig[:] -} - -func (*scheme) Verify( - pk sign.PublicKey, - message, signature []byte, - opts *sign.SignatureOpts, -) bool { - pub, ok := pk.(*PublicKey) - if !ok { - panic(sign.ErrTypeMismatch) - } - if opts != nil && opts.Context != "" { - panic(sign.ErrContextNotSupported) - } - return Verify(pub, message, signature) -} - -func (*scheme) DeriveKey(seed []byte) (sign.PublicKey, sign.PrivateKey) { - if len(seed) != SeedSize { - panic(sign.ErrSeedSize) - } - var tmp [SeedSize]byte - copy(tmp[:], seed) - return NewKeyFromSeed(&tmp) -} - -func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (sign.PublicKey, error) { - if len(buf) != PublicKeySize { - return nil, sign.ErrPubKeySize - } - var tmp [PublicKeySize]byte - copy(tmp[:], buf) - var ret PublicKey - ret.Unpack(&tmp) - return &ret, nil -} - -func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (sign.PrivateKey, error) { - if len(buf) != PrivateKeySize { - return nil, sign.ErrPrivKeySize - } - var tmp [PrivateKeySize]byte - copy(tmp[:], buf) - var ret PrivateKey - ret.Unpack(&tmp) - return &ret, nil -} diff --git a/sign/eddilithium3/eddilithium.go b/sign/eddilithium3/eddilithium.go deleted file mode 100644 index b0a78ce4..00000000 --- a/sign/eddilithium3/eddilithium.go +++ /dev/null @@ -1,234 +0,0 @@ -// Package eddilithium3 implements the hybrid signature scheme Ed448-Dilithium3. -package eddilithium3 - -import ( - "crypto" - cryptoRand "crypto/rand" - "errors" - "io" - - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/sign" - "github.com/quantumcoinproject/circl/sign/dilithium/mode3" - "github.com/quantumcoinproject/circl/sign/ed448" -) - -const ( - // SeedSize is the length of the seed for NewKeyFromSeed - SeedSize = ed448.SeedSize // > mode3.SeedSize - - // PublicKeySize is the length in bytes of the packed public key. - PublicKeySize = mode3.PublicKeySize + ed448.PublicKeySize - - // PrivateKeySize is the length in bytes of the packed public key. - PrivateKeySize = mode3.PrivateKeySize + ed448.SeedSize - - // SignatureSize is the length in bytes of the signatures. - SignatureSize = mode3.SignatureSize + ed448.SignatureSize -) - -// PublicKey is the type of an EdDilithium3 public key. -type PublicKey struct { - e ed448.PublicKey - d mode3.PublicKey -} - -// PrivateKey is the type of an EdDilithium3 private key. -type PrivateKey struct { - e ed448.PrivateKey - d mode3.PrivateKey -} - -// GenerateKey generates a public/private key pair using entropy from rand. -// If rand is nil, crypto/rand.Reader will be used. -func GenerateKey(rand io.Reader) (*PublicKey, *PrivateKey, error) { - var seed [SeedSize]byte - if rand == nil { - rand = cryptoRand.Reader - } - _, err := io.ReadFull(rand, seed[:]) - if err != nil { - return nil, nil, err - } - - pk, sk := NewKeyFromSeed(&seed) - return pk, sk, nil -} - -// NewKeyFromSeed derives a public/private key pair using the given seed. -func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { - var seed1 [32]byte - var seed2 [ed448.SeedSize]byte - - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - _, _ = h.Read(seed1[:]) - _, _ = h.Read(seed2[:]) - dpk, dsk := mode3.NewKeyFromSeed(&seed1) - esk := ed448.NewKeyFromSeed(seed2[:]) - - return &PublicKey{esk.Public().(ed448.PublicKey), *dpk}, &PrivateKey{esk, *dsk} -} - -// SignTo signs the given message and writes the signature into signature. -// It will panic if signature is not of length at least SignatureSize. -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { - mode3.SignTo( - &sk.d, - msg, - signature[:mode3.SignatureSize], - ) - esig := ed448.Sign( - sk.e, - msg, - "", - ) - copy(signature[mode3.SignatureSize:], esig[:]) -} - -// Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { - if !mode3.Verify( - &pk.d, - msg, - signature[:mode3.SignatureSize], - ) { - return false - } - if !ed448.Verify( - pk.e, - msg, - signature[mode3.SignatureSize:], - "", - ) { - return false - } - return true -} - -// Unpack unpacks pk to the public key encoded in buf. -func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { - var tmp [mode3.PublicKeySize]byte - copy(tmp[:], buf[:mode3.PublicKeySize]) - pk.d.Unpack(&tmp) - pk.e = make([]byte, ed448.PublicKeySize) - copy(pk.e, buf[mode3.PublicKeySize:]) -} - -// Unpack sets sk to the private key encoded in buf. -func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { - var tmp [mode3.PrivateKeySize]byte - copy(tmp[:], buf[:mode3.PrivateKeySize]) - sk.d.Unpack(&tmp) - sk.e = ed448.NewKeyFromSeed(buf[mode3.PrivateKeySize:]) -} - -// Pack packs the public key into buf. -func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { - var tmp [mode3.PublicKeySize]byte - pk.d.Pack(&tmp) - copy(buf[:mode3.PublicKeySize], tmp[:]) - copy(buf[mode3.PublicKeySize:], pk.e) -} - -// Pack packs the private key into buf. -func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { - var tmp [mode3.PrivateKeySize]byte - sk.d.Pack(&tmp) - copy(buf[:mode3.PrivateKeySize], tmp[:]) - copy(buf[mode3.PrivateKeySize:], sk.e.Seed()) -} - -// Bytes packs the public key. -func (pk *PublicKey) Bytes() []byte { - return append(pk.d.Bytes(), pk.e...) -} - -// Bytes packs the private key. -func (sk *PrivateKey) Bytes() []byte { - return append(sk.d.Bytes(), sk.e.Seed()...) -} - -// MarshalBinary packs the public key. -func (pk *PublicKey) MarshalBinary() ([]byte, error) { - return pk.Bytes(), nil -} - -// MarshalBinary packs the private key. -func (sk *PrivateKey) MarshalBinary() ([]byte, error) { - return sk.Bytes(), nil -} - -// UnmarshalBinary the public key from data. -func (pk *PublicKey) UnmarshalBinary(data []byte) error { - if len(data) != PublicKeySize { - return errors.New("packed public key must be of eddilithium3.PublicKeySize bytes") - } - var buf [PublicKeySize]byte - copy(buf[:], data) - pk.Unpack(&buf) - return nil -} - -// UnmarshalBinary unpacks the private key from data. -func (sk *PrivateKey) UnmarshalBinary(data []byte) error { - if len(data) != PrivateKeySize { - return errors.New("packed private key must be of eddilithium3.PrivateKeySize bytes") - } - var buf [PrivateKeySize]byte - copy(buf[:], data) - sk.Unpack(&buf) - return nil -} - -func (sk *PrivateKey) Scheme() sign.Scheme { return sch } -func (pk *PublicKey) Scheme() sign.Scheme { return sch } - -func (sk *PrivateKey) Equal(other crypto.PrivateKey) bool { - castOther, ok := other.(*PrivateKey) - if !ok { - return false - } - return castOther.e.Equal(sk.e) && castOther.d.Equal(&sk.d) -} - -func (pk *PublicKey) Equal(other crypto.PublicKey) bool { - castOther, ok := other.(*PublicKey) - if !ok { - return false - } - return castOther.e.Equal(pk.e) && castOther.d.Equal(&pk.d) -} - -// Sign signs the given message. -// -// opts.HashFunc() must return zero, which can be achieved by passing -// crypto.Hash(0) for opts. rand is ignored. Will only return an error -// if opts.HashFunc() is non-zero. -// -// This function is used to make PrivateKey implement the crypto.Signer -// interface. The package-level SignTo function might be more convenient -// to use. -func (sk *PrivateKey) Sign( - rand io.Reader, msg []byte, opts crypto.SignerOpts, -) (signature []byte, err error) { - var sig [SignatureSize]byte - - if opts.HashFunc() != crypto.Hash(0) { - return nil, errors.New("eddilithium3: cannot sign hashed message") - } - - SignTo(sk, msg, sig[:]) - return sig[:], nil -} - -// Public computes the public key corresponding to this private key. -// -// Returns a *PublicKey. The type crypto.PublicKey is used to make -// PrivateKey implement the crypto.Signer interface. -func (sk *PrivateKey) Public() crypto.PublicKey { - return &PublicKey{ - sk.e.Public().(ed448.PublicKey), - *sk.d.Public().(*mode3.PublicKey), - } -} diff --git a/sign/eddilithium3/eddilithium_test.go b/sign/eddilithium3/eddilithium_test.go deleted file mode 100644 index e22e2fed..00000000 --- a/sign/eddilithium3/eddilithium_test.go +++ /dev/null @@ -1,111 +0,0 @@ -package eddilithium3_test - -import ( - "encoding/binary" - "testing" - - "github.com/quantumcoinproject/circl/sign/eddilithium3" -) - -func BenchmarkVerify(b *testing.B) { - // Note that Dilithium precomputes quite a bit during Unpacking/Keygen - // instead of at the moment of verification (as compared to the reference - // implementation. A fair comparison thus should sum verification - // times with unpacking times.) - var seed [57]byte - var msg [8]byte - var sig [eddilithium3.SignatureSize]byte - pk, sk := eddilithium3.NewKeyFromSeed(&seed) - eddilithium3.SignTo(sk, msg[:], sig[:]) - b.ResetTimer() - for i := 0; i < b.N; i++ { - // We should generate a new signature for every verify attempt, - // as this influences the time a little bit. This difference, however, - // is small and generating a new signature in between creates a lot - // pressure on the allocator which makes an accurate measurement hard. - eddilithium3.Verify(pk, msg[:], sig[:]) - } -} - -func BenchmarkSign(b *testing.B) { - // Note that Dilithium precomputes quite a bit during Unpacking/Keygen - // instead of at the moment of signing (as compared to the reference - // implementation. A fair comparison thus should sum sign times with - // unpacking times.) - var seed [57]byte - var msg [8]byte - var sig [eddilithium3.SignatureSize]byte - _, sk := eddilithium3.NewKeyFromSeed(&seed) - b.ResetTimer() - for i := 0; i < b.N; i++ { - binary.LittleEndian.PutUint64(msg[:], uint64(i)) - eddilithium3.SignTo(sk, msg[:], sig[:]) - } -} - -func BenchmarkGenerateKey(b *testing.B) { - var seed [57]byte - for i := 0; i < b.N; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - eddilithium3.NewKeyFromSeed(&seed) - } -} - -func BenchmarkPublicFromPrivate(b *testing.B) { - var seed [57]byte - for i := 0; i < b.N; i++ { - b.StopTimer() - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - _, sk := eddilithium3.NewKeyFromSeed(&seed) - b.StartTimer() - sk.Public() - } -} - -func TestSignThenVerifyAndPkSkPacking(t *testing.T) { - var seed [eddilithium3.SeedSize]byte - var sig [eddilithium3.SignatureSize]byte - var msg [8]byte - var pkb1, pkb2 [eddilithium3.PublicKeySize]byte - var skb1, skb2 [eddilithium3.PrivateKeySize]byte - var pk2 eddilithium3.PublicKey - var sk2 eddilithium3.PrivateKey - for i := uint64(0); i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], i) - pk, sk := eddilithium3.NewKeyFromSeed(&seed) - for j := uint64(0); j < 10; j++ { - binary.LittleEndian.PutUint64(msg[:], j) - eddilithium3.SignTo(sk, msg[:], sig[:]) - if !eddilithium3.Verify(pk, msg[:], sig[:]) { - t.Fatal() - } - } - pk.Pack(&pkb1) - pk2.Unpack(&pkb1) - pk2.Pack(&pkb2) - if pkb1 != pkb2 { - t.Fatal() - } - sk.Pack(&skb1) - sk2.Unpack(&skb1) - sk2.Pack(&skb2) - if skb1 != skb2 { - t.Fatal() - } - } -} - -func TestPublicFromPrivate(t *testing.T) { - var seed [eddilithium3.SeedSize]byte - for i := uint64(0); i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], i) - pk, sk := eddilithium3.NewKeyFromSeed(&seed) - pk2 := sk.Public().(*eddilithium3.PublicKey) - var pkb1, pkb2 [eddilithium3.PublicKeySize]byte - pk.Pack(&pkb1) - pk2.Pack(&pkb2) - if pkb1 != pkb2 { - t.Fatal() - } - } -} diff --git a/sign/eddilithium3/example_test.go b/sign/eddilithium3/example_test.go deleted file mode 100644 index 6a25993b..00000000 --- a/sign/eddilithium3/example_test.go +++ /dev/null @@ -1,45 +0,0 @@ -package eddilithium3_test - -import ( - "fmt" - - "github.com/quantumcoinproject/circl/sign/eddilithium3" -) - -func Example() { - // Generates a keypair. - pk, sk, err := eddilithium3.GenerateKey(nil) - if err != nil { - panic(err) - } - - // (Alternatively one can derive a keypair from a seed, - // see NewKeyFromSeed().) - - // Packs public and private key - var packedSk [eddilithium3.PrivateKeySize]byte - var packedPk [eddilithium3.PublicKeySize]byte - sk.Pack(&packedSk) - pk.Pack(&packedPk) - - // Load it again - var sk2 eddilithium3.PrivateKey - var pk2 eddilithium3.PublicKey - sk2.Unpack(&packedSk) - pk2.Unpack(&packedPk) - - // Creates a signature on our message with the generated private key. - msg := []byte("Some message") - var signature [eddilithium3.SignatureSize]byte - eddilithium3.SignTo(&sk2, msg, signature[:]) - - // Checks whether a signature is correct - if !eddilithium3.Verify(&pk2, msg, signature[:]) { - panic("incorrect signature") - } - - fmt.Printf("O.K.") - - // Output: - // O.K. -} diff --git a/sign/eddilithium3/signapi.go b/sign/eddilithium3/signapi.go deleted file mode 100644 index 996e4fe7..00000000 --- a/sign/eddilithium3/signapi.go +++ /dev/null @@ -1,93 +0,0 @@ -package eddilithium3 - -import ( - "crypto/rand" - "encoding/asn1" - - "github.com/quantumcoinproject/circl/sign" -) - -var sch sign.Scheme = &scheme{} - -// Scheme returns a signature interface. -func Scheme() sign.Scheme { return sch } - -type scheme struct{} - -func (*scheme) Name() string { return "Ed448-Dilithium3" } -func (*scheme) PublicKeySize() int { return PublicKeySize } -func (*scheme) PrivateKeySize() int { return PrivateKeySize } -func (*scheme) SignatureSize() int { return SignatureSize } -func (*scheme) SeedSize() int { return SeedSize } -func (*scheme) TLSIdentifier() uint { return 0xfe62 /* temp */ } -func (*scheme) SupportsContext() bool { return false } -func (*scheme) Oid() asn1.ObjectIdentifier { - return asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 44363, 45, 10} -} - -func (*scheme) GenerateKey() (sign.PublicKey, sign.PrivateKey, error) { - return GenerateKey(rand.Reader) -} - -func (*scheme) Sign( - sk sign.PrivateKey, - message []byte, - opts *sign.SignatureOpts, -) []byte { - priv, ok := sk.(*PrivateKey) - if !ok { - panic(sign.ErrTypeMismatch) - } - if opts != nil && opts.Context != "" { - panic(sign.ErrContextNotSupported) - } - var sig [SignatureSize]byte - SignTo(priv, message, sig[:]) - return sig[:] -} - -func (*scheme) Verify( - pk sign.PublicKey, - message, signature []byte, - opts *sign.SignatureOpts, -) bool { - pub, ok := pk.(*PublicKey) - if !ok { - panic(sign.ErrTypeMismatch) - } - if opts != nil && opts.Context != "" { - panic(sign.ErrContextNotSupported) - } - return Verify(pub, message, signature) -} - -func (*scheme) DeriveKey(seed []byte) (sign.PublicKey, sign.PrivateKey) { - if len(seed) != SeedSize { - panic(sign.ErrSeedSize) - } - var tmp [SeedSize]byte - copy(tmp[:], seed) - return NewKeyFromSeed(&tmp) -} - -func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (sign.PublicKey, error) { - if len(buf) != PublicKeySize { - return nil, sign.ErrPubKeySize - } - var tmp [PublicKeySize]byte - copy(tmp[:], buf) - var ret PublicKey - ret.Unpack(&tmp) - return &ret, nil -} - -func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (sign.PrivateKey, error) { - if len(buf) != PrivateKeySize { - return nil, sign.ErrPrivKeySize - } - var tmp [PrivateKeySize]byte - copy(tmp[:], buf) - var ret PrivateKey - ret.Unpack(&tmp) - return &ret, nil -} diff --git a/sign/hybrideds/hybrideds_test.go b/sign/hybrideds/hybrideds_test.go index dd7a24e6..2e3ff06b 100644 --- a/sign/hybrideds/hybrideds_test.go +++ b/sign/hybrideds/hybrideds_test.go @@ -93,7 +93,7 @@ func TestGetKeys(t *testing.T) { pri1, pri2, pri3, err := priKey.getPrivateKeys() if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err) } if pri1 == nil || pri2 == nil || pri3 == nil { @@ -108,7 +108,7 @@ func TestGetKeys(t *testing.T) { pub1, pub2, pub3, err := pubKey.getPublicKeys() if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err) } if pub1 == nil || pub2 == nil || pub3 == nil { diff --git a/sign/schemes/schemes.go b/sign/schemes/schemes.go index a86672a7..f39fe8e1 100644 --- a/sign/schemes/schemes.go +++ b/sign/schemes/schemes.go @@ -3,9 +3,6 @@ // Implemented schemes: // // Ed25519 -// Ed448 -// Ed25519-Dilithium2 -// Ed448-Dilithium3 // Dilithium // ML-DSA // SLH-DSA @@ -19,9 +16,6 @@ import ( dilithium3 "github.com/quantumcoinproject/circl/sign/dilithium/mode3" dilithium5 "github.com/quantumcoinproject/circl/sign/dilithium/mode5" "github.com/quantumcoinproject/circl/sign/ed25519" - "github.com/quantumcoinproject/circl/sign/ed448" - "github.com/quantumcoinproject/circl/sign/eddilithium2" - "github.com/quantumcoinproject/circl/sign/eddilithium3" "github.com/quantumcoinproject/circl/sign/mldsa/mldsa44" "github.com/quantumcoinproject/circl/sign/mldsa/mldsa65" "github.com/quantumcoinproject/circl/sign/mldsa/mldsa87" @@ -30,9 +24,6 @@ import ( var allSchemes = [...]sign.Scheme{ ed25519.Scheme(), - ed448.Scheme(), - eddilithium2.Scheme(), - eddilithium3.Scheme(), dilithium2.Scheme(), dilithium3.Scheme(), dilithium5.Scheme(), diff --git a/sign/schemes/schemes_test.go b/sign/schemes/schemes_test.go index 01c49929..83aa64b8 100644 --- a/sign/schemes/schemes_test.go +++ b/sign/schemes/schemes_test.go @@ -113,9 +113,6 @@ func Example() { } // Output: // Ed25519 - // Ed448 - // Ed25519-Dilithium2 - // Ed448-Dilithium3 // Dilithium2 // Dilithium3 // Dilithium5 diff --git a/tss/doc.go b/tss/doc.go deleted file mode 100644 index f3e650b4..00000000 --- a/tss/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package tss provides threshold signature schemes. -package tss diff --git a/tss/rsa/README.md b/tss/rsa/README.md deleted file mode 100644 index b107e3ae..00000000 --- a/tss/rsa/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# RSA Threshold Signatures - -This is an implementation of ["Practical Threshold Signatures" by Victor Shoup](https://www.iacr.org/archive/eurocrypt2000/1807/18070209-new.pdf). -Protocol 1 is implemented. - -## Threshold Primer - -Let *l* be the total number of players, *t* be the number of corrupted players, and *k* be the threshold. -The idea of threshold signatures is that at least *k* players need to participate to form a valid signature. - -Setup consists of a dealer generating *l* key shares from a key pair and "dealing" them to the players. In this implementation the dealer is trusted. - -During the signing phase, at least *k* players use their key share and the message to generate a signature share. -Finally, the *k* signature shares are combined to form a valid signature for the message. - -## Modifications - -1. Our implementation is not robust. That is, the corrupted players can prevent a valid signature from being formed by the non-corrupted players. As such, we remove all verification. -2. The paper requires p and q to be safe primes. We do not. \ No newline at end of file diff --git a/tss/rsa/internal/pkcs1v15.go b/tss/rsa/internal/pkcs1v15.go deleted file mode 100644 index 016b8aa1..00000000 --- a/tss/rsa/internal/pkcs1v15.go +++ /dev/null @@ -1,110 +0,0 @@ -// https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/crypto/rsa/pkcs1v15.go - -// Copyright (c) 2009 The Go Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package internal - -import ( - "crypto" - "crypto/rsa" - "errors" - "fmt" -) - -var hashPrefixes = map[crypto.Hash][]byte{ - crypto.MD5: { - 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, - 0x00, 0x04, 0x10, - }, - crypto.SHA1: {0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14}, - crypto.SHA224: { - 0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, - 0x05, 0x00, 0x04, 0x1c, - }, - crypto.SHA256: { - 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, - 0x05, 0x00, 0x04, 0x20, - }, - crypto.SHA384: { - 0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, - 0x05, 0x00, 0x04, 0x30, - }, - crypto.SHA512: { - 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, - 0x05, 0x00, 0x04, 0x40, - }, - crypto.MD5SHA1: {}, // A special TLS case which doesn't use an ASN1 prefix. - crypto.RIPEMD160: {0x30, 0x20, 0x30, 0x08, 0x06, 0x06, 0x28, 0xcf, 0x06, 0x03, 0x00, 0x31, 0x04, 0x14}, -} - -func PadPKCS1v15(pub *rsa.PublicKey, hash crypto.Hash, hashed []byte) ([]byte, error) { - hashLen, prefix, err := pkcs1v15HashInfo(hash, len(hashed)) - if err != nil { - return nil, err - } - - tLen := len(prefix) + hashLen - k := pub.Size() - if k < tLen+11 { - return nil, fmt.Errorf("message too long") - } - - // EM = 0x00 || 0x01 || PS || 0x00 || T - em := make([]byte, k) - em[1] = 1 - for i := 2; i < k-tLen-1; i++ { - em[i] = 0xff - } - copy(em[k-tLen:k-hashLen], prefix) - copy(em[k-hashLen:k], hashed) - - return em, nil -} - -func pkcs1v15HashInfo(hash crypto.Hash, inLen int) (hashLen int, prefix []byte, err error) { - // Special case: crypto.Hash(0) is used to indicate that the data is - // signed directly. - if hash == 0 { - return inLen, nil, nil - } - - hashLen = hash.Size() - if inLen != hashLen { - return 0, nil, errors.New("threshold_internal: crypto/rsa: input must be hashed message") - } - prefix, ok := hashPrefixes[hash] - if !ok { - return 0, nil, errors.New("threshold_internal: crypto/rsa: unsupported hash function") - } - return -} diff --git a/tss/rsa/internal/pss/pss.go b/tss/rsa/internal/pss/pss.go deleted file mode 100644 index 01ce80b5..00000000 --- a/tss/rsa/internal/pss/pss.go +++ /dev/null @@ -1,169 +0,0 @@ -// https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/crypto/rsa/pss.go - -// Copyright (c) 2009 The Go Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pss - -// This file implements the RSASSA-PSS signature scheme according to RFC 8017. - -import ( - "crypto" - "crypto/rsa" - "errors" - "hash" - "io" -) - -// Per RFC 8017, Section 9.1 -// -// EM = MGF1 xor DB || H( 8*0x00 || mHash || salt ) || 0xbc -// -// where -// -// DB = PS || 0x01 || salt -// -// and PS can be empty so -// -// emLen = dbLen + hLen + 1 = psLen + sLen + hLen + 2 -// - -func emsaPSSEncode(mHash []byte, emBits int, salt []byte, hash hash.Hash) ([]byte, error) { - // See RFC 8017, Section 9.1.1. - - hLen := hash.Size() - sLen := len(salt) - emLen := (emBits + 7) / 8 - - // 1. If the length of M is greater than the input limitation for the - // hash function (2^61 - 1 octets for SHA-1), output "message too - // long" and stop. - // - // 2. Let mHash = Hash(M), an octet string of length hLen. - - if len(mHash) != hLen { - return nil, errors.New("crypto/rsa: input must be hashed with given hash") - } - - // 3. If emLen < hLen + sLen + 2, output "encoding error" and stop. - - if emLen < hLen+sLen+2 { - return nil, errors.New("crypto/rsa: key size too small for PSS signature") - } - - em := make([]byte, emLen) - psLen := emLen - sLen - hLen - 2 - db := em[:psLen+1+sLen] - h := em[psLen+1+sLen : emLen-1] - - // 4. Generate a random octet string salt of length sLen; if sLen = 0, - // then salt is the empty string. - // - // 5. Let - // M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt; - // - // M' is an octet string of length 8 + hLen + sLen with eight - // initial zero octets. - // - // 6. Let H = Hash(M'), an octet string of length hLen. - - var prefix [8]byte - - hash.Write(prefix[:]) - hash.Write(mHash) - hash.Write(salt) - - h = hash.Sum(h[:0]) - hash.Reset() - - // 7. Generate an octet string PS consisting of emLen - sLen - hLen - 2 - // zero octets. The length of PS may be 0. - // - // 8. Let DB = PS || 0x01 || salt; DB is an octet string of length - // emLen - hLen - 1. - - db[psLen] = 0x01 - copy(db[psLen+1:], salt) - - // 9. Let dbMask = MGF(H, emLen - hLen - 1). - // - // 10. Let maskedDB = DB \xor dbMask. - - mgf1XOR(db, hash, h) - - // 11. Set the leftmost 8 * emLen - emBits bits of the leftmost octet in - // maskedDB to zero. - - db[0] &= 0xff >> (8*emLen - emBits) - - // 12. Let EM = maskedDB || H || 0xbc. - em[emLen-1] = 0xbc - - // 13. Output EM. - return em, nil -} - -func padPSSWithSalt(pub *rsa.PublicKey, hash crypto.Hash, hashed, salt []byte) ([]byte, error) { - emBits := pub.N.BitLen() - 1 - em, err := emsaPSSEncode(hashed, emBits, salt, hash.New()) - if err != nil { - return nil, err - } - return em, nil -} - -func saltLength(opts *rsa.PSSOptions) int { - if opts == nil { - return rsa.PSSSaltLengthAuto - } - return opts.SaltLength -} - -func PadPSS(rand io.Reader, pub *rsa.PublicKey, hash crypto.Hash, digest []byte, opts *rsa.PSSOptions) ([]byte, error) { - if opts != nil && opts.Hash != 0 { - hash = opts.Hash - } - - saltLength := saltLength(opts) - switch saltLength { - case rsa.PSSSaltLengthAuto: - saltLength = (pub.N.BitLen()-1+7)/8 - 2 - hash.Size() - case rsa.PSSSaltLengthEqualsHash: - saltLength = hash.Size() - } - - salt := make([]byte, saltLength) - if _, err := io.ReadFull(rand, salt); err != nil { - return nil, err - } - return padPSSWithSalt(pub, hash, digest, salt) -} diff --git a/tss/rsa/internal/pss/rsa.go b/tss/rsa/internal/pss/rsa.go deleted file mode 100644 index 0d728220..00000000 --- a/tss/rsa/internal/pss/rsa.go +++ /dev/null @@ -1,70 +0,0 @@ -// https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/crypto/rsa/rsa.go - -// Copyright (c) 2009 The Go Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package pss - -import ( - "hash" -) - -// incCounter increments a four byte, big-endian counter. -func incCounter(c *[4]byte) { - if c[3]++; c[3] != 0 { - return - } - if c[2]++; c[2] != 0 { - return - } - if c[1]++; c[1] != 0 { - return - } - c[0]++ -} - -// mgf1XOR XORs the bytes in out with a mask generated using the MGF1 function -// specified in PKCS #1 v2.1. -func mgf1XOR(out []byte, hash hash.Hash, seed []byte) { - var counter [4]byte - var digest []byte - - done := 0 - for done < len(out) { - hash.Write(seed) - hash.Write(counter[0:4]) - digest = hash.Sum(digest[:0]) - hash.Reset() - - for i := 0; i < len(digest) && done < len(out); i++ { - out[done] ^= digest[i] - done++ - } - incCounter(&counter) - } -} diff --git a/tss/rsa/keyshare.go b/tss/rsa/keyshare.go deleted file mode 100644 index cdfdf896..00000000 --- a/tss/rsa/keyshare.go +++ /dev/null @@ -1,252 +0,0 @@ -package rsa - -import ( - "crypto/rand" - "crypto/rsa" - "encoding/binary" - "errors" - "fmt" - "io" - "math" - "math/big" - "sync" -) - -// KeyShare represents a portion of the key. It can only be used to generate SignShare's. During the dealing phase (when Deal is called), one KeyShare is generated per player. -type KeyShare struct { - si *big.Int - - twoDeltaSi *big.Int // optional cached value, this value is used to marginally speed up SignShare generation in Sign. If nil, it will be generated when needed and then cached. - Index uint // When KeyShare's are generated they are each assigned an index sequentially - - Players uint - Threshold uint -} - -func (kshare KeyShare) String() string { - return fmt.Sprintf("(t,n): (%v,%v) index: %v si: 0x%v", - kshare.Threshold, kshare.Players, kshare.Index, kshare.si.Text(16)) -} - -// MarshalBinary encodes a KeyShare into a byte array in a format readable by UnmarshalBinary. -// Note: Only Index's up to math.MaxUint16 are supported -func (kshare *KeyShare) MarshalBinary() ([]byte, error) { - // The encoding format is - // | Players: uint16 | Threshold: uint16 | Index: uint16 | siLen: uint16 | si: []byte | twoDeltaSiNil: bool | twoDeltaSiLen: uint16 | twoDeltaSi: []byte | - // with all values in big-endian. - - if kshare.Players > math.MaxUint16 { - return nil, fmt.Errorf("rsa_threshold: keyshare marshall: Players is too big to fit in a uint16") - } - - if kshare.Threshold > math.MaxUint16 { - return nil, fmt.Errorf("rsa_threshold: keyshare marshall: Threshold is too big to fit in a uint16") - } - - if kshare.Index > math.MaxUint16 { - return nil, fmt.Errorf("rsa_threshold: keyshare marshall: Index is too big to fit in a uint16") - } - - players := uint16(kshare.Players) - threshold := uint16(kshare.Threshold) - index := uint16(kshare.Index) - - twoDeltaSiBytes := []byte(nil) - if kshare.twoDeltaSi != nil { - twoDeltaSiBytes = kshare.twoDeltaSi.Bytes() - } - - twoDeltaSiLen := len(twoDeltaSiBytes) - - if twoDeltaSiLen > math.MaxInt16 { - return nil, fmt.Errorf("rsa_threshold: keyshare marshall: twoDeltaSiBytes is too big to fit it's length in a uint16") - } - - siBytes := kshare.si.Bytes() - - siLength := len(siBytes) - - if siLength == 0 { - siLength = 1 - siBytes = []byte{0} - } - - if siLength > math.MaxInt16 { - return nil, fmt.Errorf("rsa_threshold: keyshare marshall: siBytes is too big to fit it's length in a uint16") - } - - blen := 2 + 2 + 2 + 2 + 2 + 1 + siLength + twoDeltaSiLen - out := make([]byte, blen) - - binary.BigEndian.PutUint16(out[0:2], players) - binary.BigEndian.PutUint16(out[2:4], threshold) - binary.BigEndian.PutUint16(out[4:6], index) - - binary.BigEndian.PutUint16(out[6:8], uint16(siLength)) // okay because of conditions checked above - - copy(out[8:8+siLength], siBytes) - - if twoDeltaSiBytes != nil { - out[8+siLength] = 1 // twoDeltaSiNil - } - - binary.BigEndian.PutUint16(out[8+siLength+1:8+siLength+3], uint16(twoDeltaSiLen)) - - if twoDeltaSiBytes != nil { - copy(out[8+siLength+3:8+siLength+3+twoDeltaSiLen], twoDeltaSiBytes) - } - - return out, nil -} - -// UnmarshalBinary recovers a KeyShare from a slice of bytes, or returns an error if the encoding is invalid. -func (kshare *KeyShare) UnmarshalBinary(data []byte) error { - // The encoding format is - // | Players: uint16 | Threshold: uint16 | Index: uint16 | siLen: uint16 | si: []byte | twoDeltaSiNil: bool | twoDeltaSiLen: uint16 | twoDeltaSi: []byte | - // with all values in big-endian. - if len(data) < 6 { - return fmt.Errorf("rsa_threshold: keyshare unmarshalKeyShareTest failed: data length was too short for reading Players, Threshold, Index") - } - - players := binary.BigEndian.Uint16(data[0:2]) - threshold := binary.BigEndian.Uint16(data[2:4]) - index := binary.BigEndian.Uint16(data[4:6]) - - if len(data[6:]) < 2 { - return fmt.Errorf("rsa_threshold: keyshare unmarshalKeyShareTest failed: data length was too short for reading siLen length") - } - - siLen := binary.BigEndian.Uint16(data[6:8]) - - if siLen == 0 { - return fmt.Errorf("rsa_threshold: keyshare unmarshalKeyShareTest failed: si is a required field but siLen was 0") - } - - if uint16(len(data[8:])) < siLen { - return fmt.Errorf("rsa_threshold: keyshare unmarshalKeyShareTest failed: data length was too short for reading si, needed: %d found: %d", siLen, len(data[8:])) - } - - si := new(big.Int).SetBytes(data[8 : 8+siLen]) - - if len(data[8+siLen:]) < 1 { - return fmt.Errorf("rsa_threshold: keyshare unmarshalKeyShareTest failed: data length was too short for reading twoDeltaSiNil") - } - - isNil := data[8+siLen] - - var twoDeltaSi *big.Int - - if isNil != 0 { - if len(data[8+siLen+1:]) < 2 { - return fmt.Errorf("rsa_threshold: keyshare unmarshalKeyShareTest failed: data length was too short for reading twoDeltaSiLen length") - } - - twoDeltaSiLen := binary.BigEndian.Uint16(data[8+siLen+1 : 8+siLen+3]) - - if uint16(len(data[8+siLen+3:])) < twoDeltaSiLen { - return fmt.Errorf("rsa_threshold: keyshare unmarshalKeyShareTest failed: data length was too short for reading twoDeltaSi, needed: %d found: %d", twoDeltaSiLen, len(data[8+siLen+2:])) - } - - twoDeltaSi = new(big.Int).SetBytes(data[8+siLen+3 : 8+siLen+3+twoDeltaSiLen]) - } - - kshare.Players = uint(players) - kshare.Threshold = uint(threshold) - kshare.Index = uint(index) - kshare.si = si - kshare.twoDeltaSi = twoDeltaSi - - return nil -} - -// Returns the cached value in twoDeltaSi or if nil, generates 2∆s_i, stores it in twoDeltaSi, and returns it -func (kshare *KeyShare) get2DeltaSi(players int64) *big.Int { - // use the cached value if it exists - if kshare.twoDeltaSi != nil { - return kshare.twoDeltaSi - } - delta := calculateDelta(players) - // 2∆s_i - // delta << 1 == delta * 2 - delta.Lsh(delta, 1).Mul(delta, kshare.si) - kshare.twoDeltaSi = delta - return delta -} - -// Sign msg using a KeyShare. msg MUST be padded and hashed. Call PadHash before this method. -// -// If rand is not nil then blinding will be used to avoid timing -// side-channel attacks. -// -// parallel indicates whether the blinding operations should use go routines to operate in parallel. -// If parallel is false, blinding will take about 2x longer than nonbinding, otherwise it will take about the same time -// (see benchmarks). If randSource is nil, parallel has no effect. parallel should almost always be set to true. -func (kshare *KeyShare) Sign(randSource io.Reader, pub *rsa.PublicKey, digest []byte, parallel bool) (SignShare, error) { - x := &big.Int{} - x.SetBytes(digest) - - exp := kshare.get2DeltaSi(int64(kshare.Players)) - - var signShare SignShare - signShare.Players = kshare.Players - signShare.Threshold = kshare.Threshold - signShare.Index = kshare.Index - - signShare.xi = &big.Int{} - - if randSource != nil { - // Let's blind. - // We can't use traditional RSA blinding (as used in rsa.go) because we are exponentiating by exp and not d. - // As such, Euler's theorem doesn't apply ( exp * d != 0 (mod ϕ(n)) ). - // Instead, we will choose a random r and compute x^{exp+r} * x^{-r} = x^{exp}. - // This should (hopefully) prevent revealing information of the true value of exp, since with exp you can derive - // s_i, the secret key share. - - r, err := rand.Int(randSource, pub.N) - if err != nil { - return SignShare{}, errors.New("rsa_threshold: unable to get random value for blinding") - } - expPlusr := big.Int{} - // exp + r - expPlusr.Add(exp, r) - - var wg *sync.WaitGroup - - // x^{|2∆s_i+r|} - if parallel { - wg = &sync.WaitGroup{} - wg.Add(1) - go func() { - signShare.xi.Exp(x, &expPlusr, pub.N) - wg.Done() - }() - } else { - signShare.xi.Exp(x, &expPlusr, pub.N) - } - - xExpr := big.Int{} - // x^r - xExpr.Exp(x, r, pub.N) - // x^{-r} - res := xExpr.ModInverse(&xExpr, pub.N) - - if res == nil { - // extremely unlikely, somehow x^r is p or q - return SignShare{}, errors.New("rsa_threshold: no mod inverse") - } - - if wg != nil { - wg.Wait() - } - - // x^{|2∆s_i+r|} * x^{-r} = x^{2∆s_i} - signShare.xi.Mul(signShare.xi, &xExpr) - signShare.xi.Mod(signShare.xi, pub.N) - } else { - // x^{2∆s_i} - signShare.xi = &big.Int{} - signShare.xi.Exp(x, exp, pub.N) - } - - return signShare, nil -} diff --git a/tss/rsa/keyshare_test.go b/tss/rsa/keyshare_test.go deleted file mode 100644 index 8005c206..00000000 --- a/tss/rsa/keyshare_test.go +++ /dev/null @@ -1,161 +0,0 @@ -package rsa - -import ( - "crypto/rand" - "crypto/rsa" - "math/big" - "testing" -) - -func TestKeyShare_Sign(t *testing.T) { - // delta = 3! = 6 - // n = 253 - // Players = 3 - // kshare = { si: 15, Index: 1 } - // x = { 150 } - // x_i = x^{2∆kshare.si} = 150^{2 * 6 * 15} = 150^180 = 243 - - kshare := KeyShare{ - si: big.NewInt(15), - Index: 1, - Players: 3, - } - pub := rsa.PublicKey{N: big.NewInt(253)} - share, err := kshare.Sign(nil, &pub, []byte{150}, false) - if err != nil { - t.Fatal(err) - } - if share.xi.Cmp(big.NewInt(243)) != 0 { - t.Fatalf("share.xi should be 243 but was %d", share.xi) - } -} - -func testSignBlind(parallel bool, t *testing.T) { - // delta = 3! = 6 - // n = 253 - // Players = 3 - // kshare = { si: 15, i: 1 } - // x = { 150 } - // x_i = x^{2∆kshare.si} = 150^{2 * 6 * 15} = 150^180 = 243 - - kshare := KeyShare{ - si: big.NewInt(15), - Index: 1, - Players: 3, - } - pub := rsa.PublicKey{N: big.NewInt(253)} - share, err := kshare.Sign(rand.Reader, &pub, []byte{150}, parallel) - if err != nil { - t.Fatal(err) - } - if share.xi.Cmp(big.NewInt(243)) != 0 { - t.Fatalf("share.xi should be 243 but was %d", share.xi) - } -} - -func TestKeyShare_SignBlind(t *testing.T) { - testSignBlind(false, t) -} - -func TestKeyShare_SignBlindParallel(t *testing.T) { - testSignBlind(true, t) -} - -func marshalTestKeyShare(share KeyShare, t *testing.T) { - marshall, err := share.MarshalBinary() - if err != nil { - t.Fatal(err) - } - - share2 := KeyShare{} - err = share2.UnmarshalBinary(marshall) - if err != nil { - t.Fatal(err) - } - - if share.Players != share2.Players { - t.Fatalf("Players did not match, expected %d, found %d", share.Players, share2.Players) - } - - if share.Threshold != share2.Threshold { - t.Fatalf("Threshold did not match, expected %d, found %d", share.Threshold, share2.Threshold) - } - - if share.Index != share2.Index { - t.Fatalf("Index did not match, expected %d, found %d", share.Index, share2.Index) - } - - if (share.twoDeltaSi == nil || share2.twoDeltaSi == nil) && share.twoDeltaSi != share2.twoDeltaSi { - t.Fatalf("twoDeltaSi did not match, expected %v, found %v", share.twoDeltaSi, share2.twoDeltaSi) - } - - if !(share.twoDeltaSi == nil && share2.twoDeltaSi == nil) && share.twoDeltaSi.Cmp(share2.twoDeltaSi) != 0 { - t.Fatalf("twoDeltaSi did not match, expected %v, found %v", share.twoDeltaSi.Bytes(), share2.twoDeltaSi.Bytes()) - } - - if share.si.Cmp(share2.si) != 0 { - t.Fatalf("si did not match, expected %v, found %v", share.si.Bytes(), share2.si.Bytes()) - } -} - -func unmarshalKeyShareTest(t *testing.T, input []byte) { - share := KeyShare{} - err := share.UnmarshalBinary(input) - if err == nil { - t.Fatalf("unmarshall succeeded when it shouldn't have") - } -} - -func TestMarshallKeyShare(t *testing.T) { - marshalTestKeyShare(KeyShare{ - si: big.NewInt(10), - twoDeltaSi: big.NewInt(20), - Index: 30, - Threshold: 10, - Players: 2, - }, t) - - marshalTestKeyShare(KeyShare{ - si: big.NewInt(10), - twoDeltaSi: nil, - Index: 30, - Threshold: 0, - Players: 200, - }, t) - - marshalTestKeyShare(KeyShare{ - si: big.NewInt(0), - twoDeltaSi: big.NewInt(0), - Index: 0, - Threshold: 0, - Players: 0, - }, t) - - unmarshalKeyShareTest(t, []byte{}) - unmarshalKeyShareTest(t, []byte{1, 0, 1}) - unmarshalKeyShareTest(t, []byte{1, 0, 1}) - unmarshalKeyShareTest(t, []byte{0, 1, 0, 1, 0, 1}) - unmarshalKeyShareTest(t, []byte{0, 1, 0, 1, 0, 1, 0, 1}) - unmarshalKeyShareTest(t, []byte{0, 1, 0, 1, 0, 1, 0}) - unmarshalKeyShareTest(t, []byte{0, 1, 0, 1, 0, 1, 0, 2, 1}) - unmarshalKeyShareTest(t, []byte{0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0}) - unmarshalKeyShareTest(t, []byte{0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1}) -} - -func TestMarshallKeyShareFull(t *testing.T) { - const players = 3 - const threshold = 2 - const bits = 4096 - - key, err := rsa.GenerateKey(rand.Reader, bits) - if err != nil { - t.Fatal(err) - } - keys, err := Deal(rand.Reader, players, threshold, key, false) - if err != nil { - t.Fatal(err) - } - for _, share := range keys { - marshalTestKeyShare(share, t) - } -} diff --git a/tss/rsa/padding.go b/tss/rsa/padding.go deleted file mode 100644 index 387932e5..00000000 --- a/tss/rsa/padding.go +++ /dev/null @@ -1,38 +0,0 @@ -package rsa - -import ( - "crypto" - "crypto/rsa" - "io" - - "github.com/quantumcoinproject/circl/tss/rsa/internal" - pss2 "github.com/quantumcoinproject/circl/tss/rsa/internal/pss" -) - -type Padder interface { - Pad(pub *rsa.PublicKey, hash crypto.Hash, hashed []byte) ([]byte, error) -} - -type PKCS1v15Padder struct{} - -func (PKCS1v15Padder) Pad(pub *rsa.PublicKey, hash crypto.Hash, hashed []byte) ([]byte, error) { - return internal.PadPKCS1v15(pub, hash, hashed) -} - -// PSSPadder is a padder for RSA Probabilistic Padding Scheme (RSA-PSS) used in TLS 1.3 -// -// Note: If the salt length is non-zero, PSS padding is not deterministic. -// TLS 1.3 mandates that the salt length is the same as the hash output length. As such, each player cannot -// pad the message individually, otherwise they will produce unique messages and the signature will not be valid. -// Instead, one party should generate a random saltLen byte string. When requesting signatures from the rest of the -// parties they should send along the same random string to be used as `rand` here. -// -// For TLS, rsa.PSSOptions.SaltLength should be PSSSaltLengthEqualsHash. -type PSSPadder struct { - Rand io.Reader - Opts *rsa.PSSOptions -} - -func (pss *PSSPadder) Pad(pub *rsa.PublicKey, hash crypto.Hash, hashed []byte) ([]byte, error) { - return pss2.PadPSS(pss.Rand, pub, hash, hashed, pss.Opts) -} diff --git a/tss/rsa/rsa_threshold.go b/tss/rsa/rsa_threshold.go deleted file mode 100644 index 1393915a..00000000 --- a/tss/rsa/rsa_threshold.go +++ /dev/null @@ -1,343 +0,0 @@ -// Package rsa provides RSA threshold signature scheme. -// -// This package implements the Protocol 1 of "Practical Threshold Signatures" -// by Victor Shoup [1]. -// -// # References -// -// [1] https://www.iacr.org/archive/eurocrypt2000/1807/18070209-new.pdf -package rsa - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" - "errors" - "fmt" - "io" - "math" - "math/big" - - cmath "github.com/quantumcoinproject/circl/math" -) - -// GenerateKey generates a RSA keypair for its use in RSA threshold signatures. -// Internally, the modulus is the product of two safe primes. The time -// consumed by this function is relatively longer than the regular -// GenerateKey function from the crypto/rsa package. -func GenerateKey(random io.Reader, bits int) (*rsa.PrivateKey, error) { - p, err := cmath.SafePrime(random, bits/2) - if err != nil { - return nil, err - } - - var q *big.Int - n := new(big.Int) - found := false - for !found { - q, err = cmath.SafePrime(random, bits-p.BitLen()) - if err != nil { - return nil, err - } - - // check for different primes. - if p.Cmp(q) != 0 { - n.Mul(p, q) - // check n has the desired bitlength. - if n.BitLen() == bits { - found = true - } - } - } - - one := big.NewInt(1) - pminus1 := new(big.Int).Sub(p, one) - qminus1 := new(big.Int).Sub(q, one) - totient := new(big.Int).Mul(pminus1, qminus1) - - priv := new(rsa.PrivateKey) - priv.Primes = []*big.Int{p, q} - priv.N = n - priv.E = 65537 - priv.D = new(big.Int) - e := big.NewInt(int64(priv.E)) - ok := priv.D.ModInverse(e, totient) - if ok == nil { - return nil, errors.New("public key is not coprime to phi(n)") - } - - priv.Precompute() - - return priv, nil -} - -// l or `Players`, the total number of Players. -// t, the number of corrupted Players. -// k=t+1 or `Threshold`, the number of signature shares needed to obtain a signature. - -func validateParams(players, threshold uint) error { - if players <= 1 { - return errors.New("rsa_threshold: Players (l) invalid: should be > 1") - } - if threshold < 1 || threshold > players { - return fmt.Errorf("rsa_threshold: Threshold (k) invalid: %d < 1 || %d > %d", threshold, threshold, players) - } - return nil -} - -// Deal takes in an existing RSA private key generated elsewhere. If cache is true, cached values are stored in KeyShare taking up more memory by reducing Sign time. -// See KeyShare documentation. Multi-prime RSA keys are unsupported. -func Deal(randSource io.Reader, players, threshold uint, key *rsa.PrivateKey, cache bool) ([]KeyShare, error) { - err := validateParams(players, threshold) - - ONE := big.NewInt(1) - - if err != nil { - return nil, err - } - - if len(key.Primes) != 2 { - return nil, errors.New("multiprime rsa keys are unsupported") - } - - p := key.Primes[0] - q := key.Primes[1] - e := int64(key.E) - - // p = 2p' + 1 - // q = 2q' + 1 - // p' = (p - 1)/2 - // q' = (q - 1)/2 - // m = p'q' = (p - 1)(q - 1)/4 - - var pprime big.Int - // p - 1 - pprime.Sub(p, ONE) - - // q - 1 - var m big.Int - m.Sub(q, ONE) - // (p - 1)(q - 1) - m.Mul(&m, &pprime) - // >> 2 == / 4 - m.Rsh(&m, 2) - - // de ≡ 1 - var d big.Int - _d := d.ModInverse(big.NewInt(e), &m) - - if _d == nil { - return nil, errors.New("rsa_threshold: no ModInverse for e in Z/Zm") - } - - // a_0...a_{k-1} - a := make([]*big.Int, threshold) - // a_0 = d - a[0] = &d - - // a_0...a_{k-1} = rand from {0, ..., m - 1} - for i := uint(1); i <= threshold-1; i++ { - a[i], err = rand.Int(randSource, &m) - if err != nil { - return nil, errors.New("rsa_threshold: unable to generate an int within [0, m)") - } - } - - shares := make([]KeyShare, players) - - // 1 <= i <= l - for i := uint(1); i <= players; i++ { - shares[i-1].Players = players - shares[i-1].Threshold = threshold - // Σ^{k-1}_{i=0} | a_i * X^i (mod m) - poly := computePolynomial(threshold, a, i, &m) - shares[i-1].si = poly - shares[i-1].Index = i - if cache { - shares[i-1].get2DeltaSi(int64(players)) - } - } - - return shares, nil -} - -func calcN(p, q *big.Int) big.Int { - // n = pq - var n big.Int - n.Mul(p, q) - return n -} - -// f(X) = Σ^{k-1}_{i=0} | a_i * X^i (mod m) -func computePolynomial(k uint, a []*big.Int, x uint, m *big.Int) *big.Int { - // TODO: use Horner's method here. - sum := big.NewInt(0) - // Σ^{k-1}_{i=0} - for i := uint(0); i <= k-1; i++ { - // X^i - // TODO optimize: we can compute x^{n+1} from the previous x^n - xi := int64(math.Pow(float64(x), float64(i))) - // a_i * X^i - prod := big.Int{} - prod.Mul(a[i], big.NewInt(xi)) - // (mod m) - prod.Mod(&prod, m) // while not in the spec, we are eventually modding m, so we can mod here for efficiency - // Σ - sum.Add(sum, &prod) - } - - sum.Mod(sum, m) - - return sum -} - -// PadHash MUST be called before signing a message -func PadHash(padder Padder, hash crypto.Hash, pub *rsa.PublicKey, msg []byte) ([]byte, error) { - // Sign(Pad(Hash(M))) - - hasher := hash.New() - hasher.Write(msg) - digest := hasher.Sum(nil) - - return padder.Pad(pub, hash, digest) -} - -type Signature = []byte - -// CombineSignShares combines t SignShare's to produce a valid signature -func CombineSignShares(pub *rsa.PublicKey, shares []SignShare, msg []byte) (Signature, error) { - players := shares[0].Players - threshold := shares[0].Threshold - - for i := range shares { - if shares[i].Players != players { - return nil, errors.New("rsa_threshold: shares didn't have consistent players") - } - if shares[i].Threshold != threshold { - return nil, errors.New("rsa_threshold: shares didn't have consistent threshold") - } - } - - if uint(len(shares)) < threshold { - return nil, errors.New("rsa_threshold: insufficient shares for the threshold") - } - - w := big.NewInt(1) - delta := calculateDelta(int64(players)) - // i_1 ... i_k - for _, share := range shares { - // λ(S, 0, i) - lambda, err := computeLambda(delta, shares, 0, int64(share.Index)) - if err != nil { - return nil, err - } - // 2λ - var exp big.Int - exp.Add(lambda, lambda) // faster than TWO * lambda - - // we need to handle negative λ's (aka inverse), so abs it, compare, and if necessary modinverse - abslam := big.Int{} - abslam.Abs(&exp) - var tmp big.Int - // x_i^{|2λ|} - tmp.Exp(share.xi, &abslam, pub.N) - if abslam.Cmp(&exp) == 1 { - tmp.ModInverse(&tmp, pub.N) - } - // TODO first compute all the powers for the negative exponents (but don't invert yet); multiply these together and then invert all at once. This is ok since (ab)^-1 = a^-1 b^-1 - - w.Mul(w, &tmp).Mod(w, pub.N) - } - w.Mod(w, pub.N) - - // e′ = 4∆^2 - eprime := big.Int{} - eprime.Mul(delta, delta) // faster than delta^TWO - eprime.Add(&eprime, &eprime) // faster than FOUR * eprime - eprime.Add(&eprime, &eprime) - - // e′a + eb = 1 - a := big.Int{} - b := big.Int{} - e := big.NewInt(int64(pub.E)) - tmp := big.Int{} - tmp.GCD(&a, &b, &eprime, e) - - // TODO You can compute a earlier and multiply a into the exponents used when computing w. - // w^a - wa := big.Int{} - wa.Exp(w, &a, pub.N) // TODO justification - // x^b - x := big.Int{} - x.SetBytes(msg) - xb := big.Int{} - xb.Exp(&x, &b, pub.N) // TODO justification - // y = w^a * x^b - y := big.Int{} - y.Mul(&wa, &xb).Mod(&y, pub.N) - - // verify that signature is valid by checking x == y^e. - ye := big.Int{} - ye.Exp(&y, e, pub.N) - if ye.Cmp(&x) != 0 { - return nil, errors.New("rsa: internal error") - } - - // ensure signature has the right size. - sig := y.FillBytes(make([]byte, pub.Size())) - - return sig, nil -} - -// computes lagrange Interpolation for the shares -// i must be an id 0..l but not in S -// j must be in S -func computeLambda(delta *big.Int, S []SignShare, i, j int64) (*big.Int, error) { - if i == j { - return nil, errors.New("rsa_threshold: i and j can't be equal by precondition") - } - // these are just to check preconditions - foundi := false - foundj := false - - // λ(s, i, j) = ∆( ( π{j'∈S\{j}} (i - j') ) / ( π{j'∈S\{j}} (j - j') ) ) - - num := int64(1) - den := int64(1) - - // ∈ S - for _, s := range S { - // j' - jprime := int64(s.Index) - // S\{j} - if jprime == j { - foundj = true - continue - } - if jprime == i { - foundi = false - break - } - // (i - j') - num *= i - jprime - // (j - j') - den *= j - jprime - } - - // ∆ * (num/den) - var lambda big.Int - // (num/den) - lambda.Div(big.NewInt(num), big.NewInt(den)) - // ∆ * (num/den) - lambda.Mul(delta, &lambda) - - if foundi { - return nil, fmt.Errorf("rsa_threshold: i: %d should not be in S", i) - } - - if !foundj { - return nil, fmt.Errorf("rsa_threshold: j: %d should be in S", j) - } - - return &lambda, nil -} diff --git a/tss/rsa/rsa_threshold_test.go b/tss/rsa/rsa_threshold_test.go deleted file mode 100644 index b7671060..00000000 --- a/tss/rsa/rsa_threshold_test.go +++ /dev/null @@ -1,436 +0,0 @@ -package rsa - -import ( - "bytes" - "crypto" - "crypto/rand" - "crypto/rsa" - _ "crypto/sha256" - "errors" - "fmt" - "io" - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" -) - -var ONE = big.NewInt(1) - -func TestGenerateKey(t *testing.T) { - // [Warning]: this is only for tests, use a secure bitlen above 2048 bits. - bitlen := 128 - key, err := GenerateKey(rand.Reader, bitlen) - test.CheckNoErr(t, err, "failed to create key") - test.CheckOk(key.Validate() == nil, fmt.Sprintf("key is not valid: %v", key), t) -} - -func createPrivateKey(p, q *big.Int, e int) *rsa.PrivateKey { - return &rsa.PrivateKey{ - PublicKey: rsa.PublicKey{ - E: e, - }, - D: nil, - Primes: []*big.Int{p, q}, - Precomputed: rsa.PrecomputedValues{}, - } -} - -func TestCalcN(t *testing.T) { - TWO := big.NewInt(2) - n := calcN(ONE, TWO) - if n.Cmp(TWO) != 0 { - t.Fatal("calcN failed: (1, 2)") - } - n = calcN(TWO, big.NewInt(4)) - if n.Cmp(big.NewInt(8)) != 0 { - t.Fatal("calcN failed: (2, 4)") - } -} - -func TestComputePolynomial(t *testing.T) { - m := big.NewInt(11) - const k = 5 - a := make([]*big.Int, k) - for i := 0; i < k; i++ { - a[i] = big.NewInt(int64(i + 1)) - } - // a = {1, 2, 3, 4, 5} - - x := uint(3) - out := computePolynomial(k, a, x, m) - // 1 * 3^0 = 1 = 1 - // 2 * 3^1 = 6 = 6 - // 3 * 3^2 = 27 = 5 - // 4 * 3^3 = 108 = 9 - // 5 * 3^4 = 405 = 9 - // 1 + 6 + 5 + 9 + 9 = 30 = 8 - if out.Cmp(big.NewInt(8)) != 0 { - t.Fatal("compute polynomial failed") - } -} - -func TestComputeLambda(t *testing.T) { - // shares = {1, 2, 3, 4, 5} - // i = 0 - // ∆ = 5! = 120 - // j = 3 - // - // num = (0 - 1) * (0 - 2) * (0 - 4) * (0 - 5) = 40 - // dem = (3 - 1) * (3 - 2) * (3 - 4) * (3 - 5) = 4 - // num/dev = 40/4 = 10 - // ∆ * 10 = 120 * 10 = 1200 - shares := make([]SignShare, 5) - for i := uint(1); i <= 5; i++ { - shares[i-1].Index = i - } - i := int64(0) - delta := int64(120) - j := int64(3) - - lambda, err := computeLambda(big.NewInt(delta), shares, i, j) - - if err != nil || lambda.Cmp(big.NewInt(1200)) != 0 { - t.Fatal("computeLambda failed") - } -} - -func TestDeal(t *testing.T) { - // Players = 3 - // Threshold = 2 - // e = 3 - // p' = 11 - // q' = 5 - // p = 2(11) + 1 = 23 - // q = 2(5) + 1 = 11 - // n = 253 - // m = 55 - // d = 37 - // - // a[0] = 37 - // a[1] = 33 - // - // - // Index = 1 - // computePolynomial(k: 2, a: {37, 33}, x: 1, m: 55) : - // 37 * 1^0 = 37 * 1 = 37 - // 33 * 1^1 = 33 * 1 = 33 - // 37 + 33 = 70 = 15 - // - // shares[0].si = 15 - // shares[0].Index = 1 - // - // Index = 2 - // computePolynomial(k: 2, a: {37, 33}, x: 2, m: 55) : - // 37 * 2^0 = 37 * 1 = 37 - // 33 * 2^1 = 33 * 2 = 66 = 11 - // 37 + 11 = 48 - // - // shares[1].si = 48 - // shares[1].Index = 2 - // - // - // Index = 3 - // computePolynomial(k: 2, a: {37, 33}, x: 3, m: 55) : - // 37 * 3^0 = 37 * 1 = 37 - // 33 * 3^1 = 33 * 3 = 99 = 44 - // 37 + 44 = 81 = 26 - // - // shares[2].si = 26 - // shares[2].Index = 3 - // - // - // - r := bytes.NewReader([]byte{33, 17}) - players := uint(3) - threshold := uint(2) - p := int64(23) - q := int64(11) - e := 3 - - key := createPrivateKey(big.NewInt(p), big.NewInt(q), e) - - share, err := Deal(r, players, threshold, key, false) - if err != nil { - t.Fatal(err) - } - if share[0].si.Cmp(big.NewInt(15)) != 0 { - t.Fatalf("share[0].si should have been 15 but was %d", share[0].si) - } - if share[1].si.Cmp(big.NewInt(48)) != 0 { - t.Fatalf("share[1].si should have been 48 but was %d", share[1].si) - } - if share[2].si.Cmp(big.NewInt(26)) != 0 { - t.Fatalf("share[2].si should have been 26 but was %d", share[2].si) - } -} - -const ( - PKS1v15 = 0 - PSS = 1 -) - -func testIntegration(t *testing.T, algo crypto.Hash, priv *rsa.PrivateKey, threshold uint, keys []KeyShare, padScheme int) { - msg := []byte("hello") - pub := &priv.PublicKey - - var padder Padder - if padScheme == PKS1v15 { - padder = &PKCS1v15Padder{} - } else if padScheme == PSS { - padder = &PSSPadder{ - Rand: rand.Reader, - Opts: nil, - } - } else { - t.Fatal(errors.New("unknown padScheme")) - } - - msgPH, err := PadHash(padder, algo, pub, msg) - if err != nil { - t.Fatal(err) - } - - signshares := make([]SignShare, threshold) - - for i := uint(0); i < threshold; i++ { - signshares[i], err = keys[i].Sign(rand.Reader, pub, msgPH, true) - if err != nil { - t.Fatal(err) - } - } - - sig, err := CombineSignShares(pub, signshares, msgPH) - if err != nil { - t.Fatal(err) - } - if len(sig) != pub.Size() { - t.Fatal("bad signature size") - } - - h := algo.New() - h.Write(msg) - hashed := h.Sum(nil) - - if padScheme == PKS1v15 { - err = rsa.VerifyPKCS1v15(pub, algo, hashed, sig) - } else if padScheme == PSS { - err = rsa.VerifyPSS(pub, algo, hashed, sig, padder.(*PSSPadder).Opts) - } else { - panic("logical error") - } - - if err != nil { - t.Logf("d: %v p: %v q: %v\n", priv.D.Text(16), priv.Primes[0].Text(16), priv.Primes[1].Text(16)) - for i, k := range keys { - t.Logf("keys[%v]: %v\n", i, k) - } - for i, s := range signshares { - t.Logf("signShares[%v]: %v\n", i, s) - } - t.Logf("sig: %x\n", sig) - t.Fatal(err) - } -} - -func TestIntegrationStdRsaKeyGenerationPKS1v15(t *testing.T) { - const players = 3 - const threshold = 2 - const bits = 2048 - const algo = crypto.SHA256 - - key, err := rsa.GenerateKey(rand.Reader, bits) - if err != nil { - t.Fatal(err) - } - keys, err := Deal(rand.Reader, players, threshold, key, false) - if err != nil { - t.Fatal(err) - } - testIntegration(t, algo, key, threshold, keys, PKS1v15) -} - -func TestIntegrationStdRsaKeyGenerationPSS(t *testing.T) { - const players = 3 - const threshold = 2 - const bits = 2048 - const algo = crypto.SHA256 - - key, err := rsa.GenerateKey(rand.Reader, bits) - if err != nil { - t.Fatal(err) - } - keys, err := Deal(rand.Reader, players, threshold, key, false) - if err != nil { - t.Fatal(err) - } - testIntegration(t, algo, key, threshold, keys, PSS) -} - -// nolint: unparam -func benchmarkSignCombineHelper(randSource io.Reader, parallel bool, b *testing.B, players, threshold uint, bits int, algo crypto.Hash, padScheme int) { - key, err := rsa.GenerateKey(rand.Reader, bits) - pub := key.PublicKey - if err != nil { - panic(err) - } - - keys, err := Deal(rand.Reader, players, threshold, key, true) - if err != nil { - b.Fatal(err) - } - - msg := []byte("hello") - var padder Padder - if padScheme == PKS1v15 { - padder = &PKCS1v15Padder{} - } else if padScheme == PSS { - padder = &PSSPadder{ - Rand: rand.Reader, - Opts: nil, - } - } else { - b.Fatal(errors.New("unknown padScheme")) - } - msgPH, err := PadHash(padder, algo, &pub, msg) - if err != nil { - b.Fatal(err) - } - - signshares := make([]SignShare, threshold) - b.ResetTimer() - for i := 0; i < b.N; i++ { - for i := uint(0); i < threshold; i++ { - signshares[i], err = keys[i].Sign(randSource, &pub, msgPH, parallel) - if err != nil { - b.Fatal(err) - } - } - _, err = CombineSignShares(&pub, signshares, msgPH) - if err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -func BenchmarkBaselineRSA_SHA256_4096(b *testing.B) { - const bits = 4096 - const algo = crypto.SHA256 - - key, err := rsa.GenerateKey(rand.Reader, bits) - if err != nil { - b.Fatal(err) - } - h := algo.New() - - msg := []byte("hello") - - h.Write(msg) - d := h.Sum(nil) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err = rsa.SignPKCS1v15(rand.Reader, key, algo, d) - if err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -func BenchmarkBaselineRSA_SHA256_2048(b *testing.B) { - const bits = 2048 - const algo = crypto.SHA256 - - key, err := rsa.GenerateKey(rand.Reader, bits) - if err != nil { - b.Fatal(err) - } - h := algo.New() - - msg := []byte("hello") - - h.Write(msg) - d := h.Sum(nil) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err = rsa.SignPKCS1v15(rand.Reader, key, algo, d) - if err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -func BenchmarkSignCombine_SHA256_4096_3_2_Scheme(b *testing.B) { - const players = 3 - const threshold = 2 - const bits = 4096 - const algo = crypto.SHA256 - benchmarkSignCombineHelper(nil, false, b, players, threshold, bits, algo, PKS1v15) -} - -func BenchmarkSignCombine_SHA256_4096_3_2_Scheme_Blind(b *testing.B) { - const players = 3 - const threshold = 2 - const bits = 4096 - const algo = crypto.SHA256 - benchmarkSignCombineHelper(rand.Reader, false, b, players, threshold, bits, algo, PKS1v15) -} - -func BenchmarkSignCombine_SHA256_4096_3_2_Scheme_BlindParallel(b *testing.B) { - const players = 3 - const threshold = 2 - const bits = 4096 - const algo = crypto.SHA256 - benchmarkSignCombineHelper(rand.Reader, true, b, players, threshold, bits, algo, PKS1v15) -} - -func BenchmarkSignCombine_SHA256_2048_3_2_Scheme(b *testing.B) { - const players = 3 - const threshold = 2 - const bits = 2048 - const algo = crypto.SHA256 - benchmarkSignCombineHelper(nil, false, b, players, threshold, bits, algo, PKS1v15) -} - -func BenchmarkSignCombine_SHA256_2048_3_2_Scheme_Blind(b *testing.B) { - const players = 3 - const threshold = 2 - const bits = 2048 - const algo = crypto.SHA256 - benchmarkSignCombineHelper(rand.Reader, false, b, players, threshold, bits, algo, PKS1v15) -} - -func BenchmarkSignCombine_SHA256_2048_3_2_Scheme_BlindParallel(b *testing.B) { - const players = 3 - const threshold = 2 - const bits = 2048 - const algo = crypto.SHA256 - benchmarkSignCombineHelper(rand.Reader, true, b, players, threshold, bits, algo, PKS1v15) -} - -func BenchmarkSignCombine_SHA256_1024_3_2_Scheme(b *testing.B) { - const players = 3 - const threshold = 2 - const bits = 1024 - const algo = crypto.SHA256 - benchmarkSignCombineHelper(nil, false, b, players, threshold, bits, algo, PKS1v15) -} - -func BenchmarkDealGeneration(b *testing.B) { - const players = 3 - const threshold = 2 - const bits = 2048 - key, err := rsa.GenerateKey(rand.Reader, bits) - if err != nil { - b.Fatal("could not generate key") - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := Deal(rand.Reader, players, threshold, key, false) - if err != nil { - b.Fatal(err) - } - } -} diff --git a/tss/rsa/signShare.go b/tss/rsa/signShare.go deleted file mode 100644 index e73220c1..00000000 --- a/tss/rsa/signShare.go +++ /dev/null @@ -1,103 +0,0 @@ -package rsa - -import ( - "encoding/binary" - "fmt" - "math" - "math/big" -) - -// SignShare represents a portion of a signature. It is generated when a message is signed by a KeyShare. t SignShare's are then combined by calling CombineSignShares, where t is the Threshold. -type SignShare struct { - xi *big.Int - - Index uint - - Players uint - Threshold uint -} - -func (s SignShare) String() string { - return fmt.Sprintf("(t,n): (%v,%v) index: %v xi: 0x%v", - s.Threshold, s.Players, s.Index, s.xi.Text(16)) -} - -// MarshalBinary encodes SignShare into a byte array in a format readable by UnmarshalBinary. -// Note: Only Index's up to math.MaxUint16 are supported -func (s *SignShare) MarshalBinary() ([]byte, error) { - // | Players: uint16 | Threshold: uint16 | Index: uint16 | xiLen: uint16 | xi: []byte | - - if s.Players > math.MaxUint16 { - return nil, fmt.Errorf("rsa_threshold: signshare marshall: Players is too big to fit in a uint16") - } - - if s.Threshold > math.MaxUint16 { - return nil, fmt.Errorf("rsa_threshold: signshare marshall: Threshold is too big to fit in a uint16") - } - - if s.Index > math.MaxUint16 { - return nil, fmt.Errorf("rsa_threshold: signshare marshall: Index is too big to fit in a uint16") - } - - players := uint16(s.Players) - threshold := uint16(s.Threshold) - index := uint16(s.Index) - - xiBytes := s.xi.Bytes() - xiLen := len(xiBytes) - - if xiLen > math.MaxInt16 { - return nil, fmt.Errorf("rsa_threshold: signshare marshall: xiBytes is too big to fit it's length in a uint16") - } - - if xiLen == 0 { - xiLen = 1 - xiBytes = []byte{0} - } - - blen := 2 + 2 + 2 + 2 + xiLen - out := make([]byte, blen) - - binary.BigEndian.PutUint16(out[0:2], players) - binary.BigEndian.PutUint16(out[2:4], threshold) - binary.BigEndian.PutUint16(out[4:6], index) - - binary.BigEndian.PutUint16(out[6:8], uint16(xiLen)) - - copy(out[8:8+xiLen], xiBytes) - - return out, nil -} - -// UnmarshalBinary converts a byte array outputted from Marshall into a SignShare or returns an error if the value is invalid -func (s *SignShare) UnmarshalBinary(data []byte) error { - // | Players: uint16 | Threshold: uint16 | Index: uint16 | xiLen: uint16 | xi: []byte | - if len(data) < 8 { - return fmt.Errorf("rsa_threshold: signshare unmarshalKeyShareTest failed: data length was too short for reading Players, Threshold, Index, and xiLen") - } - - players := binary.BigEndian.Uint16(data[0:2]) - threshold := binary.BigEndian.Uint16(data[2:4]) - index := binary.BigEndian.Uint16(data[4:6]) - xiLen := binary.BigEndian.Uint16(data[6:8]) - - if xiLen == 0 { - return fmt.Errorf("rsa_threshold: signshare unmarshalKeyShareTest failed: xi is a required field but xiLen was 0") - } - - if uint16(len(data[8:])) < xiLen { - return fmt.Errorf("rsa_threshold: signshare unmarshalKeyShareTest failed: data length was too short for reading xi, needed: %d found: %d", xiLen, len(data[6:])) - } - - xi := big.Int{} - bytes := make([]byte, xiLen) - copy(bytes, data[8:8+xiLen]) - xi.SetBytes(bytes) - - s.Players = uint(players) - s.Threshold = uint(threshold) - s.Index = uint(index) - s.xi = &xi - - return nil -} diff --git a/tss/rsa/signShare_test.go b/tss/rsa/signShare_test.go deleted file mode 100644 index e905d963..00000000 --- a/tss/rsa/signShare_test.go +++ /dev/null @@ -1,92 +0,0 @@ -package rsa - -import ( - "crypto/rand" - "crypto/rsa" - "math/big" - "testing" -) - -func marshalTestSignShare(share SignShare, t *testing.T) { - marshall, err := share.MarshalBinary() - if err != nil { - t.Fatal(err) - } - - share2 := SignShare{} - err = share2.UnmarshalBinary(marshall) - if err != nil { - t.Fatal(err) - } - - if share.Players != share2.Players { - t.Fatalf("Players did not match, expected %d, found %d", share.Players, share2.Players) - } - - if share.Threshold != share2.Threshold { - t.Fatalf("Threshold did not match, expected %d, found %d", share.Threshold, share2.Threshold) - } - - if share.Index != share2.Index { - t.Fatalf("Index did not match, expected %d, found %d", share.Index, share2.Index) - } - - if share.xi.Cmp(share2.xi) != 0 { - t.Fatalf("si did not match, expected %v, found %v", share.xi.Bytes(), share2.xi.Bytes()) - } -} - -func unmarshalSignShareTest(t *testing.T, input []byte) { - share := SignShare{} - err := share.UnmarshalBinary(input) - if err == nil { - t.Fatalf("unmarshall succeeded when it shouldn't have") - } -} - -func TestMarshallSignShare(t *testing.T) { - marshalTestSignShare(SignShare{ - xi: big.NewInt(10), - Index: 30, - Players: 16, - Threshold: 18, - }, t) - - marshalTestSignShare(SignShare{ - xi: big.NewInt(0), - Index: 0, - Players: 0, - Threshold: 0, - }, t) - - unmarshalSignShareTest(t, []byte{}) - unmarshalSignShareTest(t, []byte{0, 0, 0}) - unmarshalSignShareTest(t, []byte{0, 0, 0, 0, 0, 0, 0, 0}) - unmarshalSignShareTest(t, []byte{0, 0, 0, 0, 0, 0, 0, 1}) - unmarshalSignShareTest(t, []byte{0, 0, 0, 0, 0, 0, 0, 2, 1}) -} - -func TestMarshallFullSignShare(t *testing.T) { - const players = 3 - const threshold = 2 - const bits = 4096 - - key, err := rsa.GenerateKey(rand.Reader, bits) - if err != nil { - t.Fatal(err) - } - keys, err := Deal(rand.Reader, players, threshold, key, false) - if err != nil { - t.Fatal(err) - } - for _, share := range keys { - keyshare, err := share.Sign(rand.Reader, &key.PublicKey, []byte("Cloudflare!"), true) - if err != nil { - t.Fatal(err) - } - _, err = keyshare.MarshalBinary() - if err != nil { - t.Fatal(err) - } - } -} diff --git a/tss/rsa/util.go b/tss/rsa/util.go deleted file mode 100644 index 21803269..00000000 --- a/tss/rsa/util.go +++ /dev/null @@ -1,12 +0,0 @@ -package rsa - -import ( - "math/big" -) - -func calculateDelta(l int64) *big.Int { - // ∆ = l! - delta := big.Int{} - delta.MulRange(1, l) - return &delta -} diff --git a/tss/rsa/util_test.go b/tss/rsa/util_test.go deleted file mode 100644 index 3e8e9ce7..00000000 --- a/tss/rsa/util_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package rsa - -import ( - "math/big" - "testing" -) - -func TestCalculateDelta(t *testing.T) { - ONE := big.NewInt(1) - if calculateDelta(0).Cmp(ONE) != 0 { - t.Fatal("calculateDelta failed on 0") - } - - if calculateDelta(1).Cmp(ONE) != 0 { - t.Fatal("calculateDelta failed on 1") - } - - if calculateDelta(5).Cmp(big.NewInt(120)) != 0 { - t.Fatal("calculateDelta failed on 5") - } -} diff --git a/vdaf/doc.go b/vdaf/doc.go deleted file mode 100644 index 45894ccd..00000000 --- a/vdaf/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Package vdaf provides verifiable distributed aggregation functions. -// -// This package supports Prio3 as specified in [v13]. -// [v13]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13 -package vdaf diff --git a/vdaf/prio3/arith/arith.go b/vdaf/prio3/arith/arith.go deleted file mode 100644 index 2c34a526..00000000 --- a/vdaf/prio3/arith/arith.go +++ /dev/null @@ -1,136 +0,0 @@ -//go:generate go run gen.go - -// Package arith provides arithmetic operations over prime fields, vectors, -// and polynomials. -package arith - -import ( - "encoding" - "io" - - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/internal/sha3" - "golang.org/x/crypto/cryptobyte" -) - -// Elt is any type that stores a prime field element. -type Elt any - -// Fp lists the functionality that a prime field element must have denoting -// methods with a pointer receiver. -// This interface considers the modulus is an NTT-friendly prime, i.e., -// there exists a multiplicative subgroup formed by the N-th roots of unity. -type Fp[E Elt] interface { - *E - // Size returns the number of bytes to encode a field element. - Size() uint - // Returns true if the element is the neutral additive element. - IsZero() bool - // Returns true if the element is the neutral multiplicative element. - IsOne() bool - // Returns true if the element is equal to x. - IsEqual(x *E) bool - // Set the element to the neutral multiplicative element. - SetOne() - // Set the element to x if x < Order(). - SetUint64(uint64) error - // Returns the integer representative of the element if x < 2^64. - GetUint64() (x uint64, err error) - // Set the element to the principal root of unity of order 2^n. - SetRootOfUnityTwoN(n uint) - // AddAssing calculates z = z + x. - AddAssign(x *E) - // SubAssign calculates z = z - x. - SubAssign(x *E) - // MulAssign calculates z = z * x. - MulAssign(x *E) - // Add calculates z = x + y. - Add(x, y *E) - // Sub calculates z = x - y. - Sub(x, y *E) - // Mul calculates z = x * y. - Mul(x, y *E) - // Sqr calculates z = x * x. - Sqr(x *E) - // Inv calculates z = 1 / x. - Inv(x *E) - // InvUint64 calculates z = 1 / x. - InvUint64(x uint64) - // InvTwoN calculates z = 1 / (2^n). - InvTwoN(n uint) - // Random samples an element from an io.Reader. - Random(io.Reader) error - // RandomSHA3 samples an element from a SHA3 state. - RandomSHA3(*sha3.State) error - // Encodes an element to bytes. - encoding.BinaryMarshaler - // Decodes an element from bytes. - encoding.BinaryUnmarshaler - // Encodes an element using a cryptobyte.Builder. - cryptobyte.MarshalingValue - // Decodes an element from a cryptobyte.String. - conv.UnmarshalingValue -} - -// NewVec returns a vector of length n with all elements set to zero. -func NewVec[V Vec[V, E], E Elt](n uint) V { return make(V, n) } - -// Vec lists the funtionality of a vector of field elements. -type Vec[Vec ~[]E, E Elt] interface { - ~[]E - // Size returns the number of bytes to encode the vector. - Size() uint - // AddAssing calculates z = z + x. - AddAssign(x Vec) - // SubAssign calculates z = z - x. - SubAssign(x Vec) - // ScalarMul calculates z[i] = z[i] * x. - ScalarMul(x *E) - // DotProduct calculates z[i] = z[i] * x[i]. - DotProduct(x Vec) E - // NTT calculates the number theoretic transform of the vector. - NTT(Vec, uint) - // InvNTT calculates the inverse number theoretic transform on values. - InvNTT(Vec, uint) - // SplitBits sets the vector of elements corresponding to the bits of n. - // The receiving vector sets v[i] = SetUint64(n(i)), where n(i) is the i-th - // bit of n, and len(v) >= log2(n). - SplitBits(n uint64) error - // JoinBits calculates the element sum( 2^i * z[i] ). - JoinBits() E - // Random samples a vector from an io.Reader. - Random(io.Reader) error - // RandomSHA3 samples a vector from a SHA3 state. - RandomSHA3(*sha3.State) error - // RandomSHA3Bytes reads a vector from a SHA3 state copying the bytes read. - RandomSHA3Bytes([]byte, *sha3.State) error - // Encodes a vector to bytes. - encoding.BinaryMarshaler - // Decodes a vector from bytes. - encoding.BinaryUnmarshaler - // Encodes a vector using a cryptobyte.Builder. - cryptobyte.MarshalingValue - // Decodes a vector from a cryptobyte.String. - conv.UnmarshalingValue -} - -// NewPoly returns a polynomial of the given degree with all coefficients set -// to zero. -func NewPoly[P Poly[P, E], E Elt](degree uint) P { return make(P, degree+1) } - -// Poly lists the funtionality of polynomials with coefficients in a field. -type Poly[Poly ~[]E, E Elt] interface { - ~[]E - // AddAssing calculates z = z + x. - AddAssign(Poly) - // SubAssign calculates z = z - x. - SubAssign(Poly) - // Mul calculates z = x * y. - Mul(x, y Poly) - // Sqr calculates z = x * x. - Sqr(Poly) - // Evaluate calculates the polynomial evaluation p(x). - Evaluate(x *E) E - // Strip removes the higher-degree zero terms. - Strip() Poly -} diff --git a/vdaf/prio3/arith/field_test.go b/vdaf/prio3/arith/field_test.go deleted file mode 100644 index 179301dc..00000000 --- a/vdaf/prio3/arith/field_test.go +++ /dev/null @@ -1,335 +0,0 @@ -package arith - -import ( - "crypto/rand" - "fmt" - "io" - "math/big" - "slices" - "testing" - - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/internal/test" - "golang.org/x/crypto/cryptobyte" -) - -type EltTest interface { - comparable - fmt.Stringer - OrderRootUnity() uint - Order() []byte -} - -const testTimes = 1 << 10 - -func testFp[E EltTest, F Fp[E]](t *testing.T) { - t.Run("randomNum", randomNum[E, F]) - t.Run("noAlias", noAlias[E, F]) - t.Run("addSub", addSub[E, F]) - t.Run("mulInv", mulInv[E, F]) - t.Run("invTwoN", invTwoN[E, F]) - t.Run("expInv", expInv[E, F]) - t.Run("mulSqr", mulSqr[E, F]) - t.Run("marshal", marshal[E, F]) - t.Run("rootsUnity", rootsUnityTwoN[E, F]) - t.Run("stringer", stringer[E, F]) -} - -func mustRead[T interface{ Random(io.Reader) error }](t testing.TB, x T) { - err := x.Random(rand.Reader) - if err != nil { - t.Fatal(err) - } -} - -func randomNum[E Elt, F Fp[E]](t *testing.T) { - err := F(new(E)).Random(io.LimitReader(rand.Reader, 0)) - test.CheckIsErr(t, err, "random should fail") - - r := sha3.NewShake128() - r.Reset() - got := F(new(E)) - err = got.Random(&r) - test.CheckNoErr(t, err, "Random failed") - - r.Reset() - want := F(new(E)) - err = want.RandomSHA3(&r) - test.CheckNoErr(t, err, "RandomSHA3 failed") - - if !got.IsEqual(want) { - test.ReportError(t, got, want) - } -} - -func noAlias[E Elt, F Fp[E]](t *testing.T) { - x := F(new(E)) - mustRead(t, x) - y := *x - var got F = &y - got.Sqr(got) - z := *x - want := F(&z) - want.Mul(want, want) - - if !got.IsEqual(want) { - test.ReportError(t, got, want, x) - } -} - -func addSub[E Elt, F Fp[E]](t *testing.T) { - got := F(new(E)) - want := F(new(E)) - x := F(new(E)) - y := F(new(E)) - for i := 0; i < testTimes; i++ { - mustRead(t, x) - mustRead(t, y) - - // 2x = (x + y) + x - y - // = (x - y) + x + y - got.Add(x, y) - got.AddAssign(x) - got.SubAssign(y) - want.Sub(x, y) - want.AddAssign(x) - want.AddAssign(y) - - if !got.IsEqual(want) { - test.ReportError(t, got, want, x, y) - } - } -} - -func mulInv[E Elt, F Fp[E]](t *testing.T) { - x := F(new(E)) - y := F(new(E)) - z := F(new(E)) - for i := 0; i < testTimes; i++ { - mustRead(t, x) - mustRead(t, y) - - // x*y*x^1 = y - z.Inv(x) - z.Mul(z, y) - z.Mul(z, x) - got := z - want := y - if !got.IsEqual(want) { - test.ReportError(t, got, want, x, y) - } - } -} - -func invTwoN[E Elt, F Fp[E]](t *testing.T) { - got := F(new(E)) - want := F(new(E)) - for i := 0; i < 64; i++ { - pow2 := uint64(1) << i - - got.InvTwoN(uint(i)) - - err := want.SetUint64(pow2) - test.CheckNoErr(t, err, "setuint64 failed") - want.Inv(want) - - if !got.IsEqual(want) { - test.ReportError(t, got, want, i) - } - } -} - -func expInv[E Elt, F Fp[E]](t *testing.T) { - got := F(new(E)) - want := F(new(E)) - x := F(new(E)) - for i := 0; i < testTimes; i++ { - mustRead(t, x) - - // (1/x) * x = 1 - got.Inv(x) - got.MulAssign(x) - want.SetOne() - if !got.IsEqual(want) { - test.ReportError(t, got, want, x) - } - } - - for i := uint64(0); i < 8; i++ { - got.InvUint64(i) - _ = want.SetUint64(i) - want.Inv(want) - - if !got.IsEqual(want) { - test.ReportError(t, got, want, i) - } - } -} - -func mulSqr[E Elt, F Fp[E]](t *testing.T) { - x := F(new(E)) - y := F(new(E)) - l0 := F(new(E)) - l1 := F(new(E)) - r0 := F(new(E)) - r1 := F(new(E)) - for i := 0; i < testTimes; i++ { - mustRead(t, x) - mustRead(t, y) - - // (x+y)(x-y) = (x^2-y^2) - l0.Add(x, y) - l1.Sub(x, y) - l0.Mul(l0, l1) - r0.Sqr(x) - r1.Sqr(y) - r0.Sub(r0, r1) - got := l0 - want := r0 - if !got.IsEqual(want) { - test.ReportError(t, got, want, x, y) - } - } -} - -func rootsUnityTwoN[E EltTest, F Fp[E]](t *testing.T) { - w := F(new(E)) - x := F(new(E)) - - w.SetRootOfUnityTwoN(0) - test.CheckOk(w.IsOne(), "incorrect order of the root of unity", t) - - order := (*w).OrderRootUnity() - for i := uint(1); i <= order; i++ { - w.SetRootOfUnityTwoN(i) - - x.Sqr(w) - for range i - 1 { - test.CheckOk(!x.IsOne(), "incorrect order of the root of unity", t) - x.Sqr(x) - } - - test.CheckOk(x.IsOne(), "incorrect order of the root of unity", t) - } -} - -func marshal[E EltTest, F Fp[E]](t *testing.T) { - x := F(new(E)) - y := F(new(E)) - for i := 0; i < testTimes; i++ { - mustRead(t, x) - s, err := x.MarshalBinary() - test.CheckNoErr(t, err, "MarshalBinary failed") - test.CheckOk(uint(len(s)) == x.Size(), "wrong byte length", t) - - err = y.UnmarshalBinary(s) - test.CheckNoErr(t, err, "UnmarshalBinary failed") - if !x.IsEqual(y) { - test.ReportError(t, x, y) - } - // check for invalid size - err = y.UnmarshalBinary(s[1:]) - test.CheckIsErr(t, err, "UnmarshalBinary should failed") - - // check for invalid element - order := (*x).Order() - slices.Reverse(order) - err = y.UnmarshalBinary(order) - test.CheckIsErr(t, err, "UnmarshalBinary should failed") - } -} - -func stringer[E EltTest, F Fp[E]](t *testing.T) { - minusOne := F(new(E)) - minusOne.SetOne() - minusOne.Sub(new(E), minusOne) - got := (*minusOne).String() - - fpOrder := new(big.Int).SetBytes((*minusOne).Order()) - pMinusOne := new(big.Int).Sub(fpOrder, big.NewInt(1)) - want := "0x" + pMinusOne.Text(16) - - if got != want { - test.ReportError(t, got, want) - } -} - -func benchmarkFp[E EltTest, F Fp[E]](b *testing.B) { - x := F(new(E)) - y := F(new(E)) - z := F(new(E)) - mustRead(b, x) - mustRead(b, y) - mustRead(b, z) - - b.Run("Marshal", func(b *testing.B) { - for i := 0; i < b.N; i++ { - var builder cryptobyte.Builder - _ = z.Marshal(&builder) - } - }) - b.Run("MarshalBinary", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _ = z.MarshalBinary() - } - }) - b.Run("Unmarshal", func(b *testing.B) { - buf := make([]byte, z.Size()) - for i := 0; i < b.N; i++ { - s := cryptobyte.String(buf) - _ = z.Unmarshal(&s) - } - }) - b.Run("UnmarshalBinary", func(b *testing.B) { - buf := make([]byte, z.Size()) - for i := 0; i < b.N; i++ { - _ = z.UnmarshalBinary(buf) - } - }) - b.Run("Random", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _ = z.Random(rand.Reader) - } - }) - b.Run("RandomSHA3", func(b *testing.B) { - r := sha3.NewShake128() - for i := 0; i < b.N; i++ { - _ = z.RandomSHA3(&r) - } - }) - b.Run("Add", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Add(x, y) - } - }) - b.Run("Sub", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Sub(x, y) - } - }) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Mul(x, y) - } - }) - b.Run("Sqr", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Sqr(x) - } - }) - b.Run("InvUint64", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.InvUint64(5) - } - }) - b.Run("InvTwoN", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.InvTwoN(16) - } - }) - b.Run("Inv", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.Inv(x) - } - }) -} diff --git a/vdaf/prio3/arith/fp128/fiatMont.go b/vdaf/prio3/arith/fp128/fiatMont.go deleted file mode 100644 index dbc75062..00000000 --- a/vdaf/prio3/arith/fp128/fiatMont.go +++ /dev/null @@ -1,288 +0,0 @@ -// Code generated by fiat.go using fiat-crypto v0.1.4. -// -// Autogenerated: './FiatCrypto_v.0.1.4-issue1672' word-by-word-montgomery --output 'fp128/fiatMont.go' --lang Go --package-name fp128 --doc-prepend-header 'Code generated by fiat.go using fiat-crypto v0.1.4.' --package-case lowerCamelCase --public-function-case lowerCamelCase --public-type-case lowerCamelCase --doc-newline-before-package-declaration --no-primitives --widen-carry --no-field-element-typedefs --relax-primitive-carry-to-bitwidth 64 Fp 64 0xffffffffffffffe40000000000000001 add sub mul square -// -// curve description: Fp -// -// machine_wordsize = 64 (from "64") -// -// requested operations: add, sub, mul, square -// -// m = 0xffffffffffffffe40000000000000001 (from "0xffffffffffffffe40000000000000001") -// -// -// -// NOTE: In addition to the bounds specified above each function, all -// -// functions synthesized for this Montgomery arithmetic require the -// -// input to be strictly less than the prime modulus (m), and also -// -// require the input to be in the unique saturated representation. -// -// All functions also ensure that these two properties are true of -// -// return values. -// -// -// -// Computed values: -// -// eval z = z[0] + (z[1] << 64) -// -// bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) -// -// twos_complement_eval z = let x1 := z[0] + (z[1] << 64) in -// -// if x1 & (2^128-1) < 2^127 then x1 & (2^128-1) else (x1 & (2^128-1)) - 2^128 - -package fp128 - -import "math/bits" - -// The function fiatFpAdd adds two field elements in the Montgomery domain. -// -// Preconditions: -// 0 ≤ eval arg1 < m -// 0 ≤ eval arg2 < m -// Postconditions: -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// Output Bounds: -// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -func fiatFpAdd(out1 *Fp, arg1 *Fp, arg2 *Fp) { - var x1 uint64 - var x2 uint64 - x1, x2 = bits.Add64(arg1[0], arg2[0], uint64(0x0)) - var x3 uint64 - var x4 uint64 - x3, x4 = bits.Add64(arg1[1], arg2[1], uint64(x2)) - var x5 uint64 - var x6 uint64 - x5, x6 = bits.Sub64(x1, 0x1, uint64(uint64(0x0))) - var x7 uint64 - var x8 uint64 - x7, x8 = bits.Sub64(x3, 0xffffffffffffffe4, uint64(x6)) - var x10 uint64 - _, x10 = bits.Sub64(x4, uint64(0x0), uint64(x8)) - var x11 uint64 - fiatFpCmovznzU64(&x11, x10, x5, x1) - var x12 uint64 - fiatFpCmovznzU64(&x12, x10, x7, x3) - out1[0] = x11 - out1[1] = x12 -} - -// The function fiatFpSub subtracts two field elements in the Montgomery domain. -// -// Preconditions: -// 0 ≤ eval arg1 < m -// 0 ≤ eval arg2 < m -// Postconditions: -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// Output Bounds: -// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -func fiatFpSub(out1 *Fp, arg1 *Fp, arg2 *Fp) { - x1 := arg2[1] - x2 := arg2[0] - var x3 uint64 - var x4 uint64 - x3, x4 = bits.Sub64(arg1[0], x2, uint64(0x0)) - var x5 uint64 - var x6 uint64 - x5, x6 = bits.Sub64(arg1[1], x1, uint64(x4)) - var x7 uint64 - fiatFpCmovznzU64(&x7, x6, uint64(0x0), 0xffffffffffffffff) - var x8 uint64 - var x9 uint64 - x8, x9 = bits.Add64(x3, (x7 & 0x1), uint64(0x0)) - var x10 uint64 - x10, _ = bits.Add64(x5, (x7 & 0xffffffffffffffe4), uint64(x9)) - out1[0] = x8 - out1[1] = x10 -} - -// The function fiatFpMul multiplies two field elements in the Montgomery domain. -// -// Preconditions: -// 0 ≤ eval arg1 < m -// 0 ≤ eval arg2 < m -// Postconditions: -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// Output Bounds: -// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -func fiatFpMul(out1 *Fp, arg1 *Fp, arg2 *Fp) { - x1 := arg1[1] - x2 := arg1[0] - var x3 uint64 - var x4 uint64 - x4, x3 = bits.Mul64(x2, arg2[1]) - var x5 uint64 - var x6 uint64 - x6, x5 = bits.Mul64(x2, arg2[0]) - var x7 uint64 - var x8 uint64 - x7, x8 = bits.Add64(x6, x3, uint64(0x0)) - x9 := (x8 + x4) - var x10 uint64 - _, x10 = bits.Mul64(x5, 0xffffffffffffffff) - var x12 uint64 - var x13 uint64 - x13, x12 = bits.Mul64(x10, 0xffffffffffffffe4) - var x15 uint64 - _, x15 = bits.Add64(x5, x10, uint64(0x0)) - var x16 uint64 - var x17 uint64 - x16, x17 = bits.Add64(x7, x12, uint64(x15)) - var x18 uint64 - var x19 uint64 - x18, x19 = bits.Add64(x9, x13, uint64(x17)) - var x20 uint64 - var x21 uint64 - x21, x20 = bits.Mul64(x1, arg2[1]) - var x22 uint64 - var x23 uint64 - x23, x22 = bits.Mul64(x1, arg2[0]) - var x24 uint64 - var x25 uint64 - x24, x25 = bits.Add64(x23, x20, uint64(0x0)) - x26 := (x25 + x21) - var x27 uint64 - var x28 uint64 - x27, x28 = bits.Add64(x16, x22, uint64(0x0)) - var x29 uint64 - var x30 uint64 - x29, x30 = bits.Add64(x18, x24, uint64(x28)) - var x31 uint64 - var x32 uint64 - x31, x32 = bits.Add64(x19, x26, uint64(x30)) - var x33 uint64 - _, x33 = bits.Mul64(x27, 0xffffffffffffffff) - var x35 uint64 - var x36 uint64 - x36, x35 = bits.Mul64(x33, 0xffffffffffffffe4) - var x38 uint64 - _, x38 = bits.Add64(x27, x33, uint64(0x0)) - var x39 uint64 - var x40 uint64 - x39, x40 = bits.Add64(x29, x35, uint64(x38)) - var x41 uint64 - var x42 uint64 - x41, x42 = bits.Add64(x31, x36, uint64(x40)) - x43 := (x42 + x32) - var x44 uint64 - var x45 uint64 - x44, x45 = bits.Sub64(x39, 0x1, uint64(uint64(0x0))) - var x46 uint64 - var x47 uint64 - x46, x47 = bits.Sub64(x41, 0xffffffffffffffe4, uint64(x45)) - var x49 uint64 - _, x49 = bits.Sub64(x43, uint64(0x0), uint64(x47)) - var x50 uint64 - fiatFpCmovznzU64(&x50, x49, x44, x39) - var x51 uint64 - fiatFpCmovznzU64(&x51, x49, x46, x41) - out1[0] = x50 - out1[1] = x51 -} - -// The function fiatFpSquare squares a field element in the Montgomery domain. -// -// Preconditions: -// 0 ≤ eval arg1 < m -// Postconditions: -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -// Output Bounds: -// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] -func fiatFpSquare(out1 *Fp, arg1 *Fp) { - x1 := arg1[1] - x2 := arg1[0] - var x3 uint64 - var x4 uint64 - x4, x3 = bits.Mul64(x2, arg1[1]) - var x5 uint64 - var x6 uint64 - x6, x5 = bits.Mul64(x2, arg1[0]) - var x7 uint64 - var x8 uint64 - x7, x8 = bits.Add64(x6, x3, uint64(0x0)) - x9 := (x8 + x4) - var x10 uint64 - _, x10 = bits.Mul64(x5, 0xffffffffffffffff) - var x12 uint64 - var x13 uint64 - x13, x12 = bits.Mul64(x10, 0xffffffffffffffe4) - var x15 uint64 - _, x15 = bits.Add64(x5, x10, uint64(0x0)) - var x16 uint64 - var x17 uint64 - x16, x17 = bits.Add64(x7, x12, uint64(x15)) - var x18 uint64 - var x19 uint64 - x18, x19 = bits.Add64(x9, x13, uint64(x17)) - var x20 uint64 - var x21 uint64 - x21, x20 = bits.Mul64(x1, arg1[1]) - var x22 uint64 - var x23 uint64 - x23, x22 = bits.Mul64(x1, arg1[0]) - var x24 uint64 - var x25 uint64 - x24, x25 = bits.Add64(x23, x20, uint64(0x0)) - x26 := (x25 + x21) - var x27 uint64 - var x28 uint64 - x27, x28 = bits.Add64(x16, x22, uint64(0x0)) - var x29 uint64 - var x30 uint64 - x29, x30 = bits.Add64(x18, x24, uint64(x28)) - var x31 uint64 - var x32 uint64 - x31, x32 = bits.Add64(x19, x26, uint64(x30)) - var x33 uint64 - _, x33 = bits.Mul64(x27, 0xffffffffffffffff) - var x35 uint64 - var x36 uint64 - x36, x35 = bits.Mul64(x33, 0xffffffffffffffe4) - var x38 uint64 - _, x38 = bits.Add64(x27, x33, uint64(0x0)) - var x39 uint64 - var x40 uint64 - x39, x40 = bits.Add64(x29, x35, uint64(x38)) - var x41 uint64 - var x42 uint64 - x41, x42 = bits.Add64(x31, x36, uint64(x40)) - x43 := (x42 + x32) - var x44 uint64 - var x45 uint64 - x44, x45 = bits.Sub64(x39, 0x1, uint64(uint64(0x0))) - var x46 uint64 - var x47 uint64 - x46, x47 = bits.Sub64(x41, 0xffffffffffffffe4, uint64(x45)) - var x49 uint64 - _, x49 = bits.Sub64(x43, uint64(0x0), uint64(x47)) - var x50 uint64 - fiatFpCmovznzU64(&x50, x49, x44, x39) - var x51 uint64 - fiatFpCmovznzU64(&x51, x49, x46, x41) - out1[0] = x50 - out1[1] = x51 -} diff --git a/vdaf/prio3/arith/fp128/fp.go b/vdaf/prio3/arith/fp128/fp.go deleted file mode 100644 index dc29af57..00000000 --- a/vdaf/prio3/arith/fp128/fp.go +++ /dev/null @@ -1,277 +0,0 @@ -// Code generated from ./templates/field.go.tmpl. DO NOT EDIT. - -package fp128 - -import ( - "bytes" - "crypto/subtle" - "encoding/binary" - "errors" - "io" - - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/internal/sha3" - "golang.org/x/crypto/cryptobyte" -) - -// Size is the length in bytes of an Fp128 element. -const Size = 16 - -// Fp represents a prime field element as a positive integer less than Order. -type Fp [2]uint64 - -func (z Fp) String() string { x := z.fromMont(); return conv.Uint64Le2Hex(x[:]) } -func (z Fp) Size() uint { return Size } -func (z Fp) OrderRootUnity() uint { return numRootsUnity } -func (z *Fp) AddAssign(x *Fp) { fiatFpAdd(z, z, x) } -func (z *Fp) SubAssign(x *Fp) { fiatFpSub(z, z, x) } -func (z *Fp) MulAssign(x *Fp) { fiatFpMul(z, z, x) } -func (z *Fp) Add(x, y *Fp) { fiatFpAdd(z, x, y) } -func (z *Fp) Sub(x, y *Fp) { fiatFpSub(z, x, y) } -func (z *Fp) Mul(x, y *Fp) { fiatFpMul(z, x, y) } -func (z *Fp) Sqr(x *Fp) { fiatFpSquare(z, x) } -func (z *Fp) IsZero() bool { return ctEqual(z, &Fp{}) } -func (z *Fp) IsOne() bool { return ctEqual(z, &rootOfUnityTwoN[0]) } -func (z *Fp) IsEqual(x *Fp) bool { return ctEqual(z, x) } -func (z *Fp) SetOne() { *z = rootOfUnityTwoN[0] } -func (z *Fp) toMont() { fiatFpMul(z, z, &rSquare) } -func (z *Fp) fromMont() (out Fp) { fiatFpMul(&out, z, &Fp{1}); return } -func (z *Fp) MarshalBinary() ([]byte, error) { return conv.MarshalBinaryLen(z, Size) } -func (z *Fp) UnmarshalBinary(b []byte) error { return conv.UnmarshalBinary(z, b) } -func (z *Fp) Marshal(b *cryptobyte.Builder) error { - var x [Size]byte - for i, zi := range z.fromMont() { - binary.LittleEndian.PutUint64(x[8*i:], zi) - } - b.AddBytes(x[:]) - return nil -} - -func (z *Fp) Unmarshal(s *cryptobyte.String) bool { - var b [Size]byte - if s.CopyBytes(b[:]) { - n, ok := isInRange(&b) - if ok { - *z = n - z.toMont() - return true - } - } - return false -} - -func (z *Fp) Random(r io.Reader) error { - var b [Size]byte - var ok bool - for range maxNumTries { - _, err := r.Read(b[:]) - if err != nil { - return err - } - - *z, ok = isInRange(&b) - if ok { - z.toMont() - return nil - } - } - - return ErrMaxNumTries -} - -func (z *Fp) RandomSHA3(s *sha3.State) error { - var b [Size]byte - var ok bool - for range maxNumTries { - _, err := s.Read(b[:]) - if err != nil { - return err - } - - *z, ok = isInRange(&b) - if ok { - z.toMont() - return nil - } - } - - return ErrMaxNumTries -} - -func (z *Fp) InvUint64(x uint64) { - if 0 < x && x <= numInverseInt { - *z = inverseInt[x-1] - } else { - err := z.SetUint64(x) - if err != nil { - panic(ErrFieldEltDecode) - } - z.Inv(z) - } -} - -func (z *Fp) InvTwoN(n uint) { - z.SetOne() - for range n { - z.Mul(z, &half) - } -} - -func (z *Fp) SetUint64(n uint64) error { - *z = Fp{n} - z.toMont() - return nil -} - -func (z *Fp) GetUint64() (uint64, error) { - x := z.fromMont() - if x[1] != 0 { - return 0, ErrNumberTooLarge - } - return x[0], nil -} - -func (z *Fp) SetRootOfUnityTwoN(n uint) { - if n > numRootsUnity { - panic(ErrRootsOfUnity) - } - *z = rootOfUnityTwoN[n] -} - -func (z Fp) Order() []byte { - var x [Size]byte - binary.Write(bytes.NewBuffer(x[:0]), binary.BigEndian, []uint64{orderP1, orderP0}) - return x[:] -} - -func (z *Fp) sqri(x *Fp, n uint) { - z.Sqr(x) - for range n - 1 { - z.Sqr(z) - } -} - -func fiatFpCmovznzU64(z *uint64, b, x, y uint64) { *z = (x &^ (-b)) | (y & (-b)) } - -func ctEqual(x, y *Fp) bool { - var v uint64 - for i := 0; i < len(*x); i++ { - v |= (*x)[i] ^ (*y)[i] - } - v32 := uint32(v>>32) | uint32(v) - return subtle.ConstantTimeEq(int32(v32), 0) == 1 -} - -const ( - // order is the order of the Fp128 field. - orderP1 = uint64(0xffffffffffffffe4) - orderP0 = uint64(0x1) - // numRootsUnity is .. - numRootsUnity = 66 - // numInverseIntFp128 is the number of precomputed inverses. - numInverseInt = 8 - // maxNumTries is the maximum tries for rejection sampling. - maxNumTries = 10 -) - -var ( - // rSquare is R^2 mod Fp128Order, where R=2^128 (little-endian). - rSquare = Fp{0xfffffffffffffcf1, 0x0000000000005587} - // half is 1/2 mod Order. - half = Fp{0x0000000000000000, 0x8000000000000000} - // rootOfUnityTwoN are the (principal) roots of unity that generate - // a multiplicative group of order 2^n. - // i.e., rootOfUnityTwoN[i] generates a group of order 2^i. - // Thus, by definition, - // - rootOfUnityTwoN[0] = One - // - rootOfUnityTwoN[numRoots] = Generator - // Constants are encoded in Montgomery domain (little-endian). - rootOfUnityTwoN = [numRootsUnity + 1]Fp{ - {0xffffffffffffffff, 0x000000000000001b}, - {0x0000000000000002, 0xffffffffffffffc8}, - {0x8ff94ea745b7d9d6, 0x6171e408747992c7}, - {0x1323bb095fba9556, 0x7f2a4e6655e5a49c}, - {0xd1c455956aafabfc, 0x3d661493c5e89442}, - {0x416d53fbcdfcc65c, 0x5c159e1cffd5eca0}, - {0x1428d15e766f5f3e, 0x960d5c8696ec3aa3}, - {0x8f0cef59f8c23f3e, 0xcce83f596bb28730}, - {0x432d8d01ae187081, 0x12b496afe629224c}, - {0x0edc26fa686e3d3b, 0xc2026e57b1554ea9}, - {0x79663ccecfe8c86c, 0xf38c95d1e57405ea}, - {0xfecc377cf0f47a9f, 0x2b486d42d73283bd}, - {0x0ab1068497116540, 0x70866815dbf52bac}, - {0x2d9420dc5196c01a, 0x852c9b234b09c7df}, - {0x1a491a6cf3399115, 0xca4b831e2e621692}, - {0xb99152aabeebd757, 0xb7fbf514f82e2269}, - {0xb8da2f851dfd594a, 0x597c0e93a246d640}, - {0xf2888c210ef9f1c4, 0x97f929a5d52ab886}, - {0xe6a0ccbc956fc7fb, 0xfa4748aea960d0eb}, - {0xe53d6d96e1ec92a0, 0xc24ed95c3c013bcc}, - {0x6cc6e9129e1679c0, 0x6f825f88648b270c}, - {0x2c4d04cc40a2bd04, 0x17c2af4df9629e3d}, - {0x843747925bd7da8e, 0xdcd8c9979b888e8a}, - {0x4a1b1730d0aa77a0, 0x391696912d85b368}, - {0x68fb2b7e053e9500, 0x8ab5e54096ca012c}, - {0x1ccc0958442d4cd2, 0x819909091849c5c1}, - {0x25e9f8eeb3a11b26, 0x741eb9f6cfde0f02}, - {0x57b7921d9d4d0d66, 0x681f358ffad3a90d}, - {0x9bd3b6be3602bfe2, 0x294e31a63bbd8bb1}, - {0xe36811a2b6dd2f4d, 0x402946e8dcc86185}, - {0x468354d0ce6f4f42, 0xdc3971476a49c161}, - {0xd42c20d91e16ba3b, 0x16849c909ba2920d}, - {0x488a61cbe76f8796, 0xe0312b455090dc3d}, - {0x34d592b2d95461c7, 0x69ff23c4ae8a9ae2}, - {0xab1c9df91252cfb0, 0x3a71deec98434255}, - {0x1c5f61d837a9ff92, 0x4ec0bbb14b4943fc}, - {0x2550c6695de272ea, 0x4e7f5d927ad2bb46}, - {0x786b6c965e58be0d, 0xfbb47d3729647361}, - {0xbbfba318618fff40, 0x58938d40e16fc273}, - {0x0c8b4baee9a2907f, 0x2b0dddcff641c0c4}, - {0xf0d881f5c07b45fc, 0x33044b6b9af79104}, - {0x530f1c8d85c53b49, 0x7277db26e889f0c0}, - {0xefe24ff8e3caacf0, 0xd39b9320d2172567}, - {0xee7e1fbb71e9b04c, 0x105d0de0eba9ed48}, - {0x743424fea03af69b, 0xff50f6975f58d667}, - {0x1e55f4c8165fa615, 0x60d0d6428bc526f6}, - {0xf89e2f45fe30a628, 0xd35040e25d621120}, - {0x93a9b9bfa0ba47e5, 0xa14eda13d2c9f218}, - {0x7184aca1f5b7d796, 0x3067d899e53ae149}, - {0x48c135bbd45c9f78, 0x0231ec7261c6fe5e}, - {0xace311a714d11f45, 0x985458a22fc7b74f}, - {0xebd8c0f65c3941c7, 0x9253e8d60d138145}, - {0xa22ef3d3cf82d6ff, 0xf616691696239dad}, - {0xeb43ea48a880c558, 0x4c33bc414d65c622}, - {0xb02ca157db2f5773, 0x0ca75daa548fab25}, - {0x2e2d3b5d3d7fd880, 0xe709ce35344480a0}, - {0x04febe6d0fed06db, 0x82de81148eada3d0}, - {0xc549b2f670e7fe80, 0xef7c7c796a560813}, - {0x420d567cfa7dd71d, 0xd10bc78478e67eba}, - {0xd4e1bfae0eae0e5d, 0x69c02ae2b2189664}, - {0xee5aab9df23ad495, 0xe7fa9150bd2dd0bb}, - {0xdbe38168360cebac, 0x612d7349f49997ad}, - {0x9e4fc0f4006111e3, 0x54879fe858345e92}, - {0x3c5dd0cda73814c2, 0x1a29ef0cd721372e}, - {0x8b45f6e90b16542d, 0xd9b5db39af523ffb}, - {0x336824df50a3e9de, 0x1f70898af1701972}, - {0xf0111fb98c6b9875, 0x50f8f7f554db309c}, - } - // inverseInt has the inverse of the first `numInverseInt` integers. - inverseInt = [numInverseInt]Fp{ - {0xffffffffffffffff, 0x000000000000001b}, - {0x0000000000000000, 0x8000000000000000}, - {0x5555555555555555, 0x0000000000000009}, - {0x0000000000000000, 0x4000000000000000}, - {0xcccccccccccccccd, 0x6666666666666660}, - {0xaaaaaaaaaaaaaaab, 0x7ffffffffffffff6}, - {0xdb6db6db6db6db6e, 0x6db6db6db6db6dae}, - {0x0000000000000000, 0x2000000000000000}, - } -) - -var ( - ErrMatchLen = errors.New("inputs mismatched length") - ErrFieldEltDecode = errors.New("incorrect field element value") - ErrNumberTooLarge = errors.New("number of bits is not enough to represent the number") - ErrMaxNumTries = errors.New("random rejection sampling reached maximum number of tries") - ErrRootsOfUnity = errors.New("Fp has no roots of unity of order larger than 2^66") -) diff --git a/vdaf/prio3/arith/fp128/inverse.go b/vdaf/prio3/arith/fp128/inverse.go deleted file mode 100644 index 748ed960..00000000 --- a/vdaf/prio3/arith/fp128/inverse.go +++ /dev/null @@ -1,27 +0,0 @@ -package fp128 - -func (z *Fp) Inv(x *Fp) { - // Addition chain found using mmcloughlin/addchain: v0.4.0 - // (McLoughlin, 2021). https://doi.org/10.5281/zenodo.4758226 - var t, t0, t1, t2 Fp - t.Sqr(x) - t.Mul(x, &t) - t.Sqr(&t) - t0.Mul(x, &t) - t.Sqr(&t0) - t1.sqri(&t, 3) - t.Mul(&t, &t1) - t.Mul(x, &t) - t1.sqri(&t, 3) - t2.sqri(&t1, 7) - t1.Mul(&t1, &t2) - t2.sqri(&t1, 14) - t1.Mul(&t1, &t2) - t2.sqri(&t1, 28) - t1.Mul(&t1, &t2) - t0.Mul(&t0, &t1) - t1.sqri(&t0, 62) - t0.Mul(&t0, &t1) - t0.sqri(&t0, 7) - z.Mul(&t, &t0) -} diff --git a/vdaf/prio3/arith/fp128/poly.go b/vdaf/prio3/arith/fp128/poly.go deleted file mode 100644 index 752ca256..00000000 --- a/vdaf/prio3/arith/fp128/poly.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated from ./templates/poly.go.tmpl. DO NOT EDIT. - -package fp128 - -import "github.com/quantumcoinproject/circl/math" - -type Poly []Fp - -func (p Poly) AddAssign(x Poly) { Vec(p).AddAssign(Vec(x)) } -func (p Poly) SubAssign(x Poly) { Vec(p).SubAssign(Vec(x)) } -func (p Poly) Mul(x, y Poly) { - const thresholdPolyMul = 128 - if len(x)+len(y)-1 < thresholdPolyMul { - p.MulNSquare(x, y) - } else { - p.MulNlogN(x, y) - } -} - -func (p Poly) MulNSquare(x, y Poly) { - mustSumLen(p, x, y) - clear(p) - var xiyj Fp - for i := range x { - for j := range y { - xiyj.Mul(&x[i], &y[j]) - p[i+j].AddAssign(&xiyj) - } - } -} - -func (p Poly) MulNlogN(x, y Poly) { - mustSumLen(p, x, y) - N, logN := math.NextPow2(uint(len(x) + len(y) - 1)) - buf := make(Vec, 2*N) - lx, ly := buf[:N], buf[N:] - lx.NTT(Vec(x), N) - ly.NTT(Vec(y), N) - for i := range lx { - lx[i].MulAssign(&ly[i]) - } - - ly.InvNTT(lx, N) - var invN Fp - invN.InvTwoN(logN) - copy(p, ly) - Vec(p).ScalarMul(&invN) -} - -func (p Poly) Sqr(x Poly) { - mustSumLen(p, x, x) - clear(p) - for i := range x { - p[2*i].Sqr(&x[i]) - } - - var xixj Fp - for i := 0; i < len(x); i++ { - for j := i + 1; j < len(x); j++ { - xixj.Mul(&x[i], &x[j]) - xixj.AddAssign(&xixj) - p[i+j].AddAssign(&xixj) - } - } -} - -func (p Poly) Evaluate(x *Fp) (px Fp) { - if l := len(p); l != 0 { - px = p[l-1] - for i := l - 2; i >= 0; i-- { - px.MulAssign(x) - px.AddAssign(&p[i]) - } - } - - return -} - -func (p Poly) Strip() Poly { - for i := len(p) - 1; i >= 0; i-- { - if !p[i].IsZero() { - return p[:i+1] - } - } - - return p[:0] -} diff --git a/vdaf/prio3/arith/fp128/vector.go b/vdaf/prio3/arith/fp128/vector.go deleted file mode 100644 index 59753d1d..00000000 --- a/vdaf/prio3/arith/fp128/vector.go +++ /dev/null @@ -1,219 +0,0 @@ -// Code generated from ./templates/vector.go.tmpl. DO NOT EDIT. - -package fp128 - -import ( - "encoding/binary" - "io" - "math/bits" - "slices" - - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/math" - "golang.org/x/crypto/cryptobyte" -) - -type Vec []Fp - -func (v Vec) Size() uint { return Size * uint(len(v)) } - -func (v Vec) AddAssign(x Vec) { - mustSameLen(v, x) - for i := range v { - v[i].AddAssign(&x[i]) - } -} - -func (v Vec) SubAssign(x Vec) { - mustSameLen(v, x) - for i := range v { - v[i].SubAssign(&x[i]) - } -} - -func (v Vec) ScalarMul(x *Fp) { - for i := range v { - v[i].MulAssign(x) - } -} - -func (v Vec) DotProduct(x Vec) (out Fp) { - mustSameLen(v, x) - var t Fp - for i := range v { - t.Mul(&v[i], &x[i]) - out.AddAssign(&t) - } - return -} - -func bitRev(x uint, numBits uint) uint { - return bits.Reverse(x) >> (bits.UintSize - numBits) -} - -func (v Vec) InvNTT(values Vec, n uint) { - v.NTT(values, n) - slices.Reverse(v[1:]) -} - -func (v Vec) NTT(values Vec, n uint) { - valuesLen := uint(len(values)) - _, logN := math.NextPow2(n) - - for i := range v { - j := bitRev(uint(i), logN) - if j < valuesLen { - v[i] = values[j] - } - } - - var t, w, wn Fp - for l := uint(1); l <= logN; l++ { - y := uint(1) << (l - 1) - chunk := uint(1) << (logN - l) - - for j := range chunk { - x := j << l - u := v[x] - v[x+0].Add(&u, &v[x+y]) - v[x+y].Sub(&u, &v[x+y]) - } - - w.SetOne() - wn.SetRootOfUnityTwoN(l) - for i := uint(1); i < y; i++ { - w.MulAssign(&wn) - for j := range chunk { - x := (j << l) + i - u := v[x] - t.Mul(&w, &v[x+y]) - v[x+0].Add(&u, &t) - v[x+y].Sub(&u, &t) - } - } - } -} - -func (v Vec) SplitBits(n uint64) error { - if bits.Len64(n) > len(v) { - return ErrNumberTooLarge - } - - clear(v) - for i := range v { - if (n>>i)&0x1 == 1 { - v[i].SetOne() - } - } - - return nil -} - -func (v Vec) JoinBits() Fp { - var two Fp - _ = two.SetUint64(2) - return Poly(v).Evaluate(&two) -} - -func (v Vec) Random(rnd io.Reader) error { - var b [Size]byte - var ok bool -forVec: - for i := range v { - for range maxNumTries { - _, err := rnd.Read(b[:]) - if err != nil { - return err - } - - v[i], ok = isInRange(&b) - if ok { - v[i].toMont() - continue forVec - } - } - return ErrMaxNumTries - } - - return nil -} - -func (v Vec) RandomSHA3(s *sha3.State) error { - for i := range v { - err := v[i].RandomSHA3(s) - if err != nil { - return err - } - } - - return nil -} - -func (v Vec) RandomSHA3Bytes(out []byte, s *sha3.State) error { - var b [Size]byte - var ok bool - -forVec: - for i := range v { - for range maxNumTries { - _, err := s.Read(b[:]) - if err != nil { - return err - } - - v[i], ok = isInRange(&b) - if ok { - out = append(out, b[:]...) - v[i].toMont() - continue forVec - } - } - - return ErrMaxNumTries - } - return nil -} - -func (v Vec) MarshalBinary() ([]byte, error) { - return conv.MarshalBinaryLen(v, v.Size()) -} - -func (v Vec) UnmarshalBinary(b []byte) error { - return conv.UnmarshalBinary(v, b) -} - -func (v Vec) Marshal(b *cryptobyte.Builder) error { - for i := range v { - v[i].Marshal(b) - } - return nil -} - -func (v Vec) Unmarshal(s *cryptobyte.String) bool { - for i := range v { - if !v[i].Unmarshal(s) { - return false - } - } - return true -} - -func isInRange(b *[Size]byte) (out [2]uint64, ok bool) { - out[1] = binary.LittleEndian.Uint64(b[8:]) - out[0] = binary.LittleEndian.Uint64(b[:8]) - ok = out[1] < orderP1 || (out[1] == orderP1 && out[0] < orderP0) - return -} - -func mustSameLen[T ~[]E, E any](x, y T) { - if len(x) != len(y) { - panic(ErrMatchLen) - } -} - -func mustSumLen[T ~[]E, E any](z, x, y T) { - if len(z) != len(x)+len(y)-1 { - panic(ErrMatchLen) - } -} diff --git a/vdaf/prio3/arith/fp128_test.go b/vdaf/prio3/arith/fp128_test.go deleted file mode 100644 index a3cbaeec..00000000 --- a/vdaf/prio3/arith/fp128_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// Code generated from ./templates/field_test.go.tmpl. DO NOT EDIT. - -package arith - -import ( - "testing" - - "github.com/quantumcoinproject/circl/vdaf/prio3/arith/fp128" -) - -func TestFp128(t *testing.T) { - t.Run("Fp", testFp[fp128.Fp]) - t.Run("Vec", testVec[fp128.Vec]) - t.Run("Poly", testPoly[fp128.Poly, fp128.Vec]) -} - -func BenchmarkFp128(b *testing.B) { - b.Run("Fp", benchmarkFp[fp128.Fp]) - b.Run("Vec", benchmarkVec[fp128.Vec]) - b.Run("Poly", benchmarkPoly[fp128.Poly, fp128.Vec]) -} diff --git a/vdaf/prio3/arith/fp64/fiatMont.go b/vdaf/prio3/arith/fp64/fiatMont.go deleted file mode 100644 index f4977153..00000000 --- a/vdaf/prio3/arith/fp64/fiatMont.go +++ /dev/null @@ -1,171 +0,0 @@ -// Code generated by fiat.go using fiat-crypto v0.1.4. -// -// Autogenerated: './FiatCrypto_v.0.1.4-issue1672' word-by-word-montgomery --output 'fp64/fiatMont.go' --lang Go --package-name fp64 --doc-prepend-header 'Code generated by fiat.go using fiat-crypto v0.1.4.' --package-case lowerCamelCase --public-function-case lowerCamelCase --public-type-case lowerCamelCase --doc-newline-before-package-declaration --no-primitives --widen-carry --no-field-element-typedefs --relax-primitive-carry-to-bitwidth 64 Fp 64 0xffffffff00000001 add sub mul square -// -// curve description: Fp -// -// machine_wordsize = 64 (from "64") -// -// requested operations: add, sub, mul, square -// -// m = 0xffffffff00000001 (from "0xffffffff00000001") -// -// -// -// NOTE: In addition to the bounds specified above each function, all -// -// functions synthesized for this Montgomery arithmetic require the -// -// input to be strictly less than the prime modulus (m), and also -// -// require the input to be in the unique saturated representation. -// -// All functions also ensure that these two properties are true of -// -// return values. -// -// -// -// Computed values: -// -// eval z = z[0] -// -// bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) -// -// twos_complement_eval z = let x1 := z[0] in -// -// if x1 & (2^64-1) < 2^63 then x1 & (2^64-1) else (x1 & (2^64-1)) - 2^64 - -package fp64 - -import "math/bits" - -// The function fiatFpAdd adds two field elements in the Montgomery domain. -// -// Preconditions: -// 0 ≤ eval arg1 < m -// 0 ≤ eval arg2 < m -// Postconditions: -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// arg1: [[0x0 ~> 0xffffffffffffffff]] -// arg2: [[0x0 ~> 0xffffffffffffffff]] -// Output Bounds: -// out1: [[0x0 ~> 0xffffffffffffffff]] -func fiatFpAdd(out1 *Fp, arg1 *Fp, arg2 *Fp) { - var x1 uint64 - var x2 uint64 - x1, x2 = bits.Add64(arg1[0], arg2[0], uint64(0x0)) - var x3 uint64 - var x4 uint64 - x3, x4 = bits.Sub64(x1, 0xffffffff00000001, uint64(uint64(0x0))) - var x6 uint64 - _, x6 = bits.Sub64(x2, uint64(0x0), uint64(x4)) - var x7 uint64 - fiatFpCmovznzU64(&x7, x6, x3, x1) - out1[0] = x7 -} - -// The function fiatFpSub subtracts two field elements in the Montgomery domain. -// -// Preconditions: -// 0 ≤ eval arg1 < m -// 0 ≤ eval arg2 < m -// Postconditions: -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// arg1: [[0x0 ~> 0xffffffffffffffff]] -// arg2: [[0x0 ~> 0xffffffffffffffff]] -// Output Bounds: -// out1: [[0x0 ~> 0xffffffffffffffff]] -func fiatFpSub(out1 *Fp, arg1 *Fp, arg2 *Fp) { - x1 := arg2[0] - var x2 uint64 - var x3 uint64 - x2, x3 = bits.Sub64(arg1[0], x1, uint64(0x0)) - var x4 uint64 - fiatFpCmovznzU64(&x4, x3, uint64(0x0), 0xffffffffffffffff) - var x5 uint64 - x5, _ = bits.Add64(x2, (x4 & 0xffffffff00000001), uint64(0x0)) - out1[0] = x5 -} - -// The function fiatFpMul multiplies two field elements in the Montgomery domain. -// -// Preconditions: -// 0 ≤ eval arg1 < m -// 0 ≤ eval arg2 < m -// Postconditions: -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// arg1: [[0x0 ~> 0xffffffffffffffff]] -// arg2: [[0x0 ~> 0xffffffffffffffff]] -// Output Bounds: -// out1: [[0x0 ~> 0xffffffffffffffff]] -func fiatFpMul(out1 *Fp, arg1 *Fp, arg2 *Fp) { - x1 := arg1[0] - var x2 uint64 - var x3 uint64 - x3, x2 = bits.Mul64(x1, arg2[0]) - var x4 uint64 - _, x4 = bits.Mul64(x2, 0xfffffffeffffffff) - var x6 uint64 - var x7 uint64 - x7, x6 = bits.Mul64(x4, 0xffffffff00000001) - var x9 uint64 - _, x9 = bits.Add64(x2, x6, uint64(0x0)) - var x10 uint64 - var x11 uint64 - x10, x11 = bits.Add64(x3, x7, uint64(x9)) - var x12 uint64 - var x13 uint64 - x12, x13 = bits.Sub64(x10, 0xffffffff00000001, uint64(uint64(0x0))) - var x15 uint64 - _, x15 = bits.Sub64(x11, uint64(0x0), uint64(x13)) - var x16 uint64 - fiatFpCmovznzU64(&x16, x15, x12, x10) - out1[0] = x16 -} - -// The function fiatFpSquare squares a field element in the Montgomery domain. -// -// Preconditions: -// 0 ≤ eval arg1 < m -// Postconditions: -// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m -// 0 ≤ eval out1 < m -// -// Input Bounds: -// arg1: [[0x0 ~> 0xffffffffffffffff]] -// Output Bounds: -// out1: [[0x0 ~> 0xffffffffffffffff]] -func fiatFpSquare(out1 *Fp, arg1 *Fp) { - x1 := arg1[0] - var x2 uint64 - var x3 uint64 - x3, x2 = bits.Mul64(x1, arg1[0]) - var x4 uint64 - _, x4 = bits.Mul64(x2, 0xfffffffeffffffff) - var x6 uint64 - var x7 uint64 - x7, x6 = bits.Mul64(x4, 0xffffffff00000001) - var x9 uint64 - _, x9 = bits.Add64(x2, x6, uint64(0x0)) - var x10 uint64 - var x11 uint64 - x10, x11 = bits.Add64(x3, x7, uint64(x9)) - var x12 uint64 - var x13 uint64 - x12, x13 = bits.Sub64(x10, 0xffffffff00000001, uint64(uint64(0x0))) - var x15 uint64 - _, x15 = bits.Sub64(x11, uint64(0x0), uint64(x13)) - var x16 uint64 - fiatFpCmovznzU64(&x16, x15, x12, x10) - out1[0] = x16 -} diff --git a/vdaf/prio3/arith/fp64/fp.go b/vdaf/prio3/arith/fp64/fp.go deleted file mode 100644 index 46a88723..00000000 --- a/vdaf/prio3/arith/fp64/fp.go +++ /dev/null @@ -1,242 +0,0 @@ -// Code generated from ./templates/field.go.tmpl. DO NOT EDIT. - -package fp64 - -import ( - "bytes" - "crypto/subtle" - "encoding/binary" - "errors" - "io" - - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/internal/sha3" - "golang.org/x/crypto/cryptobyte" -) - -// Size is the length in bytes of an Fp64 element. -const Size = 8 - -// Fp represents a prime field element as a positive integer less than Order. -type Fp [1]uint64 - -func (z Fp) String() string { x := z.fromMont(); return conv.Uint64Le2Hex(x[:]) } -func (z Fp) Size() uint { return Size } -func (z Fp) OrderRootUnity() uint { return numRootsUnity } -func (z *Fp) AddAssign(x *Fp) { fiatFpAdd(z, z, x) } -func (z *Fp) SubAssign(x *Fp) { fiatFpSub(z, z, x) } -func (z *Fp) MulAssign(x *Fp) { fiatFpMul(z, z, x) } -func (z *Fp) Add(x, y *Fp) { fiatFpAdd(z, x, y) } -func (z *Fp) Sub(x, y *Fp) { fiatFpSub(z, x, y) } -func (z *Fp) Mul(x, y *Fp) { fiatFpMul(z, x, y) } -func (z *Fp) Sqr(x *Fp) { fiatFpSquare(z, x) } -func (z *Fp) IsZero() bool { return ctEqual(z, &Fp{}) } -func (z *Fp) IsOne() bool { return ctEqual(z, &rootOfUnityTwoN[0]) } -func (z *Fp) IsEqual(x *Fp) bool { return ctEqual(z, x) } -func (z *Fp) SetOne() { *z = rootOfUnityTwoN[0] } -func (z *Fp) toMont() { fiatFpMul(z, z, &rSquare) } -func (z *Fp) fromMont() (out Fp) { fiatFpMul(&out, z, &Fp{1}); return } -func (z *Fp) MarshalBinary() ([]byte, error) { return conv.MarshalBinaryLen(z, Size) } -func (z *Fp) UnmarshalBinary(b []byte) error { return conv.UnmarshalBinary(z, b) } -func (z *Fp) Marshal(b *cryptobyte.Builder) error { - var x [Size]byte - for i, zi := range z.fromMont() { - binary.LittleEndian.PutUint64(x[8*i:], zi) - } - b.AddBytes(x[:]) - return nil -} - -func (z *Fp) Unmarshal(s *cryptobyte.String) bool { - var b [Size]byte - if s.CopyBytes(b[:]) { - n, ok := isInRange(&b) - if ok { - *z = n - z.toMont() - return true - } - } - return false -} - -func (z *Fp) Random(r io.Reader) error { - var b [Size]byte - var ok bool - for range maxNumTries { - _, err := r.Read(b[:]) - if err != nil { - return err - } - - *z, ok = isInRange(&b) - if ok { - z.toMont() - return nil - } - } - - return ErrMaxNumTries -} - -func (z *Fp) RandomSHA3(s *sha3.State) error { - var b [Size]byte - var ok bool - for range maxNumTries { - _, err := s.Read(b[:]) - if err != nil { - return err - } - - *z, ok = isInRange(&b) - if ok { - z.toMont() - return nil - } - } - - return ErrMaxNumTries -} - -func (z *Fp) InvUint64(x uint64) { - if 0 < x && x <= numInverseInt { - *z = inverseInt[x-1] - } else { - err := z.SetUint64(x) - if err != nil { - panic(ErrFieldEltDecode) - } - z.Inv(z) - } -} - -func (z *Fp) InvTwoN(n uint) { - z.SetOne() - for range n { - z.Mul(z, &half) - } -} - -func (z *Fp) SetUint64(n uint64) error { - if n >= orderP0 { - return ErrFieldEltDecode - } - *z = Fp{n} - z.toMont() - return nil -} - -func (z *Fp) GetUint64() (uint64, error) { - x := z.fromMont() - return x[0], nil -} - -func (z *Fp) SetRootOfUnityTwoN(n uint) { - if n > numRootsUnity { - panic(ErrRootsOfUnity) - } - *z = rootOfUnityTwoN[n] -} - -func (z Fp) Order() []byte { - var x [Size]byte - binary.Write(bytes.NewBuffer(x[:0]), binary.BigEndian, []uint64{orderP0}) - return x[:] -} - -func (z *Fp) sqri(x *Fp, n uint) { - z.Sqr(x) - for range n - 1 { - z.Sqr(z) - } -} - -func fiatFpCmovznzU64(z *uint64, b, x, y uint64) { *z = (x &^ (-b)) | (y & (-b)) } - -func ctEqual(x, y *Fp) bool { - var v uint64 - for i := 0; i < len(*x); i++ { - v |= (*x)[i] ^ (*y)[i] - } - v32 := uint32(v>>32) | uint32(v) - return subtle.ConstantTimeEq(int32(v32), 0) == 1 -} - -const ( - // order is the order of the Fp64 field. - orderP0 = uint64(0xffffffff00000001) - // numRootsUnity is .. - numRootsUnity = 32 - // numInverseIntFp64 is the number of precomputed inverses. - numInverseInt = 8 - // maxNumTries is the maximum tries for rejection sampling. - maxNumTries = 10 -) - -var ( - // rSquare is R^2 mod Fp64Order, where R=2^64 (little-endian). - rSquare = Fp{0xfffffffe00000001} - // half is 1/2 mod Order. - half = Fp{0x8000000000000000} - // rootOfUnityTwoN are the (principal) roots of unity that generate - // a multiplicative group of order 2^n. - // i.e., rootOfUnityTwoN[i] generates a group of order 2^i. - // Thus, by definition, - // - rootOfUnityTwoN[0] = One - // - rootOfUnityTwoN[numRoots] = Generator - // Constants are encoded in Montgomery domain (little-endian). - rootOfUnityTwoN = [numRootsUnity + 1]Fp{ - {0x00000000ffffffff}, - {0xfffffffe00000002}, - {0xfffffffeffff0001}, - {0xfeffffff01000001}, - {0x0000000010000000}, - {0xffffbfff00000001}, - {0xfffffffeffffff81}, - {0x07fffffffffff800}, - {0xe60ca9645a7a425e}, - {0x5c411f4d8ab91088}, - {0x8bfed970d671fbb7}, - {0x1da1c8cedc0a82b1}, - {0x959dfcb4779eb1b1}, - {0x35d17996b4e99746}, - {0x10bba1e10e56548b}, - {0x2306baaae6467556}, - {0xbf79450ceba724c2}, - {0xaa3d8a0ca9f1cf0a}, - {0x05f9beab78de26d9}, - {0x8caa33007781b093}, - {0x5e93e76c70b1e9c6}, - {0x32322652d8cb2ab7}, - {0xe67246b3ce63a09e}, - {0x36fbc989de66dc62}, - {0xc307e16fb62a525e}, - {0x6ecfefd745751a91}, - {0x78d6e28499e74d1f}, - {0x915a171c5dce5b0b}, - {0x004a4484a6b1267b}, - {0xa46d26647bea105f}, - {0xb86a0843c8fa27b2}, - {0x5588e6586a6c9a32}, - {0xda58878b0d514e98}, - } - // inverseInt has the inverse of the first `numInverseInt` integers. - inverseInt = [numInverseInt]Fp{ - {0x00000000ffffffff}, - {0x8000000000000000}, - {0x0000000055555555}, - {0x4000000000000000}, - {0x0000000033333333}, - {0x7fffffffaaaaaaab}, - {0x6db6db6d6db6db6e}, - {0x2000000000000000}, - } -) - -var ( - ErrMatchLen = errors.New("inputs mismatched length") - ErrFieldEltDecode = errors.New("incorrect field element value") - ErrNumberTooLarge = errors.New("number of bits is not enough to represent the number") - ErrMaxNumTries = errors.New("random rejection sampling reached maximum number of tries") - ErrRootsOfUnity = errors.New("Fp has no roots of unity of order larger than 2^32") -) diff --git a/vdaf/prio3/arith/fp64/inverse.go b/vdaf/prio3/arith/fp64/inverse.go deleted file mode 100644 index be1e467c..00000000 --- a/vdaf/prio3/arith/fp64/inverse.go +++ /dev/null @@ -1,25 +0,0 @@ -package fp64 - -func (z *Fp) Inv(x *Fp) { - // Addition chain found using mmcloughlin/addchain: v0.4.0 - // (McLoughlin, 2021). https://doi.org/10.5281/zenodo.4758226 - var t, t0, t1 Fp - t.Sqr(x) - t.Mul(x, &t) - t.Sqr(&t) - t.Mul(x, &t) - t0.sqri(&t, 3) - t0.Mul(&t, &t0) - t1.Sqr(&t0) - t.Mul(x, &t1) - t1.sqri(&t1, 5) - t0.Mul(&t0, &t1) - t1.sqri(&t0, 12) - t0.Mul(&t0, &t1) - t0.sqri(&t0, 7) - t.Mul(&t, &t0) - t0.sqri(&t, 32) - t.Mul(&t, &t0) - t.Sqr(&t) - z.Mul(x, &t) -} diff --git a/vdaf/prio3/arith/fp64/poly.go b/vdaf/prio3/arith/fp64/poly.go deleted file mode 100644 index 7ad8266f..00000000 --- a/vdaf/prio3/arith/fp64/poly.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated from ./templates/poly.go.tmpl. DO NOT EDIT. - -package fp64 - -import "github.com/quantumcoinproject/circl/math" - -type Poly []Fp - -func (p Poly) AddAssign(x Poly) { Vec(p).AddAssign(Vec(x)) } -func (p Poly) SubAssign(x Poly) { Vec(p).SubAssign(Vec(x)) } -func (p Poly) Mul(x, y Poly) { - const thresholdPolyMul = 128 - if len(x)+len(y)-1 < thresholdPolyMul { - p.MulNSquare(x, y) - } else { - p.MulNlogN(x, y) - } -} - -func (p Poly) MulNSquare(x, y Poly) { - mustSumLen(p, x, y) - clear(p) - var xiyj Fp - for i := range x { - for j := range y { - xiyj.Mul(&x[i], &y[j]) - p[i+j].AddAssign(&xiyj) - } - } -} - -func (p Poly) MulNlogN(x, y Poly) { - mustSumLen(p, x, y) - N, logN := math.NextPow2(uint(len(x) + len(y) - 1)) - buf := make(Vec, 2*N) - lx, ly := buf[:N], buf[N:] - lx.NTT(Vec(x), N) - ly.NTT(Vec(y), N) - for i := range lx { - lx[i].MulAssign(&ly[i]) - } - - ly.InvNTT(lx, N) - var invN Fp - invN.InvTwoN(logN) - copy(p, ly) - Vec(p).ScalarMul(&invN) -} - -func (p Poly) Sqr(x Poly) { - mustSumLen(p, x, x) - clear(p) - for i := range x { - p[2*i].Sqr(&x[i]) - } - - var xixj Fp - for i := 0; i < len(x); i++ { - for j := i + 1; j < len(x); j++ { - xixj.Mul(&x[i], &x[j]) - xixj.AddAssign(&xixj) - p[i+j].AddAssign(&xixj) - } - } -} - -func (p Poly) Evaluate(x *Fp) (px Fp) { - if l := len(p); l != 0 { - px = p[l-1] - for i := l - 2; i >= 0; i-- { - px.MulAssign(x) - px.AddAssign(&p[i]) - } - } - - return -} - -func (p Poly) Strip() Poly { - for i := len(p) - 1; i >= 0; i-- { - if !p[i].IsZero() { - return p[:i+1] - } - } - - return p[:0] -} diff --git a/vdaf/prio3/arith/fp64/vector.go b/vdaf/prio3/arith/fp64/vector.go deleted file mode 100644 index f509336a..00000000 --- a/vdaf/prio3/arith/fp64/vector.go +++ /dev/null @@ -1,218 +0,0 @@ -// Code generated from ./templates/vector.go.tmpl. DO NOT EDIT. - -package fp64 - -import ( - "encoding/binary" - "io" - "math/bits" - "slices" - - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/math" - "golang.org/x/crypto/cryptobyte" -) - -type Vec []Fp - -func (v Vec) Size() uint { return Size * uint(len(v)) } - -func (v Vec) AddAssign(x Vec) { - mustSameLen(v, x) - for i := range v { - v[i].AddAssign(&x[i]) - } -} - -func (v Vec) SubAssign(x Vec) { - mustSameLen(v, x) - for i := range v { - v[i].SubAssign(&x[i]) - } -} - -func (v Vec) ScalarMul(x *Fp) { - for i := range v { - v[i].MulAssign(x) - } -} - -func (v Vec) DotProduct(x Vec) (out Fp) { - mustSameLen(v, x) - var t Fp - for i := range v { - t.Mul(&v[i], &x[i]) - out.AddAssign(&t) - } - return -} - -func bitRev(x uint, numBits uint) uint { - return bits.Reverse(x) >> (bits.UintSize - numBits) -} - -func (v Vec) InvNTT(values Vec, n uint) { - v.NTT(values, n) - slices.Reverse(v[1:]) -} - -func (v Vec) NTT(values Vec, n uint) { - valuesLen := uint(len(values)) - _, logN := math.NextPow2(n) - - for i := range v { - j := bitRev(uint(i), logN) - if j < valuesLen { - v[i] = values[j] - } - } - - var t, w, wn Fp - for l := uint(1); l <= logN; l++ { - y := uint(1) << (l - 1) - chunk := uint(1) << (logN - l) - - for j := range chunk { - x := j << l - u := v[x] - v[x+0].Add(&u, &v[x+y]) - v[x+y].Sub(&u, &v[x+y]) - } - - w.SetOne() - wn.SetRootOfUnityTwoN(l) - for i := uint(1); i < y; i++ { - w.MulAssign(&wn) - for j := range chunk { - x := (j << l) + i - u := v[x] - t.Mul(&w, &v[x+y]) - v[x+0].Add(&u, &t) - v[x+y].Sub(&u, &t) - } - } - } -} - -func (v Vec) SplitBits(n uint64) error { - if bits.Len64(n) > len(v) { - return ErrNumberTooLarge - } - - clear(v) - for i := range v { - if (n>>i)&0x1 == 1 { - v[i].SetOne() - } - } - - return nil -} - -func (v Vec) JoinBits() Fp { - var two Fp - _ = two.SetUint64(2) - return Poly(v).Evaluate(&two) -} - -func (v Vec) Random(rnd io.Reader) error { - var b [Size]byte - var ok bool -forVec: - for i := range v { - for range maxNumTries { - _, err := rnd.Read(b[:]) - if err != nil { - return err - } - - v[i], ok = isInRange(&b) - if ok { - v[i].toMont() - continue forVec - } - } - return ErrMaxNumTries - } - - return nil -} - -func (v Vec) RandomSHA3(s *sha3.State) error { - for i := range v { - err := v[i].RandomSHA3(s) - if err != nil { - return err - } - } - - return nil -} - -func (v Vec) RandomSHA3Bytes(out []byte, s *sha3.State) error { - var b [Size]byte - var ok bool - -forVec: - for i := range v { - for range maxNumTries { - _, err := s.Read(b[:]) - if err != nil { - return err - } - - v[i], ok = isInRange(&b) - if ok { - out = append(out, b[:]...) - v[i].toMont() - continue forVec - } - } - - return ErrMaxNumTries - } - return nil -} - -func (v Vec) MarshalBinary() ([]byte, error) { - return conv.MarshalBinaryLen(v, v.Size()) -} - -func (v Vec) UnmarshalBinary(b []byte) error { - return conv.UnmarshalBinary(v, b) -} - -func (v Vec) Marshal(b *cryptobyte.Builder) error { - for i := range v { - v[i].Marshal(b) - } - return nil -} - -func (v Vec) Unmarshal(s *cryptobyte.String) bool { - for i := range v { - if !v[i].Unmarshal(s) { - return false - } - } - return true -} - -func isInRange(b *[Size]byte) (out [1]uint64, ok bool) { - out[0] = binary.LittleEndian.Uint64(b[:8]) - ok = out[0] < orderP0 - return -} - -func mustSameLen[T ~[]E, E any](x, y T) { - if len(x) != len(y) { - panic(ErrMatchLen) - } -} - -func mustSumLen[T ~[]E, E any](z, x, y T) { - if len(z) != len(x)+len(y)-1 { - panic(ErrMatchLen) - } -} diff --git a/vdaf/prio3/arith/fp64_test.go b/vdaf/prio3/arith/fp64_test.go deleted file mode 100644 index 3754bcdc..00000000 --- a/vdaf/prio3/arith/fp64_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// Code generated from ./templates/field_test.go.tmpl. DO NOT EDIT. - -package arith - -import ( - "testing" - - "github.com/quantumcoinproject/circl/vdaf/prio3/arith/fp64" -) - -func TestFp64(t *testing.T) { - t.Run("Fp", testFp[fp64.Fp]) - t.Run("Vec", testVec[fp64.Vec]) - t.Run("Poly", testPoly[fp64.Poly, fp64.Vec]) -} - -func BenchmarkFp64(b *testing.B) { - b.Run("Fp", benchmarkFp[fp64.Fp]) - b.Run("Vec", benchmarkVec[fp64.Vec]) - b.Run("Poly", benchmarkPoly[fp64.Poly, fp64.Vec]) -} diff --git a/vdaf/prio3/arith/gen.go b/vdaf/prio3/arith/gen.go deleted file mode 100644 index 069c7878..00000000 --- a/vdaf/prio3/arith/gen.go +++ /dev/null @@ -1,187 +0,0 @@ -//go:build ignore - -package main - -import ( - "bytes" - "fmt" - "go/format" - "math/big" - "os" - "path" - "strings" - "text/template" -) - -type Fp struct { - Name string - Bits uint - NumRootsUnity uint - NumInverseInt uint - Modulus string - Generator string -} - -func (f Fp) NumUint64() int { return int(f.Bits) / 64 } - -func (f Fp) NumUint8() int { return int(f.Bits+7) / 8 } - -func (f Fp) NeedsMasking() bool { - p := f.Prime() - return p.BitLen() < 8*f.NumUint8() -} - -func (f Fp) OrderConst() (s string) { - d := baseTwo64(f.Prime()) - for i := f.NumUint64() - 1; i >= 0; i-- { - s += fmt.Sprintf("orderP%v = uint64(0x%v)\n", i, d[i].Text(16)) - } - return -} - -func (f Fp) OrderVar() string { - var s []string - for i := f.NumUint64() - 1; i >= 0; i-- { - s = append(s, fmt.Sprintf("orderP%v", i)) - } - return strings.Join(s, ",") -} - -func (f Fp) Prime() *big.Int { - p, _ := new(big.Int).SetString(f.Modulus, 16) - return p -} - -func (f Fp) Half() string { - p := f.Prime() - half := big.NewInt(2) - half.ModInverse(half, p) - f.toMont(half, p) - return printDigits(half) -} - -func (f Fp) RSquare() string { - p := f.Prime() - R2 := big.NewInt(1) - R2.Lsh(R2, f.Bits) - R2.Mul(R2, R2).Mod(R2, p) - return printDigits(R2) -} - -func (f Fp) RootsOfUnity() (s string) { - p := f.Prime() - g, _ := new(big.Int).SetString(f.Generator, 16) - for i := range f.NumRootsUnity + 1 { - twoI := big.NewInt(1) - twoI.Lsh(twoI, f.NumRootsUnity-i) - gi := new(big.Int).Exp(g, twoI, p) - f.toMont(gi, p) - s += "{" + printDigits(gi) + "},\n" - } - return -} - -func (f Fp) InverseInt() (s string) { - p := f.Prime() - for i := range f.NumInverseInt { - invI := new(big.Int).ModInverse(big.NewInt(int64(i+1)), p) - f.toMont(invI, p) - s += "{" + printDigits(invI) + "},\n" - } - return -} - -func (f Fp) toMont(x, p *big.Int) { - R := big.NewInt(1) - R.Lsh(R, f.Bits) - x.Mul(x, R).Mod(x, p) -} - -func baseTwo64(v *big.Int) (d []*big.Int) { - n := new(big.Int).Set(v) - two64 := new(big.Int).Lsh(big.NewInt(1), 64) - for n.Sign() > 0 { - x := new(big.Int).Mod(n, two64) - n.Rsh(n, 64) - d = append(d, x) - } - return -} - -func printDigits(n *big.Int) (s string) { - for _, d := range baseTwo64(n) { - s += fmt.Sprintf("0x%016x,", d) - } - return -} - -func main() { - const TemplateWarning = "// Code generated from" - - fields := []Fp{ - { - Name: "Fp64", - Bits: 64, - NumRootsUnity: 32, - NumInverseInt: 8, - // Modulus: 2^32 * 4294967295 + 1 - Modulus: "ffffffff00000001", - // Generator: 7^4294967295 - Generator: "185629dcda58878c", - }, - { - Name: "Fp128", - Bits: 128, - NumRootsUnity: 66, - NumInverseInt: 8, - // Modulus: 2^66 * 4611686018427387897 + 1 - Modulus: "ffffffffffffffe40000000000000001", - // Generator: 7^4611686018427387897 - Generator: "6d278fbf4f60228b1f9b2759c5109f06", - }, - } - - for _, file := range []string{"fp_test", "fp", "vector", "poly"} { - tName := "templates/" + file + ".go.tmpl" - tl, err := template. - New(path.Base(tName)). - Funcs(template.FuncMap{"ToLower": strings.ToLower}). - ParseFiles(tName) - if err != nil { - panic(err) - } - - for _, f := range fields { - buf := new(bytes.Buffer) - err := tl.Execute(buf, f) - if err != nil { - panic(err) - } - - code := buf.Bytes() - code, err = format.Source(code) - if err != nil { - panic("error formating code") - } - - res := string(code) - offset := strings.Index(res, TemplateWarning) - if offset == -1 { - panic("Missing template warning") - } - - folder := strings.ToLower(f.Name) - fileName := file - if file == "fp_test" { - folder = "." - fileName = strings.ToLower(f.Name) + "_test" - } - - path := fmt.Sprintf("%v/%v.go", folder, fileName) - err = os.WriteFile(path, []byte(res[offset:]), 0o600) - if err != nil { - panic(err) - } - } - } -} diff --git a/vdaf/prio3/arith/genFiatMont.go b/vdaf/prio3/arith/genFiatMont.go deleted file mode 100644 index 1b2f3def..00000000 --- a/vdaf/prio3/arith/genFiatMont.go +++ /dev/null @@ -1,79 +0,0 @@ -//go:build ignore -// +build ignore - -// Code Generation using fiat-crypto -// -// Download and unpack Fiat Cryptography v0.1.4 from -// https://github.com/mit-plv/fiat-crypto/releases/tag/v0.1.4 -// -// Then run this program specifying the path to the Fiat Cryptography v0.1.4 binary. -// $ FIAT_BINARY= go run genFiatMont.go -// -// References: -// [1] Erbsen et al. "Simple High-Level Code For Cryptographic Arithmetic – With -// Proofs, Without Compromises" https://github.com/mit-plv/fiat-crypto - -package main - -import ( - "log" - "os" - "os/exec" - "strings" - "text/template" -) - -const headerCIRCL = "Code generated by fiat.go using fiat-crypto v0.1.4." - -var FIAT_PARAMS = []string{ - "word-by-word-montgomery", - "--output", "{{.Pkg}}/fiatMont.go", - "--lang", "Go", - "--package-name", "{{.Pkg}}", - "--doc-prepend-header", headerCIRCL, - "--package-case", "lowerCamelCase", - "--public-function-case", "lowerCamelCase", - "--public-type-case", "lowerCamelCase", - "--doc-newline-before-package-declaration", - "--no-primitives", - "--widen-carry", - "--no-field-element-typedefs", - "--relax-primitive-carry-to-bitwidth", "64", - "Fp", "64", "{{.Prime}}", "add", "sub", "mul", "square", -} - -var fields = []struct{ Pkg, Prime string }{ - { - Pkg: "fp64", - Prime: "0xffffffff00000001", // 2^32 * 4294967295 + 1 - }, - { - Pkg: "fp128", - Prime: "0xffffffffffffffe40000000000000001", // 2^66 * 4611686018427387897 + 1 - }, -} - -func main() { - FIAT_BINARY := os.Getenv("FIAT_BINARY") - if FIAT_BINARY == "" { - log.Fatal("error: must specify the path to the Fiat Cryptography binary.") - } - - paramsTmpl := strings.Join(FIAT_PARAMS, ",") - - for _, f := range fields { - var buf strings.Builder - t := template.Must(new(template.Template).Parse(paramsTmpl)) - err := t.Execute(&buf, f) - if err != nil { - log.Fatalf("error: executing template: %v", err) - } - - cmdParams := strings.Split(buf.String(), ",") - cmd := exec.Command(FIAT_BINARY, cmdParams...) - out, err := cmd.CombinedOutput() - if len(out) != 0 || err != nil { - log.Fatalf("command output: %s\n command error: %v\n", out, err) - } - } -} diff --git a/vdaf/prio3/arith/poly_test.go b/vdaf/prio3/arith/poly_test.go deleted file mode 100644 index 6444adb2..00000000 --- a/vdaf/prio3/arith/poly_test.go +++ /dev/null @@ -1,185 +0,0 @@ -package arith - -import ( - "slices" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/math" -) - -const Degree = 1024 - -func testPoly[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { - t.Run("interpolate", interpolate[P, V, E, F]) - t.Run("strip", strip[P, E, F]) - t.Run("mulSqr", mulSqrPoly[P, V, E, F]) - t.Run("mulNTT", mulNTT[P, V, E, F]) -} - -func mulSqrPoly[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { - const Deg = 4 - x := NewPoly[P](Deg) - y := NewPoly[P](Deg) - l0 := NewPoly[P](Deg) - l1 := NewPoly[P](Deg) - l2 := NewPoly[P](2 * Deg) - r0 := NewPoly[P](2 * Deg) - r1 := NewPoly[P](2 * Deg) - - for i := 0; i < testTimes; i++ { - mustRead(t, V(x)) - mustRead(t, V(y)) - - // (x+y)(x-y) = (x^2-y^2) - copy(l0, x) - copy(l1, x) - l0.AddAssign(y) - l1.SubAssign(y) - l2.Mul(l0, l1) - - r0.Sqr(x) - r1.Sqr(y) - r0.SubAssign(r1) - got := l2 - want := r0 - if !slices.Equal(got, want) { - test.ReportError(t, got, want, x, y) - } - } -} - -func evalRootsUnity[P Poly[P, E], V Vec[V, E], E Elt, F Fp[E]](p P, n uint) V { - // evaluate p on the powers of the root of unity. - // p(w^0), p(w^1), p(w^2), ... - N, logN := math.NextPow2(n) - var wi, wn F = new(E), new(E) - wi.SetOne() - wn.SetRootOfUnityTwoN(logN) - values := NewVec[V](N) - - for i := range values { - values[i] = p.Evaluate(wi) - wi.MulAssign(wn) - } - - return values -} - -func interpolate[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { - const Max = 10 - for logN := range Max { - N := uint(1) << logN - p := NewPoly[P](N - 1) - mustRead(t, V(p)) - values := evalRootsUnity[P, V, E, F](p, N) - - y := NewVec[V](N) - y.NTT(V(p), N) - if !slices.Equal(y, values) { - test.ReportError(t, y, values) - } - - var invN F = new(E) - invN.InvTwoN(uint(logN)) - - p2 := NewPoly[P](N - 1) - V(p2).InvNTT(values, N) - V(p2).ScalarMul(invN) - if !slices.Equal(p, p2) { - test.ReportError(t, p, p2) - } - } -} - -func strip[P Poly[P, E], E Elt, F Fp[E]](t *testing.T) { - N := 4 - p := NewPoly[P](uint(N)) - p = p.Strip() - test.CheckOk(len(p) == 0, "strip failed", t) - - for i := range N + 1 { - p := NewPoly[P](uint(N)) - F(&p[i]).SetOne() - p = p.Strip() - test.CheckOk(len(p) == i+1, "strip failed", t) - } -} - -type polyTest[P any] interface { - MulNlogN(x, y P) - MulNSquare(x, y P) -} - -func mulNTT[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { - const DegX uint = 16 - const DegY uint = 16 - - for degX := range DegX { - for degY := range DegY { - degZ := degX + degY - x := NewPoly[P](degX) - y := NewPoly[P](degY) - got := NewPoly[P](degZ) - want := NewPoly[P](degZ) - - mustRead(t, V(x)) - mustRead(t, V(y)) - - any(got).(polyTest[P]).MulNlogN(x, y) - any(want).(polyTest[P]).MulNSquare(x, y) - - if !slices.EqualFunc(got, want, - func(x, y E) bool { return F(&x).IsEqual(&y) }, - ) { - test.ReportError(t, got, want, degX, degY) - } - } - } -} - -func benchmarkPoly[P Poly[P, E], V Vec[V, E], E Elt, F Fp[E]](b *testing.B) { - x := F(new(E)) - p := NewPoly[P](Degree) - q := NewPoly[P](Degree) - pq := NewPoly[P](2 * Degree) - mustRead(b, x) - mustRead(b, V(p)) - mustRead(b, V(q)) - - N, _ := math.NextPow2(Degree) - pol := NewPoly[P](N - 1) - mustRead(b, V(pol)) - values := evalRootsUnity[P, V, E, F](pol, N) - - b.Run("AddAssign", func(b *testing.B) { - for i := 0; i < b.N; i++ { - q.AddAssign(p) - } - }) - b.Run("Sqr", func(b *testing.B) { - for i := 0; i < b.N; i++ { - pq.Sqr(p) - } - }) - b.Run("Mul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - pq.Mul(p, q) - } - }) - b.Run("Evaluate", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _ = p.Evaluate(x) - } - }) - b.Run("NTT", func(b *testing.B) { - for i := 0; i < b.N; i++ { - V(p).NTT(values, N) - } - }) - b.Run("InvNTT", func(b *testing.B) { - for i := 0; i < b.N; i++ { - V(p).InvNTT(values, N) - } - }) -} diff --git a/vdaf/prio3/arith/templates/fp.go.tmpl b/vdaf/prio3/arith/templates/fp.go.tmpl deleted file mode 100644 index b862846a..00000000 --- a/vdaf/prio3/arith/templates/fp.go.tmpl +++ /dev/null @@ -1,217 +0,0 @@ -// +build ignore -// The previous line (and this one up to the warning below) is removed by the -// template generator. - -// Code generated from ./templates/field.go.tmpl. DO NOT EDIT. - -package {{.Name | ToLower}} - -import ( - "bytes" - "crypto/subtle" - "encoding/binary" - "errors" - "io" - - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/internal/sha3" - "golang.org/x/crypto/cryptobyte" -) - -// Size is the length in bytes of an {{.Name}} element. -const Size = {{.NumUint8}} - -// Fp represents a prime field element as a positive integer less than Order. -type Fp [{{.NumUint64}}]uint64 - -func (z Fp) String() string { x := z.fromMont(); return conv.Uint64Le2Hex(x[:]) } -func (z Fp) Size() uint { return Size } -func (z Fp) OrderRootUnity() uint { return numRootsUnity } -func (z *Fp) AddAssign(x *Fp) { fiatFpAdd(z, z, x) } -func (z *Fp) SubAssign(x *Fp) { fiatFpSub(z, z, x) } -func (z *Fp) MulAssign(x *Fp) { fiatFpMul(z, z, x) } -func (z *Fp) Add(x, y *Fp) { fiatFpAdd(z, x, y) } -func (z *Fp) Sub(x, y *Fp) { fiatFpSub(z, x, y) } -func (z *Fp) Mul(x, y *Fp) { fiatFpMul(z, x, y) } -func (z *Fp) Sqr(x *Fp) { fiatFpSquare(z, x) } -func (z *Fp) IsZero() bool { return ctEqual(z, &Fp{}) } -func (z *Fp) IsOne() bool { return ctEqual(z, &rootOfUnityTwoN[0]) } -func (z *Fp) IsEqual(x *Fp) bool { return ctEqual(z, x) } -func (z *Fp) SetOne() { *z = rootOfUnityTwoN[0] } -func (z *Fp) toMont() { fiatFpMul(z, z, &rSquare) } -func (z *Fp) fromMont() (out Fp) { fiatFpMul(&out, z, &Fp{1}); return } -func (z *Fp) MarshalBinary() ([]byte, error) { return conv.MarshalBinaryLen(z, Size) } -func (z *Fp) UnmarshalBinary(b []byte) error { return conv.UnmarshalBinary(z, b) } -func (z *Fp) Marshal(b *cryptobyte.Builder) error { - var x [Size]byte - for i, zi := range z.fromMont() { - binary.LittleEndian.PutUint64(x[8*i:], zi) - } - b.AddBytes(x[:]) - return nil -} - -func (z* Fp) Unmarshal(s *cryptobyte.String) bool{ - var b [Size]byte - if s.CopyBytes(b[:]) { - n, ok := isInRange(&b) - if ok { - *z = n - z.toMont() - return true - } - } - return false -} - -func (z* Fp) Random(r io.Reader) error { - var b [Size]byte - var ok bool - for range maxNumTries { - _, err := r.Read(b[:]) - if err != nil { - return err - } - - *z, ok = isInRange(&b) - if ok { - z.toMont() - return nil - } - } - - return ErrMaxNumTries -} - -func (z* Fp) RandomSHA3(s *sha3.State) error { - var b [Size]byte - var ok bool - for range maxNumTries { - _, err := s.Read(b[:]) - if err != nil { - return err - } - - *z, ok = isInRange(&b) - if ok { - z.toMont() - return nil - } - } - - return ErrMaxNumTries -} - -func (z* Fp) InvUint64(x uint64) { - if 0 < x && x <= numInverseInt { - *z = inverseInt[x-1] - } else { - err := z.SetUint64(x) - if err != nil { - panic(ErrFieldEltDecode) - } - z.Inv(z) - } -} - -func (z* Fp) InvTwoN(n uint) { - z.SetOne() - for range n { - z.Mul(z, &half) - } -} - -func (z* Fp) SetUint64(n uint64) error { - {{- if eq .Bits 64 }} - if n >= {{.OrderVar}} { - return ErrFieldEltDecode - } - {{- end }} - *z = Fp{n} - z.toMont() - return nil -} - -func (z* Fp) GetUint64() (uint64, error) { - x := z.fromMont(); - {{- if eq .Bits 128 }} - if x[1] != 0 { - return 0, ErrNumberTooLarge - } - {{- end }} - return x[0], nil -} - -func (z* Fp) SetRootOfUnityTwoN(n uint) { - if n > numRootsUnity { - panic(ErrRootsOfUnity) - } - *z = rootOfUnityTwoN[n] -} - - -func (z Fp) Order() []byte { - var x [Size]byte - binary.Write(bytes.NewBuffer(x[:0]), binary.BigEndian, []uint64{ {{.OrderVar}} }) - return x[:] -} - -func (z* Fp) sqri(x *Fp, n uint) { - z.Sqr(x) - for range n - 1 { - z.Sqr(z) - } -} - -func fiatFpCmovznzU64(z *uint64, b, x, y uint64) { *z = (x &^ (-b)) | (y & (-b)) } - -func ctEqual(x, y *Fp) bool { - var v uint64 - for i := 0; i < len(*x); i++ { - v |= (*x)[i] ^ (*y)[i] - } - v32 := uint32(v>>32) | uint32(v) - return subtle.ConstantTimeEq(int32(v32), 0) == 1 -} - - -const ( - // order is the order of the {{.Name}} field. - {{.OrderConst -}} - // numRootsUnity is .. - numRootsUnity = {{.NumRootsUnity}} - // numInverseInt{{.Name}} is the number of precomputed inverses. - numInverseInt = {{.NumInverseInt}} - // maxNumTries is the maximum tries for rejection sampling. - maxNumTries = 10 -) - -var ( - // rSquare is R^2 mod {{.Name}}Order, where R=2^{{.Bits}} (little-endian). - rSquare = Fp{ {{.RSquare}} } - // half is 1/2 mod Order. - half = Fp{ {{.Half}} } - // rootOfUnityTwoN are the (principal) roots of unity that generate - // a multiplicative group of order 2^n. - // i.e., rootOfUnityTwoN[i] generates a group of order 2^i. - // Thus, by definition, - // - rootOfUnityTwoN[0] = One - // - rootOfUnityTwoN[numRoots] = Generator - // Constants are encoded in Montgomery domain (little-endian). - rootOfUnityTwoN = [numRootsUnity + 1]Fp{ - {{.RootsOfUnity}} - } - // inverseInt has the inverse of the first `numInverseInt` integers. - inverseInt = [numInverseInt]Fp{ - {{.InverseInt}} - } -) - - -var ( - ErrMatchLen = errors.New("inputs mismatched length") - ErrFieldEltDecode = errors.New("incorrect field element value") - ErrNumberTooLarge = errors.New("number of bits is not enough to represent the number") - ErrMaxNumTries = errors.New("random rejection sampling reached maximum number of tries") - ErrRootsOfUnity = errors.New("Fp has no roots of unity of order larger than 2^{{.NumRootsUnity}}") -) diff --git a/vdaf/prio3/arith/templates/fp_test.go.tmpl b/vdaf/prio3/arith/templates/fp_test.go.tmpl deleted file mode 100644 index 2675c4d0..00000000 --- a/vdaf/prio3/arith/templates/fp_test.go.tmpl +++ /dev/null @@ -1,25 +0,0 @@ -// +build ignore -// The previous line (and this one up to the warning below) is removed by the -// template generator. - -// Code generated from ./templates/field_test.go.tmpl. DO NOT EDIT. - -package arith - -import ( - "testing" - - "github.com/quantumcoinproject/circl/vdaf/prio3/arith/{{.Name | ToLower}}" -) - -func Test{{.Name}}(t *testing.T) { - t.Run("Fp", testFp[{{.Name | ToLower}}.Fp]) - t.Run("Vec", testVec[{{.Name | ToLower}}.Vec]) - t.Run("Poly",testPoly[{{.Name | ToLower}}.Poly, {{.Name | ToLower}}.Vec]) -} - -func Benchmark{{.Name}}(b *testing.B) { - b.Run("Fp", benchmarkFp[{{.Name | ToLower}}.Fp]) - b.Run("Vec", benchmarkVec[{{.Name | ToLower}}.Vec]) - b.Run("Poly", benchmarkPoly[{{.Name | ToLower}}.Poly, {{.Name | ToLower}}.Vec]) -} diff --git a/vdaf/prio3/arith/templates/poly.go.tmpl b/vdaf/prio3/arith/templates/poly.go.tmpl deleted file mode 100644 index 3c638ba7..00000000 --- a/vdaf/prio3/arith/templates/poly.go.tmpl +++ /dev/null @@ -1,92 +0,0 @@ -// +build ignore -// The previous line (and this one up to the warning below) is removed by the -// template generator. - -// Code generated from ./templates/poly.go.tmpl. DO NOT EDIT. - -package {{.Name | ToLower}} - -import "github.com/quantumcoinproject/circl/math" - -type Poly []Fp - -func (p Poly) AddAssign(x Poly) { Vec(p).AddAssign(Vec(x)) } -func (p Poly) SubAssign(x Poly) { Vec(p).SubAssign(Vec(x)) } -func (p Poly) Mul(x, y Poly) { - const thresholdPolyMul = 128 - if len(x) + len(y) - 1 < thresholdPolyMul { - p.MulNSquare(x, y) - } else{ - p.MulNlogN(x, y) - } -} - -func (p Poly) MulNSquare(x, y Poly) { - mustSumLen(p, x, y) - clear(p) - var xiyj Fp - for i := range x { - for j := range y { - xiyj.Mul(&x[i], &y[j]) - p[i+j].AddAssign(&xiyj) - } - } -} - -func (p Poly) MulNlogN(x, y Poly) { - mustSumLen(p, x, y) - N, logN := math.NextPow2(uint(len(x) + len(y) - 1)) - buf := make(Vec, 2*N) - lx, ly := buf[:N], buf[N:] - lx.NTT(Vec(x), N) - ly.NTT(Vec(y), N) - for i := range lx { - lx[i].MulAssign(&ly[i]) - } - - ly.InvNTT(lx, N) - var invN Fp - invN.InvTwoN(logN) - copy(p, ly) - Vec(p).ScalarMul(&invN) -} - -func (p Poly) Sqr(x Poly) { - mustSumLen(p, x, x) - clear(p) - for i := range x { - p[2*i].Sqr(&x[i]) - } - - var xixj Fp - for i := 0; i < len(x); i++ { - for j := i + 1; j < len(x); j++ { - xixj.Mul(&x[i], &x[j]) - xixj.AddAssign(&xixj) - p[i+j].AddAssign(&xixj) - } - } -} - -func (p Poly) Evaluate(x *Fp) (px Fp) { - if l := len(p); l != 0 { - px = p[l-1] - for i := l - 2; i >= 0; i-- { - px.MulAssign(x) - px.AddAssign(&p[i]) - } - } - - return -} - -func (p Poly) Strip() Poly { - for i := len(p) - 1; i >= 0; i-- { - if !p[i].IsZero() { - return p[:i+1] - } - } - - return p[:0] -} - diff --git a/vdaf/prio3/arith/templates/vector.go.tmpl b/vdaf/prio3/arith/templates/vector.go.tmpl deleted file mode 100644 index 815d65f6..00000000 --- a/vdaf/prio3/arith/templates/vector.go.tmpl +++ /dev/null @@ -1,234 +0,0 @@ -// +build ignore -// The previous line (and this one up to the warning below) is removed by the -// template generator. - -// Code generated from ./templates/vector.go.tmpl. DO NOT EDIT. - -package {{.Name | ToLower}} - -import ( - "io" - "encoding/binary" - "math/bits" - "slices" - - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/math" - "golang.org/x/crypto/cryptobyte" -) - -type Vec []Fp - -func (v Vec) Size() uint { return Size*uint(len(v)) } - -func (v Vec) AddAssign(x Vec) { - mustSameLen(v, x) - for i := range v { - v[i].AddAssign(&x[i]) - } -} - -func (v Vec) SubAssign(x Vec) { - mustSameLen(v, x) - for i := range v { - v[i].SubAssign(&x[i]) - } -} - -func (v Vec) ScalarMul(x *Fp) { - for i := range v { - v[i].MulAssign(x) - } -} - -func (v Vec) DotProduct(x Vec) (out Fp) { - mustSameLen(v, x) - var t Fp - for i := range v { - t.Mul(&v[i], &x[i]) - out.AddAssign(&t) - } - return -} - -func bitRev(x uint, numBits uint) uint { - return bits.Reverse(x) >> (bits.UintSize - numBits) -} - -func (v Vec) InvNTT(values Vec, n uint) { - v.NTT(values, n) - slices.Reverse(v[1:]) -} - -func (v Vec) NTT(values Vec, n uint) { - valuesLen := uint(len(values)) - _, logN := math.NextPow2(n) - - for i := range v { - j := bitRev(uint(i), logN) - if j < valuesLen { - v[i] = values[j] - } - } - - var t, w, wn Fp - for l := uint(1); l <= logN; l++ { - y := uint(1) << (l - 1) - chunk := uint(1) << (logN - l) - - for j := range chunk { - x := j << l - u := v[x] - v[x+0].Add(&u, &v[x+y]) - v[x+y].Sub(&u, &v[x+y]) - } - - w.SetOne() - wn.SetRootOfUnityTwoN(l) - for i := uint(1); i < y; i++ { - w.MulAssign(&wn) - for j := range chunk { - x := (j << l) + i - u := v[x] - t.Mul(&w, &v[x+y]) - v[x+0].Add(&u, &t) - v[x+y].Sub(&u, &t) - } - } - } -} - -func (v Vec) SplitBits(n uint64) error { - if bits.Len64(n) > len(v) { - return ErrNumberTooLarge - } - - clear(v) - for i := range v { - if (n>>i)&0x1 == 1 { - v[i].SetOne() - } - } - - return nil -} - -func (v Vec) JoinBits() Fp { - var two Fp - _ = two.SetUint64(2) - return Poly(v).Evaluate(&two) -} - - -func (v Vec) Random(rnd io.Reader) error { - var b [Size]byte - var ok bool -forVec: - for i := range v { - for range maxNumTries { - _, err := rnd.Read(b[:]) - if err != nil { - return err - } - - v[i], ok = isInRange(&b) - if ok { - v[i].toMont() - continue forVec - } - } - return ErrMaxNumTries - } - - return nil -} - -func (v Vec) RandomSHA3(s *sha3.State) error { - for i := range v { - err := v[i].RandomSHA3(s) - if err != nil { - return err - } - } - - return nil -} - -func (v Vec) RandomSHA3Bytes(out []byte, s *sha3.State) error { - var b [Size]byte - var ok bool - -forVec: - for i := range v { - for range maxNumTries { - _, err := s.Read(b[:]) - if err != nil { - return err - } - - v[i], ok = isInRange(&b) - if ok { - out = append(out, b[:]...) - v[i].toMont() - continue forVec - } - } - - return ErrMaxNumTries - } - return nil -} - -func (v Vec) MarshalBinary() ([]byte, error) { - return conv.MarshalBinaryLen(v, v.Size()) -} - -func (v Vec) UnmarshalBinary(b []byte) error { - return conv.UnmarshalBinary(v, b) -} - -func (v Vec) Marshal(b *cryptobyte.Builder) error { - for i := range v { - v[i].Marshal(b) - } - return nil -} - -func (v Vec) Unmarshal(s *cryptobyte.String) bool{ - for i := range v { - if !v[i].Unmarshal(s) { - return false - } - } - return true -} - - -func isInRange(b *[Size]byte) (out [{{.NumUint64}}]uint64, ok bool) { - {{- if .NeedsMasking}} - panic("unimplemented: recall to implement masking before decoding") - {{- else }} - {{- if eq .Bits 64}} - out[0] = binary.LittleEndian.Uint64(b[:8]) - ok = out[0] < orderP0 - {{- else if eq .Bits 128}} - out[1] = binary.LittleEndian.Uint64(b[8:]) - out[0] = binary.LittleEndian.Uint64(b[:8]) - ok = out[1] < orderP1 || (out[1] == orderP1 && out[0] < orderP0) - {{- end }} - {{- end }} - return -} - -func mustSameLen[T ~[]E, E any](x, y T) { - if len(x) != len(y) { - panic(ErrMatchLen) - } -} - -func mustSumLen[T ~[]E, E any](z, x, y T) { - if len(z) != len(x)+len(y)-1 { - panic(ErrMatchLen) - } -} diff --git a/vdaf/prio3/arith/vector_test.go b/vdaf/prio3/arith/vector_test.go deleted file mode 100644 index 7c6a64b5..00000000 --- a/vdaf/prio3/arith/vector_test.go +++ /dev/null @@ -1,158 +0,0 @@ -package arith - -import ( - "crypto/rand" - "io" - "slices" - "testing" - - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/internal/test" -) - -func testVec[V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { - t.Run("marshal", marshalVec[V, E, F]) - t.Run("bitRepresentation", bitRepresentation[V, E, F]) - t.Run("random", random[V, E, F]) -} - -func marshalVec[V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { - const N = 4 - x := NewVec[V](N) - y := NewVec[V](N) - for i := 0; i < testTimes; i++ { - mustRead(t, x) - s, err := x.MarshalBinary() - test.CheckNoErr(t, err, "MarshalBinary failed") - test.CheckOk(uint(len(s)) == x.Size(), "wrong byte length", t) - - err = y.UnmarshalBinary(s) - test.CheckNoErr(t, err, "UnmarshalBinary failed") - if !slices.Equal(x, y) { - test.ReportError(t, x, y) - } - - // check for invalid size - err = y.UnmarshalBinary(s[1:]) - test.CheckIsErr(t, err, "UnmarshalBinary should failed") - } -} - -func bitRepresentation[V Vec[V, E], E Elt, F Fp[E]](t *testing.T) { - N := uint64(0x0F) - eightBits := NewVec[V](8) - err := eightBits.SplitBits(N) - test.CheckNoErr(t, err, "failed to split number in bits") - - for i := range eightBits { - if i < 4 { - test.CheckOk(F(&eightBits[i]).IsOne(), "vector element should be one", t) - } else { - test.CheckOk(F(&eightBits[i]).IsZero(), "vector element should be zero", t) - } - } - - num := eightBits.JoinBits() - test.CheckNoErr(t, err, "JoinBits failed") - - got, err := F(&num).GetUint64() - test.CheckNoErr(t, err, "failed to recover uint64") - - want := N - if got != want { - test.ReportError(t, got, want, eightBits, num) - } - - fourBits := NewVec[V](4) - err = fourBits.SplitBits(0xFF) - test.CheckIsErr(t, err, "SplitBits should return an error") -} - -func random[V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { - r := sha3.NewShake128() - v := NewVec[V](4) - err := v.Random(io.LimitReader(&r, 0)) - test.CheckIsErr(t, err, "generating random vector should failed") - - r.Reset() - got := NewVec[V](4) - err = got.Random(&r) - test.CheckNoErr(t, err, "Random failed") - - r.Reset() - want := NewVec[V](4) - err = want.RandomSHA3(&r) - test.CheckNoErr(t, err, "RandomSHA3 failed") - - if !slices.Equal(got, want) { - test.ReportError(t, got, want) - } -} - -func benchmarkVec[V Vec[V, E], E Elt, F Fp[E]](b *testing.B) { - const N = 1024 - k := F(new(E)) - x := NewVec[V](N) - z := NewVec[V](N) - - mustRead(b, k) - mustRead(b, x) - mustRead(b, z) - - const Bits = uint64(0x0F) - eightBits := NewVec[V](8) - _ = eightBits.SplitBits(Bits) - buf, _ := x.MarshalBinary() - - b.Run("MarshalBinary", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _ = z.MarshalBinary() - } - }) - b.Run("UnmarshalBinary", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _ = z.UnmarshalBinary(buf) - } - }) - b.Run("Random", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _ = z.Random(rand.Reader) - } - }) - b.Run("RandomSHA3", func(b *testing.B) { - r := sha3.NewShake128() - for i := 0; i < b.N; i++ { - _ = z.RandomSHA3(&r) - } - }) - b.Run("AddAssign", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.AddAssign(x) - } - }) - b.Run("SubAssign", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.SubAssign(x) - } - }) - b.Run("ScalarMul", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.ScalarMul(k) - } - }) - b.Run("DotProduct", func(b *testing.B) { - for i := 0; i < b.N; i++ { - z.DotProduct(x) - } - }) - b.Run("SplitBits", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _ = eightBits.SplitBits(Bits) - } - }) - b.Run("JoinBits", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _ = eightBits.JoinBits() - } - }) -} diff --git a/vdaf/prio3/common_test.go b/vdaf/prio3/common_test.go deleted file mode 100644 index 040a9ab6..00000000 --- a/vdaf/prio3/common_test.go +++ /dev/null @@ -1,139 +0,0 @@ -package prio3 - -import ( - "bytes" - "encoding" - "encoding/hex" - "encoding/json" - "errors" - "io" - "os" - "slices" - "testing" - - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/prio3" - "golang.org/x/crypto/cryptobyte" -) - -type marshaler interface { - encoding.BinaryMarshaler - encoding.BinaryUnmarshaler -} - -func testMarshal[T any](t testing.TB, x *T, p *prio3.Params, extra ...uint) { - t.Helper() - bm := any(x).(marshaler) - b0, err := bm.MarshalBinary() - test.CheckNoErr(t, err, "first MarshalBinary failed") - - y := new(T) - yy, ok := any(y).(interface{ New(*prio3.Params) *T }) - if ok { - yy.New(p) - } else { - yy, ok := any(y).(interface{ New(*prio3.Params, uint) *T }) - if ok { - yy.New(p, extra[0]) - } - } - - bm = any(y).(marshaler) - err = bm.UnmarshalBinary(b0) - test.CheckNoErr(t, err, "UnmarshalBinary failed") - - b1, err := bm.MarshalBinary() - test.CheckNoErr(t, err, "second MarshalBinary failed") - - if !bytes.Equal(b0, b1) { - test.ReportError(t, b0, b1) - } - - // check for invalid size - err = bm.UnmarshalBinary(nil) - test.CheckIsErr(t, err, "UnmarshalBinary should failed") -} - -func fromReader[T any](t testing.TB, r io.Reader) (z T) { - var err error - switch zz := any(&z).(type) { - case *prio3.Nonce: - _, err = r.Read(zz[:]) - case *prio3.VerifyKey: - _, err = r.Read(zz[:]) - default: - err = errors.New("wrong type") - } - test.CheckNoErr(t, err, "fromReader failed") - return -} - -func fromHex[T any](t testing.TB, x Hex) (z T) { - var err error - switch zz := any(&z).(type) { - case *prio3.Nonce: - copy(zz[:], x[:prio3.NonceSize]) - case *prio3.VerifyKey: - copy(zz[:], x[:prio3.VerifyKeySize]) - default: - err = errors.New("wrong type") - } - test.CheckNoErr(t, err, "fromHex failed") - return -} - -type Hex []byte - -func (b *Hex) UnmarshalJSON(data []byte) (err error) { - var s string - if err = json.Unmarshal(data, &s); err != nil { - return err - } - *b, err = hex.DecodeString(s) - return err -} - -func readFile[V any](t *testing.T, fileName string) (v V) { - t.Helper() - jsonFile, err := os.Open(fileName) - if err != nil { - t.Fatalf("File %v can not be opened. Error: %v", fileName, err) - } - defer jsonFile.Close() - input, err := io.ReadAll(jsonFile) - if err != nil { - t.Fatalf("File %v can not be read. Error: %v", fileName, err) - } - - err = json.Unmarshal(input, &v) - if err != nil { - t.Fatalf("File %v can not be loaded. Error: %v", fileName, err) - } - - return -} - -func checkEqual[T any](t *testing.T, a T, b []byte) { - t.Helper() - aa, err := conv.MarshalBinary(any(a).(cryptobyte.MarshalingValue)) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(aa, b) { - test.ReportError(t, hex.EncodeToString(aa), hex.EncodeToString(b)) - } -} - -func isEqual[T any](t *testing.T, a, b T) bool { - switch aa := any(a).(type) { - case uint64: - return aa == any(b).(uint64) - case []uint64: - return slices.Equal(aa, any(b).([]uint64)) - default: - t.Fatalf("unrecognized aggregate type: %T\n", a) - return false - } -} diff --git a/vdaf/prio3/count/count.go b/vdaf/prio3/count/count.go deleted file mode 100644 index f8b45bab..00000000 --- a/vdaf/prio3/count/count.go +++ /dev/null @@ -1,143 +0,0 @@ -// Package count is a VDAF for counting Boolean measurements. -package count - -import ( - "crypto/subtle" - - "github.com/quantumcoinproject/circl/vdaf/prio3/arith" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith/fp64" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/flp" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/prio3" -) - -type ( - poly = fp64.Poly - Vec = fp64.Vec - Fp = fp64.Fp - AggShare = prio3.AggShare[Vec, Fp] - InputShare = prio3.InputShare[Vec, Fp] - Nonce = prio3.Nonce - OutShare = prio3.OutShare[Vec, Fp] - PrepMessage = prio3.PrepMessage - PrepShare = prio3.PrepShare[Vec, Fp] - PrepState = prio3.PrepState[Vec, Fp] - PublicShare = prio3.PublicShare - VerifyKey = prio3.VerifyKey -) - -// Count is a verifiable distributed aggregation function in which each -// measurement is either one or zero and the aggregate result is the sum of -// the measurements. -type Count struct { - p prio3.Prio3[bool, uint64, *flpCount, Vec, Fp, *Fp] -} - -func New(numShares uint8, context []byte) (c *Count, err error) { - const countID = 1 - c = new(Count) - c.p, err = prio3.New(newFlpCount(), countID, numShares, context) - if err != nil { - return nil, err - } - - return c, nil -} - -func (c *Count) Params() prio3.Params { return c.p.Params() } - -func (c *Count) Shard(measurement bool, nonce *Nonce, rand []byte, -) (PublicShare, []InputShare, error) { - return c.p.Shard(measurement, nonce, rand) -} - -func (c *Count) PrepInit( - verifyKey *VerifyKey, - nonce *Nonce, - aggID uint8, - publicShare PublicShare, - inputShare InputShare, -) (*PrepState, *PrepShare, error) { - return c.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) -} - -func (c *Count) PrepSharesToPrep(prepShares []PrepShare) (*PrepMessage, error) { - return c.p.PrepSharesToPrep(prepShares) -} - -func (c *Count) PrepNext(state *PrepState, msg *PrepMessage) (*OutShare, error) { - return c.p.PrepNext(state, msg) -} - -func (c *Count) AggregateInit() AggShare { return c.p.AggregateInit() } - -func (c *Count) AggregateUpdate(aggShare *AggShare, outShare *OutShare) { - c.p.AggregateUpdate(aggShare, outShare) -} - -func (c *Count) Unshard(aggShares []AggShare, numMeas uint) (aggregate *uint64, err error) { - return c.p.Unshard(aggShares, numMeas) -} - -type flpCount struct { - flp.FLP[flp.GadgetMulFp64, poly, Vec, Fp, *Fp] -} - -func newFlpCount() *flpCount { - c := new(flpCount) - c.Valid.MeasurementLen = 1 - c.Valid.JointRandLen = 0 - c.Valid.OutputLen = 1 - c.Valid.EvalOutputLen = 1 - c.Gadget = flp.GadgetMulFp64{} - c.NumGadgetCalls = 1 - c.FLP.Eval = c.Eval - return c -} - -func (c *flpCount) Eval( - out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, - meas, jointRand Vec, numShares uint8, -) { - g.Eval(&out[0], Vec{meas[0], meas[0]}) - out[0].SubAssign(&meas[0]) -} - -func (c *flpCount) Encode(measurement bool) (Vec, error) { - var one Fp - one.SetOne() - y, err := one.MarshalBinary() - if err != nil { - return nil, err - } - - var b int - if measurement { - b = 1 - } - - var x [fp64.Size]byte - subtle.ConstantTimeCopy(b, x[:], y) - - out := arith.NewVec[Vec](1) - err = out[0].UnmarshalBinary(x[:]) - if err != nil { - return nil, err - } - - return out, nil -} - -func (c *flpCount) Truncate(meas Vec) Vec { return meas } - -func (c *flpCount) Decode(output Vec, numMeas uint) (*uint64, error) { - if len(output) < int(c.Valid.OutputLen) { - return nil, flp.ErrOutputLen - } - - n, err := output[0].GetUint64() - if err != nil { - return nil, err - } - - return &n, nil -} diff --git a/vdaf/prio3/count/count_test.go b/vdaf/prio3/count/count_test.go deleted file mode 100644 index 389a37cf..00000000 --- a/vdaf/prio3/count/count_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package count - -import ( - "testing" - - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/flp_test" -) - -func TestCount(t *testing.T) { - t.Run("Query", func(t *testing.T) { - c := newFlpCount() - flp_test.TestInvalidQuery(t, &c.FLP) - }) -} diff --git a/vdaf/prio3/doc.go b/vdaf/prio3/doc.go deleted file mode 100644 index a3d329fd..00000000 --- a/vdaf/prio3/doc.go +++ /dev/null @@ -1,11 +0,0 @@ -// Package prio3 implements Prio3, a set of Verifiable Distributed -// Aggregation Functions (VDAFs). It provides several concrete VDAFs -// described in draft-irtf-cfrg-vdaf [v14]: -// - Count [github.com/quantumcoinproject/circl/vdaf/prio3/count] -// - Sum [github.com/quantumcoinproject/circl/vdaf/prio3/sum] -// - SumVec [github.com/quantumcoinproject/circl/vdaf/prio3/sumvec] -// - Histogram [github.com/quantumcoinproject/circl/vdaf/prio3/mhcv] -// - MultiHotCountVec [github.com/quantumcoinproject/circl/vdaf/prio3/histogram] -// -// [v14]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-14 -package prio3 diff --git a/vdaf/prio3/histogram/histogram.go b/vdaf/prio3/histogram/histogram.go deleted file mode 100644 index 587513dc..00000000 --- a/vdaf/prio3/histogram/histogram.go +++ /dev/null @@ -1,144 +0,0 @@ -// Package histogram is a VDAF for aggregating integer measurements into buckets. -package histogram - -import ( - "github.com/quantumcoinproject/circl/vdaf/prio3/arith" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith/fp128" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/flp" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/prio3" -) - -type ( - poly = fp128.Poly - Vec = fp128.Vec - Fp = fp128.Fp - AggShare = prio3.AggShare[Vec, Fp] - InputShare = prio3.InputShare[Vec, Fp] - Nonce = prio3.Nonce - OutShare = prio3.OutShare[Vec, Fp] - PrepMessage = prio3.PrepMessage - PrepShare = prio3.PrepShare[Vec, Fp] - PrepState = prio3.PrepState[Vec, Fp] - PublicShare = prio3.PublicShare - VerifyKey = prio3.VerifyKey -) - -// Histogram is a verifiable distributed aggregation function in which each -// measurement increments by one the histogram bucket, out of a set of fixed -// buckets, and the aggregate result counts the number of measurements in each -// bucket. -type Histogram struct { - p prio3.Prio3[uint64, []uint64, *flpHistogram, Vec, Fp, *Fp] -} - -func New(numShares uint8, length, chunkLen uint, context []byte) (h *Histogram, err error) { - const histogramID = 4 - h = new(Histogram) - h.p, err = prio3.New(newFlpHistogram(length, chunkLen), histogramID, numShares, context) - if err != nil { - return nil, err - } - - return h, nil -} - -func (h *Histogram) Params() prio3.Params { return h.p.Params() } - -func (h *Histogram) Shard(measurement uint64, nonce *Nonce, rand []byte, -) (PublicShare, []InputShare, error) { - return h.p.Shard(measurement, nonce, rand) -} - -func (h *Histogram) PrepInit( - verifyKey *VerifyKey, - nonce *Nonce, - aggID uint8, - publicShare PublicShare, - inputShare InputShare, -) (*PrepState, *PrepShare, error) { - return h.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) -} - -func (h *Histogram) PrepSharesToPrep(prepShares []PrepShare) (*PrepMessage, error) { - return h.p.PrepSharesToPrep(prepShares) -} - -func (h *Histogram) PrepNext(state *PrepState, msg *PrepMessage) (*OutShare, error) { - return h.p.PrepNext(state, msg) -} - -func (h *Histogram) AggregateInit() AggShare { return h.p.AggregateInit() } - -func (h *Histogram) AggregateUpdate(aggShare *AggShare, outShare *OutShare) { - h.p.AggregateUpdate(aggShare, outShare) -} - -func (h *Histogram) Unshard(aggShares []AggShare, numMeas uint) (aggregate *[]uint64, err error) { - return h.p.Unshard(aggShares, numMeas) -} - -type flpHistogram struct { - flp.FLP[flp.GadgetParallelSumInnerMul, poly, Vec, Fp, *Fp] - length uint - chunkLen uint -} - -func newFlpHistogram(length, chunkLen uint) *flpHistogram { - h := new(flpHistogram) - numGadgetCalls := (length + chunkLen - 1) / chunkLen - h.length = length - h.chunkLen = chunkLen - h.Valid.MeasurementLen = length - h.Valid.JointRandLen = numGadgetCalls - h.Valid.OutputLen = length - h.Valid.EvalOutputLen = 2 - h.Gadget = flp.GadgetParallelSumInnerMul{Count: chunkLen} - h.NumGadgetCalls = numGadgetCalls - h.FLP.Eval = h.Eval - return h -} - -func (h *flpHistogram) Eval( - out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, - meas, jointRand Vec, numShares uint8, -) { - var invShares Fp - invShares.InvUint64(uint64(numShares)) - out[0] = flp.RangeCheck(g, numCalls, h.chunkLen, &invShares, meas, jointRand) - - sumCheck := &out[1] - sumCheck.SubAssign(&invShares) - for i := range meas { - sumCheck.AddAssign(&meas[i]) - } -} - -func (h *flpHistogram) Encode(measurement uint64) (out Vec, err error) { - if measurement > uint64(h.length) { - return nil, flp.ErrMeasurementValue - } - - out = arith.NewVec[Vec](h.Valid.MeasurementLen) - out[measurement].SetOne() - - return -} - -func (h *flpHistogram) Truncate(meas Vec) Vec { return meas } - -func (h *flpHistogram) Decode(output Vec, numMeas uint) (*[]uint64, error) { - if len(output) < int(h.Valid.OutputLen) { - return nil, flp.ErrOutputLen - } - - var err error - out := make([]uint64, len(output)) - for i := range output { - out[i], err = output[i].GetUint64() - if err != nil { - return nil, err - } - } - - return &out, nil -} diff --git a/vdaf/prio3/histogram/histogram_test.go b/vdaf/prio3/histogram/histogram_test.go deleted file mode 100644 index fe57180f..00000000 --- a/vdaf/prio3/histogram/histogram_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package histogram - -import ( - "testing" - - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/flp_test" -) - -func TestHistogram(t *testing.T) { - t.Run("Query", func(t *testing.T) { - h := newFlpHistogram(4, 3) - flp_test.TestInvalidQuery(t, &h.FLP) - }) -} diff --git a/vdaf/prio3/internal/cursor/cursor.go b/vdaf/prio3/internal/cursor/cursor.go deleted file mode 100644 index fb3fa45f..00000000 --- a/vdaf/prio3/internal/cursor/cursor.go +++ /dev/null @@ -1,15 +0,0 @@ -// Package cursor aids with iteration of slices. -package cursor - -type Cursor[V ~[]E, E any] []E - -func New[V ~[]E, E any](x V) Cursor[V, E] { return Cursor[V, E](x) } - -// Next return an slice of size n and advances the pointer. -func (s *Cursor[V, E]) Next(n uint) (out V) { - if uint(len(*s)) >= n { - out = V(*s)[:n] - *s = (*s)[n:] - } - return -} diff --git a/vdaf/prio3/internal/flp/flp.go b/vdaf/prio3/internal/flp/flp.go deleted file mode 100644 index 02303988..00000000 --- a/vdaf/prio3/internal/flp/flp.go +++ /dev/null @@ -1,149 +0,0 @@ -// Package flp provides a Fully-Linear Proof (FLP) system. -package flp - -import ( - "errors" - - "github.com/quantumcoinproject/circl/vdaf/prio3/arith" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/cursor" -) - -// FLP is an instance of a FLP by Boneh et al. Crypto, 2019 paper -// "Zero-Knowledge Proofs on Secret-Shared Data via Fully Linear PCPs", -// https://ia.cr/2019/188 -// plus some changes described in VDAF specification. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.1 -type FLP[ - G Gadget[P, V, E, F], - P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], -] struct { - // Eval evaluates the arithmetic circuit on a measurement and joint randomness. - Eval func(out V, g Gadget[P, V, E, F], numCalls uint, meas, jointRand V, numShares uint8) - Valid[G, P, V, E, F] -} - -// Prove returns a proof attesting validity to the given measurement. -// Prove randomness must be provided. -// Some statements may require joint randomness too. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.3.3 -func (f *FLP[G, P, V, E, F]) Prove(meas, proveRand, jointRand V) V { - proof := arith.NewVec[V](f.ProofLength()) - proofCur := cursor.New(proof) - - g := f.Valid.wrapProve(proveRand) - out := arith.NewVec[V](f.EvalOutputLength()) - f.Eval(out, g, f.Valid.NumGadgetCalls, meas, jointRand, 1) - - // invN is the inverse of N = g.p. - // Also, since g.p is always a power of two, we call a faster inversion - // method that receives the log2 of g.p. - invN := F(new(E)) - invN.InvTwoN(g.log2p) - - arity := g.Arity() - wirePoly := make([]P, arity) - wirePolyN := arith.NewVec[V](arity * g.p) - wirePolyNCur := cursor.New(wirePolyN) - wiresCur := cursor.New(g.wires) - for i := range wirePoly { - wire := wiresCur.Next(g.p) - wirePolyI := wirePolyNCur.Next(g.p) - wirePolyI.InvNTT(wire, g.p) - wirePolyI.ScalarMul(invN) - wirePoly[i] = P(wirePolyI) - proofCur.Next(1)[0] = wire[0] - } - - gadgetPoly := P(proofCur.Next(f.gadgetPolyLen())) - g.EvalPoly(gadgetPoly, wirePoly) - return proof -} - -// Query is the linear Query algorithm run by each verifier on a share of the -// measurement and proof. -// Query randomness must be provided. -// Some statements may require joint randomness too. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.3.4 -func (f *FLP[G, P, V, E, F]) Query( - measShare, proofShare, queryRand, jointRand V, numShares uint8, -) (verifierMsg V, err error) { - verifierMsg = arith.NewVec[V](f.VerifierLength()) - verifierCur := cursor.New(verifierMsg) - queryRandCur := cursor.New(queryRand) - - g := f.Valid.wrapQuery(proofShare) - outLen := f.EvalOutputLength() - out := arith.NewVec[V](outLen) - f.Eval(out, g, f.Valid.NumGadgetCalls, measShare, jointRand, numShares) - - v := verifierCur.Next(1) - if outLen > 1 { - v[0] = out.DotProduct(queryRandCur.Next(outLen)) - } else { - v[0] = out[0] - } - - // Check that t^p != 1. Since p=2^log2p, this requires log2P squares. - t := &queryRandCur.Next(1)[0] - tp := F(new(E)) - *tp = *t - for range g.log2p { - tp.Sqr(tp) - } - - if tp.IsOne() { - return nil, ErrInvalidEval - } - - // invN is the inverse of N = g.p. - // Also, since g.p is always a power of two, we call a faster inversion - // method that receives the log2 of g.p. - invN := F(new(E)) - invN.InvTwoN(g.log2p) - - wireChecks := verifierCur.Next(g.Arity()) - wirePoly := arith.NewPoly[P](g.p - 1) - wirei := cursor.New(g.wires) - for i := range wireChecks { - V(wirePoly).InvNTT(wirei.Next(g.p), g.p) - wireChecks[i] = wirePoly.Evaluate(t) - // Extracts the constant factor (1/N) to be multiplied after - // polynomial interpolation and evaluation. - F(&wireChecks[i]).MulAssign(invN) - } - - gadgetCheck := &verifierCur.Next(1)[0] - *gadgetCheck = g.poly.Evaluate(t) - return verifierMsg, nil -} - -// Decide returns true if the measurement from which it was generated is valid. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.3.5 -func (f *FLP[G, P, V, E, F]) Decide(verifierMsg V) bool { - if len(verifierMsg) != int(f.VerifierLength()) { - return false - } - - verifierMsgCur := cursor.New(verifierMsg) - v := F(&verifierMsgCur.Next(1)[0]) - if !v.IsZero() { - return false - } - - wireChecks := verifierMsgCur.Next(f.Valid.Gadget.Arity()) - gadgetCheck := &verifierMsgCur.Next(1)[0] - check := F(new(E)) - f.Valid.Gadget.Eval(check, wireChecks) - return check.IsEqual(gadgetCheck) -} - -var ( - ErrOutputLen = errors.New("wrong output length") - ErrMeasurementLen = errors.New("invalid measurement length") - ErrMeasurementValue = errors.New("invalid measurement value") - ErrInvalidEval = errors.New("invalid evaluation point") -) diff --git a/vdaf/prio3/internal/flp/gadgets.go b/vdaf/prio3/internal/flp/gadgets.go deleted file mode 100644 index 9ab7e4b8..00000000 --- a/vdaf/prio3/internal/flp/gadgets.go +++ /dev/null @@ -1,140 +0,0 @@ -package flp - -import ( - "github.com/quantumcoinproject/circl/vdaf/prio3/arith" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith/fp128" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith/fp64" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/cursor" -) - -type Gadget[ - P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], -] interface { - // Arity is the number of input wires. - Arity() uint - // Degree is the arithmetic degree of the gadget circuit. - Degree() uint - // Eval is evaluates the gadget over the given inputs. - Eval(out *E, in V) - // EvalPoly is evaluates the circuit over the polynomial ring of the field. - EvalPoly(out P, in []P) -} - -type gadgetMul struct{} - -func (gadgetMul) Arity() uint { return 2 } -func (gadgetMul) Degree() uint { return 2 } - -type GadgetMulFp64 struct{ gadgetMul } - -func (GadgetMulFp64) Eval(out *fp64.Fp, in fp64.Vec) { - out.Mul(&in[0], &in[1]) -} - -func (GadgetMulFp64) EvalPoly(out fp64.Poly, in []fp64.Poly) { - out.Mul(in[0], in[1]) -} - -type gadgetMulFp128 struct{ gadgetMul } - -func (gadgetMulFp128) Eval(out *fp128.Fp, in fp128.Vec) { - out.Mul(&in[0], &in[1]) -} - -func (gadgetMulFp128) EvalPoly(out fp128.Poly, in []fp128.Poly) { - out.Mul(in[0], in[1]) -} - -// PolyEval gadget for p(x) = x^2-x. -type GadgetPolyEvalx2x struct{} - -func (GadgetPolyEvalx2x) Arity() uint { return 1 } -func (GadgetPolyEvalx2x) Degree() uint { return 2 } -func (GadgetPolyEvalx2x) Eval(out *fp64.Fp, in fp64.Vec) { - out.Sqr(&in[0]) - out.SubAssign(&in[0]) -} - -func (GadgetPolyEvalx2x) EvalPoly(out fp64.Poly, in []fp64.Poly) { - out.Sqr(in[0]) - outShort := out[:len(in[0])] - outShort.SubAssign(in[0]) - out.Strip() -} - -type GadgetParallelSumInnerMul struct { - inner gadgetMulFp128 - Count uint -} - -func (g GadgetParallelSumInnerMul) Arity() uint { return g.inner.Arity() * g.Count } -func (g GadgetParallelSumInnerMul) Degree() uint { return g.inner.Degree() } -func (g GadgetParallelSumInnerMul) Eval(out *fp128.Fp, in fp128.Vec) { - inCur := cursor.New(in) - arity := g.inner.Arity() - var e fp128.Fp - for range g.Count { - g.inner.Eval(&e, inCur.Next(arity)) - out.AddAssign(&e) - } -} - -func (g GadgetParallelSumInnerMul) EvalPoly(out fp128.Poly, in []fp128.Poly) { - inCur := cursor.New(in) - arity := g.inner.Arity() - e := arith.NewPoly[fp128.Poly](uint(len(out) - 1)) - for range g.Count { - g.inner.EvalPoly(e, inCur.Next(arity)) - out.AddAssign(e) - } - - out.Strip() -} - -type wrapperGadget[ - G Gadget[P, V, E, F], - P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], -] struct { - inner G - wires V - p, log2p uint - k uint -} - -func (g *wrapperGadget[G, P, V, E, F]) Arity() uint { return g.inner.Arity() } -func (g *wrapperGadget[G, P, V, E, F]) Degree() uint { return g.inner.Degree() } -func (g *wrapperGadget[G, P, V, E, F]) EvalPoly(out P, in []P) { g.inner.EvalPoly(out, in) } -func (g *wrapperGadget[G, P, V, E, F]) eval(input V) { - g.k++ - wiresCur := cursor.New(g.wires) - for i := range input { - wiresCur.Next(g.p)[g.k] = input[i] - } -} - -type ProveGadget[ - G Gadget[P, V, E, F], - P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], -] struct { - wrapperGadget[G, P, V, E, F] -} - -func (g *ProveGadget[G, P, V, E, F]) Eval(out *E, input V) { - g.wrapperGadget.eval(input) - g.inner.Eval(out, input) -} - -type QueryGadget[ - G Gadget[P, V, E, F], - P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], -] struct { - poly P - alpha, alphaK E - wrapperGadget[G, P, V, E, F] -} - -func (g *QueryGadget[G, P, V, E, F]) Eval(out *E, input V) { - g.wrapperGadget.eval(input) - F(&g.alphaK).MulAssign(&g.alpha) - *out = g.poly.Evaluate(&g.alphaK) -} diff --git a/vdaf/prio3/internal/flp/valid.go b/vdaf/prio3/internal/flp/valid.go deleted file mode 100644 index 9708eed7..00000000 --- a/vdaf/prio3/internal/flp/valid.go +++ /dev/null @@ -1,97 +0,0 @@ -package flp - -import ( - "github.com/quantumcoinproject/circl/math" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith/fp128" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/cursor" -) - -type Params struct { - MeasurementLen uint - JointRandLen uint - EvalOutputLen uint - OutputLen uint -} - -func (p Params) MeasurementLength() uint { return p.MeasurementLen } -func (p Params) JointRandLength() uint { return p.JointRandLen } -func (p Params) OutputLength() uint { return p.OutputLen } -func (p Params) EvalOutputLength() uint { return p.EvalOutputLen } -func (p Params) QueryRandLength() uint { return 1 + p.EvalOutputLen } - -type Valid[ - G Gadget[P, V, E, F], - P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], -] struct { - Gadget G // Gadget to be evaluated - NumGadgetCalls uint // Number of times each gadget is called. - Params -} - -func (v *Valid[G, P, V, E, F]) ProveRandLength() uint { return v.Gadget.Arity() } -func (v *Valid[G, P, V, E, F]) ProofLength() uint { return v.Gadget.Arity() + v.gadgetPolyLen() } -func (v *Valid[G, P, V, E, F]) VerifierLength() uint { return 1 + 1 + v.Gadget.Arity() } -func (v *Valid[G, P, V, E, F]) gadgetPolyLen() uint { - p, _ := math.NextPow2(1 + v.NumGadgetCalls) - return 1 + v.Gadget.Degree()*(p-1) -} - -func (v *Valid[G, P, V, E, F]) wrapProve(proveRand V) *ProveGadget[G, P, V, E, F] { - g := new(ProveGadget[G, P, V, E, F]) - proveRandCur := cursor.New(proveRand) - wireSeeds := proveRandCur.Next(v.Gadget.Arity()) - g.wrapperGadget = v.wrap(wireSeeds) - return g -} - -func (v *Valid[G, P, V, E, F]) wrapQuery(proof V) *QueryGadget[G, P, V, E, F] { - g := new(QueryGadget[G, P, V, E, F]) - proofCur := cursor.New(proof) - wireSeeds := proofCur.Next(v.Gadget.Arity()) - g.wrapperGadget = v.wrap(wireSeeds) - g.poly = P(proofCur.Next(v.gadgetPolyLen())) - F(&g.alpha).SetRootOfUnityTwoN(g.log2p) - F(&g.alphaK).SetOne() - return g -} - -func (v *Valid[G, P, V, E, F]) wrap(wireSeeds V) (g wrapperGadget[G, P, V, E, F]) { - g.inner = v.Gadget - g.p, g.log2p = math.NextPow2(1 + v.NumGadgetCalls) - g.wires = arith.NewVec[V](uint(len(wireSeeds)) * g.p) - wiresCur := cursor.New(g.wires) - for i := range wireSeeds { - wiresCur.Next(g.p)[0] = wireSeeds[i] - } - return -} - -func RangeCheck( - g Gadget[fp128.Poly, fp128.Vec, fp128.Fp, *fp128.Fp], - numCalls uint, - chunkLen uint, sharesInv *fp128.Fp, - meas, jointRand fp128.Vec, -) (out fp128.Fp) { - inputs := arith.NewVec[fp128.Vec](2 * chunkLen) - var evalOut, rPower fp128.Fp - for i := range numCalls { - rPower.SetOne() - for j := range chunkLen { - index := i*chunkLen + j - var measElem fp128.Fp - if index < uint(len(meas)) { - measElem = meas[index] - } - - rPower.MulAssign(&jointRand[i]) - inputs[2*j+0].Mul(&rPower, &measElem) - inputs[2*j+1].Sub(&measElem, sharesInv) - } - - g.Eval(&evalOut, inputs) - out.AddAssign(&evalOut) - } - - return out -} diff --git a/vdaf/prio3/internal/flp_test/query.go b/vdaf/prio3/internal/flp_test/query.go deleted file mode 100644 index 48bb6c5c..00000000 --- a/vdaf/prio3/internal/flp_test/query.go +++ /dev/null @@ -1,52 +0,0 @@ -package flp_test - -import ( - "errors" - "testing" - - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/math" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/flp" -) - -func TestInvalidQuery[ - G flp.Gadget[P, V, E, F], - P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], -](t *testing.T, f *flp.FLP[G, P, V, E, F]) { - const NumShares = 2 - measShare := arith.NewVec[V](f.MeasurementLength()) - proofShare := arith.NewVec[V](f.ProofLength()) - queryRand := arith.NewVec[V](f.QueryRandLength()) - jointRand := arith.NewVec[V](f.JointRandLength()) - - s := sha3.NewShake128() - test.CheckNoErr(t, measShare.Random(&s), "measShare random failed") - test.CheckNoErr(t, proofShare.Random(&s), "proofShare random failed") - test.CheckNoErr(t, queryRand.Random(&s), "queryRand random failed") - test.CheckNoErr(t, jointRand.Random(&s), "jointRand random failed") - - var index uint - if f.EvalOutputLength() > 1 { - index = f.EvalOutputLength() - } - - invalidEvaluationPoint := F(&queryRand[index]) - _, logP := math.NextPow2(1 + f.Valid.NumGadgetCalls) - root := F(new(E)) - // Check all subgroups of order 2^logN <= 2^logP. - for logN := range logP + 1 { - root.SetRootOfUnityTwoN(logN) - invalidEvaluationPoint.SetOne() - // Check every element in the subgroup of order 2^logN. - for range 1 << logN { - _, err := f.Query(measShare, proofShare, queryRand, jointRand, NumShares) - if !errors.Is(err, flp.ErrInvalidEval) { - test.ReportError(t, err, flp.ErrInvalidEval) - } - - invalidEvaluationPoint.MulAssign(root) - } - } -} diff --git a/vdaf/prio3/internal/prio3/prio3.go b/vdaf/prio3/internal/prio3/prio3.go deleted file mode 100644 index 8f16a01b..00000000 --- a/vdaf/prio3/internal/prio3/prio3.go +++ /dev/null @@ -1,537 +0,0 @@ -// Package prio3 supports a variety of verifiable distributed aggregation functions. -// -// Clients protect the privacy of their measurements by secret sharing them -// and distributing the shares among the Aggregators. -// To ensure each measurement is valid, the Aggregators run a multi-party -// computation on their shares, the result of which is the output of the -// arithmetic circuit. -// This involves verification of a Fully Linear Proof (FLP) that specifies -// the types of measurements. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7 -package prio3 - -import ( - "crypto/subtle" - "errors" - - "github.com/quantumcoinproject/circl/vdaf/prio3/arith" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/cursor" -) - -// Prio3 supports a variety of verifiable distributed aggregation functions. -// An instance is parametrized by the type of measurement and aggregated data, -// as well as the field to perform arithmetic operations. -type Prio3[ - Measurement, Aggregate any, - T flp[Measurement, Aggregate, V, E, F], - V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], -] struct { - flp T - xof xofTS[V, E] - randSize uint - shares uint8 -} - -func New[ - T flp[Measurement, Aggregate, V, E, F], - Measurement, Aggregate any, - V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], -](f T, algorithmID uint32, numShares uint8, context []byte, -) (v Prio3[Measurement, Aggregate, T, V, E, F], err error) { - if numShares < 2 { - return v, ErrNumShares - } - - v.flp = f - v.xof, err = NewXof[V](algorithmID, context) - if err != nil { - return v, err - } - - v.shares = numShares - v.randSize = SeedSize * uint(numShares) - if f.JointRandLength() > 0 { - v.randSize *= 2 - } - - return v, nil -} - -// Shard takes a measurement and return a set of shares and a public share -// used for verification. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.1 -func (v *Prio3[M, A, T, V, E, F]) Shard( - measurement M, nonce *Nonce, rand []byte, -) (PublicShare, []InputShare[V, E], error) { - if len(rand) != int(v.randSize) { - return nil, nil, ErrRandSize - } - - meas, err := v.flp.Encode(measurement) - if err != nil { - return nil, nil, err - } - - if v.flp.JointRandLength() == 0 { - inputShare, err := v.shardNoJointRand(meas, rand) - return nil, inputShare, err - } else { - return v.shardWithJointRand(meas, nonce, rand) - } -} - -// FLPs without joint randomness. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.1.1 -func (v *Prio3[M, A, T, V, E, F]) shardNoJointRand( - meas V, seeds []byte, -) ([]InputShare[V, E], error) { - // Each Aggregator's input share contains its measurement share - // and its share of the proof. - params := v.Params() - inputShares := make([]InputShare[V, E], v.shares) - inputShares[0].leader = new(InputShareLeader[V, E]).New(¶ms) - - seedsCur := cursor.New(seeds) - for i := 1; i < len(inputShares); i++ { - inputShares[i].helper = &InputShareHelper{ - share: Seed(seedsCur.Next(SeedSize)), - blind: nil, - } - } - - // Generate proof of valid measurement. - proveSeed := Seed(seedsCur.Next(SeedSize)) - proveRands := arith.NewVec[V](params.ProveRandLength()) - err := v.xof.proveRands(proveRands, &proveSeed) - if err != nil { - return nil, err - } - - proveRand := proveRands[:params.ProveRandLength()] - proof := v.flp.Prove(meas, proveRand, nil) - - // Shard the encoded measurement and proof into shares. - copy(inputShares[0].leader.measShare, meas) - copy(inputShares[0].leader.proofShare, proof) - m := arith.NewVec[V](params.MeasurementLength()) - p := arith.NewVec[V](params.ProofLength()) - for i := 1; i < len(inputShares); i++ { - share := &inputShares[i].helper.share - err = v.xof.helperMeasShare(m, uint8(i), share) - if err != nil { - return nil, err - } - - inputShares[0].leader.measShare.SubAssign(m) - - err = v.xof.helperProofsShare(p, uint8(i), share) - if err != nil { - return nil, err - } - - inputShares[0].leader.proofShare.SubAssign(p) - } - - return inputShares, nil -} - -// FLPs with joint randomness. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.1.2 -func (v *Prio3[M, A, T, V, E, F]) shardWithJointRand( - meas V, nonce *Nonce, seeds []byte, -) (PublicShare, []InputShare[V, E], error) { - // Each Aggregator's input share contains its measurement share, - // share of proof, and blind. The public share contains the - // Aggregators' joint randomness parts. - params := v.Params() - inputShares := make([]InputShare[V, E], v.shares) - inputShares[0].leader = new(InputShareLeader[V, E]).New(¶ms) - - seedsCur := cursor.New(seeds) - for i := 1; i < len(inputShares); i++ { - inputShares[i].helper = &InputShareHelper{ - share: Seed(seedsCur.Next(SeedSize)), - blind: (*Seed)(seedsCur.Next(SeedSize)), - } - } - inputShares[0].leader.blind = (*Seed)(seedsCur.Next(SeedSize)) - - // Shard the encoded measurement into shares and compute the - // joint randomness parts. - copy(inputShares[0].leader.measShare, meas) - - var jointRandParts PublicShare - jointRandParts.New(¶ms) - jointRandPartsCur := cursor.New(jointRandParts) - jrpLeader := jointRandPartsCur.Next(SeedSize) - - m := arith.NewVec[V](params.MeasurementLength()) - encM := make([]byte, m.Size()) - for i := 1; i < len(inputShares); i++ { - err := v.xof.helperMeasShareEnc( - encM[:0], m, uint8(i), &inputShares[i].helper.share) - if err != nil { - return nil, nil, err - } - - err = v.xof.jointRandPart(jointRandPartsCur.Next(SeedSize), - inputShares[i].helper.blind, uint8(i), nonce, encM) - if err != nil { - return nil, nil, err - } - - inputShares[0].leader.measShare.SubAssign(m) - } - - // Calculate leader's jointRandPart after leader's measShare - // has been calculated. - measShareEnc, err := inputShares[0].leader.measShare.MarshalBinary() - if err != nil { - return nil, nil, err - } - - err = v.xof.jointRandPart( - jrpLeader, inputShares[0].leader.blind, 0, nonce, measShareEnc) - if err != nil { - return nil, nil, err - } - - // Generate proof of valid measurement. - proveSeed := Seed(seedsCur.Next(SeedSize)) - proveRands := arith.NewVec[V](params.ProveRandLength()) - err = v.xof.proveRands(proveRands, &proveSeed) - if err != nil { - return nil, nil, err - } - - proveRand := proveRands[:params.ProveRandLength()] - - jrSeed, err := v.xof.jointRandSeed(jointRandParts) - if err != nil { - return nil, nil, err - } - - jointRands := arith.NewVec[V](params.JointRandLength()) - err = v.xof.jointRands(jointRands, &jrSeed) - if err != nil { - return nil, nil, err - } - - jointRand := jointRands[:params.JointRandLength()] - proof := v.flp.Prove(meas, proveRand, jointRand) - - // Shard the proof into shares. - copy(inputShares[0].leader.proofShare, proof) - p := arith.NewVec[V](params.ProofLength()) - for i := 1; i < len(inputShares); i++ { - err = v.xof.helperProofsShare(p, uint8(i), &inputShares[i].helper.share) - if err != nil { - return nil, nil, err - } - - inputShares[0].leader.proofShare.SubAssign(p) - } - - return jointRandParts, inputShares, nil -} - -// PrepInit is used by each aggregator to begin the preparation phase. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.2 -func (v *Prio3[M, A, T, V, E, F]) PrepInit( - verifyKey *VerifyKey, nonce *Nonce, aggID uint8, - ps PublicShare, inputShare InputShare[V, E], -) (*PrepState[V, E], *PrepShare[V, E], error) { - params := v.Params() - if aggID > v.shares { - return nil, nil, ErrAggID - } - - share, err := v.getInputShareContent(aggID, inputShare, ¶ms) - if err != nil { - return nil, nil, err - } - - prepShare := new(PrepShare[V, E]) - prepState := new(PrepState[V, E]) - prepState.outShare = v.flp.Truncate(share.measShare) - - // Compute the joint randomness. - var jointRand V - jointRandLen := params.JointRandLength() - if jointRandLen > 0 { - if share.blind == nil || len(ps) == 0 { - return nil, nil, ErrJointRand - } - - var measShareEnc []byte - measShareEnc, err = share.measShare.MarshalBinary() - if err != nil { - return nil, nil, err - } - - prepShare.jointRandPart = &Seed{} - err = v.xof.jointRandPart(prepShare.jointRandPart[:], - share.blind, aggID, nonce, measShareEnc) - if err != nil { - return nil, nil, err - } - - prepState.correctedJointRandSeed = &Seed{} - *prepState.correctedJointRandSeed, err = v.xof.jointRandSeed(ps) - if err != nil { - return nil, nil, err - } - - jointRands := arith.NewVec[V](params.JointRandLength()) - err = v.xof.jointRands(jointRands, prepState.correctedJointRandSeed) - if err != nil { - return nil, nil, err - } - - jointRand = jointRands[:jointRandLen] - } - - // Query the measurement and proof share. - queryRands := arith.NewVec[V](params.QueryRandLength()) - err = v.xof.queryRands(queryRands, verifyKey, nonce) - if err != nil { - return nil, nil, err - } - - proofShare := share.proofShare[:params.ProofLength()] - queryRand := queryRands[:params.QueryRandLength()] - - prepShare.verifiersShare, err = v.flp.Query( - share.measShare, proofShare, queryRand, jointRand, v.shares) - if err != nil { - return nil, nil, err - } - - return prepState, prepShare, nil -} - -// PrepSharesToPrep is the deterministic preparation message pre-processing -// algorithm. It combines the prep shares produced by the Aggregators in the -// previous round into the prep message consumed by each Aggregator to start -// the next round. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.2 -func (v *Prio3[M, A, T, V, E, F]) PrepSharesToPrep( - prepShares []PrepShare[V, E], -) (*PrepMessage, error) { - params := v.Params() - msg := new(PrepMessage) - // Unshard the verifier shares into the verifier message. - verifierLen := params.VerifierLength() - verifiers := arith.NewVec[V](verifierLen) - for i := range prepShares { - verifiers.AddAssign(prepShares[i].verifiersShare) - } - - // Verify that each proof is well-formed and input is valid. - verifier := verifiers[:verifierLen] - if !v.flp.Decide(verifier) { - return nil, ErrProofVerify - } - - // Combine the joint randomness parts computed by the - // Aggregators into the true joint randomness seed. This is - // used in the last step. - if params.JointRandLength() > 0 { - jointRandParts := make([]byte, 0, SeedSize*uint(v.shares)) - for i := range prepShares { - if prepShares[i].jointRandPart == nil { - return nil, ErrJointRand - } - - jointRandParts = append( - jointRandParts, prepShares[i].jointRandPart[:]...) - } - - jointRandSeed, err := v.xof.jointRandSeed(jointRandParts) - if err != nil { - return nil, err - } - - msg.joinRand = &jointRandSeed - } - - return msg, nil -} - -// PrepNext is used by each aggregator to produce its output share. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.2 -func (v *Prio3[M, A, T, V, E, F]) PrepNext( - state *PrepState[V, E], msg *PrepMessage, -) (*OutShare[V, E], error) { - if msg != nil && state != nil && msg.joinRand != nil && - state.correctedJointRandSeed != nil { - if subtle.ConstantTimeCompare( - msg.joinRand[:], state.correctedJointRandSeed[:]) != 1 { - return nil, ErrJointRand - } - } - - return &OutShare[V, E]{state.outShare}, nil -} - -// AggregateInit is used to start aggregation. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.4 -func (v *Prio3[M, A, T, V, E, F]) AggregateInit() (s AggShare[V, E]) { - s.share = arith.NewVec[V](v.flp.OutputLength()) - return -} - -// AggregateUpdate aggregates an output share into an aggregation share. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.4 -func (v *Prio3[M, A, T, V, E, F]) AggregateUpdate( - aggShare *AggShare[V, E], outShare *OutShare[V, E], -) { - aggShare.share.AddAssign(outShare.share) -} - -// aggregateMerge merges several aggregation shares. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.4 -func (v *Prio3[M, A, T, V, E, F]) aggregateMerge( - aggShares []AggShare[V, E], -) (s AggShare[V, E]) { - s = v.AggregateInit() - for i := range aggShares { - s.share.AddAssign(aggShares[i].share) - } - - return -} - -// Unshard is used by the Collector to recover the aggregate result from a set -// of aggregation shares. -// -// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.5 -func (v *Prio3[M, A, T, V, E, F]) Unshard( - aggShares []AggShare[V, E], numMeas uint, -) (*A, error) { - if len(aggShares) != int(v.shares) { - return nil, ErrAggShareSize - } - - s := v.aggregateMerge(aggShares) - return v.flp.Decode(s.share, numMeas) -} - -func (v *Prio3[M, A, T, V, E, F]) getInputShareContent( - aggID uint8, inShare InputShare[V, E], params *Params, -) (s inputShareContent[V, E], err error) { - switch true { - case aggID == 0 && inShare.leader != nil: - return inShare.leader.inputShareContent, nil - case aggID != 0 && inShare.helper != nil: - s.New(params) - share := &inShare.helper.share - err = v.xof.helperMeasShare(s.measShare, aggID, share) - if err != nil { - return s, err - } - - err = v.xof.helperProofsShare(s.proofShare, aggID, share) - if err != nil { - return s, err - } - - s.blind = inShare.helper.blind - return s, nil - default: - return s, ErrShare - } -} - -type Params struct { - jointRandLen uint - measurementLen uint - outputLen uint - evalOutputLen uint - queryRandLen uint - proveRandLen uint - proofLen uint - verifierLen uint - randSize uint - shares uint8 -} - -func (p *Params) JointRandLength() uint { return p.jointRandLen } -func (p *Params) MeasurementLength() uint { return p.measurementLen } -func (p *Params) OutputLength() uint { return p.outputLen } -func (p *Params) EvalOutputLength() uint { return p.evalOutputLen } -func (p *Params) QueryRandLength() uint { return p.queryRandLen } -func (p *Params) ProveRandLength() uint { return p.proveRandLen } -func (p *Params) ProofLength() uint { return p.proofLen } -func (p *Params) VerifierLength() uint { return p.verifierLen } -func (p *Params) RandSize() uint { return p.randSize } -func (p *Params) Shares() uint8 { return p.shares } - -func (v *Prio3[M, A, T, V, E, F]) Params() Params { - return Params{ - jointRandLen: v.flp.JointRandLength(), - measurementLen: v.flp.MeasurementLength(), - outputLen: v.flp.OutputLength(), - evalOutputLen: v.flp.EvalOutputLength(), - queryRandLen: v.flp.QueryRandLength(), - proveRandLen: v.flp.ProveRandLength(), - proofLen: v.flp.ProofLength(), - verifierLen: v.flp.VerifierLength(), - randSize: v.randSize, - shares: v.shares, - } -} - -type flp[ - Measurement, AggResult any, - V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], -] interface { - MeasurementLength() uint - JointRandLength() uint - OutputLength() uint - EvalOutputLength() uint - ProveRandLength() uint - ProofLength() uint - VerifierLength() uint - QueryRandLength() uint - // Prove returns a proof attesting to the validity of the given measurement. - Prove(meas, proveRand, jointRand V) V - // Query is the linear Query algorithm run by each verifier on its share of - // the measurement and proof. - Query(measShare, proofShare, queryRnd, jointRnd V, shares uint8) (V, error) - // Decide returns true if the measurement from which it was generated is - // valid. - Decide(V) bool - // Encode returns a vector of MeasurementLength() elements representing - // a measurement of type [Measurement]. - Encode(Measurement) (V, error) - // Truncate returns a vector of OutputLength() elements representing - // (a share of) an aggregatable output. - Truncate(V) V - // Decode returns an aggregate result of type [AggResult]. - // This computation may depend on the number of outputs aggregated. - Decode(V, uint) (*AggResult, error) -} - -var ( - ErrNumShares = errors.New("invalid numshares, must be greater than 1") - ErrContextSize = errors.New("invalid context length, (0, MaxContextSize)") - ErrNonceSize = errors.New("invalid nonce length, (NonceSize)") - ErrVerifyKeySize = errors.New("invalid verify key length, (VerifyKeySize)") - ErrRandSize = errors.New("invalid randomness length") - ErrAggShareSize = errors.New("invalid aggregate shares length") - ErrAggID = errors.New("invalid aggregation ID") - ErrJointRand = errors.New("invalid joint randomness") - ErrShare = errors.New("share was not provided") - ErrProofVerify = errors.New("proof verifier check failed") -) diff --git a/vdaf/prio3/internal/prio3/types.go b/vdaf/prio3/internal/prio3/types.go deleted file mode 100644 index b3b1369d..00000000 --- a/vdaf/prio3/internal/prio3/types.go +++ /dev/null @@ -1,390 +0,0 @@ -package prio3 - -import ( - "github.com/quantumcoinproject/circl/internal/conv" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith" - "golang.org/x/crypto/cryptobyte" -) - -const ( - SeedSize uint = 32 // Size of Seed in bytes. - NonceSize uint = 16 // Size of Nonce in bytes. - VerifyKeySize uint = 32 // Size of VerifyKey in bytes. -) - -type ( - // Nonce is a public random value associated with the report. - Nonce [NonceSize]byte - // VerifyKey is a secret verification key held by each of the Aggregators. - // This key is used to verify validity of the output shares they compute. - VerifyKey [VerifyKeySize]byte - // Seed is used to feed an extendable output function. - Seed [SeedSize]byte -) - -func (s *Seed) Marshal(b *cryptobyte.Builder) error { - b.AddBytes(s[:]) - return nil -} - -func (s *Seed) Unmarshal(str *cryptobyte.String) bool { - return str.CopyBytes((*s)[:]) -} - -// PublicShare must be distributed to each of the Aggregators. -// Its content depends on whether joint randomness is required for the -// underlying FLP. -// If joint randomness is not used, then the public share is an empty slice. -// -// struct { -// Prio3Seed joint_rand_parts[SEED_SIZE * prio3.SHARES]; -// } Prio3PublicShareWithJointRand; -type PublicShare []byte - -func (s *PublicShare) New(p *Params) *PublicShare { - var n uint - if p.JointRandLength() > 0 { - n = SeedSize * uint(p.shares) - } - *s = make([]byte, n) - return s -} - -func (s *PublicShare) Marshal(b *cryptobyte.Builder) error { - b.AddBytes(*s) - return nil -} - -func (s *PublicShare) MarshalBinary() ([]byte, error) { - return conv.MarshalBinaryLen(s, uint(len(*s))) -} - -func (s *PublicShare) Unmarshal(str *cryptobyte.String) bool { - return str.CopyBytes(*s) -} - -func (s *PublicShare) UnmarshalBinary(b []byte) error { - return conv.UnmarshalBinary(s, b) -} - -type inputShareContent[V arith.Vec[V, E], E arith.Elt] struct { - blind *Seed - proofShare V - measShare V -} - -func (s *inputShareContent[V, E]) New(p *Params) *inputShareContent[V, E] { - s.measShare = arith.NewVec[V](p.MeasurementLength()) - s.proofShare = arith.NewVec[V](p.ProofLength()) - if p.JointRandLength() > 0 { - s.blind = &Seed{} - } else { - s.blind = nil - } - return s -} - -func (s *inputShareContent[V, E]) Marshal(b *cryptobyte.Builder) error { - b.AddValue(s.measShare) - b.AddValue(s.proofShare) - if s.blind != nil { - b.AddValue(s.blind) - } - return nil -} - -func (s *inputShareContent[V, E]) Unmarshal(str *cryptobyte.String) bool { - ok := s.measShare.Unmarshal(str) && s.proofShare.Unmarshal(str) - if s.blind != nil { - ok = ok && s.blind.Unmarshal(str) - } - return ok -} - -// InputShareLeader represents one of these two structures. -// -// struct { -// Prio3Field meas_share[F * prio3.flp.MEAS_LEN]; -// Prio3Field proofs_share[F * prio3.flp.PROOF_LEN * prio3.PROOFS]; -// } Prio3LeaderShare; -// -// struct { -// Prio3LeaderShare inner; -// Prio3Seed blind; -// } Prio3LeaderShareWithJointRand; -type InputShareLeader[V arith.Vec[V, E], E arith.Elt] struct { - inputShareContent[V, E] -} - -func (s *InputShareLeader[V, E]) New(p *Params) *InputShareLeader[V, E] { - s.inputShareContent.New(p) - return s -} - -// InputShareHelper represents one of these two structures. -// -// struct { -// Prio3Seed share; -// } Prio3HelperShare; -// -// struct { -// Prio3HelperShare inner; -// Prio3Seed blind; -// } Prio3HelperShareWithJointRand; -type InputShareHelper struct { - blind *Seed - share Seed -} - -func (s *InputShareHelper) New(p *Params) *InputShareHelper { - s.share = Seed{} - if p.JointRandLength() > 0 { - s.blind = &Seed{} - } else { - s.blind = nil - } - return s -} - -func (s *InputShareHelper) Marshal(b *cryptobyte.Builder) error { - b.AddValue(&s.share) - if s.blind != nil { - b.AddValue(s.blind) - } - return nil -} - -func (s *InputShareHelper) Unmarshal(str *cryptobyte.String) bool { - ok := s.share.Unmarshal(str) - if s.blind != nil { - ok = ok && s.blind.Unmarshal(str) - } - return ok -} - -// InputShare is a generic struct that stores shares for the leader or helper. -type InputShare[V arith.Vec[V, E], E arith.Elt] struct { - leader *InputShareLeader[V, E] - helper *InputShareHelper -} - -func (s *InputShare[V, E]) New(p *Params, aggID uint) *InputShare[V, E] { - if aggID == 0 { - s.leader = new(InputShareLeader[V, E]).New(p) - s.helper = nil - } else { - s.helper = new(InputShareHelper).New(p) - s.leader = nil - } - return s -} - -func (s *InputShare[V, E]) MarshalBinary() ([]byte, error) { - return conv.MarshalBinary(s) -} - -func (s *InputShare[V, E]) UnmarshalBinary(b []byte) error { - return conv.UnmarshalBinary(s, b) -} - -func (s *InputShare[V, E]) Marshal(b *cryptobyte.Builder) error { - switch true { - case s.leader != nil && s.helper == nil: - b.AddValue(s.leader) - case s.leader == nil && s.helper != nil: - b.AddValue(s.helper) - default: - return ErrShare - } - return nil -} - -func (s *InputShare[V, E]) Unmarshal(str *cryptobyte.String) bool { - switch true { - case s.leader != nil && s.helper == nil: - return s.leader.Unmarshal(str) - case s.leader == nil && s.helper != nil: - return s.helper.Unmarshal(str) - default: - return false - } -} - -// InputShareHelper represents one of these two structures. -// -// struct { -// Prio3Field verifiers_share[F * V]; -// } Prio3PrepShare; -// -// struct { -// Prio3Field verifiers_share[F * V]; -// Prio3Seed joint_rand_part; -// } Prio3PrepShareWithJointRand; -type PrepShare[V arith.Vec[V, E], E arith.Elt] struct { - jointRandPart *Seed - verifiersShare V -} - -func (s *PrepShare[V, E]) New(p *Params) *PrepShare[V, E] { - s.verifiersShare = arith.NewVec[V](p.VerifierLength()) - if p.JointRandLength() > 0 { - s.jointRandPart = &Seed{} - } else { - s.jointRandPart = nil - } - return s -} - -func (s *PrepShare[V, E]) MarshalBinary() ([]byte, error) { - return conv.MarshalBinary(s) -} - -func (s *PrepShare[V, E]) UnmarshalBinary(b []byte) error { - return conv.UnmarshalBinary(s, b) -} - -func (s *PrepShare[V, E]) Marshal(b *cryptobyte.Builder) error { - b.AddValue(s.verifiersShare) - if s.jointRandPart != nil { - b.AddValue(s.jointRandPart) - } - return nil -} - -func (s *PrepShare[V, E]) Unmarshal(str *cryptobyte.String) bool { - ok := s.verifiersShare.Unmarshal(str) - if s.jointRandPart != nil { - ok = ok && s.jointRandPart.Unmarshal(str) - } - return ok -} - -type PrepState[V arith.Vec[V, E], E arith.Elt] struct { - correctedJointRandSeed *Seed - outShare V -} - -func (s *PrepState[V, E]) New(p *Params) *PrepState[V, E] { - s.outShare = arith.NewVec[V](p.OutputLength()) - if p.JointRandLength() > 0 { - s.correctedJointRandSeed = &Seed{} - } else { - s.correctedJointRandSeed = nil - } - return s -} - -func (s *PrepState[V, E]) MarshalBinary() ([]byte, error) { - return conv.MarshalBinary(s) -} - -func (s *PrepState[V, E]) UnmarshalBinary(b []byte) error { - return conv.UnmarshalBinary(s, b) -} - -func (s *PrepState[V, E]) Marshal(b *cryptobyte.Builder) error { - b.AddValue(s.outShare) - if s.correctedJointRandSeed != nil { - b.AddValue(s.correctedJointRandSeed) - } - return nil -} - -func (s *PrepState[V, E]) Unmarshal(str *cryptobyte.String) bool { - ok := s.outShare.Unmarshal(str) - if s.correctedJointRandSeed != nil { - ok = ok && s.correctedJointRandSeed.Unmarshal(str) - } - return ok -} - -// PrepMessage represents the following structure. -// -// struct { -// Prio3Seed joint_rand; -// } Prio3PrepMessageWithJointRand; -type PrepMessage struct{ joinRand *Seed } - -func (s *PrepMessage) New(p *Params) *PrepMessage { - if p.JointRandLength() > 0 { - s.joinRand = &Seed{} - } else { - s.joinRand = nil - } - return s -} - -func (s *PrepMessage) MarshalBinary() ([]byte, error) { - return conv.MarshalBinary(s) -} - -func (s *PrepMessage) UnmarshalBinary(b []byte) error { - return conv.UnmarshalBinary(s, b) -} - -func (s *PrepMessage) Marshal(b *cryptobyte.Builder) error { - if s.joinRand != nil { - b.AddValue(s.joinRand) - } - return nil -} - -func (s *PrepMessage) Unmarshal(str *cryptobyte.String) bool { - if s.joinRand != nil { - return s.joinRand.Unmarshal(str) - } - return true -} - -type OutShare[V arith.Vec[V, E], E arith.Elt] struct{ share V } - -func (s *OutShare[V, E]) New(p *Params) *OutShare[V, E] { - s.share = arith.NewVec[V](p.OutputLength()) - return s -} - -func (s *OutShare[V, E]) MarshalBinary() ([]byte, error) { - return conv.MarshalBinaryLen(s, s.share.Size()) -} - -func (s *OutShare[V, E]) UnmarshalBinary(b []byte) error { - return conv.UnmarshalBinary(s, b) -} - -func (s *OutShare[V, E]) Marshal(b *cryptobyte.Builder) error { - b.AddValue(s.share) - return nil -} - -func (s *OutShare[V, E]) Unmarshal(str *cryptobyte.String) bool { - return s.share.Unmarshal(str) -} - -// AggShare represents the following structure. -// -// struct { -// Prio3Field agg_share[F * prio3.flp.OUTPUT_LEN]; -// } Prio3AggShare; -type AggShare[V arith.Vec[V, E], E arith.Elt] struct{ share V } - -func (s *AggShare[V, E]) New(p *Params) *AggShare[V, E] { - s.share = arith.NewVec[V](p.OutputLength()) - return s -} - -func (s *AggShare[V, E]) MarshalBinary() ([]byte, error) { - return conv.MarshalBinaryLen(s, s.share.Size()) -} - -func (s *AggShare[V, E]) UnmarshalBinary(b []byte) error { - return conv.UnmarshalBinary(s, b) -} - -func (s *AggShare[V, E]) Marshal(b *cryptobyte.Builder) error { - b.AddValue(s.share) - return nil -} - -func (s *AggShare[V, E]) Unmarshal(str *cryptobyte.String) bool { - return s.share.Unmarshal(str) -} diff --git a/vdaf/prio3/internal/prio3/xof.go b/vdaf/prio3/internal/prio3/xof.go deleted file mode 100644 index 21fb8c07..00000000 --- a/vdaf/prio3/internal/prio3/xof.go +++ /dev/null @@ -1,221 +0,0 @@ -package prio3 - -import ( - "encoding/binary" - "math" - - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith" -) - -// xofTS allows to derive seeds and vector of elements from TurboSHAKE. -type xofTS[V arith.Vec[V, E], E arith.Elt] struct { - usage *[2]byte - Header []byte - sha3.State -} - -// NewXof returns an xof based on TurboSHAKE given a VDAF ID and an application -// context string. -func NewXof[V arith.Vec[V, E], E arith.Elt]( - algorithmID uint32, context []byte, -) (x xofTS[V, E], err error) { - const ( - Version = 12 - AlgoClass = 0 - TurboShake128DS = 1 - dstPrefixLen uint = 8 - maxContextSize uint = math.MaxUint16 - dstPrefixLen - ) - - if len(context) > int(maxContextSize) { - return x, ErrContextSize - } - - lenDST := dstPrefixLen + uint(len(context)) - usagePos := dstPrefixLen - headerLen := 2 + lenDST + 1 - x.Header = make([]byte, 0, headerLen) - // | 2 | uint16(len(dst)) | little-endian | - // | 1 | Version | - // | 1 | AlgoClass | - // | 4 | ID | big-endian | - // | 2 | Usage | big-endian | - // | * | context | - // | 1 | SeedSize | - x.Header = binary.LittleEndian.AppendUint16(x.Header, uint16(lenDST)) - x.Header = append(x.Header, Version) - x.Header = append(x.Header, AlgoClass) - x.Header = binary.BigEndian.AppendUint32(x.Header, algorithmID) - x.Header = binary.BigEndian.AppendUint16(x.Header, 0) - x.Header = append(x.Header, context...) - x.Header = append(x.Header, uint8(SeedSize)) - x.usage = (*[2]byte)(x.Header[usagePos : usagePos+2]) - x.State = sha3.NewTurboShake128(TurboShake128DS) - return x, nil -} - -func (x *xofTS[V, E]) Init(usage uint16, s *Seed) error { - binary.BigEndian.PutUint16(x.usage[:], usage) - x.Reset() - _, err := x.Write(x.Header) - if err != nil { - return err - } - - _, err = x.Write(s[:]) - if err != nil { - return err - } - - return nil -} - -func (x *xofTS[V, E]) SetBinderByte(binder ...byte) error { - _, err := x.Write(binder) - return err -} - -func (x *xofTS[V, E]) SetBinderBytes(binder ...[]byte) error { - for i := range binder { - _, err := x.Write(binder[i]) - if err != nil { - return err - } - } - - return nil -} - -func (x *xofTS[V, E]) helperMeasShareEnc( - encOut []byte, out V, aggID uint8, s *Seed, -) error { - err := x.Init(usageMeasuShare, s) - if err != nil { - return err - } - - err = x.SetBinderByte(aggID) - if err != nil { - return err - } - - return out.RandomSHA3Bytes(encOut, &x.State) -} - -func (x *xofTS[V, E]) helperMeasShare(out V, aggID uint8, s *Seed) error { - err := x.Init(usageMeasuShare, s) - if err != nil { - return err - } - - err = x.SetBinderByte(aggID) - if err != nil { - return err - } - - return out.RandomSHA3(&x.State) -} - -func (x *xofTS[V, E]) helperProofsShare(out V, aggID uint8, s *Seed) error { - const numProofs = 1 - err := x.Init(usageProofShare, s) - if err != nil { - return err - } - - err = x.SetBinderByte(numProofs, aggID) - if err != nil { - return err - } - - return out.RandomSHA3(&x.State) -} - -func (x *xofTS[V, E]) proveRands(out V, proveSeed *Seed) error { - const numProofs = 1 - err := x.Init(usageProveRandomness, proveSeed) - if err != nil { - return err - } - - err = x.SetBinderByte(numProofs) - if err != nil { - return err - } - - return out.RandomSHA3(&x.State) -} - -func (x *xofTS[V, E]) queryRands(out V, k *VerifyKey, nonce *Nonce) error { - const numProofs = 1 - err := x.Init(usageQueryRandomness, (*Seed)(k)) - if err != nil { - return err - } - - err = x.SetBinderBytes([]byte{numProofs}, nonce[:]) - if err != nil { - return err - } - - return out.RandomSHA3(&x.State) -} - -func (x *xofTS[V, E]) jointRandPart( - out []byte, blind *Seed, aggID uint8, nonce *Nonce, measShareEnc []byte, -) error { - err := x.Init(usageJointRandPart, blind) - if err != nil { - return err - } - - err = x.SetBinderBytes([]byte{aggID}, nonce[:], measShareEnc) - if err != nil { - return err - } - - _, err = x.Read(out) - return err -} - -func (x *xofTS[V, E]) jointRandSeed(jointRandParts []byte) (s Seed, err error) { - var zeros Seed - err = x.Init(usageJointRandSeed, &zeros) - if err != nil { - return s, err - } - - err = x.SetBinderBytes(jointRandParts) - if err != nil { - return s, err - } - - _, err = x.Read(s[:]) - return -} - -func (x *xofTS[V, E]) jointRands(out V, jointRandSeed *Seed) error { - const numProofs = 1 - err := x.Init(usageJointRandomness, jointRandSeed) - if err != nil { - return err - } - - err = x.SetBinderByte(numProofs) - if err != nil { - return err - } - - return out.RandomSHA3(&x.State) -} - -const ( - usageMeasuShare uint16 = iota + 1 - usageProofShare - usageJointRandomness - usageProveRandomness - usageQueryRandomness - usageJointRandSeed - usageJointRandPart -) diff --git a/vdaf/prio3/mhcv/mhcv.go b/vdaf/prio3/mhcv/mhcv.go deleted file mode 100644 index 29aba69b..00000000 --- a/vdaf/prio3/mhcv/mhcv.go +++ /dev/null @@ -1,218 +0,0 @@ -// Package mhcv is a VDAF for aggregating vectors of Booleans with bounded weight. -package mhcv - -import ( - "errors" - "math/big" - "math/bits" - - "github.com/quantumcoinproject/circl/vdaf/prio3/arith" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith/fp128" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/cursor" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/flp" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/prio3" -) - -type ( - poly = fp128.Poly - Vec = fp128.Vec - Fp = fp128.Fp - AggShare = prio3.AggShare[Vec, Fp] - InputShare = prio3.InputShare[Vec, Fp] - Nonce = prio3.Nonce - OutShare = prio3.OutShare[Vec, Fp] - PrepMessage = prio3.PrepMessage - PrepShare = prio3.PrepShare[Vec, Fp] - PrepState = prio3.PrepState[Vec, Fp] - PublicShare = prio3.PublicShare - VerifyKey = prio3.VerifyKey -) - -// MultiHotCountVec is a verifiable distributed aggregation function in which -// each measurement is a vector of Booleans, where the number of True -// values is bounded. -// This provides a functionality similar to Histogram except that more than -// one entry (or none at all) may be non-zero. -type MultiHotCountVec struct { - p prio3.Prio3[[]bool, []uint64, *flpMultiHotCountVec, Vec, Fp, *Fp] -} - -func New(numShares uint8, length, maxWeight, chunkLength uint, context []byte) (m *MultiHotCountVec, err error) { - const multihotCountVecID = 5 - flp, err := newFlpMultiCountHotVec(length, maxWeight, chunkLength) - if err != nil { - return nil, err - } - - m = new(MultiHotCountVec) - m.p, err = prio3.New(flp, multihotCountVecID, numShares, context) - if err != nil { - return nil, err - } - - return m, nil -} - -func (m *MultiHotCountVec) Params() prio3.Params { return m.p.Params() } - -func (m *MultiHotCountVec) Shard(measurement []bool, nonce *Nonce, rand []byte, -) (PublicShare, []InputShare, error) { - return m.p.Shard(measurement, nonce, rand) -} - -func (m *MultiHotCountVec) PrepInit( - verifyKey *VerifyKey, - nonce *Nonce, - aggID uint8, - publicShare PublicShare, - inputShare InputShare, -) (*PrepState, *PrepShare, error) { - return m.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) -} - -func (m *MultiHotCountVec) PrepSharesToPrep(prepShares []PrepShare) (*PrepMessage, error) { - return m.p.PrepSharesToPrep(prepShares) -} - -func (m *MultiHotCountVec) PrepNext(state *PrepState, msg *PrepMessage) (*OutShare, error) { - return m.p.PrepNext(state, msg) -} - -func (m *MultiHotCountVec) AggregateInit() AggShare { return m.p.AggregateInit() } - -func (m *MultiHotCountVec) AggregateUpdate(aggShare *AggShare, outShare *OutShare) { - m.p.AggregateUpdate(aggShare, outShare) -} - -func (m *MultiHotCountVec) Unshard(aggShares []AggShare, numMeas uint) (aggregate *[]uint64, err error) { - return m.p.Unshard(aggShares, numMeas) -} - -type flpMultiHotCountVec struct { - flp.FLP[flp.GadgetParallelSumInnerMul, poly, Vec, Fp, *Fp] - bits uint - chunkLength uint - length uint - offset Fp -} - -func newFlpMultiCountHotVec(length, maxWeight, chunkLength uint) (*flpMultiHotCountVec, error) { - if length == 0 { - return nil, ErrLength - } - if maxWeight > length { - return nil, ErrMaxWeight - } - if chunkLength == 0 { - return nil, ErrChunkLength - } - - bits := uint(bits.Len64(uint64(maxWeight))) - offset := (uint64(1) << uint64(bits)) - 1 - uint64(maxWeight) - - b := new(big.Int).SetBytes(new(Fp).Order()) - b.Sub(b, big.NewInt(int64(offset))) - if b.Cmp(big.NewInt(int64(length))) <= 0 { - return nil, ErrFieldSize - } - - numGadgetCalls := (length + bits + chunkLength - 1) / chunkLength - - m := new(flpMultiHotCountVec) - m.bits = bits - m.length = length - m.chunkLength = chunkLength - err := m.offset.SetUint64(offset) - if err != nil { - return nil, err - } - - m.Valid.MeasurementLen = length + bits - m.Valid.JointRandLen = numGadgetCalls - m.Valid.OutputLen = length - m.Valid.EvalOutputLen = 2 - m.Gadget = flp.GadgetParallelSumInnerMul{Count: chunkLength} - m.NumGadgetCalls = numGadgetCalls - m.FLP.Eval = m.Eval - return m, nil -} - -func (m *flpMultiHotCountVec) Eval( - out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, - meas, jointRand Vec, numShares uint8, -) { - var invShares Fp - invShares.InvUint64(uint64(numShares)) - out[0] = flp.RangeCheck(g, numCalls, m.chunkLength, &invShares, meas, jointRand) - - measCur := cursor.New(meas) - countVec := measCur.Next(m.length) - var weight Fp - for i := range countVec { - weight.AddAssign(&countVec[i]) - } - - weightReported := measCur.Next(m.bits).JoinBits() - weightCheck := &out[1] - weightCheck.Mul(&m.offset, &invShares) - weightCheck.AddAssign(&weight) - weightCheck.SubAssign(&weightReported) -} - -func (m *flpMultiHotCountVec) Encode(measurement []bool) (out Vec, err error) { - n := m.length - if n != uint(len(measurement)) { - return nil, flp.ErrMeasurementLen - } - - out = arith.NewVec[Vec](m.Valid.MeasurementLen) - outCur := cursor.New(out) - first := outCur.Next(n) - weight := uint64(0) - for i := range measurement { - if measurement[i] { - first[i].SetOne() - weight++ - } - } - - offset, err := m.offset.GetUint64() - if err != nil { - return nil, err - } - - err = outCur.Next(m.bits).SplitBits(offset + weight) - if err != nil { - return nil, err - } - - return out, nil -} - -func (m *flpMultiHotCountVec) Truncate(meas Vec) Vec { - return meas[:m.length] -} - -func (m *flpMultiHotCountVec) Decode(output Vec, numMeas uint) (*[]uint64, error) { - if len(output) < int(m.Valid.OutputLen) { - return nil, flp.ErrOutputLen - } - - var err error - out := make([]uint64, len(output)) - for i := range output { - out[i], err = output[i].GetUint64() - if err != nil { - return nil, err - } - } - - return &out, nil -} - -var ( - ErrLength = errors.New("length cannot be zero") - ErrMaxWeight = errors.New("maxWeight cannot be greater than length") - ErrChunkLength = errors.New("chunkLength cannot be zero") - ErrFieldSize = errors.New("length and maxWeight are too large for the current field size") -) diff --git a/vdaf/prio3/mhcv/mhcv_test.go b/vdaf/prio3/mhcv/mhcv_test.go deleted file mode 100644 index 02bd9f8a..00000000 --- a/vdaf/prio3/mhcv/mhcv_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package mhcv - -import ( - "testing" - - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/flp_test" -) - -func TestMhcv(t *testing.T) { - t.Run("Query", func(t *testing.T) { - const MaxWeight = 2 - m, err := newFlpMultiCountHotVec(5, MaxWeight, 3) - test.CheckNoErr(t, err, "new flp failed") - flp_test.TestInvalidQuery(t, &m.FLP) - }) -} diff --git a/vdaf/prio3/prio3_test.go b/vdaf/prio3/prio3_test.go deleted file mode 100644 index 122296d6..00000000 --- a/vdaf/prio3/prio3_test.go +++ /dev/null @@ -1,231 +0,0 @@ -package prio3 - -import ( - "crypto/rand" - "io" - "slices" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/vdaf/prio3/count" - "github.com/quantumcoinproject/circl/vdaf/prio3/histogram" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/prio3" - "github.com/quantumcoinproject/circl/vdaf/prio3/mhcv" - "github.com/quantumcoinproject/circl/vdaf/prio3/sum" - "github.com/quantumcoinproject/circl/vdaf/prio3/sumvec" -) - -type Prio3[ - Measurement, Aggregate any, - AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, - PublicShare, VerifyKey any, -] interface { - Params() prio3.Params - Shard(Measurement, *Nonce, []byte) (PublicShare, []InputShare, error) - PrepInit( - *VerifyKey, *Nonce, uint8, PublicShare, InputShare, - ) (*PrepState, *PrepShare, error) - PrepSharesToPrep([]PrepShare) (*PrepMessage, error) - PrepNext(*PrepState, *PrepMessage) (*OutShare, error) - AggregateInit() AggShare - AggregateUpdate(*AggShare, *OutShare) - Unshard([]AggShare, uint) (*Aggregate, error) -} - -const NumShares = 2 - -var Context = []byte("TestingPrio3") - -func TestCount(t *testing.T) { - input := []bool{true, true, false} - want := uint64(2) // Hamming weight of binary inputs. - c, err := count.New(NumShares, Context) - test.CheckNoErr(t, err, "new count failed") - got := testPrio3(t, c, input) - test.CheckOk(got != nil, "prio3 count failed", t) - if *got != want { - test.ReportError(t, *got, want) - } -} - -func TestSum(t *testing.T) { - const MaxMeas = 4 - input := []uint64{1, 2, 3} - want := uint64(6) // Sum of each input. - s, err := sum.New(NumShares, MaxMeas, Context) - test.CheckNoErr(t, err, "new sum failed") - got := testPrio3(t, s, input) - test.CheckOk(got != nil, "prio3 sum failed", t) - if *got != want { - test.ReportError(t, *got, want) - } -} - -func TestSumVec(t *testing.T) { - input := [][]uint64{ - {1, 2, 3, 0}, - {1, 4, 6, 1}, - {1, 6, 9, 2}, - } - want := []uint64{3, 12, 18, 3} // Element-wise sum of input vectors. - s, err := sumvec.New(NumShares, 4, 4, 3, Context) - test.CheckNoErr(t, err, "new sumvec failed") - got := testPrio3(t, s, input) - test.CheckOk(got != nil, "prio3 sumvec failed", t) - if !slices.Equal(*got, want) { - test.ReportError(t, *got, want) - } -} - -func TestHistogram(t *testing.T) { - input := []uint64{2, 1, 1, 2, 0, 3, 3, 3, 3, 3} - want := []uint64{ - 1, // how many zeros - 2, // how many ones - 2, // how many twos - 5, // how many threes - } - h, err := histogram.New(NumShares, 4, 3, Context) - test.CheckNoErr(t, err, "new histogram failed") - got := testPrio3(t, h, input) - test.CheckOk(got != nil, "prio3 histogram failed", t) - if !slices.Equal(*got, want) { - test.ReportError(t, *got, want) - } -} - -func TestMultiHotCountVec(t *testing.T) { - const MaxWeight = 2 - input := [][]bool{ - {false, false, false, false, false}, // Hamming weight = 0 <= MaxWeight - {false, false, false, false, true}, // Hamming weight = 1 <= MaxWeight - {true, false, false, false, true}, // Hamming weight = 2 <= MaxWeight - } - // Element-wise count of binary vectors of weight at most MaxWeight. - want := []uint64{1, 0, 0, 0, 2} - m, err := mhcv.New(NumShares, 5, MaxWeight, 3, Context) - test.CheckNoErr(t, err, "new MultiHotCountVec failed") - got := testPrio3(t, m, input) - test.CheckOk(got != nil, "prio3 multiHotCountVec failed", t) - if !slices.Equal(*got, want) { - test.ReportError(t, *got, want) - } -} - -func testPrio3[ - P Prio3[ - Measurement, Aggregate, - AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, - PublicShare, VerifyKey, - ], - Measurement, Aggregate any, - AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, - PublicShare, VerifyKey any, -](t testing.TB, p P, measurements []Measurement) *Aggregate { - params := p.Params() - shares := params.Shares() - verifyKey := fromReader[VerifyKey](t, rand.Reader) - - aggShares := make([]AggShare, shares) - for i := range aggShares { - aggShares[i] = p.AggregateInit() - } - - for _, mi := range measurements { - nonce := fromReader[Nonce](t, rand.Reader) - randb := make([]byte, params.RandSize()) - _, err := io.ReadFull(rand.Reader, randb) - test.CheckNoErr(t, err, "read rand bytes failed") - - var pubShare PublicShare - var inputShares []InputShare - pubShare, inputShares, err = p.Shard(mi, &nonce, randb) - test.CheckNoErr(t, err, "Shard failed") - testMarshal(t, &pubShare, ¶ms) - for i := range inputShares { - testMarshal(t, &inputShares[i], ¶ms, uint(i)) - } - - var prepStates []*PrepState - var outboundPrepShares []PrepShare - for i := range shares { - state, share, errx := p.PrepInit( - &verifyKey, &nonce, i, pubShare, inputShares[i]) - test.CheckNoErr(t, errx, "PrepInit failed") - testMarshal(t, state, ¶ms) - testMarshal(t, share, ¶ms) - - prepStates = append(prepStates, state) - outboundPrepShares = append(outboundPrepShares, *share) - } - - var prepMsg *PrepMessage - prepMsg, err = p.PrepSharesToPrep(outboundPrepShares) - test.CheckNoErr(t, err, "PrepSharesToPrep failed") - testMarshal(t, prepMsg, ¶ms) - - var outShare *OutShare - for i := range shares { - outShare, err = p.PrepNext(prepStates[i], prepMsg) - test.CheckNoErr(t, err, "PrepNext failed") - testMarshal(t, outShare, ¶ms) - p.AggregateUpdate(&aggShares[i], outShare) - } - } - - testMarshal(t, &aggShares[0], ¶ms) - numMeas := uint(len(measurements)) - aggResult, err := p.Unshard(aggShares, numMeas) - test.CheckNoErr(t, err, "unshard failed") - - return aggResult -} - -func BenchmarkCount(b *testing.B) { - c, err := count.New(NumShares, Context) - test.CheckNoErr(b, err, "new Count failed") - benchmarkPrio3(b, c, []bool{true, true, false}) -} - -func BenchmarkSum(b *testing.B) { - s, err := sum.New(NumShares, 4, Context) - test.CheckNoErr(b, err, "new Sum failed") - benchmarkPrio3(b, s, []uint64{1, 2, 3}) -} - -func BenchmarkSumVec(b *testing.B) { - s, err := sumvec.New(NumShares, 2, 3, 2, Context) - test.CheckNoErr(b, err, "new SumVec failed") - benchmarkPrio3(b, s, [][]uint64{{1, 2}, {2, 0}}) -} - -func BenchmarkHistogram(b *testing.B) { - h, err := histogram.New(NumShares, 4, 2, Context) - test.CheckNoErr(b, err, "new Histogram failed") - benchmarkPrio3(b, h, []uint64{1, 2, 2, 0}) -} - -func BenchmarkMultiHotCountVec(b *testing.B) { - m, err := mhcv.New(NumShares, 3, 2, 3, Context) - test.CheckNoErr(b, err, "new MultiHotCountVec failed") - benchmarkPrio3(b, m, [][]bool{ - {false, false, true}, - {false, true, false}, - {false, false, true}, - }) -} - -func benchmarkPrio3[ - P Prio3[ - Measurement, Aggregate, - AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, - PublicShare, VerifyKey, - ], - Measurement, Aggregate any, - AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, - PublicShare, VerifyKey any, -](b *testing.B, p P, meas []Measurement) { - for i := 0; i < b.N; i++ { - _ = testPrio3(b, p, meas) - } -} diff --git a/vdaf/prio3/sum/sum.go b/vdaf/prio3/sum/sum.go deleted file mode 100644 index 1b49e89e..00000000 --- a/vdaf/prio3/sum/sum.go +++ /dev/null @@ -1,172 +0,0 @@ -// Package sum is a VDAF for aggregating integers in a pre-determined range. -package sum - -import ( - "math/bits" - - "github.com/quantumcoinproject/circl/vdaf/prio3/arith/fp64" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/cursor" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/flp" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/prio3" -) - -type ( - poly = fp64.Poly - Vec = fp64.Vec - Fp = fp64.Fp - AggShare = prio3.AggShare[Vec, Fp] - InputShare = prio3.InputShare[Vec, Fp] - Nonce = prio3.Nonce - OutShare = prio3.OutShare[Vec, Fp] - PrepMessage = prio3.PrepMessage - PrepShare = prio3.PrepShare[Vec, Fp] - PrepState = prio3.PrepState[Vec, Fp] - PublicShare = prio3.PublicShare - VerifyKey = prio3.VerifyKey -) - -// Sum is a verifiable distributed aggregation function in which each -// measurement is an integer in the range [0, maxMeasurement], where -// maxMeasurement defines the largest valid measurement, the aggregated result -// is the sum of all the measurements. -type Sum struct { - p prio3.Prio3[uint64, uint64, *flpSum, Vec, Fp, *Fp] -} - -func New(numShares uint8, maxMeasurement uint64, context []byte) (s *Sum, err error) { - const sumID = 2 - flp, err := newFlpSum(maxMeasurement) - if err != nil { - return nil, err - } - - s = new(Sum) - s.p, err = prio3.New(flp, sumID, numShares, context) - if err != nil { - return nil, err - } - - return s, nil -} - -func (s *Sum) Params() prio3.Params { return s.p.Params() } - -func (s *Sum) Shard(measurement uint64, nonce *Nonce, rand []byte, -) (PublicShare, []InputShare, error) { - return s.p.Shard(measurement, nonce, rand) -} - -func (s *Sum) PrepInit( - verifyKey *VerifyKey, - nonce *Nonce, - aggID uint8, - publicShare PublicShare, - inputShare InputShare, -) (*PrepState, *PrepShare, error) { - return s.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) -} - -func (s *Sum) PrepSharesToPrep(prepShares []PrepShare) (*PrepMessage, error) { - return s.p.PrepSharesToPrep(prepShares) -} - -func (s *Sum) PrepNext(state *PrepState, msg *PrepMessage) (*OutShare, error) { - return s.p.PrepNext(state, msg) -} - -func (s *Sum) AggregateInit() AggShare { return s.p.AggregateInit() } - -func (s *Sum) AggregateUpdate(aggShare *AggShare, outShare *OutShare) { - s.p.AggregateUpdate(aggShare, outShare) -} - -func (s *Sum) Unshard(aggShares []AggShare, numMeas uint) (aggregate *uint64, err error) { - return s.p.Unshard(aggShares, numMeas) -} - -type flpSum struct { - flp.FLP[flp.GadgetPolyEvalx2x, poly, Vec, Fp, *Fp] - bits uint - offset Fp -} - -func newFlpSum(maxMeasurement uint64) (*flpSum, error) { - bits := uint(bits.Len64(maxMeasurement)) - offset := (uint64(1) << uint64(bits)) - 1 - maxMeasurement - - s := new(flpSum) - s.bits = bits - err := s.offset.SetUint64(offset) - if err != nil { - return nil, err - } - - s.Valid.MeasurementLen = 2 * bits - s.Valid.JointRandLen = 0 - s.Valid.OutputLen = 1 - s.Valid.EvalOutputLen = 2*bits + 1 - s.Gadget = flp.GadgetPolyEvalx2x{} - s.NumGadgetCalls = 2 * bits - s.FLP.Eval = s.Eval - return s, nil -} - -func (s *flpSum) Eval( - out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, - meas, jointRand Vec, numShares uint8, -) { - var input [1]Fp - for i := range meas { - input[0] = meas[i] - g.Eval(&out[i], input[:]) - } - - measCur := cursor.New(meas) - a := measCur.Next(s.bits).JoinBits() - b := measCur.Next(s.bits).JoinBits() - - var invShares Fp - invShares.InvUint64(uint64(numShares)) - rangeCheck := &out[len(meas)] - rangeCheck.Mul(&s.offset, &invShares) - rangeCheck.AddAssign(&a) - rangeCheck.SubAssign(&b) -} - -func (s *flpSum) Encode(measurement uint64) (Vec, error) { - offset, err := s.offset.GetUint64() - if err != nil { - return nil, err - } - - out := make(Vec, s.Valid.MeasurementLen) - outCur := cursor.New(out) - err = outCur.Next(s.bits).SplitBits(measurement) - if err != nil { - return nil, err - } - - err = outCur.Next(s.bits).SplitBits(measurement + offset) - if err != nil { - return nil, err - } - - return out, nil -} - -func (s *flpSum) Truncate(meas Vec) Vec { - return Vec{meas[:s.bits].JoinBits()} -} - -func (s *flpSum) Decode(output Vec, numMeas uint) (*uint64, error) { - if len(output) < int(s.Valid.OutputLen) { - return nil, flp.ErrOutputLen - } - - n, err := output[0].GetUint64() - if err != nil { - return nil, err - } - - return &n, nil -} diff --git a/vdaf/prio3/sum/sum_test.go b/vdaf/prio3/sum/sum_test.go deleted file mode 100644 index 33f31d74..00000000 --- a/vdaf/prio3/sum/sum_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package sum - -import ( - "testing" - - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/flp_test" -) - -func TestSum(t *testing.T) { - t.Run("Query", func(t *testing.T) { - const MaxMeas = 4 - s, err := newFlpSum(MaxMeas) - test.CheckNoErr(t, err, "new flp failed") - flp_test.TestInvalidQuery(t, &s.FLP) - }) -} diff --git a/vdaf/prio3/sumvec/sumvec.go b/vdaf/prio3/sumvec/sumvec.go deleted file mode 100644 index bcc17518..00000000 --- a/vdaf/prio3/sumvec/sumvec.go +++ /dev/null @@ -1,168 +0,0 @@ -// Package sumvec is a VDAF for aggregating vectors of integers in a pre-determined range. -package sumvec - -import ( - "errors" - - "github.com/quantumcoinproject/circl/vdaf/prio3/arith" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith/fp128" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/cursor" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/flp" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/prio3" -) - -type ( - poly = fp128.Poly - Vec = fp128.Vec - Fp = fp128.Fp - AggShare = prio3.AggShare[Vec, Fp] - InputShare = prio3.InputShare[Vec, Fp] - Nonce = prio3.Nonce - OutShare = prio3.OutShare[Vec, Fp] - PrepMessage = prio3.PrepMessage - PrepShare = prio3.PrepShare[Vec, Fp] - PrepState = prio3.PrepState[Vec, Fp] - PublicShare = prio3.PublicShare - VerifyKey = prio3.VerifyKey -) - -// SumVec is a verifiable distributed aggregation function in which each -// measurement is a fixed-length vector of integers in the range [0, 2^bits). -// the aggregated result is the sum of all the vectors. -type SumVec struct { - p prio3.Prio3[[]uint64, []uint64, *flpSumVec, Vec, Fp, *Fp] -} - -func New(numShares uint8, length, bits, chunkLength uint, context []byte) (s *SumVec, err error) { - const sumVecID = 3 - flp, err := newFlpSumVec(length, bits, chunkLength) - if err != nil { - return nil, err - } - - s = new(SumVec) - s.p, err = prio3.New(flp, sumVecID, numShares, context) - if err != nil { - return nil, err - } - - return s, nil -} - -func (s *SumVec) Params() prio3.Params { return s.p.Params() } - -func (s *SumVec) Shard(measurement []uint64, nonce *Nonce, rand []byte, -) (PublicShare, []InputShare, error) { - return s.p.Shard(measurement, nonce, rand) -} - -func (s *SumVec) PrepInit( - verifyKey *VerifyKey, - nonce *Nonce, - aggID uint8, - publicShare PublicShare, - inputShare InputShare, -) (*PrepState, *PrepShare, error) { - return s.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) -} - -func (s *SumVec) PrepSharesToPrep(prepShares []PrepShare) (*PrepMessage, error) { - return s.p.PrepSharesToPrep(prepShares) -} - -func (s *SumVec) PrepNext(state *PrepState, msg *PrepMessage) (*OutShare, error) { - return s.p.PrepNext(state, msg) -} - -func (s *SumVec) AggregateInit() AggShare { return s.p.AggregateInit() } - -func (s *SumVec) AggregateUpdate(aggShare *AggShare, outShare *OutShare) { - s.p.AggregateUpdate(aggShare, outShare) -} - -func (s *SumVec) Unshard(aggShares []AggShare, numMeas uint) (aggregate *[]uint64, err error) { - return s.p.Unshard(aggShares, numMeas) -} - -type flpSumVec struct { - flp.FLP[flp.GadgetParallelSumInnerMul, poly, Vec, Fp, *Fp] - length uint - bits uint - chunkLen uint -} - -func newFlpSumVec(length, bits, chunkLen uint) (*flpSumVec, error) { - if bits > 64 { - return nil, ErrBits - } - - numGadgetCalls := (length*bits + chunkLen - 1) / chunkLen - - s := new(flpSumVec) - s.length = length - s.bits = bits - s.chunkLen = chunkLen - s.Valid.MeasurementLen = length * bits - s.Valid.JointRandLen = numGadgetCalls - s.Valid.OutputLen = length - s.Valid.EvalOutputLen = 1 - s.Gadget = flp.GadgetParallelSumInnerMul{Count: chunkLen} - s.NumGadgetCalls = numGadgetCalls - s.FLP.Eval = s.Eval - return s, nil -} - -func (s *flpSumVec) Eval( - out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, - meas, jointRand Vec, numShares uint8, -) { - var invShares Fp - invShares.InvUint64(uint64(numShares)) - out[0] = flp.RangeCheck(g, numCalls, s.chunkLen, &invShares, meas, jointRand) -} - -func (s *flpSumVec) Encode(measurement []uint64) (out Vec, err error) { - if len(measurement) != int(s.length) { - return nil, flp.ErrMeasurementLen - } - - out = make(Vec, s.Valid.MeasurementLen) - outCur := cursor.New(out) - for i := range measurement { - err = outCur.Next(s.bits).SplitBits(measurement[i]) - if err != nil { - return nil, err - } - } - - return -} - -func (s *flpSumVec) Truncate(meas Vec) (out Vec) { - out = arith.NewVec[Vec](s.length) - measCur := cursor.New(meas) - for i := range out { - out[i] = measCur.Next(s.bits).JoinBits() - } - - return -} - -func (s *flpSumVec) Decode(output Vec, numMeas uint) (*[]uint64, error) { - if len(output) < int(s.Valid.OutputLen) { - return nil, flp.ErrOutputLen - } - - var err error - out := make([]uint64, len(output)) - for i := range output { - out[i], err = output[i].GetUint64() - if err != nil { - return nil, err - } - } - - return &out, nil -} - -var ErrBits = errors.New("bits larger than 64 is not supported") diff --git a/vdaf/prio3/sumvec/sumvec_test.go b/vdaf/prio3/sumvec/sumvec_test.go deleted file mode 100644 index c9e8674e..00000000 --- a/vdaf/prio3/sumvec/sumvec_test.go +++ /dev/null @@ -1,16 +0,0 @@ -package sumvec - -import ( - "testing" - - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/flp_test" -) - -func TestSumVec(t *testing.T) { - t.Run("Query", func(t *testing.T) { - s, err := newFlpSumVec(4, 4, 3) - test.CheckNoErr(t, err, "new flp failed") - flp_test.TestInvalidQuery(t, &s.FLP) - }) -} diff --git a/vdaf/prio3/testdata/Prio3Count_0.json b/vdaf/prio3/testdata/Prio3Count_0.json deleted file mode 100644 index 81249048..00000000 --- a/vdaf/prio3/testdata/Prio3Count_0.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "agg_param": "", - "agg_result": 1, - "agg_shares": [ - "e369056891a9fd95", - "1f96fa976d56026a" - ], - "ctx": "736f6d65206170706c69636174696f6e", - "prep": [ - { - "input_shares": [ - "e369056891a9fd95d44e6fadb3b75e6774b666d312bcc59b57694d189321ffe06f46b37d26db61d056b17152e3726a2e", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 1, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e369056891a9fd95" - ], - [ - "1f96fa976d56026a" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "5c6a0685bd0f0aa9b19b8c1c4431ec49eca02338e5e05da8fc91575311627200", - "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - } - ], - "shares": 2, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3Count_1.json b/vdaf/prio3/testdata/Prio3Count_1.json deleted file mode 100644 index 18f53370..00000000 --- a/vdaf/prio3/testdata/Prio3Count_1.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "agg_param": "", - "agg_result": 1, - "agg_shares": [ - "afccf0c22c8901be", - "1f96fa976d56026a", - "359d14a56320fcd7" - ], - "ctx": "736f6d65206170706c69636174696f6e", - "prep": [ - { - "input_shares": [ - "afccf0c22c8901be040bc9d44987fd40085bf595185a34267ec8e975e8fdfa331abaaecc9d7104785e186102448192ad", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", - "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 1, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "afccf0c22c8901be" - ], - [ - "1f96fa976d56026a" - ], - [ - "359d14a56320fcd7" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "145aabe8608487ab66ff1e11a196662b0d268a8dbd2b01481daf7d190bf1b0b6", - "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad", - "49105b9c5b8b82fd30916e72506a0c5679b07c05a3255a85103f30cfd5ab310e" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f" - } - ], - "shares": 3, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3Count_2.json b/vdaf/prio3/testdata/Prio3Count_2.json deleted file mode 100644 index ced47bc6..00000000 --- a/vdaf/prio3/testdata/Prio3Count_2.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "agg_param": "", - "agg_result": 3, - "agg_shares": [ - "6b111b08d94ff4ed", - "99eee4f725b00b12" - ], - "ctx": "736f6d65206170706c69636174696f6e", - "prep": [ - { - "input_shares": [ - "e269056891a9fd95d44e6fadb3b75e6774b666d312bcc59b04b52413d9e5e26d6f46b3fd26db6150a8659ad79dae8621", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 0, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e269056891a9fd95" - ], - [ - "1f96fa976d56026a" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "5c6a0685bd0f0aa98bb9c0942022d854c6be57b0c1d149b3d5a14867e2750b29", - "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - }, - { - "input_shares": [ - "e369056891a9fd95d44e6fadb3b75e6774b666d312bcc59b57694d189321ffe06f46b37d26db61d056b17152e3726a2e", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 1, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e369056891a9fd95" - ], - [ - "1f96fa976d56026a" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "5c6a0685bd0f0aa9b19b8c1c4431ec49eca02338e5e05da8fc91575311627200", - "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - }, - { - "input_shares": [ - "e369056891a9fd95d44e6fadb3b75e6774b666d312bcc59b57694d189321ffe06f46b37d26db61d056b17152e3726a2e", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 1, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e369056891a9fd95" - ], - [ - "1f96fa976d56026a" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "5c6a0685bd0f0aa9b19b8c1c4431ec49eca02338e5e05da8fc91575311627200", - "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - }, - { - "input_shares": [ - "e269056891a9fd95d44e6fadb3b75e6774b666d312bcc59b04b52413d9e5e26d6f46b3fd26db6150a8659ad79dae8621", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 0, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e269056891a9fd95" - ], - [ - "1f96fa976d56026a" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "5c6a0685bd0f0aa98bb9c0942022d854c6be57b0c1d149b3d5a14867e2750b29", - "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - }, - { - "input_shares": [ - "e369056891a9fd95d44e6fadb3b75e6774b666d312bcc59b57694d189321ffe06f46b37d26db61d056b17152e3726a2e", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 1, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e369056891a9fd95" - ], - [ - "1f96fa976d56026a" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "5c6a0685bd0f0aa9b19b8c1c4431ec49eca02338e5e05da8fc91575311627200", - "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - } - ], - "shares": 2, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3Histogram_0.json b/vdaf/prio3/testdata/Prio3Histogram_0.json deleted file mode 100644 index 64a2cb78..00000000 --- a/vdaf/prio3/testdata/Prio3Histogram_0.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "agg_param": "", - "agg_result": [ - 0, - 0, - 1, - 0 - ], - "agg_shares": [ - "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0d8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad1", - "1adf0d29da11c354159e2a7c373bfab17f17b78fda89bcb7e1fd9b86d4c2eff0f5738909a350fb11d5ddc8c41f29e53a0791d0d799f874ce2afac81dbbe9052e" - ], - "chunk_length": 2, - "ctx": "736f6d65206170706c69636174696f6e", - "length": 4, - "prep": [ - { - "input_shares": [ - "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0d8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad1d878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e6a4d6942338c87ab5336de984fca87d6315bd0cd55be021a5e8c95cb2f58d403209e06a16b0e535a34828e56812b7a3f995ffd32815553c38fc0ce8a7963e9758fc2a45b02b69ec05eb19de856357e3a3fd3063b2501f1c7e5791e3350f60a5e870c1d8d239707d61f61f6f3f8413185404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 2, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e720f2d625ee3cabce61d583c8c4054e", - "82e8487025764348020264792b3d100f", - "0d8c76f65caf04ee0e22373be0d61ac5", - "fa6e2f2866078b31b90537e24416fad1" - ], - [ - "1adf0d29da11c354159e2a7c373bfab1", - "7f17b78fda89bcb7e1fd9b86d4c2eff0", - "f5738909a350fb11d5ddc8c41f29e53a", - "0791d0d799f874ce2afac81dbbe9052e" - ] - ], - "prep_messages": [ - "915cca74703d352a8e12e7441aa3896efbd633bf8eacd9a101ab922f6481404b" - ], - "prep_shares": [ - [ - "d94d1f36d8d2f9867208928069335f0957497c6df0fe6568d4304b27f51456acf8093e765dfe404541c27935c03bf8677569234022700212e1112ad5b4a474126b01b5b1be78d897a9e616bcb21c5644fad4b87f09bc65f0c46ec41e29b19ffd064ddc2301a2ff2176338dd52a09fdadd442cddcbe5d10dafe0d92551d81eac7", - "28b2e0c9272d067971f76d7f96cca0f6bef7d43878716b3fcee1d230515956acdd7ced66a61a897483b4b233e4fe32b48babf43d070fc14b1c7fc4e1a386fd223f58eec1544973c9f39e871c48543e979da23642e48ae655de8c7e6b008ab43bc27dda399f3c8341c7476370573e51b6ebe601061807bb886fc55c2161ce436e" - ] - ], - "public_share": "064ddc2301a2ff2176338dd52a09fdadd442cddcbe5d10dafe0d92551d81eac7c27dda399f3c8341c7476370573e51b6ebe601061807bb886fc55c2161ce436e", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - } - ], - "shares": 2, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3Histogram_1.json b/vdaf/prio3/testdata/Prio3Histogram_1.json deleted file mode 100644 index 8568c4f8..00000000 --- a/vdaf/prio3/testdata/Prio3Histogram_1.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "agg_param": "", - "agg_result": [ - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ], - "agg_shares": [ - "7c81185c4933c0c53be9489a06fe6f271c677e2d2f3469491cd4a5df164da7898ab986810546eb5f44d266bab7912eec02afbee3faa2fc691c60e08cb5b4fc441550907d4b1c16f374bda4acec4f4285934b3867956e39a671054936d1d35a7f4e834925c9aab4102a4d4869bdd3adf4c87230df479eadc9d8fd5113f230d1535754c64ae50e7acf66d0d49d6668f99d862a872d07d7c5e5bba254be6eaa867af95b6a6fe60b4cc1011e0fc2acd1c239", - "1adf0d29da11c354159e2a7c373bfab17f17b78fda89bcb7e1fd9b86d4c2eff0f5738909a350fb11d5ddc8c41f29e53a0791d0d799f874ce2afac81dbbe9052ed75bb48b448e3dab58ea08704f275cf79253d1b055657dfd4862c648d1385a5b7b61459c9aeb8d5c9565370551c67bdea48ce598f7e3c93be4d48ecf19ee20a146a80033c3bbc8feb23771e908b528c13b5d8363939cd7df29d312b4ff9e453e7e3bce6b34722b6d70a389c1ab4724ef", - "6b9fd97adcba7ce592788ce9c1c695266781ca42f641dafec92dbe9914f0688584d2ef745769198eae4fd0802845ecd8f8bf70446b648ec79ca556558f61fd8c1654bbf66f55ac61fa5752e3c3886183dc60f6e7142c495c2998f0805df34a25391b713e9c69bd92084d8091f165d62c9500ea87c07d88fa262d1f1df4e00d0b650339825735bd31aef7b97890e2dda04078f56e658c623afe89988d91b633478b68c724e58188d1553e677ca7e618d7" - ], - "chunk_length": 3, - "ctx": "736f6d65206170706c69636174696f6e", - "length": 11, - "prep": [ - { - "input_shares": [ - "7c81185c4933c0c53be9489a06fe6f271c677e2d2f3469491cd4a5df164da7898ab986810546eb5f44d266bab7912eec02afbee3faa2fc691c60e08cb5b4fc441550907d4b1c16f374bda4acec4f4285934b3867956e39a671054936d1d35a7f4e834925c9aab4102a4d4869bdd3adf4c87230df479eadc9d8fd5113f230d1535754c64ae50e7acf66d0d49d6668f99d862a872d07d7c5e5bba254be6eaa867af95b6a6fe60b4cc1011e0fc2acd1c239bbc08eaa2f65a321aab41077ee2ee67cf916f12d74bd3e0db0b7f053c6000e42e127a7a9d766608fcfefe7741ad8098f7e4180cc5a7af54b4e1a2f6385bc3205c60cd615037620637b96a87b6277db02df81cfa9389ae42515dc02f26bd54d4f6d22ce1c37ba89287248bdde8c71cba5e08cf30d48fab7a600fb27d441ec60788419a3c2fe4f162404a45cbc6a759d71bb3537e109dd50d2810cd3bee8e3ed828646009b0d11310b6dbf5d768d4da864950b09ec34d39e9bde8d9a4496031a33a6452188885035ee869560aee14cd02c484588f5399d364dacfc2e63dbfa2844418722107a38f8af774f4b334ddafd699d3ff3aeb1653f19c0cba384337b114a290ea69463793a5f9986c22bea8ef77b51358adb52e8a61c9f8046504a6156ff82fe86b3868cb262b8db8fdfc07444132c7c42f3dce18d99f6b221319e54a908e7d458925900d23c120489a930b802aa808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", - "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - ], - "measurement": 2, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "7c81185c4933c0c53be9489a06fe6f27", - "1c677e2d2f3469491cd4a5df164da789", - "8ab986810546eb5f44d266bab7912eec", - "02afbee3faa2fc691c60e08cb5b4fc44", - "1550907d4b1c16f374bda4acec4f4285", - "934b3867956e39a671054936d1d35a7f", - "4e834925c9aab4102a4d4869bdd3adf4", - "c87230df479eadc9d8fd5113f230d153", - "5754c64ae50e7acf66d0d49d6668f99d", - "862a872d07d7c5e5bba254be6eaa867a", - "f95b6a6fe60b4cc1011e0fc2acd1c239" - ], - [ - "1adf0d29da11c354159e2a7c373bfab1", - "7f17b78fda89bcb7e1fd9b86d4c2eff0", - "f5738909a350fb11d5ddc8c41f29e53a", - "0791d0d799f874ce2afac81dbbe9052e", - "d75bb48b448e3dab58ea08704f275cf7", - "9253d1b055657dfd4862c648d1385a5b", - "7b61459c9aeb8d5c9565370551c67bde", - "a48ce598f7e3c93be4d48ecf19ee20a1", - "46a80033c3bbc8feb23771e908b528c1", - "3b5d8363939cd7df29d312b4ff9e453e", - "7e3bce6b34722b6d70a389c1ab4724ef" - ], - [ - "6b9fd97adcba7ce592788ce9c1c69526", - "6781ca42f641dafec92dbe9914f06885", - "84d2ef745769198eae4fd0802845ecd8", - "f8bf70446b648ec79ca556558f61fd8c", - "1654bbf66f55ac61fa5752e3c3886183", - "dc60f6e7142c495c2998f0805df34a25", - "391b713e9c69bd92084d8091f165d62c", - "9500ea87c07d88fa262d1f1df4e00d0b", - "650339825735bd31aef7b97890e2dda0", - "4078f56e658c623afe89988d91b63347", - "8b68c724e58188d1553e677ca7e618d7" - ] - ], - "prep_messages": [ - "8794e3c89b479fd38914037c778563366e9c90f61a47f52e02e51003048af9e1" - ], - "prep_shares": [ - [ - "9c992f824ce7e69496d40dfa1da358109a3472a03ed58dc33d5426b0115bc7834b72373b9e78170ed075be80bd7842796b25594ce5825c4166bffa9165a98e40a56d6d17e0ca74af36cb5dbdb3a2f3c7d246b8f5bd78acc9f6c26ffde64d4817cdd9b28b742924c79516ca016098492df7580a49dd091f4f6e81fcf9d9fc148365b3e30205531b610d546de28a6b7c7cc058087324206afad931cea724e2285c", - "5db683a2145d865bdcf7b710ffb7e5ebb0bd9384c53299aae2cfe91888654d713fb6f1f7c85c5cfeaad11f1231a6ad8af800be32effc0abc03e33cd8160323e080e98fdc84db0024002bf3aec21c8a9ba3d69a20bbf18d9ff7234d6b03e993f5ef0c2dad87518e4f16634da8f1d947a518540775525c97a3d8d4323fa0f488b782c591e1ce996072e1f096b5991133f1d6ab883b98ec6a028b1de85eefed6989", - "08b04cdb9ebb920f71333af5e2a4c1037e6f5e776923d04de57b5c3ae70c15ad22f5380db9898c43134eb63198f64d67b47df6087bf19d0f85c2f729bb3235bc92bf9dc3a0f5ded0191ae397b5a2553a7ce4a518a7928893a51dc7dbfbdcb3b0d59aaa9ee4849b9d94faab5b691dc86fca19867ae82f97927ff5eece600cd002ed585479d34bf381eb8c5a1655338d24d04951ef27510d46ac2d45d22b5fc6c2" - ] - ], - "public_share": "65b3e30205531b610d546de28a6b7c7cc058087324206afad931cea724e2285c82c591e1ce996072e1f096b5991133f1d6ab883b98ec6a028b1de85eefed6989ed585479d34bf381eb8c5a1655338d24d04951ef27510d46ac2d45d22b5fc6c2", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf" - } - ], - "shares": 3, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3Histogram_2.json b/vdaf/prio3/testdata/Prio3Histogram_2.json deleted file mode 100644 index b6317d20..00000000 --- a/vdaf/prio3/testdata/Prio3Histogram_2.json +++ /dev/null @@ -1,2366 +0,0 @@ -{ - "agg_param": "", - "agg_result": [ - 3, - 1, - 2, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 2 - ], - "agg_shares": [ - "064975657a4d61b066d25526d5af390c1515d962769da2d21614e8bdb263a2967378a1a0a1d92e4c59552750c2640cb3bc55da91fd496eef1b3a26d6b0dec433a469f48a5271984f71d7a69fe576665650bcd217a70a1a19b6284028d3c7796e3b314ae5f5cb74622e07d6cbd5402a4f9f81080754181daa51ae6be4fdb2b6b44c6df90160aa280c22d293e1a6ed6874b55bde1c3ee2934109c043f702ca47911eadf1c9f3894dbc839c9f704a3395a8c36292db0c8bd9bb77fb172f8c6d68db9635d15f16feb6478098f9fd89b0fb1ebb6b41d0f9a423dab914dc455051d7dafe151be7921237bf8541a34c3a64155a554d489370cf8bfe2b0894480382360b05c1d0f02dbbd7bab9ad9d39936a1bca5db320fc9e9f153ac9d4c2de65e6fdb78d75cbc8c97893ca0a55f98b9abf8127f3b827e86baee8d73c1b60e996e036e599d249a0efd766bf834c0f7412f82a7f6fa95139bf136762ad219910d9df127f5018711487c9811297abc354a76a4f2cf428e90176b5024aca6d22f86cb05c5eac715e398d7d374fb1999ea7fb64f1533289ebec40337ef35a1ba1f078ad45500fd52df11fb888952211d3e81839c6a2ac6879588d0c48f5bed22a3b2eed0d8132c1e8206e933058419ed596a1275a235127ac04561d7f14ab9ed9db40aedd0eb9c1ec994cf1a66dcc05437d34cfb8ff0c129ae4e04d4321aeea613d1ff68f8eb809fce39f697b9cf5b309e4a034340f9b6993ef83604714ef257f21341a1511bb2a25f805136e4425355c23f636f7f54f3ccfbf357c633c687e6a5008c7a26a76c4f6cd640526cb87b17fdf186a0f9d71f377ea0738c820235ac540ea2949ca4d738dcd651e9950fb5ceb32a18ff4c9601c28c91d962df915616aa64dcc80c440fe3fafaf3778ed85e25d2101f6f7cf84f82d65aaaa7b1df384aced53d386724be89e0071795c946b84fe8dcfab2e32f7e36cfcb24912f24b016c8c303228bc01281d4577765ddea7c8666678d9f3d7d04a64c4760b885d7e64314fb1fef8c496b63c3a6547ff64d6509b947c9386ae366c589f8e2ed9f25729aff3cb58cc496598e496c7e2a39d4be2462231b0f86b29eb9263ef4f9ed695037d4a2ceed4a574956a49a66164cafc553cebecad474dbea137470478b630e4c948925fdd903934afbe75bd0cd58906d3a727dcb7ad0f88825883607796c8310ca1a5dc74d154996841060dd54e1c24c0e9e98ef14fc588a1f44ab55d4fb4de70e7936aff49387a27549c626dba13810ae616b366549473b0d51ab89065e62a37b69993b3f03391ce7bbf9e4cd1ccb3c744b8fa9bfea3193223753acd06579d9a27b9671b05421780b1a6e20a57142389e5757419d95b02b52c713e9e0fbe6171e5c65fcbf99459eff9f5d5f318e5a15dfae05faafd027480062ad28e27b5f89641c0de4f4613d541a6d3ae51ee51c3d410445d7b3a1bd303c04177b90b03f519badadb73803e13aa052fa03680d63f17d94337809d96e8938f09fb9495c7ba02ae5fd5e38f1472d30acfe65e804c3478b2884987c765c47969d45647adc5331f9dcc61b8f5c8bc5f923efcd4702b4ed12acaec677bf908c88eac20437e8da1b31eff280fe601fbecf7e59d156b165e4b3d29a5b8e85ccc4f0b16f7cc351ae5e5ab06ceec96231eb3b0fb99a1f73ab7c9e7b985c59635e4b86f39c0c1d9a715529c9f3158c02bb7e80401104a8bd31230be6c7b8ae744cd383e1df09d6be5ad1c3341d780ae09a575a717e96bf805ae53ab6b56aa0616c684982929e00e7a4fcf66ca43654372ad8e670214fb6e25a94e4326ff67c8d0b0e74d7a9e1effb2823a467e9a0aa7d2304f0276136e8ac9de327688a4a9237e235630ae0d0fe4b6a109c3a52c959c6687ebf9d70228ab0af8f727915971575bcc020e6b8b4c68273ee5d609694bbe65e61cf5bc4534d31b0f9f9e0ac2e2a4c9d5222319dde59b95ff9c8fc945ba4d0c055cc3482e015436992410641ac093d912e604cff721700646eef5bbf483cdd57034a6099fc2cc7fe97f54193f3818b9bb263e69fcbe224410998cb927e067ab8713353863ec188118e97dd8ccd008aceb13f68e6ee98400da21966bd831b15078b5c773aada17512b2265c5d1ea6078e5b541184c080a211dd135d59d0da5a578a924aa096759f0c942a67038ec6d2cd085f4b8d2c87aae5e3b6493c4b2016b6e08c31f8c5f277953576532f845fcebb88047be2633475989413bb5d280e88a", - "feb68a9a85b29e4f7d2daad92a50c6f3edea269d89625d2dcdeb17424d9c5d6990875e5f5e26d1b38aaad8af3d9bf34c45aa256e02b69110c8c5d9294f213bcc5d960b75ad8e67b0722859601a8999a9b1432de858f5e5e62dd7bfd72c388691c6ceb51a0a348b9db5f829342abfd5b0627ef7f8abe7e2559251941b024d494bb59206fe9f55d7f3c12d6c1e5912978b4ca421e3c11d6cbeda3fbc08fd35b86ee3520e360c76b2436063608fb5cc6a573e9d6d24f37426446c04e8d0739297246bca2ea0e90149b863670602764f04e14694be2f065bdc252aeb23baafae282503eae4186dedc8405ebe5cb3c59beaa5acb2b76c8f307401b8f76bb7fc7dc9f4fc3e2f0fd24428452a5262c66c95e435a54cdf036160eac51a2b3d219a190248748a343736876c35d9aa067465407ed80e47d81794511728a7e49f16691fc91a682db65f1028994060b3f08bed07d5809256aec640ec989d36de66ef2620ed80b1e78eeb78367eed4c543cab5895b0d30dd716fe894afdb51992dd07934fa3a1558ea1c67282c8b032666158049b0eaccf761413bfcc810c89e45e0f8752baaff22ad20ee047776ac1ee2c17e7c6395d559786a772f3b70a252dd5c4d112f27ecf3e17df916ccfa7a2612a695ed8a5dcb0d853fba9e280eb38612624bf5122f1483e1366b30e599217fabc82cb304700f5ed651b1fb2bcde35159ec2e009707149f6031c60968463ee4bf61b5fcbcbf066966c107c9fb8ebf4d980decbe5eaee46d5da07faec91bbbecaa3dc09c9080ab2c33040ca839cc37b8195aff7385d958b3b09329bfad9345c4e8020e795f062900c8815f8c737dfc0a53abf15d6b635b48c72329ae166afe8a214cd5e700b36a1e3d736e269d206ce9e9559b2337f3bc101c05050c887125e1da2defe0908307d07d29a555584e2f07a5312ac2c798db71761ff8e86a36b787b01723054d1cd0a1c93034db6ed0d98fe9373cfcdd74300d8e2ba8889a2213c37999987260c2831b59b3b89f477a2659bceb04e01073b6b49c3c59ab8009b0daf646b836c7951cb93a76071d1260d8cd6500c34a733b69c671b69381d5c62981db9ddce4f0794d8146d9c10b061294efc82b5d3112b5a8d6a95b6599e9b35e7a9c3141352b8b2435ec8b8fb8749cfff35b76da0226fc6cd50418a42f32a76dd2c58d8234852f0797da77c9f886937b2f35e5a238b2eab6897bef9f22ab1e3bf3f1616710eb03a795e0bb54aa2b04b058f186c9500b6c787d8ab639d9245ec62f519e94c99ab6b8e4f2ae5476f9a19b9c849666c4c0fcc7031844061b32e333038bb470564015ce8cddc8ac532f9a84665d84698e4fabdea7f4e591df5a8ebc0761a8a8be626a4ff4ad38ec161f041828e1a39a034066ba810060a2a0ce71a42a2051fa05502fd8d7ff9d52d71d84aeb68be3f21b0b9ec2cbe592c51ae11ae202befbba284c5e42efc3fbe8846f4fceee54525248c7fc1ee55fad05fc97f29a4e826bcc87f6269196c70f6046b6a3829fd51a02a1c70eb8f2cf53019a17fb3af874d77b678389a3d86962ba9b8523ab0e062339e470a3745a06dc1032b8fd4952ed53513988406f9377153dfbc8172424ce100d7f019fe0613081a62ea94e985b4c2d65a4717a335b0f4e90833cae5fe1954f9311369dce34c4f04665e08c52c3618467a3a69ca1d4790c63f3e2658cead6360cea73fd44a17fbfeefb5742cd1cf4193847518bb34c7c1e20f62941a36e3ccbe287f51f65c8a58e8169407fa35ac5494a955f9e93b7b67d6d61ff18594309935bc9abc8d547198fdeb0491da3ab1bcd90098372f5118b28561e1004d61c5b98165f5582dd1b0fd89ec91753605cd89775b56dc81dea9cf51f2f01b4942f63c5ad36a63997a140628fdd754f5eb07d86ea68ea8a435fdf19474b397d8a51a29f696b4419a1be30a43bacb2ce4d46061f53d1d5b362cdddce6221a646ae4627036ba45b2f3fca33cb7d1feabc94adbef9be53f6c26ef19fb3008de8ff99d110a440b7c322a91cb59f6603d3380fa7fabe6c0c7e74646d9c1960341ddbbd3667346d81f98547aeccac79c13e77ecb168227332ff75316ec097191167bff09de699427ce4eaf894a388c5525e8aeb8dd9a3a2e159f871c4abee7b3f7f5dec62eca2a62f25a5a8956db55f698a60f1abd598fc71392d3317a0b472d37855185c49b6c3b4dfe9493f73ce073a0d88690a89acd07ba03144b7fb841d9ccb8a65abec44a2d7f1775" - ], - "chunk_length": 10, - "ctx": "736f6d65206170706c69636174696f6e", - "length": 100, - "prep": [ - { - "input_shares": [ - "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0d8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001a9f4d10c3a0130028e99c355bc4da57b4fa22195bda8151b0ae8901ceb458c28964b2d2d19d109d8c1c2a03dd251e4a2c48312ae66e609e3a8f4cc40d84d7f928a3f0ace6fc07e05ab17c01b9fa7906249d3c0d59e05cd71d020c7263100c4d3ece5cd1d7deb7255413ce7a2e20eb514ef6ee6a3af1bd50aece20562b0a1bf5f9f6d0801166978bbd9d6d17b9925cf7bf53a7385370f960daad1dafd4931eaa5b43ff628a3ae52b4e38067b0d1317954381a9fd9cd1581296425be048e507f51bc1febf332f32d8d3d0d77802b9de5e77963081199c99952dc46ca4e7f92c3986f64902d7dfd243dd388dfc44c95ce461d23684d519da66012bc1d0ce4e3c0072437ea43ce2ff34c688206fc5918c90b236c74664ca28fd0e50daefb7e025a934ab88e6dca644649fb870305df8ab2311461368f2fd837c9d8deedaa811e511ea2f417a2841e3c1796f5c3db316abd070bf049b98e27d023ee0351bc747622556e706968efac792a7792d37cc89ad154e464cd7a6e1fbe278b14d5509a5ed0046e6f1af095a53d238f0427efa87b64ad5ca7a0cc7f649f7be83731b85608946ef03ac01588a2af6533647e24c07b8d8654aeecffb6a2ba11603e101cc708ee80ecb4695457826ae70ce830a5622d3551d7e37eabac8ec2e735dbee213a5b26050e1bdc52d21f7be9578668d3044484180404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 2, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e720f2d625ee3cabce61d583c8c4054e", - "82e8487025764348020264792b3d100f", - "0d8c76f65caf04ee0e22373be0d61ac5", - "fa6e2f2866078b31b90537e24416fad1", - "2aa44b74bb71c2548b15f78fb0d8a308", - "6fac2e4faa9a82029b9d39b72ec7a5a4", - "869eba63651472a34e9ac8faae398421", - "5d731a67081c36c4ff2a7130e611df5e", - "bb57ffcc3c44370131c88e16f74ad73e", - "c6a27c9c6c632820ba2ced4b0061bac1", - "83c43194cb8dd492735c763e54b8db10", - "143d28498127fcc54acce837c1d7f095", - "5c852ea368195f3a075cff32745e4c36", - "c68a06c8e5f6692f7668fc0688ee7b2f", - "cd1be9e341e8eb5fb5b976d4058a686f", - "56a1ed418b617499bd004287334052b4", - "b479ae311ef97b5fbdf7c285dbbd0261", - "234503e68f2902b94115adfcd6639945", - "c28b47c7ad2575473a55ff0d299326b7", - "e6f80364a4449715a002f0b0a84952fd", - "a92ed45cfe7bbd2cd7ba34a5ce185126", - "8c2a8852c64e0abd11500fe8c87c1bf3", - "d5e8a41b2794a64e56c44655aa8aa137", - "1984ca99584500a1b6d769b2d74409a3", - "c5718952c1bfb854e7a85c2a198afea1", - "5227b1172005f3b1b682767ef22a3a3b", - "1c6251cb9c4527426a4e48171c6cadf6", - "45573fefda9aed7e3548849f846481a6", - "ecac7d36be0e38ef28f6ae28909d229d", - "556a44cdbb4fa61bdb8f627c062b161b", - "c679640feee4c3d7584d20a6eb475f66", - "35680f4a6321ed9c0031f0523632dba7", - "2c349963f6f0a58f982b347d76388501", - "f6f0c16440230782fbb68c3605e94e1b", - "e01d6a321a353eeda86bbc36b2b89898", - "3cb994f99ebfd6d28a0c716e1a4710f1", - "3fad98148a00b7faf3c48c49cfbdb40f", - "bffe0b3167d2e01c8f227a0631843a94", - "eff15a613db675eeff55e451c37498fa", - "a4cf50c7cf5b51ff9e09715da14773e0", - "3a66869191058c64353056836665327b", - "74321e0a1191bf4f400d5e315548da71", - "08e40f80bea56f282d0d338e61449e9e", - "66b0d7b25e0735987966a4a7d1d1d092", - "34b74fed0bbf6fc996ad703dbf95cbc8", - "48d4d646f2cdc06fd956eb87de7fb213", - "431206b92387190aff870f4259a840de", - "9fd788a97451affebb1d2b65143c6107", - "d7a8e35b7a63905c9e16071d38ab6524", - "51e4c156fe074362bfe672079ee42e2a", - "264224d4c3090ae182088617fe2a87d4", - "93f6ebd36672456b3014d4c1bcafc105", - "ec77f9bedf1a62a7a82ef70396c5f767", - "dbd98873567275fac01a901016f214a2", - "768a06e71ae20736fb5f974a8efe8760", - "f4dc7e87f8223b451658ca0ef1ffa005", - "2637d542f00af9813a344a82ab700842", - "3f2be235dff4d6e37b055f8f5b78fe51", - "a994bfacdcbae1faabe006ac32a9ccf6", - "9d1e1d721fae8055c3f58392bd8200ed", - "d08cde43b01a6fe803f496d8beb595ef", - "1a121ed89f5cce5fb7f116c7bcfa1842", - "bd64fffe2ee5e89610d6e5fc6ff7b2e6", - "0c409a6a7bc15045a728a079c9d45368", - "2fa0907b916e3188ddae01baefa5521c", - "c966c6b9585fb4e68402792fc93e73b9", - "69f7e63743d20c2fd91bfcb938f342c2", - "985b8e1a19c25b7a2f002b236230dbce", - "bfae1a7b7d0940a193a5dec0edf39370", - "fa58d7ae88ed2afa51b60f2e70921814", - "9309753919e224d11b4804e1caf0254c", - "cee0a777b606f35aeb11831984019766", - "1afecb632982d79bd6ed52b743dfb0ef", - "62eecd1b7f94381c1acaaa007be45bd0", - "b7dec4325cc318b948c7302c5aad28d2", - "e4f8579ff92cfcc3c3a18f29386fc66a", - "e0b0b3990121c1aee83746f1a55a4aed", - "489fec02985c24cad582ebec7ba6c44d", - "2bf2c3e83071329ade2191d73b449ae8", - "7b408fead07c01593eae70c786f039d8", - "abf4a366e8e5571d0ebb06b7cc707a2e", - "c5306e3f76e97fab3a6c6dd975e74348", - "b8d4995868712714e3d10b74902a9d0c", - "d13b6b91b4347dc5af4d60ddea0e76bd", - "f4fd9815cd504434c9981d28bcf1bb22", - "ae66815774d4f003537d951a24a12c0a", - "e48218c6d31e954fe20f4334e0495d47", - "4950504fc9635cf5715c8efa06f93a81", - "67bc4607ebcc6e850c6aced635935b2f", - "354a4d2eff9c71cdd39798dffe596115", - "d89e901a43e0fabffd3f554f066c8212", - "add01fa47f79033aa175f4f8033057c4", - "f481381f3db1b5d9b2fd72e27aaecd2a", - "6568e5a724e4a699e89c287162eb44bb", - "f35efa71772f4fbb2650bd93ae4aa3a5", - "3192069c0734b4e9742e52955c819090", - "f3106af780bdd564036ddda405fe0a9e", - "9540e5787b7a3fde839f2375e091e63d", - "a54d6036c1bc50bf16efd6d198a0ff7d", - "df8c6d791d85ed885a53ecdee10ce40d" - ], - [ - "1adf0d29da11c354159e2a7c373bfab1", - "7f17b78fda89bcb7e1fd9b86d4c2eff0", - "f5738909a350fb11d5ddc8c41f29e53a", - "0791d0d799f874ce2afac81dbbe9052e", - "d75bb48b448e3dab58ea08704f275cf7", - "9253d1b055657dfd4862c648d1385a5b", - "7b61459c9aeb8d5c9565370551c67bde", - "a48ce598f7e3c93be4d48ecf19ee20a1", - "46a80033c3bbc8feb23771e908b528c1", - "3b5d8363939cd7df29d312b4ff9e453e", - "7e3bce6b34722b6d70a389c1ab4724ef", - "edc2d7b67ed8033a993317c83e280f6a", - "a57ad15c97e6a0c5dca300cd8ba1b3c9", - "3b75f9371a0996d06d9703f9771184d0", - "34e4161cbe1714a02e46892bfa759790", - "ab5e12be749e8b6626ffbd78ccbfad4b", - "4d8651cee10684a026083d7a2442fd9e", - "debafc1970d6fd46a2ea5203299c66ba", - "3f74b83852da8ab8a9aa00f2d66cd948", - "1b07fc9b5bbb68ea43fd0f4f57b6ad02", - "58d12ba3018442d30c45cb5a31e7aed9", - "75d577ad39b1f542d2aff0173783e40c", - "2c175be4d86b59b18d3bb9aa55755ec8", - "e87b3566a7baff5e2d28964d28bbf65c", - "3c8e76ad3e4047abfc56a3d5e675015e", - "afd84ee8dffa0c4e2d7d89810dd5c5c4", - "e59dae3463bad8bd79b1b7e8e3935209", - "bca8c01025651281aeb77b607b9b7e59", - "155382c941f1c710bb0951d76f62dd62", - "ac95bb3244b059e408709d83f9d4e9e4", - "3b869bf0111b3c288bb2df5914b8a099", - "cc97f0b59cde1263e3ce0fadc9cd2458", - "d5cb669c090f5a704bd4cb8289c77afe", - "0b0f3e9bbfdcf87de84873c9fa16b1e4", - "21e295cde5cac1123b9443c94d476767", - "c5466b066140292d59f38e91e5b8ef0e", - "c25267eb75ff4805f03a73b630424bf0", - "4201f4ce982d1fe354dd85f9ce7bc56b", - "120ea59ec2498a11e4a91bae3c8b6705", - "5d30af3830a4ae0045f68ea25eb88c1f", - "c799796e6efa739baecfa97c999acd84", - "8dcde1f5ee6e40b0a3f2a1ceaab7258e", - "f91bf07f415a90d7b6f2cc719ebb6161", - "9b4f284da1f8ca676a995b582e2e2f6d", - "cd48b012f44090364d528fc2406a3437", - "b92b29b90d323f900aa9147821804dec", - "beedf946dc78e6f5e477f0bda657bf21", - "622877568bae500128e2d49aebc39ef8", - "2a571ca4859c6fa345e9f8e2c7549adb", - "b01b3ea901f8bc9d24198df8611bd1d5", - "dbbddb2b3cf6f51e61f779e801d5782b", - "6e09142c998dba94b3eb2b3e43503efa", - "1588064120e59d583bd108fc693a0898", - "2626778ca98d8a0523e56fefe90deb5d", - "8b75f918e51df8c9e89f68b57101789f", - "0d23817807ddc4bacda735f10e005ffa", - "dbc82abd0ff5067ea9cbb57d548ff7bd", - "c2d41dca200b291c68faa070a48701ae", - "586b405323451e05381ff953cd563309", - "64e1e28de0517faa200a7c6d427dff12", - "317321bc4fe59017e00b6927414a6a10", - "e7ede12760a331a02c0ee9384305e7bd", - "449b0001d11a1769d3291a0390084d19", - "f5bf6595843eafba3cd75f86362bac97", - "d25f6f846e91ce770651fe45105aade3", - "38993946a7a04b195ffd86d036c18c46", - "980819c8bc2df3d00ae40346c70cbd3d", - "69a471e5e63da485b4ffd4dc9dcf2431", - "4251e58482f6bf5e505a213f120c6c8f", - "07a728517712d5059249f0d18f6de7eb", - "6ef68ac6e61ddb2ec8b7fb1e350fdab3", - "331f588849f90ca5f8ed7ce67bfe6899", - "e701349cd67d28640d12ad48bc204f10", - "9f1132e4806bc7e3c93555ff841ba42f", - "4a213bcda33ce7469b38cfd3a552d72d", - "1d07a86006d3033c205e70d6c7903995", - "214f4c66fede3e51fbc7b90e5aa5b512", - "b96013fd67a3db350e7d141384593bb2", - "d60d3c17cf8ecd6505de6e28c4bb6517", - "86bf70152f83fea6a5518f38790fc627", - "560b5c99171aa8e2d544f948338f85d1", - "3ccf91c089168054a99392268a18bcb7", - "492b66a7978ed8eb002ef48b6fd562f3", - "30c4946e4bcb823a34b29f2215f18942", - "0d0267ea32afbbcb1a67e2d7430e44dd", - "53997ea88b2b0ffc90826ae5db5ed3f5", - "1d7de7392ce16ab001f0bccb1fb6a2b8", - "b8afafb0369ca30a72a37105f906c57e", - "9a43b9f81433917ad7953129ca6ca4d0", - "ccb5b2d100638e321068672001a69eea", - "29616fe5bc1f0540e6bfaab0f9937ded", - "542fe05b8086fcc5428a0b07fccfa83b", - "0d7ec7e0c24e4a2631028d1d855132d5", - "9c971a58db1b5966fb62d78e9d14bb44", - "0ea1058e88d0b044bdaf426c51b55c5a", - "d06df963f8cb4b166fd1ad6aa37e6f6f", - "0eef95087f422a9be092225bfa01f561", - "6cbf1a878485c0216060dc8a1f6e19c2", - "5cb29fc93e43af40cd10292e675f0082", - "22739286e27a127789ac13211ef31bf2" - ] - ], - "prep_messages": [ - "baa2841ddb7c9165f4a782633dd7e92b49dd1b3442de0069c780f74a63cb53e6" - ], - "prep_shares": [ - [ - "66e14d38c90694ecaed6e1e6e54ff37f27eba1c272bf7ca7ab0768e3d1f75404ae6456b732d066ab74d4f2da6dcaa2494b444ff6c14e6773609eabc32282d9d456cc565ec94950085319139daef29568e2fa6699702a0d3aa4018d71a3c28b9cdf73ee692130d39de44328e3e4d49af0a5bd4b6f62bb3357eacc129f8e358c99388813e1976784d821d2babaedcd760d02a6fce712900190c3b95ccee4938267eca51216da0b13cd6c9c7978189efda79f847e987c4b6a31778cd1466a2967e22b6143d62e4e1229aa7f5ea7853901c6d542b0d5ab0fd6de397ae38bf935dd3b3521e9a9f0eb93b2a26dbdf9654d6c68562725cf6aeea09fed87fe61ed35d8d570a03cdeee9719af30cf68bd18cf728ad989db144725a3b8b81f6c7f12c1af0bdb7b5dead163e4ce99128251a44a6476b4a46cee9fd105411657e6dd313dc90a8bc37948a39bc02ee7a80168be082b4667085e83d49c770521af5a4baff811b9fa66d5dbb62e46d22ecd373679b0025334b8c93cb5aca96774a571d0601ab77d", - "9b1eb2c736f96b1335291e191ab00c80c464d3dc55c52b9f6d0a6c5d7ed0f01ccac1655435b03aec8c6f8aa8c6798e053ee915cb8a8b70d1582b242961f39b401db842439560a70ce333a273d4da9b37dc5fc812448a68f27bf39ef221b32b8c1d51e55b553ea3a4056d627a2e5b2ced712688d79553a0321c32cb1fb474da3b12ba32779614365afdfd645a8b3fa5178c2702c30745ab64a048340a733022bc5e4d60fbae27377187a09ee9d933ce06bb5851772b2f9c71d9e37a28078db2bd1f97bf8466cbf7dda8442d7f7af37c32b79c7d70e993ac0f2f44ece039290c13345318abde99a7db7b9fee2a33d5938d4b71eda2201dce4b4626e2f47757834fe9761e56d960409a891124141f1ff5a194b2245749a34f12514f0cf75774a86a4c3d78cad0829883f6c1f520ec2808c7279e2949fdb4d2ed8c2c519332588fc00d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" - ] - ], - "public_share": "fa66d5dbb62e46d22ecd373679b0025334b8c93cb5aca96774a571d0601ab77d40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7de08c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001adca7981fce37c38b216b2674cdf08e34a305dd18a5027553155ed527d6789e1b25a7b45e058ef22d4e3e352f008437c677e133839a824b3bf853bbf3a0a00f129037ff071aa7f85d8a68b8f2fb9f9b0cd9865270d4d64dce6f95d8206f8154bb3f7900f6fc5163edf7541f0421c5cec6752a580f2f4405aaef5d0a53324a8c5b7231d06018ed66ac4302eb0418001761c438288ca5606fee8d061c9c08c9874f6bc7f96802eae1af0b4b962cdb936179f589efdfb9293f0d90a559184d311562d8cee42e499e432705ef48f7a7f607fbcb02db1627dc54902e2db34de1ced1d27558386e1e0cf29a9062dae33e3ac72ad23684d519da66012bc1d0ce4e3c007205241ce0b4db71626c527eac887659328de482a6ffa7d96be9051c5ebf05cda2eb9304503fc70efe6a5cfe0a1e46367716635e55d261cf9c40e7e3c2f41bfc0042fa27072444a9769670867915853b8884ba5581ee038c8d56acb409e9ec1dd977ea6670dc2d550e79a692f688d398d5c710ead1a3752e7d9010a1e17cbe69e4699160baa7fdf64966aeaaae02132b3459e91c8ec1e2e8aaa38aaebdebde68fbdbe36a79c22540f26202c72d3f3b0c30d70ddeb8825a749f999688fc0865c8c8b576704a5eba421d7e6c3a6133bbac99496590bd3daa6f10f3fdd3adbd10c80362af8f96e2bd10d82091af91ce6a5eb7404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 99, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e720f2d625ee3cabce61d583c8c4054e", - "82e8487025764348020264792b3d100f", - "0c8c76f65caf04ee0e22373be0d61ac5", - "fa6e2f2866078b31b90537e24416fad1", - "2aa44b74bb71c2548b15f78fb0d8a308", - "6fac2e4faa9a82029b9d39b72ec7a5a4", - "869eba63651472a34e9ac8faae398421", - "5d731a67081c36c4ff2a7130e611df5e", - "bb57ffcc3c44370131c88e16f74ad73e", - "c6a27c9c6c632820ba2ced4b0061bac1", - "83c43194cb8dd492735c763e54b8db10", - "143d28498127fcc54acce837c1d7f095", - "5c852ea368195f3a075cff32745e4c36", - "c68a06c8e5f6692f7668fc0688ee7b2f", - "cd1be9e341e8eb5fb5b976d4058a686f", - "56a1ed418b617499bd004287334052b4", - "b479ae311ef97b5fbdf7c285dbbd0261", - "234503e68f2902b94115adfcd6639945", - "c28b47c7ad2575473a55ff0d299326b7", - "e6f80364a4449715a002f0b0a84952fd", - "a92ed45cfe7bbd2cd7ba34a5ce185126", - "8c2a8852c64e0abd11500fe8c87c1bf3", - "d5e8a41b2794a64e56c44655aa8aa137", - "1984ca99584500a1b6d769b2d74409a3", - "c5718952c1bfb854e7a85c2a198afea1", - "5227b1172005f3b1b682767ef22a3a3b", - "1c6251cb9c4527426a4e48171c6cadf6", - "45573fefda9aed7e3548849f846481a6", - "ecac7d36be0e38ef28f6ae28909d229d", - "556a44cdbb4fa61bdb8f627c062b161b", - "c679640feee4c3d7584d20a6eb475f66", - "35680f4a6321ed9c0031f0523632dba7", - "2c349963f6f0a58f982b347d76388501", - "f6f0c16440230782fbb68c3605e94e1b", - "e01d6a321a353eeda86bbc36b2b89898", - "3cb994f99ebfd6d28a0c716e1a4710f1", - "3fad98148a00b7faf3c48c49cfbdb40f", - "bffe0b3167d2e01c8f227a0631843a94", - "eff15a613db675eeff55e451c37498fa", - "a4cf50c7cf5b51ff9e09715da14773e0", - "3a66869191058c64353056836665327b", - "74321e0a1191bf4f400d5e315548da71", - "08e40f80bea56f282d0d338e61449e9e", - "66b0d7b25e0735987966a4a7d1d1d092", - "34b74fed0bbf6fc996ad703dbf95cbc8", - "48d4d646f2cdc06fd956eb87de7fb213", - "431206b92387190aff870f4259a840de", - "9fd788a97451affebb1d2b65143c6107", - "d7a8e35b7a63905c9e16071d38ab6524", - "51e4c156fe074362bfe672079ee42e2a", - "264224d4c3090ae182088617fe2a87d4", - "93f6ebd36672456b3014d4c1bcafc105", - "ec77f9bedf1a62a7a82ef70396c5f767", - "dbd98873567275fac01a901016f214a2", - "768a06e71ae20736fb5f974a8efe8760", - "f4dc7e87f8223b451658ca0ef1ffa005", - "2637d542f00af9813a344a82ab700842", - "3f2be235dff4d6e37b055f8f5b78fe51", - "a994bfacdcbae1faabe006ac32a9ccf6", - "9d1e1d721fae8055c3f58392bd8200ed", - "d08cde43b01a6fe803f496d8beb595ef", - "1a121ed89f5cce5fb7f116c7bcfa1842", - "bd64fffe2ee5e89610d6e5fc6ff7b2e6", - "0c409a6a7bc15045a728a079c9d45368", - "2fa0907b916e3188ddae01baefa5521c", - "c966c6b9585fb4e68402792fc93e73b9", - "69f7e63743d20c2fd91bfcb938f342c2", - "985b8e1a19c25b7a2f002b236230dbce", - "bfae1a7b7d0940a193a5dec0edf39370", - "fa58d7ae88ed2afa51b60f2e70921814", - "9309753919e224d11b4804e1caf0254c", - "cee0a777b606f35aeb11831984019766", - "1afecb632982d79bd6ed52b743dfb0ef", - "62eecd1b7f94381c1acaaa007be45bd0", - "b7dec4325cc318b948c7302c5aad28d2", - "e4f8579ff92cfcc3c3a18f29386fc66a", - "e0b0b3990121c1aee83746f1a55a4aed", - "489fec02985c24cad582ebec7ba6c44d", - "2bf2c3e83071329ade2191d73b449ae8", - "7b408fead07c01593eae70c786f039d8", - "abf4a366e8e5571d0ebb06b7cc707a2e", - "c5306e3f76e97fab3a6c6dd975e74348", - "b8d4995868712714e3d10b74902a9d0c", - "d13b6b91b4347dc5af4d60ddea0e76bd", - "f4fd9815cd504434c9981d28bcf1bb22", - "ae66815774d4f003537d951a24a12c0a", - "e48218c6d31e954fe20f4334e0495d47", - "4950504fc9635cf5715c8efa06f93a81", - "67bc4607ebcc6e850c6aced635935b2f", - "354a4d2eff9c71cdd39798dffe596115", - "d89e901a43e0fabffd3f554f066c8212", - "add01fa47f79033aa175f4f8033057c4", - "f481381f3db1b5d9b2fd72e27aaecd2a", - "6568e5a724e4a699e89c287162eb44bb", - "f35efa71772f4fbb2650bd93ae4aa3a5", - "3192069c0734b4e9742e52955c819090", - "f3106af780bdd564036ddda405fe0a9e", - "9540e5787b7a3fde839f2375e091e63d", - "a54d6036c1bc50bf16efd6d198a0ff7d", - "e08c6d791d85ed885a53ecdee10ce40d" - ], - [ - "1adf0d29da11c354159e2a7c373bfab1", - "7f17b78fda89bcb7e1fd9b86d4c2eff0", - "f5738909a350fb11d5ddc8c41f29e53a", - "0791d0d799f874ce2afac81dbbe9052e", - "d75bb48b448e3dab58ea08704f275cf7", - "9253d1b055657dfd4862c648d1385a5b", - "7b61459c9aeb8d5c9565370551c67bde", - "a48ce598f7e3c93be4d48ecf19ee20a1", - "46a80033c3bbc8feb23771e908b528c1", - "3b5d8363939cd7df29d312b4ff9e453e", - "7e3bce6b34722b6d70a389c1ab4724ef", - "edc2d7b67ed8033a993317c83e280f6a", - "a57ad15c97e6a0c5dca300cd8ba1b3c9", - "3b75f9371a0996d06d9703f9771184d0", - "34e4161cbe1714a02e46892bfa759790", - "ab5e12be749e8b6626ffbd78ccbfad4b", - "4d8651cee10684a026083d7a2442fd9e", - "debafc1970d6fd46a2ea5203299c66ba", - "3f74b83852da8ab8a9aa00f2d66cd948", - "1b07fc9b5bbb68ea43fd0f4f57b6ad02", - "58d12ba3018442d30c45cb5a31e7aed9", - "75d577ad39b1f542d2aff0173783e40c", - "2c175be4d86b59b18d3bb9aa55755ec8", - "e87b3566a7baff5e2d28964d28bbf65c", - "3c8e76ad3e4047abfc56a3d5e675015e", - "afd84ee8dffa0c4e2d7d89810dd5c5c4", - "e59dae3463bad8bd79b1b7e8e3935209", - "bca8c01025651281aeb77b607b9b7e59", - "155382c941f1c710bb0951d76f62dd62", - "ac95bb3244b059e408709d83f9d4e9e4", - "3b869bf0111b3c288bb2df5914b8a099", - "cc97f0b59cde1263e3ce0fadc9cd2458", - "d5cb669c090f5a704bd4cb8289c77afe", - "0b0f3e9bbfdcf87de84873c9fa16b1e4", - "21e295cde5cac1123b9443c94d476767", - "c5466b066140292d59f38e91e5b8ef0e", - "c25267eb75ff4805f03a73b630424bf0", - "4201f4ce982d1fe354dd85f9ce7bc56b", - "120ea59ec2498a11e4a91bae3c8b6705", - "5d30af3830a4ae0045f68ea25eb88c1f", - "c799796e6efa739baecfa97c999acd84", - "8dcde1f5ee6e40b0a3f2a1ceaab7258e", - "f91bf07f415a90d7b6f2cc719ebb6161", - "9b4f284da1f8ca676a995b582e2e2f6d", - "cd48b012f44090364d528fc2406a3437", - "b92b29b90d323f900aa9147821804dec", - "beedf946dc78e6f5e477f0bda657bf21", - "622877568bae500128e2d49aebc39ef8", - "2a571ca4859c6fa345e9f8e2c7549adb", - "b01b3ea901f8bc9d24198df8611bd1d5", - "dbbddb2b3cf6f51e61f779e801d5782b", - "6e09142c998dba94b3eb2b3e43503efa", - "1588064120e59d583bd108fc693a0898", - "2626778ca98d8a0523e56fefe90deb5d", - "8b75f918e51df8c9e89f68b57101789f", - "0d23817807ddc4bacda735f10e005ffa", - "dbc82abd0ff5067ea9cbb57d548ff7bd", - "c2d41dca200b291c68faa070a48701ae", - "586b405323451e05381ff953cd563309", - "64e1e28de0517faa200a7c6d427dff12", - "317321bc4fe59017e00b6927414a6a10", - "e7ede12760a331a02c0ee9384305e7bd", - "449b0001d11a1769d3291a0390084d19", - "f5bf6595843eafba3cd75f86362bac97", - "d25f6f846e91ce770651fe45105aade3", - "38993946a7a04b195ffd86d036c18c46", - "980819c8bc2df3d00ae40346c70cbd3d", - "69a471e5e63da485b4ffd4dc9dcf2431", - "4251e58482f6bf5e505a213f120c6c8f", - "07a728517712d5059249f0d18f6de7eb", - "6ef68ac6e61ddb2ec8b7fb1e350fdab3", - "331f588849f90ca5f8ed7ce67bfe6899", - "e701349cd67d28640d12ad48bc204f10", - "9f1132e4806bc7e3c93555ff841ba42f", - "4a213bcda33ce7469b38cfd3a552d72d", - "1d07a86006d3033c205e70d6c7903995", - "214f4c66fede3e51fbc7b90e5aa5b512", - "b96013fd67a3db350e7d141384593bb2", - "d60d3c17cf8ecd6505de6e28c4bb6517", - "86bf70152f83fea6a5518f38790fc627", - "560b5c99171aa8e2d544f948338f85d1", - "3ccf91c089168054a99392268a18bcb7", - "492b66a7978ed8eb002ef48b6fd562f3", - "30c4946e4bcb823a34b29f2215f18942", - "0d0267ea32afbbcb1a67e2d7430e44dd", - "53997ea88b2b0ffc90826ae5db5ed3f5", - "1d7de7392ce16ab001f0bccb1fb6a2b8", - "b8afafb0369ca30a72a37105f906c57e", - "9a43b9f81433917ad7953129ca6ca4d0", - "ccb5b2d100638e321068672001a69eea", - "29616fe5bc1f0540e6bfaab0f9937ded", - "542fe05b8086fcc5428a0b07fccfa83b", - "0d7ec7e0c24e4a2631028d1d855132d5", - "9c971a58db1b5966fb62d78e9d14bb44", - "0ea1058e88d0b044bdaf426c51b55c5a", - "d06df963f8cb4b166fd1ad6aa37e6f6f", - "0eef95087f422a9be092225bfa01f561", - "6cbf1a878485c0216060dc8a1f6e19c2", - "5cb29fc93e43af40cd10292e675f0082", - "22739286e27a127789ac13211ef31bf2" - ] - ], - "prep_messages": [ - "0900d619e75cda06ed8b38db0a1d1ada2c3570643374d4d0223b63bd9f4ed7b6" - ], - "prep_shares": [ - [ - "66e14d38c90694ecaed6e1e6e54ff37fce4abb3d00eb8a7dd7c26bc25d0fffaeae6456b732d066ab74d4f2da6dcaa249f8525a13e33a3bd9950fde34fd1f1d3256cc565ec94950085319139daef29568048c2943883dfda634b6ff5c49709e1f1771b890a81981bd862ff9eb352d2c7a39f5100e20caac624a0e0279a449195f388813e1976784d821d2babaedcd760db60e161a0259afafd537e1db1485813ceca51216da0b13cd6c9c7978189efda752c1051f95d025b237f3884902f3e8842b6143d62e4e1229aa7f5ea7853901c63f6afb66440558221790880305179b633521e9a9f0eb93b2a26dbdf9654d6c688698126d4789f557989863634d3ca19f70a03cdeee9719af30cf68bd18cf728afda6370e8e6197bd6c7390d0aefb3f3adb7b5dead163e4ce99128251a44a64763141fa7df5e74394166bc1636804bef37b44255378dc49c5a4cae709ea3485165a149b4a733d2c76efca5b9af9ea34342fecd68b2f22c7d563da5c4e5206638d88f2b13480cc62d18a56960eae5848ce", - "9b1eb2c736f96b1335291e191ab00c801e05ba61c8991dc9254f687ef2b84672cac1655435b03aec8c6f8aa8c6798e0591da0aae699f9c6b23baf1b7865558e31db842439560a70ce333a273d4da9b37dbcf3289b790c1c043355fec8cc50a591d51e55b553ea3a4056d627a2e5b2cedddeec238d8442727bcf0db459e604d7612ba32779614365afdfd645a8b3fa517d8bee890187cfd448ecaaffc423f23e75e4d60fbae27377187a09ee9d933ce06071ccaf012aae0f0347dc3256fc3301b1f97bf8466cbf7dda8442d7f7af37c324e7532df509e2acc352e47692e484eeb345318abde99a7db7b9fee2a33d5938d1b000005448279939b157df31751ba85e9761e56d960409a891124141f1ff5a17095c85d02675b0d9dfbe7a5bb39183c4c3d78cad0829883f6c1f520ec2808c73aa5446dd7c86fa6e62df1e1a69033d40d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" - ] - ], - "public_share": "2fecd68b2f22c7d563da5c4e5206638d88f2b13480cc62d18a56960eae5848ce40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7de08c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001adca7981fce37c38b216b2674cdf08e34a305dd18a5027553155ed527d6789e1b25a7b45e058ef22d4e3e352f008437c677e133839a824b3bf853bbf3a0a00f129037ff071aa7f85d8a68b8f2fb9f9b0cd9865270d4d64dce6f95d8206f8154bb3f7900f6fc5163edf7541f0421c5cec6752a580f2f4405aaef5d0a53324a8c5b7231d06018ed66ac4302eb0418001761c438288ca5606fee8d061c9c08c9874f6bc7f96802eae1af0b4b962cdb936179f589efdfb9293f0d90a559184d311562d8cee42e499e432705ef48f7a7f607fbcb02db1627dc54902e2db34de1ced1d27558386e1e0cf29a9062dae33e3ac72ad23684d519da66012bc1d0ce4e3c007205241ce0b4db71626c527eac887659328de482a6ffa7d96be9051c5ebf05cda2eb9304503fc70efe6a5cfe0a1e46367716635e55d261cf9c40e7e3c2f41bfc0042fa27072444a9769670867915853b8884ba5581ee038c8d56acb409e9ec1dd977ea6670dc2d550e79a692f688d398d5c710ead1a3752e7d9010a1e17cbe69e4699160baa7fdf64966aeaaae02132b3459e91c8ec1e2e8aaa38aaebdebde68fbdbe36a79c22540f26202c72d3f3b0c30d70ddeb8825a749f999688fc0865c8c8b576704a5eba421d7e6c3a6133bbac99496590bd3daa6f10f3fdd3adbd10c80362af8f96e2bd10d82091af91ce6a5eb7404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 99, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e720f2d625ee3cabce61d583c8c4054e", - "82e8487025764348020264792b3d100f", - "0c8c76f65caf04ee0e22373be0d61ac5", - "fa6e2f2866078b31b90537e24416fad1", - "2aa44b74bb71c2548b15f78fb0d8a308", - "6fac2e4faa9a82029b9d39b72ec7a5a4", - "869eba63651472a34e9ac8faae398421", - "5d731a67081c36c4ff2a7130e611df5e", - "bb57ffcc3c44370131c88e16f74ad73e", - "c6a27c9c6c632820ba2ced4b0061bac1", - "83c43194cb8dd492735c763e54b8db10", - "143d28498127fcc54acce837c1d7f095", - "5c852ea368195f3a075cff32745e4c36", - "c68a06c8e5f6692f7668fc0688ee7b2f", - "cd1be9e341e8eb5fb5b976d4058a686f", - "56a1ed418b617499bd004287334052b4", - "b479ae311ef97b5fbdf7c285dbbd0261", - "234503e68f2902b94115adfcd6639945", - "c28b47c7ad2575473a55ff0d299326b7", - "e6f80364a4449715a002f0b0a84952fd", - "a92ed45cfe7bbd2cd7ba34a5ce185126", - "8c2a8852c64e0abd11500fe8c87c1bf3", - "d5e8a41b2794a64e56c44655aa8aa137", - "1984ca99584500a1b6d769b2d74409a3", - "c5718952c1bfb854e7a85c2a198afea1", - "5227b1172005f3b1b682767ef22a3a3b", - "1c6251cb9c4527426a4e48171c6cadf6", - "45573fefda9aed7e3548849f846481a6", - "ecac7d36be0e38ef28f6ae28909d229d", - "556a44cdbb4fa61bdb8f627c062b161b", - "c679640feee4c3d7584d20a6eb475f66", - "35680f4a6321ed9c0031f0523632dba7", - "2c349963f6f0a58f982b347d76388501", - "f6f0c16440230782fbb68c3605e94e1b", - "e01d6a321a353eeda86bbc36b2b89898", - "3cb994f99ebfd6d28a0c716e1a4710f1", - "3fad98148a00b7faf3c48c49cfbdb40f", - "bffe0b3167d2e01c8f227a0631843a94", - "eff15a613db675eeff55e451c37498fa", - "a4cf50c7cf5b51ff9e09715da14773e0", - "3a66869191058c64353056836665327b", - "74321e0a1191bf4f400d5e315548da71", - "08e40f80bea56f282d0d338e61449e9e", - "66b0d7b25e0735987966a4a7d1d1d092", - "34b74fed0bbf6fc996ad703dbf95cbc8", - "48d4d646f2cdc06fd956eb87de7fb213", - "431206b92387190aff870f4259a840de", - "9fd788a97451affebb1d2b65143c6107", - "d7a8e35b7a63905c9e16071d38ab6524", - "51e4c156fe074362bfe672079ee42e2a", - "264224d4c3090ae182088617fe2a87d4", - "93f6ebd36672456b3014d4c1bcafc105", - "ec77f9bedf1a62a7a82ef70396c5f767", - "dbd98873567275fac01a901016f214a2", - "768a06e71ae20736fb5f974a8efe8760", - "f4dc7e87f8223b451658ca0ef1ffa005", - "2637d542f00af9813a344a82ab700842", - "3f2be235dff4d6e37b055f8f5b78fe51", - "a994bfacdcbae1faabe006ac32a9ccf6", - "9d1e1d721fae8055c3f58392bd8200ed", - "d08cde43b01a6fe803f496d8beb595ef", - "1a121ed89f5cce5fb7f116c7bcfa1842", - "bd64fffe2ee5e89610d6e5fc6ff7b2e6", - "0c409a6a7bc15045a728a079c9d45368", - "2fa0907b916e3188ddae01baefa5521c", - "c966c6b9585fb4e68402792fc93e73b9", - "69f7e63743d20c2fd91bfcb938f342c2", - "985b8e1a19c25b7a2f002b236230dbce", - "bfae1a7b7d0940a193a5dec0edf39370", - "fa58d7ae88ed2afa51b60f2e70921814", - "9309753919e224d11b4804e1caf0254c", - "cee0a777b606f35aeb11831984019766", - "1afecb632982d79bd6ed52b743dfb0ef", - "62eecd1b7f94381c1acaaa007be45bd0", - "b7dec4325cc318b948c7302c5aad28d2", - "e4f8579ff92cfcc3c3a18f29386fc66a", - "e0b0b3990121c1aee83746f1a55a4aed", - "489fec02985c24cad582ebec7ba6c44d", - "2bf2c3e83071329ade2191d73b449ae8", - "7b408fead07c01593eae70c786f039d8", - "abf4a366e8e5571d0ebb06b7cc707a2e", - "c5306e3f76e97fab3a6c6dd975e74348", - "b8d4995868712714e3d10b74902a9d0c", - "d13b6b91b4347dc5af4d60ddea0e76bd", - "f4fd9815cd504434c9981d28bcf1bb22", - "ae66815774d4f003537d951a24a12c0a", - "e48218c6d31e954fe20f4334e0495d47", - "4950504fc9635cf5715c8efa06f93a81", - "67bc4607ebcc6e850c6aced635935b2f", - "354a4d2eff9c71cdd39798dffe596115", - "d89e901a43e0fabffd3f554f066c8212", - "add01fa47f79033aa175f4f8033057c4", - "f481381f3db1b5d9b2fd72e27aaecd2a", - "6568e5a724e4a699e89c287162eb44bb", - "f35efa71772f4fbb2650bd93ae4aa3a5", - "3192069c0734b4e9742e52955c819090", - "f3106af780bdd564036ddda405fe0a9e", - "9540e5787b7a3fde839f2375e091e63d", - "a54d6036c1bc50bf16efd6d198a0ff7d", - "e08c6d791d85ed885a53ecdee10ce40d" - ], - [ - "1adf0d29da11c354159e2a7c373bfab1", - "7f17b78fda89bcb7e1fd9b86d4c2eff0", - "f5738909a350fb11d5ddc8c41f29e53a", - "0791d0d799f874ce2afac81dbbe9052e", - "d75bb48b448e3dab58ea08704f275cf7", - "9253d1b055657dfd4862c648d1385a5b", - "7b61459c9aeb8d5c9565370551c67bde", - "a48ce598f7e3c93be4d48ecf19ee20a1", - "46a80033c3bbc8feb23771e908b528c1", - "3b5d8363939cd7df29d312b4ff9e453e", - "7e3bce6b34722b6d70a389c1ab4724ef", - "edc2d7b67ed8033a993317c83e280f6a", - "a57ad15c97e6a0c5dca300cd8ba1b3c9", - "3b75f9371a0996d06d9703f9771184d0", - "34e4161cbe1714a02e46892bfa759790", - "ab5e12be749e8b6626ffbd78ccbfad4b", - "4d8651cee10684a026083d7a2442fd9e", - "debafc1970d6fd46a2ea5203299c66ba", - "3f74b83852da8ab8a9aa00f2d66cd948", - "1b07fc9b5bbb68ea43fd0f4f57b6ad02", - "58d12ba3018442d30c45cb5a31e7aed9", - "75d577ad39b1f542d2aff0173783e40c", - "2c175be4d86b59b18d3bb9aa55755ec8", - "e87b3566a7baff5e2d28964d28bbf65c", - "3c8e76ad3e4047abfc56a3d5e675015e", - "afd84ee8dffa0c4e2d7d89810dd5c5c4", - "e59dae3463bad8bd79b1b7e8e3935209", - "bca8c01025651281aeb77b607b9b7e59", - "155382c941f1c710bb0951d76f62dd62", - "ac95bb3244b059e408709d83f9d4e9e4", - "3b869bf0111b3c288bb2df5914b8a099", - "cc97f0b59cde1263e3ce0fadc9cd2458", - "d5cb669c090f5a704bd4cb8289c77afe", - "0b0f3e9bbfdcf87de84873c9fa16b1e4", - "21e295cde5cac1123b9443c94d476767", - "c5466b066140292d59f38e91e5b8ef0e", - "c25267eb75ff4805f03a73b630424bf0", - "4201f4ce982d1fe354dd85f9ce7bc56b", - "120ea59ec2498a11e4a91bae3c8b6705", - "5d30af3830a4ae0045f68ea25eb88c1f", - "c799796e6efa739baecfa97c999acd84", - "8dcde1f5ee6e40b0a3f2a1ceaab7258e", - "f91bf07f415a90d7b6f2cc719ebb6161", - "9b4f284da1f8ca676a995b582e2e2f6d", - "cd48b012f44090364d528fc2406a3437", - "b92b29b90d323f900aa9147821804dec", - "beedf946dc78e6f5e477f0bda657bf21", - "622877568bae500128e2d49aebc39ef8", - "2a571ca4859c6fa345e9f8e2c7549adb", - "b01b3ea901f8bc9d24198df8611bd1d5", - "dbbddb2b3cf6f51e61f779e801d5782b", - "6e09142c998dba94b3eb2b3e43503efa", - "1588064120e59d583bd108fc693a0898", - "2626778ca98d8a0523e56fefe90deb5d", - "8b75f918e51df8c9e89f68b57101789f", - "0d23817807ddc4bacda735f10e005ffa", - "dbc82abd0ff5067ea9cbb57d548ff7bd", - "c2d41dca200b291c68faa070a48701ae", - "586b405323451e05381ff953cd563309", - "64e1e28de0517faa200a7c6d427dff12", - "317321bc4fe59017e00b6927414a6a10", - "e7ede12760a331a02c0ee9384305e7bd", - "449b0001d11a1769d3291a0390084d19", - "f5bf6595843eafba3cd75f86362bac97", - "d25f6f846e91ce770651fe45105aade3", - "38993946a7a04b195ffd86d036c18c46", - "980819c8bc2df3d00ae40346c70cbd3d", - "69a471e5e63da485b4ffd4dc9dcf2431", - "4251e58482f6bf5e505a213f120c6c8f", - "07a728517712d5059249f0d18f6de7eb", - "6ef68ac6e61ddb2ec8b7fb1e350fdab3", - "331f588849f90ca5f8ed7ce67bfe6899", - "e701349cd67d28640d12ad48bc204f10", - "9f1132e4806bc7e3c93555ff841ba42f", - "4a213bcda33ce7469b38cfd3a552d72d", - "1d07a86006d3033c205e70d6c7903995", - "214f4c66fede3e51fbc7b90e5aa5b512", - "b96013fd67a3db350e7d141384593bb2", - "d60d3c17cf8ecd6505de6e28c4bb6517", - "86bf70152f83fea6a5518f38790fc627", - "560b5c99171aa8e2d544f948338f85d1", - "3ccf91c089168054a99392268a18bcb7", - "492b66a7978ed8eb002ef48b6fd562f3", - "30c4946e4bcb823a34b29f2215f18942", - "0d0267ea32afbbcb1a67e2d7430e44dd", - "53997ea88b2b0ffc90826ae5db5ed3f5", - "1d7de7392ce16ab001f0bccb1fb6a2b8", - "b8afafb0369ca30a72a37105f906c57e", - "9a43b9f81433917ad7953129ca6ca4d0", - "ccb5b2d100638e321068672001a69eea", - "29616fe5bc1f0540e6bfaab0f9937ded", - "542fe05b8086fcc5428a0b07fccfa83b", - "0d7ec7e0c24e4a2631028d1d855132d5", - "9c971a58db1b5966fb62d78e9d14bb44", - "0ea1058e88d0b044bdaf426c51b55c5a", - "d06df963f8cb4b166fd1ad6aa37e6f6f", - "0eef95087f422a9be092225bfa01f561", - "6cbf1a878485c0216060dc8a1f6e19c2", - "5cb29fc93e43af40cd10292e675f0082", - "22739286e27a127789ac13211ef31bf2" - ] - ], - "prep_messages": [ - "0900d619e75cda06ed8b38db0a1d1ada2c3570643374d4d0223b63bd9f4ed7b6" - ], - "prep_shares": [ - [ - "66e14d38c90694ecaed6e1e6e54ff37fce4abb3d00eb8a7dd7c26bc25d0fffaeae6456b732d066ab74d4f2da6dcaa249f8525a13e33a3bd9950fde34fd1f1d3256cc565ec94950085319139daef29568048c2943883dfda634b6ff5c49709e1f1771b890a81981bd862ff9eb352d2c7a39f5100e20caac624a0e0279a449195f388813e1976784d821d2babaedcd760db60e161a0259afafd537e1db1485813ceca51216da0b13cd6c9c7978189efda752c1051f95d025b237f3884902f3e8842b6143d62e4e1229aa7f5ea7853901c63f6afb66440558221790880305179b633521e9a9f0eb93b2a26dbdf9654d6c688698126d4789f557989863634d3ca19f70a03cdeee9719af30cf68bd18cf728afda6370e8e6197bd6c7390d0aefb3f3adb7b5dead163e4ce99128251a44a64763141fa7df5e74394166bc1636804bef37b44255378dc49c5a4cae709ea3485165a149b4a733d2c76efca5b9af9ea34342fecd68b2f22c7d563da5c4e5206638d88f2b13480cc62d18a56960eae5848ce", - "9b1eb2c736f96b1335291e191ab00c801e05ba61c8991dc9254f687ef2b84672cac1655435b03aec8c6f8aa8c6798e0591da0aae699f9c6b23baf1b7865558e31db842439560a70ce333a273d4da9b37dbcf3289b790c1c043355fec8cc50a591d51e55b553ea3a4056d627a2e5b2cedddeec238d8442727bcf0db459e604d7612ba32779614365afdfd645a8b3fa517d8bee890187cfd448ecaaffc423f23e75e4d60fbae27377187a09ee9d933ce06071ccaf012aae0f0347dc3256fc3301b1f97bf8466cbf7dda8442d7f7af37c324e7532df509e2acc352e47692e484eeb345318abde99a7db7b9fee2a33d5938d1b000005448279939b157df31751ba85e9761e56d960409a891124141f1ff5a17095c85d02675b0d9dfbe7a5bb39183c4c3d78cad0829883f6c1f520ec2808c73aa5446dd7c86fa6e62df1e1a69033d40d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" - ] - ], - "public_share": "2fecd68b2f22c7d563da5c4e5206638d88f2b13480cc62d18a56960eae5848ce40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261244503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001a785a976259a56ae8545d25e052340eb42df29fc6dd5f7a7c2b73b4dab6529ad6474e50e7f2da3b37b4d73776a9ff5ad21dc3e54cd105e84f6ac65d9a756a62eb74c7f8f07913500787e86362eaafe41991d7bf6e0d9e2238f4ad039be13d7b81d9b2f7286791ef0e2489534b4c3c45768133a889ea2d927558d693aed7579981be372640ec8de6ad058e146a94d8209943db7fb7cc744f74656c6a875654f22e7a92feb75933a9881f570d5cb2e8e55cf8bc0f1a77719131969ed8806bdac47ad04543e5b7c67ec0011b1a3e85a3744be567d6de453af3b7ec5adf294ab21b49368738a3c8fd89820eaafbe94cbfb75ad23684d519da66012bc1d0ce4e3c00726a711d9d296eca051d607f400333dab204f8bff8c64ad442b7f03cabde2bd1e7c9ec68c7517ac5f404c3fbc374ca126b7181ac8b9bde3288b274411c2052a9275e6a2e1ec4d751cd99f0da092775f27acb69e882b53cb723ee93898f7630f712dcb06f3d72eec8ec68725eaf5d5c2226bb079a57e88ba1b127981786d7b05cbe1e8b0adbd35c774888228149863a21fcd946c5629ace0825e82460d29d53fe1bcc18662a6bdc78194ff64ffe67e6874cd4dabd7ec512227b939d0994eabb18b0bcff1194ef9107849d40691a560e40492f0095f51e4cd1e834d0a7d1542d7e8da1808f6138cc78f0a2498e8bc0e56d87404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 17, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e720f2d625ee3cabce61d583c8c4054e", - "82e8487025764348020264792b3d100f", - "0c8c76f65caf04ee0e22373be0d61ac5", - "fa6e2f2866078b31b90537e24416fad1", - "2aa44b74bb71c2548b15f78fb0d8a308", - "6fac2e4faa9a82029b9d39b72ec7a5a4", - "869eba63651472a34e9ac8faae398421", - "5d731a67081c36c4ff2a7130e611df5e", - "bb57ffcc3c44370131c88e16f74ad73e", - "c6a27c9c6c632820ba2ced4b0061bac1", - "83c43194cb8dd492735c763e54b8db10", - "143d28498127fcc54acce837c1d7f095", - "5c852ea368195f3a075cff32745e4c36", - "c68a06c8e5f6692f7668fc0688ee7b2f", - "cd1be9e341e8eb5fb5b976d4058a686f", - "56a1ed418b617499bd004287334052b4", - "b479ae311ef97b5fbdf7c285dbbd0261", - "244503e68f2902b94115adfcd6639945", - "c28b47c7ad2575473a55ff0d299326b7", - "e6f80364a4449715a002f0b0a84952fd", - "a92ed45cfe7bbd2cd7ba34a5ce185126", - "8c2a8852c64e0abd11500fe8c87c1bf3", - "d5e8a41b2794a64e56c44655aa8aa137", - "1984ca99584500a1b6d769b2d74409a3", - "c5718952c1bfb854e7a85c2a198afea1", - "5227b1172005f3b1b682767ef22a3a3b", - "1c6251cb9c4527426a4e48171c6cadf6", - "45573fefda9aed7e3548849f846481a6", - "ecac7d36be0e38ef28f6ae28909d229d", - "556a44cdbb4fa61bdb8f627c062b161b", - "c679640feee4c3d7584d20a6eb475f66", - "35680f4a6321ed9c0031f0523632dba7", - "2c349963f6f0a58f982b347d76388501", - "f6f0c16440230782fbb68c3605e94e1b", - "e01d6a321a353eeda86bbc36b2b89898", - "3cb994f99ebfd6d28a0c716e1a4710f1", - "3fad98148a00b7faf3c48c49cfbdb40f", - "bffe0b3167d2e01c8f227a0631843a94", - "eff15a613db675eeff55e451c37498fa", - "a4cf50c7cf5b51ff9e09715da14773e0", - "3a66869191058c64353056836665327b", - "74321e0a1191bf4f400d5e315548da71", - "08e40f80bea56f282d0d338e61449e9e", - "66b0d7b25e0735987966a4a7d1d1d092", - "34b74fed0bbf6fc996ad703dbf95cbc8", - "48d4d646f2cdc06fd956eb87de7fb213", - "431206b92387190aff870f4259a840de", - "9fd788a97451affebb1d2b65143c6107", - "d7a8e35b7a63905c9e16071d38ab6524", - "51e4c156fe074362bfe672079ee42e2a", - "264224d4c3090ae182088617fe2a87d4", - "93f6ebd36672456b3014d4c1bcafc105", - "ec77f9bedf1a62a7a82ef70396c5f767", - "dbd98873567275fac01a901016f214a2", - "768a06e71ae20736fb5f974a8efe8760", - "f4dc7e87f8223b451658ca0ef1ffa005", - "2637d542f00af9813a344a82ab700842", - "3f2be235dff4d6e37b055f8f5b78fe51", - "a994bfacdcbae1faabe006ac32a9ccf6", - "9d1e1d721fae8055c3f58392bd8200ed", - "d08cde43b01a6fe803f496d8beb595ef", - "1a121ed89f5cce5fb7f116c7bcfa1842", - "bd64fffe2ee5e89610d6e5fc6ff7b2e6", - "0c409a6a7bc15045a728a079c9d45368", - "2fa0907b916e3188ddae01baefa5521c", - "c966c6b9585fb4e68402792fc93e73b9", - "69f7e63743d20c2fd91bfcb938f342c2", - "985b8e1a19c25b7a2f002b236230dbce", - "bfae1a7b7d0940a193a5dec0edf39370", - "fa58d7ae88ed2afa51b60f2e70921814", - "9309753919e224d11b4804e1caf0254c", - "cee0a777b606f35aeb11831984019766", - "1afecb632982d79bd6ed52b743dfb0ef", - "62eecd1b7f94381c1acaaa007be45bd0", - "b7dec4325cc318b948c7302c5aad28d2", - "e4f8579ff92cfcc3c3a18f29386fc66a", - "e0b0b3990121c1aee83746f1a55a4aed", - "489fec02985c24cad582ebec7ba6c44d", - "2bf2c3e83071329ade2191d73b449ae8", - "7b408fead07c01593eae70c786f039d8", - "abf4a366e8e5571d0ebb06b7cc707a2e", - "c5306e3f76e97fab3a6c6dd975e74348", - "b8d4995868712714e3d10b74902a9d0c", - "d13b6b91b4347dc5af4d60ddea0e76bd", - "f4fd9815cd504434c9981d28bcf1bb22", - "ae66815774d4f003537d951a24a12c0a", - "e48218c6d31e954fe20f4334e0495d47", - "4950504fc9635cf5715c8efa06f93a81", - "67bc4607ebcc6e850c6aced635935b2f", - "354a4d2eff9c71cdd39798dffe596115", - "d89e901a43e0fabffd3f554f066c8212", - "add01fa47f79033aa175f4f8033057c4", - "f481381f3db1b5d9b2fd72e27aaecd2a", - "6568e5a724e4a699e89c287162eb44bb", - "f35efa71772f4fbb2650bd93ae4aa3a5", - "3192069c0734b4e9742e52955c819090", - "f3106af780bdd564036ddda405fe0a9e", - "9540e5787b7a3fde839f2375e091e63d", - "a54d6036c1bc50bf16efd6d198a0ff7d", - "df8c6d791d85ed885a53ecdee10ce40d" - ], - [ - "1adf0d29da11c354159e2a7c373bfab1", - "7f17b78fda89bcb7e1fd9b86d4c2eff0", - "f5738909a350fb11d5ddc8c41f29e53a", - "0791d0d799f874ce2afac81dbbe9052e", - "d75bb48b448e3dab58ea08704f275cf7", - "9253d1b055657dfd4862c648d1385a5b", - "7b61459c9aeb8d5c9565370551c67bde", - "a48ce598f7e3c93be4d48ecf19ee20a1", - "46a80033c3bbc8feb23771e908b528c1", - "3b5d8363939cd7df29d312b4ff9e453e", - "7e3bce6b34722b6d70a389c1ab4724ef", - "edc2d7b67ed8033a993317c83e280f6a", - "a57ad15c97e6a0c5dca300cd8ba1b3c9", - "3b75f9371a0996d06d9703f9771184d0", - "34e4161cbe1714a02e46892bfa759790", - "ab5e12be749e8b6626ffbd78ccbfad4b", - "4d8651cee10684a026083d7a2442fd9e", - "debafc1970d6fd46a2ea5203299c66ba", - "3f74b83852da8ab8a9aa00f2d66cd948", - "1b07fc9b5bbb68ea43fd0f4f57b6ad02", - "58d12ba3018442d30c45cb5a31e7aed9", - "75d577ad39b1f542d2aff0173783e40c", - "2c175be4d86b59b18d3bb9aa55755ec8", - "e87b3566a7baff5e2d28964d28bbf65c", - "3c8e76ad3e4047abfc56a3d5e675015e", - "afd84ee8dffa0c4e2d7d89810dd5c5c4", - "e59dae3463bad8bd79b1b7e8e3935209", - "bca8c01025651281aeb77b607b9b7e59", - "155382c941f1c710bb0951d76f62dd62", - "ac95bb3244b059e408709d83f9d4e9e4", - "3b869bf0111b3c288bb2df5914b8a099", - "cc97f0b59cde1263e3ce0fadc9cd2458", - "d5cb669c090f5a704bd4cb8289c77afe", - "0b0f3e9bbfdcf87de84873c9fa16b1e4", - "21e295cde5cac1123b9443c94d476767", - "c5466b066140292d59f38e91e5b8ef0e", - "c25267eb75ff4805f03a73b630424bf0", - "4201f4ce982d1fe354dd85f9ce7bc56b", - "120ea59ec2498a11e4a91bae3c8b6705", - "5d30af3830a4ae0045f68ea25eb88c1f", - "c799796e6efa739baecfa97c999acd84", - "8dcde1f5ee6e40b0a3f2a1ceaab7258e", - "f91bf07f415a90d7b6f2cc719ebb6161", - "9b4f284da1f8ca676a995b582e2e2f6d", - "cd48b012f44090364d528fc2406a3437", - "b92b29b90d323f900aa9147821804dec", - "beedf946dc78e6f5e477f0bda657bf21", - "622877568bae500128e2d49aebc39ef8", - "2a571ca4859c6fa345e9f8e2c7549adb", - "b01b3ea901f8bc9d24198df8611bd1d5", - "dbbddb2b3cf6f51e61f779e801d5782b", - "6e09142c998dba94b3eb2b3e43503efa", - "1588064120e59d583bd108fc693a0898", - "2626778ca98d8a0523e56fefe90deb5d", - "8b75f918e51df8c9e89f68b57101789f", - "0d23817807ddc4bacda735f10e005ffa", - "dbc82abd0ff5067ea9cbb57d548ff7bd", - "c2d41dca200b291c68faa070a48701ae", - "586b405323451e05381ff953cd563309", - "64e1e28de0517faa200a7c6d427dff12", - "317321bc4fe59017e00b6927414a6a10", - "e7ede12760a331a02c0ee9384305e7bd", - "449b0001d11a1769d3291a0390084d19", - "f5bf6595843eafba3cd75f86362bac97", - "d25f6f846e91ce770651fe45105aade3", - "38993946a7a04b195ffd86d036c18c46", - "980819c8bc2df3d00ae40346c70cbd3d", - "69a471e5e63da485b4ffd4dc9dcf2431", - "4251e58482f6bf5e505a213f120c6c8f", - "07a728517712d5059249f0d18f6de7eb", - "6ef68ac6e61ddb2ec8b7fb1e350fdab3", - "331f588849f90ca5f8ed7ce67bfe6899", - "e701349cd67d28640d12ad48bc204f10", - "9f1132e4806bc7e3c93555ff841ba42f", - "4a213bcda33ce7469b38cfd3a552d72d", - "1d07a86006d3033c205e70d6c7903995", - "214f4c66fede3e51fbc7b90e5aa5b512", - "b96013fd67a3db350e7d141384593bb2", - "d60d3c17cf8ecd6505de6e28c4bb6517", - "86bf70152f83fea6a5518f38790fc627", - "560b5c99171aa8e2d544f948338f85d1", - "3ccf91c089168054a99392268a18bcb7", - "492b66a7978ed8eb002ef48b6fd562f3", - "30c4946e4bcb823a34b29f2215f18942", - "0d0267ea32afbbcb1a67e2d7430e44dd", - "53997ea88b2b0ffc90826ae5db5ed3f5", - "1d7de7392ce16ab001f0bccb1fb6a2b8", - "b8afafb0369ca30a72a37105f906c57e", - "9a43b9f81433917ad7953129ca6ca4d0", - "ccb5b2d100638e321068672001a69eea", - "29616fe5bc1f0540e6bfaab0f9937ded", - "542fe05b8086fcc5428a0b07fccfa83b", - "0d7ec7e0c24e4a2631028d1d855132d5", - "9c971a58db1b5966fb62d78e9d14bb44", - "0ea1058e88d0b044bdaf426c51b55c5a", - "d06df963f8cb4b166fd1ad6aa37e6f6f", - "0eef95087f422a9be092225bfa01f561", - "6cbf1a878485c0216060dc8a1f6e19c2", - "5cb29fc93e43af40cd10292e675f0082", - "22739286e27a127789ac13211ef31bf2" - ] - ], - "prep_messages": [ - "baef7355f66644fe751d36705981dfacf26c987691c76409c848808bdff226f2" - ], - "prep_shares": [ - [ - "66e14d38c90694ecaed6e1e6e54ff37fa2196c3106d421c1951bae3b75e1e0c1ae6456b732d066ab74d4f2da6dcaa249b8a39312c2b26c426fc71b6d8a27b0a956cc565ec94950085319139daef295688de0e8fef0420811156670019b67583b1771b890a81981bd862ff9eb352d2c7a16b7131e254fad27c3aa073ba1a21190388813e1976784d821d2babaedcd760d9e251bc0442029a5e82cf338cfd31cbbeca51216da0b13cd6c9c7978189efda72e734f48def48e3afbe610f55d131a972b6143d62e4e1229aa7f5ea7853901c671bc334e444ad084b6f3b54b0d18b4e63521e9a9f0eb93b2a26dbdf9654d6c68bb7f9f61b6d16cef2972ae3421f6c47470707f9adc16da4a980e632f64377a5e5fcc4d8ec24afe5a4fb34fddbd79fd82db7b5dead163e4ce99128251a44a64762312440d0f878486adf5a925baf613fa8bc37948a39bc02ee7a80168be082b462498ad784d9a7a6c9ab8ef92028d1b3ad6b284d1755b860b5ec7195f6ec52c9e940fa71e761c80b2060cf9aeb681f373", - "9b1eb2c736f96b1335291e191ab00c804a36096ec2b0868567f62505dbe6645fcac1655435b03aec8c6f8aa8c6798e05d189d1ae8a276b024a02b47ff94dc56b1db842439560a70ce333a273d4da9b37527b73cd4e8bb6566385ee473bce503d1d51e55b553ea3a4056d627a2e5b2ced002dc028d3bf26624354d683a107554512ba32779614365afdfd645a8b3fa517f0a7e3ead5b4834f7bd59d9f88f087685e4d60fbae27377187a09ee9d933ce062b6a80c7c985776871893b7a13a3ff081f97bf8466cbf7dda8442d7f7af37c321c23faf75059b26996ca192126473568345318abde99a7db7b9fee2a33d5938d601b30f3d41d8b55c7f087fa5ba5a10fe9761e56d960409a891124141f1ff5a10f70b2ddcd7df46f9ebb2899acbb5af34c3d78cad0829883f6c1f520ec2808c7b930522a8eff53a8d98d8d4baa9e44d10d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" - ] - ], - "public_share": "d6b284d1755b860b5ec7195f6ec52c9e940fa71e761c80b2060cf9aeb681f37340ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7109e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001a06bf37862adea5bddcb77042b1735aaf2f6c899b7fd125ac3573513e3c7460b729bc674b9bafd3e8f9ef9a7db45a3c246462a6d7b4add7047df653b7a5a2ca02859c83a4c28695d82f12b4f7fe7f286a824a027b516857688ddf7f615e40817471f3c37abded4f51d58fab456ee0e0a72ae10f9316f2599ae0e2e7b221db4bbfd2f32a6eb860729a125dc504a640f9396767511aad9f91bcd3c36b8765d25e6fafcbdf34c1416882cd79d9464ac2850d2bb27f8e5f64902dbbdeb7b3f0d8afb95132020792359690002ac258773cc87fa47ae8441aecf28413a66505b00d3a4e7905259803966520fcf0cf940742ace4d23684d519da66012bc1d0ce4e3c0072dc0c7d7958358f30950534dea4f38db7017ed62325d92813c9f09f47590a0b07e67e5163a9a52d43dbaa98bc696f311929e2eb00b83643d3bb444bffef1941104d95a36a7b640cfcf0c68a7412a5ae2adaf6a576717282f354620dc9f92df11f4570a3eb1b9268aa9b6b06b53bb886f4125a324ebcc7d98c9f8bc3818d2daa8009cf05ad078aeb5b9753d0ae74d2485bb6baf3ffb9a3c6dc5dcd5ed28ed591db97df84ad03ceb91fa1d38313d00ce89ba1e54d0add1f237f6e5d2a6165bd2d713b1353721523f0b39e31c1ff6375ec1470ed828f4a9ad11b0e8521f6eed15f885f02a36cfd339d529902bae0056379fd404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 42, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e720f2d625ee3cabce61d583c8c4054e", - "82e8487025764348020264792b3d100f", - "0c8c76f65caf04ee0e22373be0d61ac5", - "fa6e2f2866078b31b90537e24416fad1", - "2aa44b74bb71c2548b15f78fb0d8a308", - "6fac2e4faa9a82029b9d39b72ec7a5a4", - "869eba63651472a34e9ac8faae398421", - "5d731a67081c36c4ff2a7130e611df5e", - "bb57ffcc3c44370131c88e16f74ad73e", - "c6a27c9c6c632820ba2ced4b0061bac1", - "83c43194cb8dd492735c763e54b8db10", - "143d28498127fcc54acce837c1d7f095", - "5c852ea368195f3a075cff32745e4c36", - "c68a06c8e5f6692f7668fc0688ee7b2f", - "cd1be9e341e8eb5fb5b976d4058a686f", - "56a1ed418b617499bd004287334052b4", - "b479ae311ef97b5fbdf7c285dbbd0261", - "234503e68f2902b94115adfcd6639945", - "c28b47c7ad2575473a55ff0d299326b7", - "e6f80364a4449715a002f0b0a84952fd", - "a92ed45cfe7bbd2cd7ba34a5ce185126", - "8c2a8852c64e0abd11500fe8c87c1bf3", - "d5e8a41b2794a64e56c44655aa8aa137", - "1984ca99584500a1b6d769b2d74409a3", - "c5718952c1bfb854e7a85c2a198afea1", - "5227b1172005f3b1b682767ef22a3a3b", - "1c6251cb9c4527426a4e48171c6cadf6", - "45573fefda9aed7e3548849f846481a6", - "ecac7d36be0e38ef28f6ae28909d229d", - "556a44cdbb4fa61bdb8f627c062b161b", - "c679640feee4c3d7584d20a6eb475f66", - "35680f4a6321ed9c0031f0523632dba7", - "2c349963f6f0a58f982b347d76388501", - "f6f0c16440230782fbb68c3605e94e1b", - "e01d6a321a353eeda86bbc36b2b89898", - "3cb994f99ebfd6d28a0c716e1a4710f1", - "3fad98148a00b7faf3c48c49cfbdb40f", - "bffe0b3167d2e01c8f227a0631843a94", - "eff15a613db675eeff55e451c37498fa", - "a4cf50c7cf5b51ff9e09715da14773e0", - "3a66869191058c64353056836665327b", - "74321e0a1191bf4f400d5e315548da71", - "09e40f80bea56f282d0d338e61449e9e", - "66b0d7b25e0735987966a4a7d1d1d092", - "34b74fed0bbf6fc996ad703dbf95cbc8", - "48d4d646f2cdc06fd956eb87de7fb213", - "431206b92387190aff870f4259a840de", - "9fd788a97451affebb1d2b65143c6107", - "d7a8e35b7a63905c9e16071d38ab6524", - "51e4c156fe074362bfe672079ee42e2a", - "264224d4c3090ae182088617fe2a87d4", - "93f6ebd36672456b3014d4c1bcafc105", - "ec77f9bedf1a62a7a82ef70396c5f767", - "dbd98873567275fac01a901016f214a2", - "768a06e71ae20736fb5f974a8efe8760", - "f4dc7e87f8223b451658ca0ef1ffa005", - "2637d542f00af9813a344a82ab700842", - "3f2be235dff4d6e37b055f8f5b78fe51", - "a994bfacdcbae1faabe006ac32a9ccf6", - "9d1e1d721fae8055c3f58392bd8200ed", - "d08cde43b01a6fe803f496d8beb595ef", - "1a121ed89f5cce5fb7f116c7bcfa1842", - "bd64fffe2ee5e89610d6e5fc6ff7b2e6", - "0c409a6a7bc15045a728a079c9d45368", - "2fa0907b916e3188ddae01baefa5521c", - "c966c6b9585fb4e68402792fc93e73b9", - "69f7e63743d20c2fd91bfcb938f342c2", - "985b8e1a19c25b7a2f002b236230dbce", - "bfae1a7b7d0940a193a5dec0edf39370", - "fa58d7ae88ed2afa51b60f2e70921814", - "9309753919e224d11b4804e1caf0254c", - "cee0a777b606f35aeb11831984019766", - "1afecb632982d79bd6ed52b743dfb0ef", - "62eecd1b7f94381c1acaaa007be45bd0", - "b7dec4325cc318b948c7302c5aad28d2", - "e4f8579ff92cfcc3c3a18f29386fc66a", - "e0b0b3990121c1aee83746f1a55a4aed", - "489fec02985c24cad582ebec7ba6c44d", - "2bf2c3e83071329ade2191d73b449ae8", - "7b408fead07c01593eae70c786f039d8", - "abf4a366e8e5571d0ebb06b7cc707a2e", - "c5306e3f76e97fab3a6c6dd975e74348", - "b8d4995868712714e3d10b74902a9d0c", - "d13b6b91b4347dc5af4d60ddea0e76bd", - "f4fd9815cd504434c9981d28bcf1bb22", - "ae66815774d4f003537d951a24a12c0a", - "e48218c6d31e954fe20f4334e0495d47", - "4950504fc9635cf5715c8efa06f93a81", - "67bc4607ebcc6e850c6aced635935b2f", - "354a4d2eff9c71cdd39798dffe596115", - "d89e901a43e0fabffd3f554f066c8212", - "add01fa47f79033aa175f4f8033057c4", - "f481381f3db1b5d9b2fd72e27aaecd2a", - "6568e5a724e4a699e89c287162eb44bb", - "f35efa71772f4fbb2650bd93ae4aa3a5", - "3192069c0734b4e9742e52955c819090", - "f3106af780bdd564036ddda405fe0a9e", - "9540e5787b7a3fde839f2375e091e63d", - "a54d6036c1bc50bf16efd6d198a0ff7d", - "df8c6d791d85ed885a53ecdee10ce40d" - ], - [ - "1adf0d29da11c354159e2a7c373bfab1", - "7f17b78fda89bcb7e1fd9b86d4c2eff0", - "f5738909a350fb11d5ddc8c41f29e53a", - "0791d0d799f874ce2afac81dbbe9052e", - "d75bb48b448e3dab58ea08704f275cf7", - "9253d1b055657dfd4862c648d1385a5b", - "7b61459c9aeb8d5c9565370551c67bde", - "a48ce598f7e3c93be4d48ecf19ee20a1", - "46a80033c3bbc8feb23771e908b528c1", - "3b5d8363939cd7df29d312b4ff9e453e", - "7e3bce6b34722b6d70a389c1ab4724ef", - "edc2d7b67ed8033a993317c83e280f6a", - "a57ad15c97e6a0c5dca300cd8ba1b3c9", - "3b75f9371a0996d06d9703f9771184d0", - "34e4161cbe1714a02e46892bfa759790", - "ab5e12be749e8b6626ffbd78ccbfad4b", - "4d8651cee10684a026083d7a2442fd9e", - "debafc1970d6fd46a2ea5203299c66ba", - "3f74b83852da8ab8a9aa00f2d66cd948", - "1b07fc9b5bbb68ea43fd0f4f57b6ad02", - "58d12ba3018442d30c45cb5a31e7aed9", - "75d577ad39b1f542d2aff0173783e40c", - "2c175be4d86b59b18d3bb9aa55755ec8", - "e87b3566a7baff5e2d28964d28bbf65c", - "3c8e76ad3e4047abfc56a3d5e675015e", - "afd84ee8dffa0c4e2d7d89810dd5c5c4", - "e59dae3463bad8bd79b1b7e8e3935209", - "bca8c01025651281aeb77b607b9b7e59", - "155382c941f1c710bb0951d76f62dd62", - "ac95bb3244b059e408709d83f9d4e9e4", - "3b869bf0111b3c288bb2df5914b8a099", - "cc97f0b59cde1263e3ce0fadc9cd2458", - "d5cb669c090f5a704bd4cb8289c77afe", - "0b0f3e9bbfdcf87de84873c9fa16b1e4", - "21e295cde5cac1123b9443c94d476767", - "c5466b066140292d59f38e91e5b8ef0e", - "c25267eb75ff4805f03a73b630424bf0", - "4201f4ce982d1fe354dd85f9ce7bc56b", - "120ea59ec2498a11e4a91bae3c8b6705", - "5d30af3830a4ae0045f68ea25eb88c1f", - "c799796e6efa739baecfa97c999acd84", - "8dcde1f5ee6e40b0a3f2a1ceaab7258e", - "f91bf07f415a90d7b6f2cc719ebb6161", - "9b4f284da1f8ca676a995b582e2e2f6d", - "cd48b012f44090364d528fc2406a3437", - "b92b29b90d323f900aa9147821804dec", - "beedf946dc78e6f5e477f0bda657bf21", - "622877568bae500128e2d49aebc39ef8", - "2a571ca4859c6fa345e9f8e2c7549adb", - "b01b3ea901f8bc9d24198df8611bd1d5", - "dbbddb2b3cf6f51e61f779e801d5782b", - "6e09142c998dba94b3eb2b3e43503efa", - "1588064120e59d583bd108fc693a0898", - "2626778ca98d8a0523e56fefe90deb5d", - "8b75f918e51df8c9e89f68b57101789f", - "0d23817807ddc4bacda735f10e005ffa", - "dbc82abd0ff5067ea9cbb57d548ff7bd", - "c2d41dca200b291c68faa070a48701ae", - "586b405323451e05381ff953cd563309", - "64e1e28de0517faa200a7c6d427dff12", - "317321bc4fe59017e00b6927414a6a10", - "e7ede12760a331a02c0ee9384305e7bd", - "449b0001d11a1769d3291a0390084d19", - "f5bf6595843eafba3cd75f86362bac97", - "d25f6f846e91ce770651fe45105aade3", - "38993946a7a04b195ffd86d036c18c46", - "980819c8bc2df3d00ae40346c70cbd3d", - "69a471e5e63da485b4ffd4dc9dcf2431", - "4251e58482f6bf5e505a213f120c6c8f", - "07a728517712d5059249f0d18f6de7eb", - "6ef68ac6e61ddb2ec8b7fb1e350fdab3", - "331f588849f90ca5f8ed7ce67bfe6899", - "e701349cd67d28640d12ad48bc204f10", - "9f1132e4806bc7e3c93555ff841ba42f", - "4a213bcda33ce7469b38cfd3a552d72d", - "1d07a86006d3033c205e70d6c7903995", - "214f4c66fede3e51fbc7b90e5aa5b512", - "b96013fd67a3db350e7d141384593bb2", - "d60d3c17cf8ecd6505de6e28c4bb6517", - "86bf70152f83fea6a5518f38790fc627", - "560b5c99171aa8e2d544f948338f85d1", - "3ccf91c089168054a99392268a18bcb7", - "492b66a7978ed8eb002ef48b6fd562f3", - "30c4946e4bcb823a34b29f2215f18942", - "0d0267ea32afbbcb1a67e2d7430e44dd", - "53997ea88b2b0ffc90826ae5db5ed3f5", - "1d7de7392ce16ab001f0bccb1fb6a2b8", - "b8afafb0369ca30a72a37105f906c57e", - "9a43b9f81433917ad7953129ca6ca4d0", - "ccb5b2d100638e321068672001a69eea", - "29616fe5bc1f0540e6bfaab0f9937ded", - "542fe05b8086fcc5428a0b07fccfa83b", - "0d7ec7e0c24e4a2631028d1d855132d5", - "9c971a58db1b5966fb62d78e9d14bb44", - "0ea1058e88d0b044bdaf426c51b55c5a", - "d06df963f8cb4b166fd1ad6aa37e6f6f", - "0eef95087f422a9be092225bfa01f561", - "6cbf1a878485c0216060dc8a1f6e19c2", - "5cb29fc93e43af40cd10292e675f0082", - "22739286e27a127789ac13211ef31bf2" - ] - ], - "prep_messages": [ - "f1bd870009988050f4ef94cdeeb766a2311f7e59f1f3ca0efd4ec7334d439314" - ], - "prep_shares": [ - [ - "66e14d38c90694ecaed6e1e6e54ff37f144c5c68db22629297bcd826fb529288ae6456b732d066ab74d4f2da6dcaa249a6da44a507c53b943e0f77e8e4b4b15956cc565ec94950085319139daef2956849da90a79b6e54d488aae905f16d67501123dd856722e6b3ffdb9d0fc0fa3cc824d506ce843469f16c35d57de5d01b75388813e1976784d821d2babaedcd760db4935cd97da241e35e720387dd8721feeca51216da0b13cd6c9c7978189efda71d20eff4cd3c0e1f4c9ed2d3ac0c49c62b6143d62e4e1229aa7f5ea7853901c641b7558cda57f9d4b5cb36b5d0b9af1e3521e9a9f0eb93b2a26dbdf9654d6c682ab96dc5cb93b5b007e36d08f0f1f51e70a03cdeee9719af30cf68bd18cf728a10302f2ad0eb70b76df1703e692f854bdb7b5dead163e4ce99128251a44a6476ba4367b0e3c675c70bfdeaaea65123958bc37948a39bc02ee7a80168be082b46ef1f787cc439e143cb4442f818ea6fcf67199ce6418d9555c9cfe6e4ba826631ea5379d4235d8113e9a364960d6c742e", - "9b1eb2c736f96b1335291e191ab00c80d8031937ed6146b46555fb195575b398cac1655435b03aec8c6f8aa8c6798e05e352201c45159cb07aba58049fc0c3bb1db842439560a70ce333a273d4da9b37508e897f49f6c4a906b355a6810564bc1d51e55b553ea3a4056d627a2e5b2cedf20ecd7873da6a9899c908415dd94a6012ba32779614365afdfd645a8b3fa517da39a2d19c326b1105908d517a3c83255e4d60fbae27377187a09ee9d933ce063dbde01ada3df88304d2799bc4a9d0d91f97bf8466cbf7dda8442d7f7af37c324b28d8b9ba4b8919b3f298b762a53930345318abde99a7db7b9fee2a33d5938d76dfa4acbf77b93a48cb724e759b6506e9761e56d960409a891124141f1ff5a15d0cd141c0dc81139c7d07380106d32a4c3d78cad0829883f6c1f520ec2808c721ff2e87b9bf626797864cc2bd4335360d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" - ] - ], - "public_share": "67199ce6418d9555c9cfe6e4ba826631ea5379d4235d8113e9a364960d6c742e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e820f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001ad93e89cf70b750049d40bf4f5f5703784a5d5a60d7918cafb4415a98d9dc69dee763053753e06b715ebdd2bf303fd0791c77038ca967c886722fd5c76f65091139160af6525d206b6c8aea3f08d866ba4b0254d20b231f4f3eae6358fdfc94dbb43cf964e343f06614dc433770765b3bd75395f8d8759c1e79535686ee0aa06ef60f3735629bfdd883c4461496439d5aea53039970021213373e401bd16705c50e97b76c6532d8bf0fc04489d7ae2090b084cee663c1fd87cf57d40f9da1dd035236a8f76dc9c52aa5a2de290316b81f8bcb800861619f6dd87afb591b0c4748cada2ac5e756842f416cdfa2f3007807d23684d519da66012bc1d0ce4e3c0072098d2b30125ce4e9d47ce5d0f60fe5eee78c055fcd18c20f2e2297edbba101e029d7b377f17495ba5add607aed8a9dc371cd8e4cc37c5251c60bcaee255702029a1b1d19eb8d8169984e542c094d70da123f541fb7b7ba0c889329d25a71ddb801276e01f63bc894781f6ec339220c6165e7ace8f9439708071b55aec0fd55d1e5b2f9e55d4f601d26ec4e9f84cfa43a33ce4181f6404686fa528a3e2340eb853814ad755fdd49e25e8d18d142204d191b13ffb1d8c2b52476e40d05b9f4ff263a0fad81398fc019fab8a42ed89bfc74899ceacb0325253349b08ba183d3528e0d2d9d3f19737e437087aad219a4adda404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 0, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e820f2d625ee3cabce61d583c8c4054e", - "82e8487025764348020264792b3d100f", - "0c8c76f65caf04ee0e22373be0d61ac5", - "fa6e2f2866078b31b90537e24416fad1", - "2aa44b74bb71c2548b15f78fb0d8a308", - "6fac2e4faa9a82029b9d39b72ec7a5a4", - "869eba63651472a34e9ac8faae398421", - "5d731a67081c36c4ff2a7130e611df5e", - "bb57ffcc3c44370131c88e16f74ad73e", - "c6a27c9c6c632820ba2ced4b0061bac1", - "83c43194cb8dd492735c763e54b8db10", - "143d28498127fcc54acce837c1d7f095", - "5c852ea368195f3a075cff32745e4c36", - "c68a06c8e5f6692f7668fc0688ee7b2f", - "cd1be9e341e8eb5fb5b976d4058a686f", - "56a1ed418b617499bd004287334052b4", - "b479ae311ef97b5fbdf7c285dbbd0261", - "234503e68f2902b94115adfcd6639945", - "c28b47c7ad2575473a55ff0d299326b7", - "e6f80364a4449715a002f0b0a84952fd", - "a92ed45cfe7bbd2cd7ba34a5ce185126", - "8c2a8852c64e0abd11500fe8c87c1bf3", - "d5e8a41b2794a64e56c44655aa8aa137", - "1984ca99584500a1b6d769b2d74409a3", - "c5718952c1bfb854e7a85c2a198afea1", - "5227b1172005f3b1b682767ef22a3a3b", - "1c6251cb9c4527426a4e48171c6cadf6", - "45573fefda9aed7e3548849f846481a6", - "ecac7d36be0e38ef28f6ae28909d229d", - "556a44cdbb4fa61bdb8f627c062b161b", - "c679640feee4c3d7584d20a6eb475f66", - "35680f4a6321ed9c0031f0523632dba7", - "2c349963f6f0a58f982b347d76388501", - "f6f0c16440230782fbb68c3605e94e1b", - "e01d6a321a353eeda86bbc36b2b89898", - "3cb994f99ebfd6d28a0c716e1a4710f1", - "3fad98148a00b7faf3c48c49cfbdb40f", - "bffe0b3167d2e01c8f227a0631843a94", - "eff15a613db675eeff55e451c37498fa", - "a4cf50c7cf5b51ff9e09715da14773e0", - "3a66869191058c64353056836665327b", - "74321e0a1191bf4f400d5e315548da71", - "08e40f80bea56f282d0d338e61449e9e", - "66b0d7b25e0735987966a4a7d1d1d092", - "34b74fed0bbf6fc996ad703dbf95cbc8", - "48d4d646f2cdc06fd956eb87de7fb213", - "431206b92387190aff870f4259a840de", - "9fd788a97451affebb1d2b65143c6107", - "d7a8e35b7a63905c9e16071d38ab6524", - "51e4c156fe074362bfe672079ee42e2a", - "264224d4c3090ae182088617fe2a87d4", - "93f6ebd36672456b3014d4c1bcafc105", - "ec77f9bedf1a62a7a82ef70396c5f767", - "dbd98873567275fac01a901016f214a2", - "768a06e71ae20736fb5f974a8efe8760", - "f4dc7e87f8223b451658ca0ef1ffa005", - "2637d542f00af9813a344a82ab700842", - "3f2be235dff4d6e37b055f8f5b78fe51", - "a994bfacdcbae1faabe006ac32a9ccf6", - "9d1e1d721fae8055c3f58392bd8200ed", - "d08cde43b01a6fe803f496d8beb595ef", - "1a121ed89f5cce5fb7f116c7bcfa1842", - "bd64fffe2ee5e89610d6e5fc6ff7b2e6", - "0c409a6a7bc15045a728a079c9d45368", - "2fa0907b916e3188ddae01baefa5521c", - "c966c6b9585fb4e68402792fc93e73b9", - "69f7e63743d20c2fd91bfcb938f342c2", - "985b8e1a19c25b7a2f002b236230dbce", - "bfae1a7b7d0940a193a5dec0edf39370", - "fa58d7ae88ed2afa51b60f2e70921814", - "9309753919e224d11b4804e1caf0254c", - "cee0a777b606f35aeb11831984019766", - "1afecb632982d79bd6ed52b743dfb0ef", - "62eecd1b7f94381c1acaaa007be45bd0", - "b7dec4325cc318b948c7302c5aad28d2", - "e4f8579ff92cfcc3c3a18f29386fc66a", - "e0b0b3990121c1aee83746f1a55a4aed", - "489fec02985c24cad582ebec7ba6c44d", - "2bf2c3e83071329ade2191d73b449ae8", - "7b408fead07c01593eae70c786f039d8", - "abf4a366e8e5571d0ebb06b7cc707a2e", - "c5306e3f76e97fab3a6c6dd975e74348", - "b8d4995868712714e3d10b74902a9d0c", - "d13b6b91b4347dc5af4d60ddea0e76bd", - "f4fd9815cd504434c9981d28bcf1bb22", - "ae66815774d4f003537d951a24a12c0a", - "e48218c6d31e954fe20f4334e0495d47", - "4950504fc9635cf5715c8efa06f93a81", - "67bc4607ebcc6e850c6aced635935b2f", - "354a4d2eff9c71cdd39798dffe596115", - "d89e901a43e0fabffd3f554f066c8212", - "add01fa47f79033aa175f4f8033057c4", - "f481381f3db1b5d9b2fd72e27aaecd2a", - "6568e5a724e4a699e89c287162eb44bb", - "f35efa71772f4fbb2650bd93ae4aa3a5", - "3192069c0734b4e9742e52955c819090", - "f3106af780bdd564036ddda405fe0a9e", - "9540e5787b7a3fde839f2375e091e63d", - "a54d6036c1bc50bf16efd6d198a0ff7d", - "df8c6d791d85ed885a53ecdee10ce40d" - ], - [ - "1adf0d29da11c354159e2a7c373bfab1", - "7f17b78fda89bcb7e1fd9b86d4c2eff0", - "f5738909a350fb11d5ddc8c41f29e53a", - "0791d0d799f874ce2afac81dbbe9052e", - "d75bb48b448e3dab58ea08704f275cf7", - "9253d1b055657dfd4862c648d1385a5b", - "7b61459c9aeb8d5c9565370551c67bde", - "a48ce598f7e3c93be4d48ecf19ee20a1", - "46a80033c3bbc8feb23771e908b528c1", - "3b5d8363939cd7df29d312b4ff9e453e", - "7e3bce6b34722b6d70a389c1ab4724ef", - "edc2d7b67ed8033a993317c83e280f6a", - "a57ad15c97e6a0c5dca300cd8ba1b3c9", - "3b75f9371a0996d06d9703f9771184d0", - "34e4161cbe1714a02e46892bfa759790", - "ab5e12be749e8b6626ffbd78ccbfad4b", - "4d8651cee10684a026083d7a2442fd9e", - "debafc1970d6fd46a2ea5203299c66ba", - "3f74b83852da8ab8a9aa00f2d66cd948", - "1b07fc9b5bbb68ea43fd0f4f57b6ad02", - "58d12ba3018442d30c45cb5a31e7aed9", - "75d577ad39b1f542d2aff0173783e40c", - "2c175be4d86b59b18d3bb9aa55755ec8", - "e87b3566a7baff5e2d28964d28bbf65c", - "3c8e76ad3e4047abfc56a3d5e675015e", - "afd84ee8dffa0c4e2d7d89810dd5c5c4", - "e59dae3463bad8bd79b1b7e8e3935209", - "bca8c01025651281aeb77b607b9b7e59", - "155382c941f1c710bb0951d76f62dd62", - "ac95bb3244b059e408709d83f9d4e9e4", - "3b869bf0111b3c288bb2df5914b8a099", - "cc97f0b59cde1263e3ce0fadc9cd2458", - "d5cb669c090f5a704bd4cb8289c77afe", - "0b0f3e9bbfdcf87de84873c9fa16b1e4", - "21e295cde5cac1123b9443c94d476767", - "c5466b066140292d59f38e91e5b8ef0e", - "c25267eb75ff4805f03a73b630424bf0", - "4201f4ce982d1fe354dd85f9ce7bc56b", - "120ea59ec2498a11e4a91bae3c8b6705", - "5d30af3830a4ae0045f68ea25eb88c1f", - "c799796e6efa739baecfa97c999acd84", - "8dcde1f5ee6e40b0a3f2a1ceaab7258e", - "f91bf07f415a90d7b6f2cc719ebb6161", - "9b4f284da1f8ca676a995b582e2e2f6d", - "cd48b012f44090364d528fc2406a3437", - "b92b29b90d323f900aa9147821804dec", - "beedf946dc78e6f5e477f0bda657bf21", - "622877568bae500128e2d49aebc39ef8", - "2a571ca4859c6fa345e9f8e2c7549adb", - "b01b3ea901f8bc9d24198df8611bd1d5", - "dbbddb2b3cf6f51e61f779e801d5782b", - "6e09142c998dba94b3eb2b3e43503efa", - "1588064120e59d583bd108fc693a0898", - "2626778ca98d8a0523e56fefe90deb5d", - "8b75f918e51df8c9e89f68b57101789f", - "0d23817807ddc4bacda735f10e005ffa", - "dbc82abd0ff5067ea9cbb57d548ff7bd", - "c2d41dca200b291c68faa070a48701ae", - "586b405323451e05381ff953cd563309", - "64e1e28de0517faa200a7c6d427dff12", - "317321bc4fe59017e00b6927414a6a10", - "e7ede12760a331a02c0ee9384305e7bd", - "449b0001d11a1769d3291a0390084d19", - "f5bf6595843eafba3cd75f86362bac97", - "d25f6f846e91ce770651fe45105aade3", - "38993946a7a04b195ffd86d036c18c46", - "980819c8bc2df3d00ae40346c70cbd3d", - "69a471e5e63da485b4ffd4dc9dcf2431", - "4251e58482f6bf5e505a213f120c6c8f", - "07a728517712d5059249f0d18f6de7eb", - "6ef68ac6e61ddb2ec8b7fb1e350fdab3", - "331f588849f90ca5f8ed7ce67bfe6899", - "e701349cd67d28640d12ad48bc204f10", - "9f1132e4806bc7e3c93555ff841ba42f", - "4a213bcda33ce7469b38cfd3a552d72d", - "1d07a86006d3033c205e70d6c7903995", - "214f4c66fede3e51fbc7b90e5aa5b512", - "b96013fd67a3db350e7d141384593bb2", - "d60d3c17cf8ecd6505de6e28c4bb6517", - "86bf70152f83fea6a5518f38790fc627", - "560b5c99171aa8e2d544f948338f85d1", - "3ccf91c089168054a99392268a18bcb7", - "492b66a7978ed8eb002ef48b6fd562f3", - "30c4946e4bcb823a34b29f2215f18942", - "0d0267ea32afbbcb1a67e2d7430e44dd", - "53997ea88b2b0ffc90826ae5db5ed3f5", - "1d7de7392ce16ab001f0bccb1fb6a2b8", - "b8afafb0369ca30a72a37105f906c57e", - "9a43b9f81433917ad7953129ca6ca4d0", - "ccb5b2d100638e321068672001a69eea", - "29616fe5bc1f0540e6bfaab0f9937ded", - "542fe05b8086fcc5428a0b07fccfa83b", - "0d7ec7e0c24e4a2631028d1d855132d5", - "9c971a58db1b5966fb62d78e9d14bb44", - "0ea1058e88d0b044bdaf426c51b55c5a", - "d06df963f8cb4b166fd1ad6aa37e6f6f", - "0eef95087f422a9be092225bfa01f561", - "6cbf1a878485c0216060dc8a1f6e19c2", - "5cb29fc93e43af40cd10292e675f0082", - "22739286e27a127789ac13211ef31bf2" - ] - ], - "prep_messages": [ - "774e1ebb45b1c0e11bf01b23d0a2f1822a68e27345e3f5ff256e9253dad417ad" - ], - "prep_shares": [ - [ - "66e14d38c90694ecaed6e1e6e54ff37f626cd891b3b1ffe20bacaa5741a9b19676678c90abe6b88bd2e821d21c7211c061da7b45ff16d851eb4ef88cc3f89ecd56cc565ec94950085319139daef295682a34ee3b89f4b71ca6e8bf5930ff033b1771b890a81981bd862ff9eb352d2c7a7f98b8e30631d46d75eda32a07f681fa388813e1976784d821d2babaedcd760dba72a20438b47e581667aed24ff37a22eca51216da0b13cd6c9c7978189efda7293867a3a10cde89e65ac695e94983832b6143d62e4e1229aa7f5ea7853901c6046e04bf993f1b75c67623131ff658f43521e9a9f0eb93b2a26dbdf9654d6c6859ebb4f2ba4cece36f8bd4d93ad9fb5970a03cdeee9719af30cf68bd18cf728ad26a549be48bd7203945fb904d6aed93db7b5dead163e4ce99128251a44a6476921b916493511ee254c5c44bd0793bcd8bc37948a39bc02ee7a80168be082b46ccbeeadfaa954a31a899367aed48f364225526ab0a748466845abda64883baf691a577e092b36c8178a3e3c4f7fecc79", - "9b1eb2c736f96b1335291e191ab00c80e550c1b959b141150218275087013144cac1655435b03aec8c6f8aa8c6798e052853e97b4dc3fff2cd7ad75fc07cd6471db842439560a70ce333a273d4da9b37b5276e90b6d9064bd2029fefa536a53d1d51e55b553ea3a4056d627a2e5b2ced984b1b63f1ddff1b75113a943bb4e4da12ba32779614365afdfd645a8b3fa517d35a5ca6e2202e9c699be20508d129015e4d60fbae27377187a09ee9d933ce0630a5686c066e2819861586d9876c961c1f97bf8466cbf7dda8442d7f7af37c3289712987fb6367798647ac591469905a345318abde99a7db7b9fee2a33d5938d48ad5d7fd0be8207c4220c7d2ab45fcbe9761e56d960409a891124141f1ff5a19cd1abd0ab3c1baab4297de51ccb6ae24c3d78cad0829883f6c1f520ec2808c74a2705d30935ba4c32be7225941b1dfe0d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" - ] - ], - "public_share": "225526ab0a748466845abda64883baf691a577e092b36c8178a3e3c4f7fecc7940ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e820f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001ad93e89cf70b750049d40bf4f5f5703784a5d5a60d7918cafb4415a98d9dc69dee763053753e06b715ebdd2bf303fd0791c77038ca967c886722fd5c76f65091139160af6525d206b6c8aea3f08d866ba4b0254d20b231f4f3eae6358fdfc94dbb43cf964e343f06614dc433770765b3bd75395f8d8759c1e79535686ee0aa06ef60f3735629bfdd883c4461496439d5aea53039970021213373e401bd16705c50e97b76c6532d8bf0fc04489d7ae2090b084cee663c1fd87cf57d40f9da1dd035236a8f76dc9c52aa5a2de290316b81f8bcb800861619f6dd87afb591b0c4748cada2ac5e756842f416cdfa2f3007807d23684d519da66012bc1d0ce4e3c0072098d2b30125ce4e9d47ce5d0f60fe5eee78c055fcd18c20f2e2297edbba101e029d7b377f17495ba5add607aed8a9dc371cd8e4cc37c5251c60bcaee255702029a1b1d19eb8d8169984e542c094d70da123f541fb7b7ba0c889329d25a71ddb801276e01f63bc894781f6ec339220c6165e7ace8f9439708071b55aec0fd55d1e5b2f9e55d4f601d26ec4e9f84cfa43a33ce4181f6404686fa528a3e2340eb853814ad755fdd49e25e8d18d142204d191b13ffb1d8c2b52476e40d05b9f4ff263a0fad81398fc019fab8a42ed89bfc74899ceacb0325253349b08ba183d3528e0d2d9d3f19737e437087aad219a4adda404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 0, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e820f2d625ee3cabce61d583c8c4054e", - "82e8487025764348020264792b3d100f", - "0c8c76f65caf04ee0e22373be0d61ac5", - "fa6e2f2866078b31b90537e24416fad1", - "2aa44b74bb71c2548b15f78fb0d8a308", - "6fac2e4faa9a82029b9d39b72ec7a5a4", - "869eba63651472a34e9ac8faae398421", - "5d731a67081c36c4ff2a7130e611df5e", - "bb57ffcc3c44370131c88e16f74ad73e", - "c6a27c9c6c632820ba2ced4b0061bac1", - "83c43194cb8dd492735c763e54b8db10", - "143d28498127fcc54acce837c1d7f095", - "5c852ea368195f3a075cff32745e4c36", - "c68a06c8e5f6692f7668fc0688ee7b2f", - "cd1be9e341e8eb5fb5b976d4058a686f", - "56a1ed418b617499bd004287334052b4", - "b479ae311ef97b5fbdf7c285dbbd0261", - "234503e68f2902b94115adfcd6639945", - "c28b47c7ad2575473a55ff0d299326b7", - "e6f80364a4449715a002f0b0a84952fd", - "a92ed45cfe7bbd2cd7ba34a5ce185126", - "8c2a8852c64e0abd11500fe8c87c1bf3", - "d5e8a41b2794a64e56c44655aa8aa137", - "1984ca99584500a1b6d769b2d74409a3", - "c5718952c1bfb854e7a85c2a198afea1", - "5227b1172005f3b1b682767ef22a3a3b", - "1c6251cb9c4527426a4e48171c6cadf6", - "45573fefda9aed7e3548849f846481a6", - "ecac7d36be0e38ef28f6ae28909d229d", - "556a44cdbb4fa61bdb8f627c062b161b", - "c679640feee4c3d7584d20a6eb475f66", - "35680f4a6321ed9c0031f0523632dba7", - "2c349963f6f0a58f982b347d76388501", - "f6f0c16440230782fbb68c3605e94e1b", - "e01d6a321a353eeda86bbc36b2b89898", - "3cb994f99ebfd6d28a0c716e1a4710f1", - "3fad98148a00b7faf3c48c49cfbdb40f", - "bffe0b3167d2e01c8f227a0631843a94", - "eff15a613db675eeff55e451c37498fa", - "a4cf50c7cf5b51ff9e09715da14773e0", - "3a66869191058c64353056836665327b", - "74321e0a1191bf4f400d5e315548da71", - "08e40f80bea56f282d0d338e61449e9e", - "66b0d7b25e0735987966a4a7d1d1d092", - "34b74fed0bbf6fc996ad703dbf95cbc8", - "48d4d646f2cdc06fd956eb87de7fb213", - "431206b92387190aff870f4259a840de", - "9fd788a97451affebb1d2b65143c6107", - "d7a8e35b7a63905c9e16071d38ab6524", - "51e4c156fe074362bfe672079ee42e2a", - "264224d4c3090ae182088617fe2a87d4", - "93f6ebd36672456b3014d4c1bcafc105", - "ec77f9bedf1a62a7a82ef70396c5f767", - "dbd98873567275fac01a901016f214a2", - "768a06e71ae20736fb5f974a8efe8760", - "f4dc7e87f8223b451658ca0ef1ffa005", - "2637d542f00af9813a344a82ab700842", - "3f2be235dff4d6e37b055f8f5b78fe51", - "a994bfacdcbae1faabe006ac32a9ccf6", - "9d1e1d721fae8055c3f58392bd8200ed", - "d08cde43b01a6fe803f496d8beb595ef", - "1a121ed89f5cce5fb7f116c7bcfa1842", - "bd64fffe2ee5e89610d6e5fc6ff7b2e6", - "0c409a6a7bc15045a728a079c9d45368", - "2fa0907b916e3188ddae01baefa5521c", - "c966c6b9585fb4e68402792fc93e73b9", - "69f7e63743d20c2fd91bfcb938f342c2", - "985b8e1a19c25b7a2f002b236230dbce", - "bfae1a7b7d0940a193a5dec0edf39370", - "fa58d7ae88ed2afa51b60f2e70921814", - "9309753919e224d11b4804e1caf0254c", - "cee0a777b606f35aeb11831984019766", - "1afecb632982d79bd6ed52b743dfb0ef", - "62eecd1b7f94381c1acaaa007be45bd0", - "b7dec4325cc318b948c7302c5aad28d2", - "e4f8579ff92cfcc3c3a18f29386fc66a", - "e0b0b3990121c1aee83746f1a55a4aed", - "489fec02985c24cad582ebec7ba6c44d", - "2bf2c3e83071329ade2191d73b449ae8", - "7b408fead07c01593eae70c786f039d8", - "abf4a366e8e5571d0ebb06b7cc707a2e", - "c5306e3f76e97fab3a6c6dd975e74348", - "b8d4995868712714e3d10b74902a9d0c", - "d13b6b91b4347dc5af4d60ddea0e76bd", - "f4fd9815cd504434c9981d28bcf1bb22", - "ae66815774d4f003537d951a24a12c0a", - "e48218c6d31e954fe20f4334e0495d47", - "4950504fc9635cf5715c8efa06f93a81", - "67bc4607ebcc6e850c6aced635935b2f", - "354a4d2eff9c71cdd39798dffe596115", - "d89e901a43e0fabffd3f554f066c8212", - "add01fa47f79033aa175f4f8033057c4", - "f481381f3db1b5d9b2fd72e27aaecd2a", - "6568e5a724e4a699e89c287162eb44bb", - "f35efa71772f4fbb2650bd93ae4aa3a5", - "3192069c0734b4e9742e52955c819090", - "f3106af780bdd564036ddda405fe0a9e", - "9540e5787b7a3fde839f2375e091e63d", - "a54d6036c1bc50bf16efd6d198a0ff7d", - "df8c6d791d85ed885a53ecdee10ce40d" - ], - [ - "1adf0d29da11c354159e2a7c373bfab1", - "7f17b78fda89bcb7e1fd9b86d4c2eff0", - "f5738909a350fb11d5ddc8c41f29e53a", - "0791d0d799f874ce2afac81dbbe9052e", - "d75bb48b448e3dab58ea08704f275cf7", - "9253d1b055657dfd4862c648d1385a5b", - "7b61459c9aeb8d5c9565370551c67bde", - "a48ce598f7e3c93be4d48ecf19ee20a1", - "46a80033c3bbc8feb23771e908b528c1", - "3b5d8363939cd7df29d312b4ff9e453e", - "7e3bce6b34722b6d70a389c1ab4724ef", - "edc2d7b67ed8033a993317c83e280f6a", - "a57ad15c97e6a0c5dca300cd8ba1b3c9", - "3b75f9371a0996d06d9703f9771184d0", - "34e4161cbe1714a02e46892bfa759790", - "ab5e12be749e8b6626ffbd78ccbfad4b", - "4d8651cee10684a026083d7a2442fd9e", - "debafc1970d6fd46a2ea5203299c66ba", - "3f74b83852da8ab8a9aa00f2d66cd948", - "1b07fc9b5bbb68ea43fd0f4f57b6ad02", - "58d12ba3018442d30c45cb5a31e7aed9", - "75d577ad39b1f542d2aff0173783e40c", - "2c175be4d86b59b18d3bb9aa55755ec8", - "e87b3566a7baff5e2d28964d28bbf65c", - "3c8e76ad3e4047abfc56a3d5e675015e", - "afd84ee8dffa0c4e2d7d89810dd5c5c4", - "e59dae3463bad8bd79b1b7e8e3935209", - "bca8c01025651281aeb77b607b9b7e59", - "155382c941f1c710bb0951d76f62dd62", - "ac95bb3244b059e408709d83f9d4e9e4", - "3b869bf0111b3c288bb2df5914b8a099", - "cc97f0b59cde1263e3ce0fadc9cd2458", - "d5cb669c090f5a704bd4cb8289c77afe", - "0b0f3e9bbfdcf87de84873c9fa16b1e4", - "21e295cde5cac1123b9443c94d476767", - "c5466b066140292d59f38e91e5b8ef0e", - "c25267eb75ff4805f03a73b630424bf0", - "4201f4ce982d1fe354dd85f9ce7bc56b", - "120ea59ec2498a11e4a91bae3c8b6705", - "5d30af3830a4ae0045f68ea25eb88c1f", - "c799796e6efa739baecfa97c999acd84", - "8dcde1f5ee6e40b0a3f2a1ceaab7258e", - "f91bf07f415a90d7b6f2cc719ebb6161", - "9b4f284da1f8ca676a995b582e2e2f6d", - "cd48b012f44090364d528fc2406a3437", - "b92b29b90d323f900aa9147821804dec", - "beedf946dc78e6f5e477f0bda657bf21", - "622877568bae500128e2d49aebc39ef8", - "2a571ca4859c6fa345e9f8e2c7549adb", - "b01b3ea901f8bc9d24198df8611bd1d5", - "dbbddb2b3cf6f51e61f779e801d5782b", - "6e09142c998dba94b3eb2b3e43503efa", - "1588064120e59d583bd108fc693a0898", - "2626778ca98d8a0523e56fefe90deb5d", - "8b75f918e51df8c9e89f68b57101789f", - "0d23817807ddc4bacda735f10e005ffa", - "dbc82abd0ff5067ea9cbb57d548ff7bd", - "c2d41dca200b291c68faa070a48701ae", - "586b405323451e05381ff953cd563309", - "64e1e28de0517faa200a7c6d427dff12", - "317321bc4fe59017e00b6927414a6a10", - "e7ede12760a331a02c0ee9384305e7bd", - "449b0001d11a1769d3291a0390084d19", - "f5bf6595843eafba3cd75f86362bac97", - "d25f6f846e91ce770651fe45105aade3", - "38993946a7a04b195ffd86d036c18c46", - "980819c8bc2df3d00ae40346c70cbd3d", - "69a471e5e63da485b4ffd4dc9dcf2431", - "4251e58482f6bf5e505a213f120c6c8f", - "07a728517712d5059249f0d18f6de7eb", - "6ef68ac6e61ddb2ec8b7fb1e350fdab3", - "331f588849f90ca5f8ed7ce67bfe6899", - "e701349cd67d28640d12ad48bc204f10", - "9f1132e4806bc7e3c93555ff841ba42f", - "4a213bcda33ce7469b38cfd3a552d72d", - "1d07a86006d3033c205e70d6c7903995", - "214f4c66fede3e51fbc7b90e5aa5b512", - "b96013fd67a3db350e7d141384593bb2", - "d60d3c17cf8ecd6505de6e28c4bb6517", - "86bf70152f83fea6a5518f38790fc627", - "560b5c99171aa8e2d544f948338f85d1", - "3ccf91c089168054a99392268a18bcb7", - "492b66a7978ed8eb002ef48b6fd562f3", - "30c4946e4bcb823a34b29f2215f18942", - "0d0267ea32afbbcb1a67e2d7430e44dd", - "53997ea88b2b0ffc90826ae5db5ed3f5", - "1d7de7392ce16ab001f0bccb1fb6a2b8", - "b8afafb0369ca30a72a37105f906c57e", - "9a43b9f81433917ad7953129ca6ca4d0", - "ccb5b2d100638e321068672001a69eea", - "29616fe5bc1f0540e6bfaab0f9937ded", - "542fe05b8086fcc5428a0b07fccfa83b", - "0d7ec7e0c24e4a2631028d1d855132d5", - "9c971a58db1b5966fb62d78e9d14bb44", - "0ea1058e88d0b044bdaf426c51b55c5a", - "d06df963f8cb4b166fd1ad6aa37e6f6f", - "0eef95087f422a9be092225bfa01f561", - "6cbf1a878485c0216060dc8a1f6e19c2", - "5cb29fc93e43af40cd10292e675f0082", - "22739286e27a127789ac13211ef31bf2" - ] - ], - "prep_messages": [ - "774e1ebb45b1c0e11bf01b23d0a2f1822a68e27345e3f5ff256e9253dad417ad" - ], - "prep_shares": [ - [ - "66e14d38c90694ecaed6e1e6e54ff37f626cd891b3b1ffe20bacaa5741a9b19676678c90abe6b88bd2e821d21c7211c061da7b45ff16d851eb4ef88cc3f89ecd56cc565ec94950085319139daef295682a34ee3b89f4b71ca6e8bf5930ff033b1771b890a81981bd862ff9eb352d2c7a7f98b8e30631d46d75eda32a07f681fa388813e1976784d821d2babaedcd760dba72a20438b47e581667aed24ff37a22eca51216da0b13cd6c9c7978189efda7293867a3a10cde89e65ac695e94983832b6143d62e4e1229aa7f5ea7853901c6046e04bf993f1b75c67623131ff658f43521e9a9f0eb93b2a26dbdf9654d6c6859ebb4f2ba4cece36f8bd4d93ad9fb5970a03cdeee9719af30cf68bd18cf728ad26a549be48bd7203945fb904d6aed93db7b5dead163e4ce99128251a44a6476921b916493511ee254c5c44bd0793bcd8bc37948a39bc02ee7a80168be082b46ccbeeadfaa954a31a899367aed48f364225526ab0a748466845abda64883baf691a577e092b36c8178a3e3c4f7fecc79", - "9b1eb2c736f96b1335291e191ab00c80e550c1b959b141150218275087013144cac1655435b03aec8c6f8aa8c6798e052853e97b4dc3fff2cd7ad75fc07cd6471db842439560a70ce333a273d4da9b37b5276e90b6d9064bd2029fefa536a53d1d51e55b553ea3a4056d627a2e5b2ced984b1b63f1ddff1b75113a943bb4e4da12ba32779614365afdfd645a8b3fa517d35a5ca6e2202e9c699be20508d129015e4d60fbae27377187a09ee9d933ce0630a5686c066e2819861586d9876c961c1f97bf8466cbf7dda8442d7f7af37c3289712987fb6367798647ac591469905a345318abde99a7db7b9fee2a33d5938d48ad5d7fd0be8207c4220c7d2ab45fcbe9761e56d960409a891124141f1ff5a19cd1abd0ab3c1baab4297de51ccb6ae24c3d78cad0829883f6c1f520ec2808c74a2705d30935ba4c32be7225941b1dfe0d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" - ] - ], - "public_share": "225526ab0a748466845abda64883baf691a577e092b36c8178a3e3c4f7fecc7940ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e720f2d625ee3cabce61d583c8c4054e83e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001a92228f3ccf7a882871c5980e660230bac0d8dea0fc22f19353fb54c7e29323ed695a9287c7f97fa5d28f831c0644eee64859883b45bcb72cde0f94bf15e4f1a0ca010d171f73ac7729747974c545d7e8424eae6e64080a799fcf6cf3887a52c66fe9ef132718818e5db2daf9e68d2ec01bdffc16380204204b42692a36fed01cfa2fbcf7ec15347c1181ad8928e8cd7e8d8ab83b31f0c7462a13e62fa3f57e89ded227e903176d2d86969a88ac3e0a0a86506a1ad970838c0190ca339e71bdc639a7507812dcc08b75df9c660d872476272e22a5484f52c4118fbcf097916d4f84d013b22419c79894a19f858ce82b8ad23684d519da66012bc1d0ce4e3c007250a925c3b398acc500f80b12f064b8ac7111811ea8875d2b8f689cbeb2ea47d1a7e026277d5b8186e60ab01d18867f5646eb099d272863ab3e2b0bf77fd8197209301af81e78f55cdb64c5f74bdfffab1bf3f9825ed2cfe226722037cff31fce477a7752b267376d1349d700c30a39dc205c45ca9ab72f07512c420a790a2523e1927423d3d4297a982fe829f22a741690978cde35539052077ee42951b271c168d83cf9c0f8b474e8b6c2d16d90639f4647637e6313302028ac17e1b7242064539e0401957cc5b8297ce6f1cd2a901eed39492f1c3772dc0f9cca0a074e2c875337b452dcb03bda1c52eaef80bcf957404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 1, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e720f2d625ee3cabce61d583c8c4054e", - "83e8487025764348020264792b3d100f", - "0c8c76f65caf04ee0e22373be0d61ac5", - "fa6e2f2866078b31b90537e24416fad1", - "2aa44b74bb71c2548b15f78fb0d8a308", - "6fac2e4faa9a82029b9d39b72ec7a5a4", - "869eba63651472a34e9ac8faae398421", - "5d731a67081c36c4ff2a7130e611df5e", - "bb57ffcc3c44370131c88e16f74ad73e", - "c6a27c9c6c632820ba2ced4b0061bac1", - "83c43194cb8dd492735c763e54b8db10", - "143d28498127fcc54acce837c1d7f095", - "5c852ea368195f3a075cff32745e4c36", - "c68a06c8e5f6692f7668fc0688ee7b2f", - "cd1be9e341e8eb5fb5b976d4058a686f", - "56a1ed418b617499bd004287334052b4", - "b479ae311ef97b5fbdf7c285dbbd0261", - "234503e68f2902b94115adfcd6639945", - "c28b47c7ad2575473a55ff0d299326b7", - "e6f80364a4449715a002f0b0a84952fd", - "a92ed45cfe7bbd2cd7ba34a5ce185126", - "8c2a8852c64e0abd11500fe8c87c1bf3", - "d5e8a41b2794a64e56c44655aa8aa137", - "1984ca99584500a1b6d769b2d74409a3", - "c5718952c1bfb854e7a85c2a198afea1", - "5227b1172005f3b1b682767ef22a3a3b", - "1c6251cb9c4527426a4e48171c6cadf6", - "45573fefda9aed7e3548849f846481a6", - "ecac7d36be0e38ef28f6ae28909d229d", - "556a44cdbb4fa61bdb8f627c062b161b", - "c679640feee4c3d7584d20a6eb475f66", - "35680f4a6321ed9c0031f0523632dba7", - "2c349963f6f0a58f982b347d76388501", - "f6f0c16440230782fbb68c3605e94e1b", - "e01d6a321a353eeda86bbc36b2b89898", - "3cb994f99ebfd6d28a0c716e1a4710f1", - "3fad98148a00b7faf3c48c49cfbdb40f", - "bffe0b3167d2e01c8f227a0631843a94", - "eff15a613db675eeff55e451c37498fa", - "a4cf50c7cf5b51ff9e09715da14773e0", - "3a66869191058c64353056836665327b", - "74321e0a1191bf4f400d5e315548da71", - "08e40f80bea56f282d0d338e61449e9e", - "66b0d7b25e0735987966a4a7d1d1d092", - "34b74fed0bbf6fc996ad703dbf95cbc8", - "48d4d646f2cdc06fd956eb87de7fb213", - "431206b92387190aff870f4259a840de", - "9fd788a97451affebb1d2b65143c6107", - "d7a8e35b7a63905c9e16071d38ab6524", - "51e4c156fe074362bfe672079ee42e2a", - "264224d4c3090ae182088617fe2a87d4", - "93f6ebd36672456b3014d4c1bcafc105", - "ec77f9bedf1a62a7a82ef70396c5f767", - "dbd98873567275fac01a901016f214a2", - "768a06e71ae20736fb5f974a8efe8760", - "f4dc7e87f8223b451658ca0ef1ffa005", - "2637d542f00af9813a344a82ab700842", - "3f2be235dff4d6e37b055f8f5b78fe51", - "a994bfacdcbae1faabe006ac32a9ccf6", - "9d1e1d721fae8055c3f58392bd8200ed", - "d08cde43b01a6fe803f496d8beb595ef", - "1a121ed89f5cce5fb7f116c7bcfa1842", - "bd64fffe2ee5e89610d6e5fc6ff7b2e6", - "0c409a6a7bc15045a728a079c9d45368", - "2fa0907b916e3188ddae01baefa5521c", - "c966c6b9585fb4e68402792fc93e73b9", - "69f7e63743d20c2fd91bfcb938f342c2", - "985b8e1a19c25b7a2f002b236230dbce", - "bfae1a7b7d0940a193a5dec0edf39370", - "fa58d7ae88ed2afa51b60f2e70921814", - "9309753919e224d11b4804e1caf0254c", - "cee0a777b606f35aeb11831984019766", - "1afecb632982d79bd6ed52b743dfb0ef", - "62eecd1b7f94381c1acaaa007be45bd0", - "b7dec4325cc318b948c7302c5aad28d2", - "e4f8579ff92cfcc3c3a18f29386fc66a", - "e0b0b3990121c1aee83746f1a55a4aed", - "489fec02985c24cad582ebec7ba6c44d", - "2bf2c3e83071329ade2191d73b449ae8", - "7b408fead07c01593eae70c786f039d8", - "abf4a366e8e5571d0ebb06b7cc707a2e", - "c5306e3f76e97fab3a6c6dd975e74348", - "b8d4995868712714e3d10b74902a9d0c", - "d13b6b91b4347dc5af4d60ddea0e76bd", - "f4fd9815cd504434c9981d28bcf1bb22", - "ae66815774d4f003537d951a24a12c0a", - "e48218c6d31e954fe20f4334e0495d47", - "4950504fc9635cf5715c8efa06f93a81", - "67bc4607ebcc6e850c6aced635935b2f", - "354a4d2eff9c71cdd39798dffe596115", - "d89e901a43e0fabffd3f554f066c8212", - "add01fa47f79033aa175f4f8033057c4", - "f481381f3db1b5d9b2fd72e27aaecd2a", - "6568e5a724e4a699e89c287162eb44bb", - "f35efa71772f4fbb2650bd93ae4aa3a5", - "3192069c0734b4e9742e52955c819090", - "f3106af780bdd564036ddda405fe0a9e", - "9540e5787b7a3fde839f2375e091e63d", - "a54d6036c1bc50bf16efd6d198a0ff7d", - "df8c6d791d85ed885a53ecdee10ce40d" - ], - [ - "1adf0d29da11c354159e2a7c373bfab1", - "7f17b78fda89bcb7e1fd9b86d4c2eff0", - "f5738909a350fb11d5ddc8c41f29e53a", - "0791d0d799f874ce2afac81dbbe9052e", - "d75bb48b448e3dab58ea08704f275cf7", - "9253d1b055657dfd4862c648d1385a5b", - "7b61459c9aeb8d5c9565370551c67bde", - "a48ce598f7e3c93be4d48ecf19ee20a1", - "46a80033c3bbc8feb23771e908b528c1", - "3b5d8363939cd7df29d312b4ff9e453e", - "7e3bce6b34722b6d70a389c1ab4724ef", - "edc2d7b67ed8033a993317c83e280f6a", - "a57ad15c97e6a0c5dca300cd8ba1b3c9", - "3b75f9371a0996d06d9703f9771184d0", - "34e4161cbe1714a02e46892bfa759790", - "ab5e12be749e8b6626ffbd78ccbfad4b", - "4d8651cee10684a026083d7a2442fd9e", - "debafc1970d6fd46a2ea5203299c66ba", - "3f74b83852da8ab8a9aa00f2d66cd948", - "1b07fc9b5bbb68ea43fd0f4f57b6ad02", - "58d12ba3018442d30c45cb5a31e7aed9", - "75d577ad39b1f542d2aff0173783e40c", - "2c175be4d86b59b18d3bb9aa55755ec8", - "e87b3566a7baff5e2d28964d28bbf65c", - "3c8e76ad3e4047abfc56a3d5e675015e", - "afd84ee8dffa0c4e2d7d89810dd5c5c4", - "e59dae3463bad8bd79b1b7e8e3935209", - "bca8c01025651281aeb77b607b9b7e59", - "155382c941f1c710bb0951d76f62dd62", - "ac95bb3244b059e408709d83f9d4e9e4", - "3b869bf0111b3c288bb2df5914b8a099", - "cc97f0b59cde1263e3ce0fadc9cd2458", - "d5cb669c090f5a704bd4cb8289c77afe", - "0b0f3e9bbfdcf87de84873c9fa16b1e4", - "21e295cde5cac1123b9443c94d476767", - "c5466b066140292d59f38e91e5b8ef0e", - "c25267eb75ff4805f03a73b630424bf0", - "4201f4ce982d1fe354dd85f9ce7bc56b", - "120ea59ec2498a11e4a91bae3c8b6705", - "5d30af3830a4ae0045f68ea25eb88c1f", - "c799796e6efa739baecfa97c999acd84", - "8dcde1f5ee6e40b0a3f2a1ceaab7258e", - "f91bf07f415a90d7b6f2cc719ebb6161", - "9b4f284da1f8ca676a995b582e2e2f6d", - "cd48b012f44090364d528fc2406a3437", - "b92b29b90d323f900aa9147821804dec", - "beedf946dc78e6f5e477f0bda657bf21", - "622877568bae500128e2d49aebc39ef8", - "2a571ca4859c6fa345e9f8e2c7549adb", - "b01b3ea901f8bc9d24198df8611bd1d5", - "dbbddb2b3cf6f51e61f779e801d5782b", - "6e09142c998dba94b3eb2b3e43503efa", - "1588064120e59d583bd108fc693a0898", - "2626778ca98d8a0523e56fefe90deb5d", - "8b75f918e51df8c9e89f68b57101789f", - "0d23817807ddc4bacda735f10e005ffa", - "dbc82abd0ff5067ea9cbb57d548ff7bd", - "c2d41dca200b291c68faa070a48701ae", - "586b405323451e05381ff953cd563309", - "64e1e28de0517faa200a7c6d427dff12", - "317321bc4fe59017e00b6927414a6a10", - "e7ede12760a331a02c0ee9384305e7bd", - "449b0001d11a1769d3291a0390084d19", - "f5bf6595843eafba3cd75f86362bac97", - "d25f6f846e91ce770651fe45105aade3", - "38993946a7a04b195ffd86d036c18c46", - "980819c8bc2df3d00ae40346c70cbd3d", - "69a471e5e63da485b4ffd4dc9dcf2431", - "4251e58482f6bf5e505a213f120c6c8f", - "07a728517712d5059249f0d18f6de7eb", - "6ef68ac6e61ddb2ec8b7fb1e350fdab3", - "331f588849f90ca5f8ed7ce67bfe6899", - "e701349cd67d28640d12ad48bc204f10", - "9f1132e4806bc7e3c93555ff841ba42f", - "4a213bcda33ce7469b38cfd3a552d72d", - "1d07a86006d3033c205e70d6c7903995", - "214f4c66fede3e51fbc7b90e5aa5b512", - "b96013fd67a3db350e7d141384593bb2", - "d60d3c17cf8ecd6505de6e28c4bb6517", - "86bf70152f83fea6a5518f38790fc627", - "560b5c99171aa8e2d544f948338f85d1", - "3ccf91c089168054a99392268a18bcb7", - "492b66a7978ed8eb002ef48b6fd562f3", - "30c4946e4bcb823a34b29f2215f18942", - "0d0267ea32afbbcb1a67e2d7430e44dd", - "53997ea88b2b0ffc90826ae5db5ed3f5", - "1d7de7392ce16ab001f0bccb1fb6a2b8", - "b8afafb0369ca30a72a37105f906c57e", - "9a43b9f81433917ad7953129ca6ca4d0", - "ccb5b2d100638e321068672001a69eea", - "29616fe5bc1f0540e6bfaab0f9937ded", - "542fe05b8086fcc5428a0b07fccfa83b", - "0d7ec7e0c24e4a2631028d1d855132d5", - "9c971a58db1b5966fb62d78e9d14bb44", - "0ea1058e88d0b044bdaf426c51b55c5a", - "d06df963f8cb4b166fd1ad6aa37e6f6f", - "0eef95087f422a9be092225bfa01f561", - "6cbf1a878485c0216060dc8a1f6e19c2", - "5cb29fc93e43af40cd10292e675f0082", - "22739286e27a127789ac13211ef31bf2" - ] - ], - "prep_messages": [ - "53fdf4849decb971572e581c89b1ddf6dedbb87edb4e6b5d9370a01cf699f6cc" - ], - "prep_shares": [ - [ - "66e14d38c90694ecaed6e1e6e54ff37f27956e1c8eb8563e3aa9b40b4cb8a9ecae6456b732d066ab74d4f2da6dcaa2490bd8efabe604227964f93c7fda2018491ecf8c374260a2e8b02d42945d9a04dfb687ce23c5997481d638953ded113f6f1771b890a81981bd862ff9eb352d2c7a18671782ba5244a37a2d39459a4d569a388813e1976784d821d2babaedcd760dd5204e80577d20d34168d5c01313bceaeca51216da0b13cd6c9c7978189efda703eec10fa13a87a27255b92840afa37f2b6143d62e4e1229aa7f5ea7853901c661f14c6b32c050fefec7b32f27a2ceaa3521e9a9f0eb93b2a26dbdf9654d6c68e1293ae4a208fe272e7336755020396670a03cdeee9719af30cf68bd18cf728a9df3e85a22c27adf964ed51d038dc106db7b5dead163e4ce99128251a44a647610d1d4b9eb8091d09bc6fe90de2083138bc37948a39bc02ee7a80168be082b46868174607af7260d5656f7ff5993fa45a4861a1383ebd01daf71ae010ddf00beba2bdbdb6cd3ebb6f6204d65ce9ea173", - "9b1eb2c736f96b1335291e191ab00c80c5ba06833acc5108c3681f3504109c34cac1655435b03aec8c6f8aa8c6798e052bf97a5a52e23df7718591b64d320aa41db842439560a70ce333a273d4da9b3729d48da87a344ae6a1b2c90be9236a091d51e55b553ea3a4056d627a2e5b2cedfe7cbcc43dbc8fe68bd1a479a85c103b12ba32779614365afdfd645a8b3fa517b9acb02ac3578c21229abb1744b1e8385e4d60fbae27377187a09ee9d933ce0656ef0d0007407f00fa1a9346310776201f97bf8466cbf7dda8442d7f7af37c322ceee0da62e331f04df61b3d0cbd1aa4345318abde99a7db7b9fee2a33d5938dc06ed88de80271c3053baae1146d22bfe9761e56d960409a891124141f1ff5a1d04817116e0678eb7220a35867a8966f4c3d78cad0829883f6c1f520ec2808c7cb71c17db105475e07bd38e08574d5b70d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" - ] - ], - "public_share": "a4861a1383ebd01daf71ae010ddf00beba2bdbdb6cd3ebb6f6204d65ce9ea17340ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0d8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001a9f4d10c3a0130028e99c355bc4da57b4fa22195bda8151b0ae8901ceb458c28964b2d2d19d109d8c1c2a03dd251e4a2c48312ae66e609e3a8f4cc40d84d7f928a3f0ace6fc07e05ab17c01b9fa7906249d3c0d59e05cd71d020c7263100c4d3ece5cd1d7deb7255413ce7a2e20eb514ef6ee6a3af1bd50aece20562b0a1bf5f9f6d0801166978bbd9d6d17b9925cf7bf53a7385370f960daad1dafd4931eaa5b43ff628a3ae52b4e38067b0d1317954381a9fd9cd1581296425be048e507f51bc1febf332f32d8d3d0d77802b9de5e77963081199c99952dc46ca4e7f92c3986f64902d7dfd243dd388dfc44c95ce461d23684d519da66012bc1d0ce4e3c0072437ea43ce2ff34c688206fc5918c90b236c74664ca28fd0e50daefb7e025a934ab88e6dca644649fb870305df8ab2311461368f2fd837c9d8deedaa811e511ea2f417a2841e3c1796f5c3db316abd070bf049b98e27d023ee0351bc747622556e706968efac792a7792d37cc89ad154e464cd7a6e1fbe278b14d5509a5ed0046e6f1af095a53d238f0427efa87b64ad5ca7a0cc7f649f7be83731b85608946ef03ac01588a2af6533647e24c07b8d8654aeecffb6a2ba11603e101cc708ee80ecb4695457826ae70ce830a5622d3551d7e37eabac8ec2e735dbee213a5b26050e1bdc52d21f7be9578668d3044484180404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 2, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e720f2d625ee3cabce61d583c8c4054e", - "82e8487025764348020264792b3d100f", - "0d8c76f65caf04ee0e22373be0d61ac5", - "fa6e2f2866078b31b90537e24416fad1", - "2aa44b74bb71c2548b15f78fb0d8a308", - "6fac2e4faa9a82029b9d39b72ec7a5a4", - "869eba63651472a34e9ac8faae398421", - "5d731a67081c36c4ff2a7130e611df5e", - "bb57ffcc3c44370131c88e16f74ad73e", - "c6a27c9c6c632820ba2ced4b0061bac1", - "83c43194cb8dd492735c763e54b8db10", - "143d28498127fcc54acce837c1d7f095", - "5c852ea368195f3a075cff32745e4c36", - "c68a06c8e5f6692f7668fc0688ee7b2f", - "cd1be9e341e8eb5fb5b976d4058a686f", - "56a1ed418b617499bd004287334052b4", - "b479ae311ef97b5fbdf7c285dbbd0261", - "234503e68f2902b94115adfcd6639945", - "c28b47c7ad2575473a55ff0d299326b7", - "e6f80364a4449715a002f0b0a84952fd", - "a92ed45cfe7bbd2cd7ba34a5ce185126", - "8c2a8852c64e0abd11500fe8c87c1bf3", - "d5e8a41b2794a64e56c44655aa8aa137", - "1984ca99584500a1b6d769b2d74409a3", - "c5718952c1bfb854e7a85c2a198afea1", - "5227b1172005f3b1b682767ef22a3a3b", - "1c6251cb9c4527426a4e48171c6cadf6", - "45573fefda9aed7e3548849f846481a6", - "ecac7d36be0e38ef28f6ae28909d229d", - "556a44cdbb4fa61bdb8f627c062b161b", - "c679640feee4c3d7584d20a6eb475f66", - "35680f4a6321ed9c0031f0523632dba7", - "2c349963f6f0a58f982b347d76388501", - "f6f0c16440230782fbb68c3605e94e1b", - "e01d6a321a353eeda86bbc36b2b89898", - "3cb994f99ebfd6d28a0c716e1a4710f1", - "3fad98148a00b7faf3c48c49cfbdb40f", - "bffe0b3167d2e01c8f227a0631843a94", - "eff15a613db675eeff55e451c37498fa", - "a4cf50c7cf5b51ff9e09715da14773e0", - "3a66869191058c64353056836665327b", - "74321e0a1191bf4f400d5e315548da71", - "08e40f80bea56f282d0d338e61449e9e", - "66b0d7b25e0735987966a4a7d1d1d092", - "34b74fed0bbf6fc996ad703dbf95cbc8", - "48d4d646f2cdc06fd956eb87de7fb213", - "431206b92387190aff870f4259a840de", - "9fd788a97451affebb1d2b65143c6107", - "d7a8e35b7a63905c9e16071d38ab6524", - "51e4c156fe074362bfe672079ee42e2a", - "264224d4c3090ae182088617fe2a87d4", - "93f6ebd36672456b3014d4c1bcafc105", - "ec77f9bedf1a62a7a82ef70396c5f767", - "dbd98873567275fac01a901016f214a2", - "768a06e71ae20736fb5f974a8efe8760", - "f4dc7e87f8223b451658ca0ef1ffa005", - "2637d542f00af9813a344a82ab700842", - "3f2be235dff4d6e37b055f8f5b78fe51", - "a994bfacdcbae1faabe006ac32a9ccf6", - "9d1e1d721fae8055c3f58392bd8200ed", - "d08cde43b01a6fe803f496d8beb595ef", - "1a121ed89f5cce5fb7f116c7bcfa1842", - "bd64fffe2ee5e89610d6e5fc6ff7b2e6", - "0c409a6a7bc15045a728a079c9d45368", - "2fa0907b916e3188ddae01baefa5521c", - "c966c6b9585fb4e68402792fc93e73b9", - "69f7e63743d20c2fd91bfcb938f342c2", - "985b8e1a19c25b7a2f002b236230dbce", - "bfae1a7b7d0940a193a5dec0edf39370", - "fa58d7ae88ed2afa51b60f2e70921814", - "9309753919e224d11b4804e1caf0254c", - "cee0a777b606f35aeb11831984019766", - "1afecb632982d79bd6ed52b743dfb0ef", - "62eecd1b7f94381c1acaaa007be45bd0", - "b7dec4325cc318b948c7302c5aad28d2", - "e4f8579ff92cfcc3c3a18f29386fc66a", - "e0b0b3990121c1aee83746f1a55a4aed", - "489fec02985c24cad582ebec7ba6c44d", - "2bf2c3e83071329ade2191d73b449ae8", - "7b408fead07c01593eae70c786f039d8", - "abf4a366e8e5571d0ebb06b7cc707a2e", - "c5306e3f76e97fab3a6c6dd975e74348", - "b8d4995868712714e3d10b74902a9d0c", - "d13b6b91b4347dc5af4d60ddea0e76bd", - "f4fd9815cd504434c9981d28bcf1bb22", - "ae66815774d4f003537d951a24a12c0a", - "e48218c6d31e954fe20f4334e0495d47", - "4950504fc9635cf5715c8efa06f93a81", - "67bc4607ebcc6e850c6aced635935b2f", - "354a4d2eff9c71cdd39798dffe596115", - "d89e901a43e0fabffd3f554f066c8212", - "add01fa47f79033aa175f4f8033057c4", - "f481381f3db1b5d9b2fd72e27aaecd2a", - "6568e5a724e4a699e89c287162eb44bb", - "f35efa71772f4fbb2650bd93ae4aa3a5", - "3192069c0734b4e9742e52955c819090", - "f3106af780bdd564036ddda405fe0a9e", - "9540e5787b7a3fde839f2375e091e63d", - "a54d6036c1bc50bf16efd6d198a0ff7d", - "df8c6d791d85ed885a53ecdee10ce40d" - ], - [ - "1adf0d29da11c354159e2a7c373bfab1", - "7f17b78fda89bcb7e1fd9b86d4c2eff0", - "f5738909a350fb11d5ddc8c41f29e53a", - "0791d0d799f874ce2afac81dbbe9052e", - "d75bb48b448e3dab58ea08704f275cf7", - "9253d1b055657dfd4862c648d1385a5b", - "7b61459c9aeb8d5c9565370551c67bde", - "a48ce598f7e3c93be4d48ecf19ee20a1", - "46a80033c3bbc8feb23771e908b528c1", - "3b5d8363939cd7df29d312b4ff9e453e", - "7e3bce6b34722b6d70a389c1ab4724ef", - "edc2d7b67ed8033a993317c83e280f6a", - "a57ad15c97e6a0c5dca300cd8ba1b3c9", - "3b75f9371a0996d06d9703f9771184d0", - "34e4161cbe1714a02e46892bfa759790", - "ab5e12be749e8b6626ffbd78ccbfad4b", - "4d8651cee10684a026083d7a2442fd9e", - "debafc1970d6fd46a2ea5203299c66ba", - "3f74b83852da8ab8a9aa00f2d66cd948", - "1b07fc9b5bbb68ea43fd0f4f57b6ad02", - "58d12ba3018442d30c45cb5a31e7aed9", - "75d577ad39b1f542d2aff0173783e40c", - "2c175be4d86b59b18d3bb9aa55755ec8", - "e87b3566a7baff5e2d28964d28bbf65c", - "3c8e76ad3e4047abfc56a3d5e675015e", - "afd84ee8dffa0c4e2d7d89810dd5c5c4", - "e59dae3463bad8bd79b1b7e8e3935209", - "bca8c01025651281aeb77b607b9b7e59", - "155382c941f1c710bb0951d76f62dd62", - "ac95bb3244b059e408709d83f9d4e9e4", - "3b869bf0111b3c288bb2df5914b8a099", - "cc97f0b59cde1263e3ce0fadc9cd2458", - "d5cb669c090f5a704bd4cb8289c77afe", - "0b0f3e9bbfdcf87de84873c9fa16b1e4", - "21e295cde5cac1123b9443c94d476767", - "c5466b066140292d59f38e91e5b8ef0e", - "c25267eb75ff4805f03a73b630424bf0", - "4201f4ce982d1fe354dd85f9ce7bc56b", - "120ea59ec2498a11e4a91bae3c8b6705", - "5d30af3830a4ae0045f68ea25eb88c1f", - "c799796e6efa739baecfa97c999acd84", - "8dcde1f5ee6e40b0a3f2a1ceaab7258e", - "f91bf07f415a90d7b6f2cc719ebb6161", - "9b4f284da1f8ca676a995b582e2e2f6d", - "cd48b012f44090364d528fc2406a3437", - "b92b29b90d323f900aa9147821804dec", - "beedf946dc78e6f5e477f0bda657bf21", - "622877568bae500128e2d49aebc39ef8", - "2a571ca4859c6fa345e9f8e2c7549adb", - "b01b3ea901f8bc9d24198df8611bd1d5", - "dbbddb2b3cf6f51e61f779e801d5782b", - "6e09142c998dba94b3eb2b3e43503efa", - "1588064120e59d583bd108fc693a0898", - "2626778ca98d8a0523e56fefe90deb5d", - "8b75f918e51df8c9e89f68b57101789f", - "0d23817807ddc4bacda735f10e005ffa", - "dbc82abd0ff5067ea9cbb57d548ff7bd", - "c2d41dca200b291c68faa070a48701ae", - "586b405323451e05381ff953cd563309", - "64e1e28de0517faa200a7c6d427dff12", - "317321bc4fe59017e00b6927414a6a10", - "e7ede12760a331a02c0ee9384305e7bd", - "449b0001d11a1769d3291a0390084d19", - "f5bf6595843eafba3cd75f86362bac97", - "d25f6f846e91ce770651fe45105aade3", - "38993946a7a04b195ffd86d036c18c46", - "980819c8bc2df3d00ae40346c70cbd3d", - "69a471e5e63da485b4ffd4dc9dcf2431", - "4251e58482f6bf5e505a213f120c6c8f", - "07a728517712d5059249f0d18f6de7eb", - "6ef68ac6e61ddb2ec8b7fb1e350fdab3", - "331f588849f90ca5f8ed7ce67bfe6899", - "e701349cd67d28640d12ad48bc204f10", - "9f1132e4806bc7e3c93555ff841ba42f", - "4a213bcda33ce7469b38cfd3a552d72d", - "1d07a86006d3033c205e70d6c7903995", - "214f4c66fede3e51fbc7b90e5aa5b512", - "b96013fd67a3db350e7d141384593bb2", - "d60d3c17cf8ecd6505de6e28c4bb6517", - "86bf70152f83fea6a5518f38790fc627", - "560b5c99171aa8e2d544f948338f85d1", - "3ccf91c089168054a99392268a18bcb7", - "492b66a7978ed8eb002ef48b6fd562f3", - "30c4946e4bcb823a34b29f2215f18942", - "0d0267ea32afbbcb1a67e2d7430e44dd", - "53997ea88b2b0ffc90826ae5db5ed3f5", - "1d7de7392ce16ab001f0bccb1fb6a2b8", - "b8afafb0369ca30a72a37105f906c57e", - "9a43b9f81433917ad7953129ca6ca4d0", - "ccb5b2d100638e321068672001a69eea", - "29616fe5bc1f0540e6bfaab0f9937ded", - "542fe05b8086fcc5428a0b07fccfa83b", - "0d7ec7e0c24e4a2631028d1d855132d5", - "9c971a58db1b5966fb62d78e9d14bb44", - "0ea1058e88d0b044bdaf426c51b55c5a", - "d06df963f8cb4b166fd1ad6aa37e6f6f", - "0eef95087f422a9be092225bfa01f561", - "6cbf1a878485c0216060dc8a1f6e19c2", - "5cb29fc93e43af40cd10292e675f0082", - "22739286e27a127789ac13211ef31bf2" - ] - ], - "prep_messages": [ - "baa2841ddb7c9165f4a782633dd7e92b49dd1b3442de0069c780f74a63cb53e6" - ], - "prep_shares": [ - [ - "66e14d38c90694ecaed6e1e6e54ff37f27eba1c272bf7ca7ab0768e3d1f75404ae6456b732d066ab74d4f2da6dcaa2494b444ff6c14e6773609eabc32282d9d456cc565ec94950085319139daef29568e2fa6699702a0d3aa4018d71a3c28b9cdf73ee692130d39de44328e3e4d49af0a5bd4b6f62bb3357eacc129f8e358c99388813e1976784d821d2babaedcd760d02a6fce712900190c3b95ccee4938267eca51216da0b13cd6c9c7978189efda79f847e987c4b6a31778cd1466a2967e22b6143d62e4e1229aa7f5ea7853901c6d542b0d5ab0fd6de397ae38bf935dd3b3521e9a9f0eb93b2a26dbdf9654d6c68562725cf6aeea09fed87fe61ed35d8d570a03cdeee9719af30cf68bd18cf728ad989db144725a3b8b81f6c7f12c1af0bdb7b5dead163e4ce99128251a44a6476b4a46cee9fd105411657e6dd313dc90a8bc37948a39bc02ee7a80168be082b4667085e83d49c770521af5a4baff811b9fa66d5dbb62e46d22ecd373679b0025334b8c93cb5aca96774a571d0601ab77d", - "9b1eb2c736f96b1335291e191ab00c80c464d3dc55c52b9f6d0a6c5d7ed0f01ccac1655435b03aec8c6f8aa8c6798e053ee915cb8a8b70d1582b242961f39b401db842439560a70ce333a273d4da9b37dc5fc812448a68f27bf39ef221b32b8c1d51e55b553ea3a4056d627a2e5b2ced712688d79553a0321c32cb1fb474da3b12ba32779614365afdfd645a8b3fa5178c2702c30745ab64a048340a733022bc5e4d60fbae27377187a09ee9d933ce06bb5851772b2f9c71d9e37a28078db2bd1f97bf8466cbf7dda8442d7f7af37c32b79c7d70e993ac0f2f44ece039290c13345318abde99a7db7b9fee2a33d5938d4b71eda2201dce4b4626e2f47757834fe9761e56d960409a891124141f1ff5a194b2245749a34f12514f0cf75774a86a4c3d78cad0829883f6c1f520ec2808c7279e2949fdb4d2ed8c2c519332588fc00d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" - ] - ], - "public_share": "fa66d5dbb62e46d22ecd373679b0025334b8c93cb5aca96774a571d0601ab77d40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e820f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001ad93e89cf70b750049d40bf4f5f5703784a5d5a60d7918cafb4415a98d9dc69dee763053753e06b715ebdd2bf303fd0791c77038ca967c886722fd5c76f65091139160af6525d206b6c8aea3f08d866ba4b0254d20b231f4f3eae6358fdfc94dbb43cf964e343f06614dc433770765b3bd75395f8d8759c1e79535686ee0aa06ef60f3735629bfdd883c4461496439d5aea53039970021213373e401bd16705c50e97b76c6532d8bf0fc04489d7ae2090b084cee663c1fd87cf57d40f9da1dd035236a8f76dc9c52aa5a2de290316b81f8bcb800861619f6dd87afb591b0c4748cada2ac5e756842f416cdfa2f3007807d23684d519da66012bc1d0ce4e3c0072098d2b30125ce4e9d47ce5d0f60fe5eee78c055fcd18c20f2e2297edbba101e029d7b377f17495ba5add607aed8a9dc371cd8e4cc37c5251c60bcaee255702029a1b1d19eb8d8169984e542c094d70da123f541fb7b7ba0c889329d25a71ddb801276e01f63bc894781f6ec339220c6165e7ace8f9439708071b55aec0fd55d1e5b2f9e55d4f601d26ec4e9f84cfa43a33ce4181f6404686fa528a3e2340eb853814ad755fdd49e25e8d18d142204d191b13ffb1d8c2b52476e40d05b9f4ff263a0fad81398fc019fab8a42ed89bfc74899ceacb0325253349b08ba183d3528e0d2d9d3f19737e437087aad219a4adda404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 0, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e820f2d625ee3cabce61d583c8c4054e", - "82e8487025764348020264792b3d100f", - "0c8c76f65caf04ee0e22373be0d61ac5", - "fa6e2f2866078b31b90537e24416fad1", - "2aa44b74bb71c2548b15f78fb0d8a308", - "6fac2e4faa9a82029b9d39b72ec7a5a4", - "869eba63651472a34e9ac8faae398421", - "5d731a67081c36c4ff2a7130e611df5e", - "bb57ffcc3c44370131c88e16f74ad73e", - "c6a27c9c6c632820ba2ced4b0061bac1", - "83c43194cb8dd492735c763e54b8db10", - "143d28498127fcc54acce837c1d7f095", - "5c852ea368195f3a075cff32745e4c36", - "c68a06c8e5f6692f7668fc0688ee7b2f", - "cd1be9e341e8eb5fb5b976d4058a686f", - "56a1ed418b617499bd004287334052b4", - "b479ae311ef97b5fbdf7c285dbbd0261", - "234503e68f2902b94115adfcd6639945", - "c28b47c7ad2575473a55ff0d299326b7", - "e6f80364a4449715a002f0b0a84952fd", - "a92ed45cfe7bbd2cd7ba34a5ce185126", - "8c2a8852c64e0abd11500fe8c87c1bf3", - "d5e8a41b2794a64e56c44655aa8aa137", - "1984ca99584500a1b6d769b2d74409a3", - "c5718952c1bfb854e7a85c2a198afea1", - "5227b1172005f3b1b682767ef22a3a3b", - "1c6251cb9c4527426a4e48171c6cadf6", - "45573fefda9aed7e3548849f846481a6", - "ecac7d36be0e38ef28f6ae28909d229d", - "556a44cdbb4fa61bdb8f627c062b161b", - "c679640feee4c3d7584d20a6eb475f66", - "35680f4a6321ed9c0031f0523632dba7", - "2c349963f6f0a58f982b347d76388501", - "f6f0c16440230782fbb68c3605e94e1b", - "e01d6a321a353eeda86bbc36b2b89898", - "3cb994f99ebfd6d28a0c716e1a4710f1", - "3fad98148a00b7faf3c48c49cfbdb40f", - "bffe0b3167d2e01c8f227a0631843a94", - "eff15a613db675eeff55e451c37498fa", - "a4cf50c7cf5b51ff9e09715da14773e0", - "3a66869191058c64353056836665327b", - "74321e0a1191bf4f400d5e315548da71", - "08e40f80bea56f282d0d338e61449e9e", - "66b0d7b25e0735987966a4a7d1d1d092", - "34b74fed0bbf6fc996ad703dbf95cbc8", - "48d4d646f2cdc06fd956eb87de7fb213", - "431206b92387190aff870f4259a840de", - "9fd788a97451affebb1d2b65143c6107", - "d7a8e35b7a63905c9e16071d38ab6524", - "51e4c156fe074362bfe672079ee42e2a", - "264224d4c3090ae182088617fe2a87d4", - "93f6ebd36672456b3014d4c1bcafc105", - "ec77f9bedf1a62a7a82ef70396c5f767", - "dbd98873567275fac01a901016f214a2", - "768a06e71ae20736fb5f974a8efe8760", - "f4dc7e87f8223b451658ca0ef1ffa005", - "2637d542f00af9813a344a82ab700842", - "3f2be235dff4d6e37b055f8f5b78fe51", - "a994bfacdcbae1faabe006ac32a9ccf6", - "9d1e1d721fae8055c3f58392bd8200ed", - "d08cde43b01a6fe803f496d8beb595ef", - "1a121ed89f5cce5fb7f116c7bcfa1842", - "bd64fffe2ee5e89610d6e5fc6ff7b2e6", - "0c409a6a7bc15045a728a079c9d45368", - "2fa0907b916e3188ddae01baefa5521c", - "c966c6b9585fb4e68402792fc93e73b9", - "69f7e63743d20c2fd91bfcb938f342c2", - "985b8e1a19c25b7a2f002b236230dbce", - "bfae1a7b7d0940a193a5dec0edf39370", - "fa58d7ae88ed2afa51b60f2e70921814", - "9309753919e224d11b4804e1caf0254c", - "cee0a777b606f35aeb11831984019766", - "1afecb632982d79bd6ed52b743dfb0ef", - "62eecd1b7f94381c1acaaa007be45bd0", - "b7dec4325cc318b948c7302c5aad28d2", - "e4f8579ff92cfcc3c3a18f29386fc66a", - "e0b0b3990121c1aee83746f1a55a4aed", - "489fec02985c24cad582ebec7ba6c44d", - "2bf2c3e83071329ade2191d73b449ae8", - "7b408fead07c01593eae70c786f039d8", - "abf4a366e8e5571d0ebb06b7cc707a2e", - "c5306e3f76e97fab3a6c6dd975e74348", - "b8d4995868712714e3d10b74902a9d0c", - "d13b6b91b4347dc5af4d60ddea0e76bd", - "f4fd9815cd504434c9981d28bcf1bb22", - "ae66815774d4f003537d951a24a12c0a", - "e48218c6d31e954fe20f4334e0495d47", - "4950504fc9635cf5715c8efa06f93a81", - "67bc4607ebcc6e850c6aced635935b2f", - "354a4d2eff9c71cdd39798dffe596115", - "d89e901a43e0fabffd3f554f066c8212", - "add01fa47f79033aa175f4f8033057c4", - "f481381f3db1b5d9b2fd72e27aaecd2a", - "6568e5a724e4a699e89c287162eb44bb", - "f35efa71772f4fbb2650bd93ae4aa3a5", - "3192069c0734b4e9742e52955c819090", - "f3106af780bdd564036ddda405fe0a9e", - "9540e5787b7a3fde839f2375e091e63d", - "a54d6036c1bc50bf16efd6d198a0ff7d", - "df8c6d791d85ed885a53ecdee10ce40d" - ], - [ - "1adf0d29da11c354159e2a7c373bfab1", - "7f17b78fda89bcb7e1fd9b86d4c2eff0", - "f5738909a350fb11d5ddc8c41f29e53a", - "0791d0d799f874ce2afac81dbbe9052e", - "d75bb48b448e3dab58ea08704f275cf7", - "9253d1b055657dfd4862c648d1385a5b", - "7b61459c9aeb8d5c9565370551c67bde", - "a48ce598f7e3c93be4d48ecf19ee20a1", - "46a80033c3bbc8feb23771e908b528c1", - "3b5d8363939cd7df29d312b4ff9e453e", - "7e3bce6b34722b6d70a389c1ab4724ef", - "edc2d7b67ed8033a993317c83e280f6a", - "a57ad15c97e6a0c5dca300cd8ba1b3c9", - "3b75f9371a0996d06d9703f9771184d0", - "34e4161cbe1714a02e46892bfa759790", - "ab5e12be749e8b6626ffbd78ccbfad4b", - "4d8651cee10684a026083d7a2442fd9e", - "debafc1970d6fd46a2ea5203299c66ba", - "3f74b83852da8ab8a9aa00f2d66cd948", - "1b07fc9b5bbb68ea43fd0f4f57b6ad02", - "58d12ba3018442d30c45cb5a31e7aed9", - "75d577ad39b1f542d2aff0173783e40c", - "2c175be4d86b59b18d3bb9aa55755ec8", - "e87b3566a7baff5e2d28964d28bbf65c", - "3c8e76ad3e4047abfc56a3d5e675015e", - "afd84ee8dffa0c4e2d7d89810dd5c5c4", - "e59dae3463bad8bd79b1b7e8e3935209", - "bca8c01025651281aeb77b607b9b7e59", - "155382c941f1c710bb0951d76f62dd62", - "ac95bb3244b059e408709d83f9d4e9e4", - "3b869bf0111b3c288bb2df5914b8a099", - "cc97f0b59cde1263e3ce0fadc9cd2458", - "d5cb669c090f5a704bd4cb8289c77afe", - "0b0f3e9bbfdcf87de84873c9fa16b1e4", - "21e295cde5cac1123b9443c94d476767", - "c5466b066140292d59f38e91e5b8ef0e", - "c25267eb75ff4805f03a73b630424bf0", - "4201f4ce982d1fe354dd85f9ce7bc56b", - "120ea59ec2498a11e4a91bae3c8b6705", - "5d30af3830a4ae0045f68ea25eb88c1f", - "c799796e6efa739baecfa97c999acd84", - "8dcde1f5ee6e40b0a3f2a1ceaab7258e", - "f91bf07f415a90d7b6f2cc719ebb6161", - "9b4f284da1f8ca676a995b582e2e2f6d", - "cd48b012f44090364d528fc2406a3437", - "b92b29b90d323f900aa9147821804dec", - "beedf946dc78e6f5e477f0bda657bf21", - "622877568bae500128e2d49aebc39ef8", - "2a571ca4859c6fa345e9f8e2c7549adb", - "b01b3ea901f8bc9d24198df8611bd1d5", - "dbbddb2b3cf6f51e61f779e801d5782b", - "6e09142c998dba94b3eb2b3e43503efa", - "1588064120e59d583bd108fc693a0898", - "2626778ca98d8a0523e56fefe90deb5d", - "8b75f918e51df8c9e89f68b57101789f", - "0d23817807ddc4bacda735f10e005ffa", - "dbc82abd0ff5067ea9cbb57d548ff7bd", - "c2d41dca200b291c68faa070a48701ae", - "586b405323451e05381ff953cd563309", - "64e1e28de0517faa200a7c6d427dff12", - "317321bc4fe59017e00b6927414a6a10", - "e7ede12760a331a02c0ee9384305e7bd", - "449b0001d11a1769d3291a0390084d19", - "f5bf6595843eafba3cd75f86362bac97", - "d25f6f846e91ce770651fe45105aade3", - "38993946a7a04b195ffd86d036c18c46", - "980819c8bc2df3d00ae40346c70cbd3d", - "69a471e5e63da485b4ffd4dc9dcf2431", - "4251e58482f6bf5e505a213f120c6c8f", - "07a728517712d5059249f0d18f6de7eb", - "6ef68ac6e61ddb2ec8b7fb1e350fdab3", - "331f588849f90ca5f8ed7ce67bfe6899", - "e701349cd67d28640d12ad48bc204f10", - "9f1132e4806bc7e3c93555ff841ba42f", - "4a213bcda33ce7469b38cfd3a552d72d", - "1d07a86006d3033c205e70d6c7903995", - "214f4c66fede3e51fbc7b90e5aa5b512", - "b96013fd67a3db350e7d141384593bb2", - "d60d3c17cf8ecd6505de6e28c4bb6517", - "86bf70152f83fea6a5518f38790fc627", - "560b5c99171aa8e2d544f948338f85d1", - "3ccf91c089168054a99392268a18bcb7", - "492b66a7978ed8eb002ef48b6fd562f3", - "30c4946e4bcb823a34b29f2215f18942", - "0d0267ea32afbbcb1a67e2d7430e44dd", - "53997ea88b2b0ffc90826ae5db5ed3f5", - "1d7de7392ce16ab001f0bccb1fb6a2b8", - "b8afafb0369ca30a72a37105f906c57e", - "9a43b9f81433917ad7953129ca6ca4d0", - "ccb5b2d100638e321068672001a69eea", - "29616fe5bc1f0540e6bfaab0f9937ded", - "542fe05b8086fcc5428a0b07fccfa83b", - "0d7ec7e0c24e4a2631028d1d855132d5", - "9c971a58db1b5966fb62d78e9d14bb44", - "0ea1058e88d0b044bdaf426c51b55c5a", - "d06df963f8cb4b166fd1ad6aa37e6f6f", - "0eef95087f422a9be092225bfa01f561", - "6cbf1a878485c0216060dc8a1f6e19c2", - "5cb29fc93e43af40cd10292e675f0082", - "22739286e27a127789ac13211ef31bf2" - ] - ], - "prep_messages": [ - "774e1ebb45b1c0e11bf01b23d0a2f1822a68e27345e3f5ff256e9253dad417ad" - ], - "prep_shares": [ - [ - "66e14d38c90694ecaed6e1e6e54ff37f626cd891b3b1ffe20bacaa5741a9b19676678c90abe6b88bd2e821d21c7211c061da7b45ff16d851eb4ef88cc3f89ecd56cc565ec94950085319139daef295682a34ee3b89f4b71ca6e8bf5930ff033b1771b890a81981bd862ff9eb352d2c7a7f98b8e30631d46d75eda32a07f681fa388813e1976784d821d2babaedcd760dba72a20438b47e581667aed24ff37a22eca51216da0b13cd6c9c7978189efda7293867a3a10cde89e65ac695e94983832b6143d62e4e1229aa7f5ea7853901c6046e04bf993f1b75c67623131ff658f43521e9a9f0eb93b2a26dbdf9654d6c6859ebb4f2ba4cece36f8bd4d93ad9fb5970a03cdeee9719af30cf68bd18cf728ad26a549be48bd7203945fb904d6aed93db7b5dead163e4ce99128251a44a6476921b916493511ee254c5c44bd0793bcd8bc37948a39bc02ee7a80168be082b46ccbeeadfaa954a31a899367aed48f364225526ab0a748466845abda64883baf691a577e092b36c8178a3e3c4f7fecc79", - "9b1eb2c736f96b1335291e191ab00c80e550c1b959b141150218275087013144cac1655435b03aec8c6f8aa8c6798e052853e97b4dc3fff2cd7ad75fc07cd6471db842439560a70ce333a273d4da9b37b5276e90b6d9064bd2029fefa536a53d1d51e55b553ea3a4056d627a2e5b2ced984b1b63f1ddff1b75113a943bb4e4da12ba32779614365afdfd645a8b3fa517d35a5ca6e2202e9c699be20508d129015e4d60fbae27377187a09ee9d933ce0630a5686c066e2819861586d9876c961c1f97bf8466cbf7dda8442d7f7af37c3289712987fb6367798647ac591469905a345318abde99a7db7b9fee2a33d5938d48ad5d7fd0be8207c4220c7d2ab45fcbe9761e56d960409a891124141f1ff5a19cd1abd0ab3c1baab4297de51ccb6ae24c3d78cad0829883f6c1f520ec2808c74a2705d30935ba4c32be7225941b1dfe0d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" - ] - ], - "public_share": "225526ab0a748466845abda64883baf691a577e092b36c8178a3e3c4f7fecc7940ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - } - ], - "shares": 2, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3MultihotCountVec_0.json b/vdaf/prio3/testdata/Prio3MultihotCountVec_0.json deleted file mode 100644 index 8fdb1baa..00000000 --- a/vdaf/prio3/testdata/Prio3MultihotCountVec_0.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "agg_param": "", - "agg_result": [ - 0, - 1, - 1, - 0 - ], - "agg_shares": [ - "e2bb7419a8ac96a1c6def1bed78dcb074557af87236442363aa49be4fd351b11b64bede210be55b253caa20a0f75703e295aa329cd650b825d3d4492d46d2fb3", - "1f448be65753695e1d210e41287234f8bda85078dc9bbdc9a95b641b02cae4ee4cb4121def41aa4d90355df5f08a8fc1d8a55cd6329af47d86c2bb6d2b92d04c" - ], - "chunk_length": 2, - "ctx": "736f6d65206170706c69636174696f6e", - "length": 4, - "max_weight": 2, - "prep": [ - { - "input_shares": [ - "e2bb7419a8ac96a1c6def1bed78dcb074557af87236442363aa49be4fd351b11b64bede210be55b253caa20a0f75703e295aa329cd650b825d3d4492d46d2fb362d5c7a84cb3dc77420ae9fb319a83b91a5ed94b3fee03d209e78f1b2561041a66cf7dff4a43e15165bcaed22955b547461b80bb28663b502ad8b1536aa6d3cffdd56552a27dab37d3921be5ad85e990d6182143dd4b359053d6b41b58a260a36444c50596526e58032cf8d75335a776d8e856f751d5b9972dcb6d5e9df41e1a13612efca2bf4dc3a35d88e64bde741e93d680d9a3e0261d17a21ccdee91bde85440901071218a3ab71661cef25d4275b17fdfedfdd8a9e6e48a0ebcb73f8fec09f6945689cb0a789221792d689e2ab2404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": [ - false, - true, - true, - false - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e2bb7419a8ac96a1c6def1bed78dcb07", - "4557af87236442363aa49be4fd351b11", - "b64bede210be55b253caa20a0f75703e", - "295aa329cd650b825d3d4492d46d2fb3" - ], - [ - "1f448be65753695e1d210e41287234f8", - "bda85078dc9bbdc9a95b641b02cae4ee", - "4cb4121def41aa4d90355df5f08a8fc1", - "d8a55cd6329af47d86c2bb6d2b92d04c" - ] - ], - "prep_messages": [ - "407dd84e19e24c5dd58e2a735bade1c3feaa768f055f553e0767e8f8066ddc8b" - ], - "prep_shares": [ - [ - "0c82e0cc5f690b9caafa428dd6d85ec0cb91386cb2e980e5475e84dc83a874724d0ec28fc8583fcd3d2049ed82fe4cb49b774302bf9e3f22840fdcae9eda08edf34af1e39cf607549e72d9603c9064bd1ce6bcc5c3cff0cd2404afaa25d39fbef626f32389f3abd8f1007f22683246938f85d46fdcf067e79c9b6b088a0c70ba", - "f57d1f33a096f4633905bd722927a13f27c3d26278454e1a5238c31d07b79cfb65698f64c871fc3ae4f3ec5c948d0436d2d857e9751199e9364d6f9097174bf6f551d066f30ae33ed61f9b4bed3609d6fd20479675bf4583e46fa4df4e93182f5728b4e324470bb29993bf18e20714421c8e06f4c0622e3641eb50f24fed1117" - ] - ], - "public_share": "f626f32389f3abd8f1007f22683246938f85d46fdcf067e79c9b6b088a0c70ba5728b4e324470bb29993bf18e20714421c8e06f4c0622e3641eb50f24fed1117", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - } - ], - "shares": 2, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3MultihotCountVec_1.json b/vdaf/prio3/testdata/Prio3MultihotCountVec_1.json deleted file mode 100644 index 127c7637..00000000 --- a/vdaf/prio3/testdata/Prio3MultihotCountVec_1.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "agg_param": "", - "agg_result": [ - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1 - ], - "agg_shares": [ - "781bcdf49ab6cc3905ddc9468ba3770da93b52b6850a6d98fda820b899e3b66db99c81ef1b1c865cb5efd83a31c2f04aece94430b7ca762c1d136c4b324ccb133c414a50f7c6842f5ace7c4e063a40a143d8d7d2a451a3a38efe662c928909bb51615b73d0634675c28073fe8bbc903ed3aafb155bc2662a9f3a62e83641da00da4853618f6664e1553c949cc5b836685f02f3396816e79747e3be5fbc28e193", - "1f448be65753695e1d210e41287234f8bda85078dc9bbdc9a95b641b02cae4ee4cb4121def41aa4d90355df5f08a8fc1d8a55cd6329af47d86c2bb6d2b92d04ca02a3857b34c2388a1f51604ce657c46e8a126b4c011fc2dda1870e4da9efbe54ecaad63670383735c9147d029a5ce03f744adcd817d8b8193701eb0e5205a85c5dfa58103daa2c7b771ceea8337b2214082f4c93b0bc641415917797dbc38e2", - "ff2f6b009697e49299e90da15ae5290a2942cae56bd275a2d8f03559a786b6f201695f5dc2ffc6494de65a25135f6dad9a94d87862672aa862450f061067d3abda47a8cbb895558b4ffc871bb1abe7f6d68d52c7927b3f5462d4c91b100a4acbb29c41730607fea082660c46ca6921ca52dc64d21f01a65da0e10e20647d07d56487f50aac1a09052234e204a03d30561d8abcc6d4e4b3d6c801b5b1a584553c", - "6c703c24775ee5d40b181ad7f1042af075d992eb31875ffb2b0a45d3bccbadb0fc450c9632a2080c35f46eaaca531246a4db8580b3336aadc1e4c84092ba90f34c4cd58c9c5602bd7c3fe4917ab45b2102f8aeb1072121dae0135fd382cdb093b137b5b5c1913876268738eb7f347ff3e633f24903bf67f6f47270477f20c4a4fe4f1112c1a4ef51b41dbb7316d2e61f47f15b3587f99e4f76c174752096904d" - ], - "chunk_length": 3, - "ctx": "736f6d65206170706c69636174696f6e", - "length": 10, - "max_weight": 2, - "prep": [ - { - "input_shares": [ - "781bcdf49ab6cc3905ddc9468ba3770da93b52b6850a6d98fda820b899e3b66db99c81ef1b1c865cb5efd83a31c2f04aece94430b7ca762c1d136c4b324ccb133c414a50f7c6842f5ace7c4e063a40a143d8d7d2a451a3a38efe662c928909bb51615b73d0634675c28073fe8bbc903ed3aafb155bc2662a9f3a62e83641da00da4853618f6664e1553c949cc5b836685f02f3396816e79747e3be5fbc28e193d6ef25e6111cbe64d8aa9bb7d1e45d4018d4e09983efb42009e731d7876edd0fb51db5d367cba65352cd4e8a467599c00ffffc9ce9bd8fc86b6cd630c0acf18e79dca744bc07b49fb78affea16190c112049cc4bbc5ccaf14c4a2f96c38b60f3f8fe14301095168d635be5bf3265507825c030369182e08d747fc6b9d0353f89e4ac4b881c81cf8d0721196a71068b3c28c753ec8fcb7b0446ad514a92136515c16f287f616ba0f83d1c6f06774886e2b21e0fe7e34f6b7d076bcda1e515f6a5d9912f0526f0ed0751f25648ba2b3b2119bf68d6746da1030416f32cefe8259cb0fc365b409eb8dc0640ef36a2aeef3124b3dbf37e6eaddde55b4d9dff1d13a65e8874c77d8ba000a934a6c2220d9b22106db138a2024fb830146e74c385964dcde91517e010303ad4c575ded39da50f25f36b2756145ebffb50f591935cd81274705ab2a21ab3b52b72689817c2eeb50ddb567e4947035aeafbdca5707a27ef0189eefa973d7c70bf542004e4eedcb5c0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", - "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f", - "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf" - ], - "measurement": [ - false, - true, - false, - false, - false, - false, - false, - false, - false, - true - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "781bcdf49ab6cc3905ddc9468ba3770d", - "a93b52b6850a6d98fda820b899e3b66d", - "b99c81ef1b1c865cb5efd83a31c2f04a", - "ece94430b7ca762c1d136c4b324ccb13", - "3c414a50f7c6842f5ace7c4e063a40a1", - "43d8d7d2a451a3a38efe662c928909bb", - "51615b73d0634675c28073fe8bbc903e", - "d3aafb155bc2662a9f3a62e83641da00", - "da4853618f6664e1553c949cc5b83668", - "5f02f3396816e79747e3be5fbc28e193" - ], - [ - "1f448be65753695e1d210e41287234f8", - "bda85078dc9bbdc9a95b641b02cae4ee", - "4cb4121def41aa4d90355df5f08a8fc1", - "d8a55cd6329af47d86c2bb6d2b92d04c", - "a02a3857b34c2388a1f51604ce657c46", - "e8a126b4c011fc2dda1870e4da9efbe5", - "4ecaad63670383735c9147d029a5ce03", - "f744adcd817d8b8193701eb0e5205a85", - "c5dfa58103daa2c7b771ceea8337b221", - "4082f4c93b0bc641415917797dbc38e2" - ], - [ - "ff2f6b009697e49299e90da15ae5290a", - "2942cae56bd275a2d8f03559a786b6f2", - "01695f5dc2ffc6494de65a25135f6dad", - "9a94d87862672aa862450f061067d3ab", - "da47a8cbb895558b4ffc871bb1abe7f6", - "d68d52c7927b3f5462d4c91b100a4acb", - "b29c41730607fea082660c46ca6921ca", - "52dc64d21f01a65da0e10e20647d07d5", - "6487f50aac1a09052234e204a03d3056", - "1d8abcc6d4e4b3d6c801b5b1a584553c" - ], - [ - "6c703c24775ee5d40b181ad7f1042af0", - "75d992eb31875ffb2b0a45d3bccbadb0", - "fc450c9632a2080c35f46eaaca531246", - "a4db8580b3336aadc1e4c84092ba90f3", - "4c4cd58c9c5602bd7c3fe4917ab45b21", - "02f8aeb1072121dae0135fd382cdb093", - "b137b5b5c1913876268738eb7f347ff3", - "e633f24903bf67f6f47270477f20c4a4", - "fe4f1112c1a4ef51b41dbb7316d2e61f", - "47f15b3587f99e4f76c174752096904d" - ] - ], - "prep_messages": [ - "aa3d8e6257c466bc3173d454e46493c662d2e2377c60b1eb53808cdc231e8292" - ], - "prep_shares": [ - [ - "3d641c737846ac6347415a39f0460706161b78f45441c4f571c675ad977c1e569acfdbefed88b73e37d374da9b35abf7001afb1320dc90678b166811f357c7ec30a0a8be486b56d79d35d4a84f5e51864b829f9c74d386e114fd8592d083b93313a2198ec71058793b0405c971d3f9bca7c044481ad26366abdf9a305efe9eeefe81d25365b05a7d6f2cfd118c387e52584e3fc90e73acc0c17673b63bf98656", - "ff861e22d4bedb6cb50fd8d45398283fc31e12b09efa9b1d25f9c9b1ae98d2df263eebbea09201393c0c4f56e4797c22bf656006ee88b2a3873340c5821753d0bab172e5a332467bc77ff5bb585c4209900f1790247cd23eb1c3d4a0e314466cf96c4358c10e3d54bcdb9cf9fe3421d302c84b82f9b7aacbce9c9411539265961c03081b9e0b8b0a5dfdec6485969578f8704a628d19d074992f4a7374e9d534", - "0f67a601dcedd6767d4d28a6ccf47249444fb33d24d5949ed3691d49e1b87f4f3c3d080f87ea23f04d73dd2d65a2c058b221d50bbe74a3fb8ce8b7dc8c4fcb9cff59b081e848f598fd8256091b56b30cc9ad83d14e35b4aa58390d0deecbc452ca662416b4648fa177154ea775bf07e09f45276e775cb1105c81ef86c26e3b00d462ef6d88b6578c2b1ffb6471ab9d20379901919c448fb43c4463b26de3422d", - "b6ad1e69d70ca1b86961a54bef2b5d71e42954395b808a34b8747594131bf6212199d7d40829fdff5745dffd4fdf781fd9cad9d28c45e8053b25a5955b941fb6ae0172cfc2bd07f81108815a8772bf0ecf24fa93147007bdae65fb6384544be21e13d421a9685db56769a24a029d4791a8207cddd30e695e44c1fd9c9eac1ab10ff631cd5510a3b15c117d3914e8943dee24437b6abc6c04bd58b4d6239185aa" - ] - ], - "public_share": "fe81d25365b05a7d6f2cfd118c387e52584e3fc90e73acc0c17673b63bf986561c03081b9e0b8b0a5dfdec6485969578f8704a628d19d074992f4a7374e9d534d462ef6d88b6578c2b1ffb6471ab9d20379901919c448fb43c4463b26de3422d0ff631cd5510a3b15c117d3914e8943dee24437b6abc6c04bd58b4d6239185aa", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" - } - ], - "shares": 4, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3MultihotCountVec_2.json b/vdaf/prio3/testdata/Prio3MultihotCountVec_2.json deleted file mode 100644 index d7ccb03e..00000000 --- a/vdaf/prio3/testdata/Prio3MultihotCountVec_2.json +++ /dev/null @@ -1,211 +0,0 @@ -{ - "agg_param": "", - "agg_result": [ - 2, - 3, - 4, - 1 - ], - "agg_shares": [ - "6cab477f485ff127e159b9ba36c5f92657b46ca6b1f44b0f23350a77f50d88558c7aa26e54b6ac7bbef32d354b493238cbc230d001fd388a273355db2625ed7f", - "9754b880b7a00ed802a64645c93a06d9ad4b93594e0bb4f0c0caf5880af277aa79855d91ab495384250cd2cab4b6cdc7373dcf2ffe02c775bcccaa24d9da1280" - ], - "chunk_length": 1, - "ctx": "736f6d65206170706c69636174696f6e", - "length": 4, - "max_weight": 4, - "prep": [ - { - "input_shares": [ - "e2bb7419a8ac96a1c6def1bed78dcb074557af87236442363aa49be4fd351b11b64bede210be55b253caa20a0f75703e295aa329cd650b825d3d4492d46d2fb362d5c7a84cb3dc77420ae9fb319a83b9195ed94b3fee03d209e78f1b2561041ab435529c98fc7c8c876eb82fd65a31fc66cf7dff4a43e15165bcaed22955b547461b80bb28663b502ad8b1536aa6d3cf8e705bd868a6285c8f72784c197180fdcb1b50029d910e62f6d3bebbd091725f687ed53430cb0818cdada631d9bd1e370ab5a6c2a2b6d543e0e918131c67aedd5b77cb75ce71d8c8dd5ec9028440226d124bc44458e5c4e329096c1ab250ff75b66121e927d624d471d2e7e648928016920efc2d378dc0e8ee13a36d87fbdd35d4a88e6c937da0cc54fd49e9e3f4f4e971bda86ce701e9ab267195ca19bd9b318358d9d6de83a3f8be79f370a3aba801a3d79af7d7df1fb0d61dffd8d00627f7c75fc765e1ec4579c1fb4c907feff49b99198983ece8440b5d6ea9fde97a2020094a42dac99c8f0c1a6267d25128b21b404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": [ - false, - true, - true, - false - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e2bb7419a8ac96a1c6def1bed78dcb07", - "4557af87236442363aa49be4fd351b11", - "b64bede210be55b253caa20a0f75703e", - "295aa329cd650b825d3d4492d46d2fb3" - ], - [ - "1f448be65753695e1d210e41287234f8", - "bda85078dc9bbdc9a95b641b02cae4ee", - "4cb4121def41aa4d90355df5f08a8fc1", - "d8a55cd6329af47d86c2bb6d2b92d04c" - ] - ], - "prep_messages": [ - "1cb5c0b55decfe04be8c9c84c9e29614449ed43534727e7f6189a7206287bf59" - ], - "prep_shares": [ - [ - "e54359db132ef59eec785c12afbcd0c41095ec67b32f42ca286f3dba81d2f4d52a403e1b48dfa7f4a5a6d23ae37d1051dce6452e9ae476eb0764deecce8a40db7b547c43a9891dd84dbbbfe39840e7baabd2e24b618d91e6404723c5cd8ae26c", - "1cbca624ecd10a61f786a3ed50432f3bda4bbbc57edf2cddf1ff2a876ff1b8a00822fcd3fd0c9087a94588084d124e91105ac0f6e69e7f327f9c989a03c990fa59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091" - ] - ], - "public_share": "7b547c43a9891dd84dbbbfe39840e7baabd2e24b618d91e6404723c5cd8ae26c59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e2bb7419a8ac96a1c6def1bed78dcb074457af87236442363aa49be4fd351b11b64bede210be55b253caa20a0f75703e295aa329cd650b825d3d4492d46d2fb361d5c7a84cb3dc77420ae9fb319a83b9195ed94b3fee03d209e78f1b2561041ab435529c98fc7c8c876eb82fd65a31fc66cf7dff4a43e15165bcaed22955b547461b80bb28663b502ad8b1536aa6d3cf4dd9d294fe4b5dfe6a035bf7c093bc3739e06b1224caa5b68b0a3240016a62d1e13cd4750741b83bf16614e687fb4ad6d08a9104fc57825d867cb6e43082cc5356dc187c4e7ff7bc9f68ccdcd074f42b37f5b9cb574739ec6152bf68e5ef8f1c1e4a446d5dbcb1233c30c7db5ce97888920efc2d378dc0e8ee13a36d87fbdd35144017b0fdd76b2a956c673e3cd2b8af04f98c5c60c95157753a2246e9e4abbf0b9ada95070ef4d47ec085bcf46d7c62dc01b0b57e3e73964c8b6107bceb0881ccfa795f61df2685fff149b632bb22dd746f93fcec86d002252556afb6db8f79a2611f5694b602bd330488dd3dd1b9a9404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": [ - false, - false, - true, - false - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e2bb7419a8ac96a1c6def1bed78dcb07", - "4457af87236442363aa49be4fd351b11", - "b64bede210be55b253caa20a0f75703e", - "295aa329cd650b825d3d4492d46d2fb3" - ], - [ - "1f448be65753695e1d210e41287234f8", - "bda85078dc9bbdc9a95b641b02cae4ee", - "4cb4121def41aa4d90355df5f08a8fc1", - "d8a55cd6329af47d86c2bb6d2b92d04c" - ] - ], - "prep_messages": [ - "c24bc83b6d97bf557b590fea3e93b567b122a1cd957bcaa9aec448aca7726899" - ], - "prep_shares": [ - [ - "e54359db132ef59eec785c12afbcd0c4bc8093f51d55c746fd0ddc2e937ec2f330b04b8b772f62ab1ec1adc762c94ff9608a58476c33ec43cbd673643576dd2e42ab6d3c84a37c14bfadd7d17006387b1398149b4d736d6727f455ddeb0e8d62", - "1cbca624ecd10a61f786a3ed50432f3b96ae6b20fffa93bcf425c53e822b4ff50822fcd3fd0c9087a94588084d124e91105ac0f6e69e7f327f9c989a03c990fa59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091" - ] - ], - "public_share": "42ab6d3c84a37c14bfadd7d17006387b1398149b4d736d6727f455ddeb0e8d6259339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e2bb7419a8ac96a1c6def1bed78dcb074457af87236442363aa49be4fd351b11b54bede210be55b253caa20a0f75703e295aa329cd650b825d3d4492d46d2fb362d5c7a84cb3dc77420ae9fb319a83b91a5ed94b3fee03d209e78f1b2561041ab335529c98fc7c8c876eb82fd65a31fc66cf7dff4a43e15165bcaed22955b547461b80bb28663b502ad8b1536aa6d3cf4025a91e2e42deba4c317240c77fb80fde5dcd86b144bb2df213d72a8bf2baea3a4dd9ae180d83470a22d9d4eaa1b0c4dbddfc151145b025cc0ce900a1bd0c9baadd792e2991654a51e51ead894211fc50964f986c2042f74a1fda80c3ecf0f412cf7551c6f265123271a4353820ee94920efc2d378dc0e8ee13a36d87fbdd3521f44026cee1ea6db33e50f535e6bcd75f7b2be8d24e3ce00e317d5b5f5c53a6b289d55cf64129c96505c1cd91c71674d1ae44a4695145ce06fb2eeb4bb0c83978f918ad86cdb8f74d75f7e579ed050d5ccefd2fd8adc7f71f583b97d8de2ea1aedced712b804ece3dc3aa83629a449d404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": [ - false, - false, - false, - false - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e2bb7419a8ac96a1c6def1bed78dcb07", - "4457af87236442363aa49be4fd351b11", - "b54bede210be55b253caa20a0f75703e", - "295aa329cd650b825d3d4492d46d2fb3" - ], - [ - "1f448be65753695e1d210e41287234f8", - "bda85078dc9bbdc9a95b641b02cae4ee", - "4cb4121def41aa4d90355df5f08a8fc1", - "d8a55cd6329af47d86c2bb6d2b92d04c" - ] - ], - "prep_messages": [ - "c3b3331981af8ffa017c3fc4acdf8275c2dd31484200de3098f3e9560d00a943" - ], - "prep_shares": [ - [ - "e54359db132ef59eec785c12afbcd0c424c727ac2cdaafc3813020484c7bc9b6c45ada8371c5d4dbd4f9d77e2064e8061992d56621092be95a40e591a2615d8ba8b2abd7d94ff6a85516e59a79b71c229c13b132bd251e1302a6fe5d02817927", - "1cbca624ecd10a61f786a3ed50432f3b2efb430cd6b5d98874bfc62d858c1b060822fcd3fd0c9087a94588084d124e91105ac0f6e69e7f327f9c989a03c990fa59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091" - ] - ], - "public_share": "a8b2abd7d94ff6a85516e59a79b71c229c13b132bd251e1302a6fe5d0281792759339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e3bb7419a8ac96a1c6def1bed78dcb074557af87236442363aa49be4fd351b11b64bede210be55b253caa20a0f75703e295aa329cd650b825d3d4492d46d2fb361d5c7a84cb3dc77420ae9fb319a83b91a5ed94b3fee03d209e78f1b2561041ab435529c98fc7c8c876eb82fd65a31fc66cf7dff4a43e15165bcaed22955b547461b80bb28663b502ad8b1536aa6d3cf1d40bde9925d4b17c846dd3594fed83dc892ca94d3c04183fa3e3e9c30b20a8c4747be8800152c9d08ddb4916ad19cfb3bfbf22858f63ff68dbf8f300abcd3c1523cea0e97d0e81f3e130785696b0fd20edd6849bb3aa68707bf11e59d1733ada4ae070d7c35a4aa785b4359d92c94e9920efc2d378dc0e8ee13a36d87fbdd3544d92c5b69c67d113829e5ff68679ca974462edab0d2b58a220616eab99c0305a58ff0820e3a8073674ae51012982a3d71914e9122a0b5fd444888bbe2b10113d09aa8cc188e352261470f0e9ac407379e87e47e8993636763b80333feb3ece81cfd5bb6753d1036f7d80b60c18d9e48404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": [ - true, - true, - true, - false - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e3bb7419a8ac96a1c6def1bed78dcb07", - "4557af87236442363aa49be4fd351b11", - "b64bede210be55b253caa20a0f75703e", - "295aa329cd650b825d3d4492d46d2fb3" - ], - [ - "1f448be65753695e1d210e41287234f8", - "bda85078dc9bbdc9a95b641b02cae4ee", - "4cb4121def41aa4d90355df5f08a8fc1", - "d8a55cd6329af47d86c2bb6d2b92d04c" - ] - ], - "prep_messages": [ - "ffa6aa6631a9caed44243158a9b823cd6d03ccd9c0061e32905f64878a71657b" - ], - "prep_shares": [ - [ - "e54359db132ef59eec785c12afbcd0c46afdfeebb2cfb53fe66ec386a655dbc7998879597006242af323ee8edbdc70e9aa8f8db407bca86ae285576865be82a58e7a554c0e2fa5553f86ee96de11b6fa1f973b14695dfffdd21490e09765686d", - "1cbca624ecd10a61f786a3ed50432f3b6dddb72e222cee22981333990002d1cc0822fcd3fd0c9087a94588084d124e91105ac0f6e69e7f327f9c989a03c990fa59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091" - ] - ], - "public_share": "8e7a554c0e2fa5553f86ee96de11b6fa1f973b14695dfffdd21490e09765686d59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "e3bb7419a8ac96a1c6def1bed78dcb074557af87236442363aa49be4fd351b11b64bede210be55b253caa20a0f75703e2a5aa329cd650b825d3d4492d46d2fb362d5c7a84cb3dc77420ae9fb319a83b91a5ed94b3fee03d209e78f1b2561041ab435529c98fc7c8c876eb82fd65a31fc66cf7dff4a43e15165bcaed22955b547461b80bb28663b502ad8b1536aa6d3cfb8918ed5588ae5657f52706150b90f3b7563a4e1847a3252288d55ed722f9efc30fb18f33cf498ed14cd6ed91437e035bbc19908859c3b9169ad78dc32fa1cd00225523ffa19a72ceea504b22886fe4a5f4a4af495e251e6266d18ea3a62c6194d30914ad76eaca4cc68911472efa372920efc2d378dc0e8ee13a36d87fbdd35a9875b6fa399e3c2801d52d4acac65acc875548dff18c5bbd8b7fe98771f7094bbdb9518d25a1323775a2bc96732e702f1caa7b1f5f9b962695a9f0fba73b80420b2409cb5447715b1b411e1daa918be4c1a03d4aeebb708600afd2d6169597c737bd2781a04083ca3cbbda428cb8ebf404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": [ - true, - true, - true, - true - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "e3bb7419a8ac96a1c6def1bed78dcb07", - "4557af87236442363aa49be4fd351b11", - "b64bede210be55b253caa20a0f75703e", - "2a5aa329cd650b825d3d4492d46d2fb3" - ], - [ - "1f448be65753695e1d210e41287234f8", - "bda85078dc9bbdc9a95b641b02cae4ee", - "4cb4121def41aa4d90355df5f08a8fc1", - "d8a55cd6329af47d86c2bb6d2b92d04c" - ] - ], - "prep_messages": [ - "8168d1e866a10ff4cc68c5a974e74b30d03faf32df83d833bf44fc7069430654" - ], - "prep_shares": [ - [ - "e54359db132ef59eec785c12afbcd0c4631e1fa996b00e4ef539d7b7e668113d9b63c65b32e40c5f03b4f8f527ad35bc595cdf351c8fb3f0f6ac9d6701a1bac7718dc7f5c50b4119fb6c3c767cae0c30a69a3166f4c6ecb28c535766c93dbb2e", - "1cbca624ecd10a61f786a3ed50432f3b7f34b51d5bf17a64064e62b7470b71e00822fcd3fd0c9087a94588084d124e91105ac0f6e69e7f327f9c989a03c990fa59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091" - ] - ], - "public_share": "718dc7f5c50b4119fb6c3c767cae0c30a69a3166f4c6ecb28c535766c93dbb2e59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - } - ], - "shares": 2, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3SumVec_0.json b/vdaf/prio3/testdata/Prio3SumVec_0.json deleted file mode 100644 index b847122d..00000000 --- a/vdaf/prio3/testdata/Prio3SumVec_0.json +++ /dev/null @@ -1,195 +0,0 @@ -{ - "agg_param": "", - "agg_result": [ - 256, - 257, - 258, - 259, - 260, - 261, - 262, - 263, - 264, - 265 - ], - "agg_shares": [ - "de30a92af16bc2ab4da894e09426019d0d3cd9897a4e0ed38a1e7cde38fed1fd78b6df5176e37263f7cecb715966820a07045939da773b834c226dfa7c324916427edcf2eebf55d4a4fd9b3897e35851827dd8ebd784d3099d17d54de4c0a71a77842e8666086c4daac340201a50386b8435787649d598d01d2b4e0dae72c58eb2096da354a19135170a7adb3dcf2ba4312a75565a4e3a2e39bfdad5f9f9099f", - "23d056d50e943d5496576b1f6bd9fe62f5c4267685b1f12c59e18321c7012e028b4a20ae891c8d9cec30348ea6997df5fdfca6c62588c47c97dd920583cdb6e9c382230d1140aa2b3f0264c7681ca7ae84832714287b2cf646e82ab21b3f58e5907cd17999f793b2393cbfdfe5afc79484cb8789b62a672fc6d4b1f2518d3a7157f7925cab5e6ecaccf58524c230d45bd9d68aa9a5b1c5d1aa40252a0606f660" - ], - "bits": 8, - "chunk_length": 9, - "ctx": "736f6d65206170706c69636174696f6e", - "length": 10, - "prep": [ - { - "input_shares": [ - "25592c04bc72803500f284c48149d3ae04827becc1530c74619388f1bb3c344f752b1e4ed693306c0a1d1f90001355d3c8727fc06c49304726df59bba46a0b4be4f4582f29855bc8df63723589d3c218ef20bad7c095a97d43abf967f81bf1fa100c59dd138c132d8be8aadb1521aa11a91463adbed40dd4051fe39bac22d9d56374166a0d709d638ab7afe476ab9a0067f3eb19b9a0c5f4313370bb94fb302020f12fbf60e297d00d5c7831258b53d6669dfb8b9a62de9228a2812abb345910c32548120b3429ea2a7294a7dd40942ee3de3ad8a918d701a656573ec43f523c9ea8a6451d190a3686c45223dc902819fd69e67daf19d544e139228844adf3aeece03b4a6ce137bf87e921e282b1200d963687bee8150815450de7a6365ed10330a17ac17dbc32ca4c3dda00c1eda43c1b3a46cc6b48389511be8996f8f275a281a83cc701ff2581db833e467e543cec113074f9ce8815b80460c5e7a0169dbccbdf37e7044ebf18c87f756de3360803398c4c68512e966132fc5d1021b348e8b04a76bcce82b55271b076c76421bb524789a5cf6a9cc17e82539a7aa9ab417e47b241db44cb7dcefbbae6227cd1ad204a53f1c3863856db4dc682fb0827b755195db4bf44991563ef4c28e15fa4432a0b1075e2b091b05cf8f6a77fa93f292d9744d3fa5f2c1bf2a4056923d4519a673b79ade7db4bf1fa35b09a5ad33a5ab3c2854dede1ad8d7b26cfd1a03c0b0a70b036ad24dcaf6ebdb5d225ab14e6270836730ad27c36a009b66c08d8f768f86197f79b6f4659d18fda078e3fa4f34e9c2aa2833c9a4e9cd890b356d9da9eabf0feed22dd69703132f2e72d60ed1ea9b073e92a47cdec7eaceee61be29796a2ee333691651d9acc121ac5e4f12ececff86a0d567741f62d23d6c8bc59c510de1660e5ce64138e8b7a66760ff100d28f1689d01fa394df1056a8ee5e308b29b1775cefaded40616270c6fcad2487f57243bc51f532b26ea1548329b4b8b6e86cbcf8e14ff20657a03fabe78dc1ac4933163c7ed1724f2e112dc097d5718bdf84ba0114ccf90d7b1a4d9c89897d2a878da614bbccd6561e6e1fee8274a4215490f6d517f516cf9f57521d7f0154d0ff00124223dc7c8e30f68cc696f048c1b473c0f3b771e4da9ab08d11fafa5c6eed3a445e2faaa5825e1273036ffc23ceb2f9422fef32d0ab3fef2a010f10d03e7b105d0eaa74b0ccfe482012fc1ef3281bd50180087becf5b6d006cea2a7aafd263d0dbe915d11c68b9d49720706264ecf948b309ad241982e5f61aced1e9d7f9709cc43fc940836202004a067c24610dacc5b99ed77366f07e75aafd69ad67e3ced52c65897eee947d9b13347043764322ff2bb866efa8fc4e8ae9c192a20196a7da1ab90fdd1c9ba2caf31a969b0ec56bcc2bfce602568dac1c35bb288426e370724e402fcbdfc3bb9867ab5af81852b4d2df064ff3321fb98f57d0abbd0938cf82ebd916a0ccbad2eef8bb16f8ef5e0f715e9df13d4d71c2f4d9f9e1475bde2751d2cd47296be913250860771e28f9ef50c9554d751dc26dd408c5f8b155df7734c2f645cfa7d4471982c36d93f617bee89c95e5f559d3a7d22a7ff3e141e94c761d7908b0789780eb505d59d87e69beca4722a940a5e37dfb8963ed4109e02199abc3775db924cf005ade382bd6da1133bb2a4ce0ffd1aeec4c61bbeac5253a97c67d00f50e2d12b87b07f84ca0702ea13dd68fb5d112193dabbf5b35b4997ce413e53ebcc7c9afb2a6e98e99f3aea33c0ba293142926ef548505dfcd29d66b43e2aaa7fe93c27c1fe909f3851571a485ebbad9e8c158bb2b64f56ae1b48bb0cab150d407a1e769c08324904718ba20b174f65e8e285624612451b7de187a464bf693603e9280d0ae64e91212e94350e046b8fa4155ee8880e0352db01fac55b4e7cdbc2fb87f5bf938b03a9d44e51e4457ea6c50d244da2a0f2d5b1ca8e532813873cc4156598f104df7da1dcdc5e25e290145a0a022c91e88eaba277bcae82a44c8678bfefe760dd3c44d9dfa81666393d70d59eb243727b38f6592614008c679eba7e20a2bfb0eba90a5982f60fc45873bbf44828731ab80494af99d59badba8344948ffbc4f2cfdd4e79248415793748e126f3ffe0de1bb4d0c87aa3d0ec9bc9f85bddb69f6924dd362589a576ce1b53e37d8de7d64396594c3a5ba927cce1d7e6530d1d941683a4f0a55513439f68841bcc23b568a017ee1aa4dada33df061d8dca19df2e3047cfa13f7a9b9a9ea1e500b533e8362765af09de80b565e7cfa259cac403afc3c87ca9aa588f9b2abd9f97c936ecc18a995b111486f679249669e462b5f142808d2d8702ba43578c5fcc7777fcf58f1aa11cd36e7356448ea2392de9c3c3cac6d2f7b6ce6b3b449844f8001be366b30743e405f840e51803656f1a8f355fb28de8142b1ac65e429a22f981495dba52804768275f50a39453a69422304831853cf2c41b87048acc6c96d09ef6493296f68149756fbffcc0d2142ba12d106fc21073786a9afe0351361063882038c176e0d78099b3ba035b6b978c299279db0298ca1e1ef992d9fd28ca31631c8fc75791ad5d4439997f59c139e06eb8459295887603836a4db2fe75360a746fcc84375e5c773adae0f7f339c73689de9e9e12eaa294a55ef638881990d90e8803c1b58c77774753e269eb99c08484a2a7ec0a84eb7a37713c9ee50e45e4ee88bd076a49d206b9cb920361887ab0e904e1f7a05d5f08efcb0ab249cef54d6fdc7498882cb5cfcbd342903913a422b86daf7522a8138497993d52bdf14ef51972c494739b749288100f5534b46675b9f1836f962765ad1163220bbf88964bc225931899a6345fae8cf56a870227fc635a48f03b93ab4d00c07d11b3f3b9404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9 - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "4a65380efb23968ec4e286f586b75534", - "05694883d3c404f1d8b47e9fbd549b54", - "7f3cf5c57cf6d0cbf34499d01d22d658", - "5a56c8bd487dbe2b10b67953d410c35c", - "6ed49efba4ea71f136ff336832a11d1b", - "da7e9d4e9d81460377b2f1194c408db3", - "81d664d7cc02246fe3eb6ab50870bd23", - "861128d26d9cdd9ab4636f043a26972f", - "415824e1c635db11a958d3f3699a0e8c", - "6cb8d11c1e1abe64b43f9e9ca8a8588a" - ], - [ - "b79ac7f104dc69711f1d790a7948aacb", - "fd96b77c2c3bfb0e0b4b816042ab64ab", - "84c30a3a83092f34f0ba662fe2dd29a7", - "aaa93742b78241d4d34986ac2bef3ca3", - "972b61045b158e0ead00cc97cd5ee2e4", - "2c8162b1627eb9fc6c4d0ee6b3bf724c", - "86299b2833fddb900014954af78f42dc", - "82eed72d926322652f9c90fbc5d968d0", - "c8a7db1e39ca24ee3aa72c0c9665f173", - "9e472ee3e1e5419b2fc061635757a775" - ] - ], - "prep_messages": [ - "51b574601d2f7035e0c8a968e34e81cf949327f932a8fde13451f29aa7f9a2ac" - ], - "prep_shares": [ - [ - "30851472f3bdc07a4959bdfad085ddda3281c00d82d49622b634b22d1eef6d60f1ad80968db3f79ad81b0118fc88244fdebcb8c5155c84c275b9198d451faed352503eab54be0e1edc54ef2bb64e9a14076c4d7b8c45b64b08f2aef8bf0d0f14fe2b765a5af438ad81287fa54dc69a6f9090d54ef8b8326c7bb1de86da0a136ce01be313a26b3bf6f806ae40d5b8a42fa7c37fbaa057b0be8dbfaf8deb60dfe8462e47f72e56307e875305f445761211a216f0254108c6a2cf9026513be0552b8b3c93295aba7032a4e586e03a9e3032612cc0a5253c96ea0f141eed61a7955867f8d0e793e8db4418a504d33aa7f0e73705ace21ea56a0ad9ec9441f9e2b349d13349f0a6fe33ef5dbbb2e6fedf3d4697233f6c10eb723fe20565fe5f8ff759aeeb86681f49ad0ffcdee9e3a9ec2a90b365eab313a08a9e9867b26ff583e7a33dc7f458d6780bfb6e59801b3098aa5a51d4d87a0a3526a965bb01215988ac57", - "d17aeb8d0c423f859aa642052f7a2225996887bbb8c5e974168e8d32e89774afcf60c3ce65047c215a8ecd78cad6516556cdbdf20bea9d316a1662c8a2374c0f766297cf9f7c1df20768eef0302af42e566a04c54032235e7aa81cf952829e1336a7bada320159a2e224bacef11ba00aee542fe815df02579733deb63f8d321203e4190b73e2738340da8b81d7b229f999c841a5d07cd16fe4d30824dd3ead1906a4aeb88f360ec3388d7bf7835c9b4a01e087c01140e705a48902ec50684b2a5c8c3d07dcff55afc8a2a278e0993b9399e63b3729a507b636d2b777b4d09a1e381331cffcf0259930e14973f1d4795b4222b39302830134199c166cd3d020a7486c4be8d29b37fabcf73229c95d3ee7ae211b08e5e02e1c34316d92e6fafdc5698629f9db0d7ef317efcfcc20bc1c61a25ac48e8b2090ad4b965d239f3fdd4352636c2e157a7bb1671ac81f34de5805a84147336c6c2c783ad3b2bdee3d3c75" - ] - ], - "public_share": "3dc7f458d6780bfb6e59801b3098aa5a51d4d87a0a3526a965bb01215988ac5752636c2e157a7bb1671ac81f34de5805a84147336c6c2c783ad3b2bdee3d3c75", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "26592c04bc72803500f284c48149d3ae04827becc1530c74619388f1bb3c344f752b1e4ed693306c0a1d1f90001355d3c8727fc06c49304726df59bba46a0b4be4f4582f29855bc8df63723589d3c218ef20bad7c095a97d43abf967f81bf1fa100c59dd138c132d8be8aadb1521aa11a91463adbed40dd4051fe39bac22d9d56374166a0d709d638ab7afe476ab9a0067f3eb19b9a0c5f4313370bb94fb302020f12fbf60e297d00d5c7831258b53d6669dfb8b9a62de9228a2812abb345910c32548120b3429ea2a7294a7dd40942ee3de3ad8a918d701a656573ec43f523c9ea8a6451d190a3686c45223dc902819fd69e67daf19d544e139228844adf3aeede03b4a6ce137bf87e921e282b1200d953687bee8150815450de7a6365ed10330a17ac17dbc32ca4c3dda00c1eda43c1b3a46cc6b48389511be8996f8f275a281a83cc701ff2581db833e467e543cec113074f9ce8815b80460c5e7a0169dbccbdf37e7044ebf18c87f756de3360803398c4c68512e966132fc5d1021b348e8b04a76bcce82b55271b076c76421bb524689a5cf6a9cc17e82539a7aa9ab417e47b241db44cb7dcefbbae6227cd1ad204a53f1c3863856db4dc682fb0827b755195db4bf44991563ef4c28e15fa4432a0b1075e2b091b05cf8f6a77fa93f292d9744d3fa5f2c1bf2a4056923d4519a673b79ade7db4bf1fa35b09a5ad33a5ab3c3854dede1ad8d7b26cfd1a03c0b0a70b036ad24dcaf6ebdb5d225ab14e6270835730ad27c36a009b66c08d8f768f86197f79b6f4659d18fda078e3fa4f34e9c2aa2833c9a4e9cd890b356d9da9eabf0feed22dd69703132f2e72d60ed1ea9b073e92a47cdec7eaceee61be29796a2ee333691651d9acc121ac5e4f12ececff86a0d567741f62d23d6c8bc59c510de1660e5ce64138e8b7a66760ff100d28f1688d01fa394df1056a8ee5e308b29b1775cefaded40616270c6fcad2487f57243bc51f532b26ea1548329b4b8b6e86cbcf8e14ff20657a03fabe78dc1ac4933163c7ed1724f2e112dc097d5718bdf84ba0114ccf90d7b1a4d9c89897d2a878da615bbccd6561e6e1fee8274a4215490f6d417f516cf9f57521d7f0154d0ff00124123dc7c8e30f68cc696f048c1b473c0f3b771e4da9ab08d11fafa5c6eed3a445e2faaa5825e1273036ffc23ceb2f9422fef32d0ab3fef2a010f10d03e7b105d0eaa74b0ccfe482012fc1ef3281bd50180087becf5b6d006cea2a7aafd263d0dbe915d11c68b9d49720706264ecf948b2f9ad241982e5f61aced1e9d7f9709cc42fc940836202004a067c24610dacc5b99ed77366f07e75aafd69ad67e3ced52c65897eee947d9b13347043764322ff2bb866efa8fc4e8ae9c192a20196a7da1ab90fdd1c9ba2caf31a969b0ec56bcc2bfce602568dac1c35bb288426e370724e502fcbdfc3bb9867ab5af81852b4d2df064ff3321fb98f57d0abbd0938cf82ebd916a0ccbad2eef8bb16f8ef5e0f715e8df13d4d71c2f4d9f9e1475bde2751d2cd47296be913250860771e28f9ef50c9554d751dc26dd408c5f8b155df7734c2f645cfa7d4471982c36d93f617bee89c95e5f559d3a7d22a7ff3e141e94c761d7908b0789780eb505d59d87e69beca4722a940a5e37dfb8963ed4109e02199abc3775db924cf005ade382bd6da1133bb1a4ce0ffd1aeec4c61bbeac5253a97c67d00f50e2d12b87b07f84ca0702ea13dd68fb5d112193dabbf5b35b4997ce413e53ebcc7c9afb2a6e98e99f3aea33c0ba293142926ef548505dfcd29d66b43e2aaa7fe93c27c1fe909f3851571a485ebbad9e8c158bb2b64f56ae1b48bb0cab150d407a1e769c08324904718ba20b174f65e8e285624612451b7de187a464bf693603e9280d0ae64e91212e94350e046b8fa4155ee8880e0352db01fac55b4e7cdbc2fb87f5bf938b03a9d44e51e4457ea6c50d244da2a0f2d5b1ca8e532813873cc4156598f104df7da1dcdc5e25e290145a0a022c91e88eaba277bcae82a44c8678bfefe760dd3c44d9dfa81666393d70d59eb243727b38f6592614008c679eba7e20a2bfb0eba90a5982f60fc45873bbf44828731ab80494af99d59badba8344948ffbc4f2cfdd4e79248415793748e126f3ffe0de1bb4d0c87aa3d0ec9bc9f85bddb69f6924dd362589a576ce1b53e37d8de7d64396594c3a5ba927cce13265f695cfd229a96012061cdcc64f574e81b3a8f5ddd47e0a9a058683f30df0aa8e7157e53d2077c499b8b02b3720dce6ede68bbb5f5341f21df5e723bc855ab19fe500ab7bc1a6c7b80cba425a63f261eed6fbc959417e3c75ba835ee07ac93c11b6d677fe7a4d48f5380b31a9203484f36ed44deca03bc94255feb435398623b6d2be2eee3982d383780dd0f82376cac99cb53a48a5b4de0618f07a8aeffb552511020de0ec9c53e1214a44a655e01d24b0db83fe4384194c651184a1ebb8a36bd5b1b5a1c9c8b9890b018752c2b8a10cb0942b350fcec86de9247d5bfbb61566449886e9cedaad77f43ab9bffca363882038c176e0d78099b3ba035b6b9731abeff028c484a462fc98cc107a78db68fd340a87e25c4625c5d7edd6999250546d11088c869846f28af1162262f4fb08873d74b10e32805026c379899d9b3c2743c362f745ecc44996fc9485c9e05a17b87a3ee31dd69296e3ace40185438db1574f86664f892b60c93aebb0937a702c7391e5af0dc3375a49e507a56fdd96c6601be68c7deaaf2c2222691d9542c47ba65aa2c4f38e43d5cab393fac7260d3dadebe2c7f4485f29e191b96c593691d1770b46cbc7d737e1630a4e74271c5466704c1aeb799a8eb8a3de250e3933747b546c481ffa8de8c3b51290eaecd984129f43c0d814d54318f365415c442d26404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "4b65380efb23968ec4e286f586b75534", - "05694883d3c404f1d8b47e9fbd549b54", - "7e3cf5c57cf6d0cbf34499d01d22d658", - "5856c8bd487dbe2b10b67953d410c35c", - "6bd49efba4ea71f136ff336832a11d1b", - "d67e9d4e9d81460377b2f1194c408db3", - "7cd664d7cc02246fe3eb6ab50870bd23", - "801128d26d9cdd9ab4636f043a26972f", - "3a5824e1c635db11a958d3f3699a0e8c", - "64b8d11c1e1abe64b43f9e9ca8a8588a" - ], - [ - "b79ac7f104dc69711f1d790a7948aacb", - "fd96b77c2c3bfb0e0b4b816042ab64ab", - "84c30a3a83092f34f0ba662fe2dd29a7", - "aaa93742b78241d4d34986ac2bef3ca3", - "972b61045b158e0ead00cc97cd5ee2e4", - "2c8162b1627eb9fc6c4d0ee6b3bf724c", - "86299b2833fddb900014954af78f42dc", - "82eed72d926322652f9c90fbc5d968d0", - "c8a7db1e39ca24ee3aa72c0c9665f173", - "9e472ee3e1e5419b2fc061635757a775" - ] - ], - "prep_messages": [ - "742127e29a1b5e1189d4cdfda9ac8009d685c5a8c7e47c69876c5e79b22b5da8" - ], - "prep_shares": [ - [ - "30851472f3bdc07a4959bdfad085dddaabaa1bd83533d5731c3c1950389bb43e4469a50551796869287af7eca4a9c95499634bbd72fec4b858b7a272d7330838fa40ea557ef27460d92849406d429bd9bf139934d4f4eb941558b8ca631551bdfe2b765a5af438ad81287fa54dc69a6f74facac550b1882eaa28db2fd30a4ad16f05c1e6391ac3dbd009688250a28c34b4e3be87d3e293d46255d30598d73f222052b3c7b74177996498a8e52797815076c8eddd5b9111f0702f376d5cfbe852bbc1f5ef4e2318e589b808b106be3db0f1f89c7ed14a03be33bea9d592fc30c7f9530ee022aaa402651919cbc369f50e9c310b7e884c60d8f44dd4eaecbc81144661a8416f0672dbfe851e902590381cadb8227d92bc01e7e62b4e1c2a8577432c7159d74f1bf520bdf934b0bf23dadbacbc8254d5a255c0818c3e1e7190137a20e05d4f8235480af044b72b301d44e65378b4ba410d36aa85f4fcfb9deb7c39", - "d17aeb8d0c423f859aa642052f7a2225b210c9a6fdc9936ae13a7ab41bc21732cf60c3ce65047c215a8ecd78cad65165834d2bcf9ae252af25e03314f993dc77766297cf9f7c1df20768eef0302af42ee2bcda8f9b88a97bb8793101a38b149c36a7bada320159a2e224bacef11ba00a6de383887d13260c5b1600de3fd6e6a603e4190b73e2738340da8b81d7b229f98a572393e4c02dbacfca54406ec565e906a4aeb88f360ec3388d7bf7835c9b4abcdf43643287a03d41d34ad6941173155c8c3d07dcff55afc8a2a278e0993b93e2eb193b501db62fc13ce2fe4e686c50381331cffcf0259930e14973f1d4795b93548b77b345e1e5e0e6ccd85c18be86486c4be8d29b37fabcf73229c95d3ee76258b7cb151e9e50638881b31539c2f5698629f9db0d7ef317efcfcc20bc1c61a25ac48e8b2090ad4b965d239f3fdd4352636c2e157a7bb1671ac81f34de5805a84147336c6c2c783ad3b2bdee3d3c75" - ] - ], - "public_share": "20e05d4f8235480af044b72b301d44e65378b4ba410d36aa85f4fcfb9deb7c3952636c2e157a7bb1671ac81f34de5805a84147336c6c2c783ad3b2bdee3d3c75", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - }, - { - "input_shares": [ - "26592c04bc72803500f284c48149d3ae05827becc1530c74619388f1bb3c344f762b1e4ed693306c0a1d1f90001355d3c9727fc06c49304726df59bba46a0b4be5f4582f29855bc8df63723589d3c218f020bad7c095a97d43abf967f81bf1fa110c59dd138c132d8be8aadb1521aa11aa1463adbed40dd4051fe39bac22d9d56374166a0d709d638ab7afe476ab9a0068f3eb19b9a0c5f4313370bb94fb302021f12fbf60e297d00d5c7831258b53d6679dfb8b9a62de9228a2812abb345910c42548120b3429ea2a7294a7dd40942ee4de3ad8a918d701a656573ec43f523c9fa8a6451d190a3686c45223dc902819fe69e67daf19d544e139228844adf3aeede03b4a6ce137bf87e921e282b1200d963687bee8150815450de7a6365ed10331a17ac17dbc32ca4c3dda00c1eda43c1c3a46cc6b48389511be8996f8f275a282a83cc701ff2581db833e467e543cec123074f9ce8815b80460c5e7a0169dbcccdf37e7044ebf18c87f756de33608033a8c4c68512e966132fc5d1021b348e8b04a76bcce82b55271b076c76421bb524789a5cf6a9cc17e82539a7aa9ab417e48b241db44cb7dcefbbae6227cd1ad204b53f1c3863856db4dc682fb0827b7551a5db4bf44991563ef4c28e15fa4432a0c1075e2b091b05cf8f6a77fa93f292d9844d3fa5f2c1bf2a4056923d4519a673c79ade7db4bf1fa35b09a5ad33a5ab3c3854dede1ad8d7b26cfd1a03c0b0a70b136ad24dcaf6ebdb5d225ab14e6270836730ad27c36a009b66c08d8f768f86198f79b6f4659d18fda078e3fa4f34e9c2ba2833c9a4e9cd890b356d9da9eabf0ffed22dd69703132f2e72d60ed1ea9b074e92a47cdec7eaceee61be29796a2ee343691651d9acc121ac5e4f12ececff86a0d567741f62d23d6c8bc59c510de1661e5ce64138e8b7a66760ff100d28f1689d01fa394df1056a8ee5e308b29b1775defaded40616270c6fcad2487f57243bd51f532b26ea1548329b4b8b6e86cbcf9e14ff20657a03fabe78dc1ac4933163d7ed1724f2e112dc097d5718bdf84ba0214ccf90d7b1a4d9c89897d2a878da615bbccd6561e6e1fee8274a4215490f6d517f516cf9f57521d7f0154d0ff00124223dc7c8e30f68cc696f048c1b473c0f4b771e4da9ab08d11fafa5c6eed3a445f2faaa5825e1273036ffc23ceb2f94230ef32d0ab3fef2a010f10d03e7b105d0faa74b0ccfe482012fc1ef3281bd50181087becf5b6d006cea2a7aafd263d0dbe915d11c68b9d49720706264ecf948b309ad241982e5f61aced1e9d7f9709cc43fc940836202004a067c24610dacc5b9aed77366f07e75aafd69ad67e3ced52c75897eee947d9b13347043764322ff2bc866efa8fc4e8ae9c192a20196a7da1ac90fdd1c9ba2caf31a969b0ec56bcc2c0ce602568dac1c35bb288426e370724e502fcbdfc3bb9867ab5af81852b4d2df164ff3321fb98f57d0abbd0938cf82ebe916a0ccbad2eef8bb16f8ef5e0f715e9df13d4d71c2f4d9f9e1475bde2751d2dd47296be913250860771e28f9ef50c9654d751dc26dd408c5f8b155df7734c30645cfa7d4471982c36d93f617bee89ca5e5f559d3a7d22a7ff3e141e94c761d7908b0789780eb505d59d87e69beca4732a940a5e37dfb8963ed4109e02199abd3775db924cf005ade382bd6da1133bb2a4ce0ffd1aeec4c61bbeac5253a97c68d00f50e2d12b87b07f84ca0702ea13de68fb5d112193dabbf5b35b4997ce413f53ebcc7c9afb2a6e98e99f3aea33c0bb293142926ef548505dfcd29d66b43e2aaa7fe93c27c1fe909f3851571a485ebbad9e8c158bb2b64f56ae1b48bb0cab150d407a1e769c08324904718ba20b174f65e8e285624612451b7de187a464bf693603e9280d0ae64e91212e94350e046b8fa4155ee8880e0352db01fac55b4e7cdbc2fb87f5bf938b03a9d44e51e4457ea6c50d244da2a0f2d5b1ca8e532813873cc4156598f104df7da1dcdc5e25e290145a0a022c91e88eaba277bcae82a44c8678bfefe760dd3c44d9dfa81666393d70d59eb243727b38f6592614008c679eba7e20a2bfb0eba90a5982f60fc45873bbf44828731ab80494af99d59badba8344948ffbc4f2cfdd4e79248415793748e126f3ffe0de1bb4d0c87aa3d0ec9bc9f85bddb69f6924dd362589a576ce1b53e37d8de7d64396594c3a5ba927cce11a00c3eccbdb49f940fdc81b40cecc32285f00a3875226d335ee52bfc0f970d48bb36863e6c44819b3df4e50c35867d9aa1e1dcb9f5ad91374adaa984b12c65b8e769d358d5cf3a5017414a185b5dbca117ff597dfb823f65f348d69bb532c82b25714d2a62616c14b6551689e80aa73e413c0f635c9e6828a4c8910b790ad5deb477e71de50ccb035e812430cb830e3e55eba2a16af62683394c15614a6f4d50f6dc319b0bd50bc25a59a96819fab494c35753b1b4bc7c23bb083102e4c802f27bdeddcc1c58275d0d6f105c2270f738fd8b4d95336f381f93e8908ba68bb532041d1e44f126859fe72ba496e0e4d0d63882038c176e0d78099b3ba035b6b974910239a2cbb64548211d6ccac72fbff8e1fe80ff56d0bf2f9708ab499932f6c73481afc8aff6fa403455b778a40adfe44560735cd13acadce960dc961475b3b4a6c0b2e1565bac50fdbf4ad426e688267275ca2cdbef31a7324dafea41192d43b11f18a3727eeb75c59228e43bcf030cc5240c3c7307df0983fb1f5a21469bffece6f33dd1a5881cabd8733e1d5355760113d2de98cd18f803d0a2d61ac2133826539cb2417e53f731d196d2f60e027a26646e6337b54f9beffeb4eca7c87dde21e34efde55e1e1a156f820d363e6b98d886703f7f8a93493e472acaddf19e807c4b6730fec3bc5c7f79f32a7f5dcbc404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": [ - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255 - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "4966380efb23968ec4e286f586b75534", - "036a4883d3c404f1d8b47e9fbd549b54", - "7c3df5c57cf6d0cbf34499d01d22d658", - "5657c8bd487dbe2b10b67953d410c35c", - "69d59efba4ea71f136ff336832a11d1b", - "d47f9d4e9d81460377b2f1194c408db3", - "7ad764d7cc02246fe3eb6ab50870bd23", - "7e1228d26d9cdd9ab4636f043a26972f", - "385924e1c635db11a958d3f3699a0e8c", - "62b9d11c1e1abe64b43f9e9ca8a8588a" - ], - [ - "b79ac7f104dc69711f1d790a7948aacb", - "fd96b77c2c3bfb0e0b4b816042ab64ab", - "84c30a3a83092f34f0ba662fe2dd29a7", - "aaa93742b78241d4d34986ac2bef3ca3", - "972b61045b158e0ead00cc97cd5ee2e4", - "2c8162b1627eb9fc6c4d0ee6b3bf724c", - "86299b2833fddb900014954af78f42dc", - "82eed72d926322652f9c90fbc5d968d0", - "c8a7db1e39ca24ee3aa72c0c9665f173", - "9e472ee3e1e5419b2fc061635757a775" - ] - ], - "prep_messages": [ - "b872bdbca9e832071e6ab0a90939e9210fc7d681bbc3346469b97e161022217c" - ], - "prep_shares": [ - [ - "30851472f3bdc07a4959bdfad085ddda9a06b806845b7af3bb01a3f0f24f7f6567b1f70d10208b81dbc03dc1e7a7fc80e127e9791b34e34069a02b62fdcf87e025478289e580d3375ce797bb49682c39588a3fd355bae1a0f46b434218ddba63879b1b9317c93082b53f394c3fdc35122c2bd265657a91b82246f8b57b277dbe0d98bbe550ea01989330fc001fd485df81100910daf35dfa6ba05a2d4b69e0c486a4349ed7c50471159f656d4473189cc15d444072002bd1bb07aa6ccb730ae729cf8d28718aafee660c1b5f09d029dda581d449b11aacb84c107811b30f929024e72f241ba21c2aeacf0eb22472d74cd7a8299552ebeaa02fad6623117d389097ddbe8e309b7e06403312eccee0798cffe073cbab5a9ee5f4f03acac562147f4eb9abdf0ec217398c407b8402220d08a0480f806f55ffb452ffd3ae495e41f41fcda512f21c14d0d6f7ee6f3411c34a788f8d9cbd8a7b3d6b44b4ff7b1ca0ef", - "d17aeb8d0c423f859aa642052f7a2225ca5b009cd7de275c61ecee672a873134cf60c3ce65047c215a8ecd78cad6516527941d2e7706ff22a0b5b6d4e319f969766297cf9f7c1df20768eef0302af42e8256f7782ac0d2abac96e11bc359a63236a7bada320159a2e224bacef11ba00aec1d4c7d8888d1018be9b0e043105ac403e4190b73e2738340da8b81d7b229f9b78d088b9e29d2b0267727444ba7377506a4aeb88f360ec3388d7bf7835c9b4afd18c571cf85d75d10333bc86fdb830e5c8c3d07dcff55afc8a2a278e0993b93357bbac1ce5c784e5f6f92ed22fd55e8381331cffcf0259930e14973f1d4795bb2bc7c75a022a242bdba746734a2ebb9486c4be8d29b37fabcf73229c95d3ee7b7b485f702b007e23fe6ecbe295ffd86698629f9db0d7ef317efcfcc20bc1c61a25ac48e8b2090ad4b965d239f3fdd4352636c2e157a7bb1671ac81f34de5805a84147336c6c2c783ad3b2bdee3d3c75" - ] - ], - "public_share": "1fcda512f21c14d0d6f7ee6f3411c34a788f8d9cbd8a7b3d6b44b4ff7b1ca0ef52636c2e157a7bb1671ac81f34de5805a84147336c6c2c783ad3b2bdee3d3c75", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - } - ], - "shares": 2, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3SumVec_1.json b/vdaf/prio3/testdata/Prio3SumVec_1.json deleted file mode 100644 index 865c2658..00000000 --- a/vdaf/prio3/testdata/Prio3SumVec_1.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "agg_param": "", - "agg_result": [ - 45328, - 76286, - 26980 - ], - "agg_shares": [ - "1804634db47edf168657b3954adfe41316ac15c1a9746b5e78002e5e9c25b59c790ca00130c66787bd77eb5cfff9cc42", - "21c51bfc8419ef45fbb04ca38ca00091a1461d555042156101e21121ac1c4bacdd05a734256825585d624cf21a38e606", - "d8e781b6c66731a362f7ffc628801a5b4937cee905497f404e1dc080b7bdffb60f57b9c9aad17220c925c8b0e5cd4cb6" - ], - "bits": 16, - "chunk_length": 7, - "ctx": "736f6d65206170706c69636174696f6e", - "length": 3, - "prep": [ - { - "input_shares": [ - "85d237df3416b710eaf3a8de047980d218fc28c39f5fbdc7aee7b838034e2ea98dba20fb535040a21d805c78b8322906c8466acbbcd3a641dd4fec7fab05a795dacdef8c4cb6e6d1bf77b2a2559ad3e926540dfd13e8879173995a3b17c6a6622ee49768084ab70a6e423614bee0b6780036300b36517532168778de9ba321669ca5f321fcf73afbdc9c6255ef66d37d1ce1c390dff9607aabca6a32253aa447de9cfe68ca30827938402d0394cd892bef1e4dce1bdc57534069593d91430c2c85936d12debb90b07f1d32bcc28d8567b53ea47fd94ec9b90cfde39cada3ebba6f0d309e8aee29b9634b596880de0a02e8f44feab8f1144bfb3ce4e9002d1e2611e1ca567c63786f2c062f3540a0050a17f3459e79ab568caf1a5b1c52d29220352eeecc342967ef412a96894c8dd0ea8819c00bedcc2219b5b95e21e67e5aa0edf98064dab57378adeec40ebe5982234825b2f5908a4a7efc07ef57f1187f5e64ae268bfa646ecd80b6df6fac333cc00f42d8348600bb607321323d7124b7a2fa0bacbf03f6cc690f4cf3be68868e97076828c70b0a9ab0d5e3599aa879957d3cbd7e6a59e677b3a4da26762aeeeb4c153f9241696613516f5d482f2d4246dd3944219e92bb6ba6d949af52205d6c7d9b567cf84d1fe21b3f19ebc1914904134e69146421b186095e05d395b64bbecf9bf21fee1a693853cccc0470e54001fd61fa4a5ad4be1b4f19b64e21111480b44538cbe6c5bce974ec414b8df52c839034f2fbff2ed7d67718d30778989eaf5b1c8fb01416cec455ed2c6416177e584ee49dd204f3778d1ef9ab9470c30e647eecbf80ab482bbf1ca41f6c4b00d62768ece36f6fb8a8ce3aa5e8f9207bec4e86db5cb574a5ad703c679969032234468443414ffe96ca893f500eedda1fb53ad4716099b995e120e7dc403f80ff4d814d90dcd1303a74b17aba4cc44c095d8c6b456b0a2ac415109f50290159a9a921816e85d9247a41f37f4afdaa4228312229285108a505a3981051f69430896bc9c760345d6602926413d003ad380e568f3fd365382c314b3076d34a9458cce0183ed096ab0f8259502653ba7eb6be635cf02306340bb5c0d658db16ebac3afad4d415f0fd316a153fcce9b964ac4d870a7160989de29100e87fafba45028201fe8fb1290b3de20651f31ed9dcb835d1089489f3369181a57c34c979a40d13c46c4969bd4b798e004453664618d913a7c34894ba39657863680ea27a3538cae4403847043556c67a98eadfbadc8baab039f00d7b760f8a884faee09fdd838680892ab9760212182dc94aa845c4283a3216d7b8faea7a3457ca7d25d5d9040ac222bc99731d3c8060a2d375e308d66669ac94ae5dea63d994b2a1066a22b8ed121f1d2826506cd8021805e0b8d9b0fd336f736c95f3c09ca69acf80cbc3902c82deb1aad46069966473963266d6bd940b111f6e32519adaf794df9b12ad363ce1e6fc3ff5adf4fafaa3ff9ede2fe8ef168fb4da702baf8ebddaf3fee4bc268256fca2dada5cb790e2b90c9149ebf1cdb799d83c2b7f36bd78e5604a4357f94d613ecade628f07d234d01c5fc1d6a2f92a97a90221012a0c778ddfba30030d577ab6a3cc314b60c8f1dae1010f7e1bf5c8733dffcadb3e3188dc67527433da7638d0151a9e55a7d33f676ebda360cc9910beee90adae1cd3a3f473e696a95b8dfa41a1af4dbbdbc36e3830ec21a81451030e35808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", - "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - ], - "measurement": [ - 10000, - 32000, - 9 - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "1398cb193c2af55c231d91dc18f5f65b", - "b3fdb195387cce74c9aa641f34b79189", - "bb8b8a001042cdd7357d4e74aaa8996b" - ], - [ - "0b975ea98108a56cfe3ac48bd98a5530", - "e16cb471c5c0b17598a0b0b58e0919e4", - "4a57e2660c780cc8157619a6b312a257" - ], - [ - "f3f7d53c42cd6536c2a7aa970d80b373", - "6e129af801c37f1566b4ea2a3d3f5592", - "051d9398e3452660980c98e5a144c43c" - ] - ], - "prep_messages": [ - "5f149db2819d9d191f3cd67607cd4caef93159eccca7b4d6e361c7600788f808" - ], - "prep_shares": [ - [ - "51ffd96b532bbf0a52b2f58afc18ea46b1bcc466517198a06a5bb42070cf1d65b68dc64cd0b7bdff12d1453c0054ec535bbd88534d772a2adf54b1591a86bef0e111287229a4312f5cab84dbc74d9eb98226ef05a212f9e1ea5e51000f58ce01ff9441e04969bfe462477158c315340247f6ab86ec35cbca52ae725052a638f93a92bffa1fb71b5df9e430cae0faaaf98a2680a08468768a63abd64a833cd957663b0692b883cf48b4842d80726ad72071fd0bb8ed32ee320abaabed6a432cb6e8844ccf827cc82d67ceaba64c90747004682cb73f9257471f56eb7cd3ad350c3d4644f2575d9b9990869c8bc6d2d4b5afcdedcb1020ce9c886fb1c9db93294cb242c3cfaa7fc6323782d2222eed6660ef11346f78130b02403982d787950aea", - "aab8956a8796a121e384dd5b9dc2e196871d3ab10076502513f46fd7a72f373d141a07a44f86f00b2cda02dd817a2f85a87766501ac368bc9f29a862143b7c1c5a3e85c1d31a279ed84cdc4d85c2d8f59005187b9df36e720282b51a0460def5198aa0dfed40b6a0773b3ce324359ebf7ae08d19b50ed5a58c41503e6a3443c20e2c33641f01626049d3db97f76f821391f766c07cbd2c46ce5c81024ce0f77aae872b1c5d6d756b9c775ac1323c62b123c770aca3a88e68953eed6d4fd76e70c2ee08eefab0858accb535da8cf86797537149a9c2e3e896542a47b359450b59e4c0a111242a58794b041e62036641582ad14b4e015b35082a9189535becf26364431e50f84337393bc357c54663ecd37a782e41bc39fc532d5e10c817752c33", - "06489029253e9fd3aec82c1966243422e4f448da422e967346db1ad2b1e3f68330ba45d7f57de164b3aa9ece4b77a8902e0f799d8d206f26f5f6e7dddfd20394f7a49102dd52135c07ef99e633b2848fb893bbaaaf0fe6a07608847875034e20795b72dfef7b53cb39a6208babe70df25ceb088e02abebc02c3a22a62e0f3e540831d61e841d524e544f908c340bd58e3ee4dd62b4d09aaf04df00ab5bd68ac2e644b746b9f82276c8f72826491ab372e7adce3e529bdccae0b827d13e4b6caac61a73afaf94c56913006bc1df239fd541b66337484cd54ede29ecb2d95bd253afc72b98fe4b97278f0eae2ba038a2d60064cd25924c14665cc237834039da18c5d05045a2b15b194640d6871bb714f4693ee2ee8d0e5861ec969310aa2bcc77" - ] - ], - "public_share": "b242c3cfaa7fc6323782d2222eed6660ef11346f78130b02403982d787950aea64431e50f84337393bc357c54663ecd37a782e41bc39fc532d5e10c817752c33c5d05045a2b15b194640d6871bb714f4693ee2ee8d0e5861ec969310aa2bcc77", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf" - }, - { - "input_shares": [ - "85d237df3416b710eaf3a8de047980d219fc28c39f5fbdc7aee7b838034e2ea98eba20fb535040a21d805c78b8322906c9466acbbcd3a641dd4fec7fab05a795d9cdef8c4cb6e6d1bf77b2a2559ad3e926540dfd13e8879173995a3b17c6a6622ee49768084ab70a6e423614bee0b6780136300b36517532168778de9ba321669ca5f321fcf73afbdc9c6255ef66d37d1ce1c390dff9607aabca6a32253aa447dd9cfe68ca30827938402d0394cd892bf01e4dce1bdc57534069593d91430c2c85936d12debb90b07f1d32bcc28d8567b43ea47fd94ec9b90cfde39cada3ebba700d309e8aee29b9634b596880de0a02e8f44feab8f1144bfb3ce4e9002d1e2612e1ca567c63786f2c062f3540a0050a18f3459e79ab568caf1a5b1c52d29220362eeecc342967ef412a96894c8dd0ea8919c00bedcc2219b5b95e21e67e5aa0eef98064dab57378adeec40ebe5982234825b2f5908a4a7efc07ef57f1187f5e64ae268bfa646ecd80b6df6fac333cc01042d8348600bb607321323d7124b7a2f90bacbf03f6cc690f4cf3be68868e97076828c70b0a9ab0d5e3599aa879957d3cbd7e6a59e677b3a4da26762aeeeb4c153f9241696613516f5d482f2d4246dd3844219e92bb6ba6d949af52205d6c7d9a567cf84d1fe21b3f19ebc1914904134e69146421b186095e05d395b64bbecf9bf21fee1a693853cccc0470e54001fd61fa4a5ad4be1b4f19b64e21111480b44538cbe6c5bce974ec414b8df52c839035f2fbff2ed7d67718d30778989eaf5b1b8fb01416cec455ed2c6416177e584ee59dd204f3778d1ef9ab9470c30e647eedbf80ab482bbf1ca41f6c4b00d62768ede36f6fb8a8ce3aa5e8f9207bec4e86dc5cb574a5ad703c679969032234468444414ffe96ca893f500eedda1fb53ad4726099b995e120e7dc403f80ff4d814d90dcd1303a74b17aba4cc44c095d8c6b466b0a2ac415109f50290159a9a921816e85d9247a41f37f4afdaa4228312229285108a505a3981051f69430896bc9c760345d6602926413d003ad380e568f3fd365382c314b3076d34a9458cce0183ed096ab0f8259502653ba7eb6be635cf02306340bb5c0d658db16ebac3afad4d415f0fd316a153fcce9b964ac4d870a7160989de29100e87fafba45028201fe8fb1290b3de20651f31ed9dcb835d1089489f3369181a57c34c979a40d13c46c4969bd4b798e004453664618d913a7c34894ba39657863680ea27a3538cae4403847043556c67a98eadfbadc8baab039f00d7b760f8a884faee09fdd838680892ab9760212182dc94aa845c4283a3216d7b8faea7a3457ca7d25d5d9040ac222bc99731d3c8060a2d375e308d66669ac94ae5dea63d994b2a1066a22b8ed121f1dd3ae400cae0e1383886d41136d0e6071a071c5be582ad8dfc9d9102e3e1e53341bf0ca7e57c66ba20b621ff971210cee0f1349f273c8d9ba27a3d86e00f5371c61a66b6f7871d1f68b74a51e3268af1530080d8c95a17b8b2175af159619bf5389a18c7f2cf48b2496e527b5f83ea4123c2b7f36bd78e5604a4357f94d613eca33da9e67fc28d59eb60c6f408a50a6abcd442f2c50f34fcf8d22b66f45de41215c16e14a0790e2d50c1335e017b3786e5eeae3e697b7978cc6e307a2b2247ff6f7ec972c56c93977ec0deb9557bf9d8d3a16cd3fccbf53dcc306b76c79377ff000878b13285d6618e7856b51267c03fb808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", - "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - ], - "measurement": [ - 19342, - 19615, - 3061 - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "91bccb193c2af55c231d91dc18f5f65b", - "52cdb195387cce74c9aa641f34b79189", - "a7978a001042cdd7357d4e74aaa8996b" - ], - [ - "0b975ea98108a56cfe3ac48bd98a5530", - "e16cb471c5c0b17598a0b0b58e0919e4", - "4a57e2660c780cc8157619a6b312a257" - ], - [ - "f3f7d53c42cd6536c2a7aa970d80b373", - "6e129af801c37f1566b4ea2a3d3f5592", - "051d9398e3452660980c98e5a144c43c" - ] - ], - "prep_messages": [ - "41e9ead9a8d4e83123f351ac162baee8858e3fbcee01e3e8e13395366342b087" - ], - "prep_shares": [ - [ - "51ffd96b532bbf0a52b2f58afc18ea46a7db6073a8e4f3f865b395dc0cd1d058a4234ca38722c594b0703d09cb9459f5a22eb285bbd2b0ee4f5e3bdf2d4ae2d2512f455169be0941be0732caab35d6da9f2c9776928454e1d3fc0cd81a24eb5863d164f547fa99f707b07d7c8026e94a1377e42283ab96c6f87b1381744d9ef9ade7d4310a98df24bb1872685ecf4bbc882679a0c0362cf08d39087cb2d04e5648bdd61c75604deb6a46c7603c8f438058da54fbb71d7d7aeca16630d4fd8e4c8c8a19a2654e04e85c86318413bcad9f27214639b1ce14d2aa5a8c6b46e81a54bef63b9d274521fc0e140a4dd8c9fc3d392397dabc861a9f444bcdffe48ac0e57bbadfa788aa88120a30d451bacc73bd95c77e9064fb21ec1a6283cd6241849c", - "aab8956a8796a121e384dd5b9dc2e196802208434ffa07ff6587ccc3c1fe8b58141a07a44f86f00b2cda02dd817a2f85ae6d940e21f1c96da205eccbab7602ab5a3e85c1d31a279ed84cdc4d85c2d8f52563bd07c9e0b151b4fdcc2cd5a3d70a198aa0dfed40b6a0773b3ce324359ebf1d76b0e274e051994c1a2e52e7815c4f0e2c33641f01626049d3db97f76f8213adb74cb2a3df578f6167df6e23ec6a3eae872b1c5d6d756b9c775ac1323c62b18f008a01fecf62323f15646a128a03e1c2ee08eefab0858accb535da8cf86797c44358b7cded05599af684c58a71f9a7e4c0a111242a58794b041e62036641582ad14b4e015b35082a9189535becf26364431e50f84337393bc357c54663ecd37a782e41bc39fc532d5e10c817752c33", - "06489029253e9fd3aec82c19662434225c32244c91840c8e5c34b2c8b4a4fdda30ba45d7f57de164b3aa9ece4b77a89098e5c001b43ee1a8859f1209a558442af7a49102dd52135c07ef99e633b2848ff4fa08143e1db73c9f4e3b20dd54d500795b72dfef7b53cb39a6208babe70df241530c60fe60d633c1550d3d3abb9bb30831d61e841d524e544f908c340bd58e30de8e27e9159683932fecc6b204b185e644b746b9f82276c8f72826491ab3720d708a06b466290917f1380aee393ac0c61a73afaf94c56913006bc1df239fd5b8fdcfecff6c7df4dbefb49a8b7c77a5afc72b98fe4b97278f0eae2ba038a2d60064cd25924c14665cc237834039da18c5d05045a2b15b194640d6871bb714f4693ee2ee8d0e5861ec969310aa2bcc77" - ] - ], - "public_share": "7bbadfa788aa88120a30d451bacc73bd95c77e9064fb21ec1a6283cd6241849c64431e50f84337393bc357c54663ecd37a782e41bc39fc532d5e10c817752c33c5d05045a2b15b194640d6871bb714f4693ee2ee8d0e5861ec969310aa2bcc77", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf" - }, - { - "input_shares": [ - "85d237df3416b710eaf3a8de047980d219fc28c39f5fbdc7aee7b838034e2ea98dba20fb535040a21d805c78b8322906c8466acbbcd3a641dd4fec7fab05a795dacdef8c4cb6e6d1bf77b2a2559ad3e927540dfd13e8879173995a3b17c6a6622fe49768084ab70a6e423614bee0b6780036300b36517532168778de9ba321669ba5f321fcf73afbdc9c6255ef66d37d1ce1c390dff9607aabca6a32253aa447de9cfe68ca30827938402d0394cd892bf01e4dce1bdc57534069593d91430c2c86936d12debb90b07f1d32bcc28d8567b53ea47fd94ec9b90cfde39cada3ebba6f0d309e8aee29b9634b596880de0a02e8f44feab8f1144bfb3ce4e9002d1e2612e1ca567c63786f2c062f3540a0050a18f3459e79ab568caf1a5b1c52d29220362eeecc342967ef412a96894c8dd0ea8919c00bedcc2219b5b95e21e67e5aa0eef98064dab57378adeec40ebe5982234825b2f5908a4a7efc07ef57f1187f5e65ae268bfa646ecd80b6df6fac333cc00f42d8348600bb607321323d7124b7a2f90bacbf03f6cc690f4cf3be68868e97076828c70b0a9ab0d5e3599aa879957d3bbd7e6a59e677b3a4da26762aeeeb4c143f9241696613516f5d482f2d4246dd3844219e92bb6ba6d949af52205d6c7d9b567cf84d1fe21b3f19ebc1914904134e69146421b186095e05d395b64bbecf9bf21fee1a693853cccc0470e54001fd60fa4a5ad4be1b4f19b64e21111480b44638cbe6c5bce974ec414b8df52c839035f2fbff2ed7d67718d30778989eaf5b1b8fb01416cec455ed2c6416177e584ee49dd204f3778d1ef9ab9470c30e647eedbf80ab482bbf1ca41f6c4b00d62768ede36f6fb8a8ce3aa5e8f9207bec4e86db5cb574a5ad703c679969032234468444414ffe96ca893f500eedda1fb53ad4716099b995e120e7dc403f80ff4d814d91dcd1303a74b17aba4cc44c095d8c6b466b0a2ac415109f50290159a9a921816f85d9247a41f37f4afdaa4228312229285108a505a3981051f69430896bc9c761345d6602926413d003ad380e568f3fd365382c314b3076d34a9458cce0183ed096ab0f8259502653ba7eb6be635cf02306340bb5c0d658db16ebac3afad4d415f0fd316a153fcce9b964ac4d870a7160989de29100e87fafba45028201fe8fb1290b3de20651f31ed9dcb835d1089489f3369181a57c34c979a40d13c46c4969bd4b798e004453664618d913a7c34894ba39657863680ea27a3538cae4403847043556c67a98eadfbadc8baab039f00d7b760f8a884faee09fdd838680892ab9760212182dc94aa845c4283a3216d7b8faea7a3457ca7d25d5d9040ac222bc99731d3c8060a2d375e308d66669ac94ae5dea63d994b2a1066a22b8ed121f1d3d88e532ff5ad471ce5611e1cef203e86db1315be762648ecb578a09df60921c2192a42ba72f618d3ff11ec21dfb5400b6a1797b6878b0f676e414da6d5daeb53abb0efb3e9ee48da608dcc3a87b27cb86fd833c034ade3db7cdb647b2b3d32996abb215aa7ca129b68c82477c96aa6c3c2b7f36bd78e5604a4357f94d613ecac900fa40abdc13b070239f72286c02350005c38fc1bac3208ca43c94a49b02395574079eb726edeaf48335176cd92f5cb75bb35da307c15077a2cb3645bc085d1fd8f4a08f9c26e0b579b4f0e0ab25d8e320568f5e17f1294aaeaf3a5d9d6a1af37c657daad45013c7de10bfa224fda0808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", - "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - ], - "measurement": [ - 15986, - 24671, - 23910 - ], - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "75afcb193c2af55c231d91dc18f5f65b", - "12e1b195387cce74c9aa641f34b79189", - "18e98a001042cdd7357d4e74aaa8996b" - ], - [ - "0b975ea98108a56cfe3ac48bd98a5530", - "e16cb471c5c0b17598a0b0b58e0919e4", - "4a57e2660c780cc8157619a6b312a257" - ], - [ - "f3f7d53c42cd6536c2a7aa970d80b373", - "6e129af801c37f1566b4ea2a3d3f5592", - "051d9398e3452660980c98e5a144c43c" - ] - ], - "prep_messages": [ - "9cccd419e212147f7e2caed91fbf740e30f2c0b9f644a87d0fc821fbd4d1aa5e" - ], - "prep_shares": [ - [ - "51ffd96b532bbf0a52b2f58afc18ea46e5ce4000200771e413f4cb24396df1a980e32429d5a7424669b4f6f382953063689d00cfef825fdb7baaf88dc5cb203fb5ab15bbd59114354436f75364cfbbd5ff35161ad479308b2ff312c74571caadc27c4bd0934dea828e194d75e35d58411e7a622a90facb38774ac5379205a898eb63d8e9e3a2210d7c22866b61c87eec8cf85dd11a18dfc671bccd58013f06ecdf15d75776293b80fd5fce226f579e6c3bab427d7bfd99e140be2fa1b2e244545a027d22dc1ed7418d9713512eafe0b3d73ab915ae58a08fea6ec80335cc6b1437e2c0dc3bf389b85fee46921ce28851a4fdb3535e345d369838f07ebcf08cdc8f4a5eed4b1e0e0ebaab6a40b65d4241a95c71dfb8f60fcb6bd19f45194478af", - "aab8956a8796a121e384dd5b9dc2e1960ce03fd2e16533a01365b236961d2415141a07a44f86f00b2cda02dd817a2f8537c237958110c96d2102807b0548e9ff5a3e85c1d31a279ed84cdc4d85c2d8f56fd7e1a0188accc8a4776d94782f2431198aa0dfed40b6a0773b3ce324359ebfd5816fc12f785be11f10952ae7129e680e2c33641f01626049d3db97f76f821397efa1f9703b923a4abd8a57ded162ffae872b1c5d6d756b9c775ac1323c62b167c309d1516223a712dfecf56eaef3d5c2ee08eefab0858accb535da8cf867971796f7cbf8bb8b6a03cde19192a18518e4c0a111242a58794b041e62036641582ad14b4e015b35082a9189535becf26364431e50f84337393bc357c54663ecd37a782e41bc39fc532d5e10c817752c33", - "06489029253e9fd3aec82c196624342279049ceb3f21fd8c7d73c37d120de61530ba45d7f57de164b3aa9ece4b77a8904082bda778407df26d1241d8e5cf2e9cf7a49102dd52135c07ef99e633b2848f81d3bbb9d291e6ea6a7652efb15f189d795b72dfef7b53cb39a6208babe70df2a6dd97f9a9c0cb4a5db69df5229872ac0831d61e841d524e544f908c340bd58e500a50c4a2217580795f4d353dee2d34e644b746b9f82276c8f72826491ab372301ad37817bed53aa717e639f8418b63c61a73afaf94c56913006bc1df239fd5d944e2c21c01e3278b1699df9c4290bdafc72b98fe4b97278f0eae2ba038a2d60064cd25924c14665cc237834039da18c5d05045a2b15b194640d6871bb714f4693ee2ee8d0e5861ec969310aa2bcc77" - ] - ], - "public_share": "8f4a5eed4b1e0e0ebaab6a40b65d4241a95c71dfb8f60fcb6bd19f45194478af64431e50f84337393bc357c54663ecd37a782e41bc39fc532d5e10c817752c33c5d05045a2b15b194640d6871bb714f4693ee2ee8d0e5861ec969310aa2bcc77", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf" - } - ], - "shares": 3, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3Sum_0.json b/vdaf/prio3/testdata/Prio3Sum_0.json deleted file mode 100644 index dea8ec7c..00000000 --- a/vdaf/prio3/testdata/Prio3Sum_0.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "agg_param": "", - "agg_result": 100, - "agg_shares": [ - "21d79fba22fcea2e", - "44296045dc0315d1" - ], - "ctx": "736f6d65206170706c69636174696f6e", - "max_measurement": 255, - "prep": [ - { - "input_shares": [ - "43126178225dca30c56c892f4cef3ca6f627cae360f77d4b2994ee7fbe779a5892f97897b3c5ff28eb1156127a87cb71feca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa2ab3bdc62c1db973fabd7f72169d6d5dbe73437837c1c0662bb24addf7e07e6ae56db956b47ccc755b7c35912f67fb1b50659e637f1034ee3214ff4916ea9d1298a119d0e44c922bd17cc333224c31e67dc3282b61b9aab42ca71062aea44000cf3d13d667e8223477604725e654230e2a7fe703f610869e9f65d5a00203af41da5120d8850de22994a3f5de88910257bf11730c7721c63d712f309ff1a16961a6870876f89b7aece0a7aae9726c957a3bbde29775ad0e4159e2cdfaa741f3f8562468e879f0f4e50829d16ade458e32e321f2b7ab80348c4fcd23a2aeb3921b4b6c297d0e0e10ba6ac3839d9be19018012dfcce38bfb12d0caefc81b0bf2901638317c0a708b0d73f45b43aaf7cc1f7eb7ea6bd7f8e1248ef49224f1735c8112e1f740fc7020d3185ed3c588611aa6aed0f49ac90d908e28213b754fc64e330998b132579ea55c4d5be49e026fcb6e962377d3d540fa2d45116efa46182b7175e29f95499362aa5b631a4b504c7289a7cbf673f2f9d0f0e224f37a862ae822b5359c93de1a40e52e142897dcf25ee5bfaf4132019c1ad28f128186fd48b49eeca0ba9c31e25a025e2d5999e2654a02b6d1bd07d2a2095045cbd367a00a2d34976dc10effb80228afb1c3a7f05943053d65bd900b7a4bfd3833a93f1e0c3c0ecc469d10fbc05ac7881c68f0e3229efdc0e7d15d08a63d9c6de25377f4e01bdc64748dcfc1381977f323cce3c0d453c6a97df87718f54f386228fa70b978c331be3c4af998645e68b00d1f95bb7fedd7", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 100, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "21d79fba22fcea2e" - ], - [ - "44296045dc0315d1" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "3930d34b74e6676f0158033969b58f5f113b356a799287a5", - "c8cf2cb48a199890ca5a3a856a34c034919f038dd5483648" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - } - ], - "shares": 2, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3Sum_1.json b/vdaf/prio3/testdata/Prio3Sum_1.json deleted file mode 100644 index 13016621..00000000 --- a/vdaf/prio3/testdata/Prio3Sum_1.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "agg_param": "", - "agg_result": 100, - "agg_shares": [ - "0838d7ed77cd6687", - "44296045dc0315d1", - "1a9fc8cca92e84a7" - ], - "ctx": "736f6d65206170706c69636174696f6e", - "max_measurement": 255, - "prep": [ - { - "input_shares": [ - "c7fb0bdef5bfe20176af571fbc49515389eaadd4df90c3529f06e993f24e7938e710c770d2dbd06f9b2523f00213f7baaa65475354cb73e7a5d9f889974b2e776e8b996484aeb62b04576947b5a96b0a72189f03c37c2a8309fee95bc15681c9115ee8147e871e4f1edb0ec1e56b68ad083182c17baa213f17a8d8624f21213c55a404746658fb100e1cb0a086315bbcba60c6e3ed3018ed8e7e837f2033bb8284a440d0822e5aaf2cc0dc43c6fc7f78a9a9b2471a4db243f8de37a30b6bcc6c8369f1c6d0c80cc096d25fff0aee3a6e2f9d6da165b01cfe2d7141caa00439e110b68fdd94556d1506ef1499cd969438d98b641f9c132ed547da7eab49dff9c0545f57abbf971f52ccd2e993781cd0cd2c8788b5279e5f70339731ac86ed9195cd3c60836b6dd9698fd1e4ad7050a698df611eee9c5ba98f10e6b64485d7c82bf48968aacfabf982c4b8d98196e25c276dd5e31ee61144266c66d2d2889047cf0b509d0e447e378c179bbd18386eb389c10cfc815ce724b01e47aafef1bb8e52753548f77626a0af40b75036ad6518e293284f82ccb28b4baa512c45276c2986908c87cc69c53f9ac7e0d6850ee756cd430745239b545552c8776d6bd3e2573415e89d96f6b4064456d4cdeb577f87eff828e008e6b1ec0b5943abef717959c0816e12f771fe4feac12ebf5eebb6a268182d25e08027a8dc01a81fbfff43b5604d034cb8d0ba775899a9b6e02bb5542e7ccbeaedf230cedfadf50a541b51281b4d85f67b6c8cfbe1b5e77f95b70053553d7686ee34f5bc6462a0121af4d61057bdea117ebc86fb37f8ac45955a6b73d7dfa2a193033b4524a106de810ac96c754ffc1e46b09c6310564f3a58cfcc123f9fc6d9a530bd16fcbfe45a0dd91b929f", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", - "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - ], - "measurement": 100, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "0838d7ed77cd6687" - ], - [ - "44296045dc0315d1" - ], - [ - "1a9fc8cca92e84a7" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "bc2b0bbf09338766f8abb2e591e5b779587a4647599932a2", - "c8cf2cb48a199890ca5a3a856a34c034919f038dd5483648", - "7d04c88c6ab3e008f1ee26ce020902b52a880fe76f72d29a" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f" - } - ], - "shares": 3, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/Prio3Sum_2.json b/vdaf/prio3/testdata/Prio3Sum_2.json deleted file mode 100644 index e98afe5c..00000000 --- a/vdaf/prio3/testdata/Prio3Sum_2.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "agg_param": "", - "agg_result": 1521, - "agg_shares": [ - "3d90b1d19acf1386", - "b5754e2e6430ec79" - ], - "ctx": "736f6d65206170706c69636174696f6e", - "max_measurement": 1337, - "prep": [ - { - "input_shares": [ - "43126178225dca30c56c892f4cef3ca6f527cae360f77d4b2994ee7fbe779a5892f97897b3c5ff28ea1156127a87cb71fdca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db973fabd7f72169d6d5dce73437837c1c0662bb24addf7e07e6ad56db956b47ccc755b7c35912f67fb18ef8f9f52712c3080f914b74f00382004b165013481acf8be8175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034e1f16577d02c362b788f2ba75655f48c3de2deca86d4c16dcb7ad16ee9be9abefb92edfc5ff3f936fb870dfe8d010e933b3d757755f70869463b12f0fee4391df94d8c3eaea71cb9eb448cebdcf1a9389aaffdf0add9c1ba4a3395ee3552988f68f846abd0d4c21d80797b31b3c093280a6dab8f6eb620cc224271c24a8e837b46c41d7448f92e8544b91b9258da94f10f9cc0c289acc1ca98e4921970f4645da92de8c4f01ceed91f67287a63c48f0efe31870630655eb8e771eae674a07d9208c92248153875c1a173ec6d0dbac7277d81f7d42fe00695163970bd22113a1fe897d45d0ae3ecd9232fc2f27cfe06c208fc152c37ff03f7daed0f49ac90d908eec2c33ecde71954dab2f085aff8226bc2d45c429c64678b147529367ef72e8e9ceac003b71c2dc01c96492eade00fc99ef01c7474f412e2526c2c5d54317487a37438dea9bd856781e92e0e296508b7e1d5f87e9e7df53669767fb7e72e5ae3ed7a009d3ee17a95cff7177086562e030875d1a518d2907983566800da114a280ee272902bcec631ed13e4e77f9aec2650667549603727f3fdd4dbb2476ec096b6b51ef2a4629889d8b8ad8018e594ce34bb030c6b68ccc6fc9db02c3a12a608eb01a1fbfbd64b152636ef87af0fb310d8ef8aae46ccbb794c59dd711cdda905e679f47c5fbad52209d211213c7f4111b38aa9f97c5f0c700", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 0, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "4a3136daf279c290" - ], - [ - "b7cec9250c863d6f" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "fc4370f72d35fb2151811ef413c956ff342b7195eb58731e", - "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - }, - { - "input_shares": [ - "44126178225dca30c56c892f4cef3ca6f527cae360f77d4b2994ee7fbe779a5892f97897b3c5ff28ea1156127a87cb71fdca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db9740abd7f72169d6d5dce73437837c1c0662bb24addf7e07e6ad56db956b47ccc755b7c35912f67fb18ef8f9f52712c3080f914b74f00382004b165013481acf8be8175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034ea72dc76b211a70eb7fe9fdf23cf0bcce943e3cf677b2b53094dcd6fb6ac97ec4a05af004e87f92c6b406483756e68cb6325ddf6eb8da274f53ad4ca0581ebd88f82e66c767a58d0db89ff54c7319f5a2375a9f0d03890626247e02d2b5d3052be84c40b561eb5dbff61791c03271b92aef7f8973c1b2dd8bfd71a06e7d20198578a0d8ff103a4daae2f7ef838ba428d310c7e6f08dc4251b9ee657be8ff079b8ee17832393d334fc3f5254aec43a035d6944ba57c76d7ac9e02595222da66e469ad2edf1793434b1603d183b8fbb1d2699cf69935df52598abe65d9a0db52afbd1f1fc495705efe608118cda6d9e946349c54f32cea15eb2aed0f49ac90d908e6415c3fdbf1a8819b438c5dc27f2b1b0763474dcbce0d85c6923d35921931515e880effb8782ddaacdce299c592b5817707c3f4ef6d68c6a36c6a844d93c1cd1d2ecea0d20a594091a3bb953f35129659004c8e6c1f368e415235790133b310a7ed833db9a786c7510f199636efa58863eb849d4b7d935ce5c1bfcc2cbdcc0afe3c827473945ffc83bd81719fab3e9a2ef6c7acd0f7a76cdcdb084fdf541d58c0f18f956b423413341ab0bfa06673976c584e6d1f5733d3560d41b08bf8bca68a3da554e96b7d9bb1a6fa6103ded865ecd48be930dd7fa4d7d4e8549e1380762202b904b52e730ccc80cb65f2737ead77fa6a228763fa9cb", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 1, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "4b3136daf279c290" - ], - [ - "b7cec9250c863d6f" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "fc4370f72d35fb211eb662209e58e2405d1a1b206c9f3fc5", - "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - }, - { - "input_shares": [ - "44126178225dca30c56c892f4cef3ca6f527cae360f77d4b2a94ee7fbe779a5893f97897b3c5ff28eb1156127a87cb71fdca3aa67f3f66472914077ef4bb37488345444045a2293f2c51f6d5d497646aa2ab3bdc62c1db9740abd7f72169d6d5dce73437837c1c0662bb24addf7e07e6ae56db956b47ccc756b7c35912f67fb18ff8f9f52712c3080f914b74f00382004b165013481acf8be9175a22a882aa0eb80e78e0de28541109838a52471413dfb50659e637f1034e4ea3f731bdcdb2d15cde40b82ae8b2f958cf9926b84d1f101b2aacba2766ca4f0211a744f01ad937622bca186d7448311074990955f2f6cdde5c72c7790e6c1950807b95f52c6638327753e1ffa6a80bcf15500c8d5dcee16ad2d9a8374b9dbbf4eb9fe829c7607f5301f9b7e4aace4447dc7eb670e39324605c593843aa1ca2a846e48361529f2ac54ff9e68652a1b4b5e81d20835332fc2f405d2586293bb2266a5659025590a010a73442884f49010e7f6f3a71dfc5936fe02415e08651a00f20b7f6ecdda5921f2c3d4a2c5fb6529036b0e54c25f2c52e13d722c7e29d2ec197666a44f8fea894e4bb0d47c340e5778ac90f3d6d5709aed0f49ac90d908ebd9f923724674533d74382173afabb85b2a316ac7c456f7de2d5fd9a64f6c98985ca38bc80e796391faaa7ba429d9c9c936585b358bfbdebaa16831db94c6d407b9bd53f911dbcdea0635bbf66c475fcf84817e8371fa128d0ce7fb990c399797239d4a7d29c69b5b307326cbcc0436ce55b549109a97f35f93043f90553bd92b2221cc3e92cad4858800eb6fe0571c14b4b439e19eb69ec3c577f96ff081493d7c5252145a2e58e70562b664352f3d1204a31ef4b02f26ad1198c150cabe70e2e8d8c49230e68da5b808101a049ee31d6e177411ea72e20f9210cc1280b942e2f85262b66f4200a3c39862c4e123e5650e1284b0874b074", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 1337, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "833636daf279c290" - ], - [ - "b7cec9250c863d6f" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "fc4370f72d35fb21d1a2b4da13818ff19ae1da2daa52e440", - "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - }, - { - "input_shares": [ - "44126178225dca30c66c892f4cef3ca6f527cae360f77d4b2994ee7fbe779a5892f97897b3c5ff28eb1156127a87cb71feca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db9740abd7f72169d6d5dbe73437837c1c0661bb24addf7e07e6ae56db956b47ccc755b7c35912f67fb18ff8f9f52712c3080e914b74f00382004a165013481acf8be9175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034e2e45375c41717d1d236e9d21e14c017ce572e18159e66d4eb3dbc784f8d5abc618c775703bf481a0599570c8ceb21ce9d4ab6c6d423578fa1198c7d8a5c499db443c9d9bf0d159bd25689231e5676d85e579ce0c032e9418bcd1daf6f248e470b12101afcbee6af953382fe0e8ed45b45730df5fe92bebb2e5fe76d958ecb1ec6af571ab2275371c13488a57f0e44966f75bf52dbc97383a702a187d53f95aa7273000c599ab06bba08836d40c710a2d140f38ae642a38bbab722dfd95b361dbd10373448b601da441085f7fa5afe5eabe4ce2e4f921dddcf6311a3afb1c7f671a819380aa3aaff841b6e05d27348a3396e9a69fa7f02e9daed0f49ac90d908eddfd520da0c37ae70fb425ae84956d032500cf50dbac203f4a24e2d09386e81270146a90340eeed02940010be05ec8e4cf2db24f6b7c3cbf78db2d0c8c963f7e87dfb3399678c859ad721c6f8103b182e2e498e7c14edbf17ecf7e6bd5c552c4b50373e130755f3bb4d0fb43b77dccfcd607f4e78f6028a7748e2558f0102848f0738e9b280a155709887d459673c80f08d86b90e1a663aefb6cc43e3239f49dd6ff7bb5ad4b6f74e07429d4be3032a61aba687b58b77f439687832d557ed7d36ca9d0fb848bf0c83aa45fcc25f9be99a8cb454271aa43093203c9a9f3d0b2f5d79bf914ffb170ba8e6761dc6ea1f40732824bbb9cf0d8e0", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 99, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "ad3136daf279c290" - ], - [ - "b7cec9250c863d6f" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "fc4370f72d35fb21738306b80716f2e4c51acbcc0158dd8a", - "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - }, - { - "input_shares": [ - "43126178225dca30c66c892f4cef3ca6f527cae360f77d4b2a94ee7fbe779a5892f97897b3c5ff28eb1156127a87cb71fdca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db973fabd7f72169d6d5dbe73437837c1c0661bb24addf7e07e6ad56db956b47ccc756b7c35912f67fb18ff8f9f52712c3080f914b74f00382004b165013481acf8be8175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034e6a39bfe3b1c5b6044408bc17a9684a3c18667bebbb630aa6fef4ccb832bd20d3c926cd7027dad49c10591913ff0ed8c3b77648981e143b75c377f97ca7ad0df4552fecfc97236770bb0a78e08c3aadd08948040da9f2180727ac0999c3b05f11766438b2bf602a6f17d9a978b17667a56daba815bfb4e1978db9ec3a1c118b311eb30dd8572d7015bcfcffe27b6643b377d38d5bf15eb72ab23051b008a16062bf867d586cd07168a115b887ba9970fe7fbf34858ac4c6e967cc9e2c72cdf43f5f4ca960e60585bce5f1ccf5073e49fafddc6cdb16573e9453415cbcdcbaed30c85793400e4962c27e27482776a443fde4e6ca5e373f7dbaaed0f49ac90d908ea009cb85306f4100ee1907b8bc792443f30c35e7772f84e7ff0add9c599f7306bfb4129048289bd4717c58c0b0020d0aeb62d624909d7944c6fbfb678aadcb6576ec64d8ee26bba617d036c0d93071373d1663e71c8a560312f54fc9055ed723f0c03bde3c03a0c5ef2f81abeff4aa0bc08c2a32bad731c2cbd3aff62dec4e033cb6f26ef351dc5d61d307ba09f2cec28860d362acdfe4bdb9668b0b7d91eee23ea9fe21db2604c7e0e7a7201008ccd4af096ca4321df114d92d12fe7964446fde609adf29e688b096baf155c36a5b8a693bbb4b5475e251d4f386271333442c29c5f9549ba3bdf052f6f9121f313b3ee48427fc0ca28ac3", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 42, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "743136daf279c290" - ], - [ - "b7cec9250c863d6f" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "fc4370f72d35fb2167e02e21452d6637328672ffd0423630", - "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - }, - { - "input_shares": [ - "43126178225dca30c56c892f4cef3ca6f527cae360f77d4b2994ee7fbe779a5892f97897b3c5ff28ea1156127a87cb71fdca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db973fabd7f72169d6d5dce73437837c1c0662bb24addf7e07e6ad56db956b47ccc755b7c35912f67fb18ef8f9f52712c3080f914b74f00382004b165013481acf8be8175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034e1f16577d02c362b788f2ba75655f48c3de2deca86d4c16dcb7ad16ee9be9abefb92edfc5ff3f936fb870dfe8d010e933b3d757755f70869463b12f0fee4391df94d8c3eaea71cb9eb448cebdcf1a9389aaffdf0add9c1ba4a3395ee3552988f68f846abd0d4c21d80797b31b3c093280a6dab8f6eb620cc224271c24a8e837b46c41d7448f92e8544b91b9258da94f10f9cc0c289acc1ca98e4921970f4645da92de8c4f01ceed91f67287a63c48f0efe31870630655eb8e771eae674a07d9208c92248153875c1a173ec6d0dbac7277d81f7d42fe00695163970bd22113a1fe897d45d0ae3ecd9232fc2f27cfe06c208fc152c37ff03f7daed0f49ac90d908eec2c33ecde71954dab2f085aff8226bc2d45c429c64678b147529367ef72e8e9ceac003b71c2dc01c96492eade00fc99ef01c7474f412e2526c2c5d54317487a37438dea9bd856781e92e0e296508b7e1d5f87e9e7df53669767fb7e72e5ae3ed7a009d3ee17a95cff7177086562e030875d1a518d2907983566800da114a280ee272902bcec631ed13e4e77f9aec2650667549603727f3fdd4dbb2476ec096b6b51ef2a4629889d8b8ad8018e594ce34bb030c6b68ccc6fc9db02c3a12a608eb01a1fbfbd64b152636ef87af0fb310d8ef8aae46ccbb794c59dd711cdda905e679f47c5fbad52209d211213c7f4111b38aa9f97c5f0c700", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 0, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "4a3136daf279c290" - ], - [ - "b7cec9250c863d6f" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "fc4370f72d35fb2151811ef413c956ff342b7195eb58731e", - "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - }, - { - "input_shares": [ - "43126178225dca30c56c892f4cef3ca6f527cae360f77d4b2994ee7fbe779a5892f97897b3c5ff28ea1156127a87cb71fdca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db973fabd7f72169d6d5dce73437837c1c0662bb24addf7e07e6ad56db956b47ccc755b7c35912f67fb18ef8f9f52712c3080f914b74f00382004b165013481acf8be8175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034e1f16577d02c362b788f2ba75655f48c3de2deca86d4c16dcb7ad16ee9be9abefb92edfc5ff3f936fb870dfe8d010e933b3d757755f70869463b12f0fee4391df94d8c3eaea71cb9eb448cebdcf1a9389aaffdf0add9c1ba4a3395ee3552988f68f846abd0d4c21d80797b31b3c093280a6dab8f6eb620cc224271c24a8e837b46c41d7448f92e8544b91b9258da94f10f9cc0c289acc1ca98e4921970f4645da92de8c4f01ceed91f67287a63c48f0efe31870630655eb8e771eae674a07d9208c92248153875c1a173ec6d0dbac7277d81f7d42fe00695163970bd22113a1fe897d45d0ae3ecd9232fc2f27cfe06c208fc152c37ff03f7daed0f49ac90d908eec2c33ecde71954dab2f085aff8226bc2d45c429c64678b147529367ef72e8e9ceac003b71c2dc01c96492eade00fc99ef01c7474f412e2526c2c5d54317487a37438dea9bd856781e92e0e296508b7e1d5f87e9e7df53669767fb7e72e5ae3ed7a009d3ee17a95cff7177086562e030875d1a518d2907983566800da114a280ee272902bcec631ed13e4e77f9aec2650667549603727f3fdd4dbb2476ec096b6b51ef2a4629889d8b8ad8018e594ce34bb030c6b68ccc6fc9db02c3a12a608eb01a1fbfbd64b152636ef87af0fb310d8ef8aae46ccbb794c59dd711cdda905e679f47c5fbad52209d211213c7f4111b38aa9f97c5f0c700", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 0, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "4a3136daf279c290" - ], - [ - "b7cec9250c863d6f" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "fc4370f72d35fb2151811ef413c956ff342b7195eb58731e", - "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - }, - { - "input_shares": [ - "43126178225dca30c66c892f4cef3ca6f527cae360f77d4b2a94ee7fbe779a5892f97897b3c5ff28eb1156127a87cb71fdca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db973fabd7f72169d6d5dbe73437837c1c0661bb24addf7e07e6ad56db956b47ccc756b7c35912f67fb18ff8f9f52712c3080f914b74f00382004b165013481acf8be8175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034e6a39bfe3b1c5b6044408bc17a9684a3c18667bebbb630aa6fef4ccb832bd20d3c926cd7027dad49c10591913ff0ed8c3b77648981e143b75c377f97ca7ad0df4552fecfc97236770bb0a78e08c3aadd08948040da9f2180727ac0999c3b05f11766438b2bf602a6f17d9a978b17667a56daba815bfb4e1978db9ec3a1c118b311eb30dd8572d7015bcfcffe27b6643b377d38d5bf15eb72ab23051b008a16062bf867d586cd07168a115b887ba9970fe7fbf34858ac4c6e967cc9e2c72cdf43f5f4ca960e60585bce5f1ccf5073e49fafddc6cdb16573e9453415cbcdcbaed30c85793400e4962c27e27482776a443fde4e6ca5e373f7dbaaed0f49ac90d908ea009cb85306f4100ee1907b8bc792443f30c35e7772f84e7ff0add9c599f7306bfb4129048289bd4717c58c0b0020d0aeb62d624909d7944c6fbfb678aadcb6576ec64d8ee26bba617d036c0d93071373d1663e71c8a560312f54fc9055ed723f0c03bde3c03a0c5ef2f81abeff4aa0bc08c2a32bad731c2cbd3aff62dec4e033cb6f26ef351dc5d61d307ba09f2cec28860d362acdfe4bdb9668b0b7d91eee23ea9fe21db2604c7e0e7a7201008ccd4af096ca4321df114d92d12fe7964446fde609adf29e688b096baf155c36a5b8a693bbb4b5475e251d4f386271333442c29c5f9549ba3bdf052f6f9121f313b3ee48427fc0ca28ac3", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - ], - "measurement": 42, - "nonce": "000102030405060708090a0b0c0d0e0f", - "out_shares": [ - [ - "743136daf279c290" - ], - [ - "b7cec9250c863d6f" - ] - ], - "prep_messages": [ - "" - ], - "prep_shares": [ - [ - "fc4370f72d35fb2167e02e21452d6637328672ffd0423630", - "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" - ] - ], - "public_share": "", - "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - } - ], - "shares": 2, - "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/testdata/XofTurboShake128.json b/vdaf/prio3/testdata/XofTurboShake128.json deleted file mode 100644 index bfd78ffe..00000000 --- a/vdaf/prio3/testdata/XofTurboShake128.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "binder": "62696e64657220737472696e67", - "derived_seed": "b62ef0a2778190792d4d42d8c167ba20e0c37a3f319ba79645829c427d70eea5", - "dst": "646f6d61696e2073657061726174696f6e20746167", - "expanded_vec_field128": "b62ef0a2778190792d4d42d8c167ba20e0c37a3f319ba79645829c427d70eea56d92fef65a07b17a0438e25452cdc7f15f63caf0e8a2a3c72ac69524729e64e03c7ec3a3afa7eb21cb6da6abf0a3b73630a91a5fa05dcbd33da3476f1c8bf4fd66fe5a80dd04bc95f0f02cb8fc9035b9e16e3a5c373bf81c820af513e0c832ca672c66dcc3b302fb8b27a48f09e0a843f5caf87b3c6c1c4b6765b5923e1d152c2e695601abbc69dbe810860fb30e871a2549861110672335ce50ee632264cbb21f62595298d1d1ad9303b84664801e52112989dfce93f0f9dc833ee0f4a0672ffe47cb0a13f80f9e9b7a2e267db7f7890ccd064bf2458cd4e27162d13e60dbc1b6cae71635a3e603f2c15d1c64a12d4e8235f7bf0a8efe6bb15f3e2adae06f7dd1c4d63ac6cecae731250f73c063c6e59aef630a7b6f4bc64bddadc8b8a479bfdb64ea31e6ab44540a52a8d3399d64a060d50190d66cac1335d739e5f8d508201058a2e0cc1ed90e23cfdc7a253f24710ef3b1604688606386dcc4c90e8476be9daac3271ac51301868df71a719a5f32184145d70fec31b4693d527f53875a2ea013523d3daa33bc49c22f66c9ae70dd7f06f227f50515ea9ab1fbe0162cf761e596d8999809cf672cd2d82b22231f841c36e494d7e44f7c6f07e29758b1b73ce95b202325116f04067a54aa767eab2e00ce55b3abcd5c3d5b05040a6bf5d4ba8a61267004bb82b12d43b08fed8f9aced3e833a58fc01004526631b0f4192d8754a397e1096511ee23761a29fcd6511ad2e5020683ca877e4075fe6bc5907f7df1ed4b6c97e0f897d781e850da0cf584842c124cdb6011fe8660e3b8c354cd659985332ea158ffcba83253d39803fa7efb9fcd02cea38089f239f68404814973", - "length": 40, - "seed": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" -} diff --git a/vdaf/prio3/vectors_test.go b/vdaf/prio3/vectors_test.go deleted file mode 100644 index 588370e7..00000000 --- a/vdaf/prio3/vectors_test.go +++ /dev/null @@ -1,220 +0,0 @@ -package prio3 - -import ( - "path/filepath" - "slices" - "strings" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/vdaf/prio3/count" - "github.com/quantumcoinproject/circl/vdaf/prio3/histogram" - "github.com/quantumcoinproject/circl/vdaf/prio3/mhcv" - "github.com/quantumcoinproject/circl/vdaf/prio3/sum" - "github.com/quantumcoinproject/circl/vdaf/prio3/sumvec" -) - -type VectorCount struct { - VectorBase[uint64, uint64] -} - -type VectorSum struct { - VectorBase[uint64, uint64] - MaxMeas uint64 `json:"max_measurement"` -} - -type VectorSumVec struct { - VectorBase[[]uint64, []uint64] - Length uint `json:"length"` - Bits uint `json:"bits"` - ChunkLen uint `json:"chunk_length"` -} - -type VectorHistogram struct { - VectorBase[uint64, []uint64] - Length uint `json:"length"` - ChunkLen uint `json:"chunk_length"` -} - -type VectorMultiHotCountVec struct { - VectorBase[[]bool, []uint64] - Length uint `json:"length"` - MaxWeight uint `json:"max_weight"` - ChunkLen uint `json:"chunk_length"` -} - -type VectorBase[Measurement, Aggregate any] struct { - Prep []Prepare[Measurement] `json:"prep"` - Params[Aggregate] -} - -type Params[Aggregate any] struct { - AggParam string `json:"agg_param"` - AggResult Aggregate `json:"agg_result"` - AggShares []Hex `json:"agg_shares"` - Ctx Hex `json:"ctx"` - VerifyKey Hex `json:"verify_key"` - Shares uint8 `json:"shares"` -} - -type Prepare2[Measurement any] struct { - Measurement Measurement `json:"measurement"` - PrepareParams -} - -type Prepare[Measurement any] struct { - Measurement Measurement `json:"measurement"` - PrepareParams -} - -type PrepareParams struct { - InputShares []Hex `json:"input_shares"` - Nonce Hex `json:"nonce"` - OutShares [][]Hex `json:"out_shares"` - PrepMessages []Hex `json:"prep_messages"` - PrepShares [][]Hex `json:"prep_shares"` - PublicShare Hex `json:"public_share"` - Rand Hex `json:"rand"` -} - -func convert[Aggregate any]( - t testing.TB, in *VectorBase[uint64, Aggregate], -) (out VectorBase[bool, Aggregate]) { - out.Params = in.Params - out.Prep = make([]Prepare[bool], len(in.Prep)) - for i := range in.Prep { - out.Prep[i].PrepareParams = in.Prep[i].PrepareParams - switch in.Prep[i].Measurement { - case 0: - out.Prep[i].Measurement = false - case 1: - out.Prep[i].Measurement = true - default: - t.Fatal("invalid measurement") - } - } - - return -} - -func TestVector(t *testing.T) { - fileNames, err := filepath.Glob("./testdata/Prio3*.json") - if err != nil { - t.Fatal(err) - } - - for _, fileName := range fileNames { - testName := strings.TrimSuffix(filepath.Base(fileName), ".json") - - t.Run(testName, func(t *testing.T) { - vdaf := strings.Split(strings.TrimPrefix(testName, "Prio3"), "_")[0] - - switch vdaf { - case "Count": - v := readFile[VectorCount](t, fileName) - c, err := count.New(v.Shares, v.Ctx) - test.CheckNoErr(t, err, "new Count failed") - runPrio3(t, c, convert(t, &v.VectorBase)) - - case "Sum": - v := readFile[VectorSum](t, fileName) - s, err := sum.New(v.Shares, v.MaxMeas, v.Ctx) - test.CheckNoErr(t, err, "new Sum failed") - runPrio3(t, s, v.VectorBase) - - case "SumVec": - v := readFile[VectorSumVec](t, fileName) - s, err := sumvec.New( - v.Shares, v.Length, v.Bits, v.ChunkLen, v.Ctx) - test.CheckNoErr(t, err, "new SumVec failed") - runPrio3(t, s, v.VectorBase) - - case "Histogram": - v := readFile[VectorHistogram](t, fileName) - h, err := histogram.New(v.Shares, v.Length, v.ChunkLen, v.Ctx) - test.CheckNoErr(t, err, "new Histogram failed") - runPrio3(t, h, v.VectorBase) - - case "MultihotCountVec": - v := readFile[VectorMultiHotCountVec](t, fileName) - m, err := mhcv.New( - v.Shares, v.Length, v.MaxWeight, v.ChunkLen, v.Ctx) - test.CheckNoErr(t, err, "new MultiHotCountVec failed") - runPrio3(t, m, v.VectorBase) - - default: - t.Fatal("unexpected test v for " + vdaf) - } - }) - } -} - -func runPrio3[ - P Prio3[ - Measurement, Aggregate, - AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, - PublicShare, VerifyKey, - ], - Measurement, Aggregate any, - AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, - PublicShare, VerifyKey any, -](t *testing.T, p P, v VectorBase[Measurement, Aggregate]) { - params := p.Params() - shares := params.Shares() - verifyKey := fromHex[VerifyKey](t, v.VerifyKey) - - aggShares := make([]AggShare, shares) - for i := range aggShares { - aggShares[i] = p.AggregateInit() - } - - for _, instance := range v.Prep { - nonce := fromHex[Nonce](t, instance.Nonce) - randb := instance.Rand - meas := instance.Measurement - - pubShare, inputShares, err := p.Shard(meas, &nonce, randb) - test.CheckNoErr(t, err, "shard failed") - checkEqual(t, &pubShare, instance.PublicShare) - for i := range inputShares { - checkEqual(t, &inputShares[i], instance.InputShares[i]) - } - - var prepStates []*PrepState - var outboundPrepShares []PrepShare - for i := range shares { - state, share, errx := p.PrepInit( - &verifyKey, &nonce, i, pubShare, inputShares[i]) - test.CheckNoErr(t, errx, "prepare init failed") - - prepStates = append(prepStates, state) - outboundPrepShares = append(outboundPrepShares, *share) - } - - for i := range outboundPrepShares { - checkEqual(t, &outboundPrepShares[i], instance.PrepShares[0][i]) - } - - prepMsg, err := p.PrepSharesToPrep(outboundPrepShares) - test.CheckNoErr(t, err, "PrepSharesToPrep failed") - checkEqual(t, prepMsg, instance.PrepMessages[0]) - - for i := range shares { - outShare, err := p.PrepNext(prepStates[i], prepMsg) - test.CheckNoErr(t, err, "PrepNext failed") - checkEqual(t, outShare, slices.Concat(instance.OutShares[i]...)) - - p.AggregateUpdate(&aggShares[i], outShare) - } - } - - numMeas := uint(len(v.Prep)) - aggResult, err := p.Unshard(aggShares, numMeas) - test.CheckNoErr(t, err, "unshard failed") - - got := *aggResult - want := v.AggResult - if !isEqual(t, got, want) { - test.ReportError(t, got, want) - } -} diff --git a/vdaf/prio3/xof_test.go b/vdaf/prio3/xof_test.go deleted file mode 100644 index 0b3b70c3..00000000 --- a/vdaf/prio3/xof_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package prio3 - -import ( - "bytes" - "encoding/binary" - "testing" - - "github.com/quantumcoinproject/circl/internal/sha3" - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith" - "github.com/quantumcoinproject/circl/vdaf/prio3/arith/fp128" - "github.com/quantumcoinproject/circl/vdaf/prio3/internal/prio3" -) - -type VecXof struct { - Binder Hex `json:"binder"` - DerivedSeed Hex `json:"derived_seed"` - Dst Hex `json:"dst"` - ExpVecField128 Hex `json:"expanded_vec_field128"` - Seed Hex `json:"seed"` - Length uint `json:"length"` -} - -func prepXof( - t *testing.T, seed *prio3.Seed, dst, binder []byte, -) (*sha3.State, error) { - context := dst[8:] - usage := binary.BigEndian.Uint16(dst[6:]) - - x, err := prio3.NewXof[fp128.Vec](0, context) - test.CheckNoErr(t, err, "NewXof failed") - copy(x.Header[2:], dst) - - err = x.Init(usage, seed) - if err != nil { - return nil, err - } - - err = x.SetBinderBytes(binder) - if err != nil { - return nil, err - } - - return &x.State, nil -} - -func TestXof(t *testing.T) { - v := readFile[VecXof](t, "testdata/XofTurboShake128.json") - - t.Run("DeriveSeed", func(t *testing.T) { - r, err := prepXof(t, (*prio3.Seed)(v.Seed), v.Dst, v.Binder) - test.CheckNoErr(t, err, "create xof failed") - - var got prio3.Seed - _, err = r.Read(got[:]) - test.CheckNoErr(t, err, "deriving seed failed") - - want := prio3.Seed(v.DerivedSeed) - if got != want { - test.ReportError(t, got, want) - } - }) - - t.Run("VecFp128/RandomSHA3", func(t *testing.T) { - r, err := prepXof(t, (*prio3.Seed)(v.Seed), v.Dst, v.Binder) - test.CheckNoErr(t, err, "create xof failed") - - a := arith.NewVec[fp128.Vec](v.Length) - err = a.RandomSHA3(r) - test.CheckNoErr(t, err, "random vector failed") - - got, err := a.MarshalBinary() - test.CheckNoErr(t, err, "MarshalBinary failed") - - want := v.ExpVecField128 - if !bytes.Equal(got, want) { - test.ReportError(t, got, want) - } - }) - - t.Run("VecFp128/RandomSHA3Bytes", func(t *testing.T) { - r, err := prepXof(t, (*prio3.Seed)(v.Seed), v.Dst, v.Binder) - test.CheckNoErr(t, err, "create xof failed") - - a := arith.NewVec[fp128.Vec](v.Length) - got := make([]byte, a.Size()) - err = a.RandomSHA3Bytes(got[:0], r) - test.CheckNoErr(t, err, "random vector failed") - - want := v.ExpVecField128 - if !bytes.Equal(got, want) { - test.ReportError(t, got, want) - } - }) -} diff --git a/zk/dl/dl.go b/zk/dl/dl.go deleted file mode 100644 index 11428ffa..00000000 --- a/zk/dl/dl.go +++ /dev/null @@ -1,86 +0,0 @@ -// Package dl provides a Schnorr NIZK discrete-log proof. -// -// This package implements a Schnorr NIZK discrete-log proof obtained from the -// interactive Schnorr identification scheme through a Fiat-Shamir transformation. -// -// Given (k,G,kG) the Prove function returns a Proof struct attesting that -// kG = [k]G, which can be validated using the Verify function. -// -// The userID label is a unique identifier for the prover. -// -// The otherInfo label is defined to allow flexible inclusion of contextual -// information in the Schnorr NIZK proof. -// The otherInfo is also used as a domain separation tag (dst) for the hash -// to scalar function. -// -// Reference: https://datatracker.ietf.org/doc/html/rfc8235 -package dl - -import ( - "encoding/binary" - "io" - - "github.com/quantumcoinproject/circl/group" -) - -type Proof struct { - V group.Element - R group.Scalar -} - -func calcChallenge(myGroup group.Group, G, V, A group.Element, userID, otherInfo []byte) group.Scalar { - // Hash transcript (G | V | A | UserID | OtherInfo) to get the random coin. - GByte, errByte := G.MarshalBinary() - if errByte != nil { - panic(errByte) - } - VByte, errByte := V.MarshalBinary() - if errByte != nil { - panic(errByte) - } - AByte, errByte := A.MarshalBinary() - if errByte != nil { - panic(errByte) - } - - uPrefix := [4]byte{} - binary.BigEndian.PutUint32(uPrefix[:], uint32(len(userID))) - oPrefix := [4]byte{} - binary.BigEndian.PutUint32(oPrefix[:], uint32(len(otherInfo))) - - hashByte := append(append(append(append(append(append( - GByte, VByte...), AByte...), - uPrefix[:]...), userID...), - oPrefix[:]...), otherInfo...) - - return myGroup.HashToScalar(hashByte, otherInfo) -} - -// Prove returns a proof attesting that kG = [k]G. -func Prove(myGroup group.Group, G, kG group.Element, k group.Scalar, userID, otherInfo []byte, rnd io.Reader) Proof { - v := myGroup.RandomNonZeroScalar(rnd) - V := myGroup.NewElement() - V.Mul(G, v) - - c := calcChallenge(myGroup, G, V, kG, userID, otherInfo) - - r := myGroup.NewScalar() - r.Sub(v, myGroup.NewScalar().Mul(k, c)) - - return Proof{V, r} -} - -// Verify checks whether the proof attests that kG = [k]G. -func Verify(myGroup group.Group, G, kG group.Element, p Proof, userID, otherInfo []byte) bool { - c := calcChallenge(myGroup, G, p.V, kG, userID, otherInfo) - - rG := myGroup.NewElement() - rG.Mul(G, p.R) - - ckG := myGroup.NewElement() - ckG.Mul(kG, c) - - rG.Add(rG, ckG) - - return p.V.IsEqual(rG) -} diff --git a/zk/dl/dl_test.go b/zk/dl/dl_test.go deleted file mode 100644 index 65fb7567..00000000 --- a/zk/dl/dl_test.go +++ /dev/null @@ -1,60 +0,0 @@ -package dl_test - -import ( - "crypto/rand" - "testing" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/zk/dl" -) - -const testzkDLCount = 1 << 8 - -func testzkDL(t *testing.T, myGroup group.Group) { - kA := myGroup.RandomNonZeroScalar(rand.Reader) - DB := myGroup.RandomElement(rand.Reader) - - R := myGroup.NewElement() - R.Mul(DB, kA) - - dst := "zeroknowledge" - rnd := rand.Reader - proof := dl.Prove(myGroup, DB, R, kA, []byte("Prover"), []byte(dst), rnd) - - verify := dl.Verify(myGroup, DB, R, proof, []byte("Prover"), []byte(dst)) - if verify == false { - t.Error("zk/dl verification failed") - } -} - -func testzkDLNegative(t *testing.T, myGroup group.Group) { - kA := myGroup.RandomNonZeroScalar(rand.Reader) - DB := myGroup.RandomElement(rand.Reader) - - R := myGroup.RandomElement(rand.Reader) - - dst := "zeroknowledge" - rnd := rand.Reader - proof := dl.Prove(myGroup, DB, R, kA, []byte("Prover"), []byte(dst), rnd) - - verify := dl.Verify(myGroup, DB, R, proof, []byte("Prover"), []byte(dst)) - if verify == true { - t.Error("zk/dl verification should fail") - } -} - -func TestZKDL(t *testing.T) { - t.Run("zkDL", func(t *testing.T) { - for i := 0; i < testzkDLCount; i++ { - currGroup := group.P256 - testzkDL(t, currGroup) - } - }) - - t.Run("zkDLNegative", func(t *testing.T) { - for i := 0; i < testzkDLCount; i++ { - currGroup := group.P256 - testzkDLNegative(t, currGroup) - } - }) -} diff --git a/zk/dleq/dleq.go b/zk/dleq/dleq.go deleted file mode 100644 index be79fc56..00000000 --- a/zk/dleq/dleq.go +++ /dev/null @@ -1,284 +0,0 @@ -// Package dleq provides zero-knowledge proofs of Discrete-Logarithm Equivalence (DLEQ). -// -// This implementation is compatible with the one used for VOPRFs [1]. -// It supports batching proofs to amortize the cost of the proof generation and -// verification. -// -// References: -// -// [1] RFC-9497: https://www.rfc-editor.org/info/rfc9497 -package dleq - -import ( - "crypto" - "encoding/binary" - "io" - - "github.com/quantumcoinproject/circl/group" -) - -const ( - labelSeed = "Seed-" - labelChallenge = "Challenge" - labelComposite = "Composite" - labelHashToScalar = "HashToScalar-" -) - -type Params struct { - G group.Group - H crypto.Hash - DST []byte -} - -type Proof struct { - c, s group.Scalar -} - -type Prover struct{ Params } - -func (p Prover) Prove(k group.Scalar, a, ka, b, kb group.Element, rnd io.Reader) (*Proof, error) { - return p.ProveBatch(k, a, ka, []group.Element{b}, []group.Element{kb}, rnd) -} - -func (p Prover) ProveWithRandomness(k group.Scalar, a, ka, b, kb group.Element, rnd group.Scalar) (*Proof, error) { - return p.ProveBatchWithRandomness(k, a, ka, []group.Element{b}, []group.Element{kb}, rnd) -} - -func (p Prover) ProveBatch(k group.Scalar, a, ka group.Element, bi, kbi []group.Element, rnd io.Reader) (*Proof, error) { - return p.ProveBatchWithRandomness(k, a, ka, bi, kbi, p.Params.G.RandomScalar(rnd)) -} - -func (p Prover) ProveBatchWithRandomness( - k group.Scalar, - a, ka group.Element, - bi, kbi []group.Element, - rnd group.Scalar, -) (*Proof, error) { - M, Z, err := p.computeComposites(k, ka, bi, kbi) - if err != nil { - return nil, err - } - - kAm, err := ka.MarshalBinaryCompress() - if err != nil { - return nil, err - } - - a0, err := M.MarshalBinaryCompress() - if err != nil { - return nil, err - } - - a1, err := Z.MarshalBinaryCompress() - if err != nil { - return nil, err - } - - t2 := p.G.NewElement().Mul(a, rnd) - a2, err := t2.MarshalBinaryCompress() - if err != nil { - return nil, err - } - - t3 := p.G.NewElement().Mul(M, rnd) - a3, err := t3.MarshalBinaryCompress() - if err != nil { - return nil, err - } - - cc := p.doChallenge([5][]byte{kAm, a0, a1, a2, a3}) - ss := p.G.NewScalar() - ss.Mul(cc, k) - ss.Sub(rnd, ss) - - return &Proof{cc, ss}, nil -} - -func (p Params) computeComposites( - k group.Scalar, - ka group.Element, - bi []group.Element, - kbi []group.Element, -) (m, z group.Element, err error) { - kAm, err := ka.MarshalBinaryCompress() - if err != nil { - return nil, nil, err - } - - lenBuf := []byte{0, 0} - H := p.H.New() - - binary.BigEndian.PutUint16(lenBuf, uint16(len(kAm))) - mustWrite(H, lenBuf) - mustWrite(H, kAm) - - seedDST := append(append([]byte{}, labelSeed...), p.DST...) - binary.BigEndian.PutUint16(lenBuf, uint16(len(seedDST))) - mustWrite(H, lenBuf) - mustWrite(H, seedDST) - - seed := H.Sum(nil) - - m = p.G.Identity() - z = p.G.Identity() - h2sDST := append(append([]byte{}, labelHashToScalar...), p.DST...) - for j := range bi { - h2Input := []byte{} - - Bij, err := bi[j].MarshalBinaryCompress() - if err != nil { - return nil, nil, err - } - - kBij, err := kbi[j].MarshalBinaryCompress() - if err != nil { - return nil, nil, err - } - - binary.BigEndian.PutUint16(lenBuf, uint16(len(seed))) - h2Input = append(append(h2Input, lenBuf...), seed...) - - binary.BigEndian.PutUint16(lenBuf, uint16(j)) - h2Input = append(h2Input, lenBuf...) - - binary.BigEndian.PutUint16(lenBuf, uint16(len(Bij))) - h2Input = append(append(h2Input, lenBuf...), Bij...) - - binary.BigEndian.PutUint16(lenBuf, uint16(len(kBij))) - h2Input = append(append(h2Input, lenBuf...), kBij...) - - h2Input = append(h2Input, labelComposite...) - dj := p.G.HashToScalar(h2Input, h2sDST) - Mj := p.G.NewElement() - Mj.Mul(bi[j], dj) - m.Add(m, Mj) - - if k == nil { - Zj := p.G.NewElement() - Zj.Mul(kbi[j], dj) - z.Add(z, Zj) - } - } - - if k != nil { - z.Mul(m, k) - } - - return m, z, nil -} - -func (p Params) doChallenge(a [5][]byte) group.Scalar { - h2Input := []byte{} - lenBuf := []byte{0, 0} - - for i := range a { - binary.BigEndian.PutUint16(lenBuf, uint16(len(a[i]))) - h2Input = append(append(h2Input, lenBuf...), a[i]...) - } - - h2Input = append(h2Input, labelChallenge...) - dst := append(append([]byte{}, labelHashToScalar...), p.DST...) - - return p.G.HashToScalar(h2Input, dst) -} - -type Verifier struct{ Params } - -func (v Verifier) Verify(a, ka, b, kb group.Element, p *Proof) bool { - return v.VerifyBatch(a, ka, []group.Element{b}, []group.Element{kb}, p) -} - -func (v Verifier) VerifyBatch(a, ka group.Element, bi, kbi []group.Element, p *Proof) bool { - g := v.Params.G - M, Z, err := v.Params.computeComposites(nil, ka, bi, kbi) - if err != nil { - return false - } - - sA := g.NewElement().Mul(a, p.s) - ckA := g.NewElement().Mul(ka, p.c) - t2 := g.NewElement().Add(sA, ckA) - sM := g.NewElement().Mul(M, p.s) - cZ := g.NewElement().Mul(Z, p.c) - t3 := g.NewElement().Add(sM, cZ) - - kAm, err := ka.MarshalBinaryCompress() - if err != nil { - return false - } - - a0, err := M.MarshalBinaryCompress() - if err != nil { - return false - } - a1, err := Z.MarshalBinaryCompress() - if err != nil { - return false - } - a2, err := t2.MarshalBinaryCompress() - if err != nil { - return false - } - a3, err := t3.MarshalBinaryCompress() - if err != nil { - return false - } - - gotC := v.Params.doChallenge([5][]byte{kAm, a0, a1, a2, a3}) - - return gotC.IsEqual(p.c) -} - -func (p *Proof) MarshalBinary() ([]byte, error) { - g := p.c.Group() - scalarSize := int(g.Params().ScalarLength) - output := make([]byte, 0, 2*scalarSize) - - serC, err := p.c.MarshalBinary() - if err != nil { - return nil, err - } - output = append(output, serC...) - - serS, err := p.s.MarshalBinary() - if err != nil { - return nil, err - } - output = append(output, serS...) - - return output, nil -} - -func (p *Proof) UnmarshalBinary(g group.Group, data []byte) error { - scalarSize := int(g.Params().ScalarLength) - if len(data) < 2*scalarSize { - return io.ErrShortBuffer - } - - c := g.NewScalar() - err := c.UnmarshalBinary(data[:scalarSize]) - if err != nil { - return err - } - - s := g.NewScalar() - err = s.UnmarshalBinary(data[scalarSize : 2*scalarSize]) - if err != nil { - return err - } - - p.c = c - p.s = s - - return nil -} - -func mustWrite(h io.Writer, bytes []byte) { - bytesLen, err := h.Write(bytes) - if err != nil { - panic(err) - } - if len(bytes) != bytesLen { - panic("dleq: failed to write on hash") - } -} diff --git a/zk/dleq/dleq_test.go b/zk/dleq/dleq_test.go deleted file mode 100644 index c1114094..00000000 --- a/zk/dleq/dleq_test.go +++ /dev/null @@ -1,159 +0,0 @@ -package dleq_test - -import ( - "bytes" - "crypto" - "crypto/rand" - "fmt" - "testing" - - "github.com/quantumcoinproject/circl/group" - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/zk/dleq" -) - -func TestDLEQ(t *testing.T) { - for _, g := range []group.Group{ - group.P256, - group.P384, - group.P521, - group.Ristretto255, - } { - t.Run(g.(fmt.Stringer).String(), func(t *testing.T) { - params := dleq.Params{g, crypto.SHA256, []byte("domain_sep_string")} - Peggy := dleq.Prover{params} - Victor := dleq.Verifier{params} - - k := g.RandomScalar(rand.Reader) - A := g.RandomElement(rand.Reader) - kA := g.NewElement().Mul(A, k) - - B := g.RandomElement(rand.Reader) - kB := g.NewElement().Mul(B, k) - - proof, err := Peggy.Prove(k, A, kA, B, kB, rand.Reader) - test.CheckNoErr(t, err, "wrong proof generation") - test.CheckOk(Victor.Verify(A, kA, B, kB, proof), "proof must verify", t) - - rr := g.RandomScalar(rand.Reader) - proof, err = Peggy.ProveWithRandomness(k, A, kA, B, kB, rr) - test.CheckNoErr(t, err, "wrong proof generation") - test.CheckOk(Victor.Verify(A, kA, B, kB, proof), "proof must verify", t) - - const N = 4 - C := make([]group.Element, N) - kC := make([]group.Element, N) - for i := 0; i < N; i++ { - C[i] = g.RandomElement(rand.Reader) - kC[i] = g.NewElement().Mul(C[i], k) - } - proof, err = Peggy.ProveBatch(k, A, kA, C, kC, rand.Reader) - test.CheckNoErr(t, err, "wrong proof generation") - test.CheckOk(Victor.VerifyBatch(A, kA, C, kC, proof), "proof must verify", t) - - testMarshal(t, g, proof) - testErrors(t, &Peggy, &Victor, g, k, A, kA, B, kB) - }) - } -} - -func testMarshal(t *testing.T, g group.Group, proof *dleq.Proof) { - t.Helper() - - wantProofBytes, err := proof.MarshalBinary() - test.CheckNoErr(t, err, "error on marshaling proof") - - gotProof := new(dleq.Proof) - err = gotProof.UnmarshalBinary(g, wantProofBytes) - test.CheckNoErr(t, err, "error on unmarshaling proof") - - gotProofBytes, err := gotProof.MarshalBinary() - test.CheckNoErr(t, err, "error on marshaling proof") - - if !bytes.Equal(gotProofBytes, wantProofBytes) { - test.ReportError(t, gotProofBytes, wantProofBytes) - } -} - -func testErrors( - t *testing.T, - Peggy *dleq.Prover, - Victor *dleq.Verifier, - g group.Group, - k group.Scalar, a, ka, b, kb group.Element, -) { - goodProof, err := Peggy.Prove(k, a, ka, b, kb, rand.Reader) - test.CheckNoErr(t, err, "wrong proof generation") - - proofBytes, err := goodProof.MarshalBinary() - test.CheckNoErr(t, err, "error on marshaling proof") - - // Tamper proof (in transit) - _, _ = rand.Read(proofBytes) - - tamperedProof := new(dleq.Proof) - err = tamperedProof.UnmarshalBinary(g, proofBytes[:5]) - test.CheckIsErr(t, err, "unmarshal must fail") - - err = tamperedProof.UnmarshalBinary(g, proofBytes) - test.CheckNoErr(t, err, "proof must be unmarshaled") - test.CheckOk(false == Victor.Verify(a, ka, b, kb, tamperedProof), "proof must not verify", t) - - // Tamper elements - bada := g.NewElement().Neg(a) - test.CheckOk(false == Victor.Verify(bada, ka, b, kb, goodProof), "proof must not verify", t) - badka := g.NewElement().Neg(ka) - test.CheckOk(false == Victor.Verify(a, badka, b, kb, goodProof), "proof must not verify", t) - badb := g.NewElement().Neg(b) - test.CheckOk(false == Victor.Verify(a, ka, badb, kb, goodProof), "proof must not verify", t) - badkb := g.NewElement().Neg(kb) - test.CheckOk(false == Victor.Verify(a, ka, b, badkb, goodProof), "proof must not verify", t) -} - -func BenchmarkDLEQ(b *testing.B) { - g := group.P256 - params := dleq.Params{g, crypto.SHA256, []byte("domain_sep_string")} - Peggy := dleq.Prover{params} - Victor := dleq.Verifier{params} - - k := g.RandomScalar(rand.Reader) - A := g.Generator() - kA := g.NewElement().MulGen(k) - - B := g.RandomElement(rand.Reader) - kB := g.NewElement().Mul(B, k) - rr := g.RandomScalar(rand.Reader) - - proof, _ := Peggy.ProveWithRandomness(k, A, kA, B, kB, rr) - - const N = 4 - C := make([]group.Element, N) - kC := make([]group.Element, N) - for i := 0; i < N; i++ { - C[i] = g.RandomElement(rand.Reader) - kC[i] = g.NewElement().Mul(C[i], k) - } - - proofBatched, _ := Peggy.ProveBatchWithRandomness(k, A, kA, C, kC, rr) - - b.Run("Prove", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _ = Peggy.ProveWithRandomness(k, A, kA, B, kB, rr) - } - }) - b.Run("Verify", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _ = Victor.Verify(A, kA, B, kB, proof) - } - }) - b.Run(fmt.Sprint("ProveBatch=", N), func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _ = Peggy.ProveBatchWithRandomness(k, A, kA, C, kC, rr) - } - }) - b.Run(fmt.Sprint("VerifyBatch=", N), func(b *testing.B) { - for i := 0; i < b.N; i++ { - _ = Victor.VerifyBatch(A, kA, C, kC, proofBatched) - } - }) -} diff --git a/zk/doc.go b/zk/doc.go deleted file mode 100644 index 3aae91c2..00000000 --- a/zk/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package zk provides primitives for zero-knowledge proofs of knowledge. -package zk diff --git a/zk/qndleq/qndleq.go b/zk/qndleq/qndleq.go deleted file mode 100644 index 5f96cb34..00000000 --- a/zk/qndleq/qndleq.go +++ /dev/null @@ -1,133 +0,0 @@ -// Package qndleq provides zero-knowledge proofs of Discrete-Logarithm Equivalence (DLEQ) on Qn. -// -// This package implements proofs on the group Qn (the subgroup of squares in (Z/nZ)*). -// -// # Notation -// -// Z/nZ is the ring of integers modulo N. -// (Z/nZ)* is the multiplicative group of Z/nZ, a.k.a. the units of Z/nZ, the elements with inverse mod N. -// Qn is the subgroup of squares in (Z/nZ)*. -// -// A number x belongs to Qn if -// -// gcd(x, N) = 1, and -// exists y such that x = y^2 mod N. -// -// # References -// -// [DLEQ Proof] "Wallet databases with observers" by Chaum-Pedersen. -// https://doi.org/10.1007/3-540-48071-4_7 -// -// [Qn] "Practical Threshold Signatures" by Shoup. -// https://www.iacr.org/archive/eurocrypt2000/1807/18070209-new.pdf -package qndleq - -import ( - "crypto/rand" - "io" - "math/big" - - "github.com/quantumcoinproject/circl/internal/sha3" -) - -type Proof struct { - Z, C *big.Int - SecParam uint -} - -// SampleQn returns an element of Qn (the subgroup of squares in (Z/nZ)*). -// SampleQn will return error for any error returned by crypto/rand.Int. -func SampleQn(random io.Reader, N *big.Int) (*big.Int, error) { - one := big.NewInt(1) - gcd := new(big.Int) - x := new(big.Int) - - for { - y, err := rand.Int(random, N) - if err != nil { - return nil, err - } - // x is a square by construction. - x.Mul(y, y).Mod(x, N) - gcd.GCD(nil, nil, x, N) - // now check whether h is coprime to N. - if gcd.Cmp(one) == 0 { - return x, nil - } - } -} - -// Prove creates a DLEQ Proof that attests that the pairs (g,gx) -// and (h,hx) have the same discrete logarithm equal to x. -// -// Given g, h in Qn (the subgroup of squares in (Z/nZ)*), it holds -// -// gx = g^x mod N -// hx = h^x mod N -// x = Log_g(g^x) = Log_h(h^x) -// -// Note: this function does not run in constant time because it uses -// big.Int arithmetic. -func Prove(random io.Reader, x, g, gx, h, hx, N *big.Int, secParam uint) (*Proof, error) { - rSizeBits := uint(N.BitLen()) + 2*secParam - rSizeBytes := (rSizeBits + 7) / 8 - - rBytes := make([]byte, rSizeBytes) - _, err := io.ReadFull(random, rBytes) - if err != nil { - return nil, err - } - r := new(big.Int).SetBytes(rBytes) - - gP := new(big.Int).Exp(g, r, N) - hP := new(big.Int).Exp(h, r, N) - - c := doChallenge(g, gx, h, hx, gP, hP, N, secParam) - z := new(big.Int) - z.Mul(c, x).Add(z, r) - - return &Proof{Z: z, C: c, SecParam: secParam}, nil -} - -// Verify checks whether x = Log_g(g^x) = Log_h(h^x). -func (p Proof) Verify(g, gx, h, hx, N *big.Int) bool { - gPNum := new(big.Int).Exp(g, p.Z, N) - gPDen := new(big.Int).Exp(gx, p.C, N) - ok := gPDen.ModInverse(gPDen, N) - if ok == nil { - return false - } - gP := gPNum.Mul(gPNum, gPDen) - gP.Mod(gP, N) - - hPNum := new(big.Int).Exp(h, p.Z, N) - hPDen := new(big.Int).Exp(hx, p.C, N) - ok = hPDen.ModInverse(hPDen, N) - if ok == nil { - return false - } - hP := hPNum.Mul(hPNum, hPDen) - hP.Mod(hP, N) - - c := doChallenge(g, gx, h, hx, gP, hP, N, p.SecParam) - - return p.C.Cmp(c) == 0 -} - -func doChallenge(g, gx, h, hx, gP, hP, N *big.Int, secParam uint) *big.Int { - modulusLenBytes := (N.BitLen() + 7) / 8 - nBytes := make([]byte, modulusLenBytes) - cByteLen := (secParam + 7) / 8 - cBytes := make([]byte, cByteLen) - - H := sha3.NewShake256() - _, _ = H.Write(g.FillBytes(nBytes)) - _, _ = H.Write(h.FillBytes(nBytes)) - _, _ = H.Write(gx.FillBytes(nBytes)) - _, _ = H.Write(hx.FillBytes(nBytes)) - _, _ = H.Write(gP.FillBytes(nBytes)) - _, _ = H.Write(hP.FillBytes(nBytes)) - _, _ = H.Read(cBytes) - - return new(big.Int).SetBytes(cBytes) -} diff --git a/zk/qndleq/qndleq_test.go b/zk/qndleq/qndleq_test.go deleted file mode 100644 index d34c6eb1..00000000 --- a/zk/qndleq/qndleq_test.go +++ /dev/null @@ -1,84 +0,0 @@ -package qndleq_test - -import ( - "crypto/rand" - "math/big" - "testing" - - "github.com/quantumcoinproject/circl/internal/test" - "github.com/quantumcoinproject/circl/zk/qndleq" -) - -func TestProve(t *testing.T) { - const testTimes = 1 << 8 - const SecParam = 128 - one := big.NewInt(1) - max := new(big.Int).Lsh(one, 256) - - for i := 0; i < testTimes; i++ { - N, _ := rand.Int(rand.Reader, max) - if N.Bit(0) == 0 { - N.Add(N, one) - } - x, _ := rand.Int(rand.Reader, N) - g, err := qndleq.SampleQn(rand.Reader, N) - test.CheckNoErr(t, err, "failed to sampleQn") - h, err := qndleq.SampleQn(rand.Reader, N) - test.CheckNoErr(t, err, "failed to sampleQn") - gx := new(big.Int).Exp(g, x, N) - hx := new(big.Int).Exp(h, x, N) - - proof, err := qndleq.Prove(rand.Reader, x, g, gx, h, hx, N, SecParam) - test.CheckNoErr(t, err, "failed to generate proof") - test.CheckOk(proof.Verify(g, gx, h, hx, N), "failed to verify", t) - } -} - -func TestSampleQn(t *testing.T) { - const testTimes = 1 << 7 - one := big.NewInt(1) - max := new(big.Int).Lsh(one, 256) - - for i := 0; i < testTimes; i++ { - N, _ := rand.Int(rand.Reader, max) - if N.Bit(0) == 0 { - N.Add(N, one) - } - a, err := qndleq.SampleQn(rand.Reader, N) - test.CheckNoErr(t, err, "failed to sampleQn") - jac := big.Jacobi(a, N) - test.CheckOk(jac == 1, "Jacoby symbol should be one", t) - gcd := new(big.Int).GCD(nil, nil, a, N) - test.CheckOk(gcd.Cmp(one) == 0, "should be coprime to N", t) - } -} - -func Benchmark_qndleq(b *testing.B) { - const SecParam = 128 - one := big.NewInt(1) - max := new(big.Int).Lsh(one, 256) - - N, _ := rand.Int(rand.Reader, max) - if N.Bit(0) == 0 { - N.Add(N, one) - } - x, _ := rand.Int(rand.Reader, N) - g, _ := qndleq.SampleQn(rand.Reader, N) - h, _ := qndleq.SampleQn(rand.Reader, N) - gx := new(big.Int).Exp(g, x, N) - hx := new(big.Int).Exp(h, x, N) - - proof, _ := qndleq.Prove(rand.Reader, x, g, gx, h, hx, N, SecParam) - - b.Run("Prove", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _, _ = qndleq.Prove(rand.Reader, x, g, gx, h, hx, N, SecParam) - } - }) - - b.Run("Verify", func(b *testing.B) { - for i := 0; i < b.N; i++ { - _ = proof.Verify(g, gx, h, hx, N) - } - }) -}