2016-10-21 7 views
1

私はswiftから呼び出すobjective-Cのメソッドを持っています。速い2ではかなりうまく機能しましたが、速い3では動作が変化しました。同じパラメータを送信しても、3つの異なる結果が得られます。1つの関数は即座にいくつかの結果を返します

pfileが見つからないことがあります。ピンチェックに失敗し、時にはうまく動作し、x509が表示されることがあります。

char* ParsePKCS12(unsigned char* pkcs12_path, unsigned char * pin) { 
printf("PARSE PATH: %s\n", pkcs12_path); 
printf("PASSWORD: %s\n", pin); 

NSString *pfile = [NSString stringWithUTF8String:pkcs12_path]; 
FILE *fp; 
PKCS12 *p12; 
EVP_PKEY *pkey; 
X509 *cert; 

BIO *databio = BIO_new(BIO_s_mem()); 
STACK_OF(X509) *ca = NULL; 

if([[NSFileManager defaultManager] fileExistsAtPath:pfile]) { 
    NSLog(@"ok, pfile exists!"); 
} else { 
    NSLog(@"error, pfile does not exists!"); 
    return "-1"; 
} 
OpenSSL_add_all_algorithms(); 
ERR_load_crypto_strings(); 
fp = fopen([pfile UTF8String], "rb"); 
p12 = d2i_PKCS12_fp(fp, NULL); 
fclose (fp); 
if (!p12) { 
    fprintf(stderr, "Error reading PKCS#12 file\n"); 
    ERR_print_errors_fp(stderr); 
    return "-1"; 
} 

if (!PKCS12_parse(p12, (const char *)pin, &pkey, &cert, &ca)) { //Error at parsing or pin error 
    fprintf(stderr, "Error parsing PKCS#12 file\n"); 
    ERR_print_errors_fp(stderr); 
    ERR_print_errors(databio); 
    return "-1"; 
} 

BIO *bio = NULL; 
char *pem = NULL; 

if (NULL == cert) { 
    //return NULL; 
    return "-1"; 
} 

bio = BIO_new(BIO_s_mem()); 
if (NULL == bio) { 
    return "-1"; 
} 

if (0 == PEM_write_bio_X509(bio, cert)) { 
    BIO_free(bio); 
    //return NULL; 
} 

pem = (char *) malloc(bio->num_write + 1); 
if (NULL == pem) { 
    BIO_free(bio); 
    return "-1"; 
} 

memset(pem, 0, bio->num_write + 1); 
BIO_read(bio, pem, bio->num_write); 
BIO_free(bio); 

PKCS12_free(p12); 

return pem; 
} 

私はこのように迅速に呼び出し、このコード:

self.x509 = String(cString:ParsePKCS12(UnsafeMutablePointer<UInt8>(mutating: self.path), 
              UnsafeMutablePointer<UInt8>(mutating: "123456"))!) 

答えて

0

あなたのコール

self.x509 = String(cString:ParsePKCS12(UnsafeMutablePointer<UInt8>(mutating: self.path), 
              UnsafeMutablePointer<UInt8>(mutating: "123456"))!) 

があるため、両方の

UnsafeMutablePointer<UInt8>(mutating: someSwiftString) 

呼び出しで確実に動作しません 、コンパイラ一時的なCの文字列表現を作成します。 Swift文字列を関数に渡します。しかし、Cの文字列 は、UnsafeMutablePointerコンストラクタが返るまで有効です。つまり、2番目の 文字列変換は、最初の、またはその他の定義されていない の動作を上書きできます。

最も簡単な解決策は、一定のC文字列を取る(およびデフォルトの符号の有無を使用) にC関数を変更するには、次のようになります。

char* ParsePKCS12(const char * pkcs12_path, const char * pin) 

次に、あなたは単に

self.x509 = String(cString: ParsePKCS12(self.path, "123456")) 

としてそれを呼び出すことができますし、コンパイラは の間に有効な一時的なC文字列を作成し、ParsePKCS12()の呼び出しを行います。

+0

ありがとうございます!出来た –

関連する問題