| /*************************************************************************** | 
 |  *                                  _   _ ____  _ | 
 |  *  Project                     ___| | | |  _ \| | | 
 |  *                             / __| | | | |_) | | | 
 |  *                            | (__| |_| |  _ <| |___ | 
 |  *                             \___|\___/|_| \_\_____| | 
 |  * | 
 |  * Copyright (C) 2015, Steve Holme, <steve_holme@hotmail.com>. | 
 |  * | 
 |  * This software is licensed as described in the file COPYING, which | 
 |  * you should have received as part of this distribution. The terms | 
 |  * are also available at http://curl.haxx.se/docs/copyright.html. | 
 |  * | 
 |  * You may opt to use, copy, modify, merge, publish, distribute and/or sell | 
 |  * copies of the Software, and permit persons to whom the Software is | 
 |  * furnished to do so, under the terms of the COPYING file. | 
 |  * | 
 |  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | 
 |  * KIND, either express or implied. | 
 |  * | 
 |  ***************************************************************************/ | 
 |  | 
 | #include "curl_setup.h" | 
 |  | 
 | #if defined(USE_NTLM) && (!defined(USE_OPENSSL) || defined(HAVE_BORINGSSL)) | 
 |  | 
 | #include "curl_des.h" | 
 |  | 
 | /* | 
 |  * Curl_des_set_odd_parity() | 
 |  * | 
 |  * This is used to apply odd parity to the given byte array. It is typically | 
 |  * used by when a cryptography engines doesn't have it's own version. | 
 |  * | 
 |  * The function is a port of the Java based oddParity() function over at: | 
 |  * | 
 |  * http://davenport.sourceforge.net/ntlm.html | 
 |  * | 
 |  * Parameters: | 
 |  * | 
 |  * bytes       [in/out] - The data whose parity bits are to be adjusted for | 
 |  *                        odd parity. | 
 |  * len         [out]    - The length of the data. | 
 |  */ | 
 | void Curl_des_set_odd_parity(unsigned char *bytes, size_t len) | 
 | { | 
 |   size_t i; | 
 |  | 
 |   for(i = 0; i < len; i++) { | 
 |     unsigned char b = bytes[i]; | 
 |  | 
 |     bool needs_parity = (((b >> 7) ^ (b >> 6) ^ (b >> 5) ^ | 
 |                           (b >> 4) ^ (b >> 3) ^ (b >> 2) ^ | 
 |                           (b >> 1)) & 0x01) == 0; | 
 |  | 
 |     if(needs_parity) | 
 |       bytes[i] |= 0x01; | 
 |     else | 
 |       bytes[i] &= 0xfe; | 
 |   } | 
 | } | 
 |  | 
 | #endif /* USE_NTLM && (!USE_OPENSSL || HAVE_BORINGSSL) */ |