zoukankan      html  css  js  c++  java
  • TPM 程序设计基础 4-1 :main.c 分析

    前言

    前文:

    简述了如何通过《TSS V1.2》文档来实现 C 语言 GTK3 编程。

    本文就课设中 main.c 与之前的 tpm_func.c、spnam_check.c 结合,简述相应的函数的功能。

    参考程序

    tpm_func.c、spnam_check.c 分析

    main.c 代码结构

    main.c

    #define _XOPEN_SOURCE
    #include ......
    #include <tss/.......>
    #include <gtk/gtk.h>
    
    #include "spnam_check.h"
    #include "tpm_func.h"
    
    #define Debug......
    
    char *pcr_result;
    
    //主界面控件结构体
    struct STRUCT_PCR_READ {
        GtkWidget *entry_pcr_read;
        GtkTextBuffer *buffer_pcr_read;
    }struct_pcr_read;
    
    //扩展 PCR 界面控件结构体 
    struct STRUCT_PCR_EXTRA {
        ......
    }struct_pcr_extra;
    
    //提前声明 extra_pcr_win() ,避免隐式声明 warning
    void extra_pcr_win(int flag_choose_win);
    
    /**
     * 提示信息窗口函数
     * 用于弹出提示信息
     * 参数:char *win_title:窗口标题
     *      char *dialog_title:提示信息
     */
    void dialog_message(const gchar *win_title, const gchar *dialog_title)
    {
        ......
    }
    
    
    /**
     * 读取 PCR LOG 文件内容并显示在多行文本框函数
     * 调用 tpm_func.c 中的 tpm_func_pcr_read_write_file() 函数,读取 TPM PCR 并写入文件
     * 用于 struct_pcr_read.buffer_pcr_read 的 GtkWidget *button 的回调函数
     * 参数:GtkWidget *button, gpointer data
     */
    static void get_pcr_value(GtkWidget *button , gpointer data)
    {
        //调用 tpm_func.c 中的 tpm_func_pcr_read_write_file() 函数,读取 TPM PCR 并写入文件
        ......
        
        //为多行文本框控件分配缓冲区
        struct_pcr_read.buffer_pcr_read = gtk_text_view_get_buffer(GTK_TEXT_VIEW(struct_pcr_read.entry_pcr_read));
        //从头显示缓冲区字符
        gtk_text_buffer_set_text (struct_pcr_read.buffer_pcr_read, pcr_result, -1);
        
        printf("[MAIN]	[END]	get_pcr_value()
    ");
    }
    
    
    /**
     * PCR扩展的 root 账户验证函数
     * 用于 extra_pcr_win(0) 的 GtkWidget *button 的会调函数
     * 参数:GtkWidget *button, gpointer data
     */
    static void extra_root_check(GtkWidget *button , gpointer data)
    {
    	// 获得 root 权限登录窗口文本内容
        
        //调用 spnam_check.c 中的 spnam_check() 函数,通过返回值判断认证成功与否,以及错误类型
        ......
        
        //销毁PCR扩展认证窗口
        gtk_widget_destroy(struct_pcr_extra.win_extra);
        //设定PCR扩展窗口标志为0,已消除
        struct_pcr_extra.flag_win_extra_live = 0;
        //打开PCR值扩展窗口
        extra_pcr_win(1);
        
        printf("[MAIN]	[END]	extra_root_check()
    ");
    }
    
    /**
     * PCR扩展信息检查并扩展函数
     * 用于 extra_pcr_win(1) 的 GtkWidget *button 的会调函数
     * 检查符合规定后,扩展
     * 参数:GtkWidget *button, gpointer data
     */
    static void extra_pcr_info_check(GtkWidget *button , gpointer data)
    {
    	// 获得 pcr 扩展文本内容
        
        
        //判断pcr_index长度,以及pcr_index数字
        switch(strlen_pcr_index){
            ......
        }
        
        //将满足条件的index转为Uint32类型
        
        //将2位数的pcr_index缩小范围
    
        //判断pcr_extra_string字符长度,else判断是否为数字、小写字母或小写字母
        if(strlen_pcr_extra_string <= 0 || strlen_pcr_extra_string > 40) {
            ......
        }
        else {
            for(i=0; i<strlen_pcr_extra_string; i++) {
                if( ...... )
                {
                    continue;
                }
                else {
                    ......
                }
            }
        }
        
        //调用 tpm_func.c 中的 tpm_func_pcr_extra() 函数
    }
    
    /**
     * PCR扩展的窗口关闭函数
     * 关闭PCR扩展的相关窗口,设定窗口 struct_pcr_extra.flag_win_extra_live 值为 0
     * 参数:无
     */
    static void extra_pcr_win_destroy(GtkWidget *button , gpointer data)
    {
        //销毁PCR扩展窗口
        gtk_widget_destroy(struct_pcr_extra.win_extra);
        //设定PCR扩展窗口标志为0,已消除
        struct_pcr_extra.flag_win_extra_live = 0;
    }
    
    
    /**
     * PCR扩展的窗口函数
     * 打开PCR扩展的相关窗口
     * 参数:int flag_choose_win:控制PCR扩展的窗口参数
     * flag_choose_win=0,root登陆窗口
     * flag_choose_win=1,pcr扩展窗口
     */
    void extra_pcr_win(int flag_choose_win)
    {
        //判断PCR扩展窗口标志是否为1,若为 1 ,提示以创建窗口;如为 0,执行下面创建窗口命令,并置为 1
        
        //判断控制PCR扩展的窗口参数
        if(flag_choose_win == 0)
        {
            //显示登录认证窗口
        
        }
        else if(flag_choose_win == 1)
        {
         	//显示登录成功的窗口
        }
        
        //连接信号,让点击右上角的 X 关闭按钮后,便调用 extra_pcr_win_destroy 函数 
    }
    
    /**
     * PCR扩展启用函数
     * 用于主窗口 扩展按钮 GtkWidget *button 的会调函数
     * 调用extra_pcr_win(int flag_choose_win) flag_choose_win=0
     * 参数:GtkWidget *button, gpointer data
     */
    static void extra_pcr(GtkWidget *button , gpointer data)
    {
        extra_pcr_win(0);
    }
    
    /**
     * 控件函数
     */
    static void controller(GtkWidget *fixed_box)
    {
        ......
    }
    
    /**
     * 容器函数
     */
    static void activate(GtkApplication *app , gpointer data)
    {
        ......
    }
    
    int main(int argc , char **argv)
    {
        ......
    }
    
    
  • 相关阅读:
    docker建镜像
    注册路由的简易实现
    docker的小技巧记录(如果使用了更多会继续添加)
    Alembic使用
    SQLAlchemy的常用数据类型
    记录SQLAlchemy的基本使用
    linux创建桌面快捷方式
    vim编辑器命令
    redis发布订阅
    谨慎使用mysql的utf8
  • 原文地址:https://www.cnblogs.com/Yogile/p/12811540.html
Copyright © 2011-2022 走看看