1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * lws-api-test-gencrypto - lws-genaes 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Written in 2010-2018 by Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0 7d4afb5ceSopenharmony_ci * Universal Public Domain Dedication. 8d4afb5ceSopenharmony_ci */ 9d4afb5ceSopenharmony_ci 10d4afb5ceSopenharmony_ci#include <libwebsockets.h> 11d4afb5ceSopenharmony_ci 12d4afb5ceSopenharmony_ci 13d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CBC))) || \ 14d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_cbc)) 15d4afb5ceSopenharmony_ci 16d4afb5ceSopenharmony_cistatic const uint8_t 17d4afb5ceSopenharmony_ci /* 18d4afb5ceSopenharmony_ci * produced with (plaintext.txt contains "test plaintext\0\0") 19d4afb5ceSopenharmony_ci * 20d4afb5ceSopenharmony_ci * openssl enc -aes256 \ 21d4afb5ceSopenharmony_ci * -K "0123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210" \ 22d4afb5ceSopenharmony_ci * -iv "0123456789abcdeffedcba9876543210" 23d4afb5ceSopenharmony_ci * -in plaintext.txt -out out.enc 24d4afb5ceSopenharmony_ci * 25d4afb5ceSopenharmony_ci */ 26d4afb5ceSopenharmony_ci *cbc256 = (uint8_t *)"test plaintext\0\0", 27d4afb5ceSopenharmony_ci cbc256_enc[] = { 28d4afb5ceSopenharmony_ci 0x2b, 0x5d, 0xb2, 0xa8, 0x5a, 0x5a, 0xf4, 0x2e, 29d4afb5ceSopenharmony_ci 0xf7, 0xf9, 0xc5, 0x3c, 0x73, 0xef, 0x40, 0x88, 30d4afb5ceSopenharmony_ci }, cbc256_iv[] = { 31d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 32d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 33d4afb5ceSopenharmony_ci }, cbc256_key[] = { 34d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 35d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 36d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 37d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 38d4afb5ceSopenharmony_ci } 39d4afb5ceSopenharmony_ci; 40d4afb5ceSopenharmony_ci 41d4afb5ceSopenharmony_cistatic int 42d4afb5ceSopenharmony_citest_genaes_cbc(void) 43d4afb5ceSopenharmony_ci{ 44d4afb5ceSopenharmony_ci struct lws_genaes_ctx ctx; 45d4afb5ceSopenharmony_ci struct lws_gencrypto_keyelem e; 46d4afb5ceSopenharmony_ci uint8_t res[32], res1[32]; 47d4afb5ceSopenharmony_ci 48d4afb5ceSopenharmony_ci /* 49d4afb5ceSopenharmony_ci * As part of a jwk, these are allocated. But here we just use one as 50d4afb5ceSopenharmony_ci * a wrapper on a static binary key. 51d4afb5ceSopenharmony_ci */ 52d4afb5ceSopenharmony_ci e.buf = (uint8_t *)cbc256_key; 53d4afb5ceSopenharmony_ci e.len = sizeof(cbc256_key); 54d4afb5ceSopenharmony_ci 55d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_CBC, &e, 0, NULL)) { 56d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create failed\n", __func__); 57d4afb5ceSopenharmony_ci return 1; 58d4afb5ceSopenharmony_ci } 59d4afb5ceSopenharmony_ci 60d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, cbc256, 16, res, (uint8_t *)cbc256_iv, 61d4afb5ceSopenharmony_ci NULL, NULL, 0)) { 62d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt failed\n", __func__); 63d4afb5ceSopenharmony_ci goto bail; 64d4afb5ceSopenharmony_ci } 65d4afb5ceSopenharmony_ci 66d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 67d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy enc failed\n", __func__); 68d4afb5ceSopenharmony_ci return -1; 69d4afb5ceSopenharmony_ci } 70d4afb5ceSopenharmony_ci 71d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(cbc256_enc, res, 16)) { 72d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__); 73d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, 16); 74d4afb5ceSopenharmony_ci return -1; 75d4afb5ceSopenharmony_ci } 76d4afb5ceSopenharmony_ci 77d4afb5ceSopenharmony_ci 78d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_CBC, &e, 0, NULL)) { 79d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create dec failed\n", __func__); 80d4afb5ceSopenharmony_ci return -1; 81d4afb5ceSopenharmony_ci } 82d4afb5ceSopenharmony_ci 83d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, res, 16, res1, (uint8_t *)cbc256_iv, 84d4afb5ceSopenharmony_ci NULL, NULL, 0)) { 85d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__); 86d4afb5ceSopenharmony_ci goto bail; 87d4afb5ceSopenharmony_ci } 88d4afb5ceSopenharmony_ci 89d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 90d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy dec failed\n", __func__); 91d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res1, 16); 92d4afb5ceSopenharmony_ci return -1; 93d4afb5ceSopenharmony_ci } 94d4afb5ceSopenharmony_ci 95d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(cbc256, res1, 16)) { 96d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__); 97d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, 16); 98d4afb5ceSopenharmony_ci return -1; 99d4afb5ceSopenharmony_ci } 100d4afb5ceSopenharmony_ci 101d4afb5ceSopenharmony_ci return 0; 102d4afb5ceSopenharmony_ci 103d4afb5ceSopenharmony_cibail: 104d4afb5ceSopenharmony_ci lws_genaes_destroy(&ctx, NULL, 0); 105d4afb5ceSopenharmony_ci 106d4afb5ceSopenharmony_ci return -1; 107d4afb5ceSopenharmony_ci} 108d4afb5ceSopenharmony_ci#endif 109d4afb5ceSopenharmony_ci 110d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \ 111d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_cfb128)) 112d4afb5ceSopenharmony_cistatic const uint8_t 113d4afb5ceSopenharmony_ci/* 114d4afb5ceSopenharmony_ci * produced with (plaintext.txt contains "test plaintext\0\0") 115d4afb5ceSopenharmony_ci * 116d4afb5ceSopenharmony_ci * openssl enc -aes-128-cfb \ 117d4afb5ceSopenharmony_ci * -K "0123456789abcdeffedcba9876543210" \ 118d4afb5ceSopenharmony_ci * -iv "0123456789abcdeffedcba9876543210" 119d4afb5ceSopenharmony_ci * -in plaintext.txt -out out.enc 120d4afb5ceSopenharmony_ci * 121d4afb5ceSopenharmony_ci */ 122d4afb5ceSopenharmony_ci*cfb128 = (uint8_t *)"test plaintext\0\0", 123d4afb5ceSopenharmony_cicfb128_enc[] = { 124d4afb5ceSopenharmony_ci 0xd2, 0x11, 0x86, 0xd7, 0xa9, 0x55, 0x59, 0x04, 125d4afb5ceSopenharmony_ci 0x4f, 0x63, 0x7c, 0xb9, 0xc6, 0xa1, 0xc9, 0x71 126d4afb5ceSopenharmony_ci}, cfb128_iv[] = { 127d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 128d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 129d4afb5ceSopenharmony_ci}, cfb128_key[] = { 130d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 131d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 132d4afb5ceSopenharmony_ci}; 133d4afb5ceSopenharmony_ci 134d4afb5ceSopenharmony_cistatic int 135d4afb5ceSopenharmony_citest_genaes_cfb128(void) 136d4afb5ceSopenharmony_ci{ 137d4afb5ceSopenharmony_ci struct lws_genaes_ctx ctx; 138d4afb5ceSopenharmony_ci struct lws_gencrypto_keyelem e; 139d4afb5ceSopenharmony_ci uint8_t res[32], res1[32]; 140d4afb5ceSopenharmony_ci size_t iv_off = 0; 141d4afb5ceSopenharmony_ci 142d4afb5ceSopenharmony_ci e.buf = (uint8_t *)cfb128_key; 143d4afb5ceSopenharmony_ci e.len = sizeof(cfb128_key); 144d4afb5ceSopenharmony_ci 145d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_CFB128, &e, 0, NULL)) { 146d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create failed\n", __func__); 147d4afb5ceSopenharmony_ci return 1; 148d4afb5ceSopenharmony_ci } 149d4afb5ceSopenharmony_ci 150d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, cfb128, 16, res, (uint8_t *)cfb128_iv, 151d4afb5ceSopenharmony_ci NULL, &iv_off, 0)) { 152d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt failed\n", __func__); 153d4afb5ceSopenharmony_ci goto bail; 154d4afb5ceSopenharmony_ci } 155d4afb5ceSopenharmony_ci 156d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 157d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy failed\n", __func__); 158d4afb5ceSopenharmony_ci return -1; 159d4afb5ceSopenharmony_ci } 160d4afb5ceSopenharmony_ci 161d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(cfb128_enc, res, 16)) { 162d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__); 163d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, 16); 164d4afb5ceSopenharmony_ci return -1; 165d4afb5ceSopenharmony_ci } 166d4afb5ceSopenharmony_ci 167d4afb5ceSopenharmony_ci iv_off = 0; 168d4afb5ceSopenharmony_ci 169d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_CFB128, &e, 0, NULL)) { 170d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create dec failed\n", __func__); 171d4afb5ceSopenharmony_ci return -1; 172d4afb5ceSopenharmony_ci } 173d4afb5ceSopenharmony_ci 174d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, res, 16, res1, (uint8_t *)cfb128_iv, 175d4afb5ceSopenharmony_ci NULL, &iv_off, 0)) { 176d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__); 177d4afb5ceSopenharmony_ci goto bail; 178d4afb5ceSopenharmony_ci } 179d4afb5ceSopenharmony_ci 180d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 181d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy failed\n", __func__); 182d4afb5ceSopenharmony_ci return -1; 183d4afb5ceSopenharmony_ci } 184d4afb5ceSopenharmony_ci 185d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(cfb128, res1, 16)) { 186d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__); 187d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res1, 16); 188d4afb5ceSopenharmony_ci return -1; 189d4afb5ceSopenharmony_ci } 190d4afb5ceSopenharmony_ci 191d4afb5ceSopenharmony_ci return 0; 192d4afb5ceSopenharmony_ci 193d4afb5ceSopenharmony_cibail: 194d4afb5ceSopenharmony_ci lws_genaes_destroy(&ctx, NULL, 0); 195d4afb5ceSopenharmony_ci 196d4afb5ceSopenharmony_ci return -1; 197d4afb5ceSopenharmony_ci} 198d4afb5ceSopenharmony_ci#endif 199d4afb5ceSopenharmony_ci 200d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \ 201d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_cfb8)) 202d4afb5ceSopenharmony_ci 203d4afb5ceSopenharmony_cistatic const uint8_t 204d4afb5ceSopenharmony_ci/* 205d4afb5ceSopenharmony_ci * produced with (plaintext.txt contains "test plaintext\0\0") 206d4afb5ceSopenharmony_ci * 207d4afb5ceSopenharmony_ci * openssl enc -aes-128-cfb8 \ 208d4afb5ceSopenharmony_ci * -K "0123456789abcdeffedcba9876543210" \ 209d4afb5ceSopenharmony_ci * -iv "0123456789abcdeffedcba9876543210" 210d4afb5ceSopenharmony_ci * -in plaintext.txt -out out.enc 211d4afb5ceSopenharmony_ci * 212d4afb5ceSopenharmony_ci */ 213d4afb5ceSopenharmony_ci*cfb8 = (uint8_t *)"test plaintext\0\0", 214d4afb5ceSopenharmony_cicfb8_enc[] = { 215d4afb5ceSopenharmony_ci 0xd2, 0x91, 0x06, 0x2d, 0x1b, 0x1e, 0x9b, 0x39, 216d4afb5ceSopenharmony_ci 0xa6, 0x65, 0x8e, 0xbe, 0x68, 0x32, 0x3d, 0xab 217d4afb5ceSopenharmony_ci}, cfb8_iv[] = { 218d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 219d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 220d4afb5ceSopenharmony_ci}, cfb8_key[] = { 221d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 222d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 223d4afb5ceSopenharmony_ci}; 224d4afb5ceSopenharmony_ci 225d4afb5ceSopenharmony_cistatic int 226d4afb5ceSopenharmony_citest_genaes_cfb8(void) 227d4afb5ceSopenharmony_ci{ 228d4afb5ceSopenharmony_ci struct lws_genaes_ctx ctx; 229d4afb5ceSopenharmony_ci struct lws_gencrypto_keyelem e; 230d4afb5ceSopenharmony_ci uint8_t res[32], res1[32]; 231d4afb5ceSopenharmony_ci 232d4afb5ceSopenharmony_ci e.buf = (uint8_t *)cfb8_key; 233d4afb5ceSopenharmony_ci e.len = sizeof(cfb8_key); 234d4afb5ceSopenharmony_ci 235d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_CFB8, &e, 0, NULL)) { 236d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create failed\n", __func__); 237d4afb5ceSopenharmony_ci return 1; 238d4afb5ceSopenharmony_ci } 239d4afb5ceSopenharmony_ci 240d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, cfb8, 16, res, (uint8_t *)cfb8_iv, 241d4afb5ceSopenharmony_ci NULL, NULL, 0)) { 242d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt failed\n", __func__); 243d4afb5ceSopenharmony_ci goto bail; 244d4afb5ceSopenharmony_ci } 245d4afb5ceSopenharmony_ci 246d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 247d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy failed\n", __func__); 248d4afb5ceSopenharmony_ci return -1; 249d4afb5ceSopenharmony_ci } 250d4afb5ceSopenharmony_ci 251d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(cfb8_enc, res, 16)) { 252d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__); 253d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, 16); 254d4afb5ceSopenharmony_ci return -1; 255d4afb5ceSopenharmony_ci } 256d4afb5ceSopenharmony_ci 257d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_CFB8, &e, 0, NULL)) { 258d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create dec failed\n", __func__); 259d4afb5ceSopenharmony_ci return -1; 260d4afb5ceSopenharmony_ci } 261d4afb5ceSopenharmony_ci 262d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, res, 16, res1, (uint8_t *)cfb8_iv, 263d4afb5ceSopenharmony_ci NULL, NULL, 0)) { 264d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__); 265d4afb5ceSopenharmony_ci goto bail; 266d4afb5ceSopenharmony_ci } 267d4afb5ceSopenharmony_ci 268d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 269d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy failed\n", __func__); 270d4afb5ceSopenharmony_ci return -1; 271d4afb5ceSopenharmony_ci } 272d4afb5ceSopenharmony_ci 273d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(cfb8, res1, 16)) { 274d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__); 275d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res1, 16); 276d4afb5ceSopenharmony_ci return -1; 277d4afb5ceSopenharmony_ci } 278d4afb5ceSopenharmony_ci 279d4afb5ceSopenharmony_ci return 0; 280d4afb5ceSopenharmony_ci 281d4afb5ceSopenharmony_cibail: 282d4afb5ceSopenharmony_ci lws_genaes_destroy(&ctx, NULL, 0); 283d4afb5ceSopenharmony_ci 284d4afb5ceSopenharmony_ci return -1; 285d4afb5ceSopenharmony_ci} 286d4afb5ceSopenharmony_ci#endif 287d4afb5ceSopenharmony_ci 288d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CTR))) || \ 289d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_ctr)) 290d4afb5ceSopenharmony_cistatic const uint8_t 291d4afb5ceSopenharmony_ci/* 292d4afb5ceSopenharmony_ci * produced with (plaintext.txt contains "test plaintext\0\0") 293d4afb5ceSopenharmony_ci * 294d4afb5ceSopenharmony_ci * openssl enc -aes-128-ctr \ 295d4afb5ceSopenharmony_ci * -K "0123456789abcdeffedcba9876543210" \ 296d4afb5ceSopenharmony_ci * -iv "0123456789abcdeffedcba9876543210" 297d4afb5ceSopenharmony_ci * -in plaintext.txt -out out.enc 298d4afb5ceSopenharmony_ci * 299d4afb5ceSopenharmony_ci */ 300d4afb5ceSopenharmony_ci*ctr = (uint8_t *)"test plaintext\0\0", 301d4afb5ceSopenharmony_cictr_enc[] = { 302d4afb5ceSopenharmony_ci 0xd2, 0x11, 0x86, 0xd7, 0xa9, 0x55, 0x59, 0x04, 303d4afb5ceSopenharmony_ci 0x4f, 0x63, 0x7c, 0xb9, 0xc6, 0xa1, 0xc9, 0x71 304d4afb5ceSopenharmony_ci}, ctr_iv[] = { 305d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 306d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 307d4afb5ceSopenharmony_ci}, ctr_key[] = { 308d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 309d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 310d4afb5ceSopenharmony_ci}; 311d4afb5ceSopenharmony_ci 312d4afb5ceSopenharmony_cistatic int 313d4afb5ceSopenharmony_citest_genaes_ctr(void) 314d4afb5ceSopenharmony_ci{ 315d4afb5ceSopenharmony_ci uint8_t nonce_counter[16], sb[16]; 316d4afb5ceSopenharmony_ci struct lws_genaes_ctx ctx; 317d4afb5ceSopenharmony_ci struct lws_gencrypto_keyelem e; 318d4afb5ceSopenharmony_ci uint8_t res[32], res1[32]; 319d4afb5ceSopenharmony_ci size_t nc_off = 0; 320d4afb5ceSopenharmony_ci 321d4afb5ceSopenharmony_ci e.buf = (uint8_t *)ctr_key; 322d4afb5ceSopenharmony_ci e.len = sizeof(ctr_key); 323d4afb5ceSopenharmony_ci 324d4afb5ceSopenharmony_ci memset(sb, 0, sizeof(nonce_counter)); 325d4afb5ceSopenharmony_ci memcpy(nonce_counter, ctr_iv, sizeof(ctr_iv)); 326d4afb5ceSopenharmony_ci 327d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_CTR, &e, 0, NULL)) { 328d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create failed\n", __func__); 329d4afb5ceSopenharmony_ci return 1; 330d4afb5ceSopenharmony_ci } 331d4afb5ceSopenharmony_ci 332d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, ctr, 16, res, nonce_counter, sb, &nc_off, 0)) { 333d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt failed\n", __func__); 334d4afb5ceSopenharmony_ci goto bail; 335d4afb5ceSopenharmony_ci } 336d4afb5ceSopenharmony_ci 337d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 338d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy failed\n", __func__); 339d4afb5ceSopenharmony_ci return -1; 340d4afb5ceSopenharmony_ci } 341d4afb5ceSopenharmony_ci 342d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(ctr_enc, res, 16)) { 343d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__); 344d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, 16); 345d4afb5ceSopenharmony_ci return -1; 346d4afb5ceSopenharmony_ci } 347d4afb5ceSopenharmony_ci 348d4afb5ceSopenharmony_ci nc_off = 0; 349d4afb5ceSopenharmony_ci memset(sb , 0, sizeof(nonce_counter)); 350d4afb5ceSopenharmony_ci memcpy(nonce_counter, ctr_iv, sizeof(ctr_iv)); 351d4afb5ceSopenharmony_ci 352d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_CTR, &e, 0, NULL)) { 353d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create dec failed\n", __func__); 354d4afb5ceSopenharmony_ci return -1; 355d4afb5ceSopenharmony_ci } 356d4afb5ceSopenharmony_ci 357d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, res, 16, res1, nonce_counter, sb, &nc_off, 0)) { 358d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__); 359d4afb5ceSopenharmony_ci goto bail; 360d4afb5ceSopenharmony_ci } 361d4afb5ceSopenharmony_ci 362d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 363d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy failed\n", __func__); 364d4afb5ceSopenharmony_ci return -1; 365d4afb5ceSopenharmony_ci } 366d4afb5ceSopenharmony_ci 367d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(ctr, res1, 16)) { 368d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__); 369d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res1, 16); 370d4afb5ceSopenharmony_ci return -1; 371d4afb5ceSopenharmony_ci } 372d4afb5ceSopenharmony_ci 373d4afb5ceSopenharmony_ci lws_explicit_bzero(sb, sizeof(sb)); 374d4afb5ceSopenharmony_ci 375d4afb5ceSopenharmony_ci return 0; 376d4afb5ceSopenharmony_ci 377d4afb5ceSopenharmony_cibail: 378d4afb5ceSopenharmony_ci lws_genaes_destroy(&ctx, NULL, 0); 379d4afb5ceSopenharmony_ci 380d4afb5ceSopenharmony_ci return -1; 381d4afb5ceSopenharmony_ci} 382d4afb5ceSopenharmony_ci#endif 383d4afb5ceSopenharmony_ci 384d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS)) || \ 385d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_ecb)) 386d4afb5ceSopenharmony_cistatic const uint8_t 387d4afb5ceSopenharmony_ci/* 388d4afb5ceSopenharmony_ci * produced with (plaintext.txt contains "test plaintext\0\0") 389d4afb5ceSopenharmony_ci * 390d4afb5ceSopenharmony_ci * openssl enc -aes-128-ecb \ 391d4afb5ceSopenharmony_ci * -K "0123456789abcdeffedcba9876543210" \ 392d4afb5ceSopenharmony_ci * -in plaintext.txt -out out.enc 393d4afb5ceSopenharmony_ci * 394d4afb5ceSopenharmony_ci */ 395d4afb5ceSopenharmony_ci*ecb = (uint8_t *)"test plaintext\0\0", 396d4afb5ceSopenharmony_ciecb_enc[] = { 397d4afb5ceSopenharmony_ci 0xf3, 0xe5, 0x6c, 0x80, 0x3a, 0xf1, 0xc4, 0xa0, 398d4afb5ceSopenharmony_ci 0x7e, 0xdf, 0x86, 0x0f, 0x6d, 0xca, 0x5d, 0x36, 399d4afb5ceSopenharmony_ci 0x17, 0x22, 0x37, 0x42, 0x47, 0x41, 0x67, 0x7d, 400d4afb5ceSopenharmony_ci 0x99, 0x25, 0x02, 0x6b, 0x6b, 0x8f, 0x9c, 0x7f 401d4afb5ceSopenharmony_ci}, ecb_key[] = { 402d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 403d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 404d4afb5ceSopenharmony_ci}; 405d4afb5ceSopenharmony_ci 406d4afb5ceSopenharmony_cistatic int 407d4afb5ceSopenharmony_citest_genaes_ecb(void) 408d4afb5ceSopenharmony_ci{ 409d4afb5ceSopenharmony_ci struct lws_genaes_ctx ctx; 410d4afb5ceSopenharmony_ci struct lws_gencrypto_keyelem e; 411d4afb5ceSopenharmony_ci uint8_t res[32], res1[32]; 412d4afb5ceSopenharmony_ci 413d4afb5ceSopenharmony_ci /* 414d4afb5ceSopenharmony_ci * As part of a jwk, these are allocated. But here we just use one as 415d4afb5ceSopenharmony_ci * a wrapper on a static binary key. 416d4afb5ceSopenharmony_ci */ 417d4afb5ceSopenharmony_ci e.buf = (uint8_t *)ecb_key; 418d4afb5ceSopenharmony_ci e.len = sizeof(ecb_key); 419d4afb5ceSopenharmony_ci 420d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_ECB, &e, 0, NULL)) { 421d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create failed\n", __func__); 422d4afb5ceSopenharmony_ci return 1; 423d4afb5ceSopenharmony_ci } 424d4afb5ceSopenharmony_ci 425d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, ecb, 16, res, NULL, NULL, NULL, 0)) { 426d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt failed\n", __func__); 427d4afb5ceSopenharmony_ci goto bail; 428d4afb5ceSopenharmony_ci } 429d4afb5ceSopenharmony_ci 430d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 431d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy failed\n", __func__); 432d4afb5ceSopenharmony_ci return -1; 433d4afb5ceSopenharmony_ci } 434d4afb5ceSopenharmony_ci 435d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(ecb_enc, res, 16)) { 436d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__); 437d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, 16); 438d4afb5ceSopenharmony_ci return -1; 439d4afb5ceSopenharmony_ci } 440d4afb5ceSopenharmony_ci 441d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_ECB, &e, 0, NULL)) { 442d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create dec failed\n", __func__); 443d4afb5ceSopenharmony_ci return -1; 444d4afb5ceSopenharmony_ci } 445d4afb5ceSopenharmony_ci 446d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, res, 16, res1, NULL, NULL, NULL, 0)) { 447d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__); 448d4afb5ceSopenharmony_ci goto bail; 449d4afb5ceSopenharmony_ci } 450d4afb5ceSopenharmony_ci 451d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 452d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy failed\n", __func__); 453d4afb5ceSopenharmony_ci return -1; 454d4afb5ceSopenharmony_ci } 455d4afb5ceSopenharmony_ci 456d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(ecb, res1, 16)) { 457d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__); 458d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, 16); 459d4afb5ceSopenharmony_ci return -1; 460d4afb5ceSopenharmony_ci } 461d4afb5ceSopenharmony_ci 462d4afb5ceSopenharmony_ci return 0; 463d4afb5ceSopenharmony_ci 464d4afb5ceSopenharmony_cibail: 465d4afb5ceSopenharmony_ci lws_genaes_destroy(&ctx, NULL, 0); 466d4afb5ceSopenharmony_ci 467d4afb5ceSopenharmony_ci return -1; 468d4afb5ceSopenharmony_ci} 469d4afb5ceSopenharmony_ci#endif 470d4afb5ceSopenharmony_ci 471d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_OFB))) || \ 472d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_ofb)) 473d4afb5ceSopenharmony_cistatic const uint8_t 474d4afb5ceSopenharmony_ci /* 475d4afb5ceSopenharmony_ci * produced with (plaintext.txt contains "test plaintext\0\0") 476d4afb5ceSopenharmony_ci * 477d4afb5ceSopenharmony_ci * openssl enc -aes-128-ofb \ 478d4afb5ceSopenharmony_ci * -K "0123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210" \ 479d4afb5ceSopenharmony_ci * -iv "0123456789abcdeffedcba9876543210" 480d4afb5ceSopenharmony_ci * -in plaintext.txt -out out.enc 481d4afb5ceSopenharmony_ci * 482d4afb5ceSopenharmony_ci */ 483d4afb5ceSopenharmony_ci *ofb = (uint8_t *)"test plaintext\0\0", 484d4afb5ceSopenharmony_ci ofb_enc[] = { 485d4afb5ceSopenharmony_ci /* !!! ugh... openssl app produces this... */ 486d4afb5ceSopenharmony_ci // 0xd2, 0x11, 0x86, 0xd7, 0xa9, 0x55, 0x59, 0x04, 487d4afb5ceSopenharmony_ci // 0x4f, 0x63, 0x7c, 0xb9, 0xc6, 0xa1, 0xc9, 0x71, 488d4afb5ceSopenharmony_ci /* but both OpenSSL and mbedTLS produce this */ 489d4afb5ceSopenharmony_ci 0x11, 0x33, 0x6D, 0xFC, 0x88, 0x4C, 0x28, 0xBA, 490d4afb5ceSopenharmony_ci 0xD0, 0xF2, 0x6C, 0xBC, 0xDE, 0x4A, 0x56, 0x20 491d4afb5ceSopenharmony_ci }, ofb_iv[] = { 492d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 493d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 494d4afb5ceSopenharmony_ci }, ofb_key[] = { 495d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 496d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 497d4afb5ceSopenharmony_ci 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 498d4afb5ceSopenharmony_ci 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 499d4afb5ceSopenharmony_ci } 500d4afb5ceSopenharmony_ci; 501d4afb5ceSopenharmony_cistatic int 502d4afb5ceSopenharmony_citest_genaes_ofb(void) 503d4afb5ceSopenharmony_ci{ 504d4afb5ceSopenharmony_ci struct lws_genaes_ctx ctx; 505d4afb5ceSopenharmony_ci struct lws_gencrypto_keyelem e; 506d4afb5ceSopenharmony_ci uint8_t res[32], res1[32]; 507d4afb5ceSopenharmony_ci size_t iv_off = 0; 508d4afb5ceSopenharmony_ci 509d4afb5ceSopenharmony_ci e.buf = (uint8_t *)ofb_key; 510d4afb5ceSopenharmony_ci e.len = sizeof(ofb_key); 511d4afb5ceSopenharmony_ci 512d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_OFB, &e, 0, NULL)) { 513d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create failed\n", __func__); 514d4afb5ceSopenharmony_ci return 1; 515d4afb5ceSopenharmony_ci } 516d4afb5ceSopenharmony_ci 517d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, ofb, 16, res, (uint8_t *)ofb_iv, NULL, 518d4afb5ceSopenharmony_ci &iv_off, 0)) { 519d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt failed\n", __func__); 520d4afb5ceSopenharmony_ci goto bail; 521d4afb5ceSopenharmony_ci } 522d4afb5ceSopenharmony_ci 523d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 524d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy failed\n", __func__); 525d4afb5ceSopenharmony_ci return -1; 526d4afb5ceSopenharmony_ci } 527d4afb5ceSopenharmony_ci 528d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(ofb_enc, res, 16)) { 529d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__); 530d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, 16); 531d4afb5ceSopenharmony_ci return -1; 532d4afb5ceSopenharmony_ci } 533d4afb5ceSopenharmony_ci 534d4afb5ceSopenharmony_ci iv_off = 0; 535d4afb5ceSopenharmony_ci 536d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_OFB, &e, 0, NULL)) { 537d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create dec failed\n", __func__); 538d4afb5ceSopenharmony_ci return -1; 539d4afb5ceSopenharmony_ci } 540d4afb5ceSopenharmony_ci 541d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, res, 16, res1, (uint8_t *)ofb_iv, NULL, 542d4afb5ceSopenharmony_ci &iv_off, 0)) { 543d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__); 544d4afb5ceSopenharmony_ci goto bail; 545d4afb5ceSopenharmony_ci } 546d4afb5ceSopenharmony_ci 547d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 548d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy failed\n", __func__); 549d4afb5ceSopenharmony_ci return -1; 550d4afb5ceSopenharmony_ci } 551d4afb5ceSopenharmony_ci 552d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(ofb, res1, 16)) { 553d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__); 554d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, 16); 555d4afb5ceSopenharmony_ci return -1; 556d4afb5ceSopenharmony_ci } 557d4afb5ceSopenharmony_ci 558d4afb5ceSopenharmony_ci return 0; 559d4afb5ceSopenharmony_ci 560d4afb5ceSopenharmony_cibail: 561d4afb5ceSopenharmony_ci lws_genaes_destroy(&ctx, NULL, 0); 562d4afb5ceSopenharmony_ci 563d4afb5ceSopenharmony_ci return -1; 564d4afb5ceSopenharmony_ci} 565d4afb5ceSopenharmony_ci 566d4afb5ceSopenharmony_ci#endif 567d4afb5ceSopenharmony_ci 568d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_XTS))) || \ 569d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_xts)) 570d4afb5ceSopenharmony_ci 571d4afb5ceSopenharmony_cistatic const uint8_t 572d4afb5ceSopenharmony_ci /* 573d4afb5ceSopenharmony_ci * Fedora openssl tool doesn't support xts... this data produced 574d4afb5ceSopenharmony_ci * by testing on mbedtls + OpenSSL and getting the same result 575d4afb5ceSopenharmony_ci * 576d4afb5ceSopenharmony_ci * NOTICE that xts requires a double-length key... OpenSSL now checks 577d4afb5ceSopenharmony_ci * the key for duplication so we use a random key 578d4afb5ceSopenharmony_ci */ 579d4afb5ceSopenharmony_ci *xts = (uint8_t *)"test plaintext\0\0", 580d4afb5ceSopenharmony_ci xts_enc[] = { 581d4afb5ceSopenharmony_ci 0x87, 0x83, 0x20, 0x8B, 0x15, 0x89, 0xA1, 0x13, 582d4afb5ceSopenharmony_ci 0xDC, 0xEA, 0x82, 0xB6, 0xFF, 0x8D, 0x76, 0x3A 583d4afb5ceSopenharmony_ci }, xts_key[] = { 584d4afb5ceSopenharmony_ci 0xa4, 0xd6, 0xa2, 0x1a, 0x3b, 0x34, 0x34, 0x43, 585d4afb5ceSopenharmony_ci 0x9a, 0xe2, 0x6a, 0x01, 0x1c, 0x73, 0x80, 0x3b, 586d4afb5ceSopenharmony_ci 0xdd, 0xf6, 0xd4, 0x37, 0x5e, 0x0e, 0x1c, 0x72, 587d4afb5ceSopenharmony_ci 0x8e, 0xe5, 0x18, 0x69, 0xfd, 0x08, 0x40, 0x2b, 588d4afb5ceSopenharmony_ci 0x98, 0xf9, 0x75, 0xa8, 0x36, 0xd5, 0x0f, 0xa2, 589d4afb5ceSopenharmony_ci 0x20, 0x04, 0x43, 0xa7, 0x3a, 0xa6, 0x4a, 0xdc, 590d4afb5ceSopenharmony_ci 0xe9, 0x54, 0x50, 0xfa, 0x38, 0xad, 0x6d, 0x96, 591d4afb5ceSopenharmony_ci 0x5f, 0x31, 0x9e, 0xcd, 0x33, 0x08, 0xa0, 0x44 592d4afb5ceSopenharmony_ci } 593d4afb5ceSopenharmony_ci; 594d4afb5ceSopenharmony_cistatic int 595d4afb5ceSopenharmony_citest_genaes_xts(void) 596d4afb5ceSopenharmony_ci{ 597d4afb5ceSopenharmony_ci 598d4afb5ceSopenharmony_ci struct lws_genaes_ctx ctx; 599d4afb5ceSopenharmony_ci struct lws_gencrypto_keyelem e; 600d4afb5ceSopenharmony_ci uint8_t res[32], res1[32], data_unit[16]; 601d4afb5ceSopenharmony_ci 602d4afb5ceSopenharmony_ci memset(data_unit, 0, sizeof(data_unit)); 603d4afb5ceSopenharmony_ci 604d4afb5ceSopenharmony_ci e.buf = (uint8_t *)xts_key; 605d4afb5ceSopenharmony_ci e.len = sizeof(xts_key); 606d4afb5ceSopenharmony_ci 607d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_XTS, &e, 0, NULL)) { 608d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create failed\n", __func__); 609d4afb5ceSopenharmony_ci return 1; 610d4afb5ceSopenharmony_ci } 611d4afb5ceSopenharmony_ci 612d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, xts, 16, res, data_unit, NULL, NULL, 0)) { 613d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt failed\n", __func__); 614d4afb5ceSopenharmony_ci goto bail; 615d4afb5ceSopenharmony_ci } 616d4afb5ceSopenharmony_ci 617d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 618d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy failed\n", __func__); 619d4afb5ceSopenharmony_ci return -1; 620d4afb5ceSopenharmony_ci } 621d4afb5ceSopenharmony_ci 622d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(xts_enc, res, 16)) { 623d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__); 624d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, 16); 625d4afb5ceSopenharmony_ci return -1; 626d4afb5ceSopenharmony_ci } 627d4afb5ceSopenharmony_ci 628d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_XTS, &e, 0, NULL)) { 629d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create dec failed\n", __func__); 630d4afb5ceSopenharmony_ci return -1; 631d4afb5ceSopenharmony_ci } 632d4afb5ceSopenharmony_ci 633d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, res, 16, res1, data_unit, NULL, NULL, 0)) { 634d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt dec failed\n", __func__); 635d4afb5ceSopenharmony_ci goto bail; 636d4afb5ceSopenharmony_ci } 637d4afb5ceSopenharmony_ci 638d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, NULL, 0)) { 639d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy failed\n", __func__); 640d4afb5ceSopenharmony_ci return -1; 641d4afb5ceSopenharmony_ci } 642d4afb5ceSopenharmony_ci 643d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(xts, res1, 16)) { 644d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__); 645d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, 16); 646d4afb5ceSopenharmony_ci return -1; 647d4afb5ceSopenharmony_ci } 648d4afb5ceSopenharmony_ci 649d4afb5ceSopenharmony_ci return 0; 650d4afb5ceSopenharmony_ci 651d4afb5ceSopenharmony_cibail: 652d4afb5ceSopenharmony_ci lws_genaes_destroy(&ctx, NULL, 0); 653d4afb5ceSopenharmony_ci 654d4afb5ceSopenharmony_ci return -1; 655d4afb5ceSopenharmony_ci} 656d4afb5ceSopenharmony_ci#endif 657d4afb5ceSopenharmony_ci 658d4afb5ceSopenharmony_cistatic const uint8_t 659d4afb5ceSopenharmony_ci /* 660d4afb5ceSopenharmony_ci * https://csrc.nist.gov/CSRC/media/Projects/ 661d4afb5ceSopenharmony_ci * Cryptographic-Algorithm-Validation-Program/ 662d4afb5ceSopenharmony_ci * documents/mac/gcmtestvectors.zip 663d4afb5ceSopenharmony_ci */ 664d4afb5ceSopenharmony_ci 665d4afb5ceSopenharmony_ci gcm_ct[] = { 666d4afb5ceSopenharmony_ci 0xf7, 0x26, 0x44, 0x13, 0xa8, 0x4c, 0x0e, 0x7c, 667d4afb5ceSopenharmony_ci 0xd5, 0x36, 0x86, 0x7e, 0xb9, 0xf2, 0x17, 0x36 668d4afb5ceSopenharmony_ci }, gcm_iv[] = { 669d4afb5ceSopenharmony_ci 0x99, 0xaa, 0x3e, 0x68, 0xed, 0x81, 0x73, 0xa0, 670d4afb5ceSopenharmony_ci 0xee, 0xd0, 0x66, 0x84 671d4afb5ceSopenharmony_ci }, gcm_key[] = { 672d4afb5ceSopenharmony_ci 0xee, 0xbc, 0x1f, 0x57, 0x48, 0x7f, 0x51, 0x92, 673d4afb5ceSopenharmony_ci 0x1c, 0x04, 0x65, 0x66, 0x5f, 0x8a, 0xe6, 0xd1, 674d4afb5ceSopenharmony_ci 0x65, 0x8b, 0xb2, 0x6d, 0xe6, 0xf8, 0xa0, 0x69, 675d4afb5ceSopenharmony_ci 0xa3, 0x52, 0x02, 0x93, 0xa5, 0x72, 0x07, 0x8f 676d4afb5ceSopenharmony_ci }, gcm_pt[] = { 677d4afb5ceSopenharmony_ci 0xf5, 0x6e, 0x87, 0x05, 0x5b, 0xc3, 0x2d, 0x0e, 678d4afb5ceSopenharmony_ci 0xeb, 0x31, 0xb2, 0xea, 0xcc, 0x2b, 0xf2, 0xa5 679d4afb5ceSopenharmony_ci }, gcm_aad[] = { 680d4afb5ceSopenharmony_ci 0x4d, 0x23, 0xc3, 0xce, 0xc3, 0x34, 0xb4, 0x9b, 681d4afb5ceSopenharmony_ci 0xdb, 0x37, 0x0c, 0x43, 0x7f, 0xec, 0x78, 0xde 682d4afb5ceSopenharmony_ci }, gcm_tag[] = { 683d4afb5ceSopenharmony_ci 0x67, 0xba, 0x05, 0x10, 0x26, 0x2a, 0xe4, 0x87, 684d4afb5ceSopenharmony_ci 0xd7, 0x37, 0xee, 0x62, 0x98, 0xf7, 0x7e, 0x0c 685d4afb5ceSopenharmony_ci }; 686d4afb5ceSopenharmony_ci 687d4afb5ceSopenharmony_cistatic int 688d4afb5ceSopenharmony_citest_genaes_gcm(void) 689d4afb5ceSopenharmony_ci{ 690d4afb5ceSopenharmony_ci uint8_t res[sizeof(gcm_ct)], tag[sizeof(gcm_tag)]; 691d4afb5ceSopenharmony_ci struct lws_genaes_ctx ctx; 692d4afb5ceSopenharmony_ci struct lws_gencrypto_keyelem e; 693d4afb5ceSopenharmony_ci size_t iv_off = 0; 694d4afb5ceSopenharmony_ci 695d4afb5ceSopenharmony_ci e.buf = (uint8_t *)gcm_key; 696d4afb5ceSopenharmony_ci e.len = sizeof(gcm_key); 697d4afb5ceSopenharmony_ci 698d4afb5ceSopenharmony_ci /* Encrypt */ 699d4afb5ceSopenharmony_ci 700d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_ENC, LWS_GAESM_GCM, &e, 0, NULL)) { 701d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create failed\n", __func__); 702d4afb5ceSopenharmony_ci return 1; 703d4afb5ceSopenharmony_ci } 704d4afb5ceSopenharmony_ci 705d4afb5ceSopenharmony_ci /* first we set the iv and aad */ 706d4afb5ceSopenharmony_ci 707d4afb5ceSopenharmony_ci iv_off = sizeof(gcm_iv); 708d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, gcm_aad, sizeof(gcm_aad), NULL, 709d4afb5ceSopenharmony_ci (uint8_t *)gcm_iv, (uint8_t *)gcm_tag, 710d4afb5ceSopenharmony_ci &iv_off, sizeof(gcm_tag))) { 711d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt 1 failed\n", __func__); 712d4afb5ceSopenharmony_ci goto bail; 713d4afb5ceSopenharmony_ci } 714d4afb5ceSopenharmony_ci 715d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, gcm_pt, sizeof(gcm_pt), res, 716d4afb5ceSopenharmony_ci NULL, NULL, NULL, 0)) { 717d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt 2 failed\n", __func__); 718d4afb5ceSopenharmony_ci goto bail; 719d4afb5ceSopenharmony_ci } 720d4afb5ceSopenharmony_ci 721d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, tag, sizeof(tag))) { 722d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy enc failed\n", __func__); 723d4afb5ceSopenharmony_ci return -1; 724d4afb5ceSopenharmony_ci } 725d4afb5ceSopenharmony_ci 726d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(gcm_ct, res, sizeof(gcm_ct))) { 727d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt encoding mismatch\n", __func__); 728d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, sizeof(gcm_ct)); 729d4afb5ceSopenharmony_ci return -1; 730d4afb5ceSopenharmony_ci } 731d4afb5ceSopenharmony_ci 732d4afb5ceSopenharmony_ci 733d4afb5ceSopenharmony_ci /* Decrypt */ 734d4afb5ceSopenharmony_ci 735d4afb5ceSopenharmony_ci if (lws_genaes_create(&ctx, LWS_GAESO_DEC, LWS_GAESM_GCM, &e, 0, NULL)) { 736d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_create failed\n", __func__); 737d4afb5ceSopenharmony_ci return 1; 738d4afb5ceSopenharmony_ci } 739d4afb5ceSopenharmony_ci 740d4afb5ceSopenharmony_ci iv_off = sizeof(gcm_iv); /* initial call sets iv + aad + tag */ 741d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, gcm_aad, sizeof(gcm_aad), NULL, 742d4afb5ceSopenharmony_ci (uint8_t *)gcm_iv, (uint8_t *)gcm_tag, 743d4afb5ceSopenharmony_ci &iv_off, sizeof(gcm_tag))) { 744d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt 1 failed\n", __func__); 745d4afb5ceSopenharmony_ci goto bail; 746d4afb5ceSopenharmony_ci } 747d4afb5ceSopenharmony_ci 748d4afb5ceSopenharmony_ci if (lws_genaes_crypt(&ctx, gcm_ct, sizeof(gcm_ct), res, 749d4afb5ceSopenharmony_ci NULL, NULL, NULL, 0)) { 750d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt 2 failed\n", __func__); 751d4afb5ceSopenharmony_ci goto bail; 752d4afb5ceSopenharmony_ci } 753d4afb5ceSopenharmony_ci 754d4afb5ceSopenharmony_ci if (lws_genaes_destroy(&ctx, tag, sizeof(tag))) { 755d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_destroy dec failed\n", __func__); 756d4afb5ceSopenharmony_ci return -1; 757d4afb5ceSopenharmony_ci } 758d4afb5ceSopenharmony_ci 759d4afb5ceSopenharmony_ci if (lws_timingsafe_bcmp(gcm_pt, res, sizeof(gcm_pt))) { 760d4afb5ceSopenharmony_ci lwsl_err("%s: lws_genaes_crypt decoding mismatch\n", __func__); 761d4afb5ceSopenharmony_ci lwsl_hexdump_notice(res, sizeof(gcm_ct)); 762d4afb5ceSopenharmony_ci return -1; 763d4afb5ceSopenharmony_ci } 764d4afb5ceSopenharmony_ci 765d4afb5ceSopenharmony_ci return 0; 766d4afb5ceSopenharmony_ci 767d4afb5ceSopenharmony_cibail: 768d4afb5ceSopenharmony_ci lws_genaes_destroy(&ctx, NULL, 0); 769d4afb5ceSopenharmony_ci 770d4afb5ceSopenharmony_ci return -1; 771d4afb5ceSopenharmony_ci} 772d4afb5ceSopenharmony_ci 773d4afb5ceSopenharmony_ciint 774d4afb5ceSopenharmony_citest_genaes(struct lws_context *context) 775d4afb5ceSopenharmony_ci{ 776d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CBC))) || \ 777d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_cbc)) 778d4afb5ceSopenharmony_ci if (test_genaes_cbc()) 779d4afb5ceSopenharmony_ci goto bail; 780d4afb5ceSopenharmony_ci#endif 781d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \ 782d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_cfb128)) 783d4afb5ceSopenharmony_ci if (test_genaes_cfb128()) 784d4afb5ceSopenharmony_ci goto bail; 785d4afb5ceSopenharmony_ci#endif 786d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CFB))) || \ 787d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_cfb8)) 788d4afb5ceSopenharmony_ci if (test_genaes_cfb8()) 789d4afb5ceSopenharmony_ci goto bail; 790d4afb5ceSopenharmony_ci#endif 791d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_CTR))) || \ 792d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_ctr)) 793d4afb5ceSopenharmony_ci if (test_genaes_ctr()) 794d4afb5ceSopenharmony_ci goto bail; 795d4afb5ceSopenharmony_ci#endif 796d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS)) || \ 797d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_ecb)) 798d4afb5ceSopenharmony_ci if (test_genaes_ecb()) 799d4afb5ceSopenharmony_ci goto bail; 800d4afb5ceSopenharmony_ci#endif 801d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_OFB))) || \ 802d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_ofb)) 803d4afb5ceSopenharmony_ci if (test_genaes_ofb()) 804d4afb5ceSopenharmony_ci goto bail; 805d4afb5ceSopenharmony_ci#endif 806d4afb5ceSopenharmony_ci#if (defined(LWS_WITH_MBEDTLS) && (!defined(MBEDTLS_CONFIG_H) || defined(MBEDTLS_CIPHER_MODE_XTS))) || \ 807d4afb5ceSopenharmony_ci (!defined(LWS_WITH_MBEDTLS) && defined(LWS_HAVE_EVP_aes_128_xts)) 808d4afb5ceSopenharmony_ci if (test_genaes_xts()) 809d4afb5ceSopenharmony_ci goto bail; 810d4afb5ceSopenharmony_ci#endif 811d4afb5ceSopenharmony_ci 812d4afb5ceSopenharmony_ci if (test_genaes_gcm()) 813d4afb5ceSopenharmony_ci goto bail; 814d4afb5ceSopenharmony_ci 815d4afb5ceSopenharmony_ci /* end */ 816d4afb5ceSopenharmony_ci 817d4afb5ceSopenharmony_ci lwsl_notice("%s: selftest OK\n", __func__); 818d4afb5ceSopenharmony_ci 819d4afb5ceSopenharmony_ci return 0; 820d4afb5ceSopenharmony_ci 821d4afb5ceSopenharmony_cibail: 822d4afb5ceSopenharmony_ci lwsl_err("%s: selftest failed ++++++++++++++++++++\n", __func__); 823d4afb5ceSopenharmony_ci 824d4afb5ceSopenharmony_ci return 1; 825d4afb5ceSopenharmony_ci} 826