Sample Code - Vayana Auth Token Generation - C#
public static string GenerateSignature(string stringData) {
RSACryptoServiceProvider rsaObj = null;
//read the private key file without the "begin" and "end" markers.
//If you have the markers replace them with empty string after reading or remove them from the file.
using (FileStream fs = File.OpenRead(@"C:\path\to\myprivatekey.pem")) {
byte[] data = new byte[fs.Length];
fs.Read(data, 0, data.Length);
if (data[0] != 0x30) {
// maybe it's ASCII PEM base64 encoded ?
data = PEM("PUBLIC KEY", data);
}
if (data != null) {
rsaObj = DecodeRSAPrivateKey(data);
}
}
if (rsaObj == null)
return String.Empty;
byte[] dStrUTF8Byte = System.Text.Encoding.UTF8.GetBytes(stringData);
byte[] rsaEncryptData = rsaObj.SignData(dStrUTF8Byte, new SHA1CryptoServiceProvider());
return Convert.ToBase64String(rsaEncryptData);
}
public static RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey) {
byte[] MODULUS, E, D, P, Q, DP, DQ, IQ;
// --------- Set up stream to decode the asn.1 encoded RSA private key ------
MemoryStream mem = new MemoryStream(privkey);
BinaryReader binr = new BinaryReader(mem); //wrap Memory Stream with BinaryReader for easy reading
byte bt = 0;
ushort twobytes = 0;
int elems = 0;
try {
twobytes = binr.ReadUInt16();
if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)
binr.ReadByte(); //advance 1 byte
else if (twobytes == 0x8230)
binr.ReadInt16(); //advance 2 bytes
else
return null;
twobytes = binr.ReadUInt16();
if (twobytes != 0x0102) //version number
return null;
bt = binr.ReadByte();
if (bt != 0x00)
return null;
//------ all private key components are Integer sequences ----
elems = GetIntegerSize(binr);
MODULUS = binr.ReadBytes(elems);
elems = GetIntegerSize(binr);
E = binr.ReadBytes(elems);
elems = GetIntegerSize(binr);
D = binr.ReadBytes(elems);
elems = GetIntegerSize(binr);
P = binr.ReadBytes(elems);
elems = GetIntegerSize(binr);
Q = binr.ReadBytes(elems);
elems = GetIntegerSize(binr);
DP = binr.ReadBytes(elems);
elems = GetIntegerSize(binr);
DQ = binr.ReadBytes(elems);
elems = GetIntegerSize(binr);
IQ = binr.ReadBytes(elems);
Console.WriteLine("showing components ..");
if (true) {
showBytes("\nModulus", MODULUS);
showBytes("\nExponent", E);
showBytes("\nD", D);
showBytes("\nP", P);
showBytes("\nQ", Q);
showBytes("\nDP", DP);
showBytes("\nDQ", DQ);
showBytes("\nIQ", IQ);
}
// ------- 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;
RSA.ImportParameters(RSAparams);
return RSA;
}
catch (Exception) {
return null;
}
finally { binr.Close(); }
}
private static int GetIntegerSize(BinaryReader binr) {
byte bt = 0;
byte lowbyte = 0x00;
byte highbyte = 0x00;
int count = 0;
bt = binr.ReadByte();
if (bt != 0x02) //expect integer
return 0;
bt = binr.ReadByte();
if (bt == 0x81)
count = binr.ReadByte(); // data size in next byte
else
if (bt == 0x82) {
highbyte = binr.ReadByte(); // data size in next 2 bytes
lowbyte = binr.ReadByte();
byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };
count = BitConverter.ToInt32(modint, 0);
} else {
count = bt; // we already have the data size
}
while (binr.ReadByte() == 0x00) { //remove high order zeros in data
count -= 1;
}
binr.BaseStream.Seek(-1, SeekOrigin.Current); //last ReadByte wasn't a removed zero, so back up a byte
return count;
}
private static void showBytes(String info, byte[] data) {
Console.WriteLine("{0} [{1} bytes]", info, data.Length);
for (int i = 1; i <= data.Length; i++) {
Console.Write("{0:X2} ", data[i - 1]);
if (i % 16 == 0)
Console.WriteLine();
}
Console.WriteLine("\n\n");
}
static byte[] PEM(string type, byte[] data) {
string pem = Encoding.ASCII.GetString(data).Replace(System.Environment.NewLine, string.Empty);
pem = Regex.Replace(pem, @"\t|\n|\r", "");
//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);
}