2016-01-20 55 views
1

現在對於javacard 2.2.2,有支持橢圓曲線點操作的no such emulator將對bouncycastle API的支持添加到jCardSim中

但是,有一個名爲jCardSim的仿真器將所有加密操作委託給Bouncycastle java庫。

在官方網站上沒有關於如何添加「proxy」bouncycastle API以便在模擬的applet中使用它的線索。

因此我們的目標是升級這樣的:

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

到這樣的事情:

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

由於來源是免費提供的,應該有重建某些仿真器以一種方式爲我的小程序提供ECPoint支持。當然,所有這些操作都是在上傳到卡之前進行小程序測試所必需的,該卡具有原生ECPoint支持。

所以,問題是:爲了實現運行applet中的bouncycastle API的可見性,我應該修補哪些內容?

+0

實際上這裏的問題是什麼?如果你喜歡Java的API支持JavaCard API的話,你可以在jCardSim中更改各種各樣的東西 –

+0

@PaulBastian,那個問題沒有明確說明。更新。 –

回答

1

經過一些工作,解決方案就完成了。代碼

  1. ECPoint之前,從BouncyCastle的短短几年澄清無法導入「原樣」:有需要兩個包裝。第一個 - 執行點乘法和加法等高級任務(請參閱ECOperation類)。其次 - 爲了低層次使用包裝高層次的構造,請使用一些純JavaCard類(請參閱JCECC類)。
  2. 此集成解決方案不能超過jcardsim仿真器中的測試環境。爲了備份硬件設備的ECPoint,需要使用特定於令牌的導入(即import com.licel.jcardsim.SESPAKE.JCECC;,例如import com.gemalto.javacard.gostservices.math.ECMathFp;)來替換所有jcardsim導入,並確保所有API提供的功能都在applet中正確綁定。還需要.exp文件來編譯相應設備的.cap文件。

這是如何工作:

  1. 爲了打補丁,IDE應設立this方式最新jcardsim源代碼版本應該repo拉出。
  2. ECOperations類應添加到一些jcardsim包。我在源中使用了crypto包。
  3. JCECC類應該添加到一些jcardsim包。我在源代碼中使用了單獨的samples.SESPAKE包。
  4. 添加一些測試結構中的小程序,只是爲了驗證所有的操作都OK:

private JCECC jcecc = new JCECC((short) 32);,然後在某處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(); 

旁註

所有這些努力可能看起來真的太過分了:誰在需要的時候需要這些東西卡上ECDH支持?不幸的是,有時使用EC poitns進行直接操作是實現JavaCard中的SESPAKE等協議的唯一方式。


歡迎任何反饋。

1

你不應該這樣做。即使可能,你也會期望你的Java卡不能處理基本類型int。此外,Bouncy API可能會創建對象,期望參數以及各種與Java Card(經典)思想不兼容的內容。

相反,您應該實現或擴展所需功能的Java Card API,然後使用Bouncy Castle進行備份。

+0

從我的回答中找不到任何東西,im_infamous? –

+0

問題已解決。 thnx的靈感,我試圖實現你所寫的一切。 –

1

作爲JCMathLib庫(與Bignat和(Big-)Integer一起)的一部分,僅基於公共javacard API(無供應商專有API)的ECPoint的開源實現可用。 JCMathLib既可以在真實卡上運行(需要本地EC支持KeyPair.ALG_EC_FP),也可以直接在JCardSim模擬器內運行(因爲不需要非標準API)。

與供應商專有API相比,潛在的缺點是某些操作的性能較低,並且對側通道和故障誘導攻擊的彈性較低。

優點是來自不同供應商的卡之間的可移植性以及使用JCardSim模擬器代替專有卡的可能性。