Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions .vs/ApiSecuritySolution/xs/UserPrefs.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<Properties StartupConfiguration="{B6FD94F7-1689-4DAC-B823-0192E3CA3521}|Unit Tests">
<MonoDevelop.Ide.Workbench ActiveDocument="ApiUtilLib/ApiAuthorization.cs">
<Files>
<File FileName="ApiUtilLibTest/TestDataTest.cs" Line="287" Column="1" />
<File FileName="ApiUtilLibTest/L1SignatureTest.cs" Line="23" Column="72" />
<File FileName="ApiUtilLib/ApiAuthorization.cs" Line="120" Column="13" />
<File FileName="ApiUtilLibTest/CommonExtensions.cs" Line="121" Column="26" />
<File FileName="ApiUtilLibTest/BaseService.cs" Line="122" Column="1" />
<File FileName="ApiUtilLibTest/L2SignatureTest.cs" Line="37" Column="74" />
<File FileName="development Status" />
</Files>
<Pads>
<Pad Id="ProjectPad">
<State name="__root__">
<Node name="ApiSecuritySolution" expanded="True">
<Node name="ApiUtilLib" expanded="True">
<Node name="ApiAuthorization.cs" selected="True" />
</Node>
<Node name="ApiUtilLibTest" expanded="True" />
</Node>
</State>
</Pad>
<Pad Id="MonoDevelop.UnitTesting.TestPad">
<State name="__root__">
<Node name="ApiSecuritySolution" expanded="True">
<Node name="ApiUtilLibTest" expanded="True">
<Node name="ApexUtilLibTest" expanded="True">
<Node name="TestDataTest" expanded="True">
<Node name="GetL2Signature" selected="True" />
</Node>
</Node>
</Node>
</Node>
</State>
</Pad>
</Pads>
</MonoDevelop.Ide.Workbench>
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" />
<MonoDevelop.Ide.DebuggingService.Breakpoints>
<BreakpointStore>
<Breakpoint file="/Users/nsearch/OneDrive/Projects/APEXCSharp/development/ApiUtilLib/ApiAuthorization.cs" relfile="ApiUtilLib/ApiAuthorization.cs" line="196" column="1" />
<Breakpoint file="/Users/nsearch/OneDrive/Projects/APEXCSharp/development/ApiUtilLib/ApiAuthorization.cs" relfile="ApiUtilLib/ApiAuthorization.cs" line="179" column="1" />
<Breakpoint file="/Users/nsearch/OneDrive/Projects/APEXCSharp/development/ApiUtilLibTest/TestDataTest.cs" relfile="ApiUtilLibTest/TestDataTest.cs" line="241" column="1" />
<Breakpoint file="/Users/nsearch/OneDrive/Projects/APEXCSharp/development/ApiUtilLibTest/TestDataTest.cs" relfile="ApiUtilLibTest/TestDataTest.cs" line="281" column="1" />
<Breakpoint file="/Users/nsearch/OneDrive/Projects/APEXCSharp/development/ApiUtilLibTest/TestDataTest.cs" relfile="ApiUtilLibTest/TestDataTest.cs" line="285" column="1" />
</BreakpointStore>
</MonoDevelop.Ide.DebuggingService.Breakpoints>
<MonoDevelop.Ide.DebuggingService.PinnedWatches />
<MonoDevelop.Ide.ItemProperties.ApiUtilLibTest PreferredExecutionTarget="MonoDevelop.Default" />
<MultiItemStartupConfigurations />
</Properties>
Empty file.
Binary file added .vs/ApiSecuritySolution/xs/sqlite3/storage.ide
Binary file not shown.
Binary file not shown.
Binary file not shown.
255 changes: 209 additions & 46 deletions ApiUtilLib/ApiAuthorization.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using ApexUtilLib;
using System.Collections.Generic;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json;
using System.Linq;
using Org.BouncyCastle;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Crypto.Encodings;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;

namespace ApiUtilLib
{
Expand Down Expand Up @@ -101,12 +113,11 @@ public static RSACryptoServiceProvider PrivateKeyFromP12(string certificateFileN
{
Logger.LogEnterExit(LoggerBase.Args(certificateFileName, "***password***"));


var privateCert = new X509Certificate2(System.IO.File.ReadAllBytes(certificateFileName), password, X509KeyStorageFlags.Exportable);

var OriginalPrivateKey = (RSACryptoServiceProvider)privateCert.PrivateKey;

// Transfer the private key to overcome the following error...
// System.Security.Cryptography.CryptographicException "Invalid algorithm specified"
if (Environment.OSVersion.Platform == PlatformID.MacOSX || Environment.OSVersion.Platform == PlatformID.Unix)
{
return OriginalPrivateKey;
Expand All @@ -120,6 +131,127 @@ public static RSACryptoServiceProvider PrivateKeyFromP12(string certificateFileN
}
}

public static string GetL2SignatureFromPEM(string filename, string message, string passPhrase)
{
Logger.LogEnterExit(LoggerBase.Args(filename, "***password***"));
string result = null;
try
{
using (FileStream fs = File.OpenRead(filename))
{
AsymmetricCipherKeyPair keyPair;
var obj = GetRSAProviderFromPem(File.ReadAllText(filename).Trim(), passPhrase);
byte[] bytes = Encoding.UTF8.GetBytes(message);

using (var reader = File.OpenText(filename))
keyPair = (AsymmetricCipherKeyPair)new PemReader(reader, new PasswordFinder(passPhrase)).ReadObject();
var decryptEngine = new Pkcs1Encoding(new RsaEngine());

decryptEngine.Init(false, keyPair.Private);
var str = obj.SignData(bytes, CryptoConfig.MapNameToOID("SHA256"));

result = System.Convert.ToBase64String(str);
}
}
catch (Exception ex)
{
throw ex;
}
return result;
}

public static RSACryptoServiceProvider ImportPrivateKey(string pem)
{
PemReader pr = new PemReader(new StringReader(pem));
AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pr.ReadObject();
RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)KeyPair.Private);

RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
csp.ImportParameters(rsaParams);
return csp;
}


public static X509Certificate2 LoadCertificateFile(string filename, string passPhrase)
{
X509Certificate2 x509 = null;
try
{
using (FileStream fs = File.OpenRead(filename))
{
AsymmetricCipherKeyPair keyPair;
var obj = GetRSAProviderFromPem(File.ReadAllText(filename).Trim(), passPhrase);
byte[] bytes = Encoding.UTF8.GetBytes("message");

using (var reader = File.OpenText(filename))
keyPair = (AsymmetricCipherKeyPair)new PemReader(reader, new PasswordFinder(passPhrase)).ReadObject();
var decryptEngine = new Pkcs1Encoding(new RsaEngine());

decryptEngine.Init(false, keyPair.Private);
var str = obj.SignData(bytes, CryptoConfig.MapNameToOID("SHA256"));

var base64 = System.Convert.ToBase64String(str);

var privateCert = new X509Certificate2(base64, passPhrase, X509KeyStorageFlags.Exportable);
}
}
catch (Exception ex)
{
throw ex;
}
return x509;
}


public static RSACryptoServiceProvider GetRSAProviderFromPem(String pemstr, string password)
{
CspParameters cspParameters = new CspParameters();
cspParameters.KeyContainerName = "MyKeyContainer";
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParameters);

Func<RSACryptoServiceProvider, RsaKeyParameters, RSACryptoServiceProvider> MakePublicRCSP = (RSACryptoServiceProvider rcsp, RsaKeyParameters rkp) =>
{
RSAParameters rsaParameters = DotNetUtilities.ToRSAParameters(rkp);
rcsp.ImportParameters(rsaParameters);
return rsaKey;
};

Func<RSACryptoServiceProvider, RsaPrivateCrtKeyParameters, RSACryptoServiceProvider> MakePrivateRCSP = (RSACryptoServiceProvider rcsp, RsaPrivateCrtKeyParameters rkp) =>
{
RSAParameters rsaParameters = DotNetUtilities.ToRSAParameters(rkp);
rcsp.ImportParameters(rsaParameters);
return rsaKey;
};
IPasswordFinder pwd;
PemReader reader;
reader = new PemReader(new StringReader(pemstr), new PasswordFinder(password));
object kp = reader.ReadObject();

if (kp.GetType().GetProperty("Private") != null)
{
return MakePrivateRCSP(rsaKey, (RsaPrivateCrtKeyParameters)(((AsymmetricCipherKeyPair)kp).Private));
}
else
{
return MakePublicRCSP(rsaKey, (RsaKeyParameters)kp);
}


}



public static byte[] PEM(string type, byte[] data)
{
string pem = Encoding.ASCII.GetString(data);
string header = String.Format("-----BEGIN {0}-----", type);
string footer = String.Format("-----END {0}-----", type);
int start = pem.IndexOf(header) + header.Length;
int end = pem.IndexOf(footer, start);
string base64 = pem.Substring(start, (end - start));
return Convert.FromBase64String(base64);
}

public static RSACryptoServiceProvider PublicKeyFromCer(string certificateFileName)
{
Logger.LogEnterExit(LoggerBase.Args(certificateFileName));
Expand Down Expand Up @@ -159,57 +291,69 @@ string authPrefix
, string timestamp
, string version)
{
Logger.LogEnter(LoggerBase.Args(authPrefix, signatureMethod, appId, siteUri, httpMethod, formList, nonce, timestamp));

authPrefix = authPrefix.ToLower();

// make sure that the url are valid
if (siteUri.Scheme != "http" && siteUri.Scheme != "https")
try
{
throw new System.NotSupportedException("Support http and https protocol only.");
}
Logger.LogEnter(LoggerBase.Args(authPrefix, signatureMethod, appId, siteUri, httpMethod, formList, nonce, timestamp));

// make sure that the port no and querystring are remove from url
var url = string.Format("{0}://{1}{2}", siteUri.Scheme, siteUri.Host, siteUri.AbsolutePath);
Logger.LogInformation("url:: {0}", url);
authPrefix = authPrefix.ToLower();

// helper calss that handle parameters and form fields
ApiList paramList = new ApiList();
// make sure that the url are valid
if (siteUri.Scheme != "http" && siteUri.Scheme != "https")
{
throw new System.NotSupportedException("Support http and https protocol only.");
}

// process QueryString from url by transfering it to paramList
if (siteUri.Query.Length > 1)
{
var queryString = siteUri.Query.Substring(1); // remove the ? from first character
Logger.LogInformation("queryString:: {0}", queryString);
// make sure that the port no and querystring are remove from url
var url = string.Format("{0}://{1}{2}", siteUri.Scheme, siteUri.Host, siteUri.AbsolutePath);
Logger.LogInformation("url:: {0}", url);

var paramArr = queryString.Split('&');
foreach (string item in paramArr)
{
var itemArr = item.Split('=');
paramList.Add(itemArr[0], System.Net.WebUtility.UrlDecode(itemArr[1]));
}
// helper calss that handle parameters and form fields
ApiList paramList = new ApiList();

Logger.LogInformation("paramList:: {0}", paramList);
}
// process QueryString from url by transfering it to paramList
if (siteUri.Query.Length > 1)
{
var queryString = siteUri.Query.Substring(1); // remove the ? from first character
Logger.LogInformation("queryString:: {0}", queryString);

var paramArr = queryString.Split('&');
foreach (string item in paramArr)
{
string key = null;
string val = null;
var itemArr = item.Split('=');
key = itemArr[0];
if(itemArr.Length>1)
val = itemArr[1];
paramList.Add(key, System.Net.WebUtility.UrlDecode(val));
}

Logger.LogInformation("paramList:: {0}", paramList);
}

// add the form fields to paramList
if (formList != null && formList.Count > 0)
{
paramList.AddRange(formList);
}
// add the form fields to paramList
if (formList != null && formList.Count > 0)
{
paramList.AddRange(formList);
}

paramList.Add(authPrefix + "_timestamp", timestamp);
paramList.Add(authPrefix + "_nonce", nonce);
paramList.Add(authPrefix + "_app_id", appId);
paramList.Add(authPrefix + "_signature_method", signatureMethod.ToString());
paramList.Add(authPrefix + "_version", version);
paramList.Add(authPrefix + "_timestamp", timestamp);
paramList.Add(authPrefix + "_nonce", nonce);
paramList.Add(authPrefix + "_app_id", appId);
paramList.Add(authPrefix + "_signature_method", signatureMethod.ToString());
paramList.Add(authPrefix + "_version", version);

string baseString = httpMethod.ToString() + "&" + url + "&" + paramList.ToString();
string baseString = httpMethod.ToString() + "&" + url + "&" + paramList.ToString();

Logger.LogDebug("BaseString:: {0}", baseString);
Logger.LogDebug("BaseString:: {0}", baseString);

Logger.LogExit(LoggerBase.Args(baseString));
return baseString;
Logger.LogExit(LoggerBase.Args(baseString));
return baseString;
}
catch (Exception ex)
{
throw ex;
}
}

public static long NewTimestamp()
Expand All @@ -228,12 +372,12 @@ public static string NewNonce()
{
// Buffer storage.
data = new byte[8];

// Fill buffer.
rng.GetBytes(data);
}

Logger.LogEnterExit(LoggerBase.Args(nonce.ToString()));

return System.Convert.ToBase64String(data);
}

Expand Down Expand Up @@ -283,14 +427,14 @@ string realm
var tokenList = new ApiList();

tokenList.Add("realm", realm);
tokenList.Add(authPrefix + "_timestamp", timestamp);
tokenList.Add(authPrefix + "_nonce", nonce);
tokenList.Add(authPrefix + "_app_id", appId);
tokenList.Add(authPrefix + "_nonce", nonce);
tokenList.Add(authPrefix + "_signature_method", signatureMethod.ToString());
tokenList.Add(authPrefix + "_timestamp", timestamp);
tokenList.Add(authPrefix + "_version", version);
tokenList.Add(authPrefix + "_signature", base64Token);

string authorizationToken = string.Format("{0} {1}", authPrefix.Substring(0, 1).ToUpperInvariant() + authPrefix.Substring(1), tokenList.ToString(",", false, true));
string authorizationToken = string.Format("{0} {1}", authPrefix.Substring(0, 1).ToUpperInvariant() + authPrefix.Substring(1), tokenList.ToString(", ", false, true));

Logger.LogDebug("Token :: {0}", authorizationToken);

Expand Down Expand Up @@ -426,5 +570,24 @@ public static void InitiateSSLTrust()
Console.WriteLine("{0}", ex);
}
}

private class PasswordFinder : IPasswordFinder
{
private string password;

public PasswordFinder(string password)
{
this.password = password;
}


public char[] GetPassword()
{
return password.ToCharArray();
}
}

}


}
Loading