mirror of https://github.com/oxen-io/session-ios
Revert UD server certificate parsing.
parent
f7379deb69
commit
45233ec862
@ -1,13 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
@interface OWSCertificateExpiration : NSObject
|
|
||||||
|
|
||||||
+ (nullable NSDate *)expirationDataForCertificate:(NSData *)certificateData;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
||||||
@ -1,109 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "OWSCertificateExpiration.h"
|
|
||||||
#import "OWSFileSystem.h"
|
|
||||||
#import <CommonCrypto/CommonCrypto.h>
|
|
||||||
#import <SignalCoreKit/Cryptography.h>
|
|
||||||
#import <SignalCoreKit/NSData+OWS.h>
|
|
||||||
#import <openssl/x509.h>
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
@implementation OWSCertificateExpiration
|
|
||||||
|
|
||||||
// PEM is just a series of blocks of base-64 encoded DER data.
|
|
||||||
//
|
|
||||||
// https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail
|
|
||||||
+ (nullable NSArray<NSData *> *)convertPemToDer:(NSString *)pemString
|
|
||||||
{
|
|
||||||
NSMutableArray<NSData *> *certificateDatas = [NSMutableArray new];
|
|
||||||
|
|
||||||
NSError *error;
|
|
||||||
// We use ? for non-greedy matching.
|
|
||||||
NSRegularExpression *_Nullable regex = [NSRegularExpression
|
|
||||||
regularExpressionWithPattern:@"-----BEGIN.*?-----(.+?)-----END.*?-----"
|
|
||||||
options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators
|
|
||||||
error:&error];
|
|
||||||
if (!regex || error) {
|
|
||||||
OWSFailDebug(@"could parse regex: %@.", error);
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
[regex enumerateMatchesInString:pemString
|
|
||||||
options:0
|
|
||||||
range:NSMakeRange(0, pemString.length)
|
|
||||||
usingBlock:^(NSTextCheckingResult *_Nullable result, NSMatchingFlags flags, BOOL *stop) {
|
|
||||||
if (result.numberOfRanges != 2) {
|
|
||||||
OWSFailDebug(@"invalid PEM regex match.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
NSString *_Nullable derString = [pemString substringWithRange:[result rangeAtIndex:1]];
|
|
||||||
if (derString.length < 1) {
|
|
||||||
OWSFailDebug(@"empty PEM match.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// dataFromBase64String will ignore whitespace, which is
|
|
||||||
// necessary.
|
|
||||||
NSData *_Nullable derData = [NSData dataFromBase64String:derString];
|
|
||||||
if (derData.length < 1) {
|
|
||||||
OWSFailDebug(@"could not parse PEM match.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
[certificateDatas addObject:derData];
|
|
||||||
}];
|
|
||||||
|
|
||||||
return certificateDatas;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (nullable NSDate *)expirationDataForCertificate:(NSData *)certificateData
|
|
||||||
{
|
|
||||||
OWSAssertDebug(certificateData);
|
|
||||||
|
|
||||||
NSString *temporaryFilePath = [OWSFileSystem temporaryFilePath];
|
|
||||||
[certificateData writeToFile:temporaryFilePath atomically:YES];
|
|
||||||
OWSLogInfo(@"temporaryFilePath: %@", temporaryFilePath);
|
|
||||||
|
|
||||||
OWSLogInfo(@"certificateData: %@", certificateData.hexadecimalString);
|
|
||||||
NSString *pemString = [[NSString alloc] initWithData:certificateData encoding:NSUTF8StringEncoding];
|
|
||||||
OWSLogInfo(@"pemString: %@", pemString);
|
|
||||||
[DDLog flushLog];
|
|
||||||
|
|
||||||
if (certificateData.length >= UINT32_MAX) {
|
|
||||||
OWSFailDebug(@"certificate data is too long.");
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
const unsigned char *certificateDataBytes = (const unsigned char *)[certificateData bytes];
|
|
||||||
X509 *_Nullable certificateX509 = d2i_X509(NULL, &certificateDataBytes, [certificateData length]);
|
|
||||||
if (!certificateX509) {
|
|
||||||
OWSFailDebug(@"could not parse certificate.");
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASN1_TIME *not_after = X509_get_notAfter(certificateX509);
|
|
||||||
OWSAssert(not_after);
|
|
||||||
|
|
||||||
BIO *b = BIO_new(BIO_s_mem());
|
|
||||||
int rc = ASN1_TIME_print(b, not_after);
|
|
||||||
if (rc <= 0) {
|
|
||||||
OWSLogError(@"ASN1_TIME_print() failed.");
|
|
||||||
BIO_free(b);
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
const NSUInteger kASN1TimeBufferLength = 128;
|
|
||||||
char buffer[kASN1TimeBufferLength];
|
|
||||||
rc = BIO_gets(b, buffer, kASN1TimeBufferLength);
|
|
||||||
if (rc <= 0) {
|
|
||||||
OWSLogError(@"BIO_gets() failed.");
|
|
||||||
BIO_free(b);
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
BIO_free(b);
|
|
||||||
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
||||||
Loading…
Reference in New Issue