diff --git a/CHANGELOG.md b/CHANGELOG.md index 4904610..c8c1d96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog: @go/crypto-sm +## [v1.3.2] - 2026-05-30 + +### Added +- **JSMOD 注册**:将核心国密能力注册到 `jsmod` (注册名: `cryptoSM`)。提供 SM3, SM4 (GCM/CBC), SM2 (加密/签名) 的极简无状态 API。 + ## [v1.1.0] - 2026-05-07 ### Added diff --git a/go.mod b/go.mod index 1b38e9b..9588cef 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( apigo.cc/go/cast v1.3.3 apigo.cc/go/crypto v1.3.1 apigo.cc/go/encoding v1.3.1 + apigo.cc/go/jsmod v1.0.0 apigo.cc/go/safe v1.3.1 github.com/emmansun/gmsm v0.28.0 ) diff --git a/go.sum b/go.sum index d7bf673..e9814db 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ apigo.cc/go/crypto v1.3.1 h1:ulQ2zX9bUWirk0sEacx1Srsjs2Jow7HlZq7ED7msNcg= apigo.cc/go/crypto v1.3.1/go.mod h1:SwHlBFDPddttWgFFtzsEMla8CM/rcFy9nvdsJjW4CIs= apigo.cc/go/encoding v1.3.1 h1:y8O58KYAyulkThg1O2ji2BqjnFoSvk42sit9I3z+K7Y= apigo.cc/go/encoding v1.3.1/go.mod h1:xAJk5b83VZ31mXMTnyp0dfMoBKfT/AHDn0u+cQfojgY= +apigo.cc/go/jsmod v1.0.0 h1:lVQMq0tCno4kbHlQ3j5wzsm+v24J+bznIoHxpton0pE= +apigo.cc/go/jsmod v1.0.0/go.mod h1:bmyeZtOAP/j5am+YRnaiM89smysK24K7ebk0koFtsSw= apigo.cc/go/rand v1.3.1 h1:7FvsI6PtQ5XrWER0dTiLVo0p7GIxRidT/TBKhVy93j8= apigo.cc/go/rand v1.3.1/go.mod h1:mZ/4Soa3bk+XvDaqPWJuUe1bfEi4eThBj1XmEAuYxsk= apigo.cc/go/safe v1.3.1 h1:irTCqPAC97gGsX/Lw5AzLelDt1xXLEZIAaVhLELWe9Q= diff --git a/js_export.go b/js_export.go new file mode 100644 index 0000000..6c8df69 --- /dev/null +++ b/js_export.go @@ -0,0 +1,80 @@ +package sm + +import ( + "apigo.cc/go/jsmod" +) + +func init() { + jsmod.Register("cryptoSM", map[string]any{ + // SM3 Hash + "sm3": Sm3, + "sm3ToHex": Sm3ToHex, + "sm3ToBase64": Sm3ToBase64, + "sm3ToUrlBase64": Sm3ToUrlBase64, + + // SM4 GCM (Stateless) + "encrypt": func(data, key, iv []byte) ([]byte, error) { + s, err := NewSM4GCMAndEraseKey(key, iv) + if err != nil { + return nil, err + } + return s.EncryptBytes(data) + }, + "decrypt": func(data, key, iv []byte) ([]byte, error) { + s, err := NewSM4GCMAndEraseKey(key, iv) + if err != nil { + return nil, err + } + return s.DecryptBytes(data) + }, + + // SM4 CBC (Stateless) + "encryptCBC": func(data, key, iv []byte) ([]byte, error) { + s, err := NewSM4CBCAndEraseKey(key, iv) + if err != nil { + return nil, err + } + return s.EncryptBytes(data) + }, + "decryptCBC": func(data, key, iv []byte) ([]byte, error) { + s, err := NewSM4CBCAndEraseKey(key, iv) + if err != nil { + return nil, err + } + return s.DecryptBytes(data) + }, + + // SM2 (Stateless) + "encryptSM2": func(data, pubKey []byte) ([]byte, error) { + a, err := NewSM2AndEraseKey(nil, pubKey) + if err != nil { + return nil, err + } + return a.EncryptBytes(data) + }, + "decryptSM2": func(data, privKey []byte) ([]byte, error) { + a, err := NewSM2AndEraseKey(privKey, nil) + if err != nil { + return nil, err + } + return a.DecryptBytes(data) + }, + "signSM2": func(data, privKey []byte) ([]byte, error) { + a, err := NewSM2AndEraseKey(privKey, nil) + if err != nil { + return nil, err + } + return a.Sign(data) + }, + "verifySM2": func(data, sig, pubKey []byte) (bool, error) { + a, err := NewSM2AndEraseKey(nil, pubKey) + if err != nil { + return false, err + } + return a.Verify(data, sig) + }, + + // Key Generation + "generateSM2KeyPair": GenerateSM2KeyPair, + }) +}