X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=mgm%2Fmode.go;h=c4bb92ae66353fdda8f90dcada019a25eecca8ee;hb=HEAD;hp=c281567fbaf9ceb8dc33777314e2122788064a7b;hpb=52e9112b563e6ee472a31136ec9dc69876cf6e02;p=gogost.git diff --git a/mgm/mode.go b/mgm/mode.go index c281567..cbba435 100644 --- a/mgm/mode.go +++ b/mgm/mode.go @@ -1,5 +1,5 @@ // GoGOST -- Pure Go GOST cryptographic functions library -// Copyright (C) 2015-2021 Sergey Matveev +// Copyright (C) 2015-2024 Sergey Matveev // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -21,22 +21,13 @@ import ( "crypto/hmac" "encoding/binary" "errors" - "math/big" + "fmt" ) -var ( - R64 *big.Int = big.NewInt(0) - R128 *big.Int = big.NewInt(0) -) +var InvalidTag = errors.New("gogost/mgm: invalid authentication tag") -func init() { - R64.SetBytes([]byte{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, - }) - R128.SetBytes([]byte{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, - }) +type Mul interface { + Mul(x, y []byte) []byte } type MGM struct { @@ -49,22 +40,16 @@ type MGM struct { bufC []byte padded []byte sum []byte - - x *big.Int - y *big.Int - z *big.Int - maxBit int - r *big.Int - mulBuf []byte + mul Mul } func NewMGM(cipher cipher.Block, tagSize int) (cipher.AEAD, error) { blockSize := cipher.BlockSize() if !(blockSize == 8 || blockSize == 16) { - return nil, errors.New("gogost/mgm: only 64/128 blocksizes allowed") + return nil, errors.New("gogost/mgm: only {64|128} blocksizes allowed") } if tagSize < 4 || tagSize > blockSize { - return nil, errors.New("gogost/mgm: invalid tag size") + return nil, fmt.Errorf("gogost/mgm: invalid tag size (4<=%d<=%d)", tagSize, blockSize) } mgm := MGM{ MaxSize: uint64(1< mgm.MaxSize { panic("ciphertext is too big") @@ -245,7 +226,7 @@ func (mgm *MGM) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, err copy(mgm.icn, nonce) mgm.auth(mgm.sum, ct, additionalData) if !hmac.Equal(mgm.sum[:mgm.TagSize], ciphertext[len(ciphertext)-mgm.TagSize:]) { - return nil, errors.New("gogost/mgm: invalid authentication tag") + return nil, InvalidTag } mgm.crypt(out, ct) return ret, nil