Compare commits

..

3 Commits

Author SHA1 Message Date
AI Engineer
cac5d5a6e2 feat(crypto): 具名化 JS 导出并动态包裹错误(by AI) 2026-06-21 10:14:12 +08:00
AI Engineer
530cd2ae03 chore: align dependencies to v1.5.2 (by AI) 2026-06-11 20:14:19 +08:00
AI Engineer
1246865620 chore: align infrastructure to v1.5.2 (by AI) 2026-06-11 18:58:50 +08:00
3 changed files with 153 additions and 65 deletions

View File

@ -1,5 +1,13 @@
# Changelog: @go/crypto # 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。
## v1.5.1 (2026-06-08) ## v1.5.1 (2026-06-08)
- **JS 对齐 & 缩写规范**: 将所有注册到 `jsmod` 的方法名统一为 PascalCase并强制将缩写如 MD5, SHA1, HMAC, RSA, AES, URL全大写。 - **JS 对齐 & 缩写规范**: 将所有注册到 `jsmod` 的方法名统一为 PascalCase并强制将缩写如 MD5, SHA1, HMAC, RSA, AES, URL全大写。
- **源码纠偏**: 修正了 `hash.go` 中错误的缩写命名(`UrlBase64` -> `URLBase64`),并同步更新了 `encoding` v1.5.2 的 API 调用。 - **源码纠偏**: 修正了 `hash.go` 中错误的缩写命名(`UrlBase64` -> `URLBase64`),并同步更新了 `encoding` v1.5.2 的 API 调用。

10
go.mod
View File

@ -3,14 +3,14 @@ module apigo.cc/go/crypto
go 1.25.0 go 1.25.0
require ( require (
apigo.cc/go/cast v1.5.0 apigo.cc/go/cast v1.5.3
apigo.cc/go/encoding v1.5.0 apigo.cc/go/encoding v1.5.4
apigo.cc/go/jsmod v1.5.0 apigo.cc/go/jsmod v1.5.3
apigo.cc/go/safe v1.5.0 apigo.cc/go/safe v1.5.2
golang.org/x/crypto v0.52.0 golang.org/x/crypto v0.52.0
) )
require ( require (
apigo.cc/go/rand v1.5.0 // indirect apigo.cc/go/rand v1.5.3
golang.org/x/sys v0.45.0 // indirect golang.org/x/sys v0.45.0 // indirect
) )

View File

@ -34,72 +34,152 @@ func init() {
"MakeToken": MakeToken, "MakeToken": MakeToken,
// AES GCM (Stateless) // AES GCM (Stateless)
"Encrypt": func(data, key, iv []byte) ([]byte, error) { "Encrypt": jsEncrypt,
s, err := NewAESGCMAndEraseKey(key, iv) "Decrypt": jsDecrypt,
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)
},
// AES CBC (Stateless) // AES CBC (Stateless)
"EncryptCBC": func(data, key, iv []byte) ([]byte, error) { "EncryptCBC": jsEncryptCBC,
s, err := NewAESCBCAndEraseKey(key, iv) "DecryptCBC": jsDecryptCBC,
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)
},
// RSA (Stateless) // RSA (Stateless)
"RSAEncrypt": func(data, pubKey []byte) ([]byte, error) { "RSAEncrypt": jsRSAEncrypt,
a, err := NewRSAAndEraseKey(nil, pubKey) "RSADecrypt": jsRSADecrypt,
if err != nil { "RSASign": jsRSASign,
return nil, err "RSAVerify": jsRSAVerify,
}
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)
},
// Key Generation // Key Generation
"GenerateRSAKeyPair": GenerateRSAKeyPair, "GenerateRSAKeyPair": jsGenerateRSAKeyPair,
"GenerateECDSAKeyPair": GenerateECDSAKeyPair, "GenerateECDSAKeyPair": jsGenerateECDSAKeyPair,
"GenerateEd25519KeyPair": GenerateEd25519KeyPair, "GenerateEd25519KeyPair": jsGenerateEd25519KeyPair,
"GenerateX25519KeyPair": GenerateX25519KeyPair, "GenerateX25519KeyPair": jsGenerateX25519KeyPair,
"DeriveKey": DeriveKey, "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
}