fips_des_selftest.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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/des.h>
  53. #include <openssl/opensslconf.h>
  54. #ifdef OPENSSL_FIPS
  55. static struct
  56. {
  57. DES_cblock key;
  58. unsigned char plaintext[8];
  59. unsigned char ciphertext[8];
  60. } tests[]=
  61. {
  62. {
  63. { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
  64. { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
  65. { 0x8C,0xA6,0x4D,0xE9,0xC1,0xB1,0x23,0xA7 }
  66. },
  67. {
  68. { 0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10 },
  69. { 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF },
  70. { 0xED,0x39,0xD9,0x50,0xFA,0x74,0xBC,0xC4 },
  71. },
  72. };
  73. static struct
  74. {
  75. DES_cblock key1;
  76. DES_cblock key2;
  77. unsigned char plaintext[8];
  78. unsigned char ciphertext[8];
  79. } tests2[]=
  80. {
  81. {
  82. { 0x7c,0x4f,0x6e,0xf7,0xa2,0x04,0x16,0xec },
  83. { 0x0b,0x6b,0x7c,0x9e,0x5e,0x19,0xa7,0xc4 },
  84. { 0x06,0xa7,0xd8,0x79,0xaa,0xce,0x69,0xef },
  85. { 0x4c,0x11,0x17,0x55,0xbf,0xc4,0x4e,0xfd }
  86. },
  87. {
  88. { 0x5d,0x9e,0x01,0xd3,0x25,0xc7,0x3e,0x34 },
  89. { 0x01,0x16,0x7c,0x85,0x23,0xdf,0xe0,0x68 },
  90. { 0x9c,0x50,0x09,0x0f,0x5e,0x7d,0x69,0x7e },
  91. { 0xd2,0x0b,0x18,0xdf,0xd9,0x0d,0x9e,0xff },
  92. }
  93. };
  94. static struct
  95. {
  96. DES_cblock key1;
  97. DES_cblock key2;
  98. DES_cblock key3;
  99. unsigned char plaintext[8];
  100. unsigned char ciphertext[8];
  101. } tests3[]=
  102. {
  103. {
  104. { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
  105. { 0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10 },
  106. { 0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0 },
  107. { 0x8f,0x8f,0xbf,0x9b,0x5d,0x48,0xb4,0x1c},
  108. { 0x59,0x8c,0xe5,0xd3,0x6c,0xa2,0xea,0x1b},
  109. },
  110. {
  111. { 0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,0xFE },
  112. { 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF },
  113. { 0xED,0x39,0xD9,0x50,0xFA,0x74,0xBC,0xC4 },
  114. { 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF },
  115. { 0x11,0x25,0xb0,0x35,0xbe,0xa0,0x82,0x86 },
  116. },
  117. };
  118. void FIPS_corrupt_des()
  119. {
  120. tests[0].plaintext[0]++;
  121. }
  122. int FIPS_selftest_des()
  123. {
  124. int n;
  125. /* Encrypt/decrypt with DES and compare to known answers */
  126. for(n=0 ; n < 2 ; ++n)
  127. {
  128. DES_key_schedule key;
  129. DES_cblock buf;
  130. DES_set_key(&tests[n].key,&key);
  131. DES_ecb_encrypt(&tests[n].plaintext,&buf,&key,1);
  132. if(memcmp(buf,tests[n].ciphertext,sizeof buf))
  133. {
  134. FIPSerr(FIPS_F_FIPS_SELFTEST_DES,FIPS_R_SELFTEST_FAILED);
  135. return 0;
  136. }
  137. DES_ecb_encrypt(&tests[n].ciphertext,&buf,&key,0);
  138. if(memcmp(buf,tests[n].plaintext,sizeof buf))
  139. {
  140. FIPSerr(FIPS_F_FIPS_SELFTEST_DES,FIPS_R_SELFTEST_FAILED);
  141. return 0;
  142. }
  143. }
  144. /* Encrypt/decrypt with 2-key 3DES and compare to known answers */
  145. for(n=0 ; n < 2 ; ++n)
  146. {
  147. DES_key_schedule key1, key2;
  148. unsigned char buf[8];
  149. DES_set_key(&tests2[n].key1,&key1);
  150. DES_set_key(&tests2[n].key2,&key2);
  151. DES_ecb2_encrypt(tests2[n].plaintext,buf,&key1,&key2,1);
  152. if(memcmp(buf,tests2[n].ciphertext,sizeof buf))
  153. {
  154. FIPSerr(FIPS_F_FIPS_SELFTEST_DES,FIPS_R_SELFTEST_FAILED);
  155. return 0;
  156. }
  157. DES_ecb2_encrypt(tests2[n].ciphertext,buf,&key1,&key2,0);
  158. if(memcmp(buf,tests2[n].plaintext,sizeof buf))
  159. {
  160. FIPSerr(FIPS_F_FIPS_SELFTEST_DES,FIPS_R_SELFTEST_FAILED);
  161. return 0;
  162. }
  163. }
  164. /* Encrypt/decrypt with 3DES and compare to known answers */
  165. for(n=0 ; n < 2 ; ++n)
  166. {
  167. DES_key_schedule key1, key2, key3;
  168. unsigned char buf[8];
  169. DES_set_key(&tests3[n].key1,&key1);
  170. DES_set_key(&tests3[n].key2,&key2);
  171. DES_set_key(&tests3[n].key3,&key3);
  172. DES_ecb3_encrypt(tests3[n].plaintext,buf,&key1,&key2,&key3,1);
  173. if(memcmp(buf,tests3[n].ciphertext,sizeof buf))
  174. {
  175. FIPSerr(FIPS_F_FIPS_SELFTEST_DES,FIPS_R_SELFTEST_FAILED);
  176. return 0;
  177. }
  178. DES_ecb3_encrypt(tests3[n].ciphertext,buf,&key1,&key2,&key3,0);
  179. if(memcmp(buf,tests3[n].plaintext,sizeof buf))
  180. {
  181. FIPSerr(FIPS_F_FIPS_SELFTEST_DES,FIPS_R_SELFTEST_FAILED);
  182. return 0;
  183. }
  184. }
  185. return 1;
  186. }
  187. #endif