1 /*
   2  *              Common Public License Version 0.5
   3  *
   4  *              THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF
   5  *              THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE,
   6  *              REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES
   7  *              RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
   8  *
   9  *              1. DEFINITIONS
  10  *
  11  *              "Contribution" means:
  12  *                    a) in the case of the initial Contributor, the
  13  *                    initial code and documentation distributed under
  14  *                    this Agreement, and
  15  *
  16  *                    b) in the case of each subsequent Contributor:
  17  *                    i) changes to the Program, and
  18  *                    ii) additions to the Program;
  19  *
  20  *                    where such changes and/or additions to the Program
  21  *                    originate from and are distributed by that
  22  *                    particular Contributor. A Contribution 'originates'
  23  *                    from a Contributor if it was added to the Program
  24  *                    by such Contributor itself or anyone acting on such
  25  *                    Contributor's behalf. Contributions do not include
  26  *                    additions to the Program which: (i) are separate
  27  *                    modules of software distributed in conjunction with
  28  *                    the Program under their own license agreement, and
  29  *                    (ii) are not derivative works of the Program.
  30  *
  31  *
  32  *              "Contributor" means any person or entity that distributes
  33  *              the Program.
  34  *
  35  *              "Licensed Patents " mean patent claims licensable by a
  36  *              Contributor which are necessarily infringed by the use or
  37  *              sale of its Contribution alone or when combined with the
  38  *              Program.
  39  *
  40  *              "Program" means the Contributions distributed in
  41  *              accordance with this Agreement.
  42  *
  43  *              "Recipient" means anyone who receives the Program under
  44  *              this Agreement, including all Contributors.
  45  *
  46  *              2. GRANT OF RIGHTS
  47  *
  48  *                    a) Subject to the terms of this Agreement, each
  49  *                    Contributor hereby grants Recipient a
  50  *                    no - exclusive, worldwide, royalt - free copyright
  51  *                    license to reproduce, prepare derivative works of,
  52  *                    publicly display, publicly perform, distribute and
  53  *                    sublicense the Contribution of such Contributor, if
  54  *                    any, and such derivative works, in source code and
  55  *                    object code form.
  56  *
  57  *                    b) Subject to the terms of this Agreement, each
  58  *                    Contributor hereby grants Recipient a
  59  *                    no - exclusive, worldwide, royalt - free patent
  60  *                    license under Licensed Patents to make, use, sell,
  61  *                    offer to sell, import and otherwise transfer the
  62  *                    Contribution of such Contributor, if any, in source
  63  *                    code and object code form. This patent license
  64  *                    shall apply to the combination of the Contribution
  65  *                    and the Program if, at the time the Contribution is
  66  *                    added by the Contributor, such addition of the
  67  *                    Contribution causes such combination to be covered
  68  *                    by the Licensed Patents. The patent license shall
  69  *                    not apply to any other combinations which include
  70  *                    the Contribution. No hardware per se is licensed
  71  *                    hereunder.
  72  *
  73  *                    c) Recipient understands that although each
  74  *                    Contributor grants the licenses to its
  75  *                    Contributions set forth herein, no assurances are
  76  *                    provided by any Contributor that the Program does
  77  *                    not infringe the patent or other intellectual
  78  *                    property rights of any other entity. Each
  79  *                    Contributor disclaims any liability to Recipient
  80  *                    for claims brought by any other entity based on
  81  *                    infringement of intellectual property rights or
  82  *                    otherwise. As a condition to exercising the rights
  83  *                    and licenses granted hereunder, each Recipient
  84  *                    hereby assumes sole responsibility to secure any
  85  *                    other intellectual property rights needed, if any.
  86  *
  87  *                    For example, if a third party patent license is
  88  *                    required to allow Recipient to distribute the
  89  *                    Program, it is Recipient's responsibility to
  90  *                    acquire that license before distributing the
  91  *                    Program.
  92  *
  93  *                    d) Each Contributor represents that to its
  94  *                    knowledge it has sufficient copyright rights in its
  95  *                    Contribution, if any, to grant the copyright
  96  *                    license set forth in this Agreement.
  97  *
  98  *              3. REQUIREMENTS
  99  *
 100  *              A Contributor may choose to distribute the Program in
 101  *              object code form under its own license agreement, provided
 102  *              that:
 103  *                    a) it complies with the terms and conditions of
 104  *                    this Agreement; and
 105  *
 106  *                    b) its license agreement:
 107  *                    i) effectively disclaims on behalf of all
 108  *                    Contributors all warranties and conditions, express
 109  *                    and implied, including warranties or conditions of
 110  *                    title and no - infringement, and implied warranties
 111  *                    or conditions of merchantability and fitness for a
 112  *                    particular purpose;
 113  *
 114  *                    ii) effectively excludes on behalf of all
 115  *                    Contributors all liability for damages, including
 116  *                    direct, indirect, special, incidental and
 117  *                    consequential damages, such as lost profits;
 118  *
 119  *                    iii) states that any provisions which differ from
 120  *                    this Agreement are offered by that Contributor
 121  *                    alone and not by any other party; and
 122  *
 123  *                    iv) states that source code for the Program is
 124  *                    available from such Contributor, and informs
 125  *                    licensees how to obtain it in a reasonable manner
 126  *                    on or through a medium customarily used for
 127  *                    software exchange.
 128  *
 129  *              When the Program is made available in source code form:
 130  *                    a) it must be made available under this Agreement;
 131  *                    and
 132  *                    b) a copy of this Agreement must be included with
 133  *                    each copy of the Program.
 134  *
 135  *              Contributors may not remove or alter any copyright notices
 136  *              contained within the Program.
 137  *
 138  *              Each Contributor must identify itself as the originator of
 139  *              its Contribution, if any, in a manner that reasonably
 140  *              allows subsequent Recipients to identify the originator of
 141  *              the Contribution.
 142  *
 143  *
 144  *              4. COMMERCIAL DISTRIBUTION
 145  *
 146  *              Commercial distributors of software may accept certain
 147  *              responsibilities with respect to end users, business
 148  *              partners and the like. While this license is intended to
 149  *              facilitate the commercial use of the Program, the
 150  *              Contributor who includes the Program in a commercial
 151  *              product offering should do so in a manner which does not
 152  *              create potential liability for other Contributors.
 153  *              Therefore, if a Contributor includes the Program in a
 154  *              commercial product offering, such Contributor ("Commercial
 155  *              Contributor") hereby agrees to defend and indemnify every
 156  *              other Contributor ("Indemnified Contributor") against any
 157  *              losses, damages and costs (collectively "Losses") arising
 158  *              from claims, lawsuits and other legal actions brought by a
 159  *              third party against the Indemnified Contributor to the
 160  *              extent caused by the acts or omissions of such Commercial
 161  *              Contributor in connection with its distribution of the
 162  *              Program in a commercial product offering. The obligations
 163  *              in this section do not apply to any claims or Losses
 164  *              relating to any actual or alleged intellectual property
 165  *              infringement. In order to qualify, an Indemnified
 166  *              Contributor must: a) promptly notify the Commercial
 167  *              Contributor in writing of such claim, and b) allow the
 168  *              Commercial Contributor to control, and cooperate with the
 169  *              Commercial Contributor in, the defense and any related
 170  *              settlement negotiations. The Indemnified Contributor may
 171  *              participate in any such claim at its own expense.
 172  *
 173  *
 174  *              For example, a Contributor might include the Program in a
 175  *              commercial product offering, Product X. That Contributor
 176  *              is then a Commercial Contributor. If that Commercial
 177  *              Contributor then makes performance claims, or offers
 178  *              warranties related to Product X, those performance claims
 179  *              and warranties are such Commercial Contributor's
 180  *              responsibility alone. Under this section, the Commercial
 181  *              Contributor would have to defend claims against the other
 182  *              Contributors related to those performance claims and
 183  *              warranties, and if a court requires any other Contributor
 184  *              to pay any damages as a result, the Commercial Contributor
 185  *              must pay those damages.
 186  *
 187  *
 188  *              5. NO WARRANTY
 189  *
 190  *              EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE
 191  *              PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
 192  *              WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
 193  *              IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
 194  *              CONDITIONS OF TITLE, NO - INFRINGEMENT, MERCHANTABILITY OR
 195  *              FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
 196  *              responsible for determining the appropriateness of using
 197  *              and distributing the Program and assumes all risks
 198  *              associated with its exercise of rights under this
 199  *              Agreement, including but not limited to the risks and
 200  *              costs of program errors, compliance with applicable laws,
 201  *              damage to or loss of data, programs or equipment, and
 202  *              unavailability or interruption of operations.
 203  *
 204  *              6. DISCLAIMER OF LIABILITY
 205  *              EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER
 206  *              RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY
 207  *              FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
 208  *              OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
 209  *              LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
 210  *              LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 211  *              (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 212  *              OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE
 213  *              OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
 214  *              POSSIBILITY OF SUCH DAMAGES.
 215  *
 216  *              7. GENERAL
 217  *
 218  *              If any provision of this Agreement is invalid or
 219  *              unenforceable under applicable law, it shall not affect
 220  *              the validity or enforceability of the remainder of the
 221  *              terms of this Agreement, and without further action by the
 222  *              parties hereto, such provision shall be reformed to the
 223  *              minimum extent necessary to make such provision valid and
 224  *              enforceable.
 225  *
 226  *
 227  *              If Recipient institutes patent litigation against a
 228  *              Contributor with respect to a patent applicable to
 229  *              software (including a cros - claim or counterclaim in a
 230  *              lawsuit), then any patent licenses granted by that
 231  *              Contributor to such Recipient under this Agreement shall
 232  *              terminate as of the date such litigation is filed. In
 233  *              addition, If Recipient institutes patent litigation
 234  *              against any entity (including a cros - claim or
 235  *              counterclaim in a lawsuit) alleging that the Program
 236  *              itself (excluding combinations of the Program with other
 237  *              software or hardware) infringes such Recipient's
 238  *              patent(s), then such Recipient's rights granted under
 239  *              Section 2(b) shall terminate as of the date such
 240  *              litigation is filed.
 241  *
 242  *              All Recipient's rights under this Agreement shall
 243  *              terminate if it fails to comply with any of the material
 244  *              terms or conditions of this Agreement and does not cure
 245  *              such failure in a reasonable period of time after becoming
 246  *              aware of such noncompliance. If all Recipient's rights
 247  *              under this Agreement terminate, Recipient agrees to cease
 248  *              use and distribution of the Program as soon as reasonably
 249  *              practicable. However, Recipient's obligations under this
 250  *              Agreement and any licenses granted by Recipient relating
 251  *              to the Program shall continue and survive.
 252  *
 253  *              Everyone is permitted to copy and distribute copies of
 254  *              this Agreement, but in order to avoid inconsistency the
 255  *              Agreement is copyrighted and may only be modified in the
 256  *              following manner. The Agreement Steward reserves the right
 257  *              to publish new versions (including revisions) of this
 258  *              Agreement from time to time. No one other than the
 259  *              Agreement Steward has the right to modify this Agreement.
 260  *
 261  *              IBM is the initial Agreement Steward. IBM may assign the
 262  *              responsibility to serve as the Agreement Steward to a
 263  *              suitable separate entity. Each new version of the
 264  *              Agreement will be given a distinguishing version number.
 265  *              The Program (including Contributions) may always be
 266  *              distributed subject to the version of the Agreement under
 267  *              which it was received. In addition, after a new version of
 268  *              the Agreement is published, Contributor may elect to
 269  *              distribute the Program (including its Contributions) under
 270  *              the new version. Except as expressly stated in Sections
 271  *              2(a) and 2(b) above, Recipient receives no rights or
 272  *              licenses to the intellectual property of any Contributor
 273  *              under this Agreement, whether expressly, by implication,
 274  *              estoppel or otherwise. All rights in the Program not
 275  *              expressly granted under this Agreement are reserved.
 276  *
 277  *
 278  *              This Agreement is governed by the laws of the State of New
 279  *              York and the intellectual property laws of the United
 280  *              States of America. No party to this Agreement will bring a
 281  *              legal action under this Agreement more than one year after
 282  *              the cause of action arose. Each party waives its rights to
 283  *              a jury trial in any resulting litigation.
 284  *
 285  *
 286  *
 287  * (C) COPYRIGHT International Business Machines Corp. 2001, 2002
 288  */
 289 /*
 290  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 291  * Use is subject to license terms.
 292  *
 293  * Copyright 2018 Gary Mills
 294  */
 295 
 296 #include <alloca.h>
 297 #include <libgen.h>
 298 #include <sys/varargs.h>
 299 
 300 #include "tpmtok_int.h"
 301 
 302 extern  API_Proc_Struct_t  *Anchor;
 303 extern int logging;
 304 
 305 void logit(int, char *, ...);
 306 #ifdef DEBUG
 307 static int enabled = 0;
 308 #endif /* DEBUG */
 309 
 310 void
 311 loginit()
 312 {
 313 #ifdef DEBUG
 314         if (!enabled) {
 315                 enabled = 1;
 316                 openlog("tpmtoken", LOG_PID | LOG_NDELAY, LOG_DAEMON);
 317                 (void) setlogmask(LOG_UPTO(LOG_DEBUG));
 318                 logit(LOG_DEBUG, "Logging enabled %d enabled", enabled);
 319         }
 320 #endif /* DEBUG */
 321 }
 322 
 323 void
 324 logterm()
 325 {
 326 #ifdef DEBUG
 327         closelog();
 328         enabled = 0;
 329 #endif /* DEBUG */
 330 }
 331 
 332 /*ARGSUSED*/
 333 void
 334 logit(int type, char *fmt, ...)
 335 {
 336 #ifdef DEBUG
 337         va_list pvar;
 338         char buffer[BUFSIZ];
 339 
 340         if (enabled) {
 341                 if (type <= logging) {
 342                         va_start(pvar, fmt);
 343                         (void) vsnprintf(buffer, sizeof (buffer), fmt, pvar);
 344                         va_end(pvar);
 345                         syslog(type, buffer);
 346                 }
 347         }
 348 #else
 349         return;
 350 #endif /* DEBUG */
 351 
 352 }
 353 
 354 void
 355 AddToSessionList(Session_Struct_t *pSess)
 356 {
 357         Session_Struct_t *pCur;
 358 
 359         (void) pthread_mutex_lock(&(Anchor->SessListMutex));
 360 
 361         pCur = Anchor->SessListBeg;
 362 
 363         if (! pCur) {
 364                 (void) pthread_mutex_lock(&(Anchor->ProcMutex));
 365                 Anchor->SessListBeg = pSess;
 366                 (void) pthread_mutex_unlock(&(Anchor->ProcMutex));
 367                 pSess->Previous = pSess->Next = NULL;
 368         } else {
 369                 while (pCur->Next != NULL) {
 370                         pCur = pCur->Next;
 371                 }
 372                 pCur->Next = pSess;
 373                 pSess->Previous = pCur;
 374                 pSess->Next = NULL;
 375         }
 376 
 377         (void) pthread_mutex_unlock(&(Anchor->SessListMutex));
 378 }
 379 
 380 void
 381 RemoveFromSessionList(Session_Struct_t *pSess)
 382 {
 383         Session_Struct_t *pCur, *pTmp;
 384 
 385         (void) pthread_mutex_lock(&(Anchor->SessListMutex));
 386 
 387         pCur = Anchor->SessListBeg;
 388         /*
 389          * Just in case check that there really is a list although
 390          * the call to ValidSession should have caught this already.
 391          * But someone may have removed the session already
 392          * while we were validating the call.
 393          */
 394         if (pCur) {
 395                 if (pCur == pSess) {
 396                         (void) pthread_mutex_lock(&(Anchor->ProcMutex));
 397                         pTmp = pSess->Next;
 398                         Anchor->SessListBeg = pSess->Next;
 399                         if (pTmp) {
 400                                 pTmp->Previous = NULL;
 401                         }
 402                         free(pSess);
 403                         (void) pthread_mutex_unlock(&(Anchor->ProcMutex));
 404                         pCur = NULL;
 405                 } else {
 406                         /*
 407                          * First check for a Null element then check
 408                          * next against the desired element.  This will
 409                          * allow the loop to terminate at the end of
 410                          * the list even if the desired element is not in
 411                          * the list (should not happen, but be defensive).
 412                          */
 413                         while (pCur && pCur->Next != pSess) {
 414                                 pCur = pCur->Next;
 415                         }
 416                         /*
 417                          * We did not hit the end of the list without finding
 418                          * our element so we can continue to remove it
 419                          */
 420                         if (pCur != NULL) {
 421                                 pTmp = pSess->Next;
 422                                 pCur->Next = pTmp;
 423                                 if (pTmp) {
 424                                         pTmp->Previous = pCur;
 425                                 }
 426                                 free(pSess);
 427                         }
 428                 }
 429         }
 430 
 431         (void) pthread_mutex_unlock(&(Anchor->SessListMutex));
 432 }
 433 
 434 int
 435 Valid_Session(Session_Struct_t *pSession, ST_SESSION_T *rSession)
 436 {
 437         int rv = FALSE;
 438         Session_Struct_t  *cSessionp;
 439 
 440         if (!pSession)
 441                 return (FALSE);
 442 
 443         (void) pthread_mutex_lock(&(Anchor->SessListMutex));
 444 
 445         cSessionp = Anchor->SessListBeg;
 446         while (cSessionp) {
 447                 if (cSessionp == pSession) {
 448                         rv = TRUE;
 449                         rSession->sessionh = pSession->RealHandle;
 450                         rSession->slotID = pSession->SltId;
 451                         break;
 452                 }
 453                 cSessionp = (Session_Struct_t *)cSessionp->Next;
 454         }
 455 
 456         (void) pthread_mutex_unlock(&(Anchor->SessListMutex));
 457         return (rv);
 458 }
 459 
 460 int
 461 API_Initialized()
 462 {
 463         return (Anchor != NULL && global_shm != NULL);
 464 }
 465 
 466 void
 467 Terminate_All_Process_Sessions()
 468 {
 469         CK_RV rv;
 470 
 471         logit(LOG_DEBUG, "Terminate_All_Process_Sessions");
 472 
 473         rv = C_CloseAllSessions(TPM_SLOTID);
 474         /*
 475          * If the return (code is not OK, we are really hosed
 476          * since we are terminating the session.
 477          * For now we will just log it
 478          */
 479         if (rv != CKR_OK) {
 480                 logit(LOG_DEBUG,
 481                     "Terminate_All_Process_Sessions RV %x", rv);
 482         }
 483 }