github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/libkey/interfaces.go (about) 1 // Copyright 2019 Keybase Inc. All rights reserved. 2 // Use of this source code is governed by a BSD 3 // license that can be found in the LICENSE file. 4 5 package libkey 6 7 import ( 8 "context" 9 10 "github.com/keybase/client/go/kbfs/idutil" 11 "github.com/keybase/client/go/kbfs/kbfscodec" 12 "github.com/keybase/client/go/kbfs/kbfscrypto" 13 "github.com/keybase/client/go/kbfs/kbfsmd" 14 "github.com/keybase/client/go/kbfs/tlf" 15 "github.com/keybase/client/go/kbfs/tlfhandle" 16 "github.com/keybase/client/go/protocol/keybase1" 17 ) 18 19 // KeyOps fetches server-side key halves from the key server. 20 type KeyOps interface { 21 // GetTLFCryptKeyServerHalf gets a server-side key half for a 22 // device given the key half ID. 23 GetTLFCryptKeyServerHalf(ctx context.Context, 24 serverHalfID kbfscrypto.TLFCryptKeyServerHalfID, 25 cryptPublicKey kbfscrypto.CryptPublicKey) ( 26 kbfscrypto.TLFCryptKeyServerHalf, error) 27 28 // PutTLFCryptKeyServerHalves stores a server-side key halves for a 29 // set of users and devices. 30 PutTLFCryptKeyServerHalves(ctx context.Context, 31 keyServerHalves kbfsmd.UserDeviceKeyServerHalves) error 32 33 // DeleteTLFCryptKeyServerHalf deletes a server-side key half for a 34 // device given the key half ID. 35 DeleteTLFCryptKeyServerHalf(ctx context.Context, 36 uid keybase1.UID, key kbfscrypto.CryptPublicKey, 37 serverHalfID kbfscrypto.TLFCryptKeyServerHalfID) error 38 } 39 40 // KeyServer fetches/writes server-side key halves from/to the key server. 41 type KeyServer interface { 42 // GetTLFCryptKeyServerHalf gets a server-side key half for a 43 // device given the key half ID. 44 GetTLFCryptKeyServerHalf(ctx context.Context, 45 serverHalfID kbfscrypto.TLFCryptKeyServerHalfID, 46 cryptPublicKey kbfscrypto.CryptPublicKey) ( 47 kbfscrypto.TLFCryptKeyServerHalf, error) 48 49 // PutTLFCryptKeyServerHalves stores a server-side key halves for a 50 // set of users and devices. 51 PutTLFCryptKeyServerHalves(ctx context.Context, 52 keyServerHalves kbfsmd.UserDeviceKeyServerHalves) error 53 54 // DeleteTLFCryptKeyServerHalf deletes a server-side key half for a 55 // device given the key half ID. 56 DeleteTLFCryptKeyServerHalf(ctx context.Context, 57 uid keybase1.UID, key kbfscrypto.CryptPublicKey, 58 serverHalfID kbfscrypto.TLFCryptKeyServerHalfID) error 59 60 // Shutdown is called to free any KeyServer resources. 61 Shutdown() 62 } 63 64 // KeyMetadata is an interface for something that holds key 65 // information. This is usually implemented by RootMetadata. 66 type KeyMetadata interface { 67 // TlfID returns the ID of the TLF for which this object holds 68 // key info. 69 TlfID() tlf.ID 70 71 // TypeForKeying returns the keying type for this MD. 72 TypeForKeying() tlf.KeyingType 73 74 // LatestKeyGeneration returns the most recent key generation 75 // with key data in this object, or PublicKeyGen if this TLF 76 // is public. 77 LatestKeyGeneration() kbfsmd.KeyGen 78 79 // GetTlfHandle returns the handle for the TLF. It must not 80 // return nil. 81 // 82 // TODO: Remove the need for this function in this interface, 83 // so that kbfsmd.RootMetadata can implement this interface 84 // fully. 85 GetTlfHandle() *tlfhandle.Handle 86 87 // IsWriter checks that the given user is a valid writer of the TLF 88 // right now. 89 IsWriter( 90 ctx context.Context, checker kbfsmd.TeamMembershipChecker, 91 osg idutil.OfflineStatusGetter, uid keybase1.UID, 92 verifyingKey kbfscrypto.VerifyingKey) (bool, error) 93 94 // HasKeyForUser returns whether or not the given user has 95 // keys for at least one device. Returns an error if the TLF 96 // is public. 97 HasKeyForUser(user keybase1.UID) (bool, error) 98 99 // GetTLFCryptKeyParams returns all the necessary info to 100 // construct the TLF crypt key for the given key generation, 101 // user, and device (identified by its crypt public key), or 102 // false if not found. This returns an error if the TLF is 103 // public. 104 GetTLFCryptKeyParams( 105 keyGen kbfsmd.KeyGen, user keybase1.UID, 106 key kbfscrypto.CryptPublicKey) ( 107 kbfscrypto.TLFEphemeralPublicKey, 108 kbfscrypto.EncryptedTLFCryptKeyClientHalf, 109 kbfscrypto.TLFCryptKeyServerHalfID, bool, error) 110 111 // StoresHistoricTLFCryptKeys returns whether or not history keys are 112 // symmetrically encrypted; if not, they're encrypted per-device. 113 StoresHistoricTLFCryptKeys() bool 114 115 // GetHistoricTLFCryptKey attempts to symmetrically decrypt the 116 // key at the given generation using the current generation's 117 // TLFCryptKey. 118 GetHistoricTLFCryptKey(codec kbfscodec.Codec, keyGen kbfsmd.KeyGen, 119 currentKey kbfscrypto.TLFCryptKey) ( 120 kbfscrypto.TLFCryptKey, error) 121 }