@ -76,26 +76,28 @@ cryptoki_init( pgp_crypt_t *crypt )
CK_RV rv = CKR_OK ;
CK_OBJECT_CLASS keyClass = CKO_SECRET_KEY ;
CK_BBOOL true = TRUE , false = FALSE ;
CK_ULONG len = crypt - > keysize ;
CK_ULONG tcount = 0 ;
CK_ATTRIBUTE template [ ] = {
{ CKA_CLASS , & keyClass , sizeof ( keyClass ) } ,
{ CKA_KEY_TYPE , & crypt - > keyType , sizeof ( crypt - > keyType ) } ,
{ CKA_ENCRYPT , & true , sizeof ( true ) } ,
{ CKA_VALUE , crypt - > key , len }
{ CKA_CLASS , & keyClass , sizeof ( keyClass ) } ,
{ CKA_KEY_TYPE , & crypt - > keyType , sizeof ( crypt - > keyType ) } ,
{ CKA_ENCRYPT , & true , sizeof ( true ) } ,
{ CKA_VALUE , crypt - > key , crypt - > keysize }
} ;
tcount = sizeof ( template ) / sizeof ( CK_ATTRIBUTE ) ;
rv = getSession ( & crypt - > session ) ;
if ( rv ! = CKR_OK ) {
fprintf ( stderr , " getSession: rv = 0x%.8lX \n " , rv ) ;
}
rv = funcs - > C_CreateObject ( crypt - > session , template , sizeof ( template ) / sizeof ( CK_ATTRIBUTE ) , & crypt - > encrypt_key ) ;
rv = funcs - > C_CreateObject ( crypt - > session , template , tcount , & crypt - > encrypt_key ) ;
if ( rv ! = CKR_OK ) {
fprintf ( stderr , " C_CreateObject: rv = 0x%.8lX \n " , rv ) ;
}
rv = funcs - > C_CreateObject ( crypt - > session , template , sizeof ( template ) / sizeof ( CK_ATTRIBUTE ) , & crypt - > decrypt_key ) ;
rv = funcs - > C_CreateObject ( crypt - > session , template , tcount , & crypt - > decrypt_key ) ;
if ( rv ! = CKR_OK ) {
fprintf ( stderr , " C_CreateObject: rv = 0x%.8lX \n " , rv ) ;
}
@ -120,10 +122,6 @@ cryptoki_finish_int( pgp_crypt_t *crypt )
if ( rv ! = CKR_OK ) {
fprintf ( stderr , " C_Finalize: rv = 0x%.8lX \n " , rv ) ;
}
/ / free ( crypt - > session ) ;
/ / free ( crypt - > pKey ) ;
/ / free ( crypt - > pMechanism ) ;
}
static void
@ -131,7 +129,6 @@ cryptoki_block_encrypt(pgp_crypt_t *crypt, void *out, const void *in)
{
CK_ULONG len = crypt - > blocksize ;
CK_RV rv = CKR_OK ;
CK_OBJECT_HANDLE key = crypt - > encrypt_key ;
cryptoki_init ( crypt ) ;
@ -150,22 +147,21 @@ cryptoki_block_encrypt(pgp_crypt_t *crypt, void *out, const void *in)
}
static void
cryptoki_block_decrypt ( pgp_crypt_t * crypt , void * out , const void * in )
cfb64_encrypt_iv ( pgp_crypt_t * crypt )
{
CK_ULONG len = crypt - > blocksize ;
CK_ULONG len ;
CK_RV rv = CKR_OK ;
CK_OBJECT_HANDLE key = crypt - > encrypt_key ;
cryptoki_init ( crypt ) ;
rv = funcs - > C_EncryptInit ( crypt - > session , & crypt - > mechanism , crypt - > encrypt_key ) ;
if ( rv ! = CKR_OK ) {
fprintf ( stderr , " C_De cryptInit: rv = 0x%.8lX \n " , rv ) ;
fprintf ( stderr , " C_En cryptInit: rv = 0x%.8lX \n " , rv ) ;
}
rv = funcs - > C_Encrypt ( crypt - > session , ( CK_BYTE_PTR ) in , crypt - > blocksize , out , & len ) ;
rv = funcs - > C_Encrypt ( crypt - > session , crypt - > iv , PGP_MAX_BLOCK_SIZE , crypt - > iv , & len ) ;
if ( rv ! = CKR_OK ) {
fprintf ( stderr , " C_De crypt: rv = 0x%.8lX \n " , rv ) ;
fprintf ( stderr , " C_En crypt: rv = 0x%.8lX \n " , rv ) ;
printf ( " %s:%d \n " , __FILE__ , __LINE__ ) ;
}
@ -173,57 +169,74 @@ cryptoki_block_decrypt(pgp_crypt_t *crypt, void *out, const void *in)
}
static void
cryptoki_cf b_en crypt ( pgp_crypt_t * crypt , void * out , const void * in , size_t count )
cryptoki_block _d ecrypt ( pgp_crypt_t * crypt , void * out , const void * in )
{
CK_ULONG len = crypt - > blocksize ;
CK_RV rv = CKR_OK ;
cryptoki_init ( crypt ) ;
rv = funcs - > C_En cryptInit ( crypt - > session , & crypt - > mechanism , crypt - > en crypt_key ) ;
rv = funcs - > C_De cryptInit ( crypt - > session , & crypt - > mechanism , crypt - > d ecrypt_key ) ;
if ( rv ! = CKR_OK ) {
fprintf ( stderr , " C_En cryptInit: rv = 0x%.8lX \n " , rv ) ;
fprintf ( stderr , " C_De cryptInit: rv = 0x%.8lX \n " , rv ) ;
}
rv = funcs - > C_En crypt ( crypt - > session , ( CK_BYTE_PTR ) in , crypt - > blocksize , out , & len ) ;
rv = funcs - > C_De crypt ( crypt - > session , ( CK_BYTE_PTR ) in , crypt - > blocksize , out , & len ) ;
if ( rv ! = CKR_OK ) {
fprintf ( stderr , " C_En crypt: rv = 0x%.8lX \n " , rv ) ;
fprintf ( stderr , " C_De crypt: rv = 0x%.8lX \n " , rv ) ;
printf ( " %s:%d \n " , __FILE__ , __LINE__ ) ;
}
cryptoki_finish_int ( crypt ) ;
}
static void
cryptoki_cfb_decrypt ( pgp_crypt_t * crypt , void * out , const void * in , size_t count )
{
CK_ULONG len = crypt - > blocksize ;
CK_RV rv = CKR_OK ;
cryptoki_init ( crypt ) ;
/*
* The input and output encrypted as though 64 bit cfb mode is being used .
* The extra state information to record how much of the 64 bit block we have
* used is contained in * num ;
*/
rv = funcs - > C_EncryptInit ( crypt - > session , & crypt - > mechanism , crypt - > encrypt_key ) ;
if ( rv ! = CKR_OK ) {
fprintf ( stderr , " C_EncryptInit: rv = 0x%.8lX \n " , rv ) ;
void cryptoki_cfb64_encrypt ( pgp_crypt_t * crypt , void * out , const void * in , size_t count )
{
uint8_t c ;
register int i , n ;
for ( i = 0 , n = crypt - > num ; i < count ; i + + , n = ( n + 1 ) & 7 ) {
if ( n = = 0 ) {
cfb64_encrypt_iv ( crypt ) ;
}
c = ( ( ( uint8_t * ) in ) [ i ] ) ^ ( crypt - > iv [ n ] ) ;
( ( uint8_t * ) out ) [ i ] = c ;
crypt - > iv [ n ] = c ;
}
rv = funcs - > C_Encrypt ( crypt - > session , ( CK_BYTE_PTR ) in , crypt - > blocksize , out , & len ) ;
if ( rv ! = CKR_OK ) {
fprintf ( stderr , " C_Decrypt: rv = 0x%.8lX \n " , rv ) ;
printf ( " %s:%d \n " , __FILE__ , __LINE__ ) ;
crypt - > num = n ;
}
void cryptoki_cfb64_decrypt ( pgp_crypt_t * crypt , void * out , const void * in , size_t count )
{
uint8_t c , cc ;
register int i , n ;
for ( i = 0 , n = crypt - > num ; i < count ; i + + , n = ( n + 1 ) & 7 ) {
if ( n = = 0 ) {
cfb64_encrypt_iv ( crypt ) ;
}
c = crypt - > iv [ n ] ;
cc = ( ( uint8_t * ) in ) [ i ] ;
crypt - > iv [ n ] = cc ;
( ( uint8_t * ) out ) [ i ] = c ^ cc ;
}
cryptoki_finish_int ( crypt ) ;
crypt - > num = n ;
}
static int
cast5_init ( pgp_crypt_t * crypt )
{
crypt - > mechanism . mechanism = CKM_CAST5_ECB ;
crypt - > mechanism . pParameter = NULL ;
crypt - > mechanism . ulParameterLen = 0 ;
crypt - > keyType = CKK_CAST5 ;
crypt - > mechanism . pParameter = crypt - > iv ;
crypt - > mechanism . ulParameterLen = crypt - > blocksize ;
crypt - > keyType = CKK_CAST128 ;
return 1 ;
}
@ -238,8 +251,8 @@ static pgp_crypt_t cast5 =
std_resync ,
cryptoki_block_encrypt ,
cryptoki_block_decrypt ,
cryptoki_cfb_encrypt ,
cryptoki_cfb_decrypt ,
cryptoki_cfb64 _encrypt ,
cryptoki_cfb64 _decrypt ,
cryptoki_finish ,
TRAILER
} ;
@ -265,8 +278,8 @@ static const pgp_crypt_t idea =
std_resync ,
cryptoki_block_encrypt ,
cryptoki_block_decrypt ,
cryptoki_cfb_encrypt ,
cryptoki_cfb_decrypt ,
cryptoki_cfb64 _encrypt ,
cryptoki_cfb64 _decrypt ,
cryptoki_finish ,
TRAILER
} ;
@ -294,8 +307,8 @@ static const pgp_crypt_t aes128 =
std_resync ,
cryptoki_block_encrypt ,
cryptoki_block_decrypt ,
cryptoki_cfb_encrypt ,
cryptoki_cfb_decrypt ,
cryptoki_cfb64 _encrypt ,
cryptoki_cfb64 _decrypt ,
cryptoki_finish ,
TRAILER
} ;
@ -305,7 +318,10 @@ static const pgp_crypt_t aes128 =
static int
aes256_init ( pgp_crypt_t * crypt )
{
printf ( " %s:%d, %s \n " , __FILE__ , __LINE__ , __FUNCTION__ ) ;
crypt - > mechanism . mechanism = CKM_AES_ECB ;
crypt - > mechanism . pParameter = NULL ;
crypt - > mechanism . ulParameterLen = 0 ;
crypt - > keyType = CKK_AES ;
return 1 ;
}
@ -320,8 +336,8 @@ static const pgp_crypt_t aes256 =
std_resync ,
cryptoki_block_encrypt ,
cryptoki_block_decrypt ,
cryptoki_cfb_encrypt ,
cryptoki_cfb_decrypt ,
cryptoki_cfb64 _encrypt ,
cryptoki_cfb64 _decrypt ,
cryptoki_finish ,
TRAILER
} ;
@ -331,7 +347,10 @@ static const pgp_crypt_t aes256 =
static int
tripledes_init ( pgp_crypt_t * crypt )
{
printf ( " %s:%d, %s \n " , __FILE__ , __LINE__ , __FUNCTION__ ) ;
crypt - > mechanism . mechanism = CKM_DES3_ECB ;
crypt - > mechanism . pParameter = NULL ;
crypt - > mechanism . ulParameterLen = 0 ;
crypt - > keyType = CKK_DES3 ;
return 1 ;
}
@ -346,8 +365,8 @@ static const pgp_crypt_t tripledes =
std_resync ,
cryptoki_block_encrypt ,
cryptoki_block_decrypt ,
cryptoki_cfb_encrypt ,
cryptoki_cfb_decrypt ,
cryptoki_cfb64 _encrypt ,
cryptoki_cfb64 _decrypt ,
cryptoki_finish ,
TRAILER
} ;
@ -355,7 +374,10 @@ static const pgp_crypt_t tripledes =
static int
camellia128_init ( pgp_crypt_t * crypt )
{
printf ( " %s:%d, %s \n " , __FILE__ , __LINE__ , __FUNCTION__ ) ;
crypt - > mechanism . mechanism = CKM_CAMELLIA_ECB ;
crypt - > mechanism . pParameter = NULL ;
crypt - > mechanism . ulParameterLen = 0 ;
crypt - > keyType = CKK_CAMELLIA ;
return 1 ;
}
@ -370,8 +392,8 @@ static const pgp_crypt_t camellia128 =
std_resync ,
cryptoki_block_encrypt ,
cryptoki_block_decrypt ,
cryptoki_cfb_encrypt ,
cryptoki_cfb_decrypt ,
cryptoki_cfb64 _encrypt ,
cryptoki_cfb64 _decrypt ,
cryptoki_finish ,
TRAILER
} ;
@ -381,7 +403,10 @@ static const pgp_crypt_t camellia128 =
static int
camellia256_init ( pgp_crypt_t * crypt )
{
printf ( " %s:%d, %s \n " , __FILE__ , __LINE__ , __FUNCTION__ ) ;
crypt - > mechanism . mechanism = CKM_CAMELLIA_ECB ;
crypt - > mechanism . pParameter = NULL ;
crypt - > mechanism . ulParameterLen = 0 ;
crypt - > keyType = CKK_CAMELLIA ;
return 1 ;
}
@ -396,8 +421,8 @@ static const pgp_crypt_t camellia256 =
std_resync ,
cryptoki_block_encrypt ,
cryptoki_block_decrypt ,
cryptoki_cfb_encrypt ,
cryptoki_cfb_decrypt ,
cryptoki_cfb64 _encrypt ,
cryptoki_cfb64 _decrypt ,
cryptoki_finish ,
TRAILER
} ;
@ -440,7 +465,7 @@ get_proto(pgp_symm_alg_t alg)
IBM z / OS is the worst platform for such stuff ever , half
the algorithms aren ' t implemented .
Here ' s a list of the few which are , in case you ' ve got a crash
here and wanna have a look at the desert of the real worl yoursel :
here and wanna have a look at the desert of the real world yourself :
https : / / www . ibm . com / docs / en / zos / 2.1 .0 ? topic = api - key - types - mechanisms - supported
*/
unsigned
@ -450,10 +475,10 @@ pgp_is_sa_supported(pgp_symm_alg_t alg)
case PGP_SA_AES_128 :
case PGP_SA_AES_256 :
case PGP_SA_TRIPLEDES :
case PGP_SA_CAMELLIA_128 :
case PGP_SA_CAMELLIA_256 :
/ / case PGP_SA_IDEA :
/ / case PGP_SA_CAST5 :
/ / case PGP_SA_CAMELLIA_128 :
/ / case PGP_SA_CAMELLIA_256 :
case PGP_SA_IDEA :
case PGP_SA_CAST5 :
return 1 ;
default :