Beispiel #1
0
int sk_find(STACK *st, char *data)
	{
	char **r;
	int i;
	int (*comp_func)();
	if(st == NULL) return -1;

	if (st->comp == NULL)
		{
		for (i=0; i<st->num; i++)
			if (st->data[i] == data)
				return(i);
		return(-1);
		}
	sk_sort(st);
	if (data == NULL) return(-1);
	comp_func=(int (*)())st->comp;
	r=(char **)bsearch(&data,(char *)st->data,
		st->num,sizeof(char *),FP_ICC comp_func);
	if (r == NULL) return(-1);
	i=(int)(r-st->data);
	for ( ; i>0; i--)
		if ((*st->comp)(&(st->data[i-1]),&data) < 0)
			break;
	return(i);
	}
Beispiel #2
0
static int internal_find(STACK *st, char *data, int ret_val_options)
	{
	char **r;
	int i;
	int (*comp_func)(const void *,const void *);
	if(st == NULL) return -1;

	if (st->comp == NULL)
		{
		for (i=0; i<st->num; i++)
			if (st->data[i] == data)
				return(i);
		return(-1);
		}
	sk_sort(st);
	if (data == NULL) return(-1);
	/* This (and the "qsort" below) are the two places in OpenSSL
	 * where we need to convert from our standard (type **,type **)
	 * compare callback type to the (void *,void *) type required by
	 * bsearch. However, the "data" it is being called(back) with are
	 * not (type *) pointers, but the *pointers* to (type *) pointers,
	 * so we get our extra level of pointer dereferencing that way. */
	comp_func=(int (*)(const void *,const void *))(st->comp);
	r=(char **)OBJ_bsearch_ex((char *)&data,(char *)st->data,
		st->num,sizeof(char *),comp_func,ret_val_options);
	if (r == NULL) return(-1);
	return((int)(r-st->data));
	}
int sk_find(_STACK *sk, size_t *out_index, void *p) {
  if (sk == NULL) {
    return 0;
  }

  if (sk->comp == NULL) {
    // Use pointer equality when no comparison function has been set.
    for (size_t i = 0; i < sk->num; i++) {
      if (sk->data[i] == p) {
        if (out_index) {
          *out_index = i;
        }
        return 1;
      }
    }
    return 0;
  }

  if (p == NULL) {
    return 0;
  }

  sk_sort(sk);

  // sk->comp is a function that takes pointers to pointers to elements, but
  // qsort and bsearch take a comparison function that just takes pointers to
  // elements. However, since we're passing an array of pointers to
  // qsort/bsearch, we can just cast the comparison function and everything
  // works.
  const void *const *r = bsearch(&p, sk->data, sk->num, sizeof(void *),
                                 (int (*)(const void *, const void *))sk->comp);
  if (r == NULL) {
    return 0;
  }
  size_t idx = ((void **)r) - sk->data;
  // This function always returns the first result.
  while (idx > 0 &&
         sk->comp((const void **)&p, (const void **)&sk->data[idx - 1]) == 0) {
    idx--;
  }
  if (out_index) {
    *out_index = idx;
  }
  return 1;
}
Beispiel #4
0
static int internal_find(_STACK *st, void *data, int ret_val_options)
	{
	const void * const *r;
	int i;

	if(st == NULL) return -1;

	if (st->comp == NULL)
		{
		for (i=0; i<st->num; i++)
			if (st->data[i] == data)
				return(i);
		return(-1);
		}
	sk_sort(st);
	if (data == NULL) return(-1);
	r=OBJ_bsearch_ex_(&data,st->data,st->num,sizeof(void *),st->comp,
			  ret_val_options);
	if (r == NULL) return(-1);
	return (int)((char **)r-st->data);
	}
Beispiel #5
0
int sk_find(STACK *st, char *data)
	{
	char **r;
	int i;
	int (*comp_func)(const void *,const void *);
	if(st == NULL) return -1;

	if (st->comp == NULL)
		{
		for (i=0; i<st->num; i++)
			if (st->data[i] == data)
				return(i);
		return(-1);
		}
	sk_sort(st);
	if (data == NULL) return(-1);
	/* This (and the "qsort" below) are the two places in OpenSSL
	 * where we need to convert from our standard (type **,type **)
	 * compare callback type to the (void *,void *) type required by
	 * bsearch. However, the "data" it is being called(back) with are
	 * not (type *) pointers, but the *pointers* to (type *) pointers,
	 * so we get our extra level of pointer dereferencing that way. */
	comp_func=(int (*)(const void *,const void *))(st->comp);
	r=(char **)bsearch(&data,(char *)st->data,
		st->num,sizeof(char *), comp_func);
	if (r == NULL) return(-1);
	i=(int)(r-st->data);
	for ( ; i>0; i--)
		/* This needs a cast because the type being pointed to from
		 * the "&" expressions are (char *) rather than (const char *).
		 * For an explanation, read:
		 * http://www.eskimo.com/~scs/C-faq/q11.10.html :-) */
		if ((*st->comp)((const char * const *)&(st->data[i-1]),
				(const char * const *)&data) < 0)
			break;
	return(i);
	}
/**
*失効リストチェック関数
* @author University of Tsukuba
* @param *pInData 証明書データ 
* @param lInLen 証明書データ長
* @param *data CRLファイルデータ
* @param len CRLファイルデータレングス
* @return   long  0:未失効 1:失効中 -1:異常 
* @since 2008.02
* @version 1.0
*/
long IDMan_CmCheckCRL(void *pInData, long lInLen, void * data,unsigned long int len )
{
	long 			lRet=-1L;
	/*FILE 			*fp;*/
	X509 			*x509=0x00;
	X509_CRL 		*x509crl=0x00;
	X509_NAME 		*x509crlissuer = 0x00;
	int				iRet=0;
	int				idx;
	X509_REVOKED	rtmp;
	char			*p,*p2;
	char 			szErrBuff[1024];
	BIO 			* BIOptr;

	ERR_load_crypto_strings();

	IDMan_StMemset(szErrBuff, 0x00, sizeof(szErrBuff));

	/** 証明書データパラメータチェックを行う。 */
	/** エラー発生した場合、 */
	if (pInData == 0x00) 
	{
		/** −処理を中断する。 */
		return lRet;
	}
	/** 証明書長データパラメータチェックを行う。 */
	/** エラー発生した場合、 */
	if (lInLen == 0)
	{
		/** −処理を中断する。 */
		return lRet;
	}

	/** 失効データパラメータチェックを行う。 */
	/** 失効データが存在しない場合、 */
	if (data==0x00 || len == 0)
	{
		/** −正常終了する。 */
		lRet =0;
		return lRet;
	}

	
	/** X509構造体の初期化を行う。 */
	/** エラー発生した場合、 */
	if((x509 = X509_new())== 0x00) 
	{
		/** −処理を中断する。 */
		ERR_error_string(ERR_get_error(), szErrBuff);
		return lRet;
	}

	/** DERファイルから、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,pInData,lInLen);
	/** エラー発生した場合、 */
	if( iRet != lInLen )
	{
		/** −処理を中断する。 */
		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);
		if(x509 !=0x00)	X509_free(x509);
		BIO_free(BIOptr);
		return lRet;
	}

	/** BIO構造の解放を行う。 */
	BIO_free(BIOptr);

	/** issuerDNの取得を行う。 */
	X509_NAME *x509issuer = X509_get_issuer_name(x509);
	p = X509_NAME_oneline(x509issuer, 0, 0);	
	/** CRL情報の取得を行う。 */
	x509crl = X509_CRL_new();

	/** 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,data,len);
	/** エラー発生した場合、 */
	if( iRet != (int)len )
	{
		/** −処理を中断する。 */
		ERR_error_string(ERR_get_error(), szErrBuff);
		BIO_free(BIOptr);
		return lRet;
	}
	/** x509crl構造へ失効リストデータの設定を行う。 */
	x509crl = (X509_CRL *) d2i_X509_CRL_bio(BIOptr,0x00);
	/** エラー発生した場合、 */
	if(x509crl==0x00) 
	{
		/** −処理を中断する。 */
		ERR_error_string(ERR_get_error(), szErrBuff);
		if(x509 !=0x00)	X509_free(x509);
		if(x509crl !=0x00)	X509_CRL_free(x509crl);
		BIO_free(BIOptr);
		return lRet;
	}

	/** BIO構造の解放を行う。 */
	BIO_free(BIOptr);

	/** シリアル番号の取得を行う。 */
	rtmp.serialNumber = X509_get_serialNumber(x509);

	/** CRLのissuerDNの取得を行う。 */
	/** エラー発生した場合、 */
	x509crlissuer = X509_CRL_get_issuer(x509crl);
	if ( x509crlissuer == 0x00 )
	{
		/** −処理を中断する。 */
		ERR_error_string(ERR_get_error(), szErrBuff);
		if(x509 !=0x00)	X509_free(x509);
		if(x509crl !=0x00)	X509_CRL_free(x509crl);
		return lRet;
	}

	/** 証明書とCRLのissuerDNの比較を行う。 */
	p2 = X509_NAME_oneline(x509crlissuer, 0, 0);
	/** エラー発生した場合、 */
	if( strcmp(p, p2) != 0)
	{
		/** −処理を中断する。 */
		ERR_error_string(ERR_get_error(), szErrBuff);
		if(x509 !=0x00)	X509_free(x509);
		if(x509crl !=0x00)	X509_CRL_free(x509crl);
		return lRet;
	}

	/** CRLのシリアル番号をソートする。 */
	if (!sk_is_sorted(x509crl->crl->revoked)) 
	{
		sk_sort(x509crl->crl->revoked);
	}
	/** CRLのシリアル番号を検索する。 */
	idx = sk_X509_REVOKED_find(x509crl->crl->revoked, &rtmp);
	/** 該当シリアル番号が存在する場合、 */
	if (idx >= 0) 
	{
		/** −戻り値に1を設定する。 */
		lRet =1;
	}
	/** 該当シリアル番号が存在しない場合、 */
	else
	{
		/** −戻り値に0を設定する。 */
		lRet =0;
	}

	/** X509の開放を行う。 */
	if(x509 !=0x00)	X509_free(x509);

	/** X509CRLの開放を行う。 */
	if(x509crl !=0x00)	X509_CRL_free(x509crl);

	return lRet;
}