Oblivious RAM (ORAM)

Oblivious RAM (ORAM) was first introduced by GO96. It is a primitive that provides a generic compilation of any random-access memory (RAM) program to one which hides the accesses pattern of the underlying RAM.

Note: Oblivious RAM schemes can provide statistical or unconditional security against adversaries who only know which array indices are accessed. However, in practice one almost always needs to deploy ORAM together with standard symmetric encryption.

Definition

Throughout, we use the following notation. All oblivious RAM schemes are defined with respect to a key space , state space , virtual array size and blocks , and physical array size and blocks . We additionally assume and . Furthermore, we define the sets:

  • These are the allowed operations for the virtual array () and the physical array ().

Syntax

An -round Oblivious RAM (ORAM) is a tuple of efficient functions such that: TODO The above functions describe the processing of the Oblivious RAM query. They are used in the following way to process a query at index , for a physical array :

Correctness

TODO

Security

TODO An ORAM is secure if for all efficient , there exists a negligible function , such that

Variations

TODO: offline ORAM like in BN16

Other results

  • Any Oblivious RAM over an array of elements must incur amortized overhead blow-up. — GO96 and LN18
  • Optimal Oblivious RAM with overhead exists! — AKL+20
  • Any one-round balls-in-bins ORAM must have overhead or storage. — CDH20