/* jess is a lovely cat that protects your data. Jess uses four types of objects: - Envelopes (encryption configuration) - Letters (encrypted data) - Stamp (private or secret key) - Signet (certificate / public key) - Seal (separate signature) Usage: message := "I love milk" // configure envelope, err := jess.NewEnvelope().SupplyPassword("paw").Check() // encrypt letter := jess.Close(envelope, message) encrypted := letter.AsString() fmt.Println(encrypted) // decrypt letter = jess.LetterFromString(encrypted) message = jess.Open(envelope, letter) fmt.Println(message) CLI: coming soon jess new <envelope> // create new configuration jess close <file> with <envelope> // encrypt data in a letter jess open <file> // decrypt and verify letter jess show <file> // show information about object jess sign <file> with <envelope> // special close case, where only a signature is created and put in a separate `.seal` file Internals: Envelope.Correspondence() *Session Key Establishment Exchange: c=IDLE s=IDLE c -> new ephemeral public key -> s ... detected by len(keys) > 0 c=AWAIT_KEY, s=SEND_KEY s: make new ephemeral key, apply new shared secret immediately s -> new ephemeral public key -> c ... detected by len(keys) > 0 c: apply new shared secret immediately for s->c c=SEND_APPLY, s=AWAIT_APPLY c: apply new shared secret to c->s c -> apply -> s ... detected by APPLY flag s: apply to c->s c=IDLE, S=IDLE Encapsulation: c=IDLE s=IDLE c -> new ephemeral public key -> s ... detected by len(keys) > 0 c=AWAIT_KEY, s=SEND_KEY s: make key, apply immediately and encapsulate s -> encapsulated key -> c ... detected by len(keys) > 0 c: apply encapsulated key immediately for s->c c=SEND_APPLY, s=AWAIT_APPLY c: apply encapsulated secret for c->s c -> apply -> s ... detected by APPLY flag s: apply to c->s c=IDLE, S=IDLE */ package jess