qemu/tests/unit/test-crypto-akcipher.c
<<
>>
Prefs
   1/*
   2 * QEMU Crypto cipher algorithms
   3 *
   4 * Copyright (c) 2022 Bytedance
   5 * Author: lei he <helei.sig11@bytedance.com>
   6 *
   7 * This library is free software; you can redistribute it and/or
   8 * modify it under the terms of the GNU Lesser General Public
   9 * License as published by the Free Software Foundation; either
  10 * version 2.1 of the License, or (at your option) any later version.
  11 *
  12 * This library is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15 * Lesser General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU Lesser General Public
  18 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  19 *
  20 */
  21
  22#include "qemu/osdep.h"
  23
  24#include "crypto/init.h"
  25#include "crypto/akcipher.h"
  26#include "qapi/error.h"
  27
  28static const uint8_t rsa1024_private_key[] = {
  29    0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02,
  30    0x81, 0x81, 0x00, 0xe6, 0x4d, 0x76, 0x4f, 0xb2,
  31    0x97, 0x09, 0xad, 0x9d, 0x17, 0x33, 0xf2, 0x30,
  32    0x42, 0x83, 0xa9, 0xcb, 0x49, 0xa4, 0x2e, 0x59,
  33    0x5e, 0x75, 0x51, 0xd1, 0xac, 0xc8, 0x86, 0x3e,
  34    0xdb, 0x72, 0x2e, 0xb2, 0xf7, 0xc3, 0x5b, 0xc7,
  35    0xea, 0xed, 0x30, 0xd1, 0xf7, 0x37, 0xee, 0x9d,
  36    0x36, 0x59, 0x6f, 0xf8, 0xce, 0xc0, 0x5c, 0x82,
  37    0x80, 0x37, 0x83, 0xd7, 0x45, 0x6a, 0xe9, 0xea,
  38    0xc5, 0x3a, 0x59, 0x6b, 0x34, 0x31, 0x44, 0x00,
  39    0x74, 0xa7, 0x29, 0xab, 0x79, 0x4a, 0xbd, 0xe8,
  40    0x25, 0x35, 0x01, 0x11, 0x40, 0xbf, 0x31, 0xbd,
  41    0xd3, 0xe0, 0x68, 0x1e, 0xd5, 0x5b, 0x2f, 0xe9,
  42    0x20, 0xf2, 0x9f, 0x46, 0x35, 0x30, 0xa8, 0xf1,
  43    0xfe, 0xef, 0xd8, 0x76, 0x23, 0x46, 0x34, 0x70,
  44    0xa1, 0xce, 0xc6, 0x65, 0x6d, 0xb0, 0x94, 0x7e,
  45    0xe5, 0x92, 0x45, 0x7b, 0xaa, 0xbb, 0x95, 0x97,
  46    0x77, 0xcd, 0xd3, 0x02, 0x03, 0x01, 0x00, 0x01,
  47    0x02, 0x81, 0x80, 0x30, 0x6a, 0xc4, 0x9e, 0xc8,
  48    0xba, 0xfc, 0x2b, 0xe5, 0xc4, 0xc5, 0x04, 0xfb,
  49    0xa4, 0x60, 0x2d, 0xc8, 0x31, 0x39, 0x35, 0x0d,
  50    0x50, 0xd0, 0x75, 0x5d, 0x11, 0x68, 0x2e, 0xe0,
  51    0xf4, 0x1d, 0xb3, 0x37, 0xa8, 0xe3, 0x07, 0x5e,
  52    0xa6, 0x43, 0x2b, 0x6a, 0x59, 0x01, 0x07, 0x47,
  53    0x41, 0xef, 0xd7, 0x9c, 0x85, 0x4a, 0xe7, 0xa7,
  54    0xff, 0xf0, 0xab, 0xe5, 0x0c, 0x11, 0x08, 0x10,
  55    0x75, 0x5a, 0x68, 0xa0, 0x08, 0x03, 0xc9, 0x40,
  56    0x79, 0x67, 0x1d, 0x65, 0x89, 0x2d, 0x08, 0xf9,
  57    0xb5, 0x1b, 0x7d, 0xd2, 0x41, 0x3b, 0x33, 0xf2,
  58    0x47, 0x2f, 0x9c, 0x0b, 0xd5, 0xaf, 0xcb, 0xdb,
  59    0xbb, 0x37, 0x63, 0x03, 0xf8, 0xe7, 0x2e, 0xc7,
  60    0x3c, 0x86, 0x9f, 0xc2, 0x9b, 0xb4, 0x70, 0x6a,
  61    0x4d, 0x7c, 0xe4, 0x1b, 0x3a, 0xa9, 0xae, 0xd7,
  62    0xce, 0x7f, 0x56, 0xc2, 0x73, 0x5e, 0x58, 0x63,
  63    0xd5, 0x86, 0x41, 0x02, 0x41, 0x00, 0xf6, 0x56,
  64    0x69, 0xec, 0xef, 0x65, 0x95, 0xdc, 0x25, 0x47,
  65    0xe0, 0x6f, 0xb0, 0x4f, 0x79, 0x77, 0x0a, 0x5e,
  66    0x46, 0xcb, 0xbd, 0x0b, 0x71, 0x51, 0x2a, 0xa4,
  67    0x65, 0x29, 0x18, 0xc6, 0x30, 0xa0, 0x95, 0x4c,
  68    0x4b, 0xbe, 0x8c, 0x40, 0xe3, 0x9c, 0x23, 0x02,
  69    0x14, 0x43, 0xe9, 0x64, 0xea, 0xe3, 0xa8, 0xe2,
  70    0x1a, 0xd5, 0xf9, 0x5c, 0xe0, 0x36, 0x2c, 0x97,
  71    0xda, 0xd5, 0xc7, 0x46, 0xce, 0x11, 0x02, 0x41,
  72    0x00, 0xef, 0x56, 0x08, 0xb8, 0x29, 0xa5, 0xa6,
  73    0x7c, 0xf7, 0x5f, 0xb4, 0xf5, 0x63, 0xe7, 0xeb,
  74    0x45, 0xfd, 0x89, 0xaa, 0x94, 0xa6, 0x3d, 0x0b,
  75    0xd9, 0x04, 0x6f, 0x78, 0xe0, 0xbb, 0xa2, 0xd4,
  76    0x29, 0x83, 0x17, 0x95, 0x6f, 0x50, 0x3d, 0x40,
  77    0x5d, 0xe5, 0x24, 0xda, 0xc2, 0x23, 0x50, 0x86,
  78    0xa8, 0x34, 0xc8, 0x6f, 0xec, 0x7f, 0xb6, 0x45,
  79    0x3a, 0xdd, 0x78, 0x9b, 0xee, 0xa1, 0xe4, 0x09,
  80    0xa3, 0x02, 0x40, 0x5c, 0xd6, 0x66, 0x67, 0x58,
  81    0x35, 0xc5, 0xcb, 0xc8, 0xf5, 0x14, 0xbd, 0xa3,
  82    0x09, 0xe0, 0xb2, 0x1f, 0x63, 0x36, 0x75, 0x34,
  83    0x52, 0xea, 0xaa, 0xf7, 0x52, 0x2b, 0x99, 0xd8,
  84    0x6f, 0x61, 0x06, 0x34, 0x1e, 0x23, 0xf1, 0xb5,
  85    0x34, 0x03, 0x53, 0xe5, 0xd1, 0xb3, 0xc7, 0x80,
  86    0x5f, 0x7b, 0x32, 0xbf, 0x84, 0x2f, 0x2e, 0xf3,
  87    0x22, 0xb0, 0x91, 0x5a, 0x2f, 0x04, 0xd7, 0x4a,
  88    0x9a, 0x01, 0xb1, 0x02, 0x40, 0x34, 0x0b, 0x26,
  89    0x4c, 0x3d, 0xaa, 0x2a, 0xc0, 0xe3, 0xdd, 0xe8,
  90    0xf0, 0xaf, 0x6f, 0xe0, 0x06, 0x51, 0x32, 0x9d,
  91    0x68, 0x43, 0x99, 0xe4, 0xb8, 0xa5, 0x31, 0x44,
  92    0x3c, 0xc2, 0x30, 0x8f, 0x28, 0x13, 0xbc, 0x8e,
  93    0x1f, 0x2d, 0x78, 0x94, 0x45, 0x96, 0xad, 0x63,
  94    0xf0, 0x71, 0x53, 0x72, 0x64, 0xa3, 0x4d, 0xae,
  95    0xa0, 0xe3, 0xc8, 0x93, 0xd7, 0x50, 0x0f, 0x89,
  96    0x00, 0xe4, 0x2d, 0x3d, 0x37, 0x02, 0x41, 0x00,
  97    0xbe, 0xa6, 0x08, 0xe0, 0xc8, 0x15, 0x2a, 0x47,
  98    0xcb, 0xd5, 0xec, 0x93, 0xd3, 0xaa, 0x12, 0x82,
  99    0xaf, 0xac, 0x51, 0x5a, 0x5b, 0xa7, 0x93, 0x4b,
 100    0xb9, 0xab, 0x00, 0xfa, 0x5a, 0xea, 0x34, 0xe4,
 101    0x80, 0xf1, 0x44, 0x6a, 0x65, 0xe4, 0x33, 0x99,
 102    0xfb, 0x54, 0xd7, 0x89, 0x5a, 0x1b, 0xd6, 0x2b,
 103    0xcc, 0x6e, 0x4b, 0x19, 0xa0, 0x6d, 0x93, 0x9f,
 104    0xc3, 0x91, 0x7a, 0xa5, 0xd8, 0x59, 0x0e, 0x9e,
 105};
 106
 107static const uint8_t rsa1024_public_key[] = {
 108    0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xe6,
 109    0x4d, 0x76, 0x4f, 0xb2, 0x97, 0x09, 0xad, 0x9d,
 110    0x17, 0x33, 0xf2, 0x30, 0x42, 0x83, 0xa9, 0xcb,
 111    0x49, 0xa4, 0x2e, 0x59, 0x5e, 0x75, 0x51, 0xd1,
 112    0xac, 0xc8, 0x86, 0x3e, 0xdb, 0x72, 0x2e, 0xb2,
 113    0xf7, 0xc3, 0x5b, 0xc7, 0xea, 0xed, 0x30, 0xd1,
 114    0xf7, 0x37, 0xee, 0x9d, 0x36, 0x59, 0x6f, 0xf8,
 115    0xce, 0xc0, 0x5c, 0x82, 0x80, 0x37, 0x83, 0xd7,
 116    0x45, 0x6a, 0xe9, 0xea, 0xc5, 0x3a, 0x59, 0x6b,
 117    0x34, 0x31, 0x44, 0x00, 0x74, 0xa7, 0x29, 0xab,
 118    0x79, 0x4a, 0xbd, 0xe8, 0x25, 0x35, 0x01, 0x11,
 119    0x40, 0xbf, 0x31, 0xbd, 0xd3, 0xe0, 0x68, 0x1e,
 120    0xd5, 0x5b, 0x2f, 0xe9, 0x20, 0xf2, 0x9f, 0x46,
 121    0x35, 0x30, 0xa8, 0xf1, 0xfe, 0xef, 0xd8, 0x76,
 122    0x23, 0x46, 0x34, 0x70, 0xa1, 0xce, 0xc6, 0x65,
 123    0x6d, 0xb0, 0x94, 0x7e, 0xe5, 0x92, 0x45, 0x7b,
 124    0xaa, 0xbb, 0x95, 0x97, 0x77, 0xcd, 0xd3, 0x02,
 125    0x03, 0x01, 0x00, 0x01,
 126};
 127
 128static const uint8_t rsa2048_private_key[] = {
 129    0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02,
 130    0x82, 0x01, 0x01, 0x00, 0xbd, 0x9c, 0x83, 0x6b,
 131    0x0e, 0x8e, 0xcf, 0xfa, 0xaa, 0x4f, 0x6a, 0xf4,
 132    0xe3, 0x52, 0x0f, 0xa5, 0xd0, 0xbe, 0x5e, 0x7f,
 133    0x08, 0x24, 0xba, 0x87, 0x46, 0xfb, 0x28, 0x93,
 134    0xe5, 0xe5, 0x81, 0x42, 0xc0, 0xf9, 0x17, 0xc7,
 135    0x81, 0x01, 0xf4, 0x18, 0x6a, 0x17, 0xf5, 0x57,
 136    0x20, 0x37, 0xcf, 0xf9, 0x74, 0x5e, 0xe1, 0x48,
 137    0x6a, 0x71, 0x0a, 0x0f, 0x79, 0x72, 0x2b, 0x46,
 138    0x10, 0x53, 0xdc, 0x14, 0x43, 0xbd, 0xbc, 0x6d,
 139    0x15, 0x6f, 0x15, 0x4e, 0xf0, 0x0d, 0x89, 0x39,
 140    0x02, 0xc3, 0x68, 0x5c, 0xa8, 0xfc, 0xed, 0x64,
 141    0x9d, 0x98, 0xb7, 0xcd, 0x83, 0x66, 0x93, 0xc3,
 142    0xd9, 0x57, 0xa0, 0x21, 0x93, 0xad, 0x5c, 0x75,
 143    0x69, 0x88, 0x9e, 0x81, 0xdc, 0x7f, 0x1d, 0xd5,
 144    0xbd, 0x1c, 0xc1, 0x30, 0x56, 0xa5, 0xda, 0x99,
 145    0x46, 0xa6, 0x6d, 0x0e, 0x6f, 0x5e, 0x51, 0x34,
 146    0x49, 0x73, 0xc3, 0x67, 0x49, 0x7e, 0x21, 0x2a,
 147    0x20, 0xa7, 0x2b, 0x92, 0x73, 0x1d, 0xa5, 0x25,
 148    0x2a, 0xd0, 0x3a, 0x89, 0x75, 0xb2, 0xbb, 0x19,
 149    0x37, 0x78, 0x48, 0xd2, 0xf2, 0x2a, 0x6d, 0x9e,
 150    0xc6, 0x26, 0xca, 0x46, 0x8c, 0xf1, 0x42, 0x2a,
 151    0x31, 0xb2, 0xfc, 0xe7, 0x55, 0x51, 0xff, 0x07,
 152    0x13, 0x5b, 0x36, 0x59, 0x2b, 0x43, 0x30, 0x4b,
 153    0x05, 0x5c, 0xd2, 0x45, 0xa0, 0xa0, 0x7c, 0x17,
 154    0x5b, 0x07, 0xbb, 0x5d, 0x83, 0x80, 0x92, 0x6d,
 155    0x87, 0x1a, 0x43, 0xac, 0xc7, 0x6b, 0x8d, 0x11,
 156    0x60, 0x27, 0xd2, 0xdf, 0xdb, 0x71, 0x02, 0x55,
 157    0x6e, 0xb5, 0xca, 0x4d, 0xda, 0x59, 0x0d, 0xb8,
 158    0x8c, 0xcd, 0xd3, 0x0e, 0x55, 0xa0, 0xa4, 0x8d,
 159    0xa0, 0x14, 0x10, 0x48, 0x42, 0x35, 0x56, 0x08,
 160    0xf7, 0x29, 0x5f, 0xa2, 0xea, 0xa4, 0x5e, 0x8e,
 161    0x99, 0x56, 0xaa, 0x5a, 0x8c, 0x23, 0x8f, 0x35,
 162    0x22, 0x8a, 0xff, 0xed, 0x02, 0x03, 0x01, 0x00,
 163    0x01, 0x02, 0x82, 0x01, 0x00, 0x4e, 0x4a, 0xf3,
 164    0x44, 0xe0, 0x64, 0xfd, 0xe1, 0xde, 0x33, 0x1e,
 165    0xd1, 0xf1, 0x8f, 0x6f, 0xe0, 0xa2, 0xfa, 0x08,
 166    0x60, 0xe1, 0xc6, 0xf0, 0xb2, 0x6d, 0x0f, 0xc6,
 167    0x28, 0x93, 0xb4, 0x19, 0x94, 0xab, 0xc3, 0xef,
 168    0x1a, 0xb4, 0xdd, 0x4e, 0xa2, 0x4a, 0x24, 0x8c,
 169    0x6c, 0xa6, 0x64, 0x05, 0x5f, 0x56, 0xba, 0xda,
 170    0xc1, 0x21, 0x1a, 0x7d, 0xf1, 0xf7, 0xce, 0xb9,
 171    0xa9, 0x9b, 0x92, 0x54, 0xfc, 0x95, 0x20, 0x22,
 172    0x4e, 0xd4, 0x9b, 0xe2, 0xab, 0x8e, 0x99, 0xb8,
 173    0x40, 0xaf, 0x30, 0x6a, 0xc6, 0x60, 0x0c, 0xd8,
 174    0x25, 0x44, 0xa1, 0xcb, 0xbb, 0x73, 0x77, 0x86,
 175    0xaa, 0x46, 0xf3, 0x54, 0xae, 0xa8, 0xa0, 0xdb,
 176    0xdd, 0xab, 0x6e, 0xfb, 0x2c, 0x5a, 0x14, 0xaf,
 177    0x08, 0x13, 0xa7, 0x6c, 0xe9, 0xfd, 0xcd, 0x4c,
 178    0x1f, 0x20, 0x3a, 0x16, 0x2b, 0xf0, 0xb6, 0x7c,
 179    0x47, 0x5f, 0xd1, 0x0a, 0x2c, 0xc4, 0xa5, 0x68,
 180    0xd0, 0x43, 0x75, 0x6b, 0x65, 0xaa, 0x32, 0xc6,
 181    0x99, 0x06, 0xcb, 0x8f, 0xe6, 0x8d, 0xce, 0xbf,
 182    0x4d, 0x0d, 0x7b, 0x22, 0x2a, 0x8a, 0xcb, 0x7d,
 183    0x7f, 0x16, 0x48, 0x85, 0xf1, 0x86, 0xcb, 0x54,
 184    0xb9, 0x39, 0xd4, 0xbc, 0xe3, 0x2d, 0x27, 0x59,
 185    0xf6, 0x81, 0x5e, 0x94, 0x45, 0xdf, 0xb9, 0x22,
 186    0xaf, 0x64, 0x0d, 0x14, 0xec, 0x8c, 0xeb, 0x71,
 187    0xac, 0xee, 0x09, 0x4c, 0xbf, 0x34, 0xf9, 0xf4,
 188    0x66, 0x77, 0x36, 0x3b, 0x41, 0x74, 0x01, 0x4f,
 189    0xfc, 0x56, 0x83, 0xba, 0x14, 0xb0, 0x2f, 0xdd,
 190    0x4d, 0xb9, 0x3f, 0xdf, 0x71, 0xbe, 0x7b, 0xba,
 191    0x66, 0xc8, 0xc5, 0x42, 0xc9, 0xba, 0x18, 0x63,
 192    0x45, 0x07, 0x2f, 0x84, 0x3e, 0xc3, 0xfb, 0x47,
 193    0xda, 0xd4, 0x1d, 0x0e, 0x9d, 0x96, 0xc0, 0xea,
 194    0xee, 0x45, 0x2f, 0xe1, 0x62, 0x23, 0xee, 0xef,
 195    0x3d, 0x5e, 0x55, 0xa1, 0x0d, 0x02, 0x81, 0x81,
 196    0x00, 0xeb, 0x76, 0x88, 0xd3, 0xae, 0x3f, 0x1d,
 197    0xf2, 0x49, 0xe0, 0x37, 0x49, 0x83, 0x82, 0x6c,
 198    0xf7, 0xf1, 0x17, 0x30, 0x75, 0x2e, 0x89, 0x06,
 199    0x88, 0x56, 0x32, 0xf6, 0xfa, 0x58, 0xcb, 0x3c,
 200    0x98, 0x67, 0xc3, 0xde, 0x10, 0x82, 0xe5, 0xfa,
 201    0xfa, 0x52, 0x47, 0x8d, 0xd7, 0x00, 0xc6, 0xcb,
 202    0xf7, 0xf6, 0x57, 0x9b, 0x6e, 0x0c, 0xac, 0xe8,
 203    0x3b, 0xd1, 0xde, 0xb5, 0x34, 0xaf, 0x8b, 0x2a,
 204    0xb0, 0x2d, 0x01, 0xeb, 0x7c, 0xa0, 0x42, 0x26,
 205    0xbb, 0x2b, 0x43, 0x0e, 0x1d, 0xe2, 0x4e, 0xc9,
 206    0xc1, 0x0a, 0x67, 0x1d, 0xfc, 0x83, 0x25, 0xce,
 207    0xb2, 0x18, 0xd9, 0x0d, 0x70, 0xf5, 0xa3, 0x5a,
 208    0x9c, 0x99, 0xdd, 0x47, 0xa1, 0x57, 0xe7, 0x20,
 209    0xde, 0xa1, 0x29, 0x8d, 0x96, 0x62, 0xf9, 0x26,
 210    0x95, 0x51, 0xa6, 0xe7, 0x09, 0x8b, 0xba, 0x16,
 211    0x8b, 0x19, 0x5b, 0xf9, 0x27, 0x0d, 0xc5, 0xd6,
 212    0x5f, 0x02, 0x81, 0x81, 0x00, 0xce, 0x26, 0x31,
 213    0xb5, 0x43, 0x53, 0x95, 0x39, 0xdd, 0x01, 0x98,
 214    0x8b, 0x3d, 0x27, 0xeb, 0x0b, 0x87, 0x1c, 0x95,
 215    0xfc, 0x3e, 0x36, 0x51, 0x31, 0xb5, 0xea, 0x59,
 216    0x56, 0xc0, 0x97, 0x62, 0xf0, 0x63, 0x2b, 0xb6,
 217    0x30, 0x9b, 0xdf, 0x19, 0x10, 0xe9, 0xa0, 0x3d,
 218    0xea, 0x54, 0x5a, 0xe6, 0xc6, 0x9e, 0x7e, 0xb5,
 219    0xf0, 0xb0, 0x54, 0xef, 0xc3, 0xe1, 0x47, 0xa6,
 220    0x95, 0xc7, 0xe4, 0xa3, 0x4a, 0x30, 0x68, 0x24,
 221    0x98, 0x7d, 0xc1, 0x34, 0xa9, 0xcb, 0xbc, 0x3c,
 222    0x08, 0x9c, 0x7d, 0x0c, 0xa2, 0xb7, 0x60, 0xaa,
 223    0x38, 0x08, 0x16, 0xa6, 0x7f, 0xdb, 0xd2, 0xb1,
 224    0x67, 0xe7, 0x93, 0x8e, 0xbb, 0x7e, 0xb9, 0xb5,
 225    0xd0, 0xd0, 0x9f, 0x7b, 0xcc, 0x46, 0xe6, 0x74,
 226    0x78, 0x1a, 0x96, 0xd6, 0xd7, 0x74, 0x34, 0x54,
 227    0x3b, 0x54, 0x55, 0x7f, 0x89, 0x81, 0xbc, 0x40,
 228    0x55, 0x87, 0x24, 0x95, 0x33, 0x02, 0x81, 0x81,
 229    0x00, 0xb0, 0x18, 0x5d, 0x2a, 0x1a, 0x95, 0x9f,
 230    0x9a, 0xd5, 0x3f, 0x37, 0x79, 0xe6, 0x3d, 0x83,
 231    0xab, 0x46, 0x86, 0x36, 0x3a, 0x5d, 0x0c, 0x23,
 232    0x73, 0x91, 0x2b, 0xda, 0x63, 0xce, 0x46, 0x68,
 233    0xd1, 0xfe, 0x40, 0x90, 0xf2, 0x3e, 0x43, 0x2b,
 234    0x19, 0x4c, 0xb1, 0xb0, 0xd5, 0x8c, 0x02, 0x21,
 235    0x07, 0x18, 0x17, 0xda, 0xe9, 0x49, 0xd7, 0x82,
 236    0x73, 0x42, 0x78, 0xd1, 0x82, 0x4e, 0x8a, 0xc0,
 237    0xe9, 0x33, 0x2f, 0xcd, 0x62, 0xce, 0x23, 0xca,
 238    0xfd, 0x8d, 0xd4, 0x3f, 0x59, 0x80, 0x27, 0xb6,
 239    0x61, 0x85, 0x9b, 0x2a, 0xe4, 0xef, 0x5c, 0x36,
 240    0x22, 0x21, 0xcd, 0x2a, 0x6d, 0x41, 0x77, 0xe2,
 241    0xcb, 0x5d, 0x93, 0x0d, 0x00, 0x10, 0x52, 0x8d,
 242    0xd5, 0x92, 0x28, 0x16, 0x78, 0xd3, 0x1a, 0x4c,
 243    0x8d, 0xbd, 0x9c, 0x1a, 0x0b, 0x9c, 0x91, 0x16,
 244    0x4c, 0xff, 0x31, 0x36, 0xbb, 0xcb, 0x64, 0x1a,
 245    0xf7, 0x02, 0x81, 0x80, 0x32, 0x65, 0x09, 0xdf,
 246    0xca, 0xee, 0xa2, 0xdb, 0x3b, 0x58, 0xc9, 0x86,
 247    0xb8, 0x53, 0x8a, 0xd5, 0x0d, 0x99, 0x82, 0x5c,
 248    0xe0, 0x84, 0x7c, 0xc2, 0xcf, 0x3a, 0xd3, 0xce,
 249    0x2e, 0x54, 0x93, 0xbe, 0x3a, 0x30, 0x14, 0x60,
 250    0xbb, 0xaa, 0x05, 0x41, 0xaa, 0x2b, 0x1f, 0x17,
 251    0xaa, 0xb9, 0x72, 0x12, 0xf9, 0xe9, 0xf5, 0xe6,
 252    0x39, 0xe4, 0xf9, 0x9c, 0x03, 0xf5, 0x75, 0x16,
 253    0xc6, 0x7f, 0xf1, 0x1f, 0x10, 0xc8, 0x54, 0xb1,
 254    0xe6, 0x84, 0x15, 0xb0, 0xb0, 0x7a, 0x7a, 0x9e,
 255    0x8c, 0x4a, 0xd1, 0x8c, 0xf1, 0x91, 0x32, 0xeb,
 256    0x71, 0xa6, 0xbf, 0xdb, 0x1f, 0xcc, 0xd8, 0xcb,
 257    0x92, 0xc3, 0xf2, 0xaf, 0x89, 0x22, 0x32, 0xfd,
 258    0x32, 0x12, 0xda, 0xbb, 0xac, 0x55, 0x68, 0x01,
 259    0x78, 0x56, 0x89, 0x7c, 0xb0, 0x0e, 0x9e, 0xcc,
 260    0xc6, 0x28, 0x04, 0x7e, 0x83, 0xf5, 0x96, 0x30,
 261    0x92, 0x51, 0xf2, 0x1b, 0x02, 0x81, 0x81, 0x00,
 262    0x83, 0x6d, 0xd1, 0x98, 0x90, 0x41, 0x8c, 0xa7,
 263    0x92, 0x83, 0xac, 0x89, 0x05, 0x0c, 0x79, 0x67,
 264    0x90, 0xb6, 0xa1, 0xf3, 0x2f, 0xca, 0xf0, 0x15,
 265    0xe0, 0x30, 0x58, 0xe9, 0x4f, 0xcb, 0x4c, 0x56,
 266    0x56, 0x56, 0x14, 0x3f, 0x1b, 0x79, 0xb6, 0xef,
 267    0x57, 0x4b, 0x28, 0xbd, 0xb0, 0xe6, 0x0c, 0x49,
 268    0x4b, 0xbe, 0xe1, 0x57, 0x28, 0x2a, 0x23, 0x5e,
 269    0xc4, 0xa2, 0x19, 0x4b, 0x00, 0x67, 0x78, 0xd9,
 270    0x26, 0x6e, 0x17, 0x25, 0xce, 0xe4, 0xfd, 0xde,
 271    0x86, 0xa8, 0x5a, 0x67, 0x47, 0x6b, 0x15, 0x09,
 272    0xe1, 0xec, 0x8e, 0x62, 0x98, 0x91, 0x6f, 0xc0,
 273    0x98, 0x0c, 0x70, 0x0e, 0x7d, 0xbe, 0x63, 0xbd,
 274    0x12, 0x5a, 0x98, 0x1c, 0xe3, 0x0c, 0xfb, 0xc7,
 275    0xfb, 0x1b, 0xbd, 0x02, 0x87, 0xcc, 0x0c, 0xbb,
 276    0xc2, 0xd4, 0xb6, 0xc1, 0xa1, 0x23, 0xd3, 0x1e,
 277    0x21, 0x6f, 0x48, 0xba, 0x0e, 0x2e, 0xc7, 0x42
 278};
 279
 280static const uint8_t rsa2048_public_key[] = {
 281    0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01,
 282    0x00, 0xbd, 0x9c, 0x83, 0x6b, 0x0e, 0x8e, 0xcf,
 283    0xfa, 0xaa, 0x4f, 0x6a, 0xf4, 0xe3, 0x52, 0x0f,
 284    0xa5, 0xd0, 0xbe, 0x5e, 0x7f, 0x08, 0x24, 0xba,
 285    0x87, 0x46, 0xfb, 0x28, 0x93, 0xe5, 0xe5, 0x81,
 286    0x42, 0xc0, 0xf9, 0x17, 0xc7, 0x81, 0x01, 0xf4,
 287    0x18, 0x6a, 0x17, 0xf5, 0x57, 0x20, 0x37, 0xcf,
 288    0xf9, 0x74, 0x5e, 0xe1, 0x48, 0x6a, 0x71, 0x0a,
 289    0x0f, 0x79, 0x72, 0x2b, 0x46, 0x10, 0x53, 0xdc,
 290    0x14, 0x43, 0xbd, 0xbc, 0x6d, 0x15, 0x6f, 0x15,
 291    0x4e, 0xf0, 0x0d, 0x89, 0x39, 0x02, 0xc3, 0x68,
 292    0x5c, 0xa8, 0xfc, 0xed, 0x64, 0x9d, 0x98, 0xb7,
 293    0xcd, 0x83, 0x66, 0x93, 0xc3, 0xd9, 0x57, 0xa0,
 294    0x21, 0x93, 0xad, 0x5c, 0x75, 0x69, 0x88, 0x9e,
 295    0x81, 0xdc, 0x7f, 0x1d, 0xd5, 0xbd, 0x1c, 0xc1,
 296    0x30, 0x56, 0xa5, 0xda, 0x99, 0x46, 0xa6, 0x6d,
 297    0x0e, 0x6f, 0x5e, 0x51, 0x34, 0x49, 0x73, 0xc3,
 298    0x67, 0x49, 0x7e, 0x21, 0x2a, 0x20, 0xa7, 0x2b,
 299    0x92, 0x73, 0x1d, 0xa5, 0x25, 0x2a, 0xd0, 0x3a,
 300    0x89, 0x75, 0xb2, 0xbb, 0x19, 0x37, 0x78, 0x48,
 301    0xd2, 0xf2, 0x2a, 0x6d, 0x9e, 0xc6, 0x26, 0xca,
 302    0x46, 0x8c, 0xf1, 0x42, 0x2a, 0x31, 0xb2, 0xfc,
 303    0xe7, 0x55, 0x51, 0xff, 0x07, 0x13, 0x5b, 0x36,
 304    0x59, 0x2b, 0x43, 0x30, 0x4b, 0x05, 0x5c, 0xd2,
 305    0x45, 0xa0, 0xa0, 0x7c, 0x17, 0x5b, 0x07, 0xbb,
 306    0x5d, 0x83, 0x80, 0x92, 0x6d, 0x87, 0x1a, 0x43,
 307    0xac, 0xc7, 0x6b, 0x8d, 0x11, 0x60, 0x27, 0xd2,
 308    0xdf, 0xdb, 0x71, 0x02, 0x55, 0x6e, 0xb5, 0xca,
 309    0x4d, 0xda, 0x59, 0x0d, 0xb8, 0x8c, 0xcd, 0xd3,
 310    0x0e, 0x55, 0xa0, 0xa4, 0x8d, 0xa0, 0x14, 0x10,
 311    0x48, 0x42, 0x35, 0x56, 0x08, 0xf7, 0x29, 0x5f,
 312    0xa2, 0xea, 0xa4, 0x5e, 0x8e, 0x99, 0x56, 0xaa,
 313    0x5a, 0x8c, 0x23, 0x8f, 0x35, 0x22, 0x8a, 0xff,
 314    0xed, 0x02, 0x03, 0x01, 0x00, 0x01
 315};
 316
 317static const uint8_t test_sha1_dgst[] = {
 318    0x3c, 0x05, 0x19, 0x34, 0x29, 0x19, 0xc7, 0xe0,
 319    0x87, 0xb6, 0x24, 0xf9, 0x58, 0xac, 0xa4, 0xd4,
 320    0xb2, 0xd9, 0x03, 0x9e,
 321};
 322
 323static const uint8_t exp_signature_rsa2048_pkcs1[] = {
 324    0x4e, 0x82, 0x56, 0x4c, 0x84, 0x66, 0xca, 0x1e,
 325    0xc6, 0x92, 0x46, 0x20, 0x02, 0x6b, 0x64, 0x46,
 326    0x15, 0x6b, 0x24, 0xf2, 0xbb, 0xfa, 0x44, 0x3c,
 327    0xaf, 0x42, 0xc8, 0x41, 0xfd, 0xce, 0xed, 0x95,
 328    0x34, 0xaf, 0x25, 0x09, 0xd1, 0x06, 0x94, 0xaa,
 329    0x52, 0xd4, 0x29, 0xc8, 0x52, 0x34, 0x67, 0x59,
 330    0x4f, 0x5a, 0xfd, 0x23, 0x30, 0x5e, 0xc7, 0x1e,
 331    0xa6, 0xe0, 0x1b, 0x23, 0xca, 0x82, 0x47, 0x9a,
 332    0x2e, 0x2c, 0x66, 0x45, 0x5a, 0x12, 0xa9, 0x15,
 333    0xbf, 0xd6, 0xd6, 0xfa, 0x8d, 0x60, 0x99, 0x89,
 334    0x91, 0x39, 0x06, 0xb7, 0xd3, 0x9a, 0xef, 0x15,
 335    0x7b, 0x95, 0x87, 0x77, 0x2c, 0x41, 0xd4, 0x71,
 336    0xd5, 0xdf, 0x22, 0x7b, 0x01, 0xe2, 0xc1, 0xfb,
 337    0xb9, 0x4e, 0x0c, 0x9b, 0xd5, 0x04, 0xed, 0x2b,
 338    0x7e, 0x73, 0x53, 0xaa, 0x33, 0x89, 0x9d, 0x95,
 339    0x28, 0x8f, 0x8b, 0x80, 0x34, 0x7a, 0xea, 0xe3,
 340    0x66, 0x8a, 0xa8, 0xad, 0xed, 0x91, 0x43, 0xdd,
 341    0x77, 0xe5, 0xd7, 0x16, 0xda, 0xa8, 0x00, 0x29,
 342    0x3f, 0x9f, 0xe0, 0x1d, 0x42, 0x9d, 0x35, 0x5d,
 343    0x0f, 0xf3, 0x90, 0x27, 0x3a, 0x8c, 0x46, 0x13,
 344    0x53, 0x3e, 0x3b, 0x38, 0x77, 0xf8, 0x57, 0x61,
 345    0xbc, 0xc4, 0x54, 0x68, 0x48, 0xae, 0x58, 0x03,
 346    0x33, 0x94, 0x3f, 0x18, 0x1e, 0xb3, 0x3f, 0x79,
 347    0xa7, 0x26, 0x92, 0x5d, 0x32, 0x2a, 0xdb, 0xe6,
 348    0x3a, 0xe8, 0xd7, 0xaa, 0x91, 0xfe, 0x9f, 0x06,
 349    0x26, 0x68, 0x8c, 0x27, 0x31, 0xb0, 0x04, 0x9e,
 350    0x94, 0x79, 0x63, 0xa1, 0xc7, 0xe8, 0x5b, 0x8c,
 351    0xd3, 0xf1, 0x88, 0x58, 0x31, 0x2f, 0x4e, 0x11,
 352    0x00, 0xfe, 0x29, 0xad, 0x2c, 0xa9, 0x8e, 0x63,
 353    0xd8, 0x7d, 0xc5, 0xa1, 0x71, 0xfa, 0x08, 0x29,
 354    0xea, 0xd6, 0x6c, 0x53, 0x00, 0x52, 0xa0, 0xed,
 355    0x6b, 0x7c, 0x67, 0x50, 0x71, 0x2d, 0x96, 0x7a,
 356};
 357
 358static const uint8_t exp_signature_rsa1024_pkcs1[] = {
 359    0x6b, 0x5b, 0xbb, 0x3b, 0x1f, 0x08, 0xd8, 0xc0,
 360    0x4a, 0xf1, 0x5a, 0x12, 0xc2, 0x39, 0x14, 0x65,
 361    0x4f, 0xda, 0x79, 0x67, 0xf2, 0x89, 0x25, 0xad,
 362    0x9e, 0x7e, 0xba, 0xa8, 0x34, 0x15, 0x03, 0xdd,
 363    0x80, 0x6b, 0x01, 0xd7, 0x4a, 0xf3, 0xd6, 0xef,
 364    0x1e, 0x48, 0xf3, 0xbc, 0x75, 0x1a, 0xc4, 0x2c,
 365    0x90, 0x15, 0x9f, 0x21, 0x24, 0x98, 0x21, 0xef,
 366    0x6d, 0x3b, 0xf3, 0x82, 0x8f, 0x8d, 0xd8, 0x48,
 367    0x37, 0x16, 0x19, 0x8e, 0x3c, 0x64, 0xa0, 0x9e,
 368    0xf7, 0x0c, 0xd9, 0x5c, 0xc6, 0x13, 0xc4, 0x5f,
 369    0xf8, 0xf3, 0x59, 0x5b, 0xd0, 0x33, 0x95, 0x98,
 370    0xde, 0x67, 0x25, 0x58, 0x46, 0xba, 0xee, 0x0f,
 371    0x47, 0x7a, 0x7f, 0xd0, 0xe4, 0x77, 0x09, 0x17,
 372    0xe9, 0x81, 0x6e, 0x2d, 0x33, 0x9b, 0x13, 0x0b,
 373    0xc9, 0xb2, 0x0c, 0x2c, 0xb5, 0xdf, 0x52, 0x8f,
 374    0xab, 0x0d, 0xc6, 0x59, 0x1d, 0xc7, 0x33, 0x7b,
 375};
 376
 377static const uint8_t test_plaintext[] = {
 378    0x00, 0x44, 0xbc, 0x6f, 0x77, 0xfb, 0xe2, 0xa4,
 379    0x98, 0x9e, 0xf5, 0x33, 0xa0, 0xbd, 0x81, 0xb9,
 380    0xf1, 0x44, 0x7f, 0x79, 0x89, 0x23, 0xe5, 0x46,
 381    0x66, 0x9f, 0x98, 0x95, 0x6f, 0x56, 0x78, 0xf6,
 382    0xf5, 0xac, 0x9c, 0xda, 0xc2, 0x79, 0x59, 0xf0,
 383    0x1b, 0x03, 0xfa, 0x46, 0x1c, 0x1f, 0x18, 0x07,
 384    0xce, 0xad, 0xed, 0x3d, 0x11, 0xf9, 0x1b, 0x26,
 385    0x4a, 0x97, 0x28, 0x71, 0x5f, 0x2c, 0x5e, 0x58,
 386    0xf0, 0xd6, 0xbf, 0xa4, 0x12, 0xd0, 0x1d, 0x07,
 387    0xcb, 0x73, 0x66, 0xb6, 0xa4, 0x09, 0xaf, 0x5d,
 388    0xe9, 0x14, 0x14, 0xaf, 0x69, 0xd6, 0xee, 0x0a,
 389    0xfc, 0xca, 0xac, 0x94, 0x47, 0xd5, 0x9d, 0x5b,
 390    0x2b, 0xfb, 0xce, 0x9d, 0x04, 0xc1, 0xaf, 0xa5,
 391    0xa1, 0x8d, 0xa9, 0x48, 0xa8, 0x65, 0xe6, 0x9f,
 392    0x74, 0x78, 0x16, 0x32, 0x93, 0xb5, 0x21, 0xb9,
 393    0x9f, 0x3f, 0xc1, 0xe5, 0xa2, 0x50, 0x8b, 0x12,
 394    0xfb, 0x3e, 0xb0, 0x8a, 0x00, 0xc7, 0x20, 0x56,
 395    0xb3, 0xb1, 0x29, 0x95, 0x89, 0xd6, 0x50, 0xf5,
 396    0x37, 0x38, 0x8e, 0x12, 0xf1, 0xba, 0x82, 0x37,
 397    0x34, 0x68, 0x4b, 0xe8, 0xe3, 0x11, 0x1c, 0x46,
 398    0xf9, 0x63, 0x3a, 0xd6, 0xf3, 0x3f, 0x55, 0xa6,
 399    0xbd, 0x89, 0xf1, 0x2d, 0x38, 0x91, 0x7c, 0xc2,
 400    0x4d, 0xf1, 0x69, 0x82, 0x6d, 0x71, 0x77, 0xf4,
 401    0xfc, 0x43, 0x20, 0x6f, 0x43, 0xb9, 0x43, 0xd1,
 402    0x65, 0xbd, 0xca, 0xb1, 0x43, 0x87, 0xf8, 0xc8,
 403    0x76, 0x21, 0xa9, 0xeb, 0x3e, 0x9a, 0xef, 0xc9,
 404    0x0e, 0x79, 0xbc, 0xf0, 0xf8, 0xc8, 0xe2, 0xbc,
 405    0x33, 0x35, 0x3e, 0xfc, 0xf9, 0x44, 0x69, 0x06,
 406    0x7c, 0x7f, 0x5d, 0xa2, 0x9e, 0xab, 0xc2, 0x82,
 407    0xa0, 0xfb, 0xc5, 0x79, 0x57, 0x8c, 0xf1, 0x1c,
 408    0x51, 0x64, 0x4c, 0x56, 0x08, 0x80, 0x32, 0xf4,
 409    0x97, 0x8f, 0x6f, 0xb2, 0x16, 0xa6, 0x9d, 0x71,
 410};
 411
 412static const uint8_t exp_ciphertext_rsa1024_raw[] = {
 413    0x01, 0xa0, 0xc2, 0x94, 0x9f, 0xd6, 0xbe, 0x8d,
 414    0xe9, 0x24, 0xaa, 0x9c, 0x67, 0xd7, 0xe3, 0x04,
 415    0x34, 0xbf, 0xd3, 0x27, 0xa1, 0x43, 0xeb, 0x60,
 416    0x6b, 0x5b, 0x64, 0x15, 0x55, 0x16, 0x98, 0x35,
 417    0xc2, 0x59, 0xa7, 0xf7, 0x24, 0xf7, 0x05, 0xb9,
 418    0xe8, 0x56, 0x6f, 0xf2, 0x7d, 0x8b, 0x3c, 0xcb,
 419    0xa6, 0xc2, 0xac, 0x0c, 0x37, 0x8c, 0x70, 0x70,
 420    0x55, 0x05, 0x07, 0x0d, 0x63, 0x6b, 0x7d, 0x5f,
 421    0xae, 0x03, 0x1e, 0x55, 0x05, 0xbb, 0xa8, 0xe7,
 422    0xff, 0xa0, 0x8c, 0x5b, 0x6b, 0x01, 0x48, 0x2e,
 423    0x4f, 0x7f, 0xe2, 0x74, 0xc6, 0x32, 0xa7, 0x2d,
 424    0xdb, 0x91, 0x9b, 0x67, 0x4d, 0x71, 0xf9, 0x8c,
 425    0x42, 0x43, 0x75, 0x4e, 0xd0, 0x0e, 0x7c, 0xa0,
 426    0x97, 0x1a, 0x5f, 0x8e, 0x6f, 0xe4, 0xfa, 0x16,
 427    0x1d, 0x59, 0x0e, 0x0b, 0x11, 0x12, 0xa3, 0x0c,
 428    0xa6, 0x55, 0xe6, 0xdb, 0xa7, 0x71, 0xa6, 0xff,
 429};
 430
 431static const uint8_t exp_ciphertext_rsa1024_pkcs1[] = {
 432    0x93, 0x78, 0x6a, 0x76, 0xb8, 0x94, 0xea, 0xe4,
 433    0x32, 0x79, 0x01, 0x8b, 0xc1, 0xcb, 0x2e, 0x2d,
 434    0xfe, 0xdc, 0x9b, 0xe3, 0xe9, 0x23, 0xe4, 0x0a,
 435    0xb0, 0x6b, 0x9f, 0x6b, 0x62, 0xf5, 0x3d, 0xf0,
 436    0x78, 0x84, 0x77, 0x21, 0xad, 0x0b, 0x30, 0x30,
 437    0x94, 0xe2, 0x18, 0xc4, 0x9b, 0x12, 0x06, 0xc8,
 438    0xaa, 0xf7, 0x30, 0xe4, 0xc8, 0x64, 0xe7, 0x51,
 439    0xf1, 0x6a, 0xe1, 0xa2, 0x58, 0x7a, 0x02, 0x9c,
 440    0x8e, 0xf0, 0x2d, 0x25, 0x6b, 0xb7, 0x25, 0x5e,
 441    0x05, 0xaf, 0x38, 0xb2, 0x69, 0x5e, 0x6c, 0x75,
 442    0x6e, 0x27, 0xba, 0x5d, 0x7d, 0x35, 0x72, 0xb7,
 443    0x25, 0xd4, 0xaa, 0xb2, 0x4b, 0x9e, 0x6b, 0x82,
 444    0xb2, 0x32, 0xe2, 0x13, 0x1d, 0x00, 0x21, 0x08,
 445    0xae, 0x14, 0xbb, 0xc0, 0x40, 0xb7, 0x0d, 0xd5,
 446    0x0e, 0x4d, 0x6d, 0x9a, 0x70, 0x86, 0xe9, 0xfc,
 447    0x67, 0x2b, 0xa4, 0x11, 0x45, 0xb6, 0xc4, 0x2f,
 448};
 449
 450static const uint8_t exp_ciphertext_rsa2048_raw[] = {
 451    0x09, 0x7b, 0x9e, 0x7c, 0x10, 0x1f, 0x73, 0xb4,
 452    0x5f, 0xdb, 0x4f, 0x05, 0xe7, 0xfc, 0x9e, 0x35,
 453    0x48, 0xd8, 0xc8, 0xf5, 0xac, 0x6d, 0xb4, 0xb0,
 454    0xd4, 0xf7, 0x69, 0x0f, 0x30, 0x78, 0xbb, 0x55,
 455    0x67, 0x66, 0x66, 0x05, 0xf4, 0x77, 0xe2, 0x30,
 456    0xa5, 0x94, 0x10, 0xa3, 0xcb, 0xee, 0x13, 0x9f,
 457    0x47, 0x1b, 0x2e, 0xf9, 0xfd, 0x94, 0x09, 0xbd,
 458    0x26, 0x6e, 0x84, 0xc7, 0x5c, 0x42, 0x20, 0x76,
 459    0x72, 0x83, 0x75, 0x68, 0xa4, 0x18, 0x2d, 0x76,
 460    0x62, 0xc3, 0xab, 0xc0, 0xc9, 0x36, 0x59, 0xe0,
 461    0xa9, 0x70, 0x1f, 0xff, 0x97, 0x07, 0x0d, 0x88,
 462    0xc2, 0xd8, 0x51, 0x35, 0xf7, 0xb0, 0x50, 0xe4,
 463    0x9f, 0x3d, 0xd4, 0x71, 0x8b, 0x40, 0x89, 0x71,
 464    0x6c, 0xd8, 0xc2, 0x63, 0xb6, 0x3a, 0xce, 0xb1,
 465    0x32, 0xf1, 0xc6, 0x11, 0x31, 0x25, 0x48, 0xcf,
 466    0xeb, 0xbc, 0xd3, 0x9b, 0xc5, 0xbd, 0xd2, 0x57,
 467    0x73, 0x9b, 0x20, 0xb8, 0xdf, 0xbe, 0xb8, 0x40,
 468    0xb6, 0xac, 0x24, 0xdb, 0x94, 0x6a, 0x93, 0x43,
 469    0x4a, 0xa8, 0xa3, 0xcf, 0xd5, 0x61, 0x1b, 0x46,
 470    0x1d, 0x6f, 0x57, 0xec, 0xa6, 0xd0, 0x44, 0x05,
 471    0x48, 0xb8, 0x90, 0x80, 0x23, 0x8e, 0x5f, 0xb0,
 472    0x4b, 0x6f, 0xe3, 0xf9, 0xb0, 0x04, 0x60, 0xae,
 473    0x80, 0xcf, 0xa5, 0x5c, 0x11, 0xe4, 0xce, 0x57,
 474    0x5b, 0xbb, 0xde, 0x92, 0xfc, 0xe7, 0x3f, 0xe0,
 475    0xfc, 0x06, 0xc8, 0xf3, 0x8c, 0xac, 0x86, 0x09,
 476    0x31, 0xe5, 0x7e, 0xfb, 0x5d, 0xa7, 0x57, 0xf8,
 477    0x1d, 0x23, 0x9d, 0xa3, 0xeb, 0x53, 0x28, 0xde,
 478    0xbf, 0x53, 0xef, 0x35, 0x3c, 0x7e, 0x3c, 0x1b,
 479    0x76, 0x9d, 0x09, 0x25, 0x43, 0xd4, 0x8b, 0xca,
 480    0xda, 0x45, 0x5b, 0xdc, 0x9f, 0x57, 0x5a, 0x30,
 481    0x2e, 0xe9, 0x73, 0x68, 0x28, 0xfa, 0x40, 0xb0,
 482    0x7c, 0x31, 0xd7, 0x8b, 0x4e, 0x99, 0x94, 0xf1,
 483};
 484
 485static const uint8_t exp_ciphertext_rsa2048_pkcs1[] = {
 486    0xa5, 0x19, 0x19, 0x34, 0xad, 0xf6, 0xd2, 0xbe,
 487    0xed, 0x8f, 0xe5, 0xfe, 0xa2, 0xa5, 0x20, 0x08,
 488    0x15, 0x53, 0x7c, 0x68, 0x28, 0xae, 0x07, 0xb2,
 489    0x4c, 0x5d, 0xee, 0xc1, 0xc6, 0xdc, 0xd6, 0x8b,
 490    0xc6, 0xba, 0x46, 0xe1, 0x16, 0xa9, 0x04, 0x72,
 491    0xdf, 0x8f, 0x1e, 0x97, 0x2a, 0x55, 0xe7, 0xac,
 492    0x08, 0x0d, 0x61, 0xe8, 0x64, 0x8b, 0x6f, 0x96,
 493    0x0e, 0xbb, 0x8a, 0x30, 0xb3, 0x73, 0x28, 0x61,
 494    0x16, 0x89, 0x90, 0x88, 0x8e, 0xda, 0x22, 0xe6,
 495    0x42, 0x16, 0xc7, 0xe8, 0x30, 0x0d, 0x7f, 0x44,
 496    0x1e, 0xef, 0xe6, 0xdb, 0x78, 0x54, 0x89, 0xa5,
 497    0x60, 0x67, 0xb3, 0x35, 0x2d, 0x79, 0x49, 0xcf,
 498    0xe6, 0x8f, 0xf3, 0x64, 0x52, 0x1c, 0x6c, 0x43,
 499    0x7e, 0xb0, 0xde, 0x55, 0xdf, 0xbe, 0xb7, 0xb1,
 500    0xdb, 0x02, 0xee, 0x76, 0x96, 0xcc, 0x0b, 0x97,
 501    0x8c, 0x23, 0xaa, 0x7d, 0x4c, 0x47, 0x28, 0x41,
 502    0x7a, 0x20, 0x39, 0x1f, 0x64, 0x0b, 0xf1, 0x74,
 503    0xf1, 0x29, 0xda, 0xe9, 0x3a, 0x36, 0xa6, 0x88,
 504    0xb8, 0xc0, 0x21, 0xb8, 0x9b, 0x5d, 0x90, 0x85,
 505    0xa3, 0x30, 0x61, 0x17, 0x8c, 0x74, 0x63, 0xd5,
 506    0x0f, 0x95, 0xdc, 0xc8, 0x4f, 0xa7, 0x24, 0x55,
 507    0x40, 0xe2, 0x84, 0x57, 0x65, 0x06, 0x11, 0x30,
 508    0x2b, 0x9e, 0x32, 0x95, 0x39, 0xf2, 0x1a, 0x3f,
 509    0xab, 0xcd, 0x7b, 0x7f, 0x9c, 0xf0, 0x00, 0x50,
 510    0x7c, 0xf4, 0xbe, 0xcb, 0x80, 0xea, 0x66, 0xba,
 511    0x0e, 0x7b, 0x46, 0x0b, 0x25, 0xe0, 0xc1, 0x03,
 512    0x29, 0x11, 0x2d, 0x69, 0x4f, 0x21, 0xa2, 0x58,
 513    0x37, 0x4b, 0x84, 0x15, 0xb3, 0x65, 0x3a, 0xac,
 514    0xd4, 0xd0, 0xf6, 0xdf, 0x4b, 0x82, 0xca, 0x9e,
 515    0xbb, 0xbe, 0x3c, 0x4d, 0xd5, 0xbf, 0x00, 0xd6,
 516    0x12, 0x48, 0x72, 0x0b, 0xc7, 0xf8, 0xe1, 0xcd,
 517    0xd0, 0x28, 0x03, 0x19, 0xa6, 0x06, 0x13, 0x45,
 518};
 519
 520static const uint8_t rsa_private_key_lack_element[] = {
 521    /* RSAPrivateKey, offset: 0, length: 176 */
 522    0x30, 0x81, 0xb0,
 523    /* version, offset: 4, length: 1 */
 524    0x02, 0x01, 0x00,
 525    /* n, offset: 7, length: 65 */
 526    0x02, 0x41,
 527    0x00, 0xb9, 0xe1, 0x22, 0xdb, 0x56, 0x2f, 0xb6,
 528    0xf7, 0xf0, 0x0a, 0x87, 0x43, 0x07, 0x12, 0xdb,
 529    0x6d, 0xb6, 0x2b, 0x41, 0x8d, 0x2c, 0x3c, 0xa5,
 530    0xdd, 0x78, 0x9a, 0x8f, 0xab, 0x8e, 0xf2, 0x4a,
 531    0xc8, 0x34, 0x0c, 0x12, 0x4f, 0x11, 0x90, 0xc6,
 532    0xc2, 0xa5, 0xd0, 0xcd, 0xfb, 0xfc, 0x2c, 0x95,
 533    0x56, 0x82, 0xdf, 0x39, 0xf3, 0x3b, 0x1d, 0x62,
 534    0x26, 0x97, 0xb7, 0x93, 0x25, 0xc7, 0xec, 0x7e,
 535    0xf7,
 536    /* e, offset: 74, length: 3 */
 537    0x02, 0x03, 0x01, 0x00, 0x01,
 538    /* d, offset: 79, length: 64 */
 539    0x02, 0x40,
 540    0x1e, 0x80, 0xfe, 0xda, 0x65, 0xdb, 0x70, 0xb8,
 541    0x61, 0x91, 0x28, 0xbf, 0x6c, 0x32, 0xc1, 0x05,
 542    0xd1, 0x26, 0x6a, 0x1c, 0x83, 0xcc, 0xf4, 0x1f,
 543    0x53, 0x42, 0x72, 0x1f, 0x62, 0x57, 0x0a, 0xc4,
 544    0x66, 0x76, 0x30, 0x87, 0xb9, 0xb1, 0xb9, 0x6a,
 545    0x63, 0xfd, 0x8f, 0x3e, 0xfc, 0x35, 0x3f, 0xd6,
 546    0x2e, 0x6c, 0xc8, 0x70, 0x8a, 0x17, 0xc1, 0x28,
 547    0x6a, 0xfe, 0x51, 0x56, 0xb3, 0x92, 0x6f, 0x09,
 548    /* p, offset: 145, length: 33 */
 549    0x02, 0x21,
 550    0x00, 0xe3, 0x2e, 0x2d, 0x8d, 0xba, 0x1c, 0x34,
 551    0x4c, 0x49, 0x9f, 0xc1, 0xa6, 0xdd, 0xd7, 0x13,
 552    0x8d, 0x05, 0x48, 0xdd, 0xff, 0x5c, 0x30, 0xbc,
 553    0x6b, 0xc4, 0x18, 0x9d, 0xfc, 0xa2, 0xd0, 0x9b,
 554    0x4d,
 555    /* q, offset: 180, length: 33 */
 556    0x02, 0x21,
 557    0x00, 0xd1, 0x75, 0xaf, 0x4b, 0xc6, 0x1a, 0xb0,
 558    0x98, 0x14, 0x42, 0xae, 0x33, 0xf3, 0x44, 0xde,
 559    0x21, 0xcb, 0x04, 0xda, 0xfb, 0x1e, 0x35, 0x92,
 560    0xcd, 0x69, 0xc0, 0x83, 0x06, 0x83, 0x8e, 0x39,
 561    0x53,
 562    /* lack element: dp, dq, u */
 563};
 564
 565static const uint8_t rsa_public_key_lack_element[] = {
 566    /* RSAPublicKey, offset: 0, length: 67 */
 567    0x30, 0x81, 0x43,
 568    /* n, offset: 7, length: 65 */
 569    0x02, 0x41,
 570    0x00, 0xb9, 0xe1, 0x22, 0xdb, 0x56, 0x2f, 0xb6,
 571    0xf7, 0xf0, 0x0a, 0x87, 0x43, 0x07, 0x12, 0xdb,
 572    0x6d, 0xb6, 0x2b, 0x41, 0x8d, 0x2c, 0x3c, 0xa5,
 573    0xdd, 0x78, 0x9a, 0x8f, 0xab, 0x8e, 0xf2, 0x4a,
 574    0xc8, 0x34, 0x0c, 0x12, 0x4f, 0x11, 0x90, 0xc6,
 575    0xc2, 0xa5, 0xd0, 0xcd, 0xfb, 0xfc, 0x2c, 0x95,
 576    0x56, 0x82, 0xdf, 0x39, 0xf3, 0x3b, 0x1d, 0x62,
 577    0x26, 0x97, 0xb7, 0x93, 0x25, 0xc7, 0xec, 0x7e,
 578    0xf7,
 579    /* lack element: e */
 580};
 581
 582static const uint8_t rsa_public_key_empty_element[] = {
 583    /* RSAPublicKey, offset: 0, length: 69 */
 584    0x30, 0x81, 0x45,
 585    /* n, offset: 7, length: 65 */
 586    0x02, 0x41,
 587    0x00, 0xb9, 0xe1, 0x22, 0xdb, 0x56, 0x2f, 0xb6,
 588    0xf7, 0xf0, 0x0a, 0x87, 0x43, 0x07, 0x12, 0xdb,
 589    0x6d, 0xb6, 0x2b, 0x41, 0x8d, 0x2c, 0x3c, 0xa5,
 590    0xdd, 0x78, 0x9a, 0x8f, 0xab, 0x8e, 0xf2, 0x4a,
 591    0xc8, 0x34, 0x0c, 0x12, 0x4f, 0x11, 0x90, 0xc6,
 592    0xc2, 0xa5, 0xd0, 0xcd, 0xfb, 0xfc, 0x2c, 0x95,
 593    0x56, 0x82, 0xdf, 0x39, 0xf3, 0x3b, 0x1d, 0x62,
 594    0x26, 0x97, 0xb7, 0x93, 0x25, 0xc7, 0xec, 0x7e,
 595    0xf7,
 596    /* e: empty element */
 597    0x02, 0x00,
 598};
 599
 600static const uint8_t rsa_private_key_empty_element[] = {
 601    /* RSAPrivateKey, offset: 0, length: 19 */
 602    0x30, 0x81, 0x13,
 603    /* version, offset: 4, length: 1 */
 604    0x02, 0x01, 0x00,
 605    /* n: empty element */
 606    0x02, 0x00,
 607    /* e: empty element */
 608    0x02, 0x00,
 609    /* d: empty element */
 610    0x02, 0x00,
 611    /* p: empty element */
 612    0x02, 0x00,
 613    /* q: empty element */
 614    0x02, 0x00,
 615    /* dp: empty element */
 616    0x02, 0x00,
 617    /* dq: empty element */
 618    0x02, 0x00,
 619    /* u: empty element */
 620    0x02, 0x00,
 621};
 622
 623static const uint8_t rsa_public_key_invalid_length_val[] = {
 624    /* RSAPublicKey, INVALID length: 313 */
 625    0x30, 0x82, 0x01, 0x39,
 626    /* n, offset: 7, length: 65 */
 627    0x02, 0x41,
 628    0x00, 0xb9, 0xe1, 0x22, 0xdb, 0x56, 0x2f, 0xb6,
 629    0xf7, 0xf0, 0x0a, 0x87, 0x43, 0x07, 0x12, 0xdb,
 630    0x6d, 0xb6, 0x2b, 0x41, 0x8d, 0x2c, 0x3c, 0xa5,
 631    0xdd, 0x78, 0x9a, 0x8f, 0xab, 0x8e, 0xf2, 0x4a,
 632    0xc8, 0x34, 0x0c, 0x12, 0x4f, 0x11, 0x90, 0xc6,
 633    0xc2, 0xa5, 0xd0, 0xcd, 0xfb, 0xfc, 0x2c, 0x95,
 634    0x56, 0x82, 0xdf, 0x39, 0xf3, 0x3b, 0x1d, 0x62,
 635    0x26, 0x97, 0xb7, 0x93, 0x25, 0xc7, 0xec, 0x7e,
 636    0xf7,
 637    /* e, */
 638    0x02, 0x03, 0x01, 0x00, 0x01,  /* INTEGER, offset: 74, length: 3 */
 639};
 640
 641static const uint8_t rsa_public_key_extra_elem[] = {
 642    /* RSAPublicKey, length: 80 */
 643    0x30, 0x81, 0x50,
 644    /* n, offset: 7, length: 65 */
 645    0x02, 0x41,
 646    0x00, 0xb9, 0xe1, 0x22, 0xdb, 0x56, 0x2f, 0xb6,
 647    0xf7, 0xf0, 0x0a, 0x87, 0x43, 0x07, 0x12, 0xdb,
 648    0x6d, 0xb6, 0x2b, 0x41, 0x8d, 0x2c, 0x3c, 0xa5,
 649    0xdd, 0x78, 0x9a, 0x8f, 0xab, 0x8e, 0xf2, 0x4a,
 650    0xc8, 0x34, 0x0c, 0x12, 0x4f, 0x11, 0x90, 0xc6,
 651    0xc2, 0xa5, 0xd0, 0xcd, 0xfb, 0xfc, 0x2c, 0x95,
 652    0x56, 0x82, 0xdf, 0x39, 0xf3, 0x3b, 0x1d, 0x62,
 653    0x26, 0x97, 0xb7, 0x93, 0x25, 0xc7, 0xec, 0x7e,
 654    0xf7,
 655    /* e, offset: 74, length: 3 */
 656    0x02, 0x03, 0x01, 0x00, 0x01,
 657    /* Additional integer field, length 3 */
 658    0x02, 0x06, 0xe1, 0x22, 0xdb, 0xe1, 0x22, 0xdb,
 659};
 660
 661typedef struct QCryptoRSAKeyTestData QCryptoRSAKeyTestData;
 662struct QCryptoRSAKeyTestData {
 663    const char *path;
 664    QCryptoAkCipherKeyType key_type;
 665    QCryptoAkCipherOptions opt;
 666    const uint8_t *key;
 667    size_t keylen;
 668    bool is_valid_key;
 669    size_t exp_key_len;
 670};
 671
 672typedef struct QCryptoAkCipherTestData QCryptoAkCipherTestData;
 673struct QCryptoAkCipherTestData {
 674    const char *path;
 675    QCryptoAkCipherOptions opt;
 676
 677    const uint8_t *priv_key;
 678    size_t priv_key_len;
 679    const uint8_t *pub_key;
 680    size_t pub_key_len;
 681
 682    const uint8_t *plaintext;
 683    size_t plen;
 684    const uint8_t *ciphertext;
 685    size_t clen;
 686    const uint8_t *dgst;
 687    size_t dlen;
 688    const uint8_t *signature;
 689    size_t slen;
 690};
 691
 692static QCryptoRSAKeyTestData rsakey_test_data[] = {
 693    {
 694        .path = "/crypto/akcipher/rsakey-1024-public",
 695        .key_type = QCRYPTO_AKCIPHER_KEY_TYPE_PUBLIC,
 696        .key = rsa1024_public_key,
 697        .keylen = sizeof(rsa1024_public_key),
 698        .is_valid_key = true,
 699        .exp_key_len = 128,
 700    },
 701    {
 702        .path = "/crypto/akcipher/rsakey-1024-private",
 703        .key_type = QCRYPTO_AKCIPHER_KEY_TYPE_PRIVATE,
 704        .key = rsa1024_private_key,
 705        .keylen = sizeof(rsa1024_private_key),
 706        .is_valid_key = true,
 707        .exp_key_len = 128,
 708    },
 709    {
 710        .path = "/crypto/akcipher/rsakey-2048-public",
 711        .key_type = QCRYPTO_AKCIPHER_KEY_TYPE_PUBLIC,
 712        .key = rsa2048_public_key,
 713        .keylen = sizeof(rsa2048_public_key),
 714        .is_valid_key = true,
 715        .exp_key_len = 256,
 716    },
 717    {
 718        .path = "/crypto/akcipher/rsakey-2048-private",
 719        .key_type = QCRYPTO_AKCIPHER_KEY_TYPE_PRIVATE,
 720        .key = rsa2048_private_key,
 721        .keylen = sizeof(rsa2048_private_key),
 722        .is_valid_key = true,
 723        .exp_key_len = 256,
 724    },
 725    {
 726        .path = "/crypto/akcipher/rsakey-public-lack-elem",
 727        .key_type = QCRYPTO_AKCIPHER_KEY_TYPE_PUBLIC,
 728        .key = rsa_public_key_lack_element,
 729        .keylen = sizeof(rsa_public_key_lack_element),
 730        .is_valid_key = false,
 731    },
 732    {
 733        .path = "/crypto/akcipher/rsakey-private-lack-elem",
 734        .key_type = QCRYPTO_AKCIPHER_KEY_TYPE_PRIVATE,
 735        .key = rsa_private_key_lack_element,
 736        .keylen = sizeof(rsa_private_key_lack_element),
 737        .is_valid_key = false,
 738    },
 739    {
 740        .path = "/crypto/akcipher/rsakey-public-empty-elem",
 741        .key_type = QCRYPTO_AKCIPHER_KEY_TYPE_PUBLIC,
 742        .key = rsa_public_key_empty_element,
 743        .keylen = sizeof(rsa_public_key_empty_element),
 744        .is_valid_key = false,
 745    },
 746    {
 747        .path = "/crypto/akcipher/rsakey-private-empty-elem",
 748        .key_type = QCRYPTO_AKCIPHER_KEY_TYPE_PRIVATE,
 749        .key = rsa_private_key_empty_element,
 750        .keylen = sizeof(rsa_private_key_empty_element),
 751        .is_valid_key = false,
 752    },
 753    {
 754        .path = "/crypto/akcipher/rsakey-public-empty-key",
 755        .key_type = QCRYPTO_AKCIPHER_KEY_TYPE_PUBLIC,
 756        .key = NULL,
 757        .keylen = 0,
 758        .is_valid_key = false,
 759    },
 760    {
 761        .path = "/crypto/akcipher/rsakey-private-empty-key",
 762        .key_type = QCRYPTO_AKCIPHER_KEY_TYPE_PRIVATE,
 763        .key = NULL,
 764        .keylen = 0,
 765        .is_valid_key = false,
 766    },
 767    {
 768        .path = "/crypto/akcipher/rsakey-public-invalid-length-val",
 769        .key_type = QCRYPTO_AKCIPHER_KEY_TYPE_PUBLIC,
 770        .key = rsa_public_key_invalid_length_val,
 771        .keylen = sizeof(rsa_public_key_invalid_length_val),
 772        .is_valid_key = false,
 773    },
 774    {
 775        .path = "/crypto/akcipher/rsakey-public-extra-elem",
 776        .key_type = QCRYPTO_AKCIPHER_KEY_TYPE_PUBLIC,
 777        .key = rsa_public_key_extra_elem,
 778        .keylen = sizeof(rsa_public_key_extra_elem),
 779        .is_valid_key = false,
 780    },
 781};
 782
 783static QCryptoAkCipherTestData akcipher_test_data[] = {
 784    /* rsa1024 with raw padding */
 785    {
 786        .path = "/crypto/akcipher/rsa1024-raw",
 787        .opt = {
 788            .alg = QCRYPTO_AKCIPHER_ALG_RSA,
 789            .u.rsa = {
 790                .padding_alg = QCRYPTO_RSA_PADDING_ALG_RAW,
 791            },
 792        },
 793        .pub_key = rsa1024_public_key,
 794        .pub_key_len = sizeof(rsa1024_public_key),
 795        .priv_key = rsa1024_private_key,
 796        .priv_key_len = sizeof(rsa1024_private_key),
 797
 798        .plaintext = test_plaintext,
 799        .plen = 128,
 800        .ciphertext = exp_ciphertext_rsa1024_raw,
 801        .clen = sizeof(exp_ciphertext_rsa1024_raw),
 802    },
 803
 804    /* rsa1024 with pkcs1 padding */
 805    {
 806        .path = "/crypto/akcipher/rsa1024-pkcs1",
 807        .opt = {
 808            .alg = QCRYPTO_AKCIPHER_ALG_RSA,
 809            .u.rsa = {
 810                .padding_alg = QCRYPTO_RSA_PADDING_ALG_PKCS1,
 811                .hash_alg = QCRYPTO_HASH_ALG_SHA1,
 812            },
 813        },
 814        .pub_key = rsa1024_public_key,
 815        .pub_key_len = sizeof(rsa1024_public_key),
 816        .priv_key = rsa1024_private_key,
 817        .priv_key_len = sizeof(rsa1024_private_key),
 818
 819        .plaintext = test_plaintext,
 820        .plen = 64,
 821        .ciphertext = exp_ciphertext_rsa1024_pkcs1,
 822        .clen = sizeof(exp_ciphertext_rsa1024_pkcs1),
 823        .dgst = test_sha1_dgst,
 824        .dlen = sizeof(test_sha1_dgst),
 825        .signature = exp_signature_rsa1024_pkcs1,
 826        .slen = sizeof(exp_signature_rsa1024_pkcs1),
 827    },
 828
 829    /* rsa2048 with raw padding */
 830    {
 831        .path = "/crypto/akcipher/rsa2048-raw",
 832        .opt = {
 833            .alg = QCRYPTO_AKCIPHER_ALG_RSA,
 834            .u.rsa = {
 835                .padding_alg = QCRYPTO_RSA_PADDING_ALG_RAW,
 836            },
 837        },
 838        .pub_key = rsa2048_public_key,
 839        .pub_key_len = sizeof(rsa2048_public_key),
 840        .priv_key = rsa2048_private_key,
 841        .priv_key_len = sizeof(rsa2048_private_key),
 842
 843        .plaintext = test_plaintext,
 844        .plen = 256,
 845        .ciphertext = exp_ciphertext_rsa2048_raw,
 846        .clen = sizeof(exp_ciphertext_rsa2048_raw),
 847    },
 848
 849    /* rsa2048 with pkcs1 padding */
 850    {
 851        .path = "/crypto/akcipher/rsa2048-pkcs1",
 852        .opt = {
 853            .alg = QCRYPTO_AKCIPHER_ALG_RSA,
 854            .u.rsa = {
 855                .padding_alg = QCRYPTO_RSA_PADDING_ALG_PKCS1,
 856                .hash_alg = QCRYPTO_HASH_ALG_SHA1,
 857            },
 858        },
 859        .pub_key = rsa2048_public_key,
 860        .pub_key_len = sizeof(rsa2048_public_key),
 861        .priv_key = rsa2048_private_key,
 862        .priv_key_len = sizeof(rsa2048_private_key),
 863
 864        .plaintext = test_plaintext,
 865        .plen = 128,
 866        .ciphertext = exp_ciphertext_rsa2048_pkcs1,
 867        .clen = sizeof(exp_ciphertext_rsa2048_pkcs1),
 868        .dgst = test_sha1_dgst,
 869        .dlen = sizeof(test_sha1_dgst),
 870        .signature = exp_signature_rsa2048_pkcs1,
 871        .slen = sizeof(exp_signature_rsa2048_pkcs1),
 872    },
 873
 874};
 875
 876static void test_akcipher(const void *opaque)
 877{
 878    const QCryptoAkCipherTestData *data = opaque;
 879    g_autofree uint8_t *plaintext = NULL;
 880    g_autofree uint8_t *ciphertext = NULL;
 881    g_autofree uint8_t *signature = NULL;
 882    QCryptoAkCipher *pub_key, *priv_key;
 883
 884    if (!qcrypto_akcipher_supports((QCryptoAkCipherOptions *)&data->opt)) {
 885        return;
 886    }
 887    pub_key = qcrypto_akcipher_new(&data->opt,
 888                                   QCRYPTO_AKCIPHER_KEY_TYPE_PUBLIC,
 889                                   data->pub_key, data->pub_key_len,
 890                                   &error_abort);
 891    g_assert(pub_key != NULL);
 892    priv_key = qcrypto_akcipher_new(&data->opt,
 893                                    QCRYPTO_AKCIPHER_KEY_TYPE_PRIVATE,
 894                                    data->priv_key, data->priv_key_len,
 895                                    &error_abort);
 896    g_assert(priv_key != NULL);
 897
 898    if (data->plaintext != NULL) {
 899
 900        ciphertext = g_new0(uint8_t, data->clen);
 901        g_assert(qcrypto_akcipher_encrypt(pub_key, data->plaintext, data->plen,
 902                                          ciphertext, data->clen,
 903                                          &error_abort) > 0);
 904
 905        /**
 906         * In the asymmetric encryption algorithms, the ciphertext generated
 907         * each time may be different, here only compare the decrypted
 908         * plaintext
 909         */
 910        plaintext = g_new0(uint8_t, data->clen);
 911        g_assert(qcrypto_akcipher_decrypt(priv_key, ciphertext,
 912                                          data->clen, plaintext,
 913                                          data->plen,
 914                                          &error_abort) == data->plen);
 915        g_assert(!memcmp(plaintext, data->plaintext, data->plen));
 916    }
 917
 918    if (data->signature != NULL) {
 919        signature = g_new(uint8_t, data->slen);
 920        g_assert(qcrypto_akcipher_sign(priv_key, data->dgst, data->dlen,
 921                                       signature, data->slen,
 922                                       &error_abort) > 0);
 923        /**
 924         * The signature generated each time may be different, here only check
 925         * the verification.
 926         */
 927        g_assert(qcrypto_akcipher_verify(pub_key, data->signature, data->slen,
 928                                         data->dgst, data->dlen,
 929                                         &error_abort) == 0);
 930        g_assert(qcrypto_akcipher_verify(pub_key, signature, data->slen,
 931                                         data->dgst, data->dlen,
 932                                         &error_abort) == 0);
 933        ++signature[0];
 934        /* Here error should be ignored */
 935        g_assert(qcrypto_akcipher_verify(pub_key, signature, data->slen,
 936                                         data->dgst, data->dlen, NULL) != 0);
 937    }
 938
 939    qcrypto_akcipher_free(pub_key);
 940    qcrypto_akcipher_free(priv_key);
 941}
 942
 943static void test_rsakey(const void *opaque)
 944{
 945    const QCryptoRSAKeyTestData *data = (const QCryptoRSAKeyTestData *)opaque;
 946    QCryptoAkCipherOptions opt = {
 947        .alg = QCRYPTO_AKCIPHER_ALG_RSA,
 948        .u.rsa = {
 949            .padding_alg = QCRYPTO_RSA_PADDING_ALG_PKCS1,
 950            .hash_alg = QCRYPTO_HASH_ALG_SHA1,
 951        }
 952    };
 953    g_autoptr(QCryptoAkCipher) key = qcrypto_akcipher_new(
 954        &opt, data->key_type, data->key, data->keylen, NULL);
 955
 956    if (!qcrypto_akcipher_supports(&opt)) {
 957        return;
 958    }
 959
 960    if (!data->is_valid_key) {
 961        g_assert(key == NULL);
 962        return;
 963    }
 964
 965    g_assert(key != NULL);
 966    g_assert(qcrypto_akcipher_max_ciphertext_len(key) == data->exp_key_len);
 967    g_assert(qcrypto_akcipher_max_plaintext_len(key) == data->exp_key_len);
 968    g_assert(qcrypto_akcipher_max_signature_len(key) == data->exp_key_len);
 969    g_assert(qcrypto_akcipher_max_dgst_len(key) == data->exp_key_len);
 970}
 971
 972int main(int argc, char **argv)
 973{
 974    size_t i;
 975    g_test_init(&argc, &argv, NULL);
 976    g_assert(qcrypto_init(NULL) == 0);
 977
 978    for (i = 0; i < G_N_ELEMENTS(akcipher_test_data); i++) {
 979        g_test_add_data_func(akcipher_test_data[i].path,
 980                             &akcipher_test_data[i],
 981                             test_akcipher);
 982    }
 983    for (i = 0; i < G_N_ELEMENTS(rsakey_test_data); i++) {
 984        g_test_add_data_func(rsakey_test_data[i].path,
 985                             &rsakey_test_data[i],
 986                             test_rsakey);
 987    }
 988
 989    return g_test_run();
 990}
 991