147e946e7SWyllys Ingersoll /*
247e946e7SWyllys Ingersoll * Common Public License Version 0.5
347e946e7SWyllys Ingersoll *
447e946e7SWyllys Ingersoll * THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF
547e946e7SWyllys Ingersoll * THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE,
647e946e7SWyllys Ingersoll * REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES
747e946e7SWyllys Ingersoll * RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
847e946e7SWyllys Ingersoll *
947e946e7SWyllys Ingersoll * 1. DEFINITIONS
1047e946e7SWyllys Ingersoll *
1147e946e7SWyllys Ingersoll * "Contribution" means:
1247e946e7SWyllys Ingersoll * a) in the case of the initial Contributor, the
1347e946e7SWyllys Ingersoll * initial code and documentation distributed under
1447e946e7SWyllys Ingersoll * this Agreement, and
1547e946e7SWyllys Ingersoll *
1647e946e7SWyllys Ingersoll * b) in the case of each subsequent Contributor:
1747e946e7SWyllys Ingersoll * i) changes to the Program, and
1847e946e7SWyllys Ingersoll * ii) additions to the Program;
1947e946e7SWyllys Ingersoll *
2047e946e7SWyllys Ingersoll * where such changes and/or additions to the Program
2147e946e7SWyllys Ingersoll * originate from and are distributed by that
2247e946e7SWyllys Ingersoll * particular Contributor. A Contribution 'originates'
2347e946e7SWyllys Ingersoll * from a Contributor if it was added to the Program
2447e946e7SWyllys Ingersoll * by such Contributor itself or anyone acting on such
2547e946e7SWyllys Ingersoll * Contributor's behalf. Contributions do not include
2647e946e7SWyllys Ingersoll * additions to the Program which: (i) are separate
2747e946e7SWyllys Ingersoll * modules of software distributed in conjunction with
2847e946e7SWyllys Ingersoll * the Program under their own license agreement, and
2947e946e7SWyllys Ingersoll * (ii) are not derivative works of the Program.
3047e946e7SWyllys Ingersoll *
3147e946e7SWyllys Ingersoll *
3247e946e7SWyllys Ingersoll * "Contributor" means any person or entity that distributes
3347e946e7SWyllys Ingersoll * the Program.
3447e946e7SWyllys Ingersoll *
3547e946e7SWyllys Ingersoll * "Licensed Patents " mean patent claims licensable by a
3647e946e7SWyllys Ingersoll * Contributor which are necessarily infringed by the use or
3747e946e7SWyllys Ingersoll * sale of its Contribution alone or when combined with the
3847e946e7SWyllys Ingersoll * Program.
3947e946e7SWyllys Ingersoll *
4047e946e7SWyllys Ingersoll * "Program" means the Contributions distributed in
4147e946e7SWyllys Ingersoll * accordance with this Agreement.
4247e946e7SWyllys Ingersoll *
4347e946e7SWyllys Ingersoll * "Recipient" means anyone who receives the Program under
4447e946e7SWyllys Ingersoll * this Agreement, including all Contributors.
4547e946e7SWyllys Ingersoll *
4647e946e7SWyllys Ingersoll * 2. GRANT OF RIGHTS
4747e946e7SWyllys Ingersoll *
4847e946e7SWyllys Ingersoll * a) Subject to the terms of this Agreement, each
4947e946e7SWyllys Ingersoll * Contributor hereby grants Recipient a
5047e946e7SWyllys Ingersoll * no - exclusive, worldwide, royalt - free copyright
5147e946e7SWyllys Ingersoll * license to reproduce, prepare derivative works of,
5247e946e7SWyllys Ingersoll * publicly display, publicly perform, distribute and
5347e946e7SWyllys Ingersoll * sublicense the Contribution of such Contributor, if
5447e946e7SWyllys Ingersoll * any, and such derivative works, in source code and
5547e946e7SWyllys Ingersoll * object code form.
5647e946e7SWyllys Ingersoll *
5747e946e7SWyllys Ingersoll * b) Subject to the terms of this Agreement, each
5847e946e7SWyllys Ingersoll * Contributor hereby grants Recipient a
5947e946e7SWyllys Ingersoll * no - exclusive, worldwide, royalt - free patent
6047e946e7SWyllys Ingersoll * license under Licensed Patents to make, use, sell,
6147e946e7SWyllys Ingersoll * offer to sell, import and otherwise transfer the
6247e946e7SWyllys Ingersoll * Contribution of such Contributor, if any, in source
6347e946e7SWyllys Ingersoll * code and object code form. This patent license
6447e946e7SWyllys Ingersoll * shall apply to the combination of the Contribution
6547e946e7SWyllys Ingersoll * and the Program if, at the time the Contribution is
6647e946e7SWyllys Ingersoll * added by the Contributor, such addition of the
6747e946e7SWyllys Ingersoll * Contribution causes such combination to be covered
6847e946e7SWyllys Ingersoll * by the Licensed Patents. The patent license shall
6947e946e7SWyllys Ingersoll * not apply to any other combinations which include
7047e946e7SWyllys Ingersoll * the Contribution. No hardware per se is licensed
7147e946e7SWyllys Ingersoll * hereunder.
7247e946e7SWyllys Ingersoll *
7347e946e7SWyllys Ingersoll * c) Recipient understands that although each
7447e946e7SWyllys Ingersoll * Contributor grants the licenses to its
7547e946e7SWyllys Ingersoll * Contributions set forth herein, no assurances are
7647e946e7SWyllys Ingersoll * provided by any Contributor that the Program does
7747e946e7SWyllys Ingersoll * not infringe the patent or other intellectual
7847e946e7SWyllys Ingersoll * property rights of any other entity. Each
7947e946e7SWyllys Ingersoll * Contributor disclaims any liability to Recipient
8047e946e7SWyllys Ingersoll * for claims brought by any other entity based on
8147e946e7SWyllys Ingersoll * infringement of intellectual property rights or
8247e946e7SWyllys Ingersoll * otherwise. As a condition to exercising the rights
8347e946e7SWyllys Ingersoll * and licenses granted hereunder, each Recipient
8447e946e7SWyllys Ingersoll * hereby assumes sole responsibility to secure any
8547e946e7SWyllys Ingersoll * other intellectual property rights needed, if any.
8647e946e7SWyllys Ingersoll *
8747e946e7SWyllys Ingersoll * For example, if a third party patent license is
8847e946e7SWyllys Ingersoll * required to allow Recipient to distribute the
8947e946e7SWyllys Ingersoll * Program, it is Recipient's responsibility to
9047e946e7SWyllys Ingersoll * acquire that license before distributing the
9147e946e7SWyllys Ingersoll * Program.
9247e946e7SWyllys Ingersoll *
9347e946e7SWyllys Ingersoll * d) Each Contributor represents that to its
9447e946e7SWyllys Ingersoll * knowledge it has sufficient copyright rights in its
9547e946e7SWyllys Ingersoll * Contribution, if any, to grant the copyright
9647e946e7SWyllys Ingersoll * license set forth in this Agreement.
9747e946e7SWyllys Ingersoll *
9847e946e7SWyllys Ingersoll * 3. REQUIREMENTS
9947e946e7SWyllys Ingersoll *
10047e946e7SWyllys Ingersoll * A Contributor may choose to distribute the Program in
10147e946e7SWyllys Ingersoll * object code form under its own license agreement, provided
10247e946e7SWyllys Ingersoll * that:
10347e946e7SWyllys Ingersoll * a) it complies with the terms and conditions of
10447e946e7SWyllys Ingersoll * this Agreement; and
10547e946e7SWyllys Ingersoll *
10647e946e7SWyllys Ingersoll * b) its license agreement:
10747e946e7SWyllys Ingersoll * i) effectively disclaims on behalf of all
10847e946e7SWyllys Ingersoll * Contributors all warranties and conditions, express
10947e946e7SWyllys Ingersoll * and implied, including warranties or conditions of
11047e946e7SWyllys Ingersoll * title and no - infringement, and implied warranties
11147e946e7SWyllys Ingersoll * or conditions of merchantability and fitness for a
11247e946e7SWyllys Ingersoll * particular purpose;
11347e946e7SWyllys Ingersoll *
11447e946e7SWyllys Ingersoll * ii) effectively excludes on behalf of all
11547e946e7SWyllys Ingersoll * Contributors all liability for damages, including
11647e946e7SWyllys Ingersoll * direct, indirect, special, incidental and
11747e946e7SWyllys Ingersoll * consequential damages, such as lost profits;
11847e946e7SWyllys Ingersoll *
11947e946e7SWyllys Ingersoll * iii) states that any provisions which differ from
12047e946e7SWyllys Ingersoll * this Agreement are offered by that Contributor
12147e946e7SWyllys Ingersoll * alone and not by any other party; and
12247e946e7SWyllys Ingersoll *
12347e946e7SWyllys Ingersoll * iv) states that source code for the Program is
12447e946e7SWyllys Ingersoll * available from such Contributor, and informs
12547e946e7SWyllys Ingersoll * licensees how to obtain it in a reasonable manner
12647e946e7SWyllys Ingersoll * on or through a medium customarily used for
12747e946e7SWyllys Ingersoll * software exchange.
12847e946e7SWyllys Ingersoll *
12947e946e7SWyllys Ingersoll * When the Program is made available in source code form:
13047e946e7SWyllys Ingersoll * a) it must be made available under this Agreement;
13147e946e7SWyllys Ingersoll * and
13247e946e7SWyllys Ingersoll * b) a copy of this Agreement must be included with
13347e946e7SWyllys Ingersoll * each copy of the Program.
13447e946e7SWyllys Ingersoll *
13547e946e7SWyllys Ingersoll * Contributors may not remove or alter any copyright notices
13647e946e7SWyllys Ingersoll * contained within the Program.
13747e946e7SWyllys Ingersoll *
13847e946e7SWyllys Ingersoll * Each Contributor must identify itself as the originator of
13947e946e7SWyllys Ingersoll * its Contribution, if any, in a manner that reasonably
14047e946e7SWyllys Ingersoll * allows subsequent Recipients to identify the originator of
14147e946e7SWyllys Ingersoll * the Contribution.
14247e946e7SWyllys Ingersoll *
14347e946e7SWyllys Ingersoll *
14447e946e7SWyllys Ingersoll * 4. COMMERCIAL DISTRIBUTION
14547e946e7SWyllys Ingersoll *
14647e946e7SWyllys Ingersoll * Commercial distributors of software may accept certain
14747e946e7SWyllys Ingersoll * responsibilities with respect to end users, business
14847e946e7SWyllys Ingersoll * partners and the like. While this license is intended to
14947e946e7SWyllys Ingersoll * facilitate the commercial use of the Program, the
15047e946e7SWyllys Ingersoll * Contributor who includes the Program in a commercial
15147e946e7SWyllys Ingersoll * product offering should do so in a manner which does not
15247e946e7SWyllys Ingersoll * create potential liability for other Contributors.
15347e946e7SWyllys Ingersoll * Therefore, if a Contributor includes the Program in a
15447e946e7SWyllys Ingersoll * commercial product offering, such Contributor ("Commercial
15547e946e7SWyllys Ingersoll * Contributor") hereby agrees to defend and indemnify every
15647e946e7SWyllys Ingersoll * other Contributor ("Indemnified Contributor") against any
15747e946e7SWyllys Ingersoll * losses, damages and costs (collectively "Losses") arising
15847e946e7SWyllys Ingersoll * from claims, lawsuits and other legal actions brought by a
15947e946e7SWyllys Ingersoll * third party against the Indemnified Contributor to the
16047e946e7SWyllys Ingersoll * extent caused by the acts or omissions of such Commercial
16147e946e7SWyllys Ingersoll * Contributor in connection with its distribution of the
16247e946e7SWyllys Ingersoll * Program in a commercial product offering. The obligations
16347e946e7SWyllys Ingersoll * in this section do not apply to any claims or Losses
16447e946e7SWyllys Ingersoll * relating to any actual or alleged intellectual property
16547e946e7SWyllys Ingersoll * infringement. In order to qualify, an Indemnified
16647e946e7SWyllys Ingersoll * Contributor must: a) promptly notify the Commercial
16747e946e7SWyllys Ingersoll * Contributor in writing of such claim, and b) allow the
16847e946e7SWyllys Ingersoll * Commercial Contributor to control, and cooperate with the
16947e946e7SWyllys Ingersoll * Commercial Contributor in, the defense and any related
17047e946e7SWyllys Ingersoll * settlement negotiations. The Indemnified Contributor may
17147e946e7SWyllys Ingersoll * participate in any such claim at its own expense.
17247e946e7SWyllys Ingersoll *
17347e946e7SWyllys Ingersoll *
17447e946e7SWyllys Ingersoll * For example, a Contributor might include the Program in a
17547e946e7SWyllys Ingersoll * commercial product offering, Product X. That Contributor
17647e946e7SWyllys Ingersoll * is then a Commercial Contributor. If that Commercial
17747e946e7SWyllys Ingersoll * Contributor then makes performance claims, or offers
17847e946e7SWyllys Ingersoll * warranties related to Product X, those performance claims
17947e946e7SWyllys Ingersoll * and warranties are such Commercial Contributor's
18047e946e7SWyllys Ingersoll * responsibility alone. Under this section, the Commercial
18147e946e7SWyllys Ingersoll * Contributor would have to defend claims against the other
18247e946e7SWyllys Ingersoll * Contributors related to those performance claims and
18347e946e7SWyllys Ingersoll * warranties, and if a court requires any other Contributor
18447e946e7SWyllys Ingersoll * to pay any damages as a result, the Commercial Contributor
18547e946e7SWyllys Ingersoll * must pay those damages.
18647e946e7SWyllys Ingersoll *
18747e946e7SWyllys Ingersoll *
18847e946e7SWyllys Ingersoll * 5. NO WARRANTY
18947e946e7SWyllys Ingersoll *
19047e946e7SWyllys Ingersoll * EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE
19147e946e7SWyllys Ingersoll * PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
19247e946e7SWyllys Ingersoll * WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
19347e946e7SWyllys Ingersoll * IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
19447e946e7SWyllys Ingersoll * CONDITIONS OF TITLE, NO - INFRINGEMENT, MERCHANTABILITY OR
19547e946e7SWyllys Ingersoll * FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
19647e946e7SWyllys Ingersoll * responsible for determining the appropriateness of using
19747e946e7SWyllys Ingersoll * and distributing the Program and assumes all risks
19847e946e7SWyllys Ingersoll * associated with its exercise of rights under this
19947e946e7SWyllys Ingersoll * Agreement, including but not limited to the risks and
20047e946e7SWyllys Ingersoll * costs of program errors, compliance with applicable laws,
20147e946e7SWyllys Ingersoll * damage to or loss of data, programs or equipment, and
20247e946e7SWyllys Ingersoll * unavailability or interruption of operations.
20347e946e7SWyllys Ingersoll *
20447e946e7SWyllys Ingersoll * 6. DISCLAIMER OF LIABILITY
20547e946e7SWyllys Ingersoll * EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER
20647e946e7SWyllys Ingersoll * RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY
20747e946e7SWyllys Ingersoll * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
20847e946e7SWyllys Ingersoll * OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
20947e946e7SWyllys Ingersoll * LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
21047e946e7SWyllys Ingersoll * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21147e946e7SWyllys Ingersoll * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
21247e946e7SWyllys Ingersoll * OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE
21347e946e7SWyllys Ingersoll * OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
21447e946e7SWyllys Ingersoll * POSSIBILITY OF SUCH DAMAGES.
21547e946e7SWyllys Ingersoll *
21647e946e7SWyllys Ingersoll * 7. GENERAL
21747e946e7SWyllys Ingersoll *
21847e946e7SWyllys Ingersoll * If any provision of this Agreement is invalid or
21947e946e7SWyllys Ingersoll * unenforceable under applicable law, it shall not affect
22047e946e7SWyllys Ingersoll * the validity or enforceability of the remainder of the
22147e946e7SWyllys Ingersoll * terms of this Agreement, and without further action by the
22247e946e7SWyllys Ingersoll * parties hereto, such provision shall be reformed to the
22347e946e7SWyllys Ingersoll * minimum extent necessary to make such provision valid and
22447e946e7SWyllys Ingersoll * enforceable.
22547e946e7SWyllys Ingersoll *
22647e946e7SWyllys Ingersoll *
22747e946e7SWyllys Ingersoll * If Recipient institutes patent litigation against a
22847e946e7SWyllys Ingersoll * Contributor with respect to a patent applicable to
22947e946e7SWyllys Ingersoll * software (including a cros - claim or counterclaim in a
23047e946e7SWyllys Ingersoll * lawsuit), then any patent licenses granted by that
23147e946e7SWyllys Ingersoll * Contributor to such Recipient under this Agreement shall
23247e946e7SWyllys Ingersoll * terminate as of the date such litigation is filed. In
23347e946e7SWyllys Ingersoll * addition, If Recipient institutes patent litigation
23447e946e7SWyllys Ingersoll * against any entity (including a cros - claim or
23547e946e7SWyllys Ingersoll * counterclaim in a lawsuit) alleging that the Program
23647e946e7SWyllys Ingersoll * itself (excluding combinations of the Program with other
23747e946e7SWyllys Ingersoll * software or hardware) infringes such Recipient's
23847e946e7SWyllys Ingersoll * patent(s), then such Recipient's rights granted under
23947e946e7SWyllys Ingersoll * Section 2(b) shall terminate as of the date such
24047e946e7SWyllys Ingersoll * litigation is filed.
24147e946e7SWyllys Ingersoll *
24247e946e7SWyllys Ingersoll * All Recipient's rights under this Agreement shall
24347e946e7SWyllys Ingersoll * terminate if it fails to comply with any of the material
24447e946e7SWyllys Ingersoll * terms or conditions of this Agreement and does not cure
24547e946e7SWyllys Ingersoll * such failure in a reasonable period of time after becoming
24647e946e7SWyllys Ingersoll * aware of such noncompliance. If all Recipient's rights
24747e946e7SWyllys Ingersoll * under this Agreement terminate, Recipient agrees to cease
24847e946e7SWyllys Ingersoll * use and distribution of the Program as soon as reasonably
24947e946e7SWyllys Ingersoll * practicable. However, Recipient's obligations under this
25047e946e7SWyllys Ingersoll * Agreement and any licenses granted by Recipient relating
25147e946e7SWyllys Ingersoll * to the Program shall continue and survive.
25247e946e7SWyllys Ingersoll *
25347e946e7SWyllys Ingersoll * Everyone is permitted to copy and distribute copies of
25447e946e7SWyllys Ingersoll * this Agreement, but in order to avoid inconsistency the
25547e946e7SWyllys Ingersoll * Agreement is copyrighted and may only be modified in the
25647e946e7SWyllys Ingersoll * following manner. The Agreement Steward reserves the right
25747e946e7SWyllys Ingersoll * to publish new versions (including revisions) of this
25847e946e7SWyllys Ingersoll * Agreement from time to time. No one other than the
25947e946e7SWyllys Ingersoll * Agreement Steward has the right to modify this Agreement.
26047e946e7SWyllys Ingersoll *
26147e946e7SWyllys Ingersoll * IBM is the initial Agreement Steward. IBM may assign the
26247e946e7SWyllys Ingersoll * responsibility to serve as the Agreement Steward to a
26347e946e7SWyllys Ingersoll * suitable separate entity. Each new version of the
26447e946e7SWyllys Ingersoll * Agreement will be given a distinguishing version number.
26547e946e7SWyllys Ingersoll * The Program (including Contributions) may always be
26647e946e7SWyllys Ingersoll * distributed subject to the version of the Agreement under
26747e946e7SWyllys Ingersoll * which it was received. In addition, after a new version of
26847e946e7SWyllys Ingersoll * the Agreement is published, Contributor may elect to
26947e946e7SWyllys Ingersoll * distribute the Program (including its Contributions) under
27047e946e7SWyllys Ingersoll * the new version. Except as expressly stated in Sections
27147e946e7SWyllys Ingersoll * 2(a) and 2(b) above, Recipient receives no rights or
27247e946e7SWyllys Ingersoll * licenses to the intellectual property of any Contributor
27347e946e7SWyllys Ingersoll * under this Agreement, whether expressly, by implication,
27447e946e7SWyllys Ingersoll * estoppel or otherwise. All rights in the Program not
27547e946e7SWyllys Ingersoll * expressly granted under this Agreement are reserved.
27647e946e7SWyllys Ingersoll *
27747e946e7SWyllys Ingersoll *
27847e946e7SWyllys Ingersoll * This Agreement is governed by the laws of the State of New
27947e946e7SWyllys Ingersoll * York and the intellectual property laws of the United
28047e946e7SWyllys Ingersoll * States of America. No party to this Agreement will bring a
28147e946e7SWyllys Ingersoll * legal action under this Agreement more than one year after
28247e946e7SWyllys Ingersoll * the cause of action arose. Each party waives its rights to
28347e946e7SWyllys Ingersoll * a jury trial in any resulting litigation.
28447e946e7SWyllys Ingersoll *
28547e946e7SWyllys Ingersoll *
28647e946e7SWyllys Ingersoll *
28747e946e7SWyllys Ingersoll * (C) COPYRIGHT International Business Machines Corp. 2001, 2002
28847e946e7SWyllys Ingersoll */
28947e946e7SWyllys Ingersoll /*
29047e946e7SWyllys Ingersoll * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
29147e946e7SWyllys Ingersoll * Use is subject to license terms.
29247e946e7SWyllys Ingersoll */
29347e946e7SWyllys Ingersoll
29447e946e7SWyllys Ingersoll #include "tpmtok_int.h"
29547e946e7SWyllys Ingersoll
29647e946e7SWyllys Ingersoll #define LOG(x) logit(LOG_DEBUG, x)
29747e946e7SWyllys Ingersoll
29847e946e7SWyllys Ingersoll /*
29947e946e7SWyllys Ingersoll * NOTES:
30047e946e7SWyllys Ingersoll * In many cases the specificaiton does not allow returns
30147e946e7SWyllys Ingersoll * of CKR_ARGUMENTSB_BAD. We break the spec, since validation of parameters
30247e946e7SWyllys Ingersoll * to the function are best represented by this return code (where
30347e946e7SWyllys Ingersoll * specific RC's such as CKR_INVALID_SESSION do not exist).
30447e946e7SWyllys Ingersoll * NOTE NOTE NOTE NOTE
30547e946e7SWyllys Ingersoll * The parameter checking on the update operations may need to be
30647e946e7SWyllys Ingersoll * modified (as well as the encrypt/decrypt) to call the std API
30747e946e7SWyllys Ingersoll * anyway with sanatized parameters since on error, the encrypt/decrypt
30847e946e7SWyllys Ingersoll * sign operations are all supposed to complete.
30947e946e7SWyllys Ingersoll * Therefor the parameter checking here might need to be done in
31047e946e7SWyllys Ingersoll * the STDLL instead of the API.
31147e946e7SWyllys Ingersoll * This would affect ALL the Multipart operations which have
31247e946e7SWyllys Ingersoll * an init followed by one or more operations.
31347e946e7SWyllys Ingersoll *
31447e946e7SWyllys Ingersoll * Globals for the API
31547e946e7SWyllys Ingersoll */
31647e946e7SWyllys Ingersoll API_Proc_Struct_t *Anchor = NULL;
31747e946e7SWyllys Ingersoll static unsigned int Initialized = 0;
31847e946e7SWyllys Ingersoll static pthread_mutex_t global_mutex = PTHREAD_MUTEX_INITIALIZER;
31947e946e7SWyllys Ingersoll struct ST_FCN_LIST FuncList;
32047e946e7SWyllys Ingersoll CK_FUNCTION_LIST PK11_Functions;
321ab8176c2SWyllys Ingersoll extern pthread_rwlock_t obj_list_rw_mutex;
322ab8176c2SWyllys Ingersoll
323ab8176c2SWyllys Ingersoll
324ab8176c2SWyllys Ingersoll static void
tpmtoken_fork_prepare()325ab8176c2SWyllys Ingersoll tpmtoken_fork_prepare()
326ab8176c2SWyllys Ingersoll {
327ab8176c2SWyllys Ingersoll (void) pthread_mutex_lock(&global_mutex);
328ab8176c2SWyllys Ingersoll (void) pthread_mutex_lock(&pkcs_mutex);
329ab8176c2SWyllys Ingersoll (void) pthread_mutex_lock(&obj_list_mutex);
330ab8176c2SWyllys Ingersoll (void) pthread_rwlock_wrlock(&obj_list_rw_mutex);
331ab8176c2SWyllys Ingersoll (void) pthread_mutex_lock(&sess_list_mutex);
332ab8176c2SWyllys Ingersoll (void) pthread_mutex_lock(&login_mutex);
333ab8176c2SWyllys Ingersoll if (Anchor) {
334ab8176c2SWyllys Ingersoll (void) pthread_mutex_lock(&Anchor->ProcMutex);
335ab8176c2SWyllys Ingersoll (void) pthread_mutex_lock(&Anchor->SessListMutex);
336ab8176c2SWyllys Ingersoll }
337ab8176c2SWyllys Ingersoll }
33847e946e7SWyllys Ingersoll
33947e946e7SWyllys Ingersoll static void
tpmtoken_fork_parent()340ab8176c2SWyllys Ingersoll tpmtoken_fork_parent()
34147e946e7SWyllys Ingersoll {
34247e946e7SWyllys Ingersoll if (Anchor) {
343ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&Anchor->SessListMutex);
344ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&Anchor->ProcMutex);
345ab8176c2SWyllys Ingersoll }
346ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&login_mutex);
347ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&sess_list_mutex);
348ab8176c2SWyllys Ingersoll (void) pthread_rwlock_unlock(&obj_list_rw_mutex);
349ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&obj_list_mutex);
350ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&pkcs_mutex);
351ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
352ab8176c2SWyllys Ingersoll }
353ab8176c2SWyllys Ingersoll
354ab8176c2SWyllys Ingersoll static void
tpmtoken_fork_child()355ab8176c2SWyllys Ingersoll tpmtoken_fork_child()
356ab8176c2SWyllys Ingersoll {
357ab8176c2SWyllys Ingersoll if (Anchor) {
358ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&Anchor->SessListMutex);
359ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&Anchor->ProcMutex);
360ab8176c2SWyllys Ingersoll }
361ab8176c2SWyllys Ingersoll
362ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&login_mutex);
363ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&sess_list_mutex);
364ab8176c2SWyllys Ingersoll (void) pthread_rwlock_unlock(&obj_list_rw_mutex);
365ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&obj_list_mutex);
366ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&pkcs_mutex);
367ab8176c2SWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
368ab8176c2SWyllys Ingersoll
369ab8176c2SWyllys Ingersoll if (Anchor) {
370ab8176c2SWyllys Ingersoll Terminate_All_Process_Sessions();
37147e946e7SWyllys Ingersoll free(Anchor);
37247e946e7SWyllys Ingersoll Anchor = NULL;
37347e946e7SWyllys Ingersoll }
374ab8176c2SWyllys Ingersoll if (FuncList.ST_Finalize)
375ab8176c2SWyllys Ingersoll FuncList.ST_Finalize(0);
376ab8176c2SWyllys Ingersoll
37747e946e7SWyllys Ingersoll logterm();
37847e946e7SWyllys Ingersoll loginit();
37947e946e7SWyllys Ingersoll }
38047e946e7SWyllys Ingersoll
38147e946e7SWyllys Ingersoll /*ARGSUSED*/
38247e946e7SWyllys Ingersoll CK_RV
C_CancelFunction(CK_SESSION_HANDLE hSession)38347e946e7SWyllys Ingersoll C_CancelFunction(CK_SESSION_HANDLE hSession)
38447e946e7SWyllys Ingersoll {
38547e946e7SWyllys Ingersoll LOG("C_CancelFunction");
38647e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
38747e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
38847e946e7SWyllys Ingersoll }
38947e946e7SWyllys Ingersoll return (CKR_FUNCTION_NOT_PARALLEL);
39047e946e7SWyllys Ingersoll }
39147e946e7SWyllys Ingersoll
39247e946e7SWyllys Ingersoll CK_RV
C_CloseAllSessions(CK_SLOT_ID slotID)39347e946e7SWyllys Ingersoll C_CloseAllSessions(CK_SLOT_ID slotID)
39447e946e7SWyllys Ingersoll {
39547e946e7SWyllys Ingersoll Session_Struct_t *pCur, *pPrev;
39647e946e7SWyllys Ingersoll CK_RV rv;
39747e946e7SWyllys Ingersoll /*
39847e946e7SWyllys Ingersoll * Although why does modutil do a close all sessions. It is a single
39947e946e7SWyllys Ingersoll * application it can only close its sessions...
40047e946e7SWyllys Ingersoll * And all sessions should be closed anyhow.
40147e946e7SWyllys Ingersoll */
40247e946e7SWyllys Ingersoll LOG("CloseAllSessions");
40347e946e7SWyllys Ingersoll if (API_Initialized() == FALSE)
40447e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
405*8d26100cSWyllys Ingersoll
406*8d26100cSWyllys Ingersoll if (!global_shm->token_available || (slotID > NUMBER_SLOTS_MANAGED))
40747e946e7SWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
40847e946e7SWyllys Ingersoll /*
40947e946e7SWyllys Ingersoll * Proc Mutex is locked when we remove from the seesion list in
41047e946e7SWyllys Ingersoll * Close SEssion. Therefore we don't need to do any locking
41147e946e7SWyllys Ingersoll * the atomic operations are controled when we use the linked list
41247e946e7SWyllys Ingersoll */
413ab8176c2SWyllys Ingersoll pCur = (Anchor ? Anchor->SessListBeg : NULL);
41447e946e7SWyllys Ingersoll while (pCur) {
41547e946e7SWyllys Ingersoll /*
41647e946e7SWyllys Ingersoll * Session owned by the slot we are working on
41747e946e7SWyllys Ingersoll * There is a basic problem here. We are using th pCur
41847e946e7SWyllys Ingersoll * to point to the current one, however we delete it from
41947e946e7SWyllys Ingersoll * the linked list and can no longer go Forward. So we
42047e946e7SWyllys Ingersoll * have to use the fact that this is a doubly linked list
42147e946e7SWyllys Ingersoll * and get the previous pointer. After deletion, the next
42247e946e7SWyllys Ingersoll * pointer of this block will point to the next one in the
42347e946e7SWyllys Ingersoll * list.
42447e946e7SWyllys Ingersoll * If the value is Null, then this was the first one in
42547e946e7SWyllys Ingersoll * the list and we just set pCur to the SessListBeg.
42647e946e7SWyllys Ingersoll */
42747e946e7SWyllys Ingersoll if (pCur->SltId == slotID) {
42847e946e7SWyllys Ingersoll pPrev = pCur->Previous;
42947e946e7SWyllys Ingersoll rv = C_CloseSession((CK_SESSION_HANDLE)pCur);
43047e946e7SWyllys Ingersoll if (rv == CKR_OK ||
43147e946e7SWyllys Ingersoll rv == CKR_SESSION_CLOSED ||
43247e946e7SWyllys Ingersoll rv == CKR_SESSION_HANDLE_INVALID) {
43347e946e7SWyllys Ingersoll if (pPrev == NULL) {
43447e946e7SWyllys Ingersoll pCur = Anchor->SessListBeg;
43547e946e7SWyllys Ingersoll } else {
43647e946e7SWyllys Ingersoll pCur = pPrev->Next;
43747e946e7SWyllys Ingersoll }
43847e946e7SWyllys Ingersoll } else {
43947e946e7SWyllys Ingersoll return (rv);
44047e946e7SWyllys Ingersoll }
44147e946e7SWyllys Ingersoll } else {
44247e946e7SWyllys Ingersoll pCur = pCur->Next;
44347e946e7SWyllys Ingersoll }
44447e946e7SWyllys Ingersoll }
44547e946e7SWyllys Ingersoll LOG("CloseAllSessions OK");
44647e946e7SWyllys Ingersoll return (CKR_OK);
44747e946e7SWyllys Ingersoll }
44847e946e7SWyllys Ingersoll CK_RV
C_CloseSession(CK_SESSION_HANDLE hSession)44947e946e7SWyllys Ingersoll C_CloseSession(CK_SESSION_HANDLE hSession)
45047e946e7SWyllys Ingersoll {
45147e946e7SWyllys Ingersoll CK_RV rv;
45247e946e7SWyllys Ingersoll Session_Struct_t *sessp;
45347e946e7SWyllys Ingersoll ST_SESSION_T rSession;
45447e946e7SWyllys Ingersoll LOG("C_CloseSession");
45547e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
45647e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
45747e946e7SWyllys Ingersoll }
45847e946e7SWyllys Ingersoll /* Validate Session */
45947e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
46047e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
46147e946e7SWyllys Ingersoll }
46247e946e7SWyllys Ingersoll
46347e946e7SWyllys Ingersoll if (FuncList.ST_CloseSession) {
46447e946e7SWyllys Ingersoll /* Map the Session to the slot session */
46547e946e7SWyllys Ingersoll rv = FuncList.ST_CloseSession(rSession);
46647e946e7SWyllys Ingersoll
46747e946e7SWyllys Ingersoll if (rv == CKR_OK) {
46847e946e7SWyllys Ingersoll sessp = (Session_Struct_t *)hSession;
46947e946e7SWyllys Ingersoll RemoveFromSessionList(sessp);
47047e946e7SWyllys Ingersoll }
47147e946e7SWyllys Ingersoll } else {
47247e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47347e946e7SWyllys Ingersoll }
47447e946e7SWyllys Ingersoll return (rv);
47547e946e7SWyllys Ingersoll }
47647e946e7SWyllys Ingersoll
47747e946e7SWyllys Ingersoll CK_RV
C_CopyObject(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount,CK_OBJECT_HANDLE_PTR phNewObject)47847e946e7SWyllys Ingersoll C_CopyObject(
47947e946e7SWyllys Ingersoll CK_SESSION_HANDLE hSession,
48047e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hObject,
48147e946e7SWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
48247e946e7SWyllys Ingersoll CK_ULONG ulCount,
48347e946e7SWyllys Ingersoll CK_OBJECT_HANDLE_PTR phNewObject)
48447e946e7SWyllys Ingersoll {
48547e946e7SWyllys Ingersoll CK_RV rv;
48647e946e7SWyllys Ingersoll ST_SESSION_T rSession;
48747e946e7SWyllys Ingersoll LOG("C_CopyObject");
48847e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
48947e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
49047e946e7SWyllys Ingersoll }
49147e946e7SWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
49247e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
49347e946e7SWyllys Ingersoll }
49447e946e7SWyllys Ingersoll if (!phNewObject) {
49547e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
49647e946e7SWyllys Ingersoll }
49747e946e7SWyllys Ingersoll /*
49847e946e7SWyllys Ingersoll * A null template with a count will cause the lower layer
49947e946e7SWyllys Ingersoll * to have problems.
50047e946e7SWyllys Ingersoll * Template with 0 count is not a problem.
50147e946e7SWyllys Ingersoll */
50247e946e7SWyllys Ingersoll if (!pTemplate && ulCount) {
50347e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
50447e946e7SWyllys Ingersoll }
50547e946e7SWyllys Ingersoll if (FuncList.ST_CopyObject) {
50647e946e7SWyllys Ingersoll rv = FuncList.ST_CopyObject(rSession, hObject, pTemplate,
50747e946e7SWyllys Ingersoll ulCount, phNewObject);
50847e946e7SWyllys Ingersoll } else {
50947e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
51047e946e7SWyllys Ingersoll }
51147e946e7SWyllys Ingersoll return (rv);
51247e946e7SWyllys Ingersoll }
51347e946e7SWyllys Ingersoll
51447e946e7SWyllys Ingersoll CK_RV
C_CreateObject(CK_SESSION_HANDLE hSession,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount,CK_OBJECT_HANDLE_PTR phObject)51547e946e7SWyllys Ingersoll C_CreateObject(
51647e946e7SWyllys Ingersoll CK_SESSION_HANDLE hSession,
51747e946e7SWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
51847e946e7SWyllys Ingersoll CK_ULONG ulCount,
51947e946e7SWyllys Ingersoll CK_OBJECT_HANDLE_PTR phObject)
52047e946e7SWyllys Ingersoll {
52147e946e7SWyllys Ingersoll CK_RV rv;
52247e946e7SWyllys Ingersoll ST_SESSION_T rSession;
52347e946e7SWyllys Ingersoll
52447e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
52547e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
52647e946e7SWyllys Ingersoll }
52747e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
52847e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
52947e946e7SWyllys Ingersoll }
53047e946e7SWyllys Ingersoll if (! pTemplate) {
53147e946e7SWyllys Ingersoll return (CKR_TEMPLATE_INCOMPLETE);
53247e946e7SWyllys Ingersoll }
53347e946e7SWyllys Ingersoll if (ulCount == 0) {
53447e946e7SWyllys Ingersoll return (CKR_TEMPLATE_INCOMPLETE);
53547e946e7SWyllys Ingersoll }
53647e946e7SWyllys Ingersoll if (! phObject) {
53747e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
53847e946e7SWyllys Ingersoll }
53947e946e7SWyllys Ingersoll if (FuncList.ST_CreateObject) {
54047e946e7SWyllys Ingersoll // Map the Session to the slot session
54147e946e7SWyllys Ingersoll rv = FuncList.ST_CreateObject(rSession, pTemplate,
54247e946e7SWyllys Ingersoll ulCount, phObject);
54347e946e7SWyllys Ingersoll } else {
54447e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
54547e946e7SWyllys Ingersoll }
54647e946e7SWyllys Ingersoll return (rv);
54747e946e7SWyllys Ingersoll }
54847e946e7SWyllys Ingersoll
54947e946e7SWyllys Ingersoll CK_RV
C_Decrypt(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pEncryptedData,CK_ULONG ulEncryptedDataLen,CK_BYTE_PTR pData,CK_ULONG_PTR pulDataLen)55047e946e7SWyllys Ingersoll C_Decrypt(CK_SESSION_HANDLE hSession,
55147e946e7SWyllys Ingersoll CK_BYTE_PTR pEncryptedData,
55247e946e7SWyllys Ingersoll CK_ULONG ulEncryptedDataLen,
55347e946e7SWyllys Ingersoll CK_BYTE_PTR pData,
55447e946e7SWyllys Ingersoll CK_ULONG_PTR pulDataLen)
55547e946e7SWyllys Ingersoll {
55647e946e7SWyllys Ingersoll CK_RV rv;
55747e946e7SWyllys Ingersoll ST_SESSION_T rSession;
55847e946e7SWyllys Ingersoll
55947e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
56047e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
56147e946e7SWyllys Ingersoll }
56247e946e7SWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
56347e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
56447e946e7SWyllys Ingersoll }
56547e946e7SWyllys Ingersoll if (FuncList.ST_Decrypt) {
56647e946e7SWyllys Ingersoll rv = FuncList.ST_Decrypt(rSession, pEncryptedData,
56747e946e7SWyllys Ingersoll ulEncryptedDataLen, pData, pulDataLen);
56847e946e7SWyllys Ingersoll } else {
56947e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
57047e946e7SWyllys Ingersoll }
57147e946e7SWyllys Ingersoll return (rv);
57247e946e7SWyllys Ingersoll }
57347e946e7SWyllys Ingersoll
57447e946e7SWyllys Ingersoll CK_RV
C_DecryptDigestUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pEncryptedPart,CK_ULONG ulEncryptedPartLen,CK_BYTE_PTR pPart,CK_ULONG_PTR pulPartLen)57547e946e7SWyllys Ingersoll C_DecryptDigestUpdate(
57647e946e7SWyllys Ingersoll CK_SESSION_HANDLE hSession,
57747e946e7SWyllys Ingersoll CK_BYTE_PTR pEncryptedPart,
57847e946e7SWyllys Ingersoll CK_ULONG ulEncryptedPartLen,
57947e946e7SWyllys Ingersoll CK_BYTE_PTR pPart,
58047e946e7SWyllys Ingersoll CK_ULONG_PTR pulPartLen)
58147e946e7SWyllys Ingersoll {
58247e946e7SWyllys Ingersoll CK_RV rv;
58347e946e7SWyllys Ingersoll ST_SESSION_T rSession;
58447e946e7SWyllys Ingersoll
58547e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
58647e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
58747e946e7SWyllys Ingersoll }
58847e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
58947e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
59047e946e7SWyllys Ingersoll }
59147e946e7SWyllys Ingersoll if (! pEncryptedPart || ! pulPartLen) {
59247e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
59347e946e7SWyllys Ingersoll }
59447e946e7SWyllys Ingersoll if (FuncList.ST_DecryptDigestUpdate) {
59547e946e7SWyllys Ingersoll rv = FuncList.ST_DecryptDigestUpdate(rSession, pEncryptedPart,
59647e946e7SWyllys Ingersoll ulEncryptedPartLen, pPart, pulPartLen);
59747e946e7SWyllys Ingersoll } else {
59847e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
59947e946e7SWyllys Ingersoll }
60047e946e7SWyllys Ingersoll return (rv);
60147e946e7SWyllys Ingersoll }
60247e946e7SWyllys Ingersoll
60347e946e7SWyllys Ingersoll CK_RV
C_DecryptFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pLastPart,CK_ULONG_PTR pulLastPartLen)60447e946e7SWyllys Ingersoll C_DecryptFinal(CK_SESSION_HANDLE hSession,
60547e946e7SWyllys Ingersoll CK_BYTE_PTR pLastPart,
60647e946e7SWyllys Ingersoll CK_ULONG_PTR pulLastPartLen)
60747e946e7SWyllys Ingersoll {
60847e946e7SWyllys Ingersoll CK_RV rv;
60947e946e7SWyllys Ingersoll ST_SESSION_T rSession;
61047e946e7SWyllys Ingersoll
61147e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
61247e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
61347e946e7SWyllys Ingersoll }
61447e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
61547e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
61647e946e7SWyllys Ingersoll }
61747e946e7SWyllys Ingersoll /*
61847e946e7SWyllys Ingersoll * It is acceptable to have a Null pointer for the data since
61947e946e7SWyllys Ingersoll * it is trying to get the length of the last part....
62047e946e7SWyllys Ingersoll * The spec is unclear if a second call to Final is needed
62147e946e7SWyllys Ingersoll * if there is no data in the last part.
62247e946e7SWyllys Ingersoll */
62347e946e7SWyllys Ingersoll if (! pulLastPartLen) {
62447e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
62547e946e7SWyllys Ingersoll }
62647e946e7SWyllys Ingersoll if (FuncList.ST_DecryptFinal) {
62747e946e7SWyllys Ingersoll rv = FuncList.ST_DecryptFinal(rSession, pLastPart,
62847e946e7SWyllys Ingersoll pulLastPartLen);
62947e946e7SWyllys Ingersoll } else {
63047e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
63147e946e7SWyllys Ingersoll }
63247e946e7SWyllys Ingersoll return (rv);
63347e946e7SWyllys Ingersoll }
63447e946e7SWyllys Ingersoll
63547e946e7SWyllys Ingersoll CK_RV
C_DecryptInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)63647e946e7SWyllys Ingersoll C_DecryptInit(CK_SESSION_HANDLE hSession,
63747e946e7SWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
63847e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hKey)
63947e946e7SWyllys Ingersoll {
64047e946e7SWyllys Ingersoll CK_RV rv;
64147e946e7SWyllys Ingersoll ST_SESSION_T rSession;
64247e946e7SWyllys Ingersoll
64347e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
64447e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
64547e946e7SWyllys Ingersoll }
64647e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
64747e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
64847e946e7SWyllys Ingersoll }
64947e946e7SWyllys Ingersoll if (! pMechanism) {
65047e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
65147e946e7SWyllys Ingersoll }
65247e946e7SWyllys Ingersoll if (FuncList.ST_DecryptInit) {
65347e946e7SWyllys Ingersoll rv = FuncList.ST_DecryptInit(rSession, pMechanism, hKey);
65447e946e7SWyllys Ingersoll } else {
65547e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
65647e946e7SWyllys Ingersoll }
65747e946e7SWyllys Ingersoll return (rv);
65847e946e7SWyllys Ingersoll }
65947e946e7SWyllys Ingersoll
66047e946e7SWyllys Ingersoll CK_RV
C_DecryptUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pEncryptedPart,CK_ULONG ulEncryptedPartLen,CK_BYTE_PTR pPart,CK_ULONG_PTR pulPartLen)66147e946e7SWyllys Ingersoll C_DecryptUpdate(CK_SESSION_HANDLE hSession,
66247e946e7SWyllys Ingersoll CK_BYTE_PTR pEncryptedPart,
66347e946e7SWyllys Ingersoll CK_ULONG ulEncryptedPartLen,
66447e946e7SWyllys Ingersoll CK_BYTE_PTR pPart,
66547e946e7SWyllys Ingersoll CK_ULONG_PTR pulPartLen)
66647e946e7SWyllys Ingersoll {
66747e946e7SWyllys Ingersoll CK_RV rv;
66847e946e7SWyllys Ingersoll ST_SESSION_T rSession;
66947e946e7SWyllys Ingersoll
67047e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
67147e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
67247e946e7SWyllys Ingersoll }
67347e946e7SWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
67447e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
67547e946e7SWyllys Ingersoll }
67647e946e7SWyllys Ingersoll if (!pEncryptedPart || !pulPartLen) {
67747e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
67847e946e7SWyllys Ingersoll }
67947e946e7SWyllys Ingersoll if (FuncList.ST_DecryptUpdate) {
68047e946e7SWyllys Ingersoll rv = FuncList.ST_DecryptUpdate(rSession, pEncryptedPart,
68147e946e7SWyllys Ingersoll ulEncryptedPartLen, pPart, pulPartLen);
68247e946e7SWyllys Ingersoll } else {
68347e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
68447e946e7SWyllys Ingersoll }
68547e946e7SWyllys Ingersoll return (rv);
68647e946e7SWyllys Ingersoll }
68747e946e7SWyllys Ingersoll
68847e946e7SWyllys Ingersoll CK_RV
C_DecryptVerifyUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pEncryptedPart,CK_ULONG ulEncryptedPartLen,CK_BYTE_PTR pPart,CK_ULONG_PTR pulPartLen)68947e946e7SWyllys Ingersoll C_DecryptVerifyUpdate(CK_SESSION_HANDLE hSession,
69047e946e7SWyllys Ingersoll CK_BYTE_PTR pEncryptedPart,
69147e946e7SWyllys Ingersoll CK_ULONG ulEncryptedPartLen,
69247e946e7SWyllys Ingersoll CK_BYTE_PTR pPart,
69347e946e7SWyllys Ingersoll CK_ULONG_PTR pulPartLen)
69447e946e7SWyllys Ingersoll {
69547e946e7SWyllys Ingersoll CK_RV rv;
69647e946e7SWyllys Ingersoll ST_SESSION_T rSession;
69747e946e7SWyllys Ingersoll
69847e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
69947e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
70047e946e7SWyllys Ingersoll }
70147e946e7SWyllys Ingersoll // Validate Session
70247e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
70347e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
70447e946e7SWyllys Ingersoll }
70547e946e7SWyllys Ingersoll // May have to let these go through and let the STDLL handle them
70647e946e7SWyllys Ingersoll if (! pEncryptedPart || ! pulPartLen) {
70747e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
70847e946e7SWyllys Ingersoll }
70947e946e7SWyllys Ingersoll // Get local pointers to session
71047e946e7SWyllys Ingersoll if (FuncList.ST_DecryptVerifyUpdate) {
71147e946e7SWyllys Ingersoll // Map the Session to the slot session
71247e946e7SWyllys Ingersoll rv = FuncList.ST_DecryptVerifyUpdate(rSession,
71347e946e7SWyllys Ingersoll pEncryptedPart, ulEncryptedPartLen, pPart, pulPartLen);
71447e946e7SWyllys Ingersoll } else {
71547e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
71647e946e7SWyllys Ingersoll }
71747e946e7SWyllys Ingersoll return (rv);
71847e946e7SWyllys Ingersoll }
71947e946e7SWyllys Ingersoll
72047e946e7SWyllys Ingersoll CK_RV
C_DeriveKey(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hBaseKey,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulAttributeCount,CK_OBJECT_HANDLE_PTR phKey)72147e946e7SWyllys Ingersoll C_DeriveKey(CK_SESSION_HANDLE hSession,
72247e946e7SWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
72347e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hBaseKey,
72447e946e7SWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
72547e946e7SWyllys Ingersoll CK_ULONG ulAttributeCount,
72647e946e7SWyllys Ingersoll CK_OBJECT_HANDLE_PTR phKey)
72747e946e7SWyllys Ingersoll {
72847e946e7SWyllys Ingersoll CK_RV rv;
72947e946e7SWyllys Ingersoll ST_SESSION_T rSession;
73047e946e7SWyllys Ingersoll
73147e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
73247e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
73347e946e7SWyllys Ingersoll }
73447e946e7SWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
73547e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
73647e946e7SWyllys Ingersoll }
73747e946e7SWyllys Ingersoll
73847e946e7SWyllys Ingersoll if (!pMechanism) {
73947e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
74047e946e7SWyllys Ingersoll }
74147e946e7SWyllys Ingersoll if (!pTemplate && ulAttributeCount) {
74247e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
74347e946e7SWyllys Ingersoll }
74447e946e7SWyllys Ingersoll if (FuncList.ST_DeriveKey) {
74547e946e7SWyllys Ingersoll rv = FuncList.ST_DeriveKey(rSession, pMechanism,
74647e946e7SWyllys Ingersoll hBaseKey, pTemplate, ulAttributeCount, phKey);
74747e946e7SWyllys Ingersoll } else {
74847e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
74947e946e7SWyllys Ingersoll }
75047e946e7SWyllys Ingersoll return (rv);
75147e946e7SWyllys Ingersoll }
75247e946e7SWyllys Ingersoll
75347e946e7SWyllys Ingersoll CK_RV
C_DestroyObject(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject)75447e946e7SWyllys Ingersoll C_DestroyObject(CK_SESSION_HANDLE hSession,
75547e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hObject)
75647e946e7SWyllys Ingersoll {
75747e946e7SWyllys Ingersoll CK_RV rv;
75847e946e7SWyllys Ingersoll ST_SESSION_T rSession;
75947e946e7SWyllys Ingersoll
76047e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
76147e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
76247e946e7SWyllys Ingersoll }
76347e946e7SWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
76447e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
76547e946e7SWyllys Ingersoll }
76647e946e7SWyllys Ingersoll if (FuncList.ST_DestroyObject) {
76747e946e7SWyllys Ingersoll rv = FuncList.ST_DestroyObject(rSession, hObject);
76847e946e7SWyllys Ingersoll } else {
76947e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
77047e946e7SWyllys Ingersoll }
77147e946e7SWyllys Ingersoll return (rv);
77247e946e7SWyllys Ingersoll }
77347e946e7SWyllys Ingersoll
77447e946e7SWyllys Ingersoll CK_RV
C_Digest(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pDigest,CK_ULONG_PTR pulDigestLen)77547e946e7SWyllys Ingersoll C_Digest(CK_SESSION_HANDLE hSession,
77647e946e7SWyllys Ingersoll CK_BYTE_PTR pData,
77747e946e7SWyllys Ingersoll CK_ULONG ulDataLen,
77847e946e7SWyllys Ingersoll CK_BYTE_PTR pDigest,
77947e946e7SWyllys Ingersoll CK_ULONG_PTR pulDigestLen)
78047e946e7SWyllys Ingersoll {
78147e946e7SWyllys Ingersoll CK_RV rv;
78247e946e7SWyllys Ingersoll ST_SESSION_T rSession;
78347e946e7SWyllys Ingersoll
78447e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
78547e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
78647e946e7SWyllys Ingersoll }
78747e946e7SWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
78847e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
78947e946e7SWyllys Ingersoll }
79047e946e7SWyllys Ingersoll if (FuncList.ST_Digest) {
79147e946e7SWyllys Ingersoll rv = FuncList.ST_Digest(rSession, pData, ulDataLen,
79247e946e7SWyllys Ingersoll pDigest, pulDigestLen);
79347e946e7SWyllys Ingersoll } else {
79447e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
79547e946e7SWyllys Ingersoll }
79647e946e7SWyllys Ingersoll return (rv);
79747e946e7SWyllys Ingersoll }
79847e946e7SWyllys Ingersoll
79947e946e7SWyllys Ingersoll CK_RV
C_DigestEncryptUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen,CK_BYTE_PTR pEncryptedPart,CK_ULONG_PTR pulEncryptedPartLen)80047e946e7SWyllys Ingersoll C_DigestEncryptUpdate(CK_SESSION_HANDLE hSession,
80147e946e7SWyllys Ingersoll CK_BYTE_PTR pPart,
80247e946e7SWyllys Ingersoll CK_ULONG ulPartLen,
80347e946e7SWyllys Ingersoll CK_BYTE_PTR pEncryptedPart,
80447e946e7SWyllys Ingersoll CK_ULONG_PTR pulEncryptedPartLen)
80547e946e7SWyllys Ingersoll {
80647e946e7SWyllys Ingersoll CK_RV rv;
80747e946e7SWyllys Ingersoll ST_SESSION_T rSession;
80847e946e7SWyllys Ingersoll
80947e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
81047e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
81147e946e7SWyllys Ingersoll }
81247e946e7SWyllys Ingersoll if (! pPart || ! pulEncryptedPartLen) {
81347e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
81447e946e7SWyllys Ingersoll }
81547e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
81647e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
81747e946e7SWyllys Ingersoll }
81847e946e7SWyllys Ingersoll if (FuncList.ST_DigestEncryptUpdate) {
81947e946e7SWyllys Ingersoll rv = FuncList.ST_DigestEncryptUpdate(rSession, pPart,
82047e946e7SWyllys Ingersoll ulPartLen, pEncryptedPart, pulEncryptedPartLen);
82147e946e7SWyllys Ingersoll } else {
82247e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
82347e946e7SWyllys Ingersoll }
82447e946e7SWyllys Ingersoll return (rv);
82547e946e7SWyllys Ingersoll }
82647e946e7SWyllys Ingersoll
82747e946e7SWyllys Ingersoll CK_RV
C_DigestFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pDigest,CK_ULONG_PTR pulDigestLen)82847e946e7SWyllys Ingersoll C_DigestFinal(CK_SESSION_HANDLE hSession,
82947e946e7SWyllys Ingersoll CK_BYTE_PTR pDigest,
83047e946e7SWyllys Ingersoll CK_ULONG_PTR pulDigestLen)
83147e946e7SWyllys Ingersoll {
83247e946e7SWyllys Ingersoll CK_RV rv;
83347e946e7SWyllys Ingersoll ST_SESSION_T rSession;
83447e946e7SWyllys Ingersoll
83547e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
83647e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
83747e946e7SWyllys Ingersoll }
83847e946e7SWyllys Ingersoll if (! pulDigestLen) {
83947e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
84047e946e7SWyllys Ingersoll }
84147e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
84247e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
84347e946e7SWyllys Ingersoll }
84447e946e7SWyllys Ingersoll if (FuncList.ST_DigestFinal) {
84547e946e7SWyllys Ingersoll rv = FuncList.ST_DigestFinal(rSession, pDigest, pulDigestLen);
84647e946e7SWyllys Ingersoll } else {
84747e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
84847e946e7SWyllys Ingersoll }
84947e946e7SWyllys Ingersoll return (rv);
85047e946e7SWyllys Ingersoll }
85147e946e7SWyllys Ingersoll
85247e946e7SWyllys Ingersoll CK_RV
C_DigestInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism)85347e946e7SWyllys Ingersoll C_DigestInit(CK_SESSION_HANDLE hSession,
85447e946e7SWyllys Ingersoll CK_MECHANISM_PTR pMechanism)
85547e946e7SWyllys Ingersoll {
85647e946e7SWyllys Ingersoll CK_RV rv;
85747e946e7SWyllys Ingersoll ST_SESSION_T rSession;
85847e946e7SWyllys Ingersoll
85947e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
86047e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
86147e946e7SWyllys Ingersoll }
86247e946e7SWyllys Ingersoll if (! pMechanism) {
86347e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
86447e946e7SWyllys Ingersoll }
86547e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
86647e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
86747e946e7SWyllys Ingersoll }
86847e946e7SWyllys Ingersoll if (FuncList.ST_DigestInit) {
86947e946e7SWyllys Ingersoll rv = FuncList.ST_DigestInit(rSession, pMechanism);
87047e946e7SWyllys Ingersoll } else {
87147e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
87247e946e7SWyllys Ingersoll }
87347e946e7SWyllys Ingersoll return (rv);
87447e946e7SWyllys Ingersoll }
87547e946e7SWyllys Ingersoll
87647e946e7SWyllys Ingersoll CK_RV
C_DigestKey(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hKey)87747e946e7SWyllys Ingersoll C_DigestKey(CK_SESSION_HANDLE hSession,
87847e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hKey)
87947e946e7SWyllys Ingersoll {
88047e946e7SWyllys Ingersoll CK_RV rv;
88147e946e7SWyllys Ingersoll ST_SESSION_T rSession;
88247e946e7SWyllys Ingersoll
88347e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
88447e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
88547e946e7SWyllys Ingersoll }
88647e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
88747e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
88847e946e7SWyllys Ingersoll }
88947e946e7SWyllys Ingersoll if (FuncList.ST_DigestKey) {
89047e946e7SWyllys Ingersoll rv = FuncList.ST_DigestKey(rSession, hKey);
89147e946e7SWyllys Ingersoll } else {
89247e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
89347e946e7SWyllys Ingersoll }
89447e946e7SWyllys Ingersoll return (rv);
89547e946e7SWyllys Ingersoll }
89647e946e7SWyllys Ingersoll
89747e946e7SWyllys Ingersoll CK_RV
C_DigestUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen)89847e946e7SWyllys Ingersoll C_DigestUpdate(CK_SESSION_HANDLE hSession,
89947e946e7SWyllys Ingersoll CK_BYTE_PTR pPart,
90047e946e7SWyllys Ingersoll CK_ULONG ulPartLen)
90147e946e7SWyllys Ingersoll {
90247e946e7SWyllys Ingersoll CK_RV rv;
90347e946e7SWyllys Ingersoll ST_SESSION_T rSession;
90447e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
90547e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
90647e946e7SWyllys Ingersoll }
90747e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
90847e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
90947e946e7SWyllys Ingersoll }
91047e946e7SWyllys Ingersoll if (FuncList.ST_DigestUpdate) {
91147e946e7SWyllys Ingersoll rv = FuncList.ST_DigestUpdate(rSession, pPart, ulPartLen);
91247e946e7SWyllys Ingersoll } else {
91347e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
91447e946e7SWyllys Ingersoll }
91547e946e7SWyllys Ingersoll return (rv);
91647e946e7SWyllys Ingersoll }
91747e946e7SWyllys Ingersoll
91847e946e7SWyllys Ingersoll CK_RV
C_Encrypt(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pEncryptedData,CK_ULONG_PTR pulEncryptedDataLen)91947e946e7SWyllys Ingersoll C_Encrypt(CK_SESSION_HANDLE hSession,
92047e946e7SWyllys Ingersoll CK_BYTE_PTR pData,
92147e946e7SWyllys Ingersoll CK_ULONG ulDataLen,
92247e946e7SWyllys Ingersoll CK_BYTE_PTR pEncryptedData,
92347e946e7SWyllys Ingersoll CK_ULONG_PTR pulEncryptedDataLen)
92447e946e7SWyllys Ingersoll {
92547e946e7SWyllys Ingersoll CK_RV rv;
92647e946e7SWyllys Ingersoll ST_SESSION_T rSession;
92747e946e7SWyllys Ingersoll
92847e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
92947e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
93047e946e7SWyllys Ingersoll }
93147e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
93247e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
93347e946e7SWyllys Ingersoll }
93447e946e7SWyllys Ingersoll // Get local pointers to session
93547e946e7SWyllys Ingersoll if (FuncList.ST_Encrypt) {
93647e946e7SWyllys Ingersoll // Map the Session to the slot session
93747e946e7SWyllys Ingersoll rv = FuncList.ST_Encrypt(rSession, pData, ulDataLen,
93847e946e7SWyllys Ingersoll pEncryptedData, pulEncryptedDataLen);
93947e946e7SWyllys Ingersoll } else {
94047e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
94147e946e7SWyllys Ingersoll }
94247e946e7SWyllys Ingersoll return (rv);
94347e946e7SWyllys Ingersoll }
94447e946e7SWyllys Ingersoll
94547e946e7SWyllys Ingersoll CK_RV
C_EncryptFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pLastEncryptedPart,CK_ULONG_PTR pulLastEncryptedPartLen)94647e946e7SWyllys Ingersoll C_EncryptFinal(CK_SESSION_HANDLE hSession,
94747e946e7SWyllys Ingersoll CK_BYTE_PTR pLastEncryptedPart,
94847e946e7SWyllys Ingersoll CK_ULONG_PTR pulLastEncryptedPartLen)
94947e946e7SWyllys Ingersoll {
95047e946e7SWyllys Ingersoll CK_RV rv;
95147e946e7SWyllys Ingersoll ST_SESSION_T rSession;
95247e946e7SWyllys Ingersoll
95347e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
95447e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
95547e946e7SWyllys Ingersoll }
95647e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
95747e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
95847e946e7SWyllys Ingersoll }
95947e946e7SWyllys Ingersoll if (FuncList.ST_EncryptFinal) {
96047e946e7SWyllys Ingersoll rv = FuncList.ST_EncryptFinal(rSession,
96147e946e7SWyllys Ingersoll pLastEncryptedPart, pulLastEncryptedPartLen);
96247e946e7SWyllys Ingersoll } else {
96347e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
96447e946e7SWyllys Ingersoll }
96547e946e7SWyllys Ingersoll return (rv);
96647e946e7SWyllys Ingersoll }
96747e946e7SWyllys Ingersoll
96847e946e7SWyllys Ingersoll CK_RV
C_EncryptInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)96947e946e7SWyllys Ingersoll C_EncryptInit(CK_SESSION_HANDLE hSession,
97047e946e7SWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
97147e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hKey)
97247e946e7SWyllys Ingersoll {
97347e946e7SWyllys Ingersoll CK_RV rv;
97447e946e7SWyllys Ingersoll ST_SESSION_T rSession;
97547e946e7SWyllys Ingersoll
97647e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
97747e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
97847e946e7SWyllys Ingersoll }
97947e946e7SWyllys Ingersoll if (! pMechanism) {
98047e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
98147e946e7SWyllys Ingersoll }
98247e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
98347e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
98447e946e7SWyllys Ingersoll }
98547e946e7SWyllys Ingersoll if (FuncList.ST_EncryptInit) {
98647e946e7SWyllys Ingersoll rv = FuncList.ST_EncryptInit(rSession, pMechanism, hKey);
98747e946e7SWyllys Ingersoll } else {
98847e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
98947e946e7SWyllys Ingersoll }
99047e946e7SWyllys Ingersoll return (rv);
99147e946e7SWyllys Ingersoll }
99247e946e7SWyllys Ingersoll
99347e946e7SWyllys Ingersoll CK_RV
C_EncryptUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen,CK_BYTE_PTR pEncryptedPart,CK_ULONG_PTR pulEncryptedPartLen)99447e946e7SWyllys Ingersoll C_EncryptUpdate(CK_SESSION_HANDLE hSession,
99547e946e7SWyllys Ingersoll CK_BYTE_PTR pPart,
99647e946e7SWyllys Ingersoll CK_ULONG ulPartLen,
99747e946e7SWyllys Ingersoll CK_BYTE_PTR pEncryptedPart,
99847e946e7SWyllys Ingersoll CK_ULONG_PTR pulEncryptedPartLen)
99947e946e7SWyllys Ingersoll {
100047e946e7SWyllys Ingersoll CK_RV rv;
100147e946e7SWyllys Ingersoll ST_SESSION_T rSession;
100247e946e7SWyllys Ingersoll
100347e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
100447e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
100547e946e7SWyllys Ingersoll }
100647e946e7SWyllys Ingersoll if (!pPart || !pulEncryptedPartLen) {
100747e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
100847e946e7SWyllys Ingersoll }
100947e946e7SWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
101047e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
101147e946e7SWyllys Ingersoll }
101247e946e7SWyllys Ingersoll if (FuncList.ST_EncryptUpdate) {
101347e946e7SWyllys Ingersoll rv = FuncList.ST_EncryptUpdate(rSession, pPart, ulPartLen,
101447e946e7SWyllys Ingersoll pEncryptedPart, pulEncryptedPartLen);
101547e946e7SWyllys Ingersoll } else {
101647e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
101747e946e7SWyllys Ingersoll }
101847e946e7SWyllys Ingersoll return (rv);
101947e946e7SWyllys Ingersoll }
102047e946e7SWyllys Ingersoll
102147e946e7SWyllys Ingersoll CK_RV
do_finalize(CK_VOID_PTR pReserved)102247e946e7SWyllys Ingersoll do_finalize(CK_VOID_PTR pReserved)
102347e946e7SWyllys Ingersoll {
102447e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
102547e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
102647e946e7SWyllys Ingersoll }
102747e946e7SWyllys Ingersoll if (pReserved != NULL) {
102847e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
102947e946e7SWyllys Ingersoll }
103047e946e7SWyllys Ingersoll (void) pthread_mutex_lock(&global_mutex);
1031ab8176c2SWyllys Ingersoll if (Anchor)
1032ab8176c2SWyllys Ingersoll Terminate_All_Process_Sessions();
1033ab8176c2SWyllys Ingersoll
103447e946e7SWyllys Ingersoll if (FuncList.ST_Finalize)
103547e946e7SWyllys Ingersoll FuncList.ST_Finalize(0);
103647e946e7SWyllys Ingersoll
103747e946e7SWyllys Ingersoll free(Anchor);
103847e946e7SWyllys Ingersoll Anchor = NULL;
1039ab8176c2SWyllys Ingersoll
104047e946e7SWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
104147e946e7SWyllys Ingersoll return (CKR_OK);
104247e946e7SWyllys Ingersoll }
104347e946e7SWyllys Ingersoll
104447e946e7SWyllys Ingersoll CK_RV
C_Finalize(CK_VOID_PTR pReserved)104547e946e7SWyllys Ingersoll C_Finalize(CK_VOID_PTR pReserved) {
104647e946e7SWyllys Ingersoll return (do_finalize(pReserved));
104747e946e7SWyllys Ingersoll }
104847e946e7SWyllys Ingersoll
104947e946e7SWyllys Ingersoll CK_RV
C_FindObjects(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE_PTR phObject,CK_ULONG ulMaxObjectCount,CK_ULONG_PTR pulObjectCount)105047e946e7SWyllys Ingersoll C_FindObjects(CK_SESSION_HANDLE hSession,
105147e946e7SWyllys Ingersoll CK_OBJECT_HANDLE_PTR phObject,
105247e946e7SWyllys Ingersoll CK_ULONG ulMaxObjectCount,
105347e946e7SWyllys Ingersoll CK_ULONG_PTR pulObjectCount)
105447e946e7SWyllys Ingersoll {
105547e946e7SWyllys Ingersoll CK_RV rv;
105647e946e7SWyllys Ingersoll ST_SESSION_T rSession;
105747e946e7SWyllys Ingersoll
105847e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
105947e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
106047e946e7SWyllys Ingersoll }
106147e946e7SWyllys Ingersoll if (! phObject || ! pulObjectCount) {
106247e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
106347e946e7SWyllys Ingersoll }
106447e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
106547e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
106647e946e7SWyllys Ingersoll }
106747e946e7SWyllys Ingersoll if (FuncList.ST_FindObjects) {
106847e946e7SWyllys Ingersoll rv = FuncList.ST_FindObjects(rSession, phObject,
106947e946e7SWyllys Ingersoll ulMaxObjectCount, pulObjectCount);
107047e946e7SWyllys Ingersoll } else {
107147e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
107247e946e7SWyllys Ingersoll }
107347e946e7SWyllys Ingersoll return (rv);
107447e946e7SWyllys Ingersoll }
107547e946e7SWyllys Ingersoll
107647e946e7SWyllys Ingersoll CK_RV
C_FindObjectsFinal(CK_SESSION_HANDLE hSession)107747e946e7SWyllys Ingersoll C_FindObjectsFinal(CK_SESSION_HANDLE hSession)
107847e946e7SWyllys Ingersoll {
107947e946e7SWyllys Ingersoll CK_RV rv;
108047e946e7SWyllys Ingersoll ST_SESSION_T rSession;
108147e946e7SWyllys Ingersoll
108247e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
108347e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
108447e946e7SWyllys Ingersoll }
108547e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
108647e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
108747e946e7SWyllys Ingersoll }
108847e946e7SWyllys Ingersoll if (FuncList.ST_FindObjectsFinal) {
108947e946e7SWyllys Ingersoll rv = FuncList.ST_FindObjectsFinal(rSession);
109047e946e7SWyllys Ingersoll } else {
109147e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
109247e946e7SWyllys Ingersoll }
109347e946e7SWyllys Ingersoll return (rv);
109447e946e7SWyllys Ingersoll }
109547e946e7SWyllys Ingersoll
109647e946e7SWyllys Ingersoll CK_RV
C_FindObjectsInit(CK_SESSION_HANDLE hSession,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount)109747e946e7SWyllys Ingersoll C_FindObjectsInit(CK_SESSION_HANDLE hSession,
109847e946e7SWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
109947e946e7SWyllys Ingersoll CK_ULONG ulCount)
110047e946e7SWyllys Ingersoll {
110147e946e7SWyllys Ingersoll CK_RV rv;
110247e946e7SWyllys Ingersoll ST_SESSION_T rSession;
110347e946e7SWyllys Ingersoll
110447e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
110547e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
110647e946e7SWyllys Ingersoll }
110747e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
110847e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
110947e946e7SWyllys Ingersoll }
111047e946e7SWyllys Ingersoll if (FuncList.ST_FindObjectsInit) {
111147e946e7SWyllys Ingersoll rv = FuncList.ST_FindObjectsInit(rSession, pTemplate, ulCount);
111247e946e7SWyllys Ingersoll } else {
111347e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
111447e946e7SWyllys Ingersoll }
111547e946e7SWyllys Ingersoll return (rv);
111647e946e7SWyllys Ingersoll }
111747e946e7SWyllys Ingersoll
111847e946e7SWyllys Ingersoll CK_RV
C_GenerateKey(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount,CK_OBJECT_HANDLE_PTR phKey)111947e946e7SWyllys Ingersoll C_GenerateKey(CK_SESSION_HANDLE hSession,
112047e946e7SWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
112147e946e7SWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
112247e946e7SWyllys Ingersoll CK_ULONG ulCount,
112347e946e7SWyllys Ingersoll CK_OBJECT_HANDLE_PTR phKey)
112447e946e7SWyllys Ingersoll {
112547e946e7SWyllys Ingersoll CK_RV rv;
112647e946e7SWyllys Ingersoll ST_SESSION_T rSession;
112747e946e7SWyllys Ingersoll
112847e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
112947e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
113047e946e7SWyllys Ingersoll }
113147e946e7SWyllys Ingersoll if (! pMechanism) {
113247e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
113347e946e7SWyllys Ingersoll }
113447e946e7SWyllys Ingersoll if (! phKey) {
113547e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
113647e946e7SWyllys Ingersoll }
113747e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
113847e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
113947e946e7SWyllys Ingersoll }
114047e946e7SWyllys Ingersoll if (FuncList.ST_GenerateKey) {
114147e946e7SWyllys Ingersoll rv = FuncList.ST_GenerateKey(rSession, pMechanism,
114247e946e7SWyllys Ingersoll pTemplate, ulCount, phKey);
114347e946e7SWyllys Ingersoll } else {
114447e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
114547e946e7SWyllys Ingersoll }
114647e946e7SWyllys Ingersoll return (rv);
114747e946e7SWyllys Ingersoll }
114847e946e7SWyllys Ingersoll
114947e946e7SWyllys Ingersoll CK_RV
C_GenerateKeyPair(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_ATTRIBUTE_PTR pPublicKeyTemplate,CK_ULONG ulPublicKeyAttributeCount,CK_ATTRIBUTE_PTR pPrivateKeyTemplate,CK_ULONG ulPrivateKeyAttributeCount,CK_OBJECT_HANDLE_PTR phPublicKey,CK_OBJECT_HANDLE_PTR phPrivateKey)115047e946e7SWyllys Ingersoll C_GenerateKeyPair(CK_SESSION_HANDLE hSession,
115147e946e7SWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
115247e946e7SWyllys Ingersoll CK_ATTRIBUTE_PTR pPublicKeyTemplate,
115347e946e7SWyllys Ingersoll CK_ULONG ulPublicKeyAttributeCount,
115447e946e7SWyllys Ingersoll CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
115547e946e7SWyllys Ingersoll CK_ULONG ulPrivateKeyAttributeCount,
115647e946e7SWyllys Ingersoll CK_OBJECT_HANDLE_PTR phPublicKey,
115747e946e7SWyllys Ingersoll CK_OBJECT_HANDLE_PTR phPrivateKey)
115847e946e7SWyllys Ingersoll {
115947e946e7SWyllys Ingersoll CK_RV rv;
116047e946e7SWyllys Ingersoll ST_SESSION_T rSession;
116147e946e7SWyllys Ingersoll
116247e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
116347e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
116447e946e7SWyllys Ingersoll }
116547e946e7SWyllys Ingersoll if (! pMechanism) {
116647e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
116747e946e7SWyllys Ingersoll }
116847e946e7SWyllys Ingersoll if (! phPublicKey || ! phPrivateKey) {
116947e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
117047e946e7SWyllys Ingersoll }
117147e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
117247e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
117347e946e7SWyllys Ingersoll }
117447e946e7SWyllys Ingersoll if (FuncList.ST_GenerateKeyPair) {
117547e946e7SWyllys Ingersoll rv = FuncList.ST_GenerateKeyPair(rSession,
117647e946e7SWyllys Ingersoll pMechanism, pPublicKeyTemplate,
117747e946e7SWyllys Ingersoll ulPublicKeyAttributeCount, pPrivateKeyTemplate,
117847e946e7SWyllys Ingersoll ulPrivateKeyAttributeCount, phPublicKey, phPrivateKey);
117947e946e7SWyllys Ingersoll } else {
118047e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
118147e946e7SWyllys Ingersoll }
118247e946e7SWyllys Ingersoll return (rv);
118347e946e7SWyllys Ingersoll }
118447e946e7SWyllys Ingersoll
118547e946e7SWyllys Ingersoll CK_RV
C_GenerateRandom(CK_SESSION_HANDLE hSession,CK_BYTE_PTR RandomData,CK_ULONG ulRandomLen)118647e946e7SWyllys Ingersoll C_GenerateRandom(CK_SESSION_HANDLE hSession,
118747e946e7SWyllys Ingersoll CK_BYTE_PTR RandomData,
118847e946e7SWyllys Ingersoll CK_ULONG ulRandomLen)
118947e946e7SWyllys Ingersoll {
119047e946e7SWyllys Ingersoll CK_RV rv;
119147e946e7SWyllys Ingersoll ST_SESSION_T rSession;
119247e946e7SWyllys Ingersoll
119347e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
119447e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
119547e946e7SWyllys Ingersoll }
119647e946e7SWyllys Ingersoll if (! RandomData)
119747e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
119847e946e7SWyllys Ingersoll
119947e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
120047e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
120147e946e7SWyllys Ingersoll }
120247e946e7SWyllys Ingersoll if (FuncList.ST_GenerateRandom) {
120347e946e7SWyllys Ingersoll rv = FuncList.ST_GenerateRandom(rSession, RandomData,
120447e946e7SWyllys Ingersoll ulRandomLen);
120547e946e7SWyllys Ingersoll } else {
120647e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
120747e946e7SWyllys Ingersoll }
120847e946e7SWyllys Ingersoll return (rv);
120947e946e7SWyllys Ingersoll }
121047e946e7SWyllys Ingersoll
121147e946e7SWyllys Ingersoll CK_RV
C_GetAttributeValue(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount)121247e946e7SWyllys Ingersoll C_GetAttributeValue(CK_SESSION_HANDLE hSession,
121347e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hObject,
121447e946e7SWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
121547e946e7SWyllys Ingersoll CK_ULONG ulCount)
121647e946e7SWyllys Ingersoll {
121747e946e7SWyllys Ingersoll CK_RV rv;
121847e946e7SWyllys Ingersoll ST_SESSION_T rSession;
121947e946e7SWyllys Ingersoll
122047e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
122147e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
122247e946e7SWyllys Ingersoll }
122347e946e7SWyllys Ingersoll if (! pTemplate) {
122447e946e7SWyllys Ingersoll return (CKR_TEMPLATE_INCOMPLETE);
122547e946e7SWyllys Ingersoll }
122647e946e7SWyllys Ingersoll if (ulCount == 0) {
122747e946e7SWyllys Ingersoll return (CKR_TEMPLATE_INCOMPLETE);
122847e946e7SWyllys Ingersoll }
122947e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
123047e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
123147e946e7SWyllys Ingersoll }
123247e946e7SWyllys Ingersoll if (FuncList.ST_GetAttributeValue) {
123347e946e7SWyllys Ingersoll rv = FuncList.ST_GetAttributeValue(rSession, hObject,
123447e946e7SWyllys Ingersoll pTemplate, ulCount);
123547e946e7SWyllys Ingersoll } else {
123647e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
123747e946e7SWyllys Ingersoll }
123847e946e7SWyllys Ingersoll return (rv);
123947e946e7SWyllys Ingersoll }
124047e946e7SWyllys Ingersoll
124147e946e7SWyllys Ingersoll CK_RV
C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR ppFunctionList)124247e946e7SWyllys Ingersoll C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR ppFunctionList)
124347e946e7SWyllys Ingersoll {
124447e946e7SWyllys Ingersoll PK11_Functions.version.major = VERSION_MAJOR;
124547e946e7SWyllys Ingersoll PK11_Functions.version.minor = VERSION_MINOR;
124647e946e7SWyllys Ingersoll PK11_Functions.C_Initialize = C_Initialize;
124747e946e7SWyllys Ingersoll PK11_Functions.C_Finalize = C_Finalize;
124847e946e7SWyllys Ingersoll PK11_Functions.C_GetInfo = C_GetInfo;
124947e946e7SWyllys Ingersoll PK11_Functions.C_GetFunctionList = C_GetFunctionList;
125047e946e7SWyllys Ingersoll PK11_Functions.C_GetSlotList = C_GetSlotList;
125147e946e7SWyllys Ingersoll PK11_Functions.C_GetSlotInfo = C_GetSlotInfo;
125247e946e7SWyllys Ingersoll PK11_Functions.C_GetTokenInfo = C_GetTokenInfo;
125347e946e7SWyllys Ingersoll PK11_Functions.C_GetMechanismList = C_GetMechanismList;
125447e946e7SWyllys Ingersoll PK11_Functions.C_GetMechanismInfo = C_GetMechanismInfo;
125547e946e7SWyllys Ingersoll PK11_Functions.C_InitToken = C_InitToken;
125647e946e7SWyllys Ingersoll PK11_Functions.C_InitPIN = C_InitPIN;
125747e946e7SWyllys Ingersoll PK11_Functions.C_SetPIN = C_SetPIN;
125847e946e7SWyllys Ingersoll PK11_Functions.C_OpenSession = C_OpenSession;
125947e946e7SWyllys Ingersoll PK11_Functions.C_CloseSession = C_CloseSession;
126047e946e7SWyllys Ingersoll PK11_Functions.C_CloseAllSessions = C_CloseAllSessions;
126147e946e7SWyllys Ingersoll PK11_Functions.C_GetSessionInfo = C_GetSessionInfo;
126247e946e7SWyllys Ingersoll PK11_Functions.C_GetOperationState = C_GetOperationState;
126347e946e7SWyllys Ingersoll PK11_Functions.C_SetOperationState = C_SetOperationState;
126447e946e7SWyllys Ingersoll PK11_Functions.C_Login = C_Login;
126547e946e7SWyllys Ingersoll PK11_Functions.C_Logout = C_Logout;
126647e946e7SWyllys Ingersoll PK11_Functions.C_CreateObject = C_CreateObject;
126747e946e7SWyllys Ingersoll PK11_Functions.C_CopyObject = C_CopyObject;
126847e946e7SWyllys Ingersoll PK11_Functions.C_DestroyObject = C_DestroyObject;
126947e946e7SWyllys Ingersoll PK11_Functions.C_GetObjectSize = C_GetObjectSize;
127047e946e7SWyllys Ingersoll PK11_Functions.C_GetAttributeValue = C_GetAttributeValue;
127147e946e7SWyllys Ingersoll PK11_Functions.C_SetAttributeValue = C_SetAttributeValue;
127247e946e7SWyllys Ingersoll PK11_Functions.C_FindObjectsInit = C_FindObjectsInit;
127347e946e7SWyllys Ingersoll PK11_Functions.C_FindObjects = C_FindObjects;
127447e946e7SWyllys Ingersoll PK11_Functions.C_FindObjectsFinal = C_FindObjectsFinal;
127547e946e7SWyllys Ingersoll PK11_Functions.C_EncryptInit = C_EncryptInit;
127647e946e7SWyllys Ingersoll PK11_Functions.C_Encrypt = C_Encrypt;
127747e946e7SWyllys Ingersoll PK11_Functions.C_EncryptUpdate = C_EncryptUpdate;
127847e946e7SWyllys Ingersoll PK11_Functions.C_EncryptFinal = C_EncryptFinal;
127947e946e7SWyllys Ingersoll PK11_Functions.C_DecryptInit = C_DecryptInit;
128047e946e7SWyllys Ingersoll PK11_Functions.C_Decrypt = C_Decrypt;
128147e946e7SWyllys Ingersoll PK11_Functions.C_DecryptUpdate = C_DecryptUpdate;
128247e946e7SWyllys Ingersoll PK11_Functions.C_DecryptFinal = C_DecryptFinal;
128347e946e7SWyllys Ingersoll PK11_Functions.C_DigestInit = C_DigestInit;
128447e946e7SWyllys Ingersoll PK11_Functions.C_Digest = C_Digest;
128547e946e7SWyllys Ingersoll PK11_Functions.C_DigestUpdate = C_DigestUpdate;
128647e946e7SWyllys Ingersoll PK11_Functions.C_DigestKey = C_DigestKey;
128747e946e7SWyllys Ingersoll PK11_Functions.C_DigestFinal = C_DigestFinal;
128847e946e7SWyllys Ingersoll PK11_Functions.C_SignInit = C_SignInit;
128947e946e7SWyllys Ingersoll PK11_Functions.C_Sign = C_Sign;
129047e946e7SWyllys Ingersoll PK11_Functions.C_SignUpdate = C_SignUpdate;
129147e946e7SWyllys Ingersoll PK11_Functions.C_SignFinal = C_SignFinal;
129247e946e7SWyllys Ingersoll PK11_Functions.C_SignRecoverInit = C_SignRecoverInit;
129347e946e7SWyllys Ingersoll PK11_Functions.C_SignRecover = C_SignRecover;
129447e946e7SWyllys Ingersoll PK11_Functions.C_VerifyInit = C_VerifyInit;
129547e946e7SWyllys Ingersoll PK11_Functions.C_Verify = C_Verify;
129647e946e7SWyllys Ingersoll PK11_Functions.C_VerifyUpdate = C_VerifyUpdate;
129747e946e7SWyllys Ingersoll PK11_Functions.C_VerifyFinal = C_VerifyFinal;
129847e946e7SWyllys Ingersoll PK11_Functions.C_VerifyRecoverInit = C_VerifyRecoverInit;
129947e946e7SWyllys Ingersoll PK11_Functions.C_VerifyRecover = C_VerifyRecover;
130047e946e7SWyllys Ingersoll PK11_Functions.C_DigestEncryptUpdate = C_DigestEncryptUpdate;
130147e946e7SWyllys Ingersoll PK11_Functions.C_DecryptDigestUpdate = C_DecryptDigestUpdate;
130247e946e7SWyllys Ingersoll PK11_Functions.C_SignEncryptUpdate = C_SignEncryptUpdate;
130347e946e7SWyllys Ingersoll PK11_Functions.C_DecryptVerifyUpdate = C_DecryptVerifyUpdate;
130447e946e7SWyllys Ingersoll PK11_Functions.C_GenerateKey = C_GenerateKey;
130547e946e7SWyllys Ingersoll PK11_Functions.C_GenerateKeyPair = C_GenerateKeyPair;
130647e946e7SWyllys Ingersoll PK11_Functions.C_WrapKey = C_WrapKey;
130747e946e7SWyllys Ingersoll PK11_Functions.C_UnwrapKey = C_UnwrapKey;
130847e946e7SWyllys Ingersoll PK11_Functions.C_DeriveKey = C_DeriveKey;
130947e946e7SWyllys Ingersoll PK11_Functions.C_SeedRandom = C_SeedRandom;
131047e946e7SWyllys Ingersoll PK11_Functions.C_GenerateRandom = C_GenerateRandom;
131147e946e7SWyllys Ingersoll PK11_Functions.C_GetFunctionStatus = C_GetFunctionStatus;
131247e946e7SWyllys Ingersoll PK11_Functions.C_CancelFunction = C_CancelFunction;
131347e946e7SWyllys Ingersoll PK11_Functions.C_WaitForSlotEvent = C_WaitForSlotEvent;
131447e946e7SWyllys Ingersoll if (ppFunctionList) {
131547e946e7SWyllys Ingersoll (*ppFunctionList) = &PK11_Functions;
131647e946e7SWyllys Ingersoll return (CKR_OK);
131747e946e7SWyllys Ingersoll } else {
131847e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
131947e946e7SWyllys Ingersoll }
132047e946e7SWyllys Ingersoll }
132147e946e7SWyllys Ingersoll
132247e946e7SWyllys Ingersoll /*ARGSUSED*/
132347e946e7SWyllys Ingersoll CK_RV
C_GetFunctionStatus(CK_SESSION_HANDLE hSession)132447e946e7SWyllys Ingersoll C_GetFunctionStatus(CK_SESSION_HANDLE hSession)
132547e946e7SWyllys Ingersoll {
132647e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
132747e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
132847e946e7SWyllys Ingersoll }
132947e946e7SWyllys Ingersoll return (CKR_FUNCTION_NOT_PARALLEL); // PER Specification PG 170
133047e946e7SWyllys Ingersoll }
133147e946e7SWyllys Ingersoll
133247e946e7SWyllys Ingersoll CK_RV
C_GetInfo(CK_INFO_PTR pInfo)133347e946e7SWyllys Ingersoll C_GetInfo(CK_INFO_PTR pInfo)
133447e946e7SWyllys Ingersoll {
133547e946e7SWyllys Ingersoll TOKEN_DATA td;
133647e946e7SWyllys Ingersoll TSS_HCONTEXT hContext;
133747e946e7SWyllys Ingersoll
133847e946e7SWyllys Ingersoll if (! API_Initialized()) {
133947e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
134047e946e7SWyllys Ingersoll }
134147e946e7SWyllys Ingersoll if (! pInfo) {
134247e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
134347e946e7SWyllys Ingersoll }
134447e946e7SWyllys Ingersoll (void) memset(pInfo, 0, sizeof (*pInfo));
134547e946e7SWyllys Ingersoll pInfo->cryptokiVersion.major = 2;
134647e946e7SWyllys Ingersoll pInfo->cryptokiVersion.minor = 20;
134747e946e7SWyllys Ingersoll
1348*8d26100cSWyllys Ingersoll if (open_tss_context(&hContext) == 0) {
1349*8d26100cSWyllys Ingersoll /*
1350*8d26100cSWyllys Ingersoll * Only populate the TPM info if we can establish
1351*8d26100cSWyllys Ingersoll * a context, but don't return failure because
1352*8d26100cSWyllys Ingersoll * the framework needs to know some of the info.
1353*8d26100cSWyllys Ingersoll */
1354*8d26100cSWyllys Ingersoll (void) token_get_tpm_info(hContext, &td);
135547e946e7SWyllys Ingersoll
1356*8d26100cSWyllys Ingersoll (void) Tspi_Context_Close(hContext);
135747e946e7SWyllys Ingersoll
1358*8d26100cSWyllys Ingersoll (void) memcpy(pInfo->manufacturerID,
1359*8d26100cSWyllys Ingersoll &(td.token_info.manufacturerID),
1360*8d26100cSWyllys Ingersoll sizeof (pInfo->manufacturerID) - 1);
1361b693132fSjmcp
1362*8d26100cSWyllys Ingersoll pInfo->flags = td.token_info.flags;
1363*8d26100cSWyllys Ingersoll }
136447e946e7SWyllys Ingersoll (void) strcpy((char *)pInfo->libraryDescription,
136547e946e7SWyllys Ingersoll "PKCS11 Interface for TPM");
136647e946e7SWyllys Ingersoll
136747e946e7SWyllys Ingersoll pInfo->libraryVersion.major = 1;
136847e946e7SWyllys Ingersoll pInfo->libraryVersion.minor = 0;
136947e946e7SWyllys Ingersoll
137047e946e7SWyllys Ingersoll return (CKR_OK);
137147e946e7SWyllys Ingersoll }
137247e946e7SWyllys Ingersoll
137347e946e7SWyllys Ingersoll CK_RV
C_GetMechanismInfo(CK_SLOT_ID slotID,CK_MECHANISM_TYPE type,CK_MECHANISM_INFO_PTR pInfo)137447e946e7SWyllys Ingersoll C_GetMechanismInfo(CK_SLOT_ID slotID,
137547e946e7SWyllys Ingersoll CK_MECHANISM_TYPE type,
137647e946e7SWyllys Ingersoll CK_MECHANISM_INFO_PTR pInfo)
137747e946e7SWyllys Ingersoll {
137847e946e7SWyllys Ingersoll CK_RV rv;
1379*8d26100cSWyllys Ingersoll if (API_Initialized() == FALSE)
138047e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
1381*8d26100cSWyllys Ingersoll
1382*8d26100cSWyllys Ingersoll if (!global_shm->token_available || (slotID > NUMBER_SLOTS_MANAGED))
138347e946e7SWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
1384*8d26100cSWyllys Ingersoll
138547e946e7SWyllys Ingersoll if (FuncList.ST_GetMechanismInfo) {
138647e946e7SWyllys Ingersoll rv = FuncList.ST_GetMechanismInfo(slotID, type, pInfo);
138747e946e7SWyllys Ingersoll } else {
138847e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
138947e946e7SWyllys Ingersoll }
139047e946e7SWyllys Ingersoll return (rv);
139147e946e7SWyllys Ingersoll }
139247e946e7SWyllys Ingersoll
139347e946e7SWyllys Ingersoll CK_RV
C_GetMechanismList(CK_SLOT_ID slotID,CK_MECHANISM_TYPE_PTR pMechanismList,CK_ULONG_PTR pulCount)139447e946e7SWyllys Ingersoll C_GetMechanismList(CK_SLOT_ID slotID,
139547e946e7SWyllys Ingersoll CK_MECHANISM_TYPE_PTR pMechanismList,
139647e946e7SWyllys Ingersoll CK_ULONG_PTR pulCount)
139747e946e7SWyllys Ingersoll {
139847e946e7SWyllys Ingersoll CK_RV rv;
139947e946e7SWyllys Ingersoll
1400*8d26100cSWyllys Ingersoll if (API_Initialized() == FALSE)
140147e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
1402*8d26100cSWyllys Ingersoll
140347e946e7SWyllys Ingersoll if (! pulCount)
140447e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
140547e946e7SWyllys Ingersoll
1406*8d26100cSWyllys Ingersoll if (!global_shm->token_available || (slotID > NUMBER_SLOTS_MANAGED))
140747e946e7SWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
140847e946e7SWyllys Ingersoll
140947e946e7SWyllys Ingersoll if (FuncList.ST_GetMechanismList) {
141047e946e7SWyllys Ingersoll rv = FuncList.ST_GetMechanismList(slotID,
141147e946e7SWyllys Ingersoll pMechanismList, pulCount);
141247e946e7SWyllys Ingersoll } else {
141347e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
141447e946e7SWyllys Ingersoll }
141547e946e7SWyllys Ingersoll if (rv == CKR_OK) {
141647e946e7SWyllys Ingersoll if (pMechanismList) {
141747e946e7SWyllys Ingersoll unsigned long i;
141847e946e7SWyllys Ingersoll for (i = 0; i < *pulCount; i++) {
141947e946e7SWyllys Ingersoll logit(LOG_DEBUG, "Mechanism[%d] 0x%08X ",
142047e946e7SWyllys Ingersoll i, pMechanismList[i]);
142147e946e7SWyllys Ingersoll }
142247e946e7SWyllys Ingersoll }
142347e946e7SWyllys Ingersoll }
142447e946e7SWyllys Ingersoll return (rv);
142547e946e7SWyllys Ingersoll }
142647e946e7SWyllys Ingersoll
142747e946e7SWyllys Ingersoll CK_RV
C_GetObjectSize(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject,CK_ULONG_PTR pulSize)142847e946e7SWyllys Ingersoll C_GetObjectSize(CK_SESSION_HANDLE hSession,
142947e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hObject,
143047e946e7SWyllys Ingersoll CK_ULONG_PTR pulSize)
143147e946e7SWyllys Ingersoll {
143247e946e7SWyllys Ingersoll CK_RV rv;
143347e946e7SWyllys Ingersoll ST_SESSION_T rSession;
143447e946e7SWyllys Ingersoll
143547e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
143647e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
143747e946e7SWyllys Ingersoll }
143847e946e7SWyllys Ingersoll if (! pulSize) {
143947e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
144047e946e7SWyllys Ingersoll }
144147e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
144247e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
144347e946e7SWyllys Ingersoll }
144447e946e7SWyllys Ingersoll if (FuncList.ST_GetObjectSize) {
144547e946e7SWyllys Ingersoll rv = FuncList.ST_GetObjectSize(rSession, hObject, pulSize);
144647e946e7SWyllys Ingersoll } else {
144747e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
144847e946e7SWyllys Ingersoll }
144947e946e7SWyllys Ingersoll return (rv);
145047e946e7SWyllys Ingersoll }
145147e946e7SWyllys Ingersoll
145247e946e7SWyllys Ingersoll CK_RV
C_GetOperationState(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pOperationState,CK_ULONG_PTR pulOperationStateLen)145347e946e7SWyllys Ingersoll C_GetOperationState(CK_SESSION_HANDLE hSession,
145447e946e7SWyllys Ingersoll CK_BYTE_PTR pOperationState,
145547e946e7SWyllys Ingersoll CK_ULONG_PTR pulOperationStateLen)
145647e946e7SWyllys Ingersoll {
145747e946e7SWyllys Ingersoll CK_RV rv;
145847e946e7SWyllys Ingersoll ST_SESSION_T rSession;
145947e946e7SWyllys Ingersoll
146047e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
146147e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
146247e946e7SWyllys Ingersoll }
146347e946e7SWyllys Ingersoll if (! pulOperationStateLen) {
146447e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
146547e946e7SWyllys Ingersoll }
146647e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
146747e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
146847e946e7SWyllys Ingersoll }
146947e946e7SWyllys Ingersoll if (FuncList.ST_GetOperationState) {
147047e946e7SWyllys Ingersoll rv = FuncList.ST_GetOperationState(rSession,
147147e946e7SWyllys Ingersoll pOperationState, pulOperationStateLen);
147247e946e7SWyllys Ingersoll } else {
147347e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
147447e946e7SWyllys Ingersoll }
147547e946e7SWyllys Ingersoll return (rv);
147647e946e7SWyllys Ingersoll }
147747e946e7SWyllys Ingersoll
147847e946e7SWyllys Ingersoll CK_RV
C_GetSessionInfo(CK_SESSION_HANDLE hSession,CK_SESSION_INFO_PTR pInfo)147947e946e7SWyllys Ingersoll C_GetSessionInfo(CK_SESSION_HANDLE hSession,
148047e946e7SWyllys Ingersoll CK_SESSION_INFO_PTR pInfo)
148147e946e7SWyllys Ingersoll {
148247e946e7SWyllys Ingersoll CK_RV rv;
148347e946e7SWyllys Ingersoll ST_SESSION_T rSession;
148447e946e7SWyllys Ingersoll
148547e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
148647e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
148747e946e7SWyllys Ingersoll }
148847e946e7SWyllys Ingersoll if (! pInfo) {
148947e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
149047e946e7SWyllys Ingersoll }
149147e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
149247e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
149347e946e7SWyllys Ingersoll }
149447e946e7SWyllys Ingersoll if (FuncList.ST_GetSessionInfo) {
149547e946e7SWyllys Ingersoll rv = FuncList.ST_GetSessionInfo(rSession, pInfo);
149647e946e7SWyllys Ingersoll } else {
149747e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
149847e946e7SWyllys Ingersoll }
149947e946e7SWyllys Ingersoll return (rv);
150047e946e7SWyllys Ingersoll }
150147e946e7SWyllys Ingersoll
150247e946e7SWyllys Ingersoll CK_RV
C_GetSlotInfo(CK_SLOT_ID slotID,CK_SLOT_INFO_PTR pInfo)150347e946e7SWyllys Ingersoll C_GetSlotInfo(CK_SLOT_ID slotID,
150447e946e7SWyllys Ingersoll CK_SLOT_INFO_PTR pInfo)
150547e946e7SWyllys Ingersoll {
1506*8d26100cSWyllys Ingersoll if (API_Initialized() == FALSE)
150747e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
1508*8d26100cSWyllys Ingersoll
1509*8d26100cSWyllys Ingersoll if (!pInfo)
151047e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
1511*8d26100cSWyllys Ingersoll
1512*8d26100cSWyllys Ingersoll if (!global_shm->token_available || (slotID > NUMBER_SLOTS_MANAGED))
151347e946e7SWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
151447e946e7SWyllys Ingersoll
151547e946e7SWyllys Ingersoll copy_slot_info(slotID, pInfo);
151647e946e7SWyllys Ingersoll return (CKR_OK);
151747e946e7SWyllys Ingersoll }
151847e946e7SWyllys Ingersoll
151947e946e7SWyllys Ingersoll /*ARGSUSED*/
152047e946e7SWyllys Ingersoll CK_RV
C_GetSlotList(CK_BBOOL tokenPresent,CK_SLOT_ID_PTR pSlotList,CK_ULONG_PTR pulCount)152147e946e7SWyllys Ingersoll C_GetSlotList(CK_BBOOL tokenPresent,
152247e946e7SWyllys Ingersoll CK_SLOT_ID_PTR pSlotList,
152347e946e7SWyllys Ingersoll CK_ULONG_PTR pulCount)
152447e946e7SWyllys Ingersoll {
152547e946e7SWyllys Ingersoll CK_ULONG count;
152647e946e7SWyllys Ingersoll CK_SLOT_INFO slotInfo;
152747e946e7SWyllys Ingersoll
152847e946e7SWyllys Ingersoll if (API_Initialized() == FALSE)
152947e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
153047e946e7SWyllys Ingersoll
153147e946e7SWyllys Ingersoll if (pulCount == NULL)
153247e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
153347e946e7SWyllys Ingersoll
153447e946e7SWyllys Ingersoll count = 0;
1535*8d26100cSWyllys Ingersoll /*
1536*8d26100cSWyllys Ingersoll * If we can't talk to the TPM, present no slots
1537*8d26100cSWyllys Ingersoll */
1538*8d26100cSWyllys Ingersoll if (!global_shm->token_available) {
1539*8d26100cSWyllys Ingersoll *pulCount = 0;
1540*8d26100cSWyllys Ingersoll return (CKR_OK);
1541*8d26100cSWyllys Ingersoll }
154247e946e7SWyllys Ingersoll
154347e946e7SWyllys Ingersoll copy_slot_info(TPM_SLOTID, &slotInfo);
154447e946e7SWyllys Ingersoll if ((slotInfo.flags & CKF_TOKEN_PRESENT))
154547e946e7SWyllys Ingersoll count++;
154647e946e7SWyllys Ingersoll
154747e946e7SWyllys Ingersoll *pulCount = count;
154847e946e7SWyllys Ingersoll
154947e946e7SWyllys Ingersoll if (pSlotList == NULL) {
155047e946e7SWyllys Ingersoll return (CKR_OK);
155147e946e7SWyllys Ingersoll } else {
155247e946e7SWyllys Ingersoll if (*pulCount < count)
155347e946e7SWyllys Ingersoll return (CKR_BUFFER_TOO_SMALL);
155447e946e7SWyllys Ingersoll pSlotList[0] = TPM_SLOTID;
155547e946e7SWyllys Ingersoll }
155647e946e7SWyllys Ingersoll return (CKR_OK);
155747e946e7SWyllys Ingersoll }
155847e946e7SWyllys Ingersoll
155947e946e7SWyllys Ingersoll CK_RV
C_GetTokenInfo(CK_SLOT_ID slotID,CK_TOKEN_INFO_PTR pInfo)156047e946e7SWyllys Ingersoll C_GetTokenInfo(CK_SLOT_ID slotID,
156147e946e7SWyllys Ingersoll CK_TOKEN_INFO_PTR pInfo)
156247e946e7SWyllys Ingersoll {
156347e946e7SWyllys Ingersoll CK_RV rv;
156447e946e7SWyllys Ingersoll
1565*8d26100cSWyllys Ingersoll if (API_Initialized() == FALSE)
156647e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
1567*8d26100cSWyllys Ingersoll
1568*8d26100cSWyllys Ingersoll if (!pInfo)
156947e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
1570*8d26100cSWyllys Ingersoll
1571*8d26100cSWyllys Ingersoll if (!global_shm->token_available || (slotID > NUMBER_SLOTS_MANAGED))
157247e946e7SWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
1573*8d26100cSWyllys Ingersoll
157447e946e7SWyllys Ingersoll slotID = TPM_SLOTID;
157547e946e7SWyllys Ingersoll if (FuncList.ST_GetTokenInfo) {
157647e946e7SWyllys Ingersoll rv = FuncList.ST_GetTokenInfo(slotID, pInfo);
157747e946e7SWyllys Ingersoll } else {
157847e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
157947e946e7SWyllys Ingersoll }
158047e946e7SWyllys Ingersoll return (rv);
158147e946e7SWyllys Ingersoll }
158247e946e7SWyllys Ingersoll
158347e946e7SWyllys Ingersoll CK_RV
C_Initialize(CK_VOID_PTR pVoid)158447e946e7SWyllys Ingersoll C_Initialize(CK_VOID_PTR pVoid)
158547e946e7SWyllys Ingersoll {
158647e946e7SWyllys Ingersoll CK_RV rv = CKR_OK;
158747e946e7SWyllys Ingersoll CK_C_INITIALIZE_ARGS *pArg;
158847e946e7SWyllys Ingersoll extern CK_RV ST_Initialize(void *,
158947e946e7SWyllys Ingersoll CK_SLOT_ID, unsigned char *);
159047e946e7SWyllys Ingersoll
159147e946e7SWyllys Ingersoll (void) pthread_mutex_lock(&global_mutex);
159247e946e7SWyllys Ingersoll if (! Anchor) {
159347e946e7SWyllys Ingersoll Anchor = (API_Proc_Struct_t *)malloc(
159447e946e7SWyllys Ingersoll sizeof (API_Proc_Struct_t));
159547e946e7SWyllys Ingersoll if (Anchor == NULL) {
159647e946e7SWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
159747e946e7SWyllys Ingersoll return (CKR_HOST_MEMORY);
159847e946e7SWyllys Ingersoll }
159947e946e7SWyllys Ingersoll } else {
160047e946e7SWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
160147e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_ALREADY_INITIALIZED);
160247e946e7SWyllys Ingersoll }
160347e946e7SWyllys Ingersoll /*
160447e946e7SWyllys Ingersoll * if pVoid is NULL, then everything is OK. The applicaiton
160547e946e7SWyllys Ingersoll * will not be doing multi thread accesses. We can use the OS
160647e946e7SWyllys Ingersoll * locks anyhow.
160747e946e7SWyllys Ingersoll */
160847e946e7SWyllys Ingersoll if (pVoid != NULL) {
160947e946e7SWyllys Ingersoll int supplied_ok;
161047e946e7SWyllys Ingersoll pArg = (CK_C_INITIALIZE_ARGS *)pVoid;
161147e946e7SWyllys Ingersoll
161247e946e7SWyllys Ingersoll /*
161347e946e7SWyllys Ingersoll * ALL supplied function pointers need to have the value
161447e946e7SWyllys Ingersoll * either NULL or no - NULL.
161547e946e7SWyllys Ingersoll */
161647e946e7SWyllys Ingersoll supplied_ok = (pArg->CreateMutex == NULL &&
161747e946e7SWyllys Ingersoll pArg->DestroyMutex == NULL &&
161847e946e7SWyllys Ingersoll pArg->LockMutex == NULL &&
161947e946e7SWyllys Ingersoll pArg->UnlockMutex == NULL) ||
162047e946e7SWyllys Ingersoll (pArg->CreateMutex != NULL &&
162147e946e7SWyllys Ingersoll pArg->DestroyMutex != NULL &&
162247e946e7SWyllys Ingersoll pArg->LockMutex != NULL &&
162347e946e7SWyllys Ingersoll pArg->UnlockMutex != NULL);
162447e946e7SWyllys Ingersoll
162547e946e7SWyllys Ingersoll if (!supplied_ok) {
162647e946e7SWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
162747e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
162847e946e7SWyllys Ingersoll }
162947e946e7SWyllys Ingersoll /* Check for a pReserved set */
163047e946e7SWyllys Ingersoll if (pArg->pReserved != NULL) {
163147e946e7SWyllys Ingersoll free(Anchor);
163247e946e7SWyllys Ingersoll Anchor = NULL;
163347e946e7SWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
163447e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
163547e946e7SWyllys Ingersoll }
163647e946e7SWyllys Ingersoll /*
163747e946e7SWyllys Ingersoll * When the CKF_OS_LOCKING_OK flag isn't set and mutex
163847e946e7SWyllys Ingersoll * function pointers are supplied by an application,
163947e946e7SWyllys Ingersoll * return (an error. We must be able to use our own primitives.
164047e946e7SWyllys Ingersoll */
164147e946e7SWyllys Ingersoll if (!(pArg->flags & CKF_OS_LOCKING_OK) &&
164247e946e7SWyllys Ingersoll (pArg->CreateMutex != NULL)) {
164347e946e7SWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
164447e946e7SWyllys Ingersoll return (CKR_CANT_LOCK);
164547e946e7SWyllys Ingersoll }
164647e946e7SWyllys Ingersoll }
164747e946e7SWyllys Ingersoll (void) memset((char *)Anchor, 0, sizeof (API_Proc_Struct_t));
164847e946e7SWyllys Ingersoll (void) pthread_mutex_init(&(Anchor->ProcMutex), NULL);
164947e946e7SWyllys Ingersoll (void) pthread_mutex_init(&(Anchor->SessListMutex), NULL);
165047e946e7SWyllys Ingersoll Anchor->Pid = getpid();
165147e946e7SWyllys Ingersoll
165247e946e7SWyllys Ingersoll rv = ST_Initialize((void *)&FuncList, 0, NULL);
165347e946e7SWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
165447e946e7SWyllys Ingersoll return (rv);
165547e946e7SWyllys Ingersoll }
165647e946e7SWyllys Ingersoll
165747e946e7SWyllys Ingersoll CK_RV
C_InitPIN(CK_SESSION_HANDLE hSession,CK_CHAR_PTR pPin,CK_ULONG ulPinLen)165847e946e7SWyllys Ingersoll C_InitPIN(CK_SESSION_HANDLE hSession,
165947e946e7SWyllys Ingersoll CK_CHAR_PTR pPin,
166047e946e7SWyllys Ingersoll CK_ULONG ulPinLen)
166147e946e7SWyllys Ingersoll {
166247e946e7SWyllys Ingersoll CK_RV rv;
166347e946e7SWyllys Ingersoll ST_SESSION_T rSession;
166447e946e7SWyllys Ingersoll
1665*8d26100cSWyllys Ingersoll if (API_Initialized() == FALSE)
166647e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
1667*8d26100cSWyllys Ingersoll
1668*8d26100cSWyllys Ingersoll if (! pPin && ulPinLen)
166947e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
1670*8d26100cSWyllys Ingersoll
1671*8d26100cSWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession))
167247e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
167347e946e7SWyllys Ingersoll
1674*8d26100cSWyllys Ingersoll if (rSession.slotID > NUMBER_SLOTS_MANAGED)
167547e946e7SWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
1676*8d26100cSWyllys Ingersoll
1677*8d26100cSWyllys Ingersoll if (FuncList.ST_InitPIN)
167847e946e7SWyllys Ingersoll rv = FuncList.ST_InitPIN(rSession, pPin, ulPinLen);
1679*8d26100cSWyllys Ingersoll else
168047e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
1681*8d26100cSWyllys Ingersoll
168247e946e7SWyllys Ingersoll return (rv);
168347e946e7SWyllys Ingersoll }
168447e946e7SWyllys Ingersoll
168547e946e7SWyllys Ingersoll CK_RV
C_InitToken(CK_SLOT_ID slotID,CK_CHAR_PTR pPin,CK_ULONG ulPinLen,CK_CHAR_PTR pLabel)168647e946e7SWyllys Ingersoll C_InitToken(CK_SLOT_ID slotID,
168747e946e7SWyllys Ingersoll CK_CHAR_PTR pPin,
168847e946e7SWyllys Ingersoll CK_ULONG ulPinLen,
168947e946e7SWyllys Ingersoll CK_CHAR_PTR pLabel)
169047e946e7SWyllys Ingersoll {
169147e946e7SWyllys Ingersoll CK_RV rv;
169247e946e7SWyllys Ingersoll
1693*8d26100cSWyllys Ingersoll if (API_Initialized() == FALSE)
169447e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
1695*8d26100cSWyllys Ingersoll
1696*8d26100cSWyllys Ingersoll if (! pPin && ulPinLen)
169747e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
1698*8d26100cSWyllys Ingersoll
1699*8d26100cSWyllys Ingersoll if (! pLabel)
170047e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
1701*8d26100cSWyllys Ingersoll
1702*8d26100cSWyllys Ingersoll if (!global_shm->token_available)
1703*8d26100cSWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
1704*8d26100cSWyllys Ingersoll
1705*8d26100cSWyllys Ingersoll if (FuncList.ST_InitToken)
170647e946e7SWyllys Ingersoll rv = FuncList.ST_InitToken(slotID, pPin, ulPinLen, pLabel);
1707*8d26100cSWyllys Ingersoll else
170847e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
1709*8d26100cSWyllys Ingersoll
171047e946e7SWyllys Ingersoll return (rv);
171147e946e7SWyllys Ingersoll }
171247e946e7SWyllys Ingersoll
171347e946e7SWyllys Ingersoll CK_RV
C_Login(CK_SESSION_HANDLE hSession,CK_USER_TYPE userType,CK_CHAR_PTR pPin,CK_ULONG ulPinLen)171447e946e7SWyllys Ingersoll C_Login(CK_SESSION_HANDLE hSession,
171547e946e7SWyllys Ingersoll CK_USER_TYPE userType,
171647e946e7SWyllys Ingersoll CK_CHAR_PTR pPin,
171747e946e7SWyllys Ingersoll CK_ULONG ulPinLen)
171847e946e7SWyllys Ingersoll {
171947e946e7SWyllys Ingersoll CK_RV rv;
172047e946e7SWyllys Ingersoll ST_SESSION_T rSession;
172147e946e7SWyllys Ingersoll
172247e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
172347e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
172447e946e7SWyllys Ingersoll }
172547e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
172647e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
172747e946e7SWyllys Ingersoll }
172847e946e7SWyllys Ingersoll if (FuncList.ST_Login) {
172947e946e7SWyllys Ingersoll rv = FuncList.ST_Login(rSession, userType, pPin, ulPinLen);
173047e946e7SWyllys Ingersoll } else {
173147e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
173247e946e7SWyllys Ingersoll }
173347e946e7SWyllys Ingersoll return (rv);
173447e946e7SWyllys Ingersoll }
173547e946e7SWyllys Ingersoll
173647e946e7SWyllys Ingersoll CK_RV
C_Logout(CK_SESSION_HANDLE hSession)173747e946e7SWyllys Ingersoll C_Logout(CK_SESSION_HANDLE hSession)
173847e946e7SWyllys Ingersoll {
173947e946e7SWyllys Ingersoll CK_RV rv;
174047e946e7SWyllys Ingersoll ST_SESSION_T rSession;
174147e946e7SWyllys Ingersoll
174247e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
174347e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
174447e946e7SWyllys Ingersoll }
174547e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
174647e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
174747e946e7SWyllys Ingersoll }
174847e946e7SWyllys Ingersoll if (FuncList.ST_Logout) {
174947e946e7SWyllys Ingersoll rv = FuncList.ST_Logout(rSession);
175047e946e7SWyllys Ingersoll } else {
175147e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
175247e946e7SWyllys Ingersoll }
175347e946e7SWyllys Ingersoll return (rv);
175447e946e7SWyllys Ingersoll }
175547e946e7SWyllys Ingersoll
175647e946e7SWyllys Ingersoll /*ARGSUSED*/
175747e946e7SWyllys Ingersoll CK_RV
C_OpenSession(CK_SLOT_ID slotID,CK_FLAGS flags,CK_VOID_PTR pApplication,CK_NOTIFY Notify,CK_SESSION_HANDLE_PTR phSession)175847e946e7SWyllys Ingersoll C_OpenSession(
175947e946e7SWyllys Ingersoll CK_SLOT_ID slotID,
176047e946e7SWyllys Ingersoll CK_FLAGS flags,
176147e946e7SWyllys Ingersoll CK_VOID_PTR pApplication,
176247e946e7SWyllys Ingersoll CK_NOTIFY Notify,
176347e946e7SWyllys Ingersoll CK_SESSION_HANDLE_PTR phSession)
176447e946e7SWyllys Ingersoll {
176547e946e7SWyllys Ingersoll CK_RV rv;
176647e946e7SWyllys Ingersoll Session_Struct_t *apiSessp;
176747e946e7SWyllys Ingersoll
1768*8d26100cSWyllys Ingersoll if (API_Initialized() == FALSE)
176947e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
1770*8d26100cSWyllys Ingersoll
1771*8d26100cSWyllys Ingersoll if (!global_shm->token_available || (slotID > NUMBER_SLOTS_MANAGED))
177247e946e7SWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
1773*8d26100cSWyllys Ingersoll
1774*8d26100cSWyllys Ingersoll if (! phSession)
177547e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
1776*8d26100cSWyllys Ingersoll
1777*8d26100cSWyllys Ingersoll if ((flags & CKF_SERIAL_SESSION) == 0)
177847e946e7SWyllys Ingersoll return (CKR_SESSION_PARALLEL_NOT_SUPPORTED);
1779*8d26100cSWyllys Ingersoll
178047e946e7SWyllys Ingersoll if ((apiSessp = (Session_Struct_t *)malloc(
1781*8d26100cSWyllys Ingersoll sizeof (Session_Struct_t))) == NULL)
178247e946e7SWyllys Ingersoll return (CKR_HOST_MEMORY);
1783*8d26100cSWyllys Ingersoll
178447e946e7SWyllys Ingersoll if (FuncList.ST_OpenSession) {
178547e946e7SWyllys Ingersoll rv = FuncList.ST_OpenSession(slotID, flags,
178647e946e7SWyllys Ingersoll &(apiSessp->RealHandle));
178747e946e7SWyllys Ingersoll
178847e946e7SWyllys Ingersoll if (rv == CKR_OK) {
178947e946e7SWyllys Ingersoll *phSession = (CK_SESSION_HANDLE)apiSessp;
179047e946e7SWyllys Ingersoll apiSessp->SltId = slotID;
179147e946e7SWyllys Ingersoll
179247e946e7SWyllys Ingersoll AddToSessionList(apiSessp);
179347e946e7SWyllys Ingersoll } else {
179447e946e7SWyllys Ingersoll free(apiSessp);
179547e946e7SWyllys Ingersoll }
179647e946e7SWyllys Ingersoll } else {
179747e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
179847e946e7SWyllys Ingersoll }
179947e946e7SWyllys Ingersoll return (rv);
180047e946e7SWyllys Ingersoll }
180147e946e7SWyllys Ingersoll
180247e946e7SWyllys Ingersoll CK_RV
C_SeedRandom(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSeed,CK_ULONG ulSeedLen)180347e946e7SWyllys Ingersoll C_SeedRandom(CK_SESSION_HANDLE hSession,
180447e946e7SWyllys Ingersoll CK_BYTE_PTR pSeed,
180547e946e7SWyllys Ingersoll CK_ULONG ulSeedLen)
180647e946e7SWyllys Ingersoll {
180747e946e7SWyllys Ingersoll CK_RV rv;
180847e946e7SWyllys Ingersoll ST_SESSION_T rSession;
180947e946e7SWyllys Ingersoll
181047e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
181147e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
181247e946e7SWyllys Ingersoll }
181347e946e7SWyllys Ingersoll if (! pSeed && ulSeedLen) {
181447e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
181547e946e7SWyllys Ingersoll }
181647e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
181747e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
181847e946e7SWyllys Ingersoll }
181947e946e7SWyllys Ingersoll if (FuncList.ST_SeedRandom) {
182047e946e7SWyllys Ingersoll rv = FuncList.ST_SeedRandom(rSession, pSeed, ulSeedLen);
182147e946e7SWyllys Ingersoll } else {
182247e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
182347e946e7SWyllys Ingersoll }
182447e946e7SWyllys Ingersoll return (rv);
182547e946e7SWyllys Ingersoll }
182647e946e7SWyllys Ingersoll
182747e946e7SWyllys Ingersoll CK_RV
C_SetAttributeValue(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount)182847e946e7SWyllys Ingersoll C_SetAttributeValue(CK_SESSION_HANDLE hSession,
182947e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hObject,
183047e946e7SWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
183147e946e7SWyllys Ingersoll CK_ULONG ulCount)
183247e946e7SWyllys Ingersoll {
183347e946e7SWyllys Ingersoll CK_RV rv;
183447e946e7SWyllys Ingersoll ST_SESSION_T rSession;
183547e946e7SWyllys Ingersoll
183647e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
183747e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
183847e946e7SWyllys Ingersoll }
183947e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
184047e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
184147e946e7SWyllys Ingersoll }
184247e946e7SWyllys Ingersoll if (! pTemplate) {
184347e946e7SWyllys Ingersoll return (CKR_TEMPLATE_INCOMPLETE);
184447e946e7SWyllys Ingersoll }
184547e946e7SWyllys Ingersoll if (! ulCount) {
184647e946e7SWyllys Ingersoll return (CKR_TEMPLATE_INCOMPLETE);
184747e946e7SWyllys Ingersoll }
184847e946e7SWyllys Ingersoll // Get local pointers to session
184947e946e7SWyllys Ingersoll if (FuncList.ST_SetAttributeValue) {
185047e946e7SWyllys Ingersoll rv = FuncList.ST_SetAttributeValue(rSession, hObject,
185147e946e7SWyllys Ingersoll pTemplate, ulCount);
185247e946e7SWyllys Ingersoll } else {
185347e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
185447e946e7SWyllys Ingersoll }
185547e946e7SWyllys Ingersoll return (rv);
185647e946e7SWyllys Ingersoll }
185747e946e7SWyllys Ingersoll
185847e946e7SWyllys Ingersoll CK_RV
C_SetOperationState(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pOperationState,CK_ULONG ulOperationStateLen,CK_OBJECT_HANDLE hEncryptionKey,CK_OBJECT_HANDLE hAuthenticationKey)185947e946e7SWyllys Ingersoll C_SetOperationState(CK_SESSION_HANDLE hSession,
186047e946e7SWyllys Ingersoll CK_BYTE_PTR pOperationState,
186147e946e7SWyllys Ingersoll CK_ULONG ulOperationStateLen,
186247e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hEncryptionKey,
186347e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hAuthenticationKey)
186447e946e7SWyllys Ingersoll {
186547e946e7SWyllys Ingersoll CK_RV rv;
186647e946e7SWyllys Ingersoll ST_SESSION_T rSession;
186747e946e7SWyllys Ingersoll
186847e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
186947e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
187047e946e7SWyllys Ingersoll }
187147e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
187247e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
187347e946e7SWyllys Ingersoll }
187447e946e7SWyllys Ingersoll if (! pOperationState || ulOperationStateLen == 0) {
187547e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
187647e946e7SWyllys Ingersoll }
187747e946e7SWyllys Ingersoll if (FuncList.ST_SetOperationState) {
187847e946e7SWyllys Ingersoll rv = FuncList.ST_SetOperationState(rSession, pOperationState,
187947e946e7SWyllys Ingersoll ulOperationStateLen, hEncryptionKey, hAuthenticationKey);
188047e946e7SWyllys Ingersoll } else {
188147e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
188247e946e7SWyllys Ingersoll }
188347e946e7SWyllys Ingersoll return (rv);
188447e946e7SWyllys Ingersoll }
188547e946e7SWyllys Ingersoll
188647e946e7SWyllys Ingersoll CK_RV
C_SetPIN(CK_SESSION_HANDLE hSession,CK_CHAR_PTR pOldPin,CK_ULONG ulOldLen,CK_CHAR_PTR pNewPin,CK_ULONG ulNewLen)188747e946e7SWyllys Ingersoll C_SetPIN(CK_SESSION_HANDLE hSession,
188847e946e7SWyllys Ingersoll CK_CHAR_PTR pOldPin,
188947e946e7SWyllys Ingersoll CK_ULONG ulOldLen,
189047e946e7SWyllys Ingersoll CK_CHAR_PTR pNewPin,
189147e946e7SWyllys Ingersoll CK_ULONG ulNewLen)
189247e946e7SWyllys Ingersoll {
189347e946e7SWyllys Ingersoll CK_RV rv;
189447e946e7SWyllys Ingersoll ST_SESSION_T rSession;
189547e946e7SWyllys Ingersoll
189647e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
189747e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
189847e946e7SWyllys Ingersoll }
189947e946e7SWyllys Ingersoll if (! pOldPin || ! pNewPin)
190047e946e7SWyllys Ingersoll return (CKR_PIN_INVALID);
190147e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
190247e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
190347e946e7SWyllys Ingersoll }
190447e946e7SWyllys Ingersoll if (FuncList.ST_SetPIN) {
190547e946e7SWyllys Ingersoll rv = FuncList.ST_SetPIN(rSession, pOldPin, ulOldLen,
190647e946e7SWyllys Ingersoll pNewPin, ulNewLen);
190747e946e7SWyllys Ingersoll } else {
190847e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
190947e946e7SWyllys Ingersoll }
191047e946e7SWyllys Ingersoll return (rv);
191147e946e7SWyllys Ingersoll }
191247e946e7SWyllys Ingersoll
191347e946e7SWyllys Ingersoll CK_RV
C_Sign(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pSignature,CK_ULONG_PTR pulSignatureLen)191447e946e7SWyllys Ingersoll C_Sign(CK_SESSION_HANDLE hSession,
191547e946e7SWyllys Ingersoll CK_BYTE_PTR pData,
191647e946e7SWyllys Ingersoll CK_ULONG ulDataLen,
191747e946e7SWyllys Ingersoll CK_BYTE_PTR pSignature,
191847e946e7SWyllys Ingersoll CK_ULONG_PTR pulSignatureLen)
191947e946e7SWyllys Ingersoll {
192047e946e7SWyllys Ingersoll CK_RV rv;
192147e946e7SWyllys Ingersoll ST_SESSION_T rSession;
192247e946e7SWyllys Ingersoll
192347e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
192447e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
192547e946e7SWyllys Ingersoll }
192647e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
192747e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
192847e946e7SWyllys Ingersoll }
192947e946e7SWyllys Ingersoll if (FuncList.ST_Sign) {
193047e946e7SWyllys Ingersoll rv = FuncList.ST_Sign(rSession, pData, ulDataLen,
193147e946e7SWyllys Ingersoll pSignature, pulSignatureLen);
193247e946e7SWyllys Ingersoll } else {
193347e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
193447e946e7SWyllys Ingersoll }
193547e946e7SWyllys Ingersoll return (rv);
193647e946e7SWyllys Ingersoll }
193747e946e7SWyllys Ingersoll
193847e946e7SWyllys Ingersoll CK_RV
C_SignEncryptUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen,CK_BYTE_PTR pEncryptedPart,CK_ULONG_PTR pulEncryptedPartLen)193947e946e7SWyllys Ingersoll C_SignEncryptUpdate(CK_SESSION_HANDLE hSession,
194047e946e7SWyllys Ingersoll CK_BYTE_PTR pPart,
194147e946e7SWyllys Ingersoll CK_ULONG ulPartLen,
194247e946e7SWyllys Ingersoll CK_BYTE_PTR pEncryptedPart,
194347e946e7SWyllys Ingersoll CK_ULONG_PTR pulEncryptedPartLen)
194447e946e7SWyllys Ingersoll {
194547e946e7SWyllys Ingersoll CK_RV rv;
194647e946e7SWyllys Ingersoll ST_SESSION_T rSession;
194747e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
194847e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
194947e946e7SWyllys Ingersoll }
195047e946e7SWyllys Ingersoll if (! pPart || ! pulEncryptedPartLen) {
195147e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
195247e946e7SWyllys Ingersoll }
195347e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
195447e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
195547e946e7SWyllys Ingersoll }
195647e946e7SWyllys Ingersoll if (FuncList.ST_SignEncryptUpdate) {
195747e946e7SWyllys Ingersoll rv = FuncList.ST_SignEncryptUpdate(rSession, pPart,
195847e946e7SWyllys Ingersoll ulPartLen, pEncryptedPart, pulEncryptedPartLen);
195947e946e7SWyllys Ingersoll } else {
196047e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
196147e946e7SWyllys Ingersoll }
196247e946e7SWyllys Ingersoll return (rv);
196347e946e7SWyllys Ingersoll }
196447e946e7SWyllys Ingersoll
196547e946e7SWyllys Ingersoll CK_RV
C_SignFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSignature,CK_ULONG_PTR pulSignatureLen)196647e946e7SWyllys Ingersoll C_SignFinal(CK_SESSION_HANDLE hSession,
196747e946e7SWyllys Ingersoll CK_BYTE_PTR pSignature,
196847e946e7SWyllys Ingersoll CK_ULONG_PTR pulSignatureLen)
196947e946e7SWyllys Ingersoll {
197047e946e7SWyllys Ingersoll CK_RV rv;
197147e946e7SWyllys Ingersoll ST_SESSION_T rSession;
197247e946e7SWyllys Ingersoll
197347e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
197447e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
197547e946e7SWyllys Ingersoll }
197647e946e7SWyllys Ingersoll if (! pulSignatureLen) {
197747e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
197847e946e7SWyllys Ingersoll }
197947e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
198047e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
198147e946e7SWyllys Ingersoll }
198247e946e7SWyllys Ingersoll if (FuncList.ST_SignFinal) {
198347e946e7SWyllys Ingersoll rv = FuncList.ST_SignFinal(rSession, pSignature,
198447e946e7SWyllys Ingersoll pulSignatureLen);
198547e946e7SWyllys Ingersoll } else {
198647e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
198747e946e7SWyllys Ingersoll }
198847e946e7SWyllys Ingersoll return (rv);
198947e946e7SWyllys Ingersoll }
199047e946e7SWyllys Ingersoll
199147e946e7SWyllys Ingersoll CK_RV
C_SignInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)199247e946e7SWyllys Ingersoll C_SignInit(CK_SESSION_HANDLE hSession,
199347e946e7SWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
199447e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hKey)
199547e946e7SWyllys Ingersoll {
199647e946e7SWyllys Ingersoll CK_RV rv;
199747e946e7SWyllys Ingersoll ST_SESSION_T rSession;
199847e946e7SWyllys Ingersoll
199947e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
200047e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
200147e946e7SWyllys Ingersoll }
200247e946e7SWyllys Ingersoll if (! pMechanism) {
200347e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
200447e946e7SWyllys Ingersoll }
200547e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
200647e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
200747e946e7SWyllys Ingersoll }
200847e946e7SWyllys Ingersoll if (FuncList.ST_SignInit) {
200947e946e7SWyllys Ingersoll rv = FuncList.ST_SignInit(rSession, pMechanism, hKey);
201047e946e7SWyllys Ingersoll } else {
201147e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
201247e946e7SWyllys Ingersoll }
201347e946e7SWyllys Ingersoll return (rv);
201447e946e7SWyllys Ingersoll }
201547e946e7SWyllys Ingersoll
201647e946e7SWyllys Ingersoll CK_RV
C_SignRecover(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pSignature,CK_ULONG_PTR pulSignatureLen)201747e946e7SWyllys Ingersoll C_SignRecover(CK_SESSION_HANDLE hSession,
201847e946e7SWyllys Ingersoll CK_BYTE_PTR pData,
201947e946e7SWyllys Ingersoll CK_ULONG ulDataLen,
202047e946e7SWyllys Ingersoll CK_BYTE_PTR pSignature,
202147e946e7SWyllys Ingersoll CK_ULONG_PTR pulSignatureLen)
202247e946e7SWyllys Ingersoll {
202347e946e7SWyllys Ingersoll CK_RV rv;
202447e946e7SWyllys Ingersoll ST_SESSION_T rSession;
202547e946e7SWyllys Ingersoll
202647e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
202747e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
202847e946e7SWyllys Ingersoll }
202947e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
203047e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
203147e946e7SWyllys Ingersoll }
203247e946e7SWyllys Ingersoll if (FuncList.ST_SignRecover) {
203347e946e7SWyllys Ingersoll rv = FuncList.ST_SignRecover(rSession, pData,
203447e946e7SWyllys Ingersoll ulDataLen, pSignature, pulSignatureLen);
203547e946e7SWyllys Ingersoll } else {
203647e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
203747e946e7SWyllys Ingersoll }
203847e946e7SWyllys Ingersoll return (rv);
203947e946e7SWyllys Ingersoll }
204047e946e7SWyllys Ingersoll
204147e946e7SWyllys Ingersoll CK_RV
C_SignRecoverInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)204247e946e7SWyllys Ingersoll C_SignRecoverInit(CK_SESSION_HANDLE hSession,
204347e946e7SWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
204447e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hKey)
204547e946e7SWyllys Ingersoll {
204647e946e7SWyllys Ingersoll CK_RV rv;
204747e946e7SWyllys Ingersoll ST_SESSION_T rSession;
204847e946e7SWyllys Ingersoll
204947e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
205047e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
205147e946e7SWyllys Ingersoll }
205247e946e7SWyllys Ingersoll if (! pMechanism) {
205347e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
205447e946e7SWyllys Ingersoll }
205547e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
205647e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
205747e946e7SWyllys Ingersoll }
205847e946e7SWyllys Ingersoll if (FuncList.ST_SignRecoverInit) {
205947e946e7SWyllys Ingersoll rv = FuncList.ST_SignRecoverInit(rSession, pMechanism, hKey);
206047e946e7SWyllys Ingersoll } else {
206147e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
206247e946e7SWyllys Ingersoll }
206347e946e7SWyllys Ingersoll return (rv);
206447e946e7SWyllys Ingersoll }
206547e946e7SWyllys Ingersoll
206647e946e7SWyllys Ingersoll CK_RV
C_SignUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen)206747e946e7SWyllys Ingersoll C_SignUpdate(CK_SESSION_HANDLE hSession,
206847e946e7SWyllys Ingersoll CK_BYTE_PTR pPart,
206947e946e7SWyllys Ingersoll CK_ULONG ulPartLen)
207047e946e7SWyllys Ingersoll {
207147e946e7SWyllys Ingersoll CK_RV rv;
207247e946e7SWyllys Ingersoll ST_SESSION_T rSession;
207347e946e7SWyllys Ingersoll
207447e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
207547e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
207647e946e7SWyllys Ingersoll }
207747e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
207847e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
207947e946e7SWyllys Ingersoll }
208047e946e7SWyllys Ingersoll if (FuncList.ST_SignUpdate) {
208147e946e7SWyllys Ingersoll rv = FuncList.ST_SignUpdate(rSession, pPart, ulPartLen);
208247e946e7SWyllys Ingersoll } else {
208347e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
208447e946e7SWyllys Ingersoll }
208547e946e7SWyllys Ingersoll return (rv);
208647e946e7SWyllys Ingersoll }
208747e946e7SWyllys Ingersoll
208847e946e7SWyllys Ingersoll CK_RV
C_UnwrapKey(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hUnwrappingKey,CK_BYTE_PTR pWrappedKey,CK_ULONG ulWrappedKeyLen,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulAttributeCount,CK_OBJECT_HANDLE_PTR phKey)208947e946e7SWyllys Ingersoll C_UnwrapKey(CK_SESSION_HANDLE hSession,
209047e946e7SWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
209147e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hUnwrappingKey,
209247e946e7SWyllys Ingersoll CK_BYTE_PTR pWrappedKey,
209347e946e7SWyllys Ingersoll CK_ULONG ulWrappedKeyLen,
209447e946e7SWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
209547e946e7SWyllys Ingersoll CK_ULONG ulAttributeCount,
209647e946e7SWyllys Ingersoll CK_OBJECT_HANDLE_PTR phKey)
209747e946e7SWyllys Ingersoll {
209847e946e7SWyllys Ingersoll CK_RV rv;
209947e946e7SWyllys Ingersoll ST_SESSION_T rSession;
210047e946e7SWyllys Ingersoll
210147e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
210247e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
210347e946e7SWyllys Ingersoll }
2104ab8176c2SWyllys Ingersoll if (!pMechanism) {
210547e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
210647e946e7SWyllys Ingersoll }
210747e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
210847e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
210947e946e7SWyllys Ingersoll }
211047e946e7SWyllys Ingersoll if (FuncList.ST_UnwrapKey) {
211147e946e7SWyllys Ingersoll rv = FuncList.ST_UnwrapKey(rSession, pMechanism,
211247e946e7SWyllys Ingersoll hUnwrappingKey, pWrappedKey, ulWrappedKeyLen,
211347e946e7SWyllys Ingersoll pTemplate, ulAttributeCount, phKey);
211447e946e7SWyllys Ingersoll } else {
211547e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
211647e946e7SWyllys Ingersoll }
211747e946e7SWyllys Ingersoll return (rv);
211847e946e7SWyllys Ingersoll }
211947e946e7SWyllys Ingersoll
212047e946e7SWyllys Ingersoll CK_RV
C_Verify(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pSignature,CK_ULONG ulSignatureLen)212147e946e7SWyllys Ingersoll C_Verify(CK_SESSION_HANDLE hSession,
212247e946e7SWyllys Ingersoll CK_BYTE_PTR pData,
212347e946e7SWyllys Ingersoll CK_ULONG ulDataLen,
212447e946e7SWyllys Ingersoll CK_BYTE_PTR pSignature,
212547e946e7SWyllys Ingersoll CK_ULONG ulSignatureLen)
212647e946e7SWyllys Ingersoll {
212747e946e7SWyllys Ingersoll CK_RV rv;
212847e946e7SWyllys Ingersoll ST_SESSION_T rSession;
212947e946e7SWyllys Ingersoll
213047e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
213147e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
213247e946e7SWyllys Ingersoll }
213347e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
213447e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
213547e946e7SWyllys Ingersoll }
213647e946e7SWyllys Ingersoll if (FuncList.ST_Verify) {
213747e946e7SWyllys Ingersoll rv = FuncList.ST_Verify(rSession, pData, ulDataLen,
213847e946e7SWyllys Ingersoll pSignature, ulSignatureLen);
213947e946e7SWyllys Ingersoll } else {
214047e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
214147e946e7SWyllys Ingersoll }
214247e946e7SWyllys Ingersoll return (rv);
214347e946e7SWyllys Ingersoll }
214447e946e7SWyllys Ingersoll
214547e946e7SWyllys Ingersoll CK_RV
C_VerifyFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSignature,CK_ULONG ulSignatureLen)214647e946e7SWyllys Ingersoll C_VerifyFinal(CK_SESSION_HANDLE hSession,
214747e946e7SWyllys Ingersoll CK_BYTE_PTR pSignature,
214847e946e7SWyllys Ingersoll CK_ULONG ulSignatureLen)
214947e946e7SWyllys Ingersoll {
215047e946e7SWyllys Ingersoll CK_RV rv;
215147e946e7SWyllys Ingersoll ST_SESSION_T rSession;
215247e946e7SWyllys Ingersoll
215347e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
215447e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
215547e946e7SWyllys Ingersoll }
215647e946e7SWyllys Ingersoll if (! pSignature) {
215747e946e7SWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
215847e946e7SWyllys Ingersoll }
215947e946e7SWyllys Ingersoll
216047e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
216147e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
216247e946e7SWyllys Ingersoll }
216347e946e7SWyllys Ingersoll if (FuncList.ST_VerifyFinal) {
216447e946e7SWyllys Ingersoll rv = FuncList.ST_VerifyFinal(rSession, pSignature,
216547e946e7SWyllys Ingersoll ulSignatureLen);
216647e946e7SWyllys Ingersoll } else {
216747e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
216847e946e7SWyllys Ingersoll }
216947e946e7SWyllys Ingersoll return (rv);
217047e946e7SWyllys Ingersoll }
217147e946e7SWyllys Ingersoll
217247e946e7SWyllys Ingersoll CK_RV
C_VerifyInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)217347e946e7SWyllys Ingersoll C_VerifyInit(CK_SESSION_HANDLE hSession,
217447e946e7SWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
217547e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hKey)
217647e946e7SWyllys Ingersoll {
217747e946e7SWyllys Ingersoll CK_RV rv;
217847e946e7SWyllys Ingersoll ST_SESSION_T rSession;
217947e946e7SWyllys Ingersoll
218047e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
218147e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
218247e946e7SWyllys Ingersoll }
218347e946e7SWyllys Ingersoll if (! pMechanism) {
218447e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
218547e946e7SWyllys Ingersoll }
218647e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
218747e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
218847e946e7SWyllys Ingersoll }
218947e946e7SWyllys Ingersoll
219047e946e7SWyllys Ingersoll if (FuncList.ST_VerifyInit) {
219147e946e7SWyllys Ingersoll rv = FuncList.ST_VerifyInit(rSession, pMechanism, hKey);
219247e946e7SWyllys Ingersoll } else {
219347e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
219447e946e7SWyllys Ingersoll }
219547e946e7SWyllys Ingersoll return (rv);
219647e946e7SWyllys Ingersoll }
219747e946e7SWyllys Ingersoll
219847e946e7SWyllys Ingersoll CK_RV
C_VerifyRecover(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSignature,CK_ULONG ulSignatureLen,CK_BYTE_PTR pData,CK_ULONG_PTR pulDataLen)219947e946e7SWyllys Ingersoll C_VerifyRecover(CK_SESSION_HANDLE hSession,
220047e946e7SWyllys Ingersoll CK_BYTE_PTR pSignature,
220147e946e7SWyllys Ingersoll CK_ULONG ulSignatureLen,
220247e946e7SWyllys Ingersoll CK_BYTE_PTR pData,
220347e946e7SWyllys Ingersoll CK_ULONG_PTR pulDataLen)
220447e946e7SWyllys Ingersoll {
220547e946e7SWyllys Ingersoll CK_RV rv;
220647e946e7SWyllys Ingersoll ST_SESSION_T rSession;
220747e946e7SWyllys Ingersoll
220847e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
220947e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
221047e946e7SWyllys Ingersoll }
221147e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
221247e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
221347e946e7SWyllys Ingersoll }
221447e946e7SWyllys Ingersoll if (FuncList.ST_VerifyRecover) {
221547e946e7SWyllys Ingersoll rv = FuncList.ST_VerifyRecover(rSession, pSignature,
221647e946e7SWyllys Ingersoll ulSignatureLen, pData, pulDataLen);
221747e946e7SWyllys Ingersoll } else {
221847e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
221947e946e7SWyllys Ingersoll }
222047e946e7SWyllys Ingersoll return (rv);
222147e946e7SWyllys Ingersoll }
222247e946e7SWyllys Ingersoll
222347e946e7SWyllys Ingersoll CK_RV
C_VerifyRecoverInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)222447e946e7SWyllys Ingersoll C_VerifyRecoverInit(CK_SESSION_HANDLE hSession,
222547e946e7SWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
222647e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hKey)
222747e946e7SWyllys Ingersoll {
222847e946e7SWyllys Ingersoll CK_RV rv;
222947e946e7SWyllys Ingersoll ST_SESSION_T rSession;
223047e946e7SWyllys Ingersoll
223147e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
223247e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
223347e946e7SWyllys Ingersoll }
223447e946e7SWyllys Ingersoll if (! pMechanism) {
223547e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
223647e946e7SWyllys Ingersoll }
223747e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
223847e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
223947e946e7SWyllys Ingersoll }
224047e946e7SWyllys Ingersoll if (FuncList.ST_VerifyRecoverInit) {
224147e946e7SWyllys Ingersoll rv = FuncList.ST_VerifyRecoverInit(rSession, pMechanism, hKey);
224247e946e7SWyllys Ingersoll } else {
224347e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
224447e946e7SWyllys Ingersoll }
224547e946e7SWyllys Ingersoll return (rv);
224647e946e7SWyllys Ingersoll }
224747e946e7SWyllys Ingersoll
224847e946e7SWyllys Ingersoll CK_RV
C_VerifyUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen)224947e946e7SWyllys Ingersoll C_VerifyUpdate(CK_SESSION_HANDLE hSession,
225047e946e7SWyllys Ingersoll CK_BYTE_PTR pPart,
225147e946e7SWyllys Ingersoll CK_ULONG ulPartLen)
225247e946e7SWyllys Ingersoll {
225347e946e7SWyllys Ingersoll CK_RV rv;
225447e946e7SWyllys Ingersoll ST_SESSION_T rSession;
225547e946e7SWyllys Ingersoll
225647e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
225747e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
225847e946e7SWyllys Ingersoll }
225947e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
226047e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
226147e946e7SWyllys Ingersoll }
226247e946e7SWyllys Ingersoll if (FuncList.ST_VerifyUpdate) {
226347e946e7SWyllys Ingersoll rv = FuncList.ST_VerifyUpdate(rSession, pPart, ulPartLen);
226447e946e7SWyllys Ingersoll } else {
226547e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
226647e946e7SWyllys Ingersoll }
226747e946e7SWyllys Ingersoll return (rv);
226847e946e7SWyllys Ingersoll }
226947e946e7SWyllys Ingersoll
227047e946e7SWyllys Ingersoll /*ARGSUSED*/
227147e946e7SWyllys Ingersoll CK_RV
C_WaitForSlotEvent(CK_FLAGS flags,CK_SLOT_ID_PTR pSlot,CK_VOID_PTR pReserved)227247e946e7SWyllys Ingersoll C_WaitForSlotEvent(CK_FLAGS flags,
227347e946e7SWyllys Ingersoll CK_SLOT_ID_PTR pSlot,
227447e946e7SWyllys Ingersoll CK_VOID_PTR pReserved)
227547e946e7SWyllys Ingersoll {
227647e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
227747e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
227847e946e7SWyllys Ingersoll }
227947e946e7SWyllys Ingersoll return (CKR_FUNCTION_NOT_SUPPORTED);
228047e946e7SWyllys Ingersoll }
228147e946e7SWyllys Ingersoll
228247e946e7SWyllys Ingersoll CK_RV
C_WrapKey(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hWrappingKey,CK_OBJECT_HANDLE hKey,CK_BYTE_PTR pWrappedKey,CK_ULONG_PTR pulWrappedKeyLen)228347e946e7SWyllys Ingersoll C_WrapKey(CK_SESSION_HANDLE hSession,
228447e946e7SWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
228547e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hWrappingKey,
228647e946e7SWyllys Ingersoll CK_OBJECT_HANDLE hKey,
228747e946e7SWyllys Ingersoll CK_BYTE_PTR pWrappedKey,
228847e946e7SWyllys Ingersoll CK_ULONG_PTR pulWrappedKeyLen)
228947e946e7SWyllys Ingersoll {
229047e946e7SWyllys Ingersoll CK_RV rv;
229147e946e7SWyllys Ingersoll ST_SESSION_T rSession;
229247e946e7SWyllys Ingersoll
229347e946e7SWyllys Ingersoll if (API_Initialized() == FALSE) {
229447e946e7SWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
229547e946e7SWyllys Ingersoll }
229647e946e7SWyllys Ingersoll if (! pMechanism) {
229747e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
229847e946e7SWyllys Ingersoll }
229947e946e7SWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
230047e946e7SWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
230147e946e7SWyllys Ingersoll }
230247e946e7SWyllys Ingersoll if (FuncList.ST_WrapKey) {
230347e946e7SWyllys Ingersoll rv = FuncList.ST_WrapKey(rSession, pMechanism, hWrappingKey,
230447e946e7SWyllys Ingersoll hKey, pWrappedKey, pulWrappedKeyLen);
230547e946e7SWyllys Ingersoll } else {
230647e946e7SWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
230747e946e7SWyllys Ingersoll }
230847e946e7SWyllys Ingersoll return (rv);
230947e946e7SWyllys Ingersoll }
231047e946e7SWyllys Ingersoll
231147e946e7SWyllys Ingersoll #pragma init(api_init)
231247e946e7SWyllys Ingersoll #pragma fini(api_fini)
231347e946e7SWyllys Ingersoll
231447e946e7SWyllys Ingersoll static void
api_init(void)231547e946e7SWyllys Ingersoll api_init(void)
231647e946e7SWyllys Ingersoll {
231747e946e7SWyllys Ingersoll loginit();
231847e946e7SWyllys Ingersoll if (! Initialized) {
2319ab8176c2SWyllys Ingersoll (void) pthread_atfork(tpmtoken_fork_prepare,
2320ab8176c2SWyllys Ingersoll tpmtoken_fork_parent, tpmtoken_fork_child);
232147e946e7SWyllys Ingersoll Initialized = 1;
232247e946e7SWyllys Ingersoll }
232347e946e7SWyllys Ingersoll }
232447e946e7SWyllys Ingersoll
232547e946e7SWyllys Ingersoll static void
api_fini()232647e946e7SWyllys Ingersoll api_fini()
232747e946e7SWyllys Ingersoll {
232847e946e7SWyllys Ingersoll logterm();
232947e946e7SWyllys Ingersoll if (API_Initialized() == TRUE) {
233047e946e7SWyllys Ingersoll (void) do_finalize(NULL);
233147e946e7SWyllys Ingersoll }
233247e946e7SWyllys Ingersoll }
2333