summaryrefslogtreecommitdiffstats
path: root/vendor/go.mau.fi/libsignal/keys/session/Pair.go
blob: f6387ba82b283e575fce8921576514d64b5b4f0a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Package session provides a simple structure for session keys, which is
// a pair of root and chain keys for a session.
package session

import (
	"go.mau.fi/libsignal/ecc"
	"go.mau.fi/libsignal/keys/chain"
	"go.mau.fi/libsignal/keys/message"
)

// RootKeyable is an interface for all root key implementations that are part of
// a session keypair.
type RootKeyable interface {
	Bytes() []byte
	CreateChain(theirRatchetKey ecc.ECPublicKeyable, ourRatchetKey *ecc.ECKeyPair) (*KeyPair, error)
}

// ChainKeyable is an interface for all chain key implementations that are part of
// a session keypair.
type ChainKeyable interface {
	Key() []byte
	Index() uint32
	NextKey() *chain.Key
	MessageKeys() *message.Keys
	Current() *chain.Key
}

// NewKeyPair returns a new session key pair that holds a root and chain key.
func NewKeyPair(rootKey RootKeyable, chainKey ChainKeyable) *KeyPair {
	keyPair := KeyPair{
		RootKey:  rootKey,
		ChainKey: chainKey,
	}

	return &keyPair
}

// KeyPair is a session key pair that holds a single root and chain key pair. These
// keys are ratcheted after every message sent and every message round trip.
type KeyPair struct {
	RootKey  RootKeyable
	ChainKey ChainKeyable
}