395 lines
9.0 KiB
Plaintext
395 lines
9.0 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {
|
|
"executionInfo": {
|
|
"elapsed": 212,
|
|
"status": "ok",
|
|
"timestamp": 1733157570419,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "qIH9E-egIPJk"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import os\n",
|
|
"import numpy as np\n",
|
|
"\n",
|
|
"if not os.path.exists(\"chip1.bin\"):\n",
|
|
" !wget https://users.fit.cvut.cz/bucekj/SRAM_data.zip\n",
|
|
" !unzip SRAM_data.zip"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {
|
|
"executionInfo": {
|
|
"elapsed": 340,
|
|
"status": "ok",
|
|
"timestamp": 1733157570996,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "c6CaoHF7IVcf"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"MEASUREMENTS = 1000\n",
|
|
"MEM_SIZE = 512*8\n",
|
|
"CHIPS = 10\n",
|
|
"\n",
|
|
"memories = np.array([\n",
|
|
" np.unpackbits(\n",
|
|
" np.fromfile(f\"chip{i+1}.bin\", dtype='uint8')\n",
|
|
" ).reshape(MEASUREMENTS, MEM_SIZE)\n",
|
|
" for i in range(CHIPS)\n",
|
|
"])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"executionInfo": {
|
|
"elapsed": 8,
|
|
"status": "ok",
|
|
"timestamp": 1733157570996,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "IVARKdgpMOgI",
|
|
"outputId": "1eb61f33-4c4d-46a4-aed1-ae467881f4de"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"(10, 1000, 4096)"
|
|
]
|
|
},
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"memories.shape\n",
|
|
"# cip, mereni, bit"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {
|
|
"executionInfo": {
|
|
"elapsed": 7,
|
|
"status": "ok",
|
|
"timestamp": 1733157570996,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "Iba9M10hIZql"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Create reference responses\n",
|
|
"avgs = memories.mean(axis=1, keepdims=True)\n",
|
|
"refs = avgs>0.5 # reference responses"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {
|
|
"executionInfo": {
|
|
"elapsed": 7,
|
|
"status": "ok",
|
|
"timestamp": 1733157570996,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "0elUoltMIbZW"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"xors = refs ^ memories # HDintra\n",
|
|
" # finish HDintra calculation (look at the definition)\n",
|
|
"\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {
|
|
"executionInfo": {
|
|
"elapsed": 7,
|
|
"status": "ok",
|
|
"timestamp": 1733157570996,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "2orRDbEnIdKh"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"idxs = np.triu_indices(CHIPS, 1)\n",
|
|
"pairwise_xors = refs[idxs[0]] ^ refs[idxs[1]]\n",
|
|
"inter = pairwise_xors.mean()\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {
|
|
"executionInfo": {
|
|
"elapsed": 7,
|
|
"status": "ok",
|
|
"timestamp": 1733157570996,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "M4maPUbhIfF2"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Create masks\n",
|
|
"e = 0.05 # error rate into the mask (5%)\n",
|
|
"masks = (avgs > (1-e)) | (avgs < e)\n",
|
|
"masks = masks[:,0,:]\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {
|
|
"executionInfo": {
|
|
"elapsed": 7,
|
|
"status": "ok",
|
|
"timestamp": 1733157570996,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "JQaOfv7Jin6S"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Save masks into file\n",
|
|
"np.savetxt('masks.txt', masks.astype(int), fmt='%d', delimiter='')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {
|
|
"executionInfo": {
|
|
"elapsed": 7,
|
|
"status": "ok",
|
|
"timestamp": 1733157570996,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "qsDh1_3DImCW"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Create masked responses (1024 bits long)\n",
|
|
"mask_idx = np.array([np.nonzero(masks[i])[0][:1024] for i in range(CHIPS)])\n",
|
|
"memories_masked = np.array([memories[i][:,mask_idx[i]] for i in range(CHIPS)])\n",
|
|
"refs_masked = np.array([refs[i][:,mask_idx[i]] for i in range(CHIPS)])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {
|
|
"executionInfo": {
|
|
"elapsed": 7,
|
|
"status": "ok",
|
|
"timestamp": 1733157570996,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "IhsqiP0WIqTe"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Compute HDintra of masked PUF responses\n",
|
|
"masked_xors = refs_masked ^ memories_masked # HDintra\n",
|
|
" # finish HDintra calculation (look at the definition)\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {
|
|
"executionInfo": {
|
|
"elapsed": 7,
|
|
"status": "ok",
|
|
"timestamp": 1733157570996,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "S8omYwr1It2_"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Compute HDinter of masked PUF responses\n",
|
|
"idxs = np.triu_indices(CHIPS, 1)\n",
|
|
"pairwise_xors = refs_masked[idxs[0]] ^ refs_masked[idxs[1]]\n",
|
|
"masked_inter = pairwise_xors.mean()\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"executionInfo": {
|
|
"elapsed": 297,
|
|
"status": "ok",
|
|
"timestamp": 1733157721196,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "jB0oHd-Mjkbx",
|
|
"outputId": "75f811c4-4a3f-420a-8bb0-3a9b54bb94a9"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Vzdalenosti jednotlivych cipu: [0.03431421 0.02955688 0.0316062 0.03096167 0.0320459 0.02866528\n",
|
|
" 0.0269895 0.03107129 0.03059814 0.02904199]\n",
|
|
"\n",
|
|
"HDintra prumerny: 0.030485107421875\n",
|
|
"HDinter: 0.43573133680555554\n",
|
|
"\n",
|
|
"vyhovujicich bitu je 0.8744384765625 %\n",
|
|
"\n",
|
|
"Masked vzdalenosti jednotlivych cipu: [0.00191406 0.0017832 0.00191211 0.00174609 0.00198633 0.00169141\n",
|
|
" 0.0015 0.00189844 0.00163672 0.00171484]\n",
|
|
"\n",
|
|
"Masked HDintra prumerny: 0.0017783203125\n",
|
|
"Masked HDinter: 0.4957682291666667\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Print a summary of results (HDintra, HDinter - for both unmasked and masked PUF responses)\n",
|
|
"print(\"Vzdalenosti jednotlivych cipu:\", xors.mean(axis=1).mean(axis=1))\n",
|
|
"print()\n",
|
|
"\n",
|
|
"print(\"HDintra prumerny:\", xors.mean())\n",
|
|
"print(\"HDinter: \", inter)\n",
|
|
"print()\n",
|
|
"\n",
|
|
"print(\"vyhovujicich bitu je \", masks.mean(), \"%\")\n",
|
|
"print()\n",
|
|
"\n",
|
|
"print(\"Masked vzdalenosti jednotlivych cipu: \", masked_xors.mean(axis=1).mean(axis=1))\n",
|
|
"print()\n",
|
|
"\n",
|
|
"print(\"Masked HDintra prumerny:\", masked_xors.mean())\n",
|
|
"\n",
|
|
"print(\"Masked HDinter: \", masked_inter)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"executionInfo": {
|
|
"elapsed": 2,
|
|
"status": "ok",
|
|
"timestamp": 1733157571185,
|
|
"user": {
|
|
"displayName": "Ondřej Hladůvka",
|
|
"userId": "07082375608847075000"
|
|
},
|
|
"user_tz": -60
|
|
},
|
|
"id": "ZFVMMBQ8PFBc"
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"colab": {
|
|
"provenance": [
|
|
{
|
|
"file_id": "https://gist.github.com/kodytfil/ca2be4dfc2413f2335451994308fb3c5#file-puf_template-ipynb",
|
|
"timestamp": 1733152912568
|
|
}
|
|
]
|
|
},
|
|
"kernelspec": {
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"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.15"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|