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.