| /* | |
| * Copyright (C) 2024 Michael Brown <mbrown@fensystems.co.uk>. | |
| * | |
| * This program is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU General Public License as | |
| * published by the Free Software Foundation; either version 2 of the | |
| * License, or any later version. | |
| * | |
| * This program is distributed in the hope that it will be useful, but | |
| * WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU General Public License | |
| * along with this program; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | |
| * 02110-1301, USA. | |
| * | |
| * You can also choose to distribute this program under the terms of | |
| * the Unmodified Binary Distribution Licence (as given in the file | |
| * COPYING.UBDL), provided that you have satisfied its requirements. | |
| */ | |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); | |
| /** @file | |
| * | |
| * MS-CHAPv2 authentication self-tests | |
| * | |
| */ | |
| /* Forcibly enable assertions */ | |
| #undef NDEBUG | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <ipxe/mschapv2.h> | |
| #include <ipxe/test.h> | |
| /** An MS-CHAPv2 test */ | |
| struct mschapv2_test { | |
| /** Username */ | |
| const char *username; | |
| /** Password */ | |
| const char *password; | |
| /** Authenticator challenge */ | |
| const struct mschapv2_challenge *challenge; | |
| /** Peer challenge */ | |
| const struct mschapv2_challenge *peer; | |
| /** Expected challenge response */ | |
| const struct mschapv2_response *response; | |
| /** Expected authenticator response */ | |
| const struct mschapv2_auth *auth; | |
| }; | |
| /** Define inline data */ | |
| #define DATA(...) { __VA_ARGS__ } | |
| /** Define an MS-CHAPv2 test */ | |
| #define MSCHAPV2_TEST( name, USERNAME, PASSWORD, CHALLENGE, PEER, \ | |
| RESPONSE, AUTH ) \ | |
| static const struct mschapv2_challenge name ## _challenge = { \ | |
| .byte = CHALLENGE, \ | |
| }; \ | |
| static const struct mschapv2_challenge name ## _peer = { \ | |
| .byte = PEER, \ | |
| }; \ | |
| static const union { \ | |
| struct mschapv2_response response; \ | |
| uint8_t byte[ sizeof ( struct mschapv2_response ) ]; \ | |
| } name ## _response = { \ | |
| .byte = RESPONSE, \ | |
| }; \ | |
| static const union { \ | |
| struct mschapv2_auth auth; \ | |
| uint8_t byte[ sizeof ( struct mschapv2_auth ) ]; \ | |
| } name ## _auth = { \ | |
| .byte = AUTH, \ | |
| }; \ | |
| static struct mschapv2_test name = { \ | |
| .username = USERNAME, \ | |
| .password = PASSWORD, \ | |
| .challenge = &name ## _challenge, \ | |
| .peer = &name ## _peer, \ | |
| .response = &name ## _response.response, \ | |
| .auth = &name ## _auth.auth, \ | |
| }; | |
| /** RFC 2759 section 9.2 test case */ | |
| MSCHAPV2_TEST ( rfc2759_test, | |
| "User", "clientPass", | |
| DATA ( 0x5b, 0x5d, 0x7c, 0x7d, 0x7b, 0x3f, 0x2f, 0x3e, | |
| 0x3c, 0x2c, 0x60, 0x21, 0x32, 0x26, 0x26, 0x28 ), | |
| DATA ( 0x21, 0x40, 0x23, 0x24, 0x25, 0x5e, 0x26, 0x2a, | |
| 0x28, 0x29, 0x5f, 0x2b, 0x3a, 0x33, 0x7c, 0x7e ), | |
| DATA ( 0x21, 0x40, 0x23, 0x24, 0x25, 0x5e, 0x26, 0x2a, | |
| 0x28, 0x29, 0x5f, 0x2b, 0x3a, 0x33, 0x7c, 0x7e, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x82, 0x30, 0x9e, 0xcd, 0x8d, 0x70, 0x8b, 0x5e, | |
| 0xa0, 0x8f, 0xaa, 0x39, 0x81, 0xcd, 0x83, 0x54, | |
| 0x42, 0x33, 0x11, 0x4a, 0x3d, 0x85, 0xd6, 0xdf, | |
| 0x00 ), | |
| "S=407A5589115FD0D6209F510FE9C04566932CDA56" ); | |
| /** | |
| * Report an MS-CHAPv2 test result | |
| * | |
| * @v test Authentication test | |
| * @v file Test code file | |
| * @v line Test code line | |
| */ | |
| static void mschapv2_okx ( struct mschapv2_test *test, | |
| const char *file, unsigned int line ) { | |
| struct mschapv2_response response; | |
| struct mschapv2_auth auth; | |
| /* Compute challenge response */ | |
| mschapv2_response ( test->username, test->password, test->challenge, | |
| test->peer, &response ); | |
| okx ( memcmp ( &response, test->response, sizeof ( response ) ) == 0, | |
| file, line ); | |
| /* Compute authenticator response */ | |
| mschapv2_auth ( test->username, test->password, test->challenge, | |
| test->response, &auth ); | |
| okx ( memcmp ( &auth, test->auth, sizeof ( auth ) ) == 0, file, line ); | |
| } | |
| #define mschapv2_ok( test ) \ | |
| mschapv2_okx ( test, __FILE__, __LINE__ ) | |
| /** | |
| * Perform MS-CHAPv2 self-test | |
| * | |
| */ | |
| static void mschapv2_test_exec ( void ) { | |
| mschapv2_ok ( &rfc2759_test ); | |
| } | |
| /** MS-CHAPv2 self-test */ | |
| struct self_test mschapv2_test __self_test = { | |
| .name = "mschapv2", | |
| .exec = mschapv2_test_exec, | |
| }; |