Documentation
¶
Index ¶
- func WithCrypto(c Crypto) option
- func WithKeysStorage(ks KeysStorage) option
- func WithMaxKeep(n int) option
- func WithMaxMessageKeysPerSession(n int) option
- func WithMaxSkip(n int) option
- type Crypto
- type DHPair
- type DefaultCrypto
- func (c DefaultCrypto) DH(dhPair DHPair, dhPub dh.Key) dh.Key
- func (c DefaultCrypto) Decrypt(mk dh.Key, authCiphertext, ad []byte) ([]byte, error)
- func (this DefaultCrypto) Encrypt(mk dh.Key, plaintext, ad []byte) []byte
- func (c DefaultCrypto) GenerateDH() (DHPair, error)
- func (c DefaultCrypto) KdfCK(ck dh.Key) (chainKey dh.Key, msgKey dh.Key)
- func (c DefaultCrypto) KdfRK(rk, dhOut dh.Key) (rootKey, chainKey, headerKey dh.Key)
- type InMemoryKey
- type KDFer
- type KeysStorage
- type KeysStorageInMemory
- func (s *KeysStorageInMemory) All() (map[dh.Key]map[uint]dh.Key, error)
- func (s *KeysStorageInMemory) Count(pubKey dh.Key) (uint, error)
- func (s *KeysStorageInMemory) DeleteMk(pubKey dh.Key, msgNum uint) error
- func (s *KeysStorageInMemory) DeleteOldMks(sessionID []byte, deleteUntilSeqKey uint) error
- func (this *KeysStorageInMemory) Get(pubKey dh.Key, msgNum uint) (dh.Key, bool, error)
- func (s *KeysStorageInMemory) Put(sessionID []byte, pubKey dh.Key, msgNum uint, mk dh.Key, seqNum uint) error
- func (s *KeysStorageInMemory) TruncateMks(sessionID []byte, maxKeys int) error
- type Message
- type MessageEncHeader
- type MessageHE
- type MessageHeader
- type Session
- type SessionHE
- type SessionStorage
- type State
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func WithKeysStorage ¶
func WithKeysStorage(ks KeysStorage) option
withkeystorage用指定的替换默认密钥存储。 nolint: golint
func WithMaxMessageKeysPerSession ¶
func WithMaxMessageKeysPerSession(n int) option
withmaxmessagekeyspersession指定每个会话的最大消息密钥数 nolint: golint
Types ¶
type Crypto ¶
type Crypto interface {
//创建新的dh密钥对
GenerateDH() (DHPair, error)
//计算公共密钥
DH(dhPair DHPair, dhPub dh.Key) dh.Key
//使用消息密钥 mk加密内容
Encrypt(mk dh.Key, plaintext, ad []byte) (authCiphertext []byte)
// Decrypt returns the AEAD decryption of ciphertext with message key mk.
//通过消息密钥mk解密内容
Decrypt(mk dh.Key, ciphertext, ad []byte) (plaintext []byte, err error)
KDFer
}
Crypto是对加密库的补充。
type DefaultCrypto ¶
type DefaultCrypto struct{}
DefaultCrypto is an implementation of Crypto with cryptographic primitives recommended by the Double Ratchet Algorithm specification. However, some details are different, see function comments for details. 是双棘轮算法规范推荐使用加密原语的加密实现。但是,有些细节不同,有关详细信息,请参见功能注释。
func (DefaultCrypto) Decrypt ¶
Decrypt returns the AEAD decryption of ciphertext with message key mk.
func (DefaultCrypto) Encrypt ¶
func (this DefaultCrypto) Encrypt(mk dh.Key, plaintext, ad []byte) []byte
Encrypt使用与算法规范稍有不同的方法:它使用aes-256-ctr而不是aes-256-cbc来考虑安全性、密文长度和实现复杂性。
type InMemoryKey ¶
type InMemoryKey struct {
// contains filtered or unexported fields
}
type KDFer ¶
type KDFer interface {
// KdfRK 返回一对密钥(根密钥key, 链密钥key)
KdfRK(rk, dhOut dh.Key) (rootKey, chainKey, newHeaderKey dh.Key) //
// KdfCK returns a pair (32-byte chain key, 32-byte message key) as the output of applying
// a KDF keyed by a 32-byte chain key ck to some constant.
//通过链密钥ck作为常量,作为kdf的密钥,返回一对密钥(链密钥,消息密钥)
KdfCK(ck dh.Key) (chainKey, msgKey dh.Key)
}
KDFer为链执行键派生函数。
type KeysStorage ¶
type KeysStorage interface {
// get按给定的键和消息编号返回消息键。
Get(k dh.Key, msgNum uint) (mk dh.Key, ok bool, err error)
// 将给定的mk保存在指定的键和msgnum下。
Put(sessionID []byte, k dh.Key, msgNum uint, mk dh.Key, keySeqNum uint) error
// DeleteMk ensures there's no message key under the specified key and msgNum.
//deletemk确保在指定的密钥和msgnum下没有消息密钥。
DeleteMk(k dh.Key, msgNum uint) error
// DeleteOldMKeys deletes old message keys for a session.
//deleteoldmkeys删除会话的旧消息键。
DeleteOldMks(sessionID []byte, deleteUntilSeqKey uint) error
// TruncateMks truncates the number of keys to maxKeys.
//truncatemks将键数截断为maxkeys。
TruncateMks(sessionID []byte, maxKeys int) error
// Count returns number of message keys stored under the specified key.
//count返回存储在指定密钥下的消息密钥数。
Count(k dh.Key) (uint, error)
// 全部返回所有键
All() (map[dh.Key]map[uint]dh.Key, error)
}
密钥存储是抽象内存或持久密钥存储的接口。
type KeysStorageInMemory ¶
type KeysStorageInMemory struct {
// contains filtered or unexported fields
}
keystorageinmemory是内存中的消息密钥存储。
func (*KeysStorageInMemory) Count ¶
func (s *KeysStorageInMemory) Count(pubKey dh.Key) (uint, error)
count返回存储在指定密钥下的消息密钥数。
func (*KeysStorageInMemory) DeleteMk ¶
func (s *KeysStorageInMemory) DeleteMk(pubKey dh.Key, msgNum uint) error
deletemk确保在指定的密钥和msgnum下没有消息密钥。
func (*KeysStorageInMemory) DeleteOldMks ¶
func (s *KeysStorageInMemory) DeleteOldMks(sessionID []byte, deleteUntilSeqKey uint) error
deleteoldmkeys删除会话的旧消息键。
func (*KeysStorageInMemory) Put ¶
func (s *KeysStorageInMemory) Put(sessionID []byte, pubKey dh.Key, msgNum uint, mk dh.Key, seqNum uint) error
将给定的mk保存在指定的键和msgnum下。
func (*KeysStorageInMemory) TruncateMks ¶
func (s *KeysStorageInMemory) TruncateMks(sessionID []byte, maxKeys int) error
truncatemks将键数截断为maxkeys。
type Message ¶
type Message struct {
Header MessageHeader `json:"header"`
Ciphertext []byte `json:"ciphertext"`
}
消息是双方交换的单个消息。
type MessageEncHeader ¶
type MessageEncHeader []byte
messageencheader是消息头的二进制编码表示。
func (MessageEncHeader) Decode ¶
func (mh MessageEncHeader) Decode() (MessageHeader, error)
从二进制编码表示中解码消息头。
type MessageHeader ¶
type MessageHeader struct {
// DHR是发送方当前的棘轮公钥。
DH dh.Key `json:"dh"`
// n是发送链中消息的编号。
N uint32 `json:"n"`
// pn是上一个发送链的长度。
PN uint32 `json:"pn"`
}
每个消息前面都有消息头。
type Session ¶
type Session interface {
// RatchetEncrypt performs a symmetric-key ratchet step, then AEAD-encrypts the message with
// the resulting message key.
//Ratchetencrypt执行对称的密钥棘轮步骤,然后用AEAD-encrypts加密消息
//返回消息键。
RatchetEncrypt(plaintext, associatedData []byte) (Message, error)
// 调用ratchetdecrypt来对消息进行AEAD解密。
RatchetDecrypt(m Message, associatedData []byte) ([]byte, error)
//DeleteMk 从数据库中删除消息密钥
DeleteMk(dh.Key, uint32) error
}
参与双棘轮算法的缔约方会议。
func Load ¶
func Load(id []byte, store SessionStorage, opts ...option) (Session, error)
从sessionstorage实现加载会话并应用选项。
func New ¶
func New(id []byte, sharedKey dh.Key, keyPair DHPair, storage SessionStorage, opts ...option) (Session, error)
新建使用共享密钥创建会话。
func NewWithRemoteKey ¶
func NewWithRemoteKey(id []byte, sharedKey, remoteKey dh.Key, storage SessionStorage, opts ...option) (Session, error)
newWithRemoteKey创建与另一方的共享密钥和公钥的会话。
type SessionHE ¶
type SessionHE interface {
// RatchetEncrypt performs a symmetric-key ratchet step, then AEAD-encrypts
// the header-encrypted message with the resulting message key.
//Ratchetencrypt执行对称的密钥棘轮步骤,然后AEAD加密
//头用结果消息密钥加密的消息。
RatchetEncrypt(plaintext, associatedData []byte) MessageHE
// RatchetDecrypt is called to AEAD-decrypt header-encrypted messages.
RatchetDecrypt(m MessageHE, associatedData []byte) ([]byte, error)
}
会话这是一个涉及加密头修改的双棘轮算法的会话。
type SessionStorage ¶
type State ¶
type State struct {
Crypto Crypto
// DH 棘轮公钥 (远端的 key).
DHr dh.Key
// DH 棘轮公司约对(自己的棘轮对 key).
DHs DHPair
// 对称棘轮根链。
RootCh kdfRootChain
// 对称棘轮发送和接收链。
SendCh, RecvCh kdfChain
// 发送链中上一个消息的编号
PN uint32
//跳过消息密钥的字典,由棘轮公钥或头键和消息编号编制索引。
MkSkipped KeysStorage
//单个链中可以跳过的最大消息键数。应该设置得足够高,以允许例程丢失或延迟消息,但是设置得足够低,以至于恶意发送者不能触发过多的收件人计算。
MaxSkip uint
//接收头部key和下一个头部key。仅用于头部加密
HKr, NHKr dh.Key
//发送头部key和下一个头部key,仅用于头部加密。
HKs, NHKs dh.Key
//保留消息键的时间,以接收的消息数计,例如,如果maxkeep为5,我们只保留最后5个消息键,删除所有n-5。
MaxKeep uint
// 每个会话的最大消息密钥数,旧密钥将以FIFO方式删除
MaxMessageKeysPerSession int
// 当前棘轮步进的编号。
Step uint
// KeysCount 已经生成的key数量
KeysCount uint
}
双棘轮状态