char * inet_net_satop(sa_family_t af, struct sockaddr *sa, int plen, char *buf, size_t len) { struct sockaddr_in *sin = (struct sockaddr_in *)sa; struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; switch (af) { case AF_INET: return inet_net_ntop(af, &sin->sin_addr, plen, buf, len); case AF_INET6: return inet_net_ntop(af, &sin6->sin6_addr, plen, buf, len); default: return (NULL); } }
/* * Convert an ipv4 address to a hostname. * * Bugs: - Only supports NI_NUMERICHOST and NI_NUMERICSERV behavior. * It will never resolve a hostname. * - No IPv6 support. */ int getnameinfo(const struct sockaddr * sa, int salen, char *node, int nodelen, char *service, int servicelen, int flags) { #ifdef WIN32 /* * If Windows has native IPv6 support, use the native Windows routine. * Otherwise, fall through and use our own code. */ if (haveNativeWindowsIPv6routines()) return (*getnameinfo_ptr) (sa, salen, node, nodelen, service, servicelen, flags); #endif /* Invalid arguments. */ if (sa == NULL || (node == NULL && service == NULL)) return EAI_FAIL; #ifdef HAVE_IPV6 if (sa->sa_family == AF_INET6) return EAI_FAMILY; #endif /* Unsupported flags. */ if (flags & NI_NAMEREQD) return EAI_AGAIN; if (node) { if (sa->sa_family == AF_INET) { if (inet_net_ntop(AF_INET, &((struct sockaddr_in *) sa)->sin_addr, sa->sa_family == AF_INET ? 32 : 128, node, nodelen) == NULL) return EAI_MEMORY; } else return EAI_MEMORY; } if (service) { int ret = -1; if (sa->sa_family == AF_INET) { ret = snprintf(service, servicelen, "%d", ntohs(((struct sockaddr_in *) sa)->sin_port)); } if (ret == -1 || ret >= servicelen) return EAI_MEMORY; } return 0; }
int main() { int rv = 0,res =0,i = 0,j=0; char *ca[] = {"key.pub","key.prv","key.par"}; char *glb[] = {"gbl.act","gbl.rvk"}; char *epoch[] = {"epc.act","epc.rvk"}; char *facc = "last.acc"; char fname[MAX_ENVEL_NAME]; setup_params_t *setup = NULL; epoch_item_t *ep = NULL; id_list_t *actls= NULL, *rvkls = NULL; action_data_t *join = NULL; rv = setup_load (ca[0],ca[1],ca[2],&setup); if(rv < 0) pbgp_die("Cannot initialize setup\n Aborting. \n"); //genera epoca rv = claim_new_epoch(glb,epoch,facc,"last.epc",setup); if(rv < 0) pbgp_die("Cannot claim a new epoch\n"); rv = newepoch_init(&ep,setup); if(rv < 0) { pbgp_die("claim_new_init :: Cannot complete initialization process\n"); } rv = ids_init(&ep->epls.act,&ep->epls.rvk); if(rv < 0) { pbgp_die("ids_init :: Cannot create lists\n"); } rv = newepoch_load("last.epc",ep,setup); if(rv < 0) { pbgp_die("\n"); } //da usare per caricare i nomi dei file ids_init(&actls,&rvkls); ids_load(glb[0],actls); ids_load(glb[1],rvkls); join_init(&join,setup,NULL); if(join == NULL) pbgp_die("join is null. Abort."); printf("ACTIVE USER TEST:\n"); for(i=0; i < actls->size ; i++) { char *idstr = NULL; //carica join elem sprintf(fname,"id-%d.env",actls->head[i].asnum); join_load(fname,join); id_to_string(&idstr, join->ibk->id); printf("Verifying %s\n",idstr); id_to_string_clear(idstr); //update the witness witness_update(join->witness,join->ibk->id,setup, ep->epls.act,ep->epls.rvk); //check the presence of the AS into the accumulator rv = revokation_check(ep->acc,join->witness,join->signature, join->ibk->id->asnum,setup); //check the prefix list signatures TODO!!!!! aaggiusta sto codice -.- for(j=0; j < join->pfixlist->size; j++) { const uint8_t *buf_ina = (const uint8_t *) &join->pfixlist->ina[j]; size_t sina[1]; char as[40]; inet_net_ntop (AF_INET, &join->pfixlist->ina[j], join->pfixlist->netmask[j],as, 40); //sina[0] = sizeof(join->pfixlist->ina[j]); uint8_t to_vrfy[1][9]; uint8_t *p = to_vrfy; bzero(p,9); SERIALIZE_AUTH(p,&join->pfixlist->ina[j],&join->pfixlist->netmask[j],&join->pfixlist->tsca); sina[0] = 9; res = ibe_vrfy(join->pfixlist->pf_sign[j], setup,(const uint8_t **)&p,sina,NULL); if(res == SIGN_VALID) printf("The signature is valid! (%s)\n",as); else printf("Invalid signature :( \n"); } if(rv != 0) { pbgp_error("revokation_check :: %d have been revoked!\n",join->ibk->id->asnum); rv = -1; } else { printf("SUCCESS: User %d is still into the accumulator\n",join->ibk->id->asnum); join_save(join); } pfix_clear(join->pfixlist); } join_clear(join); // verifica che i revocati non sono nell'accumulatore join_init(&join,setup,NULL); if(join == NULL) pbgp_die("join is null. Abort."); printf("REVOKED USER TEST:\n"); for(i=0; i < rvkls->size ; i++) { char *idstr = NULL; //carica join elem sprintf(fname,"id-%d.env",rvkls->head[i].asnum); join_load(fname,join); id_to_string(&idstr, join->ibk->id); printf("Verifying %s\n",idstr); //aggiorna il witness witness_update(join->witness,join->ibk->id,setup, ep->epls.act,ep->epls.rvk); rv = revokation_check(ep->acc,join->witness,join->signature, join->ibk->id->asnum,setup); if(rv != 0) { pbgp_error("revokation_check :: %d have been revoked!\n",join->ibk->id->asnum); rv = -1; } else { printf("SUCCESS: User %d is still into the accumulator\n",join->ibk->id->asnum); join_save(join); } id_to_string_clear(idstr); } join_clear(join); ids_clear(actls,rvkls); setup_clear(setup); return 0; }