type
status
date
slug
summary
tags
category
icon
password
这是一篇针对发表在USENIX 2023上的隐私信息检索论文Authenticated Private Information Retrieval的源码解析。该篇论文的具体内容参见文章
目 录
lib/utils
主要功能:实现了一些基础组件包括:配置导入、编码方法、LWE假设、高斯噪声等以方便后续其他包中使用
config.go | ㅤ |
ㅤ | ㅤ |
ㅤ | ㅤ |
config.go
constants
N/A
variables
N/A
functions
- LoadConfig
go-toml
是 Go 语言中的一个包,用于处理 TOML(Tom's Obvious, Minimal Language)格式的文件。TOML 是一种配置文件格式,由于其简洁的设计,易于阅读。该包提供了一些函数,用于在 Go 中对 TOML 数据进行编码和解码。它允许您轻松地将 TOML 配置文件解析为 Go 数据结构,反之亦然。types
- type Config struct
Config是一个结构体类型,其中包含一个map类型Servers(Servers的键类型是string,值类型是一个结构体类型Server。)以及一个字符串数组切片Addresses。
- type Server struct
Server是一个结构体类型,其中包含三个类型变量:1)一个整型int变量Index,记录服务器索引;2)一个字符串变量string,记录服务器ip地址;3)一个int整型变量Port,记录服务器端口。
Source Files
encoding.go
constants
N/A
variables
N/A
functions
- Uint32SliceToByteSlice
- ByteSliceToUint32Slice
- ByteToBits
types
N/A
gauss.go
constants
N/A
variables
- cdf_table:一个双精度浮点型float64变量(adapted from https://github.com/ahenzinger/simplepir/blob/main/pir/gauss.go)
functions
- GaussSample
types
N/A
lwe.go
constants
N/A
variables
- SeedMatrixA: 一个c长度为16的字节型数组,初始化一个用于AES加密的种子矩阵,用于生成密钥扩展的初始矩阵。在加密中,AES算法会使用这个种子矩阵以及密钥来生成一系列轮密钥,用于加密数据块。
functions
- ParamsDefault
- ParamsWithDatabaseSize
- computeB
- GetDefaultSeedMatrixA
- ParamsDefault128
- ParamsWithDatabaseSize128
types
- type ParamsLWE struct
profile.go
constants
variables
functions
- StartProfiling
这段代码是一个 Go 语言函数,名为
StartProfiling
。它接收一个字符串类型的参数 filename
,用于指定要写入的文件名。函数的主要功能是启动 CPU profiling,即在程序执行过程中定期记录 CPU 使用情况,并且在接收到操作系统的中断信号时,停止记录并退出程序。这对于分析程序的性能和寻找性能瓶颈非常有用。具体解析如下:- 函数开始时,首先尝试创建一个文件,文件名由参数
filename
指定。如果创建文件时出现错误,则调用log.Fatal(err)
打印错误信息并退出程序。
- 如果文件创建成功,接着调用
pprof.StartCPUProfile(f)
,开始 CPU profiling。这将导致程序在后台记录 CPU 使用情况到指定的文件f
中。
- 接下来,代码通过使用
os.Signal
来监听操作系统的信号,其中包括os.Interrupt
(通常是 Ctrl+C 中断信号)和os.Kill
(终止信号)。当收到这些信号时,会执行一段匿名函数。
- 匿名函数中的
for range c
语句使其成为一个无限循环,等待信号的到来。
- 当收到信号时,匿名函数内部执行
pprof.StopCPUProfile()
来停止 CPU profiling。然后调用os.Exit(0)
退出程序。
2. StopProfiling
StopProfiling
函数的作用是停止 CPU profiling。它调用了 pprof.StopCPUProfile()
来停止记录 CPU 使用情况。这个函数通常在程序退出时调用,以确保 CPU profiling 已经结束并且数据已经保存。- writeMemProfile
writeMemProfile
函数用于将内存分析数据写入到指定的文件中。它接收一个字符串类型的参数 filename
作为写入文件的名称。函数内部首先尝试创建文件,并在创建过程中处理可能出现的错误。然后,它调用 pprof.WriteHeapProfile(f)
来将内存分析数据写入到文件中。最后,关闭文件以确保写入完成并释放资源。- StartMemProfiling
- 函数首先创建一个用于接收操作系统中断信号的通道
c
。
- 然后使用
signal.Notify(c, os.Interrupt)
来监听操作系统的中断信号,一旦收到中断信号,就会执行匿名函数。
- 匿名函数中的
for range c
语句构成一个无限循环,等待中断信号的到来。
- 当收到中断信号时,匿名函数内部会调用
writeMemProfile(filename)
函数来写入内存分析数据到指定的文件中。
- 最后,调用
os.Exit(0)
退出程序。
- writeBlockProfile
func writeBlockProfile(filename string) {
: 这是一个函数定义,函数名为writeBlockProfile
,它接受一个字符串参数filename
,表示文件名。
f, err := os.Create(filename)
: 在这行代码中,通过os.Create
函数创建了一个名为filename
的文件。返回的f
是文件的句柄(File 类型),err
是可能出现的错误。
if err != nil { log.Fatal(err) }
: 这行代码用于检查是否创建文件时发生了错误。如果err
不为nil
,也就是发生了错误,那么通过log.Fatal
函数记录错误并终止程序。
log.Printf("Writing block profile")
: 这行代码简单地记录了一个日志消息,指示正在写入阻塞性能分析数据。
pprof.Lookup("block").WriteTo(f, 0)
: 这行代码使用pprof.Lookup
函数查找名为 "block" 的性能分析数据,并将其写入到之前创建的文件中。第二个参数0
表示写入所有数据。
f.Close()
: 最后一行代码用于关闭之前创建的文件,释放资源。
StartBlockProfiling
runtime.SetBlockProfileRate(1)
: 这行代码设置了阻塞性能分析的采样率为 1,这意味着每一个阻塞事件都会被记录下来,用于后续的分析。
c := make(chan os.Signal, 1)
: 这行代码创建了一个缓冲大小为 1 的信号通道c
,用于接收操作系统发出的信号,例如中断信号。
signal.Notify(c, os.Interrupt)
: 这行代码将os.Interrupt
信号(通常是用户按下 Ctrl+C)注册到信号通道c
上,表示当程序接收到中断信号时,将其发送到c
通道中。
go func() { ... }()
: 这是一个匿名函数,通过go
关键字开启了一个新的 goroutine,用于监听信号通道c
上的中断信号。
for range c { ... }
: 这是一个无限循环,用于持续地等待接收信号通道c
上的信号。一旦接收到信号,就执行下面的代码。
writeBlockProfile(filename)
: 当接收到中断信号时,调用writeBlockProfile
函数,将阻塞性能分析数据写入到指定的文件中。
os.Exit(0)
: 然后调用os.Exit
函数退出程序,参数0
表示正常退出。
types
rand.go
constants
variables
functions
- RandInt
- MathRand
types
- PRGKey
- PRGReader
定义了一个结构体类型PRGReader,其中包含一个PRGKey类型(一个长度为aes.BlockSize的字节型数组),另一个是cipher包中的接口类型Stream。
cipher.Stream
接口只有一个方法 XORKeyStream
,该方法将输入的源数据(明文或密文)与密钥流进行异或操作,结果写入目标切片中。这种按字节异或的方式是流密码的基本操作。- BufPRGReader
定义了一个结构体类型BufPRGReader,其中包含一个
tls.go
constants
variables
functions
types
utils.go
constants
variables
functions
types
lib/ecc
主要功能:定义了纠错码的参数,实现了Boyer-Moore Majority Vote算法
ecc.go
constants
variables
functions
types
参考文献
有关这篇文章的任何问题,欢迎您在底部评论区留言,一起交流~ 🍊