{ "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 }