| Index: third_party/fips181/convert.cc
|
| diff --git a/third_party/fips181/convert.cc b/third_party/fips181/convert.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9b4ef8507ae68b35be45ef7452418f12e096d8c8
|
| --- /dev/null
|
| +++ b/third_party/fips181/convert.cc
|
| @@ -0,0 +1,407 @@
|
| +/*
|
| +** Copyright (c) 1999, 2000, 2001, 2002, 2003
|
| +** Adel I. Mirzazhanov. All rights reserved
|
| +**
|
| +** Redistribution and use in source and binary forms, with or without
|
| +** modification, are permitted provided that the following conditions
|
| +** are met:
|
| +**
|
| +** 1.Redistributions of source code must retain the above copyright notice,
|
| +** this list of conditions and the following disclaimer.
|
| +** 2.Redistributions in binary form must reproduce the above copyright
|
| +** notice, this list of conditions and the following disclaimer in the
|
| +** documentation and/or other materials provided with the distribution.
|
| +** 3.The name of the author may not be used to endorse or promote products
|
| +** derived from this software without specific prior written permission.
|
| +**
|
| +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
| +** OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
| +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
| +** ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
| +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
| +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
| +** GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
| +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
| +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
| +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
| +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| +*/
|
| +
|
| +#include <stdlib.h>
|
| +#include <string.h>
|
| +#if !defined(WIN32) && !defined(_WIN32) && !defined(__WIN32) && !defined(__WIN32__)
|
| +#include <strings.h>
|
| +#endif
|
| +#ifndef APGBFM
|
| +# include "errs.h"
|
| +# include "randpass.h"
|
| +#endif
|
| +
|
| +#include "convert.h"
|
| +
|
| +/*
|
| +** GLOBALS
|
| +*/
|
| +
|
| +/* small letters */
|
| +char let[26] =
|
| + {
|
| + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
|
| + 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
|
| + 'u', 'v', 'w', 'x', 'w', 'z'
|
| + };
|
| +/* capital letters */
|
| +char clet[26] =
|
| + {
|
| + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
| + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
|
| + 'U', 'V', 'W', 'X', 'W', 'Z'
|
| + };
|
| +
|
| +/*
|
| +** FUNCTIONS
|
| +*/
|
| +
|
| +/*
|
| +** decapitalize() - This routine replaces all capital letters
|
| +** to small letters in the word:
|
| +** INPUT:
|
| +** char * - word.
|
| +** OUTPUT:
|
| +** none.
|
| +** NOTES:
|
| +** none.
|
| +*/
|
| +void
|
| +decapitalize (char *word)
|
| +{
|
| + int i = 0; /* counter */
|
| + int j = 0; /* counter */
|
| + int str_len = strlen(word);
|
| + for(j = 0; j < str_len; j++)
|
| + for(i=0; i < 26; i++)
|
| + if(word[j] == clet[i])
|
| + word[j] = let[i];
|
| +}
|
| +
|
| +#ifndef APGBFM
|
| +/*
|
| +** capitalize() - This routine designed to modify sullable like this:
|
| +** adel ----> Adel
|
| +** dot ----> Dot
|
| +** etc.
|
| +** INPUT:
|
| +** char * - syllable.
|
| +** OUTPUT:
|
| +** none.
|
| +** NOTES:
|
| +** none.
|
| +*/
|
| +void
|
| +capitalize (char *syllable)
|
| +{
|
| + char tmp = 0x00;
|
| + int i = 0;
|
| + if ( randint(2) == TRUE)
|
| + {
|
| + (void)memcpy((void *)&tmp, (void *)syllable, sizeof(tmp));
|
| + for(i=0; i < 26; i++)
|
| + if ( let[i] == tmp )
|
| + if (is_restricted_symbol(clet[i]) != TRUE)
|
| + (void)memcpy ((void *)syllable, (void *)&clet[i], 1);
|
| + }
|
| +}
|
| +
|
| +/*
|
| +** numerize() - This routine designed to modify single-letter
|
| +** syllable like this:
|
| +** a ----> 1 or 2 or 3 etc.
|
| +** u ----> 1 or 2 or 3 etc.
|
| +** etc.
|
| +** INPUT:
|
| +** char * - single-letter syllable
|
| +** OUTPUT:
|
| +** none.
|
| +** NOTES:
|
| +** none.
|
| +*/
|
| +void
|
| +numerize (char *syllable)
|
| +{
|
| + char *tmp;
|
| + if ( (tmp = (char *)calloc(1, 4)) == NULL)
|
| + err_sys_fatal("calloc");
|
| + if ( strlen (syllable) == 1 )
|
| + {
|
| + (void) gen_rand_symbol(tmp, S_NB);
|
| + (void)memcpy ((void *)syllable, (void *)tmp, 1);
|
| + }
|
| + free ((void *)tmp);
|
| +}
|
| +/*
|
| +** specialize() - This routine designed to modify single-letter syllable
|
| +** like this:
|
| +** a ----> # or $ or % etc.
|
| +** u ----> # or $ or % etc.
|
| +** etc.
|
| +** INPUT:
|
| +** char * - single-letter syllable.
|
| +** OUTPUT:
|
| +** none.
|
| +** NOTES:
|
| +** none.
|
| +*/
|
| +void
|
| +specialize (char *syllable)
|
| +{
|
| + char *tmp;
|
| + if ( (tmp = (char *)calloc(1, 4)) == NULL)
|
| + err_sys_fatal("calloc");
|
| + if ( strlen (syllable) == 1 )
|
| + {
|
| + (void) gen_rand_symbol(tmp, S_SS);
|
| + (void)memcpy ((void *)syllable, (void *)tmp, 1);
|
| + }
|
| + free ((void *)tmp);
|
| +}
|
| +
|
| +/*
|
| +** symb2name - convert symbol to it's name
|
| +** INPUT:
|
| +** char * - one symbol syllable
|
| +** OUTPUT:
|
| +** none.
|
| +** NOTES:
|
| +** none.
|
| +*/
|
| +void
|
| +symb2name(char * syllable, char * h_syllable)
|
| +{
|
| + struct ssymb_names
|
| + {
|
| + char symbol;
|
| + char *name;
|
| + };
|
| + static struct ssymb_names ssn[42] =
|
| + {
|
| + {'1',"ONE"},
|
| + {'2',"TWO"},
|
| + {'3',"THREE"},
|
| + {'4',"FOUR"},
|
| + {'5',"FIVE"},
|
| + {'6',"SIX"},
|
| + {'7',"SEVEN"},
|
| + {'8',"EIGHT"},
|
| + {'9',"NINE"},
|
| + {'0',"ZERO"},
|
| + {33, "EXCLAMATION_POINT"},
|
| + {34, "QUOTATION_MARK"},
|
| + {35, "CROSSHATCH"},
|
| + {36, "DOLLAR_SIGN"},
|
| + {37, "PERCENT_SIGN"},
|
| + {38, "AMPERSAND"},
|
| + {39, "APOSTROPHE"},
|
| + {40, "LEFT_PARENTHESIS"},
|
| + {41, "RIGHT_PARENTHESIS"},
|
| + {42, "ASTERISK"},
|
| + {43, "PLUS_SIGN"},
|
| + {44, "COMMA"},
|
| + {45, "HYPHEN"},
|
| + {46, "PERIOD"},
|
| + {47, "SLASH"},
|
| + {58, "COLON"},
|
| + {59, "SEMICOLON"},
|
| + {60, "LESS_THAN"},
|
| + {61, "EQUAL_SIGN"},
|
| + {62, "GREATER_THAN"},
|
| + {63, "QUESTION_MARK"},
|
| + {64, "AT_SIGN"},
|
| + {91, "LEFT_BRACKET"},
|
| + {92, "BACKSLASH"},
|
| + {93, "RIGHT_BRACKET"},
|
| + {94, "CIRCUMFLEX"},
|
| + {95, "UNDERSCORE"},
|
| + {96, "GRAVE"},
|
| + {123, "LEFT_BRACE"},
|
| + {124, "VERTICAL_BAR"},
|
| + {125, "RIGHT_BRACE"},
|
| + {126, "TILDE"}
|
| + };
|
| + int i = 0;
|
| + int flag = FALSE;
|
| +
|
| + if (strlen(syllable) == 1)
|
| + {
|
| + for (i = 0; i < 42; i++)
|
| + {
|
| + if(*syllable == ssn[i].symbol)
|
| + {
|
| + (void)memcpy((void*)h_syllable, (void*)ssn[i].name, strlen(ssn[i].name));
|
| + flag = TRUE;
|
| + }
|
| + }
|
| + if (flag != TRUE)
|
| + (void)memcpy((void*)h_syllable, (void*)syllable, strlen(syllable));
|
| + }
|
| +}
|
| +
|
| +/*
|
| +** spell_word - spell the word
|
| +** INPUT:
|
| +** char * - pointer to the word
|
| +** char * - pointer to the spelled word
|
| +** OUTPUT:
|
| +** char * - pointer to the spelled word
|
| +** NULL - something is wrong
|
| +** NOTES:
|
| +** You should free() memory pointed by spelled_word after each use of spell_word
|
| +*/
|
| +char *
|
| +spell_word(char * word, char * spelled_word)
|
| +{
|
| + struct char_spell
|
| + {
|
| + char symbol;
|
| + char *name;
|
| + };
|
| + static struct char_spell cs[94] =
|
| + {
|
| + {'1',"ONE" },
|
| + {'2',"TWO" },
|
| + {'3',"THREE" },
|
| + {'4',"FOUR" },
|
| + {'5',"FIVE" },
|
| + {'6',"SIX" },
|
| + {'7',"SEVEN" },
|
| + {'8',"EIGHT" },
|
| + {'9',"NINE" },
|
| + {'0',"ZERO" },
|
| + {'A', "Alfa" },
|
| + {'B', "Bravo" },
|
| + {'C', "Charlie" },
|
| + {'D', "Delta" },
|
| + {'E', "Echo" },
|
| + {'F', "Foxtrot" },
|
| + {'G', "Golf" },
|
| + {'H', "Hotel" },
|
| + {'I', "India" },
|
| + {'J', "Juliett" },
|
| + {'K', "Kilo" },
|
| + {'L', "Lima" },
|
| + {'M', "Mike" },
|
| + {'N', "November" },
|
| + {'O', "Oscar" },
|
| + {'P', "Papa" },
|
| + {'Q', "Quebec" },
|
| + {'R', "Romeo" },
|
| + {'S', "Sierra" },
|
| + {'T', "Tango" },
|
| + {'U', "Uniform" },
|
| + {'V', "Victor" },
|
| + {'W', "Whiskey" },
|
| + {'X', "X_ray" },
|
| + {'Y', "Yankee" },
|
| + {'Z', "Zulu" },
|
| + {'a', "alfa" },
|
| + {'b', "bravo" },
|
| + {'c', "charlie" },
|
| + {'d', "delta" },
|
| + {'e', "echo" },
|
| + {'f', "foxtrot" },
|
| + {'g', "golf" },
|
| + {'h', "hotel" },
|
| + {'i', "india" },
|
| + {'j', "juliett" },
|
| + {'k', "kilo" },
|
| + {'l', "lima" },
|
| + {'m', "mike" },
|
| + {'n', "november" },
|
| + {'o', "oscar" },
|
| + {'p', "papa" },
|
| + {'q', "quebec" },
|
| + {'r', "romeo" },
|
| + {'s', "sierra" },
|
| + {'t', "tango" },
|
| + {'u', "uniform" },
|
| + {'v', "victor" },
|
| + {'w', "whiskey" },
|
| + {'x', "x_ray" },
|
| + {'y', "yankee" },
|
| + {'z', "zulu" },
|
| + {33, "EXCLAMATION_POINT"},
|
| + {34, "QUOTATION_MARK" },
|
| + {35, "CROSSHATCH" },
|
| + {36, "DOLLAR_SIGN" },
|
| + {37, "PERCENT_SIGN" },
|
| + {38, "AMPERSAND" },
|
| + {39, "APOSTROPHE" },
|
| + {40, "LEFT_PARENTHESIS" },
|
| + {41, "RIGHT_PARENTHESIS"},
|
| + {42, "ASTERISK" },
|
| + {43, "PLUS_SIGN" },
|
| + {44, "COMMA" },
|
| + {45, "HYPHEN" },
|
| + {46, "PERIOD" },
|
| + {47, "SLASH" },
|
| + {58, "COLON" },
|
| + {59, "SEMICOLON" },
|
| + {60, "LESS_THAN" },
|
| + {61, "EQUAL_SIGN" },
|
| + {62, "GREATER_THAN" },
|
| + {63, "QUESTION_MARK" },
|
| + {64, "AT_SIGN" },
|
| + {91, "LEFT_BRACKET" },
|
| + {92, "BACKSLASH" },
|
| + {93, "RIGHT_BRACKET" },
|
| + {94, "CIRCUMFLEX" },
|
| + {95, "UNDERSCORE" },
|
| + {96, "GRAVE" },
|
| + {123, "LEFT_BRACE" },
|
| + {124, "VERTICAL_BAR" },
|
| + {125, "RIGHT_BRACE" },
|
| + {126, "TILDE" }
|
| + };
|
| + int s_length = 0;
|
| + int i = 0;
|
| + int j = 0;
|
| + int word_len = strlen(word);
|
| + char * tmp_ptr;
|
| + char hyphen = '-';
|
| + char zero = 0x00;
|
| +
|
| + /* Count the length of the spelled word */
|
| + for (i=0; i <= word_len; i++)
|
| + for (j=0; j < 94; j++)
|
| + if (word[i] == cs[j].symbol)
|
| + {
|
| + s_length = s_length + strlen(cs[j].name) + 1;
|
| + continue;
|
| + }
|
| +
|
| + /* Allocate memory for spelled word */
|
| + if ( (spelled_word = (char *)calloc(1, (size_t)s_length)) == NULL)
|
| + return(NULL);
|
| +
|
| + /* Construct spelled word */
|
| + tmp_ptr = spelled_word;
|
| +
|
| + for (i=0; i < word_len; i++)
|
| + for (j=0; j < 94; j++)
|
| + if (word[i] == cs[j].symbol)
|
| + {
|
| + (void) memcpy((void *)tmp_ptr, (void *)cs[j].name, strlen(cs[j].name));
|
| + tmp_ptr = tmp_ptr + strlen(cs[j].name);
|
| + /* Place the hyphen after each symbol */
|
| + (void) memcpy((void *)(tmp_ptr), (void *)&hyphen, 1);
|
| + tmp_ptr = tmp_ptr + 1;
|
| + continue;
|
| + }
|
| +
|
| + /* Remove hyphen at the end of the word */
|
| + tmp_ptr = tmp_ptr - 1;
|
| + (void) memcpy((void *)(tmp_ptr), (void *)&zero, 1);
|
| +
|
| + return (spelled_word);
|
| +}
|
| +
|
| +#endif /* APGBFM */
|
|
|