zoukankan      html  css  js  c++  java
  • OpenSSL CSP Engine


    OpenSSL CSP Engine
      

      CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。

    #ifndef CSPEngineH
    #define CSPEngineH

    #include <openssl/rsa.h>
    #include <openssl/evp.h>
    #include <openssl/x509.h>
    #include <openssl/x509_vfy.h>
    #include <windows.h>
    #include <wincrypt.h>
    //===========================================================================
    #if defined(__cplusplus)
    extern "C" {
    #endif

    extern X509*                    x509;
    extern EVP_PKEY*                key;

    X509_STORE* X509_STORE_load_MSCryptoAPI(void);
    int X509_STORE_load_CERT_STORE(X509_STORE* store, HCERTSTORE hCertStore);
    EVP_PKEY* EVP_PKEY_new_CERT_CONTEXT(PCCERT_CONTEXT pCertContext, X509** cert);
    X509* X509_new_CERT_CONTEXT(PCCERT_CONTEXT pCertContext);
    X509_CRL* X509_CRL_new_CRL_CONTEXT(PCCRL_CONTEXT pCrlContext);

    int CSP_rsa_init(
        RSA*                        rsa
    );
    int CSP_rsa_finish(
        RSA*                        rsa
    );
    int CSP_rsa_pub_enc(
        int                         flen
        , const unsigned char*      from
        , unsigned char*            to
        , RSA*                      rsa
        , int                       padding
    );
    int CSP_rsa_pub_dec(
        int                         flen
        , const unsigned char*      from
        , unsigned char*            to
        , RSA*                      rsa
        , int                       padding
    );
    int CSP_rsa_priv_enc(
        int                         flen
        , const unsigned char*      from
        , unsigned char*            to
        , RSA*                      rsa
        , int                       padding
    );
    int CSP_rsa_priv_dec(
        int                         flen
        , const unsigned char*      from
        , unsigned char*            to
        , RSA*                      rsa
        , int                       padding
    );
    int CSP_rsa_sign(
        int                         type
        , const unsigned char*      m
        , unsigned int              m_length
        , unsigned char*            sigret
        , unsigned int*             siglen
        , const RSA*                rsa
    );
    int CSP_rsa_verify(
        int                         type
        , const unsigned char*      m
        , unsigned int              m_length
        , unsigned char*            sigbuf
        , unsigned int              siglen
        , const RSA*                rsa
    );
    //---------------------------------------------------------------------------
    static const RSA_METHOD CSP_rsa_method =
    {
        "Cryptographic RSA method"  //! name
        , CSP_rsa_pub_enc           //! rsa_pub_enc
        , CSP_rsa_pub_dec           //! rsa_pub_dec
        , CSP_rsa_priv_enc          //! rsa_priv_enc
        , CSP_rsa_priv_dec          //! rsa_priv_dec
        , NULL                      //! rsa_mod_exp
        , BN_mod_exp_mont           //! bn_mod_exp
        , CSP_rsa_init              //! init
        , CSP_rsa_finish            //! finish
        , RSA_FLAG_SIGN_VER         //! flags
        , NULL                      //! app_data
        , CSP_rsa_sign              //! rsa_sign
        , CSP_rsa_verify            //! rsa_verify
    };

    #if defined(__cplusplus)
    };//extern "C"
    #endif
    //===========================================================================
    #endif//CSPEngineH

    //---------------------------------------------------------------------------
    #include "stdafx.h"

    #include <vector>
    #include <algorithm>
    #include <openssl/bio.h>
    #include <openssl/objects.h>
    #include "CSPEngine.h"
    //---------------------------------------------------------------------------
    X509*                           x509 = NULL;
    EVP_PKEY*                       key  = NULL;
    //---------------------------------------------------------------------------
    X509_STORE* X509_STORE_load_MSCryptoAPI(void)
    {
        static X509_STORE*          store = NULL;
        HCERTSTORE                  hCertStore;
        LPCTSTR                     lpStoreNames[] = {
            TEXT("ROOT"),
            TEXT("CA")
        };

    /*  if(NULL != store) {
            ++store->references;
            return store;
        }*/
       
        store = X509_STORE_new();

        for(int i=0; i<sizeof(lpStoreNames)/sizeof(lpStoreNames[0]); ++i) {
            hCertStore = ::CertOpenSystemStore(NULL, lpStoreNames[i]);
            if(NULL == hCertStore)  return 0;
           
            X509_STORE_load_CERT_STORE(store, hCertStore);
        }

        return store;
    }
    //---------------------------------------------------------------------------
    int X509_STORE_load_CERT_STORE(X509_STORE* store, HCERTSTORE hCertStore)
    {
        if(NULL == store)           return 0;
        if(NULL == hCertStore)      return 0;

        PCCERT_CONTEXT              pCertContext = NULL;
        while(pCertContext = ::CertEnumCertificatesInStore(hCertStore, pCertContext)) {
            X509*                   x509;

            x509 = X509_new_CERT_CONTEXT(pCertContext);
            X509_STORE_add_cert(store, x509);
        }

        PCCRL_CONTEXT               pCrlContext = NULL;
        while(pCrlContext = ::CertEnumCRLsInStore(hCertStore, pCrlContext)) {
            X509_CRL*               crl;

            crl = X509_CRL_new_CRL_CONTEXT(pCrlContext);
            X509_STORE_add_crl(store, crl);
        }

        return 1;
    }
    //---------------------------------------------------------------------------
    EVP_PKEY* EVP_PKEY_new_CERT_CONTEXT(PCCERT_CONTEXT pCertContext, X509** cert)
    {
        X509*                       x509;
        EVP_PKEY*                   evp;

        if(NULL == pCertContext)    return NULL;

        x509 = X509_new_CERT_CONTEXT(pCertContext);
        if(NULL == x509)            return NULL;

        evp = X509_get_pubkey(x509);
        if(NULL == evp)             return NULL;

        if(RSA* rsa = EVP_PKEY_get1_RSA(evp)) {
            RSA_set_ex_data(rsa, 0, (void*)pCertContext);
            RSA_set_method(rsa, &CSP_rsa_method);
            rsa->flags |= CSP_rsa_method.flags;
            RSA_free(rsa);
        }   else {
            EVP_PKEY_free(evp);
            evp = NULL;
        }

        if(evp) {
            if(cert) {
                *cert = x509;
            }   else {
                X509_free(x509);
            }
        }
       
        return evp;
    }
    //---------------------------------------------------------------------------
    X509* X509_new_CERT_CONTEXT(PCCERT_CONTEXT pCertContext)
    {
        X509*                       x509 = NULL;
        BIO*                        bio;

        if(NULL == pCertContext)    return NULL;

        bio = BIO_new_mem_buf(pCertContext->pbCertEncoded
            , pCertContext->cbCertEncoded);
        if(NULL == bio)             return NULL;

        d2i_X509_bio(bio, &x509);
        BIO_free(bio);

        return x509;
    }
    //---------------------------------------------------------------------------
    X509_CRL* X509_CRL_new_CRL_CONTEXT(PCCRL_CONTEXT pCrlContext)
    {
        X509_CRL*                   crl = NULL;
        BIO*                        bio;

        if(NULL == pCrlContext)     return NULL;

        bio = BIO_new_mem_buf(pCrlContext->pbCrlEncoded
            , pCrlContext->cbCrlEncoded);
        if(NULL == bio)             return NULL;

        d2i_X509_CRL_bio(bio, &crl);
        BIO_free(bio);

        return crl;
    }
    //---------------------------------------------------------------------------
    int CSP_rsa_init(RSA* rsa)
    {
        BOOL                        ret;
        PCERT_CONTEXT               pCertContext;           // 证书内容
        HCRYPTPROV                  hCryptProv = NULL;      // 密钥位置
        HCRYPTKEY                   hCryptKey  = NULL;      // 私钥句柄
        DWORD                       dwKeySpec;
        BOOL                        fCallerFreeProv = FALSE;

        pCertContext = (PCERT_CONTEXT)RSA_get_ex_data(rsa, 0);
        if(NULL == pCertContext)    return 0;

        hCryptKey    = (HCRYPTKEY    )RSA_get_ex_data(rsa, 2);
        if(NULL != hCryptKey)       return 1;

        // 得到证书相关密钥位置
        ret = ::CryptAcquireCertificatePrivateKey(pCertContext
            , 0, NULL, &hCryptProv, &dwKeySpec, &fCallerFreeProv);
        if(!ret)                    goto err;

        // 获得私钥句柄
        ret = ::CryptGetUserKey(hCryptProv, dwKeySpec, &hCryptKey);
        if(!ret)                    goto err;

        RSA_set_ex_data(rsa, 1, (void*)hCryptProv);
        RSA_set_ex_data(rsa, 2, (void*)hCryptKey);
        RSA_set_ex_data(rsa, 3, (void*)dwKeySpec);
        RSA_set_ex_data(rsa, 4, (void*)fCallerFreeProv);

        return 1;

    err:
        if(hCryptKey)               ::CryptDestroyKey(hCryptKey);
        if(hCryptProv && fCallerFreeProv) {
            ::CryptReleaseContext(hCryptProv, 0);
        }

        return 0;
    }
    //---------------------------------------------------------------------------
    int CSP_rsa_finish(RSA* rsa)
    {
        HCRYPTPROV                  hCryptProv   = NULL;
        HCRYPTKEY                   hCryptKey    = NULL;
        BOOL                        fCallerFreeProv = FALSE;

        hCryptKey       = (HCRYPTKEY )RSA_get_ex_data(rsa, 2);
        ::CryptDestroyKey(hCryptKey);
        RSA_set_ex_data(rsa, 2, NULL);

        hCryptProv      = (HCRYPTPROV)RSA_get_ex_data(rsa, 1);
        fCallerFreeProv = (BOOL      )RSA_get_ex_data(rsa, 4);
        if(hCryptProv && fCallerFreeProv) {
            ::CryptReleaseContext(hCryptProv, 0);
            RSA_set_ex_data(rsa, 1, NULL);
        }

        return 1;
    }
    //---------------------------------------------------------------------------
    int CSP_rsa_pub_enc(int flen, const unsigned char* from
        , unsigned char* to, RSA* rsa, int padding)
    {
        return RSA_PKCS1_SSLeay()->rsa_pub_enc(flen, from, to, rsa, padding);
    }
    //---------------------------------------------------------------------------
    int CSP_rsa_pub_dec(int flen, const unsigned char* from
        , unsigned char* to, RSA* rsa, int padding)
    {
        return RSA_PKCS1_SSLeay()->rsa_pub_dec(flen, from, to, rsa, padding);
    }
    //---------------------------------------------------------------------------
    int CSP_rsa_priv_enc(int flen, const unsigned char* from
        , unsigned char* to, RSA* rsa, int padding)
    {
        return -1;
    }
    //---------------------------------------------------------------------------
    int CSP_rsa_priv_dec(int flen, const unsigned char* from
        , unsigned char* to, RSA* rsa, int padding)
    {
        BOOL                        ret;
        HCRYPTKEY                   hCryptKey;
        DWORD                       cbData = flen;
        std::vector<BYTE>           pbData;

        hCryptKey = (HCRYPTKEY)RSA_get_ex_data(rsa, 2);

        pbData.resize(cbData);
        std::copy(from, from+flen, pbData.rbegin());
        ret = ::CryptDecrypt(hCryptKey, NULL, TRUE, 0, &*pbData.begin(), &cbData);
        if(!ret)                    return -1;
        std::copy(pbData.begin(), pbData.begin()+cbData, to);

        return cbData;
    }
    //---------------------------------------------------------------------------
    ALG_ID nid2algid(int nid)
    {
        ALG_ID                      algId;

        switch(nid) {
        case NID_md2:
            algId = CALG_MD2;       break;
        case NID_md4:
            algId = CALG_MD4;       break;
        case NID_md5:
            algId = CALG_MD5;       break;
        case NID_sha:
            algId = CALG_SHA;       break;
        case NID_sha1:
            algId = CALG_SHA1;      break;
        case NID_md5_sha1:
        default:
            algId = CALG_SSL3_SHAMD5;
            break;
        }

        return algId;
    }
    //---------------------------------------------------------------------------
    int CSP_rsa_sign(int type, const unsigned char *m, unsigned int m_length
        , unsigned char *sigret, unsigned int *siglen, const RSA *rsa)
    {
        BOOL                        ret = FALSE;
        HCRYPTPROV                  hCryptProv;
        HCRYPTKEY                   hCryptKey;
        DWORD                       dwKeySpec;
        ALG_ID                      algId;
        HCRYPTHASH                  hHash = NULL;
        DWORD                       cbHash, cbHashSize;
        DWORD                       cbData = 0;
        std::vector<BYTE>           pbData;

        hCryptProv = (HCRYPTPROV)RSA_get_ex_data(rsa, 1);
        hCryptKey  = (HCRYPTKEY )RSA_get_ex_data(rsa, 2);
        dwKeySpec  = (DWORD     )RSA_get_ex_data(rsa, 3);
        if(NULL == hCryptKey)       goto err;

        algId = nid2algid(type);
        if(-1 == algId)             goto err;

        ret = ::CryptCreateHash(hCryptProv, algId, 0, 0, &hHash);
        if(!ret)                    goto err;
        ret = ::CryptGetHashParam(hHash, HP_HASHSIZE, (LPBYTE)&cbHashSize, &cbHash, 0);
        if(!ret)                    goto err;
        if(m_length != cbHashSize)  goto err;

        ret = ::CryptSetHashParam(hHash, HP_HASHVAL, m, 0);
        if(!ret)                    goto err;

        ret = ::CryptSignHash(hHash, dwKeySpec, NULL, 0, NULL, &cbData);
        if(!ret)                    goto err;
        *siglen = cbData;

        pbData.resize(cbData);
        ret = ::CryptSignHash(hHash, dwKeySpec, NULL, 0, &*pbData.begin(), &cbData);
        if(!ret)                    goto err;
        std::copy(pbData.rbegin(), pbData.rend(), sigret);

    err:
        ::CryptDestroyHash(hHash);

        return ret;
    }
    //---------------------------------------------------------------------------
    int CSP_rsa_verify(int type, const unsigned char *m, unsigned int m_length
        , unsigned char *sigbuf, unsigned int siglen, const RSA *rsa)
    {
        BOOL                        ret = FALSE;
        RSA*                        pubrsa;

        pubrsa = RSAPublicKey_dup(const_cast<RSA*>(rsa));
        if(NULL == pubrsa)          goto err;

        ret = RSA_verify(type, m, m_length, sigbuf, siglen, pubrsa);
       
    err:
        RSA_free(pubrsa);
        return ret;
    }
    //---------------------------------------------------------------------------

  • 相关阅读:
    docker命令
    IntelliJ IDEA设置JVM运行参数
    SpringResourceBundleMessageSource示例(转)
    通过ApplicationContextAware加载Spring上下文环境(转)
    @ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常(转)
    SpringBoot学习(十一)创建自己的自动配置和Kotlin支持
    SpringBoot学习(十)Spring集成、会话、(监视和管理JMX)、WebSockets和web服务
    BindingResult不能获取错误对象
    SpringBoot学习(九)使用JTA的分布式事务、Hazelcast、Quartz调度器和任务执行和调度
    Maven项目中pom文件分析
  • 原文地址:https://www.cnblogs.com/adylee/p/904982.html
Copyright © 2011-2022 走看看