change to use go's own XORBytes function #315

This commit is contained in:
Sun Yimin 2025-03-13 15:15:46 +08:00 committed by GitHub
parent d6f18a2cbf
commit 7a5253bfb5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 62 additions and 65 deletions

View File

@ -7,8 +7,8 @@ package cbcmac
import ( import (
"crypto/cipher" "crypto/cipher"
"crypto/subtle"
"github.com/emmansun/gmsm/internal/subtle"
"github.com/emmansun/gmsm/padding" "github.com/emmansun/gmsm/padding"
) )

View File

@ -4,18 +4,17 @@ package cipher
import ( import (
"bytes" "bytes"
_cipher "crypto/cipher" "crypto/cipher"
"crypto/subtle"
"github.com/emmansun/gmsm/internal/subtle"
) )
type bc struct { type bc struct {
b _cipher.Block b cipher.Block
blockSize int blockSize int
iv []byte iv []byte
} }
func newBC(b _cipher.Block, iv []byte) *bc { func newBC(b cipher.Block, iv []byte) *bc {
return &bc{ return &bc{
b: b, b: b,
blockSize: b.BlockSize(), blockSize: b.BlockSize(),
@ -30,13 +29,13 @@ type bcEncrypter bc
// NewBCEncrypter will check for this interface and return the specific // NewBCEncrypter will check for this interface and return the specific
// BlockMode if found. // BlockMode if found.
type bcEncAble interface { type bcEncAble interface {
NewBCEncrypter(iv []byte) _cipher.BlockMode NewBCEncrypter(iv []byte) cipher.BlockMode
} }
// NewBCEncrypter returns a BlockMode which encrypts in block chaining // NewBCEncrypter returns a BlockMode which encrypts in block chaining
// mode, using the given Block. The length of iv must be the same as the // mode, using the given Block. The length of iv must be the same as the
// Block's block size. // Block's block size.
func NewBCEncrypter(b _cipher.Block, iv []byte) _cipher.BlockMode { func NewBCEncrypter(b cipher.Block, iv []byte) cipher.BlockMode {
if len(iv) != b.BlockSize() { if len(iv) != b.BlockSize() {
panic("cipher.NewBCEncrypter: IV length must equal block size") panic("cipher.NewBCEncrypter: IV length must equal block size")
} }
@ -81,13 +80,13 @@ type bcDecrypter bc
// NewBCDecrypter will check for this interface and return the specific // NewBCDecrypter will check for this interface and return the specific
// BlockMode if found. // BlockMode if found.
type bcDecAble interface { type bcDecAble interface {
NewBCDecrypter(iv []byte) _cipher.BlockMode NewBCDecrypter(iv []byte) cipher.BlockMode
} }
// NewBCDecrypter returns a BlockMode which decrypts in block chaining // NewBCDecrypter returns a BlockMode which decrypts in block chaining
// mode, using the given Block. The length of iv must be the same as the // mode, using the given Block. The length of iv must be the same as the
// Block's block size and must match the iv used to encrypt the data. // Block's block size and must match the iv used to encrypt the data.
func NewBCDecrypter(b _cipher.Block, iv []byte) _cipher.BlockMode { func NewBCDecrypter(b cipher.Block, iv []byte) cipher.BlockMode {
if len(iv) != b.BlockSize() { if len(iv) != b.BlockSize() {
panic("cipher.NewBCDecrypter: IV length must equal block size") panic("cipher.NewBCDecrypter: IV length must equal block size")
} }

View File

@ -2,15 +2,14 @@
package cipher package cipher
import ( import (
goCipher "crypto/cipher" "crypto/cipher"
goSubtle "crypto/subtle" "crypto/subtle"
"math" "math"
"errors" "errors"
"github.com/emmansun/gmsm/internal/alias" "github.com/emmansun/gmsm/internal/alias"
"github.com/emmansun/gmsm/internal/byteorder" "github.com/emmansun/gmsm/internal/byteorder"
"github.com/emmansun/gmsm/internal/subtle"
) )
const ( const (
@ -23,11 +22,11 @@ const (
// ccmAble is an interface implemented by ciphers that have a specific optimized // ccmAble is an interface implemented by ciphers that have a specific optimized
// implementation of CCM. // implementation of CCM.
type ccmAble interface { type ccmAble interface {
NewCCM(nonceSize, tagSize int) (goCipher.AEAD, error) NewCCM(nonceSize, tagSize int) (cipher.AEAD, error)
} }
type ccm struct { type ccm struct {
cipher goCipher.Block cipher cipher.Block
nonceSize int nonceSize int
tagSize int tagSize int
} }
@ -57,14 +56,14 @@ func maxlen(L, tagsize int) int {
// NewCCM returns the given 128-bit, block cipher wrapped in CCM // NewCCM returns the given 128-bit, block cipher wrapped in CCM
// with the standard nonce length. // with the standard nonce length.
func NewCCM(cipher goCipher.Block) (goCipher.AEAD, error) { func NewCCM(cipher cipher.Block) (cipher.AEAD, error) {
return NewCCMWithNonceAndTagSize(cipher, ccmStandardNonceSize, ccmTagSize) return NewCCMWithNonceAndTagSize(cipher, ccmStandardNonceSize, ccmTagSize)
} }
// NewCCMWithNonceSize returns the given 128-bit, block cipher wrapped in CCM, // NewCCMWithNonceSize returns the given 128-bit, block cipher wrapped in CCM,
// which accepts nonces of the given length. The length must not // which accepts nonces of the given length. The length must not
// be zero. // be zero.
func NewCCMWithNonceSize(cipher goCipher.Block, size int) (goCipher.AEAD, error) { func NewCCMWithNonceSize(cipher cipher.Block, size int) (cipher.AEAD, error) {
return NewCCMWithNonceAndTagSize(cipher, size, ccmTagSize) return NewCCMWithNonceAndTagSize(cipher, size, ccmTagSize)
} }
@ -72,12 +71,12 @@ func NewCCMWithNonceSize(cipher goCipher.Block, size int) (goCipher.AEAD, error)
// which generates tags with the given length. // which generates tags with the given length.
// //
// Tag sizes between 8 and 16 bytes are allowed. // Tag sizes between 8 and 16 bytes are allowed.
func NewCCMWithTagSize(cipher goCipher.Block, tagSize int) (goCipher.AEAD, error) { func NewCCMWithTagSize(cipher cipher.Block, tagSize int) (cipher.AEAD, error) {
return NewCCMWithNonceAndTagSize(cipher, ccmStandardNonceSize, tagSize) return NewCCMWithNonceAndTagSize(cipher, ccmStandardNonceSize, tagSize)
} }
// https://tools.ietf.org/html/rfc3610 // https://tools.ietf.org/html/rfc3610
func NewCCMWithNonceAndTagSize(cipher goCipher.Block, nonceSize, tagSize int) (goCipher.AEAD, error) { func NewCCMWithNonceAndTagSize(cipher cipher.Block, nonceSize, tagSize int) (cipher.AEAD, error) {
if tagSize < ccmMinimumTagSize || tagSize > ccmBlockSize || tagSize&1 != 0 { if tagSize < ccmMinimumTagSize || tagSize > ccmBlockSize || tagSize&1 != 0 {
return nil, errors.New("cipher: incorrect tag size given to CCM") return nil, errors.New("cipher: incorrect tag size given to CCM")
} }
@ -189,7 +188,7 @@ func (c *ccm) Seal(dst, nonce, plaintext, data []byte) []byte {
c.cipher.Encrypt(tagMask[:], counter[:]) c.cipher.Encrypt(tagMask[:], counter[:])
counter[len(counter)-1] |= 1 counter[len(counter)-1] |= 1
ctr := goCipher.NewCTR(c.cipher, counter[:]) ctr := cipher.NewCTR(c.cipher, counter[:])
ctr.XORKeyStream(out, plaintext) ctr.XORKeyStream(out, plaintext)
tag := c.auth(nonce, plaintext, data, &tagMask) tag := c.auth(nonce, plaintext, data, &tagMask)
@ -231,10 +230,10 @@ func (c *ccm) Open(dst, nonce, ciphertext, data []byte) ([]byte, error) {
} }
counter[len(counter)-1] |= 1 counter[len(counter)-1] |= 1
ctr := goCipher.NewCTR(c.cipher, counter[:]) ctr := cipher.NewCTR(c.cipher, counter[:])
ctr.XORKeyStream(out, ciphertext) ctr.XORKeyStream(out, ciphertext)
expectedTag := c.auth(nonce, out, data, &tagMask) expectedTag := c.auth(nonce, out, data, &tagMask)
if goSubtle.ConstantTimeCompare(expectedTag, tag) != 1 { if subtle.ConstantTimeCompare(expectedTag, tag) != 1 {
// The AESNI code decrypts and authenticates concurrently, and // The AESNI code decrypts and authenticates concurrently, and
// so overwrites dst in the event of a tag mismatch. That // so overwrites dst in the event of a tag mismatch. That
// behavior is mimicked here in order to be consistent across // behavior is mimicked here in order to be consistent across

View File

@ -1,12 +1,12 @@
package cipher package cipher
import ( import (
_cipher "crypto/cipher" "crypto/cipher"
"crypto/subtle"
"errors" "errors"
"github.com/emmansun/gmsm/internal/alias" "github.com/emmansun/gmsm/internal/alias"
"github.com/emmansun/gmsm/internal/byteorder" "github.com/emmansun/gmsm/internal/byteorder"
"github.com/emmansun/gmsm/internal/subtle"
) )
// A LengthPreservingMode represents a block cipher running in a length preserving mode (HCTR, // A LengthPreservingMode represents a block cipher running in a length preserving mode (HCTR,
@ -105,7 +105,7 @@ var hctrReductionTable = []uint16{
// https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.470.5288 // https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.470.5288
// GB/T 17964-2021 第11章 带泛杂凑函数的计数器工作模式 // GB/T 17964-2021 第11章 带泛杂凑函数的计数器工作模式
type hctr struct { type hctr struct {
cipher _cipher.Block cipher cipher.Block
tweak [blockSize]byte tweak [blockSize]byte
// productTable contains the first sixteen powers of the hash key. // productTable contains the first sixteen powers of the hash key.
// However, they are in bit reversed order. // However, they are in bit reversed order.
@ -118,7 +118,7 @@ func (h *hctr) BlockSize() int {
// NewHCTR returns a [LengthPreservingMode] which encrypts/decrypts useing the given [Block] // NewHCTR returns a [LengthPreservingMode] which encrypts/decrypts useing the given [Block]
// in HCTR mode. The lenght of tweak and hash key must be the same as the [Block]'s block size. // in HCTR mode. The lenght of tweak and hash key must be the same as the [Block]'s block size.
func NewHCTR(cipher _cipher.Block, tweak, hkey []byte) (LengthPreservingMode, error) { func NewHCTR(cipher cipher.Block, tweak, hkey []byte) (LengthPreservingMode, error) {
if len(tweak) != blockSize || len(hkey) != blockSize { if len(tweak) != blockSize || len(hkey) != blockSize {
return nil, errors.New("cipher: invalid tweak and/or hash key length") return nil, errors.New("cipher: invalid tweak and/or hash key length")
} }

View File

@ -1,17 +1,18 @@
package cipher package cipher
import ( import (
_cipher "crypto/cipher" "crypto/cipher"
"crypto/subtle"
"errors" "errors"
"github.com/emmansun/gmsm/internal/alias" "github.com/emmansun/gmsm/internal/alias"
"github.com/emmansun/gmsm/internal/byteorder" "github.com/emmansun/gmsm/internal/byteorder"
"github.com/emmansun/gmsm/internal/subtle"
) )
const GF128_FDBK byte = 0x87 const GF128_FDBK byte = 0x87
type CipherCreator func([]byte) (_cipher.Block, error) type CipherCreator func([]byte) (cipher.Block, error)
type concurrentBlocks interface { type concurrentBlocks interface {
Concurrency() int Concurrency() int
@ -21,7 +22,7 @@ type concurrentBlocks interface {
// Cipher contains an expanded key structure. It is unsafe for concurrent use. // Cipher contains an expanded key structure. It is unsafe for concurrent use.
type xts struct { type xts struct {
b _cipher.Block b cipher.Block
tweak [blockSize]byte tweak [blockSize]byte
isGB bool // if true, follows GB/T 17964-2021 isGB bool // if true, follows GB/T 17964-2021
} }
@ -37,18 +38,18 @@ type xtsEncrypter xts
// NewXTSEncrypter will check for this interface and return the specific // NewXTSEncrypter will check for this interface and return the specific
// BlockMode if found. // BlockMode if found.
type xtsEncAble interface { type xtsEncAble interface {
NewXTSEncrypter(encryptedTweak *[blockSize]byte, isGB bool) _cipher.BlockMode NewXTSEncrypter(encryptedTweak *[blockSize]byte, isGB bool) cipher.BlockMode
} }
// NewXTSEncrypter creates a Cipher given a function for creating the underlying // NewXTSEncrypter creates a Cipher given a function for creating the underlying
// block cipher (which must have a block size of 16 bytes). // block cipher (which must have a block size of 16 bytes).
func NewXTSEncrypter(cipherFunc CipherCreator, key, tweakKey, tweak []byte) (_cipher.BlockMode, error) { func NewXTSEncrypter(cipherFunc CipherCreator, key, tweakKey, tweak []byte) (cipher.BlockMode, error) {
return newXTSEncrypter(cipherFunc, key, tweakKey, tweak, false) return newXTSEncrypter(cipherFunc, key, tweakKey, tweak, false)
} }
// NewXTSEncrypterWithSector creates a Cipher given a function for creating the underlying // NewXTSEncrypterWithSector creates a Cipher given a function for creating the underlying
// block cipher (which must have a block size of 16 bytes) with sector number. // block cipher (which must have a block size of 16 bytes) with sector number.
func NewXTSEncrypterWithSector(cipherFunc CipherCreator, key, tweakKey []byte, sectorNum uint64) (_cipher.BlockMode, error) { func NewXTSEncrypterWithSector(cipherFunc CipherCreator, key, tweakKey []byte, sectorNum uint64) (cipher.BlockMode, error) {
tweak := make([]byte, blockSize) tweak := make([]byte, blockSize)
byteorder.LEPutUint64(tweak[:8], sectorNum) byteorder.LEPutUint64(tweak[:8], sectorNum)
return NewXTSEncrypter(cipherFunc, key, tweakKey, tweak) return NewXTSEncrypter(cipherFunc, key, tweakKey, tweak)
@ -57,20 +58,20 @@ func NewXTSEncrypterWithSector(cipherFunc CipherCreator, key, tweakKey []byte, s
// NewGBXTSEncrypter creates a Cipher given a function for creating the underlying // NewGBXTSEncrypter creates a Cipher given a function for creating the underlying
// block cipher (which must have a block size of 16 bytes). // block cipher (which must have a block size of 16 bytes).
// It follows GB/T 17964-2021. // It follows GB/T 17964-2021.
func NewGBXTSEncrypter(cipherFunc CipherCreator, key, tweakKey, tweak []byte) (_cipher.BlockMode, error) { func NewGBXTSEncrypter(cipherFunc CipherCreator, key, tweakKey, tweak []byte) (cipher.BlockMode, error) {
return newXTSEncrypter(cipherFunc, key, tweakKey, tweak, true) return newXTSEncrypter(cipherFunc, key, tweakKey, tweak, true)
} }
// NewGBXTSEncrypterWithSector creates a Cipher given a function for creating the underlying // NewGBXTSEncrypterWithSector creates a Cipher given a function for creating the underlying
// block cipher (which must have a block size of 16 bytes) with sector number. // block cipher (which must have a block size of 16 bytes) with sector number.
// It follows GB/T 17964-2021. // It follows GB/T 17964-2021.
func NewGBXTSEncrypterWithSector(cipherFunc CipherCreator, key, tweakKey []byte, sectorNum uint64) (_cipher.BlockMode, error) { func NewGBXTSEncrypterWithSector(cipherFunc CipherCreator, key, tweakKey []byte, sectorNum uint64) (cipher.BlockMode, error) {
tweak := make([]byte, blockSize) tweak := make([]byte, blockSize)
byteorder.LEPutUint64(tweak[:8], sectorNum) byteorder.LEPutUint64(tweak[:8], sectorNum)
return NewGBXTSEncrypter(cipherFunc, key, tweakKey, tweak) return NewGBXTSEncrypter(cipherFunc, key, tweakKey, tweak)
} }
func newXTSEncrypter(cipherFunc CipherCreator, key, tweakKey, tweak []byte, isGB bool) (_cipher.BlockMode, error) { func newXTSEncrypter(cipherFunc CipherCreator, key, tweakKey, tweak []byte, isGB bool) (cipher.BlockMode, error) {
if len(tweak) != blockSize { if len(tweak) != blockSize {
return nil, errors.New("cipher: invalid tweak length") return nil, errors.New("cipher: invalid tweak length")
} }
@ -109,18 +110,18 @@ type xtsDecrypter xts
// NewXTSDecrypter will check for this interface and return the specific // NewXTSDecrypter will check for this interface and return the specific
// BlockMode if found. // BlockMode if found.
type xtsDecAble interface { type xtsDecAble interface {
NewXTSDecrypter(encryptedTweak *[blockSize]byte, isGB bool) _cipher.BlockMode NewXTSDecrypter(encryptedTweak *[blockSize]byte, isGB bool) cipher.BlockMode
} }
// NewXTSDecrypter creates a Cipher given a function for creating the underlying // NewXTSDecrypter creates a Cipher given a function for creating the underlying
// block cipher (which must have a block size of 16 bytes) for decryption. // block cipher (which must have a block size of 16 bytes) for decryption.
func NewXTSDecrypter(cipherFunc CipherCreator, key, tweakKey, tweak []byte) (_cipher.BlockMode, error) { func NewXTSDecrypter(cipherFunc CipherCreator, key, tweakKey, tweak []byte) (cipher.BlockMode, error) {
return newXTSDecrypter(cipherFunc, key, tweakKey, tweak, false) return newXTSDecrypter(cipherFunc, key, tweakKey, tweak, false)
} }
// NewXTSDecrypterWithSector creates a Cipher given a function for creating the underlying // NewXTSDecrypterWithSector creates a Cipher given a function for creating the underlying
// block cipher (which must have a block size of 16 bytes) with sector number for decryption. // block cipher (which must have a block size of 16 bytes) with sector number for decryption.
func NewXTSDecrypterWithSector(cipherFunc CipherCreator, key, tweakKey []byte, sectorNum uint64) (_cipher.BlockMode, error) { func NewXTSDecrypterWithSector(cipherFunc CipherCreator, key, tweakKey []byte, sectorNum uint64) (cipher.BlockMode, error) {
tweak := make([]byte, blockSize) tweak := make([]byte, blockSize)
byteorder.LEPutUint64(tweak[:8], sectorNum) byteorder.LEPutUint64(tweak[:8], sectorNum)
return NewXTSDecrypter(cipherFunc, key, tweakKey, tweak) return NewXTSDecrypter(cipherFunc, key, tweakKey, tweak)
@ -129,20 +130,20 @@ func NewXTSDecrypterWithSector(cipherFunc CipherCreator, key, tweakKey []byte, s
// NewGBXTSDecrypter creates a Cipher given a function for creating the underlying // NewGBXTSDecrypter creates a Cipher given a function for creating the underlying
// block cipher (which must have a block size of 16 bytes) for decryption. // block cipher (which must have a block size of 16 bytes) for decryption.
// It follows GB/T 17964-2021. // It follows GB/T 17964-2021.
func NewGBXTSDecrypter(cipherFunc CipherCreator, key, tweakKey, tweak []byte) (_cipher.BlockMode, error) { func NewGBXTSDecrypter(cipherFunc CipherCreator, key, tweakKey, tweak []byte) (cipher.BlockMode, error) {
return newXTSDecrypter(cipherFunc, key, tweakKey, tweak, true) return newXTSDecrypter(cipherFunc, key, tweakKey, tweak, true)
} }
// NewGBXTSDecrypterWithSector creates a Cipher given a function for creating the underlying // NewGBXTSDecrypterWithSector creates a Cipher given a function for creating the underlying
// block cipher (which must have a block size of 16 bytes) with sector number for decryption. // block cipher (which must have a block size of 16 bytes) with sector number for decryption.
// It follows GB/T 17964-2021. // It follows GB/T 17964-2021.
func NewGBXTSDecrypterWithSector(cipherFunc CipherCreator, key, tweakKey []byte, sectorNum uint64) (_cipher.BlockMode, error) { func NewGBXTSDecrypterWithSector(cipherFunc CipherCreator, key, tweakKey []byte, sectorNum uint64) (cipher.BlockMode, error) {
tweak := make([]byte, blockSize) tweak := make([]byte, blockSize)
byteorder.LEPutUint64(tweak[:8], sectorNum) byteorder.LEPutUint64(tweak[:8], sectorNum)
return NewGBXTSDecrypter(cipherFunc, key, tweakKey, tweak) return NewGBXTSDecrypter(cipherFunc, key, tweakKey, tweak)
} }
func newXTSDecrypter(cipherFunc CipherCreator, key, tweakKey, tweak []byte, isGB bool) (_cipher.BlockMode, error) { func newXTSDecrypter(cipherFunc CipherCreator, key, tweakKey, tweak []byte, isGB bool) (cipher.BlockMode, error) {
if len(tweak) != blockSize { if len(tweak) != blockSize {
return nil, errors.New("cipher: invalid tweak length") return nil, errors.New("cipher: invalid tweak length")
} }

View File

@ -2,11 +2,11 @@ package drbg
import ( import (
"crypto/cipher" "crypto/cipher"
"crypto/subtle"
"errors" "errors"
"time" "time"
"github.com/emmansun/gmsm/internal/byteorder" "github.com/emmansun/gmsm/internal/byteorder"
"github.com/emmansun/gmsm/internal/subtle"
"github.com/emmansun/gmsm/sm4" "github.com/emmansun/gmsm/sm4"
) )

View File

@ -7,11 +7,10 @@ package cryptotest
import ( import (
"bytes" "bytes"
"crypto/cipher" "crypto/cipher"
"crypto/subtle"
"fmt" "fmt"
"strings" "strings"
"testing" "testing"
"github.com/emmansun/gmsm/internal/subtle"
) )
// Each test is executed with each of the buffer lengths in bufLens. // Each test is executed with each of the buffer lengths in bufLens.

View File

@ -5,9 +5,9 @@ package sm4
import ( import (
"bytes" "bytes"
"crypto/cipher" "crypto/cipher"
"crypto/subtle"
"github.com/emmansun/gmsm/internal/alias" "github.com/emmansun/gmsm/internal/alias"
"github.com/emmansun/gmsm/internal/subtle"
) )
// Assert that sm4CipherAsm implements the cbcEncAble and cbcDecAble interfaces. // Assert that sm4CipherAsm implements the cbcEncAble and cbcDecAble interfaces.

View File

@ -4,9 +4,9 @@ package sm4
import ( import (
"crypto/cipher" "crypto/cipher"
"crypto/subtle"
"github.com/emmansun/gmsm/internal/alias" "github.com/emmansun/gmsm/internal/alias"
"github.com/emmansun/gmsm/internal/subtle"
) )
// Assert that sm4CipherAsm implements the ctrAble interface. // Assert that sm4CipherAsm implements the ctrAble interface.

View File

@ -4,12 +4,11 @@ package sm4
import ( import (
"crypto/cipher" "crypto/cipher"
goSubtle "crypto/subtle" "crypto/subtle"
"errors" "errors"
"github.com/emmansun/gmsm/internal/alias" "github.com/emmansun/gmsm/internal/alias"
"github.com/emmansun/gmsm/internal/byteorder" "github.com/emmansun/gmsm/internal/byteorder"
"github.com/emmansun/gmsm/internal/subtle"
) )
// Assert that sm4CipherAsm implements the gcmAble interface. // Assert that sm4CipherAsm implements the gcmAble interface.
@ -147,7 +146,7 @@ func (g *gcm) Open(dst, nonce, ciphertext, data []byte) ([]byte, error) {
panic("cipher: invalid buffer overlap") panic("cipher: invalid buffer overlap")
} }
if goSubtle.ConstantTimeCompare(expectedTag[:g.tagSize], tag) != 1 { if subtle.ConstantTimeCompare(expectedTag[:g.tagSize], tag) != 1 {
// The AESNI code decrypts and authenticates concurrently, and // The AESNI code decrypts and authenticates concurrently, and
// so overwrites dst in the event of a tag mismatch. That // so overwrites dst in the event of a tag mismatch. That
// behavior is mimicked here in order to be consistent across // behavior is mimicked here in order to be consistent across

View File

@ -8,13 +8,12 @@ package sm4
import ( import (
"crypto/cipher" "crypto/cipher"
_subtle "crypto/subtle" "crypto/subtle"
"errors" "errors"
"runtime" "runtime"
"github.com/emmansun/gmsm/internal/alias" "github.com/emmansun/gmsm/internal/alias"
"github.com/emmansun/gmsm/internal/byteorder" "github.com/emmansun/gmsm/internal/byteorder"
"github.com/emmansun/gmsm/internal/subtle"
) )
// Assert that sm4CipherAsm implements the gcmAble interface. // Assert that sm4CipherAsm implements the gcmAble interface.
@ -236,7 +235,7 @@ func (g *gcmAsm) Open(dst, nonce, ciphertext, data []byte) ([]byte, error) {
panic("cipher: invalid buffer overlap") panic("cipher: invalid buffer overlap")
} }
if _subtle.ConstantTimeCompare(expectedTag[:g.tagSize], tag) != 1 { if subtle.ConstantTimeCompare(expectedTag[:g.tagSize], tag) != 1 {
clear(out) clear(out)
return nil, errOpen return nil, errOpen
} }

View File

@ -1,9 +1,10 @@
package zuc package zuc
import ( import (
"crypto/subtle"
"github.com/emmansun/gmsm/internal/alias" "github.com/emmansun/gmsm/internal/alias"
"github.com/emmansun/gmsm/internal/byteorder" "github.com/emmansun/gmsm/internal/byteorder"
"github.com/emmansun/gmsm/internal/subtle"
) )
const ( const (

View File

@ -3,16 +3,16 @@ package sm2
import ( import (
"crypto/ecdsa" "crypto/ecdsa"
"crypto/elliptic" "crypto/elliptic"
_subtle "crypto/subtle" "crypto/subtle"
"errors" "errors"
"fmt" "fmt"
"io" "io"
"math/big" "math/big"
"strings" "strings"
"github.com/emmansun/gmsm/internal/subtle"
"github.com/emmansun/gmsm/sm2/sm2ec" "github.com/emmansun/gmsm/sm2/sm2ec"
"github.com/emmansun/gmsm/sm3" "github.com/emmansun/gmsm/sm3"
_subtle "github.com/emmansun/gmsm/internal/subtle"
"golang.org/x/crypto/cryptobyte" "golang.org/x/crypto/cryptobyte"
"golang.org/x/crypto/cryptobyte/asn1" "golang.org/x/crypto/cryptobyte/asn1"
) )
@ -260,7 +260,7 @@ func encryptLegacy(random io.Reader, pub *ecdsa.PublicKey, msg []byte, opts *Enc
//A5, calculate t=KDF(x2||y2, klen) //A5, calculate t=KDF(x2||y2, klen)
c2 := sm3.Kdf(append(bigIntToBytes(curve, x2), bigIntToBytes(curve, y2)...), msgLen) c2 := sm3.Kdf(append(bigIntToBytes(curve, x2), bigIntToBytes(curve, y2)...), msgLen)
if subtle.ConstantTimeAllZero(c2) == 1 { if _subtle.ConstantTimeAllZero(c2) == 1 {
retryCount++ retryCount++
if retryCount > maxRetryLimit { if retryCount > maxRetryLimit {
return nil, fmt.Errorf("sm2: A5, failed to calculate valid t, tried %v times", retryCount) return nil, fmt.Errorf("sm2: A5, failed to calculate valid t, tried %v times", retryCount)
@ -319,7 +319,7 @@ func rawDecrypt(priv *PrivateKey, x1, y1 *big.Int, c2, c3 []byte) ([]byte, error
x2, y2 := curve.ScalarMult(x1, y1, priv.D.Bytes()) x2, y2 := curve.ScalarMult(x1, y1, priv.D.Bytes())
msgLen := len(c2) msgLen := len(c2)
msg := sm3.Kdf(append(bigIntToBytes(curve, x2), bigIntToBytes(curve, y2)...), msgLen) msg := sm3.Kdf(append(bigIntToBytes(curve, x2), bigIntToBytes(curve, y2)...), msgLen)
if subtle.ConstantTimeAllZero(c2) == 1 { if _subtle.ConstantTimeAllZero(c2) == 1 {
return nil, ErrDecryption return nil, ErrDecryption
} }
@ -327,7 +327,7 @@ func rawDecrypt(priv *PrivateKey, x1, y1 *big.Int, c2, c3 []byte) ([]byte, error
subtle.XORBytes(msg, c2, msg) subtle.XORBytes(msg, c2, msg)
u := calculateC3(curve, x2, y2, msg) u := calculateC3(curve, x2, y2, msg)
if _subtle.ConstantTimeCompare(u, c3) == 1 { if subtle.ConstantTimeCompare(u, c3) == 1 {
return msg, nil return msg, nil
} }
return nil, ErrDecryption return nil, ErrDecryption

View File

@ -12,7 +12,7 @@ package sm2
import ( import (
"crypto" "crypto"
"crypto/ecdsa" "crypto/ecdsa"
_subtle "crypto/subtle" "crypto/subtle"
"errors" "errors"
"fmt" "fmt"
"io" "io"
@ -20,7 +20,7 @@ import (
"github.com/emmansun/gmsm/internal/bigmod" "github.com/emmansun/gmsm/internal/bigmod"
_sm2ec "github.com/emmansun/gmsm/internal/sm2ec" _sm2ec "github.com/emmansun/gmsm/internal/sm2ec"
"github.com/emmansun/gmsm/internal/subtle" _subtle "github.com/emmansun/gmsm/internal/subtle"
"github.com/emmansun/gmsm/sm3" "github.com/emmansun/gmsm/sm3"
"golang.org/x/crypto/cryptobyte" "golang.org/x/crypto/cryptobyte"
"golang.org/x/crypto/cryptobyte/asn1" "golang.org/x/crypto/cryptobyte/asn1"
@ -175,7 +175,7 @@ func encryptSM2EC(c *sm2Curve, pub *ecdsa.PublicKey, random io.Reader, msg []byt
} }
C2Bytes := C2.Bytes()[1:] C2Bytes := C2.Bytes()[1:]
c2 := sm3.Kdf(C2Bytes, len(msg)) c2 := sm3.Kdf(C2Bytes, len(msg))
if subtle.ConstantTimeAllZero(c2) == 1 { if _subtle.ConstantTimeAllZero(c2) == 1 {
retryCount++ retryCount++
if retryCount > maxRetryLimit { if retryCount > maxRetryLimit {
return nil, fmt.Errorf("sm2: A5, failed to calculate valid t, tried %v times", retryCount) return nil, fmt.Errorf("sm2: A5, failed to calculate valid t, tried %v times", retryCount)
@ -271,7 +271,7 @@ func decryptSM2EC(c *sm2Curve, priv *PrivateKey, ciphertext []byte, opts *Decryp
C2Bytes := C2.Bytes()[1:] C2Bytes := C2.Bytes()[1:]
msgLen := len(c2) msgLen := len(c2)
msg := sm3.Kdf(C2Bytes, msgLen) msg := sm3.Kdf(C2Bytes, msgLen)
if subtle.ConstantTimeAllZero(c2) == 1 { if _subtle.ConstantTimeAllZero(c2) == 1 {
return nil, ErrDecryption return nil, ErrDecryption
} }
@ -284,7 +284,7 @@ func decryptSM2EC(c *sm2Curve, priv *PrivateKey, ciphertext []byte, opts *Decryp
md.Write(C2Bytes[len(C2Bytes)/2:]) md.Write(C2Bytes[len(C2Bytes)/2:])
u := md.Sum(nil) u := md.Sum(nil)
if _subtle.ConstantTimeCompare(u, c3) == 1 { if subtle.ConstantTimeCompare(u, c3) == 1 {
return msg, nil return msg, nil
} }
return nil, ErrDecryption return nil, ErrDecryption

View File

@ -2,10 +2,10 @@ package sm9
import ( import (
"crypto/cipher" "crypto/cipher"
"crypto/subtle"
"io" "io"
_cipher "github.com/emmansun/gmsm/cipher" _cipher "github.com/emmansun/gmsm/cipher"
"github.com/emmansun/gmsm/internal/subtle"
"github.com/emmansun/gmsm/padding" "github.com/emmansun/gmsm/padding"
"github.com/emmansun/gmsm/sm4" "github.com/emmansun/gmsm/sm4"
) )