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#pragma ident	"%Z%%M%	%I%	%E% SMI"
21
22static void
23show_response(chap_state *cstate, const char *str)
24{
25    int i;
26
27    printf("%s -- %d bytes:", str, cstate->resp_length);
28
29    for (i = 0; i < cstate->resp_length; i++) {
30        if (i % 8 == 0)
31            putchar('\n');
32        printf("%02X ", (unsigned int)cstate->response[i]);
33    }
34
35    putchar('\n');
36}
37
38int main(argc, argv)
39    int     argc;
40    char    *argv[];
41{
42    u_char          challenge[8];
43    int             challengeInt[sizeof(challenge)];
44    chap_state      cstate;
45    int             i;
46
47    if (argc != 3) {
48        fprintf(stderr, "Usage: %s <16-hexchar challenge> <password>\n",
49        argv[0]); exit(1);
50    }
51
52    sscanf(argv[1], "%2x%2x%2x%2x%2x%2x%2x%2x",
53           challengeInt + 0, challengeInt + 1, challengeInt + 2,
54           challengeInt + 3, challengeInt + 4, challengeInt + 5,
55           challengeInt + 6, challengeInt + 7);
56
57    for (i = 0; i < sizeof(challenge); i++)
58        challenge[i] = (u_char)challengeInt[i];
59
60    BZERO(&cstate, sizeof(cstate));
61    ChapMS(&cstate, challenge, sizeof(challenge), argv[2], strlen(argv[2]));
62#ifdef MSLANMAN
63    show_response(&cstate, "MS-CHAPv1 with LAN Manager");
64#else
65    show_response(&cstate, "MS-CHAPv1");
66#endif
67
68    cstate.chal_len = sizeof(challenge);
69    BCOPY(challenge, cstate.challenge, cstate.chal_len);
70    if (!ChapMSValidate(&cstate, cstate.response, cstate.resp_length,
71	argv[2], strlen(argv[2])))
72	printf("Cannot validate own MS-CHAPv1 response.\n");
73
74#ifdef MSLANMAN
75    cstate.response[MS_CHAP_RESPONSE_LEN-1] = '\0';
76    if (!ChapMSValidate(&cstate, cstate.response, cstate.resp_length,
77	argv[2], strlen(argv[2])))
78	printf("Cannot validate own LAN Manager response.\n");
79#endif
80
81#ifdef CHAPMSV2
82    cstate.resp_name = "joe user";
83    ChapMSv2(&cstate, cstate.challenge, 16, argv[2], strlen(argv[2]));
84    show_response(&cstate, "MS-CHAPv2");
85    if (!ChapMSv2Validate(&cstate, cstate.resp_name, cstate.response,
86	cstate.resp_length, argv[2], strlen(argv[2])))
87	printf("Cannot validate own MS-CHAPv2 response.\n");
88#endif
89
90    return (0);
91}
92