Skip to content
File

Blob: spec/tun/delegation.go

go39 lines
1package tun
2 
3import (
4 "crypto/sha256"
5 "encoding/base64"
6 "encoding/hex"
7 "fmt"
8 "strings"
9)
10 
11const DelegationTokenPrefix = "tg1_"
12 
13const DelegationRecordVersion = 1
14 
15const MaxDelegationsPerOwner = 128
16 
17func EncodeDelegationToken(secret [32]byte) string {
18 return DelegationTokenPrefix + base64.RawURLEncoding.EncodeToString(secret[:])
19}
20 
21func ParseDelegationToken(token string) (secret [32]byte, err error) {
22 if len(token) != 47 || !strings.HasPrefix(token, DelegationTokenPrefix) {
23 return secret, fmt.Errorf("invalid delegation token")
24 }
25 raw, err := base64.RawURLEncoding.Strict().DecodeString(token[4:])
26 if err != nil || len(raw) != len(secret) {
27 return secret, fmt.Errorf("invalid delegation token")
28 }
29 copy(secret[:], raw)
30 return secret, nil
31}
32 
33func DelegationID(secret [32]byte) string {
34 digest := sha256.Sum256(secret[:])
35 return hex.EncodeToString(digest[:])
36}
37 
38func IsDelegationID(id string) bool { return len(id) == 64 && lowerHex(id) }