Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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));
        }