aboutsummaryrefslogtreecommitdiff
path: root/analysis
diff options
context:
space:
mode:
Diffstat (limited to 'analysis')
-rw-r--r--analysis/countermeasures/countermeasures/results.ipynb360
-rw-r--r--analysis/countermeasures/countermeasures/results/N10/testdn/ecdsa_n_2.csv101
-rw-r--r--analysis/countermeasures/countermeasures/results/N10/testdn/ecdsa_n_2.txt403
-rw-r--r--analysis/countermeasures/countermeasures/results_sage.ipynb620
-rw-r--r--analysis/countermeasures/countermeasures/test_eval.py530
-rw-r--r--analysis/countermeasures/countermeasures/utils.py145
6 files changed, 995 insertions, 1164 deletions
diff --git a/analysis/countermeasures/countermeasures/results.ipynb b/analysis/countermeasures/countermeasures/results.ipynb
new file mode 100644
index 0000000..505afaa
--- /dev/null
+++ b/analysis/countermeasures/countermeasures/results.ipynb
@@ -0,0 +1,360 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e3313aa9-5cc6-47ff-8db0-b4419e1afb4d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from test_eval import Test3n, Testinverse, Testk10, TestEpsilon_GSR, TestEpsilon_Multiplicative"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "15ac247f",
+ "metadata": {},
+ "source": [
+ "## Test results\n",
+ "\n",
+ "[Test 3n](#Test-3n)\n",
+ "\n",
+ "[Test composite](#Test-composite-(inverse))\n",
+ "\n",
+ "[Test k=10](#Test-k=10)\n",
+ "\n",
+ "[Test n+epsilon GSR](#Test-n+epsilon-GSR)\n",
+ "\n",
+ "[Test n+epsilon Multiplicative](#Test-n+epsilon-Multiplicative)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "aeb9bd2b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "cards = ['A1','F1','F2','G1','I1','I2','N1','N10','N2','N3','N4','N5','N6','N7','N8','N9','S1','S2']"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7a53b79a",
+ "metadata": {},
+ "source": [
+ "## Test 3n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "75a7366e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "curve_path = \"tests/test3n/curve.csv\"\n",
+ "point_path = \"tests/test3n/point_3n.csv\"\n",
+ "test3n = Test3n(curve_path,point_path)\n",
+ "test3n.existing_measurements(cards,\"ecdh\")\n",
+ "test3n.existing_measurements(cards,\"ecdsa\")\n",
+ "test3n.existing_measurements(cards,\"keygen\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "495f4854",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "test3n.print_ecdh(\"N1\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "706ef56e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "test3n.print_keygen(\"N1\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "eb51121c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "test3n.print_ecdh(\"N1\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c0cad787",
+ "metadata": {},
+ "source": [
+ "## Test composite (inverse)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c7c5f56e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "curve_path = \"tests/testinverse/cofactor256p11_full.csv\"\n",
+ "point_path = \"tests/testinverse/point_11n.csv\"\n",
+ "testinverse = Testinverse(curve_path, point_path, 11)\n",
+ "testinverse.existing_measurements(cards,\"ecdh\")\n",
+ "testinverse.existing_measurements(cards,\"ecdsa\")\n",
+ "testinverse.existing_measurements(cards,\"keygen\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8397c88e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "testinverse.print_ecdh(\"N1\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "405df6fc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "testinverse.print_ecdsa(\"N1\",\"ecdsa_fixed_11\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2bc5803b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "testinverse.print_keygen(\"N1\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7a39d841",
+ "metadata": {},
+ "source": [
+ "## Test k=10"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b749a7d0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# The test only makes sense for ecdh"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b197e324",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "curve_path = \"tests/testk10/secp256r1.csv\"\n",
+ "point_path = \"tests/testk10/secgpoint.csv\"\n",
+ "testk10 = Testk10(curve_path, point_path, 10)\n",
+ "testk10.existing_measurements(cards,\"ecdh\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "92616fc3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "testk10.print_ecdh(\"N1\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "741ae1f0-b943-4421-b936-30ae8ddaa1be",
+ "metadata": {},
+ "source": [
+ "## Test n+epsilon GSR"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "66833471",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# The test makes sense only for implementations of GSR (or BT bit-length fixing) \n",
+ "# that permit input parameters, including\n",
+ "\n",
+ "# ecdh: N6, N8, I1\n",
+ "# ecdsa: N1, N2, NN6, N8, N9, I2\n",
+ "# keygen: N1, N2 N6, N9, I2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "eb2b8923-5977-4d73-b127-b2773bdde91e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "curve_path = \"tests/testdn/weakcurve_32_n_1.csv\"\n",
+ "point_path = \"tests/testdn/weakcurve_32_n_1_point.csv\"\n",
+ "realn_path = \"tests/testdn/realn.csv\"\n",
+ "\n",
+ "testepsilon = TestEpsilon_GSR(curve_path,point_path,realn_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "40dceab4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "testepsilon.recover_ecdsa(\"N1\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fa3ecd8d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "testepsilon.recover_keygen(\"N1\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "adba1ff5-4235-4084-b1dd-ab206903bb24",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# N8 and I1 needed different parameters for ecdh\n",
+ "\n",
+ "curve_path = \"tests/testdn/weakcurve_32_n_good_gen.csv\"\n",
+ "point_path = \"tests/testdn/weakcurve_32_n_1_point.csv\"\n",
+ "realn_path = \"tests/testdn/realn.csv\"\n",
+ "\n",
+ "testepsilon = TestEpsilon_GSR(curve_path,point_path,realn_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "609ee23f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "testepsilon.recover_ecdh_plain(\"N8\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c4395ea6",
+ "metadata": {},
+ "source": [
+ "## Test n+epsilon Multiplicative"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "312885ab",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# The test makes sense only for implementations of GSR (or BT bit-length fixing) \n",
+ "# that permit input parameters, including\n",
+ "\n",
+ "# ecdh: N10\n",
+ "# ecdsa: N10 - strange behaviour, does not work "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "bab76405",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "curve_path = \"tests/testdn/weakcurve_32_n_1.csv\"\n",
+ "point_path = \"tests/testdn/weakcurve_32_n_1_point.csv\"\n",
+ "realn_path = \"tests/testdn/realn.csv\"\n",
+ "\n",
+ "testepsilon = TestEpsilon_Multiplicative(curve_path,point_path,realn_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "76362134",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "testepsilon.recover_ecdh_plain_size(\"N10\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4c9d9898",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "testepsilon.compute_candidates(61,65)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "66de5424",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# does not work\n",
+ "# testepsilon.recover_ecdsa_size(\"N10\")"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "env",
+ "language": "python",
+ "name": "env"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/analysis/countermeasures/countermeasures/results/N10/testdn/ecdsa_n_2.csv b/analysis/countermeasures/countermeasures/results/N10/testdn/ecdsa_n_2.csv
deleted file mode 100644
index fc1aa02..0000000
--- a/analysis/countermeasures/countermeasures/results/N10/testdn/ecdsa_n_2.csv
+++ /dev/null
@@ -1,101 +0,0 @@
-index;signTime[micro];verifyTime[micro];data;pubW;privS;signature[SHA1];nonce;valid
-0;147641;145082;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402204836aa8080d9f36c3c3cc8b9cc0a5b044b931f3af3a735a93529b24cfd0f986002206e31131c33047a969c6f9b6509710eb76aea51ac4ef485c5aac48af444ec2d5e;2deccc6ac2e7cce433a2b3acfbe5e832a45111d1dae7ef0adcdc2e42988c6d41;0
-1;150395;145631;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402203c7eb8265c119df65a4166ab76382d6394ad890d24d3f0ea922261d76dc8575a02207340275e7b197c280c1a3ebc10fd5f9606c0cc6cba4733d9249cc9546fe691e9;0933e1cf4db537cf83262c5d99121f102cfc5ad5aa05a8da510e89c51599d335;0
-2;150760;145317;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502206126cc3c424c93fd678f64d626462f17d2168c9a53a72118cf8180349f4534ed0221008e596b937f1cd3dd832ace97b48e0907884039ddc6d610af0309d1eac648ae99;6218dd862ea5f7c730521f8cf0aa74f5c9a59ff748212be52f0e1aada9d1914d;0
-3;151283;146679;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30460221008fb712832e06db7a28546eb6111f6bf42bcc4affbb38aecfbb3a2617038e814a022100994829fefc18d46f0d7681fc13e06fc99c244c243100ea8873ebfaeedb629c88;00a97ed033e7c2783d5b8fef26cefce3330a2ccb5d4fb3b8114dce71434ba8f2e9;0
-4;151141;145542;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502200ea042be17e23c3e196be7aff719c930a531ecb2e8b943c4c63460b51fc7cfee02210085bcdd5062075301b8bacb8e62e63c89a344791c0de534930443835c944b1290;009f72504548859c474de9a0d254cfad97d3542c69ee9001005de2e2970bbf9d1e;0
-5;150313;145263;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3045022070b1d3893a1cb5c0e9e7e204f109a6fbaf0115169de69c557d9bdb7df34f02ed02210099fab9020f315e9a92da47801e5e6a09f1d375dcad3434e2ce194e1508931a68;32b9b76d89d6c637ee69cff7b2383526e89158ca02a70d4234c1850606f89148;0
-6;151048;144787;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3045022037f24c745feb415040b0c55a1237c94dbe4b3a103fa1df836453493b844a4b200221009d389d45f2dea4163ef15994b87c52f4b2c1f713e03a3c87f887151010f29770;2c5d0346736bf890a498968110da397d19af3398f30d7f6cd404cb61c20772a7;0
-7;151074;145444;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304602210081bf90539cb95c047cd4f7e424e8d5af444d6a95bfea263469ccebf034e4b1670221008e12688e99839666e82f407158d9fc3dd9364726ca5abbbb0ae5504f321aa421;385a1af065357b70d8ddada5a779b864384b013b77b31b6ec4badae45a15813a;0
-8;151222;145157;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30450220133d8aa7660424c7accbc9c090bbbe0a9b2a6d127e0a56706940dd243bdcc7ee02210082970cb2c434f8bc124ddaf1348a6e7864849b46a8ce2c7f3af03e08b1160c28;2cc43e287252174636cdbfcae5e0d78b7e9acfd3ce572e54be95455bb17efe64;0
-9;151151;146223;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022016fdd69d8fc793b895e8610831534af425e6a3235500f17f4206c889ec6b88db02201a1b830e46bb8683265074a837e5fc93804a16844ca6880ff59746665118d594;2b34539e1fd0a10c69944af2d7a1dc81147b3e9ca3b558856ce53bbb2c31595a;0
-10;150772;145728;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30440220627ae3b373303f8dcace19633a5fafa6139b84cfcdef90a88dbc714a47f7843c022025fef308b1dea357613bf4c446e02467f271e841a99615b409d4ac90c7506fef;0e86547f05fb35ac8a95f87b1193792d0c5ddb98bb4ce75f00fea17577394077;0
-11;150634;145971;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402207159b2bc2b0b28c9e7ecee4d6bb4770d8a9d42cdbe721f78bec45a8180331d0302206e741b994bc0de4eb711c9d5a6c1828bd7a6d543839c3578a4da4d0307317fc4;4dd55305da28c2f62d5a820e99ff61831144aa9d1fe2cd2193ae7a638a75851c;0
-12;151068;146236;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30440220195feed14fa1b8588f9f51e1245aaaffcc7eb4105a50a95cf19e1e694e25870e0220462cdb79751054ccf4118acd258ebfe3a664896e5d3cda54c93be54a069bae5a;008929ecff781f0eeb24ac518344186ff299605aeec3a14287cab3f041548ac822;0
-13;150537;146553;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022036f5c6d11577673ad9720996e85db3ce5d6d0818beaf6693cd92a651af7f8a6302203e5f4f382b627d229e9b77a73271c1e395620f48dcf9e1749f2b259aceaf873b;2fea29e31e34893d38311aa742cf4ab5b052249d5d34a751620b99f928d267ee;0
-14;151020;145613;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402201350b0f4efee83dd230d59bdadab8c5b88a70221e60a0d56a3b8c6de2656310a02203e62eba2a30956bc41d6606b3b3b9a316339720ae3ba8550ade94556992a5d87;00a66b663561807cfc8481bc6366dbef17f04800be0d220cf567bb1f64674df5cb;0
-15;150989;145342;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022060a741df0ac4ae9c52e04dc25273e56ee3607e0cd81e2a9bee83614779eb56bb02206a916c4447158c78bbd260ae25d5feb665f8917b6c1bcc73f18372a520da1dce;009c6b7adecd6ca34b97ecff680ea6d722d6a65600d3d8a92fb949c42ca857d77d;0
-16;150534;145500;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402204c2bea2501575f6ce23e511006d04eb31695ea2dd5b62bcf32ca562616ce0af102205bf06002bfdd09ab3598e1ee06c44d4d2eb4d3ffd5ed5d54e2cd14e9ed8a065b;4624612c96f14eef1f3fbbe64ff74a342f9d0a5f0320dea2dcac10ab65887421;0
-17;151326;144987;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502200462b54628a7ac3d07c25d87943c02b46ab72f9d2180df5d0e029602a50915cb02210087322b3e3bec5e1ad28711221a9f2b48fe800f29410904c3c8601d615eefe9a9;008f8140602f5e1a6abf39ef5eacaa521c8f1715b3d3209ed1c1df1866871c5882;0
-18;150154;144582;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3045022100a1df0d6721c696d1becd007e647f5e026e5c0b8614e6f9f3e9dcd3bee04eb59a0220306e05dde142f578baa3a65b9cebab0026a1a1739abc1efe30d07aab365cf9f3;00956906a298c6864db6a21f8bde05da841c938b914421a2125e06b878c8144f6f;0
-19;151335;145781;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402205e6c281edbfee050a417100a23f559215ff859d68d0655fbde0518fc89f6bb7202207c1d04e8dd5fd722e747076cacb034de65d4a68383884a702cce37e440458407;43d2850536e9a08ad3ff566bf8111abf61e501b73b255f37acb2f487ad3efa2b;0
-20;151253;145654;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3045022038cc3ddf66499740d8ec1038a68e1158cf44ab7540f5330874a13a4e4c3dc553022100a18070f7f40412d1d8c74ba67c2ed4bd4563d1296c76644dd656b4f5acbb6233;03729313de1d13fdc324b771dd340c6bcb89ec62c978bacda5ebd86a67f2664a;0
-21;150585;145256;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022055c785d9a361ea539bccffcae87335538a00d7cc3ead69e2a27867058999fa3702205ba1c81a7459a83cb3f0e4a773409824b355314b351ad51fcc5409981afd01a9;65597d95db63f9b0779f0423edb69edce669e8cce6b34b260798d1ddc2820d8a;0
-22;150756;146138;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3045022100a6d18f3e9b8aa867ec5f664fd3dfb83f6e93f392e3803b1cdda6ca561a34824002202e44a8561568567df7ad91710f34e6d6642076dc084073125e3f8c399fd639b7;3c72bd8ac9853572425ba17f80b68f0b32ff1bc3c9eccf51d4ba2d7c643a0048;0
-23;150728;145044;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022076d52266b909b5c1aaea8e169055da52788f698d21e84d76a8ae08548b45253e022031134c16c518ae9907ea635b6175565e45db390b3dc86f191b8bf958671db37e;2f2dcca7e7a4c53712ca23d0483b26b475f2e361e294394f7c5e0ef35149a779;0
-24;150757;145998;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402204a579e97868013971a7b7e9267ba974776d0100a45ae5afa99bbd08038d9084e02205bb1a35c9e8e84787c2dfbd17c736a09dee1b8c5b1b99d1f25672c01198d0307;316bcf79af7ea9ce5169615bba2048ba446ebf8d9bf35a74adb984bfc882b85f;0
-25;150838;146431;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402204d4d6d4d17ebfa084e4c2464f2df5379b62559b1b81e52f41b0328e19cd016f1022033022506cf517f2bcccab117f9dc5078239fd9ed46e6cd7948f28076b2a00e95;72be9b4f775db7ea04c82793e9ae61d91227867dadfdad9749cec7b16cc61e56;0
-26;150764;145125;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30440220465056531733f871bc51ef31e5aa6ab17ce6ebd85c05ed8158a6ece280b7c4a6022042c577bfe53eef8f9cc110353c62b26bddc1419975ac81ae1f1b9b601e7cb05f;774474237cb6fbcce1ac3601c70ef4f5a03acbf74fb9f3d8fe5dde5c730c504e;0
-27;150959;144983;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502204dcd2d352c733d91ebdc34fd08d10444ec327f6c0c183a5fc406b9b36132b35002210090ba257b3ba7f8d3335501c578bb9fee5ba567ac0c325b602fe382e36ea0f498;00a49f465600bd963b60f986fff3111672ac11a181f7c48b0904f9996709a1f6cb;0
-28;151109;145179;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402207e9e19b243af4e0c2c036a42b7f0b42a4c4973188c020e4d4431f74a2695019202206e6955cee9b04a243bc9800fa2a0d42a6cf2709d84394ca3f2818bc285c5c038;1a73ac33d38ca9c5351b658bc30caab562fdd54b06368d449e34525e1d3a8a01;0
-29;150794;145291;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402202b0778dbf55d08dccc2bbfdf0afde941e6291ca1b922a6c9278bad7d9c0a7f82022061773357b26ec420d9a50f8cd1e7b4aef6e78e4b8c037706f2c58751b9a9d746;4ed154b3d4187ee9e8e510d3922be5162b4df764d1be167d2591be369ca7e68e;0
-30;151218;145523;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402205495e4708f41f6be35608ab4c95b51fd4cdfc5486868e55b4279b0ebc66e86c8022022e99cf1eeb7803100db528ab73afda2004f5181141285537f3e6a5ae204a14e;7a31e44d7b429c46feaa6fea3263d4f4906e82bd8f193d68ecdd82d25ed1181e;0
-31;151078;146090;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30460221009c199bac0bea9b99050f62188c51674fb94168be09e4704d6cee29d955b6d4a40221008cbb54d922213c4f7c5153d30909b35cf35a6dab8f49ff5a62b09230f910ac77;10f713885e151751625cbb1b2b308c4412383d231712b879c534bd5c1ea40b7a;0
-32;150800;145069;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022011e759964600cb850ffa0550680d0ddb695c077788cc230933d38982402bb3f402202234008091aca44da14cb3b0ccd53d34353b26c70203adf353edcf5849c53156;0b90631bab6d26686a86de06a1be5ef9a01d2a630726c686f3a67969353d117c;0
-33;150752;144679;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402204698e0a51596780727044fa65c055cd66899377c1531d43f7530b521adce7e3d02203f679d6d2e6f4e08b1eaa860676b2b18f0b92be2f0fe220514f05cf943fba845;008c289b19f6fce606d0f6ec61f9d247e8c1515a86e0013da82e66376895efdb4f;0
-34;150975;145304;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022000877994d01f7de86569cc0eb5b403d53d46cc68ce30e397c122b36dd88297ea022047f06f0db35c37f27001d31e72d3bf34d34faab43567a9a76d134e3cc8098467;2daa4e456925b0085d3b094cf261e2971af85444d7ff888cc8ad6f7d20e85800;0
-35;150806;145155;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022066f58facca374658c1b353ae711caf2c067fa709b3cd7fb3b2c1d4b0b3791eee02201897b8f410b760e985369fb6e80517c3e989169d7d9dfbe22562e012eaffa98b;018820422406f3733e53e843c01af597ede17987ac55c5accf03c07e3eda5ff2;0
-36;151039;145606;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022002913575f880b4aea0abb749343cfb2b53ac8f4c8a9f281e01f3a125565f7ed002202ee0a248d79ec093e14e9b8ddeef02db264e39cda659827172819afca7668ff1;3c9fc23787943d15687cb0cfc2c36b6d61a4949862e8f6384b2f287f168c570d;0
-37;151019;145260;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402201a365a55f3da30bf2415c227bfde50411e4ebc8c33902423963fb782dd91e00902207bcb776bdabd2ae961a3fa6c7d7257d7538bf9a90d40dfac3f6a36061084a034;610df4f82a738c2ed05aa7b35d72e57fc12cc3128a6e4f7c07fdf1a57a65448b;0
-38;150677;145640;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022061ebbb55a0c6f599477545ccd0c3508247a5306972799fb4a610d8151c6baae30220710321eecc1bf89fff7af83df3e954a65f5afd214b0c3d05a9221b8ff00dcdd4;5b8f520f15bc075d9f647632243f6009fd84b9ed9df8063842dd838cd7cc2688;0
-39;151103;145617;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022026d0d946970a692ad10fe3eea1e4c6e4f5875205de1bf1c23ec93d59365833560220244e9fa8e8e04ba744f0a47e4a7776a249f4c811663fa8ce2cca7d9e9f7a5c5d;21aaafbc2563614fb40f56edf88a56179a238d3cfbc732e026144f0ae39ca7d8;0
-40;150365;144749;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402203f34f72b2d8a5143d2103257ede94e5dfa89495e6cb5e4747ed301e9e64914e9022030e3dc1e0b624c2e3678428162b06c58ed50f7acd29a322b891926bcf8ce519a;71c4abf7175930ade1b0681fa364d2f4d36e25c866ebfd066dd01b1be180012e;0
-41;150996;145135;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304602210095ee57d2c7403112d1c088e36fca30f69b391a15451efdfaab57ffdaf68ae60d02210082991a3cb5c1cb7c06ad62ef0ea8a322215ea02e350cd20f0633597e7f75eba9;7ce3f6a5c01088a1cefa7b67f8ee6ebf1a56b1f1f30452a590a6d11058488a41;0
-42;151266;144826;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402205582ef091097ca2713960fa2fc3cbc5af1818c04b9826ca3ee6e87406f1adf66022074b45c7974d1418a5e2e21508bc9194909626375fdf100d2015715a8b1b7f92b;00a903d0acffd8ecbf51e4919ee227c2e47ff49f9b0a8d9d081fdbc9dbc74fc1d2;0
-43;150686;146113;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502210093673adc4496bca9ffff14671f62a99eff933c1526b10243ca8ed3ca668fea6102203bca695ccd3d621f899f61cc6c71527e7f03f6f20591a4c4c0d6b582c5a1d616;009adf85133960765465bb472c1540def9377a59e7596f86b4d0e81448ebed9d50;0
-44;151118;144571;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3045022034bbf00b4029e7cc81b8b0c72c7618769231b575ed0a0058226831a957c31b1f022100a7b96918d148270ef5b9a5f05beac60e3e5b9a7a64527be124aae1e609b8e246;0a7d57f2dc3788e61ed43ea42908b55d5198583a435cbe333b825d30ccc6934c;0
-45;151266;145615;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30450221009057b0b55c51e916e6259d2285042fd681f3f7c55748882183d34d84b7a6c3e202207127332003f0cb1a04c91e00faf1edce9332f2b1f3fe1de68f461aaf97b71830;00a84b8551f5030269abf05bf96b63aee8245b35e88068cb75383108011ed00761;0
-46;151004;144975;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30440220013ae1f09ecae5dd52d6610368727b8f0005ce5c8c27975722965f744313dfd2022021f7163439827b1862169d35c6a6970ef1ad545531a4f4b61ebc4fe08e0a6451;1b3251095a70faee8a9a7bf8c9516b63c126c136a9b3851d75918a5c58f91e86;0
-47;150609;146363;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022048715cf1c0df50a156ecfecf777d46004203dd80f98c7a3bea0cbd4d3ec49ca402203df947feda0cd6a0a9f656580c133eecde4fc1aaf23f07eb2d2290cb0858c81e;7b8d6cfaad312a4e503ba3f1ff39e66ed72ca92f744220978bc7a5eee23bdabb;0
-48;150514;145453;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502210095e13b57a3ba8296967bd6b3979c37caa27c31103134557142b466ecfeb2086702204c98300086798b8acb26f3a6acab602ba60d20484fa44b45a8b77cd5a8a8d481;419782a57f7d22101d9aad8f10f300aaea5b0e9084139e42d61a0323bb7b9b59;0
-49;150957;144546;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502210092c1e04fcdb24841d5fd650df4875be00a0d07e5bd8e347905a2b26424b6aa1c02201fbba1a18f840d9e52f6d85d63d6c18e8b34017df7f8e6eb499fac02ee5936cd;0b40f505dcd866b135d1c4e1e189eaa163d77b46b9c22d9c3da8c61a4b85c52d;0
-50;151202;146450;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022053cdc7232b542cbf4a2f81f337a5855b26562faa9ea2a76ca00e231f7b2fdde1022053e1be9614fa9d3ac6547cc09a171379987ffa5ddd1604e578374566f09f144a;009c44677057d3118525a5eb821594fbc82befd9121e34ea888f0bc12826ffc4f1;0
-51;150910;145584;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502204671cbfa57ef358604dd67beb476b0d7f19b1668e1997bcf0caee126e1102f770221009723addc64b4f84cd111b60385d0580946e5dd6c5ce27df5d65dc1a09171b03a;00a474ac7c818f2838b095169719b3b5382927702a5febea2ce901996d217138a8;0
-52;150970;146012;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30440220707913edec1f031d74ec3e300bac89d33b2244647e8fb1dfad8d98c408d4b0f0022071b84f146e6afb721e5966cd5fb53dd4ee98c5998c8c3f450ac7406f6bfc5cbc;00a080c42181127dd7eccac859bb821f668a3b0b92247f84b25c059bb303a284cb;0
-53;151269;146516;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502206a04f7bcb73a3b568b76f0f6f5cd220c51fc15ff227a615d5c22498a1e4927990221008eaf2ca36d7bd18f91f8972a3868e299ca0a83568cdfd8fedb3302893731a11d;1969c599284e80b43c77f2dfcc3e907ba97e2f3c4775cb4572836a2200e7f87d;0
-54;151232;145821;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30450221008a1db9e714e2810886b977cb2481164280f9e8fecb703df0b37ebaeb67d19241022008e0d5ad34d1b8ae6d5354de8b0dedc825c6a0e9d24d28510cfb2d71f1daf93c;26d31ec86ae24fb2a1b574efcc909c35dbb5e09f258f1b291660866df6d5f3e9;0
-55;151591;146396;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402207f6a623d6c02591d2aac9ba38ef8dc1f53134c5436e22b4ce31c0436941c496c02200298eefd95c54013daec0dd0104c733863bd5893c5e4b3f6b839bf6b1cb64781;009137ba489c7f9c1270ecb89664595a0460b7759085b8b1cb2291bfae3fe91a4c;0
-56;150382;145839;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502206a4ba065a8df93327e90b1376f6f763ffd7149830f285f92604e4d376f1f9116022100895ea0f28d25566a8eab368603c54157864ee9220193efba67d7958227384d55;0088c27698b2dfea6c6932e147280a74693e3247cbf3cbc4bfc911bab8664030e7;0
-57;150864;145196;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402202935eac38fa16d51b3368bf41578e7ede81bbef383ed8f676dc7a4bca659299b022052cb5b6bc0c022c06553fd2f70a3fda6875460b7a24cb9b11a7b623c8e3fd091;0a06a7839a261d2ff11837f409cc599fc28de5842c42ce4a0f3eb15645f84b4b;0
-58;151006;146105;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502207cd83f4492da43f8d34dee7f0be2d443f791e4aaa170a621747291657c05a8780221009772f16dcea71212cdc11520d0092768432b5ea82aa4c99d515044c5441ae31b;1d19f822c7806e7e082714b8a14c15546329ce8c13d9beb970bec8a2408bf015;0
-59;151073;144529;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30450220403399e198536c1110a848dff224cafca04bccf4e57890fa939c635bf3d76ca9022100a46d26ccd5b9554853321a19f066085fa3b633d96140514107762255d859511c;490412f74994afb364f2e3460c8765eaafa175ffbeff2e8b6510d071382adc93;0
-60;150979;145977;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402206ec292b2d383b4c5409c52a90e3d315ee9d8f0ed730b61c46f38e1aa730ed8a902203f2c95975118f4794bdb44d713fadeee0bc6f6ab39c89b56a971e97c6cea699b;37af83819ef84a19d15f725ff12d53913f2ccafd8cac436f42b1f8d55956b54b;0
-61;151441;145610;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402202ce3c1a7a9d799d6549b0bd52ae3fdb62a866aad47467cee7b441fbc4a1c0f31022049974afcf6f3c46f20802d6663fd7b3b6e5c3eaac88f91a3d67771f18db79891;58f2e039a64e4a132b8c2311c53e7ba91230cb2338283c3938cbecb9f78123b6;0
-62;151204;146373;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3046022100984ec63d4675b202490e9371d88651974539d363a2243997512b3ea4bda8a73f022100818d16e243168362c11fb9cde8fc6734c846729a6ec766b0f473779e78e47ab1;166d0420e56f3d10017dccdb49c1985de3e9acbd764954c86d8e9dd65c99e733;0
-63;150651;144452;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402201e9e9c57cf9e8fa07d2b8bcc27b64e4031bb7b89fa53a70ee6df36ef427bae1602201e9638c942a8b7f321476c4fa3a97e5699012cf8c7cfe73b777bab88ef20e77b;7e5146879da53de83d4c8d829c662aa8e6551510576644215e51c12dad0bc144;0
-64;150725;145584;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402202c17e5c03b96017119c067873b4c4cdbf5dd9446d38ec0c88ff29fbd11bea8f802202a145549c3563f78bf1aca085fd0a9a10256e369695457539b8b1ec7d091a56b;3273b58a5909724e1a8939113726573e5dd42060f76dd3ec0a2258614e07b38b;0
-65;150988;145230;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502210099af02059c1678a8c00f51fafe63810821247663620e8015dcb233161e8e9aec022032573d902dbfec65233fd136abbe05f5c1464aa81da8cce888a7759aba4fca42;2b38afa202da10e2d18909065a148abee910c9bd62450505fda17d449c5b59cd;0
-66;150770;146013;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022002ed4dcd02cbf89ab7ab71a1f83e7d1e7327819f15c194a0edef6592cf8cf0b40220434add31f552b5834e8ca59a076b00b073a2408c348662201160674894367ec8;008c857914516492d361f5b8642a76f4c754b88e0775cad7cfa5df73968b4ff5df;0
-67;151077;144894;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30450221009f8ff9b067d32b5cb4b832117ffa6f4ac99ac16533e57021fdb230910bce22c1022076230e7bbd79267c0e307f5daac8614056558bfadeaaa1b00472229cb8c91a95;28b5a0fa632b12937b8381f763211874004bf5080bf7223c4c43968d41cdf1b1;0
-68;151415;146484;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30460221008ec4538798d7feeb3b648322ac64deeec06538b959189724b163223c6499163d02210098f8c5c9a54d96f45ebc0a62332915c947c469a5d1ad68b8815e98fc5b69ade4;727a6c8d407bab88014701974622166dbcf54d09ad9bebf1216cb928f4a39201;0
-69;151134;146003;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30440220751edf4d03fe3cac7de3b32164f06aa24a2a9d02bef6c126e1b9711367ff3057022071a4d1290064a99decc27403e2619d368e537bc0305c3dbb62f7f4924278e542;21ca37c8ba1cb3ced79984992c1d12bfcd56fe0e8eee0243f1db0e9148346863;0
-70;150710;145299;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3045022068d8c95f27f54ba64083701e57ea79408a3a900d77cf6dac7b8e7eb8fa9c7cc20221008add1548d4bf7254baa6e85a871e89c6307dab8c269ce57ba24fe7eb59c2adc5;00a4c49c3d1a895c102db15518e49712e3b5c503ff09b1e5771e3708aa7f2fb032;0
-71;150992;145899;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3045022079d1c6572c8f75130a31fcba18b3d1d4966760604d9bfb7d3a6b34f0761cdf200221009425a5b9f056cd014378a8098b40c662ed198aa5625f888162792d982f2554c2;09a09268b963b611359dd936e49689430941041f14556e13370ba742a3497fc9;0
-72;151116;145921;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3046022100a32d36e192ee04ca86c964fd14c7a2f0542459a72bbe4dc61551b4d5bb959c8c0221008361eec22c711c835f0f95fc83bbed74515c2f904d6e12360061a91138b134a3;14922e9a1643d4283d346a5cbc744950c8196e1f6a26a6c5d99bd4e08960ae2b;0
-73;151313;145023;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502210085853e8167c1db96d7d0b9dce78ff48523653c78455fd0e475a463a3a3bcc95402200b6a7987d8679f7687cf3034f82deaf692aa2bf28695ab397b646f879e863622;0088d053e18e2e37ea4c2208b4f2385562e1d03d85094ddf60afa8fa212b6e0e4f;0
-74;150706;145307;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402203e4f567b03242958af69551dae6e5169c60c58689ad5b59247fcb187d073350102203250719ce81fab9bcbd1decc2977cdb169588181902276c599d8e6f785ef147f;5052e0d2d59a915ac6668ae6b00c055bc1e02a239ec77ce29e33aaf120cf977c;0
-75;151144;145475;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022024050e1bc3f33a0cb942ff1b7ebbe25bfee1bb4abd554e296920b9a7d835916b0220797bdf74183d57ae94472eff44a108ff1d6f5151b7f3bc43257f17ecfcce589d;008401dd1be438954f150db286ca3b3aa695bba5a659032d52eb2380dfa4e9d320;0
-76;150951;144645;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022003d362083e0b1207d9b877eb446b0ac65664f3ca86624d0ebb7f033d9397c7b102201d686ba7b3ec368b36653d32debbae951f09d70cd65afa38486a813a25629f2a;0f9a1a611daa34fb781bc0f0a2e054b95f4e4d89b4439a76b6b9bdb6aab6db8b;0
-77;150845;145457;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402204a255d002971d6e2b9f87537824aa0f6c78467015cced52b45297553336c039402201be1dfce153b962cead00a3d5e696baf4c116ea09008b87040d9595d4b0373a4;3a8ad29a19b60f4df8cda46ed91102bbd359761205a28702f868b0993d20c491;0
-78;151965;145906;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30450221008730741c24b7a8a5faa3a60c858d5147532807875f9a9555cf31d39f1d0bcc5e022056b8a5d7920a5a5844ac41a8653c6f53967158c2e9c48e8464ee3a5963dcafad;0086553309466f6bb3b2e4a0729a96406002801612179e567824af09947b851686;0
-79;151110;145843;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402207b2ab7e8cb36ba1966610a5080f926750272d7f4c682a179eaf227c3156bd84b022079c67df8cdaba437e39d5e64059b423d12f01b9eed1bfbe5e712b7cba778f519;48cff57f4c83a3396640512e46552d7f340316b4850c76f5f436e5429981599e;0
-80;150401;146141;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502210098477c6a0824354723ceaaf4ca6a1d05e3bd49fe16cdf128334f41863d17aba402204efc6caf43b6bd410c624ebd14e923da01176024157b5d057e1912f036fcb6d3;67eab7a9441880bd70fddfb07414a51495ff2646a1897b6d77c9cbe5a7059b3a;0
-81;151611;145581;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3046022100a6c55c0affa5461a2a9150fe06dc312272fc24436bef6a7ad410647e71a50c0d0221009aef638e519ff1fc514b1b5368f0f51cc2321d1ff47d8c0d7acb50abf7a6285b;0192828ecd078e2f787bf4f7524fe8a83117df859526adf13515821de390a790;0
-82;151406;144450;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502204e1abe88e2c3747ec7aa4ca742a772925dd161da64b6ce0bbecf059f0f86c39f0221008e4a720333c40149ead15663dc23b3bccae13c64157a59f6410a5bec07bf46d8;6e1e936f028110888a4083565846e142b440d8681ed49ccbdccbd202ad06fce4;0
-83;150404;144717;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3045022033d75c497275646b7b3eaa366e1d288efd593da7e147b72d5893379550ce8deb02210088d15dc07fbcfa9b3d84ab6c3bc2d85cf130698dc06f306f584ca13d49cd2f28;009fc55c6e25ed1dac76c5e90f06803fdc1dd7fe68a4a448269598cff028c220af;0
-84;150741;144517;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30440220308226efe706874b7ea7bc7cfc717b2fb90d353ebe70cbe2358d7ff067a1e4c502203a5ea46154804766326c0b2ad826d91a9b93bc90abfd64d47cdaff8236923714;40cc97ec7a516d590e904e6944d9a1cd56b271a0cdb349e07fc11daa67a569ec;0
-85;151139;145601;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30440220511ad838401635f3ec93d5f9e9796617a13d815bdc69b3666fec855c7afccde4022048a9304f92e73012515986e9dd4b30413a1ce14bf109715724aaf114334c6a88;62d6ebdbb27c5a7537c0beddee2da6b846a0ad1ccee42d6a895446629e0c55e5;0
-86;150884;144428;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30440220669687e502262815aad09f678b33add89b4be5b388abbcfb707358bbff57613e022060a702f420018d47b40c2a37120be13f26c1701ea99ee2541b1eff55147a8814;0099f086f45c19f0e16d7c846e07d124fcb0b8c6f45ae7bb8b8f23f16fd22b14ba;0
-87;150785;145035;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3045022100a92fbb490790cc7c5be55fb2efe8a83d521fded00e949f66dff0ceb13ae6ed5a02205ceda3225d8e4eb30f5e1733f95b07e56257aed27f3873aca97374b4f4d1da60;00924b3854f5437f09e9b4d1a03f6822aee656467af3799b96db744cdf45079a5d;0
-88;150869;144557;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402202c8c0a39dca0a6c50c9821d9a1ddcc1b804b81efeb76e4f4e5c8901c1cc59491022000bd3f37a5105d5f62d0f07f3d03e3347ba246b4595224e3191b95d3d2c94b93;0088a7a47620f45194350954e4ceb4b398cc395b29c92f180214200dffc7ddb52c;0
-89;151160;145564;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022013f47e1599707dda3604be5025ac2c75f0b6a6b3540d58bcc7f012dfc1efb5470220128bc9baaf14f7d330fd634f4a8b8cbb7e25bb67b39640de1717b75e2ddcf8df;5c68274b311943b6a48e2e7afc2e4cf114e942c299cfeec4bc75cf70bac02ec0;0
-90;150883;146665;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30440220748df6806040320d7af9511af152f4fc5e68dc7a1f583e817c392080a1098524022030a25b086e54c2992b0d3e6a79511de3da904b06b0ae2d5b8a749d85a743cf7f;00802a532c3c89708b0543f374d47e4122d398166be7d729748d8399d8370ab073;0
-91;151132;144889;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402204a1c57179f4dd5b8f8f4df2f35ca7c615a06341ab10c30faf77e0db29ee686810220019064e683b8b1580132cb81d2f95f01f8cdb2de29b5a1f2505aa5fc41875e98;00993e03447e5224f1f0beeb90724bff88ce3c720845158f690699cb9f2627f32e;0
-92;151370;145036;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502205561c582d297434edecff14d564891960c0cd4b3ab856c4acabcc641daff07500221008366da712c4feb9e93a231641ff92767ecea30ae8baac235353030857fc07aea;008a8fa8551bd11e549d5a8e97353740442345175de7d2dd39cdc0a30b082df5b4;0
-93;150448;146096;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30440220328352d0c9a14f32ec4be28219812dfe0942e9d89aac23ab2f046af3cb7a868302207992b2e9300c14f9d811054850e00e7b86e72d0f217e6a718a8c297974f2d498;4283ad2a6dd23e4b3d81a601c9868f5bb71bf5d31e0077f56ffefb0b7ceb665c;0
-94;151101;146162;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3045022037fcb470cc834b9ee2ed9a11f3da66332f62d4b33fae33eccbc356ea919ded52022100a70cf254b2cbb525d2aed160aa37b38866918a05eba1ba102e0d3377b812e085;4f1a62f07dcf47eb2066d2958889dfca05514427faa732a2e697ff40a7064ce5;0
-95;150248;144905;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402203a986d6e810e26fa58034175d963a7bf5d8eac084359a30f17a28f04b58a16c902200560daa623ebbbd7866b622caed20e763db797cb1fe9471bef2c254755a67cb0;64e6e6d603e489a3d65ab5690c079ab15e1b5e85dbe8523b6df64692e6790fbf;0
-96;151049;145770;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;30440220479f8b9d54f50d1c8e728fea54e1f8e01fe6cb975ff20253ee9bd8c653ab7e880220195163f8875dd7c84b8ea413aca117a7a8eca789ed25f74195fe287fcf4f463f;1913f16785f6441bec16538a4457a50a2c290372fa8f9041fef1ef97fe52bb7e;0
-97;151320;146461;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304502204a87e0337827812185e4ccdcd9a0414c7cf4b845a0a808702e2c79f429bf1372022100a886328050bf8e6c34eda4285fd8518594410b65805eaef03dc92a4947201e51;2de21d9511bb496191a1bf9faf9ba3578f5034d5b8b8d69ce03773862bb56f55;0
-98;150504;145242;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;3044022064a022299afc4b2fc3bf67dee94d0568971582e90ddad894fa57a1a61abb262b0220640f9e0ca7c86fb82d3e244569cfc374d82e0a34205dfc7e4cbde0e8a15a6c13;00818076cf78fcdb81fe24fe9da95cf392fdd98a04dd9019ac4abb11eb9470d174;0
-99;150718;145428;084d640cb50d1c4629c7026623a0ada0faafac5762222cce1e5e933a3e69b2ba;046ac2a2271f2de8437f339df079913f2b41d284678af67cb409d063da9419c3056fb9dc7bfb3d146de81f79bac064ac9376054a7f54741f91eccec294815ab764;2bc345cc91f6b17ca180beb2b5de274e1a384e9dc2f40de02eae4141a91f39d5;304402203d11120b92c447906f82dd9b32f8179f5fb319d25ec65d7719cf847a7a8e831b02204fc1d4a7a8d0d64548a85a17fc55223ba187bb4cb9ae49088121aa65acb63d09;29ab63c9fc3ac0673d9a8efb46ef87178453d29b8d0d72c9b1ddd2fd2b815544;0
diff --git a/analysis/countermeasures/countermeasures/results/N10/testdn/ecdsa_n_2.txt b/analysis/countermeasures/countermeasures/results/N10/testdn/ecdsa_n_2.txt
deleted file mode 100644
index 5f18e48..0000000
--- a/analysis/countermeasures/countermeasures/results/N10/testdn/ecdsa_n_2.txt
+++ /dev/null
@@ -1,403 +0,0 @@
-Allocate Signature(ALG_ECDSA_SHA) object ┃ 66 ms ┃ OK (0x9000)
-Allocate local keypair 256b ALG_EC_FP ┃ 83 ms ┃ OK (0x9000)
-Set external curve parameters on local keypair ┃ 335 ms ┃ OK (0x9000)
-Set external keypair parameters on local keypair ┃ 59 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 147 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 30 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 30 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 56 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 30 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 56 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 58 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 56 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 56 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 30 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 56 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 30 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 58 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 30 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 58 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 30 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 30 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 58 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 56 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 58 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 58 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 56 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 58 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 58 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 30 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 58 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 56 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 56 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 30 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 58 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 56 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 58 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 58 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 144 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 151 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 146 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 56 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
-Set external keypair parameters on local keypair ┃ 57 ms ┃ OK (0x9000)
-Export keypair params from both keys of local keypair ┃ 29 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA signature with local keypair(provided data) ┃ 150 ms ┃ OK (0x9000)
-ALG_ECDSA_SHA verification with local keypair(provided data) ┃ 145 ms ┃ fail (SIG_VERIFY_FAIL, 0x0ee1)
diff --git a/analysis/countermeasures/countermeasures/results_sage.ipynb b/analysis/countermeasures/countermeasures/results_sage.ipynb
deleted file mode 100644
index 92df739..0000000
--- a/analysis/countermeasures/countermeasures/results_sage.ipynb
+++ /dev/null
@@ -1,620 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "e3313aa9-5cc6-47ff-8db0-b4419e1afb4d",
- "metadata": {},
- "outputs": [],
- "source": [
- "from hashlib import sha1\n",
- "from pyasn1.codec.der.decoder import decode\n",
- "from pyasn1.type.univ import Sequence\n",
- "import re\n",
- "\n",
- "def parse_ecdsa_signature(signature_der):\n",
- " decoded_signature, _ = decode(signature_der, asn1Spec=Sequence())\n",
- " r = int(decoded_signature[0])\n",
- " s = int(decoded_signature[1])\n",
- " return r, s\n",
- "\n",
- "def sha(value):\n",
- " h = hex(int(value))[2:]\n",
- " if len(h)%2!=0:\n",
- " h = \"0\"+h\n",
- " bh = bytes.fromhex(h)\n",
- " return int(sha1(bh).digest().hex(),16)\n",
- "\n",
- "\n",
- "class CounterTest:\n",
- "\n",
- " def print_card_name(self, name):\n",
- " print(name,\"#\"*10)\n",
- "\n",
- " def open_csv_result(self,filepath):\n",
- " try:\n",
- " with open(filepath) as f:\n",
- " lines = f.readlines()[1:]\n",
- " except FileNotFoundError:\n",
- " print(\"Not measured\\n\")\n",
- " return []\n",
- " if len(lines)==0:\n",
- " print(\"Something went wrong\\n\")\n",
- " return []\n",
- " print(f\"Number of runs: {len(lines)}\")\n",
- " return [line.strip().split(\";\") for line in lines]\n",
- "\n",
- " def load_all_results(self,card,prefix):\n",
- " lines = []\n",
- " filepath = f\"results/{card}/{self.test}\"\n",
- " pattern = rf\"^{prefix}(?:_\\d+)?.csv$\" #prefix and possibly and underscore with number\n",
- " for file in os.listdir(filepath):\n",
- " if re.match(pattern,file):\n",
- " with open(os.path.join(filepath,file)) as f:\n",
- " lines.extend(f.readlines()[1:])\n",
- " if len(lines)==0:\n",
- " print(\"Not measured or something went wrong\\n\")\n",
- " return []\n",
- " print(f\"Number of runs: {len(lines)}\")\n",
- " return [line.strip().split(\";\") for line in lines]\n",
- "\n",
- " def load_csv_signatures(self,card,prefix):\n",
- " lines = self.load_all_results(card,prefix)\n",
- " sigs = []\n",
- " for line in lines:\n",
- " success,error,sig,valid,_,nonce_hex,key_hex,_,_,_,_,_ = line\n",
- " sigs.append({\"success\":success, \"signature\":parse_ecdsa_signature(bytes.fromhex(sig)), \"nonce\": nonce_hex, \"key\":key_hex, \"valid\":valid})\n",
- " return sigs\n",
- "\n",
- " def load_csv_ecdhs(self,card,prefix):\n",
- " lines = self.load_all_results(card,prefix)\n",
- " ecdhs = []\n",
- " for line in lines:\n",
- " success,error,secret,key,_,_,_,_,_ = line\n",
- " ecdhs.append({\"success\":success, \"secret\":secret, \"key\":key})\n",
- " return ecdhs\n",
- "\n",
- " def load_csv_keygens(self,card,prefix):\n",
- " lines = self.load_all_results(card,prefix)\n",
- " keygens = []\n",
- " for line in lines:\n",
- " success,error,key,point,_,_,_,_ = line\n",
- " keygens.append({\"success\":success, \"key\":key, \"point\":point})\n",
- " return keygens\n",
- " \n",
- "class Test3n(CounterTest):\n",
- "\n",
- "\n",
- " def __init__(self,curve_prime,curve_full,point,key):\n",
- " self.test = \"test3n\"\n",
- " with open(curve_prime) as f:\n",
- " p,a,b,x,y,n,_ = map(lambda x: int(x,16),f.read().split(\",\"))\n",
- " self.n = n\n",
- " self.curve = EllipticCurve(GF(p),[a,b])\n",
- " self.prime_gen = self.curve(x,y)\n",
- "\n",
- " with open(curve_full) as f:\n",
- " _,_,_,x,y,_,_ = map(lambda x: int(x,16),f.read().split(\",\"))\n",
- " self.n3_gen = self.curve(x,y)\n",
- " self.public = self.n3_gen\n",
- " self.gen3 = n*self.n3_gen\n",
- " \n",
- " with open(key) as f:\n",
- " self.k = int(f.read(),16)\n",
- "\n",
- "\n",
- " \n",
- "\n",
- " def print_ecdh(self,card):\n",
- " self.print_card_name(card)\n",
- "\n",
- " scalars = {self.k+i*self.n:f\"k+{i}*n\" for i in range(3)}\n",
- " shas = {}\n",
- " for scalar,s in scalars.items():\n",
- " shas[sha((scalar*self.public)[0])] = scalar\n",
- " \n",
- " counts = {s:0 for l,s in scalars.items()}\n",
- " secrets = [int(s[\"secret\"],16) for s in self.load_csv_ecdhs(card,\"ecdh\")]\n",
- " N = len(secrets)\n",
- " if not secrets:return\n",
- " others = 0\n",
- " for s in secrets:\n",
- " if not s in shas:\n",
- " others+=1\n",
- " else:\n",
- " counts[scalars[shas[s]]]+=1\n",
- " for c,v in counts.items():\n",
- " print(c,v)\n",
- " print(\"others\",others)\n",
- " print()\n",
- "\n",
- " def print_ecdsa(self,card, fixed_key = False):\n",
- " self.print_card_name(card)\n",
- " filename = f\"ecdsa_fixed\" if fixed_key else f\"ecdsa\"\n",
- " sigs = self.load_csv_signatures(card,filename)\n",
- " if not sigs:return\n",
- "\n",
- " N = len(sigs)\n",
- " G = self.n3_gen\n",
- " nG = self.gen3\n",
- " counts = {j:{i:0 for i in range(3)} for j in range(3)}\n",
- " others = 0\n",
- " sigs_set = set()\n",
- " for sig in sigs:\n",
- " r, s = sig[\"signature\"]\n",
- " r = r%self.n\n",
- " sigs_set.add((r,s))\n",
- " nonce = int(sig[\"nonce\"],16)\n",
- " nonceG = nonce*G\n",
- " values = {ZZ((nonceG+i*nG)[0])%self.n:i for i in range(3)}\n",
- " if r in values:\n",
- " counts[nonce%3][values[r]]+=1\n",
- " # print(nonce%2,values[r])\n",
- " else:\n",
- " others+=1\n",
- " for kmod,cnts in counts.items():\n",
- " print(f\"For k mod 3 = {kmod}:\")\n",
- " for c,v in cnts.items():\n",
- " print(f\"\\t k+{c}*n\",v)\n",
- " print(\"others\",others)\n",
- " print(\"number of diff sigs\",len(sigs_set))\n",
- " print()\n",
- "\n",
- "\n",
- "\n",
- " def print_keygen(self,card):\n",
- " self.print_card_name(card)\n",
- " counts = {j:{i:0 for i in range(3)} for j in range(3)}\n",
- " keys = self.load_csv_keygens(card,\"keygen\")\n",
- " if not keys:return\n",
- "\n",
- " others = 0\n",
- " for line in keys:\n",
- " pubW = line[\"point\"]\n",
- " pubWx,pubWy = pubW[2:][:len(pubW)//2-1],pubW[2:][len(pubW)//2-1:]\n",
- " pubWx,pubWy,k = map(lambda x: int(x,16),[pubWx,pubWy,line[\"key\"]])\n",
- " scalars = {k+i*self.n:i for i in range(3)}\n",
- " P = self.curve(pubWx,pubWy)\n",
- " for scalar,s in scalars.items():\n",
- " PP = scalar*self.n3_gen\n",
- " if PP==P:\n",
- " counts[scalar%3][s]+=1\n",
- " break\n",
- " else:\n",
- " others+=1\n",
- " N = len(keys)\n",
- " for kmod,cnts in counts.items():\n",
- " print(f\"For k mod 3 = {kmod}:\")\n",
- " for c,v in cnts.items():\n",
- " print(f\"\\t k+{c}*n\",v)\n",
- " print(\"others\",others)\n",
- " print()\n",
- "\n",
- "\n",
- "class Testinverse(CounterTest):\n",
- "\n",
- " def __init__(self,curve,point,key,l):\n",
- " self.l = l\n",
- " self.test = \"testinverse\"\n",
- " with open(curve) as f:\n",
- " p,a,b,x,y,n,_ = map(lambda x: int(x,16),f.read().split(\",\"))\n",
- " self.n = n\n",
- " self.curve = EllipticCurve(GF(p),[a,b])\n",
- " self.gen = self.curve(x,y)\n",
- " self.public = self.gen\n",
- " \n",
- " with open(key) as f:\n",
- " self.k = int(f.read(),16)\n",
- "\n",
- " \n",
- " def print_ecdh(self,card):\n",
- " self.print_card_name(card)\n",
- " secrets_lines = self.load_csv_ecdhs(card,f\"ecdh_{self.l}\")\n",
- " if not secrets_lines:return\n",
- "\n",
- " N = len(secrets_lines)\n",
- " secrets = [int(line[\"secret\"],16) for line in secrets_lines]\n",
- " print(\"Number of secrets as a set: \", len(set(secrets)),\"\\n\") \n",
- " P = self.public\n",
- " correct = 0\n",
- " for line in secrets_lines:\n",
- " secret,privS = map(lambda x: int(x,16),[line[\"secret\"],line[\"key\"]])\n",
- " S = privS*P\n",
- " if sha(S[0])==secret:\n",
- " correct+=1\n",
- " print(f\"Correct secrets: {correct}\\n\") \n",
- " \n",
- " \n",
- " def print_ecdsa(self,card, fixed_key=False):\n",
- " self.print_card_name(card)\n",
- " filename = f\"ecdsa_fixed_{self.l}\" if fixed_key else f\"ecdsa_{self.l}\"\n",
- " sigs_lines = self.load_csv_signatures(card,filename)\n",
- " if not sigs_lines:return\n",
- "\n",
- " valid_sigs = [line for line in sigs_lines if line[\"valid\"]==\"1\"]\n",
- " print(\"num of valid sigs (out of 1000)\",len(valid_sigs), f\"{100*float(len(valid_sigs)/1000)}%\")\n",
- " print(f\"expected: {1-float(1/11)} (one inverse) or {1-float(1-(10/11)**2)} (two inverses) or {1-float(1-(10/11)**3)} (three inverses)\")\n",
- " sigs_set = set(line[\"signature\"] for line in valid_sigs)\n",
- " print(f\"num of diff sigs {len(sigs_set)}\\n\")\n",
- " \n",
- "\n",
- " def print_keygen(self,card):\n",
- " self.print_card_name(card)\n",
- " key_lines = self.load_csv_keygens(card,f\"keygen_{self.l}\")\n",
- " if not key_lines:return\n",
- "\n",
- " correct = 0\n",
- " for line in key_lines:\n",
- " privS = int(line[\"key\"],16)\n",
- " P = privS*self.gen\n",
- " correct += (P==self.public) \n",
- " print(\"num of runs (out of 1000)\",correct, f\"{100*correct/1000}%\")\n",
- " print() \n",
- "\n",
- "\n",
- "class Testk10(CounterTest):\n",
- "\n",
- " def __init__(self, curve, point, key):\n",
- " self.test = \"testk10\"\n",
- " with open(curve) as f:\n",
- " p,a,b,x,y,n,_ = map(lambda x: int(x,16),f.read().split(\",\"))\n",
- " self.n = n\n",
- " self.curve = EllipticCurve(GF(p),[a,b])\n",
- " self.gen = self.curve(x,y)\n",
- " with open(point) as f:\n",
- " px,py = map(lambda x: int(x,16),f.read().split(\",\"))\n",
- " self.public = self.curve(px,py)\n",
- " \n",
- " with open(key) as f:\n",
- " self.k = int(f.read(),16)\n",
- "\n",
- " S = self.k*self.public\n",
- " self.correct_result = sha(S[0])\n",
- " \n",
- "\n",
- "\n",
- " def print_testk10_stats(self, card):\n",
- " self.print_card_name(card)\n",
- " secrets_lines = self.load_csv_ecdhs(card,\"ecdh\")\n",
- " if not secrets_lines:return\n",
- " if len(lines)<1000:\n",
- " print(f\"fail after {len(lines)} ecdhs\")\n",
- " return\n",
- " correct = 0\n",
- " for line in secrets_lines:\n",
- " if self.correct_result==int(line[\"secret\"],16):\n",
- " correct+=1\n",
- " print(f\"Correct secrets: {correct}\\n\") \n",
- "\n",
- "\n",
- "\n",
- "import cypari2\n",
- "from tqdm import tqdm\n",
- "\n",
- "\n",
- "def divisors(primes, powers):\n",
- " for comb in itertools.product(*[range(power+1) for power in powers]):\n",
- " value = 1\n",
- " for prime, power in zip(primes, comb):\n",
- " value *= prime**power\n",
- " yield value\n",
- "\n",
- "def pari_factor(number):\n",
- " pari = cypari2.Pari(256_000_000, 2_000_000_000)\n",
- " factors = pari.factor(number)\n",
- " primes = list(map(int, factors[0]))\n",
- " powers = list(map(int, factors[1]))\n",
- " return primes, powers\n",
- "\n",
- "def pari_dlog(a,b,p, P, G, real_n, facts_str):\n",
- " pari = cypari2.Pari(256_000_000, 2_000_000_000)\n",
- " e = pari.ellinit([a,b],p)\n",
- " e[15][0] = real_n\n",
- " facts = pari(facts_str)\n",
- " dlog = pari.elllog(e, P, G, facts)\n",
- " return int(dlog)\n",
- "\n",
- "\n",
- "\n",
- "class GSRmask(CounterTest):\n",
- "\n",
- " def __init__(self, curve, realn, point, key):\n",
- " self.test = \"testdn\"\n",
- " with open(curve) as f:\n",
- " p,a,b,x,y,n,_ =map(lambda x: int(x,16),f.read().split(\",\"))\n",
- " with open(realn) as f:\n",
- " real_n = int(f.read(),16)\n",
- " with open(point) as f:\n",
- " px,py = map(lambda x: int(x,16),f.read().split(\",\"))\n",
- " self.n = n\n",
- " self.real_n = real_n\n",
- " self.curve = EllipticCurve(GF(p),[a,b])\n",
- " self.gen = self.curve(x,y)\n",
- " self.public = self.curve(px,py)\n",
- "\n",
- " self.pari_real_n_facts = repr(pari.factor(real_n))\n",
- " self.a = a\n",
- " self.b = b\n",
- " self.p = p\n",
- "\n",
- " \n",
- "\n",
- " def compute_mask(self,scalar,point_candidates,G):\n",
- " ds = []\n",
- " for P in point_candidates:\n",
- " d = pari_dlog(self.a,self.b,self.p, [int(P[0]),int(P[1])], [int(G[0]),int(G[1])], self.real_n, self.pari_real_n_facts)\n",
- " ds.append(d)\n",
- " for dp in [d,self.real_n-d]:\n",
- " dp = ZZ(dp)\n",
- " scalar = ZZ(scalar)\n",
- " if ((dp-scalar)%self.real_n)%(self.n-self.real_n)==0:\n",
- " mask = ZZ(((dp-scalar)%self.real_n)/(self.n-self.real_n))\n",
- " print(f\"Mask has {mask.nbits()} bits ({mask}), {scalar}, {dp}\")\n",
- " return\n",
- " \n",
- " # return ds\n",
- " print(\"No mask found\")\n",
- " \n",
- " \n",
- " def recover_ecdsa(self,card, N = 3):\n",
- " self.print_card_name(card)\n",
- " sig_lines = self.load_csv_signatures(card,\"ecdsa\")\n",
- " params = []\n",
- " for line in sig_lines[:N]:\n",
- " nonce = int(line[\"nonce\"],16)\n",
- " # print(nonce)\n",
- " r, s = line[\"signature\"]\n",
- " r = r%self.n\n",
- " candidates = []\n",
- " rss = []\n",
- " while r<self.p:\n",
- " R = self.curve.lift_x(self.curve.base_field()(r))\n",
- " candidates.append(R)\n",
- " rss.append(r)\n",
- " r+=self.n\n",
- " ds = self.compute_mask(nonce,candidates,self.gen)\n",
- " params.append((nonce,rss,ds))\n",
- " # return params\n",
- " print()\n",
- " \n",
- "\n",
- "\n",
- " def recover_keygen(self,card, N=3):\n",
- " self.print_card_name(card)\n",
- " keygen_lines = self.load_csv_keygens(card,\"keygen\")\n",
- " for line in keygen_lines[:N]:\n",
- " pubW,privS = line[\"point\"],line[\"key\"]\n",
- " pubWx,pubWy = pubW[2:][:len(pubW)//2-1],pubW[2:][len(pubW)//2-1:]\n",
- " pubWx,pubWy,privS = map(lambda x: int(x,16),[pubWx,pubWy,privS])\n",
- " \n",
- " P = self.curve(pubWx,pubWy)\n",
- " self.compute_mask(privS,[P],self.gen)\n",
- " print()\n",
- "\n",
- "\n",
- " def recover_ecdh_plain(self,card, N = 3):\n",
- " self.print_card_name(card)\n",
- " secret_lines = self.load_csv_ecdhs(card,\"ecdh_randomkey\")\n",
- " for line in secret_lines[:N]:\n",
- " privS,secret = line[\"key\"],line[\"secret\"]\n",
- " secret,privS = map(lambda x: int(x,16),[secret,privS])\n",
- " R = self.curve.lift_x(self.curve.base_field()(secret))\n",
- " self.compute_mask(privS,[R],self.public) \n",
- " print()\n",
- "\n",
- "\n",
- " def recover_ecdh_plain_good_gen(self,card, N=3):\n",
- " self.print_card_name(card)\n",
- " secret_lines = self.load_csv_ecdhs(card,\"ecdh_plain_good_gen\")\n",
- "\n",
- " for line in secret_lines[:N]:\n",
- " privS,secret = line[\"key\"],line[\"secret\"]\n",
- " secret,privS = map(lambda x: int(x,16),[secret,privS])\n",
- " \n",
- " R = self.curve.lift_x(self.curve.base_field()(secret))\n",
- " self.compute_mask(privS,[R],self.public) \n",
- " print()\n",
- "\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "aaebbefb-7667-4734-a5a5-811e4366a0dc",
- "metadata": {},
- "outputs": [],
- "source": [
- "cards = ['A1','F1','F2','G1','I1','I2','N1','N10','N2','N3','N4','N5','N6','N7','N8','N9','S1','S2']\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "1187d472-fed0-4ce7-83da-5b46a05b239a",
- "metadata": {},
- "outputs": [],
- "source": [
- "test3n = Test3n(\"tests/test3n/curve_prime_gen.csv\",\"tests/test3n/curve.csv\" ,\"tests/test3n/point_3n.csv\",\"tests/test3n/key.csv\")\n",
- "\n",
- "for card in cards:\n",
- " test3n.print_ecdh(card)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "443a3ffe-1df6-41ed-a9e5-8556a94fb25d",
- "metadata": {},
- "outputs": [],
- "source": [
- "for card in cards:\n",
- " test3n.print_ecdsa(card)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "c6a8b58c-367c-4126-9954-80f3a15a5cbf",
- "metadata": {},
- "outputs": [],
- "source": [
- "for card in cards:\n",
- " test3n.print_ecdsa(card, fixed_key = True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "66dc9934-ebaf-4d47-be18-8cf896545138",
- "metadata": {},
- "outputs": [],
- "source": [
- "for card in cards:\n",
- " test3n.print_keygen(card)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "a1a02fac-a2b4-41fd-9de0-5eac60d2f864",
- "metadata": {},
- "source": [
- "### Test inverse"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "7f4bc9c9-5c08-4618-a005-81bedc32a700",
- "metadata": {},
- "outputs": [],
- "source": [
- "testinverse = Testinverse(\"tests/testinverse/cofactor256p11_full.csv\",\"tests/testinverse/point_11n.csv\",\"tests/test3n/key.csv\",11)\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "c3aa5c3e-4134-4c83-83d6-7a4decd18f42",
- "metadata": {},
- "outputs": [],
- "source": [
- "for card in cards:\n",
- " testinverse.print_ecdh(card)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "94487cd2-74c8-48e6-ac68-77fbb2d148ba",
- "metadata": {},
- "outputs": [],
- "source": [
- "for card in cards:\n",
- " testinverse.print_ecdsa(card)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "7bd61560-6c8b-43a8-a293-6669aa84e7cc",
- "metadata": {},
- "outputs": [],
- "source": [
- "for card in cards:\n",
- " testinverse.print_ecdsa(card, fixed_key = True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "81907fe7-e793-49ad-b700-533ad456cc4c",
- "metadata": {},
- "outputs": [],
- "source": [
- "for card in cards:\n",
- " testinverse.print_keygen(card)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "741ae1f0-b943-4421-b936-30ae8ddaa1be",
- "metadata": {},
- "source": [
- "### Recover GSR mask"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "eb2b8923-5977-4d73-b127-b2773bdde91e",
- "metadata": {},
- "outputs": [],
- "source": [
- "gsrmask = GSRmask(\"tests/testdn/weakcurve_32_n_1.csv\",\"tests/testdn/realn.csv\", \"tests/testdn/weakcurve_32_n_1_point.csv\",\"tests/testdn/key.csv\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "ec3ad6c0-2f94-449e-ac34-c1850c590370",
- "metadata": {},
- "outputs": [],
- "source": [
- "for card in cards:\n",
- " params = gsrmask.recover_keygen(card,N=1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "21c2ec76-f125-4929-b787-dc18a12cae9c",
- "metadata": {},
- "outputs": [],
- "source": [
- "for card in cards:\n",
- " params = gsrmask.recover_ecdsa(card,N=1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "a1cffa63-d637-47f3-91f4-0261800bcfec",
- "metadata": {},
- "outputs": [],
- "source": [
- "for card in cards:\n",
- " params = gsrmask.recover_ecdh_plain(card,N=1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "adba1ff5-4235-4084-b1dd-ab206903bb24",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "SageMath 9.5",
- "language": "sage",
- "name": "sagemath"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.10.12"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/analysis/countermeasures/countermeasures/test_eval.py b/analysis/countermeasures/countermeasures/test_eval.py
new file mode 100644
index 0000000..774318f
--- /dev/null
+++ b/analysis/countermeasures/countermeasures/test_eval.py
@@ -0,0 +1,530 @@
+import io
+import math
+import random
+import itertools
+import warnings
+
+import cypari2
+from cysignals.alarm import alarm, AlarmInterrupt
+
+from matplotlib import pyplot as plt
+from collections import Counter
+from tqdm.auto import tqdm, trange
+
+from pyecsca.misc.cfg import TemporaryConfig
+from pyecsca.misc.utils import TaskExecutor
+from pyecsca.ec.mod import mod, RandomModAction
+from pyecsca.ec.point import Point
+from pyecsca.ec.model import ShortWeierstrassModel
+from pyecsca.ec.params import load_params_ectester, get_params
+from pyecsca.ec.mult import LTRMultiplier, RTLMultiplier, ScalarMultiplicationAction
+from pyecsca.ec.context import local, DefaultContext
+from pyecsca.ec.countermeasures import GroupScalarRandomization, AdditiveSplitting, MultiplicativeSplitting, EuclideanSplitting, BrumleyTuveri
+from utils import *
+import cypari2
+pari = cypari2.Pari(256_000_000, 2_000_000_000)
+
+
+
+
+class CounterTest:
+
+
+ def __init__(self):
+ model = ShortWeierstrassModel()
+ self.coords = model.coordinates["projective"]
+
+ add = self.coords.formulas["add-2007-bl"]
+ dbl = self.coords.formulas["dbl-2007-bl"]
+ ltr = LTRMultiplier(add, dbl, complete=False)
+ self.multiplier = ltr
+
+
+ def load_all_results(self,card,tag):
+ lines = []
+ filepath = f"results/{card}/{self.test}"
+ if os.path.exists(filepath):
+ for file in os.listdir(filepath):
+ if tag in file:
+ with open(os.path.join(filepath,file)) as f:
+ lines.extend(f.readlines()[1:])
+
+ if len(lines)==0:
+ raise Exception("Not measured or something went wrong\n")
+ return [line.strip().split(";") for line in lines]
+
+ def load_csv_signatures(self,card,tag):
+ lines = self.load_all_results(card,tag)
+ sigs = []
+ for line in lines:
+ success,error,sig,valid,_,nonce_hex,key_hex,_,curve_csv,_,_,_ = line
+ try:
+ sigs.append({"success":success, "signature":parse_ecdsa_signature(bytes.fromhex(sig)), "nonce": int(nonce_hex,16), "key":int(key_hex,16), "valid":valid, "curve":curve_csv})
+ except ValueError:
+ sigs.append({})
+ return sigs
+
+ def load_csv_ecdhs(self,card,tag):
+ lines = self.load_all_results(card,tag)
+ ecdhs = []
+ for line in lines:
+ success,error,secret,key,_,curve_csv,_,_,_ = line
+ try:
+ ecdhs.append({"success":success, "secret":int(secret,16), "key":int(key,16), "curve":curve_csv})
+ except ValueError:
+ ecdhs.append({})
+ return ecdhs
+
+ def load_csv_keygens(self,card,tag):
+ lines = self.load_all_results(card,tag)
+ keygens = []
+ for line in lines:
+ success,error,key,point,curve_csv,_,_,_ = line
+ try:
+ keygens.append({"success":success, "key":int(key,16), "point":parse_04point(point), "curve":curve_csv})
+ except ValueError:
+ keygens.append({})
+ return keygens
+
+ def existing_measurements(self,cards, tag):
+ print(f"Avaliable measurements for {tag} on:")
+ filtered = []
+ for card in cards:
+ try:
+ assert self.load_all_results(card,tag)
+ filtered.append(card)
+ except:
+ continue
+ print(", ".join(filtered))
+ print()
+
+
+
+
+
+class Test3n(CounterTest):
+
+
+ def __init__(self,curve_path,point_path):
+
+ super().__init__()
+ self.test = "test3n"
+ self.params = load_params_ectester(curve_path, "projective")
+ self.point = csv_to_point(point_path, self.params, self.coords)
+ self.cofactor = 3
+ self.n = self.params.order
+
+ self.multiplier.init(self.params,self.point)
+ self.cofactor_point = self.multiplier.multiply(int(self.n))
+
+
+ def find_mod(self, scalar, compare):
+ kP = self.multiplier.multiply(scalar)
+ for i in range(self.cofactor):
+ if compare(kP):
+ return i
+ kP = self.multiplier._add(kP,self.cofactor_point)
+ return -1
+
+ def print_statistics(self,remainders):
+ for krem, rems in remainders.items():
+ print(f"k = {krem} mod {self.cofactor}, total = {sum(rems)}")
+ for i,count in enumerate(rems[:-1]):
+ print(f"k+{i}*n: {count}")
+ if rems[-1]:
+ print(f"remaining!: {rems[-1]}")
+ print()
+
+
+
+ def print_ecdh(self,card, tag="ecdh"):
+
+ self.multiplier.init(self.params,self.point)
+ remainders = {i:[0]*(self.cofactor+1) for i in range(self.cofactor)}
+ for ecdh_result in self.load_csv_ecdhs(card,tag):
+ key, secret = ecdh_result["key"],ecdh_result["secret"]
+ compare = lambda point: sha(point.to_affine().x)==secret
+ remainders[key%self.cofactor][self.find_mod(key,compare)]+=1
+ self.print_statistics(remainders)
+
+
+
+ def print_ecdsa(self,card,tag = "ecdsa"):
+
+ self.multiplier.init(self.params,self.params.generator)
+ remainders = {i:[0]*(self.cofactor+1) for i in range(self.cofactor)}
+ for signature in self.load_csv_signatures(card,tag):
+ r,s = signature["signature"]
+ nonce = signature["nonce"]
+ compare = lambda point: int(point.to_affine().x)%self.n==r%self.n
+ remainders[key%self.cofactor][self.find_mod(nonce,compare)]+=1
+ self.print_statistics(remainders)
+
+
+ def print_keygen(self,card,tag = "keygen"):
+
+ self.multiplier.init(self.params,self.params.generator)
+ remainders = {i:[0]*(self.cofactor+1) for i in range(self.cofactor)}
+ for keygen in self.load_csv_keygens(card,tag):
+ xy, key = keygen["point"], keygen["key"]
+ genpoint = tuple_to_point(xy,self.params,self.coords)
+ compare = lambda point: point.to_affine()==genpoint.to_affine()
+ remainders[key%self.cofactor][self.find_mod(key,compare)]+=1
+ self.print_statistics(remainders)
+
+
+
+class Testinverse(CounterTest):
+
+ def __init__(self,curve_path,point_path,cofactor):
+
+
+ super().__init__()
+ self.test = "testinverse"
+ self.params = load_params_ectester(curve_path, "projective")
+ self.point = csv_to_point(point_path, self.params, self.coords)
+ self.cofactor = cofactor
+ self.n = self.params.order
+
+ def print_statistics(self,total,correct):
+ print(f"Total: {total}")
+ print(f"Correct: {correct}")
+ print()
+
+ def print_ecdh(self,card, tag = None):
+ if not tag: tag = f"ecdh_{self.cofactor}"
+ self.multiplier.init(self.params,self.point)
+ total,correct = 0,0
+ for ecdh_result in self.load_csv_ecdhs(card,tag):
+ total+=1
+ try:
+ secret,key = ecdh_result["secret"], ecdh_result["key"]
+ kP = self.multiplier.multiply(key).to_affine()
+ correct += (sha(kP.x)==secret)
+ except KeyError:
+ continue
+ self.print_statistics(total,correct)
+
+
+
+ def print_ecdsa(self,card, tag = None):
+ if not tag: tag = f"ecdsa_{self.cofactor}"
+ sigs = self.load_csv_signatures(card,tag)
+ total,correct = 0,0
+ for sig in sigs:
+ total+=1
+ try:
+ correct += sig["valid"]=="1"
+ except KeyError:
+ continue
+ self.print_statistics(total,correct)
+
+
+ def print_keygen(self,card, tag = None):
+ if not tag: tag = f"keygen_{self.cofactor}"
+ self.multiplier.init(self.params,self.params.generator)
+ total,correct = 0,0
+ for keygen in self.load_csv_keygens(card,f"keygen_{self.cofactor}"):
+ total+=1
+ try:
+ xy, key = keygen["point"], keygen["key"]
+ genpoint = tuple_to_point(xy,self.params,self.coords).to_affine()
+ kP = self.multiplier.multiply(key).to_affine()
+ correct += (kP==genpoint)
+ except KeyError:
+ continue
+ self.print_statistics(total,correct)
+
+
+
+
+
+class Testk10(CounterTest):
+
+ def __init__(self, curve_path, point_path, k):
+ super().__init__()
+ self.k = 10
+ self.test = "testk10"
+ self.params = load_params_ectester(curve_path, "projective")
+ self.point = csv_to_point(point_path, self.params, self.coords)
+ self.n = self.params.order
+
+ self.multiplier.init(self.params,self.point)
+ kP = self.multiplier.multiply(k).to_affine()
+ self.correct_secret = sha(kP.x)
+
+ def print_statistics(self,total,correct):
+ print(f"Total computed: {total}")
+ print(f"Correct: {correct}")
+ print()
+
+ def print_ecdh(self, card, tag = "ecdh"):
+
+ total, correct = 0,0
+ for ecdh_result in self.load_csv_ecdhs(card, tag):
+ total+=1
+ if self.correct_secret==ecdh_result["secret"]:
+ correct+=1
+ self.print_statistics(total,correct)
+
+
+
+
+def divisors(primes, powers):
+ for comb in itertools.product(*[range(power+1) for power in powers]):
+ value = 1
+ for prime, power in zip(primes, comb):
+ value *= prime**power
+ yield value
+
+def pari_factor(number):
+ pari = cypari2.Pari(256_000_000, 2_000_000_000)
+ factors = pari.factor(number)
+ primes = list(map(int, factors[0]))
+ powers = list(map(int, factors[1]))
+ return primes, powers
+
+def pari_dlog(e, P, G, real_n, facts_str):
+ e[15][0] = real_n
+ facts = pari(facts_str)
+ dlog = pari.elllog(e, P, G, facts)
+ return int(dlog)
+
+
+
+class TestEpsilon_GSR(CounterTest):
+
+ def __init__(self, curve_path, point_path, realn_path):
+
+ super().__init__()
+ self.test = "testdn"
+
+ self.params = load_params_ectester(curve_path, "projective")
+ self.point = csv_to_point(point_path, self.params, self.coords)
+ self.n = self.params.order
+
+ with open(realn_path) as f:
+ self.real_n = int(f.read(),16)
+ self.epsilon = self.n-self.real_n
+
+ self.a = int(self.params.curve.parameters["a"])
+ self.b = int(self.params.curve.parameters["b"])
+ self.p = int(self.params.curve.prime)
+ self.x = int(self.params.generator.X)
+ self.y = int(self.params.generator.Y)
+ self.pari_real_n_facts = repr(pari.factor(self.real_n))
+ self.pari_curve = pari.ellinit([self.a,self.b],self.p)
+
+
+
+
+ def compute_mask(self,scalar,point_candidates,G):
+ for P in point_candidates:
+ d = pari_dlog(self.pari_curve, [int(P.x),int(P.y)], [int(G.X),int(G.Y)], self.real_n, self.pari_real_n_facts)
+ for dp in [d,self.real_n-d]:
+ scalar = int(scalar)
+ if (dp-scalar)%self.epsilon==0:
+ mask = int((dp-scalar)//self.epsilon)
+ return mask
+ raise Exception("No mask found")
+
+ def is_correct_curve(self,result):
+ p,a,b,x,y,n,h = map(lambda x: int(x,16), result["curve"].split(","))
+ return (p,a,b,x,y,n) == (self.p,self.a,self.b,self.x,self.y,self.n)
+
+ def print_statistics(self,masks):
+ for mask in masks:
+ print(f"Mask size: {mask.bit_length()}, mask value: {mask}")
+ print()
+
+ def lift_x(self,x):
+ return self.params.curve.affine_lift_x(mod(x,self.p)).pop()
+
+
+ def test_masks(self,masks,scalars,point,results,compare):
+
+ for mask,result,scalar in zip(masks,results,scalars):
+ masked_key = int(scalar+mask*self.params.order)
+ self.multiplier.init(self.params,point,bits= masked_key.bit_length())
+ kP = self.multiplier.multiply(masked_key).to_affine()
+ assert compare(result,kP)
+
+
+ def recover_ecdh_plain(self,card, tag = "ecdh", N = 5):
+ filtered_results = [res for res in self.load_csv_ecdhs(card,tag) if self.is_correct_curve(res)]
+ masks,results,keys = [],[],[]
+ for ecdh_result in filtered_results[:N]:
+ key, secret = ecdh_result["key"],ecdh_result["secret"]
+ R = self.lift_x(secret)
+ masks.append(self.compute_mask(key,[R],self.point))
+ results.append(R)
+ keys.append(key)
+
+ compare = lambda p,q: p.x==q.x
+ self.test_masks(masks,keys,self.point,results,compare)
+ self.print_statistics(masks)
+
+
+ def recover_ecdsa(self,card, tag = "ecdsa", N = 5):
+
+ filtered_results = [res for res in self.load_csv_signatures(card,tag) if self.is_correct_curve(res)]
+ masks,results,nonces = [],[],[]
+ for line in filtered_results[:N]:
+ nonce = line["nonce"]
+ r, s = line["signature"]
+ r = r%self.n
+ candidates = [self.lift_x(r)]+[self.lift_x(r+i*self.n) for i in range(1,(self.p-r)//self.n)]
+ mask = self.compute_mask(nonce,candidates,self.params.generator)
+ masks.append(mask)
+ nonces.append(nonce)
+ results.append(r)
+
+ compare = lambda r,q: r%self.n==int(q.x)%self.n
+ self.test_masks(masks,nonces,self.params.generator,results,compare)
+ self.print_statistics(masks)
+
+
+
+ def recover_keygen(self,card,tag="keygen", N=5):
+ filtered_results = [res for res in self.load_csv_keygens(card,tag) if self.is_correct_curve(res)]
+ masks,results,keys = [],[],[]
+ for keygen_result in filtered_results[:N]:
+ key, xy = keygen_result["key"],keygen_result["point"]
+ R = tuple_to_point(xy,self.params,self.coords).to_affine()
+ masks.append(self.compute_mask(key,[R],self.params.generator))
+ keys.append(key)
+ results.append(R)
+ compare = lambda p,q: p==q
+ self.test_masks(masks,keys,self.params.generator,results,compare)
+ self.print_statistics(masks)
+
+
+
+class TestEpsilon_Multiplicative(CounterTest):
+
+ def __init__(self, curve_path, point_path, realn_path):
+
+ super().__init__()
+ self.test = "testdn"
+
+ self.params = load_params_ectester(curve_path, "projective")
+ self.point = csv_to_point(point_path, self.params, self.coords)
+ self.n = self.params.order
+
+ with open(realn_path) as f:
+ self.real_n = int(f.read(),16)
+ self.epsilon = self.n-self.real_n
+
+ self.a = int(self.params.curve.parameters["a"])
+ self.b = int(self.params.curve.parameters["b"])
+ self.p = int(self.params.curve.prime)
+ self.x = int(self.params.generator.X)
+ self.y = int(self.params.generator.Y)
+ self.pari_real_n_facts = repr(pari.factor(self.real_n))
+ self.pari_curve = pari.ellinit([self.a,self.b],self.p)
+
+ #
+ self.candidates = None
+
+
+ def compute_t(self,scalar,point_candidates,G):
+ for P in point_candidates:
+ d = pari_dlog(self.pari_curve, [int(P.x),int(P.y)], [int(G.X),int(G.Y)], self.real_n, self.pari_real_n_facts)
+ for dp in [d,self.real_n-d]:
+ scalar = int(scalar)
+ if (dp-scalar)%self.epsilon==0:
+ mask = int((dp-scalar)//self.epsilon)
+ return mask
+ raise Exception("No mask found")
+
+ def is_correct_curve(self,result):
+ p,a,b,x,y,n,h = map(lambda x: int(x,16), result["curve"].split(","))
+ return (p,a,b,x,y,n) == (self.p,self.a,self.b,self.x,self.y,self.n)
+
+ def print_statistics(self,masks):
+ for mask in masks:
+ print(f"Mask size: {mask.bit_length()}, mask value: {mask}")
+ print()
+
+ def compute_candidates(self,lower_bound, upper_bound):
+ all_divisors = [list(divisors(*pari_factor(k+t*self.n))) for t,k in self.ts]
+ filtered = []
+ for divs in all_divisors:
+ filtered.append([d for d in divs if lower_bound<=d.bit_length()<=upper_bound])
+ print(f"Found {len(filtered[-1])} candidates")
+ self.candidates = filtered
+
+ def plot_divisor_histogram(self,candidates):
+ candidate_bits = [c.bit_length() for c in candidates]
+ max_amount = max(candidate_amounts)
+ fig = plt.subplots()
+ plt.hist(candidate_amounts, range=(1, max_amount), align="left", density=True, bins=range(1, max_amount))
+ plt.xlabel("number of candidate masks")
+ plt.ylabel("proportion")
+ plt.xticks(range(max_amount))
+ plt.xlim(0, 20);
+ plt.show()
+
+ def lift_x(self,x):
+ return self.params.curve.affine_lift_x(mod(x,self.p)).pop()
+
+
+ def test_ts(self,ts,scalars,point,results,compare):
+
+ for t,result,scalar in zip(ts,results,scalars):
+ masked_key = int(scalar+t*self.params.order)
+ self.multiplier.init(self.params,point,bits= masked_key.bit_length())
+ kP = self.multiplier.multiply(masked_key).to_affine()
+ assert compare(result,kP)
+
+
+ def recover_ecdh_plain_size(self,card, tag = "ecdh", N = 5):
+ filtered_results = [res for res in self.load_csv_ecdhs(card,tag) if self.is_correct_curve(res)]
+ ts,results,keys = [],[],[]
+ for ecdh_result in filtered_results[:N]:
+ key, secret = ecdh_result["key"],ecdh_result["secret"]
+ R = self.lift_x(secret)
+ ts.append(self.compute_t(key,[R],self.point))
+ results.append(R)
+ keys.append(key)
+
+ compare = lambda p,q: p.x==q.x
+ self.test_ts(ts,keys,self.point,results,compare)
+ self.ts = zip(ts,keys)
+ print(set(t.bit_length() for t in ts))
+
+
+ def recover_ecdsa_size(self,card, tag = "ecdsa", N = 5):
+
+ filtered_results = [res for res in self.load_csv_signatures(card,tag) if self.is_correct_curve(res)]
+ ts,results,nonces = [],[],[]
+ for line in filtered_results[:N]:
+ nonce = line["nonce"]
+ r, s = line["signature"]
+ r = r%self.n
+ candidates = [self.lift_x(r)]+[self.lift_x(r+i*self.n) for i in range(1,(self.p-r)//self.n)]
+ print(nonce,self.p,r,self.n,candidates)
+ t = self.compute_t(nonce,candidates,self.params.generator)
+ ts.append(t)
+ nonces.append(nonce)
+ results.append(r)
+
+ compare = lambda r,q: r%self.n==int(q.x)%self.n
+ self.test_ts(ts,nonces,self.params.generator,results,compare)
+ self.ts = zip(ts,nonces)
+ print(set(t.bit_length() for t in ts))
+
+
+ def recover_keygen_size(self,card,tag="keygen", N=5):
+ filtered_results = [res for res in self.load_csv_keygens(card,tag) if self.is_correct_curve(res)]
+ ts,results,keys = [],[],[]
+ for keygen_result in filtered_results[:N]:
+ key, xy = keygen_result["key"],keygen_result["point"]
+ R = tuple_to_point(xy,self.params,self.coords).to_affine()
+ masks.append(self.compute_t(key,[R],self.params.generator))
+ ts.append(key)
+ results.append(R)
+ compare = lambda p,q: p==q
+ self.test_ts(ts,keys,self.params.generator,results,compare)
+ self.ts = zip(ts,keys)
+ print(set(t.bit_length() for t in ts))
diff --git a/analysis/countermeasures/countermeasures/utils.py b/analysis/countermeasures/countermeasures/utils.py
index 0f9f441..a937c88 100644
--- a/analysis/countermeasures/countermeasures/utils.py
+++ b/analysis/countermeasures/countermeasures/utils.py
@@ -1,9 +1,13 @@
from pyecsca.ec.mult import DoubleAndAddMultiplier
-from pyecsca.ec.signature import ECDSA_SHA1,SignatureResult
+from pyecsca.ec.signature import ECDSA_SHA1, SignatureResult
from pyecsca.ec.model import ShortWeierstrassModel
from pyecsca.ec.mod import Mod, mod
from pyecsca.ec.error import NonInvertibleError
import os
+from hashlib import sha1
+from pyasn1.codec.der.decoder import decode
+from pyasn1.type.univ import Sequence
+from pyecsca.ec.point import Point
def get_point_bytes(path):
with open(path, "r") as f:
@@ -14,32 +18,57 @@ def get_point_bytes(path):
point = bytes([0x04]) + bx + by
return point
+def tuple_to_point(tuple_int, params, coords):
+ x,y = tuple_int
+ return Point(X=mod(x, params.curve.prime),Y=mod(y, params.curve.prime),Z=mod(1, params.curve.prime), model=coords)
+
+
+def csv_to_point(path, params, coords):
+ with open(path,"r") as f:
+ line = f.read()
+ x, y = line.split(",")
+ xy = int(x,16),int(y,16)
+ return tuple_to_point(xy, params,coords)
+
+def parse_04point(string):
+ assert string.startswith("04")
+ x,y = map(lambda x: int(x,16),[string[2:][:len(string)//2-1],string[2:][len(string)//2-1:]])
+ return x,y
def read_curve_params(path):
with open(path) as f:
return f.read().strip()
-def serialize_ecdh_response(ecdhresponse,curve,point,key):
+
+def serialize_ecdh_response(ecdhresponse, curve, point, key):
error = str(int(ecdhresponse.error))
- params = ",".join(map(lambda x: x.hex(),ecdhresponse.params))
+ params = ",".join(map(lambda x: x.hex(), ecdhresponse.params))
apdu = ecdhresponse.resp.data.hex()
secret = ecdhresponse.secret.hex()
success = str(int(ecdhresponse.success))
- sws = ",".join(map(str,ecdhresponse.sws))
+ sws = ",".join(map(str, ecdhresponse.sws))
point = point.hex()
key = hex(key)
- return ";".join([success,error,secret,key,point,curve,params,apdu,sws])
+ return ";".join([success, error, secret, key, point, curve, params, apdu, sws])
+
-def recover_nonce(params,data,key,point_bytes,signature_result):
+def recover_nonce(params, data, key, point_bytes, signature_result):
point = params.curve.decode_point(point_bytes)
model = ShortWeierstrassModel().coordinates["projective"]
- sig = ECDSA_SHA1(DoubleAndAddMultiplier(model.formulas["add-2007-bl"],model.formulas["dbl-2007-bl"]),params.to_coords(model),pubkey=point.to_model(model, params.curve.to_coords(model)),privkey=key)
+ sig = ECDSA_SHA1(
+ DoubleAndAddMultiplier(
+ model.formulas["add-2007-bl"], model.formulas["dbl-2007-bl"]
+ ),
+ params.to_coords(model),
+ pubkey=point.to_model(model, params.curve.to_coords(model)),
+ privkey=key,
+ )
digest = sig.hash_algo(data).digest()
z = int.from_bytes(digest, byteorder="big")
if len(digest) * 8 > sig.params.order.bit_length():
z >>= len(digest) * 8 - sig.params.order.bit_length()
- r,s = signature_result.r, signature_result.s
- s = mod(int(s),sig.params.order)
+ r, s = signature_result.r, signature_result.s
+ s = mod(int(s), sig.params.order)
r = mod(int(r), sig.params.order)
try:
nonce = s.inverse() * (mod(z, sig.params.order) + r * sig.privkey)
@@ -48,62 +77,98 @@ def recover_nonce(params,data,key,point_bytes,signature_result):
sig.mult.init(sig.params, sig.params.generator)
point = sig.mult.multiply(int(nonce))
affine_point = point.to_affine()
- #assert r == mod(int(affine_point.x), sig.params.order)
+ # assert r == mod(int(affine_point.x), sig.params.order)
return nonce
-def serialize_ecdsa_response(response,data,domainparams,key,curve_csv,point_bytes,valid = None):
+def serialize_ecdsa_response(
+ response, data, domainparams, key, curve_csv, point_bytes, valid=None
+):
error = str(int(response.error))
- params = ",".join(map(lambda x: x.hex(),response.params))
+ params = ",".join(map(lambda x: x.hex(), response.params))
apdu = response.resp.data.hex()
signature = response.signature.hex()
success = str(int(response.success))
- sws = ",".join(map(str,response.sws))
+ sws = ",".join(map(str, response.sws))
point_bytes_hex = point_bytes.hex()
key_hex = hex(key)
data_hex = data.hex()
- nonce = recover_nonce(domainparams,data,key,point_bytes,SignatureResult.from_DER(response.signature))
+ nonce = recover_nonce(
+ domainparams,
+ data,
+ key,
+ point_bytes,
+ SignatureResult.from_DER(response.signature),
+ )
nonce_hex = hex(int(nonce))
valid_str = "" if valid is None else str(valid)
- return ";".join([success,error,signature,valid_str,data_hex,nonce_hex,key_hex,point_bytes_hex,curve_csv,params,apdu,sws])
+ return ";".join(
+ [
+ success,
+ error,
+ signature,
+ valid_str,
+ data_hex,
+ nonce_hex,
+ key_hex,
+ point_bytes_hex,
+ curve_csv,
+ params,
+ apdu,
+ sws,
+ ]
+ )
-def serialize_keygen_response(response,key,curve_csv,point_bytes):
+
+def serialize_keygen_response(response, key, curve_csv, point_bytes):
error = str(int(response.error))
- params = ",".join(map(lambda x: x.hex(),response.params))
+ params = ",".join(map(lambda x: x.hex(), response.params))
apdu = response.resp.data.hex()
success = str(int(response.success))
- sws = ",".join(map(str,response.sws))
+ sws = ",".join(map(str, response.sws))
point_bytes_hex = point_bytes.hex()
key_hex = hex(key)
- return ";".join([success,error,key_hex,point_bytes_hex,curve_csv,params,apdu,sws])
+ return ";".join(
+ [success, error, key_hex, point_bytes_hex, curve_csv, params, apdu, sws]
+ )
-def save_ecdh(card,test):
- header = "success;error;secret[SHA1];priv;pub;curve;params;apdu;sws"
- filename = f"results/{card}/{test}/ecdh.csv"
+def safe_save(header, result_lines, filename):
if os.path.isfile(filename):
- print("Measurement already exists")
- with open(filename,"w") as f:
+ print(f"Measurement already exists ({filename})")
+ return
+ tmp = filename + ".tmp"
+ with open(tmp, "w") as f:
f.write(f"{header}\n")
for line in result_lines:
f.write(f"{line}\n")
+ os.rename(tmp, filename)
+
+
+def save_ecdh(result_lines, filename):
+ header = "success;error;secret[SHA1];priv;pub;curve;params;apdu;sws"
+ safe_save(header, result_lines, filename)
+
-def save_ecdsa(card,test):
+def save_ecdsa(result_lines, filename):
header = "success;error;signature;valid;data;nonce;priv;pub;curve;params;apdu;sws"
- filename = f"results/{card}/{test}/ecdsa.csv"
- if os.path.isfile(filename):
- print("Measurement already exists")
- with open(filename,"w") as f:
- f.write(f"{header}\n")
- for line in result_lines:
- f.write(f"{line}\n")
+ safe_save(header, result_lines, filename)
+
-def save_keygen(card,test):
+def save_keygen(result_lines, filename):
header = "success;error;priv;pub;curve;params;apdu;sws"
- filename = f"results/{card}/{test}/keygen.csv"
- if os.path.isfile(filename):
- print("Measurement already exists")
- with open(filename,"w") as f:
- f.write(f"{header}\n")
- for line in result_lines:
- f.write(f"{line}\n")
+ safe_save(header, result_lines, filename)
+
+
+def parse_ecdsa_signature(signature_der):
+ decoded_signature, _ = decode(signature_der, asn1Spec=Sequence())
+ r = int(decoded_signature[0])
+ s = int(decoded_signature[1])
+ return r, s
+
+def sha(value):
+ h = hex(int(value))[2:]
+ if len(h)%2!=0:
+ h = "0"+h
+ bh = bytes.fromhex(h)
+ return int(sha1(bh).digest().hex(),16)