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

50 lines
1.7 KiB
Objective-C

#import "EvpMessageDigest.h"
#import <OpenSSL/evp.h>
#import <OpenSSL/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();
ows_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);
}
ows_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