-
Notifications
You must be signed in to change notification settings - Fork 4.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Generate SslConnectionInfo.Unix.cs with T4 template (#84690)
* Generate SslConnectionInfo.Unix.cs with T4 template * Try fitting into ushort
- Loading branch information
Showing
7 changed files
with
500 additions
and
3,526 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
378 changes: 370 additions & 8 deletions
378
src/libraries/System.Net.Security/src/System/Net/Security/SslConnectionInfo.Unix.cs
Large diffs are not rendered by default.
Oops, something went wrong.
91 changes: 91 additions & 0 deletions
91
src/libraries/System.Net.Security/src/System/Net/Security/SslConnectionInfo.Unix.tt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
<#@ template debug="false" hostspecific="false" language="C#" #> | ||
<#@ import namespace="System" #> | ||
<#@ assembly name="System.Core" #> | ||
<#@ assembly name="System.Net.Primitives" #> | ||
<#@ import namespace="System.Linq" #> | ||
<#@ import namespace="System.Text" #> | ||
<#@ import namespace="System.Collections.Generic" #> | ||
<#@ output extension=".cs" #> | ||
<#@ include file="TlsCipherSuiteNameParser.ttinclude" #><#@ | ||
include file="TlsCipherSuite.cs" #> | ||
<# Array tlsEnumValues = typeof(TlsCipherSuite).GetEnumValues(); #> | ||
<# Array exchangeEnumValues = typeof(ExchangeAlgorithmTypeIndex).GetEnumValues(); #> | ||
<# Array dataCipherAlgs = typeof(CipherAlgorithmTypeIndex).GetEnumValues(); #> | ||
<# Array dataHashAlgs = typeof(HashAlgorithmTypeIndex).GetEnumValues(); #> | ||
|
||
|
||
using System.Diagnostics; | ||
using System.Security.Authentication; | ||
|
||
namespace System.Net.Security | ||
{ | ||
internal partial struct SslConnectionInfo | ||
{ | ||
private void MapCipherSuite(TlsCipherSuite cipherSuite) | ||
{ | ||
TlsCipherSuite = cipherSuite; | ||
KeyExchKeySize = 0; | ||
ReadOnlySpan<int> keyExchangeAlgs = | ||
new[] { <# | ||
foreach (ExchangeAlgorithmTypeIndex val in exchangeEnumValues) | ||
{ | ||
#>(int)ExchangeAlgorithmType.<#= val #>, <# | ||
} | ||
#>}; | ||
ReadOnlySpan<int> dataCipherAlgs = | ||
new[] { <# | ||
foreach (CipherAlgorithmTypeIndex val in dataCipherAlgs) | ||
{ | ||
#>(int)CipherAlgorithmType.<#= val #>, <# | ||
} | ||
#>}; | ||
<# | ||
ReadOnlySpan<int> strengths = new[] { 0, 40, 56, 128, 168, 256 }; | ||
#> | ||
ReadOnlySpan<int> dataKeySizes = | ||
new[] { <#= string.Join(", ", strengths.ToArray()) #> }; | ||
ReadOnlySpan<int> dataHashAlgs = | ||
new[] { <# | ||
foreach (HashAlgorithmTypeIndex val in dataHashAlgs) | ||
{ | ||
#>(int)HashAlgorithmType.<#= val #>, <# | ||
} | ||
#>}; | ||
ReadOnlySpan<int> dataHashKeySizes = | ||
new[] { 0, 128, 160, 256, 384, 512 }; | ||
|
||
int data = GetPackedData(cipherSuite); | ||
Debug.Assert(data != 0, $"No mapping found for cipherSuite {cipherSuite}"); | ||
|
||
KeyExchangeAlg = keyExchangeAlgs[(data >> 12) & 0xF]; | ||
DataCipherAlg = dataCipherAlgs[(data >> 8) & 0xF]; | ||
DataKeySize = dataKeySizes[(data >> 4) & 0xF]; | ||
DataHashAlg = dataHashAlgs[data & 0xF]; | ||
DataHashKeySize = dataHashKeySizes[data & 0xF]; | ||
|
||
static int GetPackedData(TlsCipherSuite cipherSuite) | ||
{ | ||
switch (cipherSuite) | ||
{ | ||
<# | ||
foreach (TlsCipherSuite val in tlsEnumValues) | ||
{ | ||
TlsCipherSuiteData data = new CipherSuiteNameData(val.ToString()).Data; | ||
int exchangeAlgorithmType = (int)Enum.Parse<ExchangeAlgorithmTypeIndex>(EnumHelpers.ToFrameworkName(data.KeyExchangeAlgorithm)); | ||
int cipherAlgorithmType = (int)Enum.Parse<CipherAlgorithmTypeIndex>(EnumHelpers.ToFrameworkName(data.CipherAlgorithm)); | ||
int cipherAlgorithmStrength = (int)strengths.IndexOf(data.CipherAlgorithmStrength); | ||
int hashAlgorithmType = (int)Enum.Parse<HashAlgorithmTypeIndex>(EnumHelpers.ToFrameworkName(data.MACAlgorithm)); | ||
|
||
if (cipherAlgorithmStrength == -1) | ||
throw new Exception($"Value '{data.CipherAlgorithmStrength}' is not found in 'strengths' array."); | ||
#> | ||
case TlsCipherSuite.<#= val #>: return <#= exchangeAlgorithmType #> << 12 | <#= cipherAlgorithmType #> << 8 | <#= cipherAlgorithmStrength #> << 4 | <#= hashAlgorithmType #>; | ||
<# | ||
} | ||
#> | ||
default: return 0; | ||
} | ||
} | ||
} | ||
} | ||
} |
Oops, something went wrong.