2017-05-30 35 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