aboutsummaryrefslogtreecommitdiff
path: root/analysis
diff options
context:
space:
mode:
authorvojtechsu2025-07-03 10:23:05 +0200
committervojtechsu2025-07-03 10:23:05 +0200
commita43808f0bf4fe61de2f65aef83c4ff36a56281ea (patch)
tree021aee4b3b881d14500802a5965cfed2c302d881 /analysis
parentcc668f36bf47d48fc6829e1f7ea0164264d60485 (diff)
downloadECTester-a43808f0bf4fe61de2f65aef83c4ff36a56281ea.tar.gz
ECTester-a43808f0bf4fe61de2f65aef83c4ff36a56281ea.tar.zst
ECTester-a43808f0bf4fe61de2f65aef83c4ff36a56281ea.zip
Diffstat (limited to 'analysis')
-rw-r--r--analysis/countermeasures/countermeasures/measure.ipynb719
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": {