int main(int argc, char ** argv) { event_loop * evl; io_pipe * io_c2p; io_pipe * io_p2s; io_bridge * br; sockaddr_in sa; char buf[128]; int sk, c2p, p2s; int yes = 1; // // signal(SIGPIPE, SIG_IGN); // evl = new_event_loop_select(); // if (sk_init() < 0) return 1; sk = sk_create(AF_INET, SOCK_STREAM, 0); if (sk < 0) return 2; sockaddr_in_init(&sa); SOCKADDR_IN_PORT(&sa) = htons(55555); if (sk_setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes) < 0 || sk_bind_ip4(sk, &sa) < 0 || sk_listen(sk, 8) < 0) return 3; printf("listening on %s ...\n", sa_to_str(&sa, buf, sizeof buf)); // c2p = sk_accept_ip4(sk, &sa); if (c2p < 0) return 4; printf("accepted\n"); sk_unblock(c2p); // SOCKADDR_IN_ADDR(&sa) = inet_addr(argc > 1 ? argv[1] : "127.0.0.1"); SOCKADDR_IN_PORT(&sa) = htons( (argc > 2) ? atoi(argv[2]) : 22 ); p2s = sk_create(AF_INET, SOCK_STREAM, 0); if (p2s < 0) return 5; if (sk_unblock(p2s) < 0) return 6; printf("connecting to %s ...\n", sa_to_str(&sa, buf, sizeof buf)); if (sk_connect_ip4(p2s, &sa) < 0 && sk_conn_fatal(sk_errno(p2s))) return 7; // io_c2p = new_tcp_pipe(c2p); io_p2s = new_tcp_pipe(p2s); br = new_io_bridge(io_c2p, io_p2s); br->on_shutdown = on_bridge_down; br->init(br, evl); while (! enough) { static uint tick = 0; evl->monitor(evl, 100); if ( (tick++ % 17) && ! enough ) continue; printf("\r%u | [%c%c %10llu %10llu %4u] [%c%c %10llu %10llu %4u]", tick++, br->l->pipe->writable ? 'w' : br->l->pipe->fin_sent ? 'x' : '-', br->l->pipe->readable ? 'r' : br->l->pipe->fin_rcvd ? 'x' : '-', br->l->tx, br->l->rx, br->l->congestions, br->r->pipe->writable ? 'w' : br->r->pipe->fin_sent ? 'x' : '-', br->r->pipe->readable ? 'r' : br->r->pipe->fin_rcvd ? 'x' : '-', br->r->tx, br->r->rx, br->r->congestions); fflush(stdout); } printf("\n"); return 0; }
/** * cdk_keygen_save: save the generated keys to disk * @hd: the keygen object * @pub: name of the file to store the public key * @sec: name of the file to store the secret key * **/ cdk_error_t cdk_keygen_save( cdk_keygen_ctx_t hd, const char * pubf, const char * secf ) { cdk_stream_t out = NULL; CDK_PACKET pkt; int rc; hd->key[0].pk = pk_create( hd, 0 ); if( !hd->key[0].pk ) return CDK_Inv_Packet; hd->key[0].sk = sk_create( hd, 0 ); if( !hd->key[0].sk ) return CDK_Inv_Packet; hd->id = uid_create( hd ); if( !hd->id ) return CDK_Inv_Packet; hd->sig = sig_self_create( hd ); if( !hd->sig ) return CDK_Inv_Packet; rc = cdk_stream_create( pubf, &out ); if( rc ) return rc; cdk_pkt_init( &pkt ); pkt.pkttype = CDK_PKT_PUBLIC_KEY; pkt.pkt.public_key = hd->key[0].pk; rc = cdk_pkt_write( out, &pkt ); if( rc ) goto fail; cdk_pkt_init( &pkt ); pkt.pkttype = CDK_PKT_USER_ID; pkt.pkt.user_id = hd->id; rc = cdk_pkt_write( out, &pkt ); if( rc ) goto fail; cdk_pkt_init( &pkt ); pkt.pkttype = CDK_PKT_SIGNATURE; pkt.pkt.signature = hd->sig; rc = cdk_pkt_write( out, &pkt ); if( rc ) goto fail; if( hd->key[1].algo ) { cdk_pkt_init( &pkt ); pkt.pkttype = CDK_PKT_PUBLIC_SUBKEY; pkt.pkt.public_key = hd->key[1].pk = pk_create( hd, 1 ); rc = cdk_pkt_write( out, &pkt ); if( rc ) goto fail; cdk_pkt_init( &pkt ); pkt.pkttype = CDK_PKT_SIGNATURE; pkt.pkt.signature = sig_subkey_create( hd ); rc = cdk_pkt_write( out, &pkt ); cdk_pkt_free( &pkt ); if( rc ) goto fail; } cdk_stream_close( out ); out = NULL; rc = cdk_stream_create( secf, &out ); if( rc ) goto fail; if( hd->protect ) { rc = cdk_sk_protect( hd->key[0].sk, hd->pass ); if( rc ) goto fail; } cdk_pkt_init( &pkt ); pkt.pkttype = CDK_PKT_SECRET_KEY; pkt.pkt.secret_key = hd->key[0].sk; rc = cdk_pkt_write( out, &pkt ); if( rc ) goto fail; cdk_pkt_init( &pkt ); pkt.pkttype = CDK_PKT_USER_ID; pkt.pkt.user_id = hd->id; rc = cdk_pkt_write( out, &pkt ); if( rc ) goto fail; cdk_pkt_init( &pkt ); pkt.pkttype = CDK_PKT_SIGNATURE; pkt.pkt.signature = hd->sig; rc = cdk_pkt_write( out, &pkt ); if( rc ) goto fail; if( hd->key[1].algo ) { hd->key[1].sk = sk_create( hd, 1 ); if( hd->protect && (rc = cdk_sk_protect( hd->key[1].sk, hd->pass )) ) goto fail; cdk_pkt_init( &pkt ); pkt.pkttype = CDK_PKT_SECRET_SUBKEY; pkt.pkt.secret_key = hd->key[1].sk; rc = cdk_pkt_write( out, &pkt ); if( rc ) goto fail; } fail: cdk_stream_close( out ); return rc; }