int i2d_re_X509_tbs(X509 *x, unsigned char **pp) { x->cert_info.enc.modified = 1; return i2d_X509_CINF(&x->cert_info, pp); }
/** *公開鍵証明書から証明書と署名の取得関数 * @author University of Tsukuba * @param *ptr 公開鍵証明書 * @param lLen 公開鍵証明書長 * @param *pCertificate 証明書データ * @param *lCertificateLen 証明書データ長 * @param *pSign 署名データ * @param *lSignLen 署名データ長 * @return long 0:正常 -1:異常 * @since 2008.02 * @version 1.0 */ long IDMan_CmGetCertificateSign(void *ptr,long lLen,void *pCertificate,long *lCertificateLen,void *pSign,long *lSignLen) { long lRet = -1L; X509 *x509=0x00; int iRet; char szErrBuff[1024]; BIO * BIOptr; ERR_load_crypto_strings(); IDMan_StMemset(szErrBuff, 0x00, sizeof(szErrBuff)); /** 公開鍵証明書パラメータチェックを行う。 */ /** エラー発生した場合、 */ if(ptr == (void *)0x00) { /** −処理を中断する。 */ return lRet; } /** 公開鍵証明書長パラメータチェックを行う。 */ /** エラー発生した場合、 */ if( lLen == 0) { /** −処理を中断する。 */ return lRet; } /** 証明書データパラメータチェックを行う。 */ /** エラー発生した場合、 */ if( pCertificate == (void *)0x00) { /** −処理を中断する。 */ return lRet; } /** 署名データパラメータチェックを行う。 */ /** エラー発生した場合、 */ if( pSign == (void *)0x00) { /** −処理を中断する。 */ return lRet; } /** X509構造体の初期化を行う。 */ /** エラー発生した場合、 */ if((x509 = X509_new())== 0x00) { /** −処理を中断する。 */ ERR_error_string(ERR_get_error(), szErrBuff); return lRet; } /** X509構造体の作成を行う。 */ /** BIO構造の作成を行う。 */ BIOptr = BIO_new(BIO_s_mem()); /** BIO構造のリセットを行う。 */ iRet = BIO_reset(BIOptr); /** エラー発生した場合、 */ if(iRet != 1) { /** −処理を中断する。 */ ERR_error_string(ERR_get_error(), szErrBuff); BIO_free(BIOptr); return lRet; } /** BIO構造へ公開鍵証明書データの設定を行う。 */ iRet = BIO_write(BIOptr,ptr,lLen); /** エラー発生した場合、 */ if( iRet != lLen ) { /** −処理を中断する。 */ ERR_error_string(ERR_get_error(), szErrBuff); BIO_free(BIOptr); return lRet; } /** X509構造体の作成を行う。 */ x509 =(X509 *) d2i_X509_bio(BIOptr,0x00); /** エラー発生した場合、 */ if((x509 == 0x00)) { /** −処理を中断する。 */ ERR_error_string(ERR_get_error(), szErrBuff); BIO_free(BIOptr); return lRet; } /** BIO構造の解放を行う。 */ BIO_free(BIOptr); /** 証明書部の取得を行う。 */ iRet = i2d_X509_CINF(x509->cert_info,(unsigned char **)&pCertificate); if (iRet != 0) { *lCertificateLen = iRet; } /** エラー発生した場合、 */ else { /** −処理を中断する。 */ ERR_error_string(ERR_get_error(), szErrBuff); if(x509 !=0x00) X509_free(x509); return lRet; } /** 署名の取得を行う。 */ /** 署名がある場合、 */ if( x509->signature->length >= 1 ) { /** −戻り値に値を設定する。 */ IDMan_StMemcpy(pSign, x509->signature->data,x509->signature->length ); *lSignLen = x509->signature->length; } /** X509の開放を行う。 */ if(x509 !=0x00) X509_free(x509); lRet =0; return lRet; }