diff --git a/tools/gostdlib/poly1305.go b/tools/gostdlib/poly1305.go index cd7424d..9ada378 100644 --- a/tools/gostdlib/poly1305.go +++ b/tools/gostdlib/poly1305.go @@ -25,7 +25,9 @@ func init() { // Poly1305 implements the cryptographic interface for Poly1305 message authentication codes. type Poly1305 struct { tools.ToolLogicBase - key [32]byte + key [32]byte + keyIsSetUp bool + keyUsed bool } // Setup implements the ToolLogic interface. @@ -35,6 +37,7 @@ func (poly *Poly1305) Setup() (err error) { if err != nil { return err } + poly.keyIsSetUp = true return nil } @@ -43,14 +46,26 @@ func (poly *Poly1305) Setup() (err error) { func (poly *Poly1305) Reset() error { // clean up key poly.Helper().Burn(poly.key[:]) + poly.keyUsed = false + poly.keyIsSetUp = false return nil } // MAC implements the ToolLogic interface. func (poly *Poly1305) MAC(data, associatedData []byte) ([]byte, error) { + // check for key initialization + if !poly.keyIsSetUp { + return nil, errors.New("key not initialized") + } + // check for key reuse + if poly.keyUsed { + return nil, errors.New("key reuse detected") + } + // create MAC mac := poly1305.New(&poly.key) + poly.keyUsed = true // write data n, err := mac.Write(data) if err != nil {