@@ -26,79 +26,79 @@ #import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" #import "pbkdf2.h" -void of_pbkdf2(OFHMAC *HMAC, size_t iterations, - const unsigned char *salt, size_t saltLength, - const char *password, size_t passwordLength, - unsigned char *key, size_t keyLength, bool allowsSwappableMemory) +void +of_pbkdf2(of_pbkdf2_parameters_t param) { void *pool = objc_autoreleasePoolPush(); - size_t blocks, digestSize = HMAC.digestSize; + size_t blocks, digestSize = param.HMAC.digestSize; OFSecureData *buffer = [OFSecureData dataWithCount: digestSize - allowsSwappableMemory: allowsSwappableMemory]; + allowsSwappableMemory: param.allowsSwappableMemory]; OFSecureData *digest = [OFSecureData dataWithCount: digestSize - allowsSwappableMemory: allowsSwappableMemory]; + allowsSwappableMemory: param.allowsSwappableMemory]; unsigned char *bufferItems = buffer.mutableItems; unsigned char *digestItems = digest.mutableItems; OFSecureData *extendedSalt; unsigned char *extendedSaltItems; - if (HMAC == nil || iterations == 0 || salt == NULL || - password == NULL || key == NULL || keyLength == 0) + if (param.HMAC == nil || param.iterations == 0 || param.salt == NULL || + param.password == NULL || param.key == NULL || param.keyLength == 0) @throw [OFInvalidArgumentException exception]; - blocks = keyLength / digestSize; - if (keyLength % digestSize != 0) + blocks = param.keyLength / digestSize; + if (param.keyLength % digestSize != 0) blocks++; - if (saltLength > SIZE_MAX - 4 || blocks > UINT32_MAX) + if (param.saltLength > SIZE_MAX - 4 || blocks > UINT32_MAX) @throw [OFOutOfRangeException exception]; - extendedSalt = [OFSecureData dataWithCount: saltLength + 4 - allowsSwappableMemory: allowsSwappableMemory]; + extendedSalt = [OFSecureData + dataWithCount: param.saltLength + 4 + allowsSwappableMemory: param.allowsSwappableMemory]; extendedSaltItems = extendedSalt.mutableItems; @try { uint32_t i = OF_BSWAP32_IF_LE(1); - [HMAC setKey: password - length: passwordLength]; + [param.HMAC setKey: param.password + length: param.passwordLength]; - memcpy(extendedSaltItems, salt, saltLength); + memcpy(extendedSaltItems, param.salt, param.saltLength); - while (keyLength > 0) { + while (param.keyLength > 0) { size_t length; - memcpy(extendedSaltItems + saltLength, &i, 4); - - [HMAC reset]; - [HMAC updateWithBuffer: extendedSaltItems - length: saltLength + 4]; - memcpy(bufferItems, HMAC.digest, digestSize); - memcpy(digestItems, HMAC.digest, digestSize); - - for (size_t j = 1; j < iterations; j++) { - [HMAC reset]; - [HMAC updateWithBuffer: digestItems - length: digestSize]; - memcpy(digestItems, HMAC.digest, digestSize); + memcpy(extendedSaltItems + param.saltLength, &i, 4); + + [param.HMAC reset]; + [param.HMAC updateWithBuffer: extendedSaltItems + length: param.saltLength + 4]; + memcpy(bufferItems, param.HMAC.digest, digestSize); + memcpy(digestItems, param.HMAC.digest, digestSize); + + for (size_t j = 1; j < param.iterations; j++) { + [param.HMAC reset]; + [param.HMAC updateWithBuffer: digestItems + length: digestSize]; + memcpy(digestItems, param.HMAC.digest, + digestSize); for (size_t k = 0; k < digestSize; k++) bufferItems[k] ^= digestItems[k]; } length = digestSize; - if (length > keyLength) - length = keyLength; + if (length > param.keyLength) + length = param.keyLength; - memcpy(key, bufferItems, length); - key += length; - keyLength -= length; + memcpy(param.key, bufferItems, length); + param.key += length; + param.keyLength -= length; i = OF_BSWAP32_IF_LE(OF_BSWAP32_IF_LE(i) + 1); } } @catch (id e) { [extendedSalt zero]; @@ -105,10 +105,10 @@ [buffer zero]; [digest zero]; @throw e; } @finally { - [HMAC zero]; + [param.HMAC zero]; } objc_autoreleasePoolPop(pool); }