1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/des.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/logging.h" 8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#if defined(USE_OPENSSL) 1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <openssl/des.h> 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/openssl_util.h" 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#elif defined(USE_NSS) 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <nss.h> 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <pk11pub.h> 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/nss_util.h" 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_MACOSX) 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <CommonCrypto/CommonCryptor.h> 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_WIN) 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h> 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <wincrypt.h> 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/scoped_capi_types.h" 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The Mac and Windows (CryptoAPI) versions of DESEncrypt are our own code. 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// DESSetKeyParity, DESMakeKey, and the Linux (NSS) version of DESEncrypt are 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// based on mozilla/security/manager/ssl/src/nsNTLMAuthModule.cpp, 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// CVS rev. 1.14. 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* ***** BEGIN LICENSE BLOCK ***** 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Version: MPL 1.1/GPL 2.0/LGPL 2.1 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The contents of this file are subject to the Mozilla Public License Version 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1.1 (the "License"); you may not use this file except in compliance with 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the License. You may obtain a copy of the License at 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * http://www.mozilla.org/MPL/ 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Software distributed under the License is distributed on an "AS IS" basis, 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * for the specific language governing rights and limitations under the 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * License. 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The Original Code is Mozilla. 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The Initial Developer of the Original Code is IBM Corporation. 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Portions created by IBM Corporation are Copyright (C) 2003 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * IBM Corporation. All Rights Reserved. 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Contributor(s): 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Darin Fisher <darin@meer.net> 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Alternatively, the contents of this file may be used under the terms of 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * either the GNU General Public License Version 2 or later (the "GPL"), or 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * in which case the provisions of the GPL or the LGPL are applicable instead 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * of those above. If you wish to allow use of your version of this file only 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * under the terms of either the GPL or the LGPL, and not to allow others to 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * use your version of this file under the terms of the MPL, indicate your 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * decision by deleting the provisions above and replace them with the notice 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * and other provisions required by the GPL or the LGPL. If you do not delete 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the provisions above, a recipient may use your version of this file under 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the terms of any one of the MPL, the GPL or the LGPL. 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * ***** END LICENSE BLOCK ***** */ 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Set odd parity bit (in least significant bit position). 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic uint8 DESSetKeyParity(uint8 x) { 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((((x >> 7) ^ (x >> 6) ^ (x >> 5) ^ 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (x >> 4) ^ (x >> 3) ^ (x >> 2) ^ 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (x >> 1)) & 0x01) == 0) { 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x |= 0x01; 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott x &= 0xfe; 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return x; 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DESMakeKey(const uint8* raw, uint8* key) { 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key[0] = DESSetKeyParity(raw[0]); 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key[1] = DESSetKeyParity((raw[0] << 7) | (raw[1] >> 1)); 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key[2] = DESSetKeyParity((raw[1] << 6) | (raw[2] >> 2)); 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key[3] = DESSetKeyParity((raw[2] << 5) | (raw[3] >> 3)); 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key[4] = DESSetKeyParity((raw[3] << 4) | (raw[4] >> 4)); 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key[5] = DESSetKeyParity((raw[4] << 3) | (raw[5] >> 5)); 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key[6] = DESSetKeyParity((raw[5] << 2) | (raw[6] >> 6)); 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key[7] = DESSetKeyParity((raw[6] << 1)); 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(USE_OPENSSL) 91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 92513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid DESEncrypt(const uint8* key, const uint8* src, uint8* hash) { 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen crypto::EnsureOpenSSLInit(); 9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 95fac8ff3b63c4430422aed85bda94d0bfb168c224Kristian Monsen DES_key_schedule ks; 96fac8ff3b63c4430422aed85bda94d0bfb168c224Kristian Monsen DES_set_key_unchecked( 97fac8ff3b63c4430422aed85bda94d0bfb168c224Kristian Monsen reinterpret_cast<const_DES_cblock*>(const_cast<uint8*>(key)), &ks); 98e00741fe4b5b3d04d95b48b19d56c94fc9bc0237Kristian Monsen 99fac8ff3b63c4430422aed85bda94d0bfb168c224Kristian Monsen DES_ecb_encrypt(reinterpret_cast<const_DES_cblock*>(const_cast<uint8*>(src)), 100fac8ff3b63c4430422aed85bda94d0bfb168c224Kristian Monsen reinterpret_cast<DES_cblock*>(hash), &ks, DES_ENCRYPT); 101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#elif defined(USE_NSS) 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DESEncrypt(const uint8* key, const uint8* src, uint8* hash) { 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CK_MECHANISM_TYPE cipher_mech = CKM_DES_ECB; 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PK11SlotInfo* slot = NULL; 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PK11SymKey* symkey = NULL; 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PK11Context* ctxt = NULL; 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SECItem key_item; 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SECItem* param = NULL; 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SECStatus rv; 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott unsigned int n; 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen crypto::EnsureNSSInit(); 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott slot = PK11_GetBestSlot(cipher_mech, NULL); 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!slot) 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto done; 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key_item.data = const_cast<uint8*>(key); 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key_item.len = 8; 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott symkey = PK11_ImportSymKey(slot, cipher_mech, 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PK11_OriginUnwrap, CKA_ENCRYPT, 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott &key_item, NULL); 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!symkey) 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto done; 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // No initialization vector required. 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott param = PK11_ParamFromIV(cipher_mech, NULL); 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!param) 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto done; 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ctxt = PK11_CreateContextBySymKey(cipher_mech, CKA_ENCRYPT, 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott symkey, param); 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!ctxt) 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto done; 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv = PK11_CipherOp(ctxt, hash, reinterpret_cast<int*>(&n), 8, 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const_cast<uint8*>(src), 8); 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (rv != SECSuccess) 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto done; 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TODO(wtc): Should this be PK11_Finalize? 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv = PK11_DigestFinal(ctxt, hash+8, &n, 0); 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (rv != SECSuccess) 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto done; 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott done: 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ctxt) 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PK11_DestroyContext(ctxt, PR_TRUE); 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (symkey) 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PK11_FreeSymKey(symkey); 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (param) 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SECITEM_FreeItem(param, PR_TRUE); 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (slot) 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PK11_FreeSlot(slot); 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_MACOSX) 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DESEncrypt(const uint8* key, const uint8* src, uint8* hash) { 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CCCryptorStatus status; 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott size_t data_out_moved = 0; 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott status = CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionECBMode, 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key, 8, NULL, src, 8, hash, 8, &data_out_moved); 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DCHECK(status == kCCSuccess); 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DCHECK(data_out_moved == 8); 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_WIN) 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DESEncrypt(const uint8* key, const uint8* src, uint8* hash) { 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen crypto::ScopedHCRYPTPROV provider; 175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!CryptAcquireContext(provider.receive(), NULL, NULL, PROV_RSA_FULL, 176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CRYPT_VERIFYCONTEXT)) 177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Import the DES key. 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick struct KeyBlob { 182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BLOBHEADER header; 183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DWORD key_size; 184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BYTE key_data[8]; 185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }; 186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick KeyBlob key_blob; 187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick key_blob.header.bType = PLAINTEXTKEYBLOB; 188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick key_blob.header.bVersion = CUR_BLOB_VERSION; 189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick key_blob.header.reserved = 0; 190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick key_blob.header.aiKeyAlg = CALG_DES; 191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick key_blob.key_size = 8; // 64 bits 192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick memcpy(key_blob.key_data, key, 8); 193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen crypto::ScopedHCRYPTKEY key; 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BOOL import_ok = CryptImportKey(provider, 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick reinterpret_cast<BYTE*>(&key_blob), 197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick sizeof key_blob, 0, 0, key.receive()); 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Destroy the copy of the key. 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SecureZeroMemory(key_blob.key_data, sizeof key_blob.key_data); 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!import_ok) 201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // No initialization vector required. 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DWORD cipher_mode = CRYPT_MODE_ECB; 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!CryptSetKeyParam(key, KP_MODE, reinterpret_cast<BYTE*>(&cipher_mode), 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 0)) 207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // CryptoAPI requires us to copy the plaintext to the output buffer first. 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CopyMemory(hash, src, 8); 211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Pass a 'Final' of FALSE, otherwise CryptEncrypt appends one additional 212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // block of padding to the data. 213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DWORD hash_len = 8; 214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CryptEncrypt(key, 0, FALSE, 0, hash, &hash_len, 8); 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 221