2 * Copyright (c) 2000-2001,2011,2014 Apple Inc. All Rights Reserved.
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
20 * desContext.cpp - glue between BlockCrytpor and DES implementation
23 #include "desContext.h"
24 #include <security_utilities/debugging.h>
25 #include <security_utilities/globalizer.h>
26 #include <security_utilities/threading.h>
28 #define DESDebug(args...) secinfo("desContext", ## args)
31 * DES encrypt/decrypt.
33 DESContext::DESContext(AppleCSPSession
&session
) : BlockCryptor(session
), DesInst(NULL
)
37 DESContext::~DESContext()
39 if (DesInst
!= NULL
) {
40 CCCryptorRelease(DesInst
);
47 * Standard CSPContext init, called from CSPFullPluginSession::init().
48 * Reusable, e.g., query followed by en/decrypt.
50 void DESContext::init(
51 const Context
&context
,
55 uint8
*keyData
= NULL
;
57 /* obtain key from context */
58 symmetricKeyBits(context
, session(), CSSM_ALGID_DES
,
59 encrypting
? CSSM_KEYUSE_ENCRYPT
: CSSM_KEYUSE_DECRYPT
,
61 if(keyLen
!= (DES_KEY_SIZE_BITS_EXTERNAL
/ 8)) {
62 CssmError::throwMe(CSSMERR_CSP_INVALID_ATTR_KEY
);
67 CCCryptorRelease(DesInst
);
71 (void) CCCryptorCreateWithMode(0, kCCModeECB
, kCCAlgorithmDES
, ccDefaultPadding
, NULL
, keyData
, kCCKeySizeDES
, NULL
, 0, 0, 0, &DesInst
);
73 /* Finally, have BlockCryptor do its setup */
74 setup(DES_BLOCK_SIZE_BYTES
, context
);
78 * Functions called by BlockCryptor
79 * DES does encrypt/decrypt in place
81 void DESContext::encryptBlock(
82 const void *plainText
, // length implied (one block)
85 size_t &cipherTextLen
, // in/out, throws on overflow
86 bool final
) // ignored
88 if(plainTextLen
!= DES_BLOCK_SIZE_BYTES
) {
89 CssmError::throwMe(CSSMERR_CSP_INPUT_LENGTH_ERROR
);
91 if(cipherTextLen
< DES_BLOCK_SIZE_BYTES
) {
92 CssmError::throwMe(CSSMERR_CSP_OUTPUT_LENGTH_ERROR
);
94 (void) CCCryptorEncryptDataBlock(DesInst
, NULL
, plainText
, DES_BLOCK_SIZE_BYTES
, cipherText
);
95 cipherTextLen
= DES_BLOCK_SIZE_BYTES
;
98 void DESContext::decryptBlock(
99 const void *cipherText
, // length implied (one block)
100 size_t cipherTextLen
,
102 size_t &plainTextLen
, // in/out, throws on overflow
103 bool final
) // ignored
105 if(plainTextLen
< DES_BLOCK_SIZE_BYTES
) {
106 CssmError::throwMe(CSSMERR_CSP_OUTPUT_LENGTH_ERROR
);
108 if(plainText
!= cipherText
) {
109 /* little optimization for callers who want to decrypt in place */
110 memmove(plainText
, cipherText
, DES_BLOCK_SIZE_BYTES
);
112 (void) CCCryptorDecryptDataBlock(DesInst
, NULL
, cipherText
, DES_BLOCK_SIZE_BYTES
, plainText
);
113 plainTextLen
= DES_BLOCK_SIZE_BYTES
;
117 *** Triple-DES - EDE, 24-bit key only
120 DES3Context::DES3Context(AppleCSPSession
&session
) : BlockCryptor(session
), DesInst(NULL
)
126 DES3Context::~DES3Context()
128 if (DesInst
!= NULL
) {
129 CCCryptorRelease(DesInst
);
136 * Standard CSPContext init, called from CSPFullPluginSession::init().
137 * Reusable, e.g., query followed by en/decrypt.
139 void DES3Context::init(
140 const Context
&context
,
144 uint8
*keyData
= NULL
;
146 /* obtain key from context */
147 symmetricKeyBits(context
, session(), CSSM_ALGID_3DES_3KEY_EDE
,
148 encrypting
? CSSM_KEYUSE_ENCRYPT
: CSSM_KEYUSE_DECRYPT
,
150 if(keyLen
!= DES3_KEY_SIZE_BYTES
) {
151 CssmError::throwMe(CSSMERR_CSP_INVALID_ATTR_KEY
);
154 if (DesInst
!= NULL
) {
155 CCCryptorRelease(DesInst
);
159 (void) CCCryptorCreateWithMode(0, kCCModeECB
, kCCAlgorithm3DES
, ccDefaultPadding
, NULL
, keyData
, kCCKeySize3DES
, NULL
, 0, 0, 0, &DesInst
);
161 /* Finally, have BlockCryptor do its setup */
162 setup(DES3_BLOCK_SIZE_BYTES
, context
);
166 * Functions called by BlockCryptor
167 * DES does encrypt/decrypt in place
169 void DES3Context::encryptBlock(
170 const void *plainText
, // length implied (one block)
173 size_t &cipherTextLen
, // in/out, throws on overflow
174 bool final
) // ignored
176 if(plainTextLen
!= DES3_BLOCK_SIZE_BYTES
) {
177 CssmError::throwMe(CSSMERR_CSP_INPUT_LENGTH_ERROR
);
179 if(cipherTextLen
< DES3_BLOCK_SIZE_BYTES
) {
180 CssmError::throwMe(CSSMERR_CSP_OUTPUT_LENGTH_ERROR
);
182 (void) CCCryptorEncryptDataBlock(DesInst
, NULL
, plainText
, DES3_BLOCK_SIZE_BYTES
, cipherText
);
183 cipherTextLen
= DES3_BLOCK_SIZE_BYTES
;
186 void DES3Context::decryptBlock(
187 const void *cipherText
, // length implied (one block)
188 size_t cipherTextLen
,
190 size_t &plainTextLen
, // in/out, throws on overflow
191 bool final
) // ignored
193 if(plainTextLen
< DES3_BLOCK_SIZE_BYTES
) {
194 CssmError::throwMe(CSSMERR_CSP_OUTPUT_LENGTH_ERROR
);
196 (void) CCCryptorDecryptDataBlock(DesInst
, NULL
, cipherText
, DES3_BLOCK_SIZE_BYTES
, plainText
);
197 plainTextLen
= DES3_BLOCK_SIZE_BYTES
;