tokenkey.cpp
1 /* 2 * Copyright (c) 2004,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 // tokenkey - remote reference key on an attached hardware token 27 // 28 #include "tokenkey.h" 29 #include "tokendatabase.h" 30 31 32 // 33 // Construct a TokenKey from a reference handle and key header 34 // 35 TokenKey::TokenKey(TokenDatabase &db, KeyHandle tokenKey, const CssmKey::Header &hdr) 36 : Key(db), mKey(tokenKey), mHeader(hdr) 37 { 38 db.addReference(*this); 39 } 40 41 42 // 43 // Destruction of a TokenKey releases the reference from tokend 44 // 45 TokenKey::~TokenKey() 46 { 47 try { 48 database().token().tokend().releaseKey(mKey); 49 } catch (...) { 50 secinfo("tokendb", "%p release key handle %u threw (ignored)", 51 this, mKey); 52 } 53 } 54 55 56 // 57 // Links through the object mesh 58 // 59 TokenDatabase &TokenKey::database() const 60 { 61 return referent<TokenDatabase>(); 62 } 63 64 Token &TokenKey::token() 65 { 66 return database().token(); 67 } 68 69 GenericHandle TokenKey::tokenHandle() const 70 { 71 return mKey; // tokend-side handle 72 } 73 74 75 // 76 // Canonical external attributes (taken directly from the key header) 77 // 78 CSSM_KEYATTR_FLAGS TokenKey::attributes() 79 { 80 return mHeader.attributes(); 81 } 82 83 84 // 85 // Return-to-caller processing (trivial in this case) 86 // 87 void TokenKey::returnKey(Handle &h, CssmKey::Header &hdr) 88 { 89 h = this->handle(); 90 hdr = mHeader; 91 } 92 93 94 // 95 // We're a key (duh) 96 // 97 AclKind TokenKey::aclKind() const 98 { 99 return keyAcl; 100 } 101 102 103 // 104 // Right now, key ACLs are at the process level 105 // 106 SecurityServerAcl &TokenKey::acl() 107 { 108 return *this; 109 } 110 111 112 // 113 // The related database is, naturally enough, the TokenDatabase we're in 114 // 115 Database *TokenKey::relatedDatabase() 116 { 117 return &database(); 118 } 119 120 121 // 122 // Generate the canonical key digest. 123 // This is not currently supported through tokend. If we need it, 124 // we'll have to force unlock and fake it (in tokend, most likely). 125 // 126 const CssmData &TokenKey::canonicalDigest() 127 { 128 CssmError::throwMe(CSSM_ERRCODE_FUNCTION_NOT_IMPLEMENTED); 129 }