diff --git a/OpenVPN Adapter Tests/OpenVPNCertificateTests.swift b/OpenVPN Adapter Tests/OpenVPNCertificateTests.swift index 46a71a4..2f47570 100644 --- a/OpenVPN Adapter Tests/OpenVPNCertificateTests.swift +++ b/OpenVPN Adapter Tests/OpenVPNCertificateTests.swift @@ -76,5 +76,25 @@ class OpenVPNCertificateTests: XCTestCase { XCTFail("Initialization with empty PEM data should fail") } + + func testReadSerial() { + guard + let caURL = Bundle.current.url(forResource: "test-ca", withExtension: "crt"), + let caOriginalPEMData = try? Data(contentsOf: caURL) + else { + XCTFail() + return + } + + let certificateFromPEM: OpenVPNCertificate + do { + certificateFromPEM = try OpenVPNCertificate(pem: caOriginalPEMData) + } catch { + XCTFail(error.localizedDescription) + return + } + + XCTAssert(!certificateFromPEM.serial.isEmpty) + } } diff --git a/OpenVPN Adapter/OpenVPNCertificate.h b/OpenVPN Adapter/OpenVPNCertificate.h index 57d2f9c..e799778 100644 --- a/OpenVPN Adapter/OpenVPNCertificate.h +++ b/OpenVPN Adapter/OpenVPNCertificate.h @@ -15,6 +15,12 @@ NS_ASSUME_NONNULL_BEGIN + (nullable OpenVPNCertificate *)certificateWithPEM:(NSData *)pemData error:(NSError **)error; + (nullable OpenVPNCertificate *)certificateWithDER:(NSData *)derData error:(NSError **)error; +@property (readonly, nonatomic) NSInteger version; +@property (readonly, nonatomic) NSData *serial; + +@property (readonly, nonatomic) NSData *issuer; +@property (readonly, nonatomic) NSData *subject; + - (instancetype) init NS_UNAVAILABLE; - (nullable NSData *)pemData:(NSError **)error; diff --git a/OpenVPN Adapter/OpenVPNCertificate.m b/OpenVPN Adapter/OpenVPNCertificate.m index 907843c..8e40725 100644 --- a/OpenVPN Adapter/OpenVPNCertificate.m +++ b/OpenVPN Adapter/OpenVPNCertificate.m @@ -9,6 +9,7 @@ #include #include +#include #import "NSError+OpenVPNError.h" @@ -52,6 +53,22 @@ return certificate; } +- (NSInteger)version { + return self.crt->version; +} + +- (NSData *)serial { + return [NSData dataWithBytes:self.crt->serial.p length:self.crt->serial.len]; +} + +- (NSData *)issuer { + return [NSData dataWithBytes:self.crt->issuer_raw.p length:self.crt->issuer_raw.len]; +} + +- (NSData *)subject { + return [NSData dataWithBytes:self.crt->subject_raw.p length:self.crt->subject_raw.len]; +} + - (instancetype)init { if (self = [super init]) {