1
1
import { base64 } from 'rfc4648' ;
2
2
import backend , { DeviceDto , UserDto } from './backend' ;
3
3
import { BrowserKeys , UserKeys } from './crypto' ;
4
+ import { JWEParser } from './jwe' ;
4
5
5
6
class UserData {
6
7
@@ -56,10 +57,7 @@ class UserData {
56
57
const ecdhPublicKey = base64 . parse ( me . ecdhPublicKey ) ;
57
58
const ecdsaPublicKey = me . ecdsaPublicKey ? base64 . parse ( me . ecdsaPublicKey ) : undefined ;
58
59
const userKeys = await UserKeys . recover ( me . privateKey , setupCode , ecdhPublicKey , ecdsaPublicKey ) ;
59
- if ( ! me . ecdsaPublicKey ) { // Update user, if ECDSA key was missing before (added in 1.4.0)
60
- me . ecdsaPublicKey = await userKeys . encodedEcdsaPublicKey ( ) ;
61
- await backend . users . putMe ( me ) ;
62
- }
60
+ await this . addEcdsaKeyIfMissing ( userKeys ) ;
63
61
return userKeys ;
64
62
}
65
63
@@ -79,11 +77,26 @@ class UserData {
79
77
const ecdhPublicKey = base64 . parse ( me . ecdhPublicKey ) ;
80
78
const ecdsaPublicKey = me . ecdsaPublicKey ? base64 . parse ( me . ecdsaPublicKey ) : undefined ;
81
79
const userKeys = await UserKeys . decryptOnBrowser ( browser . userPrivateKey , browserKeys . keyPair . privateKey , ecdhPublicKey , ecdsaPublicKey ) ;
82
- if ( ! me . ecdsaPublicKey ) { // Update user, if ECDSA key was missing before (added in 1.4.0)
80
+ await this . addEcdsaKeyIfMissing ( userKeys ) ;
81
+ return userKeys ;
82
+ }
83
+
84
+ /**
85
+ * Updates the stored user keys, if the ECDSA key was missing before (added in 1.4.0)
86
+ * @param userKeys The user keys that contain the ECDSA key
87
+ */
88
+ private async addEcdsaKeyIfMissing ( userKeys : UserKeys ) {
89
+ const me = await this . me ;
90
+ if ( me . setupCode && ! me . ecdsaPublicKey ) {
91
+ const payload : { setupCode : string } = await JWEParser . parse ( me . setupCode ) . decryptEcdhEs ( userKeys . ecdhKeyPair . privateKey ) ;
83
92
me . ecdsaPublicKey = await userKeys . encodedEcdsaPublicKey ( ) ;
84
- await backend . users . putMe ( me ) ;
93
+ me . privateKey = await userKeys . encryptWithSetupCode ( payload . setupCode ) ;
94
+ await backend . users . putMe ( me ) ; // TODO: update user and devices in single transaction!
95
+ for ( let device of me . devices ) {
96
+ device . userPrivateKey = await userKeys . encryptForDevice ( base64 . parse ( device . publicKey ) ) ;
97
+ await backend . devices . putDevice ( device ) ; // TODO: update user and devices in single transaction!
98
+ }
85
99
}
86
- return userKeys ;
87
100
}
88
101
89
102
}
0 commit comments