Esempio n. 1
0
int build_code(Dst_DECL)
{
  int ret = 0;
  size_t codesz = 0;
  uint8_t* code = NULL;

  int nglob = GLOB_MAX;
  void **glob = (void **)malloc(nglob*sizeof(void *));
  memset(glob, 0, nglob*sizeof(void *));

  dasm_init(Dst, DASM_MAXSECTION);
  dasm_setupglobal(Dst, glob, nglob);
  dasm_setup(Dst, build_actionlist);

  (void)create_backend(Dst);

  /* Finalize */
  (void)dasm_checkstep(Dst, -1); /* sanity check */
  if((ret = dasm_link(Dst, &codesz))) return ret;
  code = (uint8_t *)pa_malloc(codesz, true);
  if((ret = dasm_encode(Dst, (void *)code))) return ret;

  //write_raw("debug.out", code, codesz);

  dasm_gen_func fp = (dasm_gen_func)code;
  ret = fp();

  printf("generated function return value = %d\n",ret);

  dasm_free(Dst);
  free(glob);
  free(code);
  return 0;
}
Esempio n. 2
0
static void _digest(Request& r, MethodParams& params) {
	const String &smethod = params.as_string(0, PARAMETER_MUST_BE_STRING);

	Value& vdata=params.as_no_junction(1, "parameter must be string or file");

	String::C data;
	if(const String* sdata=vdata.get_string()){
		String::Body body=sdata->cstr_to_string_body_untaint(String::L_AS_IS, r.connection(false), &r.charsets); // explode content, honor tainting changes
		data=String::C(body.cstr(), body.length());
	} else {
		VFile *file=vdata.as_vfile(String::L_AS_IS);
		data=String::C(file->value_ptr(),file->value_size());
	}

	enum Method { M_MD5, M_SHA1, M_SHA256, M_SHA512 } method;

	if (smethod == "md5") method = M_MD5;
	else if (smethod == "sha1" ) method = M_SHA1;
	else if (smethod == "sha256" ) method = M_SHA256;
	else if (smethod == "sha512" ) method = M_SHA512;
	else throw Exception(PARSER_RUNTIME, &smethod, "must be 'md5' or 'sha1'");

	const char *hmac=0;
	enum Format { F_HEX, F_BASE64 } format = F_HEX;

	if(params.count() == 3)
		if(HashStringValue* options=params.as_hash(2)) {
			int valid_options=0;
			if(Value* value=options->get("hmac")) {
				hmac=value->as_string().cstr();
				valid_options++;
			}
			if(Value* value=options->get("format")) {
				const String& sformat=value->as_string();
				if (sformat == "hex") format = F_HEX;
				else if (sformat == "base64" ) format = F_BASE64;
				else throw Exception(PARSER_RUNTIME, &sformat, "must be 'hex' or 'base64'");
				valid_options++;
			}
			if(valid_options!=options->count())
				throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION);
		}

	String::C digest;

	if(method == M_MD5){
		PA_MD5_CTX c;
		if(hmac){
			HMAC(hmac, pa_MD5Init, pa_MD5Update, pa_MD5Final, 64, 16);
		} else {
			pa_MD5Init(&c);
			pa_MD5Update(&c, (const unsigned char*)data.str, data.length);
		}
		char *str=(char *)pa_malloc(16);
		pa_MD5Final((unsigned char *)str, &c);
		digest = String::C(str, 16);
	}

	if(method == M_SHA1){
		SHA1Context c;
		if(hmac){
			HMAC(hmac, SHA1Reset, SHA1Input, SHA1ReadDigest, 64, 20);
		} else {
			SHA1Reset(&c);
			SHA1Input(&c, (const unsigned char*)data.str, data.length);
		}
		char *str=(char *)pa_malloc(20);
		SHA1ReadDigest(str, &c);
		digest = String::C(str, 20);
	}

	if(method == M_SHA256){
		SHA256_CTX c;
		if(hmac){
			HMAC(hmac, pa_SHA256_Init, pa_SHA256_Update, pa_SHA256_Final, 64, SHA256_DIGEST_LENGTH);
		} else {
			pa_SHA256_Init(&c);
			pa_SHA256_Update(&c, (const unsigned char*)data.str, data.length);
		}
		char *str=(char *)pa_malloc(SHA256_DIGEST_LENGTH);
		pa_SHA256_Final((unsigned char *)str, &c);
		digest = String::C(str, SHA256_DIGEST_LENGTH);
	}

	if(method == M_SHA512){
		SHA512_CTX c;
		if(hmac){
			HMAC(hmac, pa_SHA512_Init, pa_SHA512_Update, pa_SHA512_Final, 128, SHA512_DIGEST_LENGTH);
		} else {
			pa_SHA512_Init(&c);
			pa_SHA512_Update(&c, (const unsigned char*)data.str, data.length);
		}
		char *str=(char *)pa_malloc(SHA512_DIGEST_LENGTH);
		pa_SHA512_Final((unsigned char *)str, &c);
		digest = String::C(str, SHA512_DIGEST_LENGTH);
	}

	if(format == F_HEX){
		r.write_pass_lang(*new String(hex_string((unsigned char *)digest.str, digest.length, false)));
	}
	if(format == F_BASE64){
		r.write_pass_lang(*new String(pa_base64_encode(digest.str, digest.length)));
	}
}