session-ios/Signal/src/crypto/EvpMessageDigest.m

53 lines
1.8 KiB
Objective-C

#import "EvpMessageDigest.h"
#import <evp.h>
#import <hmac.h>
#import "Constraints.h"
#import "EvpUtil.h"
#import "NumberUtil.h"
@implementation EvpMessageDigest
+(NSData*) hash:(NSData*) data withDigest:(const EVP_MD*) digest {
NSUInteger expectedDigestLength = [NumberUtil assertConvertIntToNSUInteger:EVP_MD_size(digest)];
unsigned int digestLength = 0;
unsigned char digestBuffer[expectedDigestLength];
EVP_MD_CTX* ctx = EVP_MD_CTX_create();
require(NULL != ctx);
@try {
RAISE_EXCEPTION_ON_FAILURE(EVP_DigestInit_ex(ctx, digest, NULL));
RAISE_EXCEPTION_ON_FAILURE(EVP_DigestUpdate(ctx, data.bytes, data.length));
RAISE_EXCEPTION_ON_FAILURE(EVP_DigestFinal_ex(ctx, digestBuffer, &digestLength));
}
@finally {
EVP_MD_CTX_destroy(ctx);
}
require(digestLength == expectedDigestLength);
return [NSData dataWithBytes:digestBuffer length:digestLength];
}
+(NSData*) hmacWithData:(NSData*) data andKey:(NSData*) key andDigest:(const EVP_MD*) md{
NSUInteger digestLength = [NumberUtil assertConvertIntToNSUInteger:EVP_MD_size(md)];
unsigned char* digest = HMAC(md,
[key bytes], [NumberUtil assertConvertNSUIntegerToInt:key.length],
[data bytes], data.length,
NULL, NULL);
return [NSData dataWithBytes:digest length:digestLength];
}
+(NSData*) hashWithSha256:(NSData *)data {
return [self hash:data withDigest:EVP_sha256()];
}
+(NSData*) hmacUsingSha1Data:(NSData*) data withKey:(NSData*) key {
return [self hmacWithData:data andKey:key andDigest:EVP_sha1()];
}
+(NSData*) hmacUsingSha256Data:(NSData*) data withKey:(NSData*) key{
return [self hmacWithData:data andKey:key andDigest:EVP_sha256()];
}
@end