github.com/celestiaorg/celestia-node@v0.15.0-beta.1/nodebuilder/node/auth.go (about)

     1  package node
     2  
     3  import (
     4  	"crypto/rand"
     5  	"io"
     6  
     7  	"github.com/cristalhq/jwt"
     8  
     9  	"github.com/celestiaorg/celestia-node/libs/keystore"
    10  )
    11  
    12  var SecretName = keystore.KeyName("jwt-secret.jwt")
    13  
    14  // secret returns the node's JWT secret if it exists, or generates
    15  // and saves a new one if it does not.
    16  func secret(ks keystore.Keystore) (jwt.Signer, error) {
    17  	// if key already exists, use it
    18  	if pk, ok := existing(ks); ok {
    19  		return jwt.NewHS256(pk)
    20  	}
    21  	// otherwise, generate and save new priv key
    22  	sk, err := io.ReadAll(io.LimitReader(rand.Reader, 32))
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  	// save key
    27  	err = ks.Put(SecretName, keystore.PrivKey{Body: sk})
    28  	if err != nil {
    29  		return nil, err
    30  	}
    31  
    32  	return jwt.NewHS256(sk)
    33  }
    34  
    35  func existing(ks keystore.Keystore) ([]byte, bool) {
    36  	sk, err := ks.Get(SecretName)
    37  	if err != nil {
    38  		return nil, false
    39  	}
    40  	return sk.Body, true
    41  }