@@ -2,7 +2,7 @@ import o from "../../../../../packages/otest/dist/otest.js"
2
2
import { UserFacade } from "../../../../../src/common/api/worker/facades/UserFacade.js"
3
3
import { EntityClient } from "../../../../../src/common/api/common/EntityClient.js"
4
4
import { IServiceExecutor } from "../../../../../src/common/api/common/ServiceRequest.js"
5
- import { KeyLoaderFacade } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js"
5
+ import { checkKeyVersionConstraints , KeyLoaderFacade } from "../../../../../src/common/api/worker/facades/KeyLoaderFacade.js"
6
6
import { CacheManagementFacade } from "../../../../../src/common/api/worker/facades/lazy/CacheManagementFacade.js"
7
7
import { AsymmetricCryptoFacade } from "../../../../../src/common/api/worker/crypto/AsymmetricCryptoFacade.js"
8
8
import { matchers , object , verify , when } from "testdouble"
@@ -75,13 +75,15 @@ o.spec("IdentityKeyCreatorTest", function () {
75
75
76
76
o . spec ( "Create identity key pair" , function ( ) {
77
77
const userGroupId = "userGroupId"
78
- const userGroupKey : VersionedKey = { version : 1 , object : object ( ) }
78
+ const currentUserGroupKeyVersion = 1
79
+ const userGroupKey : VersionedKey = { version : currentUserGroupKeyVersion , object : object ( ) }
79
80
const identityKeyPair : Ed25519KeyPair = { public_key : object ( ) , private_key : object ( ) }
80
81
const encodedPubIdentityKey : Uint8Array = object ( )
81
82
const encryptedPrivateIdentityKey : VersionedEncryptedKey = {
82
83
encryptingKeyVersion : userGroupKey . version ,
83
84
key : object ( ) ,
84
85
}
86
+ const userGroupKeyPair : Versioned < AsymmetricKeyPair > = object ( )
85
87
const identityKeyVersion = 0
86
88
const tag : MacTag = object ( )
87
89
@@ -97,6 +99,7 @@ o.spec("IdentityKeyCreatorTest", function () {
97
99
const userGroup : Group = object ( )
98
100
userGroup . currentKeys = object ( )
99
101
userGroup . groupKeyVersion = "1"
102
+ const publicKeySignature : PublicKeySignature = object ( )
100
103
101
104
o . beforeEach ( function ( ) {
102
105
when ( cryptoWrapper . ed25519PublicKeyToBytes ( identityKeyPair . public_key ) ) . thenReturn ( encodedPubIdentityKey )
@@ -120,17 +123,24 @@ o.spec("IdentityKeyCreatorTest", function () {
120
123
) . thenReturn ( tag )
121
124
122
125
when ( entityClient . load ( GroupTypeRef , userGroupId ) ) . thenResolve ( userGroup )
126
+ when (
127
+ publicKeySignatureFacade . signPublicKey ( userGroupKeyPair , {
128
+ object : identityKeyPair . private_key ,
129
+ version : identityKeyVersion ,
130
+ } ) ,
131
+ ) . thenResolve ( publicKeySignature )
123
132
} )
124
133
125
134
o ( "success internal user" , async function ( ) {
126
- await identityKeyCreator . createIdentityKeyPair ( userGroupId , object ( ) , [ ] )
135
+ await identityKeyCreator . createIdentityKeyPair ( userGroupId , userGroupKeyPair , [ ] )
127
136
128
137
verify (
129
138
serviceExecutor . post (
130
139
IdentityKeyService ,
131
140
argThat ( ( data : IdentityKeyPostIn ) => {
132
141
const identityKeyPairFromRequest = data . identityKeyPair
133
142
const keyMacFromRequest = identityKeyPairFromRequest . publicKeyMac
143
+ const signaturesFromRequest = data . signatures
134
144
o ( identityKeyPairFromRequest . identityKeyVersion ) . equals ( identityKeyVersion . toString ( ) )
135
145
o ( identityKeyPairFromRequest . encryptingKeyVersion ) . equals ( encryptedPrivateIdentityKey . encryptingKeyVersion . toString ( ) )
136
146
o ( identityKeyPairFromRequest . privateEd25519Key ) . equals ( encryptedPrivateIdentityKey . key )
@@ -139,6 +149,8 @@ o.spec("IdentityKeyCreatorTest", function () {
139
149
o ( keyMacFromRequest . taggedKeyVersion ) . equals ( identityKeyVersion . toString ( ) )
140
150
o ( keyMacFromRequest . taggingKeyVersion ) . equals ( userGroupKey . version . toString ( ) )
141
151
o ( keyMacFromRequest . taggingGroup ) . equals ( userGroupId )
152
+ o ( signaturesFromRequest . length ) . equals ( 1 )
153
+ o ( signaturesFromRequest [ 0 ] ) . equals ( publicKeySignature )
142
154
143
155
return true
144
156
} ) ,
@@ -157,14 +169,15 @@ o.spec("IdentityKeyCreatorTest", function () {
157
169
admin : adminGroupId ,
158
170
} ) ,
159
171
)
160
- await identityKeyCreator . createIdentityKeyPair ( userGroupId , object ( ) , [ ] )
172
+ await identityKeyCreator . createIdentityKeyPair ( userGroupId , userGroupKeyPair , [ ] )
161
173
162
174
verify (
163
175
serviceExecutor . post (
164
176
IdentityKeyService ,
165
177
argThat ( ( data : IdentityKeyPostIn ) => {
166
178
const identityKeyPairFromRequest = data . identityKeyPair
167
179
const keyMacFromRequest = identityKeyPairFromRequest . publicKeyMac
180
+ const signaturesFromRequest = data . signatures
168
181
o ( identityKeyPairFromRequest . identityKeyVersion ) . equals ( identityKeyVersion . toString ( ) )
169
182
o ( identityKeyPairFromRequest . encryptingKeyVersion ) . equals ( encryptedPrivateIdentityKey . encryptingKeyVersion . toString ( ) )
170
183
o ( identityKeyPairFromRequest . privateEd25519Key ) . equals ( encryptedPrivateIdentityKey . key )
@@ -173,6 +186,8 @@ o.spec("IdentityKeyCreatorTest", function () {
173
186
o ( keyMacFromRequest . taggedKeyVersion ) . equals ( identityKeyVersion . toString ( ) )
174
187
o ( keyMacFromRequest . taggingKeyVersion ) . equals ( userGroupKey . version . toString ( ) )
175
188
o ( keyMacFromRequest . taggingGroup ) . equals ( userGroupId )
189
+ o ( signaturesFromRequest . length ) . equals ( 1 )
190
+ o ( signaturesFromRequest [ 0 ] ) . equals ( publicKeySignature )
176
191
177
192
return true
178
193
} ) ,
@@ -193,14 +208,15 @@ o.spec("IdentityKeyCreatorTest", function () {
193
208
admin : adminGroupId ,
194
209
} ) ,
195
210
)
196
- await identityKeyCreator . createIdentityKeyPair ( userGroupId , object ( ) , [ ] , adminGroupKey )
211
+ await identityKeyCreator . createIdentityKeyPair ( userGroupId , userGroupKeyPair , [ ] , adminGroupKey )
197
212
198
213
verify (
199
214
serviceExecutor . post (
200
215
IdentityKeyService ,
201
216
argThat ( ( data : IdentityKeyPostIn ) => {
202
217
const identityKeyPairFromRequest = data . identityKeyPair
203
218
const keyMacFromRequest = identityKeyPairFromRequest . publicKeyMac
219
+ const signaturesFromRequest = data . signatures
204
220
o ( identityKeyPairFromRequest . identityKeyVersion ) . equals ( identityKeyVersion . toString ( ) )
205
221
o ( identityKeyPairFromRequest . encryptingKeyVersion ) . equals ( adminEncPrivateKey . encryptingKeyVersion . toString ( ) )
206
222
o ( identityKeyPairFromRequest . privateEd25519Key ) . equals ( adminEncPrivateKey . key )
@@ -209,12 +225,58 @@ o.spec("IdentityKeyCreatorTest", function () {
209
225
o ( keyMacFromRequest . taggedKeyVersion ) . equals ( identityKeyVersion . toString ( ) )
210
226
o ( keyMacFromRequest . taggingKeyVersion ) . equals ( userGroupKey . version . toString ( ) )
211
227
o ( keyMacFromRequest . taggingGroup ) . equals ( userGroupId )
228
+ o ( signaturesFromRequest . length ) . equals ( 1 )
229
+ o ( signaturesFromRequest [ 0 ] ) . equals ( publicKeySignature )
212
230
return true
213
231
} ) ,
214
232
) ,
215
233
)
216
234
} )
217
235
236
+ o . spec ( "createIdentityKeyPairForExistingUser" , function ( ) {
237
+ const currentUserGroupKeyPair : Versioned < AsymmetricKeyPair > = {
238
+ object : object ( ) ,
239
+ version : currentUserGroupKeyVersion ,
240
+ }
241
+ o . beforeEach ( function ( ) {
242
+ when ( userFacade . getUserGroupId ( ) ) . thenReturn ( userGroupId )
243
+ when ( keyLoaderFacade . loadCurrentKeyPair ( userGroupId ) ) . thenResolve ( currentUserGroupKeyPair )
244
+ when ( cacheManagementFacade . reloadGroup ( userGroupId ) ) . thenResolve ( userGroup )
245
+ } )
246
+
247
+ o ( "success no former group keys" , async function ( ) {
248
+ when ( keyLoaderFacade . loadAllFormerKeyPairs ( userGroup ) ) . thenResolve ( [ ] )
249
+ await identityKeyCreator . createIdentityKeyPairForExistingUsers ( )
250
+ verify ( asymmetricCryptoFacade . getOrMakeSenderX25519KeyPair ( currentUserGroupKeyPair . object , userGroupId ) )
251
+ } )
252
+ o ( "success former group keys" , async function ( ) {
253
+ const formerGroupKeyPair : Versioned < AsymmetricKeyPair > = {
254
+ object : object ( ) ,
255
+ version : checkKeyVersionConstraints ( currentUserGroupKeyVersion - 1 ) ,
256
+ }
257
+ const formerGroupKeyPairSignature : PublicKeySignature = object ( )
258
+ when (
259
+ publicKeySignatureFacade . signPublicKey ( formerGroupKeyPair , {
260
+ object : identityKeyPair . private_key ,
261
+ version : identityKeyVersion ,
262
+ } ) ,
263
+ ) . thenResolve ( formerGroupKeyPairSignature )
264
+ when ( keyLoaderFacade . loadAllFormerKeyPairs ( userGroup ) ) . thenResolve ( [ formerGroupKeyPair ] )
265
+ await identityKeyCreator . createIdentityKeyPairForExistingUsers ( )
266
+ verify ( asymmetricCryptoFacade . getOrMakeSenderX25519KeyPair ( currentUserGroupKeyPair . object , userGroupId ) )
267
+ verify (
268
+ serviceExecutor . post (
269
+ IdentityKeyService ,
270
+ argThat ( ( data : IdentityKeyPostIn ) => {
271
+ o ( data . signatures . length ) . equals ( 2 )
272
+ o ( data . signatures [ 1 ] ) . equals ( formerGroupKeyPairSignature )
273
+ return true
274
+ } ) ,
275
+ ) ,
276
+ )
277
+ } )
278
+ } )
279
+
218
280
o . spec ( "createIdentityKeyPairForExistingTeamGroups" , function ( ) {
219
281
const teamGroupId1 = "teamGroupId1"
220
282
const teamGroupId2 = "teamGroupId2"
0 commit comments