【SSL_P2343或洛谷P2814】家谱

本文介绍了一个基于家谱数据的查询算法,旨在帮助现代人追溯其家族血统。通过使用map和并查集的方法,该算法能够高效地找到一个人的最早祖先,解决了在大量父子关系中查找祖先的问题。

家谱


Description

现代的人对于本家族血统越来越感兴趣, 现在给出充足的父子关系, 请你编写程序找到 某个人的最早的祖先。

Input

输入文件由多行组成, 首先是一系列有关父子关系的描述, 其中每一组父子关系由二行 组成,用#name 的形式描写一组父子关系中的父亲的名字,用+name 的形式描写一组父子关 系中的儿子的名字;接下来用?name 的形式表示要求该人的最早的祖先;最后用单独的一个 $表示文件结束。规定每个人的名字都有且只有 6 个字符,而且首字母大写,且没有任意两 个人的名字相同。最多可能有 1000 组父子关系,总人数最多可能达到 50000 人,家谱中的 记载不超过 30 代。

Output

按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式:本人的名字+一个 空格+祖先的名字+回车。

Sample Input

#George
+Rodney
#Arthur
+Gareth
+Walter
#Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$

Sample Output

Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur 

解题思路

用map记录,其他和并查集一样

#include<iostream>
#include<cstdio>
#include<map>
#include<string>
using namespace std;
map<string,string>fa;
char a;
string s,ss;
string fd(string x)
{
	if(fa[x]==x)
		return x;
	return fd(fa[x]);
}
int main()
{
	cin>>a;
	while(a!='$')
	{
		cin>>s;
		if(a=='#')
		{
			ss=s;
			if(fa[s]=="")
				fa[s]=s;
		}
		else
			if(a=='+')
				fa[s]=ss;
			else
				cout<<s<<' '<<fd(s)<<endl;
		cin>>a;
	}
}
下载前必看:https://renmaiwang.cn/s/bvbfw Verilog设计_串并转换 / 移位寄存器实现了一种串并转换的功能,其核心原理在于移位寄存器的运用。 这里详细展示了串转并以及并转串两种不同的设计方案。 每一种转换模式都设有专属的使能信号,同时并行输出数据的格式提供了两种选择:最低有效位优先(lsb)和最高有效位优先(msb)。 串并转换技术主要应用于串行传输与并行传输这两种数据传输模式之间的相互转换,而移位寄存器是达成这一目标的常用工具,能够支持并行及串行的数据输入与输出操作。 这些移位寄存器通常被设定为“串行输入、并行输出”(SIPO)“并行输入、串行输出”(PISO)两种工作模式。 在串行数据输出的过程中,构成数据和字符的码元会按照既定的时间顺序逐位进行传输。 相比之下,并行数据传输则是在同一时刻将固定数量(普遍为8位16位等)的数据和字符码元同时发送至接收端。 数据输入通常采用串行格式进行。 一旦数据成功输入寄存器,它便可以在所有输出端同时被读取,者选择逐位移出。 寄存器中的每个触发器均设计为边沿触发类型,并且所有触发器均以特定的时钟频率协同工作。 对于每一个输入位而言,它需要经过N个时钟周期才能最终在N个输出端呈现,从而完成并行输出。 值得注意的是,在串行加载数据期间,并行输出端的数据状态应保持稳定。 数据输入则采用并行格式。 在将数据写入寄存器的操作过程中,写/移位控制线必须暂时处于非工作状态;而一旦需要执行移位操作,控制线便会变为激活状态,并且寄存器会被锁定以保持当前状态。 只要时钟周期数不超过输入数据串的长度,数据输出端Q将按照预定的顺序逐位读出并行数据,并且必须明确区分最低有效位(LSB)和最高有效位(MSB)。
内容概要:本文档是PCI-SIG发布的工程变更通知(ECN),旨在为PCIe Base Specification 7.0中的组件测量与认证(CMA-SPDM)功能增加对后量子密码学(PQC)算法的支持。基于NIST发布的PQC标准(FIPS 203、204、205)以及NSA提出的CNSA 2.0安全套件要求,文档明确新设备必须强制支持ML-DSA-87(用于数字签名)和ML-KEM-1024(用于密钥封装)两种PQC算法,同时允许选择性支持传统算法(如RSA、ECC)其他NIST批准的PQC参数集。变更不影响现有硬件软件兼容性,但建议通过厂商特定配置机制灵活启用禁用算法以应对未来安全演进。此外,文档指出PQC可能带来消息体积增大和性能延迟问题,并推荐使用CHUNK_CAP机制处理大数据传输及利用SPDM协议的“ResponseNotReady”机制缓解响应超时风险。; 适合人群:从事PCIe协议开发、安全芯片设计、固件开发及相关标准制定的技术人员,尤其是涉及国家安全高安全性系统的产品开发者。; 使用场景及目标:①指导PCIe设备实现符合CNSA 2.0要求的后量子安全通信能力;②帮助开发人员理解如何在SPDM框架下集成PQC算法并处理性能与兼容性挑战;③为测试团队提供新增C&I测试需求的依据。; 阅读建议:此文档技术性强,需结合SPDM 1.4规范与NIST相关标准(FIPS 203/204/205)同步研读,重点关注第6.31.3至6.31.5节的具体算法要求与实现注释,便于在产品设计中提前规划密码模块升级路径。
diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index 1d4e81d..263b29f 100755 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -823,6 +823,36 @@ struct mbedtls_ssl_session #endif }; +#if defined(MBEDTLS_SSL_SRV_C) +/** + * \brief Callback type: generic handshake callback + * + * \note Callbacks may use user_data funcs to set/get app user data. + * See \c mbedtls_ssl_get_user_data_p() + * \c mbedtls_ssl_get_user_data_n() + * \c mbedtls_ssl_conf_get_user_data_p() + * \c mbedtls_ssl_conf_get_user_data_n() + * + * \param ssl \c mbedtls_ssl_context on which the callback is run + * + * \return The return value of the callback is 0 if successful, + * or a specific MBEDTLS_ERR_XXX code, which will cause + * the handshake to be aborted. + */ +typedef int (*mbedtls_ssl_hs_cb_t)(mbedtls_ssl_context *ssl); +#endif + +/* A type for storing user data in a library structure. + * + * The representation of type may change in future versions of the library. + * Only the behaviors guaranteed by documented accessor functions are + * guaranteed to remain stable. + */ +typedef union { + // uintptr_t n; /* typically a handle to an associated object */ + void *p; /* typically a pointer to extra data */ +} mbedtls_ssl_user_data_t; + /** * SSL/TLS configuration to be shared between mbedtls_ssl_context structures. */ @@ -1018,6 +1048,10 @@ struct mbedtls_ssl_config unsigned int cert_req_ca_list : 1; /*!< enable sending CA list in Certificate Request messages? */ #endif + +#if defined(MBEDTLS_SSL_SRV_C) + mbedtls_ssl_hs_cb_t f_cert_cb; /*!< certificate selection callback */ +#endif /* MBEDTLS_SSL_SRV_C */ }; @@ -1178,6 +1212,17 @@ struct mbedtls_ssl_context char own_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ char peer_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ #endif /* MBEDTLS_SSL_RENEGOTIATION */ + + /** User data pointer or handle. + * + * The library sets this to \p 0 when creating a context and does not + * access it afterwards. + * + * \warning Serializing and restoring an SSL context with + * mbedtls_ssl_context_save() and mbedtls_ssl_context_load() + * does not currently restore the user data. + */ + mbedtls_ssl_user_data_t user_data; }; #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) @@ -1362,6 +1407,22 @@ void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf, void *p_dbg ); /** + * \brief Return the SSL configuration structure associated + * with the given SSL context. + * + * \note The pointer returned by this function is guaranteed to + * remain valid until the context is freed. + * + * \param ssl The SSL context to query. + * \return Pointer to the SSL configuration associated with \p ssl. + */ +static inline const mbedtls_ssl_config *mbedtls_ssl_context_get_config( + const mbedtls_ssl_context *ssl) +{ + return ssl->conf; +} + +/** * \brief Set the underlying BIO callbacks for write, read and * read-with-timeout. * @@ -1486,6 +1547,24 @@ void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl, mbedtls_ssl_set_timer_t *f_set_timer, mbedtls_ssl_get_timer_t *f_get_timer ); +#if defined(MBEDTLS_SSL_SRV_C) +/** + * \brief Set the certificate selection callback (server-side only). + * + * If set, the callback is always called for each handshake, + * after `ClientHello` processing has finished. + * + * \param conf The SSL configuration to register the callback with. + * \param f_cert_cb The callback for selecting server certificate after + * `ClientHello` processing has finished. + */ +static inline void mbedtls_ssl_conf_cert_cb(mbedtls_ssl_config *conf, + mbedtls_ssl_hs_cb_t f_cert_cb) +{ + conf->f_cert_cb = f_cert_cb; +} +#endif /* MBEDTLS_SSL_SRV_C */ + /** * \brief Callback type: generate and write session ticket * @@ -1606,6 +1685,39 @@ void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf, void *p_export_keys ); #endif /* MBEDTLS_SSL_EXPORT_KEYS */ +/** \brief Set the user data in an SSL context to a pointer. + * + * You can retrieve this value later with mbedtls_ssl_get_user_data_p(). + * + * \note The library stores \c p without accessing it. It is the responsibility + * of the caller to ensure that the pointer remains valid. + * + * \param ssl The SSL context to modify. + * \param p The new value of the user data. + */ +static inline void mbedtls_ssl_set_user_data_p( + mbedtls_ssl_context *ssl, + void *p) +{ + ssl->user_data.p = p; +} + +/** \brief Retrieve the user data in an SSL context as a pointer. + * + * This is the value last set with mbedtls_ssl_set_user_data_p(), or + * \c NULL if mbedtls_ssl_set_user_data_p() has not previously been + * called. The value is undefined if mbedtls_ssl_set_user_data_n() has + * been called without a subsequent call to mbedtls_ssl_set_user_data_p(). + * + * \param ssl The SSL context to modify. + * \return The current value of the user data. + */ +static inline void *mbedtls_ssl_get_user_data_p( + mbedtls_ssl_context *ssl) +{ + return ssl->user_data.p; +} + #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) /** * \brief Configure asynchronous private key operation callbacks. diff --git a/library/ssl_srv.c b/library/ssl_srv.c index f3e53e2..a982136 100755 --- a/library/ssl_srv.c +++ b/library/ssl_srv.c @@ -1952,6 +1952,14 @@ read_record_header: } /* + * Server certification selection (after processing TLS extensions) + */ + if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret); + return ret; + } + + /* * Search for a matching ciphersuite * (At the end because we need information from the EC-based extensions * and certificate from the SNI callback triggered by the SNI extension.)这是升级版本?
12-05
你提供的这段 `diff` 是 **mbedTLS 库的一个补丁(patch)**,它对源码进行了修改,**并不是简单的“升级版本”**,而是一个**功能增强定制化改动**。我们来详细分析它的内容和意图。 --- ## ✅ 总体结论: 这个补丁为 mbedTLS 的 SSL/TLS 服务器端添加了两个重要特性: 1. **支持用户自定义的证书选择回调函数(Certificate Selection Callback)** 2. **允许在 SSL 上下文中存储用户数据(User Data)** 这使得开发者可以在握手过程中动态决定使用哪个证书(例如基于 SNI 其他条件),并附加自己的上下文数据到 SSL 连接中。 > 🚀 这个补丁类似于官方未来可能加入的功能(如更灵活的 SNI 处理),但目前是**非官方扩展**,可能是某个项目(如 OpenWrt、Nginx + mbedTLS、自研网关等)为了灵活性自行添加的。 --- ## 🔍 逐部分解析 ### 1. 新增类型定义:`mbedtls_ssl_hs_cb_t` ```c #if defined(MBEDTLS_SSL_SRV_C) typedef int (*mbedtls_ssl_hs_cb_t)(mbedtls_ssl_context *ssl); #endif ``` > 定义了一个新的**握手阶段回调函数指针类型**,用于在特定时机被调用。 - 回调接受一个 `ssl` 上下文。 - 返回值: - `0` 表示成功继续握手; - 非零则中断握手,并返回错误码(如 `MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE`)。 --- ### 2. 添加用户数据类型:`mbedtls_ssl_user_data_t` ```c typedef union { void *p; /* typically a pointer to extra data */ } mbedtls_ssl_user_data_t; ``` > 使用 `union` 存储用户数据,目前只启用指针字段 `p`(注释掉的 `n` 可能是将来用于整数句柄)。 为什么用 `union`? → 为了将来可拓展性(比如既能存指针也能存整数 ID),但现在只用了指针。 --- ### 3. 在 `mbedtls_ssl_config` 中增加回调函数指针 ```c mbedtls_ssl_hs_cb_t f_cert_cb; /*!< certificate selection callback */ ``` > 添加到配置结构体中,意味着每个 SSL 配置可以注册一个“证书选择回调”。 --- ### 4. 在 `mbedtls_ssl_context` 中添加用户数据字段 ```c mbedtls_ssl_user_data_t user_data; ``` > 每个 SSL 连接(会话上下文)都可以绑定一份用户数据(比如指向连接相关的业务逻辑结构体)。 ⚠️ 注意警告: > “序列化和反序列化(通过 `mbedtls_ssl_context_save/load`)不会恢复 user_data” —— 所以不能依赖它在会话恢复时仍然有效。 --- ### 5. 新增 API 函数(内联函数) #### (1) 获取配置对象 ```c static inline const mbedtls_ssl_config *mbedtls_ssl_context_get_config(...) ``` > 提供只读访问 `ssl->conf` 的方式,属于安全封装。 #### (2) 设置证书选择回调 ```c static inline void mbedtls_ssl_conf_cert_cb(mbedtls_ssl_config *conf, mbedtls_ssl_hs_cb_t f_cert_cb) { conf->f_cert_cb = f_cert_cb; } ``` > 允许用户设置回调,在服务器收到 `ClientHello` 后、选择密码套件前触发。 #### (3) 用户数据读写接口 ```c void mbedtls_ssl_set_user_data_p(mbedtls_ssl_context *ssl, void *p) void *mbedtls_ssl_get_user_data_p(mbedtls_ssl_context *ssl) ``` > 用于设置/获取用户自定义指针数据。 用途举例: - 绑定 HTTP 请求信息; - 记录客户端 IP; - 关联数据库会话; - 实现多域名 HTTPS 动态证书加载。 --- ### 6. 在 `ssl_srv.c` 中实际调用回调 ```c if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) { MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret); return ret; } ``` > 插入位置非常关键:**在处理完 ClientHello 和 TLS 扩展之后,但在匹配密码套件之前**。 这意味着你可以根据以下信息动态选择证书: - SNI(Server Name Indication) - 支持的协议版本 - 密钥交换方法 - ALPN 协议 - 自定义策略 然后通过修改 `ssl->handshake->cur_cert` 等字段来指定要使用的证书链和私钥。 --- ## 💡 实际应用场景示例 假设你在开发一个支持多个域名的嵌入式 HTTPS 服务器: ```c int my_cert_select_callback(mbedtls_ssl_context *ssl) { const char *sni_name = mbedtls_ssl_get_sni_hostname(ssl); if (sni_name == NULL) { return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE; } if (strcmp(sni_name, "api.example.com") == 0) { mbedtls_ssl_set_hs_own_cert(ssl, &api_cert, &api_key); } else if (strcmp(sni_name, "admin.example.com") == 0) { mbedtls_ssl_set_hs_own_cert(ssl, &admin_cert, &admin_key); } else { mbedtls_ssl_set_hs_own_cert(ssl, &default_cert, &default_key); } return 0; } // 使用方式: mbedtls_ssl_config conf; mbedtls_ssl_conf_cert_cb(&conf, my_cert_select_callback); ``` 同时可以用 `user_data` 存储日志 ID、请求路径等: ```c struct my_conn_ctx { char client_ip[16]; uint64_t start_time; }; // 建立连接时: struct my_conn_ctx *ctx = malloc(sizeof(*ctx)); mbedtls_ssl_set_user_data_p(ssl, ctx); // 在日志其他地方取回: struct my_conn_ctx *ctx = mbedtls_ssl_get_user_data_p(ssl); ``` --- ## ❓总结回答 > 这不是一个“版本升级”,而是对 mbedTLS 的一次**功能性扩展补丁**,主要目的是: - 允许服务器在 TLS 握手期间动态选择证书(比静态 SNI 更灵活); - 提供机制让应用层将上下文数据与 SSL 连接绑定; 这种修改常见于需要高性能、多租户、动态证书管理的系统中,如: - 嵌入式网关(OpenWrt) - 轻量级 Web 服务器(如 lighttpd with mbedTLS) - IoT 安全代理 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值