Files
2026-05-27 23:03:00 +08:00

144 lines
3.8 KiB
Go

package sm2
import (
"bytes"
"encoding/hex"
"xdx.jelly/xgcl/internal/tags"
)
func init() {
// 如果编译时指定了 -tags "gmt0028",则执行算法正确性检测。
if tags.Gmt0028 {
if !(Auditor{}).Correctness() {
panic("SM2 Correctness check failed")
}
}
}
// Auditor 算法正确性检测
type Auditor struct{}
func (a Auditor) Correctness() bool {
return a.CheckSign() && a.CheckEnc() && a.CheckKeyExchange()
}
func (a Auditor) CheckSign() bool {
var signData = struct {
e string
d string
pk string
sig string
k string
}{
"F0B43E94BA45ACCAACE692ED534382EB17E6AB5A19CE7B31F4486FDFC0D28640",
"3945208F7B2144B13F36E38AC6D39F95889393692860B51A42FB81EF4DF7C5B8",
"09F9DF311E5421A150DD7D161E4BC5C672179FAD1833FC076BB08FF356F35020CCEA490CE26775A52DC6EA718CC1AA600AED05FBF35E084A6632F6072DA9AD13",
"f5a03b0648d2c4630eeac513e1bb81a15944da3827d5b74143ac7eaceee720b3b1b6aa29df212fd8763182bc0d421ca1bb9038fd1f7f42d4840b69c485bbc1aa",
"59276E27D506861A16680F3AD9C02DCCEF3CC1FA3CDBE4CE6D54B80DEAC1BC21",
}
b, err := hex.DecodeString(signData.d)
if err != nil {
return false
}
d := NewPrivateKey()
d.SetBytes(b)
pk := NewPublicKey()
b, err = hex.DecodeString(signData.pk)
if err != nil {
return false
}
pk.SetBytes(b)
e, err := hex.DecodeString(signData.e)
if err != nil {
return false
}
k, err := hex.DecodeString(signData.k)
if err != nil {
return false
}
var sig *Signature
if sig, err = Sign(e, k, d); err != nil {
return false
}
if b, err = hex.DecodeString(signData.sig); err != nil || bytes.Compare(sig.Bytes(), b) != 0 {
return false
}
return Verify(e, pk, sig)
}
func (a Auditor) CheckEnc() bool {
var encData = struct {
d string
pk string
k string
cipher string
msg string
}{
"81987CC90CF5057C2DCAA75D1FDDCA84B24862F0CAD73C7F67349AE699B92983",
"A2C0BFFCC4B36A6064F88600C7171A67B293A03E9BBFA3C28EA2DD496D1A6EC701D29EA7C8D2AB9DC85CAA7F9E24A730CAEA8FF3670FAFD6B28D10F9531ECF50",
"26D6163FA18603EE2F3DE8936544D5DF1255A2DBEBA63AFC0D833EC449D2CB45",
"BF6CFCB8E6295DC22777376F8385C5D6AADD5E430D11E004246D6BEBF99EC5249CB9AB2F9AF688C77A1BDF9F3B0816A4EAB7F5DA22E5DACDC1C8F6E45499874E1FC32E35744161AA0FFA6C70FC811D3B66D4CACDA3C0996B54768C603C6B24E0C85CDDE8AD71A258B89DDB42DA900BCF4F18AB52D7841134CAC581D3CF7F58F7",
"C353C68EF05C4B342B377DA055D909FB1FAA4255662F3BAB8DDB3535E40BC93B",
}
b, err := hex.DecodeString(encData.d)
if err != nil {
return false
}
d := NewPrivateKey()
d.SetBytes(b)
pk := NewPublicKey()
b, err = hex.DecodeString(encData.pk)
if err != nil {
return false
}
pk.SetBytes(b)
msg, err := hex.DecodeString(encData.msg)
if err != nil {
return false
}
k, err := hex.DecodeString(encData.k)
if err != nil {
return false
}
var cipher *Cipher
b, err = hex.DecodeString(encData.cipher)
if err != nil {
return false
}
if cipher, err = Encrypt(pk, msg, k); err != nil || bytes.Compare(b, cipher.Bytes()) != 0 {
return false
}
if b, err = Decrypt(d, cipher); err != nil || bytes.Compare(b, msg) != 0 {
return false
}
return true
}
func (a Auditor) CheckKeyExchange() bool {
var keyExchangeData = struct {
// d string
// pk string
// k string
// cipher string
// msg string
}{
// "81987CC90CF5057C2DCAA75D1FDDCA84B24862F0CAD73C7F67349AE699B92983",
// "A2C0BFFCC4B36A6064F88600C7171A67B293A03E9BBFA3C28EA2DD496D1A6EC701D29EA7C8D2AB9DC85CAA7F9E24A730CAEA8FF3670FAFD6B28D10F9531ECF50",
// "26D6163FA18603EE2F3DE8936544D5DF1255A2DBEBA63AFC0D833EC449D2CB45",
// "BF6CFCB8E6295DC22777376F8385C5D6AADD5E430D11E004246D6BEBF99EC5249CB9AB2F9AF688C77A1BDF9F3B0816A4EAB7F5DA22E5DACDC1C8F6E45499874E1FC32E35744161AA0FFA6C70FC811D3B66D4CACDA3C0996B54768C603C6B24E0C85CDDE8AD71A258B89DDB42DA900BCF4F18AB52D7841134CAC581D3CF7F58F7",
// "C353C68EF05C4B342B377DA055D909FB1FAA4255662F3BAB8DDB3535E40BC93B",
}
_ = keyExchangeData
return true
}