metaCrypt.c revision 4841:72ccafc74ba8
1351282Sdim/* 2351282Sdim * CDDL HEADER START 3351282Sdim * 4351282Sdim * The contents of this file are subject to the terms of the 5351282Sdim * Common Development and Distribution License (the "License"). 6351282Sdim * You may not use this file except in compliance with the License. 7351282Sdim * 8351282Sdim * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9351282Sdim * or http://www.opensolaris.org/os/licensing. 10351282Sdim * See the License for the specific language governing permissions 11351282Sdim * and limitations under the License. 12351282Sdim * 13351282Sdim * When distributing Covered Code, include this CDDL HEADER in each 14351282Sdim * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15351282Sdim * If applicable, add the following below this CDDL HEADER, with the 16351282Sdim * fields enclosed by brackets "[]" replaced with your own identifying 17351282Sdim * information: Portions Copyright [yyyy] [name of copyright owner] 18351282Sdim * 19351282Sdim * CDDL HEADER END 20351282Sdim */ 21351282Sdim/* 22351282Sdim * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23351282Sdim * Use is subject to license terms. 24351282Sdim */ 25351282Sdim 26351282Sdim#pragma ident "%Z%%M% %I% %E% SMI" 27351282Sdim 28351282Sdim/* 29351282Sdim * Encryption and Decryption Functions 30351282Sdim * (as defined in PKCS#11 spec sections 11.8 and 11.9) 31351282Sdim */ 32351282Sdim 33351282Sdim#include "metaGlobal.h" 34351282Sdim 35351282Sdim 36351282Sdim/* 37351282Sdim * meta_EncryptInit 38351282Sdim * 39351282Sdim */ 40351282SdimCK_RV 41351282Sdimmeta_EncryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 42351282Sdim CK_OBJECT_HANDLE hKey) 43351282Sdim{ 44351282Sdim CK_RV rv; 45351282Sdim meta_session_t *session; 46351282Sdim meta_object_t *key; 47351282Sdim 48351282Sdim if (pMechanism == NULL) 49351282Sdim return (CKR_ARGUMENTS_BAD); 50351282Sdim 51351282Sdim rv = meta_handle2session(hSession, &session); 52351282Sdim if (rv != CKR_OK) 53351282Sdim return (rv); 54351282Sdim 55351282Sdim rv = meta_handle2object(hKey, &key); 56351282Sdim if (rv != CKR_OK) { 57351282Sdim REFRELEASE(session); 58351282Sdim return (rv); 59351282Sdim } 60351282Sdim 61351282Sdim rv = meta_operation_init_defer(CKF_ENCRYPT, session, pMechanism, key); 62360784Sdim 63351282Sdim OBJRELEASE(key); 64351282Sdim REFRELEASE(session); 65351282Sdim 66351282Sdim return (rv); 67351282Sdim} 68351282Sdim 69351282Sdim 70351282Sdim/* 71351282Sdim * meta_Encrypt 72351282Sdim * 73351282Sdim */ 74351282SdimCK_RV 75351282Sdimmeta_Encrypt(CK_SESSION_HANDLE hSession, 76351282Sdim CK_BYTE_PTR pData, CK_ULONG ulDataLen, 77351282Sdim CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen) 78351282Sdim{ 79351282Sdim CK_RV rv; 80351282Sdim meta_session_t *session; 81351282Sdim 82351282Sdim rv = meta_handle2session(hSession, &session); 83351282Sdim if (rv != CKR_OK) 84351282Sdim return (rv); 85351282Sdim 86351282Sdim if (pData == NULL || pulEncryptedDataLen == NULL) { 87351282Sdim meta_operation_cleanup(session, CKF_ENCRYPT, FALSE); 88351282Sdim REFRELEASE(session); 89351282Sdim return (CKR_ARGUMENTS_BAD); 90351282Sdim } 91351282Sdim 92351282Sdim rv = meta_do_operation(CKF_ENCRYPT, MODE_SINGLE, session, NULL, 93351282Sdim pData, ulDataLen, pEncryptedData, pulEncryptedDataLen); 94351282Sdim 95351282Sdim REFRELEASE(session); 96351282Sdim 97351282Sdim return (rv); 98351282Sdim} 99351282Sdim 100351282Sdim 101351282Sdim/* 102351282Sdim * meta_EncryptUpdate 103351282Sdim * 104351282Sdim */ 105351282SdimCK_RV 106351282Sdimmeta_EncryptUpdate(CK_SESSION_HANDLE hSession, 107351282Sdim CK_BYTE_PTR pPart, CK_ULONG ulPartLen, 108351282Sdim CK_BYTE_PTR pEncryptedPart, CK_ULONG_PTR pulEncryptedPartLen) 109351282Sdim{ 110351282Sdim CK_RV rv; 111351282Sdim meta_session_t *session; 112351282Sdim 113351282Sdim rv = meta_handle2session(hSession, &session); 114351282Sdim if (rv != CKR_OK) 115351282Sdim return (rv); 116351282Sdim 117351282Sdim if (pPart == NULL || pulEncryptedPartLen == NULL) { 118351282Sdim meta_operation_cleanup(session, CKF_ENCRYPT, FALSE); 119351282Sdim REFRELEASE(session); 120351282Sdim return (CKR_ARGUMENTS_BAD); 121351282Sdim } 122351282Sdim 123351282Sdim rv = meta_do_operation(CKF_ENCRYPT, MODE_UPDATE, session, NULL, 124351282Sdim pPart, ulPartLen, pEncryptedPart, pulEncryptedPartLen); 125351282Sdim 126351282Sdim REFRELEASE(session); 127351282Sdim 128351282Sdim return (rv); 129351282Sdim} 130351282Sdim 131351282Sdim 132351282Sdim/* 133360784Sdim * meta_EncryptFinal 134351282Sdim * 135351282Sdim */ 136351282SdimCK_RV 137351282Sdimmeta_EncryptFinal(CK_SESSION_HANDLE hSession, 138351282Sdim CK_BYTE_PTR pLastEncryptedPart, CK_ULONG_PTR pulLastEncryptedPartLen) 139351282Sdim{ 140351282Sdim CK_RV rv; 141351282Sdim meta_session_t *session; 142351282Sdim 143351282Sdim rv = meta_handle2session(hSession, &session); 144351282Sdim if (rv != CKR_OK) 145351282Sdim return (rv); 146351282Sdim 147351282Sdim if (pulLastEncryptedPartLen == NULL) { 148351282Sdim meta_operation_cleanup(session, CKF_ENCRYPT, FALSE); 149351282Sdim REFRELEASE(session); 150351282Sdim return (CKR_ARGUMENTS_BAD); 151351282Sdim } 152351282Sdim 153351282Sdim rv = meta_do_operation(CKF_ENCRYPT, MODE_FINAL, session, NULL, 154351282Sdim NULL, 0, pLastEncryptedPart, pulLastEncryptedPartLen); 155360784Sdim 156360784Sdim REFRELEASE(session); 157360784Sdim 158360784Sdim return (rv); 159360784Sdim} 160351282Sdim 161351282Sdim 162351282Sdim/* 163360784Sdim * meta_DecryptInit 164351282Sdim * 165351282Sdim */ 166351282SdimCK_RV 167351282Sdimmeta_DecryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 168351282Sdim CK_OBJECT_HANDLE hKey) 169351282Sdim{ 170351282Sdim CK_RV rv; 171351282Sdim meta_session_t *session; 172351282Sdim meta_object_t *key; 173351282Sdim 174351282Sdim if (pMechanism == NULL) 175351282Sdim return (CKR_ARGUMENTS_BAD); 176351282Sdim 177351282Sdim rv = meta_handle2session(hSession, &session); 178351282Sdim if (rv != CKR_OK) 179351282Sdim return (rv); 180351282Sdim 181351282Sdim rv = meta_handle2object(hKey, &key); 182351282Sdim if (rv != CKR_OK) { 183351282Sdim REFRELEASE(session); 184351282Sdim return (rv); 185351282Sdim } 186351282Sdim 187351282Sdim rv = meta_operation_init_defer(CKF_DECRYPT, session, pMechanism, key); 188351282Sdim 189351282Sdim OBJRELEASE(key); 190351282Sdim REFRELEASE(session); 191351282Sdim 192351282Sdim return (rv); 193351282Sdim} 194351282Sdim 195351282Sdim 196351282Sdim/* 197351282Sdim * meta_Decrypt 198351282Sdim * 199351282Sdim */ 200351282SdimCK_RV 201351282Sdimmeta_Decrypt(CK_SESSION_HANDLE hSession, 202351282Sdim CK_BYTE_PTR pEncryptedData, CK_ULONG ulEncryptedDataLen, 203351282Sdim CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen) 204351282Sdim{ 205351282Sdim CK_RV rv; 206351282Sdim meta_session_t *session; 207351282Sdim 208360784Sdim rv = meta_handle2session(hSession, &session); 209351282Sdim if (rv != CKR_OK) 210351282Sdim return (rv); 211351282Sdim 212351282Sdim if (pEncryptedData == NULL || pulDataLen == NULL) { 213351282Sdim meta_operation_cleanup(session, CKF_DECRYPT, FALSE); 214351282Sdim REFRELEASE(session); 215351282Sdim return (CKR_ARGUMENTS_BAD); 216351282Sdim } 217360784Sdim 218351282Sdim rv = meta_do_operation(CKF_DECRYPT, MODE_SINGLE, session, NULL, 219351282Sdim pEncryptedData, ulEncryptedDataLen, pData, pulDataLen); 220351282Sdim 221360784Sdim REFRELEASE(session); 222351282Sdim 223360784Sdim return (rv); 224360784Sdim} 225360784Sdim 226351282Sdim 227351282Sdim/* 228360784Sdim * meta_DecryptUpdate 229360784Sdim * 230360784Sdim */ 231360784SdimCK_RV 232360784Sdimmeta_DecryptUpdate(CK_SESSION_HANDLE hSession, 233360784Sdim CK_BYTE_PTR pEncryptedPart, CK_ULONG ulEncryptedPartLen, 234360784Sdim CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen) 235360784Sdim{ 236360784Sdim CK_RV rv; 237360784Sdim meta_session_t *session; 238360784Sdim 239351282Sdim rv = meta_handle2session(hSession, &session); 240351282Sdim if (rv != CKR_OK) 241351282Sdim return (rv); 242351282Sdim 243360784Sdim if (pEncryptedPart == NULL || pulPartLen == NULL) { 244351282Sdim meta_operation_cleanup(session, CKF_DECRYPT, FALSE); 245351282Sdim REFRELEASE(session); 246351282Sdim return (CKR_ARGUMENTS_BAD); 247351282Sdim } 248351282Sdim 249351282Sdim rv = meta_do_operation(CKF_DECRYPT, MODE_UPDATE, session, NULL, 250351282Sdim pEncryptedPart, ulEncryptedPartLen, pPart, pulPartLen); 251351282Sdim 252351282Sdim REFRELEASE(session); 253351282Sdim 254351282Sdim return (rv); 255351282Sdim} 256351282Sdim 257351282Sdim 258351282Sdim/* 259351282Sdim * meta_DecryptFinal 260351282Sdim * 261351282Sdim */ 262351282SdimCK_RV 263351282Sdimmeta_DecryptFinal(CK_SESSION_HANDLE hSession, 264351282Sdim CK_BYTE_PTR pLastPart, CK_ULONG_PTR pulLastPartLen) 265351282Sdim{ 266351282Sdim CK_RV rv; 267351282Sdim meta_session_t *session; 268351282Sdim 269351282Sdim rv = meta_handle2session(hSession, &session); 270351282Sdim if (rv != CKR_OK) 271351282Sdim return (rv); 272351282Sdim 273351282Sdim if (pulLastPartLen == NULL) { 274351282Sdim meta_operation_cleanup(session, CKF_DECRYPT, FALSE); 275360784Sdim REFRELEASE(session); 276351282Sdim return (CKR_ARGUMENTS_BAD); 277351282Sdim } 278351282Sdim 279351282Sdim rv = meta_do_operation(CKF_DECRYPT, MODE_FINAL, session, NULL, 280351282Sdim NULL, 0, pLastPart, pulLastPartLen); 281351282Sdim 282351282Sdim REFRELEASE(session); 283351282Sdim 284351282Sdim return (rv); 285351282Sdim} 286351282Sdim