GNU Linux-libre 4.14.251-gnu1
[releases.git] / fs / cifs / smb2transport.c
1 /*
2  *   fs/cifs/smb2transport.c
3  *
4  *   Copyright (C) International Business Machines  Corp., 2002, 2011
5  *                 Etersoft, 2012
6  *   Author(s): Steve French (sfrench@us.ibm.com)
7  *              Jeremy Allison (jra@samba.org) 2006
8  *              Pavel Shilovsky (pshilovsky@samba.org) 2012
9  *
10  *   This library is free software; you can redistribute it and/or modify
11  *   it under the terms of the GNU Lesser General Public License as published
12  *   by the Free Software Foundation; either version 2.1 of the License, or
13  *   (at your option) any later version.
14  *
15  *   This library is distributed in the hope that it will be useful,
16  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
18  *   the GNU Lesser General Public License for more details.
19  *
20  *   You should have received a copy of the GNU Lesser General Public License
21  *   along with this library; if not, write to the Free Software
22  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23  */
24
25 #include <linux/fs.h>
26 #include <linux/list.h>
27 #include <linux/wait.h>
28 #include <linux/net.h>
29 #include <linux/delay.h>
30 #include <linux/uaccess.h>
31 #include <asm/processor.h>
32 #include <linux/mempool.h>
33 #include <linux/highmem.h>
34 #include <crypto/aead.h>
35 #include "smb2pdu.h"
36 #include "cifsglob.h"
37 #include "cifsproto.h"
38 #include "smb2proto.h"
39 #include "cifs_debug.h"
40 #include "smb2status.h"
41 #include "smb2glob.h"
42
43 static int
44 smb2_crypto_shash_allocate(struct TCP_Server_Info *server)
45 {
46         return cifs_alloc_hash("hmac(sha256)",
47                                &server->secmech.hmacsha256,
48                                &server->secmech.sdeschmacsha256);
49 }
50
51 static int
52 smb3_crypto_shash_allocate(struct TCP_Server_Info *server)
53 {
54         struct cifs_secmech *p = &server->secmech;
55         int rc;
56
57         rc = cifs_alloc_hash("hmac(sha256)",
58                              &p->hmacsha256,
59                              &p->sdeschmacsha256);
60         if (rc)
61                 goto err;
62
63         rc = cifs_alloc_hash("cmac(aes)", &p->cmacaes, &p->sdesccmacaes);
64         if (rc)
65                 goto err;
66
67         return 0;
68 err:
69         cifs_free_hash(&p->hmacsha256, &p->sdeschmacsha256);
70         return rc;
71 }
72
73 #ifdef CONFIG_CIFS_SMB311
74 int
75 smb311_crypto_shash_allocate(struct TCP_Server_Info *server)
76 {
77         struct cifs_secmech *p = &server->secmech;
78         int rc = 0;
79
80         rc = cifs_alloc_hash("hmac(sha256)",
81                              &p->hmacsha256,
82                              &p->sdeschmacsha256);
83         if (rc)
84                 return rc;
85
86         rc = cifs_alloc_hash("cmac(aes)", &p->cmacaes, &p->sdesccmacaes);
87         if (rc)
88                 goto err;
89
90         rc = cifs_alloc_hash("sha512", &p->sha512, &p->sdescsha512);
91         if (rc)
92                 goto err;
93
94         return 0;
95
96 err:
97         cifs_free_hash(&p->cmacaes, &p->sdesccmacaes);
98         cifs_free_hash(&p->hmacsha256, &p->sdeschmacsha256);
99         return rc;
100 }
101 #endif
102
103 static struct cifs_ses *
104 smb2_find_smb_ses_unlocked(struct TCP_Server_Info *server, __u64 ses_id)
105 {
106         struct cifs_ses *ses;
107
108         list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
109                 if (ses->Suid != ses_id)
110                         continue;
111                 return ses;
112         }
113
114         return NULL;
115 }
116
117 struct cifs_ses *
118 smb2_find_smb_ses(struct TCP_Server_Info *server, __u64 ses_id)
119 {
120         struct cifs_ses *ses;
121
122         spin_lock(&cifs_tcp_ses_lock);
123         ses = smb2_find_smb_ses_unlocked(server, ses_id);
124         spin_unlock(&cifs_tcp_ses_lock);
125
126         return ses;
127 }
128
129 static struct cifs_tcon *
130 smb2_find_smb_sess_tcon_unlocked(struct cifs_ses *ses, __u32  tid)
131 {
132         struct cifs_tcon *tcon;
133
134         list_for_each_entry(tcon, &ses->tcon_list, tcon_list) {
135                 if (tcon->tid != tid)
136                         continue;
137                 ++tcon->tc_count;
138                 return tcon;
139         }
140
141         return NULL;
142 }
143
144 /*
145  * Obtain tcon corresponding to the tid in the given
146  * cifs_ses
147  */
148
149 struct cifs_tcon *
150 smb2_find_smb_tcon(struct TCP_Server_Info *server, __u64 ses_id, __u32  tid)
151 {
152         struct cifs_ses *ses;
153         struct cifs_tcon *tcon;
154
155         spin_lock(&cifs_tcp_ses_lock);
156         ses = smb2_find_smb_ses_unlocked(server, ses_id);
157         if (!ses) {
158                 spin_unlock(&cifs_tcp_ses_lock);
159                 return NULL;
160         }
161         tcon = smb2_find_smb_sess_tcon_unlocked(ses, tid);
162         spin_unlock(&cifs_tcp_ses_lock);
163
164         return tcon;
165 }
166
167 int
168 smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
169 {
170         int rc;
171         unsigned char smb2_signature[SMB2_HMACSHA256_SIZE];
172         unsigned char *sigptr = smb2_signature;
173         struct kvec *iov = rqst->rq_iov;
174         struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)iov[1].iov_base;
175         struct cifs_ses *ses;
176
177         ses = smb2_find_smb_ses(server, shdr->SessionId);
178         if (!ses) {
179                 cifs_dbg(VFS, "%s: Could not find session\n", __func__);
180                 return 0;
181         }
182
183         memset(smb2_signature, 0x0, SMB2_HMACSHA256_SIZE);
184         memset(shdr->Signature, 0x0, SMB2_SIGNATURE_SIZE);
185
186         rc = smb2_crypto_shash_allocate(server);
187         if (rc) {
188                 cifs_dbg(VFS, "%s: shah256 alloc failed\n", __func__);
189                 return rc;
190         }
191
192         rc = crypto_shash_setkey(server->secmech.hmacsha256,
193                 ses->auth_key.response, SMB2_NTLMV2_SESSKEY_SIZE);
194         if (rc) {
195                 cifs_dbg(VFS, "%s: Could not update with response\n", __func__);
196                 return rc;
197         }
198
199         rc = crypto_shash_init(&server->secmech.sdeschmacsha256->shash);
200         if (rc) {
201                 cifs_dbg(VFS, "%s: Could not init sha256", __func__);
202                 return rc;
203         }
204
205         rc = __cifs_calc_signature(rqst, server, sigptr,
206                 &server->secmech.sdeschmacsha256->shash);
207
208         if (!rc)
209                 memcpy(shdr->Signature, sigptr, SMB2_SIGNATURE_SIZE);
210
211         return rc;
212 }
213
214 static int generate_key(struct cifs_ses *ses, struct kvec label,
215                         struct kvec context, __u8 *key, unsigned int key_size)
216 {
217         unsigned char zero = 0x0;
218         __u8 i[4] = {0, 0, 0, 1};
219         __u8 L[4] = {0, 0, 0, 128};
220         int rc = 0;
221         unsigned char prfhash[SMB2_HMACSHA256_SIZE];
222         unsigned char *hashptr = prfhash;
223
224         memset(prfhash, 0x0, SMB2_HMACSHA256_SIZE);
225         memset(key, 0x0, key_size);
226
227         rc = smb3_crypto_shash_allocate(ses->server);
228         if (rc) {
229                 cifs_dbg(VFS, "%s: crypto alloc failed\n", __func__);
230                 goto smb3signkey_ret;
231         }
232
233         rc = crypto_shash_setkey(ses->server->secmech.hmacsha256,
234                 ses->auth_key.response, SMB2_NTLMV2_SESSKEY_SIZE);
235         if (rc) {
236                 cifs_dbg(VFS, "%s: Could not set with session key\n", __func__);
237                 goto smb3signkey_ret;
238         }
239
240         rc = crypto_shash_init(&ses->server->secmech.sdeschmacsha256->shash);
241         if (rc) {
242                 cifs_dbg(VFS, "%s: Could not init sign hmac\n", __func__);
243                 goto smb3signkey_ret;
244         }
245
246         rc = crypto_shash_update(&ses->server->secmech.sdeschmacsha256->shash,
247                                 i, 4);
248         if (rc) {
249                 cifs_dbg(VFS, "%s: Could not update with n\n", __func__);
250                 goto smb3signkey_ret;
251         }
252
253         rc = crypto_shash_update(&ses->server->secmech.sdeschmacsha256->shash,
254                                 label.iov_base, label.iov_len);
255         if (rc) {
256                 cifs_dbg(VFS, "%s: Could not update with label\n", __func__);
257                 goto smb3signkey_ret;
258         }
259
260         rc = crypto_shash_update(&ses->server->secmech.sdeschmacsha256->shash,
261                                 &zero, 1);
262         if (rc) {
263                 cifs_dbg(VFS, "%s: Could not update with zero\n", __func__);
264                 goto smb3signkey_ret;
265         }
266
267         rc = crypto_shash_update(&ses->server->secmech.sdeschmacsha256->shash,
268                                 context.iov_base, context.iov_len);
269         if (rc) {
270                 cifs_dbg(VFS, "%s: Could not update with context\n", __func__);
271                 goto smb3signkey_ret;
272         }
273
274         rc = crypto_shash_update(&ses->server->secmech.sdeschmacsha256->shash,
275                                 L, 4);
276         if (rc) {
277                 cifs_dbg(VFS, "%s: Could not update with L\n", __func__);
278                 goto smb3signkey_ret;
279         }
280
281         rc = crypto_shash_final(&ses->server->secmech.sdeschmacsha256->shash,
282                                 hashptr);
283         if (rc) {
284                 cifs_dbg(VFS, "%s: Could not generate sha256 hash\n", __func__);
285                 goto smb3signkey_ret;
286         }
287
288         memcpy(key, hashptr, key_size);
289
290 smb3signkey_ret:
291         return rc;
292 }
293
294 struct derivation {
295         struct kvec label;
296         struct kvec context;
297 };
298
299 struct derivation_triplet {
300         struct derivation signing;
301         struct derivation encryption;
302         struct derivation decryption;
303 };
304
305 static int
306 generate_smb3signingkey(struct cifs_ses *ses,
307                         const struct derivation_triplet *ptriplet)
308 {
309         int rc;
310
311         rc = generate_key(ses, ptriplet->signing.label,
312                           ptriplet->signing.context, ses->smb3signingkey,
313                           SMB3_SIGN_KEY_SIZE);
314         if (rc)
315                 return rc;
316
317         rc = generate_key(ses, ptriplet->encryption.label,
318                           ptriplet->encryption.context, ses->smb3encryptionkey,
319                           SMB3_SIGN_KEY_SIZE);
320         if (rc)
321                 return rc;
322
323         rc = generate_key(ses, ptriplet->decryption.label,
324                           ptriplet->decryption.context,
325                           ses->smb3decryptionkey, SMB3_SIGN_KEY_SIZE);
326
327         if (rc)
328                 return rc;
329
330 #ifdef CONFIG_CIFS_DEBUG_DUMP_KEYS
331         cifs_dbg(VFS, "%s: dumping generated AES session keys\n", __func__);
332         /*
333          * The session id is opaque in terms of endianness, so we can't
334          * print it as a long long. we dump it as we got it on the wire
335          */
336         cifs_dbg(VFS, "Session Id    %*ph\n", (int)sizeof(ses->Suid),
337                         &ses->Suid);
338         cifs_dbg(VFS, "Session Key   %*ph\n",
339                  SMB2_NTLMV2_SESSKEY_SIZE, ses->auth_key.response);
340         cifs_dbg(VFS, "Signing Key   %*ph\n",
341                  SMB3_SIGN_KEY_SIZE, ses->smb3signingkey);
342         cifs_dbg(VFS, "ServerIn Key  %*ph\n",
343                  SMB3_SIGN_KEY_SIZE, ses->smb3encryptionkey);
344         cifs_dbg(VFS, "ServerOut Key %*ph\n",
345                  SMB3_SIGN_KEY_SIZE, ses->smb3decryptionkey);
346 #endif
347         return rc;
348 }
349
350 int
351 generate_smb30signingkey(struct cifs_ses *ses)
352
353 {
354         struct derivation_triplet triplet;
355         struct derivation *d;
356
357         d = &triplet.signing;
358         d->label.iov_base = "SMB2AESCMAC";
359         d->label.iov_len = 12;
360         d->context.iov_base = "SmbSign";
361         d->context.iov_len = 8;
362
363         d = &triplet.encryption;
364         d->label.iov_base = "SMB2AESCCM";
365         d->label.iov_len = 11;
366         d->context.iov_base = "ServerIn ";
367         d->context.iov_len = 10;
368
369         d = &triplet.decryption;
370         d->label.iov_base = "SMB2AESCCM";
371         d->label.iov_len = 11;
372         d->context.iov_base = "ServerOut";
373         d->context.iov_len = 10;
374
375         return generate_smb3signingkey(ses, &triplet);
376 }
377
378 #ifdef CONFIG_CIFS_SMB311
379 int
380 generate_smb311signingkey(struct cifs_ses *ses)
381
382 {
383         struct derivation_triplet triplet;
384         struct derivation *d;
385
386         d = &triplet.signing;
387         d->label.iov_base = "SMBSigningKey";
388         d->label.iov_len = 14;
389         d->context.iov_base = ses->preauth_sha_hash;
390         d->context.iov_len = 64;
391
392         d = &triplet.encryption;
393         d->label.iov_base = "SMBC2SCipherKey";
394         d->label.iov_len = 16;
395         d->context.iov_base = ses->preauth_sha_hash;
396         d->context.iov_len = 64;
397
398         d = &triplet.decryption;
399         d->label.iov_base = "SMBS2CCipherKey";
400         d->label.iov_len = 16;
401         d->context.iov_base = ses->preauth_sha_hash;
402         d->context.iov_len = 64;
403
404         return generate_smb3signingkey(ses, &triplet);
405 }
406 #endif /* 311 */
407
408 int
409 smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
410 {
411         int rc = 0;
412         unsigned char smb3_signature[SMB2_CMACAES_SIZE];
413         unsigned char *sigptr = smb3_signature;
414         struct kvec *iov = rqst->rq_iov;
415         struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)iov[1].iov_base;
416         struct cifs_ses *ses;
417
418         ses = smb2_find_smb_ses(server, shdr->SessionId);
419         if (!ses) {
420                 cifs_dbg(VFS, "%s: Could not find session\n", __func__);
421                 return 0;
422         }
423
424         memset(smb3_signature, 0x0, SMB2_CMACAES_SIZE);
425         memset(shdr->Signature, 0x0, SMB2_SIGNATURE_SIZE);
426
427         rc = crypto_shash_setkey(server->secmech.cmacaes,
428                 ses->smb3signingkey, SMB2_CMACAES_SIZE);
429
430         if (rc) {
431                 cifs_dbg(VFS, "%s: Could not set key for cmac aes\n", __func__);
432                 return rc;
433         }
434
435         /*
436          * we already allocate sdesccmacaes when we init smb3 signing key,
437          * so unlike smb2 case we do not have to check here if secmech are
438          * initialized
439          */
440         rc = crypto_shash_init(&server->secmech.sdesccmacaes->shash);
441         if (rc) {
442                 cifs_dbg(VFS, "%s: Could not init cmac aes\n", __func__);
443                 return rc;
444         }
445
446         rc = __cifs_calc_signature(rqst, server, sigptr,
447                                    &server->secmech.sdesccmacaes->shash);
448
449         if (!rc)
450                 memcpy(shdr->Signature, sigptr, SMB2_SIGNATURE_SIZE);
451
452         return rc;
453 }
454
455 /* must be called with server->srv_mutex held */
456 static int
457 smb2_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server)
458 {
459         int rc = 0;
460         struct smb2_sync_hdr *shdr =
461                         (struct smb2_sync_hdr *)rqst->rq_iov[1].iov_base;
462
463         if (!(shdr->Flags & SMB2_FLAGS_SIGNED) ||
464             server->tcpStatus == CifsNeedNegotiate)
465                 return rc;
466
467         if (!server->session_estab) {
468                 strncpy(shdr->Signature, "BSRSPYL", 8);
469                 return rc;
470         }
471
472         rc = server->ops->calc_signature(rqst, server);
473
474         return rc;
475 }
476
477 int
478 smb2_verify_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
479 {
480         unsigned int rc;
481         char server_response_sig[16];
482         struct smb2_sync_hdr *shdr =
483                         (struct smb2_sync_hdr *)rqst->rq_iov[1].iov_base;
484
485         if ((shdr->Command == SMB2_NEGOTIATE) ||
486             (shdr->Command == SMB2_SESSION_SETUP) ||
487             (shdr->Command == SMB2_OPLOCK_BREAK) ||
488             (!server->session_estab))
489                 return 0;
490
491         /*
492          * BB what if signatures are supposed to be on for session but
493          * server does not send one? BB
494          */
495
496         /* Do not need to verify session setups with signature "BSRSPYL " */
497         if (memcmp(shdr->Signature, "BSRSPYL ", 8) == 0)
498                 cifs_dbg(FYI, "dummy signature received for smb command 0x%x\n",
499                          shdr->Command);
500
501         /*
502          * Save off the origiginal signature so we can modify the smb and check
503          * our calculated signature against what the server sent.
504          */
505         memcpy(server_response_sig, shdr->Signature, SMB2_SIGNATURE_SIZE);
506
507         memset(shdr->Signature, 0, SMB2_SIGNATURE_SIZE);
508
509         mutex_lock(&server->srv_mutex);
510         rc = server->ops->calc_signature(rqst, server);
511         mutex_unlock(&server->srv_mutex);
512
513         if (rc)
514                 return rc;
515
516         if (memcmp(server_response_sig, shdr->Signature, SMB2_SIGNATURE_SIZE))
517                 return -EACCES;
518         else
519                 return 0;
520 }
521
522 /*
523  * Set message id for the request. Should be called after wait_for_free_request
524  * and when srv_mutex is held.
525  */
526 static inline void
527 smb2_seq_num_into_buf(struct TCP_Server_Info *server,
528                       struct smb2_sync_hdr *shdr)
529 {
530         unsigned int i, num = le16_to_cpu(shdr->CreditCharge);
531
532         shdr->MessageId = get_next_mid64(server);
533         /* skip message numbers according to CreditCharge field */
534         for (i = 1; i < num; i++)
535                 get_next_mid(server);
536 }
537
538 static struct mid_q_entry *
539 smb2_mid_entry_alloc(const struct smb2_sync_hdr *shdr,
540                      struct TCP_Server_Info *server)
541 {
542         struct mid_q_entry *temp;
543
544         if (server == NULL) {
545                 cifs_dbg(VFS, "Null TCP session in smb2_mid_entry_alloc\n");
546                 return NULL;
547         }
548
549         temp = mempool_alloc(cifs_mid_poolp, GFP_NOFS);
550         memset(temp, 0, sizeof(struct mid_q_entry));
551         kref_init(&temp->refcount);
552         temp->mid = le64_to_cpu(shdr->MessageId);
553         temp->pid = current->pid;
554         temp->command = shdr->Command; /* Always LE */
555         temp->when_alloc = jiffies;
556         temp->server = server;
557
558         /*
559          * The default is for the mid to be synchronous, so the
560          * default callback just wakes up the current task.
561          */
562         temp->callback = cifs_wake_up_task;
563         temp->callback_data = current;
564
565         atomic_inc(&midCount);
566         temp->mid_state = MID_REQUEST_ALLOCATED;
567         return temp;
568 }
569
570 static int
571 smb2_get_mid_entry(struct cifs_ses *ses, struct smb2_sync_hdr *shdr,
572                    struct mid_q_entry **mid)
573 {
574         if (ses->server->tcpStatus == CifsExiting)
575                 return -ENOENT;
576
577         if (ses->server->tcpStatus == CifsNeedReconnect) {
578                 cifs_dbg(FYI, "tcp session dead - return to caller to retry\n");
579                 return -EAGAIN;
580         }
581
582         if (ses->status == CifsNew) {
583                 if ((shdr->Command != SMB2_SESSION_SETUP) &&
584                     (shdr->Command != SMB2_NEGOTIATE))
585                         return -EAGAIN;
586                 /* else ok - we are setting up session */
587         }
588
589         if (ses->status == CifsExiting) {
590                 if (shdr->Command != SMB2_LOGOFF)
591                         return -EAGAIN;
592                 /* else ok - we are shutting down the session */
593         }
594
595         *mid = smb2_mid_entry_alloc(shdr, ses->server);
596         if (*mid == NULL)
597                 return -ENOMEM;
598         spin_lock(&GlobalMid_Lock);
599         list_add_tail(&(*mid)->qhead, &ses->server->pending_mid_q);
600         spin_unlock(&GlobalMid_Lock);
601         return 0;
602 }
603
604 int
605 smb2_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
606                    bool log_error)
607 {
608         unsigned int len = get_rfc1002_length(mid->resp_buf);
609         struct kvec iov[2];
610         struct smb_rqst rqst = { .rq_iov = iov,
611                                  .rq_nvec = 2 };
612
613         iov[0].iov_base = (char *)mid->resp_buf;
614         iov[0].iov_len = 4;
615         iov[1].iov_base = (char *)mid->resp_buf + 4;
616         iov[1].iov_len = len;
617
618         dump_smb(mid->resp_buf, min_t(u32, 80, len));
619         /* convert the length into a more usable form */
620         if (len > 24 && server->sign && !mid->decrypted) {
621                 int rc;
622
623                 rc = smb2_verify_signature(&rqst, server);
624                 if (rc)
625                         cifs_dbg(VFS, "SMB signature verification returned error = %d\n",
626                                  rc);
627         }
628
629         return map_smb2_to_linux_error(mid->resp_buf, log_error);
630 }
631
632 struct mid_q_entry *
633 smb2_setup_request(struct cifs_ses *ses, struct smb_rqst *rqst)
634 {
635         int rc;
636         struct smb2_sync_hdr *shdr =
637                         (struct smb2_sync_hdr *)rqst->rq_iov[1].iov_base;
638         struct mid_q_entry *mid;
639
640         smb2_seq_num_into_buf(ses->server, shdr);
641
642         rc = smb2_get_mid_entry(ses, shdr, &mid);
643         if (rc)
644                 return ERR_PTR(rc);
645         rc = smb2_sign_rqst(rqst, ses->server);
646         if (rc) {
647                 cifs_delete_mid(mid);
648                 return ERR_PTR(rc);
649         }
650         return mid;
651 }
652
653 struct mid_q_entry *
654 smb2_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst)
655 {
656         int rc;
657         struct smb2_sync_hdr *shdr =
658                         (struct smb2_sync_hdr *)rqst->rq_iov[1].iov_base;
659         struct mid_q_entry *mid;
660
661         smb2_seq_num_into_buf(server, shdr);
662
663         mid = smb2_mid_entry_alloc(shdr, server);
664         if (mid == NULL)
665                 return ERR_PTR(-ENOMEM);
666
667         rc = smb2_sign_rqst(rqst, server);
668         if (rc) {
669                 DeleteMidQEntry(mid);
670                 return ERR_PTR(rc);
671         }
672
673         return mid;
674 }
675
676 int
677 smb3_crypto_aead_allocate(struct TCP_Server_Info *server)
678 {
679         struct crypto_aead *tfm;
680
681         if (!server->secmech.ccmaesencrypt) {
682                 tfm = crypto_alloc_aead("ccm(aes)", 0, 0);
683                 if (IS_ERR(tfm)) {
684                         cifs_dbg(VFS, "%s: Failed to alloc encrypt aead\n",
685                                  __func__);
686                         return PTR_ERR(tfm);
687                 }
688                 server->secmech.ccmaesencrypt = tfm;
689         }
690
691         if (!server->secmech.ccmaesdecrypt) {
692                 tfm = crypto_alloc_aead("ccm(aes)", 0, 0);
693                 if (IS_ERR(tfm)) {
694                         crypto_free_aead(server->secmech.ccmaesencrypt);
695                         server->secmech.ccmaesencrypt = NULL;
696                         cifs_dbg(VFS, "%s: Failed to alloc decrypt aead\n",
697                                  __func__);
698                         return PTR_ERR(tfm);
699                 }
700                 server->secmech.ccmaesdecrypt = tfm;
701         }
702
703         return 0;
704 }