diff options
| author | vojtechsu | 2025-07-03 10:23:05 +0200 |
|---|---|---|
| committer | vojtechsu | 2025-07-03 10:23:05 +0200 |
| commit | a43808f0bf4fe61de2f65aef83c4ff36a56281ea (patch) | |
| tree | 021aee4b3b881d14500802a5965cfed2c302d881 /analysis | |
| parent | cc668f36bf47d48fc6829e1f7ea0164264d60485 (diff) | |
| download | ECTester-a43808f0bf4fe61de2f65aef83c4ff36a56281ea.tar.gz ECTester-a43808f0bf4fe61de2f65aef83c4ff36a56281ea.tar.zst ECTester-a43808f0bf4fe61de2f65aef83c4ff36a56281ea.zip | |
Diffstat (limited to 'analysis')
| -rw-r--r-- | analysis/countermeasures/countermeasures/measure.ipynb | 719 |
1 files changed, 417 insertions, 302 deletions
diff --git a/analysis/countermeasures/countermeasures/measure.ipynb b/analysis/countermeasures/countermeasures/measure.ipynb index 439b054..8647d23 100644 --- a/analysis/countermeasures/countermeasures/measure.ipynb +++ b/analysis/countermeasures/countermeasures/measure.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "fde96d6a-0281-4ba2-ae2f-447cb6a625f0", + "id": "41f6e89a", "metadata": {}, "source": [ "# Countermeasure tests" @@ -11,7 +11,7 @@ { "cell_type": "code", "execution_count": null, - "id": "eab24cb8-af40-4cc1-be5f-f120fe9932ee", + "id": "1e1e1320", "metadata": {}, "outputs": [], "source": [ @@ -29,7 +29,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4958e925-4764-4665-941d-fab0b00bd5bb", + "id": "668d391e", "metadata": {}, "outputs": [], "source": [ @@ -67,7 +67,7 @@ "metadata": {}, "outputs": [], "source": [ - "CARD = \"I1\"" + "CARD = \"N9\"" ] }, { @@ -85,12 +85,14 @@ " \"3bf81800ff8131fe454a434f507632343143\": \"N1\",\n", " \"3bf81300008131fe454a434f5076323431b7\": \"N2N9\",\n", " \"3b9495810146545601c4\": \"N4N10\",\n", - " \"3bd518ff8191fe1fc38073c821100a\": \"N6\",\n", + " \"3bd518ff8191fe1fc38073c821100a\": \"N6N11\",\n", " \"3b9c9580811f039067464a01005404f272fe00c0\": \"F1\",\n", - " \"3b90958011fe6a\": \"F2\",\n", + " \"3b90958011fe6a\": \"F2F3\",\n", " \"3b9f95803fc7a08031e073fa21106300000083f09000bb\": \"S1S2\",\n", " \"3bf91300008131fe454a434f503234325233a2\":\"N8\",\n", - " \"3bf99600008131fe4553434537200e00202028\":\"G1\"\n", + " \"3bf99600008131fe4553434537200e00202028\":\"G1\",\n", + " \"3b959540ffae01030000\":\"E2\",\n", + " \"3bfe1800008031fe4553434536302d43443038312d6e46a9\": \"G2\"\n", "}\n", "print(f\"{card_map[atr]} connected, {CARD} selected\")\n", "assert CARD in card_map[atr]\n" @@ -98,24 +100,129 @@ }, { "cell_type": "markdown", - "id": "2eb7fdb7-9444-48ec-bcde-dbf68b14b1ad", + "id": "ce6f80b6-d1d3-4bcd-9dfd-720d26e7113f", + "metadata": {}, + "source": [ + "### Tests\n", + "\n", + "[Basic ECDH](#Basic-ECDH)\n", + "\n", + "[Test cofactor ECDH](#Test-cofactor-ECDH)\n", + "\n", + "[Test3n ECDH](#Test3n-ECDH)\n", + "\n", + "[Test3n ECDSA](#Test3n-ECDSA)\n", + "\n", + "[Test3n Keygen](#Test3n-Keygen)\n", + "\n", + "[Test composite ECDH](#Test-composite-ECDH)\n", + "\n", + "[Test composite ECDSA](#Test-composite-ECDSA)\n", + "\n", + "[Test composite Keygen](#Test-composite-Keygen)\n", + "\n", + "[Test k=10 ECDH](#Test-k=10-ECDH)\n", + "\n", + "[Test n+epsilon ECDH](#Test-n+epsilon-ECDH)\n", + "\n", + "[Test n+epsilon ECDSA](#Test-n+epsilon-ECDSA)\n", + "\n", + "[Test n+epsilon Keygen](#Test-n+epsilon-Keygen)\n", + "\n", + "[Test small subgroup attack on verify](#Test-small-subgroup-attack-on-verify)" + ] + }, + { + "cell_type": "markdown", + "id": "75ff1c08", "metadata": {}, "source": [ - "## Test cofactor" + "### Basic ECDH" ] }, { "cell_type": "code", "execution_count": null, - "id": "d52d4b8d-c203-4324-88d3-6409927d52b2", + "id": "a567d2a5", "metadata": {}, "outputs": [], "source": [ - "params = load_params_ectester(\"tests/testcofactor/cofactor256p4_h.csv\", \"affine\")\n", - "params_csv = read_curve_params(\"tests/testcofactor/cofactor256p4_h.csv\")\n", - "point = get_point_bytes(\"tests/testcofactor/point_4n.csv\")\n", - "with open(\"tests/testcofactor/key.csv\") as f:\n", - " key = int(f.read(),16)" + "params = load_params_ectester(\"tests/testk10/secp256r1.csv\", \"affine\")\n", + "params_csv = read_curve_params(\"tests/testk10/secp256r1.csv\")\n", + "point = get_point_bytes(\"tests/testk10/secgpoint.csv\")\n", + "key = 0x57b4a526c3308537f38cfc7ac4fc6b8eba67c5a16b3cfcde6ba82b484c9f77aa" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8749a079", + "metadata": {}, + "outputs": [], + "source": [ + "target.allocate(KeypairEnum.KEYPAIR_LOCAL,\n", + " KeyBuildEnum.BUILD_KEYBUILDER | KeyBuildEnum.BUILD_KEYPAIR,\n", + " 256,\n", + " KeyClassEnum.ALG_EC_FP)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "531459bb", + "metadata": {}, + "outputs": [], + "source": [ + "target.allocate_ka(KeyAgreementEnum.ALG_EC_SVDP_DH)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ea90961", + "metadata": {}, + "outputs": [], + "source": [ + "target.set(KeypairEnum.KEYPAIR_LOCAL,\n", + " CurveEnum.external,\n", + " ParameterEnum.DOMAIN_FP,\n", + " ECTesterTargetPCSC.encode_parameters(ParameterEnum.DOMAIN_FP, params))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "950d75ca", + "metadata": {}, + "outputs": [], + "source": [ + "target.set(KeypairEnum.KEYPAIR_LOCAL,\n", + " CurveEnum.external,\n", + " ParameterEnum.S,\n", + " ECTesterTargetPCSC.encode_parameters(ParameterEnum.S, key))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f91465cd", + "metadata": {}, + "outputs": [], + "source": [ + "result = target.ecdh_direct(KeypairEnum.KEYPAIR_LOCAL,\n", + " True,\n", + " TransformationEnum.NONE,\n", + " KeyAgreementEnum.ALG_EC_SVDP_DH,\n", + " point)\n", + "print(result)" + ] + }, + { + "cell_type": "markdown", + "id": "2eb7fdb7-9444-48ec-bcde-dbf68b14b1ad", + "metadata": {}, + "source": [ + "### Test cofactor ECDH" ] }, { @@ -192,7 +299,7 @@ " True,\n", " TransformationEnum.NONE,\n", " KeyAgreementEnum.ALG_EC_SVDP_DH_PLAIN,\n", - " point) # pubkey as bytes\n", + " point) \n", "if not result.success:\n", " print(result)\n", "result_lines = [serialize_ecdh_response(result,params_csv,point,key)]" @@ -201,28 +308,11 @@ { "cell_type": "code", "execution_count": null, - "id": "7c65a25f-3743-4504-a1d5-85897b46c6eb", - "metadata": {}, - "outputs": [], - "source": [ - "result.resp" - ] - }, - { - "cell_type": "code", - "execution_count": null, "id": "d496aaf3-11e3-4b21-a988-b1d28651540f", "metadata": {}, "outputs": [], "source": [ - "header = \"success;error;secret[SHA1];priv;pub;curve;params;apdu;sws\"\n", - "filename = f\"results/{CARD}/testcofactor/ecdh_plain2.csv\"\n", - "if os.path.isfile(filename):\n", - " print(\"Measurement already exists\")\n", - "with open(filename,\"w\") as f:\n", - " f.write(f\"{header}\\n\")\n", - " for line in result_lines:\n", - " f.write(f\"{line}\\n\")" + "save_ecdh(result_lines,f\"results/{CARD}/testcofactor/ecdh_plain.csv\")" ] }, { @@ -230,7 +320,7 @@ "id": "a84108a4-73d0-4eb5-a72f-424763f22474", "metadata": {}, "source": [ - "### Test3n - ECDH" + "### Test3n ECDH" ] }, { @@ -320,7 +410,7 @@ " True,\n", " TransformationEnum.NONE,\n", " KeyAgreementEnum.ALG_EC_SVDP_DH,\n", - " point) # pubkey as bytes\n", + " point) \n", " if not result.success:\n", " print(result)\n", " result_lines.append(serialize_ecdh_response(result,params_csv,point,key))" @@ -329,29 +419,11 @@ { "cell_type": "code", "execution_count": null, - "id": "32f12f37-51d5-4325-ab1b-aea2635b4efc", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "16a3567c-f2d9-40a4-bfae-d04d65a5feef", - "metadata": {}, - "outputs": [], - "source": [ - "target.cleanup()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a16af658-34d5-455e-a609-3075ede7dad7", + "id": "df5ec00b-7683-4886-8ca1-7c30d6620e04", "metadata": {}, "outputs": [], "source": [ - "target.disconnect()" + "save_ecdh(result_lines,f\"results/{CARD}/test3n/ecdh.csv\")" ] }, { @@ -359,17 +431,7 @@ "id": "3c30db78-bfba-4e7b-bec7-dca29480c3f5", "metadata": {}, "source": [ - "### Test3n - ECDSA" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "59619b5b-5ddf-41be-9d7d-5691ab8954af", - "metadata": {}, - "outputs": [], - "source": [ - "target.connect()" + "### Test3n ECDSA" ] }, { @@ -394,8 +456,8 @@ "metadata": {}, "outputs": [], "source": [ - "samples = 10\n", - "fixed_key = False\n", + "samples = 100\n", + "fixed_key = True\n", "data = bytes.fromhex(\"e8c86c9596e46403c211206617b8bcdd160a673b0b1304869f5559e3afe99d79\")" ] }, @@ -466,32 +528,16 @@ "outputs": [], "source": [ "result_lines = []\n", - "error = False\n", "for _ in range(samples):\n", " sign_response = target.ecdsa_sign(KeypairEnum.KEYPAIR_LOCAL,True,SignatureEnum.ALG_ECDSA_SHA,data)\n", - " if error or not sign_response.success:\n", + " if not sign_response.success:\n", " print(f\"sign: {sign_response.sws}\",end=\", \")\n", - " error = True\n", " signature = sign_response.signature\n", " verify_response = target.ecdsa_verify(KeypairEnum.KEYPAIR_LOCAL,SignatureEnum.ALG_ECDSA_SHA,signature,data)\n", - " if error or not verify_response.success:\n", + " if not verify_response.success:\n", " print(f\"verify: {verify_response.sws}\",end=\", \")\n", - " error = True\n", - " # verify_response = target.ecdsa(KeypairEnum.KEYPAIR_LOCAL,True,SignatureEnum.ALG_ECDSA_SHA,data)\n", - " try:\n", - " result_lines.append(serialize_ecdsa_response(sign_response,data,params,key,params_csv,point_bytes, verify_response.success))\n", - " except:\n", - " continue" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a3407a67-3ab1-43d0-8989-f24ae22d1f78", - "metadata": {}, - "outputs": [], - "source": [ - "result_lines" + " result_lines.append(serialize_ecdsa_response(sign_response,data,params,key,params_csv,point_bytes, verify_response.success))\n", + " " ] }, { @@ -501,32 +547,10 @@ "metadata": {}, "outputs": [], "source": [ - "filename = f\"results/{CARD}/test3n/ecdsa.csv\" if not fixed_key else f\"results/{CARD}/test3n/ecdsa_fixed.csv\"\n", - "if os.path.isfile(filename):\n", - " print(\"Measurement already exists\")\n", - "with open(filename,\"w\") as f:\n", - " for line in result_lines:\n", - " f.write(f\"{line}\\n\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "eb3dccf4-d692-4e63-b3de-ca38aa4a1cdc", - "metadata": {}, - "outputs": [], - "source": [ - "target.cleanup()\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6514dcd5-9484-4928-80b3-d419de975409", - "metadata": {}, - "outputs": [], - "source": [ - "target.disconnect()" + "if fixed_key:\n", + " save_ecdsa(result_lines,f\"results/{CARD}/test3n/ecdsa_fixed.csv\")\n", + "else:\n", + " save_ecdsa(result_lines,f\"results/{CARD}/test3n/ecdsa.csv\")" ] }, { @@ -534,7 +558,7 @@ "id": "0b73b805-5d36-4908-8ba9-e5c3023831c0", "metadata": {}, "source": [ - "### Test3n - Keygen" + "### Test3n Keygen" ] }, { @@ -555,7 +579,7 @@ "metadata": {}, "outputs": [], "source": [ - "samples = 1000" + "samples = 100" ] }, { @@ -594,32 +618,17 @@ "result_lines = []\n", "for _ in range(samples):\n", " generate_response = target.generate(KeypairEnum.KEYPAIR_LOCAL)\n", - " error = False\n", " if not generate_response.success:\n", " print(f\"generate: {generate_response.sws}\",end=\", \")\n", - " error = True\n", " export = target.export(KeypairEnum.KEYPAIR_LOCAL, KeyEnum.BOTH,ParameterEnum.KEYPAIR)\n", " if not export.success:\n", " print(f\"export: {export.sws}\",end=\", \")\n", - " error = True\n", - " \n", - " try:\n", - " key = int(export.params[1].hex(),16)\n", - " point = params.curve.decode_point(export.params[0])\n", - " point_bytes = export.params[0]\n", - " result_lines.append(serialize_keygen_response(generate_response,key,params_csv,point_bytes))\n", - " except:\n", - " continue" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8e35fbd8-d331-4650-8ef0-b6f9d76b6361", - "metadata": {}, - "outputs": [], - "source": [ - "result_lines" + " continue\n", + " key = int(export.params[1].hex(),16)\n", + " point = params.curve.decode_point(export.params[0])\n", + " point_bytes = export.params[0]\n", + " result_lines.append(serialize_keygen_response(generate_response,key,params_csv,point_bytes))\n", + " " ] }, { @@ -629,24 +638,7 @@ "metadata": {}, "outputs": [], "source": [ - "header = \"success;error;priv;pub;curve;params;apdu;sws\"\n", - "filename = f\"results/{CARD}/test3n/keygen.csv\"\n", - "if os.path.isfile(filename):\n", - " print(\"Measurement already exists\")\n", - "with open(filename,\"w\") as f:\n", - " f.write(f\"{header}\\n\")\n", - " for line in result_lines:\n", - " f.write(f\"{line}\\n\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7ca57c7d-3cf9-44b6-9060-33ff67db6d47", - "metadata": {}, - "outputs": [], - "source": [ - "target.disconnect()" + "save_keygen(result_lines,f\"results/{CARD}/test3n/keygen.csv\")" ] }, { @@ -654,7 +646,7 @@ "id": "c147a398-a66b-464f-9a4d-0b4978c46307", "metadata": {}, "source": [ - "### Testinverse - ECDH" + "### Test composite ECDH" ] }, { @@ -684,6 +676,19 @@ { "cell_type": "code", "execution_count": null, + "id": "e2af6efc", + "metadata": {}, + "outputs": [], + "source": [ + "target.allocate(KeypairEnum.KEYPAIR_LOCAL,\n", + " KeyBuildEnum.BUILD_KEYBUILDER | KeyBuildEnum.BUILD_KEYPAIR,\n", + " 256,\n", + " KeyClassEnum.ALG_EC_FP)" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "a9aba5f9-045f-404e-b144-cbac0f73888a", "metadata": {}, "outputs": [], @@ -731,7 +736,7 @@ " True,\n", " TransformationEnum.NONE,\n", " KeyAgreementEnum.ALG_EC_SVDP_DH,\n", - " point_bytes) # pubkey as bytes\n", + " point_bytes) \n", " if not result.success:\n", " print(result)\n", " result_lines.append(serialize_ecdh_response(result,params_csv,point_bytes,key))" @@ -744,32 +749,7 @@ "metadata": {}, "outputs": [], "source": [ - "filename = f\"results/{CARD}/testinverse/ecdh.csv\"\n", - "if os.path.isfile(filename):\n", - " print(\"Measurement already exists\")\n", - "with open(filename,\"w\") as f:\n", - " for line in result_lines:\n", - " f.write(f\"{line}\\n\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "72052224-dfd6-42b4-ba95-1dc04a919aa4", - "metadata": {}, - "outputs": [], - "source": [ - "target.cleanup()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8c74e904-3ca1-4cab-af00-60f851f3045e", - "metadata": {}, - "outputs": [], - "source": [ - "target.disconnect()" + "save_ecdh(result_lines,f\"results/{CARD}/testinverse/ecdh.csv\")" ] }, { @@ -777,17 +757,7 @@ "id": "519acbea-ded4-471c-8f4a-1664fc276455", "metadata": {}, "source": [ - "### Testinverse - ECDSA" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "70932e65-8246-4f1e-8e45-79faa46e579c", - "metadata": {}, - "outputs": [], - "source": [ - "target.connect()" + "### Test composite ECDSA" ] }, { @@ -821,6 +791,19 @@ { "cell_type": "code", "execution_count": null, + "id": "9f4b63d6", + "metadata": {}, + "outputs": [], + "source": [ + "target.allocate(KeypairEnum.KEYPAIR_LOCAL,\n", + " KeyBuildEnum.BUILD_KEYBUILDER | KeyBuildEnum.BUILD_KEYPAIR,\n", + " 256,\n", + " KeyClassEnum.ALG_EC_FP)" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "7c38ca2a-417e-450d-8093-a9f2c757f26b", "metadata": {}, "outputs": [], @@ -872,13 +855,15 @@ "outputs": [], "source": [ "result_lines = []\n", - "\n", "for _ in range(samples):\n", - " sign_response = target.ecdsa(KeypairEnum.KEYPAIR_LOCAL,True,SignatureEnum.ALG_ECDSA_SHA,data)\n", + " sign_response = target.ecdsa_sign(KeypairEnum.KEYPAIR_LOCAL,True,SignatureEnum.ALG_ECDSA_SHA,data)\n", " if not sign_response.success:\n", - " print(sign_response)\n", - " # verify_response = target.ecdsa(KeypairEnum.KEYPAIR_LOCAL,True,SignatureEnum.ALG_ECDSA_SHA,data)\n", - " result_lines.append(serialize_ecdsa_response(sign_response,data,params,key,params_csv,point_bytes))" + " print(f\"sign: {sign_response.sws}\",end=\", \")\n", + " signature = sign_response.signature\n", + " verify_response = target.ecdsa_verify(KeypairEnum.KEYPAIR_LOCAL,SignatureEnum.ALG_ECDSA_SHA,signature,data)\n", + " if not verify_response.success:\n", + " print(f\"verify: {verify_response.sws}\",end=\", \")\n", + " result_lines.append(serialize_ecdsa_response(sign_response,data,params,key,params_csv,point_bytes, verify_response.success))\n" ] }, { @@ -888,32 +873,10 @@ "metadata": {}, "outputs": [], "source": [ - "filename = f\"results/{CARD}/testinverse/ecdsa.csv\" if not fixed_key else f\"results/{CARD}/testinverse/ecdsa_fixedkey.csv\"\n", - "if os.path.isfile(filename):\n", - " print(\"Measurement already exists\")\n", - "with open(filename,\"w\") as f:\n", - " for line in result_lines:\n", - " f.write(f\"{line}\\n\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "06564085-bcb0-4108-80f2-f14d51062967", - "metadata": {}, - "outputs": [], - "source": [ - "target.cleanup()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ae49a097-4622-4056-ba0b-d3fcfd8e4a72", - "metadata": {}, - "outputs": [], - "source": [ - "target.disconnect()" + "if fixed_key:\n", + " save_ecdsa(result_lines,f\"results/{CARD}/testinverse/ecdsa_fixed.csv\")\n", + "else:\n", + " save_ecdsa(result_lines,f\"results/{CARD}/testinverse/ecdsa.csv\")" ] }, { @@ -921,7 +884,7 @@ "id": "853c5302-2a4f-4798-8d06-e030dc686c38", "metadata": {}, "source": [ - "### Test3n - Keygen" + "### Test composite Keygen" ] }, { @@ -931,9 +894,8 @@ "metadata": {}, "outputs": [], "source": [ - "divisor = 11\n", - "params = load_params_ectester(f\"tests/testinverse/cofactor256p{divisor}_full.csv\", \"affine\")\n", - "params_csv = read_curve_params(f\"tests/testinverse/cofactor256p{divisor}_full.csv\")" + "params = load_params_ectester(\"tests/testinverse/cofactor256p11_full.csv\", \"affine\")\n", + "params_csv = read_curve_params(\"tests/testinverse/cofactor256p11_full.csv\"" ] }, { @@ -953,7 +915,10 @@ "metadata": {}, "outputs": [], "source": [ - "target.allocate_ka(KeypairEnum.KEYPAIR_LOCAL)" + "target.allocate(KeypairEnum.KEYPAIR_LOCAL,\n", + " KeyBuildEnum.BUILD_KEYBUILDER | KeyBuildEnum.BUILD_KEYPAIR,\n", + " 256,\n", + " KeyClassEnum.ALG_EC_FP)" ] }, { @@ -980,10 +945,11 @@ "for _ in range(samples):\n", " generate_response = target.generate(KeypairEnum.KEYPAIR_LOCAL)\n", " if not generate_response.success:\n", - " print(generate_response)\n", + " print(f\"generate: {generate_response.sws}\",end=\", \")\n", " export = target.export(KeypairEnum.KEYPAIR_LOCAL, KeyEnum.BOTH,ParameterEnum.KEYPAIR)\n", " if not export.success:\n", - " print(export)\n", + " print(f\"export: {export.sws}\",end=\", \")\n", + " continue\n", " key = int(export.params[1].hex(),16)\n", " point = params.curve.decode_point(export.params[0])\n", " point_bytes = export.params[0]\n", @@ -997,22 +963,7 @@ "metadata": {}, "outputs": [], "source": [ - "filename = f\"results/{CARD}/testinverse/keygen_{divisor}.csv\"\n", - "if os.path.isfile(filename):\n", - " print(\"Measurement already exists\")\n", - "with open(filename,\"w\") as f:\n", - " for line in result_lines:\n", - " f.write(f\"{line}\\n\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "76307bc8-6b02-450e-81ce-505d9a18f009", - "metadata": {}, - "outputs": [], - "source": [ - "target.disconnect()" + "save_keygen(result_lines,f\"results/{CARD}/testinverse/keygen.csv\")" ] }, { @@ -1020,7 +971,7 @@ "id": "55b6a278-ab84-4c97-a9f1-b379699cbff5", "metadata": {}, "source": [ - "### Test10 - ECDH" + "### Test k=10 ECDH" ] }, { @@ -1050,6 +1001,19 @@ { "cell_type": "code", "execution_count": null, + "id": "42a8dae9", + "metadata": {}, + "outputs": [], + "source": [ + "target.allocate(KeypairEnum.KEYPAIR_LOCAL,\n", + " KeyBuildEnum.BUILD_KEYBUILDER | KeyBuildEnum.BUILD_KEYPAIR,\n", + " 256,\n", + " KeyClassEnum.ALG_EC_FP)" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "2a646481-71c0-4c65-b4ba-62957ae72a3f", "metadata": {}, "outputs": [], @@ -1097,7 +1061,7 @@ " True,\n", " TransformationEnum.NONE,\n", " KeyAgreementEnum.ALG_EC_SVDP_DH,\n", - " point_bytes) # pubkey as bytes\n", + " point_bytes)\n", " if not result.success:\n", " print(result)\n", " result_lines.append(serialize_ecdh_response(result,params_csv,point_bytes,key))" @@ -1110,42 +1074,118 @@ "metadata": {}, "outputs": [], "source": [ - "filename = f\"results/{CARD}/testk10/ecdh.csv\"\n", - "if os.path.isfile(filename):\n", - " print(\"Measurement already exists\")\n", - "with open(filename,\"w\") as f:\n", - " for line in result_lines:\n", - " f.write(f\"{line}\\n\")" + "save_ecdh(result_lines,f\"results/{CARD}/testk10/ecdh.csv\")" + ] + }, + { + "cell_type": "markdown", + "id": "71daf414", + "metadata": {}, + "source": [ + "### Test n+epsilon ECDH" ] }, { "cell_type": "code", "execution_count": null, - "id": "01a546eb-936b-433f-a87e-749c6db8e76b", + "id": "000e3355", "metadata": {}, "outputs": [], "source": [ - "result.params" + "params = load_params_ectester(\"tests/testdn/weakcurve_32_n_good_gen.csv\", \"affine\")\n", + "params_csv = read_curve_params(\"tests/testdn/weakcurve_32_n_good_gen.csv\")\n", + "point = get_point_bytes(\"tests/testdn/weakcurve_32_n_1_point.csv\")\n", + "with open(\"tests/testdn/key.csv\") as f:\n", + " key = int(f.read(),16)" ] }, { "cell_type": "code", "execution_count": null, - "id": "ed81d29d-7e6c-40de-b2bd-25df588314bb", + "id": "2cda23aa", "metadata": {}, "outputs": [], "source": [ - "target.cleanup()\n" + "samples = 100" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23f039a0", + "metadata": {}, + "outputs": [], + "source": [ + "target.allocate(KeypairEnum.KEYPAIR_LOCAL,\n", + " KeyBuildEnum.BUILD_KEYBUILDER | KeyBuildEnum.BUILD_KEYPAIR,\n", + " 256,\n", + " KeyClassEnum.ALG_EC_FP)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47a4be1d", + "metadata": {}, + "outputs": [], + "source": [ + "target.allocate_ka(KeyAgreementEnum.ALG_EC_SVDP_DH_PLAIN)" ] }, { "cell_type": "code", "execution_count": null, - "id": "9afadc85-672d-44bf-beaf-af68f588d831", + "id": "f1ebadac", "metadata": {}, "outputs": [], "source": [ - "target.disconnect()" + "target.set(KeypairEnum.KEYPAIR_LOCAL,\n", + " CurveEnum.external,\n", + " ParameterEnum.DOMAIN_FP,\n", + " ECTesterTargetPCSC.encode_parameters(ParameterEnum.DOMAIN_FP, params))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd3f56ea", + "metadata": {}, + "outputs": [], + "source": [ + "target.set(KeypairEnum.KEYPAIR_LOCAL,\n", + " CurveEnum.external,\n", + " ParameterEnum.S,\n", + " ECTesterTargetPCSC.encode_parameters(ParameterEnum.S, key))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7975ecd8", + "metadata": {}, + "outputs": [], + "source": [ + "result_lines = []\n", + "\n", + "for i in range(samples):\n", + " result = target.ecdh_direct(KeypairEnum.KEYPAIR_LOCAL,\n", + " True,\n", + " TransformationEnum.NONE,\n", + " KeyAgreementEnum.ALG_EC_SVDP_DH_PLAIN,\n", + " point) \n", + " if not result.success:\n", + " print(result)\n", + " result_lines.append(serialize_ecdh_response(result,params_csv,point,key))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5327dab", + "metadata": {}, + "outputs": [], + "source": [ + " save_ecdh(result_lines,f\"results/{CARD}/testdn/ecdh.csv\")" ] }, { @@ -1153,7 +1193,7 @@ "id": "f26e2d2b-b6b6-4ae1-9474-46bd3c73b1b4", "metadata": {}, "source": [ - "### Test n+epsilon" + "### Test n+epsilon ECDSA" ] }, { @@ -1163,11 +1203,11 @@ "metadata": {}, "outputs": [], "source": [ - "params = load_params_ectester(\"tests/testdn/weakcurve_32_n_x.csv\", \"affine\")\n", - "params_csv = read_curve_params(\"tests/testdn/weakcurve_32_n_x.csv\")\n", + "params = load_params_ectester(\"tests/testdn/weakcurve_32_n_1.csv\", \"affine\")\n", + "params_csv = read_curve_params(\"tests/testdn/weakcurve_32_n_1.csv\")\n", "point_bytes = get_point_bytes(\"tests/testdn/key_point.csv\")\n", "point = params.curve.decode_point(point_bytes)\n", - "\n", + "bits = 256\n", "with open(\"tests/testdn/key.csv\") as f:\n", " key = int(f.read(),16)" ] @@ -1179,8 +1219,9 @@ "metadata": {}, "outputs": [], "source": [ - "samples = 100\n", - "data = bytes.fromhex(\"e8c86c9596e46403c211206617b8bcdd160a673b0b1304869f5559e3afe99d79\")" + "samples = 10\n", + "data = bytes.fromhex(\"e8c86c9596e46403c211206617b8bcdd160a673b0b1304869f5559e3afe99d79\")\n", + "fixed_key = True" ] }, { @@ -1192,7 +1233,7 @@ "source": [ "target.allocate(KeypairEnum.KEYPAIR_LOCAL,\n", " KeyBuildEnum.BUILD_KEYBUILDER | KeyBuildEnum.BUILD_KEYPAIR,\n", - " 256,\n", + " bits,\n", " KeyClassEnum.ALG_EC_FP)" ] }, @@ -1226,12 +1267,30 @@ "metadata": {}, "outputs": [], "source": [ - "keypair_dict = ECTesterTargetPCSC.encode_parameters(ParameterEnum.S, key)\n", - "keypair_dict.update(ECTesterTargetPCSC.encode_parameters(ParameterEnum.W, point))\n", - "print(target.set(KeypairEnum.KEYPAIR_LOCAL,\n", - " CurveEnum.external,\n", - " ParameterEnum.KEYPAIR,\n", - " keypair_dict))" + "if fixed_key:\n", + " keypair_dict = ECTesterTargetPCSC.encode_parameters(ParameterEnum.S, key)\n", + " keypair_dict.update(ECTesterTargetPCSC.encode_parameters(ParameterEnum.W, point))\n", + " print(target.set(KeypairEnum.KEYPAIR_LOCAL,\n", + " CurveEnum.external,\n", + " ParameterEnum.KEYPAIR,\n", + " keypair_dict))\n", + "else:\n", + " print(target.generate(KeypairEnum.KEYPAIR_LOCAL))\n", + " export = target.export(KeypairEnum.KEYPAIR_LOCAL, KeyEnum.BOTH,ParameterEnum.KEYPAIR)\n", + " print(export)\n", + " key = int(export.params[1].hex(),16)\n", + " point = params.curve.decode_point(export.params[0])\n", + " point_bytes = export.params[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "610f636a", + "metadata": {}, + "outputs": [], + "source": [ + "target.ecdsa_sign(KeypairEnum.KEYPAIR_LOCAL,True,SignatureEnum.ALG_ECDSA_SHA,data)" ] }, { @@ -1242,62 +1301,117 @@ "outputs": [], "source": [ "result_lines = []\n", - "error = False\n", "for _ in range(samples):\n", " sign_response = target.ecdsa_sign(KeypairEnum.KEYPAIR_LOCAL,True,SignatureEnum.ALG_ECDSA_SHA,data)\n", - " if error or not sign_response.success:\n", + " if not sign_response.success:\n", " print(f\"sign: {sign_response.sws}\",end=\", \")\n", - " error = True\n", - " signature = sign_response.signature\n", - " try:\n", - " result_lines.append(serialize_ecdsa_response(sign_response,data,params,key,params_csv,point_bytes, None))\n", - " except:\n", - " continue" + " result_lines.append(serialize_ecdsa_response(sign_response,data,params,key,params_csv,point_bytes, None))\n", + " " ] }, { "cell_type": "code", "execution_count": null, - "id": "49076b1e-7627-4d1b-9861-1620fa2ff6b1", + "id": "bd03c4b5-99ac-43ab-ac20-12f7639a5632", "metadata": {}, "outputs": [], "source": [ - "result_lines" + " save_ecdsa(result_lines,f\"results/{CARD}/tesdn/ecdsa.csv\")" + ] + }, + { + "cell_type": "markdown", + "id": "46188f91", + "metadata": {}, + "source": [ + "### Test n+epsilon Keygen" ] }, { "cell_type": "code", "execution_count": null, - "id": "bd03c4b5-99ac-43ab-ac20-12f7639a5632", + "id": "981c3bf7", "metadata": {}, "outputs": [], "source": [ - "filename = f\"results/{CARD}/testdn/ecdsa_xfixed.csv\"\n", - "if os.path.isfile(filename):\n", - " print(\"Measurement already exists\")\n", - "header = \"success;error;signature;valid;data;nonce;priv;pub;curve;params;apdu;sws\"\n", - "with open(filename,\"w\") as f:\n", - " f.write(f\"{header}\\n\")\n", - " for line in result_lines:\n", - " f.write(f\"{line}\\n\")" + "params = load_params_ectester(\"tests/testdn/weakcurve_32_n_1.csv\", \"affine\")\n", + "params_csv = read_curve_params(\"tests/testdn/weakcurve_32_n_1.csv\")" ] }, { - "cell_type": "markdown", - "id": "e5dc1b1b-2015-4e7d-844d-a72be5a8f97d", + "cell_type": "code", + "execution_count": null, + "id": "8193d2e8", "metadata": {}, + "outputs": [], "source": [ - "### Test small subgroup attack on verify" + "samples = 10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53f58db7", + "metadata": {}, + "outputs": [], + "source": [ + "target.allocate(KeypairEnum.KEYPAIR_LOCAL,\n", + " KeyBuildEnum.BUILD_KEYBUILDER | KeyBuildEnum.BUILD_KEYPAIR,\n", + " 256,\n", + " KeyClassEnum.ALG_EC_FP)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a6bd8fc", + "metadata": {}, + "outputs": [], + "source": [ + "target.set(KeypairEnum.KEYPAIR_LOCAL,\n", + " CurveEnum.external,\n", + " ParameterEnum.DOMAIN_FP,\n", + " ECTesterTargetPCSC.encode_parameters(ParameterEnum.DOMAIN_FP, params))" ] }, { "cell_type": "code", "execution_count": null, - "id": "84a55a95-0df4-4036-a9bb-64c36364beaa", + "id": "1baeeffe", "metadata": {}, "outputs": [], "source": [ - "from pyecsca.ec.mod import Mod, RawMod" + "result_lines = []\n", + "for _ in range(samples):\n", + " generate_response = target.generate(KeypairEnum.KEYPAIR_LOCAL)\n", + " if not generate_response.success:\n", + " print(f\"generate: {generate_response.sws}\",end=\", \")\n", + " export = target.export(KeypairEnum.KEYPAIR_LOCAL, KeyEnum.BOTH,ParameterEnum.KEYPAIR)\n", + " if not export.success:\n", + " print(f\"export: {export.sws}\",end=\", \")\n", + " continue\n", + " key = int(export.params[1].hex(),16)\n", + " point = params.curve.decode_point(export.params[0])\n", + " point_bytes = export.params[0]\n", + " result_lines.append(serialize_keygen_response(generate_response,key,params_csv,point_bytes))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1689f405", + "metadata": {}, + "outputs": [], + "source": [ + "save_keygen(result_lines,f\"results/{CARD}/testdn/keygen.csv\")" + ] + }, + { + "cell_type": "markdown", + "id": "e5dc1b1b-2015-4e7d-844d-a72be5a8f97d", + "metadata": {}, + "source": [ + "### Test small subgroup attack on verify" ] }, { @@ -1307,6 +1421,7 @@ "metadata": {}, "outputs": [], "source": [ + "from pyecsca.ec.mod import Mod, RawMod\n", "from pyasn1.codec.der.decoder import decode\n", "from pyasn1.type.univ import Sequence\n", "\n", @@ -1460,9 +1575,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "env", "language": "python", - "name": "python3" + "name": "env" }, "language_info": { "codemirror_mode": { |
