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);
}