fips_rand_selftest.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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. #include <string.h>
  50. #include <openssl/err.h>
  51. #include <openssl/fips.h>
  52. #include <openssl/rand.h>
  53. #include <openssl/fips_rand.h>
  54. #ifdef OPENSSL_FIPS
  55. typedef struct {
  56. unsigned char DT[16];
  57. unsigned char V[16];
  58. unsigned char R[16];
  59. } AES_PRNG_TV;
  60. /* The following test vectors are taken directly from the RGNVS spec */
  61. static unsigned char aes_128_key[16] =
  62. { 0xf3, 0xb1, 0x66, 0x6d, 0x13, 0x60, 0x72, 0x42,
  63. 0xed, 0x06, 0x1c, 0xab, 0xb8, 0xd4, 0x62, 0x02
  64. };
  65. static AES_PRNG_TV aes_128_tv[] = {
  66. {
  67. /* DT */
  68. {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62,
  69. 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x22, 0xf9},
  70. /* V */
  71. {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  72. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  73. /* R */
  74. {0x59, 0x53, 0x1e, 0xd1, 0x3b, 0xb0, 0xc0, 0x55,
  75. 0x84, 0x79, 0x66, 0x85, 0xc1, 0x2f, 0x76, 0x41}
  76. },
  77. {
  78. /* DT */
  79. {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62,
  80. 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x22, 0xfa},
  81. /* V */
  82. {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  83. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  84. /* R */
  85. {0x7c, 0x22, 0x2c, 0xf4, 0xca, 0x8f, 0xa2, 0x4c,
  86. 0x1c, 0x9c, 0xb6, 0x41, 0xa9, 0xf3, 0x22, 0x0d}
  87. },
  88. {
  89. /* DT */
  90. {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62,
  91. 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x22, 0xfb},
  92. /* V */
  93. {0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  94. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  95. /* R */
  96. {0x8a, 0xaa, 0x00, 0x39, 0x66, 0x67, 0x5b, 0xe5,
  97. 0x29, 0x14, 0x28, 0x81, 0xa9, 0x4d, 0x4e, 0xc7}
  98. },
  99. {
  100. /* DT */
  101. {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62,
  102. 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x22, 0xfc},
  103. /* V */
  104. {0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  105. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  106. /* R */
  107. {0x88, 0xdd, 0xa4, 0x56, 0x30, 0x24, 0x23, 0xe5,
  108. 0xf6, 0x9d, 0xa5, 0x7e, 0x7b, 0x95, 0xc7, 0x3a}
  109. },
  110. {
  111. /* DT */
  112. {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62,
  113. 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x22, 0xfd},
  114. /* V */
  115. {0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  116. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  117. /* R */
  118. {0x05, 0x25, 0x92, 0x46, 0x61, 0x79, 0xd2, 0xcb,
  119. 0x78, 0xc4, 0x0b, 0x14, 0x0a, 0x5a, 0x9a, 0xc8}
  120. },
  121. {
  122. /* DT */
  123. {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62,
  124. 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x23, 0x77},
  125. /* V */
  126. {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  127. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
  128. /* R */
  129. {0x0d, 0xd5, 0xa0, 0x36, 0x7a, 0x59, 0x26, 0xbc,
  130. 0x48, 0xd9, 0x38, 0xbf, 0xf0, 0x85, 0x8f, 0xea}
  131. },
  132. {
  133. /* DT */
  134. {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62,
  135. 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x23, 0x78},
  136. /* V */
  137. {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  138. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
  139. /* R */
  140. {0xae, 0x53, 0x87, 0xee, 0x8c, 0xd9, 0x12, 0xf5,
  141. 0x73, 0x53, 0xae, 0x03, 0xf9, 0xd5, 0x13, 0x33}
  142. },
  143. };
  144. static unsigned char aes_192_key[24] =
  145. { 0x15, 0xd8, 0x78, 0x0d, 0x62, 0xd3, 0x25, 0x6e,
  146. 0x44, 0x64, 0x10, 0x13, 0x60, 0x2b, 0xa9, 0xbc,
  147. 0x4a, 0xfb, 0xca, 0xeb, 0x4c, 0x8b, 0x99, 0x3b
  148. };
  149. static AES_PRNG_TV aes_192_tv[] = {
  150. {
  151. /* DT */
  152. {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1,
  153. 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0x4b},
  154. /* V */
  155. {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  156. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  157. /* R */
  158. {0x17, 0x07, 0xd5, 0x28, 0x19, 0x79, 0x1e, 0xef,
  159. 0xa5, 0x0c, 0xbf, 0x25, 0xe5, 0x56, 0xb4, 0x93}
  160. },
  161. {
  162. /* DT */
  163. {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1,
  164. 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0x4c},
  165. /* V */
  166. {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  167. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  168. /* R */
  169. {0x92, 0x8d, 0xbe, 0x07, 0xdd, 0xc7, 0x58, 0xc0,
  170. 0x6f, 0x35, 0x41, 0x9b, 0x17, 0xc9, 0xbd, 0x9b}
  171. },
  172. {
  173. /* DT */
  174. {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1,
  175. 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0x4d},
  176. /* V */
  177. {0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  178. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  179. /* R */
  180. {0xd5, 0xde, 0xf4, 0x50, 0xf3, 0xb7, 0x10, 0x4e,
  181. 0xb8, 0xc6, 0xf8, 0xcf, 0xe2, 0xb1, 0xca, 0xa2}
  182. },
  183. {
  184. /* DT */
  185. {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1,
  186. 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0x4e},
  187. /* V */
  188. {0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  189. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  190. /* R */
  191. {0xce, 0x29, 0x08, 0x43, 0xfc, 0x34, 0x41, 0xe7,
  192. 0x47, 0x8f, 0xb3, 0x66, 0x2b, 0x46, 0xb1, 0xbb}
  193. },
  194. {
  195. /* DT */
  196. {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1,
  197. 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0x4f},
  198. /* V */
  199. {0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  200. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  201. /* R */
  202. {0xb3, 0x26, 0x0f, 0xf5, 0xd6, 0xca, 0xa8, 0xbf,
  203. 0x89, 0xb8, 0x5e, 0x2f, 0x22, 0x56, 0x92, 0x2f}
  204. },
  205. {
  206. /* DT */
  207. {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1,
  208. 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0xc9},
  209. /* V */
  210. {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  211. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
  212. /* R */
  213. {0x05, 0xeb, 0x18, 0x52, 0x34, 0x43, 0x00, 0x43,
  214. 0x6e, 0x5a, 0xa5, 0xfe, 0x7b, 0x32, 0xc4, 0x2d}
  215. },
  216. {
  217. /* DT */
  218. {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1,
  219. 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0xca},
  220. /* V */
  221. {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  222. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
  223. /* R */
  224. {0x15, 0x3c, 0xe8, 0xd1, 0x04, 0xc7, 0xad, 0x50,
  225. 0x0b, 0xf0, 0x07, 0x16, 0xe7, 0x56, 0x7a, 0xea}
  226. },
  227. };
  228. static unsigned char aes_256_key[32] =
  229. { 0x6d, 0x14, 0x06, 0x6c, 0xb6, 0xd8, 0x21, 0x2d,
  230. 0x82, 0x8d, 0xfa, 0xf2, 0x7a, 0x03, 0xb7, 0x9f,
  231. 0x0c, 0xc7, 0x3e, 0xcd, 0x76, 0xeb, 0xee, 0xb5,
  232. 0x21, 0x05, 0x8c, 0x4f, 0x31, 0x7a, 0x80, 0xbb
  233. };
  234. static AES_PRNG_TV aes_256_tv[] = {
  235. {
  236. /* DT */
  237. {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5,
  238. 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9e, 0x88},
  239. /* V */
  240. {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  241. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  242. /* R */
  243. {0x35, 0xc7, 0xef, 0xa7, 0x78, 0x4d, 0x29, 0xbc,
  244. 0x82, 0x79, 0x99, 0xfb, 0xd0, 0xb3, 0x3b, 0x72}
  245. },
  246. {
  247. /* DT */
  248. {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5,
  249. 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9e, 0x89},
  250. /* V */
  251. {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  252. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  253. /* R */
  254. {0x6c, 0xf4, 0x42, 0x5d, 0xc7, 0x04, 0x1a, 0x41,
  255. 0x28, 0x2a, 0x78, 0xa9, 0xb0, 0x12, 0xc4, 0x95}
  256. },
  257. {
  258. /* DT */
  259. {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5,
  260. 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9e, 0x8a},
  261. /* V */
  262. {0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  263. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  264. /* R */
  265. {0x16, 0x90, 0xa4, 0xff, 0x7b, 0x7e, 0xb9, 0x30,
  266. 0xdb, 0x67, 0x4b, 0xac, 0x2d, 0xe1, 0xd1, 0x75}
  267. },
  268. {
  269. /* DT */
  270. {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5,
  271. 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9e, 0x8b},
  272. /* V */
  273. {0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  274. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  275. /* R */
  276. {0x14, 0x6f, 0xf5, 0x95, 0xa1, 0x46, 0x65, 0x30,
  277. 0xbc, 0x57, 0xe2, 0x4a, 0xf7, 0x45, 0x62, 0x05}
  278. },
  279. {
  280. /* DT */
  281. {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5,
  282. 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9e, 0x8c},
  283. /* V */
  284. {0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  285. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  286. /* R */
  287. {0x96, 0xe2, 0xb4, 0x1e, 0x66, 0x5e, 0x0f, 0xa4,
  288. 0xc5, 0xcd, 0xa2, 0x07, 0xcc, 0xb7, 0x94, 0x40}
  289. },
  290. {
  291. /* DT */
  292. {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5,
  293. 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9f, 0x06},
  294. /* V */
  295. {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  296. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
  297. /* R */
  298. {0x61, 0xce, 0x1d, 0x6a, 0x48, 0x75, 0x97, 0x28,
  299. 0x4b, 0x41, 0xde, 0x18, 0x44, 0x4f, 0x56, 0xec}
  300. },
  301. {
  302. /* DT */
  303. {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5,
  304. 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9f, 0x07},
  305. /* V */
  306. {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  307. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
  308. /* R */
  309. {0x52, 0x89, 0x59, 0x79, 0x2d, 0xaa, 0x28, 0xb3,
  310. 0xb0, 0x8a, 0x3e, 0x70, 0xfa, 0x71, 0x59, 0x84}
  311. },
  312. };
  313. void FIPS_corrupt_rng()
  314. {
  315. aes_192_tv[0].V[0]++;
  316. }
  317. # define fips_rand_test(key, tv) \
  318. do_rand_test(key, sizeof key, tv, sizeof(tv)/sizeof(AES_PRNG_TV))
  319. static int do_rand_test(unsigned char *key, int keylen,
  320. AES_PRNG_TV * tv, int ntv)
  321. {
  322. unsigned char R[16];
  323. int i;
  324. if (!FIPS_rand_set_key(key, keylen))
  325. return 0;
  326. for (i = 0; i < ntv; i++) {
  327. FIPS_rand_seed(tv[i].V, 16);
  328. FIPS_rand_set_dt(tv[i].DT);
  329. FIPS_rand_bytes(R, 16);
  330. if (memcmp(R, tv[i].R, 16))
  331. return 0;
  332. }
  333. return 1;
  334. }
  335. int FIPS_selftest_rng()
  336. {
  337. FIPS_rand_reset();
  338. if (!FIPS_rand_test_mode()) {
  339. FIPSerr(FIPS_F_FIPS_SELFTEST_RNG, FIPS_R_SELFTEST_FAILED);
  340. return 0;
  341. }
  342. if (!fips_rand_test(aes_128_key, aes_128_tv)
  343. || !fips_rand_test(aes_192_key, aes_192_tv)
  344. || !fips_rand_test(aes_256_key, aes_256_tv)) {
  345. FIPSerr(FIPS_F_FIPS_SELFTEST_RNG, FIPS_R_SELFTEST_FAILED);
  346. return 0;
  347. }
  348. FIPS_rand_reset();
  349. return 1;
  350. }
  351. #endif