1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

c# Messenger Probleme

Dieses Thema im Forum ".NET Web und Kommunikation" wurde erstellt von Ministalker, 24. Oktober 2014.

  1. Ministalker

    Ministalker Grünschnabel

    Nach langer Bugsuche in meinem Messenger(für Android) hab ich herausgefunden das mono auf Android direkt von dem bigendien int /string zur little endien Reihenfolge beim umwandeln in einen bytearray konveniert.

    Nun habe ich das Problem das der Messenger trotzdem nicht läuft.
    Deshalb poste ich mal hier meinen kompletten Programmcode für den Server und die App.
    Beides ist in c# in Xamarin entwickelt das ich die Verschlüsselung unter Java nicht hin bekomme.

    Ideen wie ich die verschlüsselung in c++ bz in java realisieren sind auch hilfreich. :D

    App:
    https://drive.google.com/folderview?id=0B6_VNichXZyyTTY4MkJ6cWtYOWc&usp=sharing
    Server:
    https://drive.google.com/folderview?id=0B6_VNichXZyyQU80TzVKRFFYb2s&usp=sharing
     
  2. ComFreek

    ComFreek Mod | @comfreek Moderator

    Hallo Ministalker und Willkommen im Forum!

    ich vermute, dass sich hier keiner die Zeit nimmt, einen komplett fremden Code nach einem Fehler zu durchforsten.
    Besser wäre es, wenn du den Fehler lokalisieren oder eingrenzen könntest. Stichwort Debugging!

    Da Google Drive C# Dateien nicht online anzeigt, solltest du am besten den Code auch hier posten oder meinetwegen auf GitHub.
     
  3. Ministalker

    Ministalker Grünschnabel

    Ok Ich werde mich drum kümmern.
    Danke ! :D

    Ich gehe jetzt die Probleme Schrittweise durch...

    Ich starte die App und sie startet mir die loginactivity nach dem geprüft wurde ob ich eingeloggt bin oder nicht.
    Bis dahin läuft auch alles. Sobald ich aber meine Daten eingebe und auf Login klicke startet der Thread aber stützt direkt wieder ab.

    Ich habe mehrere Abfragen Toasts eingebaut um zu gucken wie weit er überhaupt kommt. (keinen Toast kann ich sehen)

    Code (Text):
    1. public class LoginActivity : Activity
    2.     {
    3.         private Thread Connector = null;
    4.         private Context ctx;
    5.         private String User = "";
    6.         private String Pass = "";
    7.  
    8.         protected override void OnCreate (Bundle bundle)
    9.         {
    10.             base.OnCreate (bundle);
    11.  
    12.             SetContentView (Resource.Layout.Login);
    13.  
    14.             ctx = this;
    15.  
    16.             RunOnUiThread(() => {
    17.                 Toast.MakeText (ctx, "Test1!", ToastLength.Long);
    18.             });
    19.  
    20.             ((Button) FindViewById(Resource.Id.loginButton)).Click += (object sender, EventArgs e) =>
    21.             {
    22.                 User = ((EditText) FindViewById(Resource.Id.UsernameEdit)).Text;
    23.                 Pass = ((EditText) FindViewById(Resource.Id.PasswordEdit)).Text;
    24.  
    25.                 RunOnUiThread(() => {
    26.                     Toast.MakeText (ctx, "Test2!", ToastLength.Long);
    27.                 });
    28.  
    29.                 if(Connector == null) {
    30.                     RunOnUiThread(() => {
    31.                         Toast.MakeText (ctx, "Test3!", ToastLength.Long);
    32.                     });
    33.                     Connector = new Thread(Login);
    34.                     Connector.Start();
    35.                 }
    36.             };
    37.  
    38.             ((Button) FindViewById(Resource.Id.RegisterButton)).Click += (object sender, EventArgs e) =>
    39.             {
    40.                 StartActivity(typeof(RegisterActivity));
    41.             };
    42.         }
    43.  
    44.         private void Login()
    45.         {
    46.             RunOnUiThread(() => {
    47.                 Toast.MakeText (ctx, "Test4!", ToastLength.Long);
    48.             });
    49.  
    50.             CryptoManager cManager = new CryptoManager (false);
    51.             Package package = new Package (5 + User.Length);
    52.  
    53.             if (User.Contains ('@')) {
    54.                 package.addByte (0x02);
    55.                 package.addString (User);
    56.                 cManager.WriteLine (package);
    57.             } else {
    58.                 package.addByte (0x01);
    59.                 package.addString (User);
    60.                 cManager.WriteLine (package);
    61.             }
    62.  
    63.             package = cManager.ReadLine ();
    64.  
    65.             package.getByte ();
    66.  
    67.             if (package.getByte () != 0x01) {
    68.                 if (User.Contains ('@')) {
    69.                     RunOnUiThread(() => {
    70.                         Toast.MakeText (ctx, "Wrong Emailaddress!", ToastLength.Long);
    71.                     });
    72.                 } else {
    73.                     RunOnUiThread(() => {
    74.                         Toast.MakeText (ctx, "Wrong Username!", ToastLength.Long);
    75.                     });
    76.                 }
    77.  
    78.                 cManager.Close ();
    79.                 Connector = null;
    80.  
    81.                 return;
    82.             }
    83.  
    84.             RunOnUiThread(() => {
    85.                 Toast.MakeText (ctx, "Test5!", ToastLength.Long);
    86.             });
    87.  
    88.             package = new Package (5 + Pass.Length);
    89.  
    90.             package.addByte (0x01);
    91.             package.addString (Pass);
    92.  
    93.             cManager.WriteLine (package);
    94.             package = cManager.ReadLine ();
    95.  
    96.             package.getByte ();
    97.  
    98.             if (package.getByte () != 0x01) {
    99.                 RunOnUiThread (() => {
    100.                     Toast.MakeText (ctx, "Wrong Password!", ToastLength.Long);
    101.                 });
    102.                 cManager.Close ();
    103.                 Connector = null;
    104.  
    105.                 return;
    106.             }
    107.  
    108.             RunOnUiThread(() => {
    109.                 Toast.MakeText (ctx, "Test6!", ToastLength.Long);
    110.             });
    111.  
    112.             RunOnUiThread(() => {StartActivity (typeof(ChatActivity)); });
    113.  
    114.             cManager.Close ();
    115.             Connector = null;
    116.         }
    117.     }
    Es steht da nicht mal ob der Thread startet oder abstürzt /beendet wird.
    Außerdem wenn ich das :
    RunOnUiThread(() => {}

    Beim ersten Thread entferne macht es keinen Unterschied.


    EDIT:
    Ah ich habe meinen Fehler gefunden -_- ich habe das .Show() vergessen.

    So jetzt habe ich aber wieder ein anderes Problem und zwar das wenn sich die app nicht erfolgreich verbindet, dann soll eine Nachricht kommen.
    Tut es aber nicht.

    Code (Text):
    1. try {
    2.                 client = new TcpClient ("192.168.2.103", 3075);
    3.             } catch (Exception) {
    4.                 RunOnUiThread(() => {
    5.                     Toast.MakeText (ctx, "Server offline!", ToastLength.Long).Show();
    6.                 });
    7.                 return;
    8.             }
    Ich würde gerne das so machen, das die App nicht zu lange auf eine Antwort wartet.

    Außerdem habe ich gerade ein Problem in der Server-Software gefunden.

    Der Server stürzt bei Curve ab die Zeile wo er abstürzt habe ich Kommentiert.

    Code (Text):
    1. using System;
    2. using limb = System.Int32;
    3. using System.Security.Cryptography;
    4.  
    5. namespace MessengerServer
    6. {
    7.     unsafe class Curve25519Donna
    8.     {
    9.  
    10.         private static void fsum(limb* output, limb* input)
    11.         {
    12.             for (int i = 0; i < 10; i += 2)
    13.             {
    14.                 output[0 + i] = (output[0 + i] + input[0 + i]);
    15.                 output[1 + i] = (output[1 + i] + input[1 + i]);
    16.             }
    17.         }
    18.  
    19.         private static void fdifference(limb* output, limb* input)
    20.         {
    21.             for (int i = 0; i < 10; ++i)
    22.             {
    23.                 output[i] = (input[i] - output[i]);
    24.             }
    25.         }
    26.  
    27.         private static void fscalar_product(limb* output, limb* input, limb scalar)
    28.         {
    29.             for (int i = 0; i < 10; ++i)
    30.             {
    31.                 output[i] = input[i] * scalar;
    32.             }
    33.         }
    34.  
    35.         private static void fproduct(limb* output, limb* in2, limb* input)
    36.         {
    37.             output[0] = ((limb)((int)in2[0])) * ((int)input[0]);
    38.             output[1] = ((limb)((int)in2[0])) * ((int)input[1]) +
    39.                 ((limb)((int)in2[1])) * ((int)input[0]);
    40.             output[2] = 2 * ((limb)((int)in2[1])) * ((int)input[1]) +
    41.                 ((limb)((int)in2[0])) * ((int)input[2]) +
    42.                 ((limb)((int)in2[2])) * ((int)input[0]);
    43.             output[3] = ((limb)((int)in2[1])) * ((int)input[2]) +
    44.                 ((limb)((int)in2[2])) * ((int)input[1]) +
    45.                 ((limb)((int)in2[0])) * ((int)input[3]) +
    46.                 ((limb)((int)in2[3])) * ((int)input[0]);
    47.             output[4] = ((limb)((int)in2[2])) * ((int)input[2]) +
    48.                 2 * (((limb)((int)in2[1])) * ((int)input[3]) +
    49.                     ((limb)((int)in2[3])) * ((int)input[1])) +
    50.                 ((limb)((int)in2[0])) * ((int)input[4]) +
    51.                 ((limb)((int)in2[4])) * ((int)input[0]);
    52.             output[5] = ((limb)((int)in2[2])) * ((int)input[3]) +
    53.                 ((limb)((int)in2[3])) * ((int)input[2]) +
    54.                 ((limb)((int)in2[1])) * ((int)input[4]) +
    55.                 ((limb)((int)in2[4])) * ((int)input[1]) +
    56.                 ((limb)((int)in2[0])) * ((int)input[5]) +
    57.                 ((limb)((int)in2[5])) * ((int)input[0]);
    58.             output[6] = 2 * (((limb)((int)in2[3])) * ((int)input[3]) +
    59.                 ((limb)((int)in2[1])) * ((int)input[5]) +
    60.                 ((limb)((int)in2[5])) * ((int)input[1])) +
    61.                 ((limb)((int)in2[2])) * ((int)input[4]) +
    62.                 ((limb)((int)in2[4])) * ((int)input[2]) +
    63.                 ((limb)((int)in2[0])) * ((int)input[6]) +
    64.                 ((limb)((int)in2[6])) * ((int)input[0]);
    65.             output[7] = ((limb)((int)in2[3])) * ((int)input[4]) +
    66.                 ((limb)((int)in2[4])) * ((int)input[3]) +
    67.                 ((limb)((int)in2[2])) * ((int)input[5]) +
    68.                 ((limb)((int)in2[5])) * ((int)input[2]) +
    69.                 ((limb)((int)in2[1])) * ((int)input[6]) +
    70.                 ((limb)((int)in2[6])) * ((int)input[1]) +
    71.                 ((limb)((int)in2[0])) * ((int)input[7]) +
    72.                 ((limb)((int)in2[7])) * ((int)input[0]);
    73.             output[8] = ((limb)((int)in2[4])) * ((int)input[4]) +
    74.                 2 * (((limb)((int)in2[3])) * ((int)input[5]) +
    75.                     ((limb)((int)in2[5])) * ((int)input[3]) +
    76.                     ((limb)((int)in2[1])) * ((int)input[7]) +
    77.                     ((limb)((int)in2[7])) * ((int)input[1])) +
    78.                 ((limb)((int)in2[2])) * ((int)input[6]) +
    79.                 ((limb)((int)in2[6])) * ((int)input[2]) +
    80.                 ((limb)((int)in2[0])) * ((int)input[8]) +
    81.                 ((limb)((int)in2[8])) * ((int)input[0]);
    82.             output[9] = ((limb)((int)in2[4])) * ((int)input[5]) +
    83.                 ((limb)((int)in2[5])) * ((int)input[4]) +
    84.                 ((limb)((int)in2[3])) * ((int)input[6]) +
    85.                 ((limb)((int)in2[6])) * ((int)input[3]) +
    86.                 ((limb)((int)in2[2])) * ((int)input[7]) +
    87.                 ((limb)((int)in2[7])) * ((int)input[2]) +
    88.                 ((limb)((int)in2[1])) * ((int)input[8]) +
    89.                 ((limb)((int)in2[8])) * ((int)input[1]) +
    90.                 ((limb)((int)in2[0])) * ((int)input[9]) +
    91.                 ((limb)((int)in2[9])) * ((int)input[0]);
    92.             output[10] = 2 * (((limb)((int)in2[5])) * ((int)input[5]) +
    93.                 ((limb)((int)in2[3])) * ((int)input[7]) +
    94.                 ((limb)((int)in2[7])) * ((int)input[3]) +
    95.                 ((limb)((int)in2[1])) * ((int)input[9]) +
    96.                 ((limb)((int)in2[9])) * ((int)input[1])) +
    97.                 ((limb)((int)in2[4])) * ((int)input[6]) +
    98.                 ((limb)((int)in2[6])) * ((int)input[4]) +
    99.                 ((limb)((int)in2[2])) * ((int)input[8]) +
    100.                 ((limb)((int)in2[8])) * ((int)input[2]);
    101.             output[11] = ((limb)((int)in2[5])) * ((int)input[6]) +
    102.                 ((limb)((int)in2[6])) * ((int)input[5]) +
    103.                 ((limb)((int)in2[4])) * ((int)input[7]) +
    104.                 ((limb)((int)in2[7])) * ((int)input[4]) +
    105.                 ((limb)((int)in2[3])) * ((int)input[8]) +
    106.                 ((limb)((int)in2[8])) * ((int)input[3]) +
    107.                 ((limb)((int)in2[2])) * ((int)input[9]) +
    108.                 ((limb)((int)in2[9])) * ((int)input[2]);
    109.             output[12] = ((limb)((int)in2[6])) * ((int)input[6]) +
    110.                 2 * (((limb)((int)in2[5])) * ((int)input[7]) +
    111.                     ((limb)((int)in2[7])) * ((int)input[5]) +
    112.                     ((limb)((int)in2[3])) * ((int)input[9]) +
    113.                     ((limb)((int)in2[9])) * ((int)input[3])) +
    114.                 ((limb)((int)in2[4])) * ((int)input[8]) +
    115.                 ((limb)((int)in2[8])) * ((int)input[4]);
    116.             output[13] = ((limb)((int)in2[6])) * ((int)input[7]) +
    117.                 ((limb)((int)in2[7])) * ((int)input[6]) +
    118.                 ((limb)((int)in2[5])) * ((int)input[8]) +
    119.                 ((limb)((int)in2[8])) * ((int)input[5]) +
    120.                 ((limb)((int)in2[4])) * ((int)input[9]) +
    121.                 ((limb)((int)in2[9])) * ((int)input[4]);
    122.             output[14] = 2 * (((limb)((int)in2[7])) * ((int)input[7]) +
    123.                 ((limb)((int)in2[5])) * ((int)input[9]) +
    124.                 ((limb)((int)in2[9])) * ((int)input[5])) +
    125.                 ((limb)((int)in2[6])) * ((int)input[8]) +
    126.                 ((limb)((int)in2[8])) * ((int)input[6]);
    127.             output[15] = ((limb)((int)in2[7])) * ((int)input[8]) +
    128.                 ((limb)((int)in2[8])) * ((int)input[7]) +
    129.                 ((limb)((int)in2[6])) * ((int)input[9]) +
    130.                 ((limb)((int)in2[9])) * ((int)input[6]);
    131.             output[16] = ((limb)((int)in2[8])) * ((int)input[8]) +
    132.                 2 * (((limb)((int)in2[7])) * ((int)input[9]) +
    133.                     ((limb)((int)in2[9])) * ((int)input[7]));
    134.             output[17] = ((limb)((int)in2[8])) * ((int)input[9]) +
    135.                 ((limb)((int)in2[9])) * ((int)input[8]);
    136.             output[18] = 2 * ((limb)((int)in2[9])) * ((int)input[9]);
    137.         }
    138.  
    139.         private static void freduce_degree(limb* output)
    140.         {
    141.             output[8] += output[18] << 4;
    142.             output[8] += output[18] << 1;
    143.             output[8] += output[18];
    144.             output[7] += output[17] << 4;
    145.             output[7] += output[17] << 1;
    146.             output[7] += output[17];
    147.             output[6] += output[16] << 4;
    148.             output[6] += output[16] << 1;
    149.             output[6] += output[16];
    150.             output[5] += output[15] << 4;
    151.             output[5] += output[15] << 1;
    152.             output[5] += output[15];
    153.             output[4] += output[14] << 4;
    154.             output[4] += output[14] << 1;
    155.             output[4] += output[14];
    156.             output[3] += output[13] << 4;
    157.             output[3] += output[13] << 1;
    158.             output[3] += output[13];
    159.             output[2] += output[12] << 4;
    160.             output[2] += output[12] << 1;
    161.             output[2] += output[12];
    162.             output[1] += output[11] << 4;
    163.             output[1] += output[11] << 1;
    164.             output[1] += output[11];
    165.             output[0] += output[10] << 4;
    166.             output[0] += output[10] << 1;
    167.             output[0] += output[10];
    168.         }
    169.  
    170.         private static limb div_by_2_26(limb v)
    171.         {
    172.             /* High word of v; no shift needed*/
    173.             UInt32 highword = (UInt32)(((UInt64)v) >> 32);
    174.             /* Set to all 1s if v was negative; else set to 0s. */
    175.             Int32 sign = ((Int32)highword) >> 31;
    176.             /* Set to 0x3ffffff if v was negative; else set to 0. */
    177.             Int32 roundoff = (Int32)(((UInt32)sign) >> 6);
    178.             /* Should return v / (1<<26) */
    179.             return (v + roundoff) >> 26;
    180.         }
    181.  
    182.         private static limb div_by_2_25(limb v)
    183.         {
    184.             /* High word of v; no shift needed*/
    185.             UInt32 highword = (UInt32)(((UInt64)v) >> 32);
    186.             /* Set to all 1s if v was negative; else set to 0s. */
    187.             Int32 sign = ((Int32)highword) >> 31;
    188.             /* Set to 0x1ffffff if v was negative; else set to 0. */
    189.             Int32 roundoff = (Int32)(((UInt32)sign) >> 7);
    190.             /* Should return v / (1<<25) */
    191.             return (v + roundoff) >> 25;
    192.         }
    193.  
    194.         private static int div_s32_by_2_25(int v)
    195.         {
    196.             int roundoff = (Int32)(((UInt32)(v >> 31)) >> 7);
    197.             return (v + roundoff) >> 25;
    198.         }
    199.         private static void freduce_coefficients(limb* output)
    200.         {
    201.             output[10] = 0;
    202.  
    203.             for (int i = 0; i < 10; i += 2)
    204.             {
    205.                 limb over = div_by_2_26(output[i]);
    206.                 output[i] -= over << 26;
    207.                 output[i + 1] += over;
    208.  
    209.                 over = div_by_2_25(output[i + 1]);
    210.                 output[i + 1] -= over << 25;
    211.                 output[i + 2] += over;
    212.             }
    213.             /* Now |output[10]| < 2 ^ 38 and all other coefficients are reduced. */
    214.             output[0] += output[10] << 4;
    215.             output[0] += output[10] << 1;
    216.             output[0] += output[10];
    217.  
    218.             output[10] = 0;
    219.  
    220.             /* Now output[1..9] are reduced, and |output[0]| < 2^26 + 19 * 2^38
    221.              * So |over| will be no more than 77825  */
    222.             {
    223.                 limb over = div_by_2_26(output[0]);
    224.                 output[0] -= over << 26;
    225.                 output[1] += over;
    226.             }
    227.  
    228.             /* Now output[0,2..9] are reduced, and |output[1]| < 2^25 + 77825
    229.              * So |over| will be no more than 1. */
    230.             {
    231.                 /* output[1] fits in 32 bits, so we can use div_int_by_2_25 here. */
    232.                 int over32 = div_s32_by_2_25((int)output[1]);
    233.                 output[1] -= over32 << 25;
    234.                 output[2] += over32;
    235.             }
    236.  
    237.             /* Finally, output[0,1,3..9] are reduced, and output[2] is "nearly reduced":
    238.              * we have |output[2]| <= 2^26.  This is good enough for all of our math,
    239.              * but it will require an extra freduce_coefficients before fcontract. */
    240.         }
    241.  
    242.         /* A helpful wrapper around fproduct: output = in * in2.
    243.          *
    244.          * output must be distinct to both inputs. The output is reduced degree and
    245.          * reduced coefficient.
    246.          */
    247.         private static void fmul(limb* output, limb* input, limb* in2)
    248.         {
    249.             Long19 t = new Long19();
    250.             fproduct(t.Items, input, in2);
    251.             freduce_degree(t.Items);
    252.             freduce_coefficients(t.Items);
    253.             memcpy10(output, t.Items);
    254.         }
    255.  
    256.         private static void fsquare_inner(limb* output, limb* input)
    257.         {
    258.             output[0] = ((limb)((int)input[0])) * ((int)input[0]);
    259.             output[1] = 2 * ((limb)((int)input[0])) * ((int)input[1]);
    260.             output[2] = 2 * (((limb)((int)input[1])) * ((int)input[1]) +
    261.                 ((limb)((int)input[0])) * ((int)input[2]));
    262.             output[3] = 2 * (((limb)((int)input[1])) * ((int)input[2]) +
    263.                 ((limb)((int)input[0])) * ((int)input[3]));
    264.             output[4] = ((limb)((int)input[2])) * ((int)input[2]) +
    265.                 4 * ((limb)((int)input[1])) * ((int)input[3]) +
    266.                 2 * ((limb)((int)input[0])) * ((int)input[4]);
    267.             output[5] = 2 * (((limb)((int)input[2])) * ((int)input[3]) +
    268.                 ((limb)((int)input[1])) * ((int)input[4]) +
    269.                 ((limb)((int)input[0])) * ((int)input[5]));
    270.             output[6] = 2 * (((limb)((int)input[3])) * ((int)input[3]) +
    271.                 ((limb)((int)input[2])) * ((int)input[4]) +
    272.                 ((limb)((int)input[0])) * ((int)input[6]) +
    273.                 2 * ((limb)((int)input[1])) * ((int)input[5]));
    274.             output[7] = 2 * (((limb)((int)input[3])) * ((int)input[4]) +
    275.                 ((limb)((int)input[2])) * ((int)input[5]) +
    276.                 ((limb)((int)input[1])) * ((int)input[6]) +
    277.                 ((limb)((int)input[0])) * ((int)input[7]));
    278.             output[8] = ((limb)((int)input[4])) * ((int)input[4]) +
    279.                 2 * (((limb)((int)input[2])) * ((int)input[6]) +
    280.                     ((limb)((int)input[0])) * ((int)input[8]) +
    281.                     2 * (((limb)((int)input[1])) * ((int)input[7]) +
    282.                         ((limb)((int)input[3])) * ((int)input[5])));
    283.             output[9] = 2 * (((limb)((int)input[4])) * ((int)input[5]) +
    284.                 ((limb)((int)input[3])) * ((int)input[6]) +
    285.                 ((limb)((int)input[2])) * ((int)input[7]) +
    286.                 ((limb)((int)input[1])) * ((int)input[8]) +
    287.                 ((limb)((int)input[0])) * ((int)input[9]));
    288.             output[10] = 2 * (((limb)((int)input[5])) * ((int)input[5]) +
    289.                 ((limb)((int)input[4])) * ((int)input[6]) +
    290.                 ((limb)((int)input[2])) * ((int)input[8]) +
    291.                 2 * (((limb)((int)input[3])) * ((int)input[7]) +
    292.                     ((limb)((int)input[1])) * ((int)input[9])));
    293.             output[11] = 2 * (((limb)((int)input[5])) * ((int)input[6]) +
    294.                 ((limb)((int)input[4])) * ((int)input[7]) +
    295.                 ((limb)((int)input[3])) * ((int)input[8]) +
    296.                 ((limb)((int)input[2])) * ((int)input[9]));
    297.             output[12] = ((limb)((int)input[6])) * ((int)input[6]) +
    298.                 2 * (((limb)((int)input[4])) * ((int)input[8]) +
    299.                     2 * (((limb)((int)input[5])) * ((int)input[7]) +
    300.                         ((limb)((int)input[3])) * ((int)input[9])));
    301.             output[13] = 2 * (((limb)((int)input[6])) * ((int)input[7]) +
    302.                 ((limb)((int)input[5])) * ((int)input[8]) +
    303.                 ((limb)((int)input[4])) * ((int)input[9]));
    304.             output[14] = 2 * (((limb)((int)input[7])) * ((int)input[7]) +
    305.                 ((limb)((int)input[6])) * ((int)input[8]) +
    306.                 2 * ((limb)((int)input[5])) * ((int)input[9]));
    307.             output[15] = 2 * (((limb)((int)input[7])) * ((int)input[8]) +
    308.                 ((limb)((int)input[6])) * ((int)input[9]));
    309.             output[16] = ((limb)((int)input[8])) * ((int)input[8]) +
    310.                 4 * ((limb)((int)input[7])) * ((int)input[9]);
    311.             output[17] = 2 * ((limb)((int)input[8])) * ((int)input[9]);
    312.             output[18] = 2 * ((limb)((int)input[9])) * ((int)input[9]);
    313.         }
    314.  
    315.         internal struct Long19
    316.         {
    317.             public fixed limb Items[19];
    318.         }
    319.  
    320.         private static void fsquare(limb* output, limb* input)
    321.         {
    322.             var t = new Long19();
    323.             fsquare_inner(t.Items, input);
    324.             freduce_degree(t.Items);
    325.             freduce_coefficients(t.Items);
    326.             memcpy10(output, t.Items);
    327.         }
    328.  
    329.         private static int ReadLittleEndianInt32(byte* p)
    330.         {
    331.             //Hier stürtzt der Server ab.
    332.             return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
    333.         }
    334.  
    335.         /* Take a little-endian, 32-byte number and expand it into polynomial form */
    336.  
    337.         private static void fexpand(limb* output, byte* input)
    338.         {
    339.             output[0] = (ReadLittleEndianInt32(input + 0) >> 0) & 0x3ffffff;
    340.             output[1] = (ReadLittleEndianInt32(input + 3) >> 2) & 0x1ffffff;
    341.             output[2] = (ReadLittleEndianInt32(input + 6) >> 3) & 0x3ffffff;
    342.             output[3] = (ReadLittleEndianInt32(input + 9) >> 5) & 0x1ffffff;
    343.             output[4] = (ReadLittleEndianInt32(input + 12) >> 6) & 0x3ffffff;
    344.             output[5] = (ReadLittleEndianInt32(input + 16) >> 0) & 0x1ffffff;
    345.             output[6] = (ReadLittleEndianInt32(input + 19) >> 1) & 0x3ffffff;
    346.             output[7] = (ReadLittleEndianInt32(input + 22) >> 3) & 0x1ffffff;
    347.             output[8] = (ReadLittleEndianInt32(input + 25) >> 4) & 0x3ffffff;
    348.             output[9] = (ReadLittleEndianInt32(input + 28) >> 6) & 0x1ffffff;
    349.         }
    350.  
    351.         /* Take a fully reduced polynomial form number and contract it into a
    352.          * little-endian, 32-byte array
    353.          */
    354.         static void fcontract(byte* output, limb* input)
    355.         {
    356.             int i;
    357.             int j;
    358.             int mask;
    359.             int carry;
    360.  
    361.             for (j = 0; j < 2; ++j)
    362.             {
    363.                 for (i = 0; i < 9; ++i)
    364.                 {
    365.                     if ((i & 1) == 1)
    366.                     {
    367.                         /* This calculation is a time-invariant way to make input[i] positive
    368.                            by borrowing from the next-larger limb.
    369.                         */
    370.                         mask = (int)(input[i]) >> 31;
    371.                         carry = -(((int)(input[i]) & mask) >> 25);
    372.                         input[i] = (int)(input[i]) + (carry << 25);
    373.                         input[i + 1] = (int)(input[i + 1]) - carry;
    374.                     }
    375.                     else
    376.                     {
    377.                         mask = (int)(input[i]) >> 31;
    378.                         carry = -(((int)(input[i]) & mask) >> 26);
    379.                         input[i] = (int)(input[i]) + (carry << 26);
    380.                         input[i + 1] = (int)(input[i + 1]) - carry;
    381.                     }
    382.                 }
    383.                 mask = (int)(input[9]) >> 31;
    384.                 carry = -(((int)(input[9]) & mask) >> 25);
    385.                 input[9] = (int)(input[9]) + (carry << 25);
    386.                 input[0] = (int)(input[0]) - (carry * 19);
    387.             }
    388.  
    389.             /* The first borrow-propagation pass above ended with every limb
    390.                except (possibly) input[0] non-negative.
    391.  
    392.                Since each input limb except input[0] is decreased by at most 1
    393.                by a borrow-propagation pass, the second borrow-propagation pass
    394.                could only have wrapped around to decrease input[0] again if the
    395.                first pass left input[0] negative *and* input[1] through input[9]
    396.                were all zero.  In that case, input[1] is now 2^25 - 1, and this
    397.                last borrow-propagation step will leave input[1] non-negative.
    398.             */
    399.             mask = (int)(input[0]) >> 31;
    400.             carry = -(((int)(input[0]) & mask) >> 26);
    401.             input[0] = (int)(input[0]) + (carry << 26);
    402.             input[1] = (int)(input[1]) - carry;
    403.  
    404.             /* Both passes through the above loop, plus the last 0-to-1 step, are
    405.                necessary: if input[9] is -1 and input[0] through input[8] are 0,
    406.                negative values will remain in the array until the end.
    407.              */
    408.  
    409.             input[1] <<= 2;
    410.             input[2] <<= 3;
    411.             input[3] <<= 5;
    412.             input[4] <<= 6;
    413.             input[6] <<= 1;
    414.             input[7] <<= 3;
    415.             input[8] <<= 4;
    416.             input[9] <<= 6;
    417.             /*
    418.         #define F(i, s) \
    419.           output[s+0] |=  input[i] & 0xff; \
    420.           output[s+1]  = (input[i] >> 8) & 0xff; \
    421.           output[s+2]  = (input[i] >> 16) & 0xff; \
    422.           output[s+3]  = (input[i] >> 24) & 0xff;
    423.           output[0] = 0;
    424.           output[16] = 0;
    425.           F(0,0);
    426.           F(1,3);
    427.           F(2,6);
    428.           F(3,9);
    429.           F(4,12);
    430.           F(5,16);
    431.           F(6,19);
    432.           F(7,22);
    433.           F(8,25);
    434.           F(9,28);
    435.         #undef F*/
    436.             output[0] = (byte)input[0];
    437.  
    438.             output[1] = (byte)(input[0] >> 8);
    439.             output[2] = (byte)(input[0] >> 16);
    440.             output[3] = (byte)(input[0] >> 24 | input[1]);
    441.  
    442.             output[4] = (byte)(input[1] >> 8);
    443.             output[5] = (byte)(input[1] >> 16);
    444.             output[6] = (byte)(input[1] >> 24 | input[2]);
    445.  
    446.             output[7] = (byte)(input[2] >> 8);
    447.             output[8] = (byte)(input[2] >> 16);
    448.             output[9] = (byte)(input[2] >> 24 | input[3]);
    449.  
    450.             output[10] = (byte)(input[3] >> 8);
    451.             output[11] = (byte)(input[3] >> 16);
    452.             output[12] = (byte)(input[3] >> 24 | input[4]);
    453.  
    454.             output[13] = (byte)(input[4] >> 8);
    455.             output[14] = (byte)(input[4] >> 16);
    456.             output[15] = (byte)(input[4] >> 24);
    457.  
    458.             output[16] = (byte)input[5];
    459.  
    460.             output[17] = (byte)(input[5] >> 8);
    461.             output[18] = (byte)(input[5] >> 16);
    462.             output[19] = (byte)(input[5] >> 24 | input[6]);
    463.  
    464.             output[20] = (byte)(input[6] >> 8);
    465.             output[21] = (byte)(input[6] >> 16);
    466.             output[22] = (byte)(input[6] >> 24 | input[7]);
    467.  
    468.             output[23] = (byte)(input[7] >> 8);
    469.             output[24] = (byte)(input[7] >> 16);
    470.             output[25] = (byte)(input[7] >> 24 | input[8]);
    471.  
    472.             output[26] = (byte)(input[8] >> 8);
    473.             output[27] = (byte)(input[8] >> 16);
    474.             output[28] = (byte)(input[8] >> 24 | input[9]);
    475.  
    476.             output[29] = (byte)(input[9] >> 8);
    477.             output[30] = (byte)(input[9] >> 16);
    478.             output[31] = (byte)(input[9] >> 24);
    479.         }
    480.  
    481.         /* Input: Q, Q', Q-Q'
    482.          * Output: 2Q, Q+Q'
    483.          *
    484.          *   x2 z3: long form
    485.          *   x3 z3: long form
    486.          *   x z: short form, destroyed
    487.          *   xprime zprime: short form, destroyed
    488.          *   qmqp: short form, preserved
    489.          */
    490.  
    491.         static void fmonty(limb* x2, limb* z2, /* output 2Q */
    492.             limb* x3, limb* z3, /* output Q + Q' */
    493.             limb* x, limb* z, /* input Q */
    494.             limb* xprime, limb* zprime, /* input Q' */
    495.             limb* qmqp /* input Q - Q' */)
    496.         {
    497.             var origx = new Long19();
    498.             var origxprime = new Long19();
    499.             var zzz = new Long19();
    500.             var xx = new Long19();
    501.             var zz = new Long19();
    502.             var xxprime = new Long19();
    503.             var zzprime = new Long19();
    504.             var zzzprime = new Long19();
    505.             var xxxprime = new Long19();
    506.  
    507.             memcpy10(origx.Items, x);
    508.             fsum(x, z);
    509.             fdifference(z, origx.Items); // does x - z
    510.  
    511.             memcpy10(origxprime.Items, xprime);
    512.             fsum(xprime, zprime);
    513.             fdifference(zprime, origxprime.Items);
    514.             fproduct(xxprime.Items, xprime, z);
    515.             fproduct(zzprime.Items, x, zprime);
    516.             freduce_degree(xxprime.Items);
    517.             freduce_coefficients(xxprime.Items);
    518.             freduce_degree(zzprime.Items);
    519.             freduce_coefficients(zzprime.Items);
    520.             memcpy10(origxprime.Items, xxprime.Items);
    521.             fsum(xxprime.Items, zzprime.Items);
    522.             fdifference(zzprime.Items, origxprime.Items);
    523.             fsquare(xxxprime.Items, xxprime.Items);
    524.             fsquare(zzzprime.Items, zzprime.Items);
    525.             fproduct(zzprime.Items, zzzprime.Items, qmqp);
    526.             freduce_degree(zzprime.Items);
    527.             freduce_coefficients(zzprime.Items);
    528.             memcpy10(x3, xxxprime.Items);
    529.             memcpy10(z3, zzprime.Items);
    530.  
    531.             fsquare(xx.Items, x);
    532.             fsquare(zz.Items, z);
    533.             fproduct(x2, xx.Items, zz.Items);
    534.             freduce_degree(x2);
    535.             freduce_coefficients(x2);
    536.             fdifference(zz.Items, xx.Items); // does zz = xx - zz
    537.             fscalar_product(zzz.Items, zz.Items, 121665);
    538.             /* No need to call freduce_degree here:
    539.                fscalar_product doesn't increase the degree of its input. */
    540.             freduce_coefficients(zzz.Items);
    541.             fsum(zzz.Items, xx.Items);
    542.             fproduct(z2, zz.Items, zzz.Items);
    543.             freduce_degree(z2);
    544.             freduce_coefficients(z2);
    545.         }
    546.  
    547.         private static void memcpy10(limb* destination, limb* source)
    548.         {
    549.             //ToDo: optimize
    550.             for (int i = 0; i < 10; i++)
    551.             {
    552.                 destination[i] = source[i];
    553.             }
    554.         }
    555.  
    556.         /* Conditionally swap two reduced-form limb arrays if 'iswap' is 1, but leave
    557.          * them unchanged if 'iswap' is 0.  Runs in data-invariant time to avoid
    558.          * side-channel attacks.
    559.          *
    560.          * NOTE that this function requires that 'iswap' be 1 or 0; other values give
    561.          * wrong results.  Also, the two limb arrays must be in reduced-coefficient,
    562.          * reduced-degree form: the values in a[10..19] or b[10..19] aren't swapped,
    563.          * and all all values in a[0..9],b[0..9] must have magnitude less than
    564.          * INT32_MAX.
    565.          */
    566.  
    567.         private static void swap_conditional(limb* a, limb* b, limb iswap)
    568.         {
    569.             int swap = (int)-iswap;
    570.  
    571.             for (int i = 0; i < 10; ++i)
    572.             {
    573.                 int x = swap & (((int)a[i]) ^ ((int)b[i]));
    574.                 a[i] = ((int)a[i]) ^ x;
    575.                 b[i] = ((int)b[i]) ^ x;
    576.             }
    577.         }
    578.  
    579.         /* Calculates nQ where Q is the x-coordinate of a point on the curve
    580.          *
    581.          *   resultx/resultz: the x coordinate of the resulting curve point (short form)
    582.          *   n: a little endian, 32-byte number
    583.          *   q: a point of the curve (short form)
    584.          */
    585.  
    586.         private static void cmult(limb* resultx, limb* resultz, byte* n, limb* q)
    587.         {
    588.             Long19 a = new Long19();
    589.             Long19 b = new Long19();
    590.             Long19 c = new Long19();
    591.             Long19 d = new Long19();
    592.             b.Items[0] = 1;
    593.             c.Items[0] = 1;
    594.             limb* nqpqx = a.Items,
    595.             nqpqz = b.Items,
    596.             nqx = c.Items,
    597.             nqz = d.Items,
    598.             t;
    599.             Long19 e = new Long19();
    600.             Long19 f = new Long19();
    601.             Long19 g = new Long19();
    602.             Long19 h = new Long19();
    603.             f.Items[0] = 1;
    604.             h.Items[0] = 1;
    605.             limb* nqpqx2 = e.Items,
    606.             nqpqz2 = f.Items,
    607.             nqx2 = g.Items,
    608.             nqz2 = h.Items;
    609.  
    610.             memcpy10(nqpqx, q);
    611.  
    612.             for (int i = 0; i < 32; ++i)
    613.             {
    614.                 byte @byte = n[31 - i];
    615.                 for (int j = 0; j < 8; ++j)
    616.                 {
    617.                     limb bit = @byte >> 7;
    618.  
    619.                     swap_conditional(nqx, nqpqx, bit);
    620.                     swap_conditional(nqz, nqpqz, bit);
    621.                     fmonty(nqx2, nqz2,
    622.                         nqpqx2, nqpqz2,
    623.                         nqx, nqz,
    624.                         nqpqx, nqpqz,
    625.                         q);
    626.                     swap_conditional(nqx2, nqpqx2, bit);
    627.                     swap_conditional(nqz2, nqpqz2, bit);
    628.  
    629.                     t = nqx;
    630.                     nqx = nqx2;
    631.                     nqx2 = t;
    632.                     t = nqz;
    633.                     nqz = nqz2;
    634.                     nqz2 = t;
    635.                     t = nqpqx;
    636.                     nqpqx = nqpqx2;
    637.                     nqpqx2 = t;
    638.                     t = nqpqz;
    639.                     nqpqz = nqpqz2;
    640.                     nqpqz2 = t;
    641.  
    642.                     @byte <<= 1;
    643.                 }
    644.             }
    645.  
    646.             memcpy10(resultx, nqx);
    647.             memcpy10(resultz, nqz);
    648.         }
    649.  
    650.         // -----------------------------------------------------------------------------
    651.         // Shamelessly copied from djb's code
    652.         // -----------------------------------------------------------------------------
    653.         private static void crecip(limb* output, limb* z)
    654.         {
    655.             Long19 z2 = new Long19();
    656.             Long19 z9 = new Long19();
    657.             Long19 z11 = new Long19();
    658.             Long19 z2_5_0 = new Long19();
    659.             Long19 z2_10_0 = new Long19();
    660.             Long19 z2_20_0 = new Long19();
    661.             Long19 z2_50_0 = new Long19();
    662.             Long19 z2_100_0 = new Long19();
    663.             Long19 t0 = new Long19();
    664.             Long19 t1 = new Long19();
    665.             int i;
    666.  
    667.             /* 2 */
    668.             fsquare(z2.Items, z);
    669.             /* 4 */
    670.             fsquare(t1.Items, z2.Items);
    671.             /* 8 */
    672.             fsquare(t0.Items, t1.Items);
    673.             /* 9 */
    674.             fmul(z9.Items, t0.Items, z);
    675.             /* 11 */
    676.             fmul(z11.Items, z9.Items, z2.Items);
    677.             /* 22 */
    678.             fsquare(t0.Items, z11.Items);
    679.             /* 2^5 - 2^0 = 31 */
    680.             fmul(z2_5_0.Items, t0.Items, z9.Items);
    681.  
    682.             /* 2^6 - 2^1 */
    683.             fsquare(t0.Items, z2_5_0.Items);
    684.             /* 2^7 - 2^2 */
    685.             fsquare(t1.Items, t0.Items);
    686.             /* 2^8 - 2^3 */
    687.             fsquare(t0.Items, t1.Items);
    688.             /* 2^9 - 2^4 */
    689.             fsquare(t1.Items, t0.Items);
    690.             /* 2^10 - 2^5 */
    691.             fsquare(t0.Items, t1.Items);
    692.             /* 2^10 - 2^0 */
    693.             fmul(z2_10_0.Items, t0.Items, z2_5_0.Items);
    694.  
    695.             /* 2^11 - 2^1 */
    696.             fsquare(t0.Items, z2_10_0.Items);
    697.             /* 2^12 - 2^2 */
    698.             fsquare(t1.Items, t0.Items);
    699.             /* 2^20 - 2^10 */
    700.             for (i = 2; i < 10; i += 2)
    701.             {
    702.                 fsquare(t0.Items, t1.Items);
    703.                 fsquare(t1.Items, t0.Items);
    704.             }
    705.             /* 2^20 - 2^0 */
    706.             fmul(z2_20_0.Items, t1.Items, z2_10_0.Items);
    707.  
    708.             /* 2^21 - 2^1 */
    709.             fsquare(t0.Items, z2_20_0.Items);
    710.             /* 2^22 - 2^2 */
    711.             fsquare(t1.Items, t0.Items);
    712.             /* 2^40 - 2^20 */
    713.             for (i = 2; i < 20; i += 2)
    714.             {
    715.                 fsquare(t0.Items, t1.Items);
    716.                 fsquare(t1.Items, t0.Items);
    717.             }
    718.             /* 2^40 - 2^0 */
    719.             fmul(t0.Items, t1.Items, z2_20_0.Items);
    720.  
    721.             /* 2^41 - 2^1 */
    722.             fsquare(t1.Items, t0.Items);
    723.             /* 2^42 - 2^2 */
    724.             fsquare(t0.Items, t1.Items);
    725.             /* 2^50 - 2^10 */
    726.             for (i = 2; i < 10; i += 2)
    727.             {
    728.                 fsquare(t1.Items, t0.Items);
    729.                 fsquare(t0.Items, t1.Items);
    730.             }
    731.             /* 2^50 - 2^0 */
    732.             fmul(z2_50_0.Items, t0.Items, z2_10_0.Items);
    733.  
    734.             /* 2^51 - 2^1 */
    735.             fsquare(t0.Items, z2_50_0.Items);
    736.             /* 2^52 - 2^2 */
    737.             fsquare(t1.Items, t0.Items);
    738.             /* 2^100 - 2^50 */
    739.             for (i = 2; i < 50; i += 2)
    740.             {
    741.                 fsquare(t0.Items, t1.Items);
    742.                 fsquare(t1.Items, t0.Items);
    743.             }
    744.             /* 2^100 - 2^0 */
    745.             fmul(z2_100_0.Items, t1.Items, z2_50_0.Items);
    746.  
    747.             /* 2^101 - 2^1 */
    748.             fsquare(t1.Items, z2_100_0.Items);
    749.             /* 2^102 - 2^2 */
    750.             fsquare(t0.Items, t1.Items);
    751.             /* 2^200 - 2^100 */
    752.             for (i = 2; i < 100; i += 2)
    753.             {
    754.                 fsquare(t1.Items, t0.Items);
    755.                 fsquare(t0.Items, t1.Items);
    756.             }
    757.             /* 2^200 - 2^0 */
    758.             fmul(t1.Items, t0.Items, z2_100_0.Items);
    759.  
    760.             /* 2^201 - 2^1 */
    761.             fsquare(t0.Items, t1.Items);
    762.             /* 2^202 - 2^2 */
    763.             fsquare(t1.Items, t0.Items);
    764.             /* 2^250 - 2^50 */
    765.             for (i = 2; i < 50; i += 2)
    766.             {
    767.                 fsquare(t0.Items, t1.Items);
    768.                 fsquare(t1.Items, t0.Items);
    769.             }
    770.             /* 2^250 - 2^0 */
    771.             fmul(t0.Items, t1.Items, z2_50_0.Items);
    772.  
    773.             /* 2^251 - 2^1 */
    774.             fsquare(t1.Items, t0.Items);
    775.             /* 2^252 - 2^2 */
    776.             fsquare(t0.Items, t1.Items);
    777.             /* 2^253 - 2^3 */
    778.             fsquare(t1.Items, t0.Items);
    779.             /* 2^254 - 2^4 */
    780.             fsquare(t0.Items, t1.Items);
    781.             /* 2^255 - 2^5 */
    782.             fsquare(t1.Items, t0.Items);
    783.             /* 2^255 - 21 */
    784.             fmul(output, t1.Items, z11.Items);
    785.         }
    786.  
    787.         internal struct Byte32
    788.         {
    789.             public fixed byte Items[32];
    790.         }
    791.  
    792.         internal static void curve25519_donna(byte* mypublic, byte* secret, byte* basepoint)
    793.         {
    794.             Long19 bp = new Long19();
    795.             Long19 x = new Long19();
    796.             Long19 z = new Long19();
    797.             Long19 zmone = new Long19();
    798.             Byte32 e = new Byte32();
    799.             int i;
    800.  
    801.             for (i = 0; i < 32; ++i)
    802.                 e.Items[i] = secret[i];
    803.             e.Items[0] &= 248;
    804.             e.Items[31] &= 127;
    805.             e.Items[31] |= 64;
    806.  
    807.             fexpand(bp.Items, basepoint);
    808.             cmult(x.Items, z.Items, e.Items, bp.Items);
    809.             crecip(zmone.Items, z.Items);
    810.             fmul(z.Items, x.Items, zmone.Items);
    811.             freduce_coefficients(z.Items);
    812.             fcontract(mypublic, z.Items);
    813.         }
    814.     }
    815.  
    816.     public unsafe class Curve25519
    817.     {
    818.         /// <summary>
    819.         /// Private key clamping (inline, for performance)
    820.         /// </summary>
    821.         /// <param name="key">[out] 32 random bytes</param>
    822.         public static void ClampPrivateKeyInline(byte[] key)
    823.         {
    824.             if (key == null) throw new ArgumentNullException("key");
    825.             if (key.Length != 32) throw new ArgumentException(String.Format("key must be 32 bytes long (but was {0} bytes long)", key.Length));
    826.  
    827.             key[31] &= 0x7F;
    828.             key[31] |= 0x40;
    829.             key[0] &= 0xF8;
    830.         }
    831.  
    832.         /// <summary>
    833.         /// Private key clamping
    834.         /// </summary>
    835.         /// <param name="rawKey">[out] 32 random bytes</param>
    836.         public static byte[] ClampPrivateKey(byte[] rawKey)
    837.         {
    838.             if (rawKey == null) throw new ArgumentNullException("rawKey");
    839.             if (rawKey.Length != 32) throw new ArgumentException(String.Format("rawKey must be 32 bytes long (but was {0} bytes long)", rawKey.Length), "rawKey");
    840.  
    841.             var res = new byte[32];
    842.             Array.Copy(rawKey, res, 32);
    843.  
    844.             res[31] &= 0x7F;
    845.             res[31] |= 0x40;
    846.             res[0] &= 0xF8;
    847.  
    848.             return res;
    849.         }
    850.  
    851.         private static readonly byte[] BasePoint = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 };
    852.         /// <summary>
    853.         /// Generates the public key out of the clamped private key
    854.         /// </summary>
    855.         /// <param name="privateKey">private key (must use ClampPrivateKey first!)</param>
    856.         public static byte[] GetPublicKey(byte[] privateKey)
    857.         {
    858.             var publicKey = new byte[32];
    859.  
    860.             fixed (byte* mypublic = publicKey)
    861.             fixed (byte* mysecret = privateKey)
    862.             fixed (byte* basepoint = BasePoint)
    863.             {
    864.                 Curve25519Donna.curve25519_donna(mypublic, mysecret, basepoint);
    865.             }
    866.             return publicKey;
    867.         }
    868.  
    869.         /// <summary>
    870.         /// Creates a random private key
    871.         /// </summary>
    872.         /// <returns>32 random bytes that are clamped to a suitable private key</returns>
    873.         public static byte[] CreateRandomPrivateKey()
    874.         {
    875.             var privateKey = new byte[32];
    876.             RNGCryptoServiceProvider.Create().GetBytes(privateKey);
    877.             ClampPrivateKeyInline(privateKey);
    878.  
    879.             return privateKey;
    880.         }
    881.  
    882.         /// <summary>
    883.         /// Key agreement
    884.         /// </summary>
    885.         /// <param name="privateKey">[in] your private key for key agreement</param>
    886.         /// <param name="peerPublicKey">[in] peer's public key</param>
    887.         /// <returns>shared secret (needs hashing before use)</returns>
    888.         public static byte[] GetSharedSecret(byte[] privateKey, byte[] peerPublicKey)
    889.         {
    890.             var sharedSecret = new byte[32];
    891.  
    892.             fixed (byte* sharedkey = sharedSecret)
    893.             fixed (byte* mysecret = privateKey)
    894.             fixed (byte* theirpublic = peerPublicKey)
    895.             {
    896.                 Curve25519Donna.curve25519_donna(sharedkey, mysecret, theirpublic);
    897.             }
    898.             return sharedSecret;
    899.         }
    900.     }
    901. }
    Damit ihr nicht suchen müsst Zeile 332 :D
    NullReference Exeption
     
    Zuletzt von einem Moderator bearbeitet: 25. Oktober 2014
  4. sheel

    sheel I love Asm Administrator

    Hi

    wie lautet denn der ganze Callstack zur Exception?
     
  5. Ministalker

    Ministalker Grünschnabel

    Ok den Callstack hab ich vorher ignoriert.
    Jetzt konnte ich durch den Callstack alle Fehler selber beheben.
    Vielen Dank!

    Nun habe ich noch ein paar Fragen:
    Ich nutze C# für Android und Smartphones haben bekanntlich noch immer "nur" eine 32 bit CPU.
    In meiner Verschlüsselung ich jedoch entweder auf Int32 oder Int64 zugreifen.
    Aber Int64 lässt meinen Raspberry einen Exception werfen.
    Kann ich Int64 auf 32 bit CPU nicht nutzen? (Klingt für mich jetzt logisch) :D

    Wenn ich new TcpClient("IP", Port); mache dauert es bis die App im Thread weitermacht wie kann ich den Timeout verkürzen, so das falls nach 3-5 Sekunden immer noch nicht eine Verpindung aufgebaut werden konnte er eine Exception wirft die ich abfange um den Nutzer zu informieren.
     
  6. Spyke

    Spyke Capoeirista Premium-User

    Was für eine Exception?
    Int64 funktioniert auch auf 32 bit Systemen.
    Es gibt halt nur keine so gute Optimierung wie auf einem 64 bit System.
     
  7. Ministalker

    Ministalker Grünschnabel

    Das Problem hat sich gelöst
     
Die Seite wird geladen...