package main import ( "crypto/ed25519" "encoding/base64" "encoding/hex" "encoding/json" "fmt" "os" "time" ) const PublicKeyHex = "ab8287380d4f26b66b3e8067e179a2e304dcb3c4070963edd213cca9b225978f" func VerifyLicenseFile() (*LicenseData, error) { bytes, err := os.ReadFile("license.lic") if err != nil { return nil, fmt.Errorf("Keine Lizenzdatei gefunden") } var lic LicenseFile if err := json.Unmarshal(bytes, &lic); err != nil { return nil, fmt.Errorf("Lizenzdatei beschädigt") } pubBytes, _ := hex.DecodeString(PublicKeyHex) publicKey := ed25519.PublicKey(pubBytes) dataBytes, _ := json.Marshal(lic.Data) sigBytes, err := base64.StdEncoding.DecodeString(lic.Signature) if err != nil { return nil, fmt.Errorf("Signatur ungültig") } if !ed25519.Verify(publicKey, dataBytes, sigBytes) { return nil, fmt.Errorf("Lizenz-Signatur ungültig (Manipuliert?)") } expiry, err := time.Parse("2006-01-02", lic.Data.ExpiresAt) if err != nil { return nil, fmt.Errorf("Ungültiges Datumsformat") } if time.Now().After(expiry) { return &lic.Data, fmt.Errorf("Lizenz abgelaufen am %s", lic.Data.ExpiresAt) } return &lic.Data, nil } func GetCurrentLicenseStatus(db *any) LicenseStatus { lic, err := VerifyLicenseFile() status := LicenseStatus{ IsValid: err == nil, Message: "Gültig", } if err != nil { status.Message = err.Error() if lic != nil { status.SchoolName = lic.SchoolName status.ExpiresAt = lic.ExpiresAt status.MaxUsers = lic.MaxUsers } return status } status.SchoolName = lic.SchoolName status.ExpiresAt = lic.ExpiresAt status.MaxUsers = lic.MaxUsers return status }