|
|
1.1 ! root 1: /* ! 2: * Copyright (C) 2006 Michael Brown <[email protected]>. ! 3: * ! 4: * This program is free software; you can redistribute it and/or ! 5: * modify it under the terms of the GNU General Public License as ! 6: * published by the Free Software Foundation; either version 2 of the ! 7: * License, or any later version. ! 8: * ! 9: * This program is distributed in the hope that it will be useful, but ! 10: * WITHOUT ANY WARRANTY; without even the implied warranty of ! 11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 12: * General Public License for more details. ! 13: * ! 14: * You should have received a copy of the GNU General Public License ! 15: * along with this program; if not, write to the Free Software ! 16: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 17: */ ! 18: ! 19: FILE_LICENCE ( GPL2_OR_LATER ); ! 20: ! 21: #include <stddef.h> ! 22: #include <stdlib.h> ! 23: #include <string.h> ! 24: #include <errno.h> ! 25: #include <assert.h> ! 26: #include <ipxe/crypto.h> ! 27: #include <ipxe/chap.h> ! 28: ! 29: /** @file ! 30: * ! 31: * CHAP protocol ! 32: * ! 33: */ ! 34: ! 35: /** ! 36: * Initialise CHAP challenge/response ! 37: * ! 38: * @v chap CHAP challenge/response ! 39: * @v digest Digest algorithm to use ! 40: * @ret rc Return status code ! 41: * ! 42: * Initialises a CHAP challenge/response structure. This routine ! 43: * allocates memory, and so may fail. The allocated memory must ! 44: * eventually be freed by a call to chap_finish(). ! 45: */ ! 46: int chap_init ( struct chap_response *chap, ! 47: struct digest_algorithm *digest ) { ! 48: size_t state_len; ! 49: void *state; ! 50: ! 51: assert ( chap->digest == NULL ); ! 52: assert ( chap->digest_context == NULL ); ! 53: assert ( chap->response == NULL ); ! 54: ! 55: DBG ( "CHAP %p initialising with %s digest\n", chap, digest->name ); ! 56: ! 57: state_len = ( digest->ctxsize + digest->digestsize ); ! 58: state = malloc ( state_len ); ! 59: if ( ! state ) { ! 60: DBG ( "CHAP %p could not allocate %zd bytes for state\n", ! 61: chap, state_len ); ! 62: return -ENOMEM; ! 63: } ! 64: ! 65: chap->digest = digest; ! 66: chap->digest_context = state; ! 67: chap->response = ( state + digest->ctxsize ); ! 68: chap->response_len = digest->digestsize; ! 69: digest_init ( chap->digest, chap->digest_context ); ! 70: return 0; ! 71: } ! 72: ! 73: /** ! 74: * Add data to the CHAP challenge ! 75: * ! 76: * @v chap CHAP response ! 77: * @v data Data to add ! 78: * @v len Length of data to add ! 79: */ ! 80: void chap_update ( struct chap_response *chap, const void *data, ! 81: size_t len ) { ! 82: assert ( chap->digest != NULL ); ! 83: assert ( chap->digest_context != NULL ); ! 84: ! 85: if ( ! chap->digest ) ! 86: return; ! 87: ! 88: digest_update ( chap->digest, chap->digest_context, data, len ); ! 89: } ! 90: ! 91: /** ! 92: * Respond to the CHAP challenge ! 93: * ! 94: * @v chap CHAP response ! 95: * ! 96: * Calculates the final CHAP response value, and places it in @c ! 97: * chap->response, with a length of @c chap->response_len. ! 98: */ ! 99: void chap_respond ( struct chap_response *chap ) { ! 100: assert ( chap->digest != NULL ); ! 101: assert ( chap->digest_context != NULL ); ! 102: assert ( chap->response != NULL ); ! 103: ! 104: DBG ( "CHAP %p responding to challenge\n", chap ); ! 105: ! 106: if ( ! chap->digest ) ! 107: return; ! 108: ! 109: digest_final ( chap->digest, chap->digest_context, chap->response ); ! 110: } ! 111: ! 112: /** ! 113: * Free resources used by a CHAP response ! 114: * ! 115: * @v chap CHAP response ! 116: */ ! 117: void chap_finish ( struct chap_response *chap ) { ! 118: void *state = chap->digest_context; ! 119: ! 120: DBG ( "CHAP %p finished\n", chap ); ! 121: ! 122: free ( state ); ! 123: memset ( chap, 0, sizeof ( *chap ) ); ! 124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.