/* * Copyright (C) 2024 Michael Brown . * * 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 #include #include #include /** 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, };