@0x89ae7248ac2e8067;

enum KeyDerivationType {
    argon2 @0;
}

# Enumeration of all cipher suites
enum KeyType {
    rsaAesGcm @0;
    ed25519Chacha20Poly1305 @1;
}


# Layout of a (private ring block)
struct Ring {
    id @0 : Text;
    name @1 : Text;
    email @2 : Text;
    publicKeys @3 : List(PublicKey);
    privateKeys @4 : List(PrivateKey);
    hidden @5: Bool = false;

    struct PublicKey {
        type @0 : KeyType;
        key @1 : Data;
    }

    struct PrivateKey {
        type @0 : KeyType;
        derivationType @1: KeyDerivationType;
        preset @2 : UInt8;
        nonce @3 : Data;
        cryptedKey @4 : Data;
    }
}

# Layout of a data block
# Since "Data" is reserved by Cap'n Proto, we just call it Block
struct Block {
    headers @0 : List(Header);
    content @1 : Data;

    struct Header {
        type @0 : KeyType;
        commonKey @1 : Data;
        recipients @2 : List(RecipientKey);
    }

    struct RecipientKey {
        id @0 : Text;
        cryptedKey @1: Data;
    }
}

# Internal layout of an index
# This is supposed to be in-(secure)-memory only. When written to some persistent medium
# an index has to be wrapped in a block like all other secrets
struct Index {
    heads @0 : List(Head);
    entries @1 : List(Entry);

    enum HeadOperation {
        add @0;
        delete @1;
    }

    struct Head {
        nodeId @0: Text;
        operation @1 : HeadOperation;
        blockId @2 : Text;
    }

    struct Entry {
        entry @0 : SecretEntry;
        versionRefs @1 : List(SecretVersionRef);
    }
}

enum SecretType {
    login @0;
    note @1;
    licence @2;
    wlan @3;
    password @4;
    other @5;
}

struct SecretEntry {
    id @0 : Text;
    timestamp @1 : Int64;
    name @2 : Text;
    type @3 : SecretType;
    tags @4 : List(Text);
    urls @5 : List(Text);
    deleted @6 : Bool;
}

struct SecretVersionRef {
    blockId @0 : Text;
    timestamp @1 : Int64;
}
