/*
 * SmartKey Multilan Driver
 * Copyright EUTRON 2003
 */

#ifndef __SKEYLINK_H
#define __SKEYLINK_H

#ifdef __cplusplus
extern "C" {
#endif

#define MAKE_KEY_CODE(low,high) (((unsigned short)(low)) | (((unsigned short)(high)) << 8))

/*
 * Commands
 */
#define SCRAMBLING_MODE            's'
#define READING_MODE               'r'
#define WRITING_MODE               'w'
#define FIXING_MODE                'f'
#define LOCATING_MODE              'l'
#define COMPARING_MODE             'c'
#define PROGRAMMING_MODE           'p'
#define MODEL_READING_MODE         'm'
#define ENCRYPTING_MODE            'e'
#define BLOCK_READING_MODE         MAKE_KEY_CODE('b','r')
#define BLOCK_WRITING_MODE         MAKE_KEY_CODE('b','w')
#define SERIAL_NUMBER_READING_MODE 'n'
#define FIX_READING_MODE           'x'
#define EXT_MODEL_READING_MODE     'h'
#define FAIL_COUNTER_READING_MODE  'a'
#define AES_SET_MODE               'g'
#define AES_SCRAMBLE_MODE          'o'

/*
 * Models
 */
#define SKEY_FX                '1' /* Model FX */
#define SKEY_PR                '2' /* Model PR */
#define SKEY_EP                '3' /* Model EP */
#define SKEY_SP                '9' /* Model SP */
#define SKEY_XM                'D' /* Model XM */
#define SKEY_NET               'A' /* Model NET */

/*
 * Memory sizes
 */
#define SKEY_MEMORY_NONE        '0' /* No memory */
#define SKEY_MEMORY_64          '1' /* 64 bytes of memory */
#define SKEY_MEMORY_128         '2' /* 128 bytes of memory */
#define SKEY_MEMORY_416         '3' /* 416 bytes of memory */
#define SKEY_MEMORY_896         '4' /* 896 bytes of memory */
#define SKEY_MEMORY_8192        '8' /* 8192 bytes of memory */

/*
 * Return codes
 */
#define ST_OK                  0   /* No errors */
#define ST_NONE_KEY            -1  /* No Smartkey present */
#define ST_SYNT_ERR            -2  /* Syntax error */
#define ST_LABEL_FAILED        -3  /* Uncorrect label */
#define ST_PW_DATA_FAILED      -4  /* Uncorrect password or data */
#define ST_EXEC_ERROR          -16 /* Max executions reached */
#define ST_HW_FAILURE          -20 /* Hardware error */

/*
 * Field length
 */
#define LABEL_LENGTH           16
#define PASSWORD_LENGTH        16
#define DATA_LENGTH            64
#define EXTENDED_DATA_LENGTH   352
#define SCRAMBLE_LENGTH        8

/*
 * Net modes
 */
#define NET_KEY_OPEN           'O'
#define NET_KEY_ACCESS         'A'
#define NET_KEY_CLOSE          'C'

/*
 * Net commands
 */
#define USER_NUMBER_MODE       'U'

/*
 * Net return codes
 */
#define ST_NET_ERROR             -5  /* Lan error */
#define ST_CLOSE_ERROR           -6  /* Attempting to CLOSE  without OPENing */
#define ST_ACCESS_ERROR          -7  /* Attempting to ACCESS without OPENing */
#define ST_USER_ERROR            -8  /* Max user reached */
#define ST_NET_PWD_ERR           -9  /* Net password wrong */
#define ST_INIT_ERROR            -11 /* Initialization error */
#define ST_TOO_MANY_OPEN_KEY     -14 /* Too many open SmartKey */
#define ST_NET_PASS_INVALID      -15 /* Invalid net password */
#define ST_NET_CONF_ERROR        -21 /* Configuration error in INI/Registry/Environment */
#define ST_NET_ANP_INIT_ERROR    -22 /* Error inizializing the ANP protocol */
#define ST_NET_TCPIP_INIT_ERROR  -23 /* Error inizializing the TCPIP protocol */
#define ST_NET_NOVELL_INIT_ERROR -24 /* Error inizializing the Novell protocol */
#define ST_NET_LOCAL_INIT_ERROR  -25 /* Error inizializing the Local protocol */
#define ST_NET_KEY_NOT_MAP       -26 /* Not MAP programmed key found when MAP is requested */

/* 
 * Code returned in data[0] after NET_OPEN
 */
#define NET_TYPE_LOCAL   0
#define NET_TYPE_IPX     1
#define NET_TYPE_ANP     2
#define NET_TYPE_TCPIP   3

/*
 * Net command structure
 */
#pragma pack(push,1)

typedef struct __KEY_NET {
        short net_command;
        unsigned long net_password;
        short lpt;
        short command;
        unsigned char label[LABEL_LENGTH];
        unsigned char password[PASSWORD_LENGTH];
        unsigned char data[DATA_LENGTH];
        short fail_counter;
        short status;
        unsigned char ext_data[EXTENDED_DATA_LENGTH];
} KEY_NET;

#pragma pack(pop)

/*
 * Command function. 
 * It executes the command and returns key->status code.
 *
 *   short smartlink(KEY_NET* key)
 */
short __cdecl smartlink(KEY_NET*);

#ifdef __cplusplus
}
#endif

#endif