前言
前文:
简述了如何通过《TSS V1.2》文档来实现 C 语言 GTK3 编程。
本文就课设中 main.c 与之前的 tpm_func.c、spnam_check.c 结合,简述相应的函数的功能。
参考程序
- 在码云链接下的
src/
目录中: TPM-PCR-Management 。
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)
{
......
}