PKCS#11的部分使用例码,仅供参考

来源:互联网 发布:幸福网络 编辑:程序博客网 时间:2024/05/29 11:26
  1. //PKCS#11的部分使用例码,仅供参考
  2. BOOL _ReadFile(LPCSTR FilePath, BYTE *FileContent, DWORD *FileLength)
  3. {
  4.     FILE *stream = NULL;
  5.     DWORD ContentLen = 0;
  6.     DWORD ReadLen = 0;
  7.     if ((FilePath == NULL) || (FileLength == NULL))
  8.     {
  9.         return FALSE;
  10.     }
  11.     stream = fopen(FilePath, "rb");
  12.     if (stream == NULL)
  13.     {
  14.         return FALSE;
  15.     }
  16.     fseek(stream, 0, SEEK_END);
  17.     ContentLen = ftell(stream);
  18.     fseek(stream, 0, SEEK_SET);
  19.     if ((FileContent == NULL) || (*FileLength < ContentLen))
  20.     {
  21.         *FileLength = ContentLen;
  22.         fclose(stream);
  23.         return FALSE;
  24.     }
  25.     *FileLength = ContentLen;
  26.     ReadLen = fread(FileContent, 1, ContentLen, stream);
  27.     fclose(stream);
  28.     if (ReadLen != ContentLen)
  29.     {
  30.         return FALSE;
  31.     }
  32.     return TRUE;
  33. }
  34. BOOL OpenSession(CK_SESSION_HANDLE *Session)
  35. {
  36.     CK_RV Result = CKR_OK;
  37.     CK_SESSION_HANDLE TmpSession = 0;
  38.     if (Session == NULL)
  39.     {
  40.         return FALSE;
  41.     }
  42.     Result = C_Initialize(NULL_PTR);
  43.     if (Result != CKR_OK)
  44.     {
  45.         return FALSE;
  46.     }
  47.     Result = C_OpenSession(0, CKF_RW_SESSION|CKF_SERIAL_SESSION, NULL, NULL, &TmpSession);
  48.     if (Result != CKR_OK)
  49.     {
  50.         C_Finalize(NULL_PTR);
  51.         return FALSE;
  52.     }
  53.     Result = C_Login(TmpSession, CKU_USER, (CK_UTF8CHAR_PTR)"12345678", 8);
  54.     if (Result != CKR_OK)
  55.     {
  56.         C_CloseSession(TmpSession);
  57.         C_Finalize(NULL_PTR);
  58.         return FALSE;
  59.     }
  60.     *Session = TmpSession;
  61.     return TRUE;
  62. }
  63. BOOL CloseSession(CK_SESSION_HANDLE Session)
  64. {
  65.     C_Logout(Session);
  66.     C_CloseSession(Session);
  67.     C_Finalize(NULL_PTR);
  68.     return TRUE;
  69. }
  70. BOOL ImportPubKey(CK_SESSION_HANDLE Session)
  71. {
  72.     BIO *PubFile = NULL;
  73.     RSA *RSAPubKey = NULL;
  74.     CK_RV Result = CKR_OK;
  75.     CK_OBJECT_CLASS objectclass = CKO_PUBLIC_KEY;
  76.     CK_KEY_TYPE keytype = CKK_RSA;
  77.     CK_BYTE truevalue = TRUE;
  78.     CK_BYTE falsevalue = FALSE;
  79.     CK_BYTE publab[] = "PubKey";
  80.     CK_VOID_PTR RSA_PUB_N = NULL;
  81.     CK_VOID_PTR RSA_PUB_E = NULL;
  82.     CK_OBJECT_HANDLE PubHandle = 0;
  83.     CK_ULONG ObjCount = 0;
  84.     PubFile = BIO_new(BIO_s_file());
  85.     if (PubFile == NULL)
  86.     {
  87.         return FALSE;
  88.     }
  89.     Result = BIO_read_filename(PubFile, "PubKey.pub");
  90.     if (Result != 1)
  91.     {
  92.         BIO_free(PubFile);
  93.         return FALSE;
  94.     }
  95.     RSAPubKey = d2i_RSA_PUBKEY_bio(PubFile, NULL);
  96.     if (RSAPubKey == NULL)
  97.     {
  98.         BIO_free(PubFile);
  99.         return FALSE;
  100.     }
  101.     RSA_PUB_N = (CK_VOID_PTR)malloc(BN_num_bytes(RSAPubKey->n));
  102.     Result = BN_bn2bin(RSAPubKey->n, (BYTE*)RSA_PUB_N);
  103.     if (Result != BN_num_bytes(RSAPubKey->n))
  104.     {
  105.         free(RSA_PUB_N);
  106.         RSA_free(RSAPubKey);
  107.         BIO_free(PubFile);
  108.         return FALSE;
  109.     }
  110.     RSA_PUB_E = (CK_VOID_PTR)malloc(BN_num_bytes(RSAPubKey->e));
  111.     Result = BN_bn2bin(RSAPubKey->e, (BYTE*)RSA_PUB_E);
  112.     if (Result != BN_num_bytes(RSAPubKey->e))
  113.     {
  114.         free(RSA_PUB_E);
  115.         free(RSA_PUB_N);
  116.         RSA_free(RSAPubKey);
  117.         BIO_free(PubFile);
  118.         return FALSE;
  119.     }
  120.     CK_ATTRIBUTE PubKeyAttr[] = {
  121.         {CKA_CLASS, &objectclass, sizeof(objectclass)},
  122.         {CKA_KEY_TYPE, &keytype, sizeof(keytype)},
  123.         {CKA_TOKEN, &truevalue, sizeof (truevalue)},
  124.         {CKA_LABEL, publab, sizeof(publab)-1},
  125.         {CKA_ENCRYPT, &truevalue, sizeof(truevalue)},
  126.         {CKA_VERIFY, &truevalue, sizeof(truevalue)},
  127.         {CKA_PRIVATE, &falsevalue, sizeof(falsevalue)},
  128.         {CKA_MODULUS, RSA_PUB_N, BN_num_bytes(RSAPubKey->n)},
  129.         {CKA_PUBLIC_EXPONENT, RSA_PUB_E, BN_num_bytes(RSAPubKey->e)}
  130.     };
  131.     Result = C_FindObjectsInit(Session, PubKeyAttr, 4);
  132.     if (Result != CKR_OK)
  133.     {
  134.         free(RSA_PUB_E);
  135.         free(RSA_PUB_N);
  136.         RSA_free(RSAPubKey);
  137.         BIO_free(PubFile);
  138.         return FALSE;
  139.     }
  140.     Result = C_FindObjects(Session, &PubHandle, 1, &ObjCount);
  141.     if ((Result == CKR_OK) && (ObjCount == 1))
  142.     {
  143.         C_DestroyObject(Session, PubHandle);
  144.     }
  145.     Result = C_CreateObject(
  146.         Session,
  147.         PubKeyAttr,
  148.         9,
  149.         &PubHandle);
  150.     C_FindObjectsFinal(Session);
  151.     if (Result != CKR_OK)
  152.     {
  153.         free(RSA_PUB_E);
  154.         free(RSA_PUB_N);
  155.         RSA_free(RSAPubKey);
  156.         BIO_free(PubFile);
  157.         return FALSE;
  158.     }
  159.     free(RSA_PUB_E);
  160.     free(RSA_PUB_N);
  161.     RSA_free(RSAPubKey);
  162.     BIO_free(PubFile);
  163.     return TRUE;
  164. }
  165. BOOL ImportPriKey(CK_SESSION_HANDLE Session)
  166. {
  167.     BIO *PriFile = NULL;
  168.     RSA *RSAPriKey = NULL;
  169.     CK_RV Result = CKR_OK;
  170.     CK_OBJECT_CLASS objectclass = CKO_PRIVATE_KEY;
  171.     CK_KEY_TYPE keytype = CKK_RSA;
  172.     CK_BYTE truevalue = TRUE;
  173.     CK_BYTE falsevalue = FALSE;
  174.     CK_BYTE prilab[] = "PriKey";
  175.     CK_VOID_PTR RSA_PRI_N = NULL;
  176.     CK_VOID_PTR RSA_PRI_E = NULL;
  177.     CK_VOID_PTR RSA_PRI_P = NULL;
  178.     CK_VOID_PTR RSA_PRI_Q = NULL;
  179.     CK_VOID_PTR RSA_PRI_D = NULL;
  180.     CK_VOID_PTR RSA_PRI_DMP1 = NULL;
  181.     CK_VOID_PTR RSA_PRI_DMQ1 = NULL;
  182.     CK_VOID_PTR RSA_PRI_IQMP = NULL;
  183.     CK_OBJECT_HANDLE PriHandle = 0;
  184.     CK_ULONG ObjCount = 0;
  185.     PriFile = BIO_new(BIO_s_file());
  186.     if (PriFile == NULL)
  187.     {
  188.         return FALSE;
  189.     }
  190.     Result = BIO_read_filename(PriFile, "PriKey.pri");
  191.     if (Result != 1)
  192.     {
  193.         BIO_free(PriFile);
  194.         return FALSE;
  195.     }
  196.     RSAPriKey = d2i_RSAPrivateKey_bio(PriFile, NULL);
  197.     if (RSAPriKey == NULL)
  198.     {
  199.         BIO_free(PriFile);
  200.         return NULL;
  201.     }
  202.     RSA_PRI_N = (CK_VOID_PTR)malloc(BN_num_bytes(RSAPriKey->n));
  203.     Result = BN_bn2bin(RSAPriKey->n, (BYTE*)RSA_PRI_N);
  204.     if (Result != BN_num_bytes(RSAPriKey->n))
  205.     {
  206.         free(RSA_PRI_N);
  207.         RSA_free(RSAPriKey);
  208.         BIO_free(PriFile);
  209.         return FALSE;
  210.     }
  211.     RSA_PRI_E = (CK_VOID_PTR)malloc(BN_num_bytes(RSAPriKey->e));
  212.     Result = BN_bn2bin(RSAPriKey->e, (BYTE*)RSA_PRI_E);
  213.     if (Result != BN_num_bytes(RSAPriKey->e))
  214.     {
  215.         free(RSA_PRI_E);
  216.         free(RSA_PRI_N);
  217.         RSA_free(RSAPriKey);
  218.         BIO_free(PriFile);
  219.         return FALSE;
  220.     }
  221.     RSA_PRI_P = (CK_VOID_PTR)malloc(BN_num_bytes(RSAPriKey->p));
  222.     Result = BN_bn2bin(RSAPriKey->p, (BYTE*)RSA_PRI_P);
  223.     if (Result != BN_num_bytes(RSAPriKey->p))
  224.     {
  225.         free(RSA_PRI_P);
  226.         free(RSA_PRI_E);
  227.         free(RSA_PRI_N);
  228.         RSA_free(RSAPriKey);
  229.         BIO_free(PriFile);
  230.         return FALSE;
  231.     }
  232.     RSA_PRI_Q = (CK_VOID_PTR)malloc(BN_num_bytes(RSAPriKey->q));
  233.     Result = BN_bn2bin(RSAPriKey->q, (BYTE*)RSA_PRI_Q);
  234.     if (Result != BN_num_bytes(RSAPriKey->q))
  235.     {
  236.         free(RSA_PRI_Q);
  237.         free(RSA_PRI_P);
  238.         free(RSA_PRI_E);
  239.         free(RSA_PRI_N);
  240.         RSA_free(RSAPriKey);
  241.         BIO_free(PriFile);
  242.         return FALSE;
  243.     }
  244.     RSA_PRI_D = (CK_VOID_PTR)malloc(BN_num_bytes(RSAPriKey->d));
  245.     Result = BN_bn2bin(RSAPriKey->d, (BYTE*)RSA_PRI_D);
  246.     if (Result != BN_num_bytes(RSAPriKey->d))
  247.     {
  248.         free(RSA_PRI_D);
  249.         free(RSA_PRI_Q);
  250.         free(RSA_PRI_P);
  251.         free(RSA_PRI_E);
  252.         free(RSA_PRI_N);
  253.         RSA_free(RSAPriKey);
  254.         BIO_free(PriFile);
  255.         return FALSE;
  256.     }
  257.     RSA_PRI_DMP1 = (CK_VOID_PTR)malloc(BN_num_bytes(RSAPriKey->dmp1));
  258.     Result = BN_bn2bin(RSAPriKey->dmp1, (BYTE*)RSA_PRI_DMP1);
  259.     if (Result != BN_num_bytes(RSAPriKey->dmp1))
  260.     {
  261.         free(RSA_PRI_DMP1);
  262.         free(RSA_PRI_D);
  263.         free(RSA_PRI_Q);
  264.         free(RSA_PRI_P);
  265.         free(RSA_PRI_E);
  266.         free(RSA_PRI_N);
  267.         RSA_free(RSAPriKey);
  268.         BIO_free(PriFile);
  269.         return FALSE;
  270.     }
  271.     RSA_PRI_DMQ1 = (CK_VOID_PTR)malloc(BN_num_bytes(RSAPriKey->dmq1));
  272.     Result = BN_bn2bin(RSAPriKey->dmq1, (BYTE*)RSA_PRI_DMQ1);
  273.     if (Result != BN_num_bytes(RSAPriKey->dmq1))
  274.     {
  275.         free(RSA_PRI_DMQ1);
  276.         free(RSA_PRI_DMP1);
  277.         free(RSA_PRI_D);
  278.         free(RSA_PRI_Q);
  279.         free(RSA_PRI_P);
  280.         free(RSA_PRI_E);
  281.         free(RSA_PRI_N);
  282.         RSA_free(RSAPriKey);
  283.         BIO_free(PriFile);
  284.         return FALSE;
  285.     }
  286.     RSA_PRI_IQMP = (CK_VOID_PTR)malloc(BN_num_bytes(RSAPriKey->iqmp));
  287.     Result = BN_bn2bin(RSAPriKey->iqmp, (BYTE*)RSA_PRI_IQMP);
  288.     if (Result != BN_num_bytes(RSAPriKey->iqmp))
  289.     {
  290.         free(RSA_PRI_IQMP);
  291.         free(RSA_PRI_DMQ1);
  292.         free(RSA_PRI_DMP1);
  293.         free(RSA_PRI_D);
  294.         free(RSA_PRI_Q);
  295.         free(RSA_PRI_P);
  296.         free(RSA_PRI_E);
  297.         free(RSA_PRI_N);
  298.         RSA_free(RSAPriKey);
  299.         BIO_free(PriFile);
  300.         return FALSE;
  301.     }
  302.     CK_ATTRIBUTE PriKeyAttr[] = {
  303.         {CKA_CLASS, &objectclass, sizeof(objectclass)},
  304.         {CKA_KEY_TYPE, &keytype, sizeof(keytype)},
  305.         {CKA_TOKEN, &truevalue, sizeof (truevalue)},
  306.         {CKA_LABEL, prilab, sizeof(prilab)-1},
  307.         {CKA_DECRYPT, &truevalue, sizeof(truevalue)},
  308.         {CKA_SIGN, &truevalue, sizeof(truevalue)},
  309.         {CKA_PRIVATE, &truevalue, sizeof(truevalue)},
  310.         {CKA_MODULUS, RSA_PRI_N, BN_num_bytes(RSAPriKey->n)},
  311.         {CKA_PUBLIC_EXPONENT, RSA_PRI_E, BN_num_bytes(RSAPriKey->e)},
  312.         {CKA_PRIME_1, RSA_PRI_P, BN_num_bytes(RSAPriKey->p)},
  313.         {CKA_PRIME_2, RSA_PRI_Q, BN_num_bytes(RSAPriKey->q)},
  314.         {CKA_PRIVATE_EXPONENT, RSA_PRI_D, BN_num_bytes(RSAPriKey->d)},
  315.         {CKA_EXPONENT_1, RSA_PRI_DMP1, BN_num_bytes(RSAPriKey->dmp1)},
  316.         {CKA_EXPONENT_2, RSA_PRI_DMQ1, BN_num_bytes(RSAPriKey->dmq1)},
  317.         {CKA_COEFFICIENT, RSA_PRI_IQMP, BN_num_bytes(RSAPriKey->iqmp)}
  318.     };
  319.     Result = C_FindObjectsInit(Session, PriKeyAttr, 4);
  320.     if (Result != CKR_OK)
  321.     {
  322.         free(RSA_PRI_IQMP);
  323.         free(RSA_PRI_DMQ1);
  324.         free(RSA_PRI_DMP1);
  325.         free(RSA_PRI_D);
  326.         free(RSA_PRI_Q);
  327.         free(RSA_PRI_P);
  328.         free(RSA_PRI_E);
  329.         free(RSA_PRI_N);
  330.         RSA_free(RSAPriKey);
  331.         BIO_free(PriFile);
  332.         return FALSE;
  333.     }
  334.     Result = C_FindObjects(Session, &PriHandle, 1, &ObjCount);
  335.     if ((Result == CKR_OK) && (ObjCount == 1))
  336.     {
  337.         C_DestroyObject(Session, PriHandle);
  338.     }
  339.     Result = C_CreateObject(
  340.         Session,
  341.         PriKeyAttr,
  342.         15,
  343.         &PriHandle);
  344.     C_FindObjectsFinal(Session);
  345.     if (Result != CKR_OK)
  346.     {
  347.         free(RSA_PRI_IQMP);
  348.         free(RSA_PRI_DMQ1);
  349.         free(RSA_PRI_DMP1);
  350.         free(RSA_PRI_D);
  351.         free(RSA_PRI_Q);
  352.         free(RSA_PRI_P);
  353.         free(RSA_PRI_E);
  354.         free(RSA_PRI_N);
  355.         RSA_free(RSAPriKey);
  356.         BIO_free(PriFile);
  357.         return FALSE;
  358.     }
  359.     free(RSA_PRI_IQMP);
  360.     free(RSA_PRI_DMQ1);
  361.     free(RSA_PRI_DMP1);
  362.     free(RSA_PRI_D);
  363.     free(RSA_PRI_Q);
  364.     free(RSA_PRI_P);
  365.     free(RSA_PRI_E);
  366.     free(RSA_PRI_N);
  367.     RSA_free(RSAPriKey);
  368.     BIO_free(PriFile);
  369.     return TRUE;
  370. }
  371. BOOL ImportData(CK_SESSION_HANDLE Session)
  372. {
  373.     CK_RV Result = CKR_OK;
  374.     CK_OBJECT_CLASS objectclass = CKO_DATA;
  375.     CK_BYTE truevalue = TRUE;
  376.     CK_BYTE falsevalue = FALSE;
  377.     CK_BYTE datalab[] = "Data";
  378.     CK_BYTE databuf[1024] = {0};
  379.     CK_ULONG databuflen = 1024;
  380.     CK_OBJECT_HANDLE DataHandle = 0;
  381.     CK_ULONG ObjCount = 0;
  382.     _ReadFile("data.txt", databuf, &databuflen);
  383.     CK_ATTRIBUTE DataAttr[] = {
  384.         {CKA_CLASS, &objectclass, sizeof(objectclass)},
  385.         {CKA_TOKEN, &truevalue, sizeof (truevalue)},
  386.         {CKA_LABEL, datalab, sizeof(datalab)-1},
  387.         {CKA_VALUE, databuf, databuflen}
  388.     };
  389.     Result = C_FindObjectsInit(Session, DataAttr, 3);
  390.     if (Result != CKR_OK)
  391.     {
  392.         return FALSE;
  393.     }
  394.     Result = C_FindObjects(Session, &DataHandle, 1, &ObjCount);
  395.     if ((Result == CKR_OK) && (ObjCount == 1))
  396.     {
  397.         C_DestroyObject(Session, DataHandle);
  398.     }
  399.     Result = C_CreateObject(
  400.         Session,
  401.         DataAttr,
  402.         4,
  403.         &DataHandle);
  404.     C_FindObjectsFinal(Session);
  405.     if (Result != CKR_OK)
  406.     {
  407.         return FALSE;
  408.     }
  409.     return TRUE;
  410. }
  411. BOOL P11GernateRSA(CK_SESSION_HANDLE Session)
  412. {
  413.     CK_RV Result = CKR_OK;
  414.     CK_OBJECT_CLASS pubkeyclass = CKO_PUBLIC_KEY;
  415.     CK_OBJECT_CLASS prikeyclass = CKO_PRIVATE_KEY;
  416.     CK_BYTE truevalue = TRUE;
  417.     CK_BYTE falsevalue = FALSE;
  418.     CK_BYTE pubkeylab[] = "P11PubKey";
  419.     CK_BYTE prikeylab[] = "P11PriKey";
  420.     CK_ULONG ModBit = 1024;
  421.     CK_OBJECT_HANDLE PubHandle = 0;
  422.     CK_OBJECT_HANDLE PriHandle = 0;
  423.     CK_ULONG ObjCount = 0;
  424.     CK_ATTRIBUTE PubKeyAttr[] = {
  425.         {CKA_CLASS, &pubkeyclass, sizeof(pubkeyclass)},
  426.         {CKA_TOKEN, &truevalue, sizeof (truevalue)},
  427.         {CKA_LABEL, pubkeylab, sizeof(pubkeylab)-1},
  428.         {CKA_ENCRYPT, &truevalue, sizeof(truevalue)},
  429.         {CKA_VERIFY, &truevalue, sizeof(truevalue)},
  430.         {CKA_PRIVATE, &falsevalue, sizeof (falsevalue)},
  431.         {CKA_MODULUS_BITS, &ModBit, sizeof(ModBit)}
  432.     };
  433.     CK_ATTRIBUTE PriKeyAttr[] = {
  434.         {CKA_CLASS, &prikeyclass, sizeof(prikeyclass)},
  435.         {CKA_TOKEN, &truevalue, sizeof (truevalue)},
  436.         {CKA_LABEL, prikeylab, sizeof(prikeylab)-1},
  437.         {CKA_DECRYPT, &truevalue, sizeof(truevalue)},
  438.         {CKA_SIGN, &truevalue, sizeof(truevalue)},
  439.         {CKA_PRIVATE, &truevalue, sizeof(truevalue)},
  440.         {CKA_MODULUS_BITS, &ModBit, sizeof(ModBit)}
  441.     };
  442.     CK_MECHANISM mechanism = {CKM_RSA_PKCS_KEY_PAIR_GEN, NULL_PTR, 0};
  443.     Result = C_FindObjectsInit(Session, PubKeyAttr, 3);
  444.     if (Result != CKR_OK)
  445.     {
  446.         return FALSE;
  447.     }
  448.     Result = C_FindObjects(Session, &PubHandle, 1, &ObjCount);
  449.     if (Result == CKR_OK)
  450.     {
  451.         C_DestroyObject(Session, PubHandle);
  452.     }
  453.     C_FindObjectsFinal(Session);
  454.     Result = C_FindObjectsInit(Session, PriKeyAttr, 3);
  455.     if (Result != CKR_OK)
  456.     {
  457.         return FALSE;
  458.     }
  459.     Result = C_FindObjects(Session, &PriHandle, 1, &ObjCount);
  460.     if (Result == CKR_OK)
  461.     {
  462.         C_DestroyObject(Session, PriHandle);
  463.     }
  464.     C_FindObjectsFinal(Session);
  465.     Result = C_GenerateKeyPair(
  466.         Session,
  467.         &mechanism,
  468.         PubKeyAttr,
  469.         7,
  470.         PriKeyAttr,
  471.         7,
  472.         &PubHandle,
  473.         &PriHandle);
  474.     if (Result != CKR_OK)
  475.     {
  476.         return FALSE;
  477.     }
  478.     return TRUE;
  479. }
  480. BOOL TestReadData(CK_SESSION_HANDLE Session)
  481. {
  482.     CK_RV Result = CKR_OK;
  483.     CK_OBJECT_CLASS objectclass = CKO_DATA;
  484.     CK_BYTE truevalue = TRUE;
  485.     CK_BYTE falsevalue = FALSE;
  486.     CK_BYTE datalab[] = "Data";
  487.     CK_BYTE databuf[1024] = {0};
  488.     CK_ULONG databuflen = 1024;
  489.     CK_OBJECT_HANDLE DataHandle = 0;
  490.     CK_ULONG ObjCount = 0;
  491.     CK_ATTRIBUTE DataAttr[] = {
  492.         {CKA_CLASS, &objectclass, sizeof(objectclass)},
  493.         {CKA_TOKEN, &truevalue, sizeof (truevalue)},
  494.         {CKA_LABEL, datalab, sizeof(datalab)-1},
  495.         {CKA_VALUE, databuf, databuflen}
  496.     };
  497.     Result = C_FindObjectsInit(Session, DataAttr, 3);
  498.     if (Result != CKR_OK)
  499.     {
  500.         return FALSE;
  501.     }
  502.     Result = C_FindObjects(Session, &DataHandle, 1, &ObjCount);
  503.     if ((Result != CKR_OK) || (ObjCount == 0))
  504.     {
  505.         C_FindObjectsFinal(Session);
  506.         return FALSE;
  507.     }
  508.     Result = C_GetAttributeValue(Session, DataHandle, DataAttr, 4);
  509.     C_FindObjectsFinal(Session);
  510.     if (Result != CKR_OK)
  511.     {
  512.         return FALSE;
  513.     }
  514.     printf("data:/n%s/n", DataAttr[3].pValue);
  515.     return TRUE;
  516. }
  517. BOOL TestWriteData(CK_SESSION_HANDLE Session)
  518. {
  519.     CK_RV Result = CKR_OK;
  520.     CK_OBJECT_CLASS objectclass = CKO_DATA;
  521.     CK_BYTE truevalue = TRUE;
  522.     CK_BYTE falsevalue = FALSE;
  523.     CK_BYTE datalab[] = "Data";
  524.     CK_BYTE databuf[] = "hello china";
  525.     CK_ULONG databuflen = sizeof(databuf)-1;
  526.     CK_OBJECT_HANDLE DataHandle = 0;
  527.     CK_ULONG ObjCount = 0;
  528.     CK_ATTRIBUTE DataAttr[] = {
  529.         {CKA_CLASS, &objectclass, sizeof(objectclass)},
  530.         {CKA_TOKEN, &truevalue, sizeof (truevalue)},
  531.         {CKA_LABEL, datalab, sizeof(datalab)-1},
  532.         {CKA_VALUE, databuf, databuflen}
  533.     };
  534.     Result = C_FindObjectsInit(Session, DataAttr, 3);
  535.     if (Result != CKR_OK)
  536.     {
  537.         return FALSE;
  538.     }
  539.     Result = C_FindObjects(Session, &DataHandle, 1, &ObjCount);
  540.     if ((Result != CKR_OK) || (ObjCount == 0))
  541.     {
  542.         C_FindObjectsFinal(Session);
  543.         return FALSE;
  544.     }
  545.     Result = C_SetAttributeValue(Session, DataHandle, DataAttr, 4);
  546.     C_FindObjectsFinal(Session);
  547.     if (Result != CKR_OK)
  548.     {
  549.         return FALSE;
  550.     }
  551.     return TRUE;
  552. }
  553. BOOL TestP11RSAEncrypt(CK_SESSION_HANDLE Session, CK_BYTE_PTR DeBuf, CK_ULONG DeBufLen, CK_BYTE_PTR EnBuf, CK_ULONG_PTR EnBufLen)
  554. {
  555.     CK_RV Result = CKR_OK;
  556.     CK_OBJECT_CLASS objectclass = CKO_PUBLIC_KEY;
  557.     CK_KEY_TYPE keytype = CKK_RSA;
  558.     CK_BYTE truevalue = TRUE;
  559.     CK_BYTE falsevalue = FALSE;
  560.     CK_BYTE publab[] = "PubKey";
  561.     CK_OBJECT_HANDLE PubHandle = 0;
  562.     CK_ULONG ObjCount = 0;
  563.     CK_ATTRIBUTE PubKeyAttr[] = {
  564.         {CKA_CLASS, &objectclass, sizeof(objectclass)},
  565.         {CKA_KEY_TYPE, &keytype, sizeof(keytype)},
  566.         {CKA_TOKEN, &truevalue, sizeof (truevalue)},
  567.         {CKA_LABEL, publab, sizeof(publab)-1},
  568.     };
  569.     CK_MECHANISM mechanism = {CKM_RSA_PKCS, NULL_PTR, 0};
  570.     Result = C_FindObjectsInit(Session, PubKeyAttr, 4);
  571.     if (Result != CKR_OK)
  572.     {
  573.         return FALSE;
  574.     }
  575.     Result = C_FindObjects(Session, &PubHandle, 1, &ObjCount);
  576.     C_FindObjectsFinal(Session);
  577.     if ((Result != CKR_OK) || (ObjCount == 0))
  578.     {
  579.         return FALSE;
  580.     }
  581.     Result = C_EncryptInit(Session, &mechanism, PubHandle);
  582.     if (Result != CKR_OK)
  583.     {
  584.         return FALSE;
  585.     }
  586.     Result = C_Encrypt(Session, DeBuf, DeBufLen, EnBuf, EnBufLen);
  587.     if (Result != CKR_OK)
  588.     {
  589.         return FALSE;
  590.     }
  591.     return TRUE;
  592. }
  593. BOOL TestP11RSADecrypt(CK_SESSION_HANDLE Session, CK_BYTE_PTR EnBuf, CK_ULONG EnBufLen, CK_BYTE_PTR DeBuf, CK_ULONG_PTR DeBufLen)
  594. {
  595.     CK_RV Result = CKR_OK;
  596.     CK_OBJECT_CLASS objectclass = CKO_PRIVATE_KEY;
  597.     CK_KEY_TYPE keytype = CKK_RSA;
  598.     CK_BYTE truevalue = TRUE;
  599.     CK_BYTE falsevalue = FALSE;
  600.     CK_BYTE prilab[] = "PriKey";
  601.     CK_OBJECT_HANDLE PriHandle = 0;
  602.     CK_ULONG ObjCount = 0;
  603.     CK_ATTRIBUTE PriKeyAttr[] = {
  604.         {CKA_CLASS, &objectclass, sizeof(objectclass)},
  605.         {CKA_KEY_TYPE, &keytype, sizeof(keytype)},
  606.         {CKA_TOKEN, &truevalue, sizeof (truevalue)},
  607.         {CKA_LABEL, prilab, sizeof(prilab)-1}
  608.     };
  609.     CK_MECHANISM mechanism = {CKM_RSA_PKCS, NULL_PTR, 0};
  610.     Result = C_FindObjectsInit(Session, PriKeyAttr, 4);
  611.     if (Result != CKR_OK)
  612.     {
  613.         return FALSE;
  614.     }
  615.     Result = C_FindObjects(Session, &PriHandle, 1, &ObjCount);
  616.     C_FindObjectsFinal(Session);
  617.     if ((Result != CKR_OK) || (ObjCount == 0))
  618.     {
  619.         return FALSE;
  620.     }
  621.     Result = C_DecryptInit(Session, &mechanism, PriHandle);
  622.     if (Result != CKR_OK)
  623.     {
  624.         return FALSE;
  625.     }
  626.     Result = C_Decrypt(Session, EnBuf, EnBufLen, DeBuf, DeBufLen);
  627.     if (Result != CKR_OK)
  628.     {
  629.         return FALSE;
  630.     }
  631.     return TRUE;
  632. }
  633. BOOL TestOpenSSLRSAEncrypt(CK_BYTE_PTR DeBuf, CK_ULONG DeBufLen, CK_BYTE_PTR EnBuf, CK_ULONG_PTR EnBufLen)
  634. {
  635.     BIO *PubFile = NULL;
  636.     RSA *RSAPubKey = NULL;
  637.     int Padding = RSA_PKCS1_PADDING;
  638.     CK_RV Result = CKR_OK;
  639.     PubFile = BIO_new(BIO_s_file());
  640.     if (PubFile == NULL)
  641.     {
  642.         return FALSE;
  643.     }
  644.     Result = BIO_read_filename(PubFile, "PubKey.pub");
  645.     if (Result != 1)
  646.     {
  647.         BIO_free(PubFile);
  648.         return FALSE;
  649.     }
  650.     RSAPubKey = d2i_RSA_PUBKEY_bio(PubFile, NULL);
  651.     if (RSAPubKey == NULL)
  652.     {
  653.         BIO_free(PubFile);
  654.         return FALSE;
  655.     }
  656.     *EnBufLen = RSA_public_encrypt(DeBufLen, DeBuf, EnBuf, RSAPubKey, Padding);
  657.     if (*EnBufLen <= 0)
  658.     {
  659.         RSA_free(RSAPubKey);
  660.         BIO_free(PubFile);
  661.         return FALSE;
  662.     }
  663.     RSA_free(RSAPubKey);
  664.     BIO_free(PubFile);
  665.     return TRUE;
  666. }
  667. BOOL TestOpenSSLRSADecrypt(CK_BYTE_PTR EnBuf, CK_ULONG EnBufLen, CK_BYTE_PTR DeBuf, CK_ULONG_PTR DeBufLen)
  668. {
  669.     BIO *PriFile = NULL;
  670.     RSA *RSAPriKey = NULL;
  671.     int Padding = RSA_PKCS1_PADDING;
  672.     CK_RV Result = CKR_OK;
  673.     PriFile = BIO_new(BIO_s_file());
  674.     if (PriFile == NULL)
  675.     {
  676.         return FALSE;
  677.     }
  678.     Result = BIO_read_filename(PriFile, "PriKey.pri");
  679.     if (Result != 1)
  680.     {
  681.         BIO_free(PriFile);
  682.         return FALSE;
  683.     }
  684.     RSAPriKey = d2i_RSAPrivateKey_bio(PriFile, NULL);
  685.     if (RSAPriKey == NULL)
  686.     {
  687.         BIO_free(PriFile);
  688.         return FALSE;
  689.     }
  690.     *DeBufLen = RSA_private_decrypt(EnBufLen, EnBuf, DeBuf, RSAPriKey, Padding);
  691.     if (*DeBufLen <= 0)
  692.     {
  693.         RSA_free(RSAPriKey);
  694.         BIO_free(PriFile);
  695.         return FALSE;
  696.     }
  697.     RSA_free(RSAPriKey);
  698.     BIO_free(PriFile);
  699.     return TRUE;
  700. }
  701. BOOL TestP11RSASign(CK_SESSION_HANDLE Session, CK_BYTE_PTR DeBuf, CK_ULONG DeBufLen, CK_BYTE_PTR EnBuf, CK_ULONG_PTR EnBufLen)
  702. {
  703.     CK_RV Result = CKR_OK;
  704.     CK_OBJECT_CLASS objectclass = CKO_PRIVATE_KEY;
  705.     CK_KEY_TYPE keytype = CKK_RSA;
  706.     CK_BYTE truevalue = TRUE;
  707.     CK_BYTE falsevalue = FALSE;
  708.     CK_BYTE prilab[] = "PriKey";
  709.     CK_OBJECT_HANDLE PriHandle = 0;
  710.     CK_ULONG ObjCount = 0;
  711.     CK_ATTRIBUTE PriKeyAttr[] = {
  712.         {CKA_CLASS, &objectclass, sizeof(objectclass)},
  713.         {CKA_KEY_TYPE, &keytype, sizeof(keytype)},
  714.         {CKA_TOKEN, &truevalue, sizeof (truevalue)},
  715.         {CKA_LABEL, prilab, sizeof(prilab)-1}
  716.     };
  717.     CK_MECHANISM mechanism = {CKM_RSA_PKCS, NULL_PTR, 0};
  718.     Result = C_FindObjectsInit(Session, PriKeyAttr, 4);
  719.     if (Result != CKR_OK)
  720.     {
  721.         return FALSE;
  722.     }
  723.     Result = C_FindObjects(Session, &PriHandle, 1, &ObjCount);
  724.     C_FindObjectsFinal(Session);
  725.     if ((Result != CKR_OK) || (ObjCount == 0))
  726.     {
  727.         return FALSE;
  728.     }
  729.     Result = C_SignInit(Session, &mechanism, PriHandle);
  730.     if (Result != CKR_OK)
  731.     {
  732.         return FALSE;
  733.     }
  734.     Result = C_Sign(Session, DeBuf, DeBufLen, EnBuf, EnBufLen);
  735.     if (Result != CKR_OK)
  736.     {
  737.         return FALSE;
  738.     }
  739.     return TRUE;
  740. }
  741. BOOL TestP11RSAVerify(CK_SESSION_HANDLE Session, CK_BYTE_PTR EnBuf, CK_ULONG EnBufLen, CK_BYTE_PTR DeBuf, CK_ULONG DeBufLen)
  742. {
  743.     CK_RV Result = CKR_OK;
  744.     CK_OBJECT_CLASS objectclass = CKO_PUBLIC_KEY;
  745.     CK_KEY_TYPE keytype = CKK_RSA;
  746.     CK_BYTE truevalue = TRUE;
  747.     CK_BYTE falsevalue = FALSE;
  748.     CK_BYTE publab[] = "PubKey";
  749.     CK_OBJECT_HANDLE PubHandle = 0;
  750.     CK_ULONG ObjCount = 0;
  751.     CK_ATTRIBUTE PubKeyAttr[] = {
  752.         {CKA_CLASS, &objectclass, sizeof(objectclass)},
  753.         {CKA_KEY_TYPE, &keytype, sizeof(keytype)},
  754.         {CKA_TOKEN, &truevalue, sizeof (truevalue)},
  755.         {CKA_LABEL, publab, sizeof(publab)-1},
  756.     };
  757.     CK_MECHANISM mechanism = {CKM_RSA_PKCS, NULL_PTR, 0};
  758.     Result = C_FindObjectsInit(Session, PubKeyAttr, 4);
  759.     if (Result != CKR_OK)
  760.     {
  761.         return FALSE;
  762.     }
  763.     Result = C_FindObjects(Session, &PubHandle, 1, &ObjCount);
  764.     C_FindObjectsFinal(Session);
  765.     if ((Result != CKR_OK) || (ObjCount == 0))
  766.     {
  767.         return FALSE;
  768.     }
  769.     Result = C_VerifyInit(Session, &mechanism, PubHandle);
  770.     if (Result != CKR_OK)
  771.     {
  772.         return FALSE;
  773.     }
  774.     Result = C_Verify(Session, DeBuf, DeBufLen, EnBuf, EnBufLen);
  775.     if (Result != CKR_OK)
  776.     {
  777.         return FALSE;
  778.     }
  779.     return TRUE;
  780. }
  781. BOOL TestOpenSSLRSASign(CK_BYTE_PTR DeBuf, CK_ULONG DeBufLen, CK_BYTE_PTR EnBuf, CK_ULONG_PTR EnBufLen)
  782. {
  783.     BIO *PriFile = NULL;
  784.     RSA *RSAPriKey = NULL;
  785.     int Padding = RSA_PKCS1_PADDING;
  786.     CK_RV Result = CKR_OK;
  787.     PriFile = BIO_new(BIO_s_file());
  788.     if (PriFile == NULL)
  789.     {
  790.         return FALSE;
  791.     }
  792.     Result = BIO_read_filename(PriFile, "PriKey.pri");
  793.     if (Result != 1)
  794.     {
  795.         BIO_free(PriFile);
  796.         return FALSE;
  797.     }
  798.     RSAPriKey = d2i_RSAPrivateKey_bio(PriFile, NULL);
  799.     if (RSAPriKey == NULL)
  800.     {
  801.         BIO_free(PriFile);
  802.         return FALSE;
  803.     }
  804.     Result = RSA_sign(NID_md5_sha1, DeBuf, DeBufLen, EnBuf, (unsigned int*)EnBufLen, RSAPriKey);
  805.     if (Result != 1)
  806.     {
  807.         RSA_free(RSAPriKey);
  808.         BIO_free(PriFile);
  809.         return FALSE;
  810.     }
  811.     RSA_free(RSAPriKey);
  812.     BIO_free(PriFile);
  813.     return TRUE;
  814. }
  815. BOOL TestOpenSSLRSAVerify(CK_BYTE_PTR EnBuf, CK_ULONG EnBufLen, CK_BYTE_PTR DeBuf, CK_ULONG DeBufLen)
  816. {
  817.     BIO *PubFile = NULL;
  818.     RSA *RSAPubKey = NULL;
  819.     int Padding = RSA_PKCS1_PADDING;
  820.     CK_RV Result = CKR_OK;
  821.     PubFile = BIO_new(BIO_s_file());
  822.     if (PubFile == NULL)
  823.     {
  824.         return FALSE;
  825.     }
  826.     Result = BIO_read_filename(PubFile, "PubKey.pub");
  827.     if (Result != 1)
  828.     {
  829.         BIO_free(PubFile);
  830.         return FALSE;
  831.     }
  832.     RSAPubKey = d2i_RSA_PUBKEY_bio(PubFile, NULL);
  833.     if (RSAPubKey == NULL)
  834.     {
  835.         BIO_free(PubFile);
  836.         return FALSE;
  837.     }
  838.     Result = RSA_verify(NID_md5_sha1, DeBuf, DeBufLen, EnBuf, EnBufLen, RSAPubKey);
  839.     if (Result != 1)
  840.     {
  841.         RSA_free(RSAPubKey);
  842.         BIO_free(PubFile);
  843.         return FALSE;
  844.     }
  845.     RSA_free(RSAPubKey);
  846.     BIO_free(PubFile);
  847.     return TRUE;
  848. }
  849. RSA* GetRSAPubKey(CK_SESSION_HANDLE Session)
  850. {
  851.     CK_RV Result = CKR_OK;
  852.     RSA *PubKey = NULL;
  853.     CK_OBJECT_CLASS objectclass = CKO_PUBLIC_KEY;
  854.     CK_KEY_TYPE keytype = CKK_RSA;
  855.     CK_BYTE truevalue = TRUE;
  856.     CK_BYTE falsevalue = FALSE;
  857.     CK_BYTE publab[] = "PubKey";
  858.     CK_OBJECT_HANDLE PubHandle = 0;
  859.     CK_ULONG ObjCount = 0;
  860.     CK_BYTE RSA_PUB_N[1024] = {0};
  861.     CK_ULONG RSA_PUB_N_LEN = 1024;
  862.     CK_BYTE RSA_PUB_E[1024] = {0};
  863.     CK_ULONG RSA_PUB_E_LEN = 1024;
  864.     CK_ATTRIBUTE PubKeyAttr[] = {
  865.         {CKA_CLASS, &objectclass, sizeof(objectclass)},
  866.         {CKA_KEY_TYPE, &keytype, sizeof(keytype)},
  867.         {CKA_TOKEN, &truevalue, sizeof (truevalue)},
  868.         {CKA_LABEL, publab, sizeof(publab)-1},
  869.         {CKA_ENCRYPT, &truevalue, sizeof(truevalue)},
  870.         {CKA_VERIFY, &truevalue, sizeof(truevalue)},
  871.         {CKA_PRIVATE, &falsevalue, sizeof(falsevalue)},
  872.         {CKA_MODULUS, RSA_PUB_N, RSA_PUB_N_LEN},
  873.         {CKA_PUBLIC_EXPONENT, RSA_PUB_E, RSA_PUB_E_LEN}
  874.     };
  875.     CK_MECHANISM mechanism = {CKM_RSA_PKCS, NULL_PTR, 0};
  876.     Result = C_FindObjectsInit(Session, PubKeyAttr, 4);
  877.     if (Result != CKR_OK)
  878.     {
  879.         return NULL;
  880.     }
  881.     Result = C_FindObjects(Session, &PubHandle, 1, &ObjCount);
  882.     C_FindObjectsFinal(Session);
  883.     if ((Result != CKR_OK) || (ObjCount == 0))
  884.     {
  885.         return NULL;
  886.     }
  887.     Result = C_GetAttributeValue(Session, PubHandle, PubKeyAttr, 9);
  888.     if (Result != CKR_OK)
  889.     {
  890.         return NULL;
  891.     }
  892.     PubKey = RSA_new();
  893.     PubKey->n = BN_bin2bn((const unsigned char*)PubKeyAttr[7].pValue, PubKeyAttr[7].ulValueLen, NULL);
  894.     PubKey->e = BN_bin2bn((const unsigned char*)PubKeyAttr[8].pValue, PubKeyAttr[8].ulValueLen, NULL);
  895.     return PubKey;
  896. }
  897. VOID FreeRSA(RSA *rsa)
  898. {
  899.     if (rsa != NULL)
  900.     {
  901.         RSA_free(rsa);
  902.     }
  903. }
原创粉丝点击