mirror of
https://github.com/charlienet/go-mixed.git
synced 2025-07-18 08:32:40 +08:00
update
This commit is contained in:
110
crypto/sm2/sm2.go
Normal file
110
crypto/sm2/sm2.go
Normal file
@ -0,0 +1,110 @@
|
||||
package sm2
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"errors"
|
||||
|
||||
s "github.com/tjfoc/gmsm/sm2"
|
||||
x "github.com/tjfoc/gmsm/x509"
|
||||
)
|
||||
|
||||
var (
|
||||
defaultMode = C1C3C2
|
||||
C1C3C2 = 0
|
||||
C1C2C3 = 1
|
||||
)
|
||||
|
||||
type option func(*sm2Instance) error
|
||||
|
||||
type sm2Instance struct {
|
||||
mode int
|
||||
prk *s.PrivateKey
|
||||
puk *s.PublicKey
|
||||
}
|
||||
|
||||
func WithSm2PrivateKey(p []byte, pwd []byte) option {
|
||||
return func(so *sm2Instance) error {
|
||||
priv, err := x.ReadPrivateKeyFromPem(p, pwd)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
so.prk = priv
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func WithSm2PublicKey(p []byte) option {
|
||||
return func(so *sm2Instance) error {
|
||||
if len(p) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
pub, err := x.ReadPublicKeyFromPem(p)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
so.puk = pub
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func WithMode(mode int) option {
|
||||
return func(so *sm2Instance) error {
|
||||
so.mode = mode
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func New(opts ...option) (*sm2Instance, error) {
|
||||
o := &sm2Instance{
|
||||
mode: defaultMode,
|
||||
}
|
||||
|
||||
for _, f := range opts {
|
||||
if err := f(o); err != nil {
|
||||
return o, err
|
||||
}
|
||||
}
|
||||
|
||||
if o.prk == nil {
|
||||
priv, err := s.GenerateKey(rand.Reader)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
o.prk = priv
|
||||
}
|
||||
|
||||
if o.puk == nil {
|
||||
o.puk = &o.prk.PublicKey
|
||||
}
|
||||
|
||||
return o, nil
|
||||
}
|
||||
|
||||
func (o *sm2Instance) Encrypt(msg []byte) ([]byte, error) {
|
||||
return s.Encrypt(o.puk, msg, rand.Reader, o.mode)
|
||||
}
|
||||
|
||||
func (o *sm2Instance) Decrypt(cipherText []byte) ([]byte, error) {
|
||||
return s.Decrypt(o.prk, cipherText, o.mode)
|
||||
}
|
||||
|
||||
func (o *sm2Instance) Sign(msg []byte) ([]byte, error) {
|
||||
if o.prk == nil {
|
||||
return []byte{}, errors.New("private key is nil")
|
||||
}
|
||||
|
||||
b, e := o.prk.Sign(rand.Reader, msg, nil)
|
||||
return b, e
|
||||
}
|
||||
|
||||
func (o *sm2Instance) Verify(msg []byte, sign []byte) bool {
|
||||
if o.puk == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return o.puk.Verify(msg, sign)
|
||||
}
|
113
crypto/sm2/sm2_test.go
Normal file
113
crypto/sm2/sm2_test.go
Normal file
@ -0,0 +1,113 @@
|
||||
package sm2
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"crypto/x509"
|
||||
"encoding/hex"
|
||||
"encoding/pem"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/tjfoc/gmsm/sm2"
|
||||
x "github.com/tjfoc/gmsm/x509"
|
||||
)
|
||||
|
||||
func TestPem(t *testing.T) {
|
||||
|
||||
key, _ := sm2.GenerateKey(rand.Reader)
|
||||
|
||||
prv, _ := x.WritePrivateKeyToPem(key, []byte{})
|
||||
pub, _ := x.WritePublicKeyToPem(key.Public().(*sm2.PublicKey))
|
||||
|
||||
t.Log(x.WritePublicKeyToHex(&key.PublicKey))
|
||||
t.Log(string(prv))
|
||||
t.Log(string(pub))
|
||||
}
|
||||
|
||||
func TestNewSm2(t *testing.T) {
|
||||
o, err := New()
|
||||
t.Logf("%+v, %v", o, err)
|
||||
|
||||
t.Log(New(WithSm2PrivateKey([]byte{}, []byte{})))
|
||||
|
||||
msg := []byte("123456")
|
||||
sign, err := o.Sign(msg)
|
||||
t.Log(hex.EncodeToString(sign), err)
|
||||
|
||||
ok := o.Verify(msg, sign)
|
||||
if !ok {
|
||||
t.Fail()
|
||||
}
|
||||
t.Log(ok)
|
||||
}
|
||||
|
||||
const (
|
||||
privPem = `-----BEGIN ENCRYPTED PRIVATE KEY-----
|
||||
MIH8MFcGCSqGSIb3DQEFDTBKMCkGCSqGSIb3DQEFDDAcBAgXsd3MYu0BwwICCAAw
|
||||
DAYIKoZIhvcNAgcFADAdBglghkgBZQMEASoEEJzb8/1Aqhbv2cf777VoW0cEgaAz
|
||||
DbRJgs76YYpya9wiaZeAavSn8Ydi+CYSvvQurqa1q0Hmna/Lgcgt2Z0F3fFN/EYP
|
||||
wmDCd6SQ5hdPfQLBtkpDQdFylIHAm26O0smciB7NlfWSdgIluFacbMJ++/YHvcDp
|
||||
yl1qcRpjk+s+1+8YBUp7Mp1CXbDXdQebH9xezOE3OH8+9zO3qi5qeLEVofgRQJIY
|
||||
k8EBbLsGMy4WlSr0u29A
|
||||
-----END ENCRYPTED PRIVATE KEY-----`
|
||||
|
||||
pubPem = `-----BEGIN PUBLIC KEY-----
|
||||
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEvfHGxZL/wzWLYgPsHEpFxCCwXKSr
|
||||
XExvTJS6FAem+lQTyHwOGT+qFf67J77d5y/exn6E5br79nsJkoM/7A72nQ==
|
||||
-----END PUBLIC KEY-----`
|
||||
|
||||
badPubPem = `-----BEGIN PUBLIC KEY-----
|
||||
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE3Og1rzeSs2wO9+YFIdgnAES03u1n
|
||||
hslcifiQY8173nHtaB3R6T0PwRQTwKbpdec0dwVCpvVcdzHtivndlG0mqQ==
|
||||
-----END PUBLIC KEY-----`
|
||||
)
|
||||
|
||||
func TestPrivatePem(t *testing.T) {
|
||||
signer, err := New(
|
||||
WithSm2PrivateKey([]byte(privPem), []byte{}),
|
||||
WithSm2PublicKey([]byte(pubPem)))
|
||||
|
||||
t.Log(signer, err)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
msg := []byte("123456")
|
||||
sign, err := signer.Sign(msg)
|
||||
t.Log(hex.EncodeToString(sign), err)
|
||||
|
||||
t.Log(signer.Verify(msg, sign))
|
||||
}
|
||||
|
||||
func TestBadPublicPem(t *testing.T) {
|
||||
signer, err := New(
|
||||
WithSm2PrivateKey([]byte(privPem), []byte{}),
|
||||
WithSm2PublicKey([]byte(badPubPem)))
|
||||
|
||||
t.Log(signer, err)
|
||||
|
||||
msg := []byte("123456")
|
||||
sign, err := signer.Sign(msg)
|
||||
t.Log(hex.EncodeToString(sign), err)
|
||||
|
||||
t.Log(signer.Verify(msg, sign))
|
||||
}
|
||||
|
||||
const pemString = `-----BEGIN EC PARAMETERS-----
|
||||
BggqgRzPVQGCLQ==
|
||||
-----END EC PARAMETERS-----
|
||||
-----BEGIN EC PRIVATE KEY-----
|
||||
MHcCAQEEIAU/RPiFOw8sI+4dM/0ZusJ7dWxi72DpnOukgGNZfPP5oAoGCCqBHM9V
|
||||
AYItoUQDQgAEbl5hPO00SJnkTpNjefes6QjmOrhQTrcocBQ0V9yB3ow/COroyHIp
|
||||
MV8UROLaT5kNUim8Z6XQjL+TWrfo11JQ2w==
|
||||
-----END EC PRIVATE KEY-----`
|
||||
|
||||
func TestDecodePem(t *testing.T) {
|
||||
|
||||
block, _ := pem.Decode([]byte(pemString))
|
||||
fmt.Println(string(block.Bytes))
|
||||
|
||||
prv, err := x509.ParseECPrivateKey(block.Bytes)
|
||||
t.Log(prv, err)
|
||||
}
|
Reference in New Issue
Block a user