EE Department, IIT Bombay
March 10, 2025
Cryptographic proofs that a government-issued digital ID contains a birth date of someone who is above a certain age
Applications
Why not use the ID itself as a proof?
Every Aadhaar card contains a QR code that encodes the holder’s personal details including date of birth
It also contains an RSA signature created using UIDAI’s private key
One can generate an age proof using the Aadhaar QR code
An implementation of an Aadhaar-based age proof by Ethereum Foundation
Generates a zero-knowledge (ZK) proof that the Aadhaar QR code contains the birth date of an adult
Proofs can be verified on-chain, i.e. in an Ethereum smart contract
Uses the Groth16 proof system
Main drawback: Resource intensive; needs 600MB/300MB initial download and 1.4 GB/9.6 GB RAM in phone/browser
A zkSNARK for statements with IVC structure
Incremental Computation
An IVC instance is given by \left(F, n, z_0, z_n\right)
An IVC scheme allows a prover to prove that
for some public step F,
public initial input z_0, public final output z_n,
it knows auxiliary input values w_0, w_1,\ldots,w_{n-1} such that
z_n = F \left(\ldots F \left(F \left( z_0, w_0 \right), w_1 \right) \ldots,w_{n-1}\right).
Setting: An adult Aadhaar holder will generate and submit an age proof to an application that has a unique AppID
Desirable properties
Use the Aadhaar QR code itself as the age proof
To verify the age proof, the verifier will
Satisfies all desiderata except privacy
Let \texttt{qr} be an n-byte array representing the QR code data
Let \texttt{qr}_{\text{d}} be the byte array of length n-256 corresponding to \texttt{qr}[0:n-256]
Let \texttt{qr}_{\text{m}} correspond to the bytes in \texttt{qr}_{\text{d}} with the 17 timestamp bytes replaced with zero bytes
Let \texttt{A}_{\text{id}} be the AppID of the target application for the age proof
Let \texttt{H}_{\text{pos}} denote the Poseidon hash function
An adult Aadhaar holder will generate an age proof as \left( \texttt{A}_{\text{id}}, \sigma, \pi \right) where \pi is a ZK proof attesting to the following claims:
The SHA256 hash function already has an incremental structure
The SHA256 hash of a bitstring M \in \{0,1\}^* is calculated as follows.
The RSA exponent e in the Aadhaar public key has the value 65537 = 2^{16}+1
The exponentiation \textsf{sig}^e can be spread over 17 steps where
Since F has to be the same in every step, we can use a multiplexer to choose between the outputs of the squaring operation and product operations
Please see preprint for full specification
URL of Nova Aadhaar preprint