Skip to content
Snippets Groups Projects
demo.c 3.48 KiB
Newer Older
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "bsspeke.h"

int demo_setup(uint8_t salt[32],
               uint8_t P[32],
               uint8_t V[32])
{
    bsspeke_client_ctx client;
    bsspeke_server_ctx server;

    puts("");
    puts("Starting Setup");

    const char *client_id = "@alice:example.com";
    const char *server_id = "bob.example.com";
    const char *password = "P@ssword1";

    puts("");
    puts("Setup: Initializing client");
    bsspeke_client_init(&client,
                        client_id, strlen(client_id),
                        server_id, strlen(server_id),
                        password, strlen(password));

    puts("Setup: Initializing server");
    bsspeke_server_init(&server,
                        server_id, strlen(server_id));

    bsspeke_setup_msg1_t msg1;
    bsspeke_setup_msg2_t msg2;
    bsspeke_setup_msg3_t msg3;

    puts("");
    puts("Setup: Client generating message 1");
    bsspeke_client_setup_generate_message1(&msg1, &client);

    puts("");
    puts("Setup: Server generating message 2");
    bsspeke_server_setup_generate_message2(&msg2, &msg1,
                                           salt, 32,
                                           &server);

    puts("");
    puts("Setup: Client generating message 3");
    bsspeke_client_setup_generate_message3(&msg3, &msg2,
                                           100000, 3,
                                           &client);
    
    puts("");
    puts("Setup: Saving parameters from setup");
    memcpy(P, msg3.P, 32);
    memcpy(V, msg3.V, 32);

    puts("");
    puts("Setup: Done");

    return 0;
}

int demo_login(uint8_t salt[32],
               uint8_t P[32],
               uint8_t V[32])
{
    bsspeke_client_ctx client;
    bsspeke_server_ctx server;

    puts("");
    puts("Starting Login");

    const char *client_id = "@alice:example.com";
    const char *server_id = "bob.example.com";
    const char *password = "P@ssword1";

    puts("");
    puts("Login: Initializing client");
    bsspeke_client_init(&client,
                        client_id, strlen(client_id),
                        server_id, strlen(server_id),
                        password, strlen(password));

    puts("Login: Initializing server");
    bsspeke_server_init(&server,
                        server_id, strlen(server_id));

    bsspeke_login_msg1_t msg1;
    bsspeke_login_msg2_t msg2;
    bsspeke_login_msg3_t msg3;
    bsspeke_login_msg4_t msg4;

    puts("");
    puts("Login: Client generating message 1");
    bsspeke_client_login_generate_message1(&msg1, &client);

    puts("");
    puts("Login: Server generating message 2");
    bsspeke_server_login_generate_message2(&msg2, &msg1,
                                           salt, 32,
                                           P, V,
                                           100000, 3,
                                           &server);

    puts("");
    puts("Login: Client generating message 3");
    bsspeke_client_login_generate_message3(&msg3, &msg2, &client);


    return 0;

}

int main(int argc, char *argv[])
{
    // Here we're pretending to be the server's long-term storage
    // It needs to know the salt, V, and P for each registered user
    uint8_t salt[32];
    uint8_t V[32];
    uint8_t P[32];

    int rc = 0;

    if( (rc = demo_setup(salt, P, V)) != 0 ) {
        puts("Setup failed :(");
        exit(-1);
    }

    if( (rc = demo_login(salt, P, V)) != 0 ) {
        puts("Login failed :(");
        exit(-1);
    }

    return 0;
}