mirror of
https://github.com/emmansun/gmsm.git
synced 2025-04-26 20:26:19 +08:00
change to use go's own XORBytes function #315
This commit is contained in:
parent
d6f18a2cbf
commit
7a5253bfb5
@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
17
cipher/bc.go
17
cipher/bc.go
@ -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")
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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 (
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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"
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user