| 1258 | } |
| 1259 | |
| 1260 | static void |
| 1261 | crp_sanity(struct cryptop *crp) |
| 1262 | { |
| 1263 | struct crypto_session_params *csp; |
| 1264 | struct crypto_buffer *out; |
| 1265 | size_t ilen, len, olen; |
| 1266 | |
| 1267 | KASSERT(crp->crp_session != NULL, ("incoming crp without a session")); |
| 1268 | KASSERT(crp->crp_obuf.cb_type >= CRYPTO_BUF_NONE && |
| 1269 | crp->crp_obuf.cb_type <= CRYPTO_BUF_LAST, |
| 1270 | ("incoming crp with invalid output buffer type")); |
| 1271 | KASSERT(crp->crp_etype == 0, ("incoming crp with error")); |
| 1272 | KASSERT(!(crp->crp_flags & CRYPTO_F_DONE), |
| 1273 | ("incoming crp already done")); |
| 1274 | |
| 1275 | csp = &crp->crp_session->csp; |
| 1276 | cb_sanity(&crp->crp_buf, "input"); |
| 1277 | ilen = crypto_buffer_len(&crp->crp_buf); |
| 1278 | olen = ilen; |
| 1279 | out = NULL; |
| 1280 | if (csp->csp_flags & CSP_F_SEPARATE_OUTPUT) { |
| 1281 | if (crp->crp_obuf.cb_type != CRYPTO_BUF_NONE) { |
| 1282 | cb_sanity(&crp->crp_obuf, "output"); |
| 1283 | out = &crp->crp_obuf; |
| 1284 | olen = crypto_buffer_len(out); |
| 1285 | } |
| 1286 | } else |
| 1287 | KASSERT(crp->crp_obuf.cb_type == CRYPTO_BUF_NONE, |
| 1288 | ("incoming crp with separate output buffer " |
| 1289 | "but no session support")); |
| 1290 | |
| 1291 | switch (csp->csp_mode) { |
| 1292 | case CSP_MODE_COMPRESS: |
| 1293 | KASSERT(crp->crp_op == CRYPTO_OP_COMPRESS || |
| 1294 | crp->crp_op == CRYPTO_OP_DECOMPRESS, |
| 1295 | ("invalid compression op %x", crp->crp_op)); |
| 1296 | break; |
| 1297 | case CSP_MODE_CIPHER: |
| 1298 | KASSERT(crp->crp_op == CRYPTO_OP_ENCRYPT || |
| 1299 | crp->crp_op == CRYPTO_OP_DECRYPT, |
| 1300 | ("invalid cipher op %x", crp->crp_op)); |
| 1301 | break; |
| 1302 | case CSP_MODE_DIGEST: |
| 1303 | KASSERT(crp->crp_op == CRYPTO_OP_COMPUTE_DIGEST || |
| 1304 | crp->crp_op == CRYPTO_OP_VERIFY_DIGEST, |
| 1305 | ("invalid digest op %x", crp->crp_op)); |
| 1306 | break; |
| 1307 | case CSP_MODE_AEAD: |
| 1308 | KASSERT(crp->crp_op == |
| 1309 | (CRYPTO_OP_ENCRYPT | CRYPTO_OP_COMPUTE_DIGEST) || |
| 1310 | crp->crp_op == |
| 1311 | (CRYPTO_OP_DECRYPT | CRYPTO_OP_VERIFY_DIGEST), |
| 1312 | ("invalid AEAD op %x", crp->crp_op)); |
| 1313 | if (csp->csp_cipher_alg == CRYPTO_AES_NIST_GCM_16) |
| 1314 | KASSERT(crp->crp_flags & CRYPTO_F_IV_SEPARATE, |
| 1315 | ("GCM without a separate IV")); |
| 1316 | if (csp->csp_cipher_alg == CRYPTO_AES_CCM_16) |
| 1317 | KASSERT(crp->crp_flags & CRYPTO_F_IV_SEPARATE, |
no test coverage detected