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

📄 tjpbocidu.java

📁 在java卡上实现的PBOC电子钱包应用
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        pTemp32[9] = (byte)0x6;
        pTemp32[10] = pTemp81[0];
        pTemp32[11] = pTemp81[1];
        pTemp32[12] = pTemp81[2];
        pTemp32[13] = pTemp81[3];
        pTemp32[14] = pTemp81[4];
        pTemp32[15] = pTemp81[5];
        Util.arrayCopyNonAtomic(data,(short)4,pTemp32,(short)16,(short)7);

        // write to log
        if (!l.writerec((byte)0x1,pTemp32) )
           return (short)8;

        // increase counter

        rc = Util.makeShort(vector[7],vector[8]);
        gtp_ntonoff =rc;
        rc++;
        if ( rc > (short)256 ) rc = (short)1;
        Util.setShort(vector,(short)7,rc);

        Util.arrayCopyNonAtomic(pTemp42,(short)0,pTemp32,(short)0,(short)4);
        c.gmac4(penCipher.ALG_DES,pTemp82,pTemp32,(short)0x4,pTemp41);
        Util.arrayCopyNonAtomic(pTemp42,(short)0,pTemp32,(short)0,(short)4);
        pTemp32[4] = (byte)0x06;
        Util.arrayCopyNonAtomic(pTemp81,(short)0,pTemp32,(short)5, (short)6);
        Util.arrayCopyNonAtomic(data,(short)0,   pTemp32,(short)11,(short)4);
        Util.arrayCopyNonAtomic(data,(short)4,pTemp32,(short)15,(short)4);
        Util.arrayCopyNonAtomic(data,(short)8,pTemp32,(short)19,(short)3);
        Util.arrayCopyNonAtomic(pTemp16,(short)16,pTemp82,(short)0,(short)8);
        c.xorblock8(pTemp82,pTemp16,(short)24);
        c.gmac4(penCipher.ALG_DES,pTemp82,pTemp32,(short)0x16,data);
        Util.arrayCopyNonAtomic(pTemp41,(short)0,data,(short)4,(short)4);
        pStateMachine[0] = (byte)0x0;

        Util.arrayCopyNonAtomic(data,(short)0,gtp_tac,(short)4,(short)4);
        gtp_ready =true;
        
        return (short)0;
    }
    //------------------------------------------------
    public final short init4load(byte[] data )
    {
        short rc;
        // IK   AMT4   TID6
        Util.arrayCopyNonAtomic(data,(short)1,pTemp42,(short)0,(short)4); // amount
        Util.arrayCopyNonAtomic(data,(short)5,pTemp81, (short)0,(short)6); // tid

        rc = loadKey((byte)0x02,data[0],pTemp32);
        if ( rc!=(short)0 ) return rc;
        Util.arrayCopyNonAtomic(pTemp32,(short)2,pTemp16,(short)0,(short)16); // key

        rc = loadKey((byte)0x03,data[0],pTemp32);
        if ( rc!=(short)0 ) return rc;
        Util.arrayCopyNonAtomic(pTemp32,(short)2,pTemp16,(short)16,(short)16); // key

        // check overflow
        rc = increase(pTemp42, (byte)0x0);
        if ( rc!=(short)0 ) return (short)2;

        r.generateSecureRnd((byte)4);
        r.getRndValue(pTemp32);
        pTemp32[4] = vector[5];
        pTemp32[5] = vector[6];
        pTemp32[6] = (byte)0x80;
        pTemp32[7] = (byte)0x0;
        c.tripledes(pTemp16,pTemp32,(short)0,(short)8,pTemp82,(short)0,Cipher.MODE_ENCRYPT); // session key

        // gen MAC1
        Util.arrayCopyNonAtomic(vector,(short)1,pTemp32,(short)0,(short)4);
        Util.arrayCopyNonAtomic(data,  (short)1,pTemp32,(short)4,(short)4);
        pTemp32[8] = (byte)0x02;
        Util.arrayCopyNonAtomic(data,  (short)5,pTemp32,(short)9,(short)6);
        c.gmac4(penCipher.ALG_DES,pTemp82,pTemp32,(short)0xF,pTemp41);
        // BAL4  nt_xx_on2  VK ALG RND_ICC4 Mac14
        Util.arrayCopyNonAtomic(vector,(short)1, data,(short)0,(short)4);
        Util.arrayCopyNonAtomic(vector,(short)5, data,(short)4,(short)2);
        Util.arrayCopyNonAtomic(vector,(short)15,data,(short)6,(short)2);
        r.getRndValue(pTemp32);
        data[8] =  pTemp32[0];
        data[9] =  pTemp32[1];
        data[10]=  pTemp32[2];
        data[11]=  pTemp32[3];
        Util.arrayCopyNonAtomic(pTemp41,(short)0,data,(short)12,(short)4);
        
        pStateMachine[0] = (byte)0x0;
        pStateMachine[1] = (byte)0x1;

        gtp_tac[0] = (byte)0x0;
        gtp_tac[1] = (byte)0x0;
        gtp_tac[2] = (byte)0x0;
        gtp_tac[3] = (byte)0x0;
        gtp_tt = (byte)0x2;
        gtp_ready = false;
        return (short)0;
    }
    //------------------------------------------------
    public final short credit4load(byte[] data )
    {
        short rc;

        // DATE4 TIME3  MAC24
        Util.arrayCopyNonAtomic(pTemp42,(short)0,pTemp32,(short)0,(short)4); // amount
        pTemp32[4] = (byte)0x02;
        Util.arrayCopyNonAtomic(pTemp81,(short)0,pTemp32,(short)5,(short)6); // tid
        Util.arrayCopyNonAtomic(data, (short)0, pTemp32, (short)11,(short)7); // datetime
        c.gmac4(penCipher.ALG_DES,pTemp82,pTemp32,(short)0x12,pTemp41);
        if(Util.arrayCompare(data,(short)7,pTemp41,(short)0,(short)4)!=(byte)0)
           return (short)1;

        // increase amount
        rc = increase(pTemp42, (byte)0x1);
        if ( rc!=(short)0 ) return (short)8;

        // increase counter
        // SAVE Counter to pTemp41;
        pTemp41[0] = vector[5];
        pTemp41[1] = vector[6]; 

        rc = Util.makeShort(vector[5],vector[6]);
        gtp_ntonoff =rc; // save for GTP
        rc++;
        if ( rc > (short)256 ) rc = (short)1;
        Util.setShort(vector,(short)5,rc);

       // log
        pTemp32[0] = pTemp41[0];
        pTemp32[1] = pTemp41[1];

        pTemp32[2] = (byte)0x0;
        pTemp32[3] = (byte)0x0;
        pTemp32[4] = (byte)0x0;

        pTemp32[5] = pTemp42[0];
        pTemp32[6] = pTemp42[1];
        pTemp32[7] = pTemp42[2];
        pTemp32[8] = pTemp42[3];

        pTemp32[9] = (byte)0x2;
        pTemp32[10] = pTemp81[0];
        pTemp32[11] = pTemp81[1];
        pTemp32[12] = pTemp81[2];
        pTemp32[13] = pTemp81[3];
        pTemp32[14] = pTemp81[4];
        pTemp32[15] = pTemp81[5];
        Util.arrayCopyNonAtomic(data,(short)0,pTemp32,(short)16,(short)7);

        // write to log
        if (!l.writerec((byte)0x1,pTemp32) )
           return (short)8;

        //TAC
        Util.arrayCopyNonAtomic(vector,(short)1, pTemp32,(short)0,(short)4);
        pTemp32[4] = pTemp41[0];
        pTemp32[5] = pTemp41[1];
        Util.arrayCopyNonAtomic(pTemp42,(short)0,pTemp32,(short)6,(short)4);
        pTemp32[10] = (byte)0x2;
        Util.arrayCopyNonAtomic(pTemp81,(short)0,pTemp32,(short)11,(short)6);
        Util.arrayCopyNonAtomic(data,(short)0, pTemp32,(short)17,(short)7);
// TAC KEY
        Util.arrayCopyNonAtomic(pTemp16,(short)16,pTemp82,(short)0,(short)8);
        c.xorblock8(pTemp82,pTemp16,(short)24);
        c.gmac4(penCipher.ALG_DES,pTemp82,pTemp32,(short)0x18,data);
        pStateMachine[1] = (byte)0x0;
        
        Util.arrayCopyNonAtomic(data,(short)0,gtp_tac,(short)4,(short)4);
        gtp_ready =true;
        return (short)0;
    }
    //------------------------------------------------
    public final boolean can_gtp()
    {
        return gtp_ready; 
    }
    //------------------------------------------------
    public final boolean match_tn(byte tt, short us)
    {
    	if((gtp_tt ==tt)&&(gtp_ntonoff==us)) return true;
    	return false;
    }
    //------------------------------------------------
    public final void copy_tac(byte[] data)
    {
    	Util.arrayCopyNonAtomic(gtp_tac,(short)0,data,(short)0,(short)8);
    	gtp_ready =false;
    }
    //------------------------------------------------
    public final short unwrap_apdu(byte kid, tjuapdu apdu,boolean bRPK)
    {
        short rc;

        rc = loadKey(kid,(byte)0x01,pTemp32); // in PBOC Spec. the keyindex is not specified
        if ( rc!=(short)0 ) return (short)0x01;
        
        Util.arrayFillNonAtomic(pTemp81,(short)0,(short)8,(byte)0x0);

        if(bRPK) { 
            Util.arrayCopyNonAtomic(pTemp32,(short)2, pTemp16,(short)0,(short)8); 
            Util.arrayCopyNonAtomic(pTemp32,(short)10,pTemp82,(short)0,(short)8);
            c.xorblock8(pTemp16,pTemp82,(short)0);    // session key
        } else { 
           Util.arrayCopyNonAtomic(pTemp32,(short)2,pTemp16,(short)0,(short)16); // key
           if (!r.isvaild()) return (short)0x01;
           r.getRndValue(pTemp81);
        }
        
        apdu.ucTemp256[0] = apdu.cla;
        apdu.ucTemp256[1] = apdu.ins;
        apdu.ucTemp256[2] = apdu.p1;
        apdu.ucTemp256[3] = apdu.p2;
        apdu.ucTemp256[4] = (byte)apdu.lc;
        Util.arrayCopyNonAtomic(apdu.pdata,(short)0,apdu.ucTemp256,(short)5,apdu.lc);
        if(bRPK) 
        	c.gmac4(penCipher.ALG_DES,pTemp16,apdu.ucTemp256,(short)(apdu.lc+1),pTemp82,pTemp81);	
        else 
            c.gmac4(penCipher.ALG_3DES,pTemp16,apdu.ucTemp256,(short)(apdu.lc+1),pTemp82,pTemp81);

        rc = (short)(apdu.lc-4);
        if(Util.arrayCompare(apdu.pdata,rc,pTemp82,(short)0,(short)4)!=(byte)0) 
        	return (short)0x02;

        if(!bRPK){
           if(rc>(short)0) { 
              c.tripledes(pTemp16,apdu.pdata,(short)0,rc,apdu.ucTemp256,(short)0,Cipher.MODE_DECRYPT);
              apdu.lc = (short)(apdu.ucTemp256[0]&0x0ff);
              Util.arrayCopyNonAtomic(apdu.ucTemp256,(short)1,apdu.pdata,(short)0,apdu.lc);
           }
        }
        
    	return (byte)0x0;
    }
    //------------------------------------------------
    //------------------------------------------------
}

⌨️ 快捷键说明

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