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