SunLionet uses signed bundles to move seed profiles from Outside → Inside without a central API.
Implemented by crypto.go and consumed by import.go.
Wire format:
snb://v2:<base64url(wrapper_json)>
Where wrapper_json is:
{
"header": {
"magic": "SNB1",
"bundle_id": "bndl_...",
"publisher_key_id": "key-1",
"recipient_key_id": "age-x25519:<fingerprint16>" ,
"seq": 1,
"created_at": 1713100000,
"expires_at": 1713700000,
"cipher": "age-x25519",
"sig": "base64url(ed25519_signature)"
},
"ciphertext": "base64url(age_encrypted_payload_bytes)"
}
Plaintext (signed, unencrypted) bundles are also supported when explicitly allowed at generation time:
cipher = "none"recipient_key_id = "none"Signature input:
ed25519_signature = Sign( MarshalJSON(header_without_signature) || ciphertext_bytes )Bundle payload schema:
{
"schema_version": 1,
"min_agent_version": "1.0.0",
"profiles": [],
"revocations": [],
"policy_overrides": {
"cooldown_hard_fail_sec": 900,
"max_switches_per_10min": 6
},
"templates": {},
"notes": {}
}
Cipher suite recommendation:
expires_at) to reduce replay value