Date: Thu, 23 Sep 2010 11:46:54 +0000 (UTC) From: Pawel Jakub Dawidek <pjd@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r213066 - head/sys/crypto/aesni Message-ID: <201009231146.o8NBksYt067953@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: pjd Date: Thu Sep 23 11:46:53 2010 New Revision: 213066 URL: http://svn.freebsd.org/changeset/base/213066 Log: Add support for CRD_F_KEY_EXPLICIT flag. MFC after: 1 week Modified: head/sys/crypto/aesni/aesni_wrap.c Modified: head/sys/crypto/aesni/aesni_wrap.c ============================================================================== --- head/sys/crypto/aesni/aesni_wrap.c Thu Sep 23 11:33:29 2010 (r213065) +++ head/sys/crypto/aesni/aesni_wrap.c Thu Sep 23 11:46:53 2010 (r213066) @@ -105,13 +105,12 @@ aesni_decrypt_ecb(int rounds, const void } } -int -aesni_cipher_setup(struct aesni_session *ses, struct cryptoini *encini) +static int +aesni_cipher_setup_common(struct aesni_session *ses, const uint8_t *key, + int keylen) { - struct thread *td; - int error; - switch (encini->cri_klen) { + switch (keylen) { case 128: ses->rounds = AES128_ROUNDS; break; @@ -124,18 +123,28 @@ aesni_cipher_setup(struct aesni_session default: return (EINVAL); } + + aesni_set_enckey(key, ses->enc_schedule, ses->rounds); + aesni_set_deckey(ses->enc_schedule, ses->dec_schedule, ses->rounds); + arc4rand(ses->iv, sizeof(ses->iv), 0); - td = curthread; - error = fpu_kern_enter(td, &ses->fpu_ctx, FPU_KERN_NORMAL); - if (error == 0) { - aesni_set_enckey(encini->cri_key, ses->enc_schedule, - ses->rounds); - aesni_set_deckey(ses->enc_schedule, ses->dec_schedule, - ses->rounds); - arc4rand(ses->iv, sizeof(ses->iv), 0); - fpu_kern_leave(td, &ses->fpu_ctx); - } - return (error); + return (0); +} + +int +aesni_cipher_setup(struct aesni_session *ses, struct cryptoini *encini) +{ + struct thread *td; + int error; + + td = curthread; + error = fpu_kern_enter(td, &ses->fpu_ctx, FPU_KERN_NORMAL); + if (error == 0) { + error = aesni_cipher_setup_common(ses, encini->cri_key, + encini->cri_klen); + fpu_kern_leave(td, &ses->fpu_ctx); + } + return (error); } int @@ -154,6 +163,13 @@ aesni_cipher_process(struct aesni_sessio error = fpu_kern_enter(td, &ses->fpu_ctx, FPU_KERN_NORMAL); if (error != 0) goto out; + + if ((enccrd->crd_flags & CRD_F_KEY_EXPLICIT) != 0) { + error = aesni_cipher_setup_common(ses, enccrd->crd_key, + enccrd->crd_klen); + if (error != 0) + goto out; + } if ((enccrd->crd_flags & CRD_F_ENCRYPT) != 0) { if ((enccrd->crd_flags & CRD_F_IV_EXPLICIT) != 0)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201009231146.o8NBksYt067953>