FIT_hardware_security/lab09_PUF/puf.ipynb

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
}