liboqs-go库在Mac编译使用

2023-11-02

liboqs-go库在Mac编译使用

liboqs-go是liboqs——量子安全密码算法的开源C库的go封装

将在mac m1上部署和开发使用,所以简单记录下过程

部署

# 安装基础依赖工具
brew install cmake ninja openssl@1.1 wget doxygen graphviz astyle valgrind
pip3 install pytest pytest-xdist pyyaml

# 下载c库
git clone -b main https://github.com/open-quantum-safe/liboqs.git
cd liboqs

# 编译c库 启用共享库
mkdir build && cd build
cmake -DBUILD_SHARED_LIBS=ON -GNinja ..
ninja

# 设置指向 liboqs 库目录的路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

# 下载go的封装库
cd /opt && git clone https://github.com/open-quantum-safe/liboqs-go

# 添加到环境变量
export LIBOQSGO_INSTALL_PATH=/opt/liboqs-go

# 配置加到环境变量
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/liboqs-go/.config

# 测试
cd /opt/liboqs-go
go run examples/kem/kem.go

# 在项目中使用
go get github.com/open-quantum-safe/liboqs-go/oqs

简单实用案例-生成私钥、公钥、证书并存文件

package main

import (
	"encoding/pem"
	"fmt"
	"log"
	"os"

	"github.com/open-quantum-safe/liboqs-go/oqs"
)

func main() {
	//fmt.Println("liboqs version: " + oqs.LiboqsVersion())
	//fmt.Println("Enabled signatures:")
	//fmt.Println(oqs.EnabledSigs())

	sigName := "Dilithium2"
	signer := oqs.Signature{}
	defer signer.Clean() // clean up even in case of panic

	if err := signer.Init(sigName, nil); err != nil {
		log.Fatal(err)
	}

	//fmt.Println("\nSignature details:")
	//fmt.Println(signer.Details())

	msg := []byte("This is the message to sign")
	pubKey, err := signer.GenerateKeyPair()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("\nSigner public key:\n% X ... % X\n", pubKey[0:8],
		pubKey[len(pubKey)-8:])

	signature, _ := signer.Sign(msg)
	fmt.Printf("\nSignature:\n% X ... % X\n", signature[0:8],
		signature[len(signature)-8:])

	verifier := oqs.Signature{}
	defer verifier.Clean() // clean up even in case of panic

	if err := verifier.Init(sigName, nil); err != nil {
		log.Fatal(err)
	}

	isValid, err := verifier.Verify(msg, signature, pubKey)
	if err != nil {
		log.Fatal(err)
	}

	verifier.ExportSecretKey()

	fmt.Println("\nValid signature?", isValid)

	// 私钥 存文件
	prvKeyFile, err := os.Create("prvKey.pem")
	defer prvKeyFile.Close()
	if err != nil {
		return
	}
	err = pem.Encode(prvKeyFile, &pem.Block{Type: "PRIVATE", Bytes: signer.ExportSecretKey()})
	if err != nil {
		return
	}

	// 公钥 存文件
	pubKeyFile, err := os.Create("pubKey.pem")
	defer pubKeyFile.Close()
	if err != nil {
		return
	}
	err = pem.Encode(pubKeyFile, &pem.Block{Type: "PUBLIC", Bytes: pubKey})
	if err != nil {
		return
	}

	// 证书 存文件
	certFile, err := os.Create("cert.pem")
	defer certFile.Close()
	if err != nil {
		return
	}
	cert, _ := signer.Sign(pubKey)
	err = pem.Encode(certFile, &pem.Block{Type: "CERTIFICATE", Bytes: cert})
	if err != nil {
		return
	}

}

参考

  • 编译 https://github.com/open-quantum-safe/liboqs#linuxmacos
  • 环境变量及使用 https://github.com/open-quantum-safe/liboqs-go
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

liboqs-go库在Mac编译使用 的相关文章

随机推荐

  • js取消默认事件和事件绑定

    1 默认事件 浏览器本事具备的一些功能 如鼠标右键菜单 a标签跳转页面 如果要阻止这些默认行为 可以用return false w3c中定义了ev preventDefault 这个不兼容IE11以下
  • Java 内存可见性与volatile

    在多核系统中 处理器一般有一层或者多层的缓存 这些的缓存通过加速数据访问 因为数据距离处理器更近 和降低共享内存在总线上的通讯 因为本地缓存能够满足许多内存操作 来提高CPU性能 如图 处理器的多层缓存模型 JVM需要实现跨平台的支持 它需
  • Acwing-1112. 迷宫

    include
  • [JavaScript][异步]Promise 构造函数是同步执行还是异步执行,那么 then 方法呢

    JavaScript 异步 Promise 构造函数是同步执行还是异步执行 那么 then 方法呢 const promise new Promise resolve reject gt console log 1 resolve cons
  • MATLAB查看变量的类型

    MATLAB查看变量的类型 gt gt a 100 a 100 gt gt class a ans double gt gt single a ans single 100 gt gt class ans ans single class
  • ubuntu 下 Android系统编译开 发 环境搭建

    官方的搭建android 系统源码 开发环境教程 https source android com source building 这个网址如果打不开 需要翻墙操作 Ubuntu JDK安装配置的详细步骤 Ubuntu JDK安装配置1 下
  • Prophet模型中plot_components四种主要成分含义

    Prophet模型中plot components四种主要成分含义 在Prophet模型中 plot components函数可以对时间序列数据的不同成分进行可视化分析 从而为使用者提供一定的参考依据 其中有四个主要成分 含义如下 tren
  • 多智能体强化学习与博弈论-博弈论基础2

    多智能体强化学习与博弈论 博弈论基础2 Repeated Games 重复博弈 之前我们介绍了一些单次博弈的例子 除了单次博弈外 重复博弈也是经常在我们生活中出现的 在重复博弈中智能体有机会在单次的博弈中占到对手的便宜 但是由于考虑到后来还
  • C语言动态内存管理(malloc,calloc,free,realloc)

    动态内存管理 前言 一 malloc 二 free 三 calloc 四 realloc 五 动态内存管理的常见问题 1 对空指针进行解引用操作 2 对动态开辟的空间越界访问 3 对非动态开辟的内存空间free 4 使用free释放动态内存
  • go语言使用thrift协议实现客户端和服务端报not enough arguments in call to oprot.WriteMessageBegin错误解决方案

    正常步骤 安装golang的Thrift包 go get git apache org thrift git lib go thrift 安装 Thrift 的 IDL 编译工具 http www apache org dyn closer
  • Mybatis学习笔记

    1 概述 MyBatis是一个优秀的持久层框架 它对JDBC操作数据库的过程进行封装 使开发者只需要关注 SQL本身 而不需要花费精力去处理例如注册驱动 创建connection 创建statement 手动设置参数 结果集检索等JDBC繁
  • R语言与机器学习中的回归方法学习笔记

    机器学习中的一些方法如决策树 随机森林 SVM 神经网络由于对数据没有分布的假定等普通线性回归模型的一些约束 预测效果也比较不错 交叉验证结果也能被接受 下面以R中lars包包含数据集diabetes为例说明机器学习中的回归方法 一 数据集
  • numpy(一)

    numpy作为一个科学计算的基础库 他能干的python也能干啊 我还要他干啥 先算个题比较一下 ndarray与python原生list的运算效率对比 import random import time import numpy as n
  • 剑指Offer第三十六题:两个链表的第一个公共结点

    题目描述 输入两个链表 找出它们的第一个公共结点 思路 这里两个单向链表如果有公共结点肯定是下面这种情况 最后通过公共结点汇合 1 看到这题我直接想到哈希 直接利用map存储一个链表 第二个链表遍历查找地址即可 2 链表的叠加 如下图 假设
  • 前沿技术创新是人工智能发展的动力之源 不断拓展能力边界

    近日 WAIC2022上海人工智能开发者大会在中国 上海 自由贸易试验区临港新片区举行 记者从会上获悉 上海将加大力度推动算法开源 数据开放 算力开发 与国内外知名开源社区互联互通 打造国际人工智能开发生态网络的关键节点 前沿技术创新是人工
  • shell脚本之 函数——【初学者必看】

    shell脚本之函数 一 shell函数定义 1 1函数注意事项 1 2 函数返回值 1 3函数调用的方法 1 4 函数的传参 1 5 函数的作用范围 1 6函数的参数 1 6 1参数的用法 1 6 2参数的表示方法 1 6 3 经典案例
  • Flutter实战Align使用详解

    Align相关属性 Align Key key this alignment Alignment center this widthFactor this heightFactor Widget child alignment 需要一个Al
  • 关于C++中unsigned类型

    我们知道c 中的long long 也知道c 里long long有符号 unsigned long long和long long的区别就在于 1 unsigned long long 没有符号 表示范围是0到264 1 2 long lo
  • Java实现Kafka生产者和消费者的示例(1),mysqlsql语句面试题

    RecordMetadata recordMetadata null try 将消息发送到Kafka服务器的名称为 one more topic 的Topic中 recordMetadata kafkaProducer send new P
  • liboqs-go库在Mac编译使用

    liboqs go库在Mac编译使用 liboqs go是liboqs 量子安全密码算法的开源C库的go封装 将在mac m1上部署和开发使用 所以简单记录下过程 部署 安装基础依赖工具 brew install cmake ninja o