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

     1  // Copyright 2017 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  package engine
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	"github.com/keybase/client/go/libkb"
    11  	"github.com/keybase/client/go/protocol/keybase1"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestPerUserKeyUpgrade(t *testing.T) {
    16  	tc := SetupEngineTest(t, "pukup")
    17  	defer tc.Cleanup()
    18  
    19  	tc.Tp.DisableUpgradePerUserKey = true
    20  
    21  	fu := CreateAndSignupFakeUserPaper(tc, "pukup")
    22  
    23  	checkPerUserKeyCount(&tc, 0)
    24  
    25  	tc.Tp.DisableUpgradePerUserKey = false
    26  
    27  	t.Logf("upgrade")
    28  	upgrade := func() *PerUserKeyUpgrade {
    29  		arg := &PerUserKeyUpgradeArgs{}
    30  		eng := NewPerUserKeyUpgrade(tc.G, arg)
    31  		uis := libkb.UIs{
    32  			LogUI: tc.G.UI.GetLogUI(),
    33  		}
    34  		m := NewMetaContextForTest(tc).WithUIs(uis)
    35  		err := RunEngine2(m, eng)
    36  		require.NoError(t, err)
    37  		return eng
    38  	}
    39  	require.True(t, upgrade().DidNewKey, "created key")
    40  
    41  	checkPerUserKeyCountLocal(&tc, 1)
    42  	checkPerUserKeyCount(&tc, 1)
    43  
    44  	t.Logf("revoke paper key")
    45  	revokeAnyPaperKey(tc, fu)
    46  
    47  	t.Logf("should be on gen 2")
    48  	checkPerUserKeyCountLocal(&tc, 2)
    49  	checkPerUserKeyCount(&tc, 2)
    50  
    51  	t.Logf("run the upgrade engine again. Expect an error because the user is already up.")
    52  	require.False(t, upgrade().DidNewKey, "did not create key")
    53  
    54  	t.Logf("check SignedByKID field of the PUKs")
    55  	loadArg := libkb.NewLoadUserSelfArg(tc.G).WithUID(fu.UID())
    56  	upak, _, err := tc.G.GetUPAKLoader().LoadV2(loadArg)
    57  	require.NoError(t, err)
    58  	require.Len(t, upak.Current.PerUserKeys, 2, "PUK count")
    59  	var eldest keybase1.KID
    60  	for _, dkey := range upak.Current.DeviceKeys {
    61  		if dkey.Base.IsEldest {
    62  			eldest = dkey.Base.Kid
    63  		}
    64  	}
    65  	require.True(t, eldest.IsValid(), "could not find eldest key")
    66  	require.Equal(t, eldest, upak.Current.PerUserKeys[0].SignedByKID)
    67  	require.Equal(t, eldest, upak.Current.PerUserKeys[1].SignedByKID)
    68  }
    69  
    70  func checkPerUserKeyCount(tc *libkb.TestContext, n int) {
    71  	t := tc.T
    72  	me, err := libkb.LoadMe(libkb.NewLoadUserForceArg(tc.G))
    73  	require.NoError(t, err)
    74  	require.Len(t, me.ExportToUserPlusKeys().PerUserKeys, n, "per-user-key count")
    75  }
    76  
    77  func checkPerUserKeyCountLocal(tc *libkb.TestContext, n int) {
    78  	t := tc.T
    79  	pukring, err := tc.G.GetPerUserKeyring(context.Background())
    80  	require.NoError(t, err)
    81  	hak := pukring.HasAnyKeys()
    82  	if n == 0 {
    83  		require.False(t, hak, "unexpectedly has per-user-key")
    84  	} else {
    85  		if !hak {
    86  			require.FailNow(t, "has no per-user-keys")
    87  		}
    88  		require.Equal(t, keybase1.PerUserKeyGeneration(n), pukring.CurrentGeneration(), "wrong latest per-user-key generation")
    89  	}
    90  }