如何在javacard 2.2.1中编写/读取X509证书

时间:2016-08-31 04:05:30

标签: javacard

我想存储三张证书。

我有两个相关的问题:

  1. 如何编写方法Get_Offset_Read()Get_Offset_Write()并计算缓冲区中的偏移量以便在缓冲区中进行写入和读取?
  2. 我使用ObjectArray来存储证书数据。这是存储此类数据的正确方法吗?
  3. 以下是代码:

    public class writeApplet extends Applet {
         private Object[] FileArray;
         private byte  FileCount;
         private writeApplet() {
         FileArray=new Object[3];
         FileCount=0;
         }
         public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {
          new writeApplet().register();
         }
         public void process(APDU arg0) throws ISOException {
        //….   
         }
    
         private void ReadBinaryData(APDU apdu)
          {
    
          //How to write Get_Offset_Read();
           short offset = Get_Offset_Read();
    
            byte[] buf= apdu.getBuffer();
    
           // p1value is certificate index in FileArray 
           byte p1value=buf[ISO7816.OFFSET_P1];
    
           byte[] FileObj=(byte[]) FileArray[p1value];
    
            short le = apdu.setOutgoing();
    
            boolean eof = false;
            if((short)(FileObj.length - offset) < le) {
            le = (short)(FileObj.length - offset);
            eof = true;
           }
    
           apdu.setOutgoingLength(le);
           apdu.sendBytesLong(FileObj, offset, le);
    
           if(eof)
           {
             ISOException.throwIt(SW_END_OF_FILE);
           }
          }
    
        private void WriteBinaryData(APDU apdu)
        {
           if(FileCount==3)
           {
             ISOException.throwIt(SW_END_OF_ThreeFILES);
           }
           byte[] buf = apdu.getBuffer();
           short offset =Get_Offset_Write();
           byte lc=buf[ISO7816.OFFSET_LC];
           if((short)(offset + lc) >((byte[])FileArray[FileCount]).length)
           {
             ISOException.throwIt(SW_WRONG_LENGTH);
           }
           apdu.setIncomingAndReceive();
          Util.arrayCopyNonAtomic(buf, ISO7816.OFFSET_CDATA,(byte[]);
          FileArray[FileCount],offset,lc);                                          
          FileCount++;
        }
    }
    

1 个答案:

答案 0 :(得分:1)

将持久化数组存储在对象数组中的想法当然没有错。所以这个答案的其余部分将集中在偏移问题上。

通常,文件操作是遵循ISO 7816-4规范实现的。

在这种情况下,您至少要创建三种方法,而不是两种方法:

  • CREATE FILE - 创建一个文件(特定大小)
  • UPDATE BINARY - 使用P1 / P2
  • 中的偏移量写入(部分)文件
  • READ BINARY - 使用P1 / P2中的偏移量读取(部分)文件

指示的偏移量当然是文件中的偏移量,而不是缓冲区中的偏移量。

我会使用Odd INS跳过UPDATE BINARYREAD BINARY,因为通常只有超过32KiB的文件才需要它们。

如果要保留当前的设计,则可以将偏移量存储在命令数据(CDATA)部分中。或者,您可以将文件写入特定大小的块中,并在P2中指示块编号。

在我看来,应首选添加CREATE FILE命令。目前,用于读取和创建/写入文件的方法不是对称的。