Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implmenet EC with X9ECParameters CKA_EC_PARAMS #19

Open
harrison314 opened this issue Jan 18, 2025 · 0 comments
Open

Implmenet EC with X9ECParameters CKA_EC_PARAMS #19

harrison314 opened this issue Jan 18, 2025 · 0 comments

Comments

@harrison314
Copy link
Owner

Implement support for explicit EC parameters for:

  • Generate key pair
  • Import key
  • Sign

Example code for import:

X500DistinguishedName subject = new X500DistinguishedName("CN=Test");
using ECDsa ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256);
 CertificateRequest request = new CertificateRequest(subject, ecdsa, HashAlgorithmName.SHA256);
using X509Certificate2 certificate = request.CreateSelfSigned(DateTime.Now, DateTime.Now.AddDays(2));
byte[] p12Data = certificate.Export(X509ContentType.Pkcs12, "Password");

using MemoryStream ms = new MemoryStream(p12Data);

Org.BouncyCastle.Pkcs.Pkcs12Store st = new Org.BouncyCastle.Pkcs.Pkcs12Store(ms, "Password".ToCharArray());
string? alias = st.Aliases.Cast<string>().FirstOrDefault(p => st.IsKeyEntry(p));
Org.BouncyCastle.Pkcs.X509CertificateEntry keyEntryX = st.GetCertificate(alias);
Org.BouncyCastle.Pkcs.AsymmetricKeyEntry keyEntry = st.GetKey(alias);
ECPrivateKeyParameters ecPrivateKey = (ECPrivateKeyParameters)keyEntry.Key;

using ISession session = slot.OpenSession(SessionType.ReadWrite);

X9ECParameters x9Parameters = new X9ECParameters(ecPrivateKey.Parameters.Curve,
    ecPrivateKey.Parameters.G,
    ecPrivateKey.Parameters.N,
    ecPrivateKey.Parameters.H,
    ecPrivateKey.Parameters.GetSeed());
    
List<IObjectAttribute> privateKeyAttributes = new List<IObjectAttribute>()
{
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY),
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_TOKEN, true),
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_PRIVATE, true),
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_MODIFIABLE, true),
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_SIGN, true),
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_SIGN_RECOVER, false),
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_DECRYPT, true),
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_UNWRAP, true),
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_ID, Encoding.ASCII.GetBytes("test key")),
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_LABEL, "test key"),
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_KEY_TYPE, CKK.CKK_ECDSA),
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_EC_PARAMS, x9Parameters.ToAsn1Object().GetEncoded()),
    session.Factories.ObjectAttributeFactory.Create(CKA.CKA_VALUE, ecPrivateKey.D.ToByteArrayUnsigned())
};
_ = session.CreateObject(privateKeyAttributes);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant