@ -328,6 +328,50 @@ get_otp_key(unsigned privatedo, unsigned char *buffer, size_t len)
return e ;
}
static gpg_error_t
get_serial_cb ( void * arg , const char * line )
{
char * serial = ( char * ) arg ;
if ( ! strncmp ( " SERIALNO " , line , 9 ) ) {
strcpy ( serial , line + 9 ) ;
return GPG_ERR_NO_ERROR ;
}
else
return GPG_ERR_NO_DATA ;
}
static gpg_error_t
verify_pin ( int admin )
{
assuan_context_t ctx ;
gpg_error_t e ;
char command [ 64 ] , serial [ 64 ] ;
char * line ;
size_t len ;
if ( ! ( e = connect_to_agent ( & ctx ) ) ) {
if ( ! ( e = init_agent_environment ( ctx ) ) ) {
if ( ! ( e = assuan_transact ( ctx , " SCD GETATTR SERIALNO " ,
NULL , NULL , NULL , NULL , get_serial_cb , serial ) ) ) {
snprintf ( command , sizeof ( command ) , " SCD CHECKPIN %s%s " ,
serial , admin ? " [CHV3] " : " " ) ;
e = assuan_transact ( ctx , command , NULL , NULL , NULL , NULL ,
NULL , NULL ) ;
}
}
assuan_release ( ctx ) ;
}
return e ;
}
static void
print_otp ( unsigned otp , unsigned digits )
{
@ -432,6 +476,9 @@ main(int argc, char **argv)
gcry_control ( GCRYCTL_DISABLE_SECMEM , 0 ) ;
gcry_control ( GCRYCTL_INITIALIZATION_FINISHED , 0 ) ;
if ( privatedo > 2 & & ( e = verify_pin ( privatedo = = 4 ) ) )
errx ( EXIT_FAILURE , " Cannot get key from token: %s " , gcry_strerror ( e ) ) ;
if ( ( e = get_otp_key ( privatedo , key , sizeof ( key ) ) ) )
errx ( EXIT_FAILURE , " Cannot get key from token: %s " , gcry_strerror ( e ) ) ;