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, &registerCode); 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