📄 aes_func.c
字号:
printf("Looks okay...\n"); return TRUE;}////int do_EncryptAES_Multipart_CBC(void){ CK_BYTE original[BIG_REQUEST]; CK_BYTE crypt1[BIG_REQUEST]; CK_BYTE crypt2[BIG_REQUEST]; CK_BYTE decrypt1[BIG_REQUEST]; CK_BYTE decrypt2[BIG_REQUEST]; CK_SLOT_ID slot_id; CK_SESSION_HANDLE session; CK_MECHANISM mech; CK_OBJECT_HANDLE h_key; CK_FLAGS flags; CK_BYTE init_v[AES_BLOCK_SIZE]; CK_BYTE user_pin[8]; CK_ULONG user_pin_len; CK_ULONG i, k, key_size = AES_KEY_SIZE_256; CK_ULONG orig_len; CK_ULONG crypt1_len, crypt2_len, decrypt1_len, decrypt2_len; CK_ULONG tmp; CK_RV rc; CK_ATTRIBUTE key_gen_tmpl[] = { {CKA_VALUE_LEN, &key_size, sizeof(CK_ULONG) } }; printf("do_EncryptAES_Multipart_CBC...\n"); slot_id = SlotID; flags = CKF_SERIAL_SESSION | CKF_RW_SESSION; rc = funcs->C_OpenSession(slot_id, flags, NULL, NULL, &session); if (rc != CKR_OK) { OC_ERR_MSG(" C_OpenSession #1", rc); return FALSE; } memcpy(user_pin, "12345678", 8); user_pin_len = 8; rc = funcs->C_Login(session, CKU_USER, user_pin, user_pin_len); if (rc != CKR_OK) { OC_ERR_MSG(" C_Login #1", rc); return FALSE; } mech.mechanism = CKM_AES_KEY_GEN; mech.ulParameterLen = 0; mech.pParameter = NULL; // first, generate an AES key // rc = funcs->C_GenerateKey(session, &mech, key_gen_tmpl, 1, &h_key); if (rc != CKR_OK) { OC_ERR_MSG(" C_GenerateKey #1", rc); return FALSE; } // now, encrypt some data // orig_len = sizeof(original); for (i = 0; i < orig_len; i++) { original[i] = i % 255; } memcpy(init_v, "0123456789abcdef", 16); mech.mechanism = CKM_AES_CBC; mech.ulParameterLen = AES_BLOCK_SIZE; mech.pParameter = init_v; rc = funcs->C_EncryptInit(session, &mech, h_key); if (rc != CKR_OK) { OC_ERR_MSG(" C_EncryptInit #1", rc); return FALSE; } // use normal ecb mode to encrypt data1 // crypt1_len = sizeof(crypt1); rc = funcs->C_Encrypt(session, original, orig_len, crypt1, &crypt1_len); if (rc != CKR_OK) { OC_ERR_MSG(" C_Encrypt #1", rc); return FALSE; } // use multipart cbc mode to encrypt data2 in 1024 byte chunks // rc = funcs->C_EncryptInit(session, &mech, h_key); if (rc != CKR_OK) { OC_ERR_MSG(" C_EncryptInit #2", rc); return FALSE; } i = k = 0; crypt2_len = sizeof(crypt2); while (i < orig_len) { CK_ULONG rem = orig_len - i; CK_ULONG chunk; if (rem < 100) chunk = rem; else chunk = 100; tmp = crypt2_len - k; // how much room is left in crypt2? rc = funcs->C_EncryptUpdate(session, &original[i], chunk, &crypt2[k], &tmp); if (rc != CKR_OK) { OC_ERR_MSG(" C_EncryptUpdate #1", rc); return FALSE; } k += tmp; i += chunk; } crypt2_len = k; rc = funcs->C_EncryptFinal(session, NULL, &tmp); if (rc != CKR_OK) { OC_ERR_MSG(" C_EncryptFinal #2", rc); return FALSE; } if (tmp != 0) { printf (" ERROR: EncryptFinal wants to return %d bytes\n", tmp); return FALSE; } if (crypt2_len != crypt1_len) { printf(" ERROR: crypt1_len = %d, crypt2_len = %d\n", crypt1_len, crypt2_len); return FALSE; } // compare both encrypted blocks. they'd better be equal // for (i = 0; i < crypt1_len; i++) { if (crypt1[i] != crypt2[i]) { printf (" ERROR: mismatch. crypt1 != crypt2 at byte %d\n", i); return FALSE; } } // now, decrypt the data // rc = funcs->C_DecryptInit(session, &mech, h_key); if (rc != CKR_OK) { OC_ERR_MSG(" C_DecryptInit #1", rc); return FALSE; } decrypt1_len = sizeof(decrypt1); rc = funcs->C_Decrypt(session, crypt1, crypt1_len, decrypt1, &decrypt1_len); if (rc != CKR_OK) { OC_ERR_MSG(" C_Decrypt #1", rc); return FALSE; } // use multipart cbc mode to encrypt data2 in 1024 byte chunks // rc = funcs->C_DecryptInit(session, &mech, h_key); if (rc != CKR_OK) { OC_ERR_MSG(" C_DecryptInit #1", rc); return FALSE; } i = k = 0; decrypt2_len = sizeof(decrypt2); while (i < crypt1_len) { CK_ULONG rem = crypt1_len - i; CK_ULONG chunk; if (rem < 101) chunk = rem; else chunk = 101; tmp = decrypt2_len - k; rc = funcs->C_DecryptUpdate(session, &crypt1[i], chunk, &decrypt2[k], &tmp); if (rc != CKR_OK) { OC_ERR_MSG(" C_DecryptUpdate #1", rc); return FALSE; } k += tmp; i += chunk; } decrypt2_len = k; rc = funcs->C_DecryptFinal(session, NULL, &tmp); if (rc != CKR_OK) { OC_ERR_MSG(" C_DecryptFinal #2", rc); return FALSE; } if (tmp != 0) { printf (" ERROR: DecryptFinal wants to return %d bytes\n", tmp); return FALSE; } if (decrypt2_len != decrypt1_len) { printf(" ERROR: decrypt1_len = %d, decrypt2_len = %d\n", decrypt1_len, decrypt2_len); return FALSE; } // compare both decrypted blocks. they'd better be equal // for (i = 0; i < decrypt1_len; i++) { if (crypt1[i] != crypt2[i]) { printf (" ERROR: mismatch. decrypt1 != decrypt2 at byte %d\n", i); return FALSE; } } // compare the multi-part decrypted block with the 'control' block // for (i = 0; i < orig_len; i++) { if (original[i] != decrypt1[i]) { printf (" ERROR: decrypted mismatch: original != decrypt at byte %d\n", i); return FALSE; } } rc = funcs->C_CloseAllSessions(slot_id); if (rc != CKR_OK) { OC_ERR_MSG(" C_CloseAllSessions #1", rc); return FALSE; } printf("Looks okay...\n"); return TRUE;}////int do_EncryptAES_Multipart_CBC_PAD(void){ CK_BYTE original[BIG_REQUEST]; CK_BYTE crypt1[BIG_REQUEST + AES_BLOCK_SIZE]; // account for padding CK_BYTE crypt2[BIG_REQUEST + AES_BLOCK_SIZE]; // account for padding CK_BYTE decrypt1[BIG_REQUEST + AES_BLOCK_SIZE]; // account for padding CK_BYTE decrypt2[BIG_REQUEST + AES_BLOCK_SIZE]; // account for padding CK_SLOT_ID slot_id; CK_SESSION_HANDLE session; CK_MECHANISM mech; CK_OBJECT_HANDLE h_key; CK_FLAGS flags; CK_BYTE init_v[AES_BLOCK_SIZE]; CK_BYTE user_pin[8]; CK_ULONG user_pin_len; CK_ULONG i, k, key_size = AES_KEY_SIZE_256; CK_ULONG orig_len, crypt1_len, crypt2_len, decrypt1_len, decrypt2_len; CK_RV rc; CK_ATTRIBUTE key_gen_tmpl[] = { {CKA_VALUE_LEN, &key_size, sizeof(CK_ULONG) } }; printf("do_EncryptAES_Multipart_CBC_PAD...\n"); slot_id = SlotID; flags = CKF_SERIAL_SESSION | CKF_RW_SESSION; rc = funcs->C_OpenSession(slot_id, flags, NULL, NULL, &session); if (rc != CKR_OK) { OC_ERR_MSG(" C_OpenSession #1", rc); return FALSE; } memcpy(user_pin, "12345678", 8); user_pin_len = 8; rc = funcs->C_Login(session, CKU_USER, user_pin, user_pin_len); if (rc != CKR_OK) { OC_ERR_MSG(" C_Login #1", rc); return FALSE; } mech.mechanism = CKM_AES_KEY_GEN; mech.ulParameterLen = 0; mech.pParameter = NULL; // first, generate an AES key // rc = funcs->C_GenerateKey(session, &mech, key_gen_tmpl, 1, &h_key); if (rc != CKR_OK) { OC_ERR_MSG(" C_GenerateKey #1", rc); return FALSE; } // now, encrypt some data // orig_len = sizeof(original); for (i = 0; i < orig_len; i++) { original[i] = i % 255; } memcpy(init_v, "0123456789abcdef", 16); mech.mechanism = CKM_AES_CBC_PAD; mech.ulParameterLen = AES_BLOCK_SIZE; mech.pParameter = init_v; rc = funcs->C_EncryptInit(session, &mech, h_key); if (rc != CKR_OK) { OC_ERR_MSG(" C_EncryptInit #1", rc); return FALSE; } // use normal ecb mode to encrypt data1 // crypt1_len = sizeof(crypt1); rc = funcs->C_Encrypt(session, original, orig_len, crypt1, &crypt1_len); if (rc != CKR_OK) { OC_ERR_MSG(" C_Encrypt #1", rc); return FALSE; } // use multipart cbc mode to encrypt data2 in chunks // rc = funcs->C_EncryptInit(session, &mech, h_key); if (rc != CKR_OK) { OC_ERR_MSG(" C_EncryptInit #2", rc); return FALSE; } i = k = 0; crypt2_len = sizeof(crypt2); while (i < orig_len) { CK_ULONG rem = orig_len - i; CK_ULONG chunk, len; if (rem < 100) chunk = rem; else chunk = 100; len = crypt2_len - k; rc = funcs->C_EncryptUpdate(session, &original[i], chunk, &crypt2[k], &len); if (rc != CKR_OK) { OC_ERR_MSG(" C_EncryptUpdate #1", rc); return FALSE; } k += len; i += chunk; } crypt2_len = sizeof(crypt2) - k; rc = funcs->C_EncryptFinal(session, &crypt2[k], &crypt2_len); if (rc != CKR_OK) { OC_ERR_MSG(" C_EncryptFinal #2", rc); return FALSE; } crypt2_len += k; if (crypt2_len != crypt1_len) { printf(" ERROR: encrypted lengths don't match\n"); printf(" crypt2_len == %d, crypt1_len == %d\n", crypt2_len, crypt1_len); return FALSE; } // compare both encrypted blocks. they'd better be equal // for (i = 0; i < crypt2_len; i++) { if (crypt1[i] != crypt2[i]) { printf (" ERROR: encrypted mismatch: crypt1 != crypt2 at byte %d\n", i); return FALSE; } } // now, decrypt the data // rc = funcs->C_DecryptInit(session, &mech, h_key); if (rc != CKR_OK) { OC_ERR_MSG(" C_DecryptInit #1", rc); return FALSE; } decrypt1_len = sizeof(decrypt1); rc = funcs->C_Decrypt(session, crypt1, crypt1_len, decrypt1, &decrypt1_len); if (rc != CKR_OK) { OC_ERR_MSG(" C_Decrypt #1", rc); return FALSE; } // use multipart cbc mode to encrypt data2 in 1024 byte chunks // rc = funcs->C_DecryptInit(session, &mech, h_key); if (rc != CKR_OK) { OC_ERR_MSG(" C_DecryptInit #1", rc); return FALSE; } i = k = 0; decrypt2_len = sizeof(decrypt2); while (i < crypt2_len) { CK_ULONG rem = crypt2_len - i; CK_ULONG chunk, len; if (rem < 101) chunk = rem; else chunk = 101; len = decrypt2_len - k; rc = funcs->C_DecryptUpdate(session, &crypt2[i], chunk, &decrypt2[k], &len); if (rc != CKR_OK) { OC_ERR_MSG(" C_DecryptUpdate #1", rc); return FALSE; } k += len; i += chunk; } decrypt2_len = sizeof(decrypt2) - k; rc = funcs->C_DecryptFinal(session, &decrypt2[k], &decrypt2_len); if (rc != CKR_OK) { OC_ERR_MSG(" C_DecryptFinal #2", rc); return FALSE; } decrypt2_len += k; if (decrypt2_len != decrypt1_len) { printf(" ERROR: decrypted lengths don't match\n"); printf (" decrypt1_len == %d, decrypt2_len == %d\n", decrypt1_len, decrypt2_len); return FALSE; } if (decrypt2_len != orig_len) { printf (" ERROR: decrypted lengths don't match the original\n"); printf(" decrypt_len == %d, orig_len == %d\n", decrypt1_len, orig_len); return FALSE; } // compare both decrypted blocks. they'd better be equal // for (i = 0; i < decrypt1_len; i++) { if (decrypt1[i] != decrypt2[i]) { printf (" ERROR: decrypted mismatch: data1 != data2 at byte %d\n", i); return FALSE; } } // compare the multi-part decrypted block with the 'control' block // for (i = 0; i < orig_len; i++) { if (original[i] != decrypt2[i]) { printf (" ERROR: decrypted mismatch: original != decrypted at byte %d\n", i); return FALSE; } } rc = funcs->C_CloseAllSessions(slot_id); if (rc != CKR_OK) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -