Advertisement
Guest User

Untitled

a guest
Aug 2nd, 2017
600
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.39 KB | None | 0 0
  1. using SharpCore.Framework.DataExtensions;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Numerics;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using System.Linq;
  8. using SharpCore.Framework.Converters;
  9.  
  10. namespace SharpCore.Framework.Cryptography.SRP6
  11. {
  12.     public class SRP6
  13.     {
  14.         private SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
  15.         private RandomNumberGenerator random = RNGCryptoServiceProvider.Create();
  16.  
  17.         #region Server side Challenge properties
  18.         public byte[] N { get => Modulus.ToCleanByteArray(); }
  19.         public byte[] B { get => ServerPublicEphemeral.ToCleanByteArray(); }
  20.         public byte[] b { get => ServerPrivateEphemeral.ToCleanByteArray(); }
  21.         public byte[] g { get => Generator.ToCleanByteArray(); }
  22.         public byte[] s { get => Salt.ToCleanByteArray(); }
  23.         public byte[] v { get => Verifier.ToCleanByteArray(); }
  24.         public byte[] A { get => ClientPublicEphemeral.ToCleanByteArray(); }
  25.         public byte[] M1 { get => ClientSessionKeyProof.ToCleanByteArray(); }
  26.         public byte[] M2 { get => ServerSessionKeyProof.ToCleanByteArray(); }
  27.         public byte[] K { get => SessionKeyHash.ToCleanByteArray(); }
  28.         public byte[] S { get => SessionKeyRaw.ToCleanByteArray(); }
  29.         private byte[] I;
  30.         #endregion
  31.  
  32.         private BigInteger Modulus { get; } = BigInteger.Parse("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7", System.Globalization.NumberStyles.HexNumber); // N
  33.         private BigInteger Generator { get; } = new BigInteger(7); // g
  34.         private BigInteger Salt { get; set; } // s
  35.         private BigInteger Verifier { get; set; } // v
  36.         private BigInteger ServerPublicEphemeral { get; set; } // B
  37.         private BigInteger ServerPrivateEphemeral { get; set; } // b
  38.         private BigInteger PrivateKey { get; set; } // x
  39.         private BigInteger Multiplier { get; set; } = new BigInteger(3); //
  40.         private BigInteger Scrambler { get; set; } // u
  41.         private BigInteger SessionKeyRaw { get; set; } // S
  42.         private BigInteger SessionKeyHash { get; set; } // K
  43.         private BigInteger ClientSessionKeyProof { get; set; } // M1
  44.         private BigInteger ServerSessionKeyProof { get; set; } // M2
  45.         private BigInteger ClientPublicEphemeral { get; set; } // A
  46.  
  47.         public SRP6() { }
  48.  
  49.         public void Step1(string username = null, string password = null, string salt = null, string verifier = null)
  50.         {
  51.             // Generation de s = RAND()
  52.             if (salt == null)
  53.                 CalculateS();
  54.             else
  55.                 Salt = BigInteger.Parse("0" + salt, System.Globalization.NumberStyles.HexNumber);
  56.  
  57.             if (verifier == null)
  58.                 CalculateV(username, password);
  59.             else
  60.                 Verifier = BigInteger.Parse("0" + verifier, System.Globalization.NumberStyles.HexNumber);
  61.  
  62.             // Generation de b = RAND()
  63.             byte[] bTmp;
  64.             random.GetBytes(bTmp = new byte[20]);
  65.             ServerPrivateEphemeral = MakeBigInteger(bTmp);
  66.             // Generation de B = kv + g^b % N
  67.             byte[] BTmp = new byte[32];
  68.             BTmp = GetBytes(((Multiplier * Verifier + BigInteger.ModPow(Generator, ServerPrivateEphemeral, Modulus)) % Modulus).ToByteArray());
  69.             ServerPublicEphemeral = MakeBigInteger(BTmp);
  70.         }
  71.  
  72.         public void CalculateS()
  73.         {
  74.             byte[] sTmp;
  75.             random.GetBytes(sTmp = new byte[32]);
  76.             Salt = MakeBigInteger(sTmp);
  77.         }
  78.  
  79.         public void CalculateV(string username, string password)
  80.         {
  81.             // Generation de x = H(s | H(P))
  82.             var p = Encoding.UTF8.GetBytes(string.Format("{0}:{1}", username.ToUpper(), password.ToUpper()));
  83.             PrivateKey = MakeBigInteger(sha1.ComputeHash(CombineData(s, sha1.ComputeHash(p))));
  84.             // Generation de v = g ^ x % N
  85.             Verifier = BigInteger.ModPow(Generator, PrivateKey, Modulus);
  86.         }
  87.  
  88.         public void CalculateU(byte[] A)
  89.         {
  90.             ClientPublicEphemeral = MakeBigInteger(A);
  91.             // Generation de u = H(A | B)
  92.             byte[] u = sha1.ComputeHash(CombineData(A, B));
  93.             Scrambler = MakeBigInteger(u);
  94.         }
  95.  
  96.         public void CalculateK()
  97.         {
  98.             // Generation de S = (A * v^u) ^ b % N
  99.             BigInteger p1 = ClientPublicEphemeral * BigInteger.ModPow(Verifier, Scrambler, Modulus); // (A * v^u)
  100.             byte[] ss = BigInteger.ModPow(p1, ServerPrivateEphemeral, Modulus).ToByteArray();
  101.             SessionKeyRaw = MakeBigInteger(ss);
  102.  
  103.             // Generation de K
  104.             byte[] t1 = new byte[16];
  105.             byte[] vK = new byte[40];
  106.  
  107.             for (int i = 0; i < 16; i++)
  108.             {
  109.                 t1[i] = ss[i * 2];
  110.             }
  111.  
  112.             t1 = sha1.ComputeHash(t1, 0, 16);
  113.  
  114.             for (int i = 0; i < 20; i++)
  115.             {
  116.                 vK[i * 2] = t1[i];
  117.             }
  118.  
  119.             for (int i = 0; i < 16; i++)
  120.             {
  121.                 t1[i] = ss[i * 2 + 1];
  122.             }
  123.  
  124.             t1 = sha1.ComputeHash(t1, 0, 16);
  125.  
  126.             for (int i = 0; i < 20; i++)
  127.             {
  128.                 vK[i * 2 + 1] = t1[i];
  129.             }
  130.  
  131.             SessionKeyHash = MakeBigInteger(vK);
  132.         }
  133.  
  134.         public void CalculateM1(string username)
  135.         {
  136.             // Generation de M1 = H(H(N) xOR H(g), H(I), s, A, B, K)
  137.             byte[] HN = sha1.ComputeHash(N);
  138.             byte[] Hg = sha1.ComputeHash(g);
  139.             byte[] HI = sha1.ComputeHash(Encoding.UTF8.GetBytes(username.StringToHex()));
  140.  
  141.             for (int i = 0; i < HN.Length; i++)
  142.                 HN[i] ^= Hg[i];
  143.  
  144.             byte[] m1 = sha1.ComputeHash(CombineData(HN, HI, s, A, B, K));
  145.             ClientSessionKeyProof = MakeBigInteger(m1);
  146.         }
  147.  
  148.         public void CalculateM2(byte[] m1)
  149.         {
  150.             // Generation de M2 = H(A | M1 | K)
  151.             byte[] m2 = sha1.ComputeHash(CombineData(A, m1, K));
  152.             ServerSessionKeyProof = MakeBigInteger(m2);
  153.         }
  154.  
  155.        #region Helpers
  156.         private byte[] GetBytes(byte[] data, int count = 32)
  157.         {
  158.             if (data.Length <= count)
  159.                 return data;
  160.  
  161.             var bytes = new byte[count];
  162.  
  163.             Buffer.BlockCopy(data, 0, bytes, 0, count);
  164.  
  165.             return bytes;
  166.         }
  167.  
  168.         private BigInteger MakeBigInteger(byte[] data)
  169.         {
  170.             return new BigInteger(CombineData(data, new byte[] { 0 }));
  171.         }
  172.  
  173.         private byte[] CombineData(byte[] data, byte[] data2)
  174.         {
  175.             return new byte[0].Concat(data).Concat(data2).ToArray();
  176.         }
  177.  
  178.         private byte[] CombineData(byte[] data, byte[] data2, byte[] data3)
  179.         {
  180.             return new byte[0].Concat(data).Concat(data2).Concat(data3).ToArray();
  181.         }
  182.  
  183.         private byte[] CombineData(byte[] data, byte[] data2, byte[] data3, byte[] data4)
  184.         {
  185.             return new byte[0].Concat(data).Concat(data2).Concat(data3).Concat(data4).ToArray();
  186.         }
  187.  
  188.         private byte[] CombineData(byte[] data, byte[] data2, byte[] data3, byte[] data4, byte[] data5, byte[] data6)
  189.         {
  190.             return new byte[0].Concat(data).Concat(data2).Concat(data3).Concat(data4).Concat(data5).Concat(data6).ToArray();
  191.         }
  192.         #endregion
  193.     }
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement