From ebb21573902836a1c929747c379c0aacaa0b31db Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Thu, 7 Sep 2017 14:50:08 +0300 Subject: [PATCH] Implement writing private key DER and PEM data --- OpenVPN Adapter/OpenVPNPrivateKey.m | 51 +++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNPrivateKey.m b/OpenVPN Adapter/OpenVPNPrivateKey.m index 03f8c2e..c66c1aa 100644 --- a/OpenVPN Adapter/OpenVPNPrivateKey.m +++ b/OpenVPN Adapter/OpenVPNPrivateKey.m @@ -77,6 +77,57 @@ return key; } +- (NSData *)pemData:(out NSError **)error { + size_t buffer_length = (self.size / 8) * 2; + unsigned char *pem_buffer = malloc(buffer_length); + + int result = mbedtls_pk_write_key_pem(self.ctx, pem_buffer, buffer_length); + if (result < 0) { + if (error) { + NSString *reason = [NSError reasonFromResult:result]; + *error = [NSError errorWithDomain:OpenVPNIdentityErrorDomain code:result userInfo:@{ + NSLocalizedDescriptionKey: @"Failed to write PEM data.", + NSLocalizedFailureReasonErrorKey: reason + }]; + } + + free(pem_buffer); + return nil; + } + + NSData *pemData = [[NSString stringWithCString:(const char *)pem_buffer encoding:NSUTF8StringEncoding] dataUsingEncoding:NSUTF8StringEncoding]; + + free(pem_buffer); + return pemData; +} + +- (NSData *)derData:(out NSError **)error { + size_t buffer_length = (self.size / 8) * 2; + unsigned char *der_buffer = malloc(buffer_length); + + int result = mbedtls_pk_write_key_der(self.ctx, der_buffer, buffer_length); + if (result < 0) { + if (error) { + NSString *reason = [NSError reasonFromResult:result]; + *error = [NSError errorWithDomain:OpenVPNIdentityErrorDomain code:result userInfo:@{ + NSLocalizedDescriptionKey: @"Failed to write DER data.", + NSLocalizedFailureReasonErrorKey: reason + }]; + } + + free(der_buffer); + return nil; + } + + NSUInteger location = buffer_length - result; + NSRange range = NSMakeRange(location, result); + + NSData *derData = [[NSData dataWithBytes:der_buffer length:buffer_length] subdataWithRange:range]; + + free(der_buffer); + return derData; +} + - (void)dealloc { mbedtls_pk_free(self.ctx); free(self.ctx);