Click here to Skip to main content
15,895,142 members
Articles / Programming Languages / C++

HookAPI source code

Rate me:
Please Sign up or sign in to vote.
3.09/5 (36 votes)
31 Jan 20052 min read 392.4K   9.6K   117  
A system wide api source code for windows api hook developpers
#include <stdio.h>
#include <memory.h>
#include <string.h>


#define FUNC_OK             0
#define FUNC_ERR            1

#define CPTR            *               
#define CCPTR           **
#define PUB_FUNC_RTN    uint32                  

#include "ca_common.h"
#include "csp_api.h"
#include "md2.h"/*../soft_crypt/*/
#include "md5.h"/*../soft_crypt/*/
#include "sha.h"/*../soft_crypt/*/

#include "common.h"
#include "g_val.h"
#include "asn1.h"

#include "cryptapi.h"
#include "rsaref.h"

static uint8  MD2_DIGEST_INFO[] = {
           0x30, 0x20, 
			     0x30, 0x0c, 
				       0x06, 0x08, 
					         0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x02,
                       0x05, 0x00,
                 0x04, 0x10 
};
 
static uint8  MD5_DIGEST_INFO[] = {
           0x30, 0x20, 
			     0x30, 0x0c, 
				       0x06, 0x08, 
					         0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05,
                       0x05, 0x00,
                 0x04, 0x10 
};

 
static uint8  SHA1_DIGEST_INFO[] = {
           0x30, 0x21, 
			     0x30, 0x09, 
				       0x06, 0x05, 
					         0x2b, 0x0e, 0x03, 0x02, 0x1a,
                       0x05, 0x00,
                 0x04, 0x14 
};


char *del_rn(char *pbuf);

CRET Crypt_Get_Version(char* version)
{
//	int rtn_code;

	strcpy(version, "2.0");

	return 0;
}



CRET Crypt_InitEnvironment(void)
{
	int rtn_code;

    rtn_code = CSP_InitEnvironment();
    if(rtn_code != RTN_OK){
		return FUNC_ERR;
	}

	return FUNC_OK;
}

CRET Crypt_ClearEnvironment(void)
{
	int rtn_code;

    rtn_code = CSP_ClearEnvironment();
    if(rtn_code != RTN_OK){
		return FUNC_ERR;
	}

	return FUNC_OK;
}


CRET CA_Crypt_Gen_Hash(
        int    uid_algorithm,
        unsigned char    *msg,
        int              msgSize,
        unsigned char    *hash,
		int              *hashSize)
{
	return Crypt_Gen_Hash(
        uid_algorithm,
        msg,
        msgSize,
        hash,
		hashSize);
}

int Crypt_Gen_Hash(
        int    uid_algorithm,
        unsigned char    *msg,
        int              msgSize,
        unsigned char    *hash,
		int              *hashSize)
{

	switch(uid_algorithm){
   	    case UID_md2WithRSAEncryption:
			MD2(msg,msgSize,hash);
			*hashSize = 16;
			break;
   	    case UID_md5WithRSAEncryption:
			MD5(msg,msgSize,hash);
			*hashSize = 16;
			break;
        case UID_md5:
			MD5(msg,msgSize,hash);
			*hashSize = 16;
			break;
   	    case UID_sha1WithRSASignature:
			SHA1(msg,msgSize,hash);
			*hashSize = 20;
			break;
   	    case UID_sha1:
			SHA1(msg,msgSize,hash);
			*hashSize = 20;
			break;
		default:
			return FUNC_ERR;
 	}

	return FUNC_OK;
}


CRET Crypt_Gen_Encoded_Hash(
        int    uid_algorithm,
        unsigned char    *msg,
        int              msgSize,
        unsigned char    *hash,
		int              *hashSize)
{
	unsigned char digestValue[32];
	int i;

	switch(uid_algorithm){
   	    case UID_md2WithRSAEncryption:
			MD2(msg,msgSize,digestValue);

			i = sizeof(MD2_DIGEST_INFO);
            memcpy(hash,MD2_DIGEST_INFO,i);
            memcpy(&hash[i],digestValue,16);

			*hashSize = i + 16;
			break;
   	    case UID_md5WithRSAEncryption:
			MD5(msg,msgSize,digestValue);

			i = sizeof(MD5_DIGEST_INFO);
            memcpy(hash,MD5_DIGEST_INFO,i);
            memcpy(&hash[i],digestValue,16);

			*hashSize = i + 16;
			break;
        case UID_md5:
			MD5(msg,msgSize,digestValue);

			i = sizeof(MD5_DIGEST_INFO);
            memcpy(hash,MD5_DIGEST_INFO,i);
            memcpy(&hash[i],digestValue,16);

			*hashSize = i + 16;
 			break;
   	    case UID_sha1WithRSASignature:
			SHA1(msg,msgSize,digestValue);

			i = sizeof(SHA1_DIGEST_INFO);
            memcpy(hash,SHA1_DIGEST_INFO,i);
            memcpy(&hash[i],digestValue,20);

			*hashSize = i + 20;
			break;
   	    case UID_sha1:
			SHA1(msg,msgSize,digestValue);

			i = sizeof(SHA1_DIGEST_INFO);
            memcpy(hash,SHA1_DIGEST_INFO,i);
            memcpy(&hash[i],digestValue,20);

			*hashSize = i + 20;
 			break;
		default:
			return FUNC_ERR;
 	}

	return FUNC_OK;
}


int c2d_RSA_PUBLIC_KEY(
        RSA_PUBLIC_KEY  *rsaPublicKey,
        uint8   *rsaPublicKeyDERString,
        uint32  *rsaPublicKeyDERStringLen)
{
/*
RSAPublicKey ::= SEQUENCE {
    modulus            INTEGER, -- n
    publicExponent     INTEGER  -- e -- }
 
typedef struct {
    uint16    bits;    
    UCHAR     modulus[MAX_RSA_MODULUS_LEN]; 
    UCHAR     publicExponent [MAX_RSA_MODULUS_LEN];  
}RSA_PUBLIC_KEY;
*/
 	DATA_BUFFER t_buf;
 	ASN1_SEQUENCE *p_head,*p_cur,*p_tail;
	uint8 buf[8]; 
	uint32 rtn_code;
	uint32 i,j,flag;

	p_head = 0;
	p_cur = 0;

	flag = 0;
	/* encode the n */
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
			if(p_head != 0)
				free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPublicKey->modulus[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPublicKey->modulus[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
		if(p_head!=0)
			free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

	/* encode the e */
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
			if(p_head!=0)
				free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPublicKey->publicExponent[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPublicKey->publicExponent[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
		if(p_head!=0)
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}
 
    /* encode the whole sequence */
    rtn_code = ASN1_Encode_Sequence(
                   p_head,
				   &t_buf);
    if(rtn_code != FUNC_OK){
		if(p_head!=0)
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    *rsaPublicKeyDERStringLen = t_buf.length;
	memcpy(rsaPublicKeyDERString,t_buf.data,*rsaPublicKeyDERStringLen);

	rtn_code = free_ASN1_SEQUENCE(p_head);
    if(rtn_code != FUNC_OK){
		if(p_head!=0)
        free_DATA_BUFFER(&t_buf);
		return FUNC_ERR;
	}

    rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		return FUNC_ERR;
	}

	return FUNC_OK;
}

int d2c_RSA_PUBLIC_KEY(
        uint8  *rsaPublicKeyDERString,
        uint32 rsaPublicKeyDERStringLen,
        RSA_PUBLIC_KEY  *rsaPublicKey)
{
 	DATA_BUFFER t_buf;
 	ASN1_SEQUENCE *p_head,*p_cur;
	uint32 rtn_code;
	uint32 i;

	memset(rsaPublicKey,0,sizeof(RSA_PUBLIC_KEY));

	/* decode the sequence */
    t_buf.length = rsaPublicKeyDERStringLen;
	t_buf.data = rsaPublicKeyDERString;
    rtn_code = ASN1_Decode_Sequence(
 			       t_buf,
			       &p_head);
	p_cur = p_head;

    /* decode the n */
	if(p_cur == NULL){
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    if(t_buf.length <= 64){
		rsaPublicKey->bits = 512;
	}
	else{
        if(t_buf.length <= 128){
		    rsaPublicKey->bits = 1024;
		}
		else{
			if(t_buf.length <= 256){
		        rsaPublicKey->bits = 2048;
			}
			else{
		        return FUNC_ERR;
			}
		}
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPublicKey->modulus[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    /* decode the e */
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPublicKey->publicExponent[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

	rtn_code = free_ASN1_SEQUENCE(p_head);
    if(rtn_code != FUNC_OK){
		return FUNC_ERR;
	}

	return FUNC_OK;
}

int c2d_RSA_PRIVATE_KEY(
        RSA_PRIVATE_KEY  *rsaPrivateKey,
        uint8  *rsaPrivateKeyDERString,
        uint32 *rsaPrivateKeyDERStringLen)
{    
/*
RSAPrivateKey ::= SEQUENCE {
  version Version,
  modulus INTEGER, -- n
  publicExponent INTEGER, -- e
  privateExponent INTEGER, -- d
  prime1 INTEGER, -- p
  prime2 INTEGER, -- q
  exponent1 INTEGER, -- d mod (p-1)
  exponent2 INTEGER, -- d mod (q-1)
  coefficient INTEGER -- (inverse of q) mod p }

typedef struct rsa_pri_key{
uint16    bits;     
UCHAR     modulus[MAX_RSA_MODULUS_LEN]; 
UCHAR     publicExponent[MAX_RSA_MODULUS_LEN]; 
UCHAR     privateExponent[MAX_RSA_MODULUS_LEN];          
UCHAR     prime[2][MAX_RSA_PRIME_LEN];               
UCHAR     exponent[2][MAX_RSA_PRIME_LEN];               
UCHAR     coefficient [MAX_RSA_PRIME_LEN];               
UCHAR	  N[MAX_RSA_MODULUS_LEN];
UCHAR	  P[MAX_RSA_MODULUS_LEN];
UCHAR	  Q[MAX_RSA_MODULUS_LEN];
UCHAR	  d1[MAX_RSA_MODULUS_LEN];
UCHAR	  d2[MAX_RSA_MODULUS_LEN];
UCHAR	  P_[MAX_RSA_MODULUS_LEN];
UCHAR	  Q_[MAX_RSA_MODULUS_LEN];
UCHAR	  S[MAX_RSA_MODULUS_LEN];
UCHAR	  T[MAX_RSA_MODULUS_LEN];
} RSA_PRIVATE_KEY;
*/
	DATA_BUFFER t_buf;
 	ASN1_SEQUENCE *p_head,*p_cur,*p_tail;
	uint8 buf[8]; 
	uint32 rtn_code;
	uint32 i,j,flag;

    flag = 0;
	p_head = 0;
	p_cur = 0;

	/* encode the version */
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

    buf[0] = 0;
 
	t_buf.length = 1;
	t_buf.data = buf;

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

	/* encode the modulus */
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPrivateKey->modulus[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPrivateKey->modulus[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

	/* encode the publicExponent */
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPrivateKey->publicExponent[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPrivateKey->publicExponent[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

	/* encode the privateExponent */
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPrivateKey->privateExponent[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPrivateKey->privateExponent[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

	/* encode the prime[0] */
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_PRIME_LEN;i++){
		if(rsaPrivateKey->prime[0][i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_PRIME_LEN - j;
	t_buf.data = &rsaPrivateKey->prime[0][j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

	/* encode the prime[1] */
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_PRIME_LEN;i++){
		if(rsaPrivateKey->prime[1][i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_PRIME_LEN - j;
	t_buf.data = &rsaPrivateKey->prime[1][j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

	/* encode the exponent[0] */
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_PRIME_LEN;i++){
		if(rsaPrivateKey->exponent[0][i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_PRIME_LEN - j;
	t_buf.data = &rsaPrivateKey->exponent[0][j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

	/* encode the exponent[1] */
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_PRIME_LEN;i++){
		if(rsaPrivateKey->exponent[1][i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_PRIME_LEN - j;
	t_buf.data = &rsaPrivateKey->exponent[1][j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

	/* encode the coefficient */
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_PRIME_LEN;i++){
		if(rsaPrivateKey->coefficient[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_PRIME_LEN - j;
	t_buf.data = &rsaPrivateKey->coefficient[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}
/***************************************/
/*	 
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPrivateKey->N[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPrivateKey->N[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}
 
 
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPrivateKey->P[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPrivateKey->P[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

 
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPrivateKey->Q[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPrivateKey->Q[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

 
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPrivateKey->d1[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPrivateKey->d1[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

 
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPrivateKey->d2[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPrivateKey->d2[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

 
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPrivateKey->P_[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPrivateKey->P_[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

 
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPrivateKey->Q_[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPrivateKey->Q_[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}


 
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPrivateKey->S[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPrivateKey->S[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

 
	if(flag == 0){
		flag = 1;
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
	        return FUNC_ERR;
		}

        p_head = p_tail;
        p_cur = p_tail;
	}
	else{
        rtn_code = new_ASN1_SEQUENCE(&p_tail);
        if(rtn_code != FUNC_OK){
            free_ASN1_SEQUENCE(p_head);
	        return FUNC_ERR;
		}

        p_cur->next = p_tail;
        p_cur = p_tail;
	}

	j = 0;
	for(i=0;i<MAX_RSA_MODULUS_LEN;i++){
		if(rsaPrivateKey->T[i] == 0){
			j++;
		}
		else{
			break;
		}
	}

	t_buf.length = MAX_RSA_MODULUS_LEN - j;
	t_buf.data = &rsaPrivateKey->T[j];

	if(t_buf.length == 0){
        buf[0] = 0;
	    t_buf.length = 1;
	    t_buf.data = buf;
    }

    rtn_code = ASN1_Encode_Integer(
                   t_buf,
			       &p_cur->data);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}
*/
/****************************************/
    /* encode the whole sequence */
    rtn_code = ASN1_Encode_Sequence(
                   p_head,
				   &t_buf);
    if(rtn_code != FUNC_OK){
        free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    *rsaPrivateKeyDERStringLen = t_buf.length;
	memcpy(rsaPrivateKeyDERString,t_buf.data,*rsaPrivateKeyDERStringLen);

	rtn_code = free_ASN1_SEQUENCE(p_head);
    if(rtn_code != FUNC_OK){
        free_DATA_BUFFER(&t_buf);
		return FUNC_ERR;
	}

    rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		return FUNC_ERR;
	}

	return FUNC_OK;
}

int d2c_RSA_PRIVATE_KEY(
        uint8  *rsaPrivateKeyDERString,
        uint32 rsaPrivateKeyDERStringLen,
        RSA_PRIVATE_KEY  *rsaPrivateKey)
{
/*
typedef struct rsa_pri_key{
uint16    bits;     
UCHAR     modulus[MAX_RSA_MODULUS_LEN]; 
UCHAR     publicExponent[MAX_RSA_MODULUS_LEN]; 
UCHAR     privateExponent[MAX_RSA_MODULUS_LEN];          
UCHAR     prime[2][MAX_RSA_PRIME_LEN];               
UCHAR     exponent[2][MAX_RSA_PRIME_LEN];               
UCHAR     coefficient [MAX_RSA_PRIME_LEN];               
UCHAR	  N[MAX_RSA_MODULUS_LEN];
UCHAR	  P[MAX_RSA_MODULUS_LEN];
UCHAR	  Q[MAX_RSA_MODULUS_LEN];
UCHAR	  d1[MAX_RSA_MODULUS_LEN];
UCHAR	  d2[MAX_RSA_MODULUS_LEN];
UCHAR	  P_[MAX_RSA_MODULUS_LEN];
UCHAR	  Q_[MAX_RSA_MODULUS_LEN];
UCHAR	  S[MAX_RSA_MODULUS_LEN];
UCHAR	  T[MAX_RSA_MODULUS_LEN];
} RSA_PRIVATE_KEY;
*/
 	DATA_BUFFER t_buf;
 	ASN1_SEQUENCE *p_head,*p_cur;
	uint32 rtn_code;
	uint32 i;

	memset(rsaPrivateKey,0,sizeof(RSA_PRIVATE_KEY));

	/* decode the sequence */
    t_buf.length = rsaPrivateKeyDERStringLen;
	t_buf.data = rsaPrivateKeyDERString;
    rtn_code = ASN1_Decode_Sequence(
 			       t_buf,
			       &p_head);
	p_cur = p_head;

    /* decode the modulus */
	p_cur = p_cur->next; /* igore the version */
	if(p_cur == NULL){
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->modulus[i],t_buf.data,t_buf.length);

////////////////////////////  decode the bits  //////////////////
	if(t_buf.length <= 64){
		rsaPrivateKey->bits = 512;
	}
	else{
        if(t_buf.length <= 128){
		    rsaPrivateKey->bits = 1024;
		}
		else{
			if(t_buf.length <= 256){
		        rsaPrivateKey->bits = 2048;
			}
			else{
		        return FUNC_ERR;
			}
		}
	}
///////////////////////////////////////////////////////////////

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    /* decode the publicExponent */
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->publicExponent[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    /* decode the privateExponent */
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->privateExponent[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    /* decode the prime[0] */
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_PRIME_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->prime[0][i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    /* decode the prime[1] */
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_PRIME_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->prime[1][i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    /* decode the exponent[0] */
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_PRIME_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->exponent[0][i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    /* decode the exponent[1] */
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_PRIME_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->exponent[1][i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    /* decode the coefficient */
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_PRIME_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->coefficient[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}
/***************************************/
/*     
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    if(t_buf.length <= 64){
		rsaPrivateKey->bits = 512;
	}
	else{
        if(t_buf.length <= 128){
		    rsaPrivateKey->bits = 1024;
		}
		else{
			if(t_buf.length <= 256){
		        rsaPrivateKey->bits = 2048;
			}
			else{
		        return FUNC_ERR;
			}
		}
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->N[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}
 
    
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->P[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

   
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->Q[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->d1[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

  
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->d2[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

  
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->P_[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

   
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->Q_[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

   
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->S[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

   
	p_cur = p_cur->next;
	if(p_cur == NULL){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    rtn_code = ASN1_Decode_Integer(
		           p_cur->data,
                   &t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}

    i = MAX_RSA_MODULUS_LEN - t_buf.length;
    memcpy(&rsaPrivateKey->T[i],t_buf.data,t_buf.length);

	rtn_code = free_DATA_BUFFER(&t_buf);
    if(rtn_code != FUNC_OK){
		free_ASN1_SEQUENCE(p_head);
		return FUNC_ERR;
	}
*/
/******************************************/
	rtn_code = free_ASN1_SEQUENCE(p_head);
    if(rtn_code != FUNC_OK){
		return FUNC_ERR;
	}

	return FUNC_OK;
}

  
CRET Crypt_GenRSAKeyPair(
        char          *keyName,
        char          *password,
		unsigned char *DerPubkey,
		int			  *DerPubkeyLen,
		unsigned char *DerPrikey,
		int			  *DerPrikeyLen)
{
    int rtn_code;
    int keyNumber;
    RSA_PUBLIC_KEY  cardRsaPublicKey;
    RSA_PRIVATE_KEY cardRsaPrivateKey;
 
    keyNumber = 0;

	if(strcmp(keyName,"keypair.db1") == 0){
        keyNumber = 1;
	}

	if(strcmp(keyName,"keypair.db2") == 0){
        keyNumber = 2;
	}

	if(strcmp(keyName,"keypair.db3") == 0){
        keyNumber = 3;
	}

	if(strcmp(keyName,"keypair.db4") == 0){
        keyNumber = 4;
	}

	if(strcmp(keyName,"keypair.db5") == 0){
        keyNumber = 5;
	}
     
//printf("key filename %s\n\n", keyname);
    rtn_code = CSP_GenRSAKeyPair(
                   (USHORT)keyNumber,
                   &cardRsaPublicKey,
                   &cardRsaPrivateKey);
    if(rtn_code != 0){
        return FUNC_ERR;
    }



    rtn_code = c2d_RSA_PUBLIC_KEY(&cardRsaPublicKey,
                       DerPubkey,
			           DerPubkeyLen);
    if(rtn_code != FUNC_OK){
        return FUNC_ERR;
    }

	rtn_code = c2d_RSA_PRIVATE_KEY(
        &cardRsaPrivateKey,
        DerPrikey,
        DerPrikeyLen);
    if(rtn_code != FUNC_OK){
        return FUNC_ERR;
    }

    if(keyNumber == 0){
		
		rtn_code = Crypt_SavePemKey2File(
		        keyName,
				password,
				/*&cardRsaPublicKey,*/ DerPubkey,
				/*sizeof(RSA_PUBLIC_KEY),*/ *DerPubkeyLen,
				/*&cardRsaPrivateKey,*/ DerPrikey,
				/*sizeof(RSA_PRIVATE_KEY));*/ *DerPrikeyLen);
		if(rtn_code != 0)
			return -1;
	}

	return FUNC_OK;
}

int Crypt_SavePemKey2File(
        char          *keyName,
        char          *password,
		unsigned char *DerPubkey,
		int			  DerPubkeyLen,
		unsigned char *DerPrikey,
		int			  DerPrikeyLen)
{

	FILE    *f;
	unsigned char pem_key[2048], hashPasswd[20], Enc_DerPubkey[2048];
	int rtn_code, pem_keySize, hashPasswdSize, Enc_DerPubkeySize;

    f = fopen(keyName,"wb");
	    if(f == NULL){
		    return FUNC_ERR;
        }

	rtn_code = Crypt_Gen_Hash(
				UID_md5,
				password,
				strlen(password),
				hashPasswd,
				&hashPasswdSize);
	if(rtn_code != 0)
		return -1;
/*
	rtn_code = iCrypt_Enc_Data_S(
				DerPubkey,
				DerPubkeyLen,
				Enc_DerPubkey,
				&Enc_DerPubkeySize,
				hashPasswd);
	if(rtn_code != 0)
		return -1;
*/	    
	rtn_code = DER2PEM_data_format(
                   DerPubkey,//Enc_DerPubkey, 
                   DerPubkeyLen,//Enc_DerPubkeySize,
                   pem_key,
                   &pem_keySize,
                   PublicKey_Begin_String, 
                   PublicKey_End_String);
    if(rtn_code != FUNC_OK){
        printf("DER2PEM_data_format error...\n");
        return -1;
    }
	fwrite(pem_key,1,pem_keySize,f);

	rtn_code = iCrypt_Enc_Data_S(
				DerPrikey,
				DerPrikeyLen,
				Enc_DerPubkey,
				&Enc_DerPubkeySize,
				hashPasswd);
	if(rtn_code != 0)
		return -1;
			

	rtn_code = DER2PEM_data_format(
                   Enc_DerPubkey, 
                   Enc_DerPubkeySize,
                   pem_key,
                   &pem_keySize,
                   PrivateKey_Begin_String, 
                   PrivateKey_End_String);
    if(rtn_code != FUNC_OK){
        printf("DER2PEM_data_format error...\n");
        return -1;
    }
	fwrite(pem_key,1,pem_keySize,f);

	fclose(f);

	return 0;
}
	

CRET Crypt_ChgKeyPasswd(
        char          *keyName,
		char          *OldPasswd,
		char          *NewPasswd)
{
	unsigned char DerPubKey[1024], DerPrikey[1024];
	int rtn_code, DerPubKeyLen, DerPrikeyLen, keyNumber;
//    RSA_PUBLIC_KEY  cardRsaPublicKey;
//    RSA_PRIVATE_KEY cardRsaPrivateKey;

    keyNumber = 0;

	if(strcmp(keyName,"keypair.db1") == 0){
        keyNumber = 1;
	}

	if(strcmp(keyName,"keypair.db2") == 0){
        keyNumber = 2;
	}

	if(strcmp(keyName,"keypair.db3") == 0){
        keyNumber = 3;
	}

	if(strcmp(keyName,"keypair.db4") == 0){
        keyNumber = 4;
	}

	if(strcmp(keyName,"keypair.db5") == 0){
        keyNumber = 5;
	}
     
    if(keyNumber == 0){

		rtn_code =  RestoreKeyFromFile(
			keyName,
			OldPasswd,
			DerPubKey,//&cardRsaPublicKey,
			&DerPubKeyLen,
			DerPrikey,//&cardRsaPrivateKey,
			&DerPrikeyLen);
		if(rtn_code != 0)
			return -1;
		
		rtn_code = Crypt_SavePemKey2File(
		        keyName,
				NewPasswd,
				DerPubKey,//&cardRsaPublicKey,
				DerPubKeyLen,//sizeof(RSA_PUBLIC_KEY),
				DerPrikey,//&cardRsaPrivateKey,
				DerPrikeyLen);//sizeof(RSA_PRIVATE_KEY));
		if(rtn_code != 0)
			return -1;
	}

	return 0;
}		

CRET Crypt_Decode_Pubkey_Info(
		unsigned char	*DerPublicKeyInfo,
		int				DerPublicKeyInfoSize,
		int				*bits,
		unsigned char	*modulus,
		unsigned char   *publicExponent)
{
//    unsigned char subjectPublicKeyInfo[512];
//    int  subjectPublicKeyInfoSize;
    RSA_PUBLIC_KEY  rsaPublicKey;

	int rtn_code;

/*
typedef struct rsa_pub_key{
    uint16       bits;    // length in bits of modulus 
	UCHAR     modulus[MAX_RSA_MODULUS_LEN]; 
                   // modulus  ----- n 
	UCHAR     publicExponent[MAX_RSA_MODULUS_LEN];  
                   // public exponent  -----  e  
} RSA_PUBLIC_KEY;
*/
    
	rtn_code = d2c_RSA_PUBLIC_KEY(
                   DerPublicKeyInfo,
                   DerPublicKeyInfoSize,
                   &rsaPublicKey);
    if(rtn_code != FUNC_OK){
        return FUNC_ERR;
    }

	*bits = rsaPublicKey.bits;
	memcpy(modulus, rsaPublicKey.modulus, sizeof(rsaPublicKey.modulus));
	memcpy(publicExponent, rsaPublicKey.publicExponent, sizeof(rsaPublicKey.publicExponent));

	return 0;	
}

CRET Crypt_Decode_Prikey_Info(
		unsigned char	*DerPrivateKeyInfo,
		int				DerPrivateKeyInfoSize,
		int				*bits,
		unsigned char	*modulus,
		unsigned char   *publicExponent,
		unsigned char   *privateExponent,
		unsigned char   *prime,
		unsigned char   *exponent,
		unsigned char   *coefficient)
{
//	unsigned char DerPrikey[1024];
//	int DerPrikeyLen;
    RSA_PRIVATE_KEY  cardRsaPrivateKey;
	int rtn_code;

	rtn_code = d2c_RSA_PRIVATE_KEY(
			DerPrivateKeyInfo,
			DerPrivateKeyInfoSize,
			&cardRsaPrivateKey);
		if(rtn_code != 0)
			return -1;

	*bits = cardRsaPrivateKey.bits;
	memcpy(modulus, cardRsaPrivateKey.modulus, sizeof(cardRsaPrivateKey.modulus));
	memcpy(publicExponent, cardRsaPrivateKey.publicExponent, sizeof(cardRsaPrivateKey.publicExponent));
	memcpy(privateExponent, cardRsaPrivateKey.privateExponent, sizeof(cardRsaPrivateKey.privateExponent));
	memcpy(prime, cardRsaPrivateKey.prime[2], sizeof(cardRsaPrivateKey.prime[2]));
	memcpy(exponent, cardRsaPrivateKey.exponent[2], sizeof(cardRsaPrivateKey.exponent[2]));
	memcpy(coefficient, cardRsaPrivateKey.coefficient, sizeof(cardRsaPrivateKey.coefficient));

	return 0;
}


CRET Crypt_RestorePublicKey(
        char          *keyName,
		char          *password,
		unsigned char *DerPubkey,
		int			  *DerPubkeyLen)
{
	//int rtn_code;
	unsigned char DerPriKey[1024];
	int DerPriKeyLen;

	return RestoreKeyFromFile(
			keyName,
			password,
			DerPubkey,
			DerPubkeyLen,
			DerPriKey,
			&DerPriKeyLen);
}	

CRET Crypt_RestorePriKey(
        char          *keyName,
		char          *password,
		unsigned char *DerPrikey,
		int			  *DerPrikeyLen)
{
	//int rtn_code;
	unsigned char DerPubKey[1024];
	int DerPubKeyLen;

	return RestoreKeyFromFile(
			keyName,
			password,
			DerPubKey,
			&DerPubKeyLen,
			DerPrikey,
			DerPrikeyLen);
}		


int RestoreKeyFromFile(
        char          *keyName,
        char          *password,
		unsigned char *DerPubkey,
		int			  *DerPubkeyLen,
		unsigned char *DerPrikey,
		int			  *DerPrikeyLen)
{

	FILE    *f;
	unsigned char pem_key[2048], hashPasswd[20], Dec_Derkey[1024], buffer[128];
	int rtn_code,  hashPasswdSize, Dec_DerkeySize, ptr_offset;

    ptr_offset=0;

	f = fopen(keyName,"r");
	    if(f == NULL){
			printf("open failed! keyname=%s\n", keyName);
		    return FUNC_ERR;
        }

	do{
		fgets(buffer, sizeof(buffer), f);
//printf("len=%d, buffer:%s\n", strlen(buffer), buffer);
                del_rn(buffer);
//printf("after del_rn, len=%d, buffer:%s\n", strlen(buffer), buffer);
		memcpy(pem_key+ptr_offset, buffer,strlen(buffer));
		ptr_offset += strlen(buffer);
	}
	while(strcmp(buffer,PublicKey_End_String2));

    rtn_code = PEM2DER_data_format(
                       pem_key,
                       strlen(pem_key),
                       DerPubkey,//Dec_Derkey, 
                       DerPubkeyLen);//&Dec_DerkeySize);
    if(rtn_code != FUNC_OK){
        printf("PEM2DER_data_format error...\n");
		fclose(f);
        return -1;
    }
	rtn_code = Crypt_Gen_Hash(
				UID_md5,
				password,
				strlen(password),
				hashPasswd,
				&hashPasswdSize);
	if(rtn_code != 0){
		fclose(f);
		return -1;
	}
/*
	rtn_code = iCrypt_Dec_Data_S(
				Dec_Derkey,
				Dec_DerkeySize,
				DerPubkey,
				DerPubkeyLen,
				hashPasswd);
	if(rtn_code != 0){
		fclose(f);
		return -1;
	}
*/
	ptr_offset = 0;
	do{
		fgets(buffer, sizeof(buffer), f);
//printf("len=%d, buffer=%s\n", strlen(buffer), buffer);
                del_rn(buffer);
//printf("after del_rn:len=%d, buffer=%s\n", strlen(buffer), buffer);
		memcpy(pem_key+ptr_offset, buffer,strlen(buffer));
		ptr_offset += strlen(buffer);
	}
	while(strcmp(buffer,PrivateKey_End_String2));
	fclose(f);

    rtn_code = PEM2DER_data_format(
                       pem_key,
                       strlen(pem_key),
                       Dec_Derkey,
     	  			   &Dec_DerkeySize);
    if(rtn_code != FUNC_OK){
        printf("PEM2DER_data_format error...\n");
        return -1;
    }

	rtn_code = iCrypt_Dec_Data_S(
				Dec_Derkey,
				Dec_DerkeySize,
				DerPrikey,
				DerPrikeyLen,
				hashPasswd);
	if(rtn_code != 0)
		return -1;

	return 0;
}

CRET Crypt_GetRSAPublicKey(
        char           *keyName,
		char			*passwd,
        unsigned char  *rsaPublicKey,
        int            *rsaPublicKeySize)
{
    int rtn_code;
    int keyNumber;
//    RSA_PUBLIC_KEY  cardRsaPublicKey;

    keyNumber = 0;

	if(strcmp(keyName,"keypair.db1") == 0){
        keyNumber = 1;
	}

	if(strcmp(keyName,"keypair.db2") == 0){
        keyNumber = 2;
	}

	if(strcmp(keyName,"keypair.db3") == 0){
        keyNumber = 3;
	}

	if(strcmp(keyName,"keypair.db4") == 0){
        keyNumber = 4;
	}

	if(strcmp(keyName,"keypair.db5") == 0){
        keyNumber = 5;
	}

    if(keyNumber == 0){
	rtn_code = Crypt_RestorePublicKey(
				keyName,
				passwd,
				rsaPublicKey,//&cardRsaPublicKey,
				rsaPublicKeySize);
      if(rtn_code != 0)
            return FUNC_ERR;
        
    }
/*
    d2c_RSA_PUBLIC_KEY(rsaPublicKey,*rsaPublicKeySize,
                       &cardRsaPublicKey);

    c2d_RSA_PUBLIC_KEY(&cardRsaPublicKey,
                       rsaPublicKey,
			           rsaPublicKeySize);

*/
    return FUNC_OK;
}

CRET CA_Crypt_Gen_Signature( 
        int    uid_algorithm,
		char   *keyName,
		char   *password,
        unsigned char  *msg,
        int            msgSize,
        unsigned char  *sig,
		int            *sigSize)
{
	return     Crypt_Gen_Signature( 
			    uid_algorithm,
			    keyName,
				password,
				msg,
                msgSize,
				sig,
				sigSize);
}

int Crypt_Gen_Signature( 
        int    uid_algorithm,
		char   *keyName,
		char   *password,
        unsigned char  *msg,
        int            msgSize,
        unsigned char  *sig,
		int            *sigSize)
{
    int rtn_code;
    int keyNumber;
	uint32 hashSize;
    UCHAR hash[64],output[128]; 
    ULONG outputLen;
	unsigned char DerPrikey[1024];
	int DerPrikeyLen;
//    RSA_PUBLIC_KEY  cardRsaPublicKey;
    RSA_PRIVATE_KEY  cardRsaPrivateKey;


    keyNumber = 0;

	if(strcmp(keyName,"keypair.db1") == 0){
        keyNumber = 1;
	}

	if(strcmp(keyName,"keypair.db2") == 0){
        keyNumber = 2;
	}

	if(strcmp(keyName,"keypair.db3") == 0){
        keyNumber = 3;
	}

	if(strcmp(keyName,"keypair.db4") == 0){
        keyNumber = 4;
	}

	if(strcmp(keyName,"keypair.db5") == 0){
        keyNumber = 5;
	}

    if(keyNumber == 0){
		rtn_code = Crypt_RestorePriKey(
			keyName,
			password,
			DerPrikey,//&cardRsaPrivateKey,
			&DerPrikeyLen);
		if(rtn_code != 0)
			return -1;
//*
		rtn_code = d2c_RSA_PRIVATE_KEY(
			DerPrikey,
			DerPrikeyLen,
			&cardRsaPrivateKey);
		if(rtn_code != 0)
			return -1;
//*/
  }

/////////////  it is tmp codes, maybe modify ....... ///////////////////////////
//	cardRsaPrivateKey.bits = 1024;
////////////////////////////////////////////////////////////////////////////////

	rtn_code = Crypt_Gen_Encoded_Hash(
		           uid_algorithm,
                   msg,
                   msgSize,
				   hash,
				   &hashSize);
    if(rtn_code != FUNC_OK){
        return FUNC_ERR;
    }

    rtn_code = CSP_RSAPrivateEncrypt(
	               (USHORT)keyNumber,
                   output, 
                   &outputLen,
                   hash,
                   (ULONG)hashSize, 
                   &cardRsaPrivateKey);
    if(rtn_code != RTN_OK){
        return FUNC_ERR;
    }
 
    memcpy(sig,output,outputLen);
	*sigSize = (uint32)outputLen;

    return FUNC_OK;
}


CRET Crypt_Ver_Signature(
        int            uid_algorithm,
        unsigned char  *rsaPublicKey,
        int            rsaPublicKeySize,
        unsigned char  *msg,
        int            msgSize,
        unsigned char  *sig,
		int            sigSize)
{
    int rtn_code;
	uint32 hashSize;
    UCHAR hash[64],output[128]; 
    ULONG  outputLen;
    USHORT keyNumber;
    RSA_PUBLIC_KEY cardRsaPublicKey;


    d2c_RSA_PUBLIC_KEY(rsaPublicKey,rsaPublicKeySize,
                       &cardRsaPublicKey);

	rtn_code = Crypt_Gen_Encoded_Hash(
		           uid_algorithm,
                   msg,
                   msgSize,
				   hash,
				   &hashSize);
    if(rtn_code != FUNC_OK){
        return FUNC_ERR;
    }

    keyNumber = 0;
    rtn_code = CSP_RSAPublicDecrypt(
		           (USHORT)keyNumber,
                    output,
                    &outputLen,
                    sig,
                    (ULONG)sigSize,
                    &cardRsaPublicKey); 
     if(rtn_code != RTN_OK){
        return FUNC_ERR;
    }


    if(memcmp(hash,output,hashSize) != 0){
        return FUNC_ERR;
    }

    return FUNC_OK;
}


CRET 
Crypt_Get_PubKey_FromCert(
    unsigned char   *der_cert,
    int             der_certSize,
    unsigned char   *subjectPublicKeyInfo,
    int             *subjectPublicKeyInfoSize)
{                          
/*
    int version,serialNumberSize,signatureAlgorithm,parametersSize;
    unsigned char  serialNumber[256],parameters[64];
    char issuer_countryName[64],issuer_organizationName[64];
    char issuer_organizationalUnitname1[64],issuer_organizationalUnitname2[64];
    char issuer_organizationalUnitname3[64],issuer_stateOrProvinceName[64];
    char issuer_commonName[64],issuer_localityName[64];
    char issuer_title[64],issuer_surname[64];
    char issuer_givenName[64],issuer_initials[64];
    char issuer_email[64],issuer_postalAddress[64];
    char issuer_postalCode[64],issuer_postalOfficeBox[64];
    char issuer_telephoneNumber[64],issuer_telexNumber[64];
    char notBefore[64],notAfter[64];
    char subject_countryName[64],subject_organizationName[64];
    char subject_organizationalUnitname1[64],subject_organizationalUnitname2[64];
    char subject_organizationalUnitname3[64],subject_stateOrProvinceName[64];
    char subject_commonName[64],subject_localityName[64];
    char subject_title[64],subject_surname[64];
    char subject_givenName[64],subject_initials[64];
    char subject_email[64],subject_postalAddress[64];
    char subject_postalCode[64],subject_postalOfficeBox[64];
    char subject_telephoneNumber[64],subject_telexNumber[64];
 
    unsigned char issuerUniqueID[64];
    unsigned char subjectUniqueID[64];
    int  issuerUniqueIDSize,subjectUniqueIDSize;
    unsigned int   extensionsFlag,criticalFlag;
 
    char authKeyId_countryName[64],authKeyId_organizationName[64];
    char authKeyId_organizationalUnitname1[64],authKeyId_organizationalUnitname2[64];
    char authKeyId_organizationalUnitname3[64],authKeyId_stateOrProvinceName[64];
    char authKeyId_commonName[64],authKeyId_localityName[64],authKeyId_title[64];
    char authKeyId_surname[64],authKeyId_givenName[64];
    char authKeyId_initials[64],authKeyId_email[64];
    char authKeyId_postalAddress[64],authKeyId_postalCode[64];
    char authKeyId_postalOfficeBox[64],authKeyId_telephoneNumber[64];
    char authKeyId_telexNumber[64];

    unsigned char authKeyId_serialNumber[64];
    int authKeyId_serialNumberSize;

    unsigned char policyId1[64],policyId2[64],policyId3[64],policyId4[64];
    int policyIdSize1,policyIdSize2,policyIdSize3,policyIdSize4;
    char policyUrl1[64],policyUrl2[64],policyUrl3[64],policyUrl4[64];
    char PrivateKeyUsagePeriod_notBefore[64];
    char PrivateKeyUsagePeriod_notAfter[64];
    int  BasicConstraints_cA,BasicConstraints_pathLenConstraint;
   
    unsigned int   KeyUsage,neCertType,setCertType;
    int  self_certClass;
    char revocationURL[64];

    unsigned char  hashedRootKey[64];
    int            hashedRootKeySize;
*/

    int version,serialNumberSize,signatureAlgorithm,parametersSize;
    unsigned char  serialNumber[256],parameters[64];
    char issuer_countryName[64],issuer_organizationName[64];
    char issuer_organizationalUnitname1[64];
    char issuer_stateOrProvinceName[64];
    char issuer_commonName[64],issuer_localityName[64];
    char issuer_title[64],issuer_surname[64];
    char issuer_givenName[64],issuer_initials[64];
    char issuer_email[64],issuer_postalAddress[64];
    char issuer_postalCode[64],issuer_postalOfficeBox[64];
    char issuer_telephoneNumber[64],issuer_telexNumber[64];
    char notBefore[64],notAfter[64];
    char subject_countryName[64],subject_organizationName[64];
    char subject_organizationalUnitname1[64];
    char subject_stateOrProvinceName[64];
    char subject_commonName[64],subject_localityName[64];
    char subject_title[64],subject_surname[64];
    char subject_givenName[64],subject_initials[64];
    char subject_email[64],subject_postalAddress[64];
    char subject_postalCode[64],subject_postalOfficeBox[64];
    char subject_telephoneNumber[64],subject_telexNumber[64];
 
    unsigned char issuerUniqueID[64];
    unsigned char subjectUniqueID[64];
    int  issuerUniqueIDSize,subjectUniqueIDSize;
    unsigned int   extensionsFlag,criticalFlag;
 
    char authKeyId_countryName[64],authKeyId_organizationName[64];
    char authKeyId_organizationalUnitname1[64];
    char authKeyId_stateOrProvinceName[64];
    char authKeyId_commonName[64],authKeyId_localityName[64],authKeyId_title[64];
    char authKeyId_surname[64],authKeyId_givenName[64];
    char authKeyId_initials[64],authKeyId_email[64];
    char authKeyId_postalAddress[64],authKeyId_postalCode[64];
    char authKeyId_postalOfficeBox[64],authKeyId_telephoneNumber[64];
    char authKeyId_telexNumber[64];

    unsigned char authKeyId_serialNumber[64];
    int authKeyId_serialNumberSize;

    unsigned char policyId1[64],policyId2[64],policyId3[64],policyId4[64];
    int policyIdSize1,policyIdSize2,policyIdSize3,policyIdSize4;
    char policyUrl1[64],policyUrl2[64],policyUrl3[64],policyUrl4[64];
    char PrivateKeyUsagePeriod_notBefore[64];
    char PrivateKeyUsagePeriod_notAfter[64];
    int  BasicConstraints_cA,BasicConstraints_pathLenConstraint;
   
    unsigned int   KeyUsage,neCertType,setCertType;
    int  self_certClass;
    char revocationURL[64];

    unsigned char  hashedRootKey[64];
    int            hashedRootKeySize;

    int  rtn_code;

 
    rtn_code = Crypt_Decode_Cert(
                   der_cert,
                   der_certSize,

                   &version,
                   serialNumber,
                   &serialNumberSize,
                   &signatureAlgorithm,
                   parameters,
                   &parametersSize,
                   issuer_countryName,
                   issuer_organizationName,
                   issuer_organizationalUnitname1,
//                   issuer_organizationalUnitname2,
//                   issuer_organizationalUnitname3,
                   issuer_stateOrProvinceName,
                   issuer_commonName,
                   issuer_localityName,
                   issuer_title,
                   issuer_surname,
                   issuer_givenName,
                   issuer_initials,
                   issuer_email,
                   issuer_postalAddress,
                   issuer_postalCode,
                   issuer_postalOfficeBox,
                   issuer_telephoneNumber,
                   issuer_telexNumber,
                   notBefore,   
                   notAfter,     
                   subject_countryName,
                   subject_organizationName,
                   subject_organizationalUnitname1,
//                   subject_organizationalUnitname2,
//                   subject_organizationalUnitname3,
                   subject_stateOrProvinceName,
                   subject_commonName,
                   subject_localityName,
                   subject_title,
                   subject_surname,
                   subject_givenName,
                   subject_initials,
                   subject_email,
                   subject_postalAddress,
                   subject_postalCode,
                   subject_postalOfficeBox,
                   subject_telephoneNumber,
                   subject_telexNumber,
                   subjectPublicKeyInfo,
                   subjectPublicKeyInfoSize,
                   issuerUniqueID, 
                   &issuerUniqueIDSize,
                   subjectUniqueID,
                   &subjectUniqueIDSize,
                   &extensionsFlag,
                   &criticalFlag,
                   authKeyId_countryName,
                   authKeyId_organizationName,
                   authKeyId_organizationalUnitname1,
//                   authKeyId_organizationalUnitname2,
//                   authKeyId_organizationalUnitname3,
                   authKeyId_stateOrProvinceName,
                   authKeyId_commonName,
                   authKeyId_localityName,
                   authKeyId_title,
                   authKeyId_surname,
                   authKeyId_givenName,
                   authKeyId_initials,
                   authKeyId_email,
                   authKeyId_postalAddress,
                   authKeyId_postalCode,
                   authKeyId_postalOfficeBox,
                   authKeyId_telephoneNumber,
                   authKeyId_telexNumber,
                   authKeyId_serialNumber,
                   &authKeyId_serialNumberSize,
                   policyId1,
                   &policyIdSize1,
                   policyUrl1,
                   policyId2,
                   &policyIdSize2,
                   policyUrl2,
                   policyId3,
                   &policyIdSize3,
                   policyUrl3,
                   policyId4,
                   &policyIdSize4,
                   policyUrl4,
                   PrivateKeyUsagePeriod_notBefore,   
                   PrivateKeyUsagePeriod_notAfter,     
                   &BasicConstraints_cA,
                   &BasicConstraints_pathLenConstraint,
                   &KeyUsage,
                   &neCertType,
                   &setCertType,
                   hashedRootKey,
                   &hashedRootKeySize,

                   &self_certClass,
                   revocationURL);
    if(rtn_code != FUNC_OK){
        return FUNC_ERR;
    }

    return FUNC_OK; 
}

 
CRET 
Crypt_Ver_Signature_ByCert(
    int             uid_algorithm,
    unsigned char   *der_cert,
    int             der_certSize,
    unsigned char   *msg,
    int             msgSize,
    unsigned char   *sig,
    int             sigSize)
{
    unsigned char subjectPublicKeyInfo[512];
    int  subjectPublicKeyInfoSize;
    int  rtn_code;


    rtn_code = Crypt_Get_PubKey_FromCert(
                    der_cert,
                    der_certSize,
                    subjectPublicKeyInfo,
                    &subjectPublicKeyInfoSize);
    if(rtn_code != FUNC_OK){
        return FUNC_ERR;
    }

    rtn_code = Crypt_Ver_Signature(
                   uid_algorithm,
                   subjectPublicKeyInfo,
                   subjectPublicKeyInfoSize,
                   msg,
                   msgSize,
                   sig,
		           sigSize);
    if(rtn_code != FUNC_OK){
        return FUNC_ERR;
    }

    return FUNC_OK;
}

int iCrypt_Enc_Data_S(
	unsigned char  *indata,
    int            indataSize,
    unsigned char  *outdata,
    int            *outdataSize,
	unsigned char  *sdbiKey)
{
    int rtn_code = CSP_SDBIEncrypt(
                   outdata,
                   outdataSize,
                   indata,
                   (ULONG)indataSize,
                   sdbiKey,
                   16);
    if(rtn_code != RTN_OK){
        return FUNC_ERR;
    }
	return FUNC_OK;
}

CRET Crypt_Enc_Data_S(
	unsigned char  *indata,
    int            indataSize,
    unsigned char  *outdata,
    int            *outdataSize,
	unsigned char  *sdbiKey)
{

    int rtn_code = CSP_SDBIEncrypt(
                   outdata,
                   outdataSize,
                   indata,
                   (ULONG)indataSize,
                   sdbiKey,
                   16);
    if(rtn_code != RTN_OK){
        return FUNC_ERR;
    }
	return FUNC_OK;
}

CRET
Crypt_Enc_Data(
    unsigned char  *indata,
    int            indataSize,
    unsigned char  *outdata,
    int            *outdataSize,
    unsigned char  *der_cert,
    int            der_certSize)
{
    unsigned char subjectPublicKeyInfo[512];
    int  subjectPublicKeyInfoSize;
    RSA_PUBLIC_KEY  rsaPublicKey;
    UCHAR  SDBIKey[32],seedValue[32];
    UCHAR  enc_SDBIKey[256];
    ULONG  SDBIKeyLen,seedLen;

    int rtn_code;


    rtn_code = Crypt_Get_PubKey_FromCert(
                    der_cert,
                    der_certSize,
                    subjectPublicKeyInfo,
                    &subjectPublicKeyInfoSize);
    if(rtn_code != FUNC_OK){
        return FUNC_ERR;
    }

    seedLen = 16;
    rtn_code = CSP_GenRandomBytes(
                   SDBIKey,
                   16,
                   seedValue,
                   seedLen);
    if(rtn_code != RTN_OK){
        return FUNC_ERR;
    }
               
    rtn_code = d2c_RSA_PUBLIC_KEY(
                   subjectPublicKeyInfo,
                   subjectPublicKeyInfoSize,
                   &rsaPublicKey);
    if(rtn_code != FUNC_OK){
        return FUNC_ERR;
    }

    rtn_code = CSP_RSAPublicEncrypt(
		           0, 
                   enc_SDBIKey,
                   &SDBIKeyLen,
                   SDBIKey,
                   16,
                   &rsaPublicKey);
    if(rtn_code != RTN_OK){
        return FUNC_ERR;
    }

    memcpy(outdata,enc_SDBIKey,SDBIKeyLen);

    rtn_code = CSP_SDBIEncrypt(
                   &outdata[SDBIKeyLen],
                   &seedLen,
                   indata,
                   (ULONG)indataSize,
                   SDBIKey,
                   16);
    if(rtn_code != RTN_OK){
        return FUNC_ERR;
    }

    *outdataSize = SDBIKeyLen + seedLen;
   
    return FUNC_OK;
}

int iCrypt_Dec_Data_S(
      unsigned char  *indata,
      int           indataSize,
      unsigned char  *outdata,
      int           *outdataSize,
      unsigned char  *sdbiKey)
{
    int rtn_code = CSP_SDBIDecrypt(
                   outdata,
                   outdataSize,
                   indata,
                   indataSize,
                   sdbiKey,
                   16);
    if(rtn_code != RTN_OK){
        return FUNC_ERR;
    }

    return FUNC_OK;
}


CRET  Crypt_Dec_Data_S(
      unsigned char  *indata,
      int           indataSize,
      unsigned char  *outdata,
      int           *outdataSize,
      unsigned char  *sdbiKey)
{
    int rtn_code = CSP_SDBIDecrypt(
                   outdata,
                   outdataSize,
                   indata,
                   indataSize,
                   sdbiKey,
                   16);
    if(rtn_code != RTN_OK){
        return FUNC_ERR;
    }

    return FUNC_OK;
}

CRET  Crypt_Dec_Data(
      unsigned char  *indata,
      int           indataSize,
      unsigned char  *outdata,
      int           *outdataSize,
      char          *keyName,
      char          *password)
{
    int rtn_code;
    int keyNumber;
    UCHAR SDBIKey[128]; 
    ULONG outputLen;

	unsigned char DerPrikey[1024];
	int DerPrikeyLen;

//    RSA_PUBLIC_KEY  cardRsaPublicKey;
    RSA_PRIVATE_KEY  cardRsaPrivateKey;


    keyNumber = 0;

	if(strcmp(keyName,"keypair.db1") == 0){
        keyNumber = 1;
	}

	if(strcmp(keyName,"keypair.db2") == 0){
        keyNumber = 2;
	}

	if(strcmp(keyName,"keypair.db3") == 0){
        keyNumber = 3;
	}

	if(strcmp(keyName,"keypair.db4") == 0){
        keyNumber = 4;
	}

	if(strcmp(keyName,"keypair.db5") == 0){
        keyNumber = 5;
	}


    if(keyNumber == 0){
		rtn_code = Crypt_RestorePriKey(
			keyName,
			password,
			DerPrikey,//&cardRsaPrivateKey,
			&DerPrikeyLen);
		if(rtn_code != 0)
			return -1;
//*
		rtn_code = d2c_RSA_PRIVATE_KEY(
			DerPrikey,
			DerPrikeyLen,
			&cardRsaPrivateKey);
		if(rtn_code != 0)
			return -1;
//*/  
	}
///////////////////////// tmp codes, maybe modify....................
//	cardRsaPrivateKey.bits = 1024;
/////////////////////////////////////////////////////////////////////

    rtn_code = CSP_RSAPrivateDecrypt(
		           keyNumber,
                   SDBIKey,
                   &outputLen,
                   indata,
                   128,
                   &cardRsaPrivateKey);
    if(rtn_code != RTN_OK){
        return FUNC_ERR;
    }
    
    rtn_code = CSP_SDBIDecrypt(
                   outdata,
                   &outputLen,
                   &indata[128],
                   indataSize-128,
                   SDBIKey,
                   16);
    if(rtn_code != RTN_OK){
        return FUNC_ERR;
    }

    *outdataSize = outputLen;

    return FUNC_OK;
}

CRET Crypt_Rsa_PrivateKeyDec(
	char *keyName,
	char *password,
	unsigned char *cipher,
	int cipherLen,
	unsigned char *msg,
	int *msgLen)
{
    int rtn_code;
    int keyNumber;
 
	unsigned char DerPrikey[1024];
	int DerPrikeyLen;

//    RSA_PUBLIC_KEY  cardRsaPublicKey;
    RSA_PRIVATE_KEY  cardRsaPrivateKey;

		rtn_code = Crypt_RestorePriKey(
			keyName,
			password,
			DerPrikey,//&cardRsaPrivateKey,
			&DerPrikeyLen);
		if(rtn_code != 0)
			return -1;
		rtn_code = d2c_RSA_PRIVATE_KEY(
			DerPrikey,
			DerPrikeyLen,
			&cardRsaPrivateKey);
		if(rtn_code != 0)
			return -1;

    /*
	rtn_code = CSP_RSAPrivateDecrypt(
		           0,
                   msg,
                   &msgLen,
                   cipher,
                   cipherLen,
                   &cardRsaPrivateKey);
	*/
	rtn_code = RSAPrivateBlock (msg, msgLen, cipher, cipherLen, &cardRsaPrivateKey);
    if(rtn_code != 0){
        return FUNC_ERR;
    }
    
    return FUNC_OK;
	
}

CRET Crypt_Cert_PubKeyEnc (
	char *der_cert,
	int der_certSize,
	unsigned char *msg,
	int msgLen,
	unsigned char *cipher,
	int *cipherLen)
{
    unsigned char subjectPublicKeyInfo[512];
    int  subjectPublicKeyInfoSize;
    RSA_PUBLIC_KEY  rsaPublicKey;

    int rtn_code;


    rtn_code = Crypt_Get_PubKey_FromCert(
                    der_cert,
                    der_certSize,
                    subjectPublicKeyInfo,
                    &subjectPublicKeyInfoSize);
    if(rtn_code != FUNC_OK){
        return FUNC_ERR;
    }

    rtn_code = d2c_RSA_PUBLIC_KEY(
                   subjectPublicKeyInfo,
                   subjectPublicKeyInfoSize,
                   &rsaPublicKey);
    if(rtn_code != FUNC_OK){
        return FUNC_ERR;
    }

	/*
    rtn_code = CSP_RSAPublicEncrypt(
		           0, 
                   cipher,
                   &cipherLen,
                   msg,
                   msgLen,
                   &rsaPublicKey);
	*/
	 rtn_code = 	RSAPublicBlock (cipher, cipherLen, msg, msgLen, &rsaPublicKey);
    if(rtn_code != 0){
        return FUNC_ERR;
    }

	return 0;
}

char *del_rn(char *pbuf)
{
  char *p;

  if((p =strchr(pbuf, '\r')) !=NULL) *p =0;
  if((p =strchr(pbuf, '\n')) !=NULL) *p =0;

  return pbuf;
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
China China
An old C programmer in China.

Comments and Discussions