fips_rand_selftest.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /* ====================================================================
  2. * Copyright (c) 2003 The OpenSSL Project. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. *
  11. * 2. Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in
  13. * the documentation and/or other materials provided with the
  14. * distribution.
  15. *
  16. * 3. All advertising materials mentioning features or use of this
  17. * software must display the following acknowledgment:
  18. * "This product includes software developed by the OpenSSL Project
  19. * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
  20. *
  21. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  22. * endorse or promote products derived from this software without
  23. * prior written permission. For written permission, please contact
  24. * openssl-core@openssl.org.
  25. *
  26. * 5. Products derived from this software may not be called "OpenSSL"
  27. * nor may "OpenSSL" appear in their names without prior written
  28. * permission of the OpenSSL Project.
  29. *
  30. * 6. Redistributions of any form whatsoever must retain the following
  31. * acknowledgment:
  32. * "This product includes software developed by the OpenSSL Project
  33. * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
  34. *
  35. * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  36. * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  37. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  38. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  39. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  41. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  42. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  43. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  44. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  45. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  46. * OF THE POSSIBILITY OF SUCH DAMAGE.
  47. *
  48. */
  49. #define OPENSSL_FIPSAPI
  50. #include <string.h>
  51. #include <openssl/err.h>
  52. #include <openssl/fips.h>
  53. #include <openssl/rand.h>
  54. #include <openssl/fips_rand.h>
  55. #include "fips_locl.h"
  56. #ifdef OPENSSL_FIPS
  57. typedef struct
  58. {
  59. unsigned char DT[16];
  60. unsigned char V[16];
  61. unsigned char R[16];
  62. } AES_PRNG_TV;
  63. /* The following test vectors are taken directly from the RGNVS spec */
  64. static unsigned char aes_128_key[16] =
  65. {0xf3,0xb1,0x66,0x6d,0x13,0x60,0x72,0x42,
  66. 0xed,0x06,0x1c,0xab,0xb8,0xd4,0x62,0x02};
  67. static AES_PRNG_TV aes_128_tv =
  68. {
  69. /* DT */
  70. {0xe6,0xb3,0xbe,0x78,0x2a,0x23,0xfa,0x62,
  71. 0xd7,0x1d,0x4a,0xfb,0xb0,0xe9,0x22,0xf9},
  72. /* V */
  73. {0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  74. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  75. /* R */
  76. {0x59,0x53,0x1e,0xd1,0x3b,0xb0,0xc0,0x55,
  77. 0x84,0x79,0x66,0x85,0xc1,0x2f,0x76,0x41}
  78. };
  79. static unsigned char aes_192_key[24] =
  80. {0x15,0xd8,0x78,0x0d,0x62,0xd3,0x25,0x6e,
  81. 0x44,0x64,0x10,0x13,0x60,0x2b,0xa9,0xbc,
  82. 0x4a,0xfb,0xca,0xeb,0x4c,0x8b,0x99,0x3b};
  83. static AES_PRNG_TV aes_192_tv =
  84. {
  85. /* DT */
  86. {0x3f,0xd8,0xff,0xe8,0x80,0x69,0x8b,0xc1,
  87. 0xbf,0x99,0x7d,0xa4,0x24,0x78,0xf3,0x4b},
  88. /* V */
  89. {0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  90. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  91. /* R */
  92. {0x17,0x07,0xd5,0x28,0x19,0x79,0x1e,0xef,
  93. 0xa5,0x0c,0xbf,0x25,0xe5,0x56,0xb4,0x93}
  94. };
  95. static unsigned char aes_256_key[32] =
  96. {0x6d,0x14,0x06,0x6c,0xb6,0xd8,0x21,0x2d,
  97. 0x82,0x8d,0xfa,0xf2,0x7a,0x03,0xb7,0x9f,
  98. 0x0c,0xc7,0x3e,0xcd,0x76,0xeb,0xee,0xb5,
  99. 0x21,0x05,0x8c,0x4f,0x31,0x7a,0x80,0xbb};
  100. static AES_PRNG_TV aes_256_tv =
  101. {
  102. /* DT */
  103. {0xda,0x3a,0x41,0xec,0x1d,0xa3,0xb0,0xd5,
  104. 0xf2,0xa9,0x4e,0x34,0x74,0x8e,0x9e,0x88},
  105. /* V */
  106. {0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  107. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  108. /* R */
  109. {0x35,0xc7,0xef,0xa7,0x78,0x4d,0x29,0xbc,
  110. 0x82,0x79,0x99,0xfb,0xd0,0xb3,0x3b,0x72}
  111. };
  112. #define fips_x931_test(key, tv) \
  113. do_x931_test(key, sizeof key, &tv)
  114. static int do_x931_test(unsigned char *key, int keylen,
  115. AES_PRNG_TV *tv)
  116. {
  117. unsigned char R[16];
  118. int rv = 1;
  119. if (!FIPS_x931_set_key(key, keylen))
  120. return 0;
  121. if (!fips_post_started(FIPS_TEST_X931, keylen, NULL))
  122. return 1;
  123. if (!fips_post_corrupt(FIPS_TEST_X931, keylen, NULL))
  124. tv->V[0]++;
  125. FIPS_x931_seed(tv->V, 16);
  126. FIPS_x931_set_dt(tv->DT);
  127. FIPS_x931_bytes(R, 16);
  128. if (memcmp(R, tv->R, 16))
  129. {
  130. fips_post_failed(FIPS_TEST_X931, keylen, NULL);
  131. rv = 0;
  132. }
  133. else if (!fips_post_success(FIPS_TEST_X931, keylen, NULL))
  134. return 0;
  135. return rv;
  136. }
  137. int FIPS_selftest_x931()
  138. {
  139. int rv = 1;
  140. FIPS_x931_reset();
  141. if (!FIPS_x931_test_mode())
  142. {
  143. FIPSerr(FIPS_F_FIPS_SELFTEST_X931,FIPS_R_SELFTEST_FAILED);
  144. return 0;
  145. }
  146. if (!fips_x931_test(aes_128_key,aes_128_tv))
  147. rv = 0;
  148. if (!fips_x931_test(aes_192_key, aes_192_tv))
  149. rv = 0;
  150. if (!fips_x931_test(aes_256_key, aes_256_tv))
  151. rv = 0;
  152. FIPS_x931_reset();
  153. if (!rv)
  154. FIPSerr(FIPS_F_FIPS_SELFTEST_X931,FIPS_R_SELFTEST_FAILED);
  155. return rv;
  156. }
  157. #endif