Skip to content
Snippets Groups Projects
demo.c 4.33 KiB
Newer Older
/*
 * demo.c - Example use of the BS-SPEKE functions
 *
 * Author: Charles V. Wright <cvwright@futo.org>
 * 
 * Copyright (c) 2022 FUTO Holdings, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "bsspeke.h"

int demo_setup(bsspeke_user_info_t *user_info)
{
    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,
                                           user_info,
                                           &server);

    puts("");
    puts("Setup: Client generating message 3");
    bsspeke_client_setup_generate_message3(&msg3, &msg2,
                                           100000, 3,
                                           &client);
    
    puts("");
    puts("Setup: Server processing message 3");
    bsspeke_server_setup_process_message3(&msg3, user_info, &server);

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

    return 0;
}

int demo_login(bsspeke_user_info_t *user_info)
{
    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,
                                           user_info,
                                           &server);

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

    puts("");
    puts("Login: Server generating message 4");
    bsspeke_server_login_generate_message4(&msg4, &msg3, user_info, &server);

    puts("");
    puts("Login: Client verifying message 4");
    bsspeke_client_login_verify_message4(&msg4, &client);

    return 0;

}

int main(int argc, char *argv[])
{
    // Here we're pretending to be the server's long-term storage
    bsspeke_user_info_t user_info;
    if( (rc = demo_setup(&user_info)) != 0 ) {
        puts("Setup failed :(");
        exit(-1);
    }

    if( (rc = demo_login(&user_info)) != 0 ) {
        puts("Login failed :(");
        exit(-1);
    }

    return 0;
}