Beispiel #1
0
static void *
skey_salt(char *ciphertext)
{
	static struct skey_salt_st salt;
	static char buf[128];
	char *p;

	strnzcpy(buf, ciphertext, sizeof(buf));

	if ((p = strtok(buf, " \t")) == NULL)
		return (NULL);

	if (isalpha(*p)) {
		strnzcpy(salt.type, p, sizeof(salt.type));
		if ((p = strtok(NULL, " \t")) == NULL)
			return (NULL);
	}
	else strnzcpy(salt.type, "md4", sizeof(salt.type));

	salt.num = atoi(p);

	if ((p = strtok(NULL, " \t")) == NULL)
		return (NULL);

	strnzcpy(salt.seed, p, sizeof(salt.seed) - 1);

	if ((p = strtok(NULL, " \t")) == NULL)
		return (NULL);

	hex_decode(p, salt.hash, sizeof(salt.hash));

	return (&salt);
}
Beispiel #2
0
/**
 * void * krb5_salt                                                 // {{{
 * 
 */
static void * krb5_salt(char *ciphertext) {
    
    struct salt *salt = NULL;
    char *data = ciphertext, *p;
    
    // check the presence of $krb5$
    if (strncmp(data, MAGIC_PREFIX, strlen(MAGIC_PREFIX)) == 0) {
        // advance past the $krb5$ string
        data += strlen(MAGIC_PREFIX);

        // allocate memory for the struct
        salt = malloc(sizeof(struct salt));
        if (salt == NULL)
            return NULL;

        // find and copy the user field 
        p = strchr(data, '$');
        strnzcpy(salt->user, data, (p - data) + 1);
        data = p + 1;
        
        // find and copy the realm field 
        p = strchr(data, '$');
        strnzcpy(salt->realm, data, (p - data) + 1);
        data = p + 1;
        
        // copy over the TGT in a binary form to the salt struct
        hex2bin(data, (unsigned char *) salt->tgt_ebin, TGT_SIZE);        
    }
    return salt;
}
/**
 * void * krb5_salt                                                 // {{{
 *
 */
static void * krb5_salt(char *ciphertext) {
    static struct salt salt;
    char *data = ciphertext, *p;
    int n;

    // advance past the $krb5$ string - it was checked for in valid()
    data += strlen(MAGIC_PREFIX);

    // find and copy the user field
    p = strchr(data, '$');
    if (!p)
	return NULL;
    n = (p - data) + 1;
    if (n >= sizeof(salt.user))
	return NULL;
    strnzcpy(salt.user, data, n);
    data = p + 1;

    // find and copy the realm field
    p = strchr(data, '$');
    if (!p)
	return NULL;
    n = (p - data) + 1;
    if (n >= sizeof(salt.realm))
	return NULL;
    strnzcpy(salt.realm, data, n);
    data = p + 1;

    // copy over the TGT in a binary form to the salt struct
    p = hex2bin(data, (unsigned char *) salt.tgt_ebin, TGT_SIZE);
    if (*p || p - data != TGT_SIZE * 2)
	return NULL;

    return &salt;
}
Beispiel #4
0
char *abspath(char *dst,size_t dstSize,const char *path) {
	if(*path != '/') {
		/* translate "abc://def" to "/dev/abc/def" */
		const char *p = path;
		while(*p) {
			if(p[0] == ':' && p[1] == '/' && p[2] == '/') {
				size_t slen = p - path;
				strncpy(dst,"/dev/",SSTRLEN("/dev/"));
				strncpy(dst + SSTRLEN("/dev/"),path,slen);
				strnzcpy(dst + SSTRLEN("/dev/") + slen,p + 2,dstSize - (SSTRLEN("/dev/") + slen));
				return dst;
			}
			p++;
		}

		/* prepend CWD */
		size_t len = getenvto(dst,dstSize,"CWD");
		if(len < dstSize - 1 && dst[len - 1] != '/') {
			dst[len++] = '/';
			dst[len] = '\0';
		}
		strnzcpy(dst + len,path,dstSize - len);
		return dst;
	}
	return (char*)path;
}
Beispiel #5
0
int reply(info_t * in) {
   char *p;

   if (in->cmd == cmd_numeric && in->numeric == 1) {
      strnzcpy(in->me, in->argv[0], NICKLEN+1);
   } else if (in->cmd == cmd_nick) {
      if (!strcasecmp(in->sender_nick, in->me)) {
	if (strlen(in->tail))
          strnzcpy(in->me, in->tail, NICKLEN+1);
        else if (strlen(in->argv[0]))
	  strnzcpy(in->me, in->argv[0], NICKLEN+1);
	if (!strcasecmp(in->me, wantednick))
		wantednick[0] = '\0';
      } else if (wantednick[0] && !strcasecmp(in->sender_nick, wantednick)){
      	irc_send("NICK %s", wantednick);
        lasttry = time(NULL);
      }
   } else if (in->cmd == cmd_numeric && in->numeric == 433 && !in->me[0]) {
      irc_send("NICK %s_", in->argv[1]);
      lasttry = time(NULL);
      strnzcpy(wantednick, in->argv[1], NICKLEN+1);
   } else if (in->cmd == cmd_privmsg && CHECKAUTH(in->sender, UL_OP)) {
      in->tail = skip_nick(in->tail, in->me);
      if(!tail_cmd(&in->tail, "nick") && (p = tail_getp(&in->tail))) {
         irc_send("NICK %s", p);
         lasttry = time(NULL);
	 strnzcpy(wantednick, p, NICKLEN+1);
      }
      if(!tail_cmd(&in->tail, "whoareyou"))
	irc_privmsg(to_sender(in), "I am %s", in->me);
   }
   return 0;
}
Beispiel #6
0
static void set_key(char *key, int index)
{
  if(!key) return;
  key_len = strlen(key);
  // Yes, I'm overwriting the last byte of the salt, perhaps the coder at ElektoPost whom wrote the EPiServer password checking function used to be a C coder (their code is written in .NET)
  strnzcpy(global_salt+SALT_LENGTH-1, key, PLAINTEXT_LENGTH + 1);
}
static void set_key(char *key, int index)
{
#ifdef MMX_COEF
	int len;
	int i;

	if(index==0)
	{
		total_len = 0;
		memset(saved_key, 0, sizeof(saved_key));
		memset(length, 0, sizeof(length));
	}
	len = strlen(key);
	if(len>PLAINTEXT_LENGTH)
		len = PLAINTEXT_LENGTH;

	length[index] = len;

	total_len += (len + SALT_SIZE) << ( ( (32/MMX_COEF) * index ) );
	for(i=0;i<len;i++)
		saved_key[GETPOS(i, index)] = key[i];

	saved_key[GETPOS( (i+SALT_SIZE) , index)] = 0x80;
#else
	strnzcpy(saved_key, key, PLAINTEXT_LENGTH+1);
#endif
}
static char *split(char *ciphertext, int index, struct fmt_main *self)
{
	static char out[TOTAL_LENGTH + 1];
	char *data;

	if (!strncmp(ciphertext, "$mskrb5$", 8)) {
		char in[TOTAL_LENGTH + 1];
		char *c, *t;

		strnzcpy(in, ciphertext, sizeof(in));

		t = strrchr(in, '$'); *t++ = 0;
		c = strrchr(in, '$'); *c++ = 0;

		snprintf(out, sizeof(out), "$krb5pa$23$$$$%s%s", t, c);
	} else {
		char *tc;

		tc = strrchr(ciphertext, '$');

		snprintf(out, sizeof(out), "$krb5pa$23$$$$%s", ++tc);
	}

	data = out + strlen(out) - 2 * (CHECKSUM_SIZE + TIMESTAMP_SIZE) - 1;
	strlwr(data);

	return out;
}
Beispiel #9
0
static void status_print_cracking(char *percent)
{
	unsigned int time = status_get_time();
	char *key, saved_key[PLAINTEXT_BUFFER_SIZE];
	char s_cps[64];

	if (!(options.flags & FLG_STATUS_CHK)) {
		if ((key = crk_get_key2()))
			strnzcpy(saved_key, key, PLAINTEXT_BUFFER_SIZE);
		else
			saved_key[0] = 0;
	}

	fprintf(stderr,
		"guesses: %u  "
		"time: %u:%02u:%02u:%02u"
		"%s  "
		"c/s: %s",
		status.guess_count,
		time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60,
		percent,
		status_get_cps(s_cps));

	if ((options.flags & FLG_STATUS_CHK) ||
	    !(status.crypts.lo | status.crypts.hi))
		fputc('\n', stderr);
	else
		fprintf(stderr,
			"  trying: %s%s%s\n",
			crk_get_key1(), saved_key[0] ? " - " : "", saved_key);
}
Beispiel #10
0
void path_init(char **argv)
{
#if JOHN_SYSTEMWIDE
	struct passwd *pw;
#ifdef JOHN_PRIVATE_HOME
	const char *private;
#endif
#else
	char *pos;
#endif

#if JOHN_SYSTEMWIDE
	john_home_path = mem_alloc(PATH_BUFFER_SIZE);
	strnzcpy(john_home_path, JOHN_SYSTEMWIDE_HOME "/", PATH_BUFFER_SIZE);
	john_home_length = strlen(john_home_path);

	if (user_home_path) return;
	pw = getpwuid(getuid());
	endpwent();
	if (!pw) return;

	user_home_length = strlen(pw->pw_dir) + 1;
	if (user_home_length >= PATH_BUFFER_SIZE) return;

	user_home_path = mem_alloc(PATH_BUFFER_SIZE);
	memcpy(user_home_path, pw->pw_dir, user_home_length - 1);
	user_home_path[user_home_length - 1] = '/';

#ifdef JOHN_PRIVATE_HOME
	private = path_expand(JOHN_PRIVATE_HOME);
Beispiel #11
0
static int
skey_valid(char *ciphertext, struct fmt_main *self)
{
	char *p, *q, buf[24];

	if (*ciphertext == '#')
		return (0);

	strnzcpy(buf, ciphertext, sizeof(buf));

	if ((p = strchr(buf, ' ')) == NULL)
		return (0);
	*p++ = '\0';

	if (isalpha(*buf)) {
		if (skey_set_algorithm(buf) == NULL ||
		    (q = strchr(p, ' ')) == NULL)
			return (0);
		*q = '\0';
	}
	else p = buf;

	for ( ; *p; p++) {
		if (!isdigit(*p))
			return (0);
	}
	return (1);
}
Beispiel #12
0
static void charset_filter_plaintexts(struct db_main *db)
{
	struct list_entry *current, *last;
	unsigned char *ptr;
	char key[PLAINTEXT_BUFFER_SIZE];

	last = NULL;
	if ((current = db->plaintexts->head))
	do {
		if (!current->data[0]) {
			list_del_next(db->plaintexts, last);
			continue;
		}

		for (ptr = (unsigned char *)current->data; *ptr; ptr++)
		if (*ptr < CHARSET_MIN || *ptr > CHARSET_MAX) {
			list_del_next(db->plaintexts, last);
			break;
		}
		if (*ptr) continue;

		strnzcpy(key, current->data, PLAINTEXT_BUFFER_SIZE);
		if (ext_filter(key)) {
			if (strlen(key) <= strlen(current->data))
				strcpy(current->data, key);
		} else {
			list_del_next(db->plaintexts, last);
			continue;
		}

		last = current;
	} while ((current = current->next));
}
Beispiel #13
0
char *strip_suffixes(const char *src, const char *suffixes[], int count)
{
	int i, suflen, retlen, done;
	static char ret[PATH_BUFFER_SIZE + 1];

	done = ret[0] = 0;
	if (src == NULL)
		return ret;

	strnzcpy(ret, src, sizeof(ret));
	if (suffixes == NULL)
		return ret;

	while (done == 0) {
		done = 1;
		for (i = 0; i < count; i++) {
			if (!suffixes[i] || !*suffixes[i])
				continue;
			retlen = strlen(ret);
			suflen = strlen(suffixes[i]);
			if (retlen >= suflen && !strcmp(&ret[retlen - suflen], suffixes[i])) {
				ret[retlen - suflen] = 0;
				done = 0;
			}
		}
	}
	return ret;
}
static void set_key(char *key, int index)
{
#ifdef MMX_COEF
	int len;
	int i;

	if(index==0)
	{
		memset(saved_key, 0, sizeof(saved_key));
	}
	len = strlen(key);
	if(len>PLAINTEXT_LENGTH)
		len = PLAINTEXT_LENGTH;

	length[index] = len;

	for(i=0;i<len;i++)
		saved_key[GETPOS(i, index)] = key[i];

	saved_key[GETPOS( (i+SALT_SIZE) , index)] = 0x80;
	((unsigned int *)saved_key)[15*MMX_COEF+index] = (len+SALT_SIZE)<<3;
#else
	strnzcpy(saved_key, key, PLAINTEXT_LENGTH+1);
#endif
}
Beispiel #15
0
/**
 * void krb5_set_key                                                // {{{
 * 
 */
static void krb5_set_key(char *key, int index) {   

    // copy the string key to the saved key
    memset(skey.passwd, 0x00, MAX_PASS_LEN);
    strnzcpy(skey.passwd, key, sizeof(skey.passwd));

}
static char *split(char *ciphertext, int index, struct fmt_main *self)
{
	static char out[MAX_CIPHERTEXT_LENGTH + 1];

	strnzcpy(out, ciphertext, sizeof(out));
	strlwr(out);
	return out;
}
Beispiel #17
0
// Handle a .include "file"   or a .include <file>
static int cfg_process_directive_include_config(char *line, int number)
{
	char *p, *p2, *saved_fname;
	char Name[PATH_BUFFER_SIZE];
	// Ok, we are including a file.
	if (!strncmp(line, ".include \"", 10)) {
		p = &line[10];
		p2 = strchr(&p[1], '\"');
		if (!p2) {
			fprintf(stderr, "ERROR, invalid config include line:  %s\n", line);
#ifndef BENCH_BUILD
			log_event("! ERROR, invalid config include line:  %s", line);
#endif
			return 1;
		}
		*p2 = 0;
		strnzcpy(Name, p, PATH_BUFFER_SIZE);
	}
	else {
		p = &line[10];
		p2 = strchr(&p[1], '>');
		if (!p2) {
			fprintf(stderr, "ERROR, invalid config include line:  %s\n", line);
#ifndef BENCH_BUILD
			log_event("! ERROR, invalid config include line:  %s", line);
#endif
			return 1;
		}
		*p2 = 0;
		strcpy(Name, "$JOHN/");
		strnzcpy(&Name[6], p, PATH_BUFFER_SIZE - 6);
	}
	if (cfg_recursion == 20) {
		fprintf(stderr, "ERROR, .include recursion too deep in john.ini processing file .include \"%s\"\n", p);
#ifndef BENCH_BUILD
		log_event("! ERROR, .include recursion too deep in john.ini processing file .include \"%s\"", p);
#endif
		return 1;
	}
	saved_fname = cfg_name;
	cfg_recursion++;
	cfg_init(Name, 0);
	cfg_recursion--;
	cfg_name = saved_fname;
	return 0;
}
static char *split(char *ciphertext, int index, struct fmt_main *self)
{
	static char out[CIPHERTEXT_LENGTH + 1];

	strnzcpy(out, ciphertext, CIPHERTEXT_LENGTH + 1);
	strlwr(strrchr(out, '#'));

	return out;
}
Beispiel #19
0
static void
krb4_set_key(char *key, int index)
{
	if (saved_salt->realm[0] != '\0')
		afs_string_to_key(key, saved_salt->realm, &saved_key.key);
	else
		des_string_to_key(key, &saved_key.key);

	strnzcpy(saved_key.string, key, sizeof(saved_key.string));
}
Beispiel #20
0
/*
 * JamGetProp
 *
 *      Parse a text buffer of property name-value pairs and return
 *      the value of the property identified by <propName>. <buffer>
 *      is a NUL-terminated string containing text in the following format:
 *
 *              "Prop-Name1: prop value 1\nProp-Name2: prop value 2..."
 *
 * Return-value:
 *
 *      A pointer into the buffer of the first non-space character of
 *      the property value. <*length> returns the length of the property
 *      value, excluding any trailing white-space characters.
 *
 *      If the given property is not found in <buffer>, NULL is returned.
 */
char* JamGetProp(char* buffer, char* name, int* length) {
    char* p;
    char* retval;
    int len;

    for (p=buffer;*p;) {
        if (strncmp(p, name, strlen(name)) != 0) {
            while (*p) {
                if (*p == '\n') {
                    ++p;
                    break;
                }
                ++ p;
            }
            continue;
        }
        p += strlen(name);
        while (*p && *p != '\n' && IS_SPACE(*p)) {
            p++;
        }
        if (*p == ':') {
            p++;
        }
        while (*p && *p != '\n' && IS_SPACE(*p)) {
            p++;
        }
        retval = p;
        while (*p && *p != '\n') {
            p++;
        }
        while (p > retval && IS_SPACE(*p)) {
            p--;
        }
        len = (p - retval + 1);

        if (length == NULL) { /* DUP the string */
            char * newStr;
            if ((newStr = browser_malloc(len + 1)) == NULL) {
                return NULL;
            }
            strnzcpy(newStr, retval, len);
            newStr[len] = 0;
            for (p=newStr; *p; p++) {
                if (*p == '\r') {
                    *p = '\0';
                }
            }
            return newStr;
        } else {
            *length = len;
            return retval;
        }
    }
    return NULL;
}
void crypt_all(int count)
{
  static SHA_CTX ctx;

  // Yes, I'm overwriting the last byte of the salt, perhaps the coder at ElektoPost whom wrote the EPiServer password checking function used to be a C coder (their code is written in .NET)
  strnzcpy(global_salt+SALT_LENGTH-1, global_key, PLAINTEXT_LENGTH);

  SHA1_Init(&ctx);
  SHA1_Update(&ctx, (unsigned char*)global_salt, SALT_LENGTH+strlen(global_key));
  SHA1_Final((unsigned char*)global_crypt, &ctx);
}
NODE *lerasefile(NODE *arg)
{
    char *fnstr;

    arg = cnv_node_to_strnode(car(arg));
    if (arg == UNBOUND) return(UNBOUND);
    fnstr = malloc((size_t)getstrlen(arg) + 1);
    strnzcpy(fnstr, getstrptr(arg), getstrlen(arg));
    unlink(fnstr);
    free(fnstr);
    return(UNBOUND);
}
Beispiel #23
0
ssize_t getenvito(char *name,size_t nameSize,size_t index) {
	if(index >= envcount())
		return -EINVAL;

	char *val = strchr(environ[index],'=');
	if(!val)
		return -EFAULT;
	*val = '\0';
	size_t len = strnzcpy(name,environ[index],nameSize);
	*val = '=';
	return len;
}
Beispiel #24
0
static void status_print_cracking(char *percent)
{
	unsigned int time = status_get_time();
	char *key1, key2[PLAINTEXT_BUFFER_SIZE];
	int64 g;
	char s_gps[32], s_pps[32], s_crypts_ps[32], s_combs_ps[32];
	char s[1024], *p;
	int n;

	key1 = NULL;
	key2[0] = 0;
	if (!(options.flags & FLG_STATUS_CHK) &&
	    (status.crypts.lo | status.crypts.hi)) {
		char *key = crk_get_key2();
		if (key)
			strnzcpy(key2, key, sizeof(key2));
		key1 = crk_get_key1();
	}

	p = s;
	if (options.fork) {
		n = sprintf(p, "%u ", options.node_min);
		if (n > 0)
			p += n;
	}

	g.lo = status.guess_count; g.hi = 0;
	n = sprintf(p,
	    "%ug %u:%02u:%02u:%02u%.100s %.31sg/s ",
	    status.guess_count,
	    time / 86400, time % 86400 / 3600, time % 3600 / 60, time % 60,
	    percent,
	    status_get_cps(s_gps, &g, 0));
	if (n > 0)
		p += n;

	if (!status.compat) {
		n = sprintf(p,
		    "%.31sp/s %.31sc/s ",
		    status_get_cps(s_pps, &status.cands, 0),
		    status_get_cps(s_crypts_ps, &status.crypts, 0));
		if (n > 0)
			p += n;
	}

	n = sprintf(p, "%.31sC/s%s%.200s%s%.200s\n",
	    status_get_cps(s_combs_ps, &status.combs, status.combs_ehi),
	    key1 ? " " : "", key1 ? key1 : "", key2[0] ? ".." : "", key2);
	if (n > 0)
		p += n;

	fwrite(s, p - s, 1, stderr);
}
Beispiel #25
0
/*
 * Translates a flo line using rf_rules.
 * Returns 0 if no rf_rules defined, otherwise returned value
 * should be free()'d
 */
char *trans_flo_line (char *s, RF_RULE *rf_rules)
{
  RF_RULE *curr;
  char buf[MAXPATHLEN + 1];

  if (rf_rules)
  {
    char *w;

    strnzcpy (buf, s, MAXPATHLEN);
    for (curr = rf_rules; curr; curr = curr->next)
    {
      w = ed (buf, curr->from, curr->to, NULL);
      strnzcpy (buf, w, MAXPATHLEN);
      free (w);
    }
    return xstrdup (buf);
  }
  else
    return 0;
}
Beispiel #26
0
ssize_t getenvto(char *value,size_t valSize,const char *name) {
	char **var = environ;
	size_t len = strlen(name);
	while(*var) {
		char *val = strchr(*var,'=');
		if(val) {
			if(len == (size_t)(val - *var) && strncmp(*var,name,len) == 0)
				return strnzcpy(value,val + 1,valSize);
		}
		var++;
	}
	return -ENOTFOUND;
}
FILE *open_file(NODE *arg, char *access)
{
    char *fnstr;
    FILE *tstrm;

    ref(arg);
    arg = reref(arg, cnv_node_to_strnode(arg));
    if (arg == UNBOUND) return(NULL);
    fnstr = (char *) malloc((size_t)getstrlen(arg) + 1);
    strnzcpy(fnstr, getstrptr(arg), getstrlen(arg));
    tstrm = fopen(fnstr, access);
    deref(arg);
    free(fnstr);
    return(tstrm);
}
Beispiel #28
0
NODE *lerasefile(NODE *arg) {
    char *fnstr;

    arg = cnv_node_to_strnode(car(arg));
    if (arg == UNBOUND) return(UNBOUND);
    fnstr = malloc((size_t)getstrlen(arg) + 1);
    if (fnstr == NULL) {
	err_logo(FILE_ERROR, make_static_strnode(message_texts[MEM_LOW]));
	return UNBOUND;
    }
    strnzcpy(fnstr, getstrptr(arg), getstrlen(arg));
    unlink(fnstr);
    free(fnstr);
    return(UNBOUND);
}
static void set_key(char *key, int index)
{
#ifdef SIMD_COEF_32
	const ARCH_WORD_32 *wkey = (ARCH_WORD_32*)key;
	ARCH_WORD_32 *keybuffer = &((ARCH_WORD_32*)saved_key)[(index&(SIMD_COEF_32-1)) + (unsigned int)index/SIMD_COEF_32*SHA_BUF_SIZ*SIMD_COEF_32];
	ARCH_WORD_32 *keybuf_word = keybuffer;
	unsigned int len;
	ARCH_WORD_32 temp;

	len = 0;
	while((unsigned char)(temp = *wkey++)) {
		if (!(temp & 0xff00))
		{
			*keybuf_word = JOHNSWAP((temp & 0xff) | (0x80 << 8));
			len++;
			goto key_cleaning;
		}
		if (!(temp & 0xff0000))
		{
			*keybuf_word = JOHNSWAP((temp & 0xffff) | (0x80 << 16));
			len+=2;
			goto key_cleaning;
		}
		if (!(temp & 0xff000000))
		{
			*keybuf_word = JOHNSWAP(temp | (0x80 << 24));
			len+=3;
			goto key_cleaning;
		}
		*keybuf_word = JOHNSWAP(temp);
		len += 4;
		keybuf_word += SIMD_COEF_32;
	}
	*keybuf_word = 0x80000000;

key_cleaning:
	keybuf_word += SIMD_COEF_32;
	while(*keybuf_word) {
		*keybuf_word = 0;
		keybuf_word += SIMD_COEF_32;
	}

	saved_len[index] = len;
#else
	strnzcpy(saved_key[index], key, PLAINTEXT_LENGTH + 1);
#endif
}
Beispiel #30
0
static void *get_salt(char *ciphertext)
{
	char *ctcopy = strdup(ciphertext);
	char *keeptr = ctcopy;
	char *p;
	int i;
	static struct custom_salt cs;

	ctcopy += 10;   /* skip over "$postgres$" */
	p = strtok(ctcopy, "*");
	strnzcpy((char*)cs.user, p, MAX_USERNAME_LEN + 1);
	p = strtok(NULL, "*");
	for (i = 0; i < 4; i++)
		cs.salt[i] = atoi16[ARCH_INDEX(p[i * 2])] * 16
			+ atoi16[ARCH_INDEX(p[i * 2 + 1])];
	MEM_FREE(keeptr);
	return (void *)&cs;
}