OP-TEE环境飞腾密码引擎编程指南
【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。 点击这里开始你的技术升级之旅吧
本文分享至飞腾开发者平台《OP-TEE环境飞腾密码引擎编程手册》
1 介绍
OP-TEE是按照GP规范开发的TEE OS,支持通用的ARMv8平台,开发搭建方便,便于开发者开发自有的上层可信应用,且OP-TEE提供了完整的SDK,方便编译TA和CA。OP-TEE遵循GP规范,支持各种加解密和电子签名验签算法,也支持在芯片中集成第三方的硬件加解密算法。
飞腾CPU集成了密码引擎(以下简称SCTO),支持SM2/SM3/SM4/SM9算法硬件加速。我们通过OP-TEE提供的接口标准,将SCTO的相关功能API添加到Libmbedtls库,实现飞腾平台OP-TEE环境的硬SM2/SM3/SM4算法。
2 环境要求
2.1 硬件环境
硬件要求如下表所示。
项目 | 说明 |
---|---|
CPU | D2000 |
网络 | 无要求 |
存储 | 无要求 |
内存 | 无要求 |
2.2 操作系统要求
操作系统要求如下表所示。
项目 | 说明 |
---|---|
OP-TEE OS | 3.12.0 |
Kernel | 要求支持TEE驱动 |
3 编程模型
OP-TEE根据GP规范实现了常用的加解密、签名验签和计算摘要的密码学算法的基础框架。如果需要使用硬件的密码学引擎来实现这些算法,则只需要替换掉对应的底层算法实现接口即可。对于上层用户而言,无需修改任何代码,只需按照GP规范,调用对应的接口组合即可实现对数据的加解密、摘要计算和数据签名验签操作。如下图所示,我们替换掉SM2、SM3和SM4底层API,将其用SCTO实现,就可以通过GP标准接口调用密码学引擎的能力来实现对数据的SM2、SM3和SM4算法的加解密、摘要计算和数据签名验签操作。
4 接口说明
4.1 SM2算法类接口说明
在OP-TEE当前版本的SM2底层算法实现接口中,对有些实现内容未做明确规定,需要我们根据实际需求去定义,特说明如下:
1)在SM2加解密接口,采用C1C2C3的数据格式。可以根据实际需求做调整,如C1C3C2格式。
2)在SM2签名验签接口,参数msg为签名数据的摘要。
3)在SM2签名验签接口中,签名数据为DER格式。
static TEE_Result sm2_generate_keypair(struct ecc_keypair \*key, size_t key_size)
功能:生成SM2密钥对
参数key:用于保存密钥对
参数key_size:密钥长度
返回结果:0表示成功生成密钥对,其他为错误
static void sm2_free_public_key(struct ecc_public_key *s)
功能:释放SM2密钥对
参数s:释放的密钥对
返回结果:成功释放密钥对
TEE_Result sm2_pke_encrypt(struct ecc_public_key *key, const uint8_t *src,size_t src_len, uint8_t *dst, size_t *dst_len)
功能:使用SM2算法加密数据
参数key:加密使用的SM2公钥
参数src:需要加密的数据
参数src_len:需要加密数据的长度
参数dst:用于保存加密数据
参数dst_len:入参时表示加密数据保存空间的大小,返回时表示加密后数据的长度
返回结果:0表示加密成功,其他表示错误
TEE_Result sm2_pke_decrypt(struct ecc_keypair *key,const uint8_t *src,size_t src_len, uint8_t *dst,size_t *dst_len)
功能:使用SM2算法解密数据
参数key:解密使用的SM2密钥对
参数src:需要解密的数据
参数src_len:需要解密数据的长度
参数dst:用于保存解密数据
参数dst_len:入参时表示解密数据保存空间的大小,返回时表示解密后数据的长度
返回结果:0表示解密成功,其他表示错误
TEE_Result sm2_dsa_sign(uint32_t algo,struct ecc_keypair *key, const uint8_t *msg,size_t msg_len, uint8_t *sig, size_t *sig_len)
功能:使用SM2算法签名
参数algo:算法类型
参数key:签名使用的SM2密钥对
参数msg:需要签名的数据的摘要
参数msg_len:需要签名的数据的摘要的长度,目前采用的标准为32字节
参数sig:用于保存签名
参数sig_len:入参时表示签名保存空间的大小,返回时表示签名的长度
返回结果:0表示签名成功,其他表示错误
TEE_Result sm2_dsa_verify(uint32_t algo,struct ecc_public_key *key, const uint8_t *msg,size_t msg_len, const uint8_t *sig, size_t sig_len)
功能:使用SM2算法验签
参数algo:算法类型
参数key:验签使用的SM2公钥
参数msg:需要验签的数据的摘要
参数msg_len:需要验签的数据的摘要的长度,目前标准为32字节
参数sig:签名
参数sig_len:签名的长度
返回结果:0表示验签成功,其他表示错误
4.2 SM3算法类接口说明
SM3实现了使用DMA引擎操作的方式,但DMA引擎唯一,可根据实际情况确定由哪个算法使用。同时,对SM3增加了软件运算,在抢占不到硬件引擎的情况下使用软件运算,增加并发性能,可视情况使用。
void mbedtls_sm3_init( mbedtls_sm3_context *ctx )
功能:初始化ctx初始值和引擎硬件操作指针
参数ctx:SM3上下文
返回结果:成功完成初始化
int mbedtls_sm3_starts_ret(mbedtls_sm3_context *ctx )
功能:初始化HASH初始值和数据总长度
参数ctx:SM3上下文
返回结果:0表示初始化成功,其他表示错误
int mbedtls_sm3_update_ret(mbedtls_sm3_context *ctx, const unsigned char *input, size_t ilen )
功能:更新SM3算法的数据
参数ctx:SM3上下文
参数input:需要SM3算法运算的数据
参数ilen:数据的长度
返回结果:0表示成功,其他表示错误
int mbedtls_sm3_finish_ret( mbedtls_sm3_context *ctx, unsigned char output[32] )
功能:用于数据更新后完成SM3算法
参数ctx:SM3上下文
参数output:用于返回算法的结果
返回结果:0表示成功,其他表示错误
void mbedtls_sm3_free( mbedtls_sm3_context *ctx )
功能:用于释放SM3上下文的数据
参数ctx:SM3上下文
返回结果:成功释放SM3上下文数据
void mbedtls_sm3_clone( mbedtls_sm3_context *dst, const mbedtls_sm3_context *src )
功能:克隆SM3上下文
参数dst:克隆的SM3上下文
参数src:原始的SM3上下文
返回结果:成功克隆SM3上下文数据
4.3 SM4算法类接口说明
SM4实现了使用DMA引擎操作的方式,但DMA引擎唯一,可根据实际情况确定由哪个算法使用。同时,对SM4增加了软件运算,在抢占不到硬件引擎的情况下使用软件运算,增加并发性能,可视情况使用。
TEE_Result mbed_sm4_init(struct crypto_cipher_ctx *ctx,TEE_OperationMode mode, const uint8_t *key1,size_t key1_len, const uint8_t *key2 __unused,size_t key2_len __unused, const uint8_t *iv, size_t iv_len)
功能:SM4算法初始化
参数ctx:上下文
参数mode:操作模式,这里可选加密或解密
参数key1:加解密的密钥
参数key1_len:密钥的长度
参数key2:SM4算法未用到
参数key2_len:SM4算法未用到
参数iv:初始化向量
参数iv_len:初始化向量的长度
返回结果:0表示初始化成功,其他表示错误
TEE_Result mbed_sm4_cbc_update(struct crypto_cipher_ctx *ctx, bool last_block __unused,const uint8_t *data, size_t len, uint8_t *dst)
功能:SM4 CBC模式更新数据,根据上下文确定是加密还是解密
参数ctx:上下文
参数last_block:SM4算法未用到
参数data:需要处理的数据
参数len:需要处理的数据的长度,要求16字节对齐
参数dst:存放处理后的数据
返回结果:0表示处理成功,其他表示错误
TEE_Result mbed_sm4_ecb_update(struct crypto_cipher_ctx *ctx, boollast_block __unused,const uint8_t *data, size_t len, uint8_t *dst)
功能:SM4 ECB模式更新数据,根据上下文确定是加密还是解密
参数ctx:上下文
参数last_block:SM4算法未用到
参数data:需要处理的数据
参数len:需要处理的数据的长度,要求16字节对齐
参数dst:存放处理后的数据
返回结果:0表示处理成功,其他表示错误
TEE_Result mbed_sm4_ctr_update(struct crypto_cipher_ctx *ctx, bool last_block __unused,const uint8_t *data, size_t len, uint8_t *dst)
功能:SM4 CTR模式更新数据,加解密通用
参数ctx:上下文
参数last_block:SM4算法未用到
参数data:需要处理的数据
参数len:需要处理的数据的长度,要求16字节对齐
参数dst:存放处理后的数据
返回结果:0表示处理成功,其他表示错误
void mbed_sm4_final(struct crypto_cipher_ctx *ctx)
功能:完成SM4算法,会释放上下文的数据
参数ctx:上下文
返回结果:成功完成SM4算法
void mbed_sm4_free_ctx(struct crypto_cipher_ctx *ctx)
功能:释放SM4上下文
参数ctx:上下文
返回结果:成功释放上下文
void mbed_sm4_copy_state(struct crypto_cipher_ctx *dst_ctx, struct crypto_cipher_ctx *src_ctx)
功能:克隆SM4上下文
参数dst_ctx:克隆的上下文
参数src_ctx:原始上下文
返回结果:成功克隆上下文
5 程序实例
实现了上述底层算法接口后,还需要将这些接口注册到标准流程中,此外,还需要一些初始化的准备工作等。
测试采用的为CentOS-8.2系统,内核为4.19.5,并使用了phytium针对该版本的补丁。同时,编译也在该环境完成。
5.1 初始化
为了确保SCTO和软件锁有确定的初始状态,这里通过OP-TEE的driver_init接口来完成,在启动过程中完成初始化,初始化主要完成以下几部分工作:
1)注册SCTO IO地址段SMX_BASE_ADDR为安全IO地址,其中SMX_RESERVE_BASE为临时选用的一段地址,给软件锁使用,根据实际需求重新分配地址和大小,要求页对齐。
2)将初始化函数注册到driver_init接口。
driver_init(phytium_sm_init);
5.2 SM2接口注册
5.2.1 SM2公钥相关接口注册
将封装好的API接入项目体系需要以下几步:
1)在optee_os/core/tee/tee_svc_cryp.c文件的tee_obj_set_type函数中增加SM2分支crypto_acipher_alloc_sm2_public_key。
case TEE_TYPE_SM2_DSA_PUBLIC_KEY:case TEE_TYPE_SM2_PKE_PUBLIC_KEY:case TEE_TYPE_SM2_KEP_PUBLIC_KEY:res = crypto_acipher_alloc_sm2_public_key(o->attr, obj_type, max_key_size);break;
2)在optee_os/core/crypto/crypto.c文件中实现crypto_acipher_alloc_sm2_public_key。
3)在optee_os/lib/libmbedtls/core/sm2.c文件中实现crypto_acipher_alloc_sm2_public_key,将已经封装好的API接入OP-TEE项目体系。
5.2.2 SM2密钥对相关接口注册
将封装好的API接入项目体系需要以下几步:
1)在optee_os/core/tee/tee_svc_cryp.c文件的tee_obj_set_type函数中增加SM2分支crypto_acipher_alloc_sm2_keypair。
case TEE_TYPE_SM2_DSA_KEYPAIR:case TEE_TYPE_SM2_PKE_KEYPAIR:case TEE_TYPE_SM2_KEP_KEYPAIR:res = crypto_acipher_alloc_sm2_keypair(o->attr, obj_type, max_key_size);break;
2)在optee_os/core/crypto/crypto.c文件中实现crypto_acipher_alloc_sm2_keypair。
3)在optee_os/lib/libmbedtls/core/sm2.c文件中实现crypto_asym_alloc_sm2_keypair,将已经封装好的api接入OP-TEE项目体系。
5.3 SM3接口注册
HMAC和HASH共用同一套底层接口,将封装好的api接入项目体系需要以下几步:
1)在optee_os/core/crypto/目录sm3-hash.c和sm3-hmac.c文件中,注释掉原有的软件实现接口。
2)在optee_os/lib/libmbedtls/core/目录hash.c和hmac.c文件中,分别增加crypto_sm3_alloc_ctx接口和crypto_hmac_sm3_alloc_ctx接口,将SM3选项注册到流程中去。
3)在optee_os/lib/libmbedtls/mbedtls/library/md.c文件中,增加SM3相关信息,并将封装好的API添加到标准流程对应的分支里去,分别为mbedtls_md_starts、mbedtls_md_update、mbedtls_md_finish、mbedtls_md_free和mbedtls_md_clone。
5.4 SM4接口注册
将封装好的API接入项目体系需要以下几步:
1)在optee_os/core/crypto/目录下sm4-cbc.c、sm4-ecb.c和sm4-ctr.c三个文件中,注释掉原有的软件实现接口。
2)在optee_os/lib/libmbedtls/core/sm4.c文件中实现crypto_sm4_cbc_alloc_ctx、crypto_sm4_ecb_alloc_ctx和crypto_sm4_ctr_alloc_ctx接口,将该文件定义的封装好的API注册到标准流程中。
5.5 示例程序
在scto/ta/scto_ta.c文件中,按照GP标准接口调用,实现了SM2加解密和签名验签功能,SM3
HASH和HMAC功能,SM4 CBC、ECB和CTR模式的加解密功能,具体可参考该文件源代码。
同时,在scto/host/scto.c文件中,实现了对这些功能的调用。
5.6 编译
编译需要以下几步:
1)进入optee_os目录,执行如下命令编译TEE OS。
./build_optee_os d2000
2)进入optee_client目录,执行如下命令编译CA端API库。
./build_optee_client_ft.sh
3)进入scto目录,执行如下命令编译示例程序。
./build_ta_scto_ft.sh
5.7 运行
1)编译完成的TEE OS为out/tee-phytium-d2000.bin,需要将其打包入固件或者在UEFI下使用tboot功能将其加载,可参考《腾锐D2000安全CPU-QuickStart》。
2)系统启动完成后,进入SDK目录,执行如下命令启动CA端后台程序。
./out/data/bin/tee-supplicant -d /dev/teepriv0 &
3)执行如下命令将out/data/optee_armtz/目录下的TA程序拷贝到/data/optee_armtz/目录下。
mkdir -p /data/optee_armtz/
cp ./out/data/optee_armtz/* /data/optee_armtz/
4)执行如下命令启动示例程序,默认启动7个线程,每个线程会循环执行所有流程,直到遇到错误停止。
./out/data/bin/scto
除SM2相关算法因随机数原因只有自验证外,SM3和SM4相关算法的结果还有与软件算法的结果的对比,以验证计算结果是否正确。(SM2算法有与软件相互加解密测试过,这里只是因没有固定结果不好每轮对比)
测试结果如下表所示:
测试项目 | 3小时运行结果 |
---|---|
SM2加解密 | 无错误 |
SM2签名验签 | 无错误 |
SM3 HASH | 无错误 |
SM3 HMAC | 无错误 |
SM4 CBC加解密 | 无错误 |
SM4 ECB加解密 | 无错误 |
SM4 CTR加解密 | 无错误 |
推荐阅读
- 虚拟机中的时统卡功能和性能调优
- 飞腾平台Ne10安装使用指南
欢迎广大开发者来飞腾开发者平台获取更多前沿技术文档及资料
如开发者在使用飞腾产品有任何问题可通过在线工单联系我们
版权所有。飞腾信息技术有限公司 2023。保留所有权利。
未经本公司同意,任何单位、公司或个人不得擅自复制,翻译,摘抄本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。
商标声明
Phytium和其他飞腾商标均为飞腾信息技术有限公司的商标。
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。
本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。
相关文章:
OP-TEE环境飞腾密码引擎编程指南
【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…...
解密Navicat密码(Java)
最近从Navicat换到了DBeaver,导出配置文件发现配置文件里的密码都是加密的,看网上的都是给的PHP代码,因为环境问题,就算是在线上运行的PHP代码也会报错,所以就把这段代码改成Java了。 package com.unicdata.system.con…...
apex安装
安装过程复杂曲折,网上说的很多办法,貌似成功了,实际还是没起作用。 先说成功过程,执行下面命令,安装成功(当然,前提是你要先配置好编译环境): (我的环境&a…...
常见的开源网络操作系统
常见的开源网络操作系统有很多,它们通常用于路由器、交换机、网络设备和服务器等场景,具有灵活、可定制、易于扩展的特点。以下是一些常见的开源网络操作系统: OpenWRT 用途:主要用于路由器、无线接入点和网络设备。提供了广泛的定制选项和高级功能,如防火墙配置、VPN 支持…...
2024年6月英语六级CET6听力原文与解析
目录 0 序言 1.Long Conversation(长对话) 1.1 Blender 搅拌机 1.2 村庄的改造变化 2.Passage 2.1 micro robots 微型机器人 2.2 elite sleeper 睡眠精英 3.Lecture 3.1 对自身观念变化的低察觉度及相关研究发现 3.2 美国母亲群体数量变化及母亲节消费趋势分析 3.3 …...
力扣2-回文数
一.题目 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文&…...
基于springboot的网上商城购物系统
作者:学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”,支持远程部署调试、运行安装。 目录 项目包含: 开发说明: 系统功能: 项目截图…...
业务日志设计
当一个项目足够大的时候,我们需要将统计系统完全独立出去,那么就无法避免数据采集的问题,我们可以在业务触发处增加log日志来记录当前变化的原始数据,提供统计系统进行采集 设计一个统计系统的日志记录机制时,主要需要…...
梯度下降方法
2.5 梯度下降方法介绍 学习目标 掌握梯度下降法的推导过程知道全梯度下降算法的原理知道随机梯度下降算法的原理知道随机平均梯度下降算法的原理知道小批量梯度下降算法的原理 上一节中给大家介绍了最基本的梯度下降法实现流程,本节我们将进一步介绍梯度下降法的详细…...
javascript
引入方式 JavaScript 程序不能独立运行,它需要被嵌入 HTML 中,然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中,有两种方式: 内部方式 通过 script 标签包裹 JavaScript 代码 <!DO…...
大语言模型训练所需的最低显存,联邦大语言模型训练的传输优化技术
联邦大语言模型训练的传输优化技术 目录 联邦大语言模型训练的传输优化技术大语言模型训练所需的最低显存大语言模型训练所需的最低显存 基于模型微调、压缩和分布式并行处理的方法,介绍了相关开源模型及技术应用 核心创新点 多维度优化策略:综合运用基于模型微调、模型压缩和…...
二叉树的二叉链表和三叉链表
在二叉树的数据结构中,通常有两种链表存储方式:二叉链表和三叉链表。这里,我们先澄清一下概念,通常我们讨论的是二叉链表,它用于存储二叉树的节点。而“三叉链表”这个术语在二叉树的上下文中不常见,可能是…...
api开发如何在代码中使用京东商品详情接口的参数?
选择编程语言和相关工具 以 Python 为例,你可以使用requests库来发送 HTTP 请求获取接口数据。如果是 Java,可以使用OkHttp等库。 Python 示例 假设你已经安装了requests库,以下是一个简单的代码示例来获取和使用京东商品详情接口参数&#…...
Quartz如何实现分布式调度
系列文章目录 任务调度管理——Quartz入门 Quartz如何实现分布式控制 系列文章目录一、持久化二、分布式调度1. 表信息2. 调度器的竞争3. 触发器的分配 三、 总结 我们都说Quartz是个分布式调度框架,那么在分布式环境上,如何使得各个服务器上的定时任务…...
JUC--线程池
线程池 七、线程池7.1线程池的概述7.2线程池的构建与参数ThreadPoolExecutor 的构造方法核心参数线程池的工作原理 Executors构造方法newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutornewScheduledThreadPool(int corePoolSize) 为什么不推荐使用内置线程池&…...
以柔资讯-D-Security终端文件保护系统 logFileName 任意文件读取漏洞复现
0x01 产品简介 D-Security终端文件保护系统是一套专注于企业文件管理效率与安全的解决方案,统对文件进行全文加密,而非仅在文件表头或特定部分进行加密,从而大大提高了文件的安全性,降低了被破解的风险。D-Security终端文件保护系统是被政府和国安局等情报单位唯一认定的安…...
【JavaScript】Set,Map,Weakmap
以下来源:九剑科技。 weakmap WeakMap是 ES6 中新增的一种集合类型,叫做“弱映射”,由于他的键引用的对象是弱引用,键所指向的对象可以被垃圾回收,可以防止内存泄露。 map ①Map是键值对的集合,键值不限…...
idea小操作
idea 所边定位到你目前阅读的代码 AltF1 或者 选择定位图标...
[tesseract]Deserialize header failed: FIRC.lstmf
tesseract5.0训练时候会提示 [INFO]cd /d D:\program\tesseract-ocr-lstm-train\data [INFO]D:\program\tesseract-ocr-lstm-train\Tesseract-OCR\tesseract.exe xiangjiao.tif xiangjiao -l eng --psm 7 lstm.train [INFO]Page 1 [INFO]Page 2 [INFO]Deserialize header fail…...
深度学习知识点:RNN
文章目录 1.简单介绍2.网络结构3.应对梯度消失 1.简单介绍 循环神经网络(RNN,Recurrent Neural Network)是一类用于处理序列数据的神经网络。与传统网络相比,变化不是特别大,不如CNN的变化那么大。 为什么要有循环神经…...
【数据可视化-11】全国大学数据可视化分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
CSS:背景样式、盒子模型与文本样式
背景样式 背景样式用于设置网页元素的背景,包括颜色、图片等。 背景颜色 使用 background-color 属性设置背景颜色,支持多种格式(颜色英文、十六进制、RGB等)。 div {background-color: lightblue; }格式示例十六进制#ff5733R…...
学英语学压测:02jmeter组件-测试计划和线程组ramp-up参数的作用
📢📢📢:先看关键单词,再看英文,最后看中文总结,再回头看一遍英文原文,效果更佳!! 关键词 Functional Testing功能测试[ˈfʌŋkʃənəl ˈtɛstɪŋ]Sample样…...
环动科技平均售价波动下滑:大客户依赖明显,应收账款周转率骤降
《港湾商业观察》施子夫 2024年12月18日,浙江环动机器人关节科技股份有限公司(以下简称,环动科技)的上市审核状态变更为“已问询”,公司在11月25日科创板IPO获上交所受理,独家保荐机构为广发证券。 此次环…...
数据结构:LinkedList与链表—无头双向链表(二)
目录 一、什么是LinkedList? 二、LinkedList的模拟实现 1、display()方法 2、addFirst(int data)方法 3、addLast(int data)方法 4、addIndex(int index,int data)方法 5、contains(int key)方法 6、remove(int key)方法 7、removeAllKey(int key)方法 8、…...
『SQLite』解释执行(Explain)
摘要:本节主要讲解SQL的解释执行:Explain。 在 sqlite 语句之前,可以使用 “EXPLAIN” 关键字或 “EXPLAIN QUERY PLAN” 短语,用于描述表查询的细节。 基本语法 EXPLAIN 语法: EXPLAIN [SQLite Query]EXPLAIN QUER…...
计算机网络之---物理层的基本概念
物理层简介 物理层(Physical Layer) 是 OSI(开放系统互联)模型 中的第 1 层,它主要负责数据在物理媒介上的传输,确保原始比特(0 和 1)的传输不受干扰地从一个设备传送到另一个设备。…...
Elasticsearch:优化的标量量化 - 更好的二进制量化
作者:来自 Elastic Benjamin Trent 在这里,我们解释了 Elasticsearch 中的优化标量量化以及如何使用它来改进更好的二进制量化 (Better Binary Quantization - BBQ)。 我们的全新改进版二进制量化 (Better Binary Quantization - BBQ) 索引现在变得更强大…...
KBQA前沿技术
文章目录 KBQA面临的挑战基于模板的方法基于语义解析的方法基于深度学习的传统问答基于深度学习的端到端问答模型KBQA面临的挑战 目前还存在两个很大的困难阻碍着KBQA系统被广泛应用。一个困难是现有的自然语言理解技术在处理自然语言的歧义性和复杂性方面还显得比较薄弱。例如…...
patchwork++地面分割学习笔记
参考资料:古月居 - ROS机器人知识分享社区 https://zhuanlan.zhihu.com/p/644297447 patchwork算法一共包含四部分内容:提出了以下四个部分:RNR、RVPF、A-GLE 和 TGR。 1)基于 3D LiDAR 反射模型的反射噪声消除 (RNR)ÿ…...
OSPF浅析
一、预习: 1、介绍: 是一种基于接口的典型的链路状态路由协议,协议号89,把大型网络分隔为多个较小、可管理的单元:Area,管理距离110;OSPF基于IP,使用了LSAck包来保证包数据的可靠性&…...
批量写入数据到数据库,卡顿怎么解决
在批量写入数据到数据库时,遇到卡顿或性能瓶颈是比较常见的问题。以下是一些可能的解决方案和优化策略,帮助你提高批量写入的性能: ### 1. **批量大小优化** - **调整批量大小**:尝试调整批量写入的数据量,找到一个平衡点。过大或过小的批量大小都可能影响性能。通常,批…...
Residency 与 Internship 的区别及用法解析
Residency 与 Internship 的区别及用法解析 在英文中,“residency” 和 “internship” 都与职业培训相关,但它们的使用场景和具体含义存在显著差异。本文将详细解析这两个词的区别,以及它们在不同语境下的应用。 Residency 的定义及使用场景…...
【数据结构-堆】力扣2530. 执行 K 次操作后的最大分数
给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。 在一步 操作 中: 选出一个满足 0 < i < nums.length 的下标 i , 将你的 分数 增加 nums[i] ,并且 将 nums[i] 替换为 ceil(nums[i] / 3) 。 返回在 恰好…...
基于生成式对抗网络(GAN)的前沿研究与应用
引言 人工智能(AI)领域在过去几年中经历了快速的发展,尤其是深度学习的兴起带来了许多变革。其中,生成式对抗网络(Generative Adversarial Network, GAN)因其强大的生成能力成为了研究热点。自2014年Ian G…...
stm32 移植RTL8201F(正点原子例程为例)
最近在工作中需要使用RTL8201F,在网上找了很多帖子,没有找到合适的,自己翻资料移植了一个。 模板工程使用的是正点原子的f407探索版的例程,原子使用的是LAN8720,需要把他的驱动修改成为我们自己用的RTL8201F。 1.将PHY_TYPE改成我…...
QT-TCP-server
为了实现高性能的TCP通讯,以下是一个基于Qt的示例,展示如何利用多个线程、非阻塞I/O、数据分块和自定义协议进行优化。该示例以TCP服务器和客户端的形式展示,能够承受高负载并实现快速数据传输。 高性能TCP Server示例 #include <QTcpSe…...
第 24 章 网络请求与远程资源
第 24 章 网络请求与远程资源 24.1 XMLHttpRequest 对象 所有现代浏览器都通过 XMLHttpRequest 构造函数原生支持 XHR 对象: let xhr new XMLHttpRequest()24.1.1 使用 XHR 使用 XHR 对象首先要调用 open()方法,这个方法接收 3 个参数:请…...
k8s dashboard离线部署步骤
确定k8s版本,以1.23为例。 部署metrics-server服务,最好用v0.5.2。 用v0.6.0,可能会报以下错误: nodekubemaster:~/Desktop/metric$ kubectl top nodes Error from server (ServiceUnavailable): the server is currently unabl…...
热备份路由HSRP及配置案例
✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网路安全入门系列 目录 一,HSRP的相关概念二,…...
【文本分类】bert二分类
import os import torch from torch.utils.data import DataLoader, Dataset from transformers import BertTokenizer, BertForSequenceClassification, AdamW from sklearn.metrics import accuracy_score, classification_report from tqdm import tqdm# 自定义数据集 class…...
计算机网络 (30)多协议标签交换MPLS
前言 多协议标签交换(Multi-Protocol Label Switching,MPLS)是一种在开放的通信网上利用标签引导数据高速、高效传输的新技术。 一、基本概念 MPLS是一种第三代网络架构技术,旨在提供高速、可靠的IP骨干网络交换。它通过将IP地址映…...
【Springer斯普林格出版,Ei稳定,往届快速见刊检索】第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)
第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)将于2025年2月21-23日在中国青岛举行。该会议主要围绕电子信息工程、大数据、计算机技术等研究领域展开讨论。会议旨在为从事相关科研领域的专家学者、工程技术人员、技术研发人员提供一…...
C# 修改项目类型 应用程序程序改类库
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
[开源]自动化定位建图系统
系统状态机: 效果展示: 1、 机器人建图定位系统-基础重定位,定位功能演示 2、 机器人建图定位系统-增量地图构建,手动回环检测演示 3、… 开源链接: https://gitee.com/li-wenhao-lwh/lifelong-backend Qt人机交互…...
OSPF使能配置
OSPF路由协议是用于网际协议(ip)网络的链路状态的路由协议。该协议使用链路状态路由算法的内部网关协议(IGP),在单一自治系统(AS)内部工作。适用于IPV4的OSPFv2协议定义于RFC 2328,R…...
ES_如何设置ElasticSearch 8.0版本的匿名访问以及https_http模式的互相切换
总结: 设置匿名访问,只需要设置xpack.security.authc.anonymous.username和xpack.security.authc.anonymous.roles参数就行,设置好后,可以匿名访问也可以非匿名访问,但是非匿名访问的情况下必须保证用户名和密码正确 取…...
web移动端UI框架
文章目录 Vant简介主要特点和功能适用场景和用户评价 Mint UI简介主要特点和功能 cube-ui简介特性 iView Weapp简介 uni-app简介 Vant 使用vue3版本官网:https://vant-ui.github.io/vant/#/zh-CN/ 适用vue2版本官网:https://vant-ui.github.io/vant/v2/…...
数据库高安全—角色权限:权限管理权限检查
目录 3.3 权限管理 3.4 权限检查 书接上文数据库高安全—角色权限:角色创建角色管理,从角色创建和角色管理两方面对高斯数据库的角色权限进行了介绍,本篇将从权限管理和权限检查方面继续解读高斯数据库的角色权限。 3.3 权限管理 &#x…...
spring boot controller放到那一层
在 Spring Boot 应用程序中,Controller 层通常被放置在应用程序的 表示层(Presentation Layer) 或 用户界面层(UI Layer) 中。Controller 层的主要职责是处理用户的 HTTP 请求,并将请求转发给服务层进行业务…...