diff --git a/noise.go b/noise.go index 0491da17..eae268ed 100644 --- a/noise.go +++ b/noise.go @@ -23,6 +23,11 @@ func NewNebulaCipherState(s *noise.CipherState) *NebulaCipherState { return &NebulaCipherState{c: x.(cipher.AEAD)} } +type cipherAEADDanger interface { + EncryptDanger(out, ad, plaintext []byte, n uint64, nb []byte) ([]byte, error) + DecryptDanger(out, ad, plaintext []byte, n uint64, nb []byte) ([]byte, error) +} + // EncryptDanger encrypts and authenticates a given payload. // // out is a destination slice to hold the output of the EncryptDanger operation. diff --git a/noiseutil/fips140.go b/noiseutil/fips140.go index fb5f82f3..a5259fa5 100644 --- a/noiseutil/fips140.go +++ b/noiseutil/fips140.go @@ -65,3 +65,14 @@ func (c aeadCipher) Encrypt(out []byte, n uint64, ad, plaintext []byte) []byte { func (c aeadCipher) Decrypt(out []byte, n uint64, ad, ciphertext []byte) ([]byte, error) { return c.Open(out, c.nonce(n), ciphertext, ad) } + +func (c aeadCipher) EncryptDanger(out, ad, plaintext []byte, n uint64, nb []byte) ([]byte, error) { + binary.BigEndian.PutUint64(nb[4:], n) + out = c.Seal(out, nb[4:], plaintext, ad) + return out, nil +} + +func (c aeadCipher) DecryptDanger(out, ad, ciphertext []byte, n uint64, nb []byte) ([]byte, error) { + binary.BigEndian.PutUint64(nb[4:], n) + return c.Open(out, nb[4:], ciphertext, ad) +}