static UINT ITERATE_AppSearch(MSIRECORD *row, LPVOID param) { MSIPACKAGE *package = param; LPCWSTR propName, sigName; LPWSTR value = NULL; MSISIGNATURE sig; MSIRECORD *uirow; UINT r; /* get property and signature */ propName = MSI_RecordGetString(row, 1); sigName = MSI_RecordGetString(row, 2); TRACE("%s %s\n", debugstr_w(propName), debugstr_w(sigName)); r = search_sig_name( package, sigName, &sig, &value ); if (value) { r = msi_set_property( package->db, propName, value, -1 ); if (r == ERROR_SUCCESS && !strcmpW( propName, szSourceDir )) msi_reset_source_folders( package ); msi_free(value); } free_signature( &sig ); uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, propName ); MSI_RecordSetStringW( uirow, 2, sigName ); MSI_ProcessMessage(package, INSTALLMESSAGE_ACTIONDATA, uirow); msiobj_release( &uirow->hdr ); return r; }
static UINT ITERATE_CCPSearch(MSIRECORD *row, LPVOID param) { MSIPACKAGE *package = param; LPCWSTR signature; LPWSTR value = NULL; MSISIGNATURE sig; UINT r = ERROR_SUCCESS; static const WCHAR success[] = {'C','C','P','_','S','u','c','c','e','s','s',0}; signature = MSI_RecordGetString(row, 1); TRACE("%s\n", debugstr_w(signature)); search_sig_name( package, signature, &sig, &value ); if (value) { TRACE("Found signature %s\n", debugstr_w(signature)); msi_set_property( package->db, success, szOne, -1 ); msi_free(value); r = ERROR_NO_MORE_ITEMS; } free_signature(&sig); return r; }
/* Parse a Signature Message into a newly-allocated SignatureMsg structure */ SignatureMsg parse_signature(const char *msg) { SignatureMsg smsg = NULL; size_t lenp; unsigned char *raw = decode(msg, &lenp); unsigned char *bufp = raw; if (!raw) goto inv; smsg = calloc(1, sizeof(struct s_SignatureMsg)); if (!smsg) { free(raw); goto inv; } smsg->raw = raw; require_len(3); smsg->version = bufp[1]; if (!memcmp(bufp, "\x00\x03\x12", 3)) { bufp += 3; lenp -= 3; read_int(smsg->sender_instance); read_int(smsg->receiver_instance); } else if (!memcmp(bufp, "\x00\x02\x12", 3)) { bufp += 3; lenp -= 3; smsg->sender_instance = 0; smsg->receiver_instance = 0; } else goto inv; read_int(smsg->encsiglen); smsg->encsig = malloc(smsg->encsiglen); if (!smsg->encsig && smsg->encsiglen > 0) goto inv; read_raw(smsg->encsig, smsg->encsiglen); read_raw(smsg->mac, 20); if (lenp != 0) goto inv; return smsg; inv: free_signature(smsg); return NULL; }
void pbs_test(char *data) { pbs_parameters pbs; pbs_pk pk; pbs_sk sk; pbs_bank_state bstate; pbs_client_state cstate; pbs_signature signature; pbs_workspace workspace; struct timespec bank_start, bank_end, verify_start, verify_end; long bank_nanos = 0; long verify_nanos = 0; int success, i = 0; load_parameters(&pbs); /* use this to generate keys */ /* gen_keys(&pbs, &sk, &pk); printf("skx:%s\n", BN_bn2hex(sk.x)); printf("pky:%s\n", BN_bn2hex(pk.y)); */ load_keys(&sk, &pk); int date1 = time(NULL) / 86400; int date2 = date1 + 7; int date3 = date1 + 28; int infolen = 3 * sizeof(date1) + 6; /* 3 ints, 2 commas, null byte */ char info[infolen]; snprintf(info, infolen, "%d,%d,%d", date1, date2, date3); /* printf("%s\n", info); */ /* do a bunch of signatures and verifies */ /* FIXME this can be made much more efficient */ char *pos = data; for (i = 0; i < NUM_LOOPS_PER_RUN; ++i) { BIGNUM *a = BN_new(); BIGNUM *b = BN_new(); BIGNUM *e = BN_new(); BIGNUM *r = BN_new(); BIGNUM *c = BN_new(); BIGNUM *s = BN_new(); BIGNUM *d = BN_new(); /* client sends bank request, bank sends back a,b,info */ clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &bank_start); bank_sign_init(a, b, &bstate, info, &pbs); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &bank_end); bank_nanos = get_timer_nanos(&bank_start, &bank_end); /* client initialization */ sign_init(&cstate, &signature, &workspace); /* client uses a,b,info and its message to produce e for bank */ sign_update(e, &cstate, &pbs, &pk, data, info, a, b); /* bank uses e to produce r,c,s,d for client */ clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &bank_start); bank_sign_update(r, c, s, d, &bstate, &pbs, &sk, e); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &bank_end); bank_nanos += get_timer_nanos(&bank_start, &bank_end); /* client finishes signature */ sign_final(&signature, r, c, s, d, &cstate, &pbs); /* now verify */ clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &verify_start); success = verify(&signature, &pk, &pbs, info, data, &workspace); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &verify_end); verify_nanos = get_timer_nanos(&verify_start, &verify_end); if (success != 0) { printf("Signature incorrect\n"); } pos += CELL_NETWORK_SIZE + 1; BN_free(a); BN_free(b); BN_free(e); BN_free(r); BN_free(c); BN_free(s); BN_free(d); free_bank_state(&bstate); free_client_state(&cstate); free_signature(&signature); free_workspace(&workspace); printf("pbs Bank effort: 1 signature %ld nanoseconds (%d/%d)\n", bank_nanos, i+1, NUM_LOOPS_PER_RUN); printf("pbs Signature verification: 1 verify %ld nanoseconds (%d/%d)\n", verify_nanos, i+1, NUM_LOOPS_PER_RUN); } free_keys(&sk, &pk); free_parameters(&pbs); #ifdef DEBUG /* signature results */ printBN(signature.delta, "delta:"); printBN(signature.sigma, "sigma:"); printBN(signature.omega, "omega:"); printBN(signature.rho, "rho:"); printf("info:%s\n", info); printf("message:%s\n", message); printBN(a, "a:"); printBN(b, "b:"); printBN(e, "e:"); printBN(r, "r:"); printBN(c, "c:"); printBN(s, "s:"); printBN(d, "d:"); printBN(cstate.t1, "t1:"); printBN(cstate.t2, "t2:"); printBN(cstate.t3, "t3:"); printBN(cstate.t4, "t4:"); printBN(cstate.epsilon, "epsilon:"); printBN(bstate.d, "d:"); printBN(bstate.s, "s:"); printBN(bstate.u, "u:"); printBN(pbs.g, "g:"); printBN(pbs.p, "p:"); printBN(pbs.q, "q:"); printBN(pk.y, "y:"); printBN(sk.x, "x:"); /* sanity checks */ BIGNUM *temp1 = BN_new(); BIGNUM *temp2 = BN_new(); BN_CTX *ctx = BN_CTX_new(); /* q |? p-1 */ BN_sub(temp1, pbs.p, BN_value_one()); BN_mod(temp2, temp1, pbs.q, ctx); printf("q|p-1 remainder: %s\n", BN_bn2hex(temp2)); /* g^q =? 1 mod p */ BN_mod_exp(temp1, pbs.g, pbs.q, pbs.p, ctx); printf("g^q =? 1 mod p result: %s\n", BN_bn2hex(temp1)); #endif /* BN_free(a); BN_free(b); BN_free(e); BN_free(r); BN_free(c); BN_free(s); BN_free(d); free_bank_state(&bstate); free_client_state(&cstate); free_signature(&signature); free_keys(&sk, &pk); free_parameters(&pbs); */ }
static UINT search_dr( MSIPACKAGE *package, WCHAR **appValue, MSISIGNATURE *sig ) { static const WCHAR query[] = { 's','e','l','e','c','t',' ','*',' ', 'f','r','o','m',' ', 'D','r','L','o','c','a','t','o','r',' ', 'w','h','e','r','e',' ', 'S','i','g','n','a','t','u','r','e','_',' ','=',' ', '\'','%','s','\'',0}; LPWSTR parent = NULL; LPCWSTR parentName; WCHAR path[MAX_PATH]; WCHAR expanded[MAX_PATH]; MSIRECORD *row; int depth; DWORD sz, attr; UINT rc; TRACE("%s\n", debugstr_w(sig->Name)); *appValue = NULL; row = MSI_QueryGetRecord( package->db, query, sig->Name ); if (!row) { TRACE("failed to query DrLocator for %s\n", debugstr_w(sig->Name)); return ERROR_SUCCESS; } /* check whether parent is set */ parentName = MSI_RecordGetString(row, 2); if (parentName) { MSISIGNATURE parentSig; search_sig_name( package, parentName, &parentSig, &parent ); free_signature( &parentSig ); if (!parent) { msiobj_release(&row->hdr); return ERROR_SUCCESS; } } sz = MAX_PATH; MSI_RecordGetStringW(row, 3, path, &sz); if (MSI_RecordIsNull(row,4)) depth = 0; else depth = MSI_RecordGetInteger(row,4); if (sz) expand_any_path( package, path, expanded, MAX_PATH ); else strcpyW(expanded, path); if (parent) { attr = msi_get_file_attributes( package, parent ); if (attr != INVALID_FILE_ATTRIBUTES && !(attr & FILE_ATTRIBUTE_DIRECTORY)) { PathRemoveFileSpecW(parent); PathAddBackslashW(parent); } strcpyW(path, parent); strcatW(path, expanded); } else if (sz) strcpyW(path, expanded); PathAddBackslashW(path); rc = search_directory( package, sig, path, depth, appValue ); msi_free(parent); msiobj_release(&row->hdr); TRACE("returning %d\n", rc); return rc; }