2006-01-19 00:34:21 +01:00
/***********************************************************************
*
* Copyright ( C ) 2005 - 2006 Novell , Inc .
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; version 2.1
* of the License .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Library General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free
* Software Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*
* To contact Novell about this file by physical or electronic mail ,
* you may find current contact information at www . novell . com .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-10-11 21:51:00 +02:00
/***************************************************************
* * * This code is available at " www.developer.novell.com/ndk/ **
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Sample code for C Language SecretStore Client Service APIs */
# include <stdio.h>
# include <stdlib.h>
# ifdef WIN32
# include <conio.h>
# include <windows.h>
# else
# define getch(x) getchar(x);
# endif
# include <time.h>
# include <string.h>
# include <micasa_mgmd.h>
# include <micasa.h>
# define GSS_BLD_STR "4.0.1"
# define SSCS_BINARY_TYPE_F 0x00000004L
static char SSCS_APP_SECRET [ ] = { ' S ' , ' S ' , ' _ ' , ' A ' , ' p ' , ' p ' , 0 } ;
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
/*
* Global data
*/
int optErr = 1 ; // if error message should be printed
int optIdx = 1 ; // index into parent argv vector
int optionString = 1 ; // character checked for validity
char * optArg = NULL ; // argument associated with option
# define BADCHAR (int)'?'
# define ERRMSG ""
/* interactive flag */
static int aFlag = 1 ;
/* */
/*
* NAME - sss_GetOpt
*
* DESCRIPTION
* An implementation of the Unix getopt ( ) function .
*
*/
int sss_GetOpt ( int nArgc , char * * nArgv , char * optStr )
{ /* beginning of the call */
/* ########################## DECLARATIONS START HERE ######################### */
static char * place = ERRMSG ;
char * nxtOpt ;
/* ############################## CODE STARTS HERE ############################ */
if ( ! * place )
{
if ( ( optIdx > = nArgc ) | |
( ( * ( place = nArgv [ optIdx ] ) ! = ' - ' )
& & ( * ( place = nArgv [ optIdx ] ) ! = ' / ' ) ) | |
( ! * + + place ) )
{
return ( - 1 ) ;
}
if ( ( * place = = ' - ' ) | | ( * place = = ' / ' ) )
{
+ + optIdx ;
return ( - 1 ) ;
}
}
if ( ( optionString = ( int ) * place + + ) = = ( int ) ' = ' | |
! ( nxtOpt = strchr ( optStr , optionString ) ) )
{
if ( ! * place )
{
+ + optIdx ;
}
return ( BADCHAR ) ;
}
if ( * + + nxtOpt ! = ' = ' )
{
optArg = NULL ;
if ( ! * place )
{
+ + optIdx ;
}
}
else
{
if ( * place )
{
optArg = place + 1 ;
}
else if ( nArgc < = + + optIdx )
{
place = ERRMSG ;
return ( BADCHAR ) ;
}
else
{
optArg = nArgv [ optIdx ] ;
}
place = ERRMSG ;
+ + optIdx ;
}
return ( optionString ) ;
/* ########################## CODE ENDS HERE ######################### */
} /* end of GetOPt */
void Pause ( )
{ /* beginning of the call */
/* ############################## CODE STARTS HERE ############################ */
if ( aFlag )
{
printf ( " \n Press a key ==> \n " ) ;
getch ( ) ;
}
/* ########################## CODE ENDS HERE ######################### */
} /* end of Pause */
/* */
/*
* NAME - PrintFlags
*
* DESCRIPTION
* This function will print the
* status flags read form a secret .
*
*/
void PrintFlags ( char * msg , unsigned long statFlags )
{ // beginning of the call
// ############################## CODE STARTS HERE ############################
# ifdef NOT_DEFINED_YET
if ( aFlag )
{
printf ( " %s " , msg ) ;
if ( statFlags & NSSS_ENHANCED_PROTECT_INFO_F )
printf ( " \t ENHANCED PROTECTION... \n " ) ;
if ( statFlags & NSSS_STORE_NOT_SYNCED_F )
printf ( " \t STORE NOT SYNCED... \n " ) ;
if ( statFlags & NSSS_SECRET_NOT_INITIALIZED_F )
printf ( " \t SECRET NOT INITIALIZED... \n " ) ;
if ( statFlags & NSSS_SECRET_LOCKED_F )
printf ( " \t SECRET LOCKED... \n " ) ;
// doesn't apply to the server
if ( strcmp ( msg , " SecretStore Flags: \n " ) )
{
if ( statFlags & NSSS_ADMIN_LAST_MOD_F )
printf ( " \t ADMIN MODIFIED LAST... \n " ) ;
else
printf ( " \t OWNER MODIFIED LAST... \n " ) ;
}
if ( statFlags & NSSS_EP_PWORD_PRESENT_F )
printf ( " \t EP PWORD PRESENT... \n " ) ;
if ( statFlags & NSSS_EP_MASTER_PWORD_PRESENT_F )
printf ( " \t MASTER PWORD PRESENT... \n " ) ;
if ( statFlags & NSSS_MP_NOT_ALLOWED_F )
printf ( " \t MASTER PWORD NOT ALLOWED... \n " ) ;
if ( statFlags & NSSS_HIDDEN_SECRET_F )
printf ( " \t HIDDEN SECRET IN SECRETSTORE... \n " ) ;
if ( statFlags & NSSS_ADMIN_UNLOCKED_F )
printf ( " \t ADMIN LAST UNLOCKED THE SECRETSTORE... \n " ) ;
}
# endif
// ########################## CODE ENDS HERE #########################
} // end of PrintFlags
/* */
/*
* NAME - main
*
* DESCRIPTION
* SecretStore SharedSecret test program .
*
*/
int main
(
int argc ,
char * * argv
)
{ /* beginning of the call */
/* ########################## DECLARATIONS START HERE ######################### */
SSCS_SECRETSTORE_T ssid = { 0 } ;
SSCS_SECRETSTORE_INFO_T ssInfo = { 0 } ;
SSCS_KEYCHAIN_ID_T keyChainID = { 0 } ;
SSCS_READEXT_T rInfo = { 0 } ;
void * ssContext = NULL ;
int appTstFlag = 0 , multiCredTstFlag = 0 , multiEntryTstFlag = 0 ;
char * secret ;
static char multiCredApp [ ] = { ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' ' , ' M ' , ' u ' , ' l ' , ' t ' , ' i ' , ' p ' , ' l ' , ' e ' , ' ' , ' C ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' t ' , ' ' , ' A ' , ' p ' , ' p ' , ' l ' , ' i ' , ' c ' , ' a ' , ' t ' , ' i ' , ' o ' , ' n ' , ' ' , ' T ' , ' e ' , ' s ' , ' t ' , 0 } ;
static char multiEntryCredSet [ ] = { ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' ' , ' M ' , ' u ' , ' l ' , ' t ' , ' i ' , ' p ' , ' l ' , ' e ' , ' ' , ' E ' , ' n ' , ' t ' , ' r ' , ' y ' , ' ' , ' C ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' t ' , ' ' , ' T ' , ' e ' , ' s ' , ' t ' , 0 } ;
static char userKey [ ] = { ' U ' , ' s ' , ' e ' , ' r ' , 0 } ;
static char passwordKey [ ] = { ' P ' , ' a ' , ' s ' , ' s ' , ' w ' , ' o ' , ' r ' , ' d ' , 0 } ;
static char userEntries [ 5 ] [ 7 ] =
{
{ ' u ' , ' s ' , ' e ' , ' r ' , ' 0 ' , ' 1 ' , 0 } ,
{ ' u ' , ' s ' , ' e ' , ' r ' , ' 0 ' , ' 2 ' , 0 } ,
{ ' u ' , ' s ' , ' e ' , ' r ' , ' 0 ' , ' 3 ' , 0 } ,
{ ' u ' , ' s ' , ' e ' , ' r ' , ' 0 ' , ' 4 ' , 0 } ,
{ ' u ' , ' s ' , ' e ' , ' r ' , ' 0 ' , ' 5 ' , 0 }
} ;
static char passwordEntries [ 5 ] [ 11 ] =
{
{ ' p ' , ' a ' , ' s ' , ' s ' , ' w ' , ' o ' , ' r ' , ' d ' , ' 0 ' , ' 1 ' , 0 } ,
{ ' p ' , ' a ' , ' s ' , ' s ' , ' w ' , ' o ' , ' r ' , ' d ' , ' 0 ' , ' 2 ' , 0 } ,
{ ' p ' , ' a ' , ' s ' , ' s ' , ' w ' , ' o ' , ' r ' , ' d ' , ' 0 ' , ' 3 ' , 0 } ,
{ ' p ' , ' a ' , ' s ' , ' s ' , ' w ' , ' o ' , ' r ' , ' d ' , ' 0 ' , ' 4 ' , 0 } ,
{ ' p ' , ' a ' , ' s ' , ' s ' , ' w ' , ' o ' , ' r ' , ' d ' , ' 0 ' , ' 5 ' , 0 }
} ;
static char mKeyEntries [ 5 ] [ 12 ] =
{
{ ' C ' , ' o ' , ' m ' , ' p ' , ' a ' , ' n ' , ' y ' , 0 } ,
{ ' D ' , ' e ' , ' s ' , ' c ' , ' r ' , ' i ' , ' p ' , ' t ' , ' i ' , ' o ' , ' n ' , 0 } ,
{ ' U ' , ' s ' , ' e ' , ' r ' , ' n ' , ' a ' , ' m ' , ' e ' , 0 } ,
{ ' P ' , ' a ' , ' s ' , ' s ' , ' w ' , ' o ' , ' r ' , ' d ' , 0 } ,
{ ' P ' , ' i ' , ' n ' , ' ' , ' N ' , ' u ' , ' m ' , ' b ' , ' e ' , ' r ' , 0 }
} ;
static char mValEntries [ 5 ] [ 26 ] =
{
{ ' N ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , ' , ' , ' ' , ' I ' , ' n ' , ' c ' , ' . ' , 0 } ,
{ ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' ' , ' T ' , ' e ' , ' s ' , ' t ' , ' ' , ' U ' , ' t ' , ' i ' , ' l ' , ' i ' , ' t ' , ' y ' , 0 } ,
{ ' J ' , ' o ' , ' h ' , ' n ' , ' ' , ' D ' , ' o ' , ' e ' , 0 } ,
{ ' n ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , 0 } ,
{ ' 9 ' , ' 8 ' , ' 7 ' , ' 6 ' , ' 5 ' , ' 4 ' , ' 3 ' , ' 2 ' , ' 1 ' , ' 0 ' , 0 }
} ;
static char appNames [ 5 ] [ 56 ] =
{
{ ' \\ ' , ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' : ' , ' E ' , ' : ' , ' \\ ' , ' N ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , ' \\ ' , ' s ' , ' s ' , ' s ' , ' h ' , ' s ' , ' T ' , ' e ' , ' s ' , ' t ' , ' . ' , ' 0 ' , ' 1 ' , ' C ' , ' N ' , ' = ' , ' A ' , ' p ' , ' p ' , ' T ' , ' e ' , ' s ' , ' t ' , ' / ' , ' O ' , ' = ' , ' n ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , 0 } ,
{ ' \\ ' , ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' : ' , ' E ' , ' : ' , ' \\ ' , ' N ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , ' \\ ' , ' s ' , ' s ' , ' s ' , ' h ' , ' s ' , ' T ' , ' e ' , ' s ' , ' t ' , ' . ' , ' 0 ' , ' 2 ' , ' C ' , ' N ' , ' = ' , ' A ' , ' p ' , ' p ' , ' T ' , ' e ' , ' s ' , ' t ' , ' / ' , ' O ' , ' = ' , ' n ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , 0 } ,
{ ' \\ ' , ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' : ' , ' E ' , ' : ' , ' \\ ' , ' N ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , ' \\ ' , ' s ' , ' s ' , ' s ' , ' h ' , ' s ' , ' T ' , ' e ' , ' s ' , ' t ' , ' . ' , ' 0 ' , ' 3 ' , ' C ' , ' N ' , ' = ' , ' A ' , ' p ' , ' p ' , ' T ' , ' e ' , ' s ' , ' t ' , ' / ' , ' O ' , ' = ' , ' n ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , 0 } ,
{ ' \\ ' , ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' : ' , ' E ' , ' : ' , ' \\ ' , ' N ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , ' \\ ' , ' s ' , ' s ' , ' s ' , ' h ' , ' s ' , ' T ' , ' e ' , ' s ' , ' t ' , ' . ' , ' 0 ' , ' 4 ' , ' C ' , ' N ' , ' = ' , ' A ' , ' p ' , ' p ' , ' T ' , ' e ' , ' s ' , ' t ' , ' / ' , ' O ' , ' = ' , ' n ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , 0 } ,
{ ' \\ ' , ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' : ' , ' E ' , ' : ' , ' \\ ' , ' N ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , ' \\ ' , ' s ' , ' s ' , ' s ' , ' h ' , ' s ' , ' T ' , ' e ' , ' s ' , ' t ' , ' . ' , ' 0 ' , ' 5 ' , ' C ' , ' N ' , ' = ' , ' A ' , ' p ' , ' p ' , ' T ' , ' e ' , ' s ' , ' t ' , ' / ' , ' O ' , ' = ' , ' n ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , 0 }
} ;
static char credSetNames [ 5 ] [ 56 ] =
{
{ ' \\ ' , ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' : ' , ' E ' , ' : ' , ' \\ ' , ' N ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , ' \\ ' , ' s ' , ' s ' , ' s ' , ' h ' , ' s ' , ' T ' , ' e ' , ' s ' , ' t ' , ' . ' , ' 0 ' , ' 1 ' , ' C ' , ' N ' , ' = ' , ' C ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' t ' , ' / ' , ' O ' , ' = ' , ' n ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , 0 } ,
{ ' \\ ' , ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' : ' , ' E ' , ' : ' , ' \\ ' , ' N ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , ' \\ ' , ' s ' , ' s ' , ' s ' , ' h ' , ' s ' , ' T ' , ' e ' , ' s ' , ' t ' , ' . ' , ' 0 ' , ' 2 ' , ' C ' , ' N ' , ' = ' , ' C ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' t ' , ' / ' , ' O ' , ' = ' , ' n ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , 0 } ,
{ ' \\ ' , ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' : ' , ' E ' , ' : ' , ' \\ ' , ' N ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , ' \\ ' , ' s ' , ' s ' , ' s ' , ' h ' , ' s ' , ' T ' , ' e ' , ' s ' , ' t ' , ' . ' , ' 0 ' , ' 3 ' , ' C ' , ' N ' , ' = ' , ' C ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' t ' , ' / ' , ' O ' , ' = ' , ' n ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , 0 } ,
{ ' \\ ' , ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' : ' , ' E ' , ' : ' , ' \\ ' , ' N ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , ' \\ ' , ' s ' , ' s ' , ' s ' , ' h ' , ' s ' , ' T ' , ' e ' , ' s ' , ' t ' , ' . ' , ' 0 ' , ' 4 ' , ' C ' , ' N ' , ' = ' , ' C ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' t ' , ' / ' , ' O ' , ' = ' , ' n ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , 0 } ,
{ ' \\ ' , ' S ' , ' h ' , ' a ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' c ' , ' r ' , ' e ' , ' t ' , ' : ' , ' E ' , ' : ' , ' \\ ' , ' N ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , ' \\ ' , ' s ' , ' s ' , ' s ' , ' h ' , ' s ' , ' T ' , ' e ' , ' s ' , ' t ' , ' . ' , ' 0 ' , ' 5 ' , ' C ' , ' N ' , ' = ' , ' C ' , ' r ' , ' e ' , ' d ' , ' S ' , ' e ' , ' t ' , ' / ' , ' O ' , ' = ' , ' n ' , ' o ' , ' v ' , ' e ' , ' l ' , ' l ' , 0 }
} ;
int rcode = NSSCS_SUCCESS ;
int exCount = 1 , i , j , remLock = 0 , unlock = 0 ,
master = 0 , rCount = 1 ;
long opCount , bufSize = NSSCS_MAX_SECRET_BUF_LEN ;
unsigned long startTime , endTime , pFlag = 0L , count = 0 ;
int c ;
SSCS_SECRET_ID_T secretID = { 0 } ;
// SharedSecret data
void * secretHandle ; // handle for passing to functions
SSCS_SH_SECRET_ID_T shSecret ; // SharedSecret struct
char * key = NULL ;
unsigned char * value = NULL ;
int kLen = 0 ;
int vLen = 0 ;
SSCS_SH_SECRET_ID_LIST_T shSecIDList = { 0 } ;
SSCS_BASIC_CREDENTIAL credential = { 0 } ;
SSCS_SECRET_ID_T appSecretId = { 0 } ;
SSCS_SECRET_ID_T sharedSecretId = { 0 } ;
SSCS_EXT_T ext = { 0 } ;
// DWORD dwSize;
// TOKEN_STATISTICS tokenStats;
# ifdef WIN32
LUID luid ;
// HANDLE phUserToken;
ext . extID = 1 ;
luid . HighPart = 0 ;
luid . LowPart = 796691 ;
ext . ext = & luid ;
# endif
int retVal = 0 ;
SSCS_PASSCODE_T passcode ;
// STRING_PASSCODE myPasscode;
SSCS_PASSWORD_T myPasscode ;
strcpy ( myPasscode . pword , " TestPasscode " ) ;
myPasscode . pwordLen = strlen ( " TestPasscode " ) + 1 ;
myPasscode . pwordType = 1 ;
passcode . passcodeType = 1 ;
passcode . passcodeHandle = & myPasscode ;
//phUserToken = malloc(sizeof(HANDLE));
strcpy ( appSecretId . id , " AppSecretID " ) ;
appSecretId . len = 12 ;
strcpy ( sharedSecretId . id , " SharedSecretID " ) ;
sharedSecretId . len = 15 ;
/* ############################## CODE STARTS HERE ############################ */
if ( ( secret = ( char * ) malloc ( NSSCS_MAX_SECRET_BUF_LEN ) ) = = NULL )
{
printf ( " \n Secret Buffer Malloc Failed!!! \n " ) ;
exit ( - 1 ) ;
}
if ( ( value = ( unsigned char * ) malloc ( NSSCS_MAX_SECRET_BUF_LEN ) ) = = NULL )
{
printf ( " \n Value Buffer Malloc Failed!!! \n " ) ;
exit ( - 1 ) ;
}
if ( ( key = ( char * ) malloc ( NSSCS_MAX_SECRET_ID_LEN ) ) = = NULL )
{
printf ( " \n Key Buffer Malloc Failed!!! \n " ) ;
exit ( - 1 ) ;
}
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
memset ( secret , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
printf ( " \n SecretStore Client Service NDK Test Program version %s ... \n \n " , GSS_BLD_STR ) ;
// Initialize the SID to the user ID if the owner
strcpy ( ssid . ssName , " testuser " ) ;
ssid . version = NSSCS_VERSION_NUMBER ;
//** Process command-line arguments.
if ( argc > 1 )
{
while ( ( c = sss_GetOpt ( argc , argv , " bBmMsSc=C=?hH " ) ) ! = - 1 )
{
switch ( c )
{
case ' b ' :
case ' B ' :
/* Big secret buffer */
bufSize = NSSCS_MAX_SECRET_BUF_LEN ;
break ;
case ' m ' :
case ' M ' :
/* Medium secret buffer */
bufSize = NSSCS_MID_SECRET_BUF_LEN ;
break ;
case ' s ' :
case ' S ' :
/* set active flag to FALSE */
aFlag = 0 ;
printf ( " Silent Running Mode Active... \n " ) ;
break ;
case ' c ' :
case ' C ' :
/* Run count */
exCount = atoi ( optArg ) ;
break ;
default :
//* case '?':
//* case 'h':
//*case 'H':
printf ( " \n Usage: sshtst [/m]|[/b][/s /c=[count] /r=[rcount] | /? | /h ] \n " ) ;
printf ( " \t Options: [ /m | /M ] for 4k Secret Buffer Size. \n " ) ;
printf ( " \t Options: [ /b | /B ] for 59k Secret Buffer Size. \n " ) ;
printf ( " \t Options: [ /s | /S ] for Silent Running. \n " ) ;
printf ( " \t \t Silent sub-Option [ /c | /C ] for number of times to run. \n " ) ;
printf ( " \t Example: sshtst /s /c=1000 \n " ) ;
printf ( " \t Option: [ /h | /H | /? ] for Help. \n " ) ;
printf ( " \t No command line options will activate interactive running. \n \n " ) ;
printf ( " \t For options \" / \" and \" - \" are interchangable. \n \n " ) ;
exit ( 0 ) ;
}
}
}
else
{
printf ( " Full Interactive Running Mode Active... \n " ) ;
}
printf ( " Execution Count Set to: [%d] \n " , exCount ) ;
printf ( " Initializing... \n " ) ;
startTime = time ( NULL ) ;
printf ( " Done... \n " ) ;
Pause ( ) ;
if ( ( ssContext = miCASAOpenSecretStoreCache ( & ssid , 0 , NULL ) ) = = NULL )
{
rcode = NSSCS_E_CANT_OPEN_CLIENT_CACHE ;
printf ( " \n Cache Failed to Open!!! \n " ) ;
goto ERROR_1 ;
}
else
{
printf ( " \n Cache Opened... \n " ) ;
}
// retVal = miCASASetMasterPasscode(ssContext, &passcode, NULL);
/*
retVal = miCASASetMasterPasscode ( 0 , & passcode , NULL ) ;
if ( retVal ! = 0 )
printf ( " miCASASetMasterPasscode failed \n " ) ;
else
printf ( " miCASASetMasterPasscode succeeded \n " ) ;
*/
keyChainID . len = SSCS_S_KC_ID_CHARS ;
strcpy ( keyChainID . keychainID , SSCS_SESSION_KEY_CHAIN_ID ) ;
# ifdef NOT_IMPLEMENTED_YET
if ( rcode = miCASAGetStoreInformation ( ssContext , 0 , & ssInfo , NULL ) )
{
printf ( " \n miCASAGetStoreInformation Failed!!! \n " ) ;
goto ERROR_1 ;
}
if ( ssInfo . numKeyChains = = 0 )
{
//* Create a Keychain
if ( rcode = miCASAAddKeyChain ( ssContext , SSCS_S_KC_ID_F , & keyChainID , NULL ) )
{
printf ( " \n miCASAAddKeyChain Failed!!! \n " ) ;
goto ERROR_1 ;
}
}
# endif
//* Query the user to continue.
if ( aFlag )
{
printf ( " \n Do you want to CONTINUE (y/n)? " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( ! ( ( c = = ' y ' ) | | ( c = = ' Y ' ) ) )
{
aFlag = 0 ;
goto ERROR_1 ;
}
//* Query the user to continue.
if ( aFlag )
{
printf ( " \n Test New APIs (y/n)? " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( ( ( c = = ' y ' ) | | ( c = = ' Y ' ) ) )
{
printf ( " Testing new APIs \r \n " ) ;
credential . unFlags = USERNAME_TYPE_CN_F ;
strcpy ( ( char * ) credential . username , " SharedUsername " ) ;
strcpy ( ( char * ) credential . password , " SharedPassword " ) ;
/*
rcode = OpenThreadToken (
GetCurrentThread ( ) ,
TOKEN_QUERY | TOKEN_QUERY_SOURCE ,
TRUE ,
& phUserToken ) ;
if ( rcode = = 0 )
{
rcode = GetLastError ( ) ;
}
rcode = GetTokenInformation (
phUserToken ,
TokenStatistics ,
& tokenStats ,
dwSize ,
& dwSize ) ;
{
//NCXDebugPrintf2("[XTAGENT] GetTokenInformation for statistics returned LowPart 0x%X HighPart 0x%X\n", tokenStats.AuthenticationId.LowPart, tokenStats.AuthenticationId.HighPart);
printf ( " GetTokenInformation for statistics returned LowPart 0x%X HighPart 0x%X \n " , tokenStats . AuthenticationId . LowPart , tokenStats . AuthenticationId . HighPart ) ;
//*pLogonId = tokenStats.AuthenticationId;
}
*/
// sets the shared credential for this app
rcode = miCASASetCredential (
0 ,
& appSecretId , //char * appSecretID, // IN
& sharedSecretId , //char * sharedSecretID, // Optional IN
0 , //int * credentialType, // IN/OUT
& credential , //void * credential, // OUT
& ext //NULL //SSCS_EXT_T * ext // Reserved
) ;
credential . unFlags = USERNAME_TYPE_EMAIL_F ;
strcpy ( ( char * ) credential . username , " SharedUsername@novell.com " ) ;
strcpy ( ( char * ) credential . password , " SharedPassword " ) ;
// sets the shared credential for this app
rcode = miCASASetCredential (
0 ,
& appSecretId , //char * appSecretID, // IN
& sharedSecretId , //char * sharedSecretID, // Optional IN
0 , //int * credentialType, // IN/OUT
& credential , //void * credential, // OUT
NULL //SSCS_EXT_T * ext // Reserved
) ;
credential . unFlags = USERNAME_TYPE_LDAP_DN_F ;
strcpy ( ( char * ) credential . username , " cn=shareduser,o=novell " ) ;
strcpy ( ( char * ) credential . password , " SharedPassword " ) ;
// sets the shared credential for this app
rcode = miCASASetCredential (
0 ,
& appSecretId , //char * appSecretID, // IN
& sharedSecretId , //char * sharedSecretID, // Optional IN
0 , //int * credentialType, // IN/OUT
& credential , //void * credential, // OUT
NULL //SSCS_EXT_T * ext // Reserved
) ;
credential . unFlags = USERNAME_TYPE_NDS_DN_F ;
strcpy ( ( char * ) credential . username , " SharedUsername.novell " ) ;
strcpy ( ( char * ) credential . password , " SharedPassword " ) ;
// sets the shared credential for this app
rcode = miCASASetCredential (
0 ,
& appSecretId , //char * appSecretID, // IN
& sharedSecretId , //char * sharedSecretID, // Optional IN
0 , //int * credentialType, // IN/OUT
& credential , //void * credential, // OUT
NULL //SSCS_EXT_T * ext // Reserved
) ;
credential . unFlags = USERNAME_TYPE_OTHER_F ;
strcpy ( ( char * ) credential . username , " SharedUsernameOther " ) ;
strcpy ( ( char * ) credential . password , " SharedPassword " ) ;
// sets the shared credential for this app
rcode = miCASASetCredential (
0 ,
& appSecretId , //char * appSecretID, // IN
& sharedSecretId , //char * sharedSecretID, // Optional IN
0 , //int * credentialType, // IN/OUT
& credential , //void * credential, // OUT
NULL //SSCS_EXT_T * ext // Reserved
) ;
memset ( & credential , 0 , sizeof ( SSCS_BASIC_CREDENTIAL ) ) ;
strcpy ( ( char * ) credential . username , " AppUsername " ) ;
strcpy ( ( char * ) credential . password , " AppPassword " ) ;
// sets the secret specific to the app
rcode = miCASASetCredential (
0 ,
& appSecretId , //char * appSecretID, // IN
NULL , //char * sharedSecretID, // Optional IN
0 , //int * credentialType, // IN/OUT
& credential , //void * credential, // OUT
NULL //SSCS_EXT_T * ext // Reserved
) ;
memset ( & credential , 0 , sizeof ( SSCS_BASIC_CREDENTIAL ) ) ;
credential . unFlags = USERNAME_TYPE_NDS_DN_F ;
// gets the sharedcredential
rcode = miCASAGetCredential (
0 ,
& appSecretId , //char * appSecretID, // IN
& sharedSecretId , //char * sharedSecretID, // Optional IN
0 , //int * credentialType, // IN/OUT
& credential , //void * credential, // OUT
NULL //SSCS_EXT_T * ext // Reserved
) ;
printf ( " Credential for Shared: %s \r \n " , " SharedSecretID " ) ;
printf ( " Username: %s \r \n " , credential . username ) ;
printf ( " Password: %s \r \n " , credential . password ) ;
memset ( & credential , 0 , sizeof ( SSCS_BASIC_CREDENTIAL ) ) ;
// gets the specific credential
rcode = miCASAGetCredential (
0 ,
& appSecretId , //char * appSecretID, // IN
NULL , //char * sharedSecretID, // Optional IN
0 , //int * credentialType, // IN/OUT
& credential , //void * credential, // OUT
NULL //SSCS_EXT_T * ext // Reserved
) ;
printf ( " Credential for APP: %s \r \n " , " AppSecretID " ) ;
printf ( " Username: %s \r \n " , credential . username ) ;
printf ( " Password: %s \r \n " , credential . password ) ;
}
# if POORNA_TEST
//* Run the tests as many times as specified by the user.
for ( j = 0 , opCount = 0 ; j < exCount ; j + + )
{
# ifdef NOT_USED
// ***************************************************************************************
// run the CREATE Application SharedSecrets with an associated default Credential Set test
// ***************************************************************************************
if ( aFlag )
{
printf ( " \n Do you want to CREATE Application SharedSecrets with \n on associated default Credential Set(y/n)? " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( c = = ' y ' | | c = = ' Y ' )
{
appTstFlag = 1 ;
for ( i = 1 ; i < 6 ; i + + )
{
// STEP 1: create the APPLICATTION (SS_App)
// ***************************************
// create the ID here
shSecret . type = SSCS_APPLICATION_TYPE_F ;
strcpy ( shSecret . name , appNames [ i - 1 ] ) ;
shSecret . len = strlen ( shSecret . name ) + 1 ;
secretHandle = miCASA_CreateSHSHandle ( ) ; // create a new secretHandle
if ( ! secretHandle )
{
printf ( " \n \n FAILED to successfully create the secretHandle " ) ;
Pause ( ) ;
goto ERROR_1 ;
}
printf ( " \n Calling miCASAReadSecret \n " ) ;
rcode = miCASAReadSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , & rInfo , NULL ) ;
// if the SS_APP already exist go the the next step
if ( rcode ! = NSSCS_SUCCESS )
{
if ( ( rcode ! = NSSCS_E_STORE_NOT_FOUND ) & & ( rcode ! = NSSCS_E_INVALID_SECRET_ID ) )
{
printf ( " \n miCASAReadSecret returned [%d] when reading [%s] \n \n " , rcode , appNames [ i - 1 ] ) ;
Pause ( ) ;
goto ERROR_1 ;
}
else
{
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
// create the value here (value is the the Cred Set ID)
strcpy ( key , SSCS_CRED_SET ) ;
strcpy ( ( char * ) value , credSetNames [ i - 1 ] ) ;
vLen = ( strlen ( ( char * ) value ) + 1 ) * sizeof ( char ) ;
printf ( " \n Calling miCASA_AddSHSEntry \n " ) ;
if ( rcode = miCASA_AddSHSEntry ( secretHandle , key , vLen , value ) )
{
printf ( " \n \n miCASA_AddSHSEntry returned [%d] when adding \n [%s] and [%s] \n \n " , rcode , key , value ) ;
Pause ( ) ;
}
else
{
printf ( " \n Added [%s]:[%s] \n " , key , value ) ;
}
printf ( " \n Calling miCASAWriteSecret \n " ) ;
if ( rcode = miCASAWriteSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , NULL ) )
{
printf ( " \n miCASAWriteSecret returned [%d] when storing [%s]:[%s] \n to [%s] \n \n " , rcode , key , value , appNames [ i - 1 ] ) ;
Pause ( ) ;
goto ERROR_1 ;
}
else
{
printf ( " \n miCASAWriteSecret SUCCEEDED \n " ) ;
}
}
}
miCASA_DestroySHSHandle ( secretHandle ) ; // destroy the secretHandle
// create the CredSet Here
// **********************************************************
secretHandle = miCASA_CreateSHSHandle ( ) ; // create a new secretHandle
if ( ! secretHandle )
{
printf ( " \n \n FAILED to successfully create a valid secretHandle " ) ;
Pause ( ) ;
goto ERROR_1 ;
}
shSecret . type = SSCS_CREDENTIAL_TYPE_F ;
strcpy ( shSecret . name , credSetNames [ i - 1 ] ) ;
shSecret . len = strlen ( shSecret . name ) + 1 ;
printf ( " \n Calling miCASAReadSecret \n " ) ;
rcode = miCASAReadSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , & rInfo , NULL ) ;
if ( rcode ! = NSSCS_SUCCESS )
{
if ( ( rcode ! = NSSCS_E_STORE_NOT_FOUND ) & & ( rcode ! = NSSCS_E_INVALID_SECRET_ID ) )
{
printf ( " \n miCASAReadSecret returned [%d] when reading [%s] \n \n " , rcode , credSetNames [ i - 1 ] ) ;
Pause ( ) ;
goto ERROR_1 ;
}
else
{
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
// add user ID
strcpy ( key , userKey ) ;
strcpy ( ( char * ) value , userEntries [ i - 1 ] ) ;
vLen = ( strlen ( ( char * ) value ) + 1 ) * sizeof ( char ) ;
printf ( " \n Calling miCASA_AddSHSEntry \n " ) ;
if ( rcode = miCASA_AddSHSEntry ( secretHandle , key , vLen , value ) )
{
printf ( " \n miCASA_AddSHSEntry returned [%d] when adding \n [%s]:[%s] \n to [%s] \n \n " , rcode , key , value , credSetNames [ i - 1 ] ) ;
Pause ( ) ;
}
else
{
printf ( " \n Added [%s]=[%s] \n " , key , value ) ;
}
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
// add password
strcpy ( key , passwordKey ) ;
strcpy ( ( char * ) value , passwordEntries [ i - 1 ] ) ;
vLen = ( strlen ( ( char * ) value ) + 1 ) * sizeof ( char ) ;
printf ( " \n Calling miCASA_AddSHSEntry \n " ) ;
if ( rcode = miCASA_AddSHSEntry ( secretHandle , key , vLen , value ) )
{
printf ( " \n miCASA_AddSHSEntry returned [%d] when adding \n [%s]:[%s] \n to [%s] \n \n " , rcode , key , value , credSetNames [ i - 1 ] ) ;
Pause ( ) ;
}
else
{
printf ( " \n Added [%s]=[%s] \n " , key , value ) ;
}
printf ( " \n Calling miCASAWriteSecret \n " ) ;
if ( rcode = miCASAWriteSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , NULL ) )
{
printf ( " \n \n miCASAWriteSecret returned [%d] when storing \n [%s]:[%s] \n to [%s] \n \n " , rcode , key , value , credSetNames [ i - 1 ] ) ;
Pause ( ) ;
goto ERROR_1 ;
}
else
{
printf ( " \n miCASAWriteSecret SUCCEEDED \n " ) ;
}
}
}
miCASA_DestroySHSHandle ( secretHandle ) ; // destroy the secretHandle
}
}
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
if ( appTstFlag )
{
// ***********************************************
// run the READ the Application SharedSecrets test
// ***********************************************
if ( aFlag )
{
printf ( " \n Do you want to READ the Application SharedSecrets(y/n)? " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( c = = ' y ' | | c = = ' Y ' )
{
for ( i = 1 ; i < 6 ; i + + )
{
shSecret . type = SSCS_APPLICATION_TYPE_F ;
strcpy ( shSecret . name , appNames [ i - 1 ] ) ;
shSecret . len = strlen ( shSecret . name ) + 1 ;
secretHandle = miCASA_CreateSHSHandle ( ) ; // create a new secretHandle
if ( ! secretHandle )
{
printf ( " \n \n FAILED to successfully create a valid secretHandle " ) ;
Pause ( ) ;
goto ERROR_1 ;
}
printf ( " \n Calling miCASAReadSecret \n " ) ;
rcode = miCASAReadSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , & rInfo , NULL ) ;
if ( rcode ! = NSSCS_SUCCESS )
{
printf ( " \n miCASAReadSecret for SS_App returned [%d] when reading [%s] \n \n " , rcode , appNames [ i - 1 ] ) ;
Pause ( ) ;
goto ERROR_1 ;
}
printf ( " \n Calling miCASA_GetNextSHSEntry \n " ) ;
if ( ! ( rcode = miCASA_GetNextSHSEntry ( 1 , secretHandle , & kLen , key , & vLen , value ) ) )
{
do
{
if ( strlen ( key ) = = 0 )
{
break ;
}
strcpy ( secret , key ) ;
strcat ( secret , " : " ) ;
strcat ( secret , ( char * ) value ) ;
printf ( " \n miCASA_GetNextSHSEntry returned [%s]:[%s] \n " , key , value ) ;
// clear the buffers
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( secret , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
break ;
}
while ( rcode = = NSSCS_SUCCESS ) ;
}
miCASA_DestroySHSHandle ( secretHandle ) ; // destroy the secretHandle
// now lets read the CredSet
secretHandle = miCASA_CreateSHSHandle ( ) ; // create a new secretHandle
if ( ! secretHandle )
{
printf ( " \n \n FAILED to successfully create a valid secretHandle " ) ;
Pause ( ) ;
goto ERROR_1 ;
}
shSecret . type = SSCS_CREDENTIAL_TYPE_F ;
// put the SS_APP value that is the CredSet ID in the secret ID for read
strcpy ( shSecret . name , ( char * ) value ) ;
shSecret . len = strlen ( shSecret . name ) + 1 ;
rcode = miCASAReadSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , & rInfo , NULL ) ;
if ( rcode )
{
printf ( " \n miCASAReadSecret for SS_CredSets returned [%d] when reading [%s] \n \n " , rcode , credSetNames [ i - 1 ] ) ;
Pause ( ) ;
goto ERROR_1 ;
}
if ( ! ( rcode = miCASA_GetNextSHSEntry ( 1 , secretHandle , & kLen , key , & vLen , value ) ) )
{
do
{
if ( strlen ( key ) = = 0 )
{
break ;
}
printf ( " \n miCASA_GetNextSHSEntry returned [%s]=[%s] \n " , key , value ) ;
// clear the buffers
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
rcode = miCASA_GetNextSHSEntry ( 0 , secretHandle , & kLen , key , & vLen , value ) ;
}
while ( rcode = = NSSCS_SUCCESS ) ;
}
miCASA_DestroySHSHandle ( secretHandle ) ; // destroy the secretHandle
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////
// run the multiple CREATE Credential Sets for a single Application Secret SharedSecret test
////////////////////////////////////////////////////////////////////////////////////////////
if ( aFlag )
{
printf ( " \n Do you want to CREATE multiple Credential Secrets \n for a single Application Secret(y/n)? " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( c = = ' y ' | | c = = ' Y ' )
{
multiCredTstFlag = 1 ;
shSecret . type = SSCS_APPLICATION_TYPE_F ;
strcpy ( shSecret . name , multiCredApp ) ;
shSecret . len = strlen ( shSecret . name ) + 1 ;
secretHandle = miCASA_CreateSHSHandle ( ) ; // create a new secretHandle
if ( ! secretHandle )
{
printf ( " \n \n FAILED to successfully create a valid secretHandle " ) ;
Pause ( ) ;
goto ERROR_1 ;
}
printf ( " \n Calling miCASAReadSecret \n " ) ;
rcode = miCASAReadSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , & rInfo , NULL ) ;
if ( rcode ! = NSSCS_SUCCESS )
{
if ( ( rcode ! = NSSCS_E_STORE_NOT_FOUND ) & & ( rcode ! = NSSCS_E_INVALID_SECRET_ID ) )
{
printf ( " \n miCASAReadSecret returned [%d] when reading [%s] \n \n " , rcode , multiCredApp ) ;
Pause ( ) ;
goto ERROR_1 ;
}
else
{
for ( i = 1 ; i < 6 ; i + + )
{
strcpy ( key , SSCS_CRED_SET ) ;
strcpy ( ( char * ) value , credSetNames [ i - 1 ] ) ;
vLen = ( strlen ( ( char * ) value ) + 1 ) * sizeof ( char ) ;
printf ( " \n Calling miCASA_AddSHSEntry for [%s] \n " , multiCredApp ) ;
if ( rcode = miCASA_AddSHSEntry ( secretHandle , key , vLen , value ) )
{
printf ( " \n miCASA_AddSHSEntry returned [%d] when adding [%s]/[%s] \n to [%s] \n \n " , rcode , key , value , multiCredApp ) ;
Pause ( ) ;
}
else
{
printf ( " \n Added [%s]:[%s] \n " , key , value ) ;
}
}
}
}
printf ( " \n Calling miCASAWriteSecret \n " ) ;
if ( rcode = miCASAWriteSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , NULL ) )
{
printf ( " \n \n miCASAWriteSecret returned [%d] when storing data in \n [%s] \n \n " , rcode , multiCredApp ) ;
Pause ( ) ;
goto ERROR_1 ;
}
else
{
printf ( " \n miCASAWriteSecret SUCCEEDED \n " ) ;
}
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
miCASA_DestroySHSHandle ( secretHandle ) ; // destroy the secretHandle
}
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
if ( multiCredTstFlag )
{
/////////////////////////////////////////////////////////////////////////////////
// run the READ Credential Sets for a single Application Secret SharedSecret test
/////////////////////////////////////////////////////////////////////////////////
if ( aFlag )
{
printf ( " \n Do you want to READ the multiple Credential Secrets \n for a single Application Secret(y/n)? " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( c = = ' y ' | | c = = ' Y ' )
{
shSecret . type = SSCS_APPLICATION_TYPE_F ;
strcpy ( shSecret . name , multiCredApp ) ;
shSecret . len = strlen ( shSecret . name ) + 1 ;
secretHandle = miCASA_CreateSHSHandle ( ) ; // create a new secretHandle
if ( ! secretHandle )
{
printf ( " \n \n FAILED to successfully create a valid secretHandle " ) ;
Pause ( ) ;
goto ERROR_1 ;
}
printf ( " \n Calling miCASAReadSecret \n " ) ;
rcode = miCASAReadSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , & rInfo , NULL ) ;
if ( rcode ! = NSSCS_SUCCESS )
{
printf ( " \n miCASAReadSecret returned [%d] when reading [%s] \n \n " , rcode , multiCredApp ) ;
Pause ( ) ;
goto ERROR_1 ;
}
printf ( " \n Calling miCASAGetNextEntry \n " ) ;
if ( ! ( rcode = miCASA_GetNextSHSEntry ( 1 , secretHandle , & kLen , key , & vLen , value ) ) )
{
while ( rcode = = NSSCS_SUCCESS )
{
if ( 0 = = strlen ( key ) )
{
break ;
}
strcpy ( secret , key ) ;
strcat ( secret , " : " ) ;
strcat ( secret , ( char * ) value ) ;
printf ( " \n miCASA_GetNextSHSEntry returned [%s]:[%s] \n " , key , value ) ;
// clear the buffers
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
memset ( secret , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
rcode = miCASA_GetNextSHSEntry ( 0 , secretHandle , & kLen , key , & vLen , value ) ;
}
}
miCASA_DestroySHSHandle ( secretHandle ) ; // destroy the secretHandle
}
}
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
# endif
///////////////////////////////////////////////////////////////////
// run the CREATE multiple entries for a single Credential Set test
///////////////////////////////////////////////////////////////////
if ( aFlag )
{
printf ( " \n Do you want to CREATE multiple entries for a single Credential Set(y/n)? " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( c = = ' y ' | | c = = ' Y ' )
{
multiEntryTstFlag = 1 ;
shSecret . type = SSCS_CREDENTIAL_TYPE_F ;
strcpy ( shSecret . name , multiEntryCredSet ) ;
shSecret . len = strlen ( shSecret . name ) + 1 ;
secretHandle = miCASA_CreateSHSHandle ( ) ; // create a new secretHandle
if ( ! secretHandle )
{
goto ERROR_1 ;
}
printf ( " \n Calling miCASAReadSecret \n " ) ;
rcode = miCASAReadSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , & rInfo , NULL ) ;
if ( rcode ! = NSSCS_SUCCESS )
{
if ( ( rcode ! = NSSCS_E_STORE_NOT_FOUND ) & & ( rcode ! = NSSCS_E_INVALID_SECRET_ID ) )
{
printf ( " \n miCASAReadSecret returned [%d] when reading [%s] \n \n " , rcode , multiEntryCredSet ) ;
Pause ( ) ;
goto ERROR_1 ;
}
}
for ( i = 1 ; i < 6 ; i + + )
{
strcpy ( key , mKeyEntries [ i - 1 ] ) ;
strcpy ( ( char * ) value , mValEntries [ i - 1 ] ) ;
vLen = ( strlen ( ( char * ) value ) + 1 ) * sizeof ( char ) ;
printf ( " \n Calling miCASA_AddSHSEntry \n " ) ;
if ( ! ( rcode = miCASA_AddSHSEntry ( secretHandle , key , vLen , value ) ) )
{
printf ( " \n Added [%s]=[%s] \n " , key , value ) ;
}
else
{
printf ( " \n miCASA_AddSHSEntry returned [%d] when adding [%s]=[%s] \n \n " , rcode , key , value ) ;
Pause ( ) ;
}
}
printf ( " \n Calling miCASAWriteSecret \n " ) ;
if ( rcode = miCASAWriteSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , NULL ) )
{
printf ( " \n miCASAWriteSecret returned [%d] when storing \n [%s]:[%s] \n to [%s] \n \n " , rcode , key , value , multiEntryCredSet ) ;
Pause ( ) ;
goto ERROR_1 ;
}
else
{
printf ( " \n miCASAWriteSecret SUCCEEDED \n " ) ;
}
miCASA_DestroySHSHandle ( secretHandle ) ; // destroy the secretHandle
}
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
//if(multiEntryTstFlag)
if ( 1 )
{
/////////////////////////////////////////////////////////////
// READ the multiple entries in the single Credential Set test
/////////////////////////////////////////////////////////////
if ( aFlag )
{
printf ( " \n Do you want to READ the multiple entries in the single Credential Set(y/n)? " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( c = = ' y ' | | c = = ' Y ' )
{
shSecret . type = SSCS_CREDENTIAL_TYPE_F ;
strcpy ( shSecret . name , multiEntryCredSet ) ;
shSecret . len = strlen ( shSecret . name ) + 1 ;
secretHandle = miCASA_CreateSHSHandle ( ) ; // create a new secretHandle
if ( ! secretHandle )
{
goto ERROR_1 ;
}
printf ( " \n Calling miCASAReadSecret \n " ) ;
rcode = miCASAReadSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , & rInfo , NULL ) ;
if ( rcode ! = NSSCS_SUCCESS )
{
printf ( " \n miCASAReadSecret returned [%d] when reading [%s] \n \n " , rcode , multiEntryCredSet ) ;
Pause ( ) ;
goto ERROR_1 ;
}
printf ( " \n Calling miCASA_GetNextSHSEntry \n " ) ;
if ( ! ( rcode = miCASA_GetNextSHSEntry ( 1 , secretHandle , & kLen , key , & vLen , value ) ) )
{
while ( rcode = = NSSCS_SUCCESS )
{
if ( 0 = = strlen ( key ) )
{
break ;
}
strcpy ( secret , key ) ;
strcat ( secret , " = " ) ;
strcat ( secret , ( char * ) value ) ;
printf ( " \n miCASA_GetNextSHSEntry returned [%s]=[%s] \n \n " , key , value ) ;
// clear the buffers
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
memset ( secret , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
rcode = miCASA_GetNextSHSEntry ( 0 , secretHandle , & kLen , key , & vLen , value ) ;
}
}
miCASA_DestroySHSHandle ( secretHandle ) ; // destroy the secretHandle
}
}
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
// ***************************************************
// ********* Enumerting Secrets *********
// ***************************************************
printf ( " \n Enumerating the Secrets .... " ) ;
shSecIDList . enumHandle = 1 ;
shSecIDList . returnedIDs = 5 ;
shSecIDList . secIDList = ( SSCS_SH_SECRET_ID_T * ) malloc ( 5 * sizeof ( SSCS_SH_SECRET_ID_T ) ) ;
if ( shSecIDList . secIDList )
{
memset ( shSecIDList . secIDList , 0 , 5 * sizeof ( SSCS_SH_SECRET_ID_T ) ) ;
do
{
if ( ( rcode = miCASAEnumerateSecretIDs ( ssContext , & keyChainID , 0 , NULL , & shSecIDList , NULL ) ) = = NSSCS_SUCCESS )
{
for ( i = 0 ; i < ( int ) shSecIDList . returnedIDs ; i + + )
{
if ( shSecIDList . secIDList [ i ] . type & SSCS_APPLICATION_TYPE_F )
{
printf ( " \n SS_App: SecretID type .... " ) ;
}
else if ( shSecIDList . secIDList [ i ] . type & SSCS_CREDENTIAL_TYPE_F )
{
printf ( " \n SS_CredSet: SecretID type .... " ) ;
}
else if ( shSecIDList . secIDList [ i ] . type & SSCS_BINARY_TYPE_F )
{
printf ( " \n SS_Binary: SecretID type .... " ) ;
}
else
{
printf ( " \n Unsupported SecretID type .... " ) ;
}
printf ( " \n Length of the SecretID [%ld] \n " , shSecIDList . secIDList [ i ] . len ) ;
printf ( " SecretID [%s] \n " , shSecIDList . secIDList [ i ] . name ) ;
}
}
else
{
// resize the array based on the count returned because the cache engine below
// does not support iterations
if ( rcode = = NSSCS_E_ENUM_BUFF_TOO_SHORT )
{
shSecIDList . enumHandle = 1 ;
free ( shSecIDList . secIDList ) ;
shSecIDList . secIDList = ( SSCS_SH_SECRET_ID_T * ) malloc ( shSecIDList . returnedIDs * sizeof ( SSCS_SH_SECRET_ID_T ) ) ;
}
if ( ( rcode = miCASAEnumerateSecretIDs ( ssContext , & keyChainID , 0 , NULL , & shSecIDList , NULL ) ) = = NSSCS_SUCCESS )
{
for ( i = 0 ; i < ( int ) shSecIDList . returnedIDs ; i + + )
{
if ( shSecIDList . secIDList [ i ] . type & SSCS_APPLICATION_TYPE_F )
{
printf ( " \n SS_App: SecretID type .... " ) ;
}
else if ( shSecIDList . secIDList [ i ] . type & SSCS_CREDENTIAL_TYPE_F )
{
printf ( " \n SS_CredSet: SecretID type .... " ) ;
}
else if ( shSecIDList . secIDList [ i ] . type & SSCS_BINARY_TYPE_F )
{
printf ( " \n SS_Binary: SecretID type .... " ) ;
}
else
{
printf ( " \n Unsupported SecretID type .... " ) ;
}
printf ( " \n Length of the SecretID [%ld] \n " , shSecIDList . secIDList [ i ] . len ) ;
printf ( " SecretID [%s] \n " , shSecIDList . secIDList [ i ] . name ) ;
}
}
}
}
while ( shSecIDList . enumHandle ) ;
}
else
{
printf ( " \n Enum Malloc fialed .... " ) ;
}
if ( multiEntryTstFlag )
{
///////////////////////////////////////////////////////////////////////////
// run the REMOVE the multiple entries from the single Credential Set test
///////////////////////////////////////////////////////////////////////////
if ( aFlag )
{
printf ( " \n Do you want to REMOVE the multiple entries from the single Credential Set(y/n)? " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( c = = ' y ' | | c = = ' Y ' )
{
shSecret . type = SSCS_CREDENTIAL_TYPE_F ;
strcpy ( shSecret . name , multiEntryCredSet ) ;
shSecret . len = strlen ( shSecret . name ) + 1 ;
secretHandle = miCASA_CreateSHSHandle ( ) ; // create a new secretHandle
if ( ! secretHandle )
{
goto ERROR_1 ;
}
printf ( " \n Calling miCASAReadSecret \n " ) ;
rcode = miCASAReadSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , & rInfo , NULL ) ;
if ( rcode ! = NSSCS_SUCCESS )
{
if ( ( rcode ! = NSSCS_E_STORE_NOT_FOUND ) & & ( rcode ! = NSSCS_E_INVALID_SECRET_ID ) )
{
printf ( " \n miCASAReadSecret returned [%d] when reading [%s] \n \n " , rcode , multiEntryCredSet ) ;
Pause ( ) ;
goto ERROR_1 ;
}
}
// Remove only the entries we added.
for ( i = 1 ; i < 6 ; i + + )
{
strcpy ( key , mKeyEntries [ i - 1 ] ) ;
strcpy ( ( char * ) value , mValEntries [ i - 1 ] ) ;
strcpy ( shSecret . name , multiEntryCredSet ) ;
shSecret . len = strlen ( shSecret . name ) + 1 ;
kLen = strlen ( key ) + 1 ;
vLen = ( strlen ( ( char * ) value ) + 1 ) * sizeof ( char ) ;
printf ( " \n Calling miCASA_RemoveSHSEntry \n " ) ;
if ( ! ( rcode = miCASA_RemoveSHSEntry ( secretHandle , key , vLen , value ) ) )
{
printf ( " Removed [%s]=[%s] \n " , key , value ) ;
}
else
{
printf ( " FAILED to remove [%s]:[%s] \n from [%s] \n \n " , key , value , multiEntryCredSet ) ;
}
// clear the buffers
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
}
printf ( " \n Calling miCASAWriteSecret \n " ) ;
if ( rcode = miCASAWriteSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , NULL ) )
{
printf ( " \n miCASAWriteSecret returned [%d] when storing data in \n [%s] \n \n " , rcode , multiEntryCredSet ) ;
Pause ( ) ;
goto ERROR_1 ;
}
else
{
printf ( " \n miCASAWriteSecret SUCCEEDED \n " ) ;
}
rcode = miCASA_DestroySHSHandle ( secretHandle ) ;
}
}
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
if ( multiCredTstFlag )
{
///////////////////////////////////////////////////////////////////////////////////////////
// run the REMOVE the multiple Credential Sets from the single Application Test Secret test
///////////////////////////////////////////////////////////////////////////////////////////
if ( aFlag )
{
printf ( " \n Do you want to REMOVE the multiple Credential Sets \n from the single Application Test Secret(y/n)? " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( c = = ' y ' | | c = = ' Y ' )
{
// Remove only the Cred Sets we added.
strcpy ( shSecret . name , multiCredApp ) ;
shSecret . len = strlen ( shSecret . name ) + 1 ;
shSecret . type = SSCS_APPLICATION_TYPE_F ;
strcpy ( key , SSCS_CRED_SET ) ;
secretHandle = miCASA_CreateSHSHandle ( ) ; // create a new secretHandle
if ( ! secretHandle )
{
goto ERROR_1 ;
}
printf ( " \n Calling miCASAReadSecret \n " ) ;
rcode = miCASAReadSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , & rInfo , NULL ) ;
if ( rcode ! = NSSCS_SUCCESS )
{
if ( ( rcode ! = NSSCS_E_STORE_NOT_FOUND ) & & ( rcode ! = NSSCS_E_INVALID_SECRET_ID ) )
{
printf ( " \n miCASAReadSecret returned [%d] when reading [%s] \n \n " , rcode , multiCredApp ) ;
Pause ( ) ;
goto ERROR_1 ;
}
}
for ( i = 1 ; i < 6 ; i + + )
{
strcpy ( ( char * ) value , credSetNames [ i - 1 ] ) ;
printf ( " \n Calling miCASA_RemoveSHSEntry \n " ) ;
kLen = strlen ( key ) + 1 ;
vLen = ( strlen ( ( char * ) value ) + 1 ) * sizeof ( char ) ;
if ( ! ( rcode = miCASA_RemoveSHSEntry ( secretHandle , key , vLen , value ) ) )
{
printf ( " \n Removed [%s]:[%s] \n " , key , value ) ;
}
else
{
printf ( " \n miCASA_RemoveSHSEntry returned [%d] when removing [%s]:[%s] from [%s] \n \n " , rcode , key , value , credSetNames [ i - 1 ] ) ;
}
}
// clear the buffers
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
printf ( " \n Calling miCASAWriteSecret \n " ) ;
if ( rcode = miCASAWriteSecret ( ssContext , & keyChainID , 0 , secretHandle , & shSecret , NULL , NULL ) )
{
printf ( " \n miCASAWriteSecret returned [%d] when storing data in \n [%s] \n \n " , rcode , multiCredApp ) ;
Pause ( ) ;
goto ERROR_1 ;
}
else
{
printf ( " \n miCASAWriteSecret SUCCEEDED \n " ) ;
}
rcode = miCASA_DestroySHSHandle ( secretHandle ) ;
}
}
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
if ( multiCredTstFlag )
{
//////////////////////////////////////////////////////
// run the REMOVE the Credential Set Test Secrets test
//////////////////////////////////////////////////////
if ( aFlag )
{
printf ( " \n Do you want to REMOVE the Credential Set Test Secrets(y/n)? \n " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( c = = ' y ' | | c = = ' Y ' )
{
for ( i = 1 ; i < 6 ; i + + )
{
strcpy ( shSecret . name , credSetNames [ i - 1 ] ) ;
shSecret . type = SSCS_CREDENTIAL_TYPE_F ;
// remove one secret at a time
if ( rcode = miCASARemoveSecret ( ssContext , & keyChainID , 0 , & shSecret , NULL , NULL ) )
{
printf ( " miCASARemoveSharedSecret returned [%d] when removing [%s] \n \n " , rcode , shSecret . name ) ;
Pause ( ) ;
}
else
{
printf ( " \n Removed [%s] \n " , credSetNames [ i - 1 ] ) ;
}
memset ( shSecret . name , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
}
}
}
if ( appTstFlag )
{
///////////////////////////////////////////////////
// run the REMOVE the Application Test Secrets test
///////////////////////////////////////////////////
if ( aFlag )
{
printf ( " \n Do you want to REMOVE the Application Test Secrets(y/n)? " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( c = = ' y ' | | c = = ' Y ' )
{
// Remove only the Application SharedSecrets we added.
for ( i = 1 ; i < 6 ; i + + )
{
strcpy ( shSecret . name , appNames [ i - 1 ] ) ;
shSecret . type = SSCS_APPLICATION_TYPE_F ;
// remove one secret at a time
if ( rcode = miCASARemoveSecret ( ssContext , & keyChainID , 0 , & shSecret , NULL , NULL ) )
{
printf ( " miCASARemoveSharedSecret returned [%d] when removing [%s] \n \n " , rcode , shSecret . name ) ;
Pause ( ) ;
}
else
{
printf ( " \n Removed [%s] \n " , appNames [ i - 1 ] ) ;
}
memset ( shSecret . name , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
}
}
}
if ( appTstFlag )
{
///////////////////////////////////////////////////////////////
// run the REMOVE the multiple CredSet Application Test Secret
///////////////////////////////////////////////////////////////
if ( aFlag )
{
printf ( " \n Do you want to REMOVE the multiple CredSet Application Test Secret(y/n)? \n " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( c = = ' y ' | | c = = ' Y ' )
{
strcpy ( shSecret . name , multiCredApp ) ;
shSecret . type = SSCS_APPLICATION_TYPE_F ;
// remove one secret at a time
if ( rcode = miCASARemoveSecret ( ssContext , & keyChainID , 0 , & shSecret , NULL , NULL ) )
{
printf ( " miCASARemoveSharedSecret returned [%d] when removing [%s] \n \n " , rcode , shSecret . name ) ;
Pause ( ) ;
}
else
{
printf ( " \n Removed [%s] \n " , multiCredApp ) ;
}
memset ( shSecret . name , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
}
}
if ( multiEntryTstFlag )
{
/////////////////////////////////////////////////////////////
// run the REMOVE the multiple entry Application Test Secret
/////////////////////////////////////////////////////////////
if ( aFlag )
{
printf ( " \n Do you want to REMOVE the multiple entry Application Test Secret(y/n)? \n " ) ;
c = getch ( ) ;
putchar ( c ) ;
printf ( " \n \n " ) ;
}
else
{
c = ' y ' ;
}
if ( c = = ' y ' | | c = = ' Y ' )
{
strcpy ( shSecret . name , multiEntryCredSet ) ;
shSecret . type = SSCS_CREDENTIAL_TYPE_F ;
// remove one secret at a time
if ( rcode = miCASARemoveSecret ( ssContext , & keyChainID , 0 , & shSecret , NULL , NULL ) )
{
printf ( " miCASARemoveSharedSecret returned [%d] when removing [%s] \n \n " , rcode , shSecret . name ) ;
Pause ( ) ;
}
else
{
printf ( " \n Removed [%s] \n " , multiEntryCredSet ) ;
}
memset ( shSecret . name , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
}
}
opCount + + ;
printf ( " \n \n \n " ) ;
printf ( " NUMBER OF THE LOOPS = %d \n " , j + 1 ) ;
printf ( " NUMBER OF OPERATIONS COMPLETED = %d \n " , opCount ) ;
} /* end for */
endTime = time ( NULL ) ;
printf ( " ELAPSED TIME IN SECONDS = [%ld] \n \n " , ( endTime - startTime ) ) ;
# endif
/* ########################## CODE EXITS HERE ##################### */
ERROR_1 :
if ( secret )
{
memset ( secret , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
free ( secret ) ;
}
if ( value )
{
memset ( value , 0 , NSSCS_MAX_SECRET_BUF_LEN ) ;
free ( value ) ;
}
if ( key )
{
memset ( key , 0 , NSSCS_MAX_SECRET_ID_LEN ) ;
free ( key ) ;
}
if ( ssContext )
{
rcode = miCASACloseSecretStoreCache ( ssContext , 0 , NULL ) ;
}
if ( shSecIDList . secIDList )
{
free ( shSecIDList . secIDList ) ;
}
Pause ( ) ;
exit ( rcode ) ;
/* ########################## CODE ENDS HERE ##################### */
}