/**
 * algo specific
 */

typedef struct itunes_backup
{
  u32 wpky[10];
  u32 dpsl[5];

} itunes_backup_t;

typedef struct pdf
{
  int  V;
  int  R;
  int  P;

  int  enc_md;

  u32  id_buf[8];
  u32  u_buf[32];
  u32  o_buf[32];

  int  id_len;
  int  o_len;
  int  u_len;

  u32  rc4key[2];
  u32  rc4data[2];

} pdf_t;

typedef struct sip
{
  u32 salt_buf[32];
  u32 salt_len;

  u32 esalt_buf[256];
  u32 esalt_len;

} sip_t;

typedef struct androidfde
{
  u32 data[384];

} androidfde_t;

typedef struct pbkdf2_md5
{
  u32 salt_buf[16];

} pbkdf2_md5_t;

typedef struct pbkdf2_sha256
{
  u32 salt_buf[16];

} pbkdf2_sha256_t;

typedef struct pbkdf2_sha512
{
  u32 salt_buf[32];

} pbkdf2_sha512_t;

typedef struct rakp
{
  u32 salt_buf[128];
  u32 salt_len;

} rakp_t;

typedef struct cloudkey
{
  u32 data_len;
  u32 data_buf[512];

} cloudkey_t;

typedef struct office2007
{
  u32 encryptedVerifier[4];
  u32 encryptedVerifierHash[5];

  u32 keySize;

} office2007_t;

typedef struct office2010
{
  u32 encryptedVerifier[4];
  u32 encryptedVerifierHash[8];

} office2010_t;

typedef struct zip2
{
  u32 type;
  u32 mode;
  u32 magic;
  u32 salt_len;
  u32 salt_buf[4];
  u32 verify_bytes;
  u32 compress_length;
  u32 data_len;
  u32 data_buf[2048];
  u32 auth_len;
  u32 auth_buf[4];

} zip2_t;

typedef struct win8phone
{
  u32 salt_buf[32];

} win8phone_t;

typedef struct jks_sha1
{
  u32 checksum[5];
  u32 iv[5];
  u32 enc_key_buf[4096];
  u32 enc_key_len;
  u32 der[5];
  u32 alias[16];

} jks_sha1_t;

typedef struct ethereum_presale
{
  u32 iv[4];
  u32 enc_seed[152];
  u32 enc_seed_len;

} ethereum_presale_t;

typedef struct tacacs_plus
{
  u32 session_buf[16];

  u32 ct_data_buf[64];
  u32 ct_data_len;

  u32 sequence_buf[16];

} tacacs_plus_t;

typedef struct apple_secure_notes
{
  u32 Z_PK;
  u32 ZCRYPTOITERATIONCOUNT;
  u32 ZCRYPTOSALT[16];
  u32 ZCRYPTOWRAPPEDKEY[16];

} apple_secure_notes_t;

typedef struct jwt
{
  u32 salt_buf[1024];
  u32 salt_len;

} jwt_t;

typedef struct electrum_wallet
{
  u32 salt_type;
  u32 iv[4];
  u32 encrypted[4];

} electrum_wallet_t;

typedef struct pdf17l8_tmp
{
  union
  {
    u32 dgst32[16];
    u64  dgst64[8];
  } d;

  u32 dgst_len;
  u32 W_len;

} pdf17l8_tmp_t;

typedef struct sha256crypt_tmp
{
  // pure version

  u32 alt_result[8];
  u32 p_bytes[64];
  u32 s_bytes[64];

} sha256crypt_tmp_t;

typedef struct androidpin_tmp
{
  u32 digest_buf[5];

} androidpin_tmp_t;

typedef struct androidfde_tmp
{
  u32 ipad[5];
  u32 opad[5];

  u32 dgst[10];
  u32 out[10];

} androidfde_tmp_t;

typedef struct mywallet_tmp
{
  u32 ipad[5];
  u32 opad[5];

  u32 dgst[10];
  u32 out[10];

} mywallet_tmp_t;

typedef struct sha1aix_tmp
{
  u32 ipad[5];
  u32 opad[5];

  u32 dgst[5];
  u32 out[5];

} sha1aix_tmp_t;

typedef struct sha256aix_tmp
{
  u32 ipad[8];
  u32 opad[8];

  u32 dgst[8];
  u32 out[8];

} sha256aix_tmp_t;

typedef struct sha512aix_tmp
{
  u64  ipad[8];
  u64  opad[8];

  u64  dgst[8];
  u64  out[8];

} sha512aix_tmp_t;

typedef struct drupal7_tmp
{
  u64  digest_buf[8];

} drupal7_tmp_t;

typedef struct lotus8_tmp
{
  u32 ipad[5];
  u32 opad[5];

  u32 dgst[5];
  u32 out[5];

} lotus8_tmp_t;

typedef struct office2007_tmp
{
  u32 out[5];

} office2007_tmp_t;

typedef struct office2010_tmp
{
  u32 out[5];

} office2010_tmp_t;

typedef struct saph_sha1_tmp
{
  u32 digest_buf[5];

} saph_sha1_tmp_t;

typedef struct pbkdf1_sha1_tmp
{
  // pbkdf1-sha1 is limited to 160 bits

  u32  ipad[5];
  u32  opad[5];

  u32  out[5];

} pbkdf1_sha1_tmp_t;

typedef struct pbkdf2_md5_tmp
{
  u32  ipad[4];
  u32  opad[4];

  u32  dgst[32];
  u32  out[32];

} pbkdf2_md5_tmp_t;

typedef struct pbkdf2_sha256_tmp
{
  u32  ipad[8];
  u32  opad[8];

  u32  dgst[32];
  u32  out[32];

} pbkdf2_sha256_tmp_t;

typedef struct pbkdf2_sha512_tmp
{
  u64  ipad[8];
  u64  opad[8];

  u64  dgst[16];
  u64  out[16];

} pbkdf2_sha512_tmp_t;

typedef struct ecryptfs_tmp
{
  u64  out[8];

} ecryptfs_tmp_t;

typedef struct oraclet_tmp
{
  u64  ipad[8];
  u64  opad[8];

  u64  dgst[16];
  u64  out[16];

} oraclet_tmp_t;

typedef struct cram_md5
{
  u32 user[16];

} cram_md5_t;

typedef struct axcrypt_tmp
{
  u32 KEK[4];
  u32 lsb[4];
  u32 cipher[4];

} axcrypt_tmp_t;

typedef struct apple_secure_notes_tmp
{
  u32 ipad[8];
  u32 opad[8];

  u32 dgst[8];
  u32 out[8];

} apple_secure_notes_tmp_t;

typedef enum kern_type
{
  KERN_TYPE_MD5_SLTPW               = 20,
  KERN_TYPE_MD5_PWUSLT              = 30,
  KERN_TYPE_MD5_SLTPWU              = 40,
  KERN_TYPE_HMACMD5_PW              = 50,
  KERN_TYPE_HMACMD5_SLT             = 60,
  KERN_TYPE_SHA1_SLTPW              = 120,
  KERN_TYPE_SHA1_PWUSLT             = 130,
  KERN_TYPE_SHA1_SLTPWU             = 140,
  KERN_TYPE_HMACSHA1_PW             = 150,
  KERN_TYPE_HMACSHA1_SLT            = 160,
  KERN_TYPE_SHA256_PWSLT            = 1410,
  KERN_TYPE_SHA256_SLTPW            = 1420,
  KERN_TYPE_SHA256_PWUSLT           = 1430,
  KERN_TYPE_SHA256_SLTPWU           = 1440,
  KERN_TYPE_HMACSHA256_PW           = 1450,
  KERN_TYPE_HMACSHA256_SLT          = 1460,
  KERN_TYPE_APR1CRYPT               = 1600,
  KERN_TYPE_SHA512_PWSLT            = 1710,
  KERN_TYPE_SHA512_SLTPW            = 1720,
  KERN_TYPE_SHA512_PWSLTU           = 1730,
  KERN_TYPE_SHA512_SLTPWU           = 1740,
  KERN_TYPE_HMACSHA512_PW           = 1750,
  KERN_TYPE_HMACSHA512_SLT          = 1760,
  KERN_TYPE_MD5ASA                  = 2410,
  KERN_TYPE_MD55                    = 2600,
  KERN_TYPE_MD55_PWSLT1             = 2610,
  KERN_TYPE_MD55_PWSLT2             = 2710,
  KERN_TYPE_MD55_SLTPW              = 2810,
  KERN_TYPE_ORACLEH                 = 3100,
  KERN_TYPE_MD5_SLT_MD5_PW          = 3710,
  KERN_TYPE_MD5_SLT_PW_SLT          = 3800,
  KERN_TYPE_MD5_SLT_MD5_SLT_PW      = 4010,
  KERN_TYPE_MD5_SLT_MD5_PW_SLT      = 4110,
  KERN_TYPE_MD5U5                   = 4300,
  KERN_TYPE_MD5U5_PWSLT1            = 4310,
  KERN_TYPE_MD5_SHA1                = 4400,
  KERN_TYPE_SHA11                   = 4500,
  KERN_TYPE_SHA1_SLT_SHA1_PW        = 4520,
  KERN_TYPE_SHA1_MD5                = 4700,
  KERN_TYPE_MD5_CHAP                = 4800,
  KERN_TYPE_SHA1_SLT_PW_SLT         = 4900,
  KERN_TYPE_ANDROIDPIN              = 5800,
  KERN_TYPE_RIPEMD160               = 6000,
  KERN_TYPE_WHIRLPOOL               = 6100,
  KERN_TYPE_MD5AIX                  = 6300,
  KERN_TYPE_SHA256AIX               = 6400,
  KERN_TYPE_SHA512AIX               = 6500,
  KERN_TYPE_SHA1AIX                 = 6700,
  KERN_TYPE_GOST                    = 6900,
  KERN_TYPE_FORTIGATE               = 7000,
  KERN_TYPE_RAKP                    = 7300,
  KERN_TYPE_SHA256CRYPT             = 7400,
  KERN_TYPE_SAPB                    = 7700,
  KERN_TYPE_SAPB_MANGLED            = 7701,
  KERN_TYPE_SAPG                    = 7800,
  KERN_TYPE_SAPG_MANGLED            = 7801,
  KERN_TYPE_DRUPAL7                 = 7900,
  KERN_TYPE_SYBASEASE               = 8000,
  KERN_TYPE_NETSCALER               = 8100,
  KERN_TYPE_CLOUDKEY                = 8200,
  KERN_TYPE_NSEC3                   = 8300,
  KERN_TYPE_WBB3                    = 8400,
  KERN_TYPE_LOTUS5                  = 8600,
  KERN_TYPE_LOTUS6                  = 8700,
  KERN_TYPE_ANDROIDFDE              = 8800,
  KERN_TYPE_LOTUS8                  = 9100,
  KERN_TYPE_OFFICE2007              = 9400,
  KERN_TYPE_OFFICE2010              = 9500,
  KERN_TYPE_RADMIN2                 = 9900,
  KERN_TYPE_SIPHASH                 = 10100,
  KERN_TYPE_SAPH_SHA1               = 10300,
  KERN_TYPE_PDF17L8                 = 10700,
  KERN_TYPE_PBKDF2_SHA256           = 10900,
  KERN_TYPE_POSTGRESQL_AUTH         = 11100,
  KERN_TYPE_MYSQL_AUTH              = 11200,
  KERN_TYPE_SIP_AUTH                = 11400,
  KERN_TYPE_STREEBOG_256            = 11700,
  KERN_TYPE_HMAC_STREEBOG_256_PW    = 11750,
  KERN_TYPE_HMAC_STREEBOG_256_SLT   = 11760,
  KERN_TYPE_STREEBOG_512            = 11800,
  KERN_TYPE_HMAC_STREEBOG_512_PW    = 11850,
  KERN_TYPE_HMAC_STREEBOG_512_SLT   = 11860,
  KERN_TYPE_PBKDF2_MD5              = 11900,
  KERN_TYPE_ECRYPTFS                = 12200,
  KERN_TYPE_ORACLET                 = 12300,
  KERN_TYPE_MYWALLET                = 12700,
  KERN_TYPE_MS_DRSR                 = 12800,
  KERN_TYPE_ANDROIDFDE_SAMSUNG      = 12900,
  KERN_TYPE_AXCRYPT                 = 13200,
  KERN_TYPE_SHA1_AXCRYPT            = 13300,
  KERN_TYPE_ZIP2                    = 13600,
  KERN_TYPE_WIN8PHONE               = 13800,
  KERN_TYPE_OPENCART                = 13900,
  KERN_TYPE_SHA1CX                  = 14400,
  KERN_TYPE_ITUNES_BACKUP_9         = 14700,
  KERN_TYPE_ITUNES_BACKUP_10        = 14800,
  KERN_TYPE_NETBSD_SHA1CRYPT        = 15100,
  KERN_TYPE_JKS_SHA1                = 15500,
  KERN_TYPE_TACACS_PLUS             = 16100,
  KERN_TYPE_APPLE_SECURE_NOTES      = 16200,
  KERN_TYPE_ETHEREUM_PRESALE        = 16300,
  KERN_TYPE_CRAM_MD5_DOVECOT        = 16400,
  KERN_TYPE_JWT_HS256               = 16511,
  KERN_TYPE_JWT_HS384               = 16512,
  KERN_TYPE_JWT_HS512               = 16513,
  KERN_TYPE_ELECTRUM_WALLET13       = 16600,

} kern_type_t;

/**
 * Default iteration numbers
 */

typedef enum rounds_count
{
   ROUNDS_ANDROIDPIN         = 1024,
   ROUNDS_SHA1AIX            = (1 << 6),
   ROUNDS_SHA256AIX          = (1 << 6),
   ROUNDS_SHA512AIX          = (1 << 6),
   ROUNDS_SHA256CRYPT        = 5000,
   ROUNDS_DRUPAL7            = (1 << 14), // $S$C
   ROUNDS_CLOUDKEY           = 40000,
   ROUNDS_NSEC3              = 1,
   ROUNDS_ANDROIDFDE         = 2000,
   ROUNDS_LOTUS8             = 5000,
   ROUNDS_CISCO8             = 20000,
   ROUNDS_OFFICE2007         = 50000,
   ROUNDS_OFFICE2010         = 100000,
   ROUNDS_LIBREOFFICE        = 100000,
   ROUNDS_OPENOFFICE         = 1024,
   ROUNDS_DJANGOPBKDF2       = 20000,
   ROUNDS_SAPH_SHA1          = 1024,
   ROUNDS_PDF17L8            = 64,
   ROUNDS_PBKDF2_SHA256      = 1000,
   ROUNDS_PBKDF2_MD5         = 1000,
   ROUNDS_PBKDF2_SHA512      = 1000,
   ROUNDS_ECRYPTFS           = 65536,
   ROUNDS_ORACLET            = 4096,
   ROUNDS_MYWALLET           = 10,
   ROUNDS_MYWALLETV2         = 5000,
   ROUNDS_MS_DRSR            = 100,
   ROUNDS_ANDROIDFDE_SAMSUNG = 4096,
   ROUNDS_AXCRYPT            = 10000,
   ROUNDS_KEEPASS            = 6000,
   ROUNDS_ZIP2               = 1000,
   ROUNDS_ITUNES9_BACKUP     = 10000,
   ROUNDS_ITUNES101_BACKUP   = 10000000, // wtf, i mean, really?
   ROUNDS_ITUNES102_BACKUP   = 10000,
   ROUNDS_ATLASSIAN          = 10000,
   ROUNDS_NETBSD_SHA1CRYPT   = 20000,
   ROUNDS_APPLE_SECURE_NOTES = 20000,
   ROUNDS_ETHEREUM_PRESALE   = 2000 - 1,

} rounds_count_t;