github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/ephemeral/common.go (about)

     1  package ephemeral
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/keybase/client/go/libkb"
     8  	"github.com/keybase/client/go/protocol/keybase1"
     9  )
    10  
    11  func ctimeIsStale(ctime time.Time, currentMerkleRoot libkb.MerkleRoot) bool {
    12  	return keybase1.TimeFromSeconds(currentMerkleRoot.Ctime()).Time().Sub(ctime) >= libkb.MaxEphemeralKeyStaleness
    13  }
    14  
    15  // If a teamEK is almost expired we allow it to be created in the background so
    16  // content generation is not blocked by key generation. We *cannot* create a
    17  // teamEK in the background if the key is expired however since the current
    18  // teamEK's lifetime (and supporting device/user EKs) is less than the maximum
    19  // lifetime of ephemeral content. This can result in content loss once the keys
    20  // are deleted.
    21  func backgroundKeygenPossible(ctime time.Time, currentMerkleRoot libkb.MerkleRoot) bool {
    22  	keyAge := keybase1.TimeFromSeconds(currentMerkleRoot.Ctime()).Time().Sub(ctime)
    23  	isOneHourFromExpiration := keyAge >= (libkb.EphemeralKeyGenInterval - time.Hour)
    24  	isExpired := keyAge >= libkb.EphemeralKeyGenInterval
    25  	return isOneHourFromExpiration && !isExpired
    26  }
    27  
    28  func keygenNeeded(ctime time.Time, currentMerkleRoot libkb.MerkleRoot) bool {
    29  	return keybase1.TimeFromSeconds(currentMerkleRoot.Ctime()).Time().Sub(ctime) >= libkb.EphemeralKeyGenInterval
    30  }
    31  
    32  func nextKeygenTime(ctime time.Time) time.Time {
    33  	return ctime.Add(libkb.EphemeralKeyGenInterval)
    34  }
    35  
    36  func makeNewRandomSeed() (seed keybase1.Bytes32, err error) {
    37  	bs, err := libkb.RandBytes(libkb.NaclDHKeysize)
    38  	if err != nil {
    39  		return seed, err
    40  	}
    41  	return libkb.MakeByte32(bs), nil
    42  
    43  }
    44  
    45  func deriveDHKey(k keybase1.Bytes32, reason libkb.DeriveReason) *libkb.NaclDHKeyPair {
    46  	derived, err := libkb.DeriveFromSecret(k, reason)
    47  	if err != nil {
    48  		panic("This should never fail: " + err.Error())
    49  	}
    50  	keypair, err := libkb.MakeNaclDHKeyPairFromSecret(derived)
    51  	if err != nil {
    52  		panic("This should never fail: " + err.Error())
    53  	}
    54  	return &keypair
    55  }
    56  
    57  func newEKSeedFromBytes(b []byte) (seed keybase1.Bytes32, err error) {
    58  	if len(b) != libkb.NaclDHKeysize {
    59  		err = fmt.Errorf("Wrong EkSeed len: %d != %d", len(b), libkb.NaclDHKeysize)
    60  		return seed, err
    61  	}
    62  	copy(seed[:], b)
    63  	return seed, nil
    64  }
    65  
    66  // Map generations to their creation time
    67  type keyExpiryMap map[keybase1.EkGeneration]keybase1.Time