如何通过Makefile提取密钥modulus与exponent生成STM32固件所需宏定义
解决方案
你可以通过awk的状态匹配逻辑精准筛选openssl输出的modulus和exponent段落,直接生成符合要求的头文件,完整Makefile命令如下:
$(shell openssl rsa -inform DER -text -noout < privatekey.der | awk ' BEGIN { print "#ifndef _DER_KEY_H_" print "#define _DER_KEY_H_" print "/* Auto generated file. DO NOT MODIFY */" in_modulus = 0 in_exponent = 0 mod_str = "#define MODULUS { " exp_str = "#define EXPONENT { " } # 匹配模数段开始 /^Modulus:/ { in_modulus = 1 next } # 匹配公钥指数段开始,同时结束模数段 /^publicExponent/ { in_modulus = 0 in_exponent = 1 # 提取括号内的16进制指数值 match($0, /\(0x([0-9a-fA-F]+)\)/, arr) exp_str = exp_str "0x" arr[1] next } # 空行标记指数段结束 /^$/ && in_exponent { in_exponent = 0 } # 处理模数段的16进制内容 in_modulus { # 清除行首空格、行尾冒号 gsub(/^[[:space:]]+|:$/, "", $0) # 逐位拼接为C数组格式 for(i=1; i<=NF; i++) { mod_str = mod_str "0x" $i ", " } } END { # 清除模数末尾多余的逗号 sub(/, $/, "", mod_str) mod_str = mod_str " }" exp_str = exp_str " }" print mod_str print exp_str print "#endif /* _DER_KEY_H_ */" }' > Core/Inc/der.h)
上述实现逻辑:
- 用两个状态变量标记当前解析的段落,自动过滤openssl输出中不需要的私钥素数、其他指数等冗余内容
- 模数段逐行解析16进制串,自动拼接为C数组要求的
0xXX,格式 - 指数直接从字段后的括号中提取16进制值,无需处理多余文本
- 输出自动带C头文件防护宏,可直接引入固件工程使用
如果你需要提取私钥指数而非公钥指数,只需将上述awk脚本中匹配
^publicExponent的规则修改为匹配^privateExponent:,对应调整段落切换逻辑即可。
内容的提问来源于stack exchange,提问作者Matheus Bueno Gomes
相关产品推荐
相关产品推荐

