1cc6ac5d6SJoseph Chen // SPDX-License-Identifier: GPL-2.0 2cc6ac5d6SJoseph Chen /* 3cc6ac5d6SJoseph Chen * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd 4cc6ac5d6SJoseph Chen */ 5cc6ac5d6SJoseph Chen 6cc6ac5d6SJoseph Chen #include <common.h> 7cc6ac5d6SJoseph Chen #include <command.h> 8cc6ac5d6SJoseph Chen #include <crypto.h> 9cc6ac5d6SJoseph Chen #include <dm.h> 10cc6ac5d6SJoseph Chen #include <u-boot/md5.h> 11cc6ac5d6SJoseph Chen #include <u-boot/sha1.h> 12cc6ac5d6SJoseph Chen #include <u-boot/sha256.h> 13e7b6c6a9SLin Jinhan #include <u-boot/sha512.h> 14*495c8ff4SLin Jinhan #include <rockchip/crypto_fix_test_data.h> 15cc6ac5d6SJoseph Chen 16*495c8ff4SLin Jinhan struct hash_test_data { 17*495c8ff4SLin Jinhan const char *algo_name; 18*495c8ff4SLin Jinhan const char *mode_name; 19*495c8ff4SLin Jinhan u32 algo; 20*495c8ff4SLin Jinhan const u8 *data; 21*495c8ff4SLin Jinhan u32 data_len; 22*495c8ff4SLin Jinhan const u8 *hash; 23*495c8ff4SLin Jinhan u32 hash_len; 24*495c8ff4SLin Jinhan const u8 *key; 25*495c8ff4SLin Jinhan u32 key_len; 26cc6ac5d6SJoseph Chen }; 27cc6ac5d6SJoseph Chen 28*495c8ff4SLin Jinhan struct cipher_test_data { 29*495c8ff4SLin Jinhan const char *algo_name; 30*495c8ff4SLin Jinhan const char *mode_name; 31*495c8ff4SLin Jinhan u32 algo; 32*495c8ff4SLin Jinhan u32 mode; 33*495c8ff4SLin Jinhan const u8 *key; 34*495c8ff4SLin Jinhan const u8 *twk_key; 35*495c8ff4SLin Jinhan u32 key_len; 36*495c8ff4SLin Jinhan const u8 *iv; 37*495c8ff4SLin Jinhan u32 iv_len; 38*495c8ff4SLin Jinhan const u8 *plain; 39*495c8ff4SLin Jinhan u32 plain_len; 40*495c8ff4SLin Jinhan const u8 *cipher; 41*495c8ff4SLin Jinhan u32 cipher_len; 42cc6ac5d6SJoseph Chen }; 43cc6ac5d6SJoseph Chen 44*495c8ff4SLin Jinhan struct rsa_test_data { 45*495c8ff4SLin Jinhan const char *algo_name; 46*495c8ff4SLin Jinhan const char *mode_name; 47*495c8ff4SLin Jinhan u32 algo; 48*495c8ff4SLin Jinhan const u8 *n; 49*495c8ff4SLin Jinhan u32 n_len; 50*495c8ff4SLin Jinhan const u8 *e; 51*495c8ff4SLin Jinhan u32 e_len; 52*495c8ff4SLin Jinhan const u8 *d; 53*495c8ff4SLin Jinhan u32 d_len; 54*495c8ff4SLin Jinhan const u8 *c; 55*495c8ff4SLin Jinhan u32 c_len; 56*495c8ff4SLin Jinhan const u8 *sign_in; 57*495c8ff4SLin Jinhan u32 sign_in_len; 58*495c8ff4SLin Jinhan const u8 *sign_out; 59*495c8ff4SLin Jinhan u32 sign_out_len; 60cc6ac5d6SJoseph Chen }; 61cc6ac5d6SJoseph Chen 62*495c8ff4SLin Jinhan #define HASH_TEST(algo_type, data_in, hash_val) {\ 63*495c8ff4SLin Jinhan .algo_name = "HASH", \ 64*495c8ff4SLin Jinhan .mode_name = #algo_type, \ 65*495c8ff4SLin Jinhan .algo = CRYPTO_##algo_type, \ 66*495c8ff4SLin Jinhan .data = (data_in),\ 67*495c8ff4SLin Jinhan .data_len = sizeof(data_in), \ 68*495c8ff4SLin Jinhan .hash = (hash_val), \ 69*495c8ff4SLin Jinhan .hash_len = sizeof(hash_val) \ 70cc6ac5d6SJoseph Chen } 71cc6ac5d6SJoseph Chen 72*495c8ff4SLin Jinhan #define HMAC_TEST(algo_type, data_in, hash_val, hmac_key) {\ 73*495c8ff4SLin Jinhan .algo_name = "HMAC", \ 74*495c8ff4SLin Jinhan .mode_name = #algo_type, \ 75*495c8ff4SLin Jinhan .algo = CRYPTO_HMAC_##algo_type, \ 76*495c8ff4SLin Jinhan .data = (data_in),\ 77*495c8ff4SLin Jinhan .data_len = sizeof(data_in), \ 78*495c8ff4SLin Jinhan .hash = (hash_val), \ 79*495c8ff4SLin Jinhan .hash_len = sizeof(hash_val), \ 80*495c8ff4SLin Jinhan .key = (hmac_key), \ 81*495c8ff4SLin Jinhan .key_len = sizeof(hmac_key)\ 82*495c8ff4SLin Jinhan } 83*495c8ff4SLin Jinhan 84*495c8ff4SLin Jinhan #define CIPHER_XTS_TEST(algo_type, mode_type, key1, key2, iv_val, in, out) { \ 85*495c8ff4SLin Jinhan .algo_name = #algo_type, \ 86*495c8ff4SLin Jinhan .mode_name = #mode_type, \ 87*495c8ff4SLin Jinhan .algo = CRYPTO_##algo_type,\ 88*495c8ff4SLin Jinhan .mode = RK_MODE_##mode_type, \ 89*495c8ff4SLin Jinhan .key = (key1), \ 90*495c8ff4SLin Jinhan .twk_key = (key2), \ 91*495c8ff4SLin Jinhan .key_len = sizeof(key1), \ 92*495c8ff4SLin Jinhan .iv = (iv_val), \ 93*495c8ff4SLin Jinhan .iv_len = sizeof(iv_val), \ 94*495c8ff4SLin Jinhan .plain = (in), \ 95*495c8ff4SLin Jinhan .plain_len = sizeof(in), \ 96*495c8ff4SLin Jinhan .cipher = (out), \ 97*495c8ff4SLin Jinhan .cipher_len = sizeof(out) \ 98*495c8ff4SLin Jinhan } 99*495c8ff4SLin Jinhan 100*495c8ff4SLin Jinhan #define CIPHER_TEST(algo, mode, key, iv, plain, cipher) \ 101*495c8ff4SLin Jinhan CIPHER_XTS_TEST(algo, mode, key, NULL, iv, plain, cipher) 102*495c8ff4SLin Jinhan 103*495c8ff4SLin Jinhan #define RSA_TEST(nbits, bn, be, bc, bd, in, out) { \ 104*495c8ff4SLin Jinhan .algo_name = "RSA", \ 105*495c8ff4SLin Jinhan .mode_name = #nbits, \ 106*495c8ff4SLin Jinhan .algo = CRYPTO_RSA##nbits, \ 107*495c8ff4SLin Jinhan .n = (bn), \ 108*495c8ff4SLin Jinhan .n_len = sizeof(bn), \ 109*495c8ff4SLin Jinhan .e = (be), \ 110*495c8ff4SLin Jinhan .e_len = sizeof(be), \ 111*495c8ff4SLin Jinhan .d = (bd), \ 112*495c8ff4SLin Jinhan .d_len = sizeof(bd), \ 113*495c8ff4SLin Jinhan .c = (bc), \ 114*495c8ff4SLin Jinhan .c_len = sizeof(bc), \ 115*495c8ff4SLin Jinhan .sign_in = (in), \ 116*495c8ff4SLin Jinhan .sign_in_len = sizeof(in), \ 117*495c8ff4SLin Jinhan .sign_out = (out), \ 118*495c8ff4SLin Jinhan .sign_out_len = sizeof(out) \ 119*495c8ff4SLin Jinhan } 120*495c8ff4SLin Jinhan 121*495c8ff4SLin Jinhan #define EMPTY_TEST() {} 122*495c8ff4SLin Jinhan 123*495c8ff4SLin Jinhan const struct hash_test_data hash_data_set[] = { 124*495c8ff4SLin Jinhan HASH_TEST(MD5, foo_data, hash_md5), 125*495c8ff4SLin Jinhan HASH_TEST(SHA1, foo_data, hash_sha1), 126*495c8ff4SLin Jinhan HASH_TEST(SHA256, foo_data, hash_sha256), 127*495c8ff4SLin Jinhan HASH_TEST(SHA512, foo_data, hash_sha512), 128*495c8ff4SLin Jinhan HASH_TEST(SM3, foo_data, hash_sm3), 129*495c8ff4SLin Jinhan 130*495c8ff4SLin Jinhan #if CONFIG_IS_ENABLED(ROCKCHIP_HMAC) 131*495c8ff4SLin Jinhan EMPTY_TEST(), 132*495c8ff4SLin Jinhan HMAC_TEST(MD5, foo_data, hmac_md5, hmac_key), 133*495c8ff4SLin Jinhan HMAC_TEST(SHA1, foo_data, hmac_sha1, hmac_key), 134*495c8ff4SLin Jinhan HMAC_TEST(SHA256, foo_data, hmac_sha256, hmac_key), 135*495c8ff4SLin Jinhan HMAC_TEST(SHA512, foo_data, hmac_sha512, hmac_key), 136*495c8ff4SLin Jinhan HMAC_TEST(SM3, foo_data, hmac_sm3, hmac_key), 137*495c8ff4SLin Jinhan #endif 138*495c8ff4SLin Jinhan }; 139*495c8ff4SLin Jinhan 140*495c8ff4SLin Jinhan const struct cipher_test_data cipher_data_set[] = { 141*495c8ff4SLin Jinhan #if CONFIG_IS_ENABLED(ROCKCHIP_CIPHER) 142*495c8ff4SLin Jinhan CIPHER_TEST(DES, ECB, des_key, des_iv, foo_data, des_ecb_cipher), 143*495c8ff4SLin Jinhan CIPHER_TEST(DES, CBC, des_key, des_iv, foo_data, des_cbc_cipher), 144*495c8ff4SLin Jinhan CIPHER_TEST(DES, CFB, des_key, des_iv, foo_data, des_cfb_cipher), 145*495c8ff4SLin Jinhan CIPHER_TEST(DES, OFB, des_key, des_iv, foo_data, des_ofb_cipher), 146*495c8ff4SLin Jinhan 147*495c8ff4SLin Jinhan EMPTY_TEST(), 148*495c8ff4SLin Jinhan CIPHER_TEST(DES, ECB, tdes_key, tdes_iv, foo_data, tdes_ecb_cipher), 149*495c8ff4SLin Jinhan CIPHER_TEST(DES, CBC, tdes_key, tdes_iv, foo_data, tdes_cbc_cipher), 150*495c8ff4SLin Jinhan CIPHER_TEST(DES, CFB, tdes_key, tdes_iv, foo_data, tdes_cfb_cipher), 151*495c8ff4SLin Jinhan CIPHER_TEST(DES, OFB, tdes_key, tdes_iv, foo_data, tdes_ofb_cipher), 152*495c8ff4SLin Jinhan 153*495c8ff4SLin Jinhan EMPTY_TEST(), 154*495c8ff4SLin Jinhan CIPHER_TEST(AES, ECB, aes_key, aes_iv, foo_data, aes_ecb_cipher), 155*495c8ff4SLin Jinhan CIPHER_TEST(AES, CBC, aes_key, aes_iv, foo_data, aes_cbc_cipher), 156*495c8ff4SLin Jinhan CIPHER_TEST(AES, CFB, aes_key, aes_iv, foo_data, aes_cfb_cipher), 157*495c8ff4SLin Jinhan CIPHER_TEST(AES, OFB, aes_key, aes_iv, foo_data, aes_ofb_cipher), 158*495c8ff4SLin Jinhan CIPHER_TEST(AES, CTS, aes_key, aes_iv, foo_data, aes_cts_cipher), 159*495c8ff4SLin Jinhan CIPHER_TEST(AES, CTR, aes_key, aes_iv, foo_data, aes_ctr_cipher), 160*495c8ff4SLin Jinhan CIPHER_XTS_TEST(AES, XTS, aes_key, aes_twk_key, 161*495c8ff4SLin Jinhan aes_iv, foo_data, aes_xts_cipher), 162*495c8ff4SLin Jinhan 163*495c8ff4SLin Jinhan EMPTY_TEST(), 164*495c8ff4SLin Jinhan CIPHER_TEST(SM4, ECB, sm4_key, sm4_iv, foo_data, sm4_ecb_cipher), 165*495c8ff4SLin Jinhan CIPHER_TEST(SM4, CBC, sm4_key, sm4_iv, foo_data, sm4_cbc_cipher), 166*495c8ff4SLin Jinhan CIPHER_TEST(SM4, CFB, sm4_key, sm4_iv, foo_data, sm4_cfb_cipher), 167*495c8ff4SLin Jinhan CIPHER_TEST(SM4, OFB, sm4_key, sm4_iv, foo_data, sm4_ofb_cipher), 168*495c8ff4SLin Jinhan CIPHER_TEST(SM4, CTS, sm4_key, sm4_iv, foo_data, sm4_cts_cipher), 169*495c8ff4SLin Jinhan CIPHER_TEST(SM4, CTR, sm4_key, sm4_iv, foo_data, sm4_ctr_cipher), 170*495c8ff4SLin Jinhan CIPHER_XTS_TEST(SM4, XTS, sm4_key, sm4_twk_key, 171*495c8ff4SLin Jinhan sm4_iv, foo_data, sm4_xts_cipher), 172*495c8ff4SLin Jinhan #else 173*495c8ff4SLin Jinhan EMPTY_TEST(), 174*495c8ff4SLin Jinhan #endif 175*495c8ff4SLin Jinhan }; 176*495c8ff4SLin Jinhan 177*495c8ff4SLin Jinhan const struct rsa_test_data rsa_data_set[] = { 178*495c8ff4SLin Jinhan #if CONFIG_IS_ENABLED(ROCKCHIP_RSA) 179*495c8ff4SLin Jinhan RSA_TEST(2048, rsa2048_n, rsa2048_e, rsa2048_c, rsa2048_d, 180*495c8ff4SLin Jinhan rsa2048_sign_in, rsa2048_sign_out), 181*495c8ff4SLin Jinhan #else 182*495c8ff4SLin Jinhan EMPTY_TEST(), 183*495c8ff4SLin Jinhan #endif 184*495c8ff4SLin Jinhan }; 185*495c8ff4SLin Jinhan 186*495c8ff4SLin Jinhan static void dump_hex(const char *name, const u8 *array, u32 len) 18780ca1a53SLin Jinhan { 188*495c8ff4SLin Jinhan int i; 189*495c8ff4SLin Jinhan 190*495c8ff4SLin Jinhan printf("[%s]: %uByte", name, len); 191*495c8ff4SLin Jinhan for (i = 0; i < len; i++) { 192*495c8ff4SLin Jinhan if (i % 32 == 0) 193*495c8ff4SLin Jinhan printf("\n"); 194*495c8ff4SLin Jinhan printf("%02x ", array[i]); 195*495c8ff4SLin Jinhan } 196*495c8ff4SLin Jinhan printf("\n"); 197*495c8ff4SLin Jinhan } 198*495c8ff4SLin Jinhan 199*495c8ff4SLin Jinhan static inline void check_result(const char *algo_name, const char *mode_name, 200*495c8ff4SLin Jinhan const char *crypt, 201*495c8ff4SLin Jinhan const u8 *expect, const u8 *actual, u32 len) 202*495c8ff4SLin Jinhan { 203*495c8ff4SLin Jinhan if (memcmp(expect, actual, len) == 0) { 204*495c8ff4SLin Jinhan printf("[%s] %-8s%-8s PASS\n", 205*495c8ff4SLin Jinhan algo_name, mode_name, crypt); 206*495c8ff4SLin Jinhan } else { 207*495c8ff4SLin Jinhan printf("[%s] %-8s%-8s FAIL\n", 208*495c8ff4SLin Jinhan algo_name, mode_name, crypt); 209*495c8ff4SLin Jinhan dump_hex("expect", expect, len); 210*495c8ff4SLin Jinhan dump_hex("actual", actual, len); 211*495c8ff4SLin Jinhan } 212*495c8ff4SLin Jinhan } 213*495c8ff4SLin Jinhan 214*495c8ff4SLin Jinhan int test_hash_result(void) 215*495c8ff4SLin Jinhan { 216*495c8ff4SLin Jinhan const struct hash_test_data *test_data = NULL; 217*495c8ff4SLin Jinhan sha_context csha_ctx; 218*495c8ff4SLin Jinhan struct udevice *dev; 219*495c8ff4SLin Jinhan unsigned int i; 220*495c8ff4SLin Jinhan u8 out[64]; 22180ca1a53SLin Jinhan int ret; 22280ca1a53SLin Jinhan 223*495c8ff4SLin Jinhan printf("\n=================== hash & hmac test ===================\n"); 22480ca1a53SLin Jinhan 225*495c8ff4SLin Jinhan for (i = 0; i < ARRAY_SIZE(hash_data_set); i++) { 226*495c8ff4SLin Jinhan test_data = &hash_data_set[i]; 227*495c8ff4SLin Jinhan if (test_data->algo == 0) { 228*495c8ff4SLin Jinhan printf("\n"); 229*495c8ff4SLin Jinhan continue; 230*495c8ff4SLin Jinhan } 231*495c8ff4SLin Jinhan 232*495c8ff4SLin Jinhan dev = crypto_get_device(test_data->algo); 233*495c8ff4SLin Jinhan if (!dev) { 234*495c8ff4SLin Jinhan printf("[%s] %-16s unsupported!!!\n", 235*495c8ff4SLin Jinhan test_data->algo_name, 236*495c8ff4SLin Jinhan test_data->mode_name); 237*495c8ff4SLin Jinhan continue; 238*495c8ff4SLin Jinhan } 239*495c8ff4SLin Jinhan 240*495c8ff4SLin Jinhan csha_ctx.algo = test_data->algo; 241*495c8ff4SLin Jinhan csha_ctx.length = test_data->data_len; 242*495c8ff4SLin Jinhan 243*495c8ff4SLin Jinhan memset(out, 0x00, sizeof(out)); 244*495c8ff4SLin Jinhan if (test_data->key) { 245*495c8ff4SLin Jinhan ret = crypto_hmac_init(dev, &csha_ctx, 246*495c8ff4SLin Jinhan (u8 *)test_data->key, 247*495c8ff4SLin Jinhan test_data->key_len); 248*495c8ff4SLin Jinhan ret |= crypto_hmac_update(dev, (void *)test_data->data, 249*495c8ff4SLin Jinhan test_data->data_len); 250*495c8ff4SLin Jinhan ret |= crypto_hmac_final(dev, &csha_ctx, out); 251*495c8ff4SLin Jinhan if (ret) { 252*495c8ff4SLin Jinhan printf("hmac calc error ret = %d\n", ret); 253*495c8ff4SLin Jinhan goto error; 254*495c8ff4SLin Jinhan } 255*495c8ff4SLin Jinhan } else { 256*495c8ff4SLin Jinhan ret = crypto_sha_init(dev, &csha_ctx); 257*495c8ff4SLin Jinhan ret |= crypto_sha_update(dev, (void *)test_data->data, 258*495c8ff4SLin Jinhan test_data->data_len); 259*495c8ff4SLin Jinhan ret |= crypto_sha_final(dev, &csha_ctx, out); 260*495c8ff4SLin Jinhan if (ret) { 261*495c8ff4SLin Jinhan printf("hash calc error ret = %d\n", ret); 262*495c8ff4SLin Jinhan goto error; 263*495c8ff4SLin Jinhan } 264*495c8ff4SLin Jinhan } 265*495c8ff4SLin Jinhan 266*495c8ff4SLin Jinhan check_result(test_data->algo_name, test_data->mode_name, 267*495c8ff4SLin Jinhan "", test_data->hash, out, test_data->hash_len); 268*495c8ff4SLin Jinhan printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n"); 269*495c8ff4SLin Jinhan } 270*495c8ff4SLin Jinhan 271*495c8ff4SLin Jinhan return 0; 272*495c8ff4SLin Jinhan error: 273*495c8ff4SLin Jinhan printf("%s %s test error!\n", 274*495c8ff4SLin Jinhan test_data->algo_name, test_data->mode_name); 275*495c8ff4SLin Jinhan return ret; 276*495c8ff4SLin Jinhan } 277*495c8ff4SLin Jinhan 278*495c8ff4SLin Jinhan int test_cipher_result(void) 279*495c8ff4SLin Jinhan { 280*495c8ff4SLin Jinhan const struct cipher_test_data *test_data = NULL; 281*495c8ff4SLin Jinhan struct udevice *dev; 282*495c8ff4SLin Jinhan cipher_context ctx; 283*495c8ff4SLin Jinhan u8 out[256]; 284*495c8ff4SLin Jinhan int ret; 285*495c8ff4SLin Jinhan u32 i; 286*495c8ff4SLin Jinhan 287*495c8ff4SLin Jinhan printf("\n===================== cipher test ======================\n"); 288*495c8ff4SLin Jinhan 289*495c8ff4SLin Jinhan for (i = 0; i < ARRAY_SIZE(cipher_data_set); i++) { 290*495c8ff4SLin Jinhan test_data = &cipher_data_set[i]; 291*495c8ff4SLin Jinhan if (test_data->algo == 0) { 292*495c8ff4SLin Jinhan printf("\n"); 293*495c8ff4SLin Jinhan continue; 294*495c8ff4SLin Jinhan } 295*495c8ff4SLin Jinhan 296*495c8ff4SLin Jinhan dev = crypto_get_device(test_data->algo); 297*495c8ff4SLin Jinhan if (!dev) { 298*495c8ff4SLin Jinhan printf("[%s] %-16s unsupported!!!\n", 299*495c8ff4SLin Jinhan test_data->algo_name, test_data->mode_name); 300*495c8ff4SLin Jinhan continue; 301*495c8ff4SLin Jinhan } 302*495c8ff4SLin Jinhan 303*495c8ff4SLin Jinhan memset(&ctx, 0x00, sizeof(ctx)); 304*495c8ff4SLin Jinhan 305*495c8ff4SLin Jinhan ctx.algo = test_data->algo; 306*495c8ff4SLin Jinhan ctx.mode = test_data->mode; 307*495c8ff4SLin Jinhan ctx.key = test_data->key; 308*495c8ff4SLin Jinhan ctx.twk_key = test_data->twk_key; 309*495c8ff4SLin Jinhan ctx.key_len = test_data->key_len; 310*495c8ff4SLin Jinhan ctx.iv = test_data->iv; 311*495c8ff4SLin Jinhan ctx.iv_len = test_data->iv_len; 312*495c8ff4SLin Jinhan 313*495c8ff4SLin Jinhan ret = crypto_cipher(dev, &ctx, test_data->plain, 314*495c8ff4SLin Jinhan out, test_data->plain_len, true); 315*495c8ff4SLin Jinhan if (ret) 316*495c8ff4SLin Jinhan goto error; 317*495c8ff4SLin Jinhan 318*495c8ff4SLin Jinhan check_result(test_data->algo_name, test_data->mode_name, 319*495c8ff4SLin Jinhan "encrypt", test_data->cipher, out, 320*495c8ff4SLin Jinhan test_data->cipher_len); 321*495c8ff4SLin Jinhan 322*495c8ff4SLin Jinhan ret = crypto_cipher(dev, &ctx, test_data->cipher, 323*495c8ff4SLin Jinhan out, test_data->cipher_len, false); 324*495c8ff4SLin Jinhan if (ret) 325*495c8ff4SLin Jinhan goto error; 326*495c8ff4SLin Jinhan 327*495c8ff4SLin Jinhan check_result(test_data->algo_name, test_data->mode_name, 328*495c8ff4SLin Jinhan "decrypt", test_data->plain, out, 329*495c8ff4SLin Jinhan test_data->plain_len); 330*495c8ff4SLin Jinhan printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n"); 331*495c8ff4SLin Jinhan } 332*495c8ff4SLin Jinhan return 0; 333*495c8ff4SLin Jinhan error: 334*495c8ff4SLin Jinhan printf("%s %s test error!\n", 335*495c8ff4SLin Jinhan test_data->algo_name, test_data->mode_name); 336*495c8ff4SLin Jinhan return ret; 337*495c8ff4SLin Jinhan } 338*495c8ff4SLin Jinhan 339*495c8ff4SLin Jinhan int test_rsa_result(void) 340*495c8ff4SLin Jinhan { 341*495c8ff4SLin Jinhan const struct rsa_test_data *test_data = NULL; 342*495c8ff4SLin Jinhan u8 *hard_out = NULL, *e_tmp; 343*495c8ff4SLin Jinhan u32 data_size = 4096 / 8; 344*495c8ff4SLin Jinhan struct udevice *dev; 345*495c8ff4SLin Jinhan rsa_key rsa_key; 346*495c8ff4SLin Jinhan int ret, i; 347*495c8ff4SLin Jinhan 348*495c8ff4SLin Jinhan hard_out = (u8 *)memalign(CONFIG_SYS_CACHELINE_SIZE, data_size); 349*495c8ff4SLin Jinhan if (!hard_out) { 35080ca1a53SLin Jinhan printf("%s, %d: memalign %u error!\n", 35180ca1a53SLin Jinhan __func__, __LINE__, data_size); 35280ca1a53SLin Jinhan return -EINVAL; 35380ca1a53SLin Jinhan } 35480ca1a53SLin Jinhan 355*495c8ff4SLin Jinhan e_tmp = (u8 *)memalign(CONFIG_SYS_CACHELINE_SIZE, data_size); 356*495c8ff4SLin Jinhan if (!e_tmp) { 357*495c8ff4SLin Jinhan printf("%s, %d: memalign %u error!\n", 358*495c8ff4SLin Jinhan __func__, __LINE__, data_size); 359*495c8ff4SLin Jinhan return -EINVAL; 36080ca1a53SLin Jinhan } 36180ca1a53SLin Jinhan 362*495c8ff4SLin Jinhan printf("\n====================== rsa test ========================\n"); 363*495c8ff4SLin Jinhan for (i = 0; i < ARRAY_SIZE(rsa_data_set); i++) { 364*495c8ff4SLin Jinhan test_data = &rsa_data_set[i]; 365*495c8ff4SLin Jinhan if (test_data->algo == 0) { 366*495c8ff4SLin Jinhan printf("\n"); 367*495c8ff4SLin Jinhan continue; 368*495c8ff4SLin Jinhan } 36980ca1a53SLin Jinhan 370*495c8ff4SLin Jinhan dev = crypto_get_device(test_data->algo); 371*495c8ff4SLin Jinhan if (!dev) { 372*495c8ff4SLin Jinhan printf("[%s] %-16s unsupported!!!\n", 373*495c8ff4SLin Jinhan test_data->algo_name, test_data->mode_name); 374*495c8ff4SLin Jinhan continue; 375*495c8ff4SLin Jinhan } 37680ca1a53SLin Jinhan 377*495c8ff4SLin Jinhan /* sign test */ 378*495c8ff4SLin Jinhan memset(&rsa_key, 0x00, sizeof(rsa_key)); 379*495c8ff4SLin Jinhan rsa_key.algo = test_data->algo; 380*495c8ff4SLin Jinhan rsa_key.n = (u32 *)test_data->n; 381*495c8ff4SLin Jinhan rsa_key.e = (u32 *)test_data->d; 382*495c8ff4SLin Jinhan #ifdef CONFIG_ROCKCHIP_CRYPTO_V1 383*495c8ff4SLin Jinhan rsa_key.c = (u32 *)test_data->c; 384*495c8ff4SLin Jinhan #endif 38580ca1a53SLin Jinhan 386*495c8ff4SLin Jinhan ret = crypto_rsa_verify(dev, &rsa_key, 387*495c8ff4SLin Jinhan (u8 *)test_data->sign_in, hard_out); 388*495c8ff4SLin Jinhan if (ret) { 389*495c8ff4SLin Jinhan printf("sign test error, ret = %d\n", ret); 390*495c8ff4SLin Jinhan goto error; 391*495c8ff4SLin Jinhan } 392*495c8ff4SLin Jinhan 393*495c8ff4SLin Jinhan check_result(test_data->algo_name, test_data->mode_name, 394*495c8ff4SLin Jinhan "sign", test_data->sign_out, 395*495c8ff4SLin Jinhan hard_out, test_data->n_len); 396*495c8ff4SLin Jinhan 397*495c8ff4SLin Jinhan /* verify test */ 398*495c8ff4SLin Jinhan memset(&rsa_key, 0x00, sizeof(rsa_key)); 399*495c8ff4SLin Jinhan memset(e_tmp, 0x00, data_size); 400*495c8ff4SLin Jinhan memcpy(e_tmp, test_data->e, test_data->e_len); 401*495c8ff4SLin Jinhan rsa_key.algo = test_data->algo; 402*495c8ff4SLin Jinhan rsa_key.n = (u32 *)test_data->n; 403*495c8ff4SLin Jinhan rsa_key.e = (u32 *)e_tmp; 404*495c8ff4SLin Jinhan #ifdef CONFIG_ROCKCHIP_CRYPTO_V1 405*495c8ff4SLin Jinhan rsa_key.c = (u32 *)test_data->c; 406*495c8ff4SLin Jinhan #endif 407*495c8ff4SLin Jinhan 408*495c8ff4SLin Jinhan ret = crypto_rsa_verify(dev, &rsa_key, 409*495c8ff4SLin Jinhan (u8 *)test_data->sign_out, hard_out); 410*495c8ff4SLin Jinhan if (ret) { 411*495c8ff4SLin Jinhan printf("verify test error, ret = %d\n", ret); 412*495c8ff4SLin Jinhan goto error; 413*495c8ff4SLin Jinhan } 414*495c8ff4SLin Jinhan 415*495c8ff4SLin Jinhan check_result(test_data->algo_name, test_data->mode_name, 416*495c8ff4SLin Jinhan "verify", test_data->sign_in, 417*495c8ff4SLin Jinhan hard_out, test_data->n_len); 418*495c8ff4SLin Jinhan 419*495c8ff4SLin Jinhan printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n"); 420*495c8ff4SLin Jinhan } 421*495c8ff4SLin Jinhan 422*495c8ff4SLin Jinhan free(hard_out); 423*495c8ff4SLin Jinhan free(e_tmp); 424*495c8ff4SLin Jinhan 425*495c8ff4SLin Jinhan return 0; 426*495c8ff4SLin Jinhan error: 427*495c8ff4SLin Jinhan free(hard_out); 428*495c8ff4SLin Jinhan free(e_tmp); 429*495c8ff4SLin Jinhan printf("%s %s test error!\n", 430*495c8ff4SLin Jinhan test_data->algo_name, test_data->mode_name); 43180ca1a53SLin Jinhan return ret; 43280ca1a53SLin Jinhan } 43380ca1a53SLin Jinhan 434*495c8ff4SLin Jinhan static int test_all_result(void) 435*495c8ff4SLin Jinhan { 436*495c8ff4SLin Jinhan int ret = 0; 437*495c8ff4SLin Jinhan 438*495c8ff4SLin Jinhan ret = test_hash_result(); 439*495c8ff4SLin Jinhan if (ret) 440*495c8ff4SLin Jinhan goto exit; 441*495c8ff4SLin Jinhan 442*495c8ff4SLin Jinhan ret = test_cipher_result(); 443*495c8ff4SLin Jinhan if (ret) 444*495c8ff4SLin Jinhan goto exit; 445*495c8ff4SLin Jinhan 446*495c8ff4SLin Jinhan ret = test_rsa_result(); 447*495c8ff4SLin Jinhan if (ret) 448*495c8ff4SLin Jinhan goto exit; 449*495c8ff4SLin Jinhan 450*495c8ff4SLin Jinhan exit: 451*495c8ff4SLin Jinhan return 0; 452*495c8ff4SLin Jinhan } 453*495c8ff4SLin Jinhan 454cc6ac5d6SJoseph Chen static int do_crypto(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 455cc6ac5d6SJoseph Chen { 456*495c8ff4SLin Jinhan return test_all_result(); 457cc6ac5d6SJoseph Chen } 458cc6ac5d6SJoseph Chen 459cc6ac5d6SJoseph Chen U_BOOT_CMD( 460cc6ac5d6SJoseph Chen crypto, 1, 1, do_crypto, 461cc6ac5d6SJoseph Chen "crypto test", 462cc6ac5d6SJoseph Chen "" 463cc6ac5d6SJoseph Chen ); 464