Integrated Optical PUFs

pypuf ships a very basic simulation of integrated optical PUFs [RHUWDFJ13].

class pypuf.simulation.IntegratedOpticalPUF(n: int, m: int, seed: int)

Very basic simulation of an integrated optical PUF [RHUWDFJ13]. This simulation is derived from the corresponding successful modeling attack [RHUWDFJ13].

To compute a response to a given challenge \(c\), the simulation evaluates the value of

\[\left| c \cdot A \cdot e^{\phi i} \right|^2,\]

where \(A \in \mathbb{R}^{n \times m}\) and \(\phi \in \mathbb{R}^{n \times m}\); \(n\) is the challenge length, \(m\) the response length.

By default, the values for \(A\) are chosen mutually independent and uniformly random in \([0,1)\); the values for \(\phi\) are chosen mutually independent and uniformly random in \([0, 2\pi)\).

Warning

This simulation only gives a very rough, idealized idea of how integrated optical PUFs may behave. In particular, the pypuf.metrics.uniqueness() may be quite different from the behavior real-world implementations. Also, the behavior of response pixels is mutually independent, which differs from behavior reported in the literature [RHUWDFJ13].

__init__(n: int, m: int, seed: int) None

Initializes a simulation for an Integrated Optical PUF with \(n\) challenge bits, \(m\) response bits, with randomness based on the given seed.

eval(challenges: ndarray) ndarray

Evaluate the PUF on a list of given challenges.

Parameters:

challenges – List of challenges to evaluate on. Challenges must be given as ndarray of shape (\(N\), challenge_length), where \(N\) is the number of challenges to be evaluated. Evaluating many challenges at once may have performance benefits, to evaluate a single challenge, provide an ndarray with shape (1, challenge_length). In cases where challenge_length = 0, an empty array with shape (\(N\), 0) needs to be provided to determine the number of responses requested.

Returns:

ndarray, shape (\(N\), response_length), listing the simulated responses to the challenges in order they were given.