#!/bin/bash
# 该脚本用于向智能卡写入4096个数据对象,每个token最多容纳256个数据对象
# 当前token满载时,自动初始化新token
START_TIME=$(date +%s%3N)
# 模块路径,根据实际情况调整
MODULE_PATH="/home/ubuntu/Documents/HSM/20250106/SoftHSMv2_bgk/build/src/lib/libsofthsm2.so"
# 初始SO PIN和用户PIN,根据实际配置调整
SO_PIN="12345"
USER_PIN="1234"
# 数据对象前缀
DATA_PREFIX="DataObject_"
# 每个token的最大数据对象数量
MAX_OBJECTS_PER_TOKEN=64
# 总数据对象数量
TOTAL_OBJECTS=4096
# 定义文件路径和大小
FILE_NAME="/tmp/random_data.bin"
FILE_SIZE=512*1024
# 初始化第一个token
echo "初始化第一个token..."
./pkcs11-tool --module $MODULE_PATH --init-token --slot-index 0 --label "Token0" --so-pin $SO_PIN --init-pin --pin $USER_PIN
if [ $? -ne 0 ]; then
echo "初始化第一个token失败。"
exit 1
fi
target_slot_id=$(./pkcs11-tool --module $MODULE_PATH --list-slots | grep "Slot" | awk '{print $7}' | awk 'NR==1')
echo "slot 0 : "
echo $target_slot_id
# 设置初始计数器
current_token=0
object_count=0
# 循环写入数据对象
while [ $object_count -lt $TOTAL_OBJECTS ]; do
# 生成当前数据对象的唯一标识符
obj_label="${DATA_PREFIX}${object_count}"
echo "Data_${object_count}" > /tmp/data.bin
dd if=/dev/urandom of=$FILE_NAME bs=1024 count=$(($FILE_SIZE / 1024)) 2> /dev/null
echo "正在写入数据对象: ${obj_label}"
# 使用pkcs11-tool写入数据对象
./pkcs11-tool --module $MODULE_PATH --slot $target_slot_id --login --pin $USER_PIN --write-object $FILE_NAME --type data --label "${obj_label}"
# 检查写入是否成功
if [ $? -ne 0 ]; then
echo "写入数据对象${obj_label}失败。"
exit 1
fi
# 增加计数器
object_count=$((object_count + 1))
# 检查是否需要切换到新token
if [ $((object_count % MAX_OBJECTS_PER_TOKEN)) -eq 0 ]; then
current_token=$((current_token + 1))
echo "当前token已满, 初始化新token${current_token}..."
unset current_tokens
unset new_tokens
unset added_lines
unset target_slot_id
current_tokens=$(./pkcs11-tool --module $MODULE_PATH --list-slots | grep "Slot" | awk '{print $7}')
# 初始化新token
./pkcs11-tool --module $MODULE_PATH --init-token --slot-index ${current_token} --label "Token${current_token}" --so-pin $SO_PIN --init-pin --pin $USER_PIN
# 检查初始化是否成功
if [ $? -ne 0 ]; then
echo "初始化新token失败。"
exit 1
fi
new_tokens=$(./pkcs11-tool --module $MODULE_PATH --list-slots | grep "Slot" | awk '{print $7}')
while IFS= read -r line; do
if ! echo "$current_tokens" | grep "^$line$" | grep -q .; then
added_lines=$(echo -e "$added_lines\n$line")
fi
done <<< "$new_tokens"
target_slot_id=$(echo "$added_lines" | awk 'NR==2')
fi
done
echo "所有${TOTAL_OBJECTS}个数据对象已成功写入。"
END_TIME=$(date +%s%3N)
DIFF=$((END_TIME - START_TIME))
if [ $DIFF -lt 0 ]; then
DIFF=$((START_TIME - END_TIME))
fi
echo "Execute Time: ${DIFF} ms"

