52 lines
1.5 KiB
Objective-C
52 lines
1.5 KiB
Objective-C
//
|
|
// NAScrypt.m
|
|
// NAChloride
|
|
//
|
|
// Created by Gabriel on 6/19/14.
|
|
// Copyright (c) 2014 Gabriel Handford. All rights reserved.
|
|
//
|
|
|
|
#import "NAScrypt.h"
|
|
#import "NAInterface.h"
|
|
|
|
#import "sodium.h"
|
|
|
|
@implementation NAScrypt
|
|
|
|
+ (void)initialize { NAChlorideInit(); }
|
|
|
|
+ (NSData *)scrypt:(NSData *)password salt:(NSData *)salt error:(NSError **)error {
|
|
if (!salt || [salt length] != NAScryptSaltSize) {
|
|
if (error) *error = NAError(NAErrorCodeInvalidSalt, @"Invalid salt")
|
|
return nil;
|
|
}
|
|
|
|
NSMutableData *key = [NSMutableData dataWithLength:crypto_box_SEEDBYTES];
|
|
|
|
int retval = crypto_pwhash_scryptsalsa208sha256([key mutableBytes], key.length, password.bytes, password.length, salt.bytes, crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE, crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE);
|
|
|
|
if (retval != 0) {
|
|
if (error) *error = NAError(NAErrorCodeFailure, @"Scrypt failed");
|
|
return nil;
|
|
}
|
|
|
|
return key;
|
|
}
|
|
|
|
+ (NSData *)scrypt:(NSData *)password salt:(NSData *)salt N:(uint64_t)N r:(uint32_t)r p:(uint32_t)p length:(size_t)length error:(NSError **)error {
|
|
NSMutableData *outData = [NSMutableData dataWithLength:length];
|
|
|
|
int retval = crypto_pwhash_scryptsalsa208sha256_ll((uint8_t *)password.bytes, password.length, (uint8_t *)salt.bytes, salt.length, N, r, p, [outData mutableBytes], outData.length);
|
|
|
|
if (retval != 0) {
|
|
if (error) *error = NAError(NAErrorCodeFailure, @"Scrypt failed");
|
|
return nil;
|
|
}
|
|
|
|
NSAssert([outData length] == length, @"Mismatched output length");
|
|
|
|
return outData;
|
|
}
|
|
|
|
@end
|