Files
Sun1602/Server/AuthSystem/include/DCSH_SAE_1.h
T
2022-10-26 12:25:11 +08:00

2754 lines
94 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/***************************************************************************
* 文件: DCSH_SAE_1.h
*
* 功能说明: 动联动态安全认证引擎1.0头文件
*
* 版权所有:上海动联信息技术有限公司
*
* 作者: 杨波
* 时间: 2008年5月13日
* 地点: 上海 动联
*
***************************************************************************/
/*-------------------------------------------------------------------------
*修改记录*
*修改时间* *修改内容*
*
-------------------------------------------------------------------------
*备注:
* 此头文件内只允许申明,不可定义
* 此头文件内所有改动均需详细说明
*
-------------------------------------------------------------------------*/
#ifndef _DCSH_SAE_1_H
#define _DCSH_SAE_1_H
#ifdef DCSHCOREAPI_EXPORTS
#define DCSHCOREAPI_API __declspec(dllexport)
#else
#define DCSHCOREAPI_API __declspec(dllimport)
#endif
/*
#define DCSHCOREAPI_API
*/
#ifdef __cplusplus
extern "C" {
#endif
#define int8 char
#define int16 short
#define int32 long
#define uint8 unsigned char
#define uint16 unsigned short
#define uint32 unsigned int
#define uint unsigned int
#define BYTE unsigned char
#define WORD unsigned short
#define DWORD unsigned long
#define UCHAR unsigned char
#define UINT unsigned int
#define LONG long
#define ULONG unsigned long
#define VOID void
#define PVOID void *
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
//动态认证引擎的系统默认值
#define SYSTEMPIN "888888" /* 系统默认的PIN*/
#define TOTALSECONDS 0x47791200 /* 2008年1月1日00点00时00分,流失的秒*/
#define DCPVTLEN 232 /* 私有数据长度*/
#define SEEDLEN 16 /* 种子的长度,建议使用128位,经常用于密钥*/
#define EX_SEEDLEN 4 /* 种子的扩展,支持20字节*/
#define MAXSEEDLEN 20 /* 系统支持的最大种子长度,建议64,目前使用20*/
#define MAXOFFSETSECONDS 43200 /* (12*60*60)秒, 偏移量超过12小时,无论是否认证通过,应该永久禁用*/
#define ONEDAYSECONDS 86400 /* (24*60*60)秒, 一天的秒数,用于获得动态口令 */
#define TWOWEEKSECONDS 1209600 /* (14*24*60*60)秒,相距2周未登陆,则窗口自动扩展1,但最大不超过大窗口*/
#define ONEWEEKSECONDS 604800 /* (7*24*60*60)秒,相距1周未登陆,动联需要时间补偿*/
#define MAXRESYNCHTIMES 1000 //事件型令牌重新同步最大寻找次数
//事件型令牌在重新同不是分两种方式:
//1、计数从1开始,到MAXRESYNCHTIMES 中寻找
//2、从当前最后一次有效计数,到MAXRESYNCHTIMES中寻找
#define SM3HASHSTRINGLENGTH 64 //SM3算法的令牌的明文组装空间,格式参考《时间同步一次性口令认证系统标准0702》
#define DATETIMESTRINGLEN 13 //SM3算法的日期转换,12字节,最末尾第13字节为间隔的商
#define THANDELTATIMES 3 //前一次使用的时间至少是此次时间差的3倍,用于时间补偿
#define GETTOKENCODESTRHEAD "%010u:%03u:%03u:%010u:" //"起始时间:令牌间隔:动态口令长度:动态口令个数:动态口令集合"
/*定义算法*/
#define ALGORITHM_SHA1 0x01 /* 产生20字节摘要 */
#define ALGORITHM_RC6 0x02 /* 块加密,速度快*/
#define ALGORITHM_SM3 0x03 /* SM3,类似SHA1,复旦微电子 */
#define ALGORITHM_AES 0x04 /* 块加密,标准算法*/
#define ALGORITHM_ATM 0x00 /* 支持ATM机方式的挑战应答,带时间*/
#define ALGORITHM_ATM_MD5 0x05 /* 支持ATM机方式的挑战应答,带时间,用户口令使用MD5摘要*/
#define ALGORITHM_ATM_SHA1 0x06 /* 支持ATM机方式的挑战应答,带时间,用户口令使用SHA1摘要*/
#define ALGORITHM_HMAC 0x08 /* OTP,产生20字节摘要 */
#define ALGORITHM_YQ 0x10 /* AES,使用新的截取方式 */
#define ALGORITHM_COS 0x20 /* HMACcos的sim卡方式 */
#define ALGORITHM_ASP 0x30 /* 卓望SIM卡令牌,使用HMAC */
#define ALGORITHM_UNI 0x07 /* 联通SIM卡令牌,使用HMAC,但是截取规则不一样 */
#define ALGORITHM_TOTP 0x09 /* 工商银行使用的时间型OTPOTP的时候等同ALGORITHM_HMAC,挑战则追加时间 */
#define ALGORITHM_SSM3 0x11 /* SM3算法,国密办刚公开,软算法,依然采用原先的规则 */
#define STRLENLOGID 48 /*LoginId的长度*/
#define STRLENAME 24 /*UserName的长度*/
#define GMTSTRLEN 24 /*时间字符的长度 GMT 2008-05-14 04:09:22*/
#define URGENCYPWLEN 20 /*紧急密码的最大长度*/
#define DCSH_MIN_PIN_LEN 4 /*Pin的最小长度*/
#define DCSH_MAX_PIN_LEN 8 /*Pin的最大长度*/
#define DCSH_PIN_LEN 12 /*Pin的长度空间,限制为4-8*/
#define DCSH_SN_LEN 12 /*序列号最大长度*/
#define DCSH_PRN_LEN 12 /*tokencode最大长度*/
#define DCSH_RESPONSE_LEN 16 /*用户响应码,可能包含PIN*/
#define DCSH_CHALLENGE_LEN 16 /*挑战码,建议8字节*/
#define UNLOCKCODELEN 8 /*解锁码的长度为8个数字*/
#define HMACQUESTIONLEN 8 /*挑战应答,HMAC算法的question长度一定为8*/
#define HOSTBYTELEN 12 /*取12个字节,使用最后4/6位*/
#define UNICOMMODLEN 1000 /*取摸,获得3个数字,不足则前端补零 */
#define UNICOMNUMBER 3 /*每个Short取模后最大数字为3个*/
#define OCRASUITE "OCRA-1:HOTP-SHA1-6:QN08" /* 挑战应答的规则 */
#define OCRASUITE_ICBC "OCRA-1:HOTP-SHA1-6:QA64-T" /* 工商银行挑战应答时间型令牌的规则 */
#define SM3OCRASUITE "OCRA-1:HOTP-SM3-8:QN08" /* SM3算法的挑战应答规则 */
//令牌类型
#define DCSH_TOKEN_TYPE_TIME 0 /*时间类型的令牌*/
#define DCSH_TOKEN_TYPE_EVENT 1 /*事件类型的令牌*/
#define DCSH_TOKEN_TYPE_MOBILE 2 /*手机类型的令牌, 动联专用*/
//令牌的应用类型
#define DCSH_HARDWARE_TOKEN_DC 1 /*动联生产的硬件令牌*/ //目前我们在做的,专门特指K5令牌
#define DCSH_HARDWARE_TOKEN_DC_EX 2 /*动联生产的令牌和 其他厂商的扩展*/
//主要使用了另一种传递参数方式
//支持杭州驭强的令牌 --AES
//支持cos的SIM卡令牌 --COS
//支持复旦微电子的SM3令牌,可能成为行业标准 --SM3
//动联自己的令牌
//卓望和联通的SIM卡令牌
#define DCSH_HARDWARE_TOKEN_CHR 3 /*异步类型的硬件令牌*/ //挑战应答,RSA有一款
#define DCSH_SOFTWARE_TOKEN_DC 4 /*动联生产的软件令牌*/ //标志位区分,等同于DCSH_HARDWARE_TOKEN_DC_EX
#define DCSH_SOFTWARE_TOKEN_PHONE 5 /*手机令牌 */ //标志位区分,等同于DCSH_HARDWARE_TOKEN_DC_EX
#define DCSH_SOFTWARE_TOKEN_CHR 6 /*异步类型的软件令牌*/ //用于手机异步令牌
#define DCSH_SOFTWARE_TOKEN_SMS 7 /*短信类型的软件令牌*/ //短信令牌
#define DCSH_HARDWARE_TOKEN_COVER 8 /*刮刮卡令牌*/
#define DCSH_HARDWARE_TOKEN_ATM 9 /*属于异步类型的令牌*/ //为银行ATM输入用户密码到令牌上
#define DCSH_SOFTWARE_TOKEN_ATM 10 /*属于异步软件令牌*/ //为银行ATM软件令牌,可用于手机和软件
#define DCSH_HARDWARE_TOKEN_SIM 11 /*卓望和联通的SIM卡令牌也单独列为应用类型,也可属于DC_EX*/
#define DCSH_HARDWARE_TOKEN_GETDC 12 /*K5 该令牌类型支持获取动态口令,建议该类型不用于认证*/
#define DCSH_HARDWARE_TOKEN_GETEX 13 /*K8 该令牌类型支持获取动态口令,建议该类型不用于认证*/
//认证类型
#define DCSH_PRN_TYPE 0 /*直接使用tokencode认证*/
#define DCSH_PASSCODE_TYPE 1 /*带PIN的tokencode认证 */
#define DCSH_CHALLENGE_RESPONSE_TYPE 2 /*挑战响应的认证方式 */
#define DCSH_PASSCODE_NEXT_TYPE 3 /*需要返回下一个tokencode的认证方式*/
#define DCSH_SMS_GETPRN_TYPE 4 /*短消息认证,获得tokencode*/
#define DCSH_SMS_PRN_TYPE 5 /*短消息认证,认证tokencode*/
#define DCSH_MSCHAP2_PASSCODE_TYPE 6 /*使用MS-Chap v2的认证方式,由引擎计算tokencode来验证*/
#define DCSH_MSCHAP2_CHANGE_PW_TYPE 7 /*修改令牌的PIN码*/
#define DCSH_SIGN_PRN_TYPE 8 /*数字签名的动态认证方式*/
#define DCSH_GET_SIGN_PRN_TYPE 9 /*获得签名口令,可用于短信数字签名方式*/
#define DCSH_COVER_GET_HOSTCODE_TYPE 10 /*获得刮刮卡的当前计数的主机码*/
#define DCSH_COVER_HOST_PRN_TYPE 11 /*刮刮卡码认证,包含主机字符 动态口令 PIN*/
#define DCSH_CHALLENGE_RESPONSE_ATM_TYPE 12 /*ATM用户密码的挑战应答认证模式,用户密码支持摘要算法 */
//认证状态,认证模式
#define DCSH_LOGON_STATE_FIRST_LOGIN 1
#define DCSH_LOGON_STATE_NORMAL 2
#define DCSH_LOGON_STATE_NEXT_TOKENCODE 3
#define DCSH_LOGON_STATE_NEXT_TOKENCODE_2 4
#define DCSH_MAX_PINTIMES 3 /*最大Pin输入错误次数*/
#define DCSH_MAX_THRESOLD 10 /*最大tokencode错误次数,超过进入next模式*/
#define DCSH_MAX_REPEATED 5 /*允许重放次数,超过则禁用*/
#define ICBC_ACTIVECHECKCODELEN 12 /* 工行令牌种子激活码的长度12,前6激活,后6校验 */
#define ICBC_ACTIVECODELEN 6 /* 工行令牌种子真正激活码6 */
#define ICBC_ACTIVECODECALCLEN 8 /* 工行令牌种子真正激活码6带入运算时的真实长度8 */
#define ICBC_CHECKCODELEN 6 /* 工行令牌种子真正校验码长度6 */
#define ICBC_PINLOCKCODELEN 8 /* 工行令牌PIN输入错误锁定后锁定码长度 */
#define ICBC_PINUNLOCKCODELEN 6 /* 工行令牌解锁码长度 */
#define DCSHEMSUCCESS 0 //验证通过,除了EMBADREC,所有的返回必须保存PDATA到数据库
#define DCSHEMFIRST 1 //第一次使用令牌登陆,成功,等同于EMSUCCESS
#define DCSHEMBADARG 2 //参数错误,参数可能为空指针
#define DCSHEMBADREC 3 //严重错误!PDATA内部数据有问题,如签名等
#define DCSHEMPRNLEN 4 //Tokencode的长度错误
#define DCSHEMTIMRNG 5 //passcode时间错误,不在生命期限内
#define DCSHEMNOTASSIGNED 6 //令牌还没有分配
#define DCSHEMDISABLE 7 //令牌处于禁用状态
#define DCSHEMFOREVERDISABLE 8 //令牌被永久禁用,可能是时间偏移超过12小时
#define DCSHEMNOPIN 9 //没有输入pin码
#define DCSHEMPINLEN 10 //输入的PIN长度错误
#define DCSHEMBADPIN 11 //输入错误的PIN
#define DCSHEMSTOLEN 12 //因为PIN错误次数到达极限,默认为丢失
#define DCSHEMOUTWIND 13 //在任何窗口内找不到tokencode,可能需要再同步
#define DCSHEMREPPRN 14 //这是重放,需要小心,应该立即记录,并提醒管理员
#define DCSHEMREPDISABLE 15 //重放到一定的次数则禁用
#define DCSHEMNEXTPRN 16 //进入Next的模式
#define DCSHEMTHRESHOLDNXT 17 //输入tokencode的错误次数到达极限,以后进入NEXT模式
#define DCSHEMBADNEX 18 //在Next模式下输入错了tokencode
#define DCSHEMNEXTDISABLE 19 //在Next模式下输入错误次数到达极限,被禁用
#define DCSHEMSYN1OK 20 //重新同步模式下,第一次匹配tokencode已经找到
#define DCSHEMFIRSTDISABLE 21 //在First模式下,多次输入失败,则禁用
#define DCSHEMBADNEX2 22 //在Next2下输入错误的tokencode
#define DCSHEMBADINPUT 23 //文件无法打开
#define DCSHEMNOMEM 24 //读取BIN文件,没有足够的内存空间
#define DCSHEMBADINPFIL 25 //BIN的文件内容错误,严重错误
#define DCSHEMBADSIG 26 //BIN文件签名错误,严重错误
#define DCSHEMEMPNAME 27 //文件名称错误
#define DCSHEMKEYPAIRERR 28 //密钥对创建失败
#define DCSHEMCERTERR 29 //根证书创建失败
#define DCSHEMSEEDERR 30 //创建种子失败
#define DCSHEMREADPUBKEYERR 31 //读取公钥失败
#define DCSHEMPUBKEYENCERR 32 //公钥加密失败
#define DCSHEMREADSEEDERR 33 //读根种子文件失败
#define DCSHEMREADPRIKEYERR 34 //读根私钥失败
#define DCSHEMPRIKEYDECERR 35 //根私钥解密失败
#define DCSHEMREADPKCS10ERR 36 //读取PKCS#10文件错误
#define DCSHEMTOKENTYPE 37 //错误的令牌应用类型
#define DCSHEMREADROOTCERTERR 38 //读取根证书失败
#define DCSHEMDECROOTCERTERR 39 //解析根证书失败
#define DCSHEMDECPKCS10ERR 40 //解析PKCS#10失败
#define DCSHEMUSERCERTERR 41 //创建用户证书失败
#define DCSHEMVERSIGDATAERR 42 //验证签名错误,严重错误
#define DCSHEMDECEVPDATAERR 43 //解密数字信封错误,严重错误
#define DCSHEMREADUSERCERTERR 44 //读取用户证书失败
#define DCSHEMDECUSERCERTERR 45 //解析用户证书失败
#define DCSHEMEVPDATAERR 46 //制作数字信封失败
#define DCSHEMSIGDATAERR 47 //制作数字签名失败
#define DCSHEMREADSEEDFILEERR 48 //读取种子文件失败
#define DCSHEMPKCS10ERR 49 //创建PKCS#10失败
#define DCSHEMBADFILETYPE 50 //错误的种子文件类型
#define DCSHEMRESPONSEERR 51 //挑战认证验证失败
#define DCSHEMBADTYPE 52 //错误的令牌类型
#define DCSHEMSNASSIGNED 53 //指定的序列号已经分配,且已经使用
#define DCSHEMBADURGENCYPW 54 //紧急密码错误
#define DCSHEMSMSBADPRN 55 //短消息认证,错误的动态口令
#define DCSHEMSMSTIMEOUT 56 //口令正确,但已经超时
#define DCSHEMBADGETURGENCYPW 57 //获取紧急密码失败
#define DCSHEMPKI128 58 //CryptoAPI在公钥加密时偶尔会丢失1字节
#define DCSHEMLICDEVSNERR 59 //授权,版权控制时设备序列号错误
#define DCSHEMLICDATEEND 60 //授权,授权文件设定的有效期结束
#define DCSHEMLICEKEYERR 61 //授权,eKey内部的版权信息错误,严重
#define DCSHEMLICUSBERROR 62 //授权,usb读eKey错误,设备原因,严重
#define DCSHEMMSCHAPV2ERROR 63 //ms chap v2 认证,客户端提交nt_response错误
#define DCSHEMMSCHAPV2ERRORPW 64 //ms chap v2 修改口令,口令存在异常
#define DCSHEMDEVSNERR 65 //授权,eKey序列号不匹配
#define DCSHEMDEVFILEERROR 66 //ekey内部文件不存在
#define DCSHEMFORCESYNTYPE 67 //强制同步的类型错误,应该是只能是事件型
#define DCSHEMNOTCOVERTYPE 68 //不是刮刮卡令牌类型,不能生成卡片
#define DCSHEMOVERCOVERNUM 69 //种子生成卡片口令的数量大于最大配置
#define DCSHEMLASTCOVERNUM 70 //最后一个覆盖区不用于认证,而是用于换卡
#define DCSHEMCOVERNOTUSED 71 //当前的覆盖区还没有用于认证
#define DCSHEMMUSTGETCOVER 72 //刮刮卡认证必须先获得主机字符
#define DCSHEMHOSTCODEERRO 73 //主机字符错误
#define DCSHEMCOVERCODEERR 74 //覆盖区域的动态口令错误
#define DCSHEMERRORTODISABLE 75 //多次认证错误,导致令牌被禁用
#define DCSHEMUPDATECODEERR 76 //刮刮卡更换码错误,即最后一个刮刮卡码错误
#define DCSHEMBASE64CODEERR 77 //base64编解码错误
#define DCSHEMURGPWDERR 78 //更改服务码失败
#define DCSHEMMODIFYSNERR 79 //修改序列号时,序列号输入错误
#define DCSHEMPCIOPENERR 80 //打开PCI SJK0817E加密卡失败
#define DCSHEMPCISESSIONERR 81 //创建会话失败,可能PCI中断,也可能达到最大会话数
#define DCSHEMPCISM3ERR 82 //SM3算法内部错误
#define DCSHEMNOSUPPORT 83 //该系统不支持该算法,目前SM3仅用于windows
#define DCSHEMFORCECOUNTERLESS 84 //客户端强制同步服务端计数器时,计数器小于服务器已经使用的
#define DCSHEMSHECADLLERR 85 //加载sheca的开发接口失败
#define DCSHEMSHECAKEYERR 86 //驱动sheca的usb-eKey操作异常
#define DCSHEMPCIOPERERR 87 //加密卡运算操作失败
#define DCSHEMICBCVALUEERR 88 //工行进行种子异或的数据交验失败
#define DCSHEMICBCHAVEXOR 89 //工行的种子数据已经异或得到了新的种子数据
#define DCSHEMSEEDLENERR 90 //种子长度错误,可能是工行的种子有问题
#define DCSHEMACTIVELENERR 91 //激活码长度错误,6数字,运算长度为8,补0x00,0x00
#define DCSHEMCHECKLENERR 92 //校验码长度错误,6数字
#define DCSHEMACTIVCHECKERR 93 //激活校验码错误,12数字
#define DCSHEMBIGTIMELENERR 94 //运算的时间,大头自序,长度错误
#define DCSHEMCHANLENERR 95 //挑战的字符串长度错误,工行必须小于64
#define DCSHENUNLOCKPINERR 96 //令牌解锁码的字符串长度错误,8数字
#define DCSHENOUTONEDAY 97 //获取动态口令,时间型,超过了24小时
#define DCSHENOUTMAXCOUNTER 98 //获取动态口令,事件型,超过了1000个
typedef struct CARDREC
{
char ucSerialNumber[DCSH_SN_LEN]; /* Token序列号字符表示 */
char ucUrgencyPassWord[URGENCYPWLEN]; /* 紧急密码 */
char ucSeedNumber[32]; /* 种子转换的26个数字 */
} TOKENCARDRECORD, *PTTOKENCARDRECORD;
typedef struct DCSHPDATA {
unsigned int ulSerialNumber; /* Token序列号 */
char ucSerialNumber[DCSH_SN_LEN];/* Token序列号字符表示 */
unsigned int ulPRNLen; /* Tokencode的长度 */
unsigned int ulInterval; /* 时间间隔,产生tokencode */
unsigned int ulBirth; /* 出生日期,从 1/1/2008 */
unsigned int ulDeath; /* 有效期,秒,从 1/1/2008 */
char cTokenType; /* Token类型 */
char cIsHardwareToken; /* 是不是硬件 */
char cAlgorithmSData; /* 算法,私有数据的加密算法 */
char cAlgorithmToken; /* 算法,tokencode的产生算法*/
int iState; /* 状态值,这个非常重要的字段*/
char cEnabled; /* 是否可用,第一判断要素 */
char cAssigned; /* 是否分配,第一判断要素 */
char cNextPRNMode; /* NextToekn模式 */
char cPINDisabled; /* PIN是否使用 */
unsigned int ulLastlogin; /* 最近登陆时间,无论成功失败,秒,从 1/1/2008 */
char ucUserLoginID[STRLENLOGID]; /* */
char ucUserFirstName[STRLENAME]; /* */
char ucUserLastName[STRLENAME]; /* */
int iMaxBadPins; /* Pin优于tokencode认证,每次登陆成功前最大错误次数,超过则disable */
int iNextTokencodeModeThreshold; /* tokenode错误的极限值,超过该值,则进入Next Token模式 */
int iMaxRepeateds; /* 监测重放攻击极限值,反复提交先前的tokencode,或者同一时间提交tokencode则理解为重放,达到极限值则禁用 */
int iMaxBadNextTokencodes; /* 在Next模式下,允许最大错误次数 */
int iPrecision; /* 精度,离ulLastSuccessLogin每隔一个月累加精度秒 */
int iLargeWindowSeconds; /* 秒 */
int iMediumWindowSeconds; /* 秒 */
int iSmallWindowSeconds; /* 秒 */
char ucTokenTypeString[8]; /* 令牌的类型描述 */
int iSeedLen; /* 种子长度,如果是0,则默认为16 */
char ucReserved[4]; /* 保留字段 */
unsigned char ucPrivateData[DCPVTLEN]; /* 加密数据-种子 pin等 */
} TOKENRECORDDATA, *PTTOKENRECORDDATA; /* 424字节 Base64为568字节*/
typedef struct DCSHSAE_TOKENRECORD_INFO {
unsigned int ulSerialNumber; /* Token序列号 */
char ucSerialNumber[DCSH_SN_LEN];/* Token序列号字符表示 */
unsigned int ulPRNLen; /* Tokencode的长度 */
unsigned int ulInterval; /* 时间间隔,产生tokencode */
unsigned int ulBirth; /* 出生日期,从 1/1/2008 */
unsigned int ulDeath; /* 有效期,秒,从 1/1/2008 */
char cTokenType; /* Token类型 */
char cIsHardwareToken; /* 是不是硬件 */
char cAlgorithmSData; /* 算法,私有数据的加密算法 */
char cAlgorithmToken; /* 算法,tokencode的产生算法*/
int iState; /* 状态值,这个非常重要的字段*/
char cEnabled; /* 是否可用,第一判断要素 */
char cAssigned; /* 是否分配,第一判断要素 */
char cNextPRNMode; /* NextToekn模式 */
char cPINDisabled; /* PIN是否使用 */
unsigned int ulLastlogin; /* 最近登陆时间,无论成功失败,秒,从 1/1/2008 */
char ucUserLoginID[STRLENLOGID]; /* */
char ucUserFirstName[STRLENAME]; /* */
char ucUserLastName[STRLENAME]; /* */
int iMaxBadPins; /* Pin优于tokencode认证,每次登陆成功前最大错误次数,超过则disable */
int iNextTokencodeModeThreshold; /* tokenode错误的极限值,超过该值,则进入Next Token模式 */
int iMaxRepeateds; /* 监测重放攻击极限值,反复提交先前的tokencode,或者同一时间提交tokencode则理解为重放,达到极限值则禁用 */
int iMaxBadNextTokencodes; /* 在Next模式下,允许最大错误次数 */
int iPrecision; /* 精度,离ulLastSuccessLogin每隔一个月累加精度秒 */
int iLargeWindowSeconds; /* 秒 */
int iMediumWindowSeconds; /* 秒 */
int iSmallWindowSeconds; /* 秒 */
char ucTokenTypeString[8]; /* 令牌的类型描述 */
int iSeedLen; /* 种子长度,如果是0,则默认为16 */
char ucReserved[4]; /* 保留字段 */
} TOKENPUBLICINFO, *PTTOKENPUBLICINFO; /* 192字节 */
typedef struct {
LONG type; /* PASSCODE_TYPE/PASSCODE_NEXT_TYPE */
ULONG passc_time; /* passcodetime */
char prn[DCSH_PRN_LEN]; /* tokencode */
char pin[DCSH_PIN_LEN]; /* pin码 */
char nextPrn[DCSH_PRN_LEN]; /* PASSCODE_NEXT_TYPE输出,下一个tokencode */
} DCSHPASSCODE;
typedef struct {
LONG type; /* PRN_TYPE */
ULONG passc_time; /* passcodetime */
char prn[DCSH_PRN_LEN]; /* tokencode */
} DCSHPRN;
typedef struct {
LONG type; /* CHALLENGE_RESPONSE_TYPE */
ULONG passc_time; /* passcodetime */
char challenge[DCSH_CHALLENGE_LEN]; /* 挑战码 */
char response[DCSH_RESPONSE_LEN]; /* 响应码 */
} DCSHCHALLENGE_RESPONSE;
typedef struct {
LONG type; /* CHALLENGE_RESPONSE_ATM_TYPE */
ULONG passc_time; /* passcodetime */
int iPasswdAlg; /* 用户输入密码的摘要算法,0表示直接使用*/
char challenge[DCSH_CHALLENGE_LEN]; /* 挑战码 */
char response[DCSH_RESPONSE_LEN]; /* 响应码 */
} DCSHCHALLENGE_RESPONSE_ATM;
typedef struct {
LONG type; /* DCSH_SMS_GETPRN_TYPE/DCSH_SMS_PRN_TYPE */
ULONG valid_time; /* 有效时间,秒 */
char prn[DCSH_PRN_LEN]; /* tokencode,返回/验证 */
} DCSHSMSPRN;
/* RFC 2548 MSCHAPV2 Response Vendor type = 25 */
/* RFC 2759 Section 8 Provides Pseudocode and details */
#define DCSH_CHALLENGE_LENGTH 16
#define DCSH_USERNAME_LENGTH 128
#define DCSH_RESPONSERECEIVED_LENGTH 24
#define DCSH_RESPONSE_LENGTH 42
#define DCSH_ENCRYPTED_NEWPW_LENGTH 516
#define DCSH_PASSWORD_LENGTH 256
#define DCSH_ENCRYPTED_OLDPWHASH_LENGTH 16
/* struct to be used with type set to DCSH_MSCHAP2_PASSCODE_TYPE */
/* allow to pass required parameters for mschapv2 auth */
typedef struct {
LONG type;
ULONG passc_time;
/* IN::RFC 2759 Section 8.1 */
unsigned char authenticatorChallenge[DCSH_CHALLENGE_LENGTH];
unsigned char peerChallenge[DCSH_CHALLENGE_LENGTH];
/* IN::RFC 2759 Section 8.1 null terminated string of size less or equal to 128*/
char userName[DCSH_USERNAME_LENGTH];
/* IN::RFC 2759 Section 8.1 Result of*/
/* GenerateNTResponse(authenticatorChallenge, peerChallenge, userName, Passcode) */
/* note:: Passcode is used to generate this value */
unsigned char responseReceived[DCSH_RESPONSERECEIVED_LENGTH];
/* OUT::RFC 2759 Section 8.7 Output from*/
/* GenerateAuthenticatorResponse(Passcode, responseRecieved, peerChallenge, authenticatorChallenge, userName)*/
/* note::Passcode is used to generate this value */
char authenticatorResponse[DCSH_RESPONSE_LENGTH];
} DCSHMSCHAP2_PASSCODE;
/* struct to be used with type set to DCSH_MSCHAP2_CHANGE_PW_TYPE */
/* allow to pass required parameters for to change password with mschapv2 auth */
typedef struct {
LONG type;
ULONG passc_time;
/* IN::RFC 2759 Section 8.1 */
unsigned char authenticatorChallenge[DCSH_CHALLENGE_LENGTH];
unsigned char peerChallenge[DCSH_CHALLENGE_LENGTH];
/* IN::RFC 2759 Section 8.1 null terminated string of size less or equal to 128*/
char userName[DCSH_USERNAME_LENGTH];
/* IN::RFC 2759 Section 8.1 Result of */
/* GenerateNTResponse(authChallenge, peerChallenge, userName, NewPin) */
/* note:: NewPin is used to generate this value */
unsigned char responseReceived[DCSH_RESPONSERECEIVED_LENGTH];
/* OUT::RFC 2759 Section 8.7 Output from */
/* GenerateAuthenticatorResponse(NewPin, responseRecieved, peerChallenge, authenticatorChallenge, userName)*/
/* note:: NewPin is used to generate this value */
unsigned char authenticatorResponse[DCSH_RESPONSE_LENGTH];
/* IN::RFC 2759 Section 8.9 provides detail on how to calculate this value*/
unsigned char encryptedNewPasword[DCSH_ENCRYPTED_NEWPW_LENGTH];
/* IN::RFC 2759 Section 8.12 provides detail on how to calculate this value*/
unsigned char encryptedOldPasswordHashed[DCSH_ENCRYPTED_OLDPWHASH_LENGTH];
} DCSHMSCHAP2_CHANGE_PW;
typedef struct
{
LONG type; /* DCSH_SIGN_PRN_TYPE / DCSH_GET_SIGN_PRN_TYPE */
ULONG passc_time; /* passcodetime */
char key1[20]; /* 第一个关键信息,建议6个数字 */
char key2[20]; /* 第二个关键信息,建议6个数字 */
char key3[20]; /* 第三个关键信息,建议6个数字 */
char prn[DCSH_PRN_LEN]; /* DCSH_SIGN_PRN_TYPE 为认证数字签名的动态口令*/
/* DCSH_GET_SIGN_PRN_TYPE 为获得签名动态口令*/
char pin[DCSH_PIN_LEN]; /* pin码 */
} DCSH_SIGN_PASSCODE; //数字签名的认证类型
typedef struct
{
LONG type; /*DCSH_COVER_GET_HOSTCODE_TYPE / DCSH_COVER_HOST_PRN_TYPE*/
ULONG passc_time; /*系统时间*/
char cHostCode[DCSH_PRN_LEN]; /*主机字符*/ //认证时提交,获得时返回
char cTokenCode[DCSH_PRN_LEN]; /*动态口令*/ //获得时实用
char pin[DCSH_PRN_LEN]; /*pin码*/ //认证时使用
int iCurrentCount; /*当前计数器*///获得时使用返回
} DCSH_COVER_PASSCODE; //刮刮卡认证类型
/*联合类型,用于上述类型的认证*/
typedef union {
LONG type;
DCSHPASSCODE passcode;
DCSHCHALLENGE_RESPONSE challengeResponse;
DCSHPRN prn;
DCSHSMSPRN smsprn;
DCSHMSCHAP2_PASSCODE mschap2;
DCSHMSCHAP2_CHANGE_PW mschap2pw;
DCSH_SIGN_PASSCODE sigprn;
DCSH_COVER_PASSCODE coverprn;
DCSHCHALLENGE_RESPONSE_ATM chapATM;
} DCSHCODE2CHECK, *PT_DCSHCODE2CHECK;
/******************************************************************************
**
**函数名称: DCSHSAGetPasscodeTime
**
**功能描述: 根据系统时间取得当前令牌需要的时间UTC,相对于2008/1/1的秒数
**
**参数说明:
void [] -
**
**返回类型: LONG
** 返回整型,秒
**
**
**其他说明: 在进行引擎认证时,必须调用此函数提供的时间
**
**历史: 日期 作者 行为
2008-5-14 杨波 Created
******************************************************************************/
DCSHCOREAPI_API LONG DCSHSAGetPasscodeTime (void);
/******************************************************************************
**
**函数名称: DCSHSAGetPasscodeTimeOTP
**
**功能描述: 获取系统的秒,相对于1970/1/1
**
**参数说明:
ULONG PasscodeTime [in / ] - DCSHSAGetPasscodeTime 获得的时间
**
**返回类型: LONG
** 返回整型,秒
**
**
**其他说明: 在进行OTP认证时,调用该接口获得时间:秒
**
**历史: 日期 作者 行为
2011-1-7 杨波 Created
******************************************************************************/
DCSHCOREAPI_API LONG DCSHSAGetPasscodeTimeOTP (ULONG PasscodeTime);
/******************************************************************************
**
**函数名称: DCSHSAFmtTime
**
**功能描述: 把认证引擎使用的时间转换为字符串 "GMT 2008-05-14 04:09:22"
**
**参数说明:
LONG tod [in / ] - 引擎时间,秒
char *outstr [in / out] - 输出字符串,外部分配空间,长度为 GMTSTRLEN
**
**返回类型: int
** EMSUCCESS 成功转换
** EMBADARG 参数错误,可能outstr为空指针
**
**其他说明: 时间为GMT时间,并不是UTC时间,注意时区
**
**历史: 日期 作者 行为
2008-5-14 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAFmtTime (LONG tod, char *outstr);
/******************************************************************************
**
**函数名称: DCSHSASetUserLogin
**
**功能描述: 分配令牌给用户,令牌的第一个操作应该是分配
** 分配用户时将重置令牌PIN码,但是令牌自身的状态位和计数器不改变
** 可以反复分配
**
**参数说明:
PTTOKENDATA pdata [in / out] - 引擎数据包,不得修改
char *name [in / ] - 用户名称
**
**返回类型: int
** EMSUCCESS 成功
** EMBADARG 参数错误,可能为空指针,也可能name的长度大于STRLENLOGID
** EMBADREC PDATA内部数据有问题,如签名等
** EMFOREVERDISABLE 永久禁用
**
**其他说明:
**
**历史: 日期 作者 行为
2008-5-14 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSASetUserLogin(PTTOKENRECORDDATA pdata ,char *name);
/******************************************************************************
**
**函数名称: DCSHSASetTokenCodeLength
**
**功能描述: 重新设置动态口令的长度,最大不超过DCSH_PRN_LEN,最小没有限制
** 因为RFC取Long型,最大值以4字节表示,所以实际长度不可能超过10个数字
**
**参数说明:
PTTOKENRECORDDATA pdata [in / out] - pdata
int iLen [in / ] - 新的长度,应该不大于DCSH_PRN_LEN
**
**返回类型: int
** EMSUCCESS 成功
** EMBADARG 参数错误,可能为空指针,也可能iLen大于DCSH_PRN_LEN
** EMBADREC PDATA内部数据有问题,如签名等
** EMFOREVERDISABLE 永久禁用
**
**
**其他说明: 建议在 4 - 8之间
**
**历史: 日期 作者 行为
2009-8-18 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSASetTokenCodeLength(PTTOKENRECORDDATA pdata , int iLen);
/******************************************************************************
**
**函数名称: DCSHSAEnableToken
**
**功能描述: 让已经分配的令牌启用,同时清除计数器和Next模式,必须在令牌分配之后才能启用
** 启用操作将清除所有状态位和计数器,但是不清除重放和最后认证时间
**
**参数说明:
PTTOKENDATA pdata [in / out] - 引擎数据包
char *pin [in / ] - pin,如果是NULL或者长度为0,则强制设置SYSTEMPIN
**
**返回类型: int
** EMSUCCESS 设置可用成功
** EMBADARG 参数错误,pdata可能为空指针,也可能pin长度大于MAX_PIN_LEN小于MIN_PIN_LEN
** EMBADREC PDATA内部数据有问题,如签名等
** EMNOTASSIGNED 还没有分配用户
** EMPINLEN pin的长度有问题,应该 4<=pinlen<=8
** EMFOREVERDISABLE 永久禁用
**
**其他说明: 调用该函数前应该先调用DCSHSASetUserLogin
**
**历史: 日期 作者 行为
2008-5-14 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAEnableToken (PTTOKENRECORDDATA pdata, char *pin);
/******************************************************************************
**
**函数名称: DCSHSADisableToken
**
**功能描述: 禁用一个令牌
**
**参数说明:
PTTOKENDATA pdata [in / out] - 引擎数据包
**
**返回类型: int
** EMSUCCESS 设置禁用成功
** EMBADARG 参数错误,pdata可能为空指针
** EMBADREC PDATA内部数据有问题,如签名等
** EMDISABLE 已经设置为禁用了
** EMFOREVERDISABLE 永久禁用
**
**
**其他说明: 任何时候禁用令牌应该调用该函数,而不得胡乱修改
**
**历史: 日期 作者 行为
2008-5-14 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSADisableToken (PTTOKENRECORDDATA pdata);
/******************************************************************************
**
**函数名称: DCSHSASetPinMaxErrors
**
**功能描述: 设置或更改PIN错误的最大次数,设置时不考虑状态位
**
**参数说明:
PTTOKENDATA pdata [in / out] - 引擎数据包
int iPinErrs [in / ] - 最大错误次数
**
**返回类型: int
** EMSUCCESS 设置pin成功
** EMBADARG 参数错误,pdata可能为空指针
**
**其他说明: 在禁用之前修改最大值有作用,如果禁用后,也可以修改,但在启用后起作用
**
**历史: 日期 作者 行为
2008-5-14 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSASetPinMaxErrors (PTTOKENRECORDDATA pdata, int iPinErrs);
/******************************************************************************
**
**函数名称: DCSHSASetPin
**
**功能描述: 给一个已分配可用的令牌设置PIN,同时清除所有计数器和Next模式,不清除重放和时间
** 注意,也不修改状态位,被禁用的将依然禁用
**
**参数说明:
PTTOKENDATA pdata [in / out] - 引擎数据包
char *pin [in / ] - pin,如果是NULL或者长度为0,则强制设置SYSTEMPIN
**
**返回类型: int
** EMSUCCESS 设置pin成功
** EMBADARG 参数错误,pdata可能为空指针
** EMBADREC PDATA内部数据有问题,如签名等
** EMDISABLE 为禁用状态
** EMPINLEN pin的长度有问题,应该 4<=pinlen<=8
** EMFOREVERDISABLE 永久禁用
**
**其他说明: 在成功登陆后,应提供用户修改PIN的地方
**
**历史: 日期 作者 行为
2008-5-14 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSASetPin (PTTOKENRECORDDATA pdata, char *pin);
/******************************************************************************
**
**函数名称: DCSHSASetPinDisabledFlag
**
**功能描述: 设置是否使用PIN的标志位,1 禁用 0 启用
** 未启用的令牌不能设置
**
**参数说明:
PTTOKENDATA pdata [in / out] - 引擎数据包
int b [in / ] - 1 禁用PIN认证,0 使用PIN认证
**
**返回类型: int
** EMSUCCESS 设置Flag成功
** EMBADARG 参数错误,pdata可能为空指针
** EMBADREC PDATA内部数据有问题,如签名等
** EMDISABLE 为禁用状态,不可设置
** EMFOREVERDISABLE 永久禁用
**
**
**其他说明: 建议使用PIN认证
**
**历史: 日期 作者 行为
2008-5-14 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSASetPinDisabledFlag (PTTOKENRECORDDATA pdata,int b);
/******************************************************************************
**
**函数名称: DCSHSASetNextTokencodeModeThreshold
**
**功能描述: 设置tokencode错误最大值,达到这个数后,则进入next模式
** 未启用的令牌不可设置
**
**参数说明:
PTTOKENDATA pdata [in / out] - 引擎数据包
int index [in / ] - 最大tokencode错误极限值
**
**返回类型: int
** EMSUCCESS 设置Threshol成功
** EMBADARG 参数错误,pdata可能为空指针,或者index错了(1-10之间)
** EMDISABLE 为禁用状态,不可设置
**
**
**其他说明: 现在放开了最大10的限制,可设置任意大
**
**历史: 日期 作者 行为
2008-5-14 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSASetNextTokencodeModeThreshold (PTTOKENRECORDDATA pdata, int index);
/******************************************************************************
**
**函数名称: DCSHSAGetTokenInfo
**
**功能描述: 获取令牌的详细信息
**
**参数说明:
PTTOKENDATA pdata [in / ] - 引擎数据包
PTTOKENSECRETDATA tokenInfo [in / out] - 详细信息,外面分配空间
**
**返回类型: int
** EMSUCCESS 设置Threshol成功
** EMBADARG 参数错误,pdata可能为空指针
** EMBADREC PDATA内部数据有问题,如签名等
**
**
**其他说明:
**
**历史: 日期 作者 行为
2008-5-14 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAGetTokenInfo (PTTOKENRECORDDATA pdata, PTTOKENPUBLICINFO tokenInfo);
/******************************************************************************
**
**函数名称: DCSHSAUpdateTokenSeed
**
**功能描述: 认证引擎内部创建种子,并更新pdata内的原有种子,注意,这将导致种子文件失效
更新种子后的令牌将作为全新的令牌,走Firt模式
**
**参数说明:
PTTOKENRECORDDATA pdata [in / out] - pdata数据结构
int iBitLen [in / ] - 种子的位长,128或者160
char *cSeed [in / out] - 种子字符串,base64字符串,注意"==",真实长度为cSeedLen
int *cSeedLen [in / out] - base64种子的字符串长度
**
**返回类型: int
** EMSUCCESS 设置种子成功
** EMBADARG 参数错误,pdata可能为空指针
**
**
**其他说明: 动联的种子生成有严格的规则,涉及到算法和加密卡;
同时pdata结构和序列号/种子有密切关联,用于防伪;
更新种子将是的严格的规则和防伪校验失效;
另,使用者需要注意,一旦更新后,将导致种子文件BIN失效;
**
**历史: 日期 作者 行为
2010-2-4 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAUpdateTokenSeed (PTTOKENRECORDDATA pdata, int iBitLen, char *cSeed, int *cSeedLen);
/******************************************************************************
**
**函数名称: DCSHSACheckPasscode
**
**功能描述: 动态口令认证
**
**参数说明:
LONG passc_time [in / ] - DCSHSAGetPasscodeTime取得时间
PTTOKENDATA pdata [in / out] - 引擎数据包
char *prn [in / ] - tokencode
char *pin [in / ] - pin
**
**返回类型: int
** EMSUCCESS 验证通过,除了EMBADREC,所有的返回必须保存PDATA到数据库
** EMBADARG 参数错误,参数可能为空指针
** EMBADREC 严重错误!PDATA内部数据有问题,如签名等
** EMFIRST 第一次使用令牌登陆,成功,等同于EMSUCCESS
** EMPRNLEN Tokencode的长度错误
** EMTIMRNG passcode时间错误,不在生命期限内
** EMNOTASSIGNED 令牌还没有分配
** EMDISABLE 令牌处于禁用状态
** EMFOREVERDISABLE 令牌被永久禁用,可能是时间偏移超过12小时
** EMNOPIN 没有输入pin码
** EMPINLEN 输入的PIN长度错误
** EMBADPIN 输入错误的PIN
** EMSTOLEN 因为PIN错误次数到达极限,默认为丢失
** EMOUTWIND 在任何窗口内找不到tokencode,可能需要再同步
** EMREPPRN 这是重放,需要小心,应该立即记录,并提醒管理员
** EMREPDISABLE 重放到一定的次数则禁用
** EMNEXTPRN 进入Next的模式
** EMTHRESHOLDNXT 输入tokencode的错误次数到达极限,以后进入NEXT模式
** EMBADNEX 在Next模式下输入错了tokencode
** EMNEXTDISABLE 在Next模式下输入错误次数到达极限,被禁用
** EMBADTYPE 错误的令牌类型
**
**
**其他说明: 最重要的认证接口,特别需要注意返回值
**
**历史: 日期 作者 行为
2008-5-15 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckPasscode (ULONG passc_time, PTTOKENRECORDDATA pdata, char *prn, char *pin);
/******************************************************************************
**
**函数名称: DCSHSACheckATMTokenCode
**
**功能描述: ATM令牌的认证接口,需要注意用户密码的转换
**
**参数说明:
ULONG passc_time [in / ] - 时间
PTTOKENRECORDDATA pdata [in / out] - pdata
int iPasswdAlg [in / ] - 对用户口令的算法
char *atmpassword [in / ] - 用户口令,也可能是摘要数据
char *prn [in / ] - 动态口令
**
**返回类型: int
** EMSUCCESS 验证通过,除了EMBADREC,所有的返回必须保存PDATA到数据库
** EMBADARG 参数错误,参数可能为空指针
** EMBADREC 严重错误!PDATA内部数据有问题,如签名等
** EMFIRST 第一次使用令牌登陆,成功,等同于EMSUCCESS
** EMPRNLEN Tokencode的长度错误
** EMTIMRNG passcode时间错误,不在生命期限内
** EMNOTASSIGNED 令牌还没有分配
** EMDISABLE 令牌处于禁用状态
** EMFOREVERDISABLE 令牌被永久禁用,可能是时间偏移超过12小时
** EMNOPIN 没有输入pin码
** EMPINLEN 输入的PIN长度错误
** EMBADPIN 输入错误的PIN
** EMSTOLEN 因为PIN错误次数到达极限,默认为丢失
** EMOUTWIND 在任何窗口内找不到tokencode,可能需要再同步
** EMREPPRN 这是重放,需要小心,应该立即记录,并提醒管理员
** EMREPDISABLE 重放到一定的次数则禁用
** EMNEXTPRN 进入Next的模式
** EMTHRESHOLDNXT 输入tokencode的错误次数到达极限,以后进入NEXT模式
** EMBADNEX 在Next模式下输入错了tokencode
** EMNEXTDISABLE 在Next模式下输入错误次数到达极限,被禁用
** EMBADTYPE 错误的令牌类型
**
**
**其他说明:
**
**历史: 日期 作者 行为
2009-12-7 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckATMTokenCode (ULONG passc_time, PTTOKENRECORDDATA pdata, int iPasswdAlg, char *atmpassword /*用户密码作为challenge*/, char *prn);
/******************************************************************************
**
**函数名称: DCSHSACheckSIGPasscode
**
**功能描述: 签名动态口令认证,外带三个关键信息,必须为数字
**
**参数说明:
ULONG passc_time [in / ] - 当前系统时间
PTTOKENRECORDDATA pdata [in / out] - pdata
char *key1 [in / ] - 关键信息1,建议6个数字
char *key2 [in / ] - 关键信息2,建议6个数字
char *key3 [in / ] - 关键信息3,建议6个数字
char *prn [in / ] - 动态口令
char *pin [in / ] - 令牌PIN码
**
**
**返回类型: int
** EMSUCCESS 验证通过,除了EMBADREC,所有的返回必须保存PDATA到数据库
** EMBADARG 参数错误,参数可能为空指针
** EMBADREC 严重错误!PDATA内部数据有问题,如签名等
** EMFIRST 第一次使用令牌登陆,成功,等同于EMSUCCESS
** EMPRNLEN Tokencode的长度错误
** EMTIMRNG passcode时间错误,不在生命期限内
** EMNOTASSIGNED 令牌还没有分配
** EMDISABLE 令牌处于禁用状态
** EMFOREVERDISABLE 令牌被永久禁用,可能是时间偏移超过12小时
** EMNOPIN 没有输入pin码
** EMPINLEN 输入的PIN长度错误
** EMBADPIN 输入错误的PIN
** EMSTOLEN 因为PIN错误次数到达极限,默认为丢失
** EMOUTWIND 在任何窗口内找不到tokencode,可能需要再同步
** EMREPPRN 这是重放,需要小心,应该立即记录,并提醒管理员
** EMREPDISABLE 重放到一定的次数则禁用
** EMNEXTPRN 进入Next的模式
** EMTHRESHOLDNXT 输入tokencode的错误次数到达极限,以后进入NEXT模式
** EMBADNEX 在Next模式下输入错了tokencode
** EMNEXTDISABLE 在Next模式下输入错误次数到达极限,被禁用
** EMBADTYPE 错误的令牌类型
**
**其他说明:
**
**历史: 日期 作者 行为
2009-2-12 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckSIGPasscode (ULONG passc_time, PTTOKENRECORDDATA pdata, char *key1, char *key2, char *key3, char *prn, char *pin);
/******************************************************************************
**
**函数名称: DCSHSAGetSIGPasscode
**
**功能描述: 获取签名动态口令,内部使用
**
**参数说明:
ULONG passc_time [in / ] - 系统时间
PTTOKENRECORDDATA pdata [in / ] - pdata
char *key1 [in / ] - 关键信息1
char *key2 [in / ] - 关键信息2
char *key3 [in / ] - 关键信息3
char *prn [in / out] - 动态口令,外部分配空间,并初始化
**
**返回类型: int
** EMSUCCESS 验证通过,除了EMBADREC,所有的返回必须保存PDATA到数据库
** EMBADARG 参数错误,参数可能为空指针
** EMBADREC 严重错误!PDATA内部数据有问题,如签名等
** EMPRNLEN Tokencode的长度错误
** EMTIMRNG passcode时间错误,不在生命期限内
** EMNOTASSIGNED 令牌还没有分配
** EMDISABLE 令牌处于禁用状态
** EMFOREVERDISABLE 令牌被永久禁用,可能是时间偏移超过12小时
**
**
**其他说明:
**
**历史: 日期 作者 行为
2009-2-12 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAGetSIGPasscode (ULONG passc_time, PTTOKENRECORDDATA pdata, char *key1, char *key2, char *key3, char *prn);
/******************************************************************************
**
**函数名称: DCSHSACheckUrgencyPassWord
**
**功能描述: 检测紧急口令,跳过所有的状态位检测,区分大小写
** 没有分配的令牌不允许使用紧急口令
**
**参数说明:
PTTOKENDATA pdata [in / ] - PDATA
char *ucUrgencyPassWord [in / ] - 紧急口令,16字符
**
**返回类型: int
** EMBADARG 参数错误
** EMBADURGENCYPW 紧急口令认证失败
** EMSUCCESS 紧急口令认证成功
**
**其他说明:
**
**历史: 日期 作者 行为
2008-7-7 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckUrgencyPassWord (PTTOKENRECORDDATA pdata, char *ucUrgencyPassWord);
/******************************************************************************
**
**函数名称: DCSHSAGetUrgencyPassWord
**
**功能描述: 获取紧急口令,跳过所有的状态位检测
**
**参数说明:
PTTOKENDATA pdata [in / ] - PDATA
char *ucUrgencyPassWord [in / out] - 紧急口令,16字符,外部分配空间
**
**返回类型: int
** EMBADARG 参数错误
** EMBADGETURGENCYPW 紧急口令认证失败
** EMSUCCESS 获取成功
**
**其他说明: 已经修改,在未分配的情况下也允许得到紧急口令
**
**历史: 日期 作者 行为
2008-7-7 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAGetUrgencyPassWord (PTTOKENRECORDDATA pdata, char *ucUrgencyPassWord);
/******************************************************************************
**
**函数名称: DCSHSASetUrgencyPassWord
**
**功能描述: 设置新的服务码,由引擎内部设置,设置成功后,返回新的服务码
**
**参数说明:
PTTOKENRECORDDATA pdata [in / out] - pdata
char *ucNewUrgencyPassWord [in / out] - 输出新的服务码,16个字节,建议外部分配20字节的空间
**
**返回类型: int
** DCSHEMURGPWDERR 更改服务码失败
** DCSHEMSUCCESS 更改服务码成功
**
**其他说明:
**
**历史: 日期 作者 行为
2009-10-27 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSASetUrgencyPassWord (PTTOKENRECORDDATA pdata, char *ucNewUrgencyPassWord);
/******************************************************************************
**
**函数名称: DCSHSACheckTokenvalue
**
**功能描述: 相当于FirstLogin,但是不修改任何数据,也不判断标志位
**
**参数说明:
LONG passc_time [in / ] - 时间,DCSHSAGetPasscodeTime取得时间
PTTOKENDATA pdata [in / ] - 引擎数据包
char *prn [in / ] - tokencode
**
**返回类型: int
** EMSUCCESS 检查通过
** EMBADARG 参数错误,参数可能为空指针
** EMBADREC 严重错误!PDATA内部数据有问题,如签名等
** EMPRNLEN Tokencode的长度错误
** EMTIMRNG passcode时间错误,不在生命期限内
** EMOUTWIND 在任何窗口内找不到tokencode,可能需要再同步
** EMBADTYPE 错误的令牌类型
**
**其他说明:
**
**历史: 日期 作者 行为
2008-5-16 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckTokenvalue (ULONG passc_time, PTTOKENRECORDDATA pdata, char *prn);
/******************************************************************************
**
**函数名称: DCSHSAResynchTokenEx
**
**功能描述: 重新同步,非常大的计算量,12小时内寻找
**
**参数说明:
LONG passc_time [in / ] - 时间,DCSHSAGetPasscodeTime取得时间
PTTOKENDATA pdata [in / out] - 引擎数据包
char *prn [in / ] - tokencode
**
**返回类型: int
** EMSUCCESS 重新同步
** EMBADARG 参数错误,参数可能为空指针
** EMBADREC 严重错误!PDATA内部数据有问题,如签名等
** EMPRNLEN Tokencode的长度错误
** EMTIMRNG passcode时间错误,不在生命期限内
** EMOUTWIND 在任何窗口内找不到tokencode,可能需要再同步
** EMSYN1OK 重新同步模式下,第一次匹配tokencode已经找到
** EMBADTYPE 错误的令牌类型
**
**其他说明: 重新同步对“永久失效”有作用
**
**历史: 日期 作者 行为
2008-5-16 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAResynchTokenEx (ULONG passc_time, PTTOKENRECORDDATA pdata, char *prn);
/******************************************************************************
**
**函数名称: DCSHSAInitBINRead
**
**功能描述: 打开BIN文件,进行格式分解,返回空间和总记录数
**
**参数说明:
const char *InputFile [in / ] - 文件名称
int **inpfil [in / out] - 解密的空间,使用DCSHSAExitBINRead释放
int *iRecoeds [in / out] - 总共的记录数
char *cType [in / out] - 种子文件的类型
**
**返回类型: int
** EMSUCCESS 成功
** EMEMPNAME 文件名称错误
** EMBADINPUT 文件无法打开
** EMNOMEM 没有足够的内存空间
** EMBADINPFIL BIN的文件内容错误,严重错误
** EMBADSIG 文件签名错误,严重错误
** EMBADFILETYPE 错误的种子文件类型
**
**其他说明:
**
**历史: 日期 作者 行为
2008-5-16 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAInitBINRead (const char *InputFile, void **inpfil, unsigned int *iRecoeds, char *cType);
/******************************************************************************
**
**函数名称: DCSHSAReadBINRec
**
**功能描述: 从解密的数据中读取记录
**
**参数说明:
char *userPriKeyPath[in / ] - 用户私要文件
void *inpfil [in / ] - 解密的数据块
PTTOKENDATA pdata [in / out] - 组装成PDATA
int i [in / ] - 记录的索引号,从0开始
char cType [in / out] - 种子文件的类型
**
**返回类型: int
** EMSUCCESS 关闭成功
** EMBADARG 错误的参数,可能是空指针
** EMBADFILETYPE 种子文件的类型错误
**
**其他说明:
**
**历史: 日期 作者 行为
2008-5-16 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAReadBINRec (char *userPriKeyPath, void *inpfil, PTTOKENRECORDDATA pdata, unsigned int i, char cType);
/******************************************************************************
**
**函数名称: DCSHSAExitBINRead
**
**功能描述: 清除BIN文件解密的内存空间
**
**参数说明:
void *fc [in / ] - 空间地址
**
**返回类型: int
** EMSUCCESS 关闭成功
** EMBADARG 参数错误,可能是空指针
**
**
**其他说明: 用于释放接口内部的内存空间,其他地方也可以使用
**
**历史: 日期 作者 行为
2008-5-16 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAExitBINRead (void *fc);
/******************************************************************************
**
**函数名称: DCSHMakeTokenRecord -- 测试用
**
**功能描述: 手工制作一个PDATA,SDATA
**
**参数说明:
PTTOKENDATA pdata [in / out] - 初始化的数据
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2008-5-17 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void DCSHSAMakeTokenRecord(PTTOKENRECORDDATA pdata);
/******************************************************************************
**
**函数名称: DCSHMakeTokenRecordEvent -- 测试用
**
**功能描述: 手工制作一个PDATA,SDATA
**
**参数说明:
PTTOKENDATA pdata [in / out] - 初始化的数据
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2008-5-17 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void DCSHSAMakeTokenRecordEvent(PTTOKENRECORDDATA pdata);
/******************************************************************************
**
**函数名称: DCSHMakeTokenRecordMobile -- 测试用
**
**功能描述: 创建一个手机令牌,特指动联专用的
**
**参数说明:
PTTOKENDATA pdata [in / out] - 初始化的数据
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void DCSHSAMakeTokenRecordMobile(PTTOKENRECORDDATA pdata);
/******************************************************************************
**
**函数名称: DCSHSASplitBINFile
**
**功能描述: 分割种子文件,支持加密格式,也支持数字信封格式
**
**参数说明:
char *pSeedFile [in / ] - 种子文件路径
unsigned int iNumber [in / ] - 分割多少个出来
**
**返回类型: int
** EMREADSEEDFILEERR 读取种子文件失败
** EMBADFILETYPE 种子文件类型错误
** EMSUCCESS 成功
**
**其他说明: 源文件保留,创建拆分的两个文件
**
**历史: 日期 作者 行为
2008-6-12 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSASplitBINFile (char *pSeedFile, unsigned int iNumber);
/******************************************************************************
**
**函数名称: DCSHSAGenerateUrgencyPassWord (16字节的紧急口令)
**
**功能描述: 生成高质量的随机数,然后对该随机数进行Base64编码,截取16字节,作为紧急口令
**
**参数说明:
char *ucUrgencyPassWord [in / out] - 外部分配空间,返回紧急口令字符,建议20个字节空间
**
**返回类型: int
** DCSHEMBADARG 参数错误
** DCSHEMSEEDERR BBS计算随机数时错误,可重新尝试
** DCSHEMSUCCESS 创建紧急口令成功
**
**其他说明:
**
**历史: 日期 作者 行为
2008-7-7 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAGenerateUrgencyPassWord(char *ucUrgencyPassWord);
/******************************************************************************
**
**函数名称: DCSHSAGetChallenge
**
**功能描述: 产生一个指定长度的随机数作为挑战码
**
**参数说明:
unsigned char *randomData [in / out] - 随机数,挑战码,外部分配空间
int iNumBytes [in / ] - 要求的随机数长度,最好是8
**
**返回类型: int
** EMBADARG 参数错误
** EMSEEDERR 随机数产生错误
** EMSUCCESS 成功
**
**其他说明: 增加了返回全0的判断,如果发现是0,则可以重新尝试
**
**历史: 日期 作者 行为
2008-6-23 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAGetChallenge(char *randomData, int iNumBytes);
/******************************************************************************
**
**函数名称: DCSHSACheckCredential,兼容各种令牌的统一认证接口,比CheckPasscode更兼容
**
**功能描述: 兼容单一的tokencode认证
兼容PIN码+tokencode认证
兼容PIN码+tokencode认证,并且在成功后获取下一个正确的tokencode返回
兼容挑战响应模式认证
兼容SIM卡令牌
兼容COS等其他卡商的令牌
兼容ATM令牌认证
兼容刮挂卡令牌认证
兼容MS-Chap V2的认证方式
兼容短信令牌
兼容签名认证
**
**参数说明:
PTTOKENDATA pdata [in / out] - 公用数据结构
PT_CODE2CHECK ptCode2Check [in / out] - 根据各种类型组装的数据结构
**
**返回类型: int
** EMSUCCESS 验证通过,除了EMBADREC,所有的返回必须保存PDATA到数据库
** EMBADARG 参数错误,参数可能为空指针
** EMBADREC 严重错误!PDATA内部数据有问题,如签名等
** EMFIRST 第一次使用令牌登陆,成功,等同于EMSUCCESS
** EMPRNLEN Tokencode的长度错误
** EMTIMRNG passcode时间错误,不在生命期限内
** EMNOTASSIGNED 令牌还没有分配
** EMDISABLE 令牌处于禁用状态
** EMFOREVERDISABLE 令牌被永久禁用,可能是时间偏移超过12小时
** EMNOPIN 没有输入pin码
** EMPINLEN 输入的PIN长度错误
** EMBADPIN 输入错误的PIN
** EMSTOLEN 因为PIN错误次数到达极限,默认为丢失
** EMOUTWIND 在任何窗口内找不到tokencode,可能需要再同步
** EMREPPRN 这是重放,需要小心,应该立即记录,并提醒管理员
** EMREPDISABLE 重放到一定的次数则禁用
** EMNEXTPRN 进入Next的模式
** EMTHRESHOLDNXT 输入tokencode的错误次数到达极限,以后进入NEXT模式
** EMBADNEX 在Next模式下输入错了tokencode
** EMNEXTDISABLE 在Next模式下输入错误次数到达极限,被禁用
** EMBADTYPE 错误的令牌类型
** EMRESPONSEERR 挑战认证方式认证失败
**
**其他说明: 请参考联合类型PT_DCSHCODE2CHECK详细说明
**
**历史: 日期 作者 行为
2008-6-23 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckCredential (PTTOKENRECORDDATA pdata, PT_DCSHCODE2CHECK ptCode2Check);
/******************************************************************************
**
**函数名称: ReadCardInfoFromFile
**
**功能描述: 读取令牌刮卡信息的文件,请参考PTTOKENCARDRECORD结构体
**
**参数说明:
char *CardFileName [in / ] - 文件名称
PTTOKENCARDRECORD *pTokenCardRecord [in / out] - 数据块,内部分配空间,DCSHSAExitBINRead释放
int *iCounter [in / out] - 总记录数
**
**返回类型: int
** EMSUCCESS 成功
** EMBADARG 失败,可能参数传递错误
**
**其他说明: pTokenCardRecord的内存空间请使用DCSHSAExitBINRead释放
**
**历史: 日期 作者 行为
2008-8-5 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAReadCardInformation (char *CardFileName, PTTOKENCARDRECORD *pTokenCardRecord, int *iCounter);
/******************************************************************************
**
**函数名称: DCSHSAGetSMSPasscode
**
**功能描述: 获取短消息认证的动态口令,同时设置该口令的有效时间
**
**参数说明:
LONG valid_time [in / ] - 有效时间,单位秒
PTTOKENDATA pdata [in / out] - 引擎数据包
char *prn [in / out] - 返回的tokencode,外部分配数组
**
**返回类型: int
** EMSUCCESS 验证通过,除了EMBADREC,所有的返回必须保存PDATA到数据库
** EMBADARG 参数错误,参数可能为空指针
** EMBADREC 严重错误!PDATA内部数据有问题,如签名等
** EMTIMRNG passcode时间错误,不在生命期限内
** EMNOTASSIGNED 令牌还没有分配
** EMDISABLE 令牌处于禁用状态
** EMFOREVERDISABLE 令牌被永久禁用,可能是时间偏移超过12小时
** EMBADTYPE 错误的令牌类型
**
**
**其他说明:
**
**历史: 日期 作者 行为
2008-8-15 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAGetSMSPasscode (ULONG valid_time, PTTOKENRECORDDATA pdata, char *prn);
/******************************************************************************
**
**函数名称: DCSHSACheckSMSPasscode
**
**功能描述: 认证短信动态口令,在有效时间内
**
**参数说明:
PTTOKENDATA pdata [in / ] - 引擎数据包
char *prn [in / ] - 返回的tokencode,外部分配数组
**
**返回类型: int
** EMSUCCESS 验证通过,除了EMBADREC,所有的返回必须保存PDATA到数据库
** EMBADARG 参数错误,参数可能为空指针
** EMBADREC 严重错误!PDATA内部数据有问题,如签名等
** EMTIMRNG passcode时间错误,不在生命期限内
** EMNOTASSIGNED 令牌还没有分配
** EMDISABLE 令牌处于禁用状态
** EMFOREVERDISABLE 令牌被永久禁用,可能是时间偏移超过12小时
** EMSMSTIMEOUT 超时,但口令正确
** EMSMSBADPRN 口令错误
**
**其他说明:
**
**历史: 日期 作者 行为
2008-8-15 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckSMSPasscode (PTTOKENRECORDDATA pdata, char *prn);
/******************************************************************************
**
**函数名称: DCSHSACheckPasscodeEx,建议使用DCSHSACheckCredential方法
**
**功能描述: 这是一个简便的认证接口,根据组合方式,也可以进行认证
扩展的、统一的认证接口
如果是 时间、事件、手机 认证,则 prn=tokencode,NULL,0
如果是 异步认证(如手机), 则 prn=response,challenge=challenge,0
如果是短信认证,获得动态口令,则 prn=外部数组,NULL,valid_time=有效时间(秒)
认证动态口令,则 prn=tokencode,NULL,0
如果是ATM令牌,需要传递算法, 则 prn=动态口令,challenge=挑战码(用户口令,也可能使摘要),valid_time=算法(ALGORITHM_ATM/MD5/SH1
如果是刮刮卡令牌,只进行认证,则 prn=动态口令,challenge=主机码,valid_time=0
**
**参数说明:
PTTOKENRECORDDATA pdata [in / out] - 引擎数据包
char *prn [in / out] - 根据要求存放tokencode,或者响应码,或者返回值,参考上访说明
char *challenge [in / ] - 异步模式,则为挑战码,参考上访说明
ULONG valid_time [in / ] - 获得短信口令,存放有效时间,秒,参考上访说明
**
**返回类型: int
**
** EMBADARG 参数错误,参数可能为空指针
** EMTOKENTYPE 错误的令牌应用类型
**
**
**其他说明: 注意,本接口不支持带PIN的认证
**
**历史: 日期 作者 行为
2008-9-3 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckPasscodeEx (PTTOKENRECORDDATA pdata, char *prn, char *challenge, ULONG valid_time);
/******************************************************************************
**
**函数名称: DCSHSAMsChap2CheckAndMakeResponse
**
**功能描述: MS CHAP V2,对客户端提交的nt_response进行认证
请查看DCSHMSCHAP2_PASSCODE结构,请查看RFC2759
引擎支持MS CHAP v2,但引擎内除了PIN和动态口令,没有用户名、服务端挑战码、客户端挑战码等
所以,要求调用该接口的时候必须送入
返回的AuthenticatorResponse是这样的格式“S=0123456789ABCDEF0123456789ABCDEF01234567”
**
**参数说明:
DCSHMSCHAP2_PASSCODE *pDCSHMSCHAP2Block [in / out] - 结构内包含了MS Chap V2的各个字段,AuthenticatorResponse由该函数生成
char *cMsChap2Password [in / ] - 口令,注意:
如果启用PIN,则口令应该为“动态口令+PIN码“
如果不启用PIN,则口令就是”动态口令“
注意,用户应用也应该如此编排
**
**返回类型: int
** DCSHEMBADARG 参数错误
** DCSHEMMSCHAPV2ERROR mschapv2认证客户端提交的响应码错误
** DCSHEMSUCCESS 成功
**
**其他说明:
**
**历史: 日期 作者 行为
2009-2-5 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAMsChap2CheckAndMakeResponse(DCSHMSCHAP2_PASSCODE *pDCSHMSCHAP2Block, char *cMsChap2Password);
/******************************************************************************
**
**函数名称: DCSHSACheckPasscodeMsChap2
**
**功能描述:
**
**参数说明:
LONG passc_time [in / ] - DCSHSAGetPasscodeTime取得时间
PTTOKENDATA pdata [in / out] - 引擎数据包
unsigned char *pMsChap2Block[in / out] - DCSHMSCHAP2_PASSCODE类型的block
**
**返回类型: int
** EMSUCCESS 验证通过,除了EMBADREC,所有的返回必须保存PDATA到数据库
** EMBADARG 参数错误,参数可能为空指针
** EMBADREC 严重错误!PDATA内部数据有问题,如签名等
** EMFIRST 第一次使用令牌登陆,成功,等同于EMSUCCESS
** EMPRNLEN Tokencode的长度错误
** EMTIMRNG passcode时间错误,不在生命期限内
** EMNOTASSIGNED 令牌还没有分配
** EMDISABLE 令牌处于禁用状态
** EMFOREVERDISABLE 令牌被永久禁用,可能是时间偏移超过12小时
** EMNOPIN 没有输入pin码
** EMPINLEN 输入的PIN长度错误
** EMBADPIN 输入错误的PIN
** EMSTOLEN 因为PIN错误次数到达极限,默认为丢失
** EMOUTWIND 在任何窗口内找不到tokencode,可能需要再同步
** EMREPPRN 这是重放,需要小心,应该立即记录,并提醒管理员
** EMREPDISABLE 重放到一定的次数则禁用
** EMNEXTPRN 进入Next的模式
** EMTHRESHOLDNXT 输入tokencode的错误次数到达极限,以后进入NEXT模式
** EMBADNEX 在Next模式下输入错了tokencode
** EMNEXTDISABLE 在Next模式下输入错误次数到达极限,被禁用
** EMBADTYPE 错误的令牌类型
**
**
**其他说明:
ms-chap v2的认证方式是得不到用户的PIN码和动态口令的
于是,我们必须从引擎中得到这些,然后逆过程计算响应码,进行比较
此时,我们就会发现无法检测重放
对于这个问题,我们只能恰当的判断:
1、我们总是记住最后4次正确的tokencode
2、如果这次验证和历史的tokencode相同,则认为重放
3、如果在窗口内扫描,一旦发现与历史tokencode相同,则跳过
**
**历史: 日期 作者 行为
2008-5-15 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckPasscodeMsChap2 (ULONG passc_time, PTTOKENRECORDDATA pdata, unsigned char *pMsChap2Block/*DCSHMSCHAP2_PASSCODE类型的block*/);
/******************************************************************************
**
**函数名称: DCSHSAMsChap2ChangePassword
**
**功能描述: MS CHAP V2,解密得到新口令,并验证新口令
请查看DCSHMSCHAP2_CHANGE_PW结构,请查看RFC2759
修改口令之前先要完成认证
认证通过后再解密新口令,并且验证新口令是否正确
返回的AuthenticatorResponse是这样的格式“S=0123456789ABCDEF0123456789ABCDEF01234567”
**
**参数说明:
DCSHMSCHAP2_CHANGE_PW *pDCSHMSCHAP2Blockpw[in / ] - 结构内包含了MS Chap V2的各个字段,AuthenticatorResponse由该函数生成
char *oldPinAndTokencode [in / ] - 口令,注意:
如果启用PIN,则口令应该为“动态口令+PIN码“
如果不启用PIN,则口令就是”动态口令“
注意,用户应用也应该如此编排
** char *newpin [in / out] - 新口令
**返回类型: int
** DCSHEMBADARG 参数错误
** DCSHEMMSCHAPV2ERRORPW mschapv2客户端提交的新口令校验异常
** DCSHEMSUCCESS 成功
**
**其他说明:
**
**历史: 日期 作者 行为
2009-2-5 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAMsChap2ChangePassword(DCSHMSCHAP2_CHANGE_PW *pMsChap2Blockpw, char *oldPinAndTokencode, char *newpin);
/******************************************************************************
**
**函数名称: DCSHSAChangePINCodeMsChap2
**
**功能描述: ms chap v2 更改口令
**
**参数说明:
ULONG passc_time [in / ] - DCSHSAGetPasscodeTime取得时间
PTTOKENRECORDDATA pdata [in / ] - 引擎数据包
unsigned char *pMsChap2Blockpw [in / out] - 参考DCSHMSCHAP2_CHANGE_PW结构,将返回authenticatorResponse
**
**返回类型: int
** DCSHEMBADARG 参数错误
** DCSHEMSUCCESS 成功
**
**其他说明:
**
**历史: 日期 作者 行为
2009-2-5 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAChangePINCodeMsChap2 (ULONG passc_time, PTTOKENRECORDDATA pdata, unsigned char *pMsChap2Blockpw/*DCSHMSCHAP2_CHANGE_PW类型的block*/);
/******************************************************************************
**
**函数名称: DCSHSAForceSynchronizeEventCounter
**
**功能描述: 强制同步事件型令牌的计数器
** 在某种情况下,需要获得服务端当前的计数器,然后累加一个常量,作为强制的同步的参数,要求客户端强制修改计数器等于这个参数
**
**参数说明:
PTTOKENRECORDDATA pdata [in / out] - 引擎数据包
unsigned int CounterAdd [in / ] - 一个常量,建议大于100小于1000;
unsigned int *SrvCounter [in / out] - 设置当前令牌的计数器的值,并且返回该值
**
**返回类型: int
** DCSHEMBADARG 参数错误
** DCSHEMFORCESYNTYPE 强制同步令牌类型错误,不是事件型
** DCSHEMSUCCESS 成功
**
**其他说明:
**
**历史: 日期 作者 行为
2009-6-22 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAForceSynchronizeEventCounter(PTTOKENRECORDDATA pdata, unsigned int CounterAdd, unsigned int *SrvCounter );
/******************************************************************************
**
**函数名称: DCSHSAForceSynchronizeEventCounterReverse
**
**功能描述: 根据客户端的计数器强制同步服务器中计数器
计数器更改的时候,不允许服务器的计数器往小修改,客户端提交的计数器必须大于服务器的计数器
**
**参数说明:
PTTOKENRECORDDATA pdata [in / out] - 引擎数据包
unsigned int ClientCounter [in / ] - 客户端的计数器
**
**返回类型: int
** DCSHEMBADARG 参数错误
** DCSHEMFORCESYNTYPE 强制同步令牌类型错误,不是事件型
** DCSHEMFORCECOUNTERLESS 不允许使用客户端的小值修改服务端的大值
** DCSHEMSUCCESS 成功
**
**
**其他说明:
**
**历史: 日期 作者 行为
2010-1-27 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAForceSynchronizeEventCounterReverse(PTTOKENRECORDDATA pdata, unsigned int ClientCounter );
/******************************************************************************
**
**函数名称: DCSHSAUnlockPinpadToken
**
**功能描述: 输出K8锁定的解锁码,带pad的令牌在多次输入pin失败后会锁定,此时提供屏幕的数字和序列号,可到服务端进行“获取解锁码”
**
**参数说明:
PTTOKENRECORDDATA pdata [in / ] - 引擎数据包
char *cChallenge [in / ] - 令牌锁定后,屏幕上的8位数字
char *cUnLockCode [in / out] - 解锁码,8位数字
**
**返回类型: int
** DCSHEMBADARG 参数错误
** DCSHEMSUCCESS 成功
**
**
**其他说明:
**
**历史: 日期 作者 行为
2009-7-29 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAUnlockPinpadToken(PTTOKENRECORDDATA pdata, char *cChallenge, char *cUnLockCode);
/*
基本的两大类型:[时间型Time] [事件型Event(手机令牌是事件型)]
基本的两种介质:[硬件(SIM卡是硬件)] [软件(手机上的是软件)]
动联的令牌种类:[普通令牌K5旧 K3新] [短信令牌] [手机令牌] [软件令牌]
令牌的应用模式:[普通认证模式] [主机认证模式] [挑战应答模式] [数字签名模式] [MSChapV2模式]
每个模式都有自己的认证接口
上面的关系是层层叠加的,动联的K8令牌就是时间型的硬件K3令牌,同时支持了挑战应答和数字签名模式
举例:短信令牌可以是时间类型的,也可以是事件类型的
短信令牌传统意义上是软件介质,如果要认为硬件的,也可以
短信令牌的应用模式是获取再认证,这个就等同于普通认证模式
短信令牌也可以支持其他模式,只要调用接口就可以
就如同K5令牌完全可以支持数字签名模式,只不过K5没有键盘而已
这个举例说明四层结构都是层层叠加方式的,最终应用以接口调用和实际令牌决定
*/
/******************************************************************************
**
**函数名称: DCSHSAGetCoverHostCode
**
**功能描述: 获得当前的计数器对应的主机字符和动态口令,返回主机字符和当前使用的次数
**
**参数说明:
ULONG passc_time [in / ] - 系统时间
PTTOKENRECORDDATA pdata [in / ] - pdata
char *cHostCode [in / out] - 主机字符,外部分配空间
int *iCurrentUseCount [in / out] - 当前使用的次数
**
**返回类型: int
** DCSHEMBADARG 参数错误
** DCSHEMNOTCOVERTYPE 不是刮刮卡类型的令牌
** DCSHEMOVERCOVERNUM 达到最大值,刮刮卡可能是用到最后一个了
** DCSHEMSUCCESS 成功
**
**其他说明:
**
**历史: 日期 作者 行为
2009-8-14 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAGetCoverHostCode (ULONG passc_time, PTTOKENRECORDDATA pdata, char *cHostCode, int *iCurrentUseCount);
/******************************************************************************
**
**函数名称: DCSHSACheckCoverTokenCode
**
**功能描述: 认证覆盖区的动态口令,需要传递主机字符和动态口令,如果启用了PIN,还需要传递PIN
**
**参数说明:
ULONG passc_time [in / ] - 当前系统时间
PTTOKENRECORDDATA pdata [in / out] - pdata
char *cHostCode [in / ] - 主机字符
char *cTokenCode [in / ] - 覆盖区动态口令
char *pin [in / ] - pin码
**
**返回类型: int
** DCSHEMBADARG 参数错误
** DCSHEMNOTCOVERTYPE 不是刮刮卡类型
** DCSHEMMUSTGETCOVER 认证之前应该获得主机字符
** DCSHEMOVERCOVERNUM 不认证最大值和以后的
** DCSHEMHOSTCODEERRO 主机字符错误
** DCSHEMERRORTODISABLE 动态口令错误太多次,被禁用
** DCSHEMCOVERCODEERR 覆盖区动态口令错误
** DCSHEMSUCCESS 认证通过
**
**其他说明:
**
**历史: 日期 作者 行为
2009-8-14 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckCoverTokenCode (ULONG passc_time, PTTOKENRECORDDATA pdata, char *cHostCode, char *cTokenCode, char *pin);
/******************************************************************************
**
**函数名称: DCSHSAUpdateNewCoverCard
**
**功能描述:
**
**参数说明:
ULONG passc_time [in / ] - 系统时间
PTTOKENRECORDDATA pdataO [in / out] - 旧卡pdata
char *cHostCodeO [in / ] - 主机字符
char *cTokenCodeO [in / ] - 动态口令
char *pinO [in / ] - pin
PTTOKENRECORDDATA pdataN [in / out] - 新卡pdata
char *cHostCodeN [in / ] - 主机字符
char *cTokenCodeN [in / ] - 动态口令
char *pinN [in / ] - pin
**
**返回类型: int
** DCSHEMBADARG 参数错误
** DCSHEMNOTCOVERTYPE 不是刮刮卡类型
** DCSHEMMUSTGETCOVER 认证之前应该获得主机字符
** DCSHEMOVERCOVERNUM 不认证最大值和以后的
** DCSHEMHOSTCODEERRO 主机字符错误
** DCSHEMERRORTODISABLE 动态口令错误太多次,被禁用
** DCSHEMCOVERCODEERR 覆盖区动态口令错误
** DCSHEMSUCCESS 认证通过,可以更新
**
**
**其他说明:
**
**历史: 日期 作者 行为
2009-8-16 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAUpdateNewCoverCard (ULONG passc_time, PTTOKENRECORDDATA pdataO, char *cHostCodeO, char *cTokenCodeO, char *pinO,
PTTOKENRECORDDATA pdataN, char *cHostCodeN, char *cTokenCodeN, char *pinN);
/******************************************************************************
**
**函数名称: DCSHSAXORStringTo8Char
**
**功能描述: 把字符串通过异或转化为8字节,原则是8字节分组,对应的位置异或
**
**参数说明:
const char *cBuffer [in / ] - 原始字符串,长度不限
unsigned char *cDDWBUffer [in / out] - 输出的8字节,必须外部提供8字节空间,且初始化0
**
**返回类型: int
** EMBADARG 参数错误,参数可能是空指针,或者算法值不对
** EMSUCCESS 成功
**
**
**其他说明:
** 小于等于8字节的字符串则直接copy
**
**历史: 日期 作者 行为
2009-12-8 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAXORStringTo8Char (const char *cBuffer, unsigned char *cDDWBUffer);
//---------------------------------客户订制的开发接口------------------------------------//
/******************************************************************************
**
**函数名称: DCSHSACheckPasscode_for_hexin
**
**功能描述: 专门为核心定制的认证接口
该接口中,返回值DCSHEMSUCCESS和DCSHEMFIRST是正确的,其他的统统的认为是错误
返回值同时返回偏移量的变化和update的建议,其中:
DCSHEMFIRST返回值必须update
DCSHEMSUCCESS时,我们认为offset变化了就应该update,但决定权由核心控制;但是注意,当iAdjustStep接近小窗口最大值时,必须update;
**
**参数说明:
LONG passc_time [in / ] - DCSHSAGetPasscodeTime取得时间
PTTOKENDATA pdata [in / out] - 引擎数据包
char *prn [in / ] - tokencode
char *pin [in / ] - pin
int *iAdjustStep [in / out] - 此次认证调整的偏移量,可能是0,也可能是正数,也可能是负数
int *iAdviseUpdate [in / out] - 动联建议是否Update,0-表示不需要,1-表示需要
**
**返回类型: int
** EMSUCCESS 验证通过,除了EMBADREC,所有的返回必须保存PDATA到数据库
** EMFIRST 第一次使用令牌登陆,成功,等同于EMSUCCESS
** 其他值统统认为失败
** DCSHSACheckPasscode的返回值相同。
**
**
**其他说明:
**
**历史: 日期 作者 行为
2010-1-4 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckPasscode_for_hexin (ULONG passc_time, PTTOKENRECORDDATA pdata, char *prn, char *pin, int *iAdjustStep, int *iAdviseUpdate);
/******************************************************************************
**
**函数名称: DCSHSAModifyTokenDataWindow
**
**功能描述: 修改种子数据的认证窗口
** 建议:
1、券商、游戏 设置成为 时间型(120,300,600),事件型(2510)
2、银行、企业 设置成为 时间型(60,180,300),事件型( 1,35)
**
** 该操作会清除所有状态位和认证模式
**参数说明:
PTTOKENRECORDDATA pdata [in / out] - pdata,种子数据
int iSmallWindowSeconds [in / ] - 新的小窗口
int iMediumWindowSeconds [in / ] - 新的中窗口
int iLargeWindowSeconds [in / ] - 新的大窗口
**
**返回类型: int
** EMSUCCESS 修改成功,必须返回必须保存PDATA到数据库
** 其他的返回值都是失败
**
**其他说明: 该接口属于逼迫得以使用,客户在订购令牌时,应该预先向厂商提出令牌的详细策略需求。
**
**历史: 日期 作者 行为
2010-8-4 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAModifyTokenDataWindow (PTTOKENRECORDDATA pdata, int iSmallWindowSeconds, int iMediumWindowSeconds, int iLargeWindowSeconds);
/******************************************************************************
**
**函数名称: DCSHSACheckPasscode_for_City9
**
**功能描述: 专门为九城定制的认证接口
该接口中,返回值DCSHEMSUCCESS和DCSHEMFIRST是正确的,其他的统统的认为是错误
返回值同时返回偏移量的变化和update的建议,其中:
DCSHEMFIRST返回值必须update
DCSHEMSUCCESS时,我们认为offset变化了就应该update,但决定权由九城控制;但是注意,当iAdjustStep接近小窗口最大值时,必须update;
**
**参数说明:
char *pdataBase64 [in / out] - 引擎数据包的base64字符串
char *prn [in / ] - tokencode
char *pin [in / ] - pin
int *iAdjustStep [in / out] - 此次认证调整的偏移量,可能是0,也可能是正数,也可能是负数
int *iAdviseUpdate [in / out] - 动联建议是否Update,0-表示不需要,1-表示需要
**
**返回类型: int
** EMSUCCESS 验证通过,除了EMBADREC,所有的返回必须保存PDATA到数据库
** EMFIRST 第一次使用令牌登陆,成功,等同于EMSUCCESS
** 其他值统统认为失败
** DCSHSACheckPasscode的返回值相同。
**
**
**其他说明:
** 内部调用了取系统UTC时间
** 内部对状态位进行了重置操作
** 为了降低客户应用的数据库操作,提供了Update数据库的建议
** 如果外部用户有错误锁定操作,所有非正确返回值都可以不保存数据库
**
**历史: 日期 作者 行为
2010-1-24 杨波 Created
2010-6-24 杨波 对pdata的数据进行了Base64转换
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckPasscode_for_City9 ( char *pdataBase64, char *prn, char *pin, int *iAdjustStep, int *iAdviseUpdate);
/******************************************************************************
**
**函数名称: DCSHSAInitPdata_for_City9
**
**功能描述: 为9城定制的种子数据初始化的接口,其功能就是 分配/启用/禁用PIN
**
**参数说明:
char *pdataBase64 [in / out] - 引擎数据包的base64字符串
**
**返回类型:
** EMBADARG 参数错误,参数可能是空指针,或者算法值不对
** EMSUCCESS 成功
**
**
**其他说明:
**
**历史: 日期 作者 行为
2010-1-25 杨波 Created
2010-6-24 杨波 对pdata的数据进行了Base64转换
******************************************************************************/
DCSHCOREAPI_API int DCSHSAInitPdata_for_City9 ( char *pdataBase64);
/******************************************************************************
**
**函数名称: DCSHSAResynchTokenEx_for_City9
**
**功能描述: 为9城定制的重新同步接口
**
**参数说明:
char *pdataBase64 [in / out] - 引擎数据包的base64字符串
char *prn1 [in / ] - 第一个动态口令
char *prn2 [in / ] - 连续的第二个动态口令
**
**返回类型: int
** DCSHEMBADARG 参数错误
** DCSHEMSUCCESS 同步成功
** 其它值参考返回信息列表
**
**
**其他说明: 只有当返回DCSHEMSUCCESS时,才需要Update数据库
**
**历史: 日期 作者 行为
2010-8-12 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAResynchTokenEx_for_City9(char *pdataBase64, char *prn1, char *prn2);
/******************************************************************************
**
**函数名称: DCSHSAGetCustomTokenPasscode
**
**功能描述: 获取定制类型令牌的认证的动态口令,用于DCSH_HARDWARE_TOKEN_GET类型的令牌
目前为恒生定制接口, 将来会增加策略控制,如时间不会回逆获取
注意,一旦获取动态口令后,该动态口令不可用于动联系统认证
First获取后,将设置为Normal,当作第一次已经被使用
Normal获取后依然是Normal
Next/Next2获取后,还原成Normal
**
**参数说明:
LONG passc_time [in / ] - DCSHSAGetPasscodeTime取得时间
char *pdatabase64 [in / out] - 引擎数据包的base64字符串
char *prn [in / out] - 返回的tokencode,外部分配数组
**
**返回类型: int
** EMSUCCESS 验证通过,除了EMBADREC,所有的返回必须保存PDATA到数据库
** EMBADARG 参数错误,参数可能为空指针
** EMBADREC 严重错误!PDATA内部数据有问题,如签名等
** EMTIMRNG passcode时间错误,不在生命期限内
** EMNOTASSIGNED 令牌还没有分配
** EMDISABLE 令牌处于禁用状态
** EMFOREVERDISABLE 令牌被永久禁用,可能是时间偏移超过12小时
** EMBADTYPE 错误的令牌类型
**
**
**其他说明: 建议每一次获得动态口令后都应该保存pdatabase64,如果对性能有要求,也可以不保存
**
**历史: 日期 作者 行为
2010-3-28 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAGetCustomTokenPasscode (ULONG passc_time, char *pdataBase64, char *prn);
/******************************************************************************
**
**函数名称: DCSHSABase64Encode
**
**功能描述: 对二进制流进行编码,形成可见字符
**
**参数说明:
unsigned char * binaryDataPtr [in / ] - 二进制流
int binaryDataLength [in / ] - 二进制流长度
char * stringData [in / out] - 可见字符串,外部分配空间
int *stringDataLength [in / out] - 可见字符串长度
**
**返回类型: int
** DCSHEMSUCCESS 成功
** DCSHEMBASE64CODEERR 失败
**
**其他说明:
**
**历史: 日期 作者 行为
2009-8-19 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSABase64Encode( unsigned char * binaryDataPtr, int binaryDataLength, char * stringData ,int *stringDataLength );
/******************************************************************************
**
**函数名称: DCSHSABase64Decode
**
**功能描述: 对base64编码进行解码,获得二进制流
**
**参数说明:
char * stringData [in / ] - 可见字符串
int stringDataLen [in / ] - 可见字符串长度
unsigned char * binaryDataPtr [in / out] - 二进制流,外部分配空间
int * binaryDataLength [in / out] - 二进制流的长度
**
**返回类型: int
** DCSHEMSUCCESS 成功
** DCSHEMBASE64CODEERR 失败
**
**
**
**其他说明:
**
**历史: 日期 作者 行为
2009-8-19 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSABase64Decode( char * stringData, int stringDataLen, unsigned char * binaryDataPtr, int * binaryDataLength );
/******************************************************************************
**
**函数名称: DCSHSAUpdateNewSeedForICBC
**
**功能描述: 更新种子数据,工行使用了身份证码的数字与种子重新异或后,得到新的种子
**
**参数说明:
PTTOKENRECORDDATA pdata [in / out] - 种子数据
char *cID [in / ] - 异或的数字,应该是9byte
**
**返回类型: int
** DCSHEMBADARG 参数错误
** DCSHEMICBCHAVEXOR 已经异或过了
** DCSHEMSUCCESS 成功
**其他说明:
**
**历史: 日期 作者 行为
2010-11-19 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAUpdateNewSeedForICBC(PTTOKENRECORDDATA pdata, char *cID );
/******************************************************************************
**
**函数名称: DCSHSAICBCActiveUnlockAlg
**
**功能描述: 工行令牌的种子二次变形算法和令牌解锁算法
**
**参数说明:
BYTE *bSeed [in / ] - 种子,变形之前为老种子,变形之后为新种子,20字节
int iSeedLen [in / ] - 种子长度,工行固定为20字节,固定为20
char *cChallengeCode [in / ] - 挑战码,变形时为激活码6数字,后补0x00,0x00,解锁时为解锁码8数字
int iChallengeCodeLen [in / ] - 挑战码的长度,固定为8
char *cResponseCode [in / out] - 响应码,即校验码或者解锁码,外部分配空间
int iResponseCodeLen [in / ] - 响应码长度,固定为6
**
**返回类型: int
** DCSHEMBADARG 参数送入了空指针
** DCSHEMSEEDLENERR 种子长度错误
** DCSHEMCHECKLENERR 指定的响应码长度错误
** DCSHEMACTIVELENERR 挑战码的长度错误
** DCSHEMSUCCESS 成功
**
**其他说明: 建议对Msg的数据长度补齐8Byte
**
**历史: 日期 作者 行为
2010-12-22 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAICBCActiveUnlockAlg( BYTE *bSeed, int iSeedLen, char *cChallengeCode, int iChallengeCodeLen, char *cResponseCode, int iResponseCodeLen );
/******************************************************************************
**
**函数名称: DCSHSAICBCGenerateNewSeedAlg
**
**功能描述: 工行令牌变形得到新种子算法,需要输入激活码和校验码
**
**参数说明:
BYTE *bSeed [in / ] - 种子数据,20字节
int iSeedLen [in / ] - 种子长度,20
char *cChallengeCode [in / ] - 激活码,激活码为6个数字,输入时后补0x00,0x00
int iChallengeCodeLen [in / ] - 激活码的长度,8
char *cResponseCode [in / ] - 校验码,6数字字符
int iResponseCodeLen [in / ] - 校验码的长度6
BYTE *bNewSeed [in / out] - 新的种子,外部分配空间,至少20字节
int *iNewSeedLen [in / out] - 新种子长度,20
**
**返回类型: int
** DCSHEMBADARG 参数送入了空指针
** DCSHEMSEEDLENERR 种子长度错误
** DCSHEMCHECKLENERR 指定的响应码长度错误
** DCSHEMACTIVELENERR 挑战码的长度错误
** DCSHEMACTIVCHECKERR 激活码校验失败,不进行变形
** DCSHEMSUCCESS 成功
**
**其他说明:
**
**历史: 日期 作者 行为
2010-12-22 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAICBCGenerateNewSeedAlg( BYTE *bSeed, int iSeedLen, char *cChallengeCode, int iChallengeCodeLen, char *cResponseCode, int iResponseCodeLen , BYTE *bNewSeed, int *iNewSeedLen);
/******************************************************************************
**
**函数名称: DCSHSAICBCTimeTokeAlg
**
**功能描述: 工行的时间型动态口令算法
**
**参数说明:
BYTE *bSeed [in / ] - 种子,20字节
int iSeedLen [in / ] - 种子长度,20
BYTE *bTokenTime [in / ] - 时间数据,注意大头字序,8字节
int iTokenTimeLen [in / ] - 时间数据长度,固定为8
char *cTokenCode [in / out] - 动态口令,6数字字符,外部分配空间
int iTokenCodeLen [in / ] - 动态口令长度,固定为6
**
**返回类型: int
** DCSHEMBADARG 参数送入了空指针
** DCSHEMSEEDLENERR 种子长度错误
** DCSHEMPRNLEN 动态口令长度错误
** DCSHEMBIGTIMELENERR 大头字序的时间长度错误
** DCSHEMSUCCESS 成功
**
**其他说明:
**
**历史: 日期 作者 行为
2010-12-22 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAICBCTimeTokeAlg( BYTE *bSeed, int iSeedLen, BYTE *bTokenTime, int iTokenTimeLen, char *cTokenCode, int iTokenCodeLen );
/******************************************************************************
**
**函数名称: DCSHSAICBCChallengeResponseAlg
**
**功能描述: 工行的时间挑战应答型动态口令算法
**
**参数说明:
BYTE *bSeed [in / ] - 种子,20字节
int iSeedLen [in / ] - 种子长度,20
BYTE *bTokenTime [in / ] - 时间数据,大头字序,8字节
int iTokenTimeLen [in / ] - 时间长度,固定为8
char *cResponse [in / ] - 挑战问题,字符串
unsigned int iResponseLen [in / ] - 最大长度64
char *cTokenCode [in / out] - 动态口令,6数字字符,外部分配空间
int iTokenCodeLen [in / ] - 动态口令长度,固定为6
**
**返回类型: int
** DCSHEMBADARG 参数送入了空指针
** DCSHEMSEEDLENERR 种子长度错误
** DCSHEMPRNLEN 动态口令长度错误
** DCSHEMBIGTIMELENERR 大头字序的时间长度错误
** DCSHEMCHANLENERR 挑战问题的的长度大于64,错误
** DCSHEMSUCCESS 成功
**
**其他说明:
**
**历史: 日期 作者 行为
2010-12-22 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAICBCChallengeResponseAlg( BYTE *bSeed, int iSeedLen, BYTE *bTokenTime, int iTokenTimeLen, char *cResponse, unsigned int iResponseLen, char *cTokenCode, int iTokenCodeLen );
/******************************************************************************
**
**函数名称: DCSHSAICBCPinLockedAlg
**
**功能描述: 工行令牌的PIN输入错误的锁定码产生算法
**
**参数说明:
BYTE *bSeed [in / ] - 种子数据,20字节
int iSeedLen [in / ] - 种子长度,20
BYTE *bTokenTime [in / ] - 时间数据,大头字序,8字节
int iTokenTimeLen [in / ] - 时间数据长度,8
char *cPin [in / ] - 令牌的PIN码,6数字字符,后补0x00,0x00
unsigned int iPinLen [in / ] - PIN码长度,8
char *cPinLockedCode [in / out] - 令牌的锁定码,8数字字符
int iPinLockedCodeLen [in / ] - 锁定码长度,8
**
**返回类型: int
** DCSHEMBADARG 参数送入了空指针
** DCSHEMSEEDLENERR 种子长度错误
** DCSHEMPRNLEN 动态口令长度错误
** DCSHEMBIGTIMELENERR 大头字序的时间长度错误
** DCSHEMCHANLENERR 挑战问题的的长度大于64,错误
** DCSHEMPINLEN Pin码长度错误
** DCSHENUNLOCKPINERR 令牌解锁码的字符串长度错误,8数字
** DCSHEMSUCCESS 成功
**
**
**其他说明:
**
**历史: 日期 作者 行为
2010-12-22 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAICBCPinLockedAlg( BYTE *bSeed, int iSeedLen, BYTE *bTokenTime, int iTokenTimeLen, char *cPin, unsigned int iPinLen, char *cPinLockedCode, int iPinLockedCodeLen );
/******************************************************************************
**
**函数名称: DCSHSAConvertICBCTokenSeed
**
**功能描述: 第一次使用时转换原始的种子数据
**
**参数说明:
PTTOKENRECORDDATA pdata [in / out] - pdata数据
char *cActiveCode [in / ] - 激活码,12个数字
**
**返回类型: int
** DCSHEMBADARG 参数送入了空指针
** DCSHEMSEEDLENERR 种子长度错误
** DCSHEMPRNLEN 动态口令长度错误
** DCSHEMBIGTIMELENERR 大头字序的时间长度错误
** DCSHEMCHANLENERR 挑战问题的的长度大于64,错误
** DCSHEMPINLEN Pin码长度错误
** DCSHENUNLOCKPINERR 令牌解锁码的字符串长度错误,8数字
** DCSHEMSUCCESS 成功**
**
**其他说明: 激活码被保存在ucUserLastName中
原始种子被保存在ucUserFirstName种
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAConvertICBCTokenSeed(PTTOKENRECORDDATA pdata, char *cActiveCode );
/******************************************************************************
**
**函数名称: DCSHSAGetICBCActiveCode
**
**功能描述: 转换之前获得激活码,12个数字
**
**参数说明:
PTTOKENRECORDDATA pdata [in / ] - pdata
char *cActiveCode [in / out] - 令牌激活码,12个数字,外部应送入12以上的空间
**
**返回类型: int
** DCSHEMBADARG 参数送入了空指针
** DCSHEMSEEDLENERR 种子长度错误
** DCSHEMPRNLEN 动态口令长度错误
** DCSHEMBIGTIMELENERR 大头字序的时间长度错误
** DCSHEMCHANLENERR 挑战问题的的长度大于64,错误
** DCSHEMPINLEN Pin码长度错误
** DCSHENUNLOCKPINERR 令牌解锁码的字符串长度错误,8数字
** DCSHEMSUCCESS 成功
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAGetICBCActiveCode(PTTOKENRECORDDATA pdata, char *cActiveCode );
/******************************************************************************
**
**函数名称: SM3
**
**功能描述: 国密刚公开的SM3算法
**
**参数说明:
unsigned char *Block [in / ] - SM3的单个块运算
unsigned int ulBlock [in / ] - 单个块长度,固定为64
unsigned char *bSM3HashValue [in / out] - SM3摘要
**
**返回类型: int
**
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-10 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSASM3(unsigned char *Block, unsigned int ulBlock, unsigned char *bSM3HashValue);
/******************************************************************************
**
**函数名称: TestCreateTimeTokencodeRange -- 测试专用
**
**功能描述: 创建一段时间范围内的动态口令
**
**参数说明:
PTTOKENRECORDDATA pdata [in / out] -
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void TestCreateTimeTokencodeRange(PTTOKENRECORDDATA pdata);
/******************************************************************************
**
**函数名称: TestCreateTimeTokencode -- 测试专用
**
**功能描述:
**
**参数说明:
void [in / out] -
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void TestCreateTimeTokencode(void);
/******************************************************************************
**
**函数名称: TestCreateTimeTokencode_Host -- 测试专用
**
**功能描述:
**
**参数说明:
void [in / out] -
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void TestCreateTimeTokencode_Host(void);
/******************************************************************************
**
**函数名称: TestCreateEventTokencode -- 测试专用
**
**功能描述:
**
**参数说明:
void [in / out] -
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void TestCreateEventTokencode(void);
/******************************************************************************
**
**函数名称: TestCreateChallengeResponsecode -- 测试专用
**
**功能描述:
**
**参数说明:
void [in / out] -
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void TestCreateChallengeResponsecode(void);
/******************************************************************************
**
**函数名称: TestCreateTimeTokencodeSig -- 测试专用
**
**功能描述:
**
**参数说明:
void [in / out] -
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void TestCreateTimeTokencodeSig(void);
/******************************************************************************
**
**函数名称: TestCreateTimeTokencodeATM -- 测试专用
**
**功能描述:
**
**参数说明:
void [in / out] -
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void TestCreateTimeTokencodeATM(void);
/******************************************************************************
**
**函数名称: TestCreateEventTokencodeATM -- 测试专用
**
**功能描述:
**
**参数说明:
void [in / out] -
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void TestCreateEventTokencodeATM(void);
/******************************************************************************
**
**函数名称: TestPrintCardInfo -- 测试专用
**
**功能描述:
**
**参数说明:
char *CardFileName [in / out] -
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void TestPrintCardInfo(char *CardFileName);
/******************************************************************************
**
**函数名称: DCSHChangeTokenSeed -- 测试专用
**
**功能描述:
**
**参数说明:
PTTOKENRECORDDATA pdata [in / out] -
**
**返回类型: int
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2011-1-11 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAChangeTokenSeed(PTTOKENRECORDDATA pdata);
#if OS_SELECT_WINDOWS
/******************************************************************************
**
**函数名称: DCSHSACheckShecaCert
**
**功能描述: 接入上海CA的开发包,此接口初始化eKey,并读取证书信息,以用来检测eKey的正常
**
**参数说明:
char *cPrikeyPassword [in / ] - 私钥的密钥
char* pCertInfoFile [in / out] - 证书的一些信息,保存到文件
**
**返回类型: int
** DCSHEMSHECADLLERR 上海CA的接口不存在,请按装上海CA的证书管理器
** DCSHEMSHECAKEYERR eKey操作失败,请检查eKey是否正常
** DCSHEMSUCCESS 成功,可以打印证书信息
**
**其他说明:
**
**历史: 日期 作者 行为
2010-9-2 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckShecaCert (char *cPrikeyPassword, char* pCertInfoFile);
/******************************************************************************
**
**函数名称: DCSHSACheckSJK0817E
**
**功能描述: 检测华正天网的加密卡是否正常,并且进行了加解密运算,SM1
**
**参数说明:
[in / out] -
**
**返回类型: int
** DCSHEMPCIOPENERR 加密卡初始化失败
** DCSHEMPCISESSIONERR 创建连接失败
** DCSHEMPCIOPERERR 加密卡运算失败
** DCSHEMSUCCESS 成功
**其他说明:
**
**历史: 日期 作者 行为
2010-9-2 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSACheckSJK0817E ();
/******************************************************************************
**
**函数名称: DCSHSAMakePubkeyEncRecord
**
**功能描述: 用户的公钥加密会话密钥数据
**
**参数说明:
char *userCertPath [in / ] - 用户证书的路径
unsigned char *pRecordData [in / ] - 会话密钥,16字节
unsigned int RecordDataLen [in / ] - 数据长度,16
unsigned char *pEvpSigData [in / out] - 加密的数据,128字节,外部分配空间
unsigned int EvpSigDataLen [in / out] - 加密的数据长度,应该是128
**
**返回类型: int
** EMREADUSERCERTERR 读取用户证书失败
** EMDECUSERCERTERR 解析用户证书失败
** EMSUCCESS 成功
**其他说明:
**
**历史: 日期 作者 行为
2008-6-12 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int DCSHSAMakePubkeyEncRecord (char *userCertPath, unsigned char *pRecordData, unsigned int RecordDataLen, unsigned char *pEvpSigData, unsigned int *EvpSigDataLen);
/******************************************************************************
**
**函数名称: TestRandom
**
**功能描述: 真随机数测试
**
**参数说明:
int iNumber [in / ] - 次数
**
**返回类型: DCSHCOREAPI_API int
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2010-9-7 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int TestRandom(int iNumber);
/******************************************************************************
**
**函数名称: TestSM1
**
**功能描述: SM1算法测试
**
**参数说明:
int iNumber [in / ] - 次数
**
**返回类型: DCSHCOREAPI_API int
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2010-9-7 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int TestSM1(int iNumber);
/******************************************************************************
**
**函数名称: TestSM3
**
**功能描述: SM3算法测试
**
**参数说明:
int iNumber [in / ] - 次数
**
**返回类型: DCSHCOREAPI_API int
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2010-9-7 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int TestSM3(int iNumber);
#endif
/******************************************************************************
**
**函数名称: TestTokenCodeNumberIndex
**
**功能描述: 使用10个不同的种子,每个种子从tokentime=i*60计算10000个tokencode
对10000个tokencode进行数字统计,计算0-9数字出现的频率
**
**参数说明:
int iAlgID [in / ] - 算法
**
**返回类型: int
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2009-1-16 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int TestTokenCodeNumberIndex(int iAlgID);
/******************************************************************************
**
**函数名称: TestTokenCodeDoubleIdx
**
**功能描述: 设定5个时间点,在每个点随机创建若干个种子,并且在这时间点上计算tokencode
对若干个tokencode进行逐个比对,进行重复计数
“若干个”为传递参数,可指定
**
**参数说明:
int seedCount [in / ] - 每个时间点,创建seedCount个种子,计算seedCount个动态口令
** int iAlgID [in / ] - 算法
**返回类型: int
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2009-1-16 杨波 Created
******************************************************************************/
DCSHCOREAPI_API int TestTokenCodeDoubleIdx(int seedCount, int iAlgID);
/******************************************************************************
**
**函数名称: TestTokenCodePrefect
**
**功能描述: 测试验证动态口令的性能,1000000次验证
直接命中,计算1次
偏移1,计算2次
偏移3,计算6次
偏移5,计算10次
**
**参数说明:
[in / out] -
**
**返回类型: void
** [添加返回值说明]
**
**
**其他说明:
**
**历史: 日期 作者 行为
2009-1-16 杨波 Created
******************************************************************************/
DCSHCOREAPI_API void TestTokenCodePrefect(int MAXCYCLETEST, int iAlgID);
#ifdef __cplusplus
}
#endif
#endif