Files
keysat-client-go/examples/offline_verify.go
T
Grant 81a621423a Initial Go SDK for Keysat licensing service
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
2026-05-08 11:17:46 -05:00

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)")
}
}