diff --git a/CHANGELOG.md b/CHANGELOG.md index f0b7d41..c72b991 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog: @go/crypto +## v1.5.3 (2026-06-21) +- **重构与错误堆栈支持**: + - 重构 `js_export.go`,将 `Encrypt`、`Decrypt` 等匿名函数以及 `Generate*KeyPair` 类接口改写为具名函数,并动态使用 `jsmod.MakeError` 包裹返回的 error。 + - 升级 `cast` 依赖至 v1.5.3,`encoding` 依赖至 v1.5.4,`jsmod` 依赖至 v1.5.3,`safe` 依赖至 v1.5.2,`rand` 依赖至 v1.5.3。 + ## v1.5.2 (2026-06-11) - **版本对齐**: 基础设施全局对齐 v1.5.2。 diff --git a/go.mod b/go.mod index 6a695dd..4324790 100644 --- a/go.mod +++ b/go.mod @@ -3,14 +3,14 @@ module apigo.cc/go/crypto go 1.25.0 require ( - apigo.cc/go/cast v1.5.2 - apigo.cc/go/encoding v1.5.3 - apigo.cc/go/jsmod v1.5.2 - apigo.cc/go/safe v1.5.1 + apigo.cc/go/cast v1.5.3 + apigo.cc/go/encoding v1.5.4 + apigo.cc/go/jsmod v1.5.3 + apigo.cc/go/safe v1.5.2 golang.org/x/crypto v0.52.0 ) require ( - apigo.cc/go/rand v1.5.2 + apigo.cc/go/rand v1.5.3 golang.org/x/sys v0.45.0 // indirect ) diff --git a/js_export.go b/js_export.go index 3d8b6f0..3ae4134 100644 --- a/js_export.go +++ b/js_export.go @@ -34,72 +34,152 @@ func init() { "MakeToken": MakeToken, // AES GCM (Stateless) - "Encrypt": func(data, key, iv []byte) ([]byte, error) { - s, err := NewAESGCMAndEraseKey(key, iv) - if err != nil { - return nil, err - } - return s.EncryptBytes(data) - }, - "Decrypt": func(data, key, iv []byte) ([]byte, error) { - s, err := NewAESGCMAndEraseKey(key, iv) - if err != nil { - return nil, err - } - return s.DecryptBytes(data) - }, + "Encrypt": jsEncrypt, + "Decrypt": jsDecrypt, // AES CBC (Stateless) - "EncryptCBC": func(data, key, iv []byte) ([]byte, error) { - s, err := NewAESCBCAndEraseKey(key, iv) - if err != nil { - return nil, err - } - return s.EncryptBytes(data) - }, - "DecryptCBC": func(data, key, iv []byte) ([]byte, error) { - s, err := NewAESCBCAndEraseKey(key, iv) - if err != nil { - return nil, err - } - return s.DecryptBytes(data) - }, + "EncryptCBC": jsEncryptCBC, + "DecryptCBC": jsDecryptCBC, // RSA (Stateless) - "RSAEncrypt": func(data, pubKey []byte) ([]byte, error) { - a, err := NewRSAAndEraseKey(nil, pubKey) - if err != nil { - return nil, err - } - return a.EncryptBytes(data) - }, - "RSADecrypt": func(data, privKey []byte) ([]byte, error) { - a, err := NewRSAAndEraseKey(privKey, nil) - if err != nil { - return nil, err - } - return a.DecryptBytes(data) - }, - "RSASign": func(data, privKey []byte) ([]byte, error) { - a, err := NewRSAAndEraseKey(privKey, nil) - if err != nil { - return nil, err - } - return a.Sign(data) - }, - "RSAVerify": func(data, sig, pubKey []byte) (bool, error) { - a, err := NewRSAAndEraseKey(nil, pubKey) - if err != nil { - return false, err - } - return a.Verify(data, sig) - }, + "RSAEncrypt": jsRSAEncrypt, + "RSADecrypt": jsRSADecrypt, + "RSASign": jsRSASign, + "RSAVerify": jsRSAVerify, // Key Generation - "GenerateRSAKeyPair": GenerateRSAKeyPair, - "GenerateECDSAKeyPair": GenerateECDSAKeyPair, - "GenerateEd25519KeyPair": GenerateEd25519KeyPair, - "GenerateX25519KeyPair": GenerateX25519KeyPair, + "GenerateRSAKeyPair": jsGenerateRSAKeyPair, + "GenerateECDSAKeyPair": jsGenerateECDSAKeyPair, + "GenerateEd25519KeyPair": jsGenerateEd25519KeyPair, + "GenerateX25519KeyPair": jsGenerateX25519KeyPair, "DeriveKey": DeriveKey, }) } + +func jsEncrypt(data, key, iv []byte) ([]byte, error) { + s, err := NewAESGCMAndEraseKey(key, iv) + if err != nil { + return nil, jsmod.MakeError(err) + } + res, err := s.EncryptBytes(data) + if err != nil { + return nil, jsmod.MakeError(err) + } + return res, nil +} + +func jsDecrypt(data, key, iv []byte) ([]byte, error) { + s, err := NewAESGCMAndEraseKey(key, iv) + if err != nil { + return nil, jsmod.MakeError(err) + } + res, err := s.DecryptBytes(data) + if err != nil { + return nil, jsmod.MakeError(err) + } + return res, nil +} + +func jsEncryptCBC(data, key, iv []byte) ([]byte, error) { + s, err := NewAESCBCAndEraseKey(key, iv) + if err != nil { + return nil, jsmod.MakeError(err) + } + res, err := s.EncryptBytes(data) + if err != nil { + return nil, jsmod.MakeError(err) + } + return res, nil +} + +func jsDecryptCBC(data, key, iv []byte) ([]byte, error) { + s, err := NewAESCBCAndEraseKey(key, iv) + if err != nil { + return nil, jsmod.MakeError(err) + } + res, err := s.DecryptBytes(data) + if err != nil { + return nil, jsmod.MakeError(err) + } + return res, nil +} + +func jsRSAEncrypt(data, pubKey []byte) ([]byte, error) { + a, err := NewRSAAndEraseKey(nil, pubKey) + if err != nil { + return nil, jsmod.MakeError(err) + } + res, err := a.EncryptBytes(data) + if err != nil { + return nil, jsmod.MakeError(err) + } + return res, nil +} + +func jsRSADecrypt(data, privKey []byte) ([]byte, error) { + a, err := NewRSAAndEraseKey(privKey, nil) + if err != nil { + return nil, jsmod.MakeError(err) + } + res, err := a.DecryptBytes(data) + if err != nil { + return nil, jsmod.MakeError(err) + } + return res, nil +} + +func jsRSASign(data, privKey []byte) ([]byte, error) { + a, err := NewRSAAndEraseKey(privKey, nil) + if err != nil { + return nil, jsmod.MakeError(err) + } + res, err := a.Sign(data) + if err != nil { + return nil, jsmod.MakeError(err) + } + return res, nil +} + +func jsRSAVerify(data, sig, pubKey []byte) (bool, error) { + a, err := NewRSAAndEraseKey(nil, pubKey) + if err != nil { + return false, jsmod.MakeError(err) + } + res, err := a.Verify(data, sig) + if err != nil { + return false, jsmod.MakeError(err) + } + return res, nil +} + +func jsGenerateRSAKeyPair(bitSize int) ([]byte, []byte, error) { + priv, pub, err := GenerateRSAKeyPair(bitSize) + if err != nil { + return nil, nil, jsmod.MakeError(err) + } + return priv, pub, nil +} + +func jsGenerateECDSAKeyPair(bitSize int) ([]byte, []byte, error) { + priv, pub, err := GenerateECDSAKeyPair(bitSize) + if err != nil { + return nil, nil, jsmod.MakeError(err) + } + return priv, pub, nil +} + +func jsGenerateEd25519KeyPair() ([]byte, []byte, error) { + priv, pub, err := GenerateEd25519KeyPair() + if err != nil { + return nil, nil, jsmod.MakeError(err) + } + return priv, pub, nil +} + +func jsGenerateX25519KeyPair() ([]byte, []byte, error) { + priv, pub, err := GenerateX25519KeyPair() + if err != nil { + return nil, nil, jsmod.MakeError(err) + } + return priv, pub, nil +}