diff options
Diffstat (limited to 'analysis')
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) |
