diff --git a/noise.go b/noise.go index eae268ed..26e2635c 100644 --- a/noise.go +++ b/noise.go @@ -38,20 +38,25 @@ type cipherAEADDanger interface { // be re-used by callers to minimize garbage collection. func (s *NebulaCipherState) EncryptDanger(out, ad, plaintext []byte, n uint64, nb []byte) ([]byte, error) { if s != nil { - // TODO: Is this okay now that we have made messageCounter atomic? - // Alternative may be to split the counter space into ranges - //if n <= s.n { - // return nil, errors.New("CRITICAL: a duplicate counter value was used") - //} - //s.n = n - nb[0] = 0 - nb[1] = 0 - nb[2] = 0 - nb[3] = 0 - noiseEndianness.PutUint64(nb[4:], n) - out = s.c.Seal(out, nb, plaintext, ad) - //l.Debugf("Encryption: outlen: %d, nonce: %d, ad: %s, plainlen %d", len(out), n, ad, len(plaintext)) - return out, nil + switch ce := s.c.(type) { + case cipherAEADDanger: + return ce.EncryptDanger(out, ad, plaintext, n, nb) + default: + // TODO: Is this okay now that we have made messageCounter atomic? + // Alternative may be to split the counter space into ranges + //if n <= s.n { + // return nil, errors.New("CRITICAL: a duplicate counter value was used") + //} + //s.n = n + nb[0] = 0 + nb[1] = 0 + nb[2] = 0 + nb[3] = 0 + noiseEndianness.PutUint64(nb[4:], n) + out = s.c.Seal(out, nb, plaintext, ad) + //l.Debugf("Encryption: outlen: %d, nonce: %d, ad: %s, plainlen %d", len(out), n, ad, len(plaintext)) + return out, nil + } } else { return nil, errors.New("no cipher state available to encrypt") } @@ -59,12 +64,17 @@ func (s *NebulaCipherState) EncryptDanger(out, ad, plaintext []byte, n uint64, n func (s *NebulaCipherState) DecryptDanger(out, ad, ciphertext []byte, n uint64, nb []byte) ([]byte, error) { if s != nil { - nb[0] = 0 - nb[1] = 0 - nb[2] = 0 - nb[3] = 0 - noiseEndianness.PutUint64(nb[4:], n) - return s.c.Open(out, nb, ciphertext, ad) + switch ce := s.c.(type) { + case cipherAEADDanger: + return ce.DecryptDanger(out, ad, ciphertext, n, nb) + default: + nb[0] = 0 + nb[1] = 0 + nb[2] = 0 + nb[3] = 0 + noiseEndianness.PutUint64(nb[4:], n) + return s.c.Open(out, nb, ciphertext, ad) + } } else { return []byte{}, nil }