From cd769ea498c08d5742b444fe6451b4c22899a317 Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期一, 08 十一月 2021 15:45:10 +0800 Subject: [PATCH] 授权文件添加通道数 --- licence.go | 211 +++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 165 insertions(+), 46 deletions(-) diff --git a/licence.go b/licence.go index ab955be..f92d706 100644 --- a/licence.go +++ b/licence.go @@ -2,86 +2,205 @@ import ( "encoding/json" - "strings" + "fmt" + "io/ioutil" + "os" "time" - - "github.com/shirou/gopsutil/cpu" - // "github.com/shirou/gopsutil/disk" - "github.com/shirou/gopsutil/host" + "errors" ) -const key = "flzxsqc,ysyhljt." +/* + 1.0.0 閲囬泦鏈哄櫒鐮�, 鎺堟潈鏃ユ湡 鐒跺悗 AES 鍔犲瘑, 鐢熸垚Licence, 绉橀挜浼氭毚闇茬粰瀹㈡埛绔� + 1.0.1 淇敼涓篟SA 闈炲绉板姞瀵�, 鍏挜寮�鏀�. 鍔犲瘑鍐呭涓簕娉ㄥ唽鐮亄鏈哄櫒鐮�+鍏徃+閭+鎵嬫満}+杩囨湡鏃堕棿+鎺堟潈鏃堕棿} + 1.0.2 淇敼Licence鏂囦欢鍐呭鏈�缁堜负AES鍔犲瘑鍚庣殑鍐呭, 鐒跺悗鍐嶇敱鍏挜瑙e瘑. 涓婁釜鐗堟湰鐨刡ug, 浠呬娇鐢ㄩ潪瀵圭О鍔犲瘑, 鐢ㄦ埛鍙互鏇挎崲鍏挜 + 1.0.3 鎺堟潈鏂囦欢娣诲姞閫氶亾鏁伴噺, 澧炲姞璇诲彇閫氶亾鏁伴噺鎺ュ彛 +*/ +type RegisterCode struct { + MachineCode string + Company string + Email string + Phone string + Version string +} type Licence struct { - MachineCode string - Expires int64 + RegCode RegisterCode + Channel int64 + Expires int64 + Timestamp int64 } const ( - ValidationErrorMalformed uint32 = iota + 1 // Licence is malformed - ValidationErrorUnverifiableHost // Licence could not be verified because of signing problems - ValidationErrorExpired // Signature validation failed + ValidationErrorDecrypt uint32 = iota + 1 // Licence is malformed + ValidationErrorUnverifiableHost // Host unauthorized + ValidationErrorExpired // Signature expired + ValidationErrorMalformed + + Version = "1.0.3" + aesKey = "www.aiotlink.com" ) -func GetMachineCode() string { - var machineCode string +func GetRegisterCode(company, email, phone string) string { + mCode := GetMachineCode() - // CPU - if cpu, err := cpu.Info(); err == nil { - for _, c := range cpu { - strings.Join([]string{machineCode, c.String()}, "-") - } - } + regCode := RegisterCode{mCode, company, email, phone, Version} - // // Disk - // if diskInfo, err := disk.Partitions(false); err == nil { - // for _, d := range diskInfo { - // diskSerialNumber := disk.GetDiskSerialNumber(d.Device) - // strings.Join([]string{machineCode, diskSerialNumber}, "-") - // } - // } + json, _ := json.Marshal(regCode) - // Host - if host, err := host.Info(); err == nil { - strings.Join([]string{machineCode, host.HostID}, "-") - } - - return GetMd5String(machineCode, true, false) + return AESEncodeStr(json, aesKey) } -func GenerateLicence(machineCode, timeOut, key string) string { +func DecryptRegisterCode(regCode string) []byte { + return AESDecodeStr(regCode, aesKey) +} + +func GenerateLicence(regCode, timeOut, privateKeyPath string, channel int64) (string, error) { timeLayout := "2006-01-02 15:04:05" //杞寲鎵�闇�妯℃澘 loc, _ := time.LoadLocation("Local") //鑾峰彇鏃跺尯 tmp, _ := time.ParseInLocation(timeLayout, timeOut, loc) - timestamp := tmp.Unix() + exp := tmp.Unix() + now := time.Now().Unix() - licence := Licence{machineCode, timestamp} + regCodeText := AESDecodeStr(regCode, aesKey) + var registerCode RegisterCode + if err := json.Unmarshal(regCodeText, ®isterCode); err != nil { + return "", err + } - json, _ := json.Marshal(licence) - return AESEncodeStr(json, key) + licence := Licence{registerCode, channel,exp, now} + json, err := json.Marshal(licence) + if err != nil { + return "", err + } + + fd, err := os.Open(privateKeyPath) + if err != nil { + fmt.Println(err) + return "", err + } + + defer fd.Close() + privateKey, err := ioutil.ReadAll(fd) + if err != nil { + fmt.Println(err) + return "", err + } + + RSA := &RSASecurity{} + if err := RSA.SetPrivateKey(privateKey); err != nil { + return "", err + } + + licenceHex, err := RSA.PriKeyENCTYPT(json) + if err != nil { + return "", err + } + + return AESEncodeStr(licenceHex, aesKey), nil } -func VerifyLicence(licenceCode string) uint32 { - decodeData := AESDecodeStr(licenceCode, key) - if decodeData == nil { - return ValidationErrorMalformed +func DecryptLicenceFile(licencePath, publicKeyPath string) ([]byte, error) { + // 璇诲彇Licence File + fdLic, err := os.Open(licencePath) + if err != nil { + return nil, err + } + defer fdLic.Close() + + licenceCode, err := ioutil.ReadAll(fdLic) + if err != nil { + return nil, err + } + + return DecryptLicence(string(licenceCode), publicKeyPath) +} + +func DecryptLicence(licenceCode, publicKeyPath string) ([]byte, error) { + // 璇诲彇鍏挜 + fdPub, err := os.Open(publicKeyPath) + if err != nil { + return nil, err + } + defer fdPub.Close() + + publicKey, err := ioutil.ReadAll(fdPub) + if err != nil { + return nil, err + } + + RSA := &RSASecurity{} + if err := RSA.SetPublicKey(publicKey); err != nil { + return nil, err + } + + licenceHex := AESDecodeStr(licenceCode, aesKey) + + return RSA.PubKeyDECRYPT(licenceHex) +} + +func VerifyLicenceFile(licencePath, publicKeyPath string) uint32 { + licenceText, err := DecryptLicenceFile(licencePath, publicKeyPath) + if err != nil { + return ValidationErrorDecrypt + } + return _verifyLicence(licenceText) +} + +func VerifyLicence(licenceCode, publicKeyPath string) uint32 { + licenceText, err := DecryptLicence(licenceCode, publicKeyPath) + if err != nil { + return ValidationErrorDecrypt + } + + return _verifyLicence(licenceText) +} + +func ReadGrantChannels(licencePath, publicKeyPath string) (int64, error) { + licenceText, err := DecryptLicenceFile(licencePath, publicKeyPath) + if err != nil { + return 0 ,err } var licence Licence + if err := json.Unmarshal(licenceText, &licence); err != nil { + return 0, err + } - if err := json.Unmarshal(decodeData, &licence); err != nil { + if _verifyLicence(licenceText) != 0 { + return 0, errors.New("Invalid licence.") + } + + return licence.Channel, nil +} + +func _verifyLicence(licenceText []byte) uint32 { + var licence Licence + var now = time.Now().Unix() + + if err := json.Unmarshal(licenceText, &licence); err != nil { return ValidationErrorMalformed } - code := GetMachineCode() - if licence.MachineCode != code { - return ValidationErrorUnverifiableHost + // 鍒ゆ柇鏄惁鍙互璇曠敤 + if licence.RegCode.MachineCode == "FFFFFFFF" { + osInstallTime := GetOSInstallationDate() + if now - osInstallTime > 60 * 60 * 24 * 30 { + return ValidationErrorExpired + } + + return 0 } - now := time.Now().Unix() + // 鍒ゆ柇杩囨湡 if now > licence.Expires { return ValidationErrorExpired } + // 鍒ゆ柇鏈哄櫒鐮� + mCode := GetMachineCode() + if licence.RegCode.MachineCode != mCode { + return ValidationErrorUnverifiableHost + } + return 0 } -- Gitblit v1.8.0