1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 /** @file             KMSAgentDataUnitCache.h
27  *  @defgroup         EncryptionAgent Encryption Agent API
28  *
29  */
30 #ifndef KMSAGENT_DATA_UNIT_CACHE_H
31 #define KMSAGENT_DATA_UNIT_CACHE_H
32 
33 #define DATA_UNIT_CACHE_MAX_SIZE 128
34 
35 typedef struct DataUnitCacheEntry
36 {
37     utf8char m_wsApplianceNetworkAddress[KMS_MAX_NETWORK_ADDRESS+1];
38     unsigned char m_aDataUnitID[KMS_DATA_UNIT_ID_SIZE];
39     unsigned char m_aDataUnitKeyID[KMS_KEY_ID_SIZE];
40 
41 } DataUnitCacheEntry;
42 
43 /**
44  *  Maintains an affinity list between KMAs and DUs and KeyIDs.
45  */
46 class CDataUnitCache
47 {
48 
49 public:
50     CDataUnitCache(int i_iMaxSize = DATA_UNIT_CACHE_MAX_SIZE);
51     ~CDataUnitCache();
52 
53     /**
54      *   insert a new DataUnitCacheEntry into the cache list, either i_pDataUnitID or
55      *   i_pDataUnitKeyID must be specified for affinity with the specified i_wsApplianceNetworkAddress
56      *   @param i_pDataUnitID optional, specifies a DU ID cache entry if specified
57      *   @param i_iDataUnitIDMaxLen ignored if i_pDataUnitID not specified, otherwise
58      *      specifies the length of i_pDataUnitID
59      *   @param i_pDataUnitKeyID optional, specifies a Key ID cache entry if specified
60      *   @param i_iDataUnitKeyIDMaxLen ignored if i_pDataUnitKeyID is not specified,
61      *      otherwise specifies the length of i_pDataUnitKeyID
62      *   @param i_wsApplianceNetworkAddress required and specifies the KMA affiliated
63      *      with the DU ID or Key ID
64      *   @return True if successfully inserted into the cache
65      */
66     bool Insert(
67                 const unsigned char* const i_pDataUnitID,
68                 int i_iDataUnitIDMaxLen,
69                 const unsigned char* const i_pDataUnitKeyID ,
70                 int i_iDataUnitKeyIDMaxLen,
71                 const utf8char* const i_wsApplianceNetworkAddress );
72 
73     bool GetApplianceByDataUnitID(
74                 const unsigned char* const i_pDataUnitID,
75                 int i_iDataUnitIDMaxLen,
76                 utf8char* const o_wsApplianceNetworkAddress,
77                 int i_iMaxApplianceNetworkAddressLen );
78 
79     bool GetApplianceByDataUnitKeyID(
80                 const unsigned char* const i_pDataUnitKeyID,
81                 int i_iDataUnitKeyIDMaxLen,
82                 utf8char* const o_wsApplianceNetworkAddress,
83                 int i_iMaxApplianceNetworkAddressLen );
84 
85 protected:
86     void Lock();
87     void Unlock();
88 
89 private:
90     K_MUTEX_HANDLE m_Lock;
91 
92     int m_iIndex;
93     int m_iSize;
94     int m_iMaxSize;
95     DataUnitCacheEntry *m_pCache;
96 
97 };
98 
99 #endif
100