2016-03-28 10 views
3

Ich möchte SHA-3-Algorithmus auf einer Java-Karte optimieren. Ich brauche einen schnellen Algorithmus, der weniger Speicher verbraucht, was es ermöglicht, byte[] zu short[] (oder kurz [] zu byte[]) zu konvertieren. Meine aktuelle Implementierung sieht wie folgt aus:Schnelle Möglichkeit, Byte [] in Kurz [] auf Java-Karte zu konvertieren

private short[] byteToShort(byte[] b,int len) 
{ 
    short len_conv = (short)(len/2); 
    for (short x = 0; x < len_conv;x++) 
    { 
     for (short j = 0 ; j < 2 ; j++) 
      aux[j] = b[2*x+j]; 
     temp_conv[x] = (short)((((short)aux[1]) & 0xFF) | ((((short)(aux[0]) & 0xFF) << 8))); 
    } 
    return temp_conv; 
} 

wo len tatsächliche Größe des b Array und aux und temp_conv werden als private definiert und zugewiesen, wie:

short[] temp_conv = JCSystem.makeTransientShortArray((short)255,JCSystem.CLEAR_ON_DESELECT); // used during conversion 
byte[] aux = new byte[2]; 

Ich verwende derzeit Java Card v 2.2. 2

+2

Sie könnten versuchen, die Schleife ein wenig Abrollen: https://en.wikipedia.org/wiki/Loop_unrolling – Bill

Antwort

6

Erfinden Sie das Rad nicht neu: Es gibt nützliche integrierte statische Methoden in der Java Card API, die oft aus Gründen der Performance als native Funktionen implementiert sind. Dein Code kann nicht besser sein als sie.

1) Zunächst einmal ist javacardx.framework.util.ArrayLogic.arrayCopyRepackNonAtomic, was Sie brauchen, wenn sie mit einem RAM-Array arbeiten:

ArrayLogic.arrayCopyRepackNonAtomic(b, (short) 0, len, temp_conv, (short) 0); 

Es gibt auch arrayCopyRepack, die für persistente Arrays (die ganze Operation nützlich ist, wird in einer einzigen Transaktion durchgeführt , aber es ist ein bisschen langsamer).


2) Wenn Sie nicht ArrayLogic verwenden können, gibt es immer javacard.framework.Util.getShort, die Sie anstelle der bitweise Magie verwenden können:

private static final void byteToShort(final byte[] bytes, final short blen, final short[] shorts) 
{ 
    short x = 0; 
    short y = 0; 
    for (; y < blen; x++, y += 2) 
    { 
     shorts[x] = Util.getShort(bytes, y); 
    } 
} 

Hinweis gibt es auch setShort, die für short[] nützlich sein könnte byte[] Umwandlung.


3) Einige andere Notizen auf dem Code, falls Sie wirklich umsetzen wollen, es auf eigene Faust:

  • Ihre aux wird im persistenten Speicher gespeichert. Das ist schrecklich langsam und es wird wahrscheinlich Ihre Karte beschädigen, weil aux sehr oft umgeschrieben wird, siehe Symptoms of EEPROM damage.
  • b[2*x+j] ist wegen der langsamen Multiplikation nicht effektiv. Sie sollten stattdessen zwei Schleifenvariablen und nur die Addition verwenden.
  • loswerden aux und die innere Schleife, Sie brauchen sie überhaupt nicht
  • Was ist mit int len? Es gibt keine int in Java Card 2.2.2 ...
+0

Über 'int len': Es gibt' int 'in Java Card 2.2.2 ist es optional. Natürlich ist in diesem Code-Teil die Verwendung von "int" nicht sinnvoll und sollte durch "short" ersetzt werden, um nicht ohne Grund davon abhängig zu sein, ob die Implementierung den optionalen Typ "int" unterstützt oder nicht. –

+0

Um mit dem NVM-Verschleiß fertig zu werden, ist es für mehrere Java-Karten-Betriebssysteme besser, diese Operationen innerhalb einer Transaktion auszuführen. Dann müssen die Zuweisungen nicht mehr atomar sein, sondern können im RAM zwischengespeichert werden, bis die Transaktion abgeschlossen ist. –

Verwandte Themen