Exemplo n.º 1
0
int i2d_re_X509_tbs(X509 *x, unsigned char **pp)
{
    x->cert_info.enc.modified = 1;
    return i2d_X509_CINF(&x->cert_info, pp);
}
Exemplo n.º 2
0
/**
*公開鍵証明書から証明書と署名の取得関数
* @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;
}