Ejemplo n.º 1
0
void send_pair_composed(struct network_status *net_stat)
  /*@ requires [?f0]world(?pub, ?key_clsfy) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(?principal, ?count1) &*&
               true == bad(principal); @*/
  /*@ ensures  [f0]world(pub, key_clsfy) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(principal, ?count2); @*/
{
  struct item *first = network_receive(net_stat);
  struct item *second = network_receive(net_stat);
  struct item * pair = create_pair(first, second);
  //@ assert item(first, ?f, pub);
  //@ assert item(second, ?s, pub);
  //@ assert item(pair, pair_item(f, s), pub);

  //@ open proof_obligations(pub);
  //@ assert is_public_pair_compose(?proof, pub);
  //@ proof(f, s);
  //@ close proof_obligations(pub);
  network_send(net_stat, pair);
  item_free(pair);
  item_free(first);
  item_free(second);
}
Ejemplo n.º 2
0
struct item *app_receive(struct item *key)
  /*@ requires [?f0]world(ss_pub) &*&
               item(key, symmetric_key_item(?creator, ?id), ss_pub);
  @*/
  /*@ ensures  [f0]world(ss_pub) &*&
               item(key, symmetric_key_item(creator, id), ss_pub) &*&
               item(result, ?msg, ss_pub) &*& 
               (
                 bad(creator) || 
                 collision_in_run() || 
                 app_send_event(creator, msg)
               );
  @*/
{
    struct network_status *net_stat = network_bind_and_accept(APP_RECEIVE_PORT);
    
    struct item *m = network_receive(net_stat);
    struct item *hash = pair_get_first(m);
    struct item *message = pair_get_second(m);
    //@ assert item(m, pair_item(?hmac_i, ?message_i), ss_pub);
    //@ open [_]ss_pub(pair_item(hmac_i, message_i));
    //@ if (!collision_in_run()) open [_]ss_pub(hmac_i);
    //@ if (!collision_in_run()) open [_]ss_pub(message_i);
    item_free(m);
    hmac_verify(hash, key, message);
    item_free(hash);
    
    network_disconnect(net_stat);
    
    return message;
}
Ejemplo n.º 3
0
void selftest_client_xmit_packet(struct Adapter *adapter, struct Thread *thread, struct Packet *pkt)
{
    struct TestAdapter *testadapter = (struct TestAdapter *)adapter->userdata;
    struct TestAdapter *other;
    struct Selftest *selftest = testadapter->parent;
    struct Frame frame[1];

    if (&selftest->client == testadapter)
        other = &selftest->server;
    else
        other = &selftest->client;

    {
        struct PcapFile *x;
        x = pcapfile_openwrite("self-query.pcap", 1);
        pcapfile_writeframe(x, pkt->buf, pkt->max, pkt->max, 0, 0);
        pcapfile_close(x);
    }

    network_receive(
                frame,
                thread,
                other->adapter,
                0,
                0,
			    pkt->buf,
                pkt->max);
}
Ejemplo n.º 4
0
void increment_and_send_nonce(struct network_status *net_stat)
  /*@ requires [?f0]world(?pub, ?key_clsfy) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(?principal, ?count1) &*&
               true == bad(principal); @*/
  /*@ ensures  [f0]world(pub, key_clsfy) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(principal, ?count2); @*/
{
  struct item *nonce = network_receive(net_stat);
  //@ assert item(nonce, ?n, pub);
  if (is_nonce(nonce))
  {
    increment_nonce(nonce);
    //@ assert item(nonce, ?n_inc, pub);
    //@ open proof_obligations(pub);
    /*@ if (col)
        {
          assert is_public_collision(?proof, pub);
          proof(n_inc);
        }
        else
        {
          assert is_public_incremented_nonce(?proof, pub);
          proof(n, n_inc);
        }
    @*/
    //@ close proof_obligations(pub);
    network_send(net_stat, nonce);
  }
  item_free(nonce);
}
Ejemplo n.º 5
0
void *ps4link_thread_console(void *thread_id) 
{
	char buffer[1024];

	// If the socket isn't open, this thread isn't needed.
	if (console_socket < 0) { pthread_exit(thread_id); }

	// Loop forever...
	for (;;) 
	{

		// Wait for network activity.
		network_wait(console_socket, -1);

		// Receive the console buffer.
		network_receive(console_socket, buffer, sizeof(buffer));

		// Print out the console buffer.
		printf("%s", buffer);

		// Clear the console buffer.
		memset(buffer, 0, sizeof(buffer));

		// Reset the timeout counter.
		ps4link_counter = 0;

	}

	// End function.
	return NULL;

}
Ejemplo n.º 6
0
void send_pair_decomposed(struct network_status *net_stat)
  /*@ requires [?f0]world(?pub, ?key_clsfy) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(?principal, ?count1) &*&
               true == bad(principal); @*/
  /*@ ensures  [f0]world(pub, key_clsfy) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(principal, ?count2); @*/
{
  struct item *pair = network_receive(net_stat);
  //@ assert item(pair, ?p, pub);
  if (is_pair(pair))
  {
    struct item *first = pair_get_first(pair);
    struct item *second = pair_get_second(pair);
    //@ open proof_obligations(pub);
    //@ assert is_public_pair_decompose(?proof1, pub);
    //@ assert is_public_collision(?proof2, pub);
    //@ proof1(p);
    //@ assert item(first, ?f, pub);
    //@ if (col) proof2(f);
    //@ assert item(second, ?s, pub);
    //@ if (col) proof2(s);
    //@ close proof_obligations(pub);
    network_send(net_stat, first);
    network_send(net_stat, second);
    item_free(first);
    item_free(second);
  }
  item_free(pair);
}
Ejemplo n.º 7
0
void send_symmetric_encrypted(struct network_status *net_stat, struct keypair *keypair)
  /*@ requires [?f0]world(?pub, ?key_clsfy) &*&
               keypair(keypair, ?attacker_id, ?id, ?info, pub) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(attacker_id, ?count1) &*&
               true == bad(attacker_id); @*/
  /*@ ensures  [f0]world(pub, key_clsfy) &*&
               keypair(keypair, attacker_id, id, info, pub) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(attacker_id, ?count2); @*/
{
  struct item *key = network_receive(net_stat);
  //@ assert item(key, ?k, pub);
  if (is_symmetric_key(key))
  {
    struct item *pay = network_receive(net_stat);
    //@ assert item(pay, ?p, pub);
    
    //@ open proof_obligations(pub);
    //@ item nonce = nonce_item(attacker_id, count1 + 1, 0);
    //@ assert is_public_nonce(?proof1, pub);
    //@ proof1(nonce);
    struct item *enc = symmetric_encryption(key, pay);
    //@ assert item(enc, ?e, pub);
    /*@ if (col)
        {
          assert is_public_collision(?proof2, pub);
          proof2(e);
        }
        else
        {
          assert is_public_symmetric_encrypted(?proof2, pub);
          proof2(e);
        }
    @*/
    //@ close proof_obligations(pub);
    network_send(net_stat, enc);

    item_free(enc);
    item_free(pay);
  }
  item_free(key);
}
Ejemplo n.º 8
0
void send_hmac(struct network_status *net_stat, struct keypair *keypair)
  /*@ requires [?f0]world(?pub, ?key_clsfy) &*&
               keypair(keypair, ?attacker_id, ?id, ?info, pub) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(attacker_id, ?count1) &*&
               true == bad(attacker_id); @*/
  /*@ ensures  [f0]world(pub, key_clsfy) &*&
               keypair(keypair, attacker_id, id, info, pub) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(attacker_id, ?count2); @*/
{
  struct item *key = network_receive(net_stat);
  //@ assert item(key, ?k, pub);
  if (is_symmetric_key(key))
  {
    struct item *pay = network_receive(net_stat);
    //@ assert item(pay, ?p, pub);
    //@ close hash_item_payload(pub, true, p);
    //@ leak hash_item_payload(pub, true, p);
    struct item *mac = create_hmac(key, pay);

    //@ assert item(mac, ?h, pub);
    //@ open proof_obligations(pub);
    /*@ if (col)
        {
          assert is_public_collision(?proof, pub);
          proof(h);
        }
        else
        {
          assert is_public_hmac(?proof, pub);
          proof(h);
        }
    @*/
    //@ close proof_obligations(pub);
    network_send(net_stat, mac);

    item_free(mac);
    item_free(pay);
  }
  item_free(key);
}
Ejemplo n.º 9
0
void send_asymmetric_signature(struct network_status *net_stat,
                               struct keypair *keypair)
  /*@ requires [?f0]world(?pub, ?key_clsfy) &*&
               keypair(keypair, ?attacker_id, ?id, ?info, pub) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(attacker_id, ?count1) &*&
               true == bad(attacker_id); @*/
  /*@ ensures  [f0]world(pub, key_clsfy) &*&
               keypair(keypair, attacker_id, id, info, pub) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(attacker_id, ?count2); @*/
{
  struct item *key = network_receive(net_stat);
  //@ assert item(key, ?k, pub);
  if (is_private_key(key))
  {
    struct item *pay = network_receive(net_stat);
    //@ assert item(pay, ?p, pub);
    struct item *sig = asymmetric_signature(key, pay);

    //@ assert item(sig, ?s, pub);
    //@ open proof_obligations(pub);
    /*@ if (col)
        {
          assert is_public_collision(?proof, pub);
          proof(s);
        }
        else
        {
          assert is_public_asymmetric_signature(?proof, pub);
          proof(s);
        }
    @*/
    //@ close proof_obligations(pub);
    network_send(net_stat, sig);

    item_free(sig);
    item_free(pay);
  }
  item_free(key);
}
Ejemplo n.º 10
0
struct item *receive()
  //@ requires [?f0]world(dummy_pub, dummy_key_clsfy) &*& principal(?p, ?c); 
  /*@ ensures  [f0]world(dummy_pub, dummy_key_clsfy) &*& principal(p, c) &*&
               item(result, ?msg, dummy_pub) &*&  msg == data_item(_); @*/
{
    struct network_status *net_stat = network_bind_and_accept(APP_RECEIVE_PORT);
    struct item *m = network_receive(net_stat);
    check_is_data(m);
    network_disconnect(net_stat);
    return m;
}
Ejemplo n.º 11
0
void send_symmetric_decrypted(struct network_status *net_stat, struct keypair *keypair)
  /*@ requires [?f0]world(?pub, ?key_clsfy) &*&
               keypair(keypair, ?attacker_id, ?id, ?info, pub) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(attacker_id, ?count1) &*&
               true == bad(attacker_id); @*/
  /*@ ensures  [f0]world(pub, key_clsfy) &*&
               keypair(keypair, attacker_id, id, info, pub) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(attacker_id, ?count2); @*/
{
  struct item *key = network_receive(net_stat);
  //@ assert item(key, ?k, pub);
  if (is_symmetric_key(key))
  {
    struct item *enc = network_receive(net_stat);
    //@ assert item(enc, ?e, pub);
    if (is_symmetric_encrypted(enc))
    {
      struct item *dec = symmetric_decryption(key, enc);
      //@ assert item(dec, ?d, pub);
      //@ open proof_obligations(pub);
      /*@ if (!col)
          {
            assert is_public_symmetric_decrypted(?proof, pub);
            proof(e);
          }
      @*/
      network_send(net_stat, dec);
      //@ close proof_obligations(pub);
      item_free(dec);
    }
    item_free(enc);
  }
  item_free(key);
}
Ejemplo n.º 12
0
void main_thread(void *v)
{
    struct ThreadParms *parms = (struct ThreadParms *)v;
    struct Adapter *adapter = parms->adapter;
    struct Frame frame[1];
    struct Thread thread[1];

    memset(frame, 0, sizeof(frame[0]));
    
    /*
     * thread
     */
    memset(thread, 0, sizeof(thread[0]));
    thread->catalog = parms->catalog;
    thread->userdata = (char*)malloc(PACKET_SIZE);

    adapter->alloc_packet = alloc_packet;
    adapter->xmit_packet = rawsock_send_packet;
    

    for (;;) {
        int err;
        unsigned length;
        unsigned secs;
        unsigned usecs;
        const unsigned char *px;

        err = rawsock_recv_packet(
                    adapter,
                    &length,
                    &secs,
                    &usecs,
                    &px);

        if (err != 0)
            continue;

        network_receive(
            frame,
            thread,
            adapter,
            secs,
            usecs,
			px,
            length);
    }
}
Ejemplo n.º 13
0
void run_perf(struct PerfTest *perftest)
{
    unsigned i;
    unsigned loop_count = perftest->loop_count;
    
    for (i=0; i<loop_count; i++) {
        struct Frame frame[1];
        
        network_receive(
                        frame,
                        perftest->thread,
                        perftest->server.adapter,
                        0,
                        0,
                        (unsigned char*)request_template,
                        sizeof(request_template)-1);
    }
    
    __sync_fetch_and_sub(&threads_running, 1);
}
Ejemplo n.º 14
0
/****************************************************************************
 * During a self-test, we intercept the client "transmit" function to
 * instead forward directly to the server "receive" path, thus simulating
 * from the server's point of a view the reception of a packet. We also
 * intercept the reverse path in the function 
 * "selftest_server_to_client_response".
 ****************************************************************************/
void 
selftest_client_to_server_query(struct Adapter *adapter, 
                            struct Thread *thread, struct Packet *pkt)
{
    struct TestAdapter *testadapter = (struct TestAdapter *)adapter->userdata;
    struct TestAdapter *other;
    struct Selftest *selftest = testadapter->parent;
    struct Frame frame[1];

    if (&selftest->client == testadapter)
        other = &selftest->server;
    else
        other = &selftest->client;

    /* Save the query packet to a file for inspection */
    {
        struct PcapFile *x;
        x = pcapfile_openwrite("self-query.pcap", 1);
        pcapfile_writeframe(x, pkt->buf, pkt->max, pkt->max, 0, 0);
        pcapfile_close(x);
    }

    /*
     * SHORT CIRCUIT
     * This is supposed to be a "transmit" function from the DNS client,
     * but what we are doing instead is just forwarding it to the 
     * "receive" function of the DNS server.
     */
    network_receive(
                frame,
                thread,
                other->adapter,
                0,
                0,
			    pkt->buf,
                pkt->max);
}
Ejemplo n.º 15
0
struct item *client(char server, struct item *key, struct item *request)
  /*@ requires [?f0]world(rpc_pub, rpc_key_clsfy) &*& 
               principal(?client, ?count) &*&
               item(key, symmetric_key_item(?creator, ?id), rpc_pub) &*&
               item(request, ?req, rpc_pub) &*& [_]rpc_pub(req) &*&
               true == request(creator, server, req) &*&
               shared_with(creator, id) == server;
  @*/
  /*@ ensures  [f0]world(rpc_pub, rpc_key_clsfy) &*& 
               principal(client, count) &*&
               item(key, symmetric_key_item(creator, id), rpc_pub) &*&
               item(request, req, rpc_pub) &*& item(result, ?resp, rpc_pub) &*& 
               (
                 col || bad(creator) || bad(server) ||
                 response(creator, server, req, resp)
               );
  @*/
{
    struct network_status *net_stat = network_connect("localhost", SERVER_PORT);
    
    {
        struct item *tag = create_data_item_from_int(0);
        //@ item d = data_item(chars_of_int(0));
        //@ assert item(tag, d, rpc_pub);
        //@ close rpc_pub(d);
        //@ leak rpc_pub(d);
        struct item *payload = create_pair(tag, request);
        //@ item p = pair_item(d, req);
        //@ assert item(payload, p, rpc_pub);
        //@ close rpc_pub(p);
        //@ leak rpc_pub(p);
        item_free(tag);
        struct item *hash = create_hmac(key, payload);
        //@ item h = hmac_item(creator, id, some(p));
        //@ if (!col) assert item(hash, h, rpc_pub);
        //@ close rpc_pub(h);
        //@ leak rpc_pub(h);
        struct item *m = create_pair(hash, payload);
        //@ assert item(m, ?msg, rpc_pub);
        //@ item msg0 = pair_item(h, p);
        //@ if (!col) msg == msg0;
        //@ close rpc_pub(msg);
        //@ leak rpc_pub(msg);
        item_free(hash);
        item_free(payload);
        network_send(net_stat, m);
        item_free(m);
    }
    
    struct item *response;
    {
        struct item *r = network_receive(net_stat);
        check_is_pair(r);
        //@ assert item(r, pair_item(?h0, ?p0), rpc_pub);
        struct item *hmac1 = pair_get_first(r);
        //@ assert item(hmac1, ?h, rpc_pub);
        struct item *payload = pair_get_second(r);
        //@ assert item(payload, ?p, rpc_pub);
        
        /*@ if (!col)
            {
              assert h0 == h;
              assert p0 == p;
              open [_]rpc_pub(pair_item(h, p));
              open [_]rpc_pub(h);
              open [_]rpc_pub(p);
            }
        @*/
        struct item *hmac2 = create_hmac(key, payload);
        item_check_equal(hmac1, hmac2);
        item_free(hmac1);
        item_free(hmac2);
        item_free(r);
        //@ assert col || h == hmac_item(creator, id, some(p));
       
        struct item *tag = pair_get_first(payload);
        check_is_data(tag);
        int tagValue = item_get_data_as_int(tag);
        if (tagValue != 1) abort();
        //@ item d = data_item(chars_of_int(1));
        //@ assert item(tag, ?d0, rpc_pub);
        //@ assert col || d == d0;
        item_free(tag);
        struct item *reqresp = pair_get_second(payload);
        struct item *request1 = pair_get_first(reqresp);
        response = pair_get_second(reqresp);
        //@ assert item(request1, ?req1, rpc_pub);
        //@ assert item(response, ?resp, rpc_pub);
        //@ if (!col) assert p == pair_item(d, pair_item(req1, resp));
        item_free(payload);
        item_free(reqresp);
        item_check_equal(request, request1);
        //@ assert col || req1 == req;
        item_free(request1);
    }
    network_disconnect(net_stat);
    return response;
}
Ejemplo n.º 16
0
int main(int argc, char *argv[])
{
	dnsPacket *dns, *dnsresponse;
	int iResult, iReceived;
	char *qdomain, *qserver, *response;
	unsigned short qtype = 1, qclass = 1;

	qdomain = ((qdomain = command_arg_get(0, '-', argc, argv)) != NULL) ? qdomain : DNS_DEFAULT_LOOKUP;
	qserver = ((qserver = command_arg_get(1, '-', argc, argv)) != NULL) ? qserver : DNS_LOOKUP_SERVER;

	// create our empty DNS packet
	dns = dns_create();

	// set the required header fields
	dns->base->id = DNS_IDENTIFIER;

	// use recursive query?
	if (command_opt_set("-r", argc, argv))
	{
		dns->base->flags |= DNS_FLAGS_RD;
		printf("+ Using recursive querying\n");
	}

	// use a different query type?
	if (command_opt_set("-cname", argc, argv))
	{
		qtype = DNS_TYPE_CNAME;
		printf("+ Using CNAME query type\n");
	}
	else if (command_opt_set("-ns", argc, argv))
	{
		qtype = DNS_TYPE_NS;
		printf("+ Using NS query type\n");
	}
	else if (command_opt_set("-mx", argc, argv))
	{
		qtype = DNS_TYPE_MX;
		printf("+ Using MX query type\n");
	}
	else if (command_opt_set("-ptr", argc, argv))
	{
		qtype = DNS_TYPE_PTR;
		printf("+ Using PTR query type\n");
	}
	else if (command_opt_set("-aaaa", argc, argv))
	{
		qtype = DNS_TYPE_AAAA;
		printf("+ Using AAAA query type\n");
	}

	// add our question section
	dns_add_question(dns, qdomain, strlen(qdomain), qtype, qclass);
	dns_hton(dns);

	// initialize the network
	network_init(qserver, DNS_PORT);
	network_connect_udp();

	// send the packet out
	printf("Looking up %s using %s...\n", qdomain, qserver);
	iResult = network_send((char *)dns->base, dns->size);
	assert(iResult > 0);
	
	// block until a response is ready
	response = network_receive(&iReceived);
	assert(iReceived > 0);

	// load up the response packet
	dnsresponse = dns_parse(response, iReceived);
	assert(dnsresponse->base->flags & DNS_FLAGS_RESPONSE && dnsresponse->base->id == DNS_IDENTIFIER);

	output_print_response(dnsresponse);
	output_print_sections(dnsresponse);
}
Ejemplo n.º 17
0
void server(char server, struct item *key)
  /*@ requires [?f0]world(rpc_pub, rpc_key_clsfy) &*&
               principal(server, ?count) &*&
               item(key, symmetric_key_item(?creator, ?id), rpc_pub) &*&  
               shared_with(creator, id) == server;
  @*/
  /*@ ensures  [f0]world(rpc_pub, rpc_key_clsfy) &*&
               principal(server, count + 1) &*&
               item(key, symmetric_key_item(creator, id), rpc_pub);
  @*/
{
    struct network_status *net_stat = network_bind_and_accept(SERVER_PORT);
    
    struct item *request = 0;
    {
        struct item *r = network_receive(net_stat);
        check_is_pair(r);
        //@ assert item(r, pair_item(?h0, ?p0), rpc_pub);
        struct item *hmac1 = pair_get_first(r);
        //@ assert item(hmac1, ?h, rpc_pub);
        struct item *payload = pair_get_second(r);
        //@ assert item(payload, ?p, rpc_pub);
        
        /*@ if (!col)
            {
              assert h0 == h;
              assert p0 == p;
              open [_]rpc_pub(pair_item(h, p));
              open [_]rpc_pub(h);
              open [_]rpc_pub(p);
            }
        @*/
        struct item *hmac2 = create_hmac(key, payload);
        item_check_equal(hmac1, hmac2);
        item_free(hmac1);
        item_free(hmac2);
        item_free(r);
        //@ assert col || h == hmac_item(creator, id, some(p));
        struct item *tag = pair_get_first(payload);
        check_is_data(tag);
        int tagValue = item_get_data_as_int(tag);
        if (tagValue != 0) abort();
        //@ item d = data_item(chars_of_int(0));
        request = pair_get_second(payload);
        
        /*@ if (!col) 
            {  
              assert item(tag, d, rpc_pub);
              assert item(request, ?req, rpc_pub);
              assert p == pair_item(d, req); 
            }
        @*/
        item_free(tag);
        item_free(payload);
    }
    
    //@ assert item(request, ?req, rpc_pub);
    struct item *response = compute_response(server, request);
    //@ assert item(response, ?resp, rpc_pub);
    
    {
        struct item *reqresp = create_pair(request, response);
        //@ item p = pair_item(req, resp);
        //@ assert item(reqresp, p, rpc_pub);
        //@ close rpc_pub(p);
        //@ leak rpc_pub(p);
        item_free(response);
        item_free(request);
        struct item *tag = create_data_item_from_int(1);
        struct item *payload = create_pair(tag, reqresp);
        //@ item d = data_item(chars_of_int(1));
        //@ close rpc_pub(d);
        //@ leak rpc_pub(d);
        //@ assert item(payload, pair_item(d, p), rpc_pub);
        //@ close rpc_pub(pair_item(d, p));
        //@ leak rpc_pub(pair_item(d, p));
        item_free(tag);
        item_free(reqresp);
        struct item *hash = create_hmac(key, payload);
        //@ item h = hmac_item(creator, id, some(pair_item(d, p)));
        //@ if (!col) assert item(hash, h, rpc_pub);
        //@ close rpc_pub(h);
        //@ leak rpc_pub(h);
        struct item *m = create_pair(hash, payload);
        //@ assert item(m, ?msg, rpc_pub);
        //@ if (!col) msg == pair_item(h, pair_item(d, p));
        //@ if (!col) assert item(m, msg, rpc_pub);
        //@ close rpc_pub(msg);
        //@ leak rpc_pub(msg);
        item_free(hash);
        item_free(payload);
        network_send(net_stat, m);
        item_free(m);
    }
    
    network_disconnect(net_stat);
}
Ejemplo n.º 18
0
void send_asymmetric_decrypted(struct network_status *net_stat, struct keypair *keypair)
  /*@ requires [?f0]world(?pub, ?key_clsfy) &*&
               keypair(keypair, ?attacker_id, ?id, ?info, pub) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(attacker_id, ?count1) &*&
               true == bad(attacker_id); @*/
  /*@ ensures  [f0]world(pub, key_clsfy) &*&
               keypair(keypair, attacker_id, id, info, pub) &*&
               proof_obligations(pub) &*&
               network_status(net_stat) &*&
               principal(attacker_id, ?count2); @*/
{
  struct item *key = network_receive(net_stat);
  //@ assert item(key, ?k, pub);
  if (is_private_key(key))
  {
    //@ assert k == private_key_item(?principal2, ?count2);
    struct item *enc = network_receive(net_stat);
    //@ assert item(enc, ?e, pub);
    if (is_asymmetric_encrypted(enc))
    {
      //@ assert e == asymmetric_encrypted_item(?principal3, ?count3, ?pay, ?ent);
      char tag;
      //@ close chars(&tag, 1, _);
      random_buffer_(&tag, 1);
      //@ open chars(&tag, 1, _);
      if (tag == TAG_DATA || tag == TAG_PAIR ||           
          tag == TAG_NONCE || tag == TAG_HASH ||          
          tag == TAG_SYMMETRIC_KEY || tag == TAG_PUBLIC_KEY ||   
          tag == TAG_PRIVATE_KEY || tag == TAG_HMAC ||    
          tag == TAG_SYMMETRIC_ENC || tag == TAG_ASYMMETRIC_ENC ||  
          tag == TAG_ASYMMETRIC_SIG)
      {
        struct item *dec = asymmetric_decryption(key, enc, tag);
        //@ assert item(dec, ?d, pub);
        //@ open proof_obligations(pub);
        /*@ if (col)
            {
              assert [_]pub(d);
            }
            else if (principal2 == principal3 && count2 == count3)
            {
              assert pay == some(d);
              assert is_public_asymmetric_decrypted(?proof, pub);
              proof(e);
            }
            else
            {
              assert [_]pub(d);
            }
        @*/
        network_send(net_stat, dec);
        //@ close proof_obligations(pub);
        item_free(dec);
      }
    }
    item_free(enc);
  }
  item_free(key);
}