latex-tables.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
  2. /* SPDX-License-Identifier: Unlicense */
  3. /* print all PEM related infos */
  4. #include "tomcrypt_private.h"
  5. #if defined(LTC_PEM_SSH)
  6. extern const struct blockcipher_info pem_dek_infos[];
  7. extern const unsigned long pem_dek_infos_num;
  8. extern const struct blockcipher_info ssh_ciphers[];
  9. extern const unsigned long ssh_ciphers_num;
  10. static const struct {
  11. const char *is, *should;
  12. } cipher_name_map[] = {
  13. { "", "none" },
  14. { "aes", "AES" },
  15. { "blowfish", "Blowfish" },
  16. { "c20p1305", "ChaCha20Poly1305" },
  17. { "camellia", "Camellia" },
  18. { "cast5", "CAST5" },
  19. { "chacha20", "ChaCha20" },
  20. { "3des", "3DES (EDE)" },
  21. { "des", "DES" },
  22. { "desx", "DES-X" },
  23. { "idea", "IDEA" },
  24. { "rc5", "RC5" },
  25. { "rc2", "RC2" },
  26. { "seed", "SEED" },
  27. { "serpent", "Serpent" },
  28. { "twofish", "Twofish" },
  29. };
  30. static const char *s_map_cipher(const char *name)
  31. {
  32. unsigned long n;
  33. for (n = 0; n < LTC_ARRAY_SIZE(cipher_name_map); ++n) {
  34. if (strcmp(name, cipher_name_map[n].is) == 0)
  35. return cipher_name_map[n].should;
  36. }
  37. fprintf(stderr, "Error: Can't map %s\n", name);
  38. exit(1);
  39. }
  40. static const struct {
  41. enum cipher_mode mode;
  42. const char *name;
  43. } cipher_mode_map[] = {
  44. { cm_none, "none", },
  45. { cm_cbc, "CBC", },
  46. { cm_cfb, "CFB", },
  47. { cm_cfb1, "CFB1", },
  48. { cm_cfb8, "CFB8", },
  49. { cm_ctr, "CTR", },
  50. { cm_ofb, "OFB", },
  51. { cm_stream, "STREAM", },
  52. { cm_gcm, "GCM", },
  53. };
  54. static const char *s_map_mode(enum cipher_mode mode)
  55. {
  56. size_t n;
  57. mode &= cm_modes | cm_1bit | cm_8bit;
  58. for (n = 0; n < LTC_ARRAY_SIZE(cipher_mode_map); ++n) {
  59. if (cipher_mode_map[n].mode == mode)
  60. return cipher_mode_map[n].name;
  61. }
  62. fprintf(stderr, "Error: Can't map cipher_mode %d\n", mode);
  63. exit(1);
  64. }
  65. static void LTC_NORETURN die(int status)
  66. {
  67. FILE* o = status == EXIT_SUCCESS ? stdout : stderr;
  68. fprintf(o,
  69. "Usage: latex-tables [<-h>]\n\n"
  70. "Generate LaTeX tables from some library internal data.\n\n"
  71. "\t-h\tThe help you're looking at.\n"
  72. );
  73. exit(status);
  74. }
  75. static int s_to_lower(const char *in, char *out, unsigned long *outlen)
  76. {
  77. unsigned long n;
  78. for (n = 0; n < *outlen && in[n]; ++n) {
  79. out[n] = tolower(in[n]);
  80. }
  81. if (n == *outlen)
  82. return CRYPT_BUFFER_OVERFLOW;
  83. out[n] = '\0';
  84. *outlen = n;
  85. return CRYPT_OK;
  86. }
  87. int main(int argc, char **argv)
  88. {
  89. unsigned long n;
  90. if (argc > 1 && strstr(argv[1], "-h"))
  91. die(0);
  92. printf("PEM ciphers:\n\n");
  93. for (n = 0; n < pem_dek_infos_num; ++n) {
  94. char nbuf[32] = {0};
  95. size_t nlen = strlen(pem_dek_infos[n].name);
  96. memcpy(nbuf, pem_dek_infos[n].name, nlen);
  97. nbuf[nlen-1] = '}';
  98. printf("\\hline \\texttt{%-18s & %-15s & %-25ld & %-6s \\\\\n",
  99. nbuf, s_map_cipher(pem_dek_infos[n].algo),
  100. pem_dek_infos[n].keylen * 8,
  101. s_map_mode(pem_dek_infos[n].mode));
  102. }
  103. printf("\nSSH ciphers:\n\n");
  104. for (n = 0; n < ssh_ciphers_num; ++n) {
  105. char nbuf[32] = {0};
  106. size_t nlen = strlen(ssh_ciphers[n].name);
  107. memcpy(nbuf, ssh_ciphers[n].name, nlen);
  108. nbuf[nlen] = '}';
  109. printf("\\hline \\texttt{%-30s & %-16s & %-24ld & %-6s \\\\\n",
  110. nbuf, s_map_cipher(ssh_ciphers[n].algo),
  111. ssh_ciphers[n].keylen * 8,
  112. s_map_mode(ssh_ciphers[n].mode));
  113. }
  114. printf("\nECC curves:\n\n");
  115. for (n = 0; ltc_ecc_curves[n].OID != NULL; ++n) {
  116. const char * const *names;
  117. char lower[32] = {0}, buf[64] = {0};
  118. unsigned long m, bufl = 0, lowerl;
  119. int err = ecc_get_curve_names(ltc_ecc_curves[n].OID, &names);
  120. if (err != CRYPT_OK) {
  121. printf("\\error: OID %s not found (%s)\n", ltc_ecc_curves[n].OID, error_to_string(err));
  122. return EXIT_FAILURE;
  123. }
  124. for (m = 1; names[m]; ++m) {
  125. const char *name = names[m];
  126. if (memcmp(name, "P-", 2) == 0 || memcmp(name, "ECC-", 4) == 0) {
  127. /* Use the original name */
  128. } else {
  129. lowerl = sizeof(lower);
  130. if ((err = s_to_lower(name, lower, &lowerl)) != CRYPT_OK) {
  131. printf("\\error: %s could not be converted to lowercase (%s)\n", name, error_to_string(err));
  132. return EXIT_FAILURE;
  133. }
  134. name = lower;
  135. }
  136. if (m == 1) {
  137. err = snprintf(buf + bufl, sizeof(buf) - bufl, "%s", name);
  138. } else {
  139. err = snprintf(buf + bufl, sizeof(buf) - bufl, ", %s", name);
  140. }
  141. if (err == -1 || (unsigned)err > sizeof(buf) - bufl) {
  142. printf("\\error: snprintf returned %d at %s\n", err, name);
  143. return EXIT_FAILURE;
  144. }
  145. bufl += err;
  146. }
  147. lower[0] = '{';
  148. lowerl = sizeof(lower) - 2;
  149. if ((err = s_to_lower(names[0], &lower[1], &lowerl)) != CRYPT_OK) {
  150. printf("\\error: %s could not be converted to lowercase (%s)\n", names[0], error_to_string(err));
  151. return EXIT_FAILURE;
  152. }
  153. lower[lowerl + 1] = '}';
  154. lower[lowerl + 2] = '\0';
  155. printf("\\hline \\texttt%-17s & %-36s & %-21s \\\\\n", lower, buf, ltc_ecc_curves[n].OID);
  156. }
  157. return 0;
  158. }
  159. #else
  160. int main(void) { return EXIT_FAILURE; }
  161. #endif