/* * test-aes-key-wrap.c * ------------------- * Test code for AES Key Wrap. * * Authors: Rob Austein * Copyright (c) 2015, NORDUnet A/S * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of the NORDUnet nor the names of its contributors may * be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #ifndef TC_BUFSIZE #define TC_BUFSIZE 4096 #endif /* * Test cases from RFC 5649 all use a 192-bit key, which our AES * implementation doesn't support, so had to write our own. */ static const uint8_t Q[] = { /* Plaintext, 81 bytes */ 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x21, 0x20, 0x20, 0x4d, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x73, 0x20, 0x49, 0x6e, 0x69, 0x67, 0x6f, 0x20, 0x4d, 0x6f, 0x6e, 0x74, 0x6f, 0x79, 0x61, 0x2e, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x20, 0x6d, 0x79, 0x20, 0x41, 0x45, 0x53, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x20, 0x20, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x65, 0x2e }; static const uint8_t K_128[] = { /* 128-bit KEK, 16 bytes */ 0xbc, 0x2a, 0xd8, 0x90, 0xd8, 0x91, 0x10, 0x65, 0xf0, 0x42, 0x10, 0x1b, 0x4a, 0x6b, 0xaf, 0x99 }; static const uint8_t K_256[] = { /* 256-bit KEK, 32 bytes */ 0xe3, 0x97, 0x52, 0x81, 0x2b, 0x7e, 0xc2, 0xa4, 0x6a, 0xac, 0x50, 0x18, 0x0d, 0x10, 0xc6, 0x85, 0x2c, 0xcf, 0x86, 0x0a, 0xa9, 0x4f, 0x69, 0xab, 0x16, 0xa6, 0x4f, 0x3e, 0x96, 0xa0, 0xbd, 0x9e }; static const uint8_t C_128[] = { /* Plaintext wrapped by 128-bit KEK, 96 bytes */ 0xb0, 0x10, 0x91, 0x7b, 0xe7, 0x67, 0x9c, 0x10, 0x16, 0x64, 0xe7, 0x73, 0xd2, 0x68, 0xba, 0xed, 0x8c, 0x50, 0x49, 0x80, 0x16, 0x2f, 0x4e, 0x97, 0xe8, 0x45, 0x5c, 0x2f, 0x2b, 0x7a, 0x88, 0x0e, 0xd8, 0xef, 0xaa, 0x40, 0xb0, 0x2e, 0xb4, 0x50, 0xe7, 0x60, 0xf7, 0xbb, 0xed, 0x56, 0x79, 0x16, 0x65, 0xb7, 0x13, 0x9b, 0x4c, 0x66, 0x86, 0x5f, 0x4d, 0x53, 0x2d, 0xcd, 0x83, 0x41, 0x01, 0x35, 0x0d, 0x06, 0x39, 0x4e, 0x9e, 0xfe, 0x68, 0xc5, 0x2f, 0x37, 0x33, 0x99, 0xbb, 0x88, 0xf7, 0x76, 0x1e, 0x82, 0x48, 0xd6, 0xa2, 0xf3, 0x9b, 0x92, 0x01, 0x65, 0xcb, 0x48, 0x36, 0xf5, 0x42, 0xd3 }; static const uint8_t C_256[] = { /* Plaintext wrapped by 256-bit KEK, 96 bytes */ 0x08, 0x00, 0xbc, 0x1b, 0x35, 0xe4, 0x2a, 0x69, 0x3f, 0x43, 0x07, 0x54, 0x31, 0xba, 0xb6, 0x89, 0x7c, 0x64, 0x9f, 0x03, 0x84, 0xc4, 0x4a, 0x71, 0xdb, 0xcb, 0xae, 0x55, 0x30, 0xdf, 0xb0, 0x2b, 0xc3, 0x91, 0x5d, 0x07, 0xa9, 0x24, 0xdb, 0xe7, 0xbe, 0x4d, 0x0d, 0x62, 0xd4, 0xf8, 0xb1, 0x94, 0xf1, 0xb9, 0x22, 0xb5, 0x94, 0xab, 0x7e, 0x0b, 0x15, 0x6a, 0xd9, 0x5f, 0x6c, 0x20, 0xb7, 0x7e, 0x13, 0x19, 0xfa, 0xc4, 0x70, 0xec, 0x0d, 0xbd, 0xf7, 0x01, 0xc6, 0xb3, 0x9a, 0x19, 0xaf, 0xf2, 0x47, 0x68, 0xea, 0x7e, 0x97, 0x7e, 0x52, 0x2e, 0xd4, 0x03, 0x31, 0xcb, 0x22, 0xb6, 0xfe, 0xf5 }; static const char *format_hex(const uint8_t *bin, const size_t len, char *hex, const size_t max) { size_t i; assert(bin != NULL && hex != NULL && len * 3 < max); if (len == 0) return ""; for (i = 0; i < len; i++) sprintf(hex + 3 * i, "%02x:", bin[i]); hex[len * 3 - 1] = '\0'; return hex; } static int run_test(hal_core_t *core, const uint8_t * const K, const size_t K_len, const uint8_t * const C, const size_t C_len) { const size_t Q_len = sizeof(Q); uint8_t q[TC_BUFSIZE], c[TC_BUFSIZE]; size_t q_len = sizeof(q), c_len = sizeof(c); char h1[TC_BUFSIZE * 3 + 1], h2[TC_BUFSIZE * 3 + 1]; hal_error_t err; int ok1 = 1, ok2 = 1; /* * Wrap and compare results. */ printf("Wrapping with %lu-bit KEK...\n", (unsigned long) K_len * 8); if ((err = hal_aes_keywrap(core, K, K_len, Q, Q_len, c, &c_len)) != HAL_OK) { printf("Couldn't wrap with %lu-bit KEK: %s\n", (unsigned long) K_len * 8, hal_error_string(err)); ok1 = 0; } else if (C_len != c_len || memcmp(C, c, C_len) != 0) { printf("Ciphertext mismatch:\n Want: %s\n Got: %s\n", format_hex(C, C_len, h1, sizeof(h1)), format_hex(c, c_len, h2, sizeof(h2))); ok1 = 0; } else { printf("OK\n"); } /* * Unwrap and compare results. */ printf("Unwrapping with %lu-bit KEK...\n", (unsigned long) K_len * 8); if ((err = hal_aes_keyunwrap(core, K, K_len, C, C_len, q, &q_len)) != HAL_OK) { printf("Couldn't unwrap with %lu-bit KEK: %s\n", (unsigned long) K_len * 8, hal_error_string(err)); ok2 = 0; } else if (Q_len != q_len || memcmp(Q, q, Q_len) != 0) { printf("Plaintext mismatch:\n Want: %s\n Got: %s\n", format_hex(Q, Q_len, h1, sizeof(h1)), format_hex(q, q_len, h2, sizeof(h2))); ok2 = 0; } else { printf("OK\n"); } return ok1 && ok2; } int main (int argc, char *argv[]) { int failures = 0; printf("Testing whether AES core reports present..."); hal_core_t *core = hal_core_find(AES_CORE_NAME, NULL); if (core == NULL) { printf("no, skipping keywrap tests\n"); } else { printf("yes\n"); if (!run_test(core, K_128, sizeof(K_128), C_128, sizeof(C_128))) failures++; if (!run_test(core, K_256, sizeof(K_256), C_256, sizeof(C_256))) failures++; } return failures; } /* * "Any programmer who fails to comply with the standard naming, formatting, * or commenting conventions should be shot. If it so happens that it is * inconvenient to shoot him, then he is to be politely requested to recode * his program in adherence to the above standard." * -- Michael Spier, Digital Equipment Corporation * * Local variables: * indent-tabs-mode: nil * End: */ 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133





























                                                                           




                                             

































































































                                                                                      
# An attempt at a Python interface to PKCS 11 using the scary ctypes
# module from the Python standard library.

# This code is derived from the RSA PKCS #11 C header files, which say:
#
# License to copy and use this software is granted provided that it is
# identified as "RSA Security Inc. PKCS #11 Cryptographic Token Interface
# (Cryptoki)" in all material mentioning or referencing this software.
#
# License is also granted to make and use derivative works provided that
# such works are identified as "derived from the RSA Security Inc. PKCS #11
# Cryptographic Token Interface (Cryptoki)" in all material mentioning or
# referencing the derived work.
#
# RSA Security Inc. makes no representations concerning either the
# merchantability of this software or the suitability of this software for
# any particular purpose. It is provided "as is" without express or implied
# warranty of any kind.

class CKR_Exception(Exception):
  """
  Base class for PKCS #11 exceptions.
  """

  ckr_code = None
  ckr_map  = {}

  def __int__(self):
    return self.ckr_code

  @classmethod
  def raise_on_failure(cls, rv, func, *args):
    if rv != CKR_OK:
      raise cls.ckr_map[rv]

CKR_OK                                                                    = 0x00000000

class CKR_CANCEL        			(CKR_Exception): ckr_code = 0x00000001
class CKR_HOST_MEMORY   			(CKR_Exception): ckr_code = 0x00000002
class CKR_SLOT_ID_INVALI        		(CKR_Exception): ckr_code = 0x00000003
class CKR_GENERAL_ERROR                 	(CKR_Exception): ckr_code = 0x00000005
class CKR_FUNCTION_FAILED			(CKR_Exception): ckr_code = 0x00000006
class CKR_ARGUMENTS_BAD                         (CKR_Exception): ckr_code = 0x00000007
class CKR_NO_EVENT				(CKR_Exception): ckr_code = 0x00000008
class CKR_NEED_TO_CREATE_THREADS		(CKR_Exception): ckr_code = 0x00000009
class CKR_CANT_LOCK				(CKR_Exception): ckr_code = 0x0000000A
class CKR_ATTRIBUTE_READ_ONLY			(CKR_Exception): ckr_code = 0x00000010
class CKR_ATTRIBUTE_SENSITIVE			(CKR_Exception): ckr_code = 0x00000011
class CKR_ATTRIBUTE_TYPE_INVALID		(CKR_Exception): ckr_code = 0x00000012
class CKR_ATTRIBUTE_VALUE_INVALID		(CKR_Exception): ckr_code = 0x00000013
class CKR_DATA_INVALID				(CKR_Exception): ckr_code = 0x00000020
class CKR_DATA_LEN_RANGE			(CKR_Exception): ckr_code = 0x00000021
class CKR_DEVICE_ERROR				(CKR_Exception): ckr_code = 0x00000030
class CKR_DEVICE_MEMORY				(CKR_Exception): ckr_code = 0x00000031
class CKR_DEVICE_REMOVED			(CKR_Exception): ckr_code = 0x00000032
class CKR_ENCRYPTED_DATA_INVALID		(CKR_Exception): ckr_code = 0x00000040
class CKR_ENCRYPTED_DATA_LEN_RANGE		(CKR_Exception): ckr_code = 0x00000041
class CKR_FUNCTION_CANCELED			(CKR_Exception): ckr_code = 0x00000050
class CKR_FUNCTION_NOT_PARALLEL			(CKR_Exception): ckr_code = 0x00000051
class CKR_FUNCTION_NOT_SUPPORTED		(CKR_Exception): ckr_code = 0x00000054
class CKR_KEY_HANDLE_INVALID			(CKR_Exception): ckr_code = 0x00000060
class CKR_KEY_SIZE_RANGE			(CKR_Exception): ckr_code = 0x00000062
class CKR_KEY_TYPE_INCONSISTENT			(CKR_Exception): ckr_code = 0x00000063
class CKR_KEY_NOT_NEEDED			(CKR_Exception): ckr_code = 0x00000064
class CKR_KEY_CHANGED				(CKR_Exception): ckr_code = 0x00000065
class CKR_KEY_NEEDED				(CKR_Exception): ckr_code = 0x00000066
class CKR_KEY_INDIGESTIBLE			(CKR_Exception): ckr_code = 0x00000067
class CKR_KEY_FUNCTION_NOT_PERMITTED		(CKR_Exception): ckr_code = 0x00000068
class CKR_KEY_NOT_WRAPPABLE			(CKR_Exception): ckr_code = 0x00000069
class CKR_KEY_UNEXTRACTABLE			(CKR_Exception): ckr_code = 0x0000006A
class CKR_MECHANISM_INVALID			(CKR_Exception): ckr_code = 0x00000070
class CKR_MECHANISM_PARAM_INVALID		(CKR_Exception): ckr_code = 0x00000071
class CKR_OBJECT_HANDLE_INVALID			(CKR_Exception): ckr_code = 0x00000082
class CKR_OPERATION_ACTIVE			(CKR_Exception): ckr_code = 0x00000090
class CKR_OPERATION_NOT_INITIALIZED		(CKR_Exception): ckr_code = 0x00000091
class CKR_PIN_INCORRECT				(CKR_Exception): ckr_code = 0x000000A0
class CKR_PIN_INVALID				(CKR_Exception): ckr_code = 0x000000A1
class CKR_PIN_LEN_RANGE				(CKR_Exception): ckr_code = 0x000000A2
class CKR_PIN_EXPIRED				(CKR_Exception): ckr_code = 0x000000A3
class CKR_PIN_LOCKED				(CKR_Exception): ckr_code = 0x000000A4
class CKR_SESSION_CLOSED			(CKR_Exception): ckr_code = 0x000000B0
class CKR_SESSION_COUNT				(CKR_Exception): ckr_code = 0x000000B1
class CKR_SESSION_HANDLE_INVALID		(CKR_Exception): ckr_code = 0x000000B3
class CKR_SESSION_PARALLEL_NOT_SUPPORTED	(CKR_Exception): ckr_code = 0x000000B4
class CKR_SESSION_READ_ONLY			(CKR_Exception): ckr_code = 0x000000B5
class CKR_SESSION_EXISTS			(CKR_Exception): ckr_code = 0x000000B6
class CKR_SESSION_READ_ONLY_EXISTS		(CKR_Exception): ckr_code = 0x000000B7
class CKR_SESSION_READ_WRITE_SO_EXISTS		(CKR_Exception): ckr_code = 0x000000B8
class CKR_SIGNATURE_INVALID			(CKR_Exception): ckr_code = 0x000000C0
class CKR_SIGNATURE_LEN_RANGE			(CKR_Exception): ckr_code = 0x000000C1
class CKR_TEMPLATE_INCOMPLETE			(CKR_Exception): ckr_code = 0x000000D0
class CKR_TEMPLATE_INCONSISTENT			(CKR_Exception): ckr_code = 0x000000D1
class CKR_TOKEN_NOT_PRESENT			(CKR_Exception): ckr_code = 0x000000E0
class CKR_TOKEN_NOT_RECOGNIZED			(CKR_Exception): ckr_code = 0x000000E1
class CKR_TOKEN_WRITE_PROTECTED			(CKR_Exception): ckr_code = 0x000000E2
class CKR_UNWRAPPING_KEY_HANDLE_INVALID		(CKR_Exception): ckr_code = 0x000000F0
class CKR_UNWRAPPING_KEY_SIZE_RANGE		(CKR_Exception): ckr_code = 0x000000F1
class CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT	(CKR_Exception): ckr_code = 0x000000F2
class CKR_USER_ALREADY_LOGGED_IN		(CKR_Exception): ckr_code = 0x00000100
class CKR_USER_NOT_LOGGED_IN			(CKR_Exception): ckr_code = 0x00000101
class CKR_USER_PIN_NOT_INITIALIZED		(CKR_Exception): ckr_code = 0x00000102
class CKR_USER_TYPE_INVALID			(CKR_Exception): ckr_code = 0x00000103
class CKR_USER_ANOTHER_ALREADY_LOGGED_IN	(CKR_Exception): ckr_code = 0x00000104
class CKR_USER_TOO_MANY_TYPES			(CKR_Exception): ckr_code = 0x00000105
class CKR_WRAPPED_KEY_INVALID			(CKR_Exception): ckr_code = 0x00000110
class CKR_WRAPPED_KEY_LEN_RANGE			(CKR_Exception): ckr_code = 0x00000112
class CKR_WRAPPING_KEY_HANDLE_INVALID		(CKR_Exception): ckr_code = 0x00000113
class CKR_WRAPPING_KEY_SIZE_RANGE		(CKR_Exception): ckr_code = 0x00000114
class CKR_WRAPPING_KEY_TYPE_INCONSISTENT	(CKR_Exception): ckr_code = 0x00000115
class CKR_RANDOM_SEED_NOT_SUPPORTED		(CKR_Exception): ckr_code = 0x00000120
class CKR_RANDOM_NO_RNG				(CKR_Exception): ckr_code = 0x00000121
class CKR_DOMAIN_PARAMS_INVALID			(CKR_Exception): ckr_code = 0x00000130
class CKR_BUFFER_TOO_SMALL			(CKR_Exception): ckr_code = 0x00000150
class CKR_SAVED_STATE_INVALID			(CKR_Exception): ckr_code = 0x00000160
class CKR_INFORMATION_SENSITIVE			(CKR_Exception): ckr_code = 0x00000170
class CKR_STATE_UNSAVEABLE			(CKR_Exception): ckr_code = 0x00000180
class CKR_CRYPTOKI_NOT_INITIALIZED		(CKR_Exception): ckr_code = 0x00000190
class CKR_CRYPTOKI_ALREADY_INITIALIZED		(CKR_Exception): ckr_code = 0x00000191
class CKR_MUTEX_BAD				(CKR_Exception): ckr_code = 0x000001A0
class CKR_MUTEX_NOT_LOCKED			(CKR_Exception): ckr_code = 0x000001A1
class CKR_NEW_PIN_MODE				(CKR_Exception): ckr_code = 0x000001B0
class CKR_NEXT_OTP				(CKR_Exception): ckr_code = 0x000001B1
class CKR_EXCEEDED_MAX_ITERATIONS		(CKR_Exception): ckr_code = 0x000001B5
class CKR_FIPS_SELF_TEST_FAILED			(CKR_Exception): ckr_code = 0x000001B6
class CKR_LIBRARY_LOAD_FAILED			(CKR_Exception): ckr_code = 0x000001B7
class CKR_PIN_TOO_WEAK  			(CKR_Exception): ckr_code = 0x000001B8
class CKR_PUBLIC_KEY_INVALID			(CKR_Exception): ckr_code = 0x000001B9
class CKR_FUNCTION_REJECTED			(CKR_Exception): ckr_code = 0x00000200
class CKR_VENDOR_DEFINED			(CKR_Exception): ckr_code = 0x80000000

for e in globals().values():
  if isinstance(e, type) and issubclass(e, CKR_Exception) and e is not CKR_Exception:
    CKR_Exception.ckr_map[e.ckr_code] = e