예제 #1
0
void remote::runDataCallback(Name name, Ccnx::PcoPtr pco)
{
    std::clog<<"data callback name:  "<<name<<std::endl;
    Ccnx::BytesPtr content = pco->contentPtr ();
    std::clog<<"data callback content:  "<<content<<std::endl;
    std::string action = name.getCompAsString(4); //action
    std::string consumer = name.getCompAsString(2); //consumer
    std::string producer = name.getCompAsString(1); //producer
    std::string endPoint = name.getCompAsString(3); //endpoint
    std::string prefix = name.getCompAsString(0);
    std::string app;
    std::string session;
    vector <string> app_session;
    split(prefix, app_session, "_");        	
    app = app_session[0];
    session = app_session[1];
    
    int size = name.size();    
    std::string lastComponent =name.getCompAsString(size-1);
    vector <string> splitPara;
    split(lastComponent, splitPara, ",");
    if (splitPara.size() == 1 && splitPara[0].compare("code=0") == 0)
        return;
    
    int code;
    int version =0;
   	int flag; //1: first packet 0:later packets
    int seqnum = 0;
    int chunkSize = 0;
    if (splitPara.size() == 3){
        flag = 1;
        vector <string> tmp1,tmp2,tmp3;
        split(splitPara[0], tmp1, "=");
        code = atoi(tmp1[1].c_str());
        split(splitPara[1], tmp2, "=");
        version = atoi(tmp2[1].c_str());
        split(splitPara[2], tmp3, "=");
        chunkSize = atoi(tmp3[1].c_str());
        seqnum = 1;
    }
    else{
        flag = 0;
        std::string tmp = name.getCompFromBackAsString(1);
        vector <string> chunkTmp;
        split(tmp, chunkTmp, "=");
        seqnum = atoi(chunkTmp[1].c_str());
//        cout<<"seqnum chunk"<<seqnum<<"  "<<chunk<<endl;
    }

    OrganizerSession *oSession;
    ParticipantSession *pSession;
    Context::instance()->retrieveSession(app, session, &oSession, &pSession);

    if (action.compare("fetch") == 0)
    {
    	if (endPoint.compare("public-key") == 0)
    	{
            if (pSession)
            {
    			pSession->recvPublicKeyRemote(producer, version, seqnum, chunkSize,
        	string ((char*)Ccnx::head (*content), content->size ()));    			
            }
            if (oSession)
            {
    			oSession->recvPublicKeyRemote(producer, version, seqnum, chunkSize,
        	string ((char*)Ccnx::head (*content), content->size ()));    			
            }		  		
    	}
    	 
      if (endPoint.compare("shared-key") == 0)
      {
          //decrypt
          std::string privateKey;
          privateKey = KeyDB::instance().getPriKey();
          EVP_PKEY *pri_key = KeyDB::instance().str2priKey(privateKey);
          RSA *decrypt_key;
          /*for test*/
          FILE *rsa_pkey_file;
          rsa_pkey_file = fopen("../db/pri1.pem", "r");
          
          if (!PEM_read_RSAPrivateKey(rsa_pkey_file, &decrypt_key, NULL, NULL))
          {
              fprintf(stderr, "Error loading RSA Private Key File.\n");
              ERR_print_errors_fp(stderr);
          }
          /*test end*/
          
          std::string encrypt_string = string ((char*)Ccnx::head (*content), content->size ());
          cout<<encrypt_string<<endl;
          char *encrypt = (char *)(encrypt_string.c_str());
          char *decrypt = NULL;
          int encrypt_len  = content->size();
          cout<<"encrypt_len"<<encrypt_len<<endl;
//          decrypt_key = EVP_PKEY_get1_RSA(pri_key);  //important line
          decrypt = (char *)malloc(encrypt_len);
          memset(decrypt,0,(encrypt_len));
          char *err = (char *)malloc(130);
          if(RSA_private_decrypt(encrypt_len, (unsigned char*)encrypt, (unsigned char*)decrypt, decrypt_key, RSA_PKCS1_OAEP_PADDING) == -1)
          {
              ERR_load_crypto_strings();
     			   ERR_error_string(ERR_get_error(), err);
       			 fprintf(stderr, "Error encrypting message: %s\n", err);
          }
          cout<<decrypt<<endl;
          std::string decrypt_string = string(decrypt);
          cout<<decrypt_string<<endl;
          if (pSession)
          {
            pSession->recvSharedKeyRemote(version, seqnum, chunkSize,
              decrypt_string);
          }
      }
    }
    if (flag == 1)
    {
	    for (seqnum = 1; seqnum < chunkSize; seqnum++)
  	  {
  	  	Ccnx::Name interestName = Ccnx::Name();
        interestName = getBaseName(name);
        interestName.appendComp("v="+boost::lexical_cast <string>(version));
    	  interestName.appendComp("chunk="+(boost::lexical_cast <string>(seqnum+1)));
    	  interestName.appendComp("xxx");
        handler.sendInterest (interestName,
                          Ccnx::Closure (boost::bind (&remote::runDataCallback, this, _1, _2),
                                         boost::bind (&remote::runTimeoutCallback, this, _1, _2, _3)),
                          Ccnx::Selectors ().scope (Ccnx::Selectors::SCOPE_LOCAL_HOST));  
    	}
    }
}