📄 sctint.c
字号:
/*-------------------------------------------------------+-----*//* | GMD *//* SYSTEM STAMOD - Version 2.0 +-----*//* *//*-------------------------------------------------------------*//* *//* PACKAGE SCTINT VERSION 2.0 *//* DATE November 1991 *//* BY Levona Eckstein*//* *//* FILENAME *//* sctint.c *//* *//* DESCRIPTION *//* SCT - Interface - Module *//* *//* EXPORT DESCRIPTION *//* sct_reset() Reset SmartCard terminal *//* *//* sct_interface() Send Command / receive response *//* *//* sct_perror() Print error message *//* *//* sct_info() information about sct/sc *//* *//* sct_list() list of installed sct's *//* *//* sct_close() close port of SCT *//* *//* sct_secure() set sessionkey *//* *//* sct_setmode() set security mode DTE-SCT *//* *//* sct_get_errmsg() get SCT error message *//* *//* sct_errno error number *//* *//* sct_errmsg address of error message *//* *//* sct_tester send sct-apdu / receive sct_apdu *//* (only for sct tester ) *//* sctint.h *//* *//* sctrc.h *//* *//* *//* *//* IMPORT DESCRIPTION *//* *//* sta_aux_bytestr_free release byte-buffer *//* *//* sta_aux_elemlen eleminate length field in resp. *//* *//* SCTcreate create S-Command *//* *//* SCTerr error-handling *//* *//* SCTcheck check 1 or 3 bytes *//* *//* SCTstatus send S_STATUS *//* *//* SCTresponse analyse the response *//* *//* get_orgelem read org. element out of install *//* file *//* *//* get_idelem read element out of sct-list *//* *//* cr_sctlist create sct-list *//* *//* pr_element print sct-element if TRACE *//* *//* COMinit Port-Initialisation *//* *//* COMreset Port-Reset *//* *//* COMtrans Transfer of S-APDU *//* *//* COMclose Close port *//* *//* Aenderungen Viebeg Beginn *//* sca_write_SCT_config() Encrypt and write configuration*//* data for the specified SCT. *//* Aenderungen Viebeg Ende *//* *//*-------------------------------------------------------------*//*-------------------------------------------------------------*//* include-Files *//*-------------------------------------------------------------*/#include <stdio.h>#ifdef PROCDAT#include "secsc.h"#else#include "sca.h"#endif /* PROCDAT */#include "sctint.h"#include "sctrc.h"#include "sctmsg.h"#include "sctmem.h"#include "sctport.h"#include "error.h" /* transmission module */#ifdef MAC#include "baud.h"#endif/*-------------------------------------------------------------*//* extern declarations *//*-------------------------------------------------------------*/extern unsigned int tp1_err; /* error-variable from transmission module */extern int COMinit();extern int COMreset();extern int COMtrans();extern int COMclose();extern struct s_portparam *p_lhead; /* Begin of sct_list from sctmem.c */extern struct s_portparam *get_idelem();extern int cr_sctlist();extern int get_orgelem();extern void pr_element();extern void sta_aux_bytestr_free();extern void sta_aux_elemlen();extern char *SCTcreate();extern int SCTerr();extern int SCTcheck();extern int SCTstatus();extern int SCTresponse();#ifdef PROCDATextern int sca_write_SCT_config();#endif /* PROCDAT *//*-------------------------------------------------------------*//* type definitions *//*-------------------------------------------------------------*/#ifdef BSD/* #define B19200 14 */#include <sys/ttydev.h>#endif#ifdef SYSTEMV/* #define B19200 14 */#include <sys/ttydev.h>#endif#ifdef __HP__#ifdef SYSV#include <termio.h>#else#include <sgtty.h>#endif#endif#define BITNULL (BitString *)0/*-------------------------------------------------------------*//* globale variable definitions *//*-------------------------------------------------------------*/unsigned int sct_errno; /* error variable */char *sct_errmsg; /* error message *//*-------------------------------------------------------------*//* lokale Variable definitions *//*-------------------------------------------------------------*/#ifdef STREAMstatic BOOL first = FALSE; /* FLAG, if Trace-File open */FILE *sct_trfp; /* Filepointer of trace file */#endifstatic BOOL resfirst = FALSE; /* FLAG, if sct_reset already called */static char fermat_f4[3] = {'\001', '\000', '\001'}; /* public exponent */static int fermat_f4_len = 3;/*--------------------------------------------------------*//* | GMD *//* +-----*//* PROC sct_reset VERSION 2.0 *//* DATE November 1991 *//* BY L.Eckstein,GMD *//* *//* DESCRIPTION *//* Reset Smartcard Terminal *//* If this function is called the first time, then *//* the installation file will be opened and the *//* sct-list for further use will be created. *//* *//* Aenderungen Viebeg Beginn *//* *//* Save SCT configuration data in a file *//* Aenderungen Viebeg Ende *//* *//* *//* *//* *//* IN DESCRIPTION *//* sct_id SCT identifier *//* OUT *//* *//* *//* *//* RETURN DESCRIPTION *//* 0 o.k *//* -1 error *//* *//* ENOSHELL *//* EOPERR *//* EEMPTY *//* EMEMAVAIL *//* ECLERR *//* ESIDUNK *//* ERDERR *//* EINVARG *//* ETOOLONG *//* sw1/sw2 from SCT response *//* T1 - ERROR *//* *//* CALLED FUNCTIONS *//* cr_sctlist *//* get_idelem *//* get_orgelem *//* COMinit *//* COMclose *//* COMreset *//* sct_interface *//* sta_aux_bytestr_free *//* Aenderungen Viebeg Beginn *//* sca_write_SCT_config() Encrypt and write configuration *//* data for the specified SCT. *//* Aenderungen Viebeg Ende *//* *//*--------------------------------------------------------*/intsct_reset(sct_id) int sct_id; /* SCT identifier */{ /*----------------------------------------------------------*/ /* Definitions */ /*----------------------------------------------------------*/ int i; struct s_portparam *p_elem; unsigned int sw1 = 0; Bytestring response; Request request; int baud; int databits; int stopbits; char *p; int div = 19200; int index; int resetbaud;#ifdef PROCDAT char *proc = "sct_reset";#ifdef SECSCTEST fprintf(stderr, "SECSC-Function: %s\n", proc);#endif#endif /* PROCDAT */ /*----------------------------------------------------------*/ /* Statements */ /*----------------------------------------------------------*/ /*------------------------------------*/ /* Initialisation */ /*------------------------------------*/ sct_errno = 0;#ifdef STREAM if (!first) { sct_trfp = fopen("SCTINT.TRC", "wt"); first = TRUE; };#endif /*------------------------------------*/ /* Create sct_list */ /*------------------------------------*/ if (!resfirst) { /* create sct-list */ if (cr_sctlist() == -1) return (S_ERR); resfirst = TRUE; }; /*------------------------------------------*/ /* test, if sct_id refers to a sct element */ /*------------------------------------------*/ if ((p_elem = get_idelem(sct_id)) == PORTNULL) return (S_ERR); /* ERROR: sct not in sct-list */#ifdef MEMTRACE fprintf(sct_trfp, "Element after get_idelem in sct_reset\n"); pr_element(sct_trfp, p_elem);#endif#ifdef PROCDAT /* * If a previous process has already resetted the SCT and * the SC has already been inserted * => don't reset port again */ if ((p_elem->sc_request == TRUE) && (p_elem->schistory != NULL) && (strlen(p_elem->schistory) != 0) && (p_elem->port_id > 0)) { return (S_NOERR); /* reset already done by a previous process*/ }#endif /*PROCDAT */ /*------------------------------------*/ /* set sad, dad in sct_element */ /*------------------------------------*/ p_elem->sad = SAD; p_elem->dad = DAD; /*------------------------------------*/ /* call COMinit - procedure */ /*------------------------------------*/ if (p_elem->port_id > 0) COMclose(p_elem->port_id);#ifdef TRACE fprintf(sct_trfp, "CALL get_orgelem in sct_reset before COMinit\n");#endif if (get_orgelem(sct_id, p_elem) == -1) return (S_ERR); if ((COMinit(p_elem)) == -1) return (SCTerr(sw1, tp1_err));#ifdef SECSCTEST fprintf(stderr, "(sct_reset) Port: %d for SCT: %d opened\n", p_elem->port_id, sct_id);#endif /*------------------------------------*/ /* send RESET - Command */ /*------------------------------------*/ if (sct_interface(sct_id, S_RESET, &request, &response) == -1) return (S_ERR); /*------------------------------------*/ /* set reset-values in p_elem */ /*------------------------------------*/ baud = p_elem->baud; databits = p_elem->databits; stopbits = p_elem->stopbits; p = response.bytes; p_elem->dataformat = *p++; p_elem->protocoltype = *p++; p_elem->bwt = *p++; p_elem->cwt = *p++; p_elem->chaining = (Chain) * p++; p_elem->baud = 0; p_elem->baud = ((((int) *p++) & 0xff) << 8); p_elem->baud += (((int) *p++) & 0xFF);#ifdef DOS p_elem->baud = (div / p_elem->baud) * 6;#endif /*------------------------------------*/ /* release response-buffer */ /*------------------------------------*/ sta_aux_bytestr_free(&response);#ifdef BSD /*------------------------------------*/ /* test baudrate */ /*------------------------------------*/ if (p_elem->baud < 2400) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -