这是OpenSSL 1.0.1i中OPENSSL_cleanse的实现
unsigned char cleanse_ctr = 0;
void OPENSSL_cleanse(void *ptr, size_t len)
{
unsigned char *p = ptr;
size_t loop = len, ctr = cleanse_ctr;
while(loop--)
{
*(p++) = (unsigned char)ctr;
ctr += (17 + ((size_t)p & 0xF));
}
p=memchr(ptr, (unsigned char)ctr, len);
if(p)
ctr += (63 + (size_t)p);
cleanse_ctr = (unsigned char)ctr;
}
Run Code Online (Sandbox Code Playgroud)
它看起来很复杂且线程不安全(通过读写全局变量cleanse_ctr).有人可以解释一下这个实现吗?用户是否需要关注其中可能的数据竞争?
我有旧的代码,用于链接旧版本的openssl.此代码的一部分从PEM文件加载密钥,并尝试通过使用以下代码来了解此密钥是私钥还是公钥:
if( (prv->p==0 || prv->q==0) ) {
// This is not a private key!
throw error("No private key for decryption");
}
Run Code Online (Sandbox Code Playgroud)
使用最新版本的openssl,这(有理由)不编译:
crypto.cpp: In function ‘key* decrypt_header(file_t, RSA*)’:
crypto.cpp:158:13: error: invalid use of incomplete type ‘RSA {aka struct rsa_st}’
if( (prv->p==0 || prv->q==0) ) {
^~
Run Code Online (Sandbox Code Playgroud)
我理解直接访问struct的私有成员被替换为一个函数,但我很难搞清楚哪个函数是什么.
例如,让我们采用伪代码,该伪代码尝试free使用此方法将RSA私钥存储在已分配(然后是d)的内存中:
int main(){
bigNum priKey;
while(true) {
void *mem = malloc(2024); //allocate a good amount of chunk
if(rsaKeyIn(mem, &priKey))
break;
}
printf("RSA PRK found: %s", priKey.getText())
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题:这可能吗?还是有可能恢复其他秘密数据?
还是free为了安全起见,操作系统将'd内存归零?如果不是这种情况,我们应该在释放内存之前手动用零填充已分配的内存吗?