add example test for drbg, zuc

This commit is contained in:
Sun Yimin 2023-02-02 15:58:31 +08:00 committed by GitHub
parent a2d54159ad
commit cb1e23a776
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 189 additions and 8 deletions

46
drbg/example_test.go Normal file
View File

@ -0,0 +1,46 @@
package drbg_test
import (
"bytes"
"fmt"
"github.com/emmansun/gmsm/drbg"
)
func ExampleNewGmCtrDrbgPrng() {
prng, err := drbg.NewGmCtrDrbgPrng(nil, 32, drbg.SECURITY_LEVEL_TEST, nil)
if err != nil {
panic(err)
}
c := 10
b := make([]byte, c)
_, err = prng.Read(b)
if err != nil {
fmt.Println("error:", err)
return
}
// The slice should now contain random bytes instead of only zeroes.
fmt.Println(bytes.Equal(b, make([]byte, c)))
// Output:
// false
}
func ExampleNewGmHashDrbgPrng() {
prng, err := drbg.NewGmHashDrbgPrng(nil, 32, drbg.SECURITY_LEVEL_TEST, nil)
if err != nil {
panic(err)
}
c := 10
b := make([]byte, c)
_, err = prng.Read(b)
if err != nil {
fmt.Println("error:", err)
return
}
// The slice should now contain random bytes instead of only zeroes.
fmt.Println(bytes.Equal(b, make([]byte, c)))
// Output:
// false
}

View File

@ -7,6 +7,11 @@ import (
"math/bits" "math/bits"
) )
const (
IVSize128 = 16
IVSize256 = 23
)
// constant D for ZUC-128 // constant D for ZUC-128
var kd = [16]uint32{ var kd = [16]uint32{
0x44D7, 0x26BC, 0x626B, 0x135E, 0x5789, 0x35E2, 0x7135, 0x09AF, 0x44D7, 0x26BC, 0x626B, 0x135E, 0x5789, 0x35E2, 0x7135, 0x09AF,
@ -181,13 +186,13 @@ func newZUCState(key, iv []byte) (*zucState32, error) {
default: default:
return nil, fmt.Errorf("zuc: invalid key size %d, we support 16/32 now", k) return nil, fmt.Errorf("zuc: invalid key size %d, we support 16/32 now", k)
case 16: // ZUC-128 case 16: // ZUC-128
if ivLen != 16 { if ivLen != IVSize128 {
return nil, fmt.Errorf("zuc: invalid iv size %d, expect 16 in bytes", ivLen) return nil, fmt.Errorf("zuc: invalid iv size %d, expect %d in bytes", ivLen, IVSize128)
} }
state.loadKeyIV16(key, iv) state.loadKeyIV16(key, iv)
case 32: // ZUC-256 case 32: // ZUC-256
if ivLen != 23 { if ivLen != IVSize256 {
return nil, fmt.Errorf("zuc: invalid iv size %d, expect 23 in bytes", ivLen) return nil, fmt.Errorf("zuc: invalid iv size %d, expect %d in bytes", ivLen, IVSize256)
} }
state.loadKeyIV32(key, iv, zuc256_d0[:]) state.loadKeyIV32(key, iv, zuc256_d0[:])
} }

View File

@ -32,8 +32,8 @@ func NewHash(key, iv []byte) (*ZUC128Mac, error) {
default: default:
return nil, fmt.Errorf("zuc/eia: invalid key size %d, expect 16 in bytes", k) return nil, fmt.Errorf("zuc/eia: invalid key size %d, expect 16 in bytes", k)
case 16: // ZUC-128 case 16: // ZUC-128
if ivLen != 16 { if ivLen != IVSize128 {
return nil, fmt.Errorf("zuc/eia: invalid iv size %d, expect 16 in bytes", ivLen) return nil, fmt.Errorf("zuc/eia: invalid iv size %d, expect %d in bytes", ivLen, IVSize128)
} }
mac.loadKeyIV16(key, iv) mac.loadKeyIV16(key, iv)
} }

View File

@ -40,8 +40,8 @@ func NewHash256(key, iv []byte, tagSize int) (*ZUC256Mac, error) {
default: default:
return nil, fmt.Errorf("zuc/eia: invalid key size %d, expect 32 in bytes", k) return nil, fmt.Errorf("zuc/eia: invalid key size %d, expect 32 in bytes", k)
case 32: // ZUC-256 case 32: // ZUC-256
if ivLen != 23 { if ivLen != IVSize256 {
return nil, fmt.Errorf("zuc/eia: invalid iv size %d, expect 23 in bytes", ivLen) return nil, fmt.Errorf("zuc/eia: invalid iv size %d, expect %d in bytes", ivLen, IVSize256)
} }
mac.loadKeyIV32(key, iv, d) mac.loadKeyIV32(key, iv, d)
} }

130
zuc/example_test.go Normal file
View File

@ -0,0 +1,130 @@
package zuc_test
import (
"crypto/rand"
"encoding/hex"
"fmt"
"io"
"github.com/emmansun/gmsm/zuc"
)
func ExampleNewCipher() {
// Load your secret key from a safe place and reuse it across multiple
// NewCipher calls. (Obviously don't use this example key for anything
// real.) If you want to convert a passphrase to a key, use a suitable
// package like bcrypt or scrypt.
key, _ := hex.DecodeString("6368616e676520746869732070617373")
plaintext := []byte("some plaintext")
const ivSize = zuc.IVSize128
// The IV needs to be unique, but not secure. Therefore it's common to
// include it at the beginning of the ciphertext.
ciphertext := make([]byte, ivSize+len(plaintext))
iv := ciphertext[:ivSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
panic(err)
}
stream, err := zuc.NewCipher(key, iv)
if err != nil {
panic(err)
}
stream.XORKeyStream(ciphertext[ivSize:], plaintext)
// It's important to remember that ciphertexts must be authenticated
// (i.e. by using crypto/hmac) as well as being encrypted in order to
// be secure.
// Stream cipher is the same for both encryption and decryption, so we can
// also decrypt that ciphertext with NewCTR.
plaintext2 := make([]byte, len(plaintext))
stream, err = zuc.NewCipher(key, iv)
if err != nil {
panic(err)
}
stream.XORKeyStream(plaintext2, ciphertext[ivSize:])
fmt.Printf("%s\n", plaintext2)
// Output: some plaintext
}
func ExampleNewCipher_zuc256() {
// Load your secret key from a safe place and reuse it across multiple
// NewCipher calls. (Obviously don't use this example key for anything
// real.) If you want to convert a passphrase to a key, use a suitable
// package like bcrypt or scrypt.
key, _ := hex.DecodeString("6368616e6765207468697320706173736368616e676520746869732070617373")
plaintext := []byte("some plaintext")
const ivSize = zuc.IVSize256
// The IV needs to be unique, but not secure. Therefore it's common to
// include it at the beginning of the ciphertext.
ciphertext := make([]byte, ivSize+len(plaintext))
iv := ciphertext[:ivSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
panic(err)
}
stream, err := zuc.NewCipher(key, iv)
if err != nil {
panic(err)
}
stream.XORKeyStream(ciphertext[ivSize:], plaintext)
// It's important to remember that ciphertexts must be authenticated
// (i.e. by using crypto/hmac) as well as being encrypted in order to
// be secure.
// Stream cipher is the same for both encryption and decryption, so we can
// also decrypt that ciphertext with NewCTR.
plaintext2 := make([]byte, len(plaintext))
stream, err = zuc.NewCipher(key, iv)
if err != nil {
panic(err)
}
stream.XORKeyStream(plaintext2, ciphertext[ivSize:])
fmt.Printf("%s\n", plaintext2)
// Output: some plaintext
}
func ExampleNewHash() {
// Load your secret key from a safe place and reuse it across multiple
// NewCipher calls. (Obviously don't use this example key for anything
// real.) If you want to convert a passphrase to a key, use a suitable
// package like bcrypt or scrypt.
key, _ := hex.DecodeString("6368616e676520746869732070617373")
// iv should be generated randomly
iv, _ := hex.DecodeString("6368616e676520746869732070617373")
h, err := zuc.NewHash(key, iv)
if err != nil {
panic(err)
}
h.Write([]byte("hello world\n"))
fmt.Printf("%x", h.Sum(nil))
// Output: c43cd26a
}
func ExampleNewHash256_tagSize4() {
// Load your secret key from a safe place and reuse it across multiple
// NewCipher calls. (Obviously don't use this example key for anything
// real.) If you want to convert a passphrase to a key, use a suitable
// package like bcrypt or scrypt.
key, _ := hex.DecodeString("6368616e6765207468697320706173736368616e676520746869732070617373")
// iv should be generated randomly
iv, _ := hex.DecodeString("6368616e6765207468697320706173736368616e676520")
h, err := zuc.NewHash256(key, iv, 4)
if err != nil {
panic(err)
}
h.Write([]byte("hello world\n"))
fmt.Printf("%x", h.Sum(nil))
// Output: b76f96ed
}