[crypto] Add implementation of MS-CHAPv2 authentication

Add an implementation of the authentication portions of the MS-CHAPv2
algorithm as defined in RFC 2759, along with the single test vector
provided therein.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2024-02-21 16:45:50 +00:00
parent 929f06a76d
commit 075292cc2d
4 changed files with 567 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
#ifndef _IPXE_MSCHAPV2_H
#define _IPXE_MSCHAPV2_H
/** @file
*
* MS-CHAPv2 authentication
*
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <stdint.h>
/** An MS-CHAPv2 challenge */
struct mschapv2_challenge {
/** Raw bytes */
uint8_t byte[16];
} __attribute__ (( packed ));
/** An MS-CHAPv2 NT response */
struct mschapv2_nt_response {
/** DES-encrypted blocks */
uint8_t block[3][8];
} __attribute__ (( packed ));
/** An MS-CHAPv2 challenge response */
struct mschapv2_response {
/** Peer challenge */
struct mschapv2_challenge peer;
/** Reserved, must be zero */
uint8_t reserved[8];
/** NT response */
struct mschapv2_nt_response nt;
/** Flags, must be zero */
uint8_t flags;
} __attribute__ (( packed ));
/** An MS-CHAPv2 authenticator response */
struct mschapv2_auth {
/** Authenticator response string
*
* This is an unterminated 42-byte string of the form
* "S=<auth_string>" where <auth_string> is the upper-cased
* hexadecimal encoding of the actual authenticator response
* value. Joy.
*/
char wtf[42];
} __attribute__ (( packed ));
extern void mschapv2_response ( const char *username, const char *password,
const struct mschapv2_challenge *challenge,
const struct mschapv2_challenge *peer,
struct mschapv2_response *response );
extern void mschapv2_auth ( const char *username, const char *password,
const struct mschapv2_challenge *challenge,
const struct mschapv2_response *response,
struct mschapv2_auth *auth );
#endif /* _IPXE_MSCHAPV2_H */