github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/contacts/resolution_notice_test.go (about) 1 // Copyright 2019 Keybase, Inc. All rights reserved. Use of 2 // this source code is governed by the included BSD license. 3 4 package contacts 5 6 import ( 7 "github.com/keybase/client/go/encrypteddb" 8 "github.com/keybase/client/go/engine" 9 "github.com/keybase/client/go/kbtest" 10 "github.com/keybase/client/go/libkb" 11 "testing" 12 13 "github.com/keybase/client/go/protocol/keybase1" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestEncryptContactResolutionForServer(t *testing.T) { 18 tc := libkb.SetupTest(t, "contacts", 2) 19 defer tc.Cleanup() 20 21 u, err := kbtest.CreateAndSignupFakeUser("t", tc.G) 22 require.NoError(t, err) 23 err = u.Login(tc.G) 24 require.NoError(t, err) 25 26 contact := ContactResolution{ 27 Description: "Jakob - (216) 555-2222", 28 ResolvedUser: keybase1.User{ 29 Uid: keybase1.UID("34"), 30 Username: "jakob223", 31 }, 32 } 33 enc, err := encryptContactBlob(tc.MetaContext(), contact) 34 require.NoError(t, err) 35 36 // Provision a new device to roll forward the PUK 37 tc2 := libkb.SetupTest(t, "contacts", 2) 38 defer tc2.Cleanup() 39 kbtest.ProvisionNewDeviceKex(&tc, &tc2, u, keybase1.DeviceTypeV2_DESKTOP) 40 41 // Require the original device can decrypt the contact 42 dec, err := DecryptContactBlob(tc.MetaContext(), enc) 43 require.NoError(t, err) 44 require.Equal(t, contact, dec) 45 46 // Require the new device can decrypt the contact 47 dec, err = DecryptContactBlob(tc2.MetaContext(), enc) 48 require.NoError(t, err) 49 require.Equal(t, contact, dec) 50 51 // Log in as a different user 52 u2, err := kbtest.CreateAndSignupFakeUser("t", tc.G) 53 require.NoError(t, err) 54 err = u2.Login(tc.G) 55 require.NoError(t, err) 56 57 // New user should not be able to decrypt contact blob 58 dec, err = DecryptContactBlob(tc.MetaContext(), enc) 59 require.Equal(t, encrypteddb.ErrDecryptionFailed, err) 60 require.NotEqual(t, contact, dec) 61 62 // Reset the user and check that they can no longer decrypt 63 kbtest.ResetAccount(tc2, u) 64 dec, err = DecryptContactBlob(tc2.MetaContext(), enc) 65 require.Error(t, err) 66 require.NotEqual(t, contact, dec) 67 } 68 69 func TestEncryptContactResolutionForServerRevokes(t *testing.T) { 70 tc := libkb.SetupTest(t, "contacts", 2) 71 defer tc.Cleanup() 72 73 u, err := kbtest.CreateAndSignupFakeUser("t", tc.G) 74 require.NoError(t, err) 75 err = u.Login(tc.G) 76 require.NoError(t, err) 77 78 contact := ContactResolution{ 79 Description: "Jakob - (216) 555-2222", 80 ResolvedUser: keybase1.User{ 81 Uid: keybase1.UID("34"), 82 Username: "jakob223", 83 }, 84 } 85 encs := make([]string, 0) 86 var enc string 87 enc, err = encryptContactBlob(tc.MetaContext(), contact) 88 encs = append(encs, enc) 89 require.NoError(t, err) 90 91 // Provision a new device 92 tc2 := libkb.SetupTest(t, "contacts", 2) 93 defer tc2.Cleanup() 94 kbtest.ProvisionNewDeviceKex(&tc, &tc2, u, keybase1.DeviceTypeV2_DESKTOP) 95 96 // Encrypt a blob from the new device 97 enc, err = encryptContactBlob(tc2.MetaContext(), contact) 98 encs = append(encs, enc) 99 require.NoError(t, err) 100 101 // Check the new device can decrypt both blobs 102 for _, enc := range encs { 103 dec, err := DecryptContactBlob(tc2.MetaContext(), enc) 104 require.NoError(t, err) 105 require.Equal(t, contact, dec) 106 } 107 108 // Provision a third device 109 tc3 := libkb.SetupTest(t, "contacts", 2) 110 defer tc3.Cleanup() 111 kbtest.ProvisionNewDeviceKex(&tc, &tc3, u, keybase1.DeviceTypeV2_DESKTOP) 112 113 // Encrypt a blob from the new device 114 enc, err = encryptContactBlob(tc3.MetaContext(), contact) 115 encs = append(encs, enc) 116 require.NoError(t, err) 117 118 // Revoke the second device 119 revokeEngine := engine.NewRevokeDeviceEngine(tc.G, engine.RevokeDeviceEngineArgs{ 120 ID: tc2.G.ActiveDevice.DeviceID(), 121 }) 122 uis := libkb.UIs{ 123 SecretUI: &libkb.TestSecretUI{}, 124 LogUI: tc.G.UI.GetLogUI(), 125 } 126 m := libkb.NewMetaContextForTest(tc).WithUIs(uis) 127 err = engine.RunEngine2(m, revokeEngine) 128 require.NoError(t, err) 129 130 // Encrypt a blob from the third device 131 enc, err = encryptContactBlob(tc3.MetaContext(), contact) 132 encs = append(encs, enc) 133 require.NoError(t, err) 134 135 // Check the first device can decrypt all the blobs 136 for _, enc := range encs { 137 dec, err := DecryptContactBlob(tc.MetaContext(), enc) 138 require.NoError(t, err) 139 require.Equal(t, contact, dec) 140 } 141 142 // Provision a fourth device 143 tc4 := libkb.SetupTest(t, "contacts", 2) 144 defer tc4.Cleanup() 145 kbtest.ProvisionNewDeviceKex(&tc, &tc4, u, keybase1.DeviceTypeV2_DESKTOP) 146 147 // Check the new device can decrypt all the blobs 148 for _, enc := range encs { 149 dec, err := DecryptContactBlob(tc4.MetaContext(), enc) 150 require.NoError(t, err) 151 require.Equal(t, contact, dec) 152 } 153 }