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]\t[END]\tget_pcr_value()\n");
}


/**
 * 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]\t[END]\textra_root_check()\n");
}

/**
 * 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)
{
    ......
}

posted @ 2020-04-30 22:34  Yogile  阅读(606)  评论(0编辑  收藏  举报