-
-
Save njmube/59a7232a60feeec29588 to your computer and use it in GitHub Desktop.
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
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
using System.Security.Cryptography; | |
using System.Security.Cryptography.X509Certificates; | |
namespace DigitalSigning | |
{ | |
class Program | |
{ | |
static X509Certificate2 certificate = null; | |
static void Main(string[] args) | |
{ | |
try | |
{ | |
string data = "Test data"; | |
// SIGN | |
byte[] signature = Sign(data, "CN=client1"); | |
string digitalSignatureStr = System.Convert.ToBase64String(signature); | |
Console.WriteLine("Digital sig: " + digitalSignatureStr); | |
//VERIFY | |
bool validSig = Verify(data, digitalSignatureStr, ""); | |
Console.WriteLine(validSig ? "Signature verified" : "Signature unverified!"); | |
} | |
catch (Exception ex) | |
{ | |
Console.WriteLine("EXCEPTION: " + ex.Message); | |
} | |
Console.ReadKey(); | |
} | |
static byte[] Sign(string text, string certSubject) | |
{ | |
X509Store my = new X509Store(StoreName.My, StoreLocation.CurrentUser); | |
my.Open(OpenFlags.ReadOnly); | |
// Find certificate | |
RSACryptoServiceProvider csp = null; | |
foreach (X509Certificate2 cert in my.Certificates) | |
{ | |
if (cert.Subject.Contains(certSubject)) | |
{ | |
certificate = cert; | |
csp = (RSACryptoServiceProvider)cert.PrivateKey; | |
} | |
} | |
if (csp == null) | |
throw new Exception("No valid cert was found"); | |
// SIGN | |
RSACryptoServiceProvider rsaClear = new RSACryptoServiceProvider(); | |
rsaClear.ImportParameters(csp.ExportParameters(true)); | |
byte[] signature = rsaClear.SignData(Encoding.UTF8.GetBytes(text), | |
CryptoConfig.CreateFromName("SHA256")); | |
return signature; | |
} | |
static bool Verify(string text, string signature, string certPath) | |
{ | |
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)certificate.PublicKey.Key; | |
return csp.VerifyData(Encoding.UTF8.GetBytes(text), | |
CryptoConfig.MapNameToOID("SHA256"), | |
System.Convert.FromBase64String(signature)); | |
} | |
} | |
} |
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
/** | |
* Tests digital signature verification | |
* | |
*/ | |
public void testVerifySignature_MohnishSelfCert() throws Exception { | |
kynectServlet.setKynectSignatureAlias(""); | |
String data = "Test data"; | |
String signature = "AUyy1R9d4doirllFuzA6VFKBBNWC8/bYu9WeDvmycZB8bswRdoZvTcVAcw4/YO9XfzpVqJBLylLQHJLfNZP1vLYhGFJ9c7DRpMHsJ/LwX+PWZshb+51GciT6Acwa3VMeo2/OyxUOTSFCS8SqaQgmkIu8SogIPjRzzWKJAW0KA+A="; | |
boolean result = false; | |
try{ | |
Certificate cert = keyStore.getCertificate("mcselfcert"); | |
Signature sig = Signature.getInstance("SHA256withRSA"); | |
sig.initVerify(cert); | |
byte[] dataBytes = data.getBytes("UTF-8"); | |
sig.update(dataBytes); | |
byte[] sigBytes = Base64.decodeBase64(signature.getBytes("UTF-8")); | |
result = sig.verify(sigBytes); | |
}catch(Exception e) { | |
e.printStackTrace(); | |
} | |
assertTrue("Signatures don't match!", result); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment