Index: sys/opencrypto/cryptosoft.c =================================================================== --- sys/opencrypto/cryptosoft.c +++ sys/opencrypto/cryptosoft.c @@ -430,6 +430,9 @@ if (err) return err; + if (crd->crd_flags & CRD_F_ESN) + axf->Update(&ctx, crd->crd_esn, 4); + switch (sw->sw_alg) { case CRYPTO_SHA1: case CRYPTO_SHA2_224: @@ -619,6 +622,16 @@ /* Supply MAC with AAD */ aadlen = crda->crd_len; + if (crda->crd_flags & CRD_F_ESN) { + aadlen += 4; + /* SPI */ + crypto_copydata(crp->crp_flags, buf, crda->crd_skip, 4, blk); + iskip = 4; + /* ESN */ + bcopy(crda->crd_esn, blk + 4, 4); + oskip = iskip + 4; + } + for (i = iskip; i < crda->crd_len; i += blksz) { len = MIN(crda->crd_len - i, blksz - oskip); crypto_copydata(crp->crp_flags, buf, crda->crd_skip + i, len, @@ -1070,6 +1083,9 @@ cxf = &comp_algo_deflate; swd->sw_cxf = cxf; break; + case CRYPTO_ESN: + /* Nothing to do here */ + break; default: swcr_freesession(dev, cses); return EINVAL; @@ -1372,6 +1388,7 @@ REGISTER(CRYPTO_AES_CCM_16); REGISTER(CRYPTO_AES_CCM_CBC_MAC); REGISTER(CRYPTO_POLY1305); + REGISTER(CRYPTO_ESN); #undef REGISTER return 0;