handle NULL case when parsing certificate

pull/16190/head
Muxi Yan 6 years ago
parent 82d9196449
commit b9667c6c17
  1. 19
      src/objective-c/GRPCClient/private/GRPCSecureChannelFactory.m

@ -42,6 +42,9 @@ NS_ASSUME_NONNULL_BEGIN
- (NSData *)nullTerminatedDataWithString:(NSString *)string { - (NSData *)nullTerminatedDataWithString:(NSString *)string {
// dataUsingEncoding: does not return a null-terminated string. // dataUsingEncoding: does not return a null-terminated string.
NSData *data = [string dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSData *data = [string dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
if (data == nil) {
return nil;
}
NSMutableData *nullTerminated = [NSMutableData dataWithData:data]; NSMutableData *nullTerminated = [NSMutableData dataWithData:data];
[nullTerminated appendBytes:"\0" length:1]; [nullTerminated appendBytes:"\0" length:1];
return nullTerminated; return nullTerminated;
@ -51,7 +54,7 @@ NS_ASSUME_NONNULL_BEGIN
privateKey:(nullable NSString *)privateKey privateKey:(nullable NSString *)privateKey
certChain:(nullable NSString *)certChain certChain:(nullable NSString *)certChain
error:(NSError **)errorPtr { error:(NSError **)errorPtr {
static NSData *kDefaultRootsASCII; static NSData *defaultRootsASCII;
static NSError *kDefaultRootsError; static NSError *kDefaultRootsError;
static dispatch_once_t loading; static dispatch_once_t loading;
dispatch_once(&loading, ^{ dispatch_once(&loading, ^{
@ -68,14 +71,14 @@ NS_ASSUME_NONNULL_BEGIN
kDefaultRootsError = error; kDefaultRootsError = error;
return; return;
} }
kDefaultRootsASCII = [self nullTerminatedDataWithString:contentInUTF8]; defaultRootsASCII = [self nullTerminatedDataWithString:contentInUTF8];
}); });
NSData *rootsASCII; NSData *rootsASCII;
if (rootCerts != nil) { if (rootCerts != nil) {
rootsASCII = [self nullTerminatedDataWithString:rootCerts]; rootsASCII = [self nullTerminatedDataWithString:rootCerts];
} else { } else {
if (kDefaultRootsASCII == nil) { if (defaultRootsASCII == nil) {
if (errorPtr) { if (errorPtr) {
*errorPtr = kDefaultRootsError; *errorPtr = kDefaultRootsError;
} }
@ -88,11 +91,11 @@ NS_ASSUME_NONNULL_BEGIN
kDefaultRootsError); kDefaultRootsError);
return nil; return nil;
} }
rootsASCII = kDefaultRootsASCII; rootsASCII = defaultRootsASCII;
} }
grpc_channel_credentials *creds; grpc_channel_credentials *creds = NULL;
if (privateKey == nil && certChain == nil) { if (privateKey.length == 0 && certChain.length == 0) {
creds = grpc_ssl_credentials_create(rootsASCII.bytes, NULL, NULL, NULL); creds = grpc_ssl_credentials_create(rootsASCII.bytes, NULL, NULL, NULL);
} else { } else {
grpc_ssl_pem_key_cert_pair key_cert_pair; grpc_ssl_pem_key_cert_pair key_cert_pair;
@ -100,8 +103,12 @@ NS_ASSUME_NONNULL_BEGIN
NSData *certChainASCII = [self nullTerminatedDataWithString:certChain]; NSData *certChainASCII = [self nullTerminatedDataWithString:certChain];
key_cert_pair.private_key = privateKeyASCII.bytes; key_cert_pair.private_key = privateKeyASCII.bytes;
key_cert_pair.cert_chain = certChainASCII.bytes; key_cert_pair.cert_chain = certChainASCII.bytes;
if (key_cert_pair.private_key == NULL || key_cert_pair.cert_chain == NULL) {
creds = grpc_ssl_credentials_create(rootsASCII.bytes, NULL, NULL, NULL);
} else {
creds = grpc_ssl_credentials_create(rootsASCII.bytes, &key_cert_pair, NULL, NULL); creds = grpc_ssl_credentials_create(rootsASCII.bytes, &key_cert_pair, NULL, NULL);
} }
}
if ((self = [super init])) { if ((self = [super init])) {
_channelCreds = creds; _channelCreds = creds;

Loading…
Cancel
Save