+func ae(keyEnc *[32]byte, r io.Reader, w io.Writer) (int, error) {
+ var blkCtr uint64
+ ciphNonce := new([16]byte)
+ ciphCtr := ciphNonce[8:]
+ buf := make([]byte, EncBlkSize)
+ var n int
+ var written int
+ var err error
+ for {
+ n, err = io.ReadFull(r, buf)
+ if err != nil {
+ if err == io.EOF {
+ break
+ }
+ if err != io.ErrUnexpectedEOF {
+ return written + n, err
+ }
+ }
+ written += n
+ blkCtr++
+ binary.BigEndian.PutUint64(ciphCtr, blkCtr)
+ chacha20.XORKeyStream(buf[:n], buf[:n], ciphNonce, keyEnc)
+ if _, err = w.Write(buf[:n]); err != nil {
+ return written, err
+ }
+ }
+ return written, nil
+}
+