mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
79 lines
2.4 KiB
Objective-C
79 lines
2.4 KiB
Objective-C
#include "Crypto.h"
|
|
|
|
#import <CommonCrypto/CommonCrypto.h>
|
|
|
|
NSData * _Nonnull CryptoMD5(const void * _Nonnull bytes, int count) {
|
|
NSMutableData *result = [[NSMutableData alloc] initWithLength:(NSUInteger)CC_MD5_DIGEST_LENGTH];
|
|
CC_MD5(bytes, (CC_LONG)count, result.mutableBytes);
|
|
return result;
|
|
}
|
|
|
|
NSData * _Nonnull CryptoSHA1(const void * _Nonnull bytes, int count) {
|
|
NSMutableData *result = [[NSMutableData alloc] initWithLength:(NSUInteger)CC_SHA1_DIGEST_LENGTH];
|
|
CC_SHA1(bytes, (CC_LONG)count, result.mutableBytes);
|
|
return result;
|
|
}
|
|
|
|
NSData * _Nonnull CryptoSHA256(const void * _Nonnull bytes, int count) {
|
|
NSMutableData *result = [[NSMutableData alloc] initWithLength:(NSUInteger)CC_SHA256_DIGEST_LENGTH];
|
|
CC_SHA256(bytes, (CC_LONG)count, result.mutableBytes);
|
|
return result;
|
|
}
|
|
|
|
NSData * _Nonnull CryptoSHA512(const void * _Nonnull bytes, int count) {
|
|
NSMutableData *result = [[NSMutableData alloc] initWithLength:(NSUInteger)CC_SHA512_DIGEST_LENGTH];
|
|
CC_SHA512(bytes, (CC_LONG)count, result.mutableBytes);
|
|
return result;
|
|
}
|
|
|
|
@interface IncrementalMD5 () {
|
|
CC_MD5_CTX _ctx;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation IncrementalMD5
|
|
|
|
- (instancetype _Nonnull)init {
|
|
self = [super init];
|
|
if (self != nil) {
|
|
CC_MD5_Init(&_ctx);
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)update:(NSData * _Nonnull)data {
|
|
CC_MD5_Update(&_ctx, data.bytes, (CC_LONG)data.length);
|
|
}
|
|
|
|
- (void)update:(const void *)bytes count:(int)count {
|
|
CC_MD5_Update(&_ctx, bytes, (CC_LONG)count);
|
|
}
|
|
|
|
- (NSData *)complete {
|
|
NSMutableData *result = [[NSMutableData alloc] initWithLength:(NSUInteger)CC_MD5_DIGEST_LENGTH];
|
|
CC_MD5_Final(result.mutableBytes, &_ctx);
|
|
return result;
|
|
}
|
|
|
|
@end
|
|
|
|
NSData * _Nullable CryptoAES(bool encrypt, NSData * _Nonnull key, NSData * _Nonnull iv, NSData * _Nonnull data) {
|
|
if (key.length != 32) {
|
|
return nil;
|
|
}
|
|
if (iv.length != 16) {
|
|
return nil;
|
|
}
|
|
NSMutableData *processedData = [[NSMutableData alloc] initWithLength:data.length];
|
|
size_t processedCount = 0;
|
|
CCStatus status = CCCrypt(encrypt ? kCCEncrypt : kCCDecrypt, kCCAlgorithmAES128, 0, key.bytes, key.length, iv.bytes, data.bytes, data.length, processedData.mutableBytes, processedData.length, &processedCount);
|
|
if (status != kCCSuccess) {
|
|
return nil;
|
|
}
|
|
if (processedCount != (size_t)processedData.length) {
|
|
return nil;
|
|
}
|
|
return processedData;
|
|
}
|