Hi Eric, Aswarth,

Eric was right: storing a big block of data just requires more APDU than a 
small block to download its content but the underlying process (array 
definition, instantiation, management) is the same.

Just a comment regarding your memory manager proposal, since you deal with 
Oberthur C.S. JavaCards, they (AuthentIC, CosmopolIC) provide a garbage 
collector that manages all this stuff with an unique line of code ... "ba = 
null;".

cheers,
Sylvain.


At 19:29 16/10/2002 -0400, Eric Pearson wrote:
>Hi Aswarth...
>
>Note Sure about your 211PK card, but 4K is easily acheivable on the Oberthur
>cards
>You can allocate the memory after or during the install with something like
>the following code snippets.
>Note: you cannot reasonably expect to free the memory, so manage it for the
>life
>of the applet.
>
>Eric
>
>-----Code sample start ------
>ba = new byte[heap_size]; // allocate heap stack from eeprom
>-----Code sample end ------
>
>I had my memory allocated when the applet is installed. The following shows
>my applets install
>and constructor:
>
>-----Code sample start ------
>  /** installation method */
>  public static void install( byte[] bArray, short bOffset, byte bLength )
>  {
>   new mlbb_applet( bArray, bOffset, bLength );
>  }
>
>  /** constructor */
>  private mlbb_applet( byte[] bArray, short bOffset, byte bLength )
>  {
>   short ptr;
>   ptr = bOffset;      // pointer to aid length
>   ptr = (short)(ptr + 1 + (short)( bArray[ptr] )); // pointer to priv length
>   ptr = (short)(ptr + 1 + (short)( bArray[ptr] )); // pointer to length of
>params
>   if ( bArray[ptr] >= 3 && bArray[ptr+1] == MLBB_MAGIC )  // len >= 3 and
>magic byte
>   {
>    db = new data_base( Util.getShort( bArray, (short)(ptr+2) ) );
>   }
>   else
>   {
>    db = new data_base( DATA_BASE_SIZE );
>   }
>   sreg = new short[NUM_SREGS];
>
>  }
>-----Code sample end ------
>
>Here's a low level byte heap class which manages alloc's and free from a
>heap.
>
>-----Code sample end ------
>/** provies a malloc/free memory management of pre-allocated eeprom */
>public class byte_heap extends eeprom_list
>{
>
>  private short total_size;
>
>  private final short F_NEXT = (short)0;
>  private final short  F_LENGTH = (short)2;
>  private final short  MIN_FREE = (short)4;
>
>  /** constructor of a byte heap within byte array */
>  byte_heap ( short heap_size )
>  {
>   ba = new byte[heap_size]; // allocate heap stack from eeprom
>
>   root = 0;
>   total_size = heap_size;
>
>   set_node( (short)0, EOF, total_size );
>  }
>
>  /** return the amount of free memory */
>  public short get_free ( )
>  {
>   short ptr = root;
>   short free;
>
>   free = get( ptr, F_LENGTH );
>
>   while ( get( ptr, F_NEXT ) != EOF )
>   {
>    ptr = get_next( ptr );
>    free += get_length( ptr );
>   }
>
>   return free;
>  }
>
>  /** return all memory to the heap */
>  public void erase_all ( )
>  {
>   root = 0;     // create root node ptr
>   set_node( root, EOF, total_size );  // and fill in default
>  }
>
>  /** allocate a given number of bytes */
>  public short alloc ( short size )
>  {
>   short ptr = root;
>   short diff;
>   short last;
>
>   if ( get_length( ptr ) >= ( size + MIN_FREE ) ) // alway leave first block
>   {
>    diff = (short)(get_length( ptr ) - size);
>    set_node( ptr, get_next( ptr ), diff);
>    return ( (short)(ptr + diff) );
>   }
>
>   while( get_next( ptr ) != EOF )
>   {
>    last = ptr;
>    ptr = get_next( ptr );
>    if ( get_length( ptr ) >= size )
>    {
>     diff = (short)(get_length( ptr ) - size);
>      if ( diff == 0 ) // first block is exact fit
>     {
>      set_node( last, get_next( ptr ), get_length( last ) );
>      return ( ptr );
>     }
>
>     if ( diff >= 4 ) // re-size the block
>     {
>      set_node( ptr, get_next( ptr ), diff);
>      return ( (short)(ptr + diff));
>     }
>    }
>   }
>
>   return( EOF ); // else return null
>  }
>
>
>  /** free up the given number of bytes - which must have been alloc'ed */
>  public void free ( short index, short size )
>  {
>   short ptr = root;
>   short last;
>
>   if ( index + size < ptr ) { // add before 1st free block - disjoint
>    set_node( index, ptr, size );
>    root = index;
>    return;
>   }
>
>   if (( index + size ) == ptr ) // add before 1st free block - adjacent
>   {
>    set_node( index, get_next( ptr ), (short)(size + get_length(ptr )));
>    root = index;
>    return;
>   }
>
>   while( get_next( ptr ) != EOF )
>   {
>    last = ptr;
>    ptr = get_next( ptr );
>
>    if ( index + size < ptr )
>    {
>     if ( index == (short)(last + get_length( last )))
>     {
>      // data lines up with end of last, but not next
>      set_node( last, ptr, (short)(get_length( last ) + size));
>      return;
>     }
>     else
>     {
>      // data is in the middle
>      set_node( index, ptr, size );
>      set_node( last, index, get_length( last ) );
>      return;
>     }
>    }
>
>    if ( (index + size) == ptr )
>    {
>     if ( index == last + get_length( last ) )
>     {
>      // data lines up with end of last, and beginning of next
>      set_node( last, get_next( ptr),
>       (short)(get_length( last ) + get_length( ptr) + size));
>      return;
>     }
>     else
>     {
>      // data lines up with the end of last
>      set_node( index, get_next( ptr),
>        (short)(get_length( ptr ) + size) );
>      set_node(  last, index, get_length( last ) );
>      return;
>     }
>    }
>   }
>
>   if( get_length( ptr ) + ptr == index ) // block is after last free block -
>adjacent
>   {
>    set_node( ptr, get_next( ptr ), (short)(get_length( ptr ) + size) );
>    return;
>   }
>
>   if( get_length( ptr ) + ptr < index ) // block is after last free block -
>disjoint
>   {
>    set_node( index, get_next( ptr ), size );
>    set_node( ptr, index, get_length( ptr ));
>    return;
>   }
>
>   // must never happen
>  }
>
>  private void set_node ( short index, short next, short length )
>  {
>   set( index, F_NEXT, next );
>   set( index, F_LENGTH, length );
>  }
>
>  private short get_next ( short index )
>  {
>   return get( index, F_NEXT );
>  }
>
>  private short get_length ( short index )
>  {
>   return get( index, F_LENGTH );
>  }
>
>  /**
>    *
>    * Unit Test Block
>    *
>    * this file can be discarded by eraseing the classname$Test.class files
>    * It is only useful for testing the subroutine, which has no javacard
>    * dependancies
>    *
>    */
>/*
>  public static final class Test
>  {
>   public static void main( String[] args )
>   {
>    short[] ptr   = new short[100];
>    short  start_size  = 8192;
>    short i;
>    short size;
>
>    System.out.println("Hello world");
>    System.out.println("Create Byte heap of size " + start_size );
>
>    byte_heap heap = new byte_heap( start_size );
>
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    for( i = 0; i < 20; i ++ )
>    {
>     size = (short)(i * 10+ 10);
>     ptr[i] = heap.alloc( size );
>     System.out.println("alloc size = " + size + " ptr = " + ptr[i] );
>    }
>
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    // force an adjacent end exit
>
>     size = (short)(19 * 10+ 10);
>     System.out.println("free size = " + size + " ptr = " + ptr[19] );
>     heap.free( ptr[19], size );
>     ptr[i] = EOF;
>
>    for( i = 0; i < 20; i+=2 )
>    {
>     size = (short)(i * 10+ 10);
>     System.out.println("free size = " + size + " ptr = " + ptr[i] );
>     heap.free( ptr[i], size );
>     ptr[i] = EOF;
>    }
>
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    for( i = 0; i < 20; i+=2 )
>    {
>     size = (short)(i * 11+ 10);
>     ptr[i] = heap.alloc( size );
>     System.out.println("alloc size = " + size + " ptr = " + ptr[i] );
>    }
>
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    for( i = 1; i < 19; i+=2 )
>    {
>     size = (short)(i * 10+ 10);
>     System.out.println("free size = " + size + " ptr = " + ptr[i] );
>     heap.free( ptr[i], size );
>     ptr[i] = EOF;
>    }
>
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    for( i = 0; i < 20; i+=2 )
>    {
>     size = (short)(i * 11+ 10);
>     System.out.println("free size = " + size + " ptr = " + ptr[i] );
>     heap.free( ptr[i], size );
>     ptr[i] = EOF;
>    }
>
>    System.out.println("Should have original data free");
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    ptr[0] = heap.alloc( (short)4096);
>    System.out.println("alloc size = " + 4096 + " ptr = " + ptr[0] );
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    ptr[1] = heap.alloc( (short)4092);
>    System.out.println("alloc size = " + 4092 + " ptr = " + ptr[1] );
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    System.out.println("free size = " + 4096 + " ptr = " + ptr[0] );
>    heap.free( ptr[0], (short)4096);
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    ptr[0] = heap.alloc( (short)4096);
>    System.out.println("alloc size = " + 4096 + " ptr = " + ptr[0] );
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    System.out.println("free size = " + 4096 + " ptr = " + ptr[0] );
>    heap.free( ptr[0], (short)4096);
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    ptr[0] = heap.alloc( (short)4092);
>    System.out.println("alloc size = " + 4092 + " ptr = " + ptr[0] );
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    ptr[2] = heap.alloc( (short)4);
>    System.out.println("alloc size = " + 4 + " ptr = " + ptr[2] );
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    heap.erase_all();
>
>    System.out.println("heap erase all");
>
>    System.out.println("Should have original data free");
>    System.out.println("get_free( ) = " + heap.get_free() );
>
>    heap.erase_all();
>
>    System.out.println("heap erase all");
>
>    System.out.println("Should have original data free");
>    System.out.println("get_free( ) = " + heap.get_free() );
>   }
>  }
>*/
>
>}
>
>-----Code sample end ------
>
>I hope my reply was quick enough
>
>Eric Pearson
>
>
>---- Original Message -----
>From: "Aswarth" <[EMAIL PROTECTED]>
>To: "OCF" <[EMAIL PROTECTED]>
>Sent: Wednesday, October 16, 2002 1:29 PM
>Subject: [OCF] How to store a 4kb image in a Java card
>
>
> > Dear All,
> >
> > Can any one let me know if I can store a 4 kb image as a variable in
> > GemXpresso 211 PK IS Java Cards?
> > If possible
> >     1. Is is achieved at the time of Installing the applet?
> >     2. Is the variable set after the applet has already been installed?
> > please let me know how I could achieve this
> >
> > Appreciating your quick reply
> >
> > Thanks and Regards
> > --------------------------------------------------------------------
> > Aswartha Narayana R.
> > Associate Engineer R&D
> > VISIC, CMC Limited
> > Hyderabad  - 500 019
> >
> > Ph: (O) 91- 040 - 3000401/501 ext : 2166
> > http://www.cmcltd.com
> > --------------------------------------------------------------------
> >
> >
> > ---
> > > Visit the OpenCard web site at http://www.opencard.org/ for more
> > > information on OpenCard---binaries, source code, documents.
> > > This list is being archived at http://www.opencard.org/archive/opencard/
> >
> > ! To unsubscribe from the [EMAIL PROTECTED] mailing list send an email
> > ! to
> > !                           [EMAIL PROTECTED]
> > ! containing the word
> > !                           unsubscribe
> > ! in the body.
> >
>
>
>---
> > Visit the OpenCard web site at http://www.opencard.org/ for more
> > information on OpenCard---binaries, source code, documents.
> > This list is being archived at http://www.opencard.org/archive/opencard/
>
>! To unsubscribe from the [EMAIL PROTECTED] mailing list send an email
>! to
>!                           [EMAIL PROTECTED]
>! containing the word
>!                           unsubscribe
>! in the body.


---
> Visit the OpenCard web site at http://www.opencard.org/ for more
> information on OpenCard---binaries, source code, documents.
> This list is being archived at http://www.opencard.org/archive/opencard/

! To unsubscribe from the [EMAIL PROTECTED] mailing list send an email
! to
!                           [EMAIL PROTECTED]
! containing the word
!                           unsubscribe 
! in the body.

Reply via email to