Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
btwise
openssl
提交
5fc2c689
O
openssl
项目概览
btwise
/
openssl
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
openssl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
5fc2c689
编写于
8月 03, 2016
作者:
R
Richard Levitte
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
VSI submission: make the VMS version of RAND_poll() faster and more secure
Reviewed-by:
N
Rich Salz
<
rsalz@openssl.org
>
上级
fda27673
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
73 addition
and
49 deletion
+73
-49
crypto/rand/rand_vms.c
crypto/rand/rand_vms.c
+73
-49
未找到文件。
crypto/rand/rand_vms.c
浏览文件 @
5fc2c689
...
...
@@ -7,15 +7,21 @@
* https://www.openssl.org/source/license.html
*/
/*
* Modified by VMS Software, Inc (2016)
* Eliminate looping through all processes (performance)
* Add additional randomizations using rand() function
*/
#include <openssl/rand.h>
#include "rand_lcl.h"
#if defined(OPENSSL_SYS_VMS)
# include <descrip.h>
# include <jpidef.h>
# include <ssdef.h>
# include <starlet.h>
# include <efndef>
# ifdef __DECC
# pragma message disable DOLLARID
# endif
...
...
@@ -33,76 +39,94 @@
# endif
/* __INITIAL_POINTER_SIZE == 64 [else] */
static
struct
items_data_st
{
short
length
,
code
;
/* length is
amount
of bytes */
short
length
,
code
;
/* length is
number
of bytes */
}
items_data
[]
=
{
{
4
,
JPI
$
_BUFIO
},
{
4
,
JPI
$
_CPUTIM
},
{
4
,
JPI
$
_DIRIO
},
{
8
,
JPI
$
_LOGINTIM
},
{
4
,
JPI
$
_PAGEFLTS
},
{
4
,
JPI
$
_PID
},
{
4
,
JPI
$
_WSSIZE
},
{
0
,
0
}
{
4
,
JPI
$
_BUFIO
},
{
4
,
JPI
$
_CPUTIM
},
{
4
,
JPI
$
_DIRIO
},
{
4
,
JPI
$
_IMAGECOUNT
},
{
8
,
JPI
$
_LAST_LOGIN_I
},
{
8
,
JPI
$
_LOGINTIM
},
{
4
,
JPI
$
_PAGEFLTS
},
{
4
,
JPI
$
_PID
},
{
4
,
JPI
$
_PPGCNT
},
{
4
,
JPI
$
_WSPEAK
},
{
4
,
JPI
$
_FINALEXC
},
{
0
,
0
}
/* zero terminated */
};
int
RAND_poll
(
void
)
{
long
pid
,
iosb
[
2
];
int
status
=
0
;
/* determine the number of items in the JPI array */
struct
items_data_st
item_entry
;
int
item_entry_count
=
sizeof
(
items_data
)
/
sizeof
(
item_entry
);
/* Create the JPI itemlist array to hold item_data content */
struct
{
short
length
,
code
;
long
*
buffer
;
int
*
buffer
;
int
*
retlen
;
}
item
[
32
],
*
pitem
;
unsigned
char
data_buffer
[
256
];
short
total_length
=
0
;
}
item
[
item_entry_count
],
*
pitem
;
/* number of entries in items_data */
struct
items_data_st
*
pitems_data
;
int
data_buffer
[(
item_entry_count
*
2
)
+
4
];
/* 8 bytes per entry max */
int
iosb
[
2
];
int
sys_time
[
2
];
int
*
ptr
;
int
i
,
j
;
int
tmp_length
=
0
;
int
total_length
=
0
;
pitems_data
=
items_data
;
pitem
=
item
;
/* Setup */
while
(
pitems_data
->
length
&&
(
total_length
+
pitems_data
->
length
<=
256
))
{
/* Setup itemlist for GETJPI */
while
(
pitems_data
->
length
)
{
pitem
->
length
=
pitems_data
->
length
;
pitem
->
code
=
pitems_data
->
code
;
pitem
->
buffer
=
(
long
*
)
&
data_buffer
[
total_length
];
pitem
->
code
=
pitems_data
->
code
;
pitem
->
buffer
=
&
data_buffer
[
total_length
];
pitem
->
retlen
=
0
;
total_length
+=
pitems_data
->
length
;
/* total_length is in longwords */
total_length
+=
pitems_data
->
length
/
4
;
pitems_data
++
;
pitem
++
;
}
pitem
->
length
=
pitem
->
code
=
0
;
/*
* Scan through all the processes in the system and add entropy with
* results from the processes that were possible to look at.
* However, view the information as only half trustable.
*/
pid
=
-
1
;
/* search context */
while
((
status
=
sys
$
getjpiw
(
0
,
&
pid
,
0
,
item
,
iosb
,
0
,
0
))
!=
SS
$
_NOMOREPROC
)
{
if
(
status
==
SS
$
_NORMAL
)
{
RAND_add
((
PTR_T
)
data_buffer
,
total_length
,
total_length
/
2
);
/* Fill data_buffer with various info bits from this process */
/* and twist that data to seed the SSL random number init */
if
(
sys
$
getjpiw
(
EFN
$
C_ENF
,
NULL
,
NULL
,
item
,
&
iosb
,
0
,
0
)
==
SS
$
_NORMAL
)
{
for
(
i
=
0
;
i
<
total_length
;
i
++
)
{
sys
$
gettim
((
struct
_generic_64
*
)
&
sys_time
[
0
]);
srand
(
sys_time
[
0
]
*
data_buffer
[
0
]
*
data_buffer
[
1
]
+
i
);
if
(
i
==
(
total_length
-
1
))
{
/* for JPI$_FINALEXC */
ptr
=
&
data_buffer
[
i
];
for
(
j
=
0
;
j
<
4
;
j
++
)
{
data_buffer
[
i
+
j
]
=
ptr
[
j
];
/* OK to use rand() just to scramble the seed */
data_buffer
[
i
+
j
]
^=
(
sys_time
[
0
]
^
rand
());
tmp_length
++
;
}
}
else
{
/* OK to use rand() just to scramble the seed */
data_buffer
[
i
]
^=
(
sys_time
[
0
]
^
rand
());
}
}
total_length
+=
(
tmp_length
-
1
);
/* size of seed is total_length*4 bytes (64bytes) */
RAND_add
((
PTR_T
)
data_buffer
,
total_length
*
4
,
total_length
*
2
);
}
else
{
return
0
;
}
sys
$
gettim
(
iosb
);
RAND_add
((
PTR_T
)
iosb
,
sizeof
(
iosb
),
sizeof
(
iosb
)
/
2
);
return
1
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录