token.h
1 /* 2 * Copyright (c) 2004,2007-2008 Apple Inc. All Rights Reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24 25 // 26 // token - internal representation of a (single distinct) hardware token 27 // 28 #ifndef _H_TOKEN 29 #define _H_TOKEN 30 31 #include "structure.h" 32 #include "tokencache.h" 33 #include "tokenacl.h" 34 #include "tokend.h" 35 #include <security_utilities/pcsc++.h> 36 #include <securityd_client/ssnotify.h> 37 38 class Reader; 39 class TokenDbCommon; 40 41 42 // 43 // Token is the global-scope object representing a smartcard token. 44 // It also acts as the global-scope database object for the TokenDatabase representing 45 // its content, and carries the ObjectAcls for objects on the token. 46 // 47 class Token : public PerGlobal, public virtual TokenAcl, public FaultRelay { 48 public: 49 class Access; friend class Access; 50 51 public: 52 Token(); 53 ~Token(); 54 55 ::Reader &reader() const; 56 TokenDaemon &tokend(); 57 GenericHandle tokenHandle() const; 58 uint32 subservice() const { return mSubservice; } 59 std::string printName() const { return mPrintName; } 60 TokenCache::Token &cache() const { return *mCache; } 61 62 void insert(::Reader &slot, RefPointer<TokenDaemon> tokend); 63 void remove(); 64 65 void notify(NotificationEvent event); 66 void fault(bool async); 67 68 void kill(); 69 70 IFDUMP(void dumpNode()); 71 72 static RefPointer<Token> find(uint32 ssid); 73 74 void getAcl(const char *tag, uint32 &count, AclEntryInfo *&acls); 75 ResetGeneration resetGeneration() const; 76 bool resetGeneration(ResetGeneration rg) const { return rg == resetGeneration(); } 77 void resetAcls(); 78 79 public: 80 // SecurityServerAcl and TokenAcl personalities 81 AclKind aclKind() const; 82 Token &token(); // myself 83 84 // FaultRelay personality 85 void relayFault(bool async); 86 87 public: 88 class Access { 89 public: 90 Access(Token &token); 91 ~Access(); 92 93 Token &token; 94 95 TokenDaemon &tokend() const { return *mTokend; } 96 TokenDaemon &operator () () const { return tokend(); } 97 98 private: 99 RefPointer<TokenDaemon> mTokend; 100 }; 101 102 public: 103 // keep track of TokenDbCommons for reset processing 104 // (this interface is for TokenDbCommon only) 105 void addCommon(TokenDbCommon &dbc); 106 void removeCommon(TokenDbCommon &dbc); 107 108 private: 109 RefPointer<TokenDaemon> chooseTokend(); 110 111 private: 112 bool mFaulted; // fault state flag 113 RefPointer<TokenDaemon> mTokend; // the (one) tokend that runs the card 114 RefPointer<TokenCache::Token> mCache; // token cache reference 115 std::string mPrintName; // print name of token 116 117 Guid mGuid; // our CSP/DL's Guid 118 uint32 mSubservice; // dynamic subservice of gGuidAppleSdCSPDL 119 PCSC::ReaderState mState; // reader state as of insertion 120 121 private: 122 typedef map<uint32, Token *> SSIDMap; 123 static SSIDMap mSubservices; 124 static Mutex mSSIDLock; 125 126 typedef set<TokenDbCommon *> CommonSet; 127 CommonSet mCommons; 128 ResetGeneration mResetLevel; 129 }; 130 131 132 #endif //_H_TOKEN