#include <stdio.h>
#include <stdlib.h>
#include <memory>
#include "p6sax2contenthandler.h"
#include "cconsolestream.h"
using namespace P6R;
namespace {
typedef struct {
} KMIP_CTX;
class CKmipExample6
{
public:
CKmipExample6()
: m_port(0), m_compatMask(0), m_pHostName(NULL)
{ }
~CKmipExample6()
{
if (NULL != m_pHostName) m_cpStr->wstrfree( m_pHostName );
if (NULL != m_cpStoreInit) m_cpStoreInit->close();
}
KMIP_CTX m_ctx;
protected:
};
{
{
if (
P6SUCCEEDED( err = cpKeyInit->initialize( P6CKF_NONE, m_cpRandom )))
{
{
}
}
}
return err;
}
{
*ppGenKeys = NULL;
{
err = (*ppGenKeys)->initialize( P6GENKEY_NOFLAGS, m_cpRandom );
{
(*ppGenKeys)->release();
*ppGenKeys = NULL;
}
}
return err;
}
{
if (!pKeystore || !pszCertificateFile) return eInvalidArg;
if (
P6FAILED( err = m_cpStr->wstrlcat( certPath,
P6CNTOF(certPath), pszCertificateFile, NULL )))
return err;
err = cpSSLHelp->importTrustedRootCertFromPEMFile( certPath, NULL );
}
return err;
}
{
if (!pKeystore || !pszHostname || !pszPrivateKeyFile || !pszCertificateFile ) return eInvalidArg;
if (
P6FAILED( err = m_cpStr->wstrlcat( keyPath,
P6CNTOF(keyPath), pszPrivateKeyFile, NULL )))
return err;
if (
P6FAILED( err = m_cpStr->wstrlcat( certPath,
P6CNTOF(certPath), pszCertificateFile, NULL )))
return err;
err = cpSSLHelp->importCredentialsPEM(
P6TRUE, pszHostname, keyPath, certPath, NULL, NULL );
}
return err;
}
{
*pInit = NULL;
*pKeystore = NULL;
if (
P6FAILED( err = (*pInit)->initialize( P6KEYSTORE_NOFLAGS, m_cpCrypto,
SH_SHA256, m_cpSignKey )))
{
if (NULL != (*pKeystore)) (*pKeystore)->release();
(*pKeystore) = NULL;
(*pInit)->release();
(*pInit) = NULL;
return err;
}
if (
P6FAILED( err = (*pInit)->openSigned( NULL, pKeystoreName )))
{
if (NULL != (*pKeystore)) (*pKeystore)->release();
(*pKeystore) = NULL;
(*pInit)->release();
(*pInit) = NULL;
return err;
}
if (
P6FAILED( err = keystoreAddRootCertFromFile( (*pKeystore), rootPEM )))
return err;
if (
P6FAILED( err = keystoreAddClientCertFromFile( (*pKeystore), m_pHostName, privPEM, certPEM )))
return err;
return eOk;
}
{
{
if (
P6SUCCEEDED( err = cpSource->initialize( P6ENTROPY_HIGH )))
{
{
if (
P6SUCCEEDED( err = cpInit->initialize( P6RAND_NOFLAGS, cpSource ))) {
}
}
}
}
return err;
}
{
if (
P6FAILED( err = cpDir->initialize()))
return err;
if (
P6FAILED( err = m_cpTime->initialize()))
return err;
if (
P6FAILED( err = m_cpIT->initialize()))
return err;
if (
P6FAILED(err = getRNG( m_cpRandom.addressof())))
return err;
if (
P6FAILED( err = m_cpPool->initialize(
P6CTEXT(
"KMIP Notify Test"), 5000, 2, 5, P6IOBF_NOFLAGS )))
return err;
m_port = 5696;
m_compatMask = 0;
if (
P6FAILED( err = m_cpStr->wstrdup(
P6TEXT(
"fqdn.com"), &m_pHostName )))
return err;
{
err = cpGenKey->genSymmetricKey( m_cpSignKey.addressof(), 256,
P6FALSE );
}
}
if (
P6SUCCEEDED( err )) err = m_cpCrypto->setKey( cpKey );
if (
P6FAILED( err = m_cpStr->wstrlcat( dbPath,
P6CNTOF(dbPath),
P6TEXT(
"/db/KMIP12_keystore"), NULL )))
return err;
cpDir->unlink( dbPath );
if (
P6FAILED( err = m_cpStr->wstrlcat( dbPath,
P6CNTOF(dbPath),
P6TEXT(
"/db/KMIP12_keystore.sig"), NULL )))
return err;
cpDir->unlink( dbPath );
err = createKeystore(
P6TEXT(
"KMIP12_keystore"),
P6TEXT(
"RootCert.pem"),
P6TEXT(
"ClientCert.pem"),
P6TEXT(
"ClientPrivate.pem"), m_cpStoreInit.addressof(), m_cpKeystore.addressof() );
return err;
}
{
return eOk;
}
{
if (
P6FAILED( err = pClient->
setSSLOptions( NULL, (P6SSF_METHOD_TLS1 | P6SSF_SECURE_CLIENT | P6SSF_SECURE_CLIENT_AUTH | P6SSF_LOG_X509SUBJECTLOOKUPS | P6SSF_VRFY_DISABLEHOSTMATCH))))
return err;
return pClient->
open( m_pHostName, m_port, (bWithCredentials ? &credential : NULL));
}
{
err = pEnum->
next( &buffer );
{
if (NULL == (pGUID =
new(std::nothrow)
P6CHAR[buffer.
length + 2]))
return eNoMemory;
pGUID[0] = 0;
}
else err = eFail;
return err;
}
{
if (NULL != pUniqueId)
{
if (
P6FAILED( err = extractUniqueId( pUniqueId, &enumStr )))
return err;
if (enumStr.
length ==
id.length)
{
err = m_cpStr->strcmp( enumStr.
pString,
id.pString,
id.length, &match );
}
}
return (0 == match);
}
{
if (
P6FAILED( err = pRequest->
getBufPtr( &pRawBuffer, &dontCare, &bytesLeft )))
return err;
{
err = pSocket->
send( &pRawBuffer[offset], bytesLeft, &bytesSent, tTimeout );
bytesLeft -= bytesSent;
offset += bytesSent;
bytesSent = 0;
}
cBytesSent = offset;
return err;
}
{
P6NETADDR addr;
{
{
m_cpHelper->strToNetAddr( "0.0.0.0:0", &addr );
err = pSocket->
bind( &addr );
{
*ppSocket = pSocket;
}
}
}
return err;
}
{
P6NETADDR addr;
P6INTERVAL tTimeout = 0;
m_cpIT->milliSecondsToInterval( 10000, &tTimeout );
m_cpHelper->strToNetAddr( "127.0.0.1:65524", &addr );
return pSocket->
connect( &addr, tTimeout );
}
{
P6INTERVAL tTimeout = 0;
{
}
{
}
if (
P6SUCCEEDED( err = createClientSocket( &pSocket )))
{
if(
P6SUCCEEDED( err = connectClientSocket( pSocket )))
{
if (
P6SUCCEEDED( err = createFakePutKeyTTLV( pKeyId, pKey, pReqBuf )))
{
m_cpIT->milliSecondsToInterval( 10000, &tTimeout );
szRecvBuf[0] = 0;
err = sendMessage( pReqBuf, pSocket, tTimeout, cBytesSent );
pReqBuf = NULL;
err = pSocket->
recv( &szRecvBuf[0],
sizeof(szRecvBuf), &cBytesRead, tTimeout );
}
}
}
}
return err;
}
{
P6INTERVAL tTimeout = 0;
if (
P6SUCCEEDED( err = createClientSocket( &pSocket )))
{
if (
P6SUCCEEDED( err = connectClientSocket( pSocket )))
{
if (
P6SUCCEEDED( err = createFakeNotifyTTLV( pKeyId, pAttribName, attribLength, pReqBuf )))
{
m_cpIT->milliSecondsToInterval( 10000, &tTimeout );
szRecvBuf[0] = 0;
err = sendMessage( pReqBuf, pSocket, tTimeout, cBytesSent );
pReqBuf = NULL;
err = pSocket->
recv( &szRecvBuf[0],
sizeof(szRecvBuf), &cBytesRead, tTimeout );
}
}
}
}
return err;
}
{
P6UINT32 keyFormatType = KMIP_KEYFORMAT_RAW;
const P6UCHAR digest[] = { 0x53,0x65,0x63,0x72,0x65,0x82,0x74,0x50,0x02,0x61,0x73,0x73,0x77,0x6F,0x72,0x64 };
if (
P6FAILED( err = cpEncoder->initialize( P6KMIPENCODER_NOFLAGS, P6KMIP_VERSION_12, m_cpPool, &encodePrefs )))
return err;
err = m_cpTime->now( &tStamp );
m_cpStr->setMem( &putParams, 0,
sizeof(
P6KMIP_PUT ));
itemList[0].
type = KMIP_ATTRIB_EXTENSION;
itemList[1].
type = KMIP_ATTRIB_UNIQUEIDENTIFIER;
itemList[2].
type = KMIP_ATTRIB_OBJECTTYPE;
itemList[3].
type = KMIP_ATTRIB_CRYPTOALGORITHM;
itemList[4].
type = KMIP_ATTRIB_CRYPTOLENGTH;
itemList[5].
type = KMIP_ATTRIB_CRYPTOUSAGEMASK;
itemList[6].
type = KMIP_ATTRIB_DIGEST;
itemList[7].
type = KMIP_ATTRIB_FRESH;
itemList[8].
type = KMIP_ATTRIB_INITIALDATE;
itemList[9].
type = KMIP_ATTRIB_LASTCHANGEDATE;
itemList[10].
type = KMIP_ATTRIB_LEASETIME;
itemList[11].
type = KMIP_ATTRIB_ORIGCREATIONDATE;
itemList[12].
type = KMIP_ATTRIB_STATE;
err = cpEncoder->getBufPtr( &pReqBuf );
return err;
}
{
if (
P6FAILED( err = cpEncoder->initialize( P6KMIPENCODER_NOFLAGS, P6KMIP_VERSION_12, m_cpPool, &encodePrefs )))
return err;
err = m_cpTime->now( &tStamp );
if (NULL != pAtribValue)
{
itemList[i].
type = KMIP_ATTRIB_EXTENSION;
i++;
}
itemList[i].
type = KMIP_ATTRIB_LASTCHANGEDATE;
i++;
if (NULL == pAtribValue)
{
itemList[i].
type = KMIP_ATTRIB_STATE;
i++;
}
err = pMsg->
addNotify( uniqueId, i, itemList, ignore, NULL );
err = cpEncoder->getBufPtr( &pReqBuf );
return err;
}
{
{
err = pClient->
destroyObject( objectId, NULL, &pUniqueId, &resultCodes );
printf("\ncall to destroyObject has failed %x\n", err );
}
printf("\nKMIP server returned an error - destroy object\n");
}
bMatch = isEqualId( pUniqueId, objectId );
if (!bMatch) {
printf("\nKMIP server to destroy object with wrong object uniqueId\n");
}
if (bFree)
delete [] objectId.
pString;
if (KMIP_RESULT_SUCCESS != resultCodes.
resultStatus)
return eFail;
}
return err;
}
{
CKmipExample6 *pThis = reinterpret_cast<CKmipExample6*>( pContext );
if (NULL != pThis)
{
if (KMIP_OP_PUT == pRequest->
type) err = pThis->verifyPutCallBack12( pRequest );
else if (KMIP_OP_NOTIFY == pRequest->
type) err = pThis->verifyNotifyCallBack12( pRequest );
}
pThis->m_ctx.pLock->lock();
pThis->m_ctx.pCV->notify();
pThis->m_ctx.pLock->unlock();
return err;
}
{
{
}
{
{
switch( attribType ) {
case KMIP_ATTRIB_EXTENSION:
nameBuffer[0] = 0; tempBuffer[0] = 0;
match = -1;
match = -1;
break;
case KMIP_ATTRIB_LASTCHANGEDATE:
break;
case KMIP_ATTRIB_STATE:
break;
default:
break;
}
}
}
return err;
}
{
{
}
{
}
{
{
switch( attribType ) {
case KMIP_ATTRIB_EXTENSION:
nameBuffer[0] = 0; tempBuffer[0] = 0;
break;
case KMIP_ATTRIB_UNIQUEIDENTIFIER:
nameBuffer[0] = 0;
break;
case KMIP_ATTRIB_DIGEST:
numBuffer[0] = 0;
break;
case KMIP_ATTRIB_OBJECTTYPE:
break;
case KMIP_ATTRIB_CRYPTOALGORITHM:
break;
case KMIP_ATTRIB_CRYPTOLENGTH:
break;
case KMIP_ATTRIB_LEASETIME:
break;
case KMIP_ATTRIB_FRESH:
break;
case KMIP_ATTRIB_INITIALDATE:
case KMIP_ATTRIB_LASTCHANGEDATE:
case KMIP_ATTRIB_ORIGCREATIONDATE:
break;
case KMIP_ATTRIB_CRYPTOUSAGEMASK:
break;
case KMIP_ATTRIB_STATE:
break;
default:
break;
}
}
}
return err;
}
{
m_keyId.pString = NULL;
m_keyId.length = 0;
if (
P6FAILED( err = cpServer->initialize( (P6KMIPFLG_TRACE_MSGS | P6KMIPFLG_TRACE_FORMATKMIPXML), 0, 0, NULL, processNotifyPutCallBack12,
this )))
return err;
if (
P6FAILED( err = cpServer->start()))
return err;
setPreferences( &preferences,
P6TEXT(
"TC_NP_2_12"), 0, 0, 0, 0, 5000, 2000, 2000, 120000, 2, 2 );
err = cpClient->initialize( (P6KMIPFLG_TRACE_MSGS | P6KMIPFLG_TRACE_FORMATKMIPXML), m_cpKeystore, preferences );
m_cpStr->setMem( &m_ctx, 0, sizeof( KMIP_CTX ));
if (
P6FAILED( err = m_ctx.pLock->initialize())) { m_ctx.pLock->
release();
return err; }
if (
P6FAILED( err = m_ctx.pCV->initialize( m_ctx.pLock ))) {
m_ctx.pCV->release();
m_ctx.pLock->release();
return err;
}
{
}
{
}
attributeList[0].
type = KMIP_ATTRIB_CRYPTOUSAGEMASK;
attributeList[0].
index = 0;
attributeList[1].
type = KMIP_ATTRIB_EXTENSION;
attributeList[1].
index = 0;
err = cpClient->registerKeyObject( keyParams, &newKey, &resultCodes );
printf("\ncall to registerKeyObject has failed %x\n", err );
}
printf("\nKMIP server returned an error - register object\n");
}
}
if (bSelfTest) {
err = fakeClientPut( &m_keyId );
}
m_ctx.pLock->lock();
m_ctx.pCV->wait();
}
m_ctx.pLock->unlock();
err = cpClient->addAttributeObject( attribParams, &getResult, &resultCodes );
printf("\ncall to addAttributeObject has failed %x\n", err );
}
printf("\nKMIP server returned an error - add attribute\n");
}
if (bSelfTest) {
err = fakeClientNotify( &m_keyId, "unknown", 7 );
}
m_ctx.pLock->lock();
m_ctx.pCV->wait();
}
m_ctx.pLock->unlock();
destroyObject( cpClient, m_keyId,
P6FALSE );
if (bSelfTest) {
err = fakeClientNotify( &m_keyId, NULL, 0 );
}
m_ctx.pLock->lock();
m_ctx.pCV->wait();
}
m_ctx.pLock->unlock();
err = cpClient->close();
err = cpServer->stop();
if (NULL != m_keyId.pString) delete [] m_keyId.pString;
if (NULL != m_ctx.pCV ) m_ctx.pCV->
release();
if (NULL != m_ctx.pLock) m_ctx.pLock->release();
return err;
}
{
CKmipExample6 example;
err = example.run( pDataStream );
}
}
}
int main(int argc,char *argv[])
{
{
{
KMIP_TC_NP_2_12( cpDataStream );
}
else printf("ERROR: Failed to initialize the loader [ %x ]\n", err );
}
else printf( "ERROR: Failed to create CConsoleStream [ %x ]\n", err );
return err;
}