private static string GetPropertyAsString(SafeBCryptKeyHandle cryptHandle, string propertyName) { Debug.Assert(!cryptHandle.IsInvalid); byte[] value = GetProperty(cryptHandle, propertyName); if (value == null || value.Length == 0) { return(null); } unsafe { fixed(byte *pValue = &value[0]) { string valueAsString = Marshal.PtrToStringUni((IntPtr)pValue); return(valueAsString); } } }
private static ECDsa DecodeECDsaPublicKey(CertificatePal certificatePal) { ECDsa ecdsa; using (SafeBCryptKeyHandle bCryptKeyHandle = ImportPublicKeyInfo(certificatePal.CertContext)) { CngKeyBlobFormat blobFormat; byte[] keyBlob; string curveName = GetCurveName(bCryptKeyHandle); if (curveName == null) { if (HasExplicitParameters(bCryptKeyHandle)) { blobFormat = CngKeyBlobFormat.EccFullPublicBlob; } else { blobFormat = CngKeyBlobFormat.EccPublicBlob; } keyBlob = ExportKeyBlob(bCryptKeyHandle, blobFormat); using (CngKey cngKey = CngKey.Import(keyBlob, blobFormat)) { ecdsa = new ECDsaCng(cngKey); } } else { blobFormat = CngKeyBlobFormat.EccPublicBlob; keyBlob = ExportKeyBlob(bCryptKeyHandle, blobFormat); ECParameters ecparams = new ECParameters(); ExportNamedCurveParameters(ref ecparams, keyBlob, false); ecparams.Curve = ECCurve.CreateFromFriendlyName(curveName); ecdsa = new ECDsaCng(); ecdsa.ImportParameters(ecparams); } } return(ecdsa); }
private static byte[] ExportKeyBlob(SafeBCryptKeyHandle bCryptKeyHandle, CngKeyBlobFormat blobFormat) { string blobFormatString = blobFormat.Format; int numBytesNeeded = 0; NTSTATUS ntStatus = Interop.BCrypt.BCryptExportKey(bCryptKeyHandle, IntPtr.Zero, blobFormatString, null, 0, out numBytesNeeded, 0); if (ntStatus != NTSTATUS.STATUS_SUCCESS) { throw new CryptographicException(Interop.Kernel32.GetMessage((int)ntStatus)); } byte[] keyBlob = new byte[numBytesNeeded]; ntStatus = Interop.BCrypt.BCryptExportKey(bCryptKeyHandle, IntPtr.Zero, blobFormatString, keyBlob, keyBlob.Length, out numBytesNeeded, 0); if (ntStatus != NTSTATUS.STATUS_SUCCESS) { throw new CryptographicException(Interop.Kernel32.GetMessage((int)ntStatus)); } Array.Resize(ref keyBlob, numBytesNeeded); return(keyBlob); }
private static byte[] GetProperty(SafeBCryptKeyHandle cryptHandle, string propertyName) { throw new CryptographicException("Not implemented");; // Debug.Assert(!cryptHandle.IsInvalid); // unsafe // { // int numBytesNeeded; // NTSTATUS errorCode = Interop.BCrypt.BCryptGetProperty(cryptHandle, propertyName, null, 0, out numBytesNeeded, 0); // if (errorCode != NTSTATUS.STATUS_SUCCESS) // return null; // byte[] propertyValue = new byte[numBytesNeeded]; // fixed (byte* pPropertyValue = propertyValue) // { // errorCode = Interop.BCrypt.BCryptGetProperty(cryptHandle, propertyName, pPropertyValue, propertyValue.Length, out numBytesNeeded, 0); // } // if (errorCode != NTSTATUS.STATUS_SUCCESS) // return null; // Array.Resize(ref propertyValue, numBytesNeeded); // return propertyValue; // } }
private static string GetCurveName(SafeBCryptKeyHandle bcryptHandle) { return(GetPropertyAsString(bcryptHandle, BCRYPT_ECC_CURVE_NAME_PROPERTY)); }
private static bool HasExplicitParameters(SafeBCryptKeyHandle bcryptHandle) { byte[] explicitParams = GetProperty(bcryptHandle, BCRYPT_ECC_PARAMETERS_PROPERTY); return(explicitParams != null && explicitParams.Length > 0); }
private static byte[] ExportKeyBlob(SafeBCryptKeyHandle bCryptKeyHandle, CngKeyBlobFormat blobFormat) { #if NETNATIVE // BCryptExportKey() not in the UWP api list. throw new PlatformNotSupportedException(); #else string blobFormatString = blobFormat.Format; int numBytesNeeded = 0; NTSTATUS ntStatus = Interop.BCrypt.BCryptExportKey(bCryptKeyHandle, IntPtr.Zero, blobFormatString, null, 0, out numBytesNeeded, 0); if (ntStatus != NTSTATUS.STATUS_SUCCESS) throw new CryptographicException(Interop.mincore.GetMessage((int)ntStatus)); byte[] keyBlob = new byte[numBytesNeeded]; ntStatus = Interop.BCrypt.BCryptExportKey(bCryptKeyHandle, IntPtr.Zero, blobFormatString, keyBlob, keyBlob.Length, out numBytesNeeded, 0); if (ntStatus != NTSTATUS.STATUS_SUCCESS) throw new CryptographicException(Interop.mincore.GetMessage((int)ntStatus)); Array.Resize(ref keyBlob, numBytesNeeded); return keyBlob; #endif //NETNATIVE }
private static byte[] GetProperty(SafeBCryptKeyHandle cryptHandle, string propertyName) { Debug.Assert(!cryptHandle.IsInvalid); unsafe { int numBytesNeeded; NTSTATUS errorCode = Interop.BCrypt.BCryptGetProperty(cryptHandle, propertyName, null, 0, out numBytesNeeded, 0); if (errorCode != NTSTATUS.STATUS_SUCCESS) return null; byte[] propertyValue = new byte[numBytesNeeded]; fixed (byte* pPropertyValue = propertyValue) { errorCode = Interop.BCrypt.BCryptGetProperty(cryptHandle, propertyName, pPropertyValue, propertyValue.Length, out numBytesNeeded, 0); } if (errorCode != NTSTATUS.STATUS_SUCCESS) return null; Array.Resize(ref propertyValue, numBytesNeeded); return propertyValue; } }
private static string GetPropertyAsString(SafeBCryptKeyHandle cryptHandle, string propertyName) { Debug.Assert(!cryptHandle.IsInvalid); byte[] value = GetProperty(cryptHandle, propertyName); if (value == null || value.Length == 0) return null; unsafe { fixed (byte* pValue = value) { string valueAsString = Marshal.PtrToStringUni((IntPtr)pValue); return valueAsString; } } }
private static string GetCurveName(SafeBCryptKeyHandle bcryptHandle) { return GetPropertyAsString(bcryptHandle, BCRYPT_ECC_CURVE_NAME_PROPERTY); }
private static bool HasExplicitParameters(SafeBCryptKeyHandle bcryptHandle) { byte[] explicitParams = GetProperty(bcryptHandle, BCRYPT_ECC_PARAMETERS_PROPERTY); return (explicitParams != null && explicitParams.Length > 0); }