diff --git a/modules/openapi-generator/src/main/resources/csharp-netcore/HttpSigningConfiguration.mustache b/modules/openapi-generator/src/main/resources/csharp-netcore/HttpSigningConfiguration.mustache index aa788ad62244..f80e584c6663 100644 --- a/modules/openapi-generator/src/main/resources/csharp-netcore/HttpSigningConfiguration.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-netcore/HttpSigningConfiguration.mustache @@ -1,3 +1,5 @@ +{{>partial_header}} + using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; @@ -82,7 +84,7 @@ namespace {{packageName}}.Client /// HTTP method /// Path /// Request options - /// + /// Http signed headers internal Dictionary GetHttpSignedHeader(string basePath,string method, string path, RequestOptions requestOptions) { const string HEADER_REQUEST_TARGET = "(request-target)"; @@ -133,7 +135,7 @@ namespace {{packageName}}.Client } else { - httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); + httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); } #else if (parameter.Value.Count > 1) @@ -178,7 +180,6 @@ namespace {{packageName}}.Client throw new Exception(string.Format("{0} not supported", HashAlgorithm)); } - foreach (var header in HttpSigningHeader) { if (header.Equals(HEADER_REQUEST_TARGET)) @@ -236,7 +237,6 @@ namespace {{packageName}}.Client foreach (var keyVal in HttpSignatureHeader) { headerValuesList.Add(string.Format("{0}: {1}", keyVal.Key, keyVal.Value)); - } //Concatenate headers value separated by new line var headerValuesString = string.Join("\n", headerValuesList); @@ -252,7 +252,11 @@ namespace {{packageName}}.Client { headerSignatureStr = GetECDSASignature(signatureStringHash); } - var cryptographicScheme = "hs2019"; + else + { + throw new Exception(string.Format("Private key type {0} not supported", keyType)); + } + const string cryptographicScheme = "hs2019"; var authorizationHeaderValue = string.Format("Signature keyId=\"{0}\",algorithm=\"{1}\"", KeyId, cryptographicScheme); @@ -268,9 +272,7 @@ namespace {{packageName}}.Client authorizationHeaderValue += string.Format(",headers=\"{0}\",signature=\"{1}\"", headersKeysString, headerSignatureStr); - HttpSignedRequestHeader.Add(HEADER_AUTHORIZATION, authorizationHeaderValue); - return HttpSignedRequestHeader; } @@ -302,14 +304,17 @@ namespace {{packageName}}.Client var signedbytes = rsa.SignHash(stringToSign, HashAlgorithm, RSASignaturePadding.Pkcs1); return Convert.ToBase64String(signedbytes); } - return string.Empty; + else + { + return string.Empty; + } } /// /// Gets the ECDSA signature /// /// - /// + /// ECDSA signature private string GetECDSASignature(byte[] dataToSign) { if (!File.Exists(KeyFilePath)) @@ -317,8 +322,8 @@ namespace {{packageName}}.Client throw new Exception("key file path does not exist."); } - var ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; - var ecKeyFooter = "-----END EC PRIVATE KEY-----"; + const string ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; + const string ecKeyFooter = "-----END EC PRIVATE KEY-----"; var keyStr = File.ReadAllText(KeyFilePath); var ecKeyBase64String = keyStr.Replace(ecKeyHeader, "").Replace(ecKeyFooter, "").Trim(); var keyBytes = System.Convert.FromBase64String(ecKeyBase64String); @@ -355,10 +360,9 @@ namespace {{packageName}}.Client #else throw new Exception("ECDSA signing is supported only on NETCOREAPP3_0 and above"); #endif - } - private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) + private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) { var derBytes = new List(); byte derLength = 68; //default length for ECDSA code signing bit 0x44 @@ -481,7 +485,7 @@ namespace {{packageName}}.Client byte[] salt = new byte[saltstr.Length / 2]; for (int i = 0; i < salt.Length; i++) salt[i] = Convert.ToByte(saltstr.Substring(i * 2, 2), 16); - if (!(str.ReadLine() == "")) + if (str.ReadLine() != "") { return null; } @@ -512,7 +516,7 @@ namespace {{packageName}}.Client private RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey) { - byte[] MODULUS, E, D, P, Q, DP, DQ, IQ; + byte[] bytesModulus, bytesE, bytesD, bytesP, bytesQ, bytesDP, bytesDQ, bytesIQ; // --------- Set up stream to decode the asn.1 encoded RSA private key ------ MemoryStream mem = new MemoryStream(privkey); @@ -549,40 +553,40 @@ namespace {{packageName}}.Client //------ all private key components are Integer sequences ---- elems = GetIntegerSize(binr); - MODULUS = binr.ReadBytes(elems); + bytesModulus = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - E = binr.ReadBytes(elems); + bytesE = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - D = binr.ReadBytes(elems); + bytesD = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - P = binr.ReadBytes(elems); + bytesP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - Q = binr.ReadBytes(elems); + bytesQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DP = binr.ReadBytes(elems); + bytesDP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DQ = binr.ReadBytes(elems); + bytesDQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - IQ = binr.ReadBytes(elems); + bytesIQ = binr.ReadBytes(elems); // ------- create RSACryptoServiceProvider instance and initialize with public key ----- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSAParameters RSAparams = new RSAParameters(); - RSAparams.Modulus = MODULUS; - RSAparams.Exponent = E; - RSAparams.D = D; - RSAparams.P = P; - RSAparams.Q = Q; - RSAparams.DP = DP; - RSAparams.DQ = DQ; - RSAparams.InverseQ = IQ; + RSAparams.Modulus = bytesModulus; + RSAparams.Exponent = bytesE; + RSAparams.D = bytesD; + RSAparams.P = bytesP; + RSAparams.Q = bytesQ; + RSAparams.DP = bytesDP; + RSAparams.DQ = bytesDQ; + RSAparams.InverseQ = bytesIQ; RSA.ImportParameters(RSAparams); return RSA; } @@ -637,7 +641,7 @@ namespace {{packageName}}.Client private byte[] GetEncryptedKey(byte[] salt, SecureString secpswd, int count, int miter) { IntPtr unmanagedPswd = IntPtr.Zero; - int HASHLENGTH = 16; //MD5 bytes + const int HASHLENGTH = 16; //MD5 bytes byte[] keymaterial = new byte[HASHLENGTH * miter]; //to store concatenated Mi hashed results byte[] psbytes = new byte[secpswd.Length]; @@ -670,7 +674,9 @@ namespace {{packageName}}.Client } for (int i = 0; i < count; i++) + { result = md5.ComputeHash(result); + } Array.Copy(result, 0, keymaterial, j * HASHLENGTH, result.Length); //concatenate to keymaterial } byte[] deskey = new byte[24]; @@ -708,7 +714,7 @@ namespace {{packageName}}.Client /// Detect the key type from the pem file. /// /// key file path in pem format - /// + /// Private Key Type private PrivateKeyType GetKeyType(string keyFilePath) { if (!File.Exists(keyFilePath)) @@ -716,39 +722,37 @@ namespace {{packageName}}.Client throw new Exception("Key file path does not exist."); } - var ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; - var ecPrivateKeyFooter = "END EC PRIVATE KEY"; - var rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; - var rsaPrivateFooter = "END RSA PRIVATE KEY"; + const string ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; + const string ecPrivateKeyFooter = "END EC PRIVATE KEY"; + const string rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; + const string rsaPrivateFooter = "END RSA PRIVATE KEY"; //var pkcs8Header = "BEGIN PRIVATE KEY"; //var pkcs8Footer = "END PRIVATE KEY"; - var keyType = PrivateKeyType.None; + PrivateKeyType keyType; var key = File.ReadAllLines(keyFilePath); - if (key[0].ToString().Contains(rsaPrivateKeyHeader) && + if (key[0].Contains(rsaPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(rsaPrivateFooter)) { keyType = PrivateKeyType.RSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { keyType = PrivateKeyType.ECDSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { - /* this type of key can hold many type different types of private key, but here due lack of pem header - Considering this as EC key - */ + // this type of key can hold many type different types of private key, but here due lack of pem header + // Considering this as EC key //TODO :- update the key based on oid keyType = PrivateKeyType.ECDSA; } else { throw new Exception("Either the key is invalid or key is not supported"); - } return keyType; } diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs index 9293bc51d32d..f3eaf3c5ade3 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs @@ -1,3 +1,13 @@ +/* + * OpenAPI Petstore + * + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * The version of the OpenAPI document: 1.0.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; @@ -82,7 +92,7 @@ namespace Org.OpenAPITools.Client /// HTTP method /// Path /// Request options - /// + /// Http signed headers internal Dictionary GetHttpSignedHeader(string basePath,string method, string path, RequestOptions requestOptions) { const string HEADER_REQUEST_TARGET = "(request-target)"; @@ -133,7 +143,7 @@ namespace Org.OpenAPITools.Client } else { - httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); + httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); } #else if (parameter.Value.Count > 1) @@ -178,7 +188,6 @@ namespace Org.OpenAPITools.Client throw new Exception(string.Format("{0} not supported", HashAlgorithm)); } - foreach (var header in HttpSigningHeader) { if (header.Equals(HEADER_REQUEST_TARGET)) @@ -236,7 +245,6 @@ namespace Org.OpenAPITools.Client foreach (var keyVal in HttpSignatureHeader) { headerValuesList.Add(string.Format("{0}: {1}", keyVal.Key, keyVal.Value)); - } //Concatenate headers value separated by new line var headerValuesString = string.Join("\n", headerValuesList); @@ -252,7 +260,11 @@ namespace Org.OpenAPITools.Client { headerSignatureStr = GetECDSASignature(signatureStringHash); } - var cryptographicScheme = "hs2019"; + else + { + throw new Exception(string.Format("Private key type {0} not supported", keyType)); + } + const string cryptographicScheme = "hs2019"; var authorizationHeaderValue = string.Format("Signature keyId=\"{0}\",algorithm=\"{1}\"", KeyId, cryptographicScheme); @@ -268,9 +280,7 @@ namespace Org.OpenAPITools.Client authorizationHeaderValue += string.Format(",headers=\"{0}\",signature=\"{1}\"", headersKeysString, headerSignatureStr); - HttpSignedRequestHeader.Add(HEADER_AUTHORIZATION, authorizationHeaderValue); - return HttpSignedRequestHeader; } @@ -302,14 +312,17 @@ namespace Org.OpenAPITools.Client var signedbytes = rsa.SignHash(stringToSign, HashAlgorithm, RSASignaturePadding.Pkcs1); return Convert.ToBase64String(signedbytes); } - return string.Empty; + else + { + return string.Empty; + } } /// /// Gets the ECDSA signature /// /// - /// + /// ECDSA signature private string GetECDSASignature(byte[] dataToSign) { if (!File.Exists(KeyFilePath)) @@ -317,8 +330,8 @@ namespace Org.OpenAPITools.Client throw new Exception("key file path does not exist."); } - var ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; - var ecKeyFooter = "-----END EC PRIVATE KEY-----"; + const string ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; + const string ecKeyFooter = "-----END EC PRIVATE KEY-----"; var keyStr = File.ReadAllText(KeyFilePath); var ecKeyBase64String = keyStr.Replace(ecKeyHeader, "").Replace(ecKeyFooter, "").Trim(); var keyBytes = System.Convert.FromBase64String(ecKeyBase64String); @@ -355,10 +368,9 @@ namespace Org.OpenAPITools.Client #else throw new Exception("ECDSA signing is supported only on NETCOREAPP3_0 and above"); #endif - } - private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) + private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) { var derBytes = new List(); byte derLength = 68; //default length for ECDSA code signing bit 0x44 @@ -481,7 +493,7 @@ namespace Org.OpenAPITools.Client byte[] salt = new byte[saltstr.Length / 2]; for (int i = 0; i < salt.Length; i++) salt[i] = Convert.ToByte(saltstr.Substring(i * 2, 2), 16); - if (!(str.ReadLine() == "")) + if (str.ReadLine() != "") { return null; } @@ -512,7 +524,7 @@ namespace Org.OpenAPITools.Client private RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey) { - byte[] MODULUS, E, D, P, Q, DP, DQ, IQ; + byte[] bytesModulus, bytesE, bytesD, bytesP, bytesQ, bytesDP, bytesDQ, bytesIQ; // --------- Set up stream to decode the asn.1 encoded RSA private key ------ MemoryStream mem = new MemoryStream(privkey); @@ -549,40 +561,40 @@ namespace Org.OpenAPITools.Client //------ all private key components are Integer sequences ---- elems = GetIntegerSize(binr); - MODULUS = binr.ReadBytes(elems); + bytesModulus = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - E = binr.ReadBytes(elems); + bytesE = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - D = binr.ReadBytes(elems); + bytesD = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - P = binr.ReadBytes(elems); + bytesP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - Q = binr.ReadBytes(elems); + bytesQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DP = binr.ReadBytes(elems); + bytesDP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DQ = binr.ReadBytes(elems); + bytesDQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - IQ = binr.ReadBytes(elems); + bytesIQ = binr.ReadBytes(elems); // ------- create RSACryptoServiceProvider instance and initialize with public key ----- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSAParameters RSAparams = new RSAParameters(); - RSAparams.Modulus = MODULUS; - RSAparams.Exponent = E; - RSAparams.D = D; - RSAparams.P = P; - RSAparams.Q = Q; - RSAparams.DP = DP; - RSAparams.DQ = DQ; - RSAparams.InverseQ = IQ; + RSAparams.Modulus = bytesModulus; + RSAparams.Exponent = bytesE; + RSAparams.D = bytesD; + RSAparams.P = bytesP; + RSAparams.Q = bytesQ; + RSAparams.DP = bytesDP; + RSAparams.DQ = bytesDQ; + RSAparams.InverseQ = bytesIQ; RSA.ImportParameters(RSAparams); return RSA; } @@ -637,7 +649,7 @@ namespace Org.OpenAPITools.Client private byte[] GetEncryptedKey(byte[] salt, SecureString secpswd, int count, int miter) { IntPtr unmanagedPswd = IntPtr.Zero; - int HASHLENGTH = 16; //MD5 bytes + const int HASHLENGTH = 16; //MD5 bytes byte[] keymaterial = new byte[HASHLENGTH * miter]; //to store concatenated Mi hashed results byte[] psbytes = new byte[secpswd.Length]; @@ -670,7 +682,9 @@ namespace Org.OpenAPITools.Client } for (int i = 0; i < count; i++) + { result = md5.ComputeHash(result); + } Array.Copy(result, 0, keymaterial, j * HASHLENGTH, result.Length); //concatenate to keymaterial } byte[] deskey = new byte[24]; @@ -708,7 +722,7 @@ namespace Org.OpenAPITools.Client /// Detect the key type from the pem file. /// /// key file path in pem format - /// + /// Private Key Type private PrivateKeyType GetKeyType(string keyFilePath) { if (!File.Exists(keyFilePath)) @@ -716,39 +730,37 @@ namespace Org.OpenAPITools.Client throw new Exception("Key file path does not exist."); } - var ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; - var ecPrivateKeyFooter = "END EC PRIVATE KEY"; - var rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; - var rsaPrivateFooter = "END RSA PRIVATE KEY"; + const string ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; + const string ecPrivateKeyFooter = "END EC PRIVATE KEY"; + const string rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; + const string rsaPrivateFooter = "END RSA PRIVATE KEY"; //var pkcs8Header = "BEGIN PRIVATE KEY"; //var pkcs8Footer = "END PRIVATE KEY"; - var keyType = PrivateKeyType.None; + PrivateKeyType keyType; var key = File.ReadAllLines(keyFilePath); - if (key[0].ToString().Contains(rsaPrivateKeyHeader) && + if (key[0].Contains(rsaPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(rsaPrivateFooter)) { keyType = PrivateKeyType.RSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { keyType = PrivateKeyType.ECDSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { - /* this type of key can hold many type different types of private key, but here due lack of pem header - Considering this as EC key - */ + // this type of key can hold many type different types of private key, but here due lack of pem header + // Considering this as EC key //TODO :- update the key based on oid keyType = PrivateKeyType.ECDSA; } else { throw new Exception("Either the key is invalid or key is not supported"); - } return keyType; } diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-httpclient/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient-httpclient/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs index 9293bc51d32d..f3eaf3c5ade3 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-httpclient/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-httpclient/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs @@ -1,3 +1,13 @@ +/* + * OpenAPI Petstore + * + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * The version of the OpenAPI document: 1.0.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; @@ -82,7 +92,7 @@ namespace Org.OpenAPITools.Client /// HTTP method /// Path /// Request options - /// + /// Http signed headers internal Dictionary GetHttpSignedHeader(string basePath,string method, string path, RequestOptions requestOptions) { const string HEADER_REQUEST_TARGET = "(request-target)"; @@ -133,7 +143,7 @@ namespace Org.OpenAPITools.Client } else { - httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); + httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); } #else if (parameter.Value.Count > 1) @@ -178,7 +188,6 @@ namespace Org.OpenAPITools.Client throw new Exception(string.Format("{0} not supported", HashAlgorithm)); } - foreach (var header in HttpSigningHeader) { if (header.Equals(HEADER_REQUEST_TARGET)) @@ -236,7 +245,6 @@ namespace Org.OpenAPITools.Client foreach (var keyVal in HttpSignatureHeader) { headerValuesList.Add(string.Format("{0}: {1}", keyVal.Key, keyVal.Value)); - } //Concatenate headers value separated by new line var headerValuesString = string.Join("\n", headerValuesList); @@ -252,7 +260,11 @@ namespace Org.OpenAPITools.Client { headerSignatureStr = GetECDSASignature(signatureStringHash); } - var cryptographicScheme = "hs2019"; + else + { + throw new Exception(string.Format("Private key type {0} not supported", keyType)); + } + const string cryptographicScheme = "hs2019"; var authorizationHeaderValue = string.Format("Signature keyId=\"{0}\",algorithm=\"{1}\"", KeyId, cryptographicScheme); @@ -268,9 +280,7 @@ namespace Org.OpenAPITools.Client authorizationHeaderValue += string.Format(",headers=\"{0}\",signature=\"{1}\"", headersKeysString, headerSignatureStr); - HttpSignedRequestHeader.Add(HEADER_AUTHORIZATION, authorizationHeaderValue); - return HttpSignedRequestHeader; } @@ -302,14 +312,17 @@ namespace Org.OpenAPITools.Client var signedbytes = rsa.SignHash(stringToSign, HashAlgorithm, RSASignaturePadding.Pkcs1); return Convert.ToBase64String(signedbytes); } - return string.Empty; + else + { + return string.Empty; + } } /// /// Gets the ECDSA signature /// /// - /// + /// ECDSA signature private string GetECDSASignature(byte[] dataToSign) { if (!File.Exists(KeyFilePath)) @@ -317,8 +330,8 @@ namespace Org.OpenAPITools.Client throw new Exception("key file path does not exist."); } - var ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; - var ecKeyFooter = "-----END EC PRIVATE KEY-----"; + const string ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; + const string ecKeyFooter = "-----END EC PRIVATE KEY-----"; var keyStr = File.ReadAllText(KeyFilePath); var ecKeyBase64String = keyStr.Replace(ecKeyHeader, "").Replace(ecKeyFooter, "").Trim(); var keyBytes = System.Convert.FromBase64String(ecKeyBase64String); @@ -355,10 +368,9 @@ namespace Org.OpenAPITools.Client #else throw new Exception("ECDSA signing is supported only on NETCOREAPP3_0 and above"); #endif - } - private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) + private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) { var derBytes = new List(); byte derLength = 68; //default length for ECDSA code signing bit 0x44 @@ -481,7 +493,7 @@ namespace Org.OpenAPITools.Client byte[] salt = new byte[saltstr.Length / 2]; for (int i = 0; i < salt.Length; i++) salt[i] = Convert.ToByte(saltstr.Substring(i * 2, 2), 16); - if (!(str.ReadLine() == "")) + if (str.ReadLine() != "") { return null; } @@ -512,7 +524,7 @@ namespace Org.OpenAPITools.Client private RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey) { - byte[] MODULUS, E, D, P, Q, DP, DQ, IQ; + byte[] bytesModulus, bytesE, bytesD, bytesP, bytesQ, bytesDP, bytesDQ, bytesIQ; // --------- Set up stream to decode the asn.1 encoded RSA private key ------ MemoryStream mem = new MemoryStream(privkey); @@ -549,40 +561,40 @@ namespace Org.OpenAPITools.Client //------ all private key components are Integer sequences ---- elems = GetIntegerSize(binr); - MODULUS = binr.ReadBytes(elems); + bytesModulus = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - E = binr.ReadBytes(elems); + bytesE = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - D = binr.ReadBytes(elems); + bytesD = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - P = binr.ReadBytes(elems); + bytesP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - Q = binr.ReadBytes(elems); + bytesQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DP = binr.ReadBytes(elems); + bytesDP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DQ = binr.ReadBytes(elems); + bytesDQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - IQ = binr.ReadBytes(elems); + bytesIQ = binr.ReadBytes(elems); // ------- create RSACryptoServiceProvider instance and initialize with public key ----- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSAParameters RSAparams = new RSAParameters(); - RSAparams.Modulus = MODULUS; - RSAparams.Exponent = E; - RSAparams.D = D; - RSAparams.P = P; - RSAparams.Q = Q; - RSAparams.DP = DP; - RSAparams.DQ = DQ; - RSAparams.InverseQ = IQ; + RSAparams.Modulus = bytesModulus; + RSAparams.Exponent = bytesE; + RSAparams.D = bytesD; + RSAparams.P = bytesP; + RSAparams.Q = bytesQ; + RSAparams.DP = bytesDP; + RSAparams.DQ = bytesDQ; + RSAparams.InverseQ = bytesIQ; RSA.ImportParameters(RSAparams); return RSA; } @@ -637,7 +649,7 @@ namespace Org.OpenAPITools.Client private byte[] GetEncryptedKey(byte[] salt, SecureString secpswd, int count, int miter) { IntPtr unmanagedPswd = IntPtr.Zero; - int HASHLENGTH = 16; //MD5 bytes + const int HASHLENGTH = 16; //MD5 bytes byte[] keymaterial = new byte[HASHLENGTH * miter]; //to store concatenated Mi hashed results byte[] psbytes = new byte[secpswd.Length]; @@ -670,7 +682,9 @@ namespace Org.OpenAPITools.Client } for (int i = 0; i < count; i++) + { result = md5.ComputeHash(result); + } Array.Copy(result, 0, keymaterial, j * HASHLENGTH, result.Length); //concatenate to keymaterial } byte[] deskey = new byte[24]; @@ -708,7 +722,7 @@ namespace Org.OpenAPITools.Client /// Detect the key type from the pem file. /// /// key file path in pem format - /// + /// Private Key Type private PrivateKeyType GetKeyType(string keyFilePath) { if (!File.Exists(keyFilePath)) @@ -716,39 +730,37 @@ namespace Org.OpenAPITools.Client throw new Exception("Key file path does not exist."); } - var ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; - var ecPrivateKeyFooter = "END EC PRIVATE KEY"; - var rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; - var rsaPrivateFooter = "END RSA PRIVATE KEY"; + const string ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; + const string ecPrivateKeyFooter = "END EC PRIVATE KEY"; + const string rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; + const string rsaPrivateFooter = "END RSA PRIVATE KEY"; //var pkcs8Header = "BEGIN PRIVATE KEY"; //var pkcs8Footer = "END PRIVATE KEY"; - var keyType = PrivateKeyType.None; + PrivateKeyType keyType; var key = File.ReadAllLines(keyFilePath); - if (key[0].ToString().Contains(rsaPrivateKeyHeader) && + if (key[0].Contains(rsaPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(rsaPrivateFooter)) { keyType = PrivateKeyType.RSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { keyType = PrivateKeyType.ECDSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { - /* this type of key can hold many type different types of private key, but here due lack of pem header - Considering this as EC key - */ + // this type of key can hold many type different types of private key, but here due lack of pem header + // Considering this as EC key //TODO :- update the key based on oid keyType = PrivateKeyType.ECDSA; } else { throw new Exception("Either the key is invalid or key is not supported"); - } return keyType; } diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs index 9293bc51d32d..f3eaf3c5ade3 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs @@ -1,3 +1,13 @@ +/* + * OpenAPI Petstore + * + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * The version of the OpenAPI document: 1.0.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; @@ -82,7 +92,7 @@ namespace Org.OpenAPITools.Client /// HTTP method /// Path /// Request options - /// + /// Http signed headers internal Dictionary GetHttpSignedHeader(string basePath,string method, string path, RequestOptions requestOptions) { const string HEADER_REQUEST_TARGET = "(request-target)"; @@ -133,7 +143,7 @@ namespace Org.OpenAPITools.Client } else { - httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); + httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); } #else if (parameter.Value.Count > 1) @@ -178,7 +188,6 @@ namespace Org.OpenAPITools.Client throw new Exception(string.Format("{0} not supported", HashAlgorithm)); } - foreach (var header in HttpSigningHeader) { if (header.Equals(HEADER_REQUEST_TARGET)) @@ -236,7 +245,6 @@ namespace Org.OpenAPITools.Client foreach (var keyVal in HttpSignatureHeader) { headerValuesList.Add(string.Format("{0}: {1}", keyVal.Key, keyVal.Value)); - } //Concatenate headers value separated by new line var headerValuesString = string.Join("\n", headerValuesList); @@ -252,7 +260,11 @@ namespace Org.OpenAPITools.Client { headerSignatureStr = GetECDSASignature(signatureStringHash); } - var cryptographicScheme = "hs2019"; + else + { + throw new Exception(string.Format("Private key type {0} not supported", keyType)); + } + const string cryptographicScheme = "hs2019"; var authorizationHeaderValue = string.Format("Signature keyId=\"{0}\",algorithm=\"{1}\"", KeyId, cryptographicScheme); @@ -268,9 +280,7 @@ namespace Org.OpenAPITools.Client authorizationHeaderValue += string.Format(",headers=\"{0}\",signature=\"{1}\"", headersKeysString, headerSignatureStr); - HttpSignedRequestHeader.Add(HEADER_AUTHORIZATION, authorizationHeaderValue); - return HttpSignedRequestHeader; } @@ -302,14 +312,17 @@ namespace Org.OpenAPITools.Client var signedbytes = rsa.SignHash(stringToSign, HashAlgorithm, RSASignaturePadding.Pkcs1); return Convert.ToBase64String(signedbytes); } - return string.Empty; + else + { + return string.Empty; + } } /// /// Gets the ECDSA signature /// /// - /// + /// ECDSA signature private string GetECDSASignature(byte[] dataToSign) { if (!File.Exists(KeyFilePath)) @@ -317,8 +330,8 @@ namespace Org.OpenAPITools.Client throw new Exception("key file path does not exist."); } - var ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; - var ecKeyFooter = "-----END EC PRIVATE KEY-----"; + const string ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; + const string ecKeyFooter = "-----END EC PRIVATE KEY-----"; var keyStr = File.ReadAllText(KeyFilePath); var ecKeyBase64String = keyStr.Replace(ecKeyHeader, "").Replace(ecKeyFooter, "").Trim(); var keyBytes = System.Convert.FromBase64String(ecKeyBase64String); @@ -355,10 +368,9 @@ namespace Org.OpenAPITools.Client #else throw new Exception("ECDSA signing is supported only on NETCOREAPP3_0 and above"); #endif - } - private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) + private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) { var derBytes = new List(); byte derLength = 68; //default length for ECDSA code signing bit 0x44 @@ -481,7 +493,7 @@ namespace Org.OpenAPITools.Client byte[] salt = new byte[saltstr.Length / 2]; for (int i = 0; i < salt.Length; i++) salt[i] = Convert.ToByte(saltstr.Substring(i * 2, 2), 16); - if (!(str.ReadLine() == "")) + if (str.ReadLine() != "") { return null; } @@ -512,7 +524,7 @@ namespace Org.OpenAPITools.Client private RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey) { - byte[] MODULUS, E, D, P, Q, DP, DQ, IQ; + byte[] bytesModulus, bytesE, bytesD, bytesP, bytesQ, bytesDP, bytesDQ, bytesIQ; // --------- Set up stream to decode the asn.1 encoded RSA private key ------ MemoryStream mem = new MemoryStream(privkey); @@ -549,40 +561,40 @@ namespace Org.OpenAPITools.Client //------ all private key components are Integer sequences ---- elems = GetIntegerSize(binr); - MODULUS = binr.ReadBytes(elems); + bytesModulus = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - E = binr.ReadBytes(elems); + bytesE = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - D = binr.ReadBytes(elems); + bytesD = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - P = binr.ReadBytes(elems); + bytesP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - Q = binr.ReadBytes(elems); + bytesQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DP = binr.ReadBytes(elems); + bytesDP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DQ = binr.ReadBytes(elems); + bytesDQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - IQ = binr.ReadBytes(elems); + bytesIQ = binr.ReadBytes(elems); // ------- create RSACryptoServiceProvider instance and initialize with public key ----- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSAParameters RSAparams = new RSAParameters(); - RSAparams.Modulus = MODULUS; - RSAparams.Exponent = E; - RSAparams.D = D; - RSAparams.P = P; - RSAparams.Q = Q; - RSAparams.DP = DP; - RSAparams.DQ = DQ; - RSAparams.InverseQ = IQ; + RSAparams.Modulus = bytesModulus; + RSAparams.Exponent = bytesE; + RSAparams.D = bytesD; + RSAparams.P = bytesP; + RSAparams.Q = bytesQ; + RSAparams.DP = bytesDP; + RSAparams.DQ = bytesDQ; + RSAparams.InverseQ = bytesIQ; RSA.ImportParameters(RSAparams); return RSA; } @@ -637,7 +649,7 @@ namespace Org.OpenAPITools.Client private byte[] GetEncryptedKey(byte[] salt, SecureString secpswd, int count, int miter) { IntPtr unmanagedPswd = IntPtr.Zero; - int HASHLENGTH = 16; //MD5 bytes + const int HASHLENGTH = 16; //MD5 bytes byte[] keymaterial = new byte[HASHLENGTH * miter]; //to store concatenated Mi hashed results byte[] psbytes = new byte[secpswd.Length]; @@ -670,7 +682,9 @@ namespace Org.OpenAPITools.Client } for (int i = 0; i < count; i++) + { result = md5.ComputeHash(result); + } Array.Copy(result, 0, keymaterial, j * HASHLENGTH, result.Length); //concatenate to keymaterial } byte[] deskey = new byte[24]; @@ -708,7 +722,7 @@ namespace Org.OpenAPITools.Client /// Detect the key type from the pem file. /// /// key file path in pem format - /// + /// Private Key Type private PrivateKeyType GetKeyType(string keyFilePath) { if (!File.Exists(keyFilePath)) @@ -716,39 +730,37 @@ namespace Org.OpenAPITools.Client throw new Exception("Key file path does not exist."); } - var ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; - var ecPrivateKeyFooter = "END EC PRIVATE KEY"; - var rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; - var rsaPrivateFooter = "END RSA PRIVATE KEY"; + const string ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; + const string ecPrivateKeyFooter = "END EC PRIVATE KEY"; + const string rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; + const string rsaPrivateFooter = "END RSA PRIVATE KEY"; //var pkcs8Header = "BEGIN PRIVATE KEY"; //var pkcs8Footer = "END PRIVATE KEY"; - var keyType = PrivateKeyType.None; + PrivateKeyType keyType; var key = File.ReadAllLines(keyFilePath); - if (key[0].ToString().Contains(rsaPrivateKeyHeader) && + if (key[0].Contains(rsaPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(rsaPrivateFooter)) { keyType = PrivateKeyType.RSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { keyType = PrivateKeyType.ECDSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { - /* this type of key can hold many type different types of private key, but here due lack of pem header - Considering this as EC key - */ + // this type of key can hold many type different types of private key, but here due lack of pem header + // Considering this as EC key //TODO :- update the key based on oid keyType = PrivateKeyType.ECDSA; } else { throw new Exception("Either the key is invalid or key is not supported"); - } return keyType; } diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs index 9293bc51d32d..f3eaf3c5ade3 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs @@ -1,3 +1,13 @@ +/* + * OpenAPI Petstore + * + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * The version of the OpenAPI document: 1.0.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; @@ -82,7 +92,7 @@ namespace Org.OpenAPITools.Client /// HTTP method /// Path /// Request options - /// + /// Http signed headers internal Dictionary GetHttpSignedHeader(string basePath,string method, string path, RequestOptions requestOptions) { const string HEADER_REQUEST_TARGET = "(request-target)"; @@ -133,7 +143,7 @@ namespace Org.OpenAPITools.Client } else { - httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); + httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); } #else if (parameter.Value.Count > 1) @@ -178,7 +188,6 @@ namespace Org.OpenAPITools.Client throw new Exception(string.Format("{0} not supported", HashAlgorithm)); } - foreach (var header in HttpSigningHeader) { if (header.Equals(HEADER_REQUEST_TARGET)) @@ -236,7 +245,6 @@ namespace Org.OpenAPITools.Client foreach (var keyVal in HttpSignatureHeader) { headerValuesList.Add(string.Format("{0}: {1}", keyVal.Key, keyVal.Value)); - } //Concatenate headers value separated by new line var headerValuesString = string.Join("\n", headerValuesList); @@ -252,7 +260,11 @@ namespace Org.OpenAPITools.Client { headerSignatureStr = GetECDSASignature(signatureStringHash); } - var cryptographicScheme = "hs2019"; + else + { + throw new Exception(string.Format("Private key type {0} not supported", keyType)); + } + const string cryptographicScheme = "hs2019"; var authorizationHeaderValue = string.Format("Signature keyId=\"{0}\",algorithm=\"{1}\"", KeyId, cryptographicScheme); @@ -268,9 +280,7 @@ namespace Org.OpenAPITools.Client authorizationHeaderValue += string.Format(",headers=\"{0}\",signature=\"{1}\"", headersKeysString, headerSignatureStr); - HttpSignedRequestHeader.Add(HEADER_AUTHORIZATION, authorizationHeaderValue); - return HttpSignedRequestHeader; } @@ -302,14 +312,17 @@ namespace Org.OpenAPITools.Client var signedbytes = rsa.SignHash(stringToSign, HashAlgorithm, RSASignaturePadding.Pkcs1); return Convert.ToBase64String(signedbytes); } - return string.Empty; + else + { + return string.Empty; + } } /// /// Gets the ECDSA signature /// /// - /// + /// ECDSA signature private string GetECDSASignature(byte[] dataToSign) { if (!File.Exists(KeyFilePath)) @@ -317,8 +330,8 @@ namespace Org.OpenAPITools.Client throw new Exception("key file path does not exist."); } - var ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; - var ecKeyFooter = "-----END EC PRIVATE KEY-----"; + const string ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; + const string ecKeyFooter = "-----END EC PRIVATE KEY-----"; var keyStr = File.ReadAllText(KeyFilePath); var ecKeyBase64String = keyStr.Replace(ecKeyHeader, "").Replace(ecKeyFooter, "").Trim(); var keyBytes = System.Convert.FromBase64String(ecKeyBase64String); @@ -355,10 +368,9 @@ namespace Org.OpenAPITools.Client #else throw new Exception("ECDSA signing is supported only on NETCOREAPP3_0 and above"); #endif - } - private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) + private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) { var derBytes = new List(); byte derLength = 68; //default length for ECDSA code signing bit 0x44 @@ -481,7 +493,7 @@ namespace Org.OpenAPITools.Client byte[] salt = new byte[saltstr.Length / 2]; for (int i = 0; i < salt.Length; i++) salt[i] = Convert.ToByte(saltstr.Substring(i * 2, 2), 16); - if (!(str.ReadLine() == "")) + if (str.ReadLine() != "") { return null; } @@ -512,7 +524,7 @@ namespace Org.OpenAPITools.Client private RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey) { - byte[] MODULUS, E, D, P, Q, DP, DQ, IQ; + byte[] bytesModulus, bytesE, bytesD, bytesP, bytesQ, bytesDP, bytesDQ, bytesIQ; // --------- Set up stream to decode the asn.1 encoded RSA private key ------ MemoryStream mem = new MemoryStream(privkey); @@ -549,40 +561,40 @@ namespace Org.OpenAPITools.Client //------ all private key components are Integer sequences ---- elems = GetIntegerSize(binr); - MODULUS = binr.ReadBytes(elems); + bytesModulus = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - E = binr.ReadBytes(elems); + bytesE = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - D = binr.ReadBytes(elems); + bytesD = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - P = binr.ReadBytes(elems); + bytesP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - Q = binr.ReadBytes(elems); + bytesQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DP = binr.ReadBytes(elems); + bytesDP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DQ = binr.ReadBytes(elems); + bytesDQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - IQ = binr.ReadBytes(elems); + bytesIQ = binr.ReadBytes(elems); // ------- create RSACryptoServiceProvider instance and initialize with public key ----- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSAParameters RSAparams = new RSAParameters(); - RSAparams.Modulus = MODULUS; - RSAparams.Exponent = E; - RSAparams.D = D; - RSAparams.P = P; - RSAparams.Q = Q; - RSAparams.DP = DP; - RSAparams.DQ = DQ; - RSAparams.InverseQ = IQ; + RSAparams.Modulus = bytesModulus; + RSAparams.Exponent = bytesE; + RSAparams.D = bytesD; + RSAparams.P = bytesP; + RSAparams.Q = bytesQ; + RSAparams.DP = bytesDP; + RSAparams.DQ = bytesDQ; + RSAparams.InverseQ = bytesIQ; RSA.ImportParameters(RSAparams); return RSA; } @@ -637,7 +649,7 @@ namespace Org.OpenAPITools.Client private byte[] GetEncryptedKey(byte[] salt, SecureString secpswd, int count, int miter) { IntPtr unmanagedPswd = IntPtr.Zero; - int HASHLENGTH = 16; //MD5 bytes + const int HASHLENGTH = 16; //MD5 bytes byte[] keymaterial = new byte[HASHLENGTH * miter]; //to store concatenated Mi hashed results byte[] psbytes = new byte[secpswd.Length]; @@ -670,7 +682,9 @@ namespace Org.OpenAPITools.Client } for (int i = 0; i < count; i++) + { result = md5.ComputeHash(result); + } Array.Copy(result, 0, keymaterial, j * HASHLENGTH, result.Length); //concatenate to keymaterial } byte[] deskey = new byte[24]; @@ -708,7 +722,7 @@ namespace Org.OpenAPITools.Client /// Detect the key type from the pem file. /// /// key file path in pem format - /// + /// Private Key Type private PrivateKeyType GetKeyType(string keyFilePath) { if (!File.Exists(keyFilePath)) @@ -716,39 +730,37 @@ namespace Org.OpenAPITools.Client throw new Exception("Key file path does not exist."); } - var ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; - var ecPrivateKeyFooter = "END EC PRIVATE KEY"; - var rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; - var rsaPrivateFooter = "END RSA PRIVATE KEY"; + const string ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; + const string ecPrivateKeyFooter = "END EC PRIVATE KEY"; + const string rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; + const string rsaPrivateFooter = "END RSA PRIVATE KEY"; //var pkcs8Header = "BEGIN PRIVATE KEY"; //var pkcs8Footer = "END PRIVATE KEY"; - var keyType = PrivateKeyType.None; + PrivateKeyType keyType; var key = File.ReadAllLines(keyFilePath); - if (key[0].ToString().Contains(rsaPrivateKeyHeader) && + if (key[0].Contains(rsaPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(rsaPrivateFooter)) { keyType = PrivateKeyType.RSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { keyType = PrivateKeyType.ECDSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { - /* this type of key can hold many type different types of private key, but here due lack of pem header - Considering this as EC key - */ + // this type of key can hold many type different types of private key, but here due lack of pem header + // Considering this as EC key //TODO :- update the key based on oid keyType = PrivateKeyType.ECDSA; } else { throw new Exception("Either the key is invalid or key is not supported"); - } return keyType; } diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs index 9293bc51d32d..f3eaf3c5ade3 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs @@ -1,3 +1,13 @@ +/* + * OpenAPI Petstore + * + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * The version of the OpenAPI document: 1.0.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; @@ -82,7 +92,7 @@ namespace Org.OpenAPITools.Client /// HTTP method /// Path /// Request options - /// + /// Http signed headers internal Dictionary GetHttpSignedHeader(string basePath,string method, string path, RequestOptions requestOptions) { const string HEADER_REQUEST_TARGET = "(request-target)"; @@ -133,7 +143,7 @@ namespace Org.OpenAPITools.Client } else { - httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); + httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); } #else if (parameter.Value.Count > 1) @@ -178,7 +188,6 @@ namespace Org.OpenAPITools.Client throw new Exception(string.Format("{0} not supported", HashAlgorithm)); } - foreach (var header in HttpSigningHeader) { if (header.Equals(HEADER_REQUEST_TARGET)) @@ -236,7 +245,6 @@ namespace Org.OpenAPITools.Client foreach (var keyVal in HttpSignatureHeader) { headerValuesList.Add(string.Format("{0}: {1}", keyVal.Key, keyVal.Value)); - } //Concatenate headers value separated by new line var headerValuesString = string.Join("\n", headerValuesList); @@ -252,7 +260,11 @@ namespace Org.OpenAPITools.Client { headerSignatureStr = GetECDSASignature(signatureStringHash); } - var cryptographicScheme = "hs2019"; + else + { + throw new Exception(string.Format("Private key type {0} not supported", keyType)); + } + const string cryptographicScheme = "hs2019"; var authorizationHeaderValue = string.Format("Signature keyId=\"{0}\",algorithm=\"{1}\"", KeyId, cryptographicScheme); @@ -268,9 +280,7 @@ namespace Org.OpenAPITools.Client authorizationHeaderValue += string.Format(",headers=\"{0}\",signature=\"{1}\"", headersKeysString, headerSignatureStr); - HttpSignedRequestHeader.Add(HEADER_AUTHORIZATION, authorizationHeaderValue); - return HttpSignedRequestHeader; } @@ -302,14 +312,17 @@ namespace Org.OpenAPITools.Client var signedbytes = rsa.SignHash(stringToSign, HashAlgorithm, RSASignaturePadding.Pkcs1); return Convert.ToBase64String(signedbytes); } - return string.Empty; + else + { + return string.Empty; + } } /// /// Gets the ECDSA signature /// /// - /// + /// ECDSA signature private string GetECDSASignature(byte[] dataToSign) { if (!File.Exists(KeyFilePath)) @@ -317,8 +330,8 @@ namespace Org.OpenAPITools.Client throw new Exception("key file path does not exist."); } - var ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; - var ecKeyFooter = "-----END EC PRIVATE KEY-----"; + const string ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; + const string ecKeyFooter = "-----END EC PRIVATE KEY-----"; var keyStr = File.ReadAllText(KeyFilePath); var ecKeyBase64String = keyStr.Replace(ecKeyHeader, "").Replace(ecKeyFooter, "").Trim(); var keyBytes = System.Convert.FromBase64String(ecKeyBase64String); @@ -355,10 +368,9 @@ namespace Org.OpenAPITools.Client #else throw new Exception("ECDSA signing is supported only on NETCOREAPP3_0 and above"); #endif - } - private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) + private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) { var derBytes = new List(); byte derLength = 68; //default length for ECDSA code signing bit 0x44 @@ -481,7 +493,7 @@ namespace Org.OpenAPITools.Client byte[] salt = new byte[saltstr.Length / 2]; for (int i = 0; i < salt.Length; i++) salt[i] = Convert.ToByte(saltstr.Substring(i * 2, 2), 16); - if (!(str.ReadLine() == "")) + if (str.ReadLine() != "") { return null; } @@ -512,7 +524,7 @@ namespace Org.OpenAPITools.Client private RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey) { - byte[] MODULUS, E, D, P, Q, DP, DQ, IQ; + byte[] bytesModulus, bytesE, bytesD, bytesP, bytesQ, bytesDP, bytesDQ, bytesIQ; // --------- Set up stream to decode the asn.1 encoded RSA private key ------ MemoryStream mem = new MemoryStream(privkey); @@ -549,40 +561,40 @@ namespace Org.OpenAPITools.Client //------ all private key components are Integer sequences ---- elems = GetIntegerSize(binr); - MODULUS = binr.ReadBytes(elems); + bytesModulus = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - E = binr.ReadBytes(elems); + bytesE = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - D = binr.ReadBytes(elems); + bytesD = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - P = binr.ReadBytes(elems); + bytesP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - Q = binr.ReadBytes(elems); + bytesQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DP = binr.ReadBytes(elems); + bytesDP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DQ = binr.ReadBytes(elems); + bytesDQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - IQ = binr.ReadBytes(elems); + bytesIQ = binr.ReadBytes(elems); // ------- create RSACryptoServiceProvider instance and initialize with public key ----- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSAParameters RSAparams = new RSAParameters(); - RSAparams.Modulus = MODULUS; - RSAparams.Exponent = E; - RSAparams.D = D; - RSAparams.P = P; - RSAparams.Q = Q; - RSAparams.DP = DP; - RSAparams.DQ = DQ; - RSAparams.InverseQ = IQ; + RSAparams.Modulus = bytesModulus; + RSAparams.Exponent = bytesE; + RSAparams.D = bytesD; + RSAparams.P = bytesP; + RSAparams.Q = bytesQ; + RSAparams.DP = bytesDP; + RSAparams.DQ = bytesDQ; + RSAparams.InverseQ = bytesIQ; RSA.ImportParameters(RSAparams); return RSA; } @@ -637,7 +649,7 @@ namespace Org.OpenAPITools.Client private byte[] GetEncryptedKey(byte[] salt, SecureString secpswd, int count, int miter) { IntPtr unmanagedPswd = IntPtr.Zero; - int HASHLENGTH = 16; //MD5 bytes + const int HASHLENGTH = 16; //MD5 bytes byte[] keymaterial = new byte[HASHLENGTH * miter]; //to store concatenated Mi hashed results byte[] psbytes = new byte[secpswd.Length]; @@ -670,7 +682,9 @@ namespace Org.OpenAPITools.Client } for (int i = 0; i < count; i++) + { result = md5.ComputeHash(result); + } Array.Copy(result, 0, keymaterial, j * HASHLENGTH, result.Length); //concatenate to keymaterial } byte[] deskey = new byte[24]; @@ -708,7 +722,7 @@ namespace Org.OpenAPITools.Client /// Detect the key type from the pem file. /// /// key file path in pem format - /// + /// Private Key Type private PrivateKeyType GetKeyType(string keyFilePath) { if (!File.Exists(keyFilePath)) @@ -716,39 +730,37 @@ namespace Org.OpenAPITools.Client throw new Exception("Key file path does not exist."); } - var ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; - var ecPrivateKeyFooter = "END EC PRIVATE KEY"; - var rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; - var rsaPrivateFooter = "END RSA PRIVATE KEY"; + const string ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; + const string ecPrivateKeyFooter = "END EC PRIVATE KEY"; + const string rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; + const string rsaPrivateFooter = "END RSA PRIVATE KEY"; //var pkcs8Header = "BEGIN PRIVATE KEY"; //var pkcs8Footer = "END PRIVATE KEY"; - var keyType = PrivateKeyType.None; + PrivateKeyType keyType; var key = File.ReadAllLines(keyFilePath); - if (key[0].ToString().Contains(rsaPrivateKeyHeader) && + if (key[0].Contains(rsaPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(rsaPrivateFooter)) { keyType = PrivateKeyType.RSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { keyType = PrivateKeyType.ECDSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { - /* this type of key can hold many type different types of private key, but here due lack of pem header - Considering this as EC key - */ + // this type of key can hold many type different types of private key, but here due lack of pem header + // Considering this as EC key //TODO :- update the key based on oid keyType = PrivateKeyType.ECDSA; } else { throw new Exception("Either the key is invalid or key is not supported"); - } return keyType; } diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs index 9293bc51d32d..f3eaf3c5ade3 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/HttpSigningConfiguration.cs @@ -1,3 +1,13 @@ +/* + * OpenAPI Petstore + * + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * The version of the OpenAPI document: 1.0.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; @@ -82,7 +92,7 @@ namespace Org.OpenAPITools.Client /// HTTP method /// Path /// Request options - /// + /// Http signed headers internal Dictionary GetHttpSignedHeader(string basePath,string method, string path, RequestOptions requestOptions) { const string HEADER_REQUEST_TARGET = "(request-target)"; @@ -133,7 +143,7 @@ namespace Org.OpenAPITools.Client } else { - httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); + httpValues.Add(HttpUtility.UrlEncode(parameter.Key), parameter.Value[0]); } #else if (parameter.Value.Count > 1) @@ -178,7 +188,6 @@ namespace Org.OpenAPITools.Client throw new Exception(string.Format("{0} not supported", HashAlgorithm)); } - foreach (var header in HttpSigningHeader) { if (header.Equals(HEADER_REQUEST_TARGET)) @@ -236,7 +245,6 @@ namespace Org.OpenAPITools.Client foreach (var keyVal in HttpSignatureHeader) { headerValuesList.Add(string.Format("{0}: {1}", keyVal.Key, keyVal.Value)); - } //Concatenate headers value separated by new line var headerValuesString = string.Join("\n", headerValuesList); @@ -252,7 +260,11 @@ namespace Org.OpenAPITools.Client { headerSignatureStr = GetECDSASignature(signatureStringHash); } - var cryptographicScheme = "hs2019"; + else + { + throw new Exception(string.Format("Private key type {0} not supported", keyType)); + } + const string cryptographicScheme = "hs2019"; var authorizationHeaderValue = string.Format("Signature keyId=\"{0}\",algorithm=\"{1}\"", KeyId, cryptographicScheme); @@ -268,9 +280,7 @@ namespace Org.OpenAPITools.Client authorizationHeaderValue += string.Format(",headers=\"{0}\",signature=\"{1}\"", headersKeysString, headerSignatureStr); - HttpSignedRequestHeader.Add(HEADER_AUTHORIZATION, authorizationHeaderValue); - return HttpSignedRequestHeader; } @@ -302,14 +312,17 @@ namespace Org.OpenAPITools.Client var signedbytes = rsa.SignHash(stringToSign, HashAlgorithm, RSASignaturePadding.Pkcs1); return Convert.ToBase64String(signedbytes); } - return string.Empty; + else + { + return string.Empty; + } } /// /// Gets the ECDSA signature /// /// - /// + /// ECDSA signature private string GetECDSASignature(byte[] dataToSign) { if (!File.Exists(KeyFilePath)) @@ -317,8 +330,8 @@ namespace Org.OpenAPITools.Client throw new Exception("key file path does not exist."); } - var ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; - var ecKeyFooter = "-----END EC PRIVATE KEY-----"; + const string ecKeyHeader = "-----BEGIN EC PRIVATE KEY-----"; + const string ecKeyFooter = "-----END EC PRIVATE KEY-----"; var keyStr = File.ReadAllText(KeyFilePath); var ecKeyBase64String = keyStr.Replace(ecKeyHeader, "").Replace(ecKeyFooter, "").Trim(); var keyBytes = System.Convert.FromBase64String(ecKeyBase64String); @@ -355,10 +368,9 @@ namespace Org.OpenAPITools.Client #else throw new Exception("ECDSA signing is supported only on NETCOREAPP3_0 and above"); #endif - } - private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) + private byte[] ConvertToECDSAANS1Format(byte[] signedBytes) { var derBytes = new List(); byte derLength = 68; //default length for ECDSA code signing bit 0x44 @@ -481,7 +493,7 @@ namespace Org.OpenAPITools.Client byte[] salt = new byte[saltstr.Length / 2]; for (int i = 0; i < salt.Length; i++) salt[i] = Convert.ToByte(saltstr.Substring(i * 2, 2), 16); - if (!(str.ReadLine() == "")) + if (str.ReadLine() != "") { return null; } @@ -512,7 +524,7 @@ namespace Org.OpenAPITools.Client private RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey) { - byte[] MODULUS, E, D, P, Q, DP, DQ, IQ; + byte[] bytesModulus, bytesE, bytesD, bytesP, bytesQ, bytesDP, bytesDQ, bytesIQ; // --------- Set up stream to decode the asn.1 encoded RSA private key ------ MemoryStream mem = new MemoryStream(privkey); @@ -549,40 +561,40 @@ namespace Org.OpenAPITools.Client //------ all private key components are Integer sequences ---- elems = GetIntegerSize(binr); - MODULUS = binr.ReadBytes(elems); + bytesModulus = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - E = binr.ReadBytes(elems); + bytesE = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - D = binr.ReadBytes(elems); + bytesD = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - P = binr.ReadBytes(elems); + bytesP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - Q = binr.ReadBytes(elems); + bytesQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DP = binr.ReadBytes(elems); + bytesDP = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - DQ = binr.ReadBytes(elems); + bytesDQ = binr.ReadBytes(elems); elems = GetIntegerSize(binr); - IQ = binr.ReadBytes(elems); + bytesIQ = binr.ReadBytes(elems); // ------- create RSACryptoServiceProvider instance and initialize with public key ----- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSAParameters RSAparams = new RSAParameters(); - RSAparams.Modulus = MODULUS; - RSAparams.Exponent = E; - RSAparams.D = D; - RSAparams.P = P; - RSAparams.Q = Q; - RSAparams.DP = DP; - RSAparams.DQ = DQ; - RSAparams.InverseQ = IQ; + RSAparams.Modulus = bytesModulus; + RSAparams.Exponent = bytesE; + RSAparams.D = bytesD; + RSAparams.P = bytesP; + RSAparams.Q = bytesQ; + RSAparams.DP = bytesDP; + RSAparams.DQ = bytesDQ; + RSAparams.InverseQ = bytesIQ; RSA.ImportParameters(RSAparams); return RSA; } @@ -637,7 +649,7 @@ namespace Org.OpenAPITools.Client private byte[] GetEncryptedKey(byte[] salt, SecureString secpswd, int count, int miter) { IntPtr unmanagedPswd = IntPtr.Zero; - int HASHLENGTH = 16; //MD5 bytes + const int HASHLENGTH = 16; //MD5 bytes byte[] keymaterial = new byte[HASHLENGTH * miter]; //to store concatenated Mi hashed results byte[] psbytes = new byte[secpswd.Length]; @@ -670,7 +682,9 @@ namespace Org.OpenAPITools.Client } for (int i = 0; i < count; i++) + { result = md5.ComputeHash(result); + } Array.Copy(result, 0, keymaterial, j * HASHLENGTH, result.Length); //concatenate to keymaterial } byte[] deskey = new byte[24]; @@ -708,7 +722,7 @@ namespace Org.OpenAPITools.Client /// Detect the key type from the pem file. /// /// key file path in pem format - /// + /// Private Key Type private PrivateKeyType GetKeyType(string keyFilePath) { if (!File.Exists(keyFilePath)) @@ -716,39 +730,37 @@ namespace Org.OpenAPITools.Client throw new Exception("Key file path does not exist."); } - var ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; - var ecPrivateKeyFooter = "END EC PRIVATE KEY"; - var rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; - var rsaPrivateFooter = "END RSA PRIVATE KEY"; + const string ecPrivateKeyHeader = "BEGIN EC PRIVATE KEY"; + const string ecPrivateKeyFooter = "END EC PRIVATE KEY"; + const string rsaPrivateKeyHeader = "BEGIN RSA PRIVATE KEY"; + const string rsaPrivateFooter = "END RSA PRIVATE KEY"; //var pkcs8Header = "BEGIN PRIVATE KEY"; //var pkcs8Footer = "END PRIVATE KEY"; - var keyType = PrivateKeyType.None; + PrivateKeyType keyType; var key = File.ReadAllLines(keyFilePath); - if (key[0].ToString().Contains(rsaPrivateKeyHeader) && + if (key[0].Contains(rsaPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(rsaPrivateFooter)) { keyType = PrivateKeyType.RSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { keyType = PrivateKeyType.ECDSA; } - else if (key[0].ToString().Contains(ecPrivateKeyHeader) && + else if (key[0].Contains(ecPrivateKeyHeader) && key[key.Length - 1].ToString().Contains(ecPrivateKeyFooter)) { - /* this type of key can hold many type different types of private key, but here due lack of pem header - Considering this as EC key - */ + // this type of key can hold many type different types of private key, but here due lack of pem header + // Considering this as EC key //TODO :- update the key based on oid keyType = PrivateKeyType.ECDSA; } else { throw new Exception("Either the key is invalid or key is not supported"); - } return keyType; }