Skip to content

Commit

Permalink
Split functionality into two packages (#2)
Browse files Browse the repository at this point in the history
* Trying to add des-ede3-cbc
* split into 2 projects
  • Loading branch information
StefH authored Jul 20, 2017
1 parent 38b2d7e commit b652e1a
Show file tree
Hide file tree
Showing 24 changed files with 751 additions and 344 deletions.
16 changes: 15 additions & 1 deletion OpenSSL-X509Certificate2-Solution.sln
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26430.15
VisualStudioVersion = 15.0.26430.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenSSL.X509Certificate2Provider", "src\OpenSSL-X509Certificate2-Provider\OpenSSL.X509Certificate2Provider.csproj", "{CB7AD528-D24B-4D2E-AFBF-56FA40C48985}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{8A9B95AB-7BFA-43F8-A001-9873F18F9534}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{9BB037AA-C636-4732-9573-914F5BE29F89}"
ProjectSection(SolutionItems) = preProject
examples\certificate_pub.crt = examples\certificate_pub.crt
examples\private.key = examples\private.key
examples\private_rsa.key = examples\private_rsa.key
examples\pwd_certificate_pub.crt = examples\pwd_certificate_pub.crt
examples\pwd_private.key = examples\pwd_private.key
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp", "examples\ConsoleApp\ConsoleApp.csproj", "{5E14342F-0878-41DA-A3D6-3A25E044CF17}"
EndProject
Expand All @@ -18,6 +25,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution items", "solution
README.md = README.md
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSSL.PrivateKeyDecoder", "src\OpenSSL.PrivateKeyDecoder\OpenSSL.PrivateKeyDecoder.csproj", "{095AE67B-6CE2-4002-86FC-33186D110EED}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -36,6 +45,10 @@ Global
{0726E037-FD07-43DA-B746-BFBA1A932611}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0726E037-FD07-43DA-B746-BFBA1A932611}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0726E037-FD07-43DA-B746-BFBA1A932611}.Release|Any CPU.Build.0 = Release|Any CPU
{095AE67B-6CE2-4002-86FC-33186D110EED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{095AE67B-6CE2-4002-86FC-33186D110EED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{095AE67B-6CE2-4002-86FC-33186D110EED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{095AE67B-6CE2-4002-86FC-33186D110EED}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -44,5 +57,6 @@ Global
{CB7AD528-D24B-4D2E-AFBF-56FA40C48985} = {8A9B95AB-7BFA-43F8-A001-9873F18F9534}
{5E14342F-0878-41DA-A3D6-3A25E044CF17} = {9BB037AA-C636-4732-9573-914F5BE29F89}
{0726E037-FD07-43DA-B746-BFBA1A932611} = {9BB037AA-C636-4732-9573-914F5BE29F89}
{095AE67B-6CE2-4002-86FC-33186D110EED} = {8A9B95AB-7BFA-43F8-A001-9873F18F9534}
EndGlobalSection
EndGlobal
25 changes: 13 additions & 12 deletions examples/ConsoleApp/ConsoleApp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,31 @@
<ApplicationIcon>../../images/certificate.ico</ApplicationIcon>
</PropertyGroup>

<ItemGroup>
<None Remove="certificate_pub.crt" />
<None Remove="private.key" />
<None Remove="private_rsa.key" />
</ItemGroup>

<ItemGroup>
<Compile Include="..\ConsoleApp452\Demo.cs" Link="Demo.cs" />
</ItemGroup>

<ItemGroup>
<Content Include="certificate_pub.crt">
<None Include="..\certificate_pub.crt" Link="certificate_pub.crt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="..\private.key" Link="private.key">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="..\private_rsa.key" Link="private_rsa.key">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="private.key">
</None>
<None Include="..\pwd_certificate_pub.crt" Link="pwd_certificate_pub.crt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="private_rsa.key">
</None>
<None Include="..\pwd_private.key" Link="pwd_private.key">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</None>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\OpenSSL-X509Certificate2-Provider\OpenSSL.X509Certificate2Provider.csproj" />
<ProjectReference Include="..\..\src\OpenSSL.PrivateKeyDecoder\OpenSSL.PrivateKeyDecoder.csproj" />
</ItemGroup>

</Project>
2 changes: 2 additions & 0 deletions examples/ConsoleApp/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ static void Main(string[] args)
Console.WriteLine(new string('-', 80));
Demo.TestX509Certificate2WithRsa();
Console.WriteLine(new string('-', 80));
//Demo.TestX509Certificate2WithEncryptedPrivateKey();
Console.WriteLine(new string('-', 80));
Demo.TestPrivateKey();
Console.WriteLine(new string('-', 80));
Demo.TestPrivateRsaKey();
Expand Down
29 changes: 22 additions & 7 deletions examples/ConsoleApp452/ConsoleApp452.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -53,22 +53,37 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
<Content Include="certificate_pub.crt">
<None Include="..\certificate_pub.crt">
<Link>certificate_pub.crt</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="..\private.key">
<Link>private.key</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="..\private_rsa.key">
<Link>private_rsa.key</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="private.key">
</None>
<None Include="..\pwd_certificate_pub.crt">
<Link>pwd_certificate_pub.crt</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="private_rsa.key">
</None>
<None Include="..\pwd_private.key">
<Link>pwd_private.key</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</None>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\OpenSSL-X509Certificate2-Provider\OpenSSL.X509Certificate2Provider.csproj">
<Project>{cb7ad528-d24b-4d2e-afbf-56fa40c48985}</Project>
<Name>OpenSSL.X509Certificate2Provider</Name>
</ProjectReference>
<ProjectReference Include="..\..\src\OpenSSL.PrivateKeyDecoder\OpenSSL.PrivateKeyDecoder.csproj">
<Project>{095ae67b-6ce2-4002-86fc-33186d110eed}</Project>
<Name>OpenSSL.PrivateKeyDecoder</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
39 changes: 37 additions & 2 deletions examples/ConsoleApp452/Demo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Xml.Linq;
using OpenSSL.PrivateKeyDecoder;
using OpenSSL.X509Certificate2Provider;

namespace ConsoleApp452
Expand Down Expand Up @@ -74,13 +75,47 @@ public static void TestX509Certificate2WithRsa()
Console.WriteLine("VerifyHash: {0}", verifyHashResult);
}

public static void TestX509Certificate2WithEncryptedPrivateKey()
{
Console.WriteLine("TestX509Certificate2WithEncryptedPrivateKey");

// Generated using:
// openssl req -x509 -sha256 -days 365 -newkey rsa:2048 -keyout pwd_private_temp.key -out pwd_certificate_pub.crt
// openssl pkcs8 -topk8 -in pwd_private_temp.key -out pwd_private.key
// password = abc123
string certificateText = File.ReadAllText("pwd_certificate_pub.crt");
string privateKeyText = File.ReadAllText("pwd_private.key");

ICertificateProvider provider = new CertificateFromFileProvider(certificateText, privateKeyText, SecureStringUtils.Encrypt("abc123"));
X509Certificate2 certificate = provider.Certificate;

Console.WriteLine("X509Certificate2:");
Console.WriteLine(certificate);
Console.WriteLine();
Console.WriteLine("PrivateKey:");
RSACryptoServiceProvider cryptoServiceProvider = (RSACryptoServiceProvider)certificate.PrivateKey;
ShowRSAProperties(cryptoServiceProvider);

var xml = XDocument.Parse(cryptoServiceProvider.ToXmlString(true));
Console.WriteLine(xml.ToString());

// Sign the data
byte[] hello = new UTF8Encoding().GetBytes("Hello World");
byte[] hashValue = cryptoServiceProvider.SignData(hello, CryptoConfig.MapNameToOID("SHA256"));

RSACryptoServiceProvider publicKey = provider.PublicKey;
bool verifyHashResult = publicKey.VerifyData(hello, CryptoConfig.MapNameToOID("SHA256"), hashValue);
Console.WriteLine();
Console.WriteLine("VerifyHash: {0}", verifyHashResult);
}

public static void TestPrivateKey()
{
Console.WriteLine("TestPrivateKey");

string privateKeyText = File.ReadAllText("private.key");

IPrivateKeyDecoder decoder = new PrivateKeyDecoder();
IOpenSSLPrivateKeyDecoder decoder = new OpenSSLPrivateKeyDecoder();
RSACryptoServiceProvider cryptoServiceProvider = decoder.Decode(privateKeyText);

// Sign the data
Expand All @@ -96,7 +131,7 @@ public static void TestPrivateRsaKey()

string privateKeyText = File.ReadAllText("private_rsa.key");

IPrivateKeyDecoder decoder = new PrivateKeyDecoder();
IOpenSSLPrivateKeyDecoder decoder = new OpenSSLPrivateKeyDecoder();
RSACryptoServiceProvider cryptoServiceProvider = decoder.Decode(privateKeyText);

// Sign the data
Expand Down
2 changes: 2 additions & 0 deletions examples/ConsoleApp452/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ static void Main(string[] args)
Console.WriteLine(new string('-', 80));
Demo.TestX509Certificate2WithRsa();
Console.WriteLine(new string('-', 80));
//Demo.TestX509Certificate2WithEncryptedPrivateKey();
Console.WriteLine(new string('-', 80));
Demo.TestPrivateKey();
Console.WriteLine(new string('-', 80));
Demo.TestPrivateRsaKey();
Expand Down
21 changes: 0 additions & 21 deletions examples/ConsoleApp452/certificate_pub.crt

This file was deleted.

28 changes: 0 additions & 28 deletions examples/ConsoleApp452/private.key

This file was deleted.

27 changes: 0 additions & 27 deletions examples/ConsoleApp452/private_rsa.key

This file was deleted.

File renamed without changes.
File renamed without changes.
File renamed without changes.
21 changes: 21 additions & 0 deletions examples/pwd_certificate_pub.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
-----BEGIN CERTIFICATE-----
MIIDYDCCAkigAwIBAgIJAKKi3yEvdrO3MA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMTcwNzE4MTk0NzMxWhcNMTgwNzE4MTk0NzMxWjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA18Jgpg5YiBxa0yz3+LOtSPFkrPb3xG1LpNsly1j/RVi1dbDe9Vu411t2
gtm1+QgRiQ/Gx4fTA0d11oIJ1+y22Azi2+6azk5CPmUtfWOILucbFAWSEL/yaFlj
RS288tKqWULG8tHvYUQDh2pvdnvahnZrpX0o8yjYsddznEpMuOauUDFsH+aaHRgC
niI9TxbRAATRTrTiBgxJO9ylxPML2YZ8DwZsqud1vx7EKIlVSD0SwroMNKx+BQLJ
SRtRJnsBQF/i4t/lwfNuBGcdKKAYw11Y6Rg5xj4Qa7gdzLOy6Evu/HTPkwDffGaS
hsnX6mPMmMCHv/s7u14z0yfhas/CmQIDAQABo1MwUTAdBgNVHQ4EFgQUDutBGZdA
DAwC5DZosc6XupVXKU8wHwYDVR0jBBgwFoAUDutBGZdADAwC5DZosc6XupVXKU8w
DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEASsPjWmugQvUpOISD
MHTJodQnKX2OKWSixCfZ5Xnvy3291uT5ovEdiiCJKq/9MF0GXrH2mnRK1dPra4tv
pD4/8d7BB3pJETa6sKEgzbprDMieVkqSKluqqHy5Sq2OhgilhGvFXecY4eeCRGxx
UMaYwcR55KC8INUe348M1Ir2uneBQ71JVf29DBkCD0iO6vEoEFVX5iXR6MOipGnt
2qSDFuQYxPrhJoLt37npQki1YmmjqZOrzkPTLKe4ULlRB4E3FNJvJClKYdApC32F
Vio5QPujr9HaeCVdBpM/X1QrvCtPbrTYLsqngxqXdDm/B/+7XDdszzVAsAdj4N87
DnrfEg==
-----END CERTIFICATE-----
30 changes: 30 additions & 0 deletions examples/pwd_private.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIQdleBLtvbPoCAggA
MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECFguX8xRQT04BIIEyNgqKphZA5pG
baN005f+5Xea7g0d8IVPTzp5RpC6Ks+vORsa6sNjTuyfmaDyJP16ZaMf01mGlFIF
O2lHhxvrM25Z6sE9QbzHMXd6dcg5nwTvMgkG7oHoWkTwrh7nWwAKP6dOzFF0cDhH
NwNP7RVl87Jih5w297iVH0jctKHp1J90ND3WYCqDLH/6b82NDMLxNHZbepchypN+
WrpBzrQvt2nrh7MHy/WkWm5RMOoqaB3kyRfmjnSdC9BWDDiv09LaRhT7uKU5jRP+
6bZO7PQ6YRZmrIfJ4nZ/cMlmvo6Z1fQGc02ty9Ke/JSSETM67bSyjAl2X8ma6iJR
gvdwBTv2hLw1/W1bGL48bWvB8AicqW3VEb2bz36wp6qiW3ZhmIphmTtp/p9IYxcq
o2wkXuXqmykGVArD2E5G5apuIECT3Pj1VEL1IC1AdQJxIrGPJkkavJuN4PVqyAWg
HF1f/p2nnVrsq1T/pAl7eDIwapkyvS2iHlDcpWgVHoaILt8jwAzjDobSSoujkDQp
J/rCypm5ZFsj3Q1Vs2yqB0GCO5dXrknyKhe4C2jTB/riMNAXU/KBoEEKMPRbWJBW
o4MzMHy4eFPxehQfI/xou1GDJndz+PeuduBnA97aKdFhycgzaUbYqiSf8PI64zIr
eHrJLNyE0utzqEk80+tmkkDhVqYaWOmO938RB9T+mweBarn9H/HJh9qrjefQErF1
DYnOCFaMyDdt2lfGWTTzseePayp3jOiuPyVLzlsEtIQl3kPJ5NQRarbWmZldLfRa
cGBB2QLTpM+Yh5pXOzViBHvw3y9kcEF9McZSnA635M/fKBVWjnarQ/VD+NXZWfs/
qVmYaYG4R9UoSAQb4NjFWbRgXch0jz6lBnrq+vu0OBS0STqDZMOjafzIq+z0dat2
+x6g8YEBeWp4JEM2e+iKKG10vFDYhxho/LwuekhOW4j8ZYS3/Q/XcqqSThID6Kp+
MfohFYgJmYeaMeVxMlqDuIkgIQ8dp/d9Z6Y8xCBn57hQygx4u1GM2h3qp750J1Ym
9YQ+WmXTgxA60giYfDrkscxf1Q2+vv8AoMZpRHDnJeYpVIuuNpl7MyIUQJFtJ//g
38+sNKok4SglMytuouQ17lGeTu8n6KMAezh7kkM5tLWQtUFOuvZ8i94rc2qswY2S
aU1PgXHlnCiZ318sS4Wp+Mwae8CKHPhn3/uHfGiEupOZHbqIDfztYWn0/SbKJfKo
l9H8Kl3A0jtfVr4RAxtk324pvugjTtKLUmAQoYKMYdM+GYMyiUv7BaveibUrYnNp
8CqgmBMv8fHG7YVUjLB0DtMCfnDoIYQcI3UCnKzceQaQPZ4o259BXTZIxrwP2QMr
gbuT7iwSGLYKmkH7aklyB5CVSKWYPvi05864o784vUuViGfLVx5pdJdRgDCHBqA/
ExbJdkvC6Ob/Y9eTvcbtNq/2XZreJHxTmBsk03hkxauAwf6FvsDkrRf2PCOZC21E
DcLOyRGRZ3Bp13Pz7b2eDgV9qSqbFA//ipKjZGI3dJwZ7U25952SFbU12nlm8PA1
0w0Ms7HTW+PZ7l5aP6WxtZwnyy8c0VMMZyBqMo5XqhlUH9lij99LPclkQU/hlS+N
ybriOECRvexCaLMf0QS4og==
-----END ENCRYPTED PRIVATE KEY-----
28 changes: 28 additions & 0 deletions examples/pwd_private_temp.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDXwmCmDliIHFrT
LPf4s61I8WSs9vfEbUuk2yXLWP9FWLV1sN71W7jXW3aC2bX5CBGJD8bHh9MDR3XW
ggnX7LbYDOLb7prOTkI+ZS19Y4gu5xsUBZIQv/JoWWNFLbzy0qpZQsby0e9hRAOH
am92e9qGdmulfSjzKNix13OcSky45q5QMWwf5podGAKeIj1PFtEABNFOtOIGDEk7
3KXE8wvZhnwPBmyq53W/HsQoiVVIPRLCugw0rH4FAslJG1EmewFAX+Li3+XB824E
Zx0ooBjDXVjpGDnGPhBruB3Ms7LoS+78dM+TAN98ZpKGydfqY8yYwIe/+zu7XjPT
J+Fqz8KZAgMBAAECggEAY846vxXrxiq3qPAoVRdolVF07L3hpy+Xyk7FkOc+TmnW
pvaGbKFdQ+G/VJA5KVWeJvTxUuN1rRKlY/ELdKK/gfmUB4C8g6qX4h0Tiek82dV2
JTDefHkOPU78KMgbm4fv3RKSzUhnn2rC5yVJIlnwoDqvWQIoqzK96qZriGSmUPEq
6ED0SATR/b/i7hLPNzZuR68tMGf690BuPbuMRxLYGIarR1qxVa4DUl1V4NY87gKd
k2R3SN22bzK6BjgFgSUFmmm2eVsWXIm1LJAPXHMWZp2geIG6uyrHAEeCEdtX0cnH
lMOrQC2bUVSYOOP7rKnrJi/+nifHMAVs9POMCnoHMQKBgQD5ZDej48PUJmaC/q0q
BP1lwLT3uhd5JAuzfQFO+S1pchatpCwNsfuiJ7UrPhn3/CV3BSl/10MGVWApF2PZ
eVqi7J7g6GxwHtG+FVsIdj94ENXyGkiIsbsOseW7T96Hbr3VetEprehyB9vLk3mj
1v2EinDiXobUMpBHtSaRfdfOawKBgQDdegLubdjZ3uXqYIyBjlmMxULn3zg3rOi5
s0ouEmiER6D0THhpCO/wXeI/qDrkm6Rli1qd4loaykajoawE7JK3TU7mUoeX5A0r
eQ1DghayyaqSXOUUT5wVzDWacgu01qqQAqRbc1NOWufa3dzh0m6O/OOeXt4Mm2B5
jrdurg6sCwKBgGcHqyDvIOENeD5X/qwkYZde9KR/YeEvLhJZ62d38/XjJ1FXSMfj
puSH6QXTYyEbL1Mrc8iX4t3D+bUgL6URyIsUnFKoUtxDLz2LTw+A4pm0wt6BU0P9
wRzCC/nFdlaXPp/qXG0OpsAtVPWWmKNCV3whQZ+Tk7oopYiqYyOqTLS/AoGAMtw0
FCDxrYa8ccheO9o+wk8CgFEIjfCNOSftHwtnKQlx8ugktqowv5gvvsKZU6pSZGdO
FffHDWPqOOWFpVPWlXWRat8E+GKMi7Eu1JPpNoGNRDNFABcQFwlgPel2ur6ZSJzy
tXWUaegCWoaclNdIQFnew52xjF+aFhAqG6apA+UCgYEAg0PkFhUOMvBxzXeZthq2
W/JJ4ODXh3h6R2mVO9TDqBOHKSXWMksEqKxMg3y8aVQR1XQNIo8R0MdfTly9q6vi
+Kf0Rrxj2CswJjXcV9D2qQcm+2TRWmWH7zHceP2gxjSt2laUbf/sGcmdknW3yqVY
QaxlctJfxKXV0mP4cs6GMWo=
-----END PRIVATE KEY-----
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using JetBrains.Annotations;
using OpenSSL.PrivateKeyDecoder;

namespace OpenSSL.X509Certificate2Provider
{
Expand Down
Loading

0 comments on commit b652e1a

Please sign in to comment.