package chacha20poly1305
import (
)
func ( *poly1305.MAC, []byte) {
.Write()
if := len() % 16; != 0 {
var [16]byte
:= 16 -
.Write([:])
}
}
func ( *poly1305.MAC, int) {
var [8]byte
binary.LittleEndian.PutUint64([:], uint64())
.Write([:])
}
func ( *chacha20poly1305) (, , , []byte) []byte {
, := sliceForAppend(, len()+poly1305.TagSize)
, := [:len()], [len():]
if subtle.InexactOverlap(, ) {
panic("chacha20poly1305: invalid buffer overlap")
}
var [32]byte
, := chacha20.NewUnauthenticatedCipher(.key[:], )
.XORKeyStream([:], [:])
.SetCounter(1)
.XORKeyStream(, )
:= poly1305.New(&)
writeWithPadding(, )
writeWithPadding(, )
writeUint64(, len())
writeUint64(, len())
.Sum([:0])
return
}
func ( *chacha20poly1305) (, , , []byte) ([]byte, error) {
:= [len()-16:]
= [:len()-16]
var [32]byte
, := chacha20.NewUnauthenticatedCipher(.key[:], )
.XORKeyStream([:], [:])
.SetCounter(1)
:= poly1305.New(&)
writeWithPadding(, )
writeWithPadding(, )
writeUint64(, len())
writeUint64(, len())
, := sliceForAppend(, len())
if subtle.InexactOverlap(, ) {
panic("chacha20poly1305: invalid buffer overlap")
}
if !.Verify() {
for := range {
[] = 0
}
return nil, errOpen
}
.XORKeyStream(, )
return , nil
}