文档章节

实验二.认证和属性获取阶段-source.c

 宋小八
发布于 2018/01/22 14:57
字数 1291
阅读 43
收藏 0

source TPM

//file system
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//openssl
#include<openssl/evp.h>
#include<openssl/sha.h>
#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 PUBEK "ek_pub.key"
#define PRIEK "ek.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

char*  sign( )
{
    EVP_MD_CTX mdctx;
    EVP_PKEY *evpkey=NULL,*evpkey1=NULL;
    char *signValue;
    unsigned int signLen;
    char *text="NO20171228";
    int textLen=16;
    //char *signID=NULL;

    RSA *pri,*pub;
    FILE *file;
    
    if((file=fopen(PRIEK,"r"))==NULL){
        perror("source TPM: open key file error");
        return;
    }
//    printf("1\n");
    //if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL){
    if((pri=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL){
        ERR_print_errors_fp(stdout);
        return;
    }
  // printf("2\n");
   evpkey=EVP_PKEY_new();
   if(NULL==evpkey){
      printf("EVP_KEY_new failed!\n");
      return;
   }
   EVP_PKEY_assign_RSA(evpkey,pri);
   //printf("3\n");
    //以下是计算签名的代码     
    EVP_MD_CTX_init(&mdctx);        //初始化摘要上下文     
    if(!EVP_SignInit_ex(&mdctx,EVP_md5(),NULL)) //签名初始化,设置摘要算法     
    {    
        printf("initerr\n");        
        return;    
    }    
    //printf("4\n");
    if(!EVP_SignUpdate(&mdctx,text,textLen)) //计算签名(摘要)Update     
    {    
        printf("signupfate err\n");       
        return;    
    }
    //printf("5\n");    
    if(!EVP_SignFinal(&mdctx,signValue,&signLen,evpkey))  //签名输出     
    {    
        printf("signfinal err\n");       
        return;    
    }    
   // printf("6\n");
    //printf("消息%s的签名值是:\n",text);    
    //printf("---------------------------\n");
    //printf("%s",signValue);  
    //printf("\n");
 //   return signValue;    
 //   EVP_PKEY_free(evpkey);
    EVP_MD_CTX_cleanup(&mdctx);
 //   return;
   
    ERR_load_EVP_strings();
    EVP_MD_CTX mdctx1;   //摘要算法上下文变量     
    EVP_MD_CTX_init(&mdctx1);    //初始化摘要上下文     
 
    FILE *file1;
    int flen1;
    if((file1=fopen(PUBEK,"r"))==NULL){
        perror("source TPM: open key file error");
        return;
    }
    if((pub=PEM_read_RSA_PUBKEY(file1,NULL,NULL,NULL))==NULL){
    //if((pub=PEM_read_RSAPublicKey(file1,NULL,NULL,NULL))==NULL){
        ERR_print_errors_fp(stdout);
        return;
    }
     evpkey1=EVP_PKEY_new();
   if(NULL==evpkey1){
      printf("EVP_KEY_new failed!\n");
      return;
   }
   EVP_PKEY_assign_RSA(evpkey1,pub);

    if(!EVP_VerifyInit_ex(&mdctx1, EVP_md5(), NULL)) //验证初始化,设置摘要算法,一定要和签名一致     
    {
        printf("EVP_VerifyInit_ex err\n");
      
        return;
    }
    if(!EVP_VerifyUpdate(&mdctx1, text, textLen)) //验证签名(摘要)Update     
    {
        printf("err\n");
        
        return;
    }
    //printf("%s\n",text);
    if(EVP_VerifyFinal(&mdctx1,signValue,signLen,evpkey1)==0)
    {
       // printf("verify err\n");
        //printf("签名值是:\n");
//        printf("%s\n",signValue);
        //printf("end\n");
        EVP_MD_CTX_cleanup(&mdctx1);
        return;
    }
    else
    {
       // printf("验证签名正确.\n");
    }
    //释放内存     
    EVP_PKEY_free(evpkey1);
    EVP_MD_CTX_cleanup(&mdctx1);
    return signValue;

}
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)  
    {  
       printf("NULL\n");
       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);  
 
}  
 
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)  
    {  
        printf("NULL\n");
        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);  
}

 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("p_en is %s\n",p_en);
     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_server1(int cases,char *sysencseed1,char *encryKeyout,char *dups,char *outerHMAC)
{
    // 声明并初始化一个服务器端的socket地址结构
  struct sockaddr_in server_addr;
  bzero(&server_addr, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = htons(INADDR_ANY);
  server_addr.sin_port = htons(SERVER_PORT);

  // 创建socket,若成功,返回socket描述符
  int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0);
  if(server_socket_fd < 0)
  {
    perror("Create Socket Failed:");
    exit(1);
  }
 int opt = 1;
  setsockopt(server_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

  // 绑定socket和socket地址结构
  if(-1 == (bind(server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr))))
  {
    perror("Server Bind Failed:");
    exit(1);
  }

  // socket监听
  if(-1 == (listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE)))
  {
    perror("Server Listen Failed:");
    exit(1);
  }
  printf("source TPM:waiting for DA connect...........\n");
  // 定义客户端的socket
  struct sockaddr_in client_addr;
  socklen_t client_addr_length = sizeof(client_addr);
  // 接受连接请求,返回一个新的socket(描述符),这个新socket用于同连接的客户端>通信
  // accept函数会把连接到的客户端信息写到client_addr中
  int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length);
  if(new_server_socket_fd < 0)
  {
    perror("Server Accept Failed:");
   // break;
   return -1;
  }
  else
  {
    printf("source TPM: DA connect success!\n");
  }
  FILE *fp ;
  if(cases==0)
  {
    char buffer0[BUFFER_SIZE],sysencseed[BUFFER_SIZE],dstStringTemp[17]={0};
    int RA=1,Ntpm=1,Nda=1;
    char *temp=0,*Nda0="2",ks2[]="sdf3e4fs";
    //send seed
    printf("-------------source TPM:verify and get stage start--------------\n");
    bzero(buffer0, BUFFER_SIZE);
    bzero(sysencseed, BUFFER_SIZE);
    //recieve data
    printf("source TPM:recieve data from DA.....\n");
    recv(new_server_socket_fd, buffer0, BUFFER_SIZE, 0);
    recv(new_server_socket_fd,sysencseed,BUFFER_SIZE,0);
    //Verifysign();
    if(buffer0=="migrate"){
        printf("source TPM:verify DResquest success!\n");
    }
    bzero(buffer0,BUFFER_SIZE);
    bzero(sysencseed,BUFFER_SIZE);
   
    temp=my_encrypt(ks2,PUBDA);
    aes_box_encrypt("2",buffer0);
    //send data
    printf("source TPM:send data to DA.....\n");
    send(new_server_socket_fd, temp, BUFFER_SIZE, 0);
    send(new_server_socket_fd, buffer0, BUFFER_SIZE, 0);
    printf("source TPM:recieve data from DA....\n");
    bzero(buffer0,BUFFER_SIZE);
    bzero(sysencseed,BUFFER_SIZE);
    recv(new_server_socket_fd, buffer0, BUFFER_SIZE, 0);
    printf("source TPM:using ks2 decrypt to get newParentHandle and objectHandle...\n");
    aes_box_decrypt(buffer0,sysencseed);
    if(Nda!=1)
    {
       printf("verify Nda failed,exit\n");
    }
    else
       printf("verify Nda success,continuing\n");
    bzero(buffer0,BUFFER_SIZE);
    aes_box_encrypt("1&1&1&1&1",buffer0);
    printf("source TPM:send data to DA.....\n");
    send(new_server_socket_fd, buffer0, BUFFER_SIZE, 0);
    //printf("source TPM:after decrypt is :%s\n",dstStringTemp);

    printf("-------------source TPM:verify and get  stage end--------------\n");
  }
}
int main(void){
     int c,timeuse;
     char dstStringTemp[17]={0},dst[17]={0},dupSensitive1[17]={0},*sss,*encryptionKeyout;
     unsigned char*outerHMAC,encSensitive[17]={0};
     unsigned char *dupSensitive={0};
     unsigned char str[]="你好icd";
     unsigned char* encryptionKeyin="abcdefghijklmnop";
     FILE *migkeyfp;
     char *sysmetricSeed;
     struct timeval start, end;

     
     gettimeofday(&start,NULL);
     
     my_server1(0,NULL,NULL,NULL,NULL);
     gettimeofday(&end,NULL);
     timeuse=1000000*(end.tv_sec-start.tv_sec)+end.tv_usec-start.tv_usec;
     printf("source TPM:init stage total run time :%d us\n",timeuse);
     return 0;
 }

© 著作权归作者所有

粉丝 2
博文 19
码字总数 37798
作品 0
成都
私信 提问
七天学会ASP.NET MVC (四)——用户授权认证问题

小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会 Asp.Net MVC 第四篇出炉,在第四天的学习中,我们主要了学习如何在MVC中如何实现认证授权等问题,本节主要讲了验证错误时的错误值,客...

葡萄城控件技术团队
2015/07/07
70
0
【思科***】远程访问***简单演示

前提:目前远程访问*的应用范围非常广,与站点到站点式的不同,远程访问**一般用于员工在外地出差或者在家里的时候,需要访问公司内部服务器的情形。 实验拓扑: 需求:如图,用一朵浮云来代...

兰蒂卢斯
2018/07/04
0
0
IPSEC *** 的NAT穿越详解

IPSec是基于网络层的,不能穿越通常的NAT、防火墙,这篇文章就是要讨论,在需要NAT网络的环境中,如果使用IPsec *** 隧道技术。 IPsec 协议有两种运行模式:   IPSec隧道模式   IPSec传输...

plpy
2018/06/20
0
0
Openstack安装过程中出现的一些问题及解决

一、Centos7安装Mitika问题 1.问题:在keystone安装阶段请求认证令牌出现错误 # vim admin-openrcexport OSPROJECTDOMAIN_NAME=defaultexport OSUSERDOMAIN_NAME=defaultexport OSPROJECTNAM......

结束的伤感
2017/04/05
0
0
语音交互中的“等待体验”研究

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

叨叨
2017/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
42
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部