static int valid(char *ciphertext, struct fmt_main *self) { char *ctcopy, *keeptr, *p; int len, cipher; if (strncmp(ciphertext, "$sshng$", 7) != 0) return 0; ctcopy = strdup(ciphertext); keeptr = ctcopy; ctcopy += 7; if ((p = strtokm(ctcopy, "$")) == NULL) /* cipher */ goto err; cipher = atoi(p); if ((p = strtokm(NULL, "$")) == NULL) /* salt len */ goto err; len = atoi(p); if(len > 16 || !len) goto err; if ((p = strtokm(NULL, "$")) == NULL) /* salt */ goto err; if(strlen(p) != len * 2) goto err; if (!ishex(p)) goto err; if ((p = strtokm(NULL, "$")) == NULL) /* ciphertext length */ goto err; len = atoi(p); if ((p = strtokm(NULL, "$")) == NULL) /* ciphertext */ goto err; if(strlen(p) != len * 2) goto err; if (!ishex(p)) goto err; if (cipher == 2) { if ((p = strtokm(NULL, "$")) == NULL) /* rounds */ goto err; if (!isdec(p)) goto err; } MEM_FREE(keeptr); return 1; err: MEM_FREE(keeptr); return 0; }
/* Input a number as decimal digits - returns value entered */ long decIn(void) { char input[40]; int num; int tmp; register int i; i = 0; num = 0; if (sgets (input)) /* grab a line */ { atod(input[i++], &num); /* Convert MSD to decimal */ while(isdec(input[i]) && input[i]) /* Get next decimal digit */ { num *= 10; /* Make room for next digit */ atod(input[i++], &tmp); num += tmp; /* Add it in */ } } return (num); }
static int valid(char *ciphertext, struct fmt_main *self) { char *ctcopy, *keeptr, *p; int len; if (strncmp(ciphertext, FORMAT_TAG, TAG_LENGTH) != 0) return 0; ctcopy = strdup(ciphertext); keeptr = ctcopy; ctcopy += TAG_LENGTH; if ((p = strtokm(ctcopy, "$")) == NULL) goto err; if (!strcmp(p, "v2")) { if ((p = strtokm(NULL, "$")) == NULL) goto err; if (!isdec(p)) goto err; if ((p = strtokm(NULL, "$")) == NULL) goto err; } len = atoi(p); if(len > BIG_ENOUGH || !len) goto err; if ((p = strtokm(NULL, "$")) == NULL) goto err; if (strlen(p) != len * 2 || !ishex(p)) goto err; MEM_FREE(keeptr); return 1; err: MEM_FREE(keeptr); return 0; }
/* * Match a keyword. */ static void match_kw(token * tok) { /* * FIXME. The ids are explicit in here so as to allow long-name * equivalents to the various very short keywords. * * This list must be sorted, it's searched using binary search. */ static const struct { char const *name; int id; } keywords[] = { { "#", c__comment} , /* comment command (\#) */ { "-", c__escaped} , /* nonbreaking hyphen */ { "A", c_A} , /* appendix heading */ { "B", c_B} , /* bibliography entry */ { "BR", c_BR} , /* bibliography rewrite */ { "C", c_C} , /* chapter heading */ { "H", c_H} , /* heading */ { "I", c_I} , /* invisible index mark */ { "IM", c_IM} , /* index merge/rewrite */ { "K", c_K} , /* capitalised cross-reference */ { "L", c_L} , /* Relative/local hyperlink */ { "R", c_R} , /* free text cross-reference */ { "U", c_U} , /* unnumbered-chapter heading */ { "W", c_W} , /* Web hyperlink */ { "\\", c__escaped} , /* escaped backslash (\\) */ { "_", c__nbsp} , /* nonbreaking space (\_) */ { "b", c_b} , /* bulletted list */ { "c", c_c} , /* code */ { "cfg", c_cfg} , /* configuration directive */ { "copyright", c_copyright} , /* copyright statement */ { "cw", c_cw} , /* weak code */ { "date", c_date} , /* document processing date */ { "define", c_define} , /* macro definition */ { "e", c_e} , /* emphasis */ { "i", c_i} , /* visible index mark */ { "ii", c_ii} , /* uncapitalised visible index mark */ { "k", c_k} , /* uncapitalised cross-reference */ { "n", c_n} , /* numbered list */ { "nocite", c_nocite} , /* bibliography trickery */ { "preamble", c_preamble} , /* document preamble text */ { "q", c_q} , /* quote marks */ { "rule", c_rule} , /* horizontal rule */ { "title", c_title} , /* document title */ { "versionid", c_versionid} , /* document RCS id */ { "{", c__escaped} , /* escaped lbrace (\{) */ { "}", c__escaped} , /* escaped rbrace (\}) */ }; int i, j, k, c; /* * Special cases: \S{0,1,2,...} and \uABCD. If the syntax * doesn't match correctly, we just fall through to the * binary-search phase. */ if (tok->text[0] == 'S') { /* We expect numeric characters thereafter. */ wchar_t *p = tok->text + 1; int n; if (!*p) n = 1; else { n = 0; while (*p && isdec(*p)) { n = 10 * n + fromdec(*p); p++; } } if (!*p) { tok->cmd = c_S; tok->aux = n; return; } } else if (tok->text[0] == 'u') { /* We expect hex characters thereafter. */ wchar_t *p = tok->text + 1; int n = 0; while (*p && ishex(*p)) { n = 16 * n + fromhex(*p); p++; } if (!*p) { tok->cmd = c_u; tok->aux = n; return; } } i = -1; j = sizeof(keywords) / sizeof(*keywords); while (j - i > 1) { k = (i + j) / 2; c = kwcmp(tok->text, keywords[k].name); if (c < 0) j = k; else if (c > 0) i = k; else { /* c == 0 */ tok->cmd = keywords[k].id; return; } } tok->cmd = c__invalid; }
static int valid(char *ciphertext, struct fmt_main *self) { char *ctcopy, *keeptr, *p; int res,j,spec,usage,algorithm,ex_flds=0; if (strncmp(ciphertext, "$gpg$*", 6) != 0) return 0; ctcopy = strdup(ciphertext); keeptr = ctcopy; ctcopy += 6; /* skip over "$gpg$" marker and '*' */ if ((p = strtokm(ctcopy, "*")) == NULL) /* algorithm */ goto err; algorithm = atoi(p); if ((p = strtokm(NULL, "*")) == NULL) /* datalen */ goto err; res = atoi(p); if (res > BIG_ENOUGH * 2) goto err; if ((p = strtokm(NULL, "*")) == NULL) /* bits */ goto err; if (!isdec(p)) goto err; if ((p = strtokm(NULL, "*")) == NULL) /* data */ goto err; if (strlen(p) != res * 2) goto err; if (!ishex(p)) goto err; if ((p = strtokm(NULL, "*")) == NULL) /* spec */ goto err; spec = atoi(p); if (!isdec(p)) goto err; if ((p = strtokm(NULL, "*")) == NULL) /* usage */ goto err; usage = atoi(p); if (!isdec(p)) goto err; if(usage != 0 && usage != 254 && usage != 255 && usage != 1) goto err; if ((p = strtokm(NULL, "*")) == NULL) /* hash_algorithm */ goto err; res = atoi(p); if (!isdec(p)) goto err; if(!valid_hash_algorithm(res, spec)) goto err; if ((p = strtokm(NULL, "*")) == NULL) /* cipher_algorithm */ goto err; res = atoi(p); if (!isdec(p)) goto err; if(!valid_cipher_algorithm(res)) goto err; if ((p = strtokm(NULL, "*")) == NULL) /* ivlen */ goto err; res = atoi(p); if (res != 8 && res != 16) goto err; if ((p = strtokm(NULL, "*")) == NULL) /* iv */ goto err; if (strlen(p) != res * 2) goto err; if (!ishex(p)) goto err; /* handle "SPEC_SIMPLE" correctly */ if ((spec != 0 || usage == 255)) ; else if (spec == 0) { MEM_FREE(keeptr); return 1; } if ((p = strtokm(NULL, "*")) == NULL) /* count */ goto err; if (!isdec(p)) goto err; res = atoi(p); if ((p = strtokm(NULL, "*")) == NULL) /* salt */ goto err; if (strlen(p) != SALT_LENGTH * 2) goto err; if (!ishex(p)) goto err; /* * For some test vectors, there are no more fields, * for others, there are (and need to be checked) * this logic taken from what happens in salt() */ if (usage == 255 && spec == 1 && algorithm == 17) { /* old hashes will crash!, "gpg --s2k-mode 1 --gen-key" */ ex_flds = 4; /* handle p, q, g, y */ } else if (usage == 255 && spec == 1 && algorithm == 16) { /* ElGamal */ ex_flds = 3; /* handle p, g, y */ } else if (usage == 255 && spec == 1) { /* RSA */ ex_flds = 1; /* handle p */ } else if (usage == 255 && spec == 3 && algorithm == 1) { /* gpg --homedir . --s2k-cipher-algo 3des --simple-sk-checksum --gen-key */ ex_flds = 1; /* handle p */ } else { /* NOT sure what to do here, probably nothing */ } p = strtokm(NULL, "*"); /* NOTE, do not goto err if null, we WANT p nul if there are no fields */ for (j = 0; j < ex_flds; ++j) { /* handle extra p, q, g, y fields */ if (!p) /* check for null p */ goto err; res = atoi(p); if (res > BIG_ENOUGH * 2) goto err; if ((p = strtokm(NULL, "*")) == NULL) goto err; if (strlen(p) != res * 2) /* validates res is a valid int */ goto err; if (!ishex(p)) goto err; p = strtokm(NULL, "*"); /* NOTE, do not goto err if null, we WANT p nul if there are no fields */ } if (p) /* at this point, there should be NO trailing stuff left from the hash. */ goto err; MEM_FREE(keeptr); return 1; err: MEM_FREE(keeptr); return 0; }
static int valid(char *ciphertext, struct fmt_main *self) { char *ctcopy, *keeptr, *p; int len, type, NumCyclesPower; if (strncmp(ciphertext, FORMAT_TAG, TAG_LENGTH) != 0) return 0; ctcopy = strdup(ciphertext); keeptr = ctcopy; ctcopy += TAG_LENGTH; if ((p = strtokm(ctcopy, "$")) == NULL) goto err; if (strlen(p) > 1) goto err; type = atoi(p); if (type != 0) goto err; if ((p = strtokm(NULL, "$")) == NULL) /* NumCyclesPower */ goto err; if (strlen(p) > 2) goto err; NumCyclesPower = atoi(p); if (NumCyclesPower > 24 || NumCyclesPower < 1) goto err; if ((p = strtokm(NULL, "$")) == NULL) /* salt length */ goto err; len = atoi(p); if(len > 16 || len < 0) /* salt length */ goto err; if ((p = strtokm(NULL, "$")) == NULL) /* salt */ goto err; if ((p = strtokm(NULL, "$")) == NULL) /* iv length */ goto err; if (strlen(p) > 2) goto err; len = atoi(p); if(len < 0 || len > 16) /* iv length */ goto err; if ((p = strtokm(NULL, "$")) == NULL) /* iv */ goto err; if (!ishex(p)) goto err; if (strlen(p) > len*2 && strcmp(p+len*2, "0000000000000000")) goto err; if ((p = strtokm(NULL, "$")) == NULL) /* crc */ goto err; if (!isdecu(p)) goto err; if ((p = strtokm(NULL, "$")) == NULL) /* data length */ goto err; len = atoi(p); if ((p = strtokm(NULL, "$")) == NULL) /* unpacksize */ goto err; if (!isdec(p)) /* no way to validate, other than atoi() works for it */ goto err; if ((p = strtokm(NULL, "$")) == NULL) /* data */ goto err; if (strlen(p) != len * 2) /* validates data_len atoi() */ goto err; MEM_FREE(keeptr); return 1; err: MEM_FREE(keeptr); return 0; }
static int valid(char *ciphertext, struct fmt_main *self) { char *ctcopy; char *keeptr; char *p; int res; if (strncmp(ciphertext, "$odf$*", 6)) return 0; ctcopy = strdup(ciphertext); keeptr = ctcopy; ctcopy += 6; if ((p = strtok(ctcopy, "*")) == NULL) /* cipher type */ goto err; if (strlen(p) != 1) goto err; res = atoi(p); if (res != 0 && res != 1) goto err; if ((p = strtok(NULL, "*")) == NULL) /* checksum type */ goto err; if (strlen(p) != 1) goto err; res = atoi(p); if (res != 0 && res != 1) goto err; if ((p = strtok(NULL, "*")) == NULL) /* iterations */ goto err; if (!isdec(p)) goto err; if ((p = strtok(NULL, "*")) == NULL) /* key size */ goto err; res = atoi(p); if (res != 16 && res != 32) goto err; if ((p = strtok(NULL, "*")) == NULL) /* checksum field (skipped) */ goto err; if ((p = strtok(NULL, "*")) == NULL) /* iv length */ goto err; res = atoi(p); if (res > 16 || res < 0) goto err; if ((p = strtok(NULL, "*")) == NULL) /* iv */ goto err; if (strlen(p) != res * 2) goto err; if (!ishex(p)) goto err; if ((p = strtok(NULL, "*")) == NULL) /* salt length */ goto err; if (strlen(p) >= 10) goto err; res = atoi(p); if (res > 32 || res < 0) goto err; if ((p = strtok(NULL, "*")) == NULL) /* salt */ goto err; if (strlen(p) != res * 2) goto err; if (!ishex(p)) goto err; if ((p = strtok(NULL, "*")) == NULL) /* something */ goto err; if ((p = strtok(NULL, "*")) == NULL) /* content */ goto err; res = strlen(p); if (res > 2048 || res & 1) goto err; if (!ishex(p)) goto err; MEM_FREE(keeptr); return 1; err: MEM_FREE(keeptr); return 0; }