Upload a certificate to a smart card with pkcs11interop

Certificate

Here is an example of loading a certificate to a smartcard / HSM token with the pkcs11interop library.

First, prepare the session...


Pkcs11InteropFactories factories = new();
IPkcs11Library library = factories.Pkcs11LibraryFactory.LoadPkcs11Library(factories, pkcs11Lib, AppType.SingleThreaded);
ISlot slot = library.GetSlotList(SlotsType.WithTokenPresent).FirstOrDefault();
ISession session = slot.OpenSession(SessionType.ReadWrite);
session.Login(CKU.CKU_USER, "....");
IObjectAttributeFactory p11ObjAttrFactory = factories.ObjectAttributeFactory;

Assume we have a certificate in a X509Certificate class of the bouncycastle library:


X509Certificate caCert = ...
string caCertCN = caCert.SubjectDN.GetValueList(X509Name.CN)[0].ToString();

Here is the main part of creating the template for the certificate object:


List<IObjectAttribute> certificateAttributes = new()
{
    p11ObjAttrFactory.Create(CKA.CKA_CLASS, CKO.CKO_CERTIFICATE),
    p11ObjAttrFactory.Create(CKA.CKA_CERTIFICATE_TYPE, CKC.CKC_X_509),
    p11ObjAttrFactory.Create(CKA.CKA_TOKEN, true),
    p11ObjAttrFactory.Create(CKA.CKA_PRIVATE, false),
    p11ObjAttrFactory.Create(CKA.CKA_MODIFIABLE, true),
    p11ObjAttrFactory.Create(CKA.CKA_LABEL, caCertCN),
    p11ObjAttrFactory.Create(CKA.CKA_SUBJECT, caCert.SubjectDN.GetDerEncoded()),
    p11ObjAttrFactory.Create(CKA.CKA_VALUE, caCert.GetEncoded()),
    p11ObjAttrFactory.Create(CKA.CKA_ISSUER, caCert.IssuerDN.GetDerEncoded()),
    p11ObjAttrFactory.Create(CKA.CKA_SERIAL_NUMBER, new DerInteger(caCert.SerialNumber).GetDerEncoded()),

};

// Create certificate object
session.CreateObject(certificateAttributes);

Post a Comment

Previous Post Next Post