private CngKey ImportGenericPrivateKey(EcKeyCurveParameters curveParameters, byte[] x, byte[] y, byte[] d) { /* struct BCRYPT_ECCFULLKEY_BLOB * { * ULONG dwMagic; // BCRYPT_ECDSA_PUBLIC_GENERIC_MAGIC or BCRYPT_ECDSA_PRIVATE_GENERIC_MAGIC * BCRYPT_ECC_PARAMETER_HEADER curveParameters; * BYTE Qx[cbFieldLength] // X-coordinate of the public point. * BYTE Qy[cbFieldLength] // Y-coordinate of the public point. * BYTE d[cbSubgroupOrder] // Private key. Zero if only public key is required. * } */ var keyBlob = new byte[curveParameters.KeyBlobSize]; using (var writer = new BinaryWriter(new MemoryStream(keyBlob))) { writer.Write(NativeMethods.BCRYPT_ECDSA_PRIVATE_GENERIC_MAGIC); curveParameters.WriteTo(writer); var size = curveParameters.KeySizeInBytes; AlignAndWrite(writer, x, size, nameof(x)); AlignAndWrite(writer, y, size, nameof(y)); AlignAndWrite(writer, d, size, nameof(d)); } return(CngKey.Import(keyBlob, CngKeyBlobFormat_Generic_Private)); }
private CngKey ImportGenericKey(EcKeyCurveParameters curveParameters, byte[] x, byte[] y, byte[] d) { if (d == null || IsZero(d)) { return(ImportGenericPublicKey(curveParameters, x, y)); } return(ImportGenericPrivateKey(curveParameters, x, y, d)); }