package model import ( "bytes" "go.yandata.net/wangsiyuan/go-trustlog/api/logger" ) // Signer 签名器接口,用于抽象不同的签名算法实现。 // 实现了此接口的类型可以提供签名和验签功能。 // // SDK 默认使用 SM2 算法(内部自动使用 SM3 哈希)。 // 可通过 SetGlobalCryptoConfig 切换到其他算法(如 Ed25519)。 type Signer interface { // Sign 对数据进行签名。 // 参数: // - data: 待签名的原始数据 // 返回: 签名字节数组和可能的错误 Sign(data []byte) ([]byte, error) // Verify 验证签名。 // 参数: // - data: 原始数据 // - signature: 签名字节数组 // // 返回: 验证是否成功和可能的错误 Verify(data, signature []byte) (bool, error) } // SM2Signer SM2签名器实现。 // 使用SM2算法进行签名和验签(内部自动使用 SM3 哈希)。 // // 这是 SDK 的默认签名算法。如需使用其他算法,请使用 ConfigSigner。 type SM2Signer struct { privateKey []byte // 私钥(DER编码格式) publicKey []byte // 公钥(DER编码格式) } // NewSM2Signer 创建新的SM2签名器。 // 这是 SDK 默认推荐的签名器,使用 SM2 算法(内部自动使用 SM3 哈希)。 // // 参数: // - privateKey: 私钥(DER编码格式),用于签名 // - publicKey: 公钥(DER编码格式),用于验签 // // 示例: // // keyPair, _ := model.GenerateSM2KeyPair() // privateKeyDER, _ := model.MarshalSM2PrivateDER(keyPair.Private) // publicKeyDER, _ := model.MarshalSM2PublicDER(keyPair.Public) // signer := model.NewSM2Signer(privateKeyDER, publicKeyDER) func NewSM2Signer(privateKey, publicKey []byte) *SM2Signer { log := logger.GetGlobalLogger() log.Debug("Creating new SM2 signer (default algorithm, uses SM3 hash)", "privateKeyLength", len(privateKey), "publicKeyLength", len(publicKey), ) return &SM2Signer{ privateKey: privateKey, publicKey: publicKey, } } // Sign 使用SM2私钥对数据进行签名(内部使用 SM3 哈希)。 func (s *SM2Signer) Sign(data []byte) ([]byte, error) { log := logger.GetGlobalLogger() log.Debug("Signing data with SM2 (using SM3 hash)", "dataLength", len(data), "privateKeyLength", len(s.privateKey), ) signature, err := ComputeSignature(data, s.privateKey) if err != nil { log.Error("Failed to sign data with SM2", "error", err, "dataLength", len(data), ) return nil, err } log.Debug("Data signed successfully with SM2", "dataLength", len(data), "signatureLength", len(signature), ) return signature, nil } // Verify 使用SM2公钥验证签名(内部使用 SM3 哈希)。 // 注意: go-crpt 库会自动使用 SM3 算法计算摘要并验证。 // 返回: 验证是否成功和可能的错误. func (s *SM2Signer) Verify(data, signature []byte) (bool, error) { log := logger.GetGlobalLogger() log.Debug("Verifying signature with SM2", "dataLength", len(data), "signatureLength", len(signature), "publicKeyLength", len(s.publicKey), ) valid, err := VerifySignature(data, s.publicKey, signature) if err != nil { log.Error("Failed to verify signature with SM2", "error", err, "dataLength", len(data), "signatureLength", len(signature), ) return false, err } if valid { log.Debug("Signature verified successfully with SM2", "dataLength", len(data), ) } else { log.Warn("Signature verification failed with SM2", "dataLength", len(data), "signatureLength", len(signature), ) } return valid, nil } // NopSigner 空操作签名器实现。 // 对原hash不做任何操作,直接返回原数据。 // 适用于不需要实际签名操作的场景,如测试或某些特殊用途。 type NopSigner struct{} // NewNopSigner 创建新的空操作签名器。 func NewNopSigner() *NopSigner { log := logger.GetGlobalLogger() log.Debug("Creating new NopSigner") return &NopSigner{} } // Sign 直接返回原数据的副本,不做任何签名操作。 func (n *NopSigner) Sign(data []byte) ([]byte, error) { log := logger.GetGlobalLogger() log.Debug("NopSigner: signing data (returning copy)", "dataLength", len(data), ) // 返回数据副本 result := make([]byte, len(data)) copy(result, data) return result, nil } // Verify 验证签名是否等于原数据。 func (n *NopSigner) Verify(data, signature []byte) (bool, error) { log := logger.GetGlobalLogger() log.Debug("NopSigner: verifying signature", "dataLength", len(data), "signatureLength", len(signature), ) valid := bytes.Equal(data, signature) if valid { log.Debug("NopSigner: signature verified successfully", "dataLength", len(data), ) } else { log.Warn("NopSigner: signature verification failed", "dataLength", len(data), "signatureLength", len(signature), ) } return valid, nil }