Fix a crash when the master key could not be computed.
This commit is contained in:
parent
e205926c8c
commit
e2d3f14fdf
@ -19,6 +19,9 @@
|
|||||||
|
|
||||||
const uint8_t *mpw_masterKeyForUser(const char *fullName, const char *masterPassword, const MPAlgorithmVersion algorithmVersion) {
|
const uint8_t *mpw_masterKeyForUser(const char *fullName, const char *masterPassword, const MPAlgorithmVersion algorithmVersion) {
|
||||||
|
|
||||||
|
if (!fullName || !masterPassword)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
switch (algorithmVersion) {
|
switch (algorithmVersion) {
|
||||||
case MPAlgorithmVersion0:
|
case MPAlgorithmVersion0:
|
||||||
return mpw_masterKeyForUser_v0( fullName, masterPassword );
|
return mpw_masterKeyForUser_v0( fullName, masterPassword );
|
||||||
@ -37,6 +40,9 @@ const uint8_t *mpw_masterKeyForUser(const char *fullName, const char *masterPass
|
|||||||
const char *mpw_passwordForSite(const uint8_t *masterKey, const char *siteName, const MPSiteType siteType, const uint32_t siteCounter,
|
const char *mpw_passwordForSite(const uint8_t *masterKey, const char *siteName, const MPSiteType siteType, const uint32_t siteCounter,
|
||||||
const MPSiteVariant siteVariant, const char *siteContext, const MPAlgorithmVersion algorithmVersion) {
|
const MPSiteVariant siteVariant, const char *siteContext, const MPAlgorithmVersion algorithmVersion) {
|
||||||
|
|
||||||
|
if (!masterKey || !siteName)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
switch (algorithmVersion) {
|
switch (algorithmVersion) {
|
||||||
case MPAlgorithmVersion0:
|
case MPAlgorithmVersion0:
|
||||||
return mpw_passwordForSite_v0( masterKey, siteName, siteType, siteCounter, siteVariant, siteContext );
|
return mpw_passwordForSite_v0( masterKey, siteName, siteType, siteCounter, siteVariant, siteContext );
|
||||||
|
@ -50,8 +50,8 @@ static NSDictionary *createKeyQuery(MPUserEntity *user, BOOL newItem, MPKeyOrigi
|
|||||||
|
|
||||||
return [PearlKeyChain createQueryForClass:kSecClassGenericPassword
|
return [PearlKeyChain createQueryForClass:kSecClassGenericPassword
|
||||||
attributes:@{
|
attributes:@{
|
||||||
(__bridge id)kSecAttrService : @"Saved Master Password",
|
(__bridge id)kSecAttrService : @"Saved Master Password",
|
||||||
(__bridge id)kSecAttrAccount : user.name?: @"",
|
(__bridge id)kSecAttrAccount : user.name?: @"",
|
||||||
#if TARGET_OS_IPHONE
|
#if TARGET_OS_IPHONE
|
||||||
(__bridge id)kSecAttrAccessible : (__bridge id)(kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly?: kSecAttrAccessibleWhenUnlockedThisDeviceOnly),
|
(__bridge id)kSecAttrAccessible : (__bridge id)(kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly?: kSecAttrAccessibleWhenUnlockedThisDeviceOnly),
|
||||||
#endif
|
#endif
|
||||||
@ -76,13 +76,14 @@ static NSDictionary *createKeyQuery(MPUserEntity *user, BOOL newItem, MPKeyOrigi
|
|||||||
- (void)storeSavedKeyFor:(MPUserEntity *)user {
|
- (void)storeSavedKeyFor:(MPUserEntity *)user {
|
||||||
|
|
||||||
if (user.saveKey) {
|
if (user.saveKey) {
|
||||||
inf( @"Saving key in keychain for user: %@", user.userID );
|
NSData *keyData = [self.key keyDataForAlgorithm:user.algorithm];
|
||||||
|
if (keyData) {
|
||||||
|
[self forgetSavedKeyFor:user];
|
||||||
|
|
||||||
[self forgetSavedKeyFor:user];
|
inf( @"Saving key in keychain for user: %@", user.userID );
|
||||||
[PearlKeyChain addOrUpdateItemForQuery:createKeyQuery( user, YES, nil )
|
[PearlKeyChain addOrUpdateItemForQuery:createKeyQuery( user, YES, nil )
|
||||||
withAttributes:@{
|
withAttributes:@{ (__bridge id)kSecValueData : keyData }];
|
||||||
(__bridge id)kSecValueData : [self.key keyDataForAlgorithm:user.algorithm],
|
}
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,9 +62,12 @@
|
|||||||
- (NSData *)keyDataForAlgorithm:(id<MPAlgorithm>)algorithm {
|
- (NSData *)keyDataForAlgorithm:(id<MPAlgorithm>)algorithm {
|
||||||
|
|
||||||
NSData *keyData = [_keyCache objectForKey:algorithm];
|
NSData *keyData = [_keyCache objectForKey:algorithm];
|
||||||
if (!keyData)
|
if (keyData)
|
||||||
[_keyCache setObject:keyData = [algorithm keyDataForFullName:self.fullName withMasterPassword:self.masterPassword]
|
return keyData;
|
||||||
forKey:algorithm];
|
|
||||||
|
keyData = [algorithm keyDataForFullName:self.fullName withMasterPassword:self.masterPassword];
|
||||||
|
if (keyData)
|
||||||
|
[_keyCache setObject:keyData forKey:algorithm];
|
||||||
|
|
||||||
return keyData;
|
return keyData;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user