easyCard


作为一个程序员,一个非典型的程序员,一个靠敲代码为生的家伙

从踏入这个行业开始,心底就有一个无法压抑的梦,希望写一门属于自己的语言,几年的准备,半年多业余时间的摸爬滚打

不要求它多高深,不奢望它多全面,只求它能用,用在实处

今天,它来了

easycard是一门立足于智能卡行业的语言,不同于这个行业大多数所谓脚本语言的实现(包括SF),easycard是一门完全面向对象的语言

easycard拥有简单易学的语法,提供了类/继承/重载方法/属性/函数/变量等常用语法的支持

easycard的底层API提供了智能卡行业的常用组件的支持,如文件操作,读写器操作,数据库操作,常用算法操作,套接字操作等

easycard是一门纯C开发的语言,在开发过程中遇到过很多问题,也借鉴了不少前辈的方法和思路,也以此文表达对各位大佬们的敬意

下面贴一段esaycard的代码

// 获取系统时间
var beginTime = clock()

class Card
{
    var reader
    var algo
    var log
    fun init(logPath)
    {
        // 创建一个PCSC读写器实例
        reader = Reader()
        // 创建一个算法实例
        algo = Algo()
        // Pro log
        log = File(logPath,"a")
    }
    
    // 获取pcsc的名称 list类型
    fun getReaderName()
    {
        return reader.getReaderName()
    }
    
    // 根据读写器名称来连接读写器,成功返回atr/ats的值,失败返回none
    fun connect(readerName)
    {
        var atr = reader.connect(readerName)
        if(!atr)
        {
            print("连接读写器失败!")
            exit(0)
        }
        return atr
    }
    
    // 上电复位
    fun powerOn()
    {
        var result = reader.powerOn()
        if(result != 0)
        {
            print("上电复位失败!")
            exit(0)
        }
        return result
    }
    
    fun disConnect()
    {
        reader.disConnect()
    }
    
    // 发送APDU指令
    fun sendApdu(apduCmd)
    {       
        apduCmd = apduCmd.remove(" ")
        log.writeLine(time() + " " + apduCmd +"\n")
        var result = reader.apdu(apduCmd)
        log.writeLine(time() + " " + result +"\n")
        
        var sw = result[len(result)-4:len(result)]

        // 检验SW是否为9000
        if(sw != "9000")
        {
            print("SW错误!")
            exit(0)
        }
        return result
    }
    
    // 发送APDU指令,可指定允许出错的出错状态码,有必要的话,最后一个参数可以改成list
    fun sendApduCheckSW(apduCmd,allowSW)
    {
        apduCmd = apduCmd.remove(" ")
        log.writeLine(time() + " " + apduCmd +"\n")
        var result = reader.apdu(apduCmd)
        log.writeLine(time() + " " + result +"\n")

        // 检验SW是否为9000
        var sw = result[len(result)-4:len(result)]

        if(sw != "9000" && sw != allowSW )
        {
            print("SW错误!")
            exit(0)
        }

        return result
    }

    // 计算MAC拼接后发送APDU
    fun sendApduMac(apduCmd,key)
    {
        apduCmd = apduCmd.remove(" ")
        var result = sendApdu("0084000008")
        result = algo.mac3des("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",apduCmd,result[0:16])

        return sendApdu(apduCmd + result[0:8])
    }
    
    // 外部认证
    fun externalAuth(keyIndex)
    {
        var random = sendApdu("0084000008")
        var result
        result = algo.encrtpt3desEcb("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",random)
        sendApdu("008200" + keyIndex + "08" + result[0:16])
    }
}

var card = Card("卡片测试日志.log")

var readNameList = card.getReaderName()
print(readNameList)

var atrInfo = card.connect(readNameList[1])
print(" ATR: " + atrInfo)

if(card.powerOn() != 0)
{
	print("卡片上电复位失败")
}

card.sendApdu("00A4040000")

easycard下载链接

暂无评论

注册用户登录后才能发表或者回复评论,请先登录 注册。