cert.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /*
  2. * This crypt(3) validation program shipped with UFC-crypt
  3. * is derived from one distributed with Phil Karns PD DES package.
  4. *
  5. * @(#)cert.c 1.8 11 Aug 1996
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include "crypt.h"
  10. /* This file tests the deprecated setkey/encrypt interface. */
  11. #include <shlib-compat.h>
  12. #if TEST_COMPAT (libcrypt, GLIBC_2_0, GLIBC_2_28)
  13. #define libcrypt_version_reference(symbol, version) \
  14. _libcrypt_version_reference (symbol, VERSION_libcrypt_##version)
  15. #define _libcrypt_version_reference(symbol, version) \
  16. __libcrypt_version_reference (symbol, version)
  17. #define __libcrypt_version_reference(symbol, version) \
  18. __asm__ (".symver " #symbol ", " #symbol "@" #version)
  19. extern void setkey (const char *);
  20. extern void encrypt (const char *, int);
  21. libcrypt_version_reference (setkey, GLIBC_2_0);
  22. libcrypt_version_reference (encrypt, GLIBC_2_0);
  23. int totfails = 0;
  24. int main (int argc, char *argv[]);
  25. void get8 (char *cp);
  26. void put8 (char *cp);
  27. void good_bye (void) __attribute__ ((noreturn));
  28. void
  29. good_bye (void)
  30. {
  31. if(totfails == 0) {
  32. printf("Passed DES validation suite\n");
  33. exit(0);
  34. } else {
  35. printf("%d failures during DES validation suite!!!\n", totfails);
  36. exit(1);
  37. }
  38. }
  39. int
  40. main (int argc, char *argv[])
  41. {
  42. char key[64],plain[64],cipher[64],answer[64];
  43. int i;
  44. int test;
  45. int fail;
  46. for(test=0;!feof(stdin);test++){
  47. get8(key);
  48. printf(" K: "); put8(key);
  49. setkey(key);
  50. get8(plain);
  51. printf(" P: "); put8(plain);
  52. get8(answer);
  53. printf(" C: "); put8(answer);
  54. for(i=0;i<64;i++)
  55. cipher[i] = plain[i];
  56. encrypt(cipher, 0);
  57. for(i=0;i<64;i++)
  58. if(cipher[i] != answer[i])
  59. break;
  60. fail = 0;
  61. if(i != 64){
  62. printf(" Encrypt FAIL");
  63. fail++; totfails++;
  64. }
  65. encrypt(cipher, 1);
  66. for(i=0;i<64;i++)
  67. if(cipher[i] != plain[i])
  68. break;
  69. if(i != 64){
  70. printf(" Decrypt FAIL");
  71. fail++; totfails++;
  72. }
  73. if(fail == 0)
  74. printf(" OK");
  75. printf("\n");
  76. }
  77. good_bye();
  78. }
  79. void
  80. get8 (char *cp)
  81. {
  82. int i,j,t;
  83. for(i=0;i<8;i++){
  84. scanf("%2x",&t);
  85. if(feof(stdin))
  86. good_bye();
  87. for(j=0; j<8 ; j++) {
  88. *cp++ = (t & (0x01 << (7-j))) != 0;
  89. }
  90. }
  91. }
  92. void
  93. put8 (char *cp)
  94. {
  95. int i,j,t;
  96. for(i=0;i<8;i++){
  97. t = 0;
  98. for(j = 0; j<8; j++)
  99. t = (t<<1) | *cp++;
  100. printf("%02x", t);
  101. }
  102. }
  103. #else /* encrypt and setkey are not available. */
  104. int
  105. main (void)
  106. {
  107. return 77; /* UNSUPPORTED */
  108. }
  109. #endif