⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aes_func.c

📁 IBM的Linux上的PKCS#11实现
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -