小编Rom*_*nko的帖子

如何计算X.509证书的SHA-1指纹?

我正在尝试从头开始实现X.509证书生成器(我知道现有的,但我需要另一个).我无法理解的是如何计算证书的SHA-1(或任何其他)指纹.

RFC5280说,输入签名功能是DER编码即tbsCertificate场.不幸的是,我计算的哈希值与OpenSSL产生的哈希值不同.这是一个循序渐进的例子.

  1. 使用OpenSSL的x509工具生成证书(以二进制DER形式,而不是 ASCII PEM)
  2. 使用计算其SHA-1哈希 openssl x509 -fingerprint
  3. 使用dd(或其他任何东西)提取TBS字段并将其存储在单独的文件中; 使用该sha1sum实用程序计算其哈希值

现在,我在第2步和第3步得到的哈希值是不同的.有人可以给我一个暗示我可能做错了吗?

c encryption openssl x509

16
推荐指数
1
解决办法
2万
查看次数

ARM(Cortex M3)的应用程序内编程如何工作?

我正在开发一个基于Cortex-M3的自定义设备,我需要实现应用程序内编程(IAP)机制,这样就可以在没有JTAG的情况下更新设备固件(我们将使用TFTP或HTTP).虽然ST Microelectronics提供的与IAP相关的代码示例对我来说足够清楚,但我并不真正了解重新闪存的工作原理.

据我所知,CPU通过ICode总线(当然还有预取块)从Flash获取指令.所以,这是我非常愚蠢的问题:为什么运行程序在重新闪烁时会被破坏(即更改运行它的闪存)?

embedded arm cortex-m3 stm32

16
推荐指数
2
解决办法
7273
查看次数

使用"make -jN"进行cmake和并行构建

我正在尝试为源代码树设置基于CMake的并行构建,但是当我发布时

$ cmake .
$ make -j2
Run Code Online (Sandbox Code Playgroud)

我明白了:

jobserver unavailable: using -j1.  Add '+' to parent make rule
Run Code Online (Sandbox Code Playgroud)

作为警告.有没有人知道是否有可能以某种方式修复它?

makefile build cmake parallel-builds

15
推荐指数
2
解决办法
1万
查看次数

在Linux内核中实现正确的模块间同步

我正在为某个基于ARM的Linux板(实际上是一个自定义UART驱动程序)实现自定义串行总线驱动程序.该驱动程序应通过自定义协议启用与总线另一端的某个MCU的通信.驱动程序不会(实际上也不能)将其任何功能暴露给用户空间,也不可能在用户空间中实现它(因此,需要自定义驱动程序而不是使用库存TTY子系统).

司机将实现通信协议和UART读/写,并有一组更高级别的功能,导出到它的用户,让他们与MCU通信(例如read_register(),drive_gpios()所有这些东西).该模块只有一个用户.

呼叫模块必须等待操作的完成(前述read_register()和其他).我正在考虑使用信号量:用户模块将调用我的驱动程序的函数,它将启动传输并等待信号量; 我的驱动程序的IRQ处理程序将向MCU发送请求并读取答案,并在完成后发布到信号量,从而唤醒调用模块.但我对内核编程并不熟悉,而且我对众多可能的替代实现(tasklets?等待队列?)感到困惑.

问题是:我的基于信号量的方法是好还是太天真了?有哪些可能的选择?我可能会遗失任何陷阱吗?

c linux embedded driver kernel-module

7
推荐指数
1
解决办法
764
查看次数

当-pedantic开启时,在GCC中抑制"额外';'"错误

我正在使用-pedanticflag 构建我的程序,这会导致extra ';'错误(因为第三方标头使用了一些不一致的宏;当-pedantic关闭时不会显示错误).我真的不想-pedantic关闭,我也不想编辑标题.有没有办法抑制这个确切的错误?像-Wno-annoying-semicolon-error编译器开关或什么?

gcc compiler-errors g++

6
推荐指数
3
解决办法
3126
查看次数

重复的recv()调用是否昂贵?

我对我经常遇到的情况有疑问.我不时要实现各种基于TCP的协议.它们中的大多数定义了以公共头([包ID,长度,有效载荷]或类似的东西)开头的可变长度数据包.显然,可以有两种方法来读取这些数据包:

  1. 读头(因为头长度通常是固定的),提取有效载荷长度,读取有效载荷
  2. 读取所有可用数据并将其存储在缓冲区中; 之后解析缓冲区

显然,第一种方法很简单,但需要两次调用read()(或可能更多).第二个稍微复杂一点,但需要较少的电话.

问题是:第一种方法是否会严重影响性能以至于担心它?

c sockets tcp

6
推荐指数
2
解决办法
2815
查看次数

在C中检索Windows进程的完整列表

我正在为Windows开发一个简单的流程统计信息收集库.我正在使用EnumProcesses()函数枚举进程,并尝试OpenProcess()使用PROCESS_QUERY_INFORMATION标志调用它们.但是后者却因一堆系统进程而失败.与此同时,我发现类似的应用程序(sysinternals工具,任务管理器等)似乎能够检索有关这些进程的信息,即使不需要管理员权限.我尝试启用SeDebugPrivilege权限,但只有当我以管理员身份运行程序时它才有用 - 而且,我无法打开空闲进程,系统进程和audiodg进程(我希望能够检索他们的信息也是一致的).

所以问题是:我怎样才能获得有关所有进程的信息(我看到它是由第三方应用程序完成的,但我看不到如何)?没有管理员权限可以做到吗?

c windows winapi windows-7

6
推荐指数
1
解决办法
807
查看次数

如何在 Rust 中获取结构体字段的大小而不实例化它

我有一个包含字节数组的结构。这个结构实际上来自bindgen生成的FFI绑定,它的大小是使用宏在C代码中定义的,即:

C代码:

#define FOO_SIZE 100

struct the_struct
{
    char foo[FOO_SIZE];
    /* other fields... */
};
Run Code Online (Sandbox Code Playgroud)

生成的 FFI 绑定:

pub struct the_struct {
    pub foo: [::std::os::raw::c_char; 100usize],
    // other fields...
}
Run Code Online (Sandbox Code Playgroud)

我想确保来自 Rust API 端的数据适合foo. 我也不想FOO_SIZE在 Rust API 中进行硬编码,因为它可能会发生变化。

我知道这可以通过首先实例化结构来完成,但话又说回来,这需要显式初始化foo,这在不知道其大小的情况下似乎是不可能的。此外,这是我想避免的额外步骤。

foo是否可以在不实例化结构的情况下以某种方式静态获取大小?如果不是,最好的方法是什么?更改 C 代码不是一个选项。

ffi rust rust-bindgen

6
推荐指数
1
解决办法
3278
查看次数

SOCKS5 绑定是持久的还是一次性的?

我一直在研究RFC 1928,但 BIND 操作的描述对我来说并不清楚。据我了解,设置顺序描述如下:

  1. 客户端与SOCKS5服务器建立连接
  2. 客户端执行CONNECT请求
  3. 客户端与SOCKS5服务器建立新的TCP连接并请求BIND
  4. 服务器立即回复BIND操作的结果
  5. 收到传入连接后,SOCKS5 服务器向客户端发送通知

我不太清楚的是步骤 5。之后我是否必须重新请求 BIND 以允许更多传入连接?

据我了解,相同的 TCP 连接(在步骤 3 中建立)用于与接受的对等方进行通信。如果我需要继续接受同一地址:端口上的连接怎么办?毕竟这可能吗?

proxy networking network-programming rfc socks

5
推荐指数
1
解决办法
2365
查看次数

在C ++中实现高效的多线程文件I / O

我目前正在开发自定义的跨平台文件服务器(C ++,boost)。显然,它将对硬盘进行大量读取和写入。为了使事情更复杂,它还将成为多线程并使用异步套接字I / O(带有asio)。

现在,我想知道,是否可以使用任何众所周知的实践,模式或方法?也许一些现有的图书馆或什么?当然,我可以尝试从头开始开发它,但确实感觉像是在重新发明轮子。任何通用建议也将不胜感激。

c++ io boost boost-asio

5
推荐指数
1
解决办法
3533
查看次数

PhantomData 在 Rust 中究竟是如何工作的?

我发现PhantomDataRust 中的概念非常混乱。我广泛使用它来限制基于 FFI 的代码中的对象生命周期,但我仍然不确定我是否正确执行此操作。

这是我经常如何使用它的人为示例。例如,我不希望 的实例MyStruct比 的实例寿命更长Context

// FFI declarations and types
mod ffi {
    use std::ffi::c_void;
    pub type handle_t = *const c_void;
    // ...
}

// A wrapper structure for some context created and maintained
// inside the C library
struct Context {
    // ...
}

// Handle is only valid as long as the Context is alive.
// Hence, I use the PhantomData marker to constrain its lifetime.
struct MyStruct<'a> {
    marker: …
Run Code Online (Sandbox Code Playgroud)

ffi rust phantom-types

4
推荐指数
1
解决办法
2357
查看次数

Pythonic方式获取序列的第一个和最后一个元素

获取序列的第一个和最后一个元素的最简单,最简洁的方法是什么?例如,我有一个序列[1, 2, 3, 4, 5],我想[1, 5]通过某种切片魔法.到目前为止我想出的是:

l = len(s)
result = s[0:l:l-1]
Run Code Online (Sandbox Code Playgroud)

我实际上需要这个更复杂的任务.我有一个3D numpy数组,它是立方的(即大小为NxNxN,其中N可能会有所不同).我想要一种简单快捷的方法来获取包含源数组顶点值的2x2x2数组.上面的例子是我的任务的过度简化的1D版本.

python python-3.x

3
推荐指数
1
解决办法
179
查看次数