* GNU General Public License for more details.
  ******************************************************************************/
 
+#include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/crypto.h>
 #include <linux/err.h>
 #include "iscsi_target_nego.h"
 #include "iscsi_target_auth.h"
 
-static unsigned char chap_asciihex_to_binaryhex(unsigned char val[2])
-{
-       unsigned char result = 0;
-       /*
-        * MSB
-        */
-       if ((val[0] >= 'a') && (val[0] <= 'f'))
-               result = ((val[0] - 'a' + 10) & 0xf) << 4;
-       else
-               if ((val[0] >= 'A') && (val[0] <= 'F'))
-                       result = ((val[0] - 'A' + 10) & 0xf) << 4;
-               else /* digit */
-                       result = ((val[0] - '0') & 0xf) << 4;
-       /*
-        * LSB
-        */
-       if ((val[1] >= 'a') && (val[1] <= 'f'))
-               result |= ((val[1] - 'a' + 10) & 0xf);
-       else
-               if ((val[1] >= 'A') && (val[1] <= 'F'))
-                       result |= ((val[1] - 'A' + 10) & 0xf);
-               else /* digit */
-                       result |= ((val[1] - '0') & 0xf);
-
-       return result;
-}
-
 static int chap_string_to_hex(unsigned char *dst, unsigned char *src, int len)
 {
-       int i, j = 0;
+       int j = DIV_ROUND_UP(len, 2);
 
-       for (i = 0; i < len; i += 2) {
-               dst[j++] = (unsigned char) chap_asciihex_to_binaryhex(&src[i]);
-       }
+       hex2bin(dst, src, j);
 
        dst[j] = '\0';
        return j;