Сертификат смарт-карты Bouncy Castle

Я работаю на Win 7 Professional и C# (VS2010). Мне нужно подписать файл и создать конверт PKCS.
Сертификат, используемый для подписи, находится на смарт-карте USB (я установил CSP поставщика криптографических услуг, предоставленный вместе с смарт-карты).
Это код, который я написал с помощью bouncy Castle.

private byte[] SignData(byte[] DataTosign)
{
    X509Certificate2 card = GetCertificate();
    Org.BouncyCastle.X509.X509Certificate cert = DotNetUtilities.FromX509Certificate(card);

    Org.BouncyCastle.Crypto.AsymmetricKeyParameter K = DotNetUtilities.GetKeyPair(card.PrivateKey).Private;

    CmsSignedDataGenerator generator = new CmsSignedDataGenerator();
    generator.AddSigner(K, cert, CmsSignedDataGenerator.EncryptionRsa, CmsSignedDataGenerator.DigestSha1);

    ArrayList certList = new ArrayList();
    certList.Add(cert);

    Org.BouncyCastle.X509.Store.X509CollectionStoreParameters PP = new Org.BouncyCastle.X509.Store.X509CollectionStoreParameters(certList);
    Org.BouncyCastle.X509.Store.IX509Store st1 = Org.BouncyCastle.X509.Store.X509StoreFactory.Create("CERTIFICATE/COLLECTION", PP);

    generator.AddCertificates(st1);

    CmsSignedData signedData = generator.Generate("1.2.840.113549.1.7.1", new CmsProcessableByteArray(DataTosign), true);  // <- here is the flag

    return signedData.GetEncoded();
}


public static X509Certificate2 GetCertificate()
{
    X509Store st = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    st.Open(OpenFlags.ReadOnly);
    X509Certificate2Collection col = st.Certificates;
    X509Certificate2 card = null;
    X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(col, "Certificates", "Select one to sign", X509SelectionFlag.SingleSelection);
    if (sel.Count > 0)
    {
        X509Certificate2Enumerator en = sel.GetEnumerator();
        en.MoveNext();
        card = en.Current;
    }
    st.Close();
    return card;
}

Проблема в Org.BouncyCastle.Crypto.AsymmetricKeyParameter K = DotNetUtilities.GetKeyPair(card.PrivateKey).Private;, где я получаю

System.Security.Cryptography.CryptographicException (указанный тип сообщения недействителен)

Кажется, проблема в том, что закрытый ключ находится на смарт-карте, но для использования генератора AddSigner я должен передать закрытый ключ. Может ли кто-нибудь помочь мне, как подписать сертификат на смарт-карте?

Большое спасибо!


person G Luca    schedule 20.04.2011    source источник
comment
Старый вопрос с той же проблемой, но нет решения для смарт-карт.   -  person Rup    schedule 20.04.2011
comment
Большое спасибо, но я уже знал этот пост   -  person G Luca    schedule 20.04.2011
comment
Файлы, содержащиеся в этом посте, решают проблему bouncy -castle.1462172.n4.nabble.com/   -  person G Luca    schedule 22.06.2011