Après un peu de travail, la solution était terminée. Juste quelques précisions avant le code
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).
- 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:
- 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.
ECOperations
La classe doit être ajoutée à un paquet jcardsim. J'ai utilisé le paquet crypto
dans mes sources.
JCECC
La classe doit être ajoutée à un paquet jcardsim. J'ai utilisé un paquet séparé samples.SESPAKE
dans mes sources.
- 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.
Quelle est la question ici? Vous pouvez changer toutes sortes de choses dans jCardSim si vous aimez Java Java avec Java API support –
@PaulBastian, ma faute si cette question n'a pas été explicitement indiquée. Actualisé. –