首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用openssl加载pkcs12并将其转换为char*?

如何使用openssl加载pkcs12并将其转换为char*?
EN

Stack Overflow用户
提问于 2015-05-11 08:23:14
回答 1查看 1.3K关注 0票数 2

我想使用openssl将pkcs12加载并编码到base64。我不需要解析它就可以加载它,然后将它编码到base64,所以当我解码它并将内容放入文件时,我将再次使用pkcs12结构。

代码语言:javascript
复制
char* loadPkcs12(const char* path) {

    FILE *fp;
    PKCS12 *p12;

    OpenSSL_add_all_algorithms();
    ERR_load_crypto_strings();
    if (!(fp = fopen(path, "rb"))) {
        fprintf(stderr, "Error opening file %s\n", path);
        exit(1);
    }
    p12 = d2i_PKCS12_fp(fp, NULL);
    fclose(fp);
    if (!p12) {
        fprintf(stderr, "Error reading PKCS#12 file\n");
        ERR_print_errors_fp(stderr);
        exit(1);
    }
    //here I am trying to encode it
    BIO* bio;
    bio = BIO_new(BIO_s_mem());
    i2d_PKCS12_bio(bio, p12);
    BUF_MEM *bufferPtr;
    BIO_get_mem_ptr(bio, &bufferPtr);
    printf(toBase64(bufferPtr->data));

    PKCS12_free(p12);
    return 0;
}

char* toBase64(char* str) {
    BIO *bio, *b64;
    BUF_MEM *bufferPtr;

    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new(BIO_s_mem());
    bio = BIO_push(b64, bio);

    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); //Ignore newlines - write everything in one line
    BIO_write(bio, str, strlen(str));
    BIO_flush(bio);
    BIO_get_mem_ptr(bio, &bufferPtr);
    BIO_set_close(bio, BIO_NOCLOSE);
    BIO_free_all(bio);
    char* output;

    output = (*bufferPtr).data;
    return output;
}

我知道将编码转换为Base64是可行的,这是将PKCS12转换为char*的问题。我的产量现在只有大约60字符长,而且应该长得多。有没有办法将PKCS12转换为char*缓冲区?谢谢你的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-11 08:50:19

我的产量现在只有大约60字符长,而且应该长得多。有没有办法将PKCS12转换为char*缓冲区?

我认为toBase64需要一个指针和一个长度,以防有任何嵌入的NULL:

代码语言:javascript
复制
BUF_MEM *bufferPtr = NULL;
BIO_get_mem_ptr(bio, &bufferPtr);

if(bufferPtr != NULL) {
    if(bufferPtr->data && bufferPtr->length > 0)
        printf(toBase64(bufferPtr->data, bufferPtr->length));
}

和:

代码语言:javascript
复制
char* toBase64(char* str, int length) {
    ...
}

理想情况下,指针使用unsigned char*而不是char*,长度使用size_t而不是int。但那艘船已经开走了。

另外,确保Base64字符串上有一个空终止符。我不记得它是自动添加的。

与此相关,您可以将BIOs与BIO_push链接在一起。请参阅BIO_push(3)上的手册页。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30162783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档