iscsi_text.c revision 1.6.2.1 1 /* $NetBSD: iscsi_text.c,v 1.6.2.1 2014/08/20 00:03:39 tls Exp $ */
2
3 /*-
4 * Copyright (c) 2005,2006,2011 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Wasabi Systems, Inc.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 #include "iscsi_globals.h"
33 #include "base64.h"
34 #include <sys/md5.h>
35 #include <sys/cprng.h>
36
37 /* define to send T_BIGNUM in hex format instead of base64 */
38 /* #define ISCSI_HEXBIGNUMS */
39
40 #define isdigit(x) ((x) >= '0' && (x) <= '9')
41 #define toupper(x) ((x) & ~0x20)
42
43 /*****************************************************************************/
44
45 #define MAX_STRING 255 /* Maximum length of parameter value */
46 #define MAX_LIST 4 /* Maximum number of list elements we'll ever send */
47
48 /* Maximum number of negotiation parameters in the operational negotiation phase */
49 /* 48 should be more than enough even with the target defining its own keys */
50 #define MAX_NEG 48
51
52 #define CHAP_CHALLENGE_LEN 32 /* Number of bytes to send in challenge */
53 #define CHAP_MD5_SIZE 16 /* Number of bytes in MD5 hash */
54
55 /*****************************************************************************/
56
57 /* authentication states */
58
59 typedef enum
60 {
61 AUTH_INITIAL, /* sending choice of algorithms */
62 AUTH_METHOD_SELECTED, /* received choice, sending first parameter */
63 /* from here it's alg dependent */
64 AUTH_CHAP_ALG_SENT, /* CHAP: Algorithm selected */
65 AUTH_CHAP_RSP_SENT, /* CHAP: Response sent */
66 /* for all algorithms */
67 AUTH_DONE /* in parameter negotiation stage */
68 } auth_state_t;
69
70
71 /* enumeration of all the keys we know, and a place for the ones we don't */
72
73 typedef enum
74 {
75 K_AuthMethod,
76 K_Auth_CHAP_Algorithm,
77 K_Auth_CHAP_Challenge,
78 K_Auth_CHAP_Identifier,
79 K_Auth_CHAP_Name,
80 K_Auth_CHAP_Response,
81 K_DataDigest,
82 K_DataPDUInOrder,
83 K_DataSequenceInOrder,
84 K_DefaultTime2Retain,
85 K_DefaultTime2Wait,
86 K_ErrorRecoveryLevel,
87 K_FirstBurstLength,
88 K_HeaderDigest,
89 K_IFMarker,
90 K_IFMarkInt,
91 K_ImmediateData,
92 K_InitialR2T,
93 K_InitiatorAlias,
94 K_InitiatorName,
95 K_MaxBurstLength,
96 K_MaxConnections,
97 K_MaxOutstandingR2T,
98 K_MaxRecvDataSegmentLength,
99 K_OFMarker,
100 K_OFMarkInt,
101 K_SendTargets,
102 K_SessionType,
103 K_TargetAddress,
104 K_TargetAlias,
105 K_TargetName,
106 K_TargetPortalGroupTag,
107 K_NotUnderstood
108 } text_key_t;
109
110 /* maximum known key */
111 #define MAX_KEY K_TargetPortalGroupTag
112
113
114 #undef DEBOUT
115 #define DEBOUT(x) printf x
116
117
118
119 /* value types */
120 typedef enum
121 { /* Value is... */
122 T_NUM, /* numeric */
123 T_BIGNUM, /* large numeric */
124 T_STRING, /* string */
125 T_YESNO, /* boolean (Yes or No) */
126 T_AUTH, /* authentication type (CHAP or None for now) */
127 T_DIGEST, /* digest (None or CRC32C) */
128 T_RANGE, /* numeric range */
129 T_SENDT, /* send target options (ALL, target-name, empty) */
130 T_SESS /* session type (Discovery or Normal) */
131 } val_kind_t;
132
133
134 /* table of negotiation key strings with value type and default */
135
136 typedef struct
137 {
138 const uint8_t *name; /* the key name */
139 val_kind_t val; /* the value type */
140 uint32_t defval; /* default value */
141 } key_entry_t;
142
143 STATIC key_entry_t entries[] = {
144 {"AuthMethod", T_AUTH, 0},
145 {"CHAP_A", T_NUM, 5},
146 {"CHAP_C", T_BIGNUM, 0},
147 {"CHAP_I", T_NUM, 0},
148 {"CHAP_N", T_STRING, 0},
149 {"CHAP_R", T_BIGNUM, 0},
150 {"DataDigest", T_DIGEST, 0},
151 {"DataPDUInOrder", T_YESNO, 1},
152 {"DataSequenceInOrder", T_YESNO, 1},
153 {"DefaultTime2Retain", T_NUM, 20},
154 {"DefaultTime2Wait", T_NUM, 2},
155 {"ErrorRecoveryLevel", T_NUM, 0},
156 {"FirstBurstLength", T_NUM, 64 * 1024},
157 {"HeaderDigest", T_DIGEST, 0},
158 {"IFMarker", T_YESNO, 0},
159 {"IFMarkInt", T_RANGE, 2048},
160 {"ImmediateData", T_YESNO, 1},
161 {"InitialR2T", T_YESNO, 1},
162 {"InitiatorAlias", T_STRING, 0},
163 {"InitiatorName", T_STRING, 0},
164 {"MaxBurstLength", T_NUM, 256 * 1024},
165 {"MaxConnections", T_NUM, 1},
166 {"MaxOutstandingR2T", T_NUM, 1},
167 {"MaxRecvDataSegmentLength", T_NUM, 8192},
168 {"OFMarker", T_YESNO, 0},
169 {"OFMarkInt", T_RANGE, 2048},
170 {"SendTargets", T_SENDT, 0},
171 {"SessionType", T_SESS, 0},
172 {"TargetAddress", T_STRING, 0},
173 {"TargetAlias", T_STRING, 0},
174 {"TargetName", T_STRING, 0},
175 {"TargetPortalGroupTag", T_NUM, 0},
176 {NULL, T_STRING, 0}
177 };
178
179 /* a negotiation parameter: key and values (there may be more than 1 for lists) */
180 typedef struct
181 {
182 text_key_t key; /* the key */
183 int list_num; /* number of elements in list, doubles as */
184 /* data size for large numeric values */
185 union
186 {
187 uint32_t nval[MAX_LIST]; /* numeric or enumeration values */
188 uint8_t *sval; /* string or data pointer */
189 } val;
190 } negotiation_parameter_t;
191
192
193 /* Negotiation state flags */
194 #define NS_SENT 0x01 /* key was sent to target */
195 #define NS_RECEIVED 0x02 /* key was received from target */
196
197 typedef struct
198 {
199 negotiation_parameter_t pars[MAX_NEG]; /* the parameters to send */
200 negotiation_parameter_t *cpar; /* the last parameter set */
201 uint16_t num_pars; /* number of parameters to send */
202 auth_state_t auth_state; /* authentication state */
203 iscsi_auth_types_t auth_alg; /* authentication algorithm */
204 uint8_t kflags[MAX_KEY + 2]; /* negotiation flags for each key */
205 uint8_t password[MAX_STRING + 1]; /* authentication secret */
206 uint8_t target_password[MAX_STRING + 1]; /* target authentication secret */
207 uint8_t user_name[MAX_STRING + 1]; /* authentication user ID */
208 uint8_t temp_buf[MAX_STRING + 1]; /* scratch buffer */
209
210 bool HeaderDigest;
211 bool DataDigest;
212 bool InitialR2T;
213 bool ImmediateData;
214 uint32_t ErrorRecoveryLevel;
215 uint32_t MaxRecvDataSegmentLength;
216 uint32_t MaxConnections;
217 uint32_t DefaultTime2Wait;
218 uint32_t DefaultTime2Retain;
219 uint32_t MaxBurstLength;
220 uint32_t FirstBurstLength;
221 uint32_t MaxOutstandingR2T;
222
223 } negotiation_state_t;
224
225
226 #define TX(state, key) (state->kflags [key] & NS_SENT)
227 #define RX(state, key) (state->kflags [key] & NS_RECEIVED)
228
229 /*****************************************************************************/
230
231
232 STATIC void
233 chap_md5_response(uint8_t *buffer, uint8_t identifier, uint8_t *secret,
234 uint8_t *challenge, int challenge_size)
235 {
236 MD5_CTX md5;
237
238 MD5Init(&md5);
239 MD5Update(&md5, &identifier, 1);
240 MD5Update(&md5, secret, strlen(secret));
241 MD5Update(&md5, challenge, challenge_size);
242 MD5Final(buffer, &md5);
243 }
244
245
246 /*****************************************************************************/
247
248 /*
249 * hexdig:
250 * Return value of hex digit.
251 * Note: a null character is acceptable, and returns 0.
252 *
253 * Parameter:
254 * c The character
255 *
256 * Returns: The value, -1 on error.
257 */
258
259 static __inline int
260 hexdig(uint8_t c)
261 {
262
263 if (!c) {
264 return 0;
265 }
266 if (isdigit(c)) {
267 return c - '0';
268 }
269 c = toupper(c);
270 if (c >= 'A' && c <= 'F') {
271 return c - 'A' + 10;
272 }
273 return -1;
274 }
275
276 /*
277 * skiptozero:
278 * Skip to next zero character in buffer.
279 *
280 * Parameter:
281 * buf The buffer pointer
282 *
283 * Returns: The pointer to the character after the zero character.
284 */
285
286 static __inline uint8_t *
287 skiptozero(uint8_t *buf)
288 {
289
290 while (*buf) {
291 buf++;
292 }
293 return buf + 1;
294 }
295
296
297 /*
298 * get_bignumval:
299 * Get a large numeric value.
300 * NOTE: Overwrites source string.
301 *
302 * Parameter:
303 * buf The buffer pointer
304 * par The parameter
305 *
306 * Returns: The pointer to the next parameter, NULL on error.
307 */
308
309 STATIC uint8_t *
310 get_bignumval(uint8_t *buf, negotiation_parameter_t *par)
311 {
312 int val;
313 char c;
314 uint8_t *dp = buf;
315
316 par->val.sval = buf;
317
318 if (buf[0] == '0' && (buf[1] == 'x' || buf[1] == 'X')) {
319 buf += 2;
320 while ((c = *buf) != 0x0) {
321 buf++;
322 val = (hexdig(c) << 4) | hexdig(*buf);
323 if (val < 0) {
324 return NULL;
325 }
326 *dp++ = (uint8_t) val;
327 if (*buf) {
328 buf++;
329 }
330 }
331 buf++;
332 par->list_num = dp - par->val.sval;
333 } else if (buf[0] == '0' && (buf[1] == 'b' || buf[1] == 'B')) {
334 buf = base64_decode(&buf[2], par->val.sval, &par->list_num);
335 } else {
336 DEBOUT(("Ill-formatted large number <%s>\n", buf));
337 return NULL;
338 }
339
340 return buf;
341 }
342
343
344 /*
345 * get_numval:
346 * Get a numeric value.
347 *
348 * Parameter:
349 * buf The buffer pointer
350 * pval The pointer to the result.
351 *
352 * Returns: The pointer to the next parameter, NULL on error.
353 */
354
355 STATIC uint8_t *
356 get_numval(uint8_t *buf, uint32_t *pval)
357 {
358 uint32_t val = 0;
359 char c;
360
361 if (buf[0] == '0' && (buf[1] == 'x' || buf[1] == 'X')) {
362 buf += 2;
363 while (*buf && *buf != '~') {
364 int n;
365
366 if ((n = hexdig(*buf++)) < 0)
367 return NULL;
368 val = (val << 4) | n;
369 }
370 } else
371 while (*buf && *buf != '~') {
372 c = *buf++;
373 if (!isdigit(c))
374 return NULL;
375 val = val * 10 + (c - '0');
376 }
377
378 *pval = val;
379
380 return buf + 1;
381 }
382
383
384 /*
385 * get_range:
386 * Get a numeric range.
387 *
388 * Parameter:
389 * buf The buffer pointer
390 * pval1 The pointer to the first result.
391 * pval2 The pointer to the second result.
392 *
393 * Returns: The pointer to the next parameter, NULL on error.
394 */
395
396 STATIC uint8_t *
397 get_range(uint8_t *buf, uint32_t *pval1, uint32_t *pval2)
398 {
399
400 if ((buf = get_numval(buf, pval1)) == NULL)
401 return NULL;
402 if (!*buf)
403 return NULL;
404 if ((buf = get_numval(buf, pval2)) == NULL)
405 return NULL;
406 return buf;
407 }
408
409
410 /*
411 * get_ynval:
412 * Get a yes/no selection.
413 *
414 * Parameter:
415 * buf The buffer pointer
416 * pval The pointer to the result.
417 *
418 * Returns: The pointer to the next parameter, NULL on error.
419 */
420
421 STATIC uint8_t *
422 get_ynval(uint8_t *buf, uint32_t *pval)
423 {
424
425 if (strcmp(buf, "Yes") == 0)
426 *pval = 1;
427 else if (strcmp(buf, "No") == 0)
428 *pval = 0;
429 else
430 return NULL;
431
432 return skiptozero(buf);
433 }
434
435
436 /*
437 * get_digestval:
438 * Get a digest selection.
439 *
440 * Parameter:
441 * buf The buffer pointer
442 * pval The pointer to the result.
443 *
444 * Returns: The pointer to the next parameter, NULL on error.
445 */
446
447 STATIC uint8_t *
448 get_digestval(uint8_t *buf, uint32_t *pval)
449 {
450
451 if (strcmp(buf, "CRC32C") == 0)
452 *pval = 1;
453 else if (strcmp(buf, "None") == 0)
454 *pval = 0;
455 else
456 return NULL;
457
458 return skiptozero(buf);
459 }
460
461
462 /*
463 * get_authval:
464 * Get an authentication method.
465 *
466 * Parameter:
467 * buf The buffer pointer
468 * pval The pointer to the result.
469 *
470 * Returns: The pointer to the next parameter, NULL on error.
471 */
472
473 STATIC uint8_t *
474 get_authval(uint8_t *buf, uint32_t *pval)
475 {
476
477 if (strcmp(buf, "None") == 0)
478 *pval = ISCSI_AUTH_None;
479 else if (strcmp(buf, "CHAP") == 0)
480 *pval = ISCSI_AUTH_CHAP;
481 else if (strcmp(buf, "KRB5") == 0)
482 *pval = ISCSI_AUTH_KRB5;
483 else if (strcmp(buf, "SRP") == 0)
484 *pval = ISCSI_AUTH_SRP;
485 else
486 return NULL;
487
488 return skiptozero(buf);
489 }
490
491
492 /*
493 * get_strval:
494 * Get a string value (returns pointer to original buffer, not a copy).
495 *
496 * Parameter:
497 * buf The buffer pointer
498 * pval The pointer to the result pointer.
499 *
500 * Returns: The pointer to the next parameter, NULL on error.
501 */
502
503 STATIC uint8_t *
504 get_strval(uint8_t *buf, uint8_t **pval)
505 {
506
507 if (strlen(buf) > MAX_STRING)
508 return NULL;
509
510 *pval = buf;
511
512 return skiptozero(buf);
513 }
514
515
516 /*
517 * get_parameter:
518 * Analyze a key=value string.
519 * NOTE: The string is modified in the process.
520 *
521 * Parameter:
522 * buf The buffer pointer
523 * par The parameter descriptor to be filled in
524 *
525 * Returns: The pointer to the next parameter, NULL on error.
526 */
527
528 STATIC uint8_t *
529 get_parameter(uint8_t *buf, negotiation_parameter_t *par)
530 {
531 uint8_t *bp = buf;
532 int i;
533
534 while (*bp && *bp != '=') {
535 bp++;
536 }
537 if (!*bp) {
538 DEBOUT(("get_parameter: Premature end of parameter\n"));
539 return NULL;
540 }
541
542 *bp++ = 0;
543
544 for (i = 0; i <= MAX_KEY; i++)
545 if (!strcmp(buf, entries[i].name))
546 break;
547
548 par->key = i;
549 par->list_num = 1;
550
551 if (i > MAX_KEY) {
552 DEBOUT(("get_parameter: unrecognized key <%s>\n", buf));
553 if (strlen(buf) > MAX_STRING) {
554 DEBOUT(("get_parameter: key name > MAX_STRING\n"));
555 return NULL;
556 }
557 par->val.sval = buf;
558 return skiptozero(bp);
559 }
560
561 DEB(10, ("get_par: key <%s>=%d, val=%d, ret %p\n",
562 buf, i, entries[i].val, bp));
563 DEB(10, ("get_par: value '%s'\n",bp));
564
565 switch (entries[i].val) {
566 case T_NUM:
567 bp = get_numval(bp, &par->val.nval[0]);
568 break;
569
570 case T_BIGNUM:
571 bp = get_bignumval(bp, par);
572 break;
573
574 case T_STRING:
575 bp = get_strval(bp, &par->val.sval);
576 break;
577
578 case T_YESNO:
579 bp = get_ynval(bp, &par->val.nval[0]);
580 break;
581
582 case T_AUTH:
583 bp = get_authval(bp, &par->val.nval[0]);
584 break;
585
586 case T_DIGEST:
587 bp = get_digestval(bp, &par->val.nval[0]);
588 break;
589
590 case T_RANGE:
591 bp = get_range(bp, &par->val.nval[0], &par->val.nval[1]);
592 break;
593
594 default:
595 /* Target sending any other types is wrong */
596 bp = NULL;
597 break;
598 }
599 return bp;
600 }
601
602 /*****************************************************************************/
603
604 /*
605 * my_strcpy:
606 * Replacement for strcpy that returns the end of the result string
607 *
608 * Parameter:
609 * dest The destination buffer pointer
610 * src The source string
611 *
612 * Returns: A pointer to the terminating zero of the result.
613 */
614
615 static __inline unsigned
616 my_strcpy(uint8_t *dest, const uint8_t *src)
617 {
618 unsigned cc;
619
620 for (cc = 0 ; (*dest = *src) != 0x0 ; cc++) {
621 dest++;
622 src++;
623 }
624 return cc;
625 }
626
627 /*
628 * put_bignumval:
629 * Write a large numeric value.
630 * NOTE: Overwrites source string.
631 *
632 * Parameter:
633 * buf The buffer pointer
634 * par The parameter
635 *
636 * Returns: The pointer to the next parameter, NULL on error.
637 */
638
639 STATIC unsigned
640 put_bignumval(negotiation_parameter_t *par, uint8_t *buf)
641 {
642 #ifdef ISCSI_HEXBIGNUMS
643 int k, c;
644
645 my_strcpy(buf, "0x");
646 for (k=0; k<par->list_num; ++k) {
647 c = par->val.sval[k] >> 4;
648 buf[2+2*k] = c < 10 ? '0' + c : 'a' + (c-10);
649 c = par->val.sval[k] & 0xf;
650 buf[2+2*k+1] = c < 10 ? '0' + c : 'a' + (c-10);
651 }
652 buf[2+2*k] = '\0';
653
654 return 2+2*par->list_num;
655 #else
656 return base64_encode(par->val.sval, par->list_num, buf);
657 #endif
658 }
659
660 /*
661 * put_parameter:
662 * Create a key=value string.
663 *
664 * Parameter:
665 * buf The buffer pointer
666 * par The parameter descriptor
667 *
668 * Returns: The pointer to the next free buffer space, NULL on error.
669 */
670
671 STATIC unsigned
672 put_parameter(uint8_t *buf, unsigned len, negotiation_parameter_t *par)
673 {
674 int i;
675 unsigned cc, cl;
676 const uint8_t *sp;
677
678 DEB(10, ("put_par: key <%s>=%d, val=%d\n",
679 entries[par->key].name, par->key, entries[par->key].val));
680
681 if (par->key > MAX_KEY) {
682 return snprintf(buf, len, "%s=NotUnderstood", par->val.sval);
683 }
684
685 cc = snprintf(buf, len, "%s=", entries[par->key].name);
686 if (cc >= len)
687 return len;
688
689 for (i = 0; i < par->list_num; i++) {
690 switch (entries[par->key].val) {
691 case T_NUM:
692 cl = snprintf(&buf[cc], len - cc, "%d",
693 par->val.nval[i]);
694 break;
695
696 case T_BIGNUM:
697 cl = put_bignumval(par, &buf[cc]);
698 i = par->list_num;
699 break;
700
701 case T_STRING:
702 cl = my_strcpy(&buf[cc], par->val.sval);
703 break;
704
705 case T_YESNO:
706 cl = my_strcpy(&buf[cc],
707 (par->val.nval[i]) ? "Yes" : "No");
708 break;
709
710 case T_AUTH:
711 switch (par->val.nval[i]) {
712 case ISCSI_AUTH_CHAP:
713 sp = "CHAP";
714 break;
715 case ISCSI_AUTH_KRB5:
716 sp = "KRB5";
717 break;
718 case ISCSI_AUTH_SRP:
719 sp = "SRP";
720 break;
721 default:
722 sp = "None";
723 break;
724 }
725 cl = my_strcpy(&buf[cc], sp);
726 break;
727
728 case T_DIGEST:
729 cl = my_strcpy(&buf[cc],
730 (par->val.nval[i]) ? "CRC32C" : "None");
731 break;
732
733 case T_RANGE:
734 if ((i + 1) >= par->list_num) {
735 cl = my_strcpy(&buf[cc], "Reject");
736 } else {
737 cl = snprintf(&buf[cc], len - cc,
738 "%d~%d", par->val.nval[i],
739 par->val.nval[i + 1]);
740 i++;
741 }
742 break;
743
744 case T_SENDT:
745 cl = my_strcpy(&buf[cc], par->val.sval);
746 break;
747
748 case T_SESS:
749 cl = my_strcpy(&buf[cc],
750 (par->val.nval[i]) ? "Normal" : "Discovery");
751 break;
752
753 default:
754 cl = 0;
755 /* We should't be here... */
756 DEBOUT(("Invalid type %d in put_parameter!\n",
757 entries[par->key].val));
758 break;
759 }
760
761 DEB(10, ("put_par: value '%s'\n",&buf[cc]));
762
763 cc += cl;
764 if (cc >= len)
765 return len;
766 if ((i + 1) < par->list_num) {
767 if (cc >= len)
768 return len;
769 buf[cc++] = ',';
770 }
771 }
772
773 if (cc >= len)
774 return len;
775 buf[cc] = 0x0; /* make sure it's terminated */
776 return cc + 1; /* return next place in list */
777 }
778
779
780 /*
781 * put_par_block:
782 * Fill a parameter block
783 *
784 * Parameter:
785 * buf The buffer pointer
786 * pars The parameter descriptor array
787 * n The number of elements
788 *
789 * Returns: result from put_parameter (ptr to buffer, NULL on error)
790 */
791
792 static __inline unsigned
793 put_par_block(uint8_t *buf, unsigned len, negotiation_parameter_t *pars, int n)
794 {
795 unsigned cc;
796 int i;
797
798 for (cc = 0, i = 0; i < n; i++) {
799 cc += put_parameter(&buf[cc], len - cc, pars++);
800 if (cc >= len) {
801 break;
802 }
803 }
804 return cc;
805 }
806
807 /*
808 * parameter_size:
809 * Determine the size of a key=value string.
810 *
811 * Parameter:
812 * par The parameter descriptor
813 *
814 * Returns: The size of the resulting string.
815 */
816
817 STATIC int
818 parameter_size(negotiation_parameter_t *par)
819 {
820 int i, size;
821 char buf[24]; /* max. 2 10-digit numbers + sep. */
822
823 if (par->key > MAX_KEY) {
824 return strlen(par->val.sval) + 15;
825 }
826 /* count '=' and terminal zero */
827 size = strlen(entries[par->key].name) + 2;
828
829 for (i = 0; i < par->list_num; i++) {
830 switch (entries[par->key].val) {
831 case T_NUM:
832 size += snprintf(buf, sizeof(buf), "%d",
833 par->val.nval[i]);
834 break;
835
836 case T_BIGNUM:
837 /* list_num holds value size */
838 #ifdef ISCSI_HEXBIGNUMS
839 size += 2 + 2*par->list_num;
840 #else
841 size += base64_enclen(par->list_num);
842 #endif
843 i = par->list_num;
844 break;
845
846 case T_STRING:
847 case T_SENDT:
848 size += strlen(par->val.sval);
849 break;
850
851 case T_YESNO:
852 size += (par->val.nval[i]) ? 3 : 2;
853 break;
854
855 case T_AUTH:
856 size += (par->val.nval[i] == ISCSI_AUTH_SRP) ? 3 : 4;
857 break;
858
859 case T_DIGEST:
860 size += (par->val.nval[i]) ? 6 : 4;
861 break;
862
863 case T_RANGE:
864 assert((i + 1) < par->list_num);
865 size += snprintf(buf, sizeof(buf), "%d~%d",
866 par->val.nval[i],
867 par->val.nval[i + 1]);
868 i++;
869 break;
870
871 case T_SESS:
872 size += (par->val.nval[i]) ? 6 : 9;
873 break;
874
875 default:
876 /* We should't be here... */
877 DEBOUT(("Invalid type %d in parameter_size!\n",
878 entries[par->key].val));
879 break;
880 }
881 if ((i + 1) < par->list_num) {
882 size++;
883 }
884 }
885
886 return size;
887 }
888
889
890 /*
891 * total_size:
892 * Determine the size of a negotiation data block
893 *
894 * Parameter:
895 * pars The parameter descriptor array
896 * n The number of elements
897 *
898 * Returns: The size of the block
899 */
900
901 static __inline int
902 total_size(negotiation_parameter_t *pars, int n)
903 {
904 int i, size;
905
906 for (i = 0, size = 0; i < n; i++) {
907 size += parameter_size(pars++);
908 }
909 return size;
910 }
911
912 /*****************************************************************************/
913
914
915 /*
916 * complete_pars:
917 * Allocate space for text parameters, translate parameter values into
918 * text.
919 *
920 * Parameter:
921 * state Negotiation state
922 * pdu The transmit PDU
923 *
924 * Returns: 0 On success
925 * > 0 (an ISCSI error code) if an error occurred.
926 */
927
928 STATIC int
929 complete_pars(negotiation_state_t *state, pdu_t *pdu)
930 {
931 int len;
932 uint8_t *bp;
933 #ifdef ISCSI_TEST_MODE
934 test_pars_t *tp = pdu->connection->test_pars;
935 neg_desc_t *nd = NULL;
936 #endif
937
938 len = total_size(state->pars, state->num_pars);
939
940 #ifdef ISCSI_TEST_MODE
941 if (tp != NULL) {
942 while ((nd = TAILQ_FIRST(&pdu->connection->test_pars->negs)) != NULL &&
943 nd->entry.state < state->auth_state) {
944 TAILQ_REMOVE(&tp->negs, nd, link);
945 free(nd, M_TEMP);
946 }
947 if (nd != NULL && nd->entry.state == state->auth_state) {
948 if (nd->entry.flags & ISCSITEST_NEGOPT_REPLACE)
949 len = 0;
950 len += nd->entry.size;
951 } else
952 nd = NULL;
953 }
954 #endif
955
956 DEB(10, ("complete_pars: n=%d, len=%d\n", state->num_pars, len));
957
958 if ((bp = malloc(len, M_TEMP, M_WAITOK)) == NULL) {
959 DEBOUT(("*** Out of memory in complete_pars\n"));
960 return ISCSI_STATUS_NO_RESOURCES;
961 }
962 pdu->temp_data = bp;
963
964 #ifdef ISCSI_TEST_MODE
965 if (nd == NULL || !(nd->entry.flags & ISCSITEST_NEGOPT_REPLACE))
966 if ((bp = put_par_block(pdu->temp_data, len,
967 state->pars, state->num_pars)) == NULL) {
968 DEBOUT(("Bad parameter in complete_pars\n"));
969 return ISCSI_STATUS_PARAMETER_INVALID;
970 }
971 if (nd != NULL) {
972 memcpy(bp, nd->entry.value, nd->entry.size);
973 TAILQ_REMOVE(&tp->negs, nd, link);
974 free(nd, M_TEMP);
975 }
976 #else
977 if (put_par_block(pdu->temp_data, len, state->pars,
978 state->num_pars) == 0) {
979 DEBOUT(("Bad parameter in complete_pars\n"));
980 return ISCSI_STATUS_PARAMETER_INVALID;
981 }
982 #endif
983
984 pdu->temp_data_len = len;
985 return 0;
986 }
987
988
989 /*
990 * set_key_n:
991 * Initialize a key and its numeric value.
992 *
993 * Parameter:
994 * state Negotiation state
995 * key The key
996 * val The value
997 */
998
999 STATIC negotiation_parameter_t *
1000 set_key_n(negotiation_state_t *state, text_key_t key, uint32_t val)
1001 {
1002 negotiation_parameter_t *par;
1003
1004 if (state->num_pars >= MAX_NEG) {
1005 DEBOUT(("set_key_n: num_pars (%d) >= MAX_NEG (%d)\n",
1006 state->num_pars, MAX_NEG));
1007 return NULL;
1008 }
1009 par = &state->pars[state->num_pars];
1010 par->key = key;
1011 par->list_num = 1;
1012 par->val.nval[0] = val;
1013 state->num_pars++;
1014 state->kflags[key] |= NS_SENT;
1015
1016 return par;
1017 }
1018
1019 /*
1020 * set_key_s:
1021 * Initialize a key and its string value.
1022 *
1023 * Parameter:
1024 * state Negotiation state
1025 * key The key
1026 * val The value
1027 */
1028
1029 STATIC negotiation_parameter_t *
1030 set_key_s(negotiation_state_t *state, text_key_t key, uint8_t *val)
1031 {
1032 negotiation_parameter_t *par;
1033
1034 if (state->num_pars >= MAX_NEG) {
1035 DEBOUT(("set_key_s: num_pars (%d) >= MAX_NEG (%d)\n",
1036 state->num_pars, MAX_NEG));
1037 return NULL;
1038 }
1039 par = &state->pars[state->num_pars];
1040 par->key = key;
1041 par->list_num = 1;
1042 par->val.sval = val;
1043 state->num_pars++;
1044 state->kflags[key] |= NS_SENT;
1045
1046 return par;
1047 }
1048
1049
1050 /*****************************************************************************/
1051
1052 /*
1053 * eval_parameter:
1054 * Evaluate a received negotiation value.
1055 *
1056 * Parameter:
1057 * conn The connection
1058 * state The negotiation state
1059 * par The parameter
1060 *
1061 * Returns: 0 on success, else an ISCSI status value.
1062 */
1063
1064 STATIC int
1065 eval_parameter(connection_t *conn, negotiation_state_t *state,
1066 negotiation_parameter_t *par)
1067 {
1068 uint32_t n = par->val.nval[0];
1069 size_t sz;
1070 text_key_t key = par->key;
1071 bool sent = (state->kflags[key] & NS_SENT) != 0;
1072
1073 state->kflags[key] |= NS_RECEIVED;
1074
1075 switch (key) {
1076 /*
1077 * keys connected to security negotiation
1078 */
1079 case K_AuthMethod:
1080 if (n) {
1081 DEBOUT(("eval_par: AuthMethod nonzero (%d)\n", n));
1082 return ISCSI_STATUS_NEGOTIATION_ERROR;
1083 }
1084 break;
1085
1086 case K_Auth_CHAP_Algorithm:
1087 case K_Auth_CHAP_Challenge:
1088 case K_Auth_CHAP_Identifier:
1089 case K_Auth_CHAP_Name:
1090 case K_Auth_CHAP_Response:
1091 DEBOUT(("eval_par: Authorization Key in Operational Phase\n"));
1092 return ISCSI_STATUS_NEGOTIATION_ERROR;
1093
1094 /*
1095 * keys we always send
1096 */
1097 case K_DataDigest:
1098 state->DataDigest = n;
1099 if (!sent)
1100 set_key_n(state, key, n);
1101 break;
1102
1103 case K_HeaderDigest:
1104 state->HeaderDigest = n;
1105 if (!sent)
1106 set_key_n(state, key, n);
1107 break;
1108
1109 case K_ErrorRecoveryLevel:
1110 state->ErrorRecoveryLevel = n;
1111 if (!sent)
1112 set_key_n(state, key, n);
1113 break;
1114
1115 case K_ImmediateData:
1116 state->ImmediateData = n;
1117 if (!sent)
1118 set_key_n(state, key, n);
1119 break;
1120
1121 case K_InitialR2T:
1122 state->InitialR2T = n;
1123 if (!sent)
1124 set_key_n(state, key, n);
1125 break;
1126
1127 case K_MaxRecvDataSegmentLength:
1128 state->MaxRecvDataSegmentLength = n;
1129 /* this is basically declarative, not negotiated */
1130 /* (each side has its own value) */
1131 break;
1132
1133 /*
1134 * keys we don't always send, so we may have to reflect the value
1135 */
1136 case K_DefaultTime2Retain:
1137 state->DefaultTime2Retain = n = min(state->DefaultTime2Retain, n);
1138 if (!sent)
1139 set_key_n(state, key, n);
1140 break;
1141
1142 case K_DefaultTime2Wait:
1143 state->DefaultTime2Wait = n = min(state->DefaultTime2Wait, n);
1144 if (!sent)
1145 set_key_n(state, key, n);
1146 break;
1147
1148 case K_MaxConnections:
1149 if (state->MaxConnections)
1150 state->MaxConnections = n = min(state->MaxConnections, n);
1151 else
1152 state->MaxConnections = n;
1153
1154 if (!sent)
1155 set_key_n(state, key, n);
1156 break;
1157
1158 case K_MaxOutstandingR2T:
1159 state->MaxOutstandingR2T = n;
1160 if (!sent)
1161 set_key_n(state, key, n);
1162 break;
1163
1164 case K_FirstBurstLength:
1165 state->FirstBurstLength = n;
1166 if (!sent)
1167 set_key_n(state, key, n);
1168 break;
1169
1170 case K_MaxBurstLength:
1171 state->MaxBurstLength = n;
1172 if (!sent)
1173 set_key_n(state, key, n);
1174 break;
1175
1176 case K_IFMarker:
1177 case K_OFMarker:
1178 /* not (yet) supported */
1179 if (!sent)
1180 set_key_n(state, key, 0);
1181 break;
1182
1183 case K_IFMarkInt:
1184 case K_OFMarkInt:
1185 /* it's a range, and list_num will be 1, so this will reply "Reject" */
1186 if (!sent)
1187 set_key_n(state, key, 0);
1188 break;
1189
1190 case K_DataPDUInOrder:
1191 case K_DataSequenceInOrder:
1192 /* values are don't care */
1193 if (!sent)
1194 set_key_n(state, key, n);
1195 break;
1196
1197 case K_NotUnderstood:
1198 /* return "NotUnderstood" */
1199 set_key_s(state, key, par->val.sval);
1200 break;
1201
1202 /*
1203 * Declarative keys (no response required)
1204 */
1205 case K_TargetAddress:
1206 /* ignore for now... */
1207 break;
1208
1209 case K_TargetAlias:
1210 if (conn->login_par->is_present.TargetAlias) {
1211 copyoutstr(par->val.sval, conn->login_par->TargetAlias,
1212 ISCSI_STRING_LENGTH - 1, &sz);
1213 /* do anything with return code?? */
1214 }
1215 break;
1216
1217 case K_TargetPortalGroupTag:
1218 /* ignore for now... */
1219 break;
1220
1221 default:
1222 DEBOUT(("eval_par: Invalid parameter type %d\n", par->key));
1223 return ISCSI_STATUS_NEGOTIATION_ERROR;
1224 }
1225 return 0;
1226 }
1227
1228 /*****************************************************************************/
1229
1230
1231 /*
1232 * init_session_parameters:
1233 * Initialize session-related negotiation parameters from existing session
1234 *
1235 * Parameter:
1236 * sess The session
1237 * state The negotiation state
1238 */
1239
1240 STATIC void
1241 init_session_parameters(session_t *sess, negotiation_state_t *state)
1242 {
1243
1244 state->ErrorRecoveryLevel = sess->ErrorRecoveryLevel;
1245 state->InitialR2T = sess->InitialR2T;
1246 state->ImmediateData = sess->ImmediateData;
1247 state->MaxConnections = sess->MaxConnections;
1248 state->DefaultTime2Wait = sess->DefaultTime2Wait;
1249 state->DefaultTime2Retain = sess->DefaultTime2Retain;
1250 state->MaxBurstLength = sess->MaxBurstLength;
1251 state->FirstBurstLength = sess->FirstBurstLength;
1252 state->MaxOutstandingR2T = sess->MaxOutstandingR2T;
1253 }
1254
1255
1256
1257 /*
1258 * assemble_login_parameters:
1259 * Assemble the initial login negotiation parameters.
1260 *
1261 * Parameter:
1262 * conn The connection
1263 * ccb The CCB for the login exchange
1264 * pdu The PDU to use for sending
1265 *
1266 * Returns: < 0 if more security negotiation is required
1267 * 0 if this is the last security negotiation block
1268 * > 0 (an ISCSI error code) if an error occurred.
1269 */
1270
1271 int
1272 assemble_login_parameters(connection_t *conn, ccb_t *ccb, pdu_t *pdu)
1273 {
1274 iscsi_login_parameters_t *par = conn->login_par;
1275 size_t sz;
1276 int rc, i, next;
1277 negotiation_state_t *state;
1278 negotiation_parameter_t *cpar;
1279
1280 state = malloc(sizeof(*state), M_TEMP, M_WAITOK | M_ZERO);
1281 if (state == NULL) {
1282 DEBOUT(("*** Out of memory in assemble_login_params\n"));
1283 return ISCSI_STATUS_NO_RESOURCES;
1284 }
1285 ccb->temp_data = state;
1286
1287 if (!iscsi_InitiatorName[0]) {
1288 DEBOUT(("No InitiatorName\n"));
1289 return ISCSI_STATUS_PARAMETER_MISSING;
1290 }
1291 set_key_s(state, K_InitiatorName, iscsi_InitiatorName);
1292
1293 if (iscsi_InitiatorAlias[0])
1294 set_key_s(state, K_InitiatorAlias, iscsi_InitiatorAlias);
1295
1296 conn->Our_MaxRecvDataSegmentLength =
1297 (par->is_present.MaxRecvDataSegmentLength)
1298 ? par->MaxRecvDataSegmentLength : DEFAULT_MaxRecvDataSegmentLength;
1299
1300 /* setup some values for authentication */
1301 if (par->is_present.password)
1302 copyinstr(par->password, state->password, MAX_STRING, &sz);
1303 if (par->is_present.target_password)
1304 copyinstr(par->target_password, state->target_password,
1305 MAX_STRING, &sz);
1306 if (par->is_present.user_name)
1307 copyinstr(par->user_name, state->user_name, MAX_STRING, &sz);
1308 else
1309 strlcpy(state->user_name, iscsi_InitiatorName,
1310 sizeof(state->user_name));
1311
1312 next = TRUE;
1313
1314 set_key_n(state, K_SessionType,
1315 par->login_type > ISCSI_LOGINTYPE_DISCOVERY);
1316
1317 cpar = set_key_n(state, K_AuthMethod, ISCSI_AUTH_None);
1318
1319 if (cpar != NULL && par->is_present.auth_info &&
1320 par->auth_info.auth_number > 0) {
1321 if (par->auth_info.auth_number > ISCSI_AUTH_OPTIONS) {
1322 DEBOUT(("Auth number too big in asm_login\n"));
1323 return ISCSI_STATUS_PARAMETER_INVALID;
1324 }
1325 cpar->list_num = par->auth_info.auth_number;
1326 for (i = 0; i < cpar->list_num; i++) {
1327 cpar->val.nval[i] = par->auth_info.auth_type[i];
1328 if (par->auth_info.auth_type[i])
1329 next = FALSE;
1330 }
1331 }
1332
1333 if (par->is_present.TargetName)
1334 copyinstr(par->TargetName, state->temp_buf, ISCSI_STRING_LENGTH - 1,
1335 &sz);
1336 else {
1337 state->temp_buf[0] = 0;
1338 sz = 0;
1339 }
1340
1341 if ((!sz || !state->temp_buf[0]) &&
1342 par->login_type != ISCSI_LOGINTYPE_DISCOVERY) {
1343 DEBOUT(("No TargetName\n"));
1344 return ISCSI_STATUS_PARAMETER_MISSING;
1345 }
1346
1347 if (state->temp_buf[0]) {
1348 set_key_s(state, K_TargetName, state->temp_buf);
1349 }
1350
1351 if ((rc = complete_pars(state, pdu)) != 0)
1352 return rc;
1353
1354 return (next) ? 0 : -1;
1355 }
1356
1357
1358 /*
1359 * assemble_security_parameters:
1360 * Assemble the security negotiation parameters.
1361 *
1362 * Parameter:
1363 * conn The connection
1364 * rx_pdu The received login response PDU
1365 * tx_pdu The transmit PDU
1366 *
1367 * Returns: < 0 if more security negotiation is required
1368 * 0 if this is the last security negotiation block
1369 * > 0 (an ISCSI error code) if an error occurred.
1370 */
1371
1372 int
1373 assemble_security_parameters(connection_t *conn, ccb_t *ccb, pdu_t *rx_pdu,
1374 pdu_t *tx_pdu)
1375 {
1376 negotiation_state_t *state = (negotiation_state_t *) ccb->temp_data;
1377 iscsi_login_parameters_t *par = conn->login_par;
1378 negotiation_parameter_t rxp, *cpar;
1379 uint8_t *rxpars;
1380 int rc, next;
1381 uint8_t identifier = 0;
1382 uint8_t *challenge = NULL;
1383 int challenge_size = 0;
1384 uint8_t *response = NULL;
1385 int response_size = 0;
1386
1387 state->num_pars = 0;
1388 next = 0;
1389
1390 rxpars = (uint8_t *) rx_pdu->temp_data;
1391 if (rxpars == NULL) {
1392 DEBOUT(("No received parameters!\n"));
1393 return ISCSI_STATUS_NEGOTIATION_ERROR;
1394 }
1395 /* Note: There are always at least 2 extra bytes past temp_data_len */
1396 rxpars[rx_pdu->temp_data_len] = '\0';
1397 rxpars[rx_pdu->temp_data_len + 1] = '\0';
1398
1399 while (*rxpars) {
1400 if ((rxpars = get_parameter(rxpars, &rxp)) == NULL) {
1401 DEBOUT(("get_parameter returned error\n"));
1402 return ISCSI_STATUS_NEGOTIATION_ERROR;
1403 }
1404
1405 state->kflags[rxp.key] |= NS_RECEIVED;
1406
1407 switch (rxp.key) {
1408 case K_AuthMethod:
1409 if (state->auth_state != AUTH_INITIAL) {
1410 DEBOUT(("AuthMethod received, auth_state = %d\n",
1411 state->auth_state));
1412 return ISCSI_STATUS_NEGOTIATION_ERROR;
1413 }
1414
1415 /* Note: if the selection is None, we shouldn't be here,
1416 * the target should have transited the state to op-neg.
1417 */
1418 if (rxp.val.nval[0] != ISCSI_AUTH_CHAP) {
1419 DEBOUT(("AuthMethod isn't CHAP (%d)\n", rxp.val.nval[0]));
1420 return ISCSI_STATUS_NEGOTIATION_ERROR;
1421 }
1422
1423 state->auth_state = AUTH_METHOD_SELECTED;
1424 state->auth_alg = rxp.val.nval[0];
1425 break;
1426
1427 case K_Auth_CHAP_Algorithm:
1428 if (state->auth_state != AUTH_CHAP_ALG_SENT ||
1429 rxp.val.nval[0] != 5) {
1430 DEBOUT(("Bad algorithm, auth_state = %d, alg %d\n",
1431 state->auth_state, rxp.val.nval[0]));
1432 return ISCSI_STATUS_NEGOTIATION_ERROR;
1433 }
1434 break;
1435
1436 case K_Auth_CHAP_Challenge:
1437 if (state->auth_state != AUTH_CHAP_ALG_SENT || !rxp.list_num) {
1438 DEBOUT(("Bad Challenge, auth_state = %d, len %d\n",
1439 state->auth_state, rxp.list_num));
1440 return ISCSI_STATUS_NEGOTIATION_ERROR;
1441 }
1442 challenge = rxp.val.sval;
1443 challenge_size = rxp.list_num;
1444 break;
1445
1446 case K_Auth_CHAP_Identifier:
1447 if (state->auth_state != AUTH_CHAP_ALG_SENT) {
1448 DEBOUT(("Bad ID, auth_state = %d, id %d\n",
1449 state->auth_state, rxp.val.nval[0]));
1450 return ISCSI_STATUS_NEGOTIATION_ERROR;
1451 }
1452 identifier = (uint8_t) rxp.val.nval[0];
1453 break;
1454
1455 case K_Auth_CHAP_Name:
1456 if (state->auth_state != AUTH_CHAP_RSP_SENT) {
1457 DEBOUT(("Bad Name, auth_state = %d, name <%s>\n",
1458 state->auth_state, rxp.val.sval));
1459 return ISCSI_STATUS_NEGOTIATION_ERROR;
1460 }
1461 /* what do we do with the name?? */
1462 break;
1463
1464 case K_Auth_CHAP_Response:
1465 if (state->auth_state != AUTH_CHAP_RSP_SENT) {
1466 DEBOUT(("Bad Response, auth_state = %d, size %d\n",
1467 state->auth_state, rxp.list_num));
1468 return ISCSI_STATUS_NEGOTIATION_ERROR;
1469 }
1470 response = rxp.val.sval;
1471 response_size = rxp.list_num;
1472 if (response_size != CHAP_MD5_SIZE)
1473 return ISCSI_STATUS_NEGOTIATION_ERROR;
1474 break;
1475
1476 default:
1477 rc = eval_parameter(conn, state, &rxp);
1478 if (rc)
1479 return rc;
1480 break;
1481 }
1482 }
1483
1484 switch (state->auth_state) {
1485 case AUTH_INITIAL:
1486 DEBOUT(("Didn't receive Method\n"));
1487 return ISCSI_STATUS_NEGOTIATION_ERROR;
1488
1489 case AUTH_METHOD_SELECTED:
1490 set_key_n(state, K_Auth_CHAP_Algorithm, 5);
1491 state->auth_state = AUTH_CHAP_ALG_SENT;
1492 next = -1;
1493 break;
1494
1495 case AUTH_CHAP_ALG_SENT:
1496 if (!RX(state, K_Auth_CHAP_Algorithm) ||
1497 !RX(state, K_Auth_CHAP_Identifier) ||
1498 !RX(state, K_Auth_CHAP_Challenge)) {
1499 DEBOUT(("Didn't receive all parameters\n"));
1500 return ISCSI_STATUS_NEGOTIATION_ERROR;
1501 }
1502
1503 set_key_s(state, K_Auth_CHAP_Name, state->user_name);
1504
1505 chap_md5_response(state->temp_buf, identifier, state->password,
1506 challenge, challenge_size);
1507
1508 cpar = set_key_s(state, K_Auth_CHAP_Response, state->temp_buf);
1509 if (cpar != NULL)
1510 cpar->list_num = CHAP_MD5_SIZE;
1511
1512 if (par->auth_info.mutual_auth) {
1513 if (!state->target_password[0]) {
1514 DEBOUT(("No target password with mutual authentication!\n"));
1515 return ISCSI_STATUS_PARAMETER_MISSING;
1516 }
1517
1518 cprng_strong(kern_cprng,
1519 &state->temp_buf[CHAP_MD5_SIZE],
1520 CHAP_CHALLENGE_LEN + 1, 0);
1521 set_key_n(state, K_Auth_CHAP_Identifier,
1522 state->temp_buf[CHAP_MD5_SIZE]);
1523 cpar = set_key_s(state, K_Auth_CHAP_Challenge,
1524 &state->temp_buf[CHAP_MD5_SIZE + 1]);
1525 if (cpar != NULL)
1526 cpar->list_num = CHAP_CHALLENGE_LEN;
1527 next = -1;
1528 }
1529 state->auth_state = AUTH_CHAP_RSP_SENT;
1530 break;
1531
1532 case AUTH_CHAP_RSP_SENT:
1533 /* we can only be here for mutual authentication */
1534 if (!par->auth_info.mutual_auth || response == NULL) {
1535 DEBOUT(("Mutual authentication not requested\n"));
1536 return ISCSI_STATUS_NEGOTIATION_ERROR;
1537 }
1538
1539 chap_md5_response(state->temp_buf,
1540 state->temp_buf[CHAP_MD5_SIZE],
1541 state->password,
1542 &state->temp_buf[CHAP_MD5_SIZE + 1],
1543 CHAP_CHALLENGE_LEN);
1544
1545 if (memcmp(state->temp_buf, response, response_size)) {
1546 DEBOUT(("Mutual authentication mismatch\n"));
1547 return ISCSI_STATUS_AUTHENTICATION_FAILED;
1548 }
1549 break;
1550
1551 default:
1552 break;
1553 }
1554
1555 complete_pars(state, tx_pdu);
1556
1557 return next;
1558 }
1559
1560
1561 /*
1562 * set_first_opnegs:
1563 * Set the operational negotiation parameters we want to negotiate in
1564 * the first login request in op_neg phase.
1565 *
1566 * Parameter:
1567 * conn The connection
1568 * state Negotiation state
1569 */
1570
1571 STATIC void
1572 set_first_opnegs(connection_t *conn, negotiation_state_t *state)
1573 {
1574 iscsi_login_parameters_t *lpar = conn->login_par;
1575 negotiation_parameter_t *cpar;
1576
1577 /* Digests - suggest None,CRC32C unless the user forces a value */
1578 cpar = set_key_n(state, K_HeaderDigest,
1579 (lpar->is_present.HeaderDigest) ? lpar->HeaderDigest : 0);
1580 if (cpar != NULL && !lpar->is_present.HeaderDigest) {
1581 cpar->list_num = 2;
1582 cpar->val.nval[1] = 1;
1583 }
1584
1585 cpar = set_key_n(state, K_DataDigest, (lpar->is_present.DataDigest)
1586 ? lpar->DataDigest : 0);
1587 if (cpar != NULL && !lpar->is_present.DataDigest) {
1588 cpar->list_num = 2;
1589 cpar->val.nval[1] = 1;
1590 }
1591
1592 set_key_n(state, K_MaxRecvDataSegmentLength,
1593 conn->Our_MaxRecvDataSegmentLength);
1594 /* This is direction-specific, we may have a different default */
1595 state->MaxRecvDataSegmentLength =
1596 entries[K_MaxRecvDataSegmentLength].defval;
1597
1598 /* First connection only */
1599 if (!conn->session->TSIH) {
1600 state->ErrorRecoveryLevel =
1601 (lpar->is_present.ErrorRecoveryLevel) ? lpar->ErrorRecoveryLevel
1602 : 2;
1603 /*
1604 Negotiate InitialR2T to FALSE and ImmediateData to TRUE, should
1605 be slightly more efficient than the default InitialR2T=TRUE.
1606 */
1607 state->InitialR2T = FALSE;
1608 state->ImmediateData = TRUE;
1609
1610 /* We don't really care about this, so don't negotiate by default */
1611 state->MaxBurstLength = entries[K_MaxBurstLength].defval;
1612 state->FirstBurstLength = entries[K_FirstBurstLength].defval;
1613 state->MaxOutstandingR2T = entries[K_MaxOutstandingR2T].defval;
1614
1615 #ifdef ISCSI_TEST_MODE
1616 if (conn->test_pars != NULL) {
1617 test_pars_t *tp = conn->test_pars;
1618
1619 if (tp->options & ISCSITEST_OVERRIDE_INITIALR2T)
1620 state->InitialR2T = TRUE;
1621 if (tp->options & ISCSITEST_OVERRIDE_IMMDATA)
1622 state->ImmediateData = FALSE;
1623
1624 if (tp->options & ISCSITEST_NEGOTIATE_MAXBURST) {
1625 state->MaxBurstLength = tp->maxburst_val;
1626 set_key_n(state, K_MaxBurstLength, state->MaxBurstLength);
1627 }
1628 if (tp->options & ISCSITEST_NEGOTIATE_FIRSTBURST) {
1629 state->FirstBurstLength = tp->firstburst_val;
1630 set_key_n(state, K_FirstBurstLength, state->FirstBurstLength);
1631 }
1632 if (tp->options & ISCSITEST_NEGOTIATE_R2T) {
1633 state->MaxOutstandingR2T = tp->r2t_val;
1634 set_key_n(state, K_MaxOutstandingR2T, state->MaxOutstandingR2T);
1635 }
1636 }
1637 #endif
1638
1639 set_key_n(state, K_ErrorRecoveryLevel, state->ErrorRecoveryLevel);
1640 set_key_n(state, K_InitialR2T, state->InitialR2T);
1641 set_key_n(state, K_ImmediateData, state->ImmediateData);
1642
1643 if (lpar->is_present.MaxConnections) {
1644 state->MaxConnections = lpar->MaxConnections;
1645 set_key_n(state, K_MaxConnections, lpar->MaxConnections);
1646 }
1647
1648 if (lpar->is_present.DefaultTime2Wait)
1649 set_key_n(state, K_DefaultTime2Wait, lpar->DefaultTime2Wait);
1650 else
1651 state->DefaultTime2Wait = entries[K_DefaultTime2Wait].defval;
1652
1653 if (lpar->is_present.DefaultTime2Retain)
1654 set_key_n(state, K_DefaultTime2Retain, lpar->DefaultTime2Retain);
1655 else
1656 state->DefaultTime2Retain = entries[K_DefaultTime2Retain].defval;
1657 } else
1658 init_session_parameters(conn->session, state);
1659
1660 DEBC(conn, 10, ("SetFirstOpnegs: recover=%d, MRDSL=%d\n",
1661 conn->recover, state->MaxRecvDataSegmentLength));
1662 }
1663
1664
1665 /*
1666 * assemble_negotiation_parameters:
1667 * Assemble any negotiation parameters requested by the other side.
1668 *
1669 * Parameter:
1670 * conn The connection
1671 * ccb The login ccb
1672 * rx_pdu The received login response PDU
1673 * tx_pdu The transmit PDU
1674 *
1675 * Returns: 0 On success
1676 * > 0 (an ISCSI error code) if an error occurred.
1677 */
1678
1679 int
1680 assemble_negotiation_parameters(connection_t *conn, ccb_t *ccb, pdu_t *rx_pdu,
1681 pdu_t *tx_pdu)
1682 {
1683 negotiation_state_t *state = (negotiation_state_t *) ccb->temp_data;
1684 negotiation_parameter_t rxp;
1685 uint8_t *rxpars;
1686 int rc;
1687
1688 state->num_pars = 0;
1689
1690 DEBC(conn, 10, ("AsmNegParams: connState=%d, MRDSL=%d\n",
1691 conn->state, state->MaxRecvDataSegmentLength));
1692
1693 if (conn->state == ST_SEC_NEG) {
1694 conn->state = ST_OP_NEG;
1695 set_first_opnegs(conn, state);
1696 }
1697
1698 rxpars = (uint8_t *) rx_pdu->temp_data;
1699 if (rxpars != NULL) {
1700 /* Note: There are always at least 2 extra bytes past temp_data_len */
1701 rxpars[rx_pdu->temp_data_len] = '\0';
1702 rxpars[rx_pdu->temp_data_len + 1] = '\0';
1703
1704 while (*rxpars) {
1705 if ((rxpars = get_parameter(rxpars, &rxp)) == NULL)
1706 return ISCSI_STATUS_NEGOTIATION_ERROR;
1707
1708 rc = eval_parameter(conn, state, &rxp);
1709 if (rc)
1710 return rc;
1711 }
1712 }
1713
1714 if (tx_pdu == NULL)
1715 return 0;
1716
1717 complete_pars(state, tx_pdu);
1718
1719 return 0;
1720 }
1721
1722 /*
1723 * init_text_parameters:
1724 * Initialize text negotiation.
1725 *
1726 * Parameter:
1727 * conn The connection
1728 * tx_pdu The transmit PDU
1729 *
1730 * Returns: 0 On success
1731 * > 0 (an ISCSI error code) if an error occurred.
1732 */
1733
1734 int
1735 init_text_parameters(connection_t *conn, ccb_t *ccb)
1736 {
1737 negotiation_state_t *state;
1738
1739 state = malloc(sizeof(*state), M_TEMP, M_WAITOK | M_ZERO);
1740 if (state == NULL) {
1741 DEBOUT(("*** Out of memory in init_text_params\n"));
1742 return ISCSI_STATUS_NO_RESOURCES;
1743 }
1744 ccb->temp_data = state;
1745
1746 state->HeaderDigest = conn->HeaderDigest;
1747 state->DataDigest = conn->DataDigest;
1748 state->MaxRecvDataSegmentLength = conn->MaxRecvDataSegmentLength;
1749 init_session_parameters(conn->session, state);
1750
1751 return 0;
1752 }
1753
1754
1755 /*
1756 * assemble_send_targets:
1757 * Assemble send targets request
1758 *
1759 * Parameter:
1760 * pdu The transmit PDU
1761 * val The SendTargets key value
1762 *
1763 * Returns: 0 On success
1764 * > 0 (an ISCSI error code) if an error occurred.
1765 */
1766
1767 int
1768 assemble_send_targets(pdu_t *pdu, uint8_t *val)
1769 {
1770 negotiation_parameter_t par;
1771 uint8_t *buf;
1772 int len;
1773
1774 par.key = K_SendTargets;
1775 par.list_num = 1;
1776 par.val.sval = val;
1777
1778 len = parameter_size(&par);
1779
1780 if ((buf = malloc(len, M_TEMP, M_WAITOK)) == NULL) {
1781 DEBOUT(("*** Out of memory in assemble_send_targets\n"));
1782 return ISCSI_STATUS_NO_RESOURCES;
1783 }
1784 pdu->temp_data = buf;
1785 pdu->temp_data_len = len;
1786
1787 if (put_parameter(buf, len, &par) == 0)
1788 return ISCSI_STATUS_PARAMETER_INVALID;
1789
1790 return 0;
1791 }
1792
1793
1794 /*
1795 * set_negotiated_parameters:
1796 * Copy the negotiated parameters into the connection and session structure.
1797 *
1798 * Parameter:
1799 * ccb The ccb containing the state information
1800 */
1801
1802 void
1803 set_negotiated_parameters(ccb_t *ccb)
1804 {
1805 negotiation_state_t *state = (negotiation_state_t *) ccb->temp_data;
1806 connection_t *conn = ccb->connection;
1807 session_t *sess = ccb->session;
1808
1809 conn->HeaderDigest = state->HeaderDigest;
1810 conn->DataDigest = state->DataDigest;
1811 sess->ErrorRecoveryLevel = state->ErrorRecoveryLevel;
1812 sess->InitialR2T = state->InitialR2T;
1813 sess->ImmediateData = state->ImmediateData;
1814 conn->MaxRecvDataSegmentLength = state->MaxRecvDataSegmentLength;
1815 sess->MaxConnections = state->MaxConnections;
1816 sess->DefaultTime2Wait = conn->Time2Wait = state->DefaultTime2Wait;
1817 sess->DefaultTime2Retain = conn->Time2Retain =
1818 state->DefaultTime2Retain;
1819
1820 /* set idle connection timeout to half the Time2Retain window so we */
1821 /* don't miss it, unless Time2Retain is ridiculously small. */
1822 conn->idle_timeout_val = (conn->Time2Retain >= 10) ?
1823 (conn->Time2Retain / 2) * hz : CONNECTION_IDLE_TIMEOUT;
1824
1825 sess->MaxBurstLength = state->MaxBurstLength;
1826 sess->FirstBurstLength = state->FirstBurstLength;
1827 sess->MaxOutstandingR2T = state->MaxOutstandingR2T;
1828
1829 DEBC(conn, 10,("SetNegPar: MRDSL=%d, MBL=%d, FBL=%d, IR2T=%d, ImD=%d\n",
1830 state->MaxRecvDataSegmentLength, state->MaxBurstLength,
1831 state->FirstBurstLength, state->InitialR2T,
1832 state->ImmediateData));
1833
1834 conn->max_transfer = min(sess->MaxBurstLength, conn->MaxRecvDataSegmentLength);
1835
1836 conn->max_firstimmed = (!sess->ImmediateData) ? 0 :
1837 min(sess->FirstBurstLength, conn->max_transfer);
1838
1839 conn->max_firstdata = (sess->InitialR2T || sess->FirstBurstLength < conn->max_firstimmed) ? 0 :
1840 min(sess->FirstBurstLength - conn->max_firstimmed, conn->max_transfer);
1841
1842 }
1843