summaryrefslogtreecommitdiffstatshomepage
path: root/aes/src/key.c
blob: e151e7ec5bdd35894150b4031ba987ad53a20dc0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
 * Copyright (c) 2015 Egor Tensin <egor@tensin.name>
 * This file is part of the "AES tools" project.
 * For details, see https://github.com/egor-tensin/aes-tools
 * Distributed under the MIT License.
 */

#include <aes/all.h>

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

AES_StatusCode aes128_format_key(
    AES128_KeyString* str,
    const AES128_Key* key,
    AES_ErrorDetails* err_details
) {
    if (str == NULL)
        return aes_error_null_argument(err_details, "str");
    if (key == NULL)
        return aes_error_null_argument(err_details, "key");

    char* cursor = aes_format_block_hex(str->str, key->key);
    *cursor = '\0';
    return AES_SUCCESS;
}

AES_StatusCode aes192_format_key(
    AES192_KeyString* str,
    const AES192_Key* key,
    AES_ErrorDetails* err_details
) {
    if (str == NULL)
        return aes_error_null_argument(err_details, "str");
    if (key == NULL)
        return aes_error_null_argument(err_details, "key");

    char* cursor = aes_format_block_hex(str->str, key->lo);
    cursor = aes_format_block_hex_partial(cursor, key->hi, 8);
    *cursor = '\0';
    return AES_SUCCESS;
}

AES_StatusCode aes256_format_key(
    AES256_KeyString* str,
    const AES256_Key* key,
    AES_ErrorDetails* err_details
) {
    if (str == NULL)
        return aes_error_null_argument(err_details, "str");
    if (key == NULL)
        return aes_error_null_argument(err_details, "key");

    char* cursor = aes_format_block_hex(str->str, key->lo);
    cursor = aes_format_block_hex(cursor, key->hi);
    *cursor = '\0';
    return AES_SUCCESS;
}

AES_StatusCode aes128_parse_key(AES128_Key* dest, const char* src, AES_ErrorDetails* err_details) {
    if (dest == NULL)
        return aes_error_null_argument(err_details, "dest");
    if (src == NULL)
        return aes_error_null_argument(err_details, "src");

    return aes_parse_block(&dest->key, src, err_details);
}

AES_StatusCode aes192_parse_key(AES192_Key* dest, const char* src, AES_ErrorDetails* err_details) {
    if (dest == NULL)
        return aes_error_null_argument(err_details, "dest");
    if (src == NULL)
        return aes_error_null_argument(err_details, "src");

    AES_ALIGN(unsigned char, 16) bytes[32];
    memset(bytes, 0x00, sizeof(bytes));

    AES_StatusCode status = aes_parse_hex_string(bytes, src, 24, err_details);
    if (aes_is_error(status))
        return status;

    dest->lo = aes_load_block_aligned(bytes);
    dest->hi = aes_load_block_aligned(bytes + 16);

    return status;
}

AES_StatusCode aes256_parse_key(AES256_Key* dest, const char* src, AES_ErrorDetails* err_details) {
    if (dest == NULL)
        return aes_error_null_argument(err_details, "dest");
    if (src == NULL)
        return aes_error_null_argument(err_details, "src");

    AES_ALIGN(unsigned char, 16) bytes[32];

    AES_StatusCode status = aes_parse_hex_string(bytes, src, sizeof(bytes), err_details);
    if (aes_is_error(status))
        return status;

    dest->lo = aes_load_block_aligned(bytes);
    dest->hi = aes_load_block_aligned(bytes + 16);

    return status;
}