1 /*
2  * Test MS-CHAPv1 library code.
3  *
4  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
5  * Use is subject to license terms.
6  *
7  * Originally from the README.MSCHAP80 file written by:
8  *	Eric Rosenquist          rosenqui@strataware.com
9  *	(updated by Paul Mackerras)
10  *	(updated by Al Longyear)
11  *	(updated by Farrell Woods)
12  */
13 
14 #include <stdio.h>
15 
16 #include "pppd.h"
17 #include "chap.h"
18 #include "chap_ms.h"
19 
20 static void
show_response(chap_state * cstate,const char * str)21 show_response(chap_state *cstate, const char *str)
22 {
23     int i;
24 
25     printf("%s -- %d bytes:", str, cstate->resp_length);
26 
27     for (i = 0; i < cstate->resp_length; i++) {
28         if (i % 8 == 0)
29             putchar('\n');
30         printf("%02X ", (unsigned int)cstate->response[i]);
31     }
32 
33     putchar('\n');
34 }
35 
main(argc,argv)36 int main(argc, argv)
37     int     argc;
38     char    *argv[];
39 {
40     u_char          challenge[8];
41     int             challengeInt[sizeof(challenge)];
42     chap_state      cstate;
43     int             i;
44 
45     if (argc != 3) {
46         fprintf(stderr, "Usage: %s <16-hexchar challenge> <password>\n",
47         argv[0]); exit(1);
48     }
49 
50     sscanf(argv[1], "%2x%2x%2x%2x%2x%2x%2x%2x",
51            challengeInt + 0, challengeInt + 1, challengeInt + 2,
52            challengeInt + 3, challengeInt + 4, challengeInt + 5,
53            challengeInt + 6, challengeInt + 7);
54 
55     for (i = 0; i < sizeof(challenge); i++)
56         challenge[i] = (u_char)challengeInt[i];
57 
58     BZERO(&cstate, sizeof(cstate));
59     ChapMS(&cstate, challenge, sizeof(challenge), argv[2], strlen(argv[2]));
60 #ifdef MSLANMAN
61     show_response(&cstate, "MS-CHAPv1 with LAN Manager");
62 #else
63     show_response(&cstate, "MS-CHAPv1");
64 #endif
65 
66     cstate.chal_len = sizeof(challenge);
67     BCOPY(challenge, cstate.challenge, cstate.chal_len);
68     if (!ChapMSValidate(&cstate, cstate.response, cstate.resp_length,
69 	argv[2], strlen(argv[2])))
70 	printf("Cannot validate own MS-CHAPv1 response.\n");
71 
72 #ifdef MSLANMAN
73     cstate.response[MS_CHAP_RESPONSE_LEN-1] = '\0';
74     if (!ChapMSValidate(&cstate, cstate.response, cstate.resp_length,
75 	argv[2], strlen(argv[2])))
76 	printf("Cannot validate own LAN Manager response.\n");
77 #endif
78 
79 #ifdef CHAPMSV2
80     cstate.resp_name = "joe user";
81     ChapMSv2(&cstate, cstate.challenge, 16, argv[2], strlen(argv[2]));
82     show_response(&cstate, "MS-CHAPv2");
83     if (!ChapMSv2Validate(&cstate, cstate.resp_name, cstate.response,
84 	cstate.resp_length, argv[2], strlen(argv[2])))
85 	printf("Cannot validate own MS-CHAPv2 response.\n");
86 #endif
87 
88     return (0);
89 }
90