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

どのような種類のテストリグを使用していますか?おそらく、wikiページをまとめておくべきでしょう。私は、あまりにも高価でない限り、私のテストラボのための機器を買ってうれしいです。 (そしてあなたを別のハンドルで呼ぶことについて申し訳ありません。私は何を考えていたのか分かりません...)。 – jww

関連する問題