Commit a7e90556 by dliangx

测试

parent 3490b573
......@@ -22,6 +22,7 @@ func QueryPayResult(ctx context.Context, c *app.RequestContext) {
if err != nil {
resp.Head.Code = nltconst.PARAM_ERROR
resp.Head.ServiceTime = nltconst.GetNowTime()
resp.Head.ServiceSn = creq.Request.Head.ServiceSn
cresp.Response.Head = resp.Head
c.JSON(consts.StatusOK, cresp)
return
......@@ -36,6 +37,7 @@ func QueryPayResult(ctx context.Context, c *app.RequestContext) {
resp.Head.Code = nltconst.SYS_ERROR
}
resp.Head.ServiceTime = nltconst.GetNowTime()
resp.Head.ServiceSn = creq.Request.Head.ServiceSn
cresp.Response.Head = resp.Head
c.JSON(consts.StatusOK, cresp)
return
......@@ -58,7 +60,7 @@ func QueryPayResult(ctx context.Context, c *app.RequestContext) {
var count int
for rows.Next() {
count++
err := rows.Scan(&count, &resp.Response.DuebillNoOrg, &resp.Response.Status, &resp.Response.OrderTime, &resp.Response.FailMsg)
err := rows.Scan(&resp.Response.DuebillNoOrg, &resp.Response.Status, &resp.Response.OrderTime, &resp.Response.FailMsg)
if err != nil {
log.Println(err)
}
......
......@@ -11,7 +11,7 @@ import (
func TestAuthEncrypt(t *testing.T) {
var resp model.HttpBodyResp[model.AuthResp]
resp.Head.Code = "11111"
resp.Head.ServiceSn = "23555555"
resp.Head.ServiceSn = "1234567"
resp.Head.ServiceTime = nltconst.GetNowTime()
resp.Response.DirectURL = "https://baidu.com"
resp.Response.PayOrderNo = "2239999999"
......@@ -19,21 +19,3 @@ func TestAuthEncrypt(t *testing.T) {
fmt.Println(cresp)
fmt.Println(err)
}
func TestAuthDecrypt(t *testing.T) {
var resp model.HttpBodyResp[model.PayResultReq]
resp.Head.Code = "11111"
resp.Head.ServiceSn = "23555555"
resp.Head.ServiceTime = nltconst.GetNowTime()
resp.Response.DuebillNoOrg = "99999999999"
cresp, err := model.EncryptAndSign(resp)
if err != nil {
fmt.Println(err)
}
var res model.CryptHttpBodyReq
res.Request.Head.ServiceSn = cresp.Response.Head.ServiceSn
res.Request.Request = cresp.Response.Response
res.Signature = cresp.Signature
fmt.Println(res)
model.VerifyAndDecrypt[model.AuthResp](res)
}
package model
import (
"crypto"
"crypto/rand"
"encoding/base64"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"log"
"strings"
"math/big"
"github.com/tjfoc/gmsm/sm2"
"nlt.com/pf/nltconst"
......@@ -45,79 +44,104 @@ type RespHead struct {
ServiceSn string `json:"serviceSn"`
}
func hexToPrivateKey(hexPrivKey string) (*sm2.PrivateKey, error) {
// 解码Hex字符串
privKeyBytes, err := hex.DecodeString(hexPrivKey)
if err != nil {
return nil, err
}
// 创建私钥对象
privateKey := new(sm2.PrivateKey)
privateKey.PublicKey.Curve = sm2.P256Sm2()
privateKey.D = new(big.Int).SetBytes(privKeyBytes)
// 计算公钥
privateKey.PublicKey.X, privateKey.PublicKey.Y = privateKey.PublicKey.Curve.ScalarBaseMult(privKeyBytes)
// 验证私钥是否有效
if !privateKey.PublicKey.Curve.IsOnCurve(privateKey.PublicKey.X, privateKey.PublicKey.Y) {
return nil, fmt.Errorf("private key not valid")
}
return privateKey, nil
}
func EncryptAndSign[T any](resp HttpBodyResp[T]) (CryptHttpBodyResp, error) {
var cresp CryptHttpBodyResp
privateKeyBytes, _ := sm2.GenerateKey(strings.NewReader(nltconst.SM2_PRIVATE_KEY))
privateKeyBytes, _ := hexToPrivateKey(nltconst.SM2_PRIVATE_KEY)
// 对应的公钥
publicKeyBytes, err := hex.DecodeString(nltconst.BANK_PUBLIC_KEY)
privateBankey, err := hexToPrivateKey(nltconst.TEST_BANK_PRIVTE_KEY)
if err != nil {
log.Println(err.Error())
log.Println(err)
return cresp, err
}
publicKey := privateBankey.PublicKey
publicKey := sm2.Decompress(publicKeyBytes)
body, err := json.Marshal(resp.Response)
if err != nil {
log.Println(err.Error())
return cresp, err
}
ciphertext, err := sm2.Encrypt(publicKey, body, rand.Reader, sm2.C1C2C3)
ciphertext, err := publicKey.EncryptAsn1(body, rand.Reader)
if err != nil {
log.Println(err)
return cresp, err
}
cresp.Response.Head = resp.Head
cresp.Response.Response = base64.RawStdEncoding.EncodeToString(ciphertext)
cresp.Response.Response = hex.EncodeToString(ciphertext)
jsonResp, err := json.Marshal(cresp.Response)
if err != nil {
log.Println(err)
return cresp, err
}
fmt.Println(string(jsonResp))
signature, err := privateKeyBytes.Sign(rand.Reader, jsonResp, nil)
signature, err := privateKeyBytes.Sign(rand.Reader, jsonResp, crypto.BLAKE2b_256)
cresp.Signature = base64.RawStdEncoding.EncodeToString(signature)
cresp.Signature = hex.EncodeToString(signature)
fmt.Println(cresp.Signature)
return cresp, err
}
func VerifyAndDecrypt[T any](creq CryptHttpBodyReq) (HttpBodyReq[T], error) {
var req HttpBodyReq[T]
privateKeyBytes, _ := sm2.GenerateKey(strings.NewReader(nltconst.SM2_PRIVATE_KEY))
privateKeyBytes, _ := hexToPrivateKey(nltconst.SM2_PRIVATE_KEY)
// 对应的公钥
publicKeyBytes, err := hex.DecodeString(nltconst.BANK_PUBLIC_KEY)
privateBankey, err := hexToPrivateKey(nltconst.TEST_BANK_PRIVTE_KEY)
if err != nil {
log.Println(err.Error())
log.Println(err)
return req, err
}
publicKey := sm2.Decompress(publicKeyBytes)
signature, err := base64.RawStdEncoding.DecodeString(creq.Signature)
publicKey := privateBankey.PublicKey
signature, err := hex.DecodeString(creq.Signature)
if err != nil {
log.Println(err)
return req, err
}
jsonReq, err := json.Marshal(creq.Request)
fmt.Println(creq.Request)
if err != nil {
log.Println(err)
return req, err
}
if publicKey.Verify(jsonReq, signature) {
body, err := base64.RawStdEncoding.DecodeString(creq.Request.Request)
body, err := hex.DecodeString(creq.Request.Request)
if err != nil {
log.Println(err)
return req, errors.New("解密错误")
}
tx, err := sm2.Decrypt(privateKeyBytes, body, sm2.C1C2C3)
tx, err := sm2.Decrypt(privateKeyBytes, body, sm2.C1C3C2)
if err != nil {
log.Println(err)
return req, errors.New("解密错误")
}
req.Head = creq.Request.Head
err = json.Unmarshal(tx, req.Request)
err = json.Unmarshal(tx, &req.Request)
if err != nil {
log.Println(err)
return req, err
......
package nltconst
const SM2_PUBLIC_KEY = "A7CD09260A67113F988F530154AD6A70B2A4DD3E00BD27BB124E7E7051FC0C97E7AC3C5A6CB6C9BB459BEF252761AD1AE727718498CA3130D67CFC84F9B1BB1F"
const SM2_PUBLIC_KEY = "04A7CD09260A67113F988F530154AD6A70B2A4DD3E00BD27BB124E7E7051FC0C97E7AC3C5A6CB6C9BB459BEF252761AD1AE727718498CA3130D67CFC84F9B1BB1F"
const SM2_PRIVATE_KEY = "BF6CA99BC05A05C8B4F916A8C6187E5A68207A7B7D89ACC7F478B7E3AFA29454"
const BANK_PUBLIC_KEY = "0429a440e2fd06f3f0ce3c2fab61a8d1e0b13a1d78d75bac0447ce44cfa263de3525f30c5d8dc9f65120a3d5d09c0692b0e4361cb7a1894d68a6da22b0796b02b0"
// const BANK_PUBLIC_KEY = "0429a440e2fd06f3f0ce3c2fab61a8d1e0b13a1d78d75bac0447ce44cfa263de3525f30c5d8dc9f65120a3d5d09c0692b0e4361cb7a1894d68a6da22b0796b02b0"
const TEST_BANK_PRIVTE_KEY = "308a6311076aa18ec591ce0b300c6f92b1e58438d0ab0962d67b7d163b0e2f8d"
const TEST_BANK_PUBLIC_KEY = "041f41683ee8d5204958db303b16c97a912b1d2a7ee640f767001395ccfcc16c48e9e81ed2b0e540c53a0836040665ef98f2488ee4cc7e9c525d8ecc92e42d62f1"
const BANK_PUBLIC_KEY = "041f41683ee8d5204958db303b16c97a912b1d2a7ee640f767001395ccfcc16c48e9e81ed2b0e540c53a0836040665ef98f2488ee4cc7e9c525d8ecc92e42d62f1"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment