lilliput-ae-reference-implementation

Implementations of Lilliput-AE submitted to the NIST LWC standardization process
git clone https://git.kevinlegouguec.net/lilliput-ae-reference-implementation
Log | Files | Refs | README

test-ae-encrypt.c (5475B)


      1 #include <stdio.h>
      2 #include <stdint.h>
      3 #include <string.h>
      4 
      5 #include "lilliput-ae.h"
      6 
      7 #include "test-helpers.h"
      8 
      9 
     10 struct vector
     11 {
     12     char *name;
     13     uint8_t key[KEY_BYTES];
     14     uint8_t nonce[NONCE_BYTES];
     15     size_t auth_len;
     16     uint8_t *auth;
     17     size_t message_len;
     18     uint8_t *message;
     19     uint8_t *ciphertext;
     20     uint8_t tag[TAG_BYTES];
     21 };
     22 
     23 typedef struct vector vector;
     24 
     25 
     26 const vector VECTORS[] = {
     27     {
     28         .name = "order",
     29         .key = {
     30             0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     31             0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
     32         },
     33         .nonce = {
     34             0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     35             0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e
     36         },
     37         .auth_len = 64,
     38         .auth = (uint8_t[]) {
     39             0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     40             0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
     41             0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
     42             0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
     43             0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
     44             0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
     45             0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
     46             0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
     47         },
     48         .message_len = 64,
     49         .message = (uint8_t[]) {
     50             0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     51             0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
     52             0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
     53             0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
     54             0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
     55             0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
     56             0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
     57             0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
     58         },
     59         .ciphertext = (uint8_t[]) {
     60             0xa2, 0xd5, 0xa6, 0x38, 0xca, 0xcf, 0xce, 0x90,
     61             0xaf, 0xc3, 0xb8, 0x99, 0x36, 0xba, 0xf1, 0x12,
     62             0x94, 0x13, 0x87, 0xb8, 0x7e, 0x6c, 0x07, 0x48,
     63             0x25, 0x25, 0x66, 0xd8, 0xa4, 0x05, 0xc9, 0xd3,
     64             0xc0, 0xaa, 0x27, 0xc6, 0xa6, 0x67, 0x53, 0x8f,
     65             0xcc, 0xd9, 0xd3, 0xdb, 0xf5, 0xdc, 0xad, 0xa0,
     66             0x4b, 0x3e, 0x9a, 0xfb, 0x7c, 0xe9, 0x17, 0x9c,
     67             0xb8, 0x17, 0x13, 0x9f, 0x32, 0x70, 0x5c, 0x62
     68         },
     69         .tag = {
     70             0x04, 0xaa, 0xc8, 0x19, 0x32, 0x70, 0x32, 0x24,
     71             0xe8, 0x27, 0xb7, 0xab, 0xec, 0xd8, 0x2f, 0x6c
     72         }
     73     },
     74     {
     75         .name = "order-padded",
     76         .key = {
     77             0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     78             0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
     79         },
     80         .nonce = {
     81             0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     82             0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e
     83         },
     84         .auth_len = 66,
     85         .auth = (uint8_t[]) {
     86             0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     87             0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
     88             0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
     89             0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
     90             0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
     91             0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
     92             0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
     93             0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
     94             0x40, 0x01
     95         },
     96         .message_len = 66,
     97         .message = (uint8_t[]) {
     98             0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     99             0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    100             0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
    101             0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
    102             0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
    103             0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
    104             0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
    105             0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
    106             0x40, 0x01
    107         },
    108         .ciphertext = (uint8_t[]) {
    109             0xa2, 0xd5, 0xa6, 0x38, 0xca, 0xcf, 0xce, 0x90,
    110             0xaf, 0xc3, 0xb8, 0x99, 0x36, 0xba, 0xf1, 0x12,
    111             0x94, 0x13, 0x87, 0xb8, 0x7e, 0x6c, 0x07, 0x48,
    112             0x25, 0x25, 0x66, 0xd8, 0xa4, 0x05, 0xc9, 0xd3,
    113             0xc0, 0xaa, 0x27, 0xc6, 0xa6, 0x67, 0x53, 0x8f,
    114             0xcc, 0xd9, 0xd3, 0xdb, 0xf5, 0xdc, 0xad, 0xa0,
    115             0x4b, 0x3e, 0x9a, 0xfb, 0x7c, 0xe9, 0x17, 0x9c,
    116             0xb8, 0x17, 0x13, 0x9f, 0x32, 0x70, 0x5c, 0x62,
    117             0x88, 0x5a
    118         },
    119         .tag = {
    120             0x64, 0xa2, 0x24, 0x03, 0xc5, 0x79, 0x4f, 0xec,
    121             0xe7, 0x7d, 0xc1, 0xf6, 0xc9, 0xc6, 0x77, 0x2c
    122         }
    123     }
    124 };
    125 
    126 
    127 int main()
    128 {
    129     int diff = 0;
    130 
    131     for (const vector *v=VECTORS; v<ARRAY_END(VECTORS); v++)
    132     {
    133         uint8_t ciphertext[v->message_len];
    134         uint8_t tag[TAG_BYTES];
    135 
    136         lilliput_ae_encrypt(
    137             v->message_len, v->message,
    138             v->auth_len, v->auth,
    139             v->key, v->nonce,
    140             ciphertext,
    141             tag
    142         );
    143 
    144         if (memcmp(ciphertext, v->ciphertext, v->message_len) != 0)
    145         {
    146             REPORT_DIFFERENCE(v->name, "ciphertext");
    147             dump_c_initializer(v->message_len, ciphertext);
    148             diff++;
    149         }
    150 
    151         if (memcmp(tag, v->tag, TAG_BYTES) != 0)
    152         {
    153             REPORT_DIFFERENCE(v->name, "tag");
    154             dump_c_initializer(TAG_BYTES, tag);
    155             diff++;
    156         }
    157     }
    158 
    159     return diff;
    160 }