github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/ephemeral/team_ek_test.go (about) 1 package ephemeral 2 3 import ( 4 "context" 5 "encoding/hex" 6 "testing" 7 8 "github.com/keybase/client/go/libkb" 9 "github.com/keybase/client/go/protocol/keybase1" 10 "github.com/keybase/client/go/teams" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func createTeam(tc libkb.TestContext) keybase1.TeamID { 15 teams.ServiceInit(tc.G) 16 17 b, err := libkb.RandBytes(4) 18 require.NoError(tc.T, err) 19 name := hex.EncodeToString(b) 20 teamID, err := teams.CreateRootTeam(context.TODO(), tc.G, name, keybase1.TeamSettings{}) 21 require.NoError(tc.T, err) 22 require.NotNil(tc.T, teamID) 23 24 return *teamID 25 } 26 27 func TestNewTeamEK(t *testing.T) { 28 tc, mctx, _ := ephemeralKeyTestSetup(t) 29 defer tc.Cleanup() 30 31 merkleRootPtr, err := tc.G.GetMerkleClient().FetchRootFromServer(mctx, libkb.EphemeralKeyMerkleFreshness) 32 require.NoError(t, err) 33 merkleRoot := *merkleRootPtr 34 35 teamID := createTeam(tc) 36 37 // Before we've published any teamEK's, fetchTeamEKStatement should return 38 // nil. 39 nilStatement, _, _, err := fetchTeamEKStatement(mctx, teamID) 40 require.NoError(t, err) 41 require.Nil(t, nilStatement) 42 43 publishedMetadata, err := publishNewTeamEK(mctx, teamID, merkleRoot, nil) 44 require.NoError(t, err) 45 46 statementPtr, _, _, err := fetchTeamEKStatement(mctx, teamID) 47 require.NoError(t, err) 48 require.NotNil(t, statementPtr) 49 statement := *statementPtr 50 currentMetadata := statement.CurrentTeamEkMetadata 51 require.Equal(t, currentMetadata, publishedMetadata) 52 require.EqualValues(t, 1, currentMetadata.Generation) 53 54 // We've stored the result in local storage 55 teamEKBoxStorage := tc.G.GetTeamEKBoxStorage() 56 maxGeneration, err := teamEKBoxStorage.MaxGeneration(mctx, teamID, false) 57 require.NoError(t, err) 58 ek, err := teamEKBoxStorage.Get(mctx, teamID, maxGeneration, nil) 59 require.NoError(t, err) 60 typ, err := ek.KeyType() 61 require.NoError(t, err) 62 require.True(t, typ.IsTeam()) 63 teamEK := ek.Team() 64 require.NoError(t, err) 65 require.Equal(t, teamEK.Metadata, publishedMetadata) 66 67 s := NewTeamEKBoxStorage(NewTeamEphemeralKeyer()) 68 // Put our storage in a bad state by deleting the maxGeneration 69 err = s.Delete(mctx, teamID, keybase1.EkGeneration(1)) 70 require.NoError(t, err) 71 72 // If we publish in a bad local state, we can successfully get the 73 // maxGeneration from the server and continue 74 publishedMetadata2, err := publishNewTeamEK(mctx, teamID, merkleRoot, nil) 75 require.NoError(t, err) 76 require.EqualValues(t, 2, publishedMetadata2.Generation) 77 } 78 79 // TODO: test cases chat verify we can detect invalid signatures and bad metadata