dm-crypt: use __bio_add_page to add single page to clone bio
[linux-block.git] / fs / ksmbd / auth.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *   Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
4  *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
5  */
6
7 #include <linux/kernel.h>
8 #include <linux/fs.h>
9 #include <linux/uaccess.h>
10 #include <linux/backing-dev.h>
11 #include <linux/writeback.h>
12 #include <linux/uio.h>
13 #include <linux/xattr.h>
14 #include <crypto/hash.h>
15 #include <crypto/aead.h>
16 #include <linux/random.h>
17 #include <linux/scatterlist.h>
18
19 #include "auth.h"
20 #include "glob.h"
21
22 #include <linux/fips.h>
23 #include <crypto/des.h>
24
25 #include "server.h"
26 #include "smb_common.h"
27 #include "connection.h"
28 #include "mgmt/user_session.h"
29 #include "mgmt/user_config.h"
30 #include "crypto_ctx.h"
31 #include "transport_ipc.h"
32 #include "../smbfs_common/arc4.h"
33
34 /*
35  * Fixed format data defining GSS header and fixed string
36  * "not_defined_in_RFC4178@please_ignore".
37  * So sec blob data in neg phase could be generated statically.
38  */
39 static char NEGOTIATE_GSS_HEADER[AUTH_GSS_LENGTH] = {
40 #ifdef CONFIG_SMB_SERVER_KERBEROS5
41         0x60, 0x5e, 0x06, 0x06, 0x2b, 0x06, 0x01, 0x05,
42         0x05, 0x02, 0xa0, 0x54, 0x30, 0x52, 0xa0, 0x24,
43         0x30, 0x22, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
44         0xf7, 0x12, 0x01, 0x02, 0x02, 0x06, 0x09, 0x2a,
45         0x86, 0x48, 0x82, 0xf7, 0x12, 0x01, 0x02, 0x02,
46         0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82,
47         0x37, 0x02, 0x02, 0x0a, 0xa3, 0x2a, 0x30, 0x28,
48         0xa0, 0x26, 0x1b, 0x24, 0x6e, 0x6f, 0x74, 0x5f,
49         0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f,
50         0x69, 0x6e, 0x5f, 0x52, 0x46, 0x43, 0x34, 0x31,
51         0x37, 0x38, 0x40, 0x70, 0x6c, 0x65, 0x61, 0x73,
52         0x65, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65
53 #else
54         0x60, 0x48, 0x06, 0x06, 0x2b, 0x06, 0x01, 0x05,
55         0x05, 0x02, 0xa0, 0x3e, 0x30, 0x3c, 0xa0, 0x0e,
56         0x30, 0x0c, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04,
57         0x01, 0x82, 0x37, 0x02, 0x02, 0x0a, 0xa3, 0x2a,
58         0x30, 0x28, 0xa0, 0x26, 0x1b, 0x24, 0x6e, 0x6f,
59         0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65,
60         0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x52, 0x46, 0x43,
61         0x34, 0x31, 0x37, 0x38, 0x40, 0x70, 0x6c, 0x65,
62         0x61, 0x73, 0x65, 0x5f, 0x69, 0x67, 0x6e, 0x6f,
63         0x72, 0x65
64 #endif
65 };
66
67 void ksmbd_copy_gss_neg_header(void *buf)
68 {
69         memcpy(buf, NEGOTIATE_GSS_HEADER, AUTH_GSS_LENGTH);
70 }
71
72 /**
73  * ksmbd_gen_sess_key() - function to generate session key
74  * @sess:       session of connection
75  * @hash:       source hash value to be used for find session key
76  * @hmac:       source hmac value to be used for finding session key
77  *
78  */
79 static int ksmbd_gen_sess_key(struct ksmbd_session *sess, char *hash,
80                               char *hmac)
81 {
82         struct ksmbd_crypto_ctx *ctx;
83         int rc;
84
85         ctx = ksmbd_crypto_ctx_find_hmacmd5();
86         if (!ctx) {
87                 ksmbd_debug(AUTH, "could not crypto alloc hmacmd5\n");
88                 return -ENOMEM;
89         }
90
91         rc = crypto_shash_setkey(CRYPTO_HMACMD5_TFM(ctx),
92                                  hash,
93                                  CIFS_HMAC_MD5_HASH_SIZE);
94         if (rc) {
95                 ksmbd_debug(AUTH, "hmacmd5 set key fail error %d\n", rc);
96                 goto out;
97         }
98
99         rc = crypto_shash_init(CRYPTO_HMACMD5(ctx));
100         if (rc) {
101                 ksmbd_debug(AUTH, "could not init hmacmd5 error %d\n", rc);
102                 goto out;
103         }
104
105         rc = crypto_shash_update(CRYPTO_HMACMD5(ctx),
106                                  hmac,
107                                  SMB2_NTLMV2_SESSKEY_SIZE);
108         if (rc) {
109                 ksmbd_debug(AUTH, "Could not update with response error %d\n", rc);
110                 goto out;
111         }
112
113         rc = crypto_shash_final(CRYPTO_HMACMD5(ctx), sess->sess_key);
114         if (rc) {
115                 ksmbd_debug(AUTH, "Could not generate hmacmd5 hash error %d\n", rc);
116                 goto out;
117         }
118
119 out:
120         ksmbd_release_crypto_ctx(ctx);
121         return rc;
122 }
123
124 static int calc_ntlmv2_hash(struct ksmbd_conn *conn, struct ksmbd_session *sess,
125                             char *ntlmv2_hash, char *dname)
126 {
127         int ret, len, conv_len;
128         wchar_t *domain = NULL;
129         __le16 *uniname = NULL;
130         struct ksmbd_crypto_ctx *ctx;
131
132         ctx = ksmbd_crypto_ctx_find_hmacmd5();
133         if (!ctx) {
134                 ksmbd_debug(AUTH, "can't generate ntlmv2 hash\n");
135                 return -ENOMEM;
136         }
137
138         ret = crypto_shash_setkey(CRYPTO_HMACMD5_TFM(ctx),
139                                   user_passkey(sess->user),
140                                   CIFS_ENCPWD_SIZE);
141         if (ret) {
142                 ksmbd_debug(AUTH, "Could not set NT Hash as a key\n");
143                 goto out;
144         }
145
146         ret = crypto_shash_init(CRYPTO_HMACMD5(ctx));
147         if (ret) {
148                 ksmbd_debug(AUTH, "could not init hmacmd5\n");
149                 goto out;
150         }
151
152         /* convert user_name to unicode */
153         len = strlen(user_name(sess->user));
154         uniname = kzalloc(2 + UNICODE_LEN(len), GFP_KERNEL);
155         if (!uniname) {
156                 ret = -ENOMEM;
157                 goto out;
158         }
159
160         conv_len = smb_strtoUTF16(uniname, user_name(sess->user), len,
161                                   conn->local_nls);
162         if (conv_len < 0 || conv_len > len) {
163                 ret = -EINVAL;
164                 goto out;
165         }
166         UniStrupr(uniname);
167
168         ret = crypto_shash_update(CRYPTO_HMACMD5(ctx),
169                                   (char *)uniname,
170                                   UNICODE_LEN(conv_len));
171         if (ret) {
172                 ksmbd_debug(AUTH, "Could not update with user\n");
173                 goto out;
174         }
175
176         /* Convert domain name or conn name to unicode and uppercase */
177         len = strlen(dname);
178         domain = kzalloc(2 + UNICODE_LEN(len), GFP_KERNEL);
179         if (!domain) {
180                 ret = -ENOMEM;
181                 goto out;
182         }
183
184         conv_len = smb_strtoUTF16((__le16 *)domain, dname, len,
185                                   conn->local_nls);
186         if (conv_len < 0 || conv_len > len) {
187                 ret = -EINVAL;
188                 goto out;
189         }
190
191         ret = crypto_shash_update(CRYPTO_HMACMD5(ctx),
192                                   (char *)domain,
193                                   UNICODE_LEN(conv_len));
194         if (ret) {
195                 ksmbd_debug(AUTH, "Could not update with domain\n");
196                 goto out;
197         }
198
199         ret = crypto_shash_final(CRYPTO_HMACMD5(ctx), ntlmv2_hash);
200         if (ret)
201                 ksmbd_debug(AUTH, "Could not generate md5 hash\n");
202 out:
203         kfree(uniname);
204         kfree(domain);
205         ksmbd_release_crypto_ctx(ctx);
206         return ret;
207 }
208
209 /**
210  * ksmbd_auth_ntlmv2() - NTLMv2 authentication handler
211  * @sess:       session of connection
212  * @ntlmv2:             NTLMv2 challenge response
213  * @blen:               NTLMv2 blob length
214  * @domain_name:        domain name
215  *
216  * Return:      0 on success, error number on error
217  */
218 int ksmbd_auth_ntlmv2(struct ksmbd_conn *conn, struct ksmbd_session *sess,
219                       struct ntlmv2_resp *ntlmv2, int blen, char *domain_name,
220                       char *cryptkey)
221 {
222         char ntlmv2_hash[CIFS_ENCPWD_SIZE];
223         char ntlmv2_rsp[CIFS_HMAC_MD5_HASH_SIZE];
224         struct ksmbd_crypto_ctx *ctx = NULL;
225         char *construct = NULL;
226         int rc, len;
227
228         rc = calc_ntlmv2_hash(conn, sess, ntlmv2_hash, domain_name);
229         if (rc) {
230                 ksmbd_debug(AUTH, "could not get v2 hash rc %d\n", rc);
231                 goto out;
232         }
233
234         ctx = ksmbd_crypto_ctx_find_hmacmd5();
235         if (!ctx) {
236                 ksmbd_debug(AUTH, "could not crypto alloc hmacmd5\n");
237                 return -ENOMEM;
238         }
239
240         rc = crypto_shash_setkey(CRYPTO_HMACMD5_TFM(ctx),
241                                  ntlmv2_hash,
242                                  CIFS_HMAC_MD5_HASH_SIZE);
243         if (rc) {
244                 ksmbd_debug(AUTH, "Could not set NTLMV2 Hash as a key\n");
245                 goto out;
246         }
247
248         rc = crypto_shash_init(CRYPTO_HMACMD5(ctx));
249         if (rc) {
250                 ksmbd_debug(AUTH, "Could not init hmacmd5\n");
251                 goto out;
252         }
253
254         len = CIFS_CRYPTO_KEY_SIZE + blen;
255         construct = kzalloc(len, GFP_KERNEL);
256         if (!construct) {
257                 rc = -ENOMEM;
258                 goto out;
259         }
260
261         memcpy(construct, cryptkey, CIFS_CRYPTO_KEY_SIZE);
262         memcpy(construct + CIFS_CRYPTO_KEY_SIZE, &ntlmv2->blob_signature, blen);
263
264         rc = crypto_shash_update(CRYPTO_HMACMD5(ctx), construct, len);
265         if (rc) {
266                 ksmbd_debug(AUTH, "Could not update with response\n");
267                 goto out;
268         }
269
270         rc = crypto_shash_final(CRYPTO_HMACMD5(ctx), ntlmv2_rsp);
271         if (rc) {
272                 ksmbd_debug(AUTH, "Could not generate md5 hash\n");
273                 goto out;
274         }
275         ksmbd_release_crypto_ctx(ctx);
276         ctx = NULL;
277
278         rc = ksmbd_gen_sess_key(sess, ntlmv2_hash, ntlmv2_rsp);
279         if (rc) {
280                 ksmbd_debug(AUTH, "Could not generate sess key\n");
281                 goto out;
282         }
283
284         if (memcmp(ntlmv2->ntlmv2_hash, ntlmv2_rsp, CIFS_HMAC_MD5_HASH_SIZE) != 0)
285                 rc = -EINVAL;
286 out:
287         if (ctx)
288                 ksmbd_release_crypto_ctx(ctx);
289         kfree(construct);
290         return rc;
291 }
292
293 /**
294  * ksmbd_decode_ntlmssp_auth_blob() - helper function to construct
295  * authenticate blob
296  * @authblob:   authenticate blob source pointer
297  * @usr:        user details
298  * @sess:       session of connection
299  *
300  * Return:      0 on success, error number on error
301  */
302 int ksmbd_decode_ntlmssp_auth_blob(struct authenticate_message *authblob,
303                                    int blob_len, struct ksmbd_conn *conn,
304                                    struct ksmbd_session *sess)
305 {
306         char *domain_name;
307         unsigned int nt_off, dn_off;
308         unsigned short nt_len, dn_len;
309         int ret;
310
311         if (blob_len < sizeof(struct authenticate_message)) {
312                 ksmbd_debug(AUTH, "negotiate blob len %d too small\n",
313                             blob_len);
314                 return -EINVAL;
315         }
316
317         if (memcmp(authblob->Signature, "NTLMSSP", 8)) {
318                 ksmbd_debug(AUTH, "blob signature incorrect %s\n",
319                             authblob->Signature);
320                 return -EINVAL;
321         }
322
323         nt_off = le32_to_cpu(authblob->NtChallengeResponse.BufferOffset);
324         nt_len = le16_to_cpu(authblob->NtChallengeResponse.Length);
325         dn_off = le32_to_cpu(authblob->DomainName.BufferOffset);
326         dn_len = le16_to_cpu(authblob->DomainName.Length);
327
328         if (blob_len < (u64)dn_off + dn_len || blob_len < (u64)nt_off + nt_len ||
329             nt_len < CIFS_ENCPWD_SIZE)
330                 return -EINVAL;
331
332         /* TODO : use domain name that imported from configuration file */
333         domain_name = smb_strndup_from_utf16((const char *)authblob + dn_off,
334                                              dn_len, true, conn->local_nls);
335         if (IS_ERR(domain_name))
336                 return PTR_ERR(domain_name);
337
338         /* process NTLMv2 authentication */
339         ksmbd_debug(AUTH, "decode_ntlmssp_authenticate_blob dname%s\n",
340                     domain_name);
341         ret = ksmbd_auth_ntlmv2(conn, sess,
342                                 (struct ntlmv2_resp *)((char *)authblob + nt_off),
343                                 nt_len - CIFS_ENCPWD_SIZE,
344                                 domain_name, conn->ntlmssp.cryptkey);
345         kfree(domain_name);
346
347         /* The recovered secondary session key */
348         if (conn->ntlmssp.client_flags & NTLMSSP_NEGOTIATE_KEY_XCH) {
349                 struct arc4_ctx *ctx_arc4;
350                 unsigned int sess_key_off, sess_key_len;
351
352                 sess_key_off = le32_to_cpu(authblob->SessionKey.BufferOffset);
353                 sess_key_len = le16_to_cpu(authblob->SessionKey.Length);
354
355                 if (blob_len < (u64)sess_key_off + sess_key_len)
356                         return -EINVAL;
357
358                 ctx_arc4 = kmalloc(sizeof(*ctx_arc4), GFP_KERNEL);
359                 if (!ctx_arc4)
360                         return -ENOMEM;
361
362                 cifs_arc4_setkey(ctx_arc4, sess->sess_key,
363                                  SMB2_NTLMV2_SESSKEY_SIZE);
364                 cifs_arc4_crypt(ctx_arc4, sess->sess_key,
365                                 (char *)authblob + sess_key_off, sess_key_len);
366                 kfree_sensitive(ctx_arc4);
367         }
368
369         return ret;
370 }
371
372 /**
373  * ksmbd_decode_ntlmssp_neg_blob() - helper function to construct
374  * negotiate blob
375  * @negblob: negotiate blob source pointer
376  * @rsp:     response header pointer to be updated
377  * @sess:    session of connection
378  *
379  */
380 int ksmbd_decode_ntlmssp_neg_blob(struct negotiate_message *negblob,
381                                   int blob_len, struct ksmbd_conn *conn)
382 {
383         if (blob_len < sizeof(struct negotiate_message)) {
384                 ksmbd_debug(AUTH, "negotiate blob len %d too small\n",
385                             blob_len);
386                 return -EINVAL;
387         }
388
389         if (memcmp(negblob->Signature, "NTLMSSP", 8)) {
390                 ksmbd_debug(AUTH, "blob signature incorrect %s\n",
391                             negblob->Signature);
392                 return -EINVAL;
393         }
394
395         conn->ntlmssp.client_flags = le32_to_cpu(negblob->NegotiateFlags);
396         return 0;
397 }
398
399 /**
400  * ksmbd_build_ntlmssp_challenge_blob() - helper function to construct
401  * challenge blob
402  * @chgblob: challenge blob source pointer to initialize
403  * @rsp:     response header pointer to be updated
404  * @sess:    session of connection
405  *
406  */
407 unsigned int
408 ksmbd_build_ntlmssp_challenge_blob(struct challenge_message *chgblob,
409                                    struct ksmbd_conn *conn)
410 {
411         struct target_info *tinfo;
412         wchar_t *name;
413         __u8 *target_name;
414         unsigned int flags, blob_off, blob_len, type, target_info_len = 0;
415         int len, uni_len, conv_len;
416         int cflags = conn->ntlmssp.client_flags;
417
418         memcpy(chgblob->Signature, NTLMSSP_SIGNATURE, 8);
419         chgblob->MessageType = NtLmChallenge;
420
421         flags = NTLMSSP_NEGOTIATE_UNICODE |
422                 NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_TARGET_TYPE_SERVER |
423                 NTLMSSP_NEGOTIATE_TARGET_INFO;
424
425         if (cflags & NTLMSSP_NEGOTIATE_SIGN) {
426                 flags |= NTLMSSP_NEGOTIATE_SIGN;
427                 flags |= cflags & (NTLMSSP_NEGOTIATE_128 |
428                                    NTLMSSP_NEGOTIATE_56);
429         }
430
431         if (cflags & NTLMSSP_NEGOTIATE_SEAL && smb3_encryption_negotiated(conn))
432                 flags |= NTLMSSP_NEGOTIATE_SEAL;
433
434         if (cflags & NTLMSSP_NEGOTIATE_ALWAYS_SIGN)
435                 flags |= NTLMSSP_NEGOTIATE_ALWAYS_SIGN;
436
437         if (cflags & NTLMSSP_REQUEST_TARGET)
438                 flags |= NTLMSSP_REQUEST_TARGET;
439
440         if (conn->use_spnego &&
441             (cflags & NTLMSSP_NEGOTIATE_EXTENDED_SEC))
442                 flags |= NTLMSSP_NEGOTIATE_EXTENDED_SEC;
443
444         if (cflags & NTLMSSP_NEGOTIATE_KEY_XCH)
445                 flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
446
447         chgblob->NegotiateFlags = cpu_to_le32(flags);
448         len = strlen(ksmbd_netbios_name());
449         name = kmalloc(2 + UNICODE_LEN(len), GFP_KERNEL);
450         if (!name)
451                 return -ENOMEM;
452
453         conv_len = smb_strtoUTF16((__le16 *)name, ksmbd_netbios_name(), len,
454                                   conn->local_nls);
455         if (conv_len < 0 || conv_len > len) {
456                 kfree(name);
457                 return -EINVAL;
458         }
459
460         uni_len = UNICODE_LEN(conv_len);
461
462         blob_off = sizeof(struct challenge_message);
463         blob_len = blob_off + uni_len;
464
465         chgblob->TargetName.Length = cpu_to_le16(uni_len);
466         chgblob->TargetName.MaximumLength = cpu_to_le16(uni_len);
467         chgblob->TargetName.BufferOffset = cpu_to_le32(blob_off);
468
469         /* Initialize random conn challenge */
470         get_random_bytes(conn->ntlmssp.cryptkey, sizeof(__u64));
471         memcpy(chgblob->Challenge, conn->ntlmssp.cryptkey,
472                CIFS_CRYPTO_KEY_SIZE);
473
474         /* Add Target Information to security buffer */
475         chgblob->TargetInfoArray.BufferOffset = cpu_to_le32(blob_len);
476
477         target_name = (__u8 *)chgblob + blob_off;
478         memcpy(target_name, name, uni_len);
479         tinfo = (struct target_info *)(target_name + uni_len);
480
481         chgblob->TargetInfoArray.Length = 0;
482         /* Add target info list for NetBIOS/DNS settings */
483         for (type = NTLMSSP_AV_NB_COMPUTER_NAME;
484              type <= NTLMSSP_AV_DNS_DOMAIN_NAME; type++) {
485                 tinfo->Type = cpu_to_le16(type);
486                 tinfo->Length = cpu_to_le16(uni_len);
487                 memcpy(tinfo->Content, name, uni_len);
488                 tinfo = (struct target_info *)((char *)tinfo + 4 + uni_len);
489                 target_info_len += 4 + uni_len;
490         }
491
492         /* Add terminator subblock */
493         tinfo->Type = 0;
494         tinfo->Length = 0;
495         target_info_len += 4;
496
497         chgblob->TargetInfoArray.Length = cpu_to_le16(target_info_len);
498         chgblob->TargetInfoArray.MaximumLength = cpu_to_le16(target_info_len);
499         blob_len += target_info_len;
500         kfree(name);
501         ksmbd_debug(AUTH, "NTLMSSP SecurityBufferLength %d\n", blob_len);
502         return blob_len;
503 }
504
505 #ifdef CONFIG_SMB_SERVER_KERBEROS5
506 int ksmbd_krb5_authenticate(struct ksmbd_session *sess, char *in_blob,
507                             int in_len, char *out_blob, int *out_len)
508 {
509         struct ksmbd_spnego_authen_response *resp;
510         struct ksmbd_user *user = NULL;
511         int retval;
512
513         resp = ksmbd_ipc_spnego_authen_request(in_blob, in_len);
514         if (!resp) {
515                 ksmbd_debug(AUTH, "SPNEGO_AUTHEN_REQUEST failure\n");
516                 return -EINVAL;
517         }
518
519         if (!(resp->login_response.status & KSMBD_USER_FLAG_OK)) {
520                 ksmbd_debug(AUTH, "krb5 authentication failure\n");
521                 retval = -EPERM;
522                 goto out;
523         }
524
525         if (*out_len <= resp->spnego_blob_len) {
526                 ksmbd_debug(AUTH, "buf len %d, but blob len %d\n",
527                             *out_len, resp->spnego_blob_len);
528                 retval = -EINVAL;
529                 goto out;
530         }
531
532         if (resp->session_key_len > sizeof(sess->sess_key)) {
533                 ksmbd_debug(AUTH, "session key is too long\n");
534                 retval = -EINVAL;
535                 goto out;
536         }
537
538         user = ksmbd_alloc_user(&resp->login_response);
539         if (!user) {
540                 ksmbd_debug(AUTH, "login failure\n");
541                 retval = -ENOMEM;
542                 goto out;
543         }
544         sess->user = user;
545
546         memcpy(sess->sess_key, resp->payload, resp->session_key_len);
547         memcpy(out_blob, resp->payload + resp->session_key_len,
548                resp->spnego_blob_len);
549         *out_len = resp->spnego_blob_len;
550         retval = 0;
551 out:
552         kvfree(resp);
553         return retval;
554 }
555 #else
556 int ksmbd_krb5_authenticate(struct ksmbd_session *sess, char *in_blob,
557                             int in_len, char *out_blob, int *out_len)
558 {
559         return -EOPNOTSUPP;
560 }
561 #endif
562
563 /**
564  * ksmbd_sign_smb2_pdu() - function to generate packet signing
565  * @conn:       connection
566  * @key:        signing key
567  * @iov:        buffer iov array
568  * @n_vec:      number of iovecs
569  * @sig:        signature value generated for client request packet
570  *
571  */
572 int ksmbd_sign_smb2_pdu(struct ksmbd_conn *conn, char *key, struct kvec *iov,
573                         int n_vec, char *sig)
574 {
575         struct ksmbd_crypto_ctx *ctx;
576         int rc, i;
577
578         ctx = ksmbd_crypto_ctx_find_hmacsha256();
579         if (!ctx) {
580                 ksmbd_debug(AUTH, "could not crypto alloc hmacmd5\n");
581                 return -ENOMEM;
582         }
583
584         rc = crypto_shash_setkey(CRYPTO_HMACSHA256_TFM(ctx),
585                                  key,
586                                  SMB2_NTLMV2_SESSKEY_SIZE);
587         if (rc)
588                 goto out;
589
590         rc = crypto_shash_init(CRYPTO_HMACSHA256(ctx));
591         if (rc) {
592                 ksmbd_debug(AUTH, "hmacsha256 init error %d\n", rc);
593                 goto out;
594         }
595
596         for (i = 0; i < n_vec; i++) {
597                 rc = crypto_shash_update(CRYPTO_HMACSHA256(ctx),
598                                          iov[i].iov_base,
599                                          iov[i].iov_len);
600                 if (rc) {
601                         ksmbd_debug(AUTH, "hmacsha256 update error %d\n", rc);
602                         goto out;
603                 }
604         }
605
606         rc = crypto_shash_final(CRYPTO_HMACSHA256(ctx), sig);
607         if (rc)
608                 ksmbd_debug(AUTH, "hmacsha256 generation error %d\n", rc);
609 out:
610         ksmbd_release_crypto_ctx(ctx);
611         return rc;
612 }
613
614 /**
615  * ksmbd_sign_smb3_pdu() - function to generate packet signing
616  * @conn:       connection
617  * @key:        signing key
618  * @iov:        buffer iov array
619  * @n_vec:      number of iovecs
620  * @sig:        signature value generated for client request packet
621  *
622  */
623 int ksmbd_sign_smb3_pdu(struct ksmbd_conn *conn, char *key, struct kvec *iov,
624                         int n_vec, char *sig)
625 {
626         struct ksmbd_crypto_ctx *ctx;
627         int rc, i;
628
629         ctx = ksmbd_crypto_ctx_find_cmacaes();
630         if (!ctx) {
631                 ksmbd_debug(AUTH, "could not crypto alloc cmac\n");
632                 return -ENOMEM;
633         }
634
635         rc = crypto_shash_setkey(CRYPTO_CMACAES_TFM(ctx),
636                                  key,
637                                  SMB2_CMACAES_SIZE);
638         if (rc)
639                 goto out;
640
641         rc = crypto_shash_init(CRYPTO_CMACAES(ctx));
642         if (rc) {
643                 ksmbd_debug(AUTH, "cmaces init error %d\n", rc);
644                 goto out;
645         }
646
647         for (i = 0; i < n_vec; i++) {
648                 rc = crypto_shash_update(CRYPTO_CMACAES(ctx),
649                                          iov[i].iov_base,
650                                          iov[i].iov_len);
651                 if (rc) {
652                         ksmbd_debug(AUTH, "cmaces update error %d\n", rc);
653                         goto out;
654                 }
655         }
656
657         rc = crypto_shash_final(CRYPTO_CMACAES(ctx), sig);
658         if (rc)
659                 ksmbd_debug(AUTH, "cmaces generation error %d\n", rc);
660 out:
661         ksmbd_release_crypto_ctx(ctx);
662         return rc;
663 }
664
665 struct derivation {
666         struct kvec label;
667         struct kvec context;
668         bool binding;
669 };
670
671 static int generate_key(struct ksmbd_conn *conn, struct ksmbd_session *sess,
672                         struct kvec label, struct kvec context, __u8 *key,
673                         unsigned int key_size)
674 {
675         unsigned char zero = 0x0;
676         __u8 i[4] = {0, 0, 0, 1};
677         __u8 L128[4] = {0, 0, 0, 128};
678         __u8 L256[4] = {0, 0, 1, 0};
679         int rc;
680         unsigned char prfhash[SMB2_HMACSHA256_SIZE];
681         unsigned char *hashptr = prfhash;
682         struct ksmbd_crypto_ctx *ctx;
683
684         memset(prfhash, 0x0, SMB2_HMACSHA256_SIZE);
685         memset(key, 0x0, key_size);
686
687         ctx = ksmbd_crypto_ctx_find_hmacsha256();
688         if (!ctx) {
689                 ksmbd_debug(AUTH, "could not crypto alloc hmacmd5\n");
690                 return -ENOMEM;
691         }
692
693         rc = crypto_shash_setkey(CRYPTO_HMACSHA256_TFM(ctx),
694                                  sess->sess_key,
695                                  SMB2_NTLMV2_SESSKEY_SIZE);
696         if (rc)
697                 goto smb3signkey_ret;
698
699         rc = crypto_shash_init(CRYPTO_HMACSHA256(ctx));
700         if (rc) {
701                 ksmbd_debug(AUTH, "hmacsha256 init error %d\n", rc);
702                 goto smb3signkey_ret;
703         }
704
705         rc = crypto_shash_update(CRYPTO_HMACSHA256(ctx), i, 4);
706         if (rc) {
707                 ksmbd_debug(AUTH, "could not update with n\n");
708                 goto smb3signkey_ret;
709         }
710
711         rc = crypto_shash_update(CRYPTO_HMACSHA256(ctx),
712                                  label.iov_base,
713                                  label.iov_len);
714         if (rc) {
715                 ksmbd_debug(AUTH, "could not update with label\n");
716                 goto smb3signkey_ret;
717         }
718
719         rc = crypto_shash_update(CRYPTO_HMACSHA256(ctx), &zero, 1);
720         if (rc) {
721                 ksmbd_debug(AUTH, "could not update with zero\n");
722                 goto smb3signkey_ret;
723         }
724
725         rc = crypto_shash_update(CRYPTO_HMACSHA256(ctx),
726                                  context.iov_base,
727                                  context.iov_len);
728         if (rc) {
729                 ksmbd_debug(AUTH, "could not update with context\n");
730                 goto smb3signkey_ret;
731         }
732
733         if (key_size == SMB3_ENC_DEC_KEY_SIZE &&
734             (conn->cipher_type == SMB2_ENCRYPTION_AES256_CCM ||
735              conn->cipher_type == SMB2_ENCRYPTION_AES256_GCM))
736                 rc = crypto_shash_update(CRYPTO_HMACSHA256(ctx), L256, 4);
737         else
738                 rc = crypto_shash_update(CRYPTO_HMACSHA256(ctx), L128, 4);
739         if (rc) {
740                 ksmbd_debug(AUTH, "could not update with L\n");
741                 goto smb3signkey_ret;
742         }
743
744         rc = crypto_shash_final(CRYPTO_HMACSHA256(ctx), hashptr);
745         if (rc) {
746                 ksmbd_debug(AUTH, "Could not generate hmacmd5 hash error %d\n",
747                             rc);
748                 goto smb3signkey_ret;
749         }
750
751         memcpy(key, hashptr, key_size);
752
753 smb3signkey_ret:
754         ksmbd_release_crypto_ctx(ctx);
755         return rc;
756 }
757
758 static int generate_smb3signingkey(struct ksmbd_session *sess,
759                                    struct ksmbd_conn *conn,
760                                    const struct derivation *signing)
761 {
762         int rc;
763         struct channel *chann;
764         char *key;
765
766         chann = lookup_chann_list(sess, conn);
767         if (!chann)
768                 return 0;
769
770         if (conn->dialect >= SMB30_PROT_ID && signing->binding)
771                 key = chann->smb3signingkey;
772         else
773                 key = sess->smb3signingkey;
774
775         rc = generate_key(conn, sess, signing->label, signing->context, key,
776                           SMB3_SIGN_KEY_SIZE);
777         if (rc)
778                 return rc;
779
780         if (!(conn->dialect >= SMB30_PROT_ID && signing->binding))
781                 memcpy(chann->smb3signingkey, key, SMB3_SIGN_KEY_SIZE);
782
783         ksmbd_debug(AUTH, "dumping generated AES signing keys\n");
784         ksmbd_debug(AUTH, "Session Id    %llu\n", sess->id);
785         ksmbd_debug(AUTH, "Session Key   %*ph\n",
786                     SMB2_NTLMV2_SESSKEY_SIZE, sess->sess_key);
787         ksmbd_debug(AUTH, "Signing Key   %*ph\n",
788                     SMB3_SIGN_KEY_SIZE, key);
789         return 0;
790 }
791
792 int ksmbd_gen_smb30_signingkey(struct ksmbd_session *sess,
793                                struct ksmbd_conn *conn)
794 {
795         struct derivation d;
796
797         d.label.iov_base = "SMB2AESCMAC";
798         d.label.iov_len = 12;
799         d.context.iov_base = "SmbSign";
800         d.context.iov_len = 8;
801         d.binding = conn->binding;
802
803         return generate_smb3signingkey(sess, conn, &d);
804 }
805
806 int ksmbd_gen_smb311_signingkey(struct ksmbd_session *sess,
807                                 struct ksmbd_conn *conn)
808 {
809         struct derivation d;
810
811         d.label.iov_base = "SMBSigningKey";
812         d.label.iov_len = 14;
813         if (conn->binding) {
814                 struct preauth_session *preauth_sess;
815
816                 preauth_sess = ksmbd_preauth_session_lookup(conn, sess->id);
817                 if (!preauth_sess)
818                         return -ENOENT;
819                 d.context.iov_base = preauth_sess->Preauth_HashValue;
820         } else {
821                 d.context.iov_base = sess->Preauth_HashValue;
822         }
823         d.context.iov_len = 64;
824         d.binding = conn->binding;
825
826         return generate_smb3signingkey(sess, conn, &d);
827 }
828
829 struct derivation_twin {
830         struct derivation encryption;
831         struct derivation decryption;
832 };
833
834 static int generate_smb3encryptionkey(struct ksmbd_conn *conn,
835                                       struct ksmbd_session *sess,
836                                       const struct derivation_twin *ptwin)
837 {
838         int rc;
839
840         rc = generate_key(conn, sess, ptwin->encryption.label,
841                           ptwin->encryption.context, sess->smb3encryptionkey,
842                           SMB3_ENC_DEC_KEY_SIZE);
843         if (rc)
844                 return rc;
845
846         rc = generate_key(conn, sess, ptwin->decryption.label,
847                           ptwin->decryption.context,
848                           sess->smb3decryptionkey, SMB3_ENC_DEC_KEY_SIZE);
849         if (rc)
850                 return rc;
851
852         ksmbd_debug(AUTH, "dumping generated AES encryption keys\n");
853         ksmbd_debug(AUTH, "Cipher type   %d\n", conn->cipher_type);
854         ksmbd_debug(AUTH, "Session Id    %llu\n", sess->id);
855         ksmbd_debug(AUTH, "Session Key   %*ph\n",
856                     SMB2_NTLMV2_SESSKEY_SIZE, sess->sess_key);
857         if (conn->cipher_type == SMB2_ENCRYPTION_AES256_CCM ||
858             conn->cipher_type == SMB2_ENCRYPTION_AES256_GCM) {
859                 ksmbd_debug(AUTH, "ServerIn Key  %*ph\n",
860                             SMB3_GCM256_CRYPTKEY_SIZE, sess->smb3encryptionkey);
861                 ksmbd_debug(AUTH, "ServerOut Key %*ph\n",
862                             SMB3_GCM256_CRYPTKEY_SIZE, sess->smb3decryptionkey);
863         } else {
864                 ksmbd_debug(AUTH, "ServerIn Key  %*ph\n",
865                             SMB3_GCM128_CRYPTKEY_SIZE, sess->smb3encryptionkey);
866                 ksmbd_debug(AUTH, "ServerOut Key %*ph\n",
867                             SMB3_GCM128_CRYPTKEY_SIZE, sess->smb3decryptionkey);
868         }
869         return 0;
870 }
871
872 int ksmbd_gen_smb30_encryptionkey(struct ksmbd_conn *conn,
873                                   struct ksmbd_session *sess)
874 {
875         struct derivation_twin twin;
876         struct derivation *d;
877
878         d = &twin.encryption;
879         d->label.iov_base = "SMB2AESCCM";
880         d->label.iov_len = 11;
881         d->context.iov_base = "ServerOut";
882         d->context.iov_len = 10;
883
884         d = &twin.decryption;
885         d->label.iov_base = "SMB2AESCCM";
886         d->label.iov_len = 11;
887         d->context.iov_base = "ServerIn ";
888         d->context.iov_len = 10;
889
890         return generate_smb3encryptionkey(conn, sess, &twin);
891 }
892
893 int ksmbd_gen_smb311_encryptionkey(struct ksmbd_conn *conn,
894                                    struct ksmbd_session *sess)
895 {
896         struct derivation_twin twin;
897         struct derivation *d;
898
899         d = &twin.encryption;
900         d->label.iov_base = "SMBS2CCipherKey";
901         d->label.iov_len = 16;
902         d->context.iov_base = sess->Preauth_HashValue;
903         d->context.iov_len = 64;
904
905         d = &twin.decryption;
906         d->label.iov_base = "SMBC2SCipherKey";
907         d->label.iov_len = 16;
908         d->context.iov_base = sess->Preauth_HashValue;
909         d->context.iov_len = 64;
910
911         return generate_smb3encryptionkey(conn, sess, &twin);
912 }
913
914 int ksmbd_gen_preauth_integrity_hash(struct ksmbd_conn *conn, char *buf,
915                                      __u8 *pi_hash)
916 {
917         int rc;
918         struct smb2_hdr *rcv_hdr = smb2_get_msg(buf);
919         char *all_bytes_msg = (char *)&rcv_hdr->ProtocolId;
920         int msg_size = get_rfc1002_len(buf);
921         struct ksmbd_crypto_ctx *ctx = NULL;
922
923         if (conn->preauth_info->Preauth_HashId !=
924             SMB2_PREAUTH_INTEGRITY_SHA512)
925                 return -EINVAL;
926
927         ctx = ksmbd_crypto_ctx_find_sha512();
928         if (!ctx) {
929                 ksmbd_debug(AUTH, "could not alloc sha512\n");
930                 return -ENOMEM;
931         }
932
933         rc = crypto_shash_init(CRYPTO_SHA512(ctx));
934         if (rc) {
935                 ksmbd_debug(AUTH, "could not init shashn");
936                 goto out;
937         }
938
939         rc = crypto_shash_update(CRYPTO_SHA512(ctx), pi_hash, 64);
940         if (rc) {
941                 ksmbd_debug(AUTH, "could not update with n\n");
942                 goto out;
943         }
944
945         rc = crypto_shash_update(CRYPTO_SHA512(ctx), all_bytes_msg, msg_size);
946         if (rc) {
947                 ksmbd_debug(AUTH, "could not update with n\n");
948                 goto out;
949         }
950
951         rc = crypto_shash_final(CRYPTO_SHA512(ctx), pi_hash);
952         if (rc) {
953                 ksmbd_debug(AUTH, "Could not generate hash err : %d\n", rc);
954                 goto out;
955         }
956 out:
957         ksmbd_release_crypto_ctx(ctx);
958         return rc;
959 }
960
961 int ksmbd_gen_sd_hash(struct ksmbd_conn *conn, char *sd_buf, int len,
962                       __u8 *pi_hash)
963 {
964         int rc;
965         struct ksmbd_crypto_ctx *ctx = NULL;
966
967         ctx = ksmbd_crypto_ctx_find_sha256();
968         if (!ctx) {
969                 ksmbd_debug(AUTH, "could not alloc sha256\n");
970                 return -ENOMEM;
971         }
972
973         rc = crypto_shash_init(CRYPTO_SHA256(ctx));
974         if (rc) {
975                 ksmbd_debug(AUTH, "could not init shashn");
976                 goto out;
977         }
978
979         rc = crypto_shash_update(CRYPTO_SHA256(ctx), sd_buf, len);
980         if (rc) {
981                 ksmbd_debug(AUTH, "could not update with n\n");
982                 goto out;
983         }
984
985         rc = crypto_shash_final(CRYPTO_SHA256(ctx), pi_hash);
986         if (rc) {
987                 ksmbd_debug(AUTH, "Could not generate hash err : %d\n", rc);
988                 goto out;
989         }
990 out:
991         ksmbd_release_crypto_ctx(ctx);
992         return rc;
993 }
994
995 static int ksmbd_get_encryption_key(struct ksmbd_work *work, __u64 ses_id,
996                                     int enc, u8 *key)
997 {
998         struct ksmbd_session *sess;
999         u8 *ses_enc_key;
1000
1001         if (enc)
1002                 sess = work->sess;
1003         else
1004                 sess = ksmbd_session_lookup_all(work->conn, ses_id);
1005         if (!sess)
1006                 return -EINVAL;
1007
1008         ses_enc_key = enc ? sess->smb3encryptionkey :
1009                 sess->smb3decryptionkey;
1010         memcpy(key, ses_enc_key, SMB3_ENC_DEC_KEY_SIZE);
1011
1012         return 0;
1013 }
1014
1015 static inline void smb2_sg_set_buf(struct scatterlist *sg, const void *buf,
1016                                    unsigned int buflen)
1017 {
1018         void *addr;
1019
1020         if (is_vmalloc_addr(buf))
1021                 addr = vmalloc_to_page(buf);
1022         else
1023                 addr = virt_to_page(buf);
1024         sg_set_page(sg, addr, buflen, offset_in_page(buf));
1025 }
1026
1027 static struct scatterlist *ksmbd_init_sg(struct kvec *iov, unsigned int nvec,
1028                                          u8 *sign)
1029 {
1030         struct scatterlist *sg;
1031         unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 20;
1032         int i, nr_entries[3] = {0}, total_entries = 0, sg_idx = 0;
1033
1034         if (!nvec)
1035                 return NULL;
1036
1037         for (i = 0; i < nvec - 1; i++) {
1038                 unsigned long kaddr = (unsigned long)iov[i + 1].iov_base;
1039
1040                 if (is_vmalloc_addr(iov[i + 1].iov_base)) {
1041                         nr_entries[i] = ((kaddr + iov[i + 1].iov_len +
1042                                         PAGE_SIZE - 1) >> PAGE_SHIFT) -
1043                                 (kaddr >> PAGE_SHIFT);
1044                 } else {
1045                         nr_entries[i]++;
1046                 }
1047                 total_entries += nr_entries[i];
1048         }
1049
1050         /* Add two entries for transform header and signature */
1051         total_entries += 2;
1052
1053         sg = kmalloc_array(total_entries, sizeof(struct scatterlist), GFP_KERNEL);
1054         if (!sg)
1055                 return NULL;
1056
1057         sg_init_table(sg, total_entries);
1058         smb2_sg_set_buf(&sg[sg_idx++], iov[0].iov_base + 24, assoc_data_len);
1059         for (i = 0; i < nvec - 1; i++) {
1060                 void *data = iov[i + 1].iov_base;
1061                 int len = iov[i + 1].iov_len;
1062
1063                 if (is_vmalloc_addr(data)) {
1064                         int j, offset = offset_in_page(data);
1065
1066                         for (j = 0; j < nr_entries[i]; j++) {
1067                                 unsigned int bytes = PAGE_SIZE - offset;
1068
1069                                 if (!len)
1070                                         break;
1071
1072                                 if (bytes > len)
1073                                         bytes = len;
1074
1075                                 sg_set_page(&sg[sg_idx++],
1076                                             vmalloc_to_page(data), bytes,
1077                                             offset_in_page(data));
1078
1079                                 data += bytes;
1080                                 len -= bytes;
1081                                 offset = 0;
1082                         }
1083                 } else {
1084                         sg_set_page(&sg[sg_idx++], virt_to_page(data), len,
1085                                     offset_in_page(data));
1086                 }
1087         }
1088         smb2_sg_set_buf(&sg[sg_idx], sign, SMB2_SIGNATURE_SIZE);
1089         return sg;
1090 }
1091
1092 int ksmbd_crypt_message(struct ksmbd_work *work, struct kvec *iov,
1093                         unsigned int nvec, int enc)
1094 {
1095         struct ksmbd_conn *conn = work->conn;
1096         struct smb2_transform_hdr *tr_hdr = smb2_get_msg(iov[0].iov_base);
1097         unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 20;
1098         int rc;
1099         struct scatterlist *sg;
1100         u8 sign[SMB2_SIGNATURE_SIZE] = {};
1101         u8 key[SMB3_ENC_DEC_KEY_SIZE];
1102         struct aead_request *req;
1103         char *iv;
1104         unsigned int iv_len;
1105         struct crypto_aead *tfm;
1106         unsigned int crypt_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
1107         struct ksmbd_crypto_ctx *ctx;
1108
1109         rc = ksmbd_get_encryption_key(work,
1110                                       le64_to_cpu(tr_hdr->SessionId),
1111                                       enc,
1112                                       key);
1113         if (rc) {
1114                 pr_err("Could not get %scryption key\n", enc ? "en" : "de");
1115                 return rc;
1116         }
1117
1118         if (conn->cipher_type == SMB2_ENCRYPTION_AES128_GCM ||
1119             conn->cipher_type == SMB2_ENCRYPTION_AES256_GCM)
1120                 ctx = ksmbd_crypto_ctx_find_gcm();
1121         else
1122                 ctx = ksmbd_crypto_ctx_find_ccm();
1123         if (!ctx) {
1124                 pr_err("crypto alloc failed\n");
1125                 return -ENOMEM;
1126         }
1127
1128         if (conn->cipher_type == SMB2_ENCRYPTION_AES128_GCM ||
1129             conn->cipher_type == SMB2_ENCRYPTION_AES256_GCM)
1130                 tfm = CRYPTO_GCM(ctx);
1131         else
1132                 tfm = CRYPTO_CCM(ctx);
1133
1134         if (conn->cipher_type == SMB2_ENCRYPTION_AES256_CCM ||
1135             conn->cipher_type == SMB2_ENCRYPTION_AES256_GCM)
1136                 rc = crypto_aead_setkey(tfm, key, SMB3_GCM256_CRYPTKEY_SIZE);
1137         else
1138                 rc = crypto_aead_setkey(tfm, key, SMB3_GCM128_CRYPTKEY_SIZE);
1139         if (rc) {
1140                 pr_err("Failed to set aead key %d\n", rc);
1141                 goto free_ctx;
1142         }
1143
1144         rc = crypto_aead_setauthsize(tfm, SMB2_SIGNATURE_SIZE);
1145         if (rc) {
1146                 pr_err("Failed to set authsize %d\n", rc);
1147                 goto free_ctx;
1148         }
1149
1150         req = aead_request_alloc(tfm, GFP_KERNEL);
1151         if (!req) {
1152                 rc = -ENOMEM;
1153                 goto free_ctx;
1154         }
1155
1156         if (!enc) {
1157                 memcpy(sign, &tr_hdr->Signature, SMB2_SIGNATURE_SIZE);
1158                 crypt_len += SMB2_SIGNATURE_SIZE;
1159         }
1160
1161         sg = ksmbd_init_sg(iov, nvec, sign);
1162         if (!sg) {
1163                 pr_err("Failed to init sg\n");
1164                 rc = -ENOMEM;
1165                 goto free_req;
1166         }
1167
1168         iv_len = crypto_aead_ivsize(tfm);
1169         iv = kzalloc(iv_len, GFP_KERNEL);
1170         if (!iv) {
1171                 rc = -ENOMEM;
1172                 goto free_sg;
1173         }
1174
1175         if (conn->cipher_type == SMB2_ENCRYPTION_AES128_GCM ||
1176             conn->cipher_type == SMB2_ENCRYPTION_AES256_GCM) {
1177                 memcpy(iv, (char *)tr_hdr->Nonce, SMB3_AES_GCM_NONCE);
1178         } else {
1179                 iv[0] = 3;
1180                 memcpy(iv + 1, (char *)tr_hdr->Nonce, SMB3_AES_CCM_NONCE);
1181         }
1182
1183         aead_request_set_crypt(req, sg, sg, crypt_len, iv);
1184         aead_request_set_ad(req, assoc_data_len);
1185         aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL);
1186
1187         if (enc)
1188                 rc = crypto_aead_encrypt(req);
1189         else
1190                 rc = crypto_aead_decrypt(req);
1191         if (rc)
1192                 goto free_iv;
1193
1194         if (enc)
1195                 memcpy(&tr_hdr->Signature, sign, SMB2_SIGNATURE_SIZE);
1196
1197 free_iv:
1198         kfree(iv);
1199 free_sg:
1200         kfree(sg);
1201 free_req:
1202         kfree(req);
1203 free_ctx:
1204         ksmbd_release_crypto_ctx(ctx);
1205         return rc;
1206 }