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; }
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))); } }