| File: System\Security\Cryptography\AsymmetricAlgorithmHelpers.Der.cs | Web Access |
| Project: src\runtime\src\libraries\System.Security.Cryptography\src\System.Security.Cryptography.csproj (System.Security.Cryptography) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; using System.Formats.Asn1; namespace System.Security.Cryptography { // // Common infrastructure for AsymmetricAlgorithm-derived classes that layer on OpenSSL. // internal static partial class AsymmetricAlgorithmHelpers { /// <summary> /// Converts IeeeP1363 format to the specified signature format /// </summary> internal static byte[] ConvertFromIeeeP1363Signature(byte[] signature, DSASignatureFormat targetFormat) { switch (targetFormat) { case DSASignatureFormat.IeeeP1363FixedFieldConcatenation: return signature; case DSASignatureFormat.Rfc3279DerSequence: return ConvertIeee1363ToDer(signature); default: throw new CryptographicException( SR.Cryptography_UnknownSignatureFormat, targetFormat.ToString()); } } /// <summary> /// Converts signature in the specified signature format to IeeeP1363 /// </summary> internal static byte[] ConvertSignatureToIeeeP1363( DSASignatureFormat currentFormat, ReadOnlySpan<byte> signature, int fieldSizeBits) { switch (currentFormat) { case DSASignatureFormat.IeeeP1363FixedFieldConcatenation: return signature.ToArray(); case DSASignatureFormat.Rfc3279DerSequence: return ConvertDerToIeee1363(signature, fieldSizeBits); default: throw new CryptographicException( SR.Cryptography_UnknownSignatureFormat, currentFormat.ToString()); } } internal static byte[]? ConvertSignatureToIeeeP1363( this DSA dsa, DSASignatureFormat currentFormat, ReadOnlySpan<byte> signature, int fieldSizeBits = 0) { try { if (fieldSizeBits == 0) { DSAParameters pars = dsa.ExportParameters(false); fieldSizeBits = pars.Q!.Length * 8; } return ConvertSignatureToIeeeP1363( currentFormat, signature, fieldSizeBits); } catch (CryptographicException) { // This method is used only for verification where we want to return false when signature is // incorrectly formatted. // We do not want to bubble up the exception anywhere. return null; } } internal static byte[]? ConvertSignatureToIeeeP1363( this ECDsa ecdsa, DSASignatureFormat currentFormat, ReadOnlySpan<byte> signature) { try { return ConvertSignatureToIeeeP1363( currentFormat, signature, ecdsa.KeySize); } catch (CryptographicException) { // This method is used only for verification where we want to return false when signature is // incorrectly formatted. // We do not want to bubble up the exception anywhere. return null; } } } }