* Choose a driver for an asymmetric crypto request. */
| 1563 | * Choose a driver for an asymmetric crypto request. |
| 1564 | */ |
| 1565 | static struct cryptocap * |
| 1566 | crypto_lookup_kdriver(struct cryptkop *krp) |
| 1567 | { |
| 1568 | struct cryptocap *cap; |
| 1569 | uint32_t crid; |
| 1570 | |
| 1571 | /* If this request is requeued, it might already have a driver. */ |
| 1572 | cap = krp->krp_cap; |
| 1573 | if (cap != NULL) |
| 1574 | return (cap); |
| 1575 | |
| 1576 | /* Use krp_crid to choose a driver. */ |
| 1577 | crid = krp->krp_crid; |
| 1578 | if ((crid & (CRYPTOCAP_F_HARDWARE | CRYPTOCAP_F_SOFTWARE)) == 0) { |
| 1579 | cap = crypto_checkdriver(crid); |
| 1580 | if (cap != NULL) { |
| 1581 | /* |
| 1582 | * Driver present, it must support the |
| 1583 | * necessary algorithm and, if s/w drivers are |
| 1584 | * excluded, it must be registered as |
| 1585 | * hardware-backed. |
| 1586 | */ |
| 1587 | if (!kdriver_suitable(cap, krp) || |
| 1588 | (!crypto_devallowsoft && |
| 1589 | (cap->cc_flags & CRYPTOCAP_F_HARDWARE) == 0)) |
| 1590 | cap = NULL; |
| 1591 | } |
| 1592 | } else { |
| 1593 | /* |
| 1594 | * No requested driver; select based on crid flags. |
| 1595 | */ |
| 1596 | if (!crypto_devallowsoft) /* NB: disallow s/w drivers */ |
| 1597 | crid &= ~CRYPTOCAP_F_SOFTWARE; |
| 1598 | cap = crypto_select_kdriver(krp, crid); |
| 1599 | } |
| 1600 | |
| 1601 | if (cap != NULL) { |
| 1602 | krp->krp_cap = cap_ref(cap); |
| 1603 | krp->krp_hid = cap->cc_hid; |
| 1604 | } |
| 1605 | return (cap); |
| 1606 | } |
| 1607 | |
| 1608 | /* |
| 1609 | * Dispatch an asymmetric crypto request. |
no test coverage detected