2017-05-30 39 views
3

我正在實施智能卡中間件,我需要爲其添加RSA-PSS簽名方案。我希望我可以覆蓋Crypto ++中的代碼,該代碼負責私鑰操作並免費獲得其他所有內容(PSS和PKCS填充)。我想這個代碼rsa.cpp是我想重寫不同的智能卡什麼:覆蓋智能卡的RSA私鑰操作?

Integer InvertibleRSAFunction::CalculateInverse(RandomNumberGenerator &rng, const Integer &x) const 
{ 
    DoQuickSanityCheck(); 
    ModularArithmetic modn(m_n); 
    Integer r, rInv; 
    do { // do this in a loop for people using small numbers for testing 
     r.Randomize(rng, Integer::One(), m_n - Integer::One()); 
     rInv = modn.MultiplicativeInverse(r); 
    } while (rInv.IsZero()); 
... 

首先,我認爲這可以通過繼承RSA::PrivateKey

class MyPrivKey : public RSA::PrivateKey { 
public: 
    template<typename... Args> 
    MyPrivKey(Args&&... args) : RSA::PrivateKey(std::forward<Args>(args)...) {} 

    Integer CalculateInverse(RandomNumberGenerator &rng, const Integer &x) const override { 
     return ... // do some smart card magic 
    } 
}; 

然後通過這個關鍵signer對象來完成

MyPrivateKey privateKey(params); 

// Signer object 
RSASS<PSS, SHA1>::Signer signer(privateKey); 

但很快我發現,privateKey(模數,私人和公共指數的所有組成部分,等等)只是複製到signer內部。因此重寫RSA::PrivateKey::CalculateInverse並沒有真正的幫助。

然後我迷失在模板裏哭了。我想有0.0001%的機會有人可以幫助我。我會盡我的運氣。

我的例子https://pastebin.com/Nwk4jX0j

+0

是否'Signer'實際*使用*這些值,或者它調用'PrivateKey :: CalculateInverse()'?如果是後者,你可以給它一些假的價值來複制,並在智能卡上做你的私人魔法。無論如何,智能卡是否不帶有合適的庫? –

回答

2

井的全部代碼,我想通了,我需要繼承更多的東西

class SmartCardPrivateKey : public InvertibleRSAFunction { 
public: 
    Integer CalculateInverse(RandomNumberGenerator &rng, const Integer &x) const override { 
    return ... // do smart card magic here 
    } 
}; 

struct SmartCardRSA : public RSA { 
    typedef SmartCardPrivateKey PrivateKey; 
}; 

template <class STANDARD, class H> 
struct SmartCardRSASS : public TF_SS<SmartCardRSA, STANDARD, H> { 
}; 

然後自定義簽名的對象可以構造

SmartCardRSASS<PSS, SHA1>::Signer signer 
+2

@roadmap - 是的,Crypto ++並不總是適用於子類。創建一個像你一樣的新對象通常更容易/最有效。添加德國數字簽名方案(ECGDSA)時,我遇到了幾乎確切的問題。這有一個原因,它的根源在於(1)早期的C++調度問題;和(2)速度和效率。另一件需要注意的事情是嘗試子類... CRYPTOPP_NO_VTABLE。由於對象變平,它可能會導致WIndows出現問題。它在Linux和Unix上沒有定義,所以它可能不是你的問題。 – jww

+0

您使用的是什麼樣的測試臺?我們可能應該編寫關於這個主題的維基頁面。只要不太貴,我很樂意爲我的測試實驗室購買設備。 (對不起,有一個不同的句柄給你打電話,我不確定我在想什麼......)。 – jww