Changeset View
Changeset View
Standalone View
Standalone View
head/sys/geom/eli/g_eli.c
Show First 20 Lines • Show All 483 Lines • ▼ Show 20 Lines | g_eli_start(struct bio *bp) | ||||
} | } | ||||
} | } | ||||
static int | static int | ||||
g_eli_newsession(struct g_eli_worker *wr) | g_eli_newsession(struct g_eli_worker *wr) | ||||
{ | { | ||||
struct g_eli_softc *sc; | struct g_eli_softc *sc; | ||||
struct crypto_session_params csp; | struct crypto_session_params csp; | ||||
int error; | uint32_t caps; | ||||
int error, new_crypto; | |||||
void *key; | void *key; | ||||
sc = wr->w_softc; | sc = wr->w_softc; | ||||
memset(&csp, 0, sizeof(csp)); | memset(&csp, 0, sizeof(csp)); | ||||
csp.csp_mode = CSP_MODE_CIPHER; | csp.csp_mode = CSP_MODE_CIPHER; | ||||
csp.csp_cipher_alg = sc->sc_ealgo; | csp.csp_cipher_alg = sc->sc_ealgo; | ||||
csp.csp_ivlen = g_eli_ivlen(sc->sc_ealgo); | csp.csp_ivlen = g_eli_ivlen(sc->sc_ealgo); | ||||
Show All 10 Lines | g_eli_newsession(struct g_eli_worker *wr) | ||||
} | } | ||||
if (sc->sc_flags & G_ELI_FLAG_AUTH) { | if (sc->sc_flags & G_ELI_FLAG_AUTH) { | ||||
csp.csp_mode = CSP_MODE_ETA; | csp.csp_mode = CSP_MODE_ETA; | ||||
csp.csp_auth_alg = sc->sc_aalgo; | csp.csp_auth_alg = sc->sc_aalgo; | ||||
csp.csp_auth_klen = G_ELI_AUTH_SECKEYLEN; | csp.csp_auth_klen = G_ELI_AUTH_SECKEYLEN; | ||||
} | } | ||||
switch (sc->sc_crypto) { | switch (sc->sc_crypto) { | ||||
case G_ELI_CRYPTO_SW_ACCEL: | |||||
case G_ELI_CRYPTO_SW: | case G_ELI_CRYPTO_SW: | ||||
error = crypto_newsession(&wr->w_sid, &csp, | error = crypto_newsession(&wr->w_sid, &csp, | ||||
CRYPTOCAP_F_SOFTWARE); | CRYPTOCAP_F_SOFTWARE); | ||||
break; | break; | ||||
case G_ELI_CRYPTO_HW: | case G_ELI_CRYPTO_HW: | ||||
error = crypto_newsession(&wr->w_sid, &csp, | error = crypto_newsession(&wr->w_sid, &csp, | ||||
CRYPTOCAP_F_HARDWARE); | CRYPTOCAP_F_HARDWARE); | ||||
break; | break; | ||||
case G_ELI_CRYPTO_UNKNOWN: | case G_ELI_CRYPTO_UNKNOWN: | ||||
error = crypto_newsession(&wr->w_sid, &csp, | error = crypto_newsession(&wr->w_sid, &csp, | ||||
CRYPTOCAP_F_HARDWARE); | CRYPTOCAP_F_HARDWARE | CRYPTOCAP_F_SOFTWARE); | ||||
if (error == 0) { | if (error == 0) { | ||||
caps = crypto_ses2caps(wr->w_sid); | |||||
if (caps & CRYPTOCAP_F_HARDWARE) | |||||
new_crypto = G_ELI_CRYPTO_HW; | |||||
else if (caps & CRYPTOCAP_F_ACCEL_SOFTWARE) | |||||
new_crypto = G_ELI_CRYPTO_SW_ACCEL; | |||||
else | |||||
new_crypto = G_ELI_CRYPTO_SW; | |||||
mtx_lock(&sc->sc_queue_mtx); | mtx_lock(&sc->sc_queue_mtx); | ||||
if (sc->sc_crypto == G_ELI_CRYPTO_UNKNOWN) | if (sc->sc_crypto == G_ELI_CRYPTO_UNKNOWN) | ||||
sc->sc_crypto = G_ELI_CRYPTO_HW; | sc->sc_crypto = new_crypto; | ||||
mtx_unlock(&sc->sc_queue_mtx); | mtx_unlock(&sc->sc_queue_mtx); | ||||
} else { | |||||
error = crypto_newsession(&wr->w_sid, &csp, | |||||
CRYPTOCAP_F_SOFTWARE); | |||||
mtx_lock(&sc->sc_queue_mtx); | |||||
if (sc->sc_crypto == G_ELI_CRYPTO_UNKNOWN) | |||||
sc->sc_crypto = G_ELI_CRYPTO_SW; | |||||
mtx_unlock(&sc->sc_queue_mtx); | |||||
} | } | ||||
break; | break; | ||||
default: | default: | ||||
panic("%s: invalid condition", __func__); | panic("%s: invalid condition", __func__); | ||||
} | } | ||||
if ((sc->sc_flags & G_ELI_FLAG_FIRST_KEY) != 0) { | if ((sc->sc_flags & G_ELI_FLAG_FIRST_KEY) != 0) { | ||||
if (error) | if (error) | ||||
▲ Show 20 Lines • Show All 428 Lines • ▼ Show 20 Lines | g_eli_create(struct gctl_req *req, struct g_class *mp, struct g_provider *bpp, | ||||
g_error_provider(pp, 0); | g_error_provider(pp, 0); | ||||
G_ELI_DEBUG(0, "Device %s created.", pp->name); | G_ELI_DEBUG(0, "Device %s created.", pp->name); | ||||
G_ELI_DEBUG(0, "Encryption: %s %u", g_eli_algo2str(sc->sc_ealgo), | G_ELI_DEBUG(0, "Encryption: %s %u", g_eli_algo2str(sc->sc_ealgo), | ||||
sc->sc_ekeylen); | sc->sc_ekeylen); | ||||
if (sc->sc_flags & G_ELI_FLAG_AUTH) | if (sc->sc_flags & G_ELI_FLAG_AUTH) | ||||
G_ELI_DEBUG(0, " Integrity: %s", g_eli_algo2str(sc->sc_aalgo)); | G_ELI_DEBUG(0, " Integrity: %s", g_eli_algo2str(sc->sc_aalgo)); | ||||
G_ELI_DEBUG(0, " Crypto: %s", | G_ELI_DEBUG(0, " Crypto: %s", | ||||
sc->sc_crypto == G_ELI_CRYPTO_SW_ACCEL ? "accelerated software" : | |||||
sc->sc_crypto == G_ELI_CRYPTO_SW ? "software" : "hardware"); | sc->sc_crypto == G_ELI_CRYPTO_SW ? "software" : "hardware"); | ||||
return (gp); | return (gp); | ||||
failed: | failed: | ||||
mtx_lock(&sc->sc_queue_mtx); | mtx_lock(&sc->sc_queue_mtx); | ||||
sc->sc_flags |= G_ELI_FLAG_DESTROY; | sc->sc_flags |= G_ELI_FLAG_DESTROY; | ||||
wakeup(sc); | wakeup(sc); | ||||
/* | /* | ||||
* Wait for kernel threads self destruction. | * Wait for kernel threads self destruction. | ||||
▲ Show 20 Lines • Show All 381 Lines • ▼ Show 20 Lines | #undef ADD_FLAG | ||||
sbuf_printf(sb, "%s<Version>%u</Version>\n", indent, sc->sc_version); | sbuf_printf(sb, "%s<Version>%u</Version>\n", indent, sc->sc_version); | ||||
sbuf_printf(sb, "%s<Crypto>", indent); | sbuf_printf(sb, "%s<Crypto>", indent); | ||||
switch (sc->sc_crypto) { | switch (sc->sc_crypto) { | ||||
case G_ELI_CRYPTO_HW: | case G_ELI_CRYPTO_HW: | ||||
sbuf_cat(sb, "hardware"); | sbuf_cat(sb, "hardware"); | ||||
break; | break; | ||||
case G_ELI_CRYPTO_SW: | case G_ELI_CRYPTO_SW: | ||||
sbuf_cat(sb, "software"); | sbuf_cat(sb, "software"); | ||||
break; | |||||
case G_ELI_CRYPTO_SW_ACCEL: | |||||
sbuf_cat(sb, "accelerated software"); | |||||
break; | break; | ||||
default: | default: | ||||
sbuf_cat(sb, "UNKNOWN"); | sbuf_cat(sb, "UNKNOWN"); | ||||
break; | break; | ||||
} | } | ||||
sbuf_cat(sb, "</Crypto>\n"); | sbuf_cat(sb, "</Crypto>\n"); | ||||
if (sc->sc_flags & G_ELI_FLAG_AUTH) { | if (sc->sc_flags & G_ELI_FLAG_AUTH) { | ||||
sbuf_printf(sb, | sbuf_printf(sb, | ||||
▲ Show 20 Lines • Show All 61 Lines • Show Last 20 Lines |