2016-01-20 1 views
1

Maintenant, pour javacard 2.2.2, no such emulator prend en charge la manipulation des points de courbe elliptiques.Ajout de la prise en charge de l'API bouncycastle à jCardSim

Cependant, il existe un émulateur nommé jCardSim qui délègue toutes les opérations de chiffrement à la bibliothèque Java Bouncycastle.

Il n'y a aucune indication sur le site officiel de la façon d'ajouter l'API bouncycastle "proxy" afin de l'utiliser dans l'applet émulée.

L'objectif est donc de mettre à jour ceci:

import javacard.framework.*; 
import javacard.security.*; 

à quelque chose comme ceci:

import javacard.framework.*; 
import javacard.security.*; 
import local.org.bouncycastle.math.ec.ECPoint; 

Étant donné que les sources sont librement disponibles, il devrait y avoir un moyen de reconstruire certains émulateur pour fournir le support ECPoint pour mon applet. Bien sûr, toutes ces actions sont nécessaires pour tester l'applet avant de le télécharger sur la carte, qui a le support natif ECPoint.

Donc, la question est: que dois-je corriger pour atteindre la visibilité de l'API bouncycastle dans l'applet en cours d'exécution?

+0

Quelle est la question ici? Vous pouvez changer toutes sortes de choses dans jCardSim si vous aimez Java Java avec Java API support –

+0

@PaulBastian, ma faute si cette question n'a pas été explicitement indiquée. Actualisé. –

Répondre

1

Après un peu de travail, la solution était terminée. Juste quelques précisions avant le code

  1. ECPoint de Bouncycastle ne peut pas être importé "tel quel": deux enveloppes sont nécessaires. Premier exemple: effectuer des tâches de haut niveau telles que la multiplication et l'ajout de points (voir la classe ECOperation). Ensuite, un peu de classe JavaCard pure est nécessaire pour enchaîner une construction de niveau élevé pour un usage de bas niveau (voir la classe JCECC).
  2. Cette solution intégrée ne pouvait pas être plus qu'un environnement de test dans l'émulateur jcardsim. Pour sauvegarder ECPoint pour le périphérique matériel, vous devez remplacer toutes les importations jcardsim par des importations spécifiques au jeton (par exemple import com.licel.jcardsim.SESPAKE.JCECC; par exemple import com.gemalto.javacard.gostservices.math.ECMathFp;) et vous assurer que toutes les fonctions fournies par l'API sont correctement liées dans l'applet. Aussi fichier .exp sera nécessaire pour compiler le fichier .cap pour le périphérique correspondant.

Comment cela fonctionne:

  1. Pour appliquer l'IDE patch devrait être mis en place this manière et dernière version du code source jcardsim doit être retiré de repo.
  2. ECOperations La classe doit être ajoutée à un paquet jcardsim. J'ai utilisé le paquet crypto dans mes sources.
  3. JCECC La classe doit être ajoutée à un paquet jcardsim. J'ai utilisé un paquet séparé samples.SESPAKE dans mes sources.
  4. Ajouter une construction de tests dans l'applet juste pour vérifier toutes les opérations sont ok:

private JCECC jcecc = new JCECC((short) 32); puis quelque part dans process()

jcecc.generatePointData(); 
jcecc.multiplyBasepoint(); 
byte[] Qpwx = { (byte) 0x9d,(byte) 0x33,(byte) 0x9b,(byte) 0x33,(byte) 0x96,(byte) 0xae,(byte) 0x4a, 
        (byte) 0x81,(byte) 0x63,(byte) 0x88,(byte) 0xa1,(byte) 0x4c,(byte) 0x79,(byte) 0xab, 
        (byte) 0x3a,(byte) 0x8d,(byte) 0xd4,(byte) 0x95,(byte) 0xfa,(byte) 0x4c,(byte) 0x53, 
        (byte) 0xf0,(byte) 0xd4,(byte) 0x07,(byte) 0x65,(byte) 0x79,(byte) 0x02,(byte) 0x2e, 
        (byte) 0xf2,(byte) 0xaa,(byte) 0xeb,(byte) 0x68 }; 
byte[] Qpwy = { (byte) 0xda,(byte) 0xd9,(byte) 0x14,(byte) 0x82,(byte) 0xe2,(byte) 0x08,(byte) 0x59, 
        (byte) 0x0f,(byte) 0xd3,(byte) 0x16,(byte) 0xbf,(byte) 0x95,(byte) 0x94,(byte) 0x80, 
        (byte) 0xf5, (byte)0xec,(byte) 0x2c,(byte) 0x17,(byte) 0x46,(byte) 0x3e,(byte) 0xc8, 
        (byte) 0xfc,(byte) 0x8f,(byte) 0x63,(byte) 0x03,(byte) 0x06,(byte) 0x49,(byte) 0xb4, 
        (byte) 0x52,(byte) 0xcd,(byte) 0xdd,(byte) 0xa8 }; 
jcecc.addPoints(jcecc.Qx, jcecc.Qy, Qpwx, Qpwy); 
Qpwx = jcecc.getRx(); 
Qpwy = jcecc.getRy(); 

Sidenote

Tous ces efforts pourraient regarder vraiment excessif: celui qui a besoin de ce genre de choses quand il y a support ECDH sur la carte? Malheureusement, parfois, la manipulation directe avec EC poitns est le seul moyen d'implémenter des protocoles comme SESPAKE dans JavaCard.


Les commentaires sont les bienvenus.

1

Vous ne devriez pas faire cela. Même si cela est possible, vous vous attendez à ce que votre Java Card ne gère pas le type de base int. De plus, l'API Bouncy peut très bien créer des objets, s'attendre à des paramètres byte[] et faire toutes sortes de choses qui ne sont pas compatibles avec l'idée de Java Card (classique). A la place, vous devez implémenter ou étendre l'API Java Card pour la fonctionnalité requise, puis utiliser Bouncy Castle pour la sauvegarder.

+0

Quelque chose manque à ma réponse, im_infamous? –

+0

Problème résolu. Thnx pour l'inspiration, j'ai essayé de mettre en œuvre tout ce que vous avez écrit. –

1

Une implémentation Open Source de ECPoint basée uniquement sur l'API publique javacard (aucune API propriétaire propriétaire) est disponible dans la bibliothèque JCMathLib (avec Bignat et (Big-) Integer). JCMathLib fonctionne à la fois sur de vraies cartes (nécessite un support EC natif KeyPair.ALG_EC_FP) ainsi que directement dans le simulateur JCardSim (aucune API non standard n'étant requise). L'inconvénient potentiel est une performance plus lente pour certaines opérations par rapport à l'API propriétaire et une résilience inférieure aux attaques par canal latéral et par induction de pannes.

L'avantage est la portabilité entre les cartes de différents fournisseurs et la possibilité d'utiliser le simulateur JCardSim au lieu du propriétaire.