KMSAgentDataUnitCache.cpp revision 4f14b0f29aa144cc03efdde5508ae126ae197acf
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin/*
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin * CDDL HEADER START
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin *
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin * The contents of this file are subject to the terms of the
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin * Common Development and Distribution License (the "License").
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin * You may not use this file except in compliance with the License.
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin *
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * or http://www.opensolaris.org/os/licensing.
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * See the License for the specific language governing permissions
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin * and limitations under the License.
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin *
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin * When distributing Covered Code, include this CDDL HEADER in each
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * If applicable, add the following below this CDDL HEADER, with the
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * fields enclosed by brackets "[]" replaced with your own identifying
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * information: Portions Copyright [yyyy] [name of copyright owner]
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac *
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin * CDDL HEADER END
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin */
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin/*
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin */
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin/**
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin * \file KMSAgentDataUnitCache.cpp
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift */
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin#include <stdio.h>
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin#include "SYSCommon.h"
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift#include "KMSClientProfile.h"
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin#include "KMSAgentDataUnitCache.h"
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swiftCDataUnitCache::CDataUnitCache(int i_iMaxSize)
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift{
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin m_iSize = 0;
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift m_iIndex = 0;
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift m_iMaxSize = i_iMaxSize;
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift m_pCache = 0;
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin K_CreateMutex(&m_Lock);
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift}
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swiftCDataUnitCache::~CDataUnitCache()
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift{
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin delete[] m_pCache;
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin K_DestroyMutex(m_Lock);
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin}
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin
cf318da46ef082557ca9fb3fd19268c80e8dfc2csinbool CDataUnitCache::Insert(
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin const unsigned char* const i_pDataUnitID,
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin int i_iDataUnitIDMaxLen,
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift const unsigned char* const i_pDataUnitKeyID ,
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift int i_iDataUnitKeyIDMaxLen,
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin const utf8char* const i_wsApplianceNetworkAddress )
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin{
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin FATAL_ASSERT( (i_pDataUnitID && i_iDataUnitIDMaxLen == KMS_DATA_UNIT_ID_SIZE) ||
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin (i_pDataUnitKeyID && i_iDataUnitKeyIDMaxLen == KMS_KEY_ID_SIZE));
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift FATAL_ASSERT( i_wsApplianceNetworkAddress &&
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin strlen( i_wsApplianceNetworkAddress ) < KMS_MAX_NETWORK_ADDRESS );
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift Lock();
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift if ( m_pCache == 0 )
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift {
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift m_pCache = new DataUnitCacheEntry[m_iMaxSize];
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift if ( !m_pCache )
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift {
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin // no error logged on out of memory
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin Unlock();
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin#if defined(DEBUG) && defined(METAWARE)
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin log_printf("CDataUnitCache::Insert new DataUnitCacheEntry alloc failure\n");
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift#endif
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin return false;
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin }
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift }
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift if( m_iSize >= m_iMaxSize )
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift {
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift // the cache is full, so reuse an old slot
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin m_iIndex = (m_iIndex + 1) % m_iMaxSize;
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift }
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift else
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin {
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin m_iIndex = m_iSize;
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin m_iSize++;
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin }
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift strncpy( m_pCache[m_iIndex].m_wsApplianceNetworkAddress,
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift i_wsApplianceNetworkAddress,
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift sizeof(m_pCache[m_iIndex].m_wsApplianceNetworkAddress) );
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift m_pCache[m_iIndex].m_wsApplianceNetworkAddress[sizeof(m_pCache[m_iIndex].m_wsApplianceNetworkAddress)-1] = '\0';
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift if ( i_pDataUnitID )
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift {
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift memcpy( m_pCache[m_iIndex].m_aDataUnitID,
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift i_pDataUnitID,
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift i_iDataUnitIDMaxLen );
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift }
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin else
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin {
7185b49f58c4cdb16d035ecc45e38ec9b1cd9bd0matthew_swift memset( m_pCache[m_iIndex].m_aDataUnitID,0,KMS_DATA_UNIT_ID_SIZE);
cf318da46ef082557ca9fb3fd19268c80e8dfc2csin }
if ( i_pDataUnitKeyID )
{
memcpy( m_pCache[m_iIndex].m_aDataUnitKeyID,
i_pDataUnitKeyID,
i_iDataUnitKeyIDMaxLen );
}
else
{
memset(m_pCache[m_iIndex].m_aDataUnitKeyID,0,KMS_KEY_ID_SIZE);
}
Unlock();
return true;
}
bool CDataUnitCache::GetApplianceByDataUnitID(
const unsigned char* const i_pDataUnitID,
int i_iDataUnitIDMaxLen,
utf8char* const o_wsApplianceNetworkAddress,
int i_iMaxApplianceNetworkAddressLen )
{
FATAL_ASSERT( i_pDataUnitID );
FATAL_ASSERT( i_iDataUnitIDMaxLen == KMS_DATA_UNIT_ID_SIZE );
FATAL_ASSERT( i_iMaxApplianceNetworkAddressLen <= KMS_MAX_NETWORK_ADDRESS );
// assumes o_wsApplianceNetworkAddress points to at least KMS_MAX_NETWORK_ADDRESS
Lock();
int i;
for( i = 0; i < m_iSize; i++ )
{
if( memcmp(m_pCache[i].m_aDataUnitID, i_pDataUnitID, KMS_DATA_UNIT_ID_SIZE) == 0 )
{
strncpy( o_wsApplianceNetworkAddress,
m_pCache[i].m_wsApplianceNetworkAddress,
i_iMaxApplianceNetworkAddressLen );
o_wsApplianceNetworkAddress[i_iMaxApplianceNetworkAddressLen-1] = '\0';
Unlock();
return true;
}
}
Unlock();
return false;
}
bool CDataUnitCache::GetApplianceByDataUnitKeyID(
const unsigned char* const i_pDataUnitKeyID,
int i_iDataUnitKeyIDMaxLen,
utf8char* const o_wsApplianceNetworkAddress,
int i_iMaxApplianceNetworkAddressLen )
{
FATAL_ASSERT( i_pDataUnitKeyID );
FATAL_ASSERT( i_iDataUnitKeyIDMaxLen == KMS_KEY_ID_SIZE );
FATAL_ASSERT( i_iMaxApplianceNetworkAddressLen <= KMS_MAX_NETWORK_ADDRESS );
// assumes o_wsApplianceNetworkAddress points to at least KMS_MAX_NETWORK_ADDRESS
Lock();
int i;
for( i = 0; i < m_iSize; i++ )
{
if( memcmp(m_pCache[i].m_aDataUnitKeyID,
i_pDataUnitKeyID, KMS_KEY_ID_SIZE) == 0 )
{
strncpy( o_wsApplianceNetworkAddress,
m_pCache[i].m_wsApplianceNetworkAddress,
i_iMaxApplianceNetworkAddressLen );
o_wsApplianceNetworkAddress[i_iMaxApplianceNetworkAddressLen-1] = '\0';
Unlock();
return true;
}
}
Unlock();
return false;
}
void CDataUnitCache::Lock()
{
K_LockMutex(m_Lock);
}
void CDataUnitCache::Unlock()
{
K_UnlockMutex(m_Lock);
}