An independent archive of typography.
Topics
Formats
Typefaces

Abric-language-kotlin [top] -

// Send random contributions to the next party parties.indices.forEach i -> val next = (i + 1) % parties.size send(randoms[i] to parties[next])

┌─────────────────────────────────────────────┐ │ High-level DSL (Kotlin) │ │ protocol input(...) output(...) ... │ └─────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ Intermediate Representation │ │ (IR) – Linearized sequence of gates │ └─────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ Analysis Modules │ │ - Information flow │ │ - Leakage detection │ │ - Complexity estimation │ └─────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ Code Generation Backends │ │ - MP-SPDZ │ │ - SCALE-MAMBA (for ZK) │ │ - Custom networking stubs (Kotlin/Netty) │ └─────────────────────────────────────────────┘ | Feature | Abricot (Kotlin) | Circom (ZK-SNARKs) | MP-SPDZ high-level | |------------------------|------------------|--------------------|--------------------| | Host language | Kotlin (JVM) | Custom language | Python-like script | | Type system | Full Kotlin types + Secret | Static, signal-based | Dynamic | | Reusable sub-protocols | Yes (functions) | Yes (templates) | Yes (functions) | | Automatic malicious security | Partially via ZK insertion | No (must specify constraints) | Via compiler flags | | IDE support | Full (IntelliJ) | Limited | Limited | | Compilation target | MPC, ZK, simulation | R1CS + witness | Various MPC engines | 5. Example: Proactive Secret Sharing in Abricot One of the classic use cases for Abricot is proactive secret sharing — where shares are refreshed periodically to maintain security against mobile adversaries. abric-language-kotlin

// Locally refresh: new_share = old_share + random_share - random_share_from_prev val newShares = parties.indices.map i -> add(oldShares[i], randoms[i]) // Send random contributions to the next party parties

The library typically consists of several layers: // Locally refresh: new_share = old_share + random_share

val protocol = protocol val x = input(alice) val y = input(bob) val z = add(x, y) output(z, charlie)

// After receiving, subtract the incoming random receiveAll() val finalShares = parties.indices.map i -> val prev = (i - 1 + parties.size) % parties.size sub(newShares[i], randoms[prev])