You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.5 KiB
66 lines
1.5 KiB
//go:build !(js && wasm) |
|
|
|
package bbolt |
|
|
|
import ( |
|
"crypto/rand" |
|
"errors" |
|
|
|
bolt "go.etcd.io/bbolt" |
|
) |
|
|
|
const identityKey = "relay_identity_secret" |
|
|
|
// GetRelayIdentitySecret gets the relay's identity secret key. |
|
func (b *B) GetRelayIdentitySecret() (skb []byte, err error) { |
|
err = b.db.View(func(tx *bolt.Tx) error { |
|
bucket := tx.Bucket(bucketMeta) |
|
if bucket == nil { |
|
return errors.New("bbolt: meta bucket not found") |
|
} |
|
data := bucket.Get([]byte(identityKey)) |
|
if data == nil { |
|
return errors.New("bbolt: relay identity not set") |
|
} |
|
skb = make([]byte, len(data)) |
|
copy(skb, data) |
|
return nil |
|
}) |
|
return |
|
} |
|
|
|
// SetRelayIdentitySecret sets the relay's identity secret key. |
|
func (b *B) SetRelayIdentitySecret(skb []byte) error { |
|
if len(skb) != 32 { |
|
return errors.New("bbolt: invalid secret key length (must be 32 bytes)") |
|
} |
|
return b.db.Update(func(tx *bolt.Tx) error { |
|
bucket := tx.Bucket(bucketMeta) |
|
if bucket == nil { |
|
return errors.New("bbolt: meta bucket not found") |
|
} |
|
return bucket.Put([]byte(identityKey), skb) |
|
}) |
|
} |
|
|
|
// GetOrCreateRelayIdentitySecret gets or creates the relay's identity secret. |
|
func (b *B) GetOrCreateRelayIdentitySecret() (skb []byte, err error) { |
|
// Try to get existing secret |
|
skb, err = b.GetRelayIdentitySecret() |
|
if err == nil && len(skb) == 32 { |
|
return skb, nil |
|
} |
|
|
|
// Generate new secret |
|
skb = make([]byte, 32) |
|
if _, err = rand.Read(skb); err != nil { |
|
return nil, err |
|
} |
|
|
|
// Store it |
|
if err = b.SetRelayIdentitySecret(skb); err != nil { |
|
return nil, err |
|
} |
|
|
|
return skb, nil |
|
}
|
|
|