BlocSoc logoBlocSoc IITD

Operation Aegis

The Aegis Gateway guards a single number: the master secret SS. Every second, thousands of users knock on its door, and for each one the gateway must prove "I know SS" without ever saying what SS is.

Last week we learned that the gateway's chip was tampered with at the fab. Somewhere in the silicon, a listener is recording wires, every clock cycle, for every request. We can't recall the chip. We can only redesign the circuit that runs on it.

That's your job. Build a prover that stays correct, leaks nothing, and keeps up with the queue on a tight silicon budget.

The mission

For every incoming request IDi\mathrm{ID}_i, your circuit must output a Schnorr proof (Ci, ei, zi)(C_i,\ e_i,\ z_i):

Ci=G ri,ei=H(Ci,IDi),zi=ri+ei S(modq)C_i = G^{\,r_i}, \qquad e_i = H(C_i, \mathrm{ID}_i), \qquad z_i = r_i + e_i\, S \pmod q

where rir_i is a fresh random nonce. Anyone holding the public key Y=GSY = G^{S} can check the proof with Gzi=Ci⋅YeiG^{z_i} = C_i \cdot Y^{e_i}, without learning SS.

The catch: SS lives inside a VAULT that never reveals it directly. You hand the vault a random mask mm, and it gives you back V=S+mV = S + m. Using VV, mm, rr and ee, you have to produce zz in a way that never exposes SS to the listener.

You build the circuit in the Playground by dragging hardware blocks onto a canvas and wiring them up. The server then simulates it cycle by cycle on hidden data. A design is judged on three things:

  1. Correct: every proof verifies, and each one belongs to the request that asked for it.
  2. Secure: nothing the listener records lets them solve for SS.
  3. Efficient: small area, low latency and, in Part B, high throughput.

Conventions

Assume the standard Schnorr setting:

The exact constants are fixed by the evaluator and listed at the end of this page, but you never need them: the blocks handle the arithmetic for you. Time is measured in clock cycles, area in gate units G.

Your toolbox

BlockDoesLatencyArea
TRNGfresh uniform random scalar5250 G
VAULTm↦S+mm \mapsto S + m1100 G
HASH_256(C,ID)↦e(C, \mathrm{ID}) \mapsto e3150 G
MOD_EXPx↦Gxx \mapsto G^{x}10400 G
MUL · ADD · SUBa⋅ba\cdot b, a+ba + b, a−ba - b (mod qq)2 · 1 · 1100 · 20 · 20 G
DELAY(d)the same value, dd cycles laterdd5d5d G
MUX / DEMUX (Part B)merge / split a stream across nn copies110n10n G
PIPE (Part B)split MOD_EXP, HASH, MUL into kk stagessee block+ per stage

The Playground shows each block's exact numbers when you select it.

How the hardware behaves

What the listener sees

The listener records the outputs of MOD_EXP, HASH_256 and VAULT, the request IDs, your outputs C,e,zC, e, z, and anything computed purely from those. Everything that depends on a TRNG output is hidden from them, but hidden is not the same as safe. The audit fails your design if:

The listener is good at algebra and patient. Think about what each shortcut gives them.

The two parts

Part APart B
Blocksthe base setbase set + MUX, DEMUX, PIPE
Request rateone every 10 cyclesyou choose: one every 1–9 cycles
Must be secure?no, but secure designs score far moreyes
You minimiseA⋅ΛA \cdot \LambdaA1.5⋅II⋅ΛA^{1.5}\cdot \mathrm{II} \cdot \Lambda

AA is total area, Λ\Lambda is the latency from a request's arrival to its last output, and II\mathrm{II} is the cycles between requests.

Scoring. Each result lands in a band. Your position inside the band depends on how close your cost is to the best known design:

ResultPoints
Part A, correct but insecure5 – 15
Part A, correct and secure20 – 50
Part B, correct and secure70 – 100

Your total is your better part. Only your best submission per part counts, and the leaderboard updates live as better designs appear.

Before you start

Reference constants

You don't need these to play. They're here for the curious.