ciphercommon.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736
  1. /*
  2. * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License 2.0 (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. /*
  10. * Generic dispatch table functions for ciphers.
  11. */
  12. /* For SSL3_VERSION */
  13. #include <openssl/prov_ssl.h>
  14. #include <openssl/proverr.h>
  15. #include "ciphercommon_local.h"
  16. #include "prov/provider_ctx.h"
  17. #include "prov/providercommon.h"
  18. #include "internal/skey.h"
  19. #include "crypto/types.h"
  20. /*-
  21. * Generic cipher functions for OSSL_PARAM gettables and settables
  22. */
  23. static const OSSL_PARAM cipher_known_gettable_params[] = {
  24. OSSL_PARAM_uint(OSSL_CIPHER_PARAM_MODE, NULL),
  25. OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL),
  26. OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN, NULL),
  27. OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_BLOCK_SIZE, NULL),
  28. OSSL_PARAM_int(OSSL_CIPHER_PARAM_AEAD, NULL),
  29. OSSL_PARAM_int(OSSL_CIPHER_PARAM_CUSTOM_IV, NULL),
  30. OSSL_PARAM_int(OSSL_CIPHER_PARAM_CTS, NULL),
  31. OSSL_PARAM_int(OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK, NULL),
  32. OSSL_PARAM_int(OSSL_CIPHER_PARAM_HAS_RAND_KEY, NULL),
  33. OSSL_PARAM_END
  34. };
  35. const OSSL_PARAM *ossl_cipher_generic_gettable_params(ossl_unused void *provctx)
  36. {
  37. return cipher_known_gettable_params;
  38. }
  39. int ossl_cipher_generic_get_params(OSSL_PARAM params[], unsigned int md,
  40. uint64_t flags,
  41. size_t kbits, size_t blkbits, size_t ivbits)
  42. {
  43. OSSL_PARAM *p;
  44. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_MODE);
  45. if (p != NULL && !OSSL_PARAM_set_uint(p, md)) {
  46. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  47. return 0;
  48. }
  49. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_AEAD);
  50. if (p != NULL
  51. && !OSSL_PARAM_set_int(p, (flags & PROV_CIPHER_FLAG_AEAD) != 0)) {
  52. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  53. return 0;
  54. }
  55. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_CUSTOM_IV);
  56. if (p != NULL
  57. && !OSSL_PARAM_set_int(p, (flags & PROV_CIPHER_FLAG_CUSTOM_IV) != 0)) {
  58. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  59. return 0;
  60. }
  61. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_CTS);
  62. if (p != NULL
  63. && !OSSL_PARAM_set_int(p, (flags & PROV_CIPHER_FLAG_CTS) != 0)) {
  64. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  65. return 0;
  66. }
  67. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK);
  68. if (p != NULL
  69. && !OSSL_PARAM_set_int(p, (flags & PROV_CIPHER_FLAG_TLS1_MULTIBLOCK) != 0)) {
  70. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  71. return 0;
  72. }
  73. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_HAS_RAND_KEY);
  74. if (p != NULL
  75. && !OSSL_PARAM_set_int(p, (flags & PROV_CIPHER_FLAG_RAND_KEY) != 0)) {
  76. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  77. return 0;
  78. }
  79. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_KEYLEN);
  80. if (p != NULL && !OSSL_PARAM_set_size_t(p, kbits / 8)) {
  81. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  82. return 0;
  83. }
  84. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_BLOCK_SIZE);
  85. if (p != NULL && !OSSL_PARAM_set_size_t(p, blkbits / 8)) {
  86. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  87. return 0;
  88. }
  89. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IVLEN);
  90. if (p != NULL && !OSSL_PARAM_set_size_t(p, ivbits / 8)) {
  91. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  92. return 0;
  93. }
  94. return 1;
  95. }
  96. CIPHER_DEFAULT_GETTABLE_CTX_PARAMS_START(ossl_cipher_generic)
  97. { OSSL_CIPHER_PARAM_TLS_MAC, OSSL_PARAM_OCTET_PTR, NULL, 0, OSSL_PARAM_UNMODIFIED },
  98. CIPHER_DEFAULT_GETTABLE_CTX_PARAMS_END(ossl_cipher_generic)
  99. CIPHER_DEFAULT_SETTABLE_CTX_PARAMS_START(ossl_cipher_generic)
  100. OSSL_PARAM_uint(OSSL_CIPHER_PARAM_USE_BITS, NULL),
  101. OSSL_PARAM_uint(OSSL_CIPHER_PARAM_TLS_VERSION, NULL),
  102. OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_TLS_MAC_SIZE, NULL),
  103. CIPHER_DEFAULT_SETTABLE_CTX_PARAMS_END(ossl_cipher_generic)
  104. /*
  105. * Variable key length cipher functions for OSSL_PARAM settables
  106. */
  107. int ossl_cipher_var_keylen_set_ctx_params(void *vctx, const OSSL_PARAM params[])
  108. {
  109. PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
  110. const OSSL_PARAM *p;
  111. if (ossl_param_is_empty(params))
  112. return 1;
  113. if (!ossl_cipher_generic_set_ctx_params(vctx, params))
  114. return 0;
  115. p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_KEYLEN);
  116. if (p != NULL) {
  117. size_t keylen;
  118. if (!OSSL_PARAM_get_size_t(p, &keylen)) {
  119. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
  120. return 0;
  121. }
  122. if (ctx->keylen != keylen) {
  123. ctx->keylen = keylen;
  124. ctx->key_set = 0;
  125. }
  126. }
  127. return 1;
  128. }
  129. CIPHER_DEFAULT_SETTABLE_CTX_PARAMS_START(ossl_cipher_var_keylen)
  130. OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL),
  131. CIPHER_DEFAULT_SETTABLE_CTX_PARAMS_END(ossl_cipher_var_keylen)
  132. /*-
  133. * AEAD cipher functions for OSSL_PARAM gettables and settables
  134. */
  135. static const OSSL_PARAM cipher_aead_known_gettable_ctx_params[] = {
  136. OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL),
  137. OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN, NULL),
  138. OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_AEAD_TAGLEN, NULL),
  139. OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_IV, NULL, 0),
  140. OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_UPDATED_IV, NULL, 0),
  141. OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG, NULL, 0),
  142. OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD, NULL),
  143. OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN, NULL, 0),
  144. OSSL_PARAM_uint(OSSL_CIPHER_PARAM_AEAD_IV_GENERATED, NULL),
  145. OSSL_PARAM_END
  146. };
  147. const OSSL_PARAM *ossl_cipher_aead_gettable_ctx_params(
  148. ossl_unused void *cctx, ossl_unused void *provctx
  149. )
  150. {
  151. return cipher_aead_known_gettable_ctx_params;
  152. }
  153. static const OSSL_PARAM cipher_aead_known_settable_ctx_params[] = {
  154. OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_AEAD_IVLEN, NULL),
  155. OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG, NULL, 0),
  156. OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD, NULL, 0),
  157. OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED, NULL, 0),
  158. OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV, NULL, 0),
  159. OSSL_PARAM_END
  160. };
  161. const OSSL_PARAM *ossl_cipher_aead_settable_ctx_params(
  162. ossl_unused void *cctx, ossl_unused void *provctx
  163. )
  164. {
  165. return cipher_aead_known_settable_ctx_params;
  166. }
  167. void ossl_cipher_generic_reset_ctx(PROV_CIPHER_CTX *ctx)
  168. {
  169. if (ctx != NULL && ctx->alloced) {
  170. OPENSSL_free(ctx->tlsmac);
  171. ctx->alloced = 0;
  172. ctx->tlsmac = NULL;
  173. }
  174. }
  175. static int cipher_generic_init_internal(PROV_CIPHER_CTX *ctx,
  176. const unsigned char *key, size_t keylen,
  177. const unsigned char *iv, size_t ivlen,
  178. const OSSL_PARAM params[], int enc)
  179. {
  180. ctx->num = 0;
  181. ctx->bufsz = 0;
  182. ctx->updated = 0;
  183. ctx->enc = enc ? 1 : 0;
  184. if (!ossl_prov_is_running())
  185. return 0;
  186. if (iv != NULL && ctx->mode != EVP_CIPH_ECB_MODE) {
  187. if (!ossl_cipher_generic_initiv(ctx, iv, ivlen))
  188. return 0;
  189. }
  190. if (iv == NULL && ctx->iv_set
  191. && (ctx->mode == EVP_CIPH_CBC_MODE
  192. || ctx->mode == EVP_CIPH_CFB_MODE
  193. || ctx->mode == EVP_CIPH_OFB_MODE))
  194. /* reset IV for these modes to keep compatibility with 1.1.1 */
  195. memcpy(ctx->iv, ctx->oiv, ctx->ivlen);
  196. if (key != NULL) {
  197. if (ctx->variable_keylength == 0) {
  198. if (keylen != ctx->keylen) {
  199. ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
  200. return 0;
  201. }
  202. } else {
  203. ctx->keylen = keylen;
  204. }
  205. if (!ctx->hw->init(ctx, key, ctx->keylen))
  206. return 0;
  207. ctx->key_set = 1;
  208. }
  209. return ossl_cipher_generic_set_ctx_params(ctx, params);
  210. }
  211. int ossl_cipher_generic_einit(void *vctx, const unsigned char *key,
  212. size_t keylen, const unsigned char *iv,
  213. size_t ivlen, const OSSL_PARAM params[])
  214. {
  215. return cipher_generic_init_internal((PROV_CIPHER_CTX *)vctx, key, keylen,
  216. iv, ivlen, params, 1);
  217. }
  218. int ossl_cipher_generic_dinit(void *vctx, const unsigned char *key,
  219. size_t keylen, const unsigned char *iv,
  220. size_t ivlen, const OSSL_PARAM params[])
  221. {
  222. return cipher_generic_init_internal((PROV_CIPHER_CTX *)vctx, key, keylen,
  223. iv, ivlen, params, 0);
  224. }
  225. int ossl_cipher_generic_skey_einit(void *vctx, void *skeydata,
  226. const unsigned char *iv, size_t ivlen,
  227. const OSSL_PARAM params[])
  228. {
  229. PROV_SKEY *key = skeydata;
  230. return cipher_generic_init_internal((PROV_CIPHER_CTX *)vctx,
  231. key->data, key->length,
  232. iv, ivlen, params, 1);
  233. }
  234. int ossl_cipher_generic_skey_dinit(void *vctx, void *skeydata,
  235. const unsigned char *iv, size_t ivlen,
  236. const OSSL_PARAM params[])
  237. {
  238. PROV_SKEY *key = skeydata;
  239. return cipher_generic_init_internal((PROV_CIPHER_CTX *)vctx,
  240. key->data, key->length,
  241. iv, ivlen, params, 0);
  242. }
  243. /* Max padding including padding length byte */
  244. #define MAX_PADDING 256
  245. int ossl_cipher_generic_block_update(void *vctx, unsigned char *out,
  246. size_t *outl, size_t outsize,
  247. const unsigned char *in, size_t inl)
  248. {
  249. size_t outlint = 0;
  250. PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
  251. size_t blksz = ctx->blocksize;
  252. size_t nextblocks;
  253. if (!ctx->key_set) {
  254. ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
  255. return 0;
  256. }
  257. if (ctx->tlsversion > 0) {
  258. /*
  259. * Each update call corresponds to a TLS record and is individually
  260. * padded
  261. */
  262. /* Sanity check inputs */
  263. if (in == NULL
  264. || in != out
  265. || outsize < inl
  266. || !ctx->pad) {
  267. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  268. return 0;
  269. }
  270. if (ctx->enc) {
  271. unsigned char padval;
  272. size_t padnum, loop;
  273. /* Add padding */
  274. padnum = blksz - (inl % blksz);
  275. if (outsize < inl + padnum) {
  276. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  277. return 0;
  278. }
  279. if (padnum > MAX_PADDING) {
  280. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  281. return 0;
  282. }
  283. padval = (unsigned char)(padnum - 1);
  284. if (ctx->tlsversion == SSL3_VERSION) {
  285. if (padnum > 1)
  286. memset(out + inl, 0, padnum - 1);
  287. *(out + inl + padnum - 1) = padval;
  288. } else {
  289. /* we need to add 'padnum' padding bytes of value padval */
  290. for (loop = inl; loop < inl + padnum; loop++)
  291. out[loop] = padval;
  292. }
  293. inl += padnum;
  294. }
  295. if ((inl % blksz) != 0) {
  296. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  297. return 0;
  298. }
  299. /* Shouldn't normally fail */
  300. if (!ctx->hw->cipher(ctx, out, in, inl)) {
  301. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  302. return 0;
  303. }
  304. if (ctx->alloced) {
  305. OPENSSL_free(ctx->tlsmac);
  306. ctx->alloced = 0;
  307. ctx->tlsmac = NULL;
  308. }
  309. /* This only fails if padding is publicly invalid */
  310. *outl = inl;
  311. if (!ctx->enc
  312. && !ossl_cipher_tlsunpadblock(ctx->libctx, ctx->tlsversion,
  313. out, outl,
  314. blksz, &ctx->tlsmac, &ctx->alloced,
  315. ctx->tlsmacsize, 0)) {
  316. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  317. return 0;
  318. }
  319. return 1;
  320. }
  321. if (ctx->bufsz != 0)
  322. nextblocks = ossl_cipher_fillblock(ctx->buf, &ctx->bufsz, blksz,
  323. &in, &inl);
  324. else
  325. nextblocks = inl & ~(blksz-1);
  326. /*
  327. * If we're decrypting and we end an update on a block boundary we hold
  328. * the last block back in case this is the last update call and the last
  329. * block is padded.
  330. */
  331. if (ctx->bufsz == blksz && (ctx->enc || inl > 0 || !ctx->pad)) {
  332. if (outsize < blksz) {
  333. ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
  334. return 0;
  335. }
  336. if (!ctx->hw->cipher(ctx, out, ctx->buf, blksz)) {
  337. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  338. return 0;
  339. }
  340. ctx->bufsz = 0;
  341. outlint = blksz;
  342. out += blksz;
  343. }
  344. if (nextblocks > 0) {
  345. if (!ctx->enc && ctx->pad && nextblocks == inl) {
  346. if (!ossl_assert(inl >= blksz)) {
  347. ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
  348. return 0;
  349. }
  350. nextblocks -= blksz;
  351. }
  352. outlint += nextblocks;
  353. if (outsize < outlint) {
  354. ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
  355. return 0;
  356. }
  357. }
  358. if (nextblocks > 0) {
  359. if (!ctx->hw->cipher(ctx, out, in, nextblocks)) {
  360. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  361. return 0;
  362. }
  363. in += nextblocks;
  364. inl -= nextblocks;
  365. }
  366. if (inl != 0
  367. && !ossl_cipher_trailingdata(ctx->buf, &ctx->bufsz, blksz, &in, &inl)) {
  368. /* ERR_raise already called */
  369. return 0;
  370. }
  371. *outl = outlint;
  372. return inl == 0;
  373. }
  374. int ossl_cipher_generic_block_final(void *vctx, unsigned char *out,
  375. size_t *outl, size_t outsize)
  376. {
  377. PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
  378. size_t blksz = ctx->blocksize;
  379. if (!ossl_prov_is_running())
  380. return 0;
  381. if (!ctx->key_set) {
  382. ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
  383. return 0;
  384. }
  385. if (ctx->tlsversion > 0) {
  386. /* We never finalize TLS, so this is an error */
  387. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  388. return 0;
  389. }
  390. if (ctx->enc) {
  391. if (ctx->pad) {
  392. ossl_cipher_padblock(ctx->buf, &ctx->bufsz, blksz);
  393. } else if (ctx->bufsz == 0) {
  394. *outl = 0;
  395. return 1;
  396. } else if (ctx->bufsz != blksz) {
  397. ERR_raise(ERR_LIB_PROV, PROV_R_WRONG_FINAL_BLOCK_LENGTH);
  398. return 0;
  399. }
  400. if (outsize < blksz) {
  401. ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
  402. return 0;
  403. }
  404. if (!ctx->hw->cipher(ctx, out, ctx->buf, blksz)) {
  405. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  406. return 0;
  407. }
  408. ctx->bufsz = 0;
  409. *outl = blksz;
  410. return 1;
  411. }
  412. /* Decrypting */
  413. if (ctx->bufsz != blksz) {
  414. if (ctx->bufsz == 0 && !ctx->pad) {
  415. *outl = 0;
  416. return 1;
  417. }
  418. ERR_raise(ERR_LIB_PROV, PROV_R_WRONG_FINAL_BLOCK_LENGTH);
  419. return 0;
  420. }
  421. if (!ctx->hw->cipher(ctx, ctx->buf, ctx->buf, blksz)) {
  422. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  423. return 0;
  424. }
  425. if (ctx->pad && !ossl_cipher_unpadblock(ctx->buf, &ctx->bufsz, blksz)) {
  426. /* ERR_raise already called */
  427. return 0;
  428. }
  429. if (outsize < ctx->bufsz) {
  430. ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
  431. return 0;
  432. }
  433. memcpy(out, ctx->buf, ctx->bufsz);
  434. *outl = ctx->bufsz;
  435. ctx->bufsz = 0;
  436. return 1;
  437. }
  438. int ossl_cipher_generic_stream_update(void *vctx, unsigned char *out,
  439. size_t *outl, size_t outsize,
  440. const unsigned char *in, size_t inl)
  441. {
  442. PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
  443. if (!ctx->key_set) {
  444. ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
  445. return 0;
  446. }
  447. if (inl == 0) {
  448. *outl = 0;
  449. return 1;
  450. }
  451. if (outsize < inl) {
  452. ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
  453. return 0;
  454. }
  455. if (!ctx->hw->cipher(ctx, out, in, inl)) {
  456. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  457. return 0;
  458. }
  459. *outl = inl;
  460. if (!ctx->enc && ctx->tlsversion > 0) {
  461. /*
  462. * Remove any TLS padding. Only used by cipher_aes_cbc_hmac_sha1_hw.c and
  463. * cipher_aes_cbc_hmac_sha256_hw.c
  464. */
  465. if (ctx->removetlspad) {
  466. /*
  467. * We should have already failed in the cipher() call above if this
  468. * isn't true.
  469. */
  470. if (!ossl_assert(*outl >= (size_t)(out[inl - 1] + 1)))
  471. return 0;
  472. /* The actual padding length */
  473. *outl -= out[inl - 1] + 1;
  474. }
  475. /* TLS MAC and explicit IV if relevant. We should have already failed
  476. * in the cipher() call above if *outl is too short.
  477. */
  478. if (!ossl_assert(*outl >= ctx->removetlsfixed))
  479. return 0;
  480. *outl -= ctx->removetlsfixed;
  481. /* Extract the MAC if there is one */
  482. if (ctx->tlsmacsize > 0) {
  483. if (*outl < ctx->tlsmacsize)
  484. return 0;
  485. ctx->tlsmac = out + *outl - ctx->tlsmacsize;
  486. *outl -= ctx->tlsmacsize;
  487. }
  488. }
  489. return 1;
  490. }
  491. int ossl_cipher_generic_stream_final(void *vctx, unsigned char *out,
  492. size_t *outl, size_t outsize)
  493. {
  494. PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
  495. if (!ossl_prov_is_running())
  496. return 0;
  497. if (!ctx->key_set) {
  498. ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
  499. return 0;
  500. }
  501. *outl = 0;
  502. return 1;
  503. }
  504. int ossl_cipher_generic_cipher(void *vctx, unsigned char *out, size_t *outl,
  505. size_t outsize, const unsigned char *in,
  506. size_t inl)
  507. {
  508. PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
  509. if (!ossl_prov_is_running())
  510. return 0;
  511. if (!ctx->key_set) {
  512. ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
  513. return 0;
  514. }
  515. if (outsize < inl) {
  516. ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
  517. return 0;
  518. }
  519. if (!ctx->hw->cipher(ctx, out, in, inl)) {
  520. ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
  521. return 0;
  522. }
  523. *outl = inl;
  524. return 1;
  525. }
  526. int ossl_cipher_generic_get_ctx_params(void *vctx, OSSL_PARAM params[])
  527. {
  528. PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
  529. OSSL_PARAM *p;
  530. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IVLEN);
  531. if (p != NULL && !OSSL_PARAM_set_size_t(p, ctx->ivlen)) {
  532. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  533. return 0;
  534. }
  535. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_PADDING);
  536. if (p != NULL && !OSSL_PARAM_set_uint(p, ctx->pad)) {
  537. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  538. return 0;
  539. }
  540. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IV);
  541. if (p != NULL
  542. && !OSSL_PARAM_set_octet_ptr(p, &ctx->oiv, ctx->ivlen)
  543. && !OSSL_PARAM_set_octet_string(p, &ctx->oiv, ctx->ivlen)) {
  544. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  545. return 0;
  546. }
  547. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_UPDATED_IV);
  548. if (p != NULL
  549. && !OSSL_PARAM_set_octet_ptr(p, &ctx->iv, ctx->ivlen)
  550. && !OSSL_PARAM_set_octet_string(p, &ctx->iv, ctx->ivlen)) {
  551. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  552. return 0;
  553. }
  554. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_NUM);
  555. if (p != NULL && !OSSL_PARAM_set_uint(p, ctx->num)) {
  556. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  557. return 0;
  558. }
  559. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_KEYLEN);
  560. if (p != NULL && !OSSL_PARAM_set_size_t(p, ctx->keylen)) {
  561. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  562. return 0;
  563. }
  564. p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_TLS_MAC);
  565. if (p != NULL
  566. && !OSSL_PARAM_set_octet_ptr(p, ctx->tlsmac, ctx->tlsmacsize)) {
  567. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
  568. return 0;
  569. }
  570. return 1;
  571. }
  572. int ossl_cipher_generic_set_ctx_params(void *vctx, const OSSL_PARAM params[])
  573. {
  574. PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
  575. const OSSL_PARAM *p;
  576. if (ossl_param_is_empty(params))
  577. return 1;
  578. p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_PADDING);
  579. if (p != NULL) {
  580. unsigned int pad;
  581. if (!OSSL_PARAM_get_uint(p, &pad)) {
  582. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
  583. return 0;
  584. }
  585. ctx->pad = pad ? 1 : 0;
  586. }
  587. p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_USE_BITS);
  588. if (p != NULL) {
  589. unsigned int bits;
  590. if (!OSSL_PARAM_get_uint(p, &bits)) {
  591. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
  592. return 0;
  593. }
  594. ctx->use_bits = bits ? 1 : 0;
  595. }
  596. p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_TLS_VERSION);
  597. if (p != NULL) {
  598. if (!OSSL_PARAM_get_uint(p, &ctx->tlsversion)) {
  599. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
  600. return 0;
  601. }
  602. }
  603. p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_TLS_MAC_SIZE);
  604. if (p != NULL) {
  605. if (!OSSL_PARAM_get_size_t(p, &ctx->tlsmacsize)) {
  606. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
  607. return 0;
  608. }
  609. }
  610. p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_NUM);
  611. if (p != NULL) {
  612. unsigned int num;
  613. if (!OSSL_PARAM_get_uint(p, &num)) {
  614. ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
  615. return 0;
  616. }
  617. ctx->num = num;
  618. }
  619. return 1;
  620. }
  621. int ossl_cipher_generic_initiv(PROV_CIPHER_CTX *ctx, const unsigned char *iv,
  622. size_t ivlen)
  623. {
  624. if (ivlen != ctx->ivlen
  625. || ivlen > sizeof(ctx->iv)) {
  626. ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
  627. return 0;
  628. }
  629. ctx->iv_set = 1;
  630. memcpy(ctx->iv, iv, ivlen);
  631. memcpy(ctx->oiv, iv, ivlen);
  632. return 1;
  633. }
  634. void ossl_cipher_generic_initkey(void *vctx, size_t kbits, size_t blkbits,
  635. size_t ivbits, unsigned int mode,
  636. uint64_t flags, const PROV_CIPHER_HW *hw,
  637. void *provctx)
  638. {
  639. PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
  640. if ((flags & PROV_CIPHER_FLAG_INVERSE_CIPHER) != 0)
  641. ctx->inverse_cipher = 1;
  642. if ((flags & PROV_CIPHER_FLAG_VARIABLE_LENGTH) != 0)
  643. ctx->variable_keylength = 1;
  644. ctx->pad = 1;
  645. ctx->keylen = ((kbits) / 8);
  646. ctx->ivlen = ((ivbits) / 8);
  647. ctx->hw = hw;
  648. ctx->mode = mode;
  649. ctx->blocksize = blkbits / 8;
  650. if (provctx != NULL)
  651. ctx->libctx = PROV_LIBCTX_OF(provctx); /* used for rand */
  652. }