openssl3.2 - 官方demo学习 - cms - cms_sign2.c

openssl3.2 - 官方demo学习 - cms - cms_sign2.c

概述

用多个证书进行CMS消息联合签名

笔记

/*!
* \file cms_sign2.c
* \note openssl3.2 - 官方demo学习 - cms - cms_sign2.c
用多个证书进行CMS消息联合签名
*/

/*
 * Copyright 2008-2023 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

/* S/MIME signing example: 2 signers */
#include <openssl/pem.h>
#include <openssl/cms.h>
#include <openssl/err.h>

#include "my_openSSL_lib.h"

int main(int argc, char **argv)
{
   
    BIO *in = NULL, *out = NULL, *tbio = NULL;
    X509 *scert = NULL, *scert2 = NULL;
    EVP_PKEY *skey = NULL, *skey2 = NULL;
    CMS_ContentInfo *cms = NULL;
    int ret = EXIT_FAILURE;

    OpenSSL_add_all_algorithms();
    ERR_load_crypto_strings();

    tbio = BIO_new_file("signer.pem", "r");

    if (!tbio)
        goto err;

    scert = PEM_read_bio_X509(tbio, NULL, 0, NULL);

    BIO_reset(tbio);

    skey = PEM_read_bio_PrivateKey(tbio, NULL, 0, NULL);

    BIO_free(tbio);

    tbio = BIO_new_file("signer2.pem", "r");

    if (!tbio)
        goto err;

    scert2 = PEM_read_bio_X509(tbio, NULL, 0, NULL);

    BIO_reset(tbio);

    skey2 = PEM_read_bio_PrivateKey(tbio, NULL, 0, NULL);

    if (!scert2 || !skey2)
        goto err;

    in = BIO_new_file("sign.txt", "r");

    if (!in)
        goto err;

    cms = CMS_sign(NULL, NULL, NULL, in, CMS_STREAM | CMS_PARTIAL);

    if (!cms)
        goto err;

    /* Add each signer in turn */

    if (!CMS_add1_signer(cms, scert, skey, NULL, 0))
        goto err;

    if (!CMS_add1_signer(cms, scert2, skey2, NULL, 0))
        goto err;

    out = BIO_new_file("smout.txt", "w");
    if (!out)
        goto err;

    /* NB: content included and finalized by SMIME_write_CMS */

    if (!SMIME_write_CMS(out, cms, in, CMS_STREAM))
        goto err;

    printf("Signing Successful\n");

    ret = EXIT_SUCCESS;
 err:
    if (ret != EXIT_SUCCESS) {
   
        fprintf(stderr, "Error Signing Data\n");
        ERR_print_errors_fp(stderr);
    }

    CMS_ContentInfo_free(cms);
    X509_free(scert);
    EVP_PKEY_free(skey);
    X509_free(scert2);
    EVP_PKEY_free(skey2);
    BIO_free(in);
    BIO_free(out);
    BIO_free(tbio);
    return ret;
}

END

相关推荐

  1. openssl3.2 - 官方demo学习 - cms - cms_enc.c

    2024-01-16 20:48:04       28 阅读
  2. openssl3.2 - 官方demo学习 - cms - cms_sign2.c

    2024-01-16 20:48:04       28 阅读
  3. openssl3.2 - 官方demo学习 - kdf - argon2.c

    2024-01-16 20:48:04       25 阅读
  4. openssl3.2 - 官方demo学习 - cipher - aesccm.c

    2024-01-16 20:48:04       29 阅读
  5. openssl3.2 - 官方demo学习 - server-conf.c

    2024-01-16 20:48:04       31 阅读
  6. openssl3.2 - 官方demo学习 - client-conf.c

    2024-01-16 20:48:04       32 阅读
  7. openssl3.2 - 官方demo学习 - cipher - ariacbc.c

    2024-01-16 20:48:04       33 阅读
  8. openssl3.2 - 官方demo学习 - mac - gmac.c

    2024-01-16 20:48:04       37 阅读
  9. openssl3.2 - 官方demo学习 - mac - siphash.c

    2024-01-16 20:48:04       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-16 20:48:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-16 20:48:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-16 20:48:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-16 20:48:04       20 阅读

热门阅读

  1. CSDN - Python中新手入门----------元组

    2024-01-16 20:48:04       36 阅读
  2. 算法 - 回溯 / DFS / BFS

    2024-01-16 20:48:04       29 阅读
  3. 使用内网穿透与Termux完成手机上部署web项目

    2024-01-16 20:48:04       33 阅读
  4. Python测试开发面试题

    2024-01-16 20:48:04       34 阅读
  5. 【QA】Linux彻底卸载MySQL

    2024-01-16 20:48:04       22 阅读
  6. 【力扣刷题练习】236. 二叉树的最近公共祖先

    2024-01-16 20:48:04       34 阅读
  7. AS,android SDK

    2024-01-16 20:48:04       30 阅读