es

package module
v0.0.0-...-ac80f13 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 12, 2024 License: BSD-3-Clause Imports: 7 Imported by: 0

Documentation

Overview

ephemeral secret - ECDHE based on Curve25519 meets XChaCha20-Poly1305 AEAD supported by SHAKE256 hashed payload and secret salted with argon2.

This package provides functions to easily generate keys to en-/decrypt data through a derived key of the consensus secret from these keys (private/public). The knowledge of the senders (private) and receivers (public) keys are the base to exchange data through encrypted messages.

Protocol: Version[4], Sender's Public Key[32], Salt[32], Ciphertext[NonceSizeX[24]+Overhead[16]+Payload[x]], Hash[64]

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Key

type Key []byte

func NewKey

func NewKey() (Key, error)

NewKey generates an new random private key.

func (*Key) Public

func (k *Key) Public() (Key, error)

Public calculates a corresponding public key from k.

type Message

type Message struct {
	// contains filtered or unexported fields
}

func New

func New(my Key) (*Message, error)

New needs my Key (private key) to Encrypt and uses your corresponding public key to Decrypt. If my is nil, then a new random key is generated and used. (one-way communication)

func (*Message) Decrypt

func (m *Message) Decrypt(data []byte) ([]byte, error)

Decrypt data for receivers (private) key in relation to parameters in Message.

Example
package main

import (
	"fmt"
	"log"

	"catinello.eu/es"
)

var Data []byte = []byte("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.")

func main() {
	// KEY MANAGEMENT AND ENCRYPTION

	// create new random private key for sender
	sender, err := es.NewKey()
	if err != nil {
		log.Fatal(err)
	}

	// create new random private key for receiver
	receiver, err := es.NewKey()
	if err != nil {
		log.Fatal(err)
	}

	// retrieve public key for receiver
	receiverPub, err := receiver.Public()
	if err != nil {
		log.Fatal(err)
	}

	// create new message for sender
	m1, err := es.New(sender)
	if err != nil {
		log.Fatal(err)
	}

	// encrypt Data in message (m1) for receiver's public key
	ct, err := m1.Encrypt(receiverPub, Data)
	if err != nil {
		log.Fatal(err)
	}

	// DECRYPTION

	// create new message for receiver
	m2, err := es.New(receiver)
	if err != nil {
		log.Fatal(err)
	}

	// decrypt ciphertext for message (m2)
	pt, err := m2.Decrypt(ct)
	if err != nil {
		log.Fatal(err)
	}

	// print first 11 bytes
	fmt.Println(string(pt[:11]))
}
Output:

Lorem ipsum

func (*Message) Encrypt

func (m *Message) Encrypt(receiver Key, data []byte) ([]byte, error)

Encrypt data for receiver (public) key in relation to parameters in Message.

Example
package main

import (
	"fmt"
	"log"

	"catinello.eu/es"
)

var Data []byte = []byte("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.")

func main() {
	// create new message with random keys as anonymous sender
	m, err := es.New(nil)
	if err != nil {
		log.Fatal(err)
	}

	// create new random private key
	k, err := es.NewKey()
	if err != nil {
		log.Fatal(err)
	}

	// retrieve public key from new private key (k)
	pub, err := k.Public()
	if err != nil {
		log.Fatal(err)
	}

	// encrypt Data in message (m) for receiver (pub = public key)
	ct, err := m.Encrypt(pub, Data)
	if err != nil {
		log.Fatal(err)
	}

	// ciphertext is 763 bytes long
	fmt.Println(len(ct))
}
Output:

763

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL