81a621423a
Pure-Go, stdlib-only implementation of the LIC1 wire format: - ParseKey + Verify + ParseAndVerify for offline verification - HashFingerprint helper (SHA-256, matching the daemon's contract) - LoadPublicKeyPEM for the standard PKIX-encoded Ed25519 public keys the daemon emits - Client.Validate / Client.PublicKey for online checks against a running Keysat daemon - LicensePayload struct with idiomatic Go getters (IsTrial, IsFingerprintBound, IsExpiredAt, HasEntitlement) Wire-format crosscheck against the shared tests/crosscheck/vector.json (the same file the Rust, TypeScript, Python SDKs and the daemon itself test against). All four fixtures pass — v1 legacy fingerprint-bound, v2 trial with entitlements, v2 perpetual unbound, plus end-to-end PEM-load → ParseAndVerify signature roundtrip. Confirms byte-for-byte agreement across five independent implementations. No third-party dependencies. Module path: github.com/keysat-xyz/keysat-client-go go 1.21
35 lines
1.1 KiB
Go
35 lines
1.1 KiB
Go
// Offline verification example — `go run examples/offline_verify.go`
|
|
// from the package root. Replace the embedded pubkey + license key
|
|
// with your own.
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/keysat-xyz/keysat-client-go"
|
|
)
|
|
|
|
const publicKeyPEM = `-----BEGIN PUBLIC KEY-----
|
|
MCowBQYDK2VwAyEAA6EHv/POEL4dcN0Y50vAmWfk1jCbpQ1fHdyGZBJVMbg=
|
|
-----END PUBLIC KEY-----`
|
|
|
|
const licenseKey = `LIC1-AIBW6RVE6YGS6SRIW2VD5D57N4UPBKVKVKVLXO6MZTO533XO53XO53QAAAAAAZKT6EAAAAAAABYT7MYA2NCGD73DC4G6MM5VVISRFTROCWWBECY4GJNM3LNGPQBOLFF2HM6QEA3QOJXQY3LVNR2GSLLEMV3GSY3F-QPSJIDYL6Y5TFCKXQ2SN43EDJIZIRJZCEROM2I4MJHODT6KO4KDPW6AJ3HMYJERYPD34CF2Z46PXPYFKSRZS7BDZKVKWE57UBJSTEBI`
|
|
|
|
func main() {
|
|
pub, err := keysat.LoadPublicKeyPEM(publicKeyPEM)
|
|
if err != nil {
|
|
log.Fatalf("loading public key: %v", err)
|
|
}
|
|
payload, err := keysat.ParseAndVerify(licenseKey, pub)
|
|
if err != nil {
|
|
log.Fatalf("license invalid: %v", err)
|
|
}
|
|
fmt.Printf("OK — version=%d trial=%v fingerprint_bound=%v entitlements=%v\n",
|
|
payload.Version, payload.IsTrial(), payload.IsFingerprintBound(), payload.Entitlements)
|
|
if payload.IsExpiredAt(time.Now().Unix()) {
|
|
fmt.Println("(expired)")
|
|
}
|
|
}
|