/**
 *--------------------------------------------------------------------\n
 *          HSLU T&A Hochschule Luzern Technik+Architektur            \n
 *--------------------------------------------------------------------\n
 *
 * \brief         ASYD assignment crypto 03
 * \file
 * \author        Basil Estermann, basil.estermann@stud.hslu.ch
 *                Simon Frei, simon.frei@stud.hslu.ch
 *                Jonas Arnold, jonas.arnold@stud.hslu.ch
 * \date          10.03.2023
 *
 *--------------------------------------------------------------------
 */

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "encryptionArithmetic.h"
#include "DHKE.h"


#define KEY_LENGTH 64

void main(void) {

    /* Initialize variables */

    // P has to be a prime number! Large prime number (64bit): 3203431780337000
    t_encryptionArithmetic P;
    encryptionArithmetic_Init(&P, KEY_LENGTH);
    if (encryptionArithmetic_stringToHex("3203431780337000", P.number, KEY_LENGTH) == false) {
        printf("ERROR: Creating P.");
        return 1000000;
    }

    // alpha not required for session key generation
    //t_encryptionArithmetic alpha;
    //encryptionArithmetic_Init(&alpha, KEY_LENGTH);
    //if (encryptionArithmetic_stringToHex("13", alpha.number, KEY_LENGTH) == false) {
    //    printf("ERROR: Creating alpha.");
    //    return 1000001;
    //}

    t_encryptionArithmetic pub;
    encryptionArithmetic_Init(&pub, KEY_LENGTH);
    if (encryptionArithmetic_stringToHex("1370122177720875", pub.number, KEY_LENGTH) == false) {
        printf("ERROR: Creating pub.");
        return 1000002;
    }

    t_encryptionArithmetic priv;
    encryptionArithmetic_Init(&priv, KEY_LENGTH);
    if (encryptionArithmetic_stringToHex("9778729279583412", priv.number, KEY_LENGTH) == false) {
        printf("ERROR: Creating priv.");
        return 1000003;
    }

    t_encryptionArithmetic session_key;
    encryptionArithmetic_Init(&session_key, KEY_LENGTH);


    /* Create session key */
    squareAndMultiply(&pub, &priv, &P, &session_key, KEY_LENGTH);


    /* Write session key */
    printf("%i",*session_key.number);


    return 0;
}