Skip to content
Kavachकवच

Secrets: Secret parameters

● Intermediate3 min

A secret can go to a parameter that is secret itself, and nowhere else.

type Order {
    id: Int
    secret card: String
}

fn charge(secret card: String, amount: Int) -> String {
    "charged {amount}, card of {card.len()} digits"
}

fn main() {
    const order = Order(id: 7, card: "4242424242421881")
    print(charge(order.card, 499))
    const card = reveal(order.card)
    print("ends in {card.slice(12, 16)}")
}

The program ran and printed:

kavach run secret-param.kav

charged 499, card of 16 digitsends in 1881
secret-param.kav: Kavach code, then what running it prints

Inside charge, card is a secret like the field it came from. So is a variable set from a secret: here c is, and an ordinary parameter can't take it:

type Order {
    id: Int
    secret card: String
}

fn remember(text: String) {
}

fn main() {
    const order = Order(id: 7, card: "4242 4242 4242 1881")
    const c = order.card
    remember(c)
}

The compiler refused the program:

kavach run secret-remember.kav

error: `c` is secret, so it can't go into the argument `text` of `remember`, which isn't `secret`; mark it `secret`, or use `reveal(…)` if you really mean to
secret-remember.kav: Kavach code, then what running it prints