コード例 #1
0
ファイル: hw_ibmca.c プロジェクト: x684867/nemesis
static int ibmca_finish(ENGINE *e)

        {

        if(ibmca_dso == NULL)

                {

                IBMCAerr(IBMCA_F_IBMCA_FINISH,IBMCA_R_NOT_LOADED);

                return 0;

                }

        release_context(handle);

        if(!DSO_free(ibmca_dso))

                {

                IBMCAerr(IBMCA_F_IBMCA_FINISH,IBMCA_R_DSO_FAILURE);

                return 0;

                }

        ibmca_dso = NULL;



        return 1;

        }
コード例 #2
0
ファイル: hw_ibmca.c プロジェクト: LucidOne/Rovio
static int ibmca_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa)
        {
        BN_CTX *ctx;
        int to_return = 0;

        if((ctx = BN_CTX_new()) == NULL)
                goto err;
        if(!rsa->p || !rsa->q || !rsa->dmp1 || !rsa->dmq1 || !rsa->iqmp)
                {
                if(!rsa->d || !rsa->n)
                        {
                        IBMCAerr(IBMCA_F_IBMCA_RSA_MOD_EXP,
                                IBMCA_R_MISSING_KEY_COMPONENTS);
                        goto err;
                        }
                to_return = ibmca_mod_exp(r0, I, rsa->d, rsa->n, ctx);
                }
        else
                {
                to_return = ibmca_mod_exp_crt(r0, I, rsa->p, rsa->q, rsa->dmp1,
                        rsa->dmq1, rsa->iqmp, ctx);
                }
 err:
        if(ctx)
                BN_CTX_free(ctx);
        return to_return;
        }
コード例 #3
0
ファイル: hw_ibmca.c プロジェクト: x684867/nemesis
static int ibmca_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)())

	{

	int initialised = ((ibmca_dso == NULL) ? 0 : 1);

	switch(cmd)

		{

	case IBMCA_CMD_SO_PATH:

		if(p == NULL)

			{

			IBMCAerr(IBMCA_F_IBMCA_CTRL,ERR_R_PASSED_NULL_PARAMETER);

			return 0;

			}

		if(initialised)

			{

			IBMCAerr(IBMCA_F_IBMCA_CTRL,IBMCA_R_ALREADY_LOADED);

			return 0;

			}

		IBMCA_LIBNAME = (const char *)p;

		return 1;

	default:

		break;

		}

	IBMCAerr(IBMCA_F_IBMCA_CTRL,IBMCA_R_CTRL_COMMAND_NOT_IMPLEMENTED);

	return 0;

	}
コード例 #4
0
ファイル: hw_ibmca.c プロジェクト: x684867/nemesis
static int ibmca_rand_bytes(unsigned char *buf, int num)

        {

        int to_return = 0; /* assume failure */

        unsigned int ret;





        if(handle == 0)

                {

                IBMCAerr(IBMCA_F_IBMCA_RAND_BYTES,IBMCA_R_NOT_INITIALISED);

                goto err;

                }



        ret = p_icaRandomNumberGenerate(handle, num, buf);

        if (ret < 0)

                {

                IBMCAerr(IBMCA_F_IBMCA_RAND_BYTES,IBMCA_R_REQUEST_FAILED);

                goto err;

                }

        to_return = 1;

 err:

        return to_return;

        }
コード例 #5
0
ファイル: hw_ibmca.c プロジェクト: x684867/nemesis
static int ibmca_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,

        const BIGNUM *m, BN_CTX *ctx)

        {

        /* I need somewhere to store temporary serialised values for

         * use with the Ibmca API calls. A neat cheat - I'll use

         * BIGNUMs from the BN_CTX but access their arrays directly as

         * byte arrays <grin>. This way I don't have to clean anything

         * up. */



        BIGNUM *argument=NULL;

        BIGNUM *result=NULL;

        BIGNUM *key=NULL;

        int to_return;

	int inLen, outLen, tmpLen;





        ICA_KEY_RSA_MODEXPO *publKey=NULL;

        unsigned int rc;



        to_return = 0; /* expect failure */



        if(!ibmca_dso)

                {

                IBMCAerr(IBMCA_F_IBMCA_MOD_EXP,IBMCA_R_NOT_LOADED);

                goto err;

                }

        /* Prepare the params */

	BN_CTX_start(ctx);

        argument = BN_CTX_get(ctx);

        result = BN_CTX_get(ctx);

        key = BN_CTX_get(ctx);



        if( !argument || !result || !key)

                {

                IBMCAerr(IBMCA_F_IBMCA_MOD_EXP,IBMCA_R_BN_CTX_FULL);

                goto err;

                }





	if(!bn_wexpand(argument, m->top) || !bn_wexpand(result, m->top) ||

                !bn_wexpand(key, sizeof(*publKey)/BN_BYTES))



                {

                IBMCAerr(IBMCA_F_IBMCA_MOD_EXP,IBMCA_R_BN_EXPAND_FAIL);

                goto err;

                }



        publKey = (ICA_KEY_RSA_MODEXPO *)key->d;



        if (publKey == NULL)

                {

                goto err;

                }

        memset(publKey, 0, sizeof(ICA_KEY_RSA_MODEXPO));



        publKey->keyType   =  CORRECT_ENDIANNESS(ME_KEY_TYPE);

        publKey->keyLength =  CORRECT_ENDIANNESS(sizeof(ICA_KEY_RSA_MODEXPO));

        publKey->expOffset =  (char *) publKey->keyRecord - (char *) publKey;



        /* A quirk of the card: the exponent length has to be the same

     as the modulus (key) length */



	outLen = BN_num_bytes(m);



/* check for modulus length SAB*/

	if (outLen > 256 ) {

		IBMCAerr(IBMCA_F_IBMCA_MOD_EXP,IBMCA_R_MEXP_LENGTH_TO_LARGE);

		goto err;

	}

/* check for modulus length SAB*/





	publKey->expLength = publKey->nLength = outLen;

/* SAB Check for underflow condition

    the size of the exponent is less than the size of the parameter

    then we have a big problem and will underflow the keyRecord

   buffer.  Bad stuff could happen then

*/

if (outLen < BN_num_bytes(p)){

	IBMCAerr(IBMCA_F_IBMCA_MOD_EXP,IBMCA_R_UNDERFLOW_KEYRECORD);

	goto err;

}

/* SAB End check for underflow */





        BN_bn2bin(p, &publKey->keyRecord[publKey->expLength -

                BN_num_bytes(p)]);

        BN_bn2bin(m, &publKey->keyRecord[publKey->expLength]);







        publKey->modulusBitLength = CORRECT_ENDIANNESS(publKey->nLength * 8);

        publKey->nOffset   = CORRECT_ENDIANNESS(publKey->expOffset + 

						publKey->expLength);



        publKey->expOffset = CORRECT_ENDIANNESS((char *) publKey->keyRecord - 

						(char *) publKey);



	tmpLen = outLen;

	publKey->expLength = publKey->nLength = CORRECT_ENDIANNESS(tmpLen);



  /* Prepare the argument */



	memset(argument->d, 0, outLen);

	BN_bn2bin(a, (unsigned char *)argument->d + outLen -

                 BN_num_bytes(a));



	inLen = outLen;



  /* Perform the operation */



          if( (rc = p_icaRsaModExpo(handle, inLen,(unsigned char *)argument->d,

                publKey, &outLen, (unsigned char *)result->d))

                !=0 )



                {

                printf("rc = %d\n", rc);

                IBMCAerr(IBMCA_F_IBMCA_MOD_EXP,IBMCA_R_REQUEST_FAILED);

                goto err;

                }





        /* Convert the response */

        BN_bin2bn((unsigned char *)result->d, outLen, r);

        to_return = 1;

 err:

	BN_CTX_end(ctx);

        return to_return;

        }
コード例 #6
0
ファイル: hw_ibmca.c プロジェクト: x684867/nemesis
static int ibmca_init(ENGINE *e)

        {



        void          (*p1)();

        void          (*p2)();

        void          (*p3)();

        void          (*p4)();

        void          (*p5)();



        if(ibmca_dso != NULL)

                {

                IBMCAerr(IBMCA_F_IBMCA_INIT,IBMCA_R_ALREADY_LOADED);

                goto err;

                }

        /* Attempt to load libatasi.so/atasi.dll/whatever. Needs to be

         * changed unfortunately because the Ibmca drivers don't have

         * standard library names that can be platform-translated well. */

        /* TODO: Work out how to actually map to the names the Ibmca

         * drivers really use - for now a symbollic link needs to be

         * created on the host system from libatasi.so to atasi.so on

         * unix variants. */



	/* WJH XXX check name translation */



        ibmca_dso = DSO_load(NULL, IBMCA_LIBNAME, NULL,

			     /* DSO_FLAG_NAME_TRANSLATION */ 0);

        if(ibmca_dso == NULL)

                {

                IBMCAerr(IBMCA_F_IBMCA_INIT,IBMCA_R_DSO_FAILURE);

                goto err;

                }



        if(!(p1 = DSO_bind_func(

                ibmca_dso, IBMCA_F1)) ||

                !(p2 = DSO_bind_func(

                        ibmca_dso, IBMCA_F2)) ||

                !(p3 = DSO_bind_func(

                        ibmca_dso, IBMCA_F3)) ||

                !(p4 = DSO_bind_func(

                        ibmca_dso, IBMCA_F4)) ||

                !(p5 = DSO_bind_func(

                        ibmca_dso, IBMCA_F5)))

                {

                IBMCAerr(IBMCA_F_IBMCA_INIT,IBMCA_R_DSO_FAILURE);

                goto err;

                }



        /* Copy the pointers */



	p_icaOpenAdapter =           (unsigned int (ICA_CALL *)())p1;

	p_icaCloseAdapter =          (unsigned int (ICA_CALL *)())p2;

	p_icaRsaModExpo =            (unsigned int (ICA_CALL *)())p3;

	p_icaRandomNumberGenerate =  (unsigned int (ICA_CALL *)())p4;

	p_icaRsaCrt =                (unsigned int (ICA_CALL *)())p5;



        if(!get_context(&handle))

                {

                IBMCAerr(IBMCA_F_IBMCA_INIT,IBMCA_R_UNIT_FAILURE);

                goto err;

                }



        return 1;

 err:

        if(ibmca_dso)

                DSO_free(ibmca_dso);



        p_icaOpenAdapter = NULL;

        p_icaCloseAdapter = NULL;

        p_icaRsaModExpo = NULL;

        p_icaRandomNumberGenerate = NULL;



        return 0;

        }
コード例 #7
0
ファイル: hw_ibmca.c プロジェクト: x684867/nemesis
static int ibmca_mod_exp_crt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,

        const BIGNUM *q, const BIGNUM *dmp1,

        const BIGNUM *dmq1, const BIGNUM *iqmp, BN_CTX *ctx)

        {



        BIGNUM *argument = NULL;

        BIGNUM *result = NULL;

        BIGNUM *key = NULL;



        int to_return = 0; /* expect failure */



        char                *pkey=NULL;

        ICA_KEY_RSA_CRT     *privKey=NULL;

        int inLen, outLen;



        int rc;

        unsigned int        offset, pSize, qSize;

/* SAB New variables */

	unsigned int keyRecordSize;

	unsigned int pbytes = BN_num_bytes(p);

	unsigned int qbytes = BN_num_bytes(q);

	unsigned int dmp1bytes = BN_num_bytes(dmp1);

	unsigned int dmq1bytes = BN_num_bytes(dmq1);

	unsigned int iqmpbytes = BN_num_bytes(iqmp);



        /* Prepare the params */



	BN_CTX_start(ctx);

        argument = BN_CTX_get(ctx);

        result = BN_CTX_get(ctx);

        key = BN_CTX_get(ctx);



        if(!argument || !result || !key)

                {

                IBMCAerr(IBMCA_F_IBMCA_MOD_EXP_CRT,IBMCA_R_BN_CTX_FULL);

                goto err;

                }



	if(!bn_wexpand(argument, p->top + q->top) ||

                !bn_wexpand(result, p->top + q->top) ||

                !bn_wexpand(key, sizeof(*privKey)/BN_BYTES ))

                {

                IBMCAerr(IBMCA_F_IBMCA_MOD_EXP_CRT,IBMCA_R_BN_EXPAND_FAIL);

                goto err;

                }





        privKey = (ICA_KEY_RSA_CRT *)key->d;

/* SAB Add check for total size in bytes of the parms does not exceed

   the buffer space we have

   do this first

*/

      keyRecordSize = pbytes+qbytes+dmp1bytes+dmq1bytes+iqmpbytes;

     if (  keyRecordSize > sizeof(privKey->keyRecord )) {

	 IBMCAerr(IBMCA_F_IBMCA_MOD_EXP_CRT,IBMCA_R_OPERANDS_TO_LARGE);

         goto err;

     }



     if ( (qbytes + dmq1bytes)  > 256 ){

	 IBMCAerr(IBMCA_F_IBMCA_MOD_EXP_CRT,IBMCA_R_OPERANDS_TO_LARGE);

         goto err;

     }



     if ( pbytes + dmp1bytes > 256 ) {

	 IBMCAerr(IBMCA_F_IBMCA_MOD_EXP_CRT,IBMCA_R_OPERANDS_TO_LARGE);

         goto err;

     }



/* end SAB additions */

  

        memset(privKey, 0, sizeof(ICA_KEY_RSA_CRT));

        privKey->keyType =  CORRECT_ENDIANNESS(CRT_KEY_TYPE);

        privKey->keyLength = CORRECT_ENDIANNESS(sizeof(ICA_KEY_RSA_CRT));

        privKey->modulusBitLength = 

	  CORRECT_ENDIANNESS(BN_num_bytes(q) * 2 * 8);



        /*

         * p,dp & qInv are 1 QWORD Larger

         */

        privKey->pLength = CORRECT_ENDIANNESS(BN_num_bytes(p)+8);

        privKey->qLength = CORRECT_ENDIANNESS(BN_num_bytes(q));

        privKey->dpLength = CORRECT_ENDIANNESS(BN_num_bytes(dmp1)+8);

        privKey->dqLength = CORRECT_ENDIANNESS(BN_num_bytes(dmq1));

        privKey->qInvLength = CORRECT_ENDIANNESS(BN_num_bytes(iqmp)+8);



        offset = (char *) privKey->keyRecord

                  - (char *) privKey;



        qSize = BN_num_bytes(q);

        pSize = qSize + 8;   /*  1 QWORD larger */





/* SAB  probably aittle redundant, but we'll verify that each of the

   components which make up a key record sent ot the card does not exceed

   the space that is allocated for it.  this handles the case where even if

   the total length does not exceed keyrecord zied, if the operands are funny sized

they could cause potential side affects on either the card or the result */



     if ( (pbytes > pSize) || (dmp1bytes > pSize) ||

          (iqmpbytes > pSize) || ( qbytes >qSize) ||

          (dmq1bytes > qSize) ) {

		IBMCAerr(IBMCA_F_IBMCA_MOD_EXP_CRT, IBMCA_R_OPERANDS_TO_LARGE);

		goto err;



	}

     



        privKey->dpOffset = CORRECT_ENDIANNESS(offset);



	offset += pSize;

	privKey->dqOffset = CORRECT_ENDIANNESS(offset);



	offset += qSize;

	privKey->pOffset = CORRECT_ENDIANNESS(offset);



	offset += pSize;

	privKey->qOffset = CORRECT_ENDIANNESS(offset);



	offset += qSize;

	privKey->qInvOffset = CORRECT_ENDIANNESS(offset);



        pkey = (char *) privKey->keyRecord;





/* SAB first check that we don;t under flow the buffer */

	if ( pSize < pbytes ) {

		IBMCAerr(IBMCA_F_IBMCA_MOD_EXP_CRT, IBMCA_R_UNDERFLOW_CONDITION);

		goto err;

	}



        /* pkey += pSize - BN_num_bytes(p); WROING this should be dmp1) */

        pkey += pSize - BN_num_bytes(dmp1);

        BN_bn2bin(dmp1, pkey);   

        pkey += BN_num_bytes(dmp1);  /* move the pointer */



        BN_bn2bin(dmq1, pkey);  /* Copy over dmq1 */



        pkey += qSize;     /* move pointer */

	pkey += pSize - BN_num_bytes(p);  /* set up for zero padding of next field */



        BN_bn2bin(p, pkey);

        pkey += BN_num_bytes(p);  /* increment pointer by number of bytes moved  */



        BN_bn2bin(q, pkey);

        pkey += qSize ;  /* move the pointer */

	pkey +=  pSize - BN_num_bytes(iqmp); /* Adjust for padding */

        BN_bn2bin(iqmp, pkey);



        /* Prepare the argument and response */



	outLen = CORRECT_ENDIANNESS(privKey->qLength) * 2;  /* Correct endianess is used 

						because the fields were converted above */



        if (outLen > 256) {

		IBMCAerr(IBMCA_F_IBMCA_MOD_EXP_CRT,IBMCA_R_OUTLEN_TO_LARGE);

		goto err;

	}



	/* SAB check for underflow here on the argeument */

	if ( outLen < BN_num_bytes(a)) {

		IBMCAerr(IBMCA_F_IBMCA_MOD_EXP_CRT,IBMCA_R_UNDERFLOW_CONDITION);

		goto err;

	}



        BN_bn2bin(a, (unsigned char *)argument->d + outLen -

                          BN_num_bytes(a));

        inLen = outLen;



        memset(result->d, 0, outLen);



        /* Perform the operation */



        if ( (rc = p_icaRsaCrt(handle, inLen, (unsigned char *)argument->d,

                privKey, &outLen, (unsigned char *)result->d)) != 0)

                {

                printf("rc = %d\n", rc);

                IBMCAerr(IBMCA_F_IBMCA_MOD_EXP_CRT,IBMCA_R_REQUEST_FAILED);

                goto err;

                }



        /* Convert the response */



        BN_bin2bn((unsigned char *)result->d, outLen, r);

        to_return = 1;



 err:

	BN_CTX_end(ctx);

        return to_return;



        }