文档章节

实验二 初始化阶段-DA.c

 宋小八
发布于 2018/01/22 15:47
字数 1001
阅读 4
收藏 0

//file system
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//openssl
#include<openssl/rsa.h>
#include<openssl/aes.h>
#include<openssl/hmac.h>
#include<openssl/pem.h>
#include<openssl/err.h>
//socket
#include<netinet/in.h> // sockaddr_in
#include<sys/types.h>  // socket
#include<sys/socket.h> // socket
#include<stdio.h>    // printf
#include<stdlib.h>   // exit
#include<string.h>   // bzero
//time
#include<time.h>
#include <stdio.h>
#include <sys/time.h>
//file path
#define PUBPARENT "parent_pub.key"
#define PRIPARENT "parent.key"
#define PRIMIG "mig.key"
#define PUBMIG "mig_pub.key"
#define NPPUBKEY "nparent_pub.key"
#define NPPRIKEY "nparent.key"
#define PUBDA "DA_pub.key"
#define PRIDA "DA.key"
//socket parameter
#define SERVER_PORT 8000
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#define NAME 32
//#define seed "seed"
#define npNameAlg "ecc"
//unsigned char* dupSensitive;
char *se;
char see[1024];

void aes_box_decrypt(unsigned char* source_string, unsigned char* des_string)  
{  
    int iLoop = 0;  
    int iLen =0;  
    AES_KEY aes;  
    unsigned char key[AES_BLOCK_SIZE];  
    unsigned char iv[AES_BLOCK_SIZE];  
    if(NULL == source_string || NULL == des_string)  
    {  
        return;  
    }  
 
    //Generate own AES Key  
    for(iLoop = 0; iLoop < 16; iLoop++)  
    {  
        key[iLoop] = 32 + iLoop;  
    }  
 
    // Set encryption key  
    for (iLoop=0; iLoop<AES_BLOCK_SIZE; iLoop++)   
    {  
        iv[iLoop] = 0;  
    }  
 
    if (AES_set_decrypt_key(key, 128, &aes) < 0)   
    {  
        return ;  
    }  
 
    iLen = strlen(source_string)+1;  
 
   AES_cbc_encrypt(source_string, des_string, iLen, &aes, iv, AES_DECRYPT);  
}
void aes_box_encrypt(unsigned char* source_string, unsigned char* des_string)
{
    int iLoop = 0;
    int iLen =0;
    AES_KEY aes;
    unsigned char key[AES_BLOCK_SIZE];
    unsigned char iv[AES_BLOCK_SIZE];
    if(NULL == source_string || NULL == des_string)
    {
        return;
    }

    //Generate own AES Key  
    for(iLoop = 0; iLoop < 16; iLoop++)
    {
        key[iLoop] = 32 + iLoop;
    }

    // Set encryption key  
    for (iLoop=0; iLoop<AES_BLOCK_SIZE; iLoop++)
    {
        iv[iLoop] = 0;
    }

    if (AES_set_encrypt_key(key, 128, &aes) < 0)
    {
        return ;
    }

    iLen = strlen(source_string)+1;

   AES_cbc_encrypt(source_string, des_string, iLen, &aes, iv, AES_ENCRYPT);
}
 char *my_encrypt(char *str,char *path_key){
     char *p_en;
     RSA *p_rsa;
     FILE *file;
     int flen,rsa_len;
     if((file=fopen(path_key,"r"))==NULL){
         perror("source TPM: open key file error");
         return NULL;
     }
     //if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL){
     if((p_rsa=PEM_read_RSAPublicKey(file,NULL,NULL,NULL))==NULL){  // 换成这句死活通不过,无论是否将公钥分离源文件
         ERR_print_errors_fp(stdout);
         return NULL;
     }
     flen=strlen(str);
     rsa_len=RSA_size(p_rsa);
     p_en=(unsigned char *)malloc(rsa_len+1);
     memset(p_en,0,rsa_len+1);
     if(RSA_public_encrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_en,p_rsa,RSA_NO_PADDING)<0){
         return NULL;
     }
     RSA_free(p_rsa);
     fclose(file);
     printf("target TPM:encrypt finished\n");
     return p_en;
 }
 char *my_decrypt(char *str,char *path_key){
     char *p_de;
     RSA *p_rsa;
     FILE *file;
     int rsa_len;
     if((file=fopen(path_key,"r"))==NULL){
         perror("source TPM: open key file error");
         return NULL;
     }
     if((p_rsa=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL){
         ERR_print_errors_fp(stdout);

       return NULL;
     }
     rsa_len=RSA_size(p_rsa);
     p_de=(unsigned char *)malloc(rsa_len+1);
     memset(p_de,0,rsa_len+1);
     if(RSA_private_decrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_de,p_rsa,RSA_NO_PADDING)<0){
         return NULL;
     }
     RSA_free(p_rsa);
     fclose(file);
     return p_de;
 }
int my_client(int cases,unsigned char *serverIp)
{
  // 声明并初始化一个客户端的socket地址结构
  struct sockaddr_in client_addr;
  bzero(&client_addr, sizeof(client_addr));
  client_addr.sin_family = AF_INET;
  client_addr.sin_addr.s_addr = htons(INADDR_ANY);
  client_addr.sin_port = htons(0);
  // 创建socket,若成功,返回socket描述符
  int client_socket_fd = socket(AF_INET, SOCK_STREAM, 0);
  if(client_socket_fd < 0)
  {
    perror("DA:Create Socket Failed");
    exit(1);
  }

  // 绑定客户端的socket和客户端的socket地址结构 非必需
  if(-1 == (bind(client_socket_fd, (struct sockaddr*)&client_addr, sizeof(client_addr))))
  {
    perror("DA:Client Bind Failed");
    exit(1);
  }

  // 声明一个服务器端的socket地址结构,并用服务器那边的IP地址及端口对其进行初始>化,用于后面的连接
  struct sockaddr_in server_addr;
  bzero(&server_addr, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  if(inet_pton(AF_INET, "169.254.12.125", &server_addr.sin_addr) == 0)
  {
    perror("DA:Server IP Address Error:");
    exit(1);
}
  server_addr.sin_port = htons(SERVER_PORT);
  socklen_t server_addr_length = sizeof(server_addr);
   // 向服务器发起连接,连接成功后client_socket_fd代表了客户端和服务器的一个socket连接
  if(connect(client_socket_fd, (struct sockaddr*)&server_addr, server_addr_length) < 0)
  {
    perror("DA:Can Not Connect To Server IP:");
    exit(0);
  }
  else
  {
    printf("DA:connect server success\n");
  }
 
  // 输入文件名 并放到缓冲区buffer中等待发送
  char file_name[FILE_NAME_MAX_SIZE+1]="mig.key";  
  char buffer[BUFFER_SIZE];
  char *seed,*dups,*outerhmac,*encryptionKeyout;
  int length = 0;
  char dups1[17]={0},sens[17]={0},du[17]={0},*keyout,privatekey[17]={0};
  int RA=0;
  int Ntpm=1;
  char *Nda0="2";
  if(cases==0)
  {
    printf("------------DA:init stag start-----------\n");
    printf("DA:recieve data from source/target TPM....\n");
    bzero(buffer, BUFFER_SIZE);
    seed=buffer;
    length = recv(client_socket_fd, seed, BUFFER_SIZE, 0);
    printf("DA:using DA privatekey  dencrypt to get ks\n");
    se=my_decrypt(seed,PRIDA);
    //printf("解密后的数据为:%s\n",se);
    
    bzero(buffer, BUFFER_SIZE);
    length = recv(client_socket_fd, du, BUFFER_SIZE, 0);
    strcpy(dups1,du);
    printf("DA:using ks decrypt to get ID,CertEK,IDtpm,SignID,Ntpm...\n");
    aes_box_decrypt(du,sens);
    //printf("DA:解密后的数据为:%s\n",sens);
    printf("DA:Verify CertEK.....\n");
    printf("DA:Verify Sign(ID).....\n");
    //Verifysign();
    printf("DA:Verify success ,set RA=1\n");
    RA=1;
    aes_box_encrypt("1||1||2",buffer);
    printf("DA:send data to source/target TPM\n");
    send(client_socket_fd,buffer,BUFFER_SIZE,0);
    printf("DA:recieve data from source/target TPM...\n");
    bzero(buffer, BUFFER_SIZE);
    length = recv(client_socket_fd, buffer, BUFFER_SIZE, 0);
    //printf("recieve Nda is:%s\n",buffer);
    printf("DA:using ks decrypt to get Nda0...\n");
    aes_box_decrypt(buffer,dups1);
    //printf("DA:解密后的数据为:%s\n",dups1);
    if(*dups1==*Nda0)
    {
       printf("DA:Verify Nda0 success,storage to database\n");
    }
    printf("------------DA:init stag end------------\n");
  }
}  
int main(void){
     int c,timeuse;
     unsigned char *prikey,*dups1;
     unsigned char str[10]="migratekey";
     FILE *migkeyfp;
     char *seed1;
     char source[202];
     struct timeval start, end;
 
     gettimeofday( &start, NULL );  
     //my_client(0,"169.254.12.125");
     my_client(0,"169.254.12.45");
     gettimeofday( &end, NULL );
     timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec;
     printf("DA:init total run time: %d us\n", timeuse);
     return 0;
 }

© 著作权归作者所有

粉丝 2
博文 19
码字总数 37798
作品 0
成都
私信 提问
学物联网和嵌入式好不好?都有哪些课程?

学物联网和嵌入式好不好?都有哪些课程?物联网是嵌入式发展的一个方向但是个人觉得物联网的前景发展要稍微好一些,毕竟现在智能家居、智能生活这么受人追捧,而且也是今后生活的大方向建议题...

长沙千锋
2018/05/25
0
0
语音交互中的“等待体验”研究

雷锋网按:本文来自百度人工智能交互设计院,通过实验的方式,研究了语音交互中用户对于智能音箱的“等待体验”。雷锋网编辑在不改变原意的基础上做了精编。 回顾人机交互发展史,人类先后经...

叨叨
2017/12/19
0
0
语音交互中的「等待体验」研究

     回顾人机交互发展史,人类先后经历了基于命令行的CLI 时代,基于鼠标键盘的GUI时代,基于触摸的初级NUI时代。后面每一个阶段比前一个阶段更自然,学习成本更低,综合效率更高。   ...

深度学习
2017/12/19
0
0
基于mysql的可视化日志管理——loganalyzer

一:环境搭建目标 通过mysql与rsyslog的搭配和loganalyzer的显示,实现日志记录在数据库中的统一存储和可视化操作。 二:实验环境 A:mysql server 一台 192.168.216.66 B:rsyslog server ...

云云毓
2017/10/27
0
0
基于mysql的可视化日志管理——loganalyzer

一:环境搭建目标 通过mysql与rsyslog的搭配和loganalyzer的显示,实现日志记录在数据库中的统一存储和可视化操作。 二:实验环境 A:mysql server 一台 192.168.216.66 B:rsyslog server ...

云云毓
2018/06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JVM -- Java堆结构及对象分代

Hello,今天记录下 Java虚拟机中的其中一个重点知识 --> Java堆。 一起学习,一起进步。继续沉淀,慢慢强大。希望这文章对您有帮助。若有写的不好的地方,欢迎评论给建议哈! 初写博客不久,...

猫狗熊
25分钟前
4
0
elastic-job的使用

概述: 公司用了elastic-job来执行定时任务和管理定时任务,所以最近研究了一下写了个demo,由于我是把zookeeper部署在了docker上的,所以这里简单介绍下docke的基础命令。 1、Docker基础命令...

你个小机灵鬼
26分钟前
4
0
Cadence Allegro 中skill应用教程:让代码替我们打工

SKILL语言是Candence提供给用户的一个开发接口,利用其本身提供的接口函数和SKILL语言完成自动化操作的功能。 怎么查看SKILL: 1.可以直接用写字板打开进行编辑或看功能说明。 2.想自己写或改...

demyar
27分钟前
4
0
如何看待技术债务

关于技术债务,做开发的同学对如下场景应该不陌生: 为了敢项目进度,详细设计、单元测试等过程就不写了,以后补 需求变化万千,原本架构设计无法满足新的需求,可是又不想动架构,于是绕过架...

嘿嘿嘿IT
29分钟前
4
0
深入理解 web 协议(一)- http 包体传输

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/WlT8070LlrnSODFRDwZsUQ 作者:吴越 开坑这个系列的原因,主要是在大前端学习的过程中遇到了不少跟web协议有关的问...

vivo互联网技术
29分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部