2 个版本

0.1.1 2023 年 11 月 26 日
0.1.0 2023 年 11 月 26 日

#693 in 密码学

Apache-2.0

88KB
1.5K SLoC

PSP 安全协议的 Rust 实现

谷歌发布了 PSP(PSP 安全协议)规范和参考实现。该实现是用 C 语言编写的。

psp_security 包是参考实现的 Rust 版本。它使用 Rust 实现了 PSP 加密/解密功能,以确保内存安全。

该实现包括一个核心 psp_security 库,该库实现了 PSP 数据包封装、解封装、加密和解密,以及一个使用此库的命令行工具。此工具对于生成测试向量以及从命令行加密/解密内容很有用。

构建

cargo build

运行 crates 单元测试。

cargo test

安装命令行工具。以下示例将其安装到当前目录。

cargo install --path .

命令行工具

提供了一个名为 psp 的命令行工具,用于说明如何使用 psp_security 库,并提供一些用于使用 PSP 加密和解密 pcap 文件中的数据包的简单工具。

Usage: psp <COMMAND>

Commands:
  create   Create files that are useful for testing PSP encryption and decryption
  encrypt  Perform PSP encryption on plaintext packets read from a pcap file
  decrypt  Performs PSP decryption on PSP-encrypted packets read from a pcap file
  help     Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version

示例用法

# Create a sample input pcap file
psp create pcap -n 10 -v ipv4 -o cleartext.pcap
# Create a sample configuration file
psp create config --spi 98234567 --mode transport --alg aes-gcm128 -c example.cfg
# Encrypt the pcap file using the configuration
psp encrypt -c example.cfg -i cleartext.pcap -o encrypted.pcap
# Decrypt the encrypted packets using the configuration
psp decrypt -c example.cfg -i encrypted.pcap -o decrypted.pcap
# Compare the decrypted packets against the origin sample packets
tcpdump -X -r cleartext.pcap > cleartext.txt
tcpdump -X -r decrypted.pcap > decrypted.txt
diff cleartext.txt decrypted.txt

命令详情

psp encrypt

使用 psp encrypt 加密 pcap 文件中的数据包需要不仅包含数据包的 pcap 文件,还需要一个配置文件,该文件指定了 PSP 配置。

$ psp encrypt -h
Perform PSP encryption on plaintext packets read from a pcap file

Usage: psp encrypt [OPTIONS]

Options:
  -v, --verbose          Enable verbose mode
  -e, --error            Forces a single bit error in each output packet which will cause authentication to fail
  -c <CFG_FILE>          PSP encryption configuration file [default: psp_encrypt.cfg]
  -i, --input <INPUT>    Input pcap file containing plaintext packet(s) to encrypt [default: cleartext.pcap]
  -o, --output <OUTPUT>  Output pcap file where the encrypted packet(s) will be written [default: psp_encrypt.pcap]
  -h, --help             Print help (see more with '--help')

psp decrypt

使用 psp encrypt 加密 pcap 文件中的数据包需要不仅包含数据包的 pcap 文件,还需要一个配置文件,该文件指定了 PSP 配置。

$ psp decrypt -h
Performs PSP decryption on PSP-encrypted packets read from a pcap file

Usage: psp decrypt [OPTIONS]

Options:
  -v, --verbose          Enable verbose mode
  -c <CFG_FILE>          PSP encryption configuration file [default: psp_encrypt.cfg]
  -i, --input <INPUT>    Input pcap file containing encrypted packet(s) to decrypt [default: psp_encrypt.pcap]
  -o, --output <OUTPUT>  Output pcap file where the decrypted packet(s) will be written [default: psp_decrypt.pcap]
  -h, --help             Print help (see more with '--help')

psp create config

可以使用 psp create config 命令创建一个示例配置文件,格式为 json 或纯文本。纯文本格式基于谷歌 PSP C 语言实现使用的配置文件格式。这里支持它,以便与 C 语言实现进行兼容性测试。

$ psp create config -h
Create a configuration file that can be used with the encrypt and decrypt commands

Usage: psp create config [OPTIONS]

Options:
  -s, --spi <SPI>                      SPI. 32b hex value. Upper bit selects the master key [default: 2587121272]
  -m, --mode <MODE>                    Encap mode: Tunnel or Transport [default: transport] [possible values: transport, tunnel]
  -a, --alg <ALG>                      Crypto Algorithm [default: aes-gcm256] [possible values: aes-gcm128, aes-gcm256]
      --crypto-offset <CRYPTO_OFFSET>  Crypto Offset [default: 0]
  -v, --vc                             Include virtual cookie
  -c, --cfg-file <CFG_FILE>            Name of the output configuration file [default: psp_encrypt.cfg]
  -j, --json                           json file format
  -h, --help                           Print help (see more with '--help')

psp create pcap

可以使用 psp create pcap 工具创建一个用于测试目的的示例 pcap 文件。

$ psp create pcap -h
Create a cleartext pcap file that can be used for testing

Usage: psp create pcap [OPTIONS]

Options:
  -n, --num <NUM>  Number of packets to create [default: 1]
  -v, --ver <VER>  IPv4 or IPv6 packets [default: ipv4] [possible values: ipv4, ipv6]
  -e, --empty      Create empty packets where empty means the size of the L4 payload is 0
  -o <OUTPUT>      Name of the pcap output file [default: cleartext.pcap]
  -h, --help       Print help (see more with '--help')

依赖项

~12MB
~229K SLoC