47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Common Public License Version 0.5
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * 1. DEFINITIONS
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * "Contribution" means:
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * a) in the case of the initial Contributor, the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * initial code and documentation distributed under
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * this Agreement, and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * b) in the case of each subsequent Contributor:
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * i) changes to the Program, and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ii) additions to the Program;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * where such changes and/or additions to the Program
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * originate from and are distributed by that
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * particular Contributor. A Contribution 'originates'
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * from a Contributor if it was added to the Program
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * by such Contributor itself or anyone acting on such
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor's behalf. Contributions do not include
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * additions to the Program which: (i) are separate
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * modules of software distributed in conjunction with
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the Program under their own license agreement, and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * (ii) are not derivative works of the Program.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * "Contributor" means any person or entity that distributes
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the Program.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * "Licensed Patents " mean patent claims licensable by a
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor which are necessarily infringed by the use or
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * sale of its Contribution alone or when combined with the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Program.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * "Program" means the Contributions distributed in
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * accordance with this Agreement.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * "Recipient" means anyone who receives the Program under
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * this Agreement, including all Contributors.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * 2. GRANT OF RIGHTS
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * a) Subject to the terms of this Agreement, each
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor hereby grants Recipient a
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * no - exclusive, worldwide, royalt - free copyright
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * license to reproduce, prepare derivative works of,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * publicly display, publicly perform, distribute and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * sublicense the Contribution of such Contributor, if
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * any, and such derivative works, in source code and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * object code form.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * b) Subject to the terms of this Agreement, each
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor hereby grants Recipient a
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * no - exclusive, worldwide, royalt - free patent
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * license under Licensed Patents to make, use, sell,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * offer to sell, import and otherwise transfer the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contribution of such Contributor, if any, in source
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * code and object code form. This patent license
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * shall apply to the combination of the Contribution
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * and the Program if, at the time the Contribution is
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * added by the Contributor, such addition of the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contribution causes such combination to be covered
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * by the Licensed Patents. The patent license shall
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * not apply to any other combinations which include
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the Contribution. No hardware per se is licensed
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * hereunder.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * c) Recipient understands that although each
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor grants the licenses to its
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributions set forth herein, no assurances are
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * provided by any Contributor that the Program does
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * not infringe the patent or other intellectual
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * property rights of any other entity. Each
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor disclaims any liability to Recipient
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * for claims brought by any other entity based on
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * infringement of intellectual property rights or
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * otherwise. As a condition to exercising the rights
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * and licenses granted hereunder, each Recipient
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * hereby assumes sole responsibility to secure any
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * other intellectual property rights needed, if any.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * For example, if a third party patent license is
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * required to allow Recipient to distribute the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Program, it is Recipient's responsibility to
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * acquire that license before distributing the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Program.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * d) Each Contributor represents that to its
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * knowledge it has sufficient copyright rights in its
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contribution, if any, to grant the copyright
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * license set forth in this Agreement.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * 3. REQUIREMENTS
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * A Contributor may choose to distribute the Program in
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * object code form under its own license agreement, provided
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * that:
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * a) it complies with the terms and conditions of
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * this Agreement; and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * b) its license agreement:
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * i) effectively disclaims on behalf of all
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributors all warranties and conditions, express
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * and implied, including warranties or conditions of
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * title and no - infringement, and implied warranties
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * or conditions of merchantability and fitness for a
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * particular purpose;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ii) effectively excludes on behalf of all
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributors all liability for damages, including
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * direct, indirect, special, incidental and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * consequential damages, such as lost profits;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * iii) states that any provisions which differ from
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * this Agreement are offered by that Contributor
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * alone and not by any other party; and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * iv) states that source code for the Program is
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * available from such Contributor, and informs
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * licensees how to obtain it in a reasonable manner
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * on or through a medium customarily used for
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * software exchange.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * When the Program is made available in source code form:
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * a) it must be made available under this Agreement;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * b) a copy of this Agreement must be included with
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * each copy of the Program.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributors may not remove or alter any copyright notices
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * contained within the Program.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Each Contributor must identify itself as the originator of
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * its Contribution, if any, in a manner that reasonably
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * allows subsequent Recipients to identify the originator of
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the Contribution.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * 4. COMMERCIAL DISTRIBUTION
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Commercial distributors of software may accept certain
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * responsibilities with respect to end users, business
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * partners and the like. While this license is intended to
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * facilitate the commercial use of the Program, the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor who includes the Program in a commercial
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * product offering should do so in a manner which does not
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * create potential liability for other Contributors.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Therefore, if a Contributor includes the Program in a
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * commercial product offering, such Contributor ("Commercial
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor") hereby agrees to defend and indemnify every
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * other Contributor ("Indemnified Contributor") against any
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * losses, damages and costs (collectively "Losses") arising
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * from claims, lawsuits and other legal actions brought by a
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * third party against the Indemnified Contributor to the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * extent caused by the acts or omissions of such Commercial
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor in connection with its distribution of the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Program in a commercial product offering. The obligations
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * in this section do not apply to any claims or Losses
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * relating to any actual or alleged intellectual property
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * infringement. In order to qualify, an Indemnified
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor must: a) promptly notify the Commercial
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor in writing of such claim, and b) allow the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Commercial Contributor to control, and cooperate with the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Commercial Contributor in, the defense and any related
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * settlement negotiations. The Indemnified Contributor may
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * participate in any such claim at its own expense.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * For example, a Contributor might include the Program in a
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * commercial product offering, Product X. That Contributor
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * is then a Commercial Contributor. If that Commercial
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor then makes performance claims, or offers
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * warranties related to Product X, those performance claims
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * and warranties are such Commercial Contributor's
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * responsibility alone. Under this section, the Commercial
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor would have to defend claims against the other
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributors related to those performance claims and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * warranties, and if a court requires any other Contributor
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * to pay any damages as a result, the Commercial Contributor
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * must pay those damages.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * 5. NO WARRANTY
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * CONDITIONS OF TITLE, NO - INFRINGEMENT, MERCHANTABILITY OR
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * responsible for determining the appropriateness of using
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * and distributing the Program and assumes all risks
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * associated with its exercise of rights under this
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Agreement, including but not limited to the risks and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * costs of program errors, compliance with applicable laws,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * damage to or loss of data, programs or equipment, and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * unavailability or interruption of operations.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * 6. DISCLAIMER OF LIABILITY
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * POSSIBILITY OF SUCH DAMAGES.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * 7. GENERAL
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * If any provision of this Agreement is invalid or
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * unenforceable under applicable law, it shall not affect
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the validity or enforceability of the remainder of the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * terms of this Agreement, and without further action by the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * parties hereto, such provision shall be reformed to the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * minimum extent necessary to make such provision valid and
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * enforceable.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * If Recipient institutes patent litigation against a
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor with respect to a patent applicable to
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * software (including a cros - claim or counterclaim in a
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * lawsuit), then any patent licenses granted by that
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Contributor to such Recipient under this Agreement shall
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * terminate as of the date such litigation is filed. In
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * addition, If Recipient institutes patent litigation
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * against any entity (including a cros - claim or
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * counterclaim in a lawsuit) alleging that the Program
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * itself (excluding combinations of the Program with other
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * software or hardware) infringes such Recipient's
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * patent(s), then such Recipient's rights granted under
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Section 2(b) shall terminate as of the date such
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * litigation is filed.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * All Recipient's rights under this Agreement shall
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * terminate if it fails to comply with any of the material
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * terms or conditions of this Agreement and does not cure
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * such failure in a reasonable period of time after becoming
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * aware of such noncompliance. If all Recipient's rights
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * under this Agreement terminate, Recipient agrees to cease
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * use and distribution of the Program as soon as reasonably
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * practicable. However, Recipient's obligations under this
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Agreement and any licenses granted by Recipient relating
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * to the Program shall continue and survive.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Everyone is permitted to copy and distribute copies of
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * this Agreement, but in order to avoid inconsistency the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Agreement is copyrighted and may only be modified in the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * following manner. The Agreement Steward reserves the right
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * to publish new versions (including revisions) of this
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Agreement from time to time. No one other than the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Agreement Steward has the right to modify this Agreement.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * IBM is the initial Agreement Steward. IBM may assign the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * responsibility to serve as the Agreement Steward to a
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * suitable separate entity. Each new version of the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Agreement will be given a distinguishing version number.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * The Program (including Contributions) may always be
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * distributed subject to the version of the Agreement under
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * which it was received. In addition, after a new version of
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the Agreement is published, Contributor may elect to
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * distribute the Program (including its Contributions) under
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the new version. Except as expressly stated in Sections
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * 2(a) and 2(b) above, Recipient receives no rights or
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * licenses to the intellectual property of any Contributor
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * under this Agreement, whether expressly, by implication,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * estoppel or otherwise. All rights in the Program not
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * expressly granted under this Agreement are reserved.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * This Agreement is governed by the laws of the State of New
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * York and the intellectual property laws of the United
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * States of America. No party to this Agreement will bring a
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * legal action under this Agreement more than one year after
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the cause of action arose. Each party waives its rights to
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * a jury trial in any resulting litigation.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * (C) COPYRIGHT International Business Machines Corp. 2001, 2002
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Use is subject to license terms.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include "tpmtok_int.h"
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#define LOG(x) logit(LOG_DEBUG, x)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * NOTES:
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * In many cases the specificaiton does not allow returns
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * of CKR_ARGUMENTSB_BAD. We break the spec, since validation of parameters
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * to the function are best represented by this return code (where
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * specific RC's such as CKR_INVALID_SESSION do not exist).
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * NOTE NOTE NOTE NOTE
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * The parameter checking on the update operations may need to be
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * modified (as well as the encrypt/decrypt) to call the std API
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * anyway with sanatized parameters since on error, the encrypt/decrypt
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * sign operations are all supposed to complete.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Therefor the parameter checking here might need to be done in
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the STDLL instead of the API.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * This would affect ALL the Multipart operations which have
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * an init followed by one or more operations.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Globals for the API
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollAPI_Proc_Struct_t *Anchor = NULL;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic unsigned int Initialized = 0;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic pthread_mutex_t global_mutex = PTHREAD_MUTEX_INITIALIZER;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstruct ST_FCN_LIST FuncList;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_FUNCTION_LIST PK11_Functions;
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersollextern pthread_rwlock_t obj_list_rw_mutex;
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersollstatic void
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersolltpmtoken_fork_prepare()
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll{
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_lock(&global_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_lock(&pkcs_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_lock(&obj_list_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_rwlock_wrlock(&obj_list_rw_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_lock(&sess_list_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_lock(&login_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll if (Anchor) {
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_lock(&Anchor->ProcMutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_lock(&Anchor->SessListMutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll }
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic void
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersolltpmtoken_fork_parent()
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (Anchor) {
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&Anchor->SessListMutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&Anchor->ProcMutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll }
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&login_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&sess_list_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_rwlock_unlock(&obj_list_rw_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&obj_list_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&pkcs_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll}
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersollstatic void
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersolltpmtoken_fork_child()
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll{
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll if (Anchor) {
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&Anchor->SessListMutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&Anchor->ProcMutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll }
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&login_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&sess_list_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_rwlock_unlock(&obj_list_rw_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&obj_list_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&pkcs_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll if (Anchor) {
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll Terminate_All_Process_Sessions();
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll free(Anchor);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll Anchor = NULL;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll if (FuncList.ST_Finalize)
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll FuncList.ST_Finalize(0);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll logterm();
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll loginit();
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*ARGSUSED*/
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_CancelFunction(CK_SESSION_HANDLE hSession)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll LOG("C_CancelFunction");
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_FUNCTION_NOT_PARALLEL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_CloseAllSessions(CK_SLOT_ID slotID)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll Session_Struct_t *pCur, *pPrev;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Although why does modutil do a close all sessions. It is a single
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * application it can only close its sessions...
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * And all sessions should be closed anyhow.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll LOG("CloseAllSessions");
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (!global_shm->token_available || (slotID > NUMBER_SLOTS_MANAGED))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Proc Mutex is locked when we remove from the seesion list in
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Close SEssion. Therefore we don't need to do any locking
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the atomic operations are controled when we use the linked list
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll pCur = (Anchor ? Anchor->SessListBeg : NULL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll while (pCur) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Session owned by the slot we are working on
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * There is a basic problem here. We are using th pCur
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * to point to the current one, however we delete it from
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the linked list and can no longer go Forward. So we
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * have to use the fact that this is a doubly linked list
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * and get the previous pointer. After deletion, the next
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * pointer of this block will point to the next one in the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * list.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * If the value is Null, then this was the first one in
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * the list and we just set pCur to the SessListBeg.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (pCur->SltId == slotID) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pPrev = pCur->Previous;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = C_CloseSession((CK_SESSION_HANDLE)pCur);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (rv == CKR_OK ||
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv == CKR_SESSION_CLOSED ||
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv == CKR_SESSION_HANDLE_INVALID) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (pPrev == NULL) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pCur = Anchor->SessListBeg;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pCur = pPrev->Next;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pCur = pCur->Next;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll LOG("CloseAllSessions OK");
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_OK);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_CloseSession(CK_SESSION_HANDLE hSession)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll Session_Struct_t *sessp;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll LOG("C_CloseSession");
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Validate Session */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_CloseSession) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Map the Session to the slot session */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_CloseSession(rSession);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (rv == CKR_OK) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll sessp = (Session_Struct_t *)hSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll RemoveFromSessionList(sessp);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_CopyObject(
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hObject,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulCount,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE_PTR phNewObject)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll LOG("C_CopyObject");
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!phNewObject) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * A null template with a count will cause the lower layer
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * to have problems.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Template with 0 count is not a problem.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!pTemplate && ulCount) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_CopyObject) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_CopyObject(rSession, hObject, pTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulCount, phNewObject);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_CreateObject(
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulCount,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE_PTR phObject)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pTemplate) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_TEMPLATE_INCOMPLETE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ulCount == 0) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_TEMPLATE_INCOMPLETE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! phObject) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_CreateObject) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll // Map the Session to the slot session
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_CreateObject(rSession, pTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulCount, phObject);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_Decrypt(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pEncryptedData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulEncryptedDataLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulDataLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_Decrypt) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_Decrypt(rSession, pEncryptedData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulEncryptedDataLen, pData, pulDataLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_DecryptDigestUpdate(
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pEncryptedPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulEncryptedPartLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulPartLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pEncryptedPart || ! pulPartLen) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_DecryptDigestUpdate) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_DecryptDigestUpdate(rSession, pEncryptedPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulEncryptedPartLen, pPart, pulPartLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_DecryptFinal(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pLastPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulLastPartLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * It is acceptable to have a Null pointer for the data since
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * it is trying to get the length of the last part....
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * The spec is unclear if a second call to Final is needed
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * if there is no data in the last part.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pulLastPartLen) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_DecryptFinal) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_DecryptFinal(rSession, pLastPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pulLastPartLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_DecryptInit(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pMechanism) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_MECHANISM_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_DecryptInit) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_DecryptInit(rSession, pMechanism, hKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_DecryptUpdate(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pEncryptedPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulEncryptedPartLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulPartLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!pEncryptedPart || !pulPartLen) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_DecryptUpdate) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_DecryptUpdate(rSession, pEncryptedPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulEncryptedPartLen, pPart, pulPartLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_DecryptVerifyUpdate(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pEncryptedPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulEncryptedPartLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulPartLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll // Validate Session
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll // May have to let these go through and let the STDLL handle them
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pEncryptedPart || ! pulPartLen) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll // Get local pointers to session
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_DecryptVerifyUpdate) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll // Map the Session to the slot session
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_DecryptVerifyUpdate(rSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pEncryptedPart, ulEncryptedPartLen, pPart, pulPartLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_DeriveKey(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hBaseKey,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulAttributeCount,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE_PTR phKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!pMechanism) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_MECHANISM_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!pTemplate && ulAttributeCount) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_DeriveKey) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_DeriveKey(rSession, pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll hBaseKey, pTemplate, ulAttributeCount, phKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_DestroyObject(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hObject)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_DestroyObject) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_DestroyObject(rSession, hObject);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_Digest(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulDataLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pDigest,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulDigestLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_Digest) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_Digest(rSession, pData, ulDataLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pDigest, pulDigestLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_DigestEncryptUpdate(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulPartLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pEncryptedPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulEncryptedPartLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pPart || ! pulEncryptedPartLen) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_DigestEncryptUpdate) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_DigestEncryptUpdate(rSession, pPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulPartLen, pEncryptedPart, pulEncryptedPartLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_DigestFinal(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pDigest,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulDigestLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pulDigestLen) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_DigestFinal) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_DigestFinal(rSession, pDigest, pulDigestLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_DigestInit(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_PTR pMechanism)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pMechanism) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_MECHANISM_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_DigestInit) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_DigestInit(rSession, pMechanism);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_DigestKey(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_DigestKey) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_DigestKey(rSession, hKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_DigestUpdate(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulPartLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_DigestUpdate) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_DigestUpdate(rSession, pPart, ulPartLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_Encrypt(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulDataLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pEncryptedData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulEncryptedDataLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll // Get local pointers to session
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_Encrypt) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll // Map the Session to the slot session
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_Encrypt(rSession, pData, ulDataLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pEncryptedData, pulEncryptedDataLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_EncryptFinal(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pLastEncryptedPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulLastEncryptedPartLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_EncryptFinal) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_EncryptFinal(rSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pLastEncryptedPart, pulLastEncryptedPartLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_EncryptInit(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pMechanism) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_MECHANISM_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_EncryptInit) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_EncryptInit(rSession, pMechanism, hKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_EncryptUpdate(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulPartLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pEncryptedPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulEncryptedPartLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!pPart || !pulEncryptedPartLen) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_EncryptUpdate) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_EncryptUpdate(rSession, pPart, ulPartLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pEncryptedPart, pulEncryptedPartLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersolldo_finalize(CK_VOID_PTR pReserved)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (pReserved != NULL) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) pthread_mutex_lock(&global_mutex);
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll if (Anchor)
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll Terminate_All_Process_Sessions();
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_Finalize)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll FuncList.ST_Finalize(0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll free(Anchor);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll Anchor = NULL;
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_OK);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_Finalize(CK_VOID_PTR pReserved) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (do_finalize(pReserved));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_FindObjects(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE_PTR phObject,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulMaxObjectCount,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulObjectCount)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! phObject || ! pulObjectCount) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_FindObjects) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_FindObjects(rSession, phObject,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulMaxObjectCount, pulObjectCount);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_FindObjectsFinal(CK_SESSION_HANDLE hSession)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_FindObjectsFinal) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_FindObjectsFinal(rSession);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_FindObjectsInit(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulCount)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_FindObjectsInit) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_FindObjectsInit(rSession, pTemplate, ulCount);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GenerateKey(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulCount,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE_PTR phKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pMechanism) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_MECHANISM_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! phKey) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_GenerateKey) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_GenerateKey(rSession, pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pTemplate, ulCount, phKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GenerateKeyPair(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ATTRIBUTE_PTR pPublicKeyTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulPublicKeyAttributeCount,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulPrivateKeyAttributeCount,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE_PTR phPublicKey,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE_PTR phPrivateKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pMechanism) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_MECHANISM_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! phPublicKey || ! phPrivateKey) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_GenerateKeyPair) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_GenerateKeyPair(rSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pMechanism, pPublicKeyTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulPublicKeyAttributeCount, pPrivateKeyTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulPrivateKeyAttributeCount, phPublicKey, phPrivateKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GenerateRandom(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR RandomData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulRandomLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! RandomData)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_GenerateRandom) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_GenerateRandom(rSession, RandomData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulRandomLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GetAttributeValue(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hObject,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulCount)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pTemplate) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_TEMPLATE_INCOMPLETE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ulCount == 0) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_TEMPLATE_INCOMPLETE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_GetAttributeValue) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_GetAttributeValue(rSession, hObject,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pTemplate, ulCount);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR ppFunctionList)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.version.major = VERSION_MAJOR;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.version.minor = VERSION_MINOR;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_Initialize = C_Initialize;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_Finalize = C_Finalize;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GetInfo = C_GetInfo;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GetFunctionList = C_GetFunctionList;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GetSlotList = C_GetSlotList;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GetSlotInfo = C_GetSlotInfo;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GetTokenInfo = C_GetTokenInfo;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GetMechanismList = C_GetMechanismList;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GetMechanismInfo = C_GetMechanismInfo;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_InitToken = C_InitToken;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_InitPIN = C_InitPIN;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_SetPIN = C_SetPIN;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_OpenSession = C_OpenSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_CloseSession = C_CloseSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_CloseAllSessions = C_CloseAllSessions;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GetSessionInfo = C_GetSessionInfo;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GetOperationState = C_GetOperationState;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_SetOperationState = C_SetOperationState;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_Login = C_Login;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_Logout = C_Logout;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_CreateObject = C_CreateObject;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_CopyObject = C_CopyObject;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_DestroyObject = C_DestroyObject;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GetObjectSize = C_GetObjectSize;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GetAttributeValue = C_GetAttributeValue;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_SetAttributeValue = C_SetAttributeValue;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_FindObjectsInit = C_FindObjectsInit;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_FindObjects = C_FindObjects;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_FindObjectsFinal = C_FindObjectsFinal;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_EncryptInit = C_EncryptInit;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_Encrypt = C_Encrypt;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_EncryptUpdate = C_EncryptUpdate;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_EncryptFinal = C_EncryptFinal;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_DecryptInit = C_DecryptInit;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_Decrypt = C_Decrypt;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_DecryptUpdate = C_DecryptUpdate;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_DecryptFinal = C_DecryptFinal;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_DigestInit = C_DigestInit;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_Digest = C_Digest;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_DigestUpdate = C_DigestUpdate;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_DigestKey = C_DigestKey;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_DigestFinal = C_DigestFinal;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_SignInit = C_SignInit;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_Sign = C_Sign;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_SignUpdate = C_SignUpdate;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_SignFinal = C_SignFinal;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_SignRecoverInit = C_SignRecoverInit;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_SignRecover = C_SignRecover;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_VerifyInit = C_VerifyInit;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_Verify = C_Verify;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_VerifyUpdate = C_VerifyUpdate;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_VerifyFinal = C_VerifyFinal;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_VerifyRecoverInit = C_VerifyRecoverInit;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_VerifyRecover = C_VerifyRecover;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_DigestEncryptUpdate = C_DigestEncryptUpdate;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_DecryptDigestUpdate = C_DecryptDigestUpdate;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_SignEncryptUpdate = C_SignEncryptUpdate;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_DecryptVerifyUpdate = C_DecryptVerifyUpdate;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GenerateKey = C_GenerateKey;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GenerateKeyPair = C_GenerateKeyPair;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_WrapKey = C_WrapKey;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_UnwrapKey = C_UnwrapKey;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_DeriveKey = C_DeriveKey;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_SeedRandom = C_SeedRandom;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GenerateRandom = C_GenerateRandom;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_GetFunctionStatus = C_GetFunctionStatus;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_CancelFunction = C_CancelFunction;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll PK11_Functions.C_WaitForSlotEvent = C_WaitForSlotEvent;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ppFunctionList) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (*ppFunctionList) = &PK11_Functions;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_OK);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*ARGSUSED*/
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GetFunctionStatus(CK_SESSION_HANDLE hSession)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_FUNCTION_NOT_PARALLEL); // PER Specification PG 170
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GetInfo(CK_INFO_PTR pInfo)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TOKEN_DATA td;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_HCONTEXT hContext;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! API_Initialized()) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pInfo) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_FUNCTION_FAILED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) memset(pInfo, 0, sizeof (*pInfo));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pInfo->cryptokiVersion.major = 2;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pInfo->cryptokiVersion.minor = 20;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (open_tss_context(&hContext) == 0) {
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll /*
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll * Only populate the TPM info if we can establish
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll * a context, but don't return failure because
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll * the framework needs to know some of the info.
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll */
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll (void) token_get_tpm_info(hContext, &td);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll (void) Tspi_Context_Close(hContext);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll (void) memcpy(pInfo->manufacturerID,
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll &(td.token_info.manufacturerID),
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll sizeof (pInfo->manufacturerID) - 1);
b693132f48f19b8c1bd613e914faf3589565cb57jmcp
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll pInfo->flags = td.token_info.flags;
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) strcpy((char *)pInfo->libraryDescription,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll "PKCS11 Interface for TPM");
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pInfo->libraryVersion.major = 1;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pInfo->libraryVersion.minor = 0;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_OK);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GetMechanismInfo(CK_SLOT_ID slotID,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_TYPE type,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_INFO_PTR pInfo)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (API_Initialized() == FALSE)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (!global_shm->token_available || (slotID > NUMBER_SLOTS_MANAGED))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_GetMechanismInfo) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_GetMechanismInfo(slotID, type, pInfo);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GetMechanismList(CK_SLOT_ID slotID,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_TYPE_PTR pMechanismList,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulCount)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (API_Initialized() == FALSE)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pulCount)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (!global_shm->token_available || (slotID > NUMBER_SLOTS_MANAGED))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_GetMechanismList) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_GetMechanismList(slotID,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pMechanismList, pulCount);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (rv == CKR_OK) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (pMechanismList) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll unsigned long i;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll for (i = 0; i < *pulCount; i++) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll logit(LOG_DEBUG, "Mechanism[%d] 0x%08X ",
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll i, pMechanismList[i]);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GetObjectSize(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hObject,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulSize)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pulSize) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_GetObjectSize) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_GetObjectSize(rSession, hObject, pulSize);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GetOperationState(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pOperationState,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulOperationStateLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pulOperationStateLen) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_GetOperationState) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_GetOperationState(rSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pOperationState, pulOperationStateLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GetSessionInfo(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_SESSION_INFO_PTR pInfo)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pInfo) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_GetSessionInfo) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_GetSessionInfo(rSession, pInfo);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GetSlotInfo(CK_SLOT_ID slotID,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_SLOT_INFO_PTR pInfo)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (API_Initialized() == FALSE)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (!pInfo)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_FUNCTION_FAILED);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (!global_shm->token_available || (slotID > NUMBER_SLOTS_MANAGED))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll copy_slot_info(slotID, pInfo);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_OK);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*ARGSUSED*/
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GetSlotList(CK_BBOOL tokenPresent,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_SLOT_ID_PTR pSlotList,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulCount)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG count;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_SLOT_INFO slotInfo;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (pulCount == NULL)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_FUNCTION_FAILED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll count = 0;
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll /*
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll * If we can't talk to the TPM, present no slots
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll */
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (!global_shm->token_available) {
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll *pulCount = 0;
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll return (CKR_OK);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll copy_slot_info(TPM_SLOTID, &slotInfo);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if ((slotInfo.flags & CKF_TOKEN_PRESENT))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll count++;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *pulCount = count;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (pSlotList == NULL) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_OK);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (*pulCount < count)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_BUFFER_TOO_SMALL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pSlotList[0] = TPM_SLOTID;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_OK);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_GetTokenInfo(CK_SLOT_ID slotID,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_TOKEN_INFO_PTR pInfo)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (API_Initialized() == FALSE)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (!pInfo)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (!global_shm->token_available || (slotID > NUMBER_SLOTS_MANAGED))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll slotID = TPM_SLOTID;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_GetTokenInfo) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_GetTokenInfo(slotID, pInfo);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_Initialize(CK_VOID_PTR pVoid)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv = CKR_OK;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_C_INITIALIZE_ARGS *pArg;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll extern CK_RV ST_Initialize(void *,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_SLOT_ID, unsigned char *);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) pthread_mutex_lock(&global_mutex);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Anchor) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll Anchor = (API_Proc_Struct_t *)malloc(
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll sizeof (API_Proc_Struct_t));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (Anchor == NULL) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_HOST_MEMORY);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_ALREADY_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * if pVoid is NULL, then everything is OK. The applicaiton
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * will not be doing multi thread accesses. We can use the OS
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * locks anyhow.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (pVoid != NULL) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll int supplied_ok;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pArg = (CK_C_INITIALIZE_ARGS *)pVoid;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * ALL supplied function pointers need to have the value
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * either NULL or no - NULL.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll supplied_ok = (pArg->CreateMutex == NULL &&
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pArg->DestroyMutex == NULL &&
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pArg->LockMutex == NULL &&
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pArg->UnlockMutex == NULL) ||
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (pArg->CreateMutex != NULL &&
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pArg->DestroyMutex != NULL &&
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pArg->LockMutex != NULL &&
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pArg->UnlockMutex != NULL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!supplied_ok) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Check for a pReserved set */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (pArg->pReserved != NULL) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll free(Anchor);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll Anchor = NULL;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * When the CKF_OS_LOCKING_OK flag isn't set and mutex
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * function pointers are supplied by an application,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * return (an error. We must be able to use our own primitives.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (!(pArg->flags & CKF_OS_LOCKING_OK) &&
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (pArg->CreateMutex != NULL)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CANT_LOCK);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) memset((char *)Anchor, 0, sizeof (API_Proc_Struct_t));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) pthread_mutex_init(&(Anchor->ProcMutex), NULL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) pthread_mutex_init(&(Anchor->SessListMutex), NULL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll Anchor->Pid = getpid();
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = ST_Initialize((void *)&FuncList, 0, NULL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) pthread_mutex_unlock(&global_mutex);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_InitPIN(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_CHAR_PTR pPin,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulPinLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (API_Initialized() == FALSE)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (! pPin && ulPinLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (rSession.slotID > NUMBER_SLOTS_MANAGED)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (FuncList.ST_InitPIN)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_InitPIN(rSession, pPin, ulPinLen);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll else
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_InitToken(CK_SLOT_ID slotID,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_CHAR_PTR pPin,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulPinLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_CHAR_PTR pLabel)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (API_Initialized() == FALSE)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (! pPin && ulPinLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (! pLabel)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (!global_shm->token_available)
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll return (CKR_SLOT_ID_INVALID);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (FuncList.ST_InitToken)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_InitToken(slotID, pPin, ulPinLen, pLabel);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll else
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_Login(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_USER_TYPE userType,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_CHAR_PTR pPin,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulPinLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_Login) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_Login(rSession, userType, pPin, ulPinLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_Logout(CK_SESSION_HANDLE hSession)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_Logout) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_Logout(rSession);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*ARGSUSED*/
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_OpenSession(
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_SLOT_ID slotID,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_FLAGS flags,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_VOID_PTR pApplication,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_NOTIFY Notify,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_SESSION_HANDLE_PTR phSession)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll Session_Struct_t *apiSessp;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (API_Initialized() == FALSE)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (!global_shm->token_available || (slotID > NUMBER_SLOTS_MANAGED))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SLOT_ID_INVALID);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if (! phSession)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_FUNCTION_FAILED);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll if ((flags & CKF_SERIAL_SESSION) == 0)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_PARALLEL_NOT_SUPPORTED);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if ((apiSessp = (Session_Struct_t *)malloc(
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll sizeof (Session_Struct_t))) == NULL)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_HOST_MEMORY);
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_OpenSession) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_OpenSession(slotID, flags,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll &(apiSessp->RealHandle));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (rv == CKR_OK) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *phSession = (CK_SESSION_HANDLE)apiSessp;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll apiSessp->SltId = slotID;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll AddToSessionList(apiSessp);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll free(apiSessp);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_SeedRandom(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pSeed,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulSeedLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pSeed && ulSeedLen) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_SeedRandom) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_SeedRandom(rSession, pSeed, ulSeedLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_SetAttributeValue(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hObject,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulCount)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pTemplate) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_TEMPLATE_INCOMPLETE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! ulCount) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_TEMPLATE_INCOMPLETE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll // Get local pointers to session
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_SetAttributeValue) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_SetAttributeValue(rSession, hObject,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pTemplate, ulCount);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_SetOperationState(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pOperationState,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulOperationStateLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hEncryptionKey,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hAuthenticationKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pOperationState || ulOperationStateLen == 0) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_SetOperationState) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_SetOperationState(rSession, pOperationState,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulOperationStateLen, hEncryptionKey, hAuthenticationKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_SetPIN(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_CHAR_PTR pOldPin,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulOldLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_CHAR_PTR pNewPin,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulNewLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pOldPin || ! pNewPin)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_PIN_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_SetPIN) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_SetPIN(rSession, pOldPin, ulOldLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pNewPin, ulNewLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_Sign(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulDataLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pSignature,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulSignatureLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_Sign) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_Sign(rSession, pData, ulDataLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pSignature, pulSignatureLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_SignEncryptUpdate(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulPartLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pEncryptedPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulEncryptedPartLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pPart || ! pulEncryptedPartLen) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_SignEncryptUpdate) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_SignEncryptUpdate(rSession, pPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulPartLen, pEncryptedPart, pulEncryptedPartLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_SignFinal(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pSignature,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulSignatureLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pulSignatureLen) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_SignFinal) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_SignFinal(rSession, pSignature,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pulSignatureLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_SignInit(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pMechanism) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_MECHANISM_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_SignInit) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_SignInit(rSession, pMechanism, hKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_SignRecover(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulDataLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pSignature,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulSignatureLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_SignRecover) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_SignRecover(rSession, pData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulDataLen, pSignature, pulSignatureLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_SignRecoverInit(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pMechanism) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_MECHANISM_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_SignRecoverInit) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_SignRecoverInit(rSession, pMechanism, hKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_SignUpdate(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulPartLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_SignUpdate) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_SignUpdate(rSession, pPart, ulPartLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_UnwrapKey(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hUnwrappingKey,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pWrappedKey,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulWrappedKeyLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ATTRIBUTE_PTR pTemplate,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulAttributeCount,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE_PTR phKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll if (!pMechanism) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_MECHANISM_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_UnwrapKey) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_UnwrapKey(rSession, pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll hUnwrappingKey, pWrappedKey, ulWrappedKeyLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pTemplate, ulAttributeCount, phKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_Verify(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulDataLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pSignature,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulSignatureLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_Verify) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_Verify(rSession, pData, ulDataLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll pSignature, ulSignatureLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_VerifyFinal(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pSignature,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulSignatureLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pSignature) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_ARGUMENTS_BAD);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_VerifyFinal) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_VerifyFinal(rSession, pSignature,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulSignatureLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_VerifyInit(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pMechanism) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_MECHANISM_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_VerifyInit) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_VerifyInit(rSession, pMechanism, hKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_VerifyRecover(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pSignature,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulSignatureLen,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pData,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulDataLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_VerifyRecover) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_VerifyRecover(rSession, pSignature,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ulSignatureLen, pData, pulDataLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_VerifyRecoverInit(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pMechanism) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_MECHANISM_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_VerifyRecoverInit) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_VerifyRecoverInit(rSession, pMechanism, hKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_VerifyUpdate(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pPart,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG ulPartLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_VerifyUpdate) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_VerifyUpdate(rSession, pPart, ulPartLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*ARGSUSED*/
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_WaitForSlotEvent(CK_FLAGS flags,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_SLOT_ID_PTR pSlot,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_VOID_PTR pReserved)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_FUNCTION_NOT_SUPPORTED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollCK_RV
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollC_WrapKey(CK_SESSION_HANDLE hSession,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_MECHANISM_PTR pMechanism,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hWrappingKey,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_OBJECT_HANDLE hKey,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_BYTE_PTR pWrappedKey,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_ULONG_PTR pulWrappedKeyLen)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll CK_RV rv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ST_SESSION_T rSession;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == FALSE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_CRYPTOKI_NOT_INITIALIZED);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! pMechanism) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_MECHANISM_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Valid_Session((Session_Struct_t *)hSession, &rSession)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (CKR_SESSION_HANDLE_INVALID);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (FuncList.ST_WrapKey) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = FuncList.ST_WrapKey(rSession, pMechanism, hWrappingKey,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll hKey, pWrappedKey, pulWrappedKeyLen);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll rv = CKR_FUNCTION_NOT_SUPPORTED;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (rv);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#pragma init(api_init)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#pragma fini(api_fini)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic void
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollapi_init(void)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll loginit();
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (! Initialized) {
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll (void) pthread_atfork(tpmtoken_fork_prepare,
ab8176c2544f70ca46c1ce370963d426561222b3Wyllys Ingersoll tpmtoken_fork_parent, tpmtoken_fork_child);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll Initialized = 1;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic void
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollapi_fini()
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll logterm();
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (API_Initialized() == TRUE) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) do_finalize(NULL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}