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

📄 generic.c

📁 linux下的专门用于处理PKCS11的c++库和源代码 非常好用
💻 C
字号:
/* * generic.c: Generic PKCS#11 functions for slot and token management * * Copyright (C) 2001  Timo Ter鋝 <timo.teras@iki.fi> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <stdio.h>#include <stdarg.h>#include <string.h>#include <winscard.h>#include "sc-pkcs11.h"#include <sc.h>struct sc_context *ctx = NULL;struct pkcs11_slot slot[PKCS11_MAX_SLOTS];struct pkcs11_session *session[PKCS11_MAX_SESSIONS+1];void LOG(char *format, ...){	va_list valist;	FILE *out;	out = fopen("/tmp/libsc-pkcs11.log", "a");	if (out != NULL) {                va_start(valist, format);		vfprintf(out, format, valist);                va_end(valist);		fclose(out);	}}CK_RV C_Initialize(CK_VOID_PTR pReserved){	int rv;	LOG("C_Initialize(0x%x)\n", pReserved);	memset(session, 0, sizeof(session));        memset(slot, 0, sizeof(slot));	ctx = NULL;	rv = sc_establish_context(&ctx);	if (rv != 0) {		LOG("ERROR: Unable to connect to Resource Manager\n");		return CKR_DEVICE_ERROR;	}        return CKR_OK;}CK_RV C_Finalize(CK_VOID_PTR pReserved){	int i;	LOG("C_Finalize(0x%x)\n", pReserved);	for (i=0; i < PKCS11_MAX_SLOTS; i++)		slot_disconnect(i);	sc_destroy_context(ctx);        return CKR_OK;}CK_RV C_GetInfo(CK_INFO_PTR pInfo){	LOG("C_GetInfo(0x%x)\n", pInfo);        memset(pInfo, 0, sizeof(CK_INFO));	pInfo->cryptokiVersion.major = 2;	pInfo->cryptokiVersion.minor = 11;	strcpy(pInfo->manufacturerID, "Timo Teras & Juha Yrjola");	strcpy(pInfo->libraryDescription, "PC/SC PKCS#15 SmartCard reader");	pInfo->libraryVersion.major = 0;	pInfo->libraryVersion.minor = 1;        return CKR_OK;}CK_RV C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR ppFunctionList){        LOG("C_GetFunctionList(0x%x)\n", ppFunctionList);	*ppFunctionList = &function_list;	return CKR_OK;}CK_RV C_GetSlotList(CK_BBOOL       tokenPresent,  /* only slots with token present */		    CK_SLOT_ID_PTR pSlotList,     /* receives the array of slot IDs */		    CK_ULONG_PTR   pulCount)      /* receives the number of slots */{        int i;        LOG("C_GetSlotList(%d, 0x%x, 0x%x)\n", tokenPresent, pSlotList, pulCount);	if (pSlotList == NULL_PTR) {		*pulCount = ctx->reader_count;                return CKR_OK;	}	if (*pulCount < ctx->reader_count) {		*pulCount = ctx->reader_count;                return CKR_BUFFER_TOO_SMALL;	}	for (i = 0; i < ctx->reader_count; i++)		pSlotList[i] = i;        *pulCount = ctx->reader_count;	return CKR_OK;}CK_RV C_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo){	LOG("C_GetSlotInfo(%d, 0x%x)\n", slotID, pInfo);	if (slotID < 0 || slotID >= ctx->reader_count)                return CKR_SLOT_ID_INVALID;	memset(pInfo, 0, sizeof(CK_SLOT_INFO));	strncpy(pInfo->slotDescription, ctx->readers[slotID],		sizeof(pInfo->slotDescription));	strcpy(pInfo->manufacturerID, "PC/SC interface");	pInfo->flags = CKF_REMOVABLE_DEVICE | CKF_HW_SLOT;	if (sc_detect_card(ctx, slotID) == 1) {                LOG("Detected card in slot %d\n", slotID);		pInfo->flags |= CKF_TOKEN_PRESENT;	} else {		LOG("No card in slot %d\n", slotID);                slot_disconnect(slotID);	}	pInfo->hardwareVersion.major = 1;	pInfo->firmwareVersion.major = 1;	LOG("C_GetSlotInfo() ret: flags %X\n", pInfo->flags);	return CKR_OK;}CK_RV C_GetTokenInfo(CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo){	int r;	        LOG("C_GetTokenInfo(%d, 0x%x)\n", slotID, pInfo);	if (slotID < 0 || slotID >= ctx->reader_count)                return CKR_SLOT_ID_INVALID;	memset(pInfo, 0, sizeof(CK_SLOT_INFO));	if (!(slot[slotID].flags & SLOT_CONNECTED)) {		r = slot_connect(slotID);                if (r)			return r;	}	strncpy(pInfo->label, slot[slotID].p15card->label, 32);	pInfo->label[31] = 0;	strncpy(pInfo->manufacturerID, slot[slotID].p15card->manufacturer_id, 32);	pInfo->manufacturerID[31] = 0;	strcpy(pInfo->model, "PKCS#15 SC");	strncpy(pInfo->serialNumber, slot[slotID].p15card->serial_number, 16);	pInfo->serialNumber[15] = 0;	pInfo->flags = CKF_USER_PIN_INITIALIZED | CKF_LOGIN_REQUIRED;//	pInfo->ulMaxSessionCount = 1;	/* opened in exclusive mode */	pInfo->ulMaxSessionCount = 0; /* FIXME */	pInfo->ulSessionCount = 0;	pInfo->ulMaxRwSessionCount = 1;	pInfo->ulRwSessionCount = 0;	if (slot[slotID].p15card->pin_info[0].magic == SC_PKCS15_PIN_MAGIC) {		pInfo->ulMaxPinLen = slot[slotID].p15card->pin_info[0].stored_length;		pInfo->ulMinPinLen = slot[slotID].p15card->pin_info[0].min_length;	} else {		/* choose reasonable defaults */		pInfo->ulMaxPinLen = 8;		pInfo->ulMinPinLen = 4;	}	pInfo->ulTotalPublicMemory = 0;	pInfo->ulFreePublicMemory = 0;	pInfo->ulTotalPrivateMemory = 0;	pInfo->ulFreePrivateMemory = 0;	pInfo->hardwareVersion.major = 1;	pInfo->hardwareVersion.minor = 0;	pInfo->firmwareVersion.major = 1;	pInfo->firmwareVersion.minor = 0;	        return CKR_OK;}CK_RV C_GetMechanismList(CK_SLOT_ID slotID,			 CK_MECHANISM_TYPE_PTR pMechanismList,                         CK_ULONG_PTR pulCount){	static const CK_MECHANISM_TYPE mechanism_list[] = {		CKM_RSA_PKCS,		CKM_RSA_X_509,		CKM_SHA1_RSA_PKCS,	};        const int numMechanisms = sizeof(mechanism_list) / sizeof(mechanism_list[0]);	LOG("C_GetMechanismList(%d, 0x%x, 0x%x)\n", slotID, pMechanismList, pulCount);	if (slotID < 0 || slotID >= ctx->reader_count)                return CKR_SLOT_ID_INVALID;	if (pMechanismList == NULL_PTR) {		*pulCount = numMechanisms;                return CKR_OK;	}	if (*pulCount < numMechanisms) {		*pulCount = numMechanisms;                return CKR_BUFFER_TOO_SMALL;	}        memcpy(pMechanismList, &mechanism_list, sizeof(mechanism_list));        return CKR_OK;}CK_RV C_GetMechanismInfo(CK_SLOT_ID slotID,			 CK_MECHANISM_TYPE type,			 CK_MECHANISM_INFO_PTR pInfo){	LOG("C_GetMechanismInfo(%d, %d, 0x%x)\n", slotID, type, pInfo);        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_InitToken(CK_SLOT_ID slotID,		  CK_CHAR_PTR pPin,		  CK_ULONG ulPinLen,		  CK_CHAR_PTR pLabel){        LOG("C_InitToken(%d, '%s', %d, '%s')\n", slotID, pPin, ulPinLen, pLabel);        return CKR_FUNCTION_NOT_SUPPORTED;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -