Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*********************************************************************
  2. * Filename:   aes.h
  3. * Author:     Brad Conte (brad AT bradconte.com)
  4. * Copyright:
  5. * Disclaimer: This code is presented "as is" without any guarantees.
  6. * Details:    Defines the API for the corresponding AES implementation.
  7. *********************************************************************/
  8.  
  9. #ifndef AES_H
  10. #define AES_H
  11.  
  12. /*************************** HEADER FILES ***************************/
  13. #include <stddef.h>
  14.  
  15. /****************************** MACROS ******************************/
  16. #define AES_BLOCK_SIZE 16               // AES operates on 16 bytes at a time
  17.  
  18. /**************************** DATA TYPES ****************************/
  19. typedef unsigned char BYTE;            // 8-bit byte
  20. typedef unsigned int WORD;             // 32-bit word, change to "long" for 16-bit machines
  21.  
  22. /*********************** FUNCTION DECLARATIONS **********************/
  23. ///////////////////
  24. // AES
  25. ///////////////////
  26. // Key setup must be done before any AES en/de-cryption functions can be used.
  27. void aes_key_setup(const BYTE key[],          // The key, must be 128, 192, or 256 bits
  28.                    WORD w[],                  // Output key schedule to be used later
  29.                    int keysize);              // Bit length of the key, 128, 192, or 256
  30.  
  31. void aes_encrypt(const BYTE in[],             // 16 bytes of plaintext
  32.                  BYTE out[],                  // 16 bytes of ciphertext
  33.                  const WORD key[],            // From the key setup
  34.                  int keysize);                // Bit length of the key, 128, 192, or 256
  35.  
  36. void aes_decrypt(const BYTE in[],             // 16 bytes of ciphertext
  37.                  BYTE out[],                  // 16 bytes of plaintext
  38.                  const WORD key[],            // From the key setup
  39.                  int keysize);                // Bit length of the key, 128, 192, or 256
  40.  
  41. ///////////////////
  42. // AES - CBC
  43. ///////////////////
  44. int aes_encrypt_cbc(const BYTE in[],          // Plaintext
  45.                     size_t in_len,            // Must be a multiple of AES_BLOCK_SIZE
  46.                     BYTE out[],               // Ciphertext, same length as plaintext
  47.                     const WORD key[],         // From the key setup
  48.                     int keysize,              // Bit length of the key, 128, 192, or 256
  49.                     const BYTE iv[]);         // IV, must be AES_BLOCK_SIZE bytes long
  50.  
  51. // Only output the CBC-MAC of the input.
  52. int aes_encrypt_cbc_mac(const BYTE in[],      // plaintext
  53.                         size_t in_len,        // Must be a multiple of AES_BLOCK_SIZE
  54.                         BYTE out[],           // Output MAC
  55.                         const WORD key[],     // From the key setup
  56.                         int keysize,          // Bit length of the key, 128, 192, or 256
  57.                         const BYTE iv[]);     // IV, must be AES_BLOCK_SIZE bytes long
  58.  
  59. ///////////////////
  60. // AES - CTR
  61. ///////////////////
  62. void increment_iv(BYTE iv[],                  // Must be a multiple of AES_BLOCK_SIZE
  63.                   int counter_size);          // Bytes of the IV used for counting (low end)
  64.  
  65. void aes_encrypt_ctr(const BYTE in[],         // Plaintext
  66.                      size_t in_len,           // Any byte length
  67.                      BYTE out[],              // Ciphertext, same length as plaintext
  68.                      const WORD key[],        // From the key setup
  69.                      int keysize,             // Bit length of the key, 128, 192, or 256
  70.                      const BYTE iv[]);        // IV, must be AES_BLOCK_SIZE bytes long
  71.  
  72. void aes_decrypt_ctr(const BYTE in[],         // Ciphertext
  73.                      size_t in_len,           // Any byte length
  74.                      BYTE out[],              // Plaintext, same length as ciphertext
  75.                      const WORD key[],        // From the key setup
  76.                      int keysize,             // Bit length of the key, 128, 192, or 256
  77.                      const BYTE iv[]);        // IV, must be AES_BLOCK_SIZE bytes long
  78.  
  79. ///////////////////
  80. // AES - CCM
  81. ///////////////////
  82. // Returns True if the input parameters do not violate any constraint.
  83. int aes_encrypt_ccm(const BYTE plaintext[],              // IN  - Plaintext.
  84.                     WORD plaintext_len,                  // IN  - Plaintext length.
  85.                     const BYTE associated_data[],        // IN  - Associated Data included in authentication, but not encryption.
  86.                     unsigned short associated_data_len,  // IN  - Associated Data length in bytes.
  87.                     const BYTE nonce[],                  // IN  - The Nonce to be used for encryption.
  88.                     unsigned short nonce_len,            // IN  - Nonce length in bytes.
  89.                     BYTE ciphertext[],                   // OUT - Ciphertext, a concatination of the plaintext and the MAC.
  90.                     WORD *ciphertext_len,                // OUT - The length of the ciphertext, always plaintext_len + mac_len.
  91.                     WORD mac_len,                        // IN  - The desired length of the MAC, must be 4, 6, 8, 10, 12, 14, or 16.
  92.                     const BYTE key[],                    // IN  - The AES key for encryption.
  93.                     int keysize);                        // IN  - The length of the key in bits. Valid values are 128, 192, 256.
  94.  
  95. // Returns True if the input parameters do not violate any constraint.
  96. // Use mac_auth to ensure decryption/validation was preformed correctly.
  97. // If authentication does not succeed, the plaintext is zeroed out. To overwride
  98. // this, call with mac_auth = NULL. The proper proceedure is to decrypt with
  99. // authentication enabled (mac_auth != NULL) and make a second call to that
  100. // ignores authentication explicitly if the first call failes.
  101. int aes_decrypt_ccm(const BYTE ciphertext[],             // IN  - Ciphertext, the concatination of encrypted plaintext and MAC.
  102.                     WORD ciphertext_len,                 // IN  - Ciphertext length in bytes.
  103.                     const BYTE assoc[],                  // IN  - The Associated Data, required for authentication.
  104.                     unsigned short assoc_len,            // IN  - Associated Data length in bytes.
  105.                     const BYTE nonce[],                  // IN  - The Nonce to use for decryption, same one as for encryption.
  106.                     unsigned short nonce_len,            // IN  - Nonce length in bytes.
  107.                     BYTE plaintext[],                    // OUT - The plaintext that was decrypted. Will need to be large enough to hold ciphertext_len - mac_len.
  108.                     WORD *plaintext_len,                 // OUT - Length in bytes of the output plaintext, always ciphertext_len - mac_len .
  109.                     WORD mac_len,                        // IN  - The length of the MAC that was calculated.
  110.                     int *mac_auth,                       // OUT - TRUE if authentication succeeded, FALSE if it did not. NULL pointer will ignore the authentication.
  111.                     const BYTE key[],                    // IN  - The AES key for decryption.
  112.                     int keysize);                        // IN  - The length of the key in BITS. Valid values are 128, 192, 256.
  113.  
  114. ///////////////////
  115. // Test functions
  116. ///////////////////
  117. int aes_test();
  118. int aes_ecb_test();
  119. int aes_cbc_test();
  120. int aes_ctr_test();
  121. int aes_ccm_test();
  122.  
  123. #endif   // AES_H
  124.