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); }
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; }
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); }
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; }