| OLD | NEW |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | 1 /* This Source Code Form is subject to the terms of the Mozilla Public |
| 2 * License, v. 2.0. If a copy of the MPL was not distributed with this | 2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| 4 /* | 4 /* |
| 5 * This file implements PKCS 11 on top of our existing security modules | 5 * This file implements PKCS 11 on top of our existing security modules |
| 6 * | 6 * |
| 7 * For more information about PKCS 11 See PKCS 11 Token Inteface Standard. | 7 * For more information about PKCS 11 See PKCS 11 Token Inteface Standard. |
| 8 * This implementation has two slots: | 8 * This implementation has two slots: |
| 9 * slot 1 is our generic crypto support. It does not require login. | 9 * slot 1 is our generic crypto support. It does not require login. |
| 10 * It supports Public Key ops, and all they bulk ciphers and hashes. | 10 * It supports Public Key ops, and all they bulk ciphers and hashes. |
| (...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1166 /* make sure we're legal */ | 1166 /* make sure we're legal */ |
| 1167 crv = sftk_GetContext(hSession,&context,SFTK_DECRYPT,PR_TRUE,&session); | 1167 crv = sftk_GetContext(hSession,&context,SFTK_DECRYPT,PR_TRUE,&session); |
| 1168 if (crv != CKR_OK) return crv; | 1168 if (crv != CKR_OK) return crv; |
| 1169 | 1169 |
| 1170 *pulLastPartLen = 0; | 1170 *pulLastPartLen = 0; |
| 1171 if (!pLastPart) { | 1171 if (!pLastPart) { |
| 1172 /* caller is checking the amount of remaining data */ | 1172 /* caller is checking the amount of remaining data */ |
| 1173 if (context->padDataLength > 0) { | 1173 if (context->padDataLength > 0) { |
| 1174 *pulLastPartLen = context->padDataLength; | 1174 *pulLastPartLen = context->padDataLength; |
| 1175 } | 1175 } |
| 1176 rv = SECSuccess; | |
| 1177 goto finish; | 1176 goto finish; |
| 1178 } | 1177 } |
| 1179 | 1178 |
| 1180 if (context->doPad) { | 1179 if (context->doPad) { |
| 1181 /* decrypt our saved buffer */ | 1180 /* decrypt our saved buffer */ |
| 1182 if (context->padDataLength != 0) { | 1181 if (context->padDataLength != 0) { |
| 1183 /* this assumes that pLastPart is big enough to hold the *whole* | 1182 /* this assumes that pLastPart is big enough to hold the *whole* |
| 1184 * buffer!!! */ | 1183 * buffer!!! */ |
| 1185 rv = (*context->update)(context->cipherInfo, pLastPart, &outlen, | 1184 rv = (*context->update)(context->cipherInfo, pLastPart, &outlen, |
| 1186 maxout, context->padBuf, context->blockSize); | 1185 maxout, context->padBuf, context->blockSize); |
| 1187 » if (rv == SECSuccess) { | 1186 » if (rv != SECSuccess) { |
| 1187 » » crv = sftk_MapDecryptError(PORT_GetError()); |
| 1188 » } else { |
| 1188 unsigned int padSize = | 1189 unsigned int padSize = |
| 1189 (unsigned int) pLastPart[context->blockSize-1]; | 1190 (unsigned int) pLastPart[context->blockSize-1]; |
| 1190 if ((padSize > context->blockSize) || (padSize == 0)) { | 1191 if ((padSize > context->blockSize) || (padSize == 0)) { |
| 1191 » » rv = SECFailure; | 1192 » » crv = CKR_ENCRYPTED_DATA_INVALID; |
| 1192 } else { | 1193 } else { |
| 1193 » » *pulLastPartLen = outlen - padSize; | 1194 » » unsigned int i; |
| 1195 » » unsigned int badPadding = 0; /* used as a boolean */ |
| 1196 » » for (i = 0; i < padSize; i++) { |
| 1197 » » » badPadding |= |
| 1198 » » » (unsigned int) pLastPart[context->blockSize-1-i] ^ |
| 1199 » » » padSize; |
| 1200 » » } |
| 1201 » » if (badPadding) { |
| 1202 » » » crv = CKR_ENCRYPTED_DATA_INVALID; |
| 1203 » » } else { |
| 1204 » » » *pulLastPartLen = outlen - padSize; |
| 1205 » » } |
| 1194 } | 1206 } |
| 1195 } | 1207 } |
| 1196 } | 1208 } |
| 1197 } | 1209 } |
| 1198 | 1210 |
| 1199 sftk_TerminateOp( session, SFTK_DECRYPT, context ); | 1211 sftk_TerminateOp( session, SFTK_DECRYPT, context ); |
| 1200 finish: | 1212 finish: |
| 1201 sftk_FreeSession(session); | 1213 sftk_FreeSession(session); |
| 1202 return (rv == SECSuccess) ? CKR_OK : sftk_MapDecryptError(PORT_GetError()); | 1214 return crv; |
| 1203 } | 1215 } |
| 1204 | 1216 |
| 1205 /* NSC_Decrypt decrypts encrypted data in a single part. */ | 1217 /* NSC_Decrypt decrypts encrypted data in a single part. */ |
| 1206 CK_RV NSC_Decrypt(CK_SESSION_HANDLE hSession, | 1218 CK_RV NSC_Decrypt(CK_SESSION_HANDLE hSession, |
| 1207 CK_BYTE_PTR pEncryptedData,CK_ULONG ulEncryptedDataLen,CK_BYTE_PTR pData, | 1219 CK_BYTE_PTR pEncryptedData,CK_ULONG ulEncryptedDataLen,CK_BYTE_PTR pData, |
| 1208 CK_ULONG_PTR pulDataLen) | 1220 CK_ULONG_PTR pulDataLen) |
| 1209 { | 1221 { |
| 1210 SFTKSession *session; | 1222 SFTKSession *session; |
| 1211 SFTKSessionContext *context; | 1223 SFTKSessionContext *context; |
| 1212 unsigned int outlen; | 1224 unsigned int outlen; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1242 if (crv2 == CKR_OK) | 1254 if (crv2 == CKR_OK) |
| 1243 *pulDataLen += finalLen; | 1255 *pulDataLen += finalLen; |
| 1244 return crv == CKR_OK ? crv2 : crv; | 1256 return crv == CKR_OK ? crv2 : crv; |
| 1245 } | 1257 } |
| 1246 | 1258 |
| 1247 rv = (*context->update)(context->cipherInfo, pData, &outlen, maxoutlen, | 1259 rv = (*context->update)(context->cipherInfo, pData, &outlen, maxoutlen, |
| 1248 pEncryptedData, ulEncryptedDataLen); | 1260 pEncryptedData, ulEncryptedDataLen); |
| 1249 /* XXX need to do MUCH better error mapping than this. */ | 1261 /* XXX need to do MUCH better error mapping than this. */ |
| 1250 crv = (rv == SECSuccess) ? CKR_OK : sftk_MapDecryptError(PORT_GetError()); | 1262 crv = (rv == SECSuccess) ? CKR_OK : sftk_MapDecryptError(PORT_GetError()); |
| 1251 if (rv == SECSuccess && context->doPad) { | 1263 if (rv == SECSuccess && context->doPad) { |
| 1252 » CK_ULONG padding = pData[outlen - 1]; | 1264 » unsigned int padding = pData[outlen - 1]; |
| 1253 if (padding > context->blockSize || !padding) { | 1265 if (padding > context->blockSize || !padding) { |
| 1254 crv = CKR_ENCRYPTED_DATA_INVALID; | 1266 crv = CKR_ENCRYPTED_DATA_INVALID; |
| 1255 » } else | 1267 » } else { |
| 1256 » outlen -= padding; | 1268 » unsigned int i; |
| 1269 » unsigned int badPadding = 0; /* used as a boolean */ |
| 1270 » for (i = 0; i < padding; i++) { |
| 1271 » » badPadding |= (unsigned int) pData[outlen - 1 - i] ^ padding; |
| 1272 » } |
| 1273 » if (badPadding) { |
| 1274 » » crv = CKR_ENCRYPTED_DATA_INVALID; |
| 1275 » } else { |
| 1276 » » outlen -= padding; |
| 1277 » } |
| 1278 » } |
| 1257 } | 1279 } |
| 1258 *pulDataLen = (CK_ULONG) outlen; | 1280 *pulDataLen = (CK_ULONG) outlen; |
| 1259 sftk_TerminateOp( session, SFTK_DECRYPT, context ); | 1281 sftk_TerminateOp( session, SFTK_DECRYPT, context ); |
| 1260 finish: | 1282 finish: |
| 1261 sftk_FreeSession(session); | 1283 sftk_FreeSession(session); |
| 1262 return crv; | 1284 return crv; |
| 1263 } | 1285 } |
| 1264 | 1286 |
| 1265 | 1287 |
| 1266 | 1288 |
| (...skipping 5497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6764 att = sftk_FindAttribute(key,CKA_VALUE); | 6786 att = sftk_FindAttribute(key,CKA_VALUE); |
| 6765 sftk_FreeObject(key); | 6787 sftk_FreeObject(key); |
| 6766 if (!att) { | 6788 if (!att) { |
| 6767 return CKR_KEY_HANDLE_INVALID; | 6789 return CKR_KEY_HANDLE_INVALID; |
| 6768 } | 6790 } |
| 6769 crv = NSC_DigestUpdate(hSession,(CK_BYTE_PTR)att->attrib.pValue, | 6791 crv = NSC_DigestUpdate(hSession,(CK_BYTE_PTR)att->attrib.pValue, |
| 6770 att->attrib.ulValueLen); | 6792 att->attrib.ulValueLen); |
| 6771 sftk_FreeAttribute(att); | 6793 sftk_FreeAttribute(att); |
| 6772 return crv; | 6794 return crv; |
| 6773 } | 6795 } |
| OLD | NEW |