| File: Cng\BCRYPT_KEY_LENGTHS_STRUCT.cs | Web Access |
| Project: src\aspnetcore\src\DataProtection\Cryptography.Internal\src\Microsoft.AspNetCore.Cryptography.Internal.csproj (Microsoft.AspNetCore.Cryptography.Internal) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Runtime.InteropServices; using Microsoft.AspNetCore.Cryptography.Internal; namespace Microsoft.AspNetCore.Cryptography.Cng; // http://msdn.microsoft.com/en-us/library/windows/desktop/aa375525(v=vs.85).aspx [StructLayout(LayoutKind.Sequential)] internal struct BCRYPT_KEY_LENGTHS_STRUCT { // MSDN says these fields represent the key length in bytes. // It's wrong: these key lengths are all actually in bits. internal uint dwMinLength; internal uint dwMaxLength; internal uint dwIncrement; public void EnsureValidKeyLength(uint keyLengthInBits) { if (!IsValidKeyLength(keyLengthInBits)) { string message = Resources.FormatBCRYPT_KEY_LENGTHS_STRUCT_InvalidKeyLength(keyLengthInBits, dwMinLength, dwMaxLength, dwIncrement); throw new ArgumentOutOfRangeException(nameof(keyLengthInBits), message); } CryptoUtil.Assert(keyLengthInBits % 8 == 0, "keyLengthInBits % 8 == 0"); } private bool IsValidKeyLength(uint keyLengthInBits) { // If the step size is zero, then the key length must be exactly the min or the max. Otherwise, // key length must be between min and max (inclusive) and a whole number of increments away from min. if (dwIncrement == 0) { return (keyLengthInBits == dwMinLength || keyLengthInBits == dwMaxLength); } else { return (dwMinLength <= keyLengthInBits) && (keyLengthInBits <= dwMaxLength) && ((keyLengthInBits - dwMinLength) % dwIncrement == 0); } } }