Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Openssl
提交
0b3f827c
T
Third Party Openssl
项目概览
OpenHarmony
/
Third Party Openssl
1 年多 前同步成功
通知
10
Star
18
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Openssl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
0b3f827c
编写于
5月 02, 1999
作者:
B
Ben Laurie
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Yet another stack.
上级
8051996a
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
151 addition
and
68 deletion
+151
-68
Configure
Configure
+1
-0
apps/ca.c
apps/ca.c
+2
-1
apps/pkcs12.c
apps/pkcs12.c
+2
-2
crypto/asn1/asn1_mac.h
crypto/asn1/asn1_mac.h
+56
-0
crypto/asn1/x_cinf.c
crypto/asn1/x_cinf.c
+15
-9
crypto/asn1/x_crl.c
crypto/asn1/x_crl.c
+25
-19
crypto/stack/safestack.h
crypto/stack/safestack.h
+5
-5
crypto/x509/x509.h
crypto/x509/x509.h
+17
-10
crypto/x509/x509_ext.c
crypto/x509/x509_ext.c
+2
-0
crypto/x509/x509_v3.c
crypto/x509/x509_v3.c
+26
-22
未找到文件。
Configure
浏览文件 @
0b3f827c
...
@@ -94,6 +94,7 @@ my %table=(
...
@@ -94,6 +94,7 @@ my %table=(
"purify", "purify gcc:-g -DPURIFY -Wall:(unknown):-lsocket -lnsl::::",
"purify", "purify gcc:-g -DPURIFY -Wall:(unknown):-lsocket -lnsl::::",
"debug", "gcc:-DBN_DEBUG -DREF_CHECK -DCRYPTO_MDEBUG -ggdb -g2 -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations -Werror:(unknown):-lefence::::",
"debug", "gcc:-DBN_DEBUG -DREF_CHECK -DCRYPTO_MDEBUG -ggdb -g2 -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations -Werror:(unknown):-lefence::::",
"debug-ben", "gcc:-DBN_DEBUG -DREF_CHECK -DCRYPTO_MDEBUG -O2 -pedantic -Wall -Wshadow -Werror -pipe:(unknown):::::",
"debug-ben", "gcc:-DBN_DEBUG -DREF_CHECK -DCRYPTO_MDEBUG -O2 -pedantic -Wall -Wshadow -Werror -pipe:(unknown):::::",
"debug-ben-debug", "gcc:-DBN_DEBUG -DREF_CHECK -DCRYPTO_MDEBUG -g3 -O2 -pedantic -Wall -Wshadow -Werror -pipe:(unknown):::::",
"debug-ben-strict", "gcc:-DBN_DEBUG -DREF_CHECK -DCRYPTO_MDEBUG -DCONST_STRICT -O2 -Wall -Wshadow -Werror -Wpointer-arith -Wcast-qual -Wwrite-strings -pipe:(unknown):::::",
"debug-ben-strict", "gcc:-DBN_DEBUG -DREF_CHECK -DCRYPTO_MDEBUG -DCONST_STRICT -O2 -Wall -Wshadow -Werror -Wpointer-arith -Wcast-qual -Wwrite-strings -pipe:(unknown):::::",
"debug-rse","cc:-DTERMIOS -DL_ENDIAN -pipe -O -g -ggdb3 -Wall:(unknown)::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
"debug-rse","cc:-DTERMIOS -DL_ENDIAN -pipe -O -g -ggdb3 -Wall:(unknown)::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
"dist", "cc:-O:(unknown):::::",
"dist", "cc:-O:(unknown):::::",
...
...
apps/ca.c
浏览文件 @
0b3f827c
...
@@ -1721,7 +1721,8 @@ again2:
...
@@ -1721,7 +1721,8 @@ again2:
/* Free the current entries if any, there should not
/* Free the current entries if any, there should not
* be any I belive */
* be any I belive */
if
(
ci
->
extensions
!=
NULL
)
if
(
ci
->
extensions
!=
NULL
)
sk_pop_free
(
ci
->
extensions
,
X509_EXTENSION_free
);
sk_X509_EXTENSION_pop_free
(
ci
->
extensions
,
X509_EXTENSION_free
);
ci
->
extensions
=
NULL
;
ci
->
extensions
=
NULL
;
...
...
apps/pkcs12.c
浏览文件 @
0b3f827c
...
@@ -638,8 +638,8 @@ int print_attribs (BIO *out, STACK *attrlst, char *name)
...
@@ -638,8 +638,8 @@ int print_attribs (BIO *out, STACK *attrlst, char *name)
BIO_printf
(
out
,
": "
);
BIO_printf
(
out
,
": "
);
}
else
BIO_printf
(
out
,
"%s: "
,
OBJ_nid2ln
(
attr_nid
));
}
else
BIO_printf
(
out
,
"%s: "
,
OBJ_nid2ln
(
attr_nid
));
if
(
sk_num
(
attr
->
value
.
set
))
{
if
(
sk_
ASN1_TYPE_
num
(
attr
->
value
.
set
))
{
av
=
(
ASN1_TYPE
*
)
sk
_value
(
attr
->
value
.
set
,
0
);
av
=
sk_ASN1_TYPE
_value
(
attr
->
value
.
set
,
0
);
switch
(
av
->
type
)
{
switch
(
av
->
type
)
{
case
V_ASN1_BMPSTRING
:
case
V_ASN1_BMPSTRING
:
value
=
uni2asc
(
av
->
value
.
bmpstring
->
data
,
value
=
uni2asc
(
av
->
value
.
bmpstring
->
data
,
...
...
crypto/asn1/asn1_mac.h
浏览文件 @
0b3f827c
...
@@ -175,6 +175,10 @@ err:\
...
@@ -175,6 +175,10 @@ err:\
if ((a != NULL) && (sk_num(a) != 0)) \
if ((a != NULL) && (sk_num(a) != 0)) \
M_ASN1_I2D_put_SEQUENCE(a,f);
M_ASN1_I2D_put_SEQUENCE(a,f);
#define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
M_ASN1_I2D_put_SEQUENCE_type(type,a,f);
#define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \
#define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \
if ((c.slen != 0) && \
if ((c.slen != 0) && \
(M_ASN1_next == \
(M_ASN1_next == \
...
@@ -206,6 +210,11 @@ err:\
...
@@ -206,6 +210,11 @@ err:\
V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
{ M_ASN1_D2I_get_seq(r,func,free_func); }
{ M_ASN1_D2I_get_seq(r,func,free_func); }
#define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \
if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
{ M_ASN1_D2I_get_seq_type(type,r,func,free_func); }
#define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \
#define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \
M_ASN1_D2I_get_imp_set(r,func,free_func,\
M_ASN1_D2I_get_imp_set(r,func,free_func,\
x,V_ASN1_CONTEXT_SPECIFIC);
x,V_ASN1_CONTEXT_SPECIFIC);
...
@@ -286,6 +295,32 @@ err:\
...
@@ -286,6 +295,32 @@ err:\
c.slen-=(c.p-c.q); \
c.slen-=(c.p-c.q); \
}
}
#define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \
if ((c.slen != 0) && (M_ASN1_next == \
(V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
{ \
int Tinf,Ttag,Tclass; \
long Tlen; \
\
c.q=c.p; \
Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
if (Tinf & 0x80) \
{ c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
c.line=__LINE__; goto err; } \
if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
Tlen = c.slen - (c.p - c.q) - 2; \
if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \
free_func,b,V_ASN1_UNIVERSAL) == NULL) \
{ c.line=__LINE__; goto err; } \
if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
Tlen = c.slen - (c.p - c.q); \
if(!ASN1_check_infinite_end(&c.p, Tlen)) \
{ c.error=ERR_R_MISSING_ASN1_EOS; \
c.line=__LINE__; goto err; } \
}\
c.slen-=(c.p-c.q); \
}
/* New macros */
/* New macros */
#define M_ASN1_New_Malloc(ret,type) \
#define M_ASN1_New_Malloc(ret,type) \
if ((ret=(type *)Malloc(sizeof(type))) == NULL) \
if ((ret=(type *)Malloc(sizeof(type))) == NULL) \
...
@@ -329,6 +364,10 @@ err:\
...
@@ -329,6 +364,10 @@ err:\
if ((a != NULL) && (sk_num(a) != 0)) \
if ((a != NULL) && (sk_num(a) != 0)) \
M_ASN1_I2D_len_SEQUENCE(a,f);
M_ASN1_I2D_len_SEQUENCE(a,f);
#define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
M_ASN1_I2D_len_SEQUENCE_type(type,a,f);
#define M_ASN1_I2D_len_IMP_SET(a,f,x) \
#define M_ASN1_I2D_len_IMP_SET(a,f,x) \
ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET);
ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET);
...
@@ -383,6 +422,15 @@ err:\
...
@@ -383,6 +422,15 @@ err:\
ret+=ASN1_object_size(1,v,mtag); \
ret+=ASN1_object_size(1,v,mtag); \
}
}
#define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
if ((a != NULL) && (sk_##type##_num(a) != 0))\
{ \
v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \
V_ASN1_UNIVERSAL, \
IS_SEQUENCE); \
ret+=ASN1_object_size(1,v,mtag); \
}
/* Put Macros */
/* Put Macros */
#define M_ASN1_I2D_put(a,f) f(a,&p)
#define M_ASN1_I2D_put(a,f) f(a,&p)
...
@@ -457,6 +505,14 @@ err:\
...
@@ -457,6 +505,14 @@ err:\
i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \
i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \
}
}
#define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
{ \
ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \
IS_SEQUENCE); \
}
#define M_ASN1_I2D_seq_total() \
#define M_ASN1_I2D_seq_total() \
r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \
r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \
if (pp == NULL) return(r); \
if (pp == NULL) return(r); \
...
...
crypto/asn1/x_cinf.c
浏览文件 @
0b3f827c
...
@@ -74,7 +74,9 @@ int i2d_X509_CINF(X509_CINF *a, unsigned char **pp)
...
@@ -74,7 +74,9 @@ int i2d_X509_CINF(X509_CINF *a, unsigned char **pp)
M_ASN1_I2D_len
(
a
->
key
,
i2d_X509_PUBKEY
);
M_ASN1_I2D_len
(
a
->
key
,
i2d_X509_PUBKEY
);
M_ASN1_I2D_len_IMP_opt
(
a
->
issuerUID
,
i2d_ASN1_BIT_STRING
);
M_ASN1_I2D_len_IMP_opt
(
a
->
issuerUID
,
i2d_ASN1_BIT_STRING
);
M_ASN1_I2D_len_IMP_opt
(
a
->
subjectUID
,
i2d_ASN1_BIT_STRING
);
M_ASN1_I2D_len_IMP_opt
(
a
->
subjectUID
,
i2d_ASN1_BIT_STRING
);
M_ASN1_I2D_len_EXP_SEQUENCE_opt
(
a
->
extensions
,
i2d_X509_EXTENSION
,
3
,
V_ASN1_SEQUENCE
,
v2
);
M_ASN1_I2D_len_EXP_SEQUENCE_opt_type
(
X509_EXTENSION
,
a
->
extensions
,
i2d_X509_EXTENSION
,
3
,
V_ASN1_SEQUENCE
,
v2
);
M_ASN1_I2D_seq_total
();
M_ASN1_I2D_seq_total
();
...
@@ -87,7 +89,9 @@ int i2d_X509_CINF(X509_CINF *a, unsigned char **pp)
...
@@ -87,7 +89,9 @@ int i2d_X509_CINF(X509_CINF *a, unsigned char **pp)
M_ASN1_I2D_put
(
a
->
key
,
i2d_X509_PUBKEY
);
M_ASN1_I2D_put
(
a
->
key
,
i2d_X509_PUBKEY
);
M_ASN1_I2D_put_IMP_opt
(
a
->
issuerUID
,
i2d_ASN1_BIT_STRING
,
1
);
M_ASN1_I2D_put_IMP_opt
(
a
->
issuerUID
,
i2d_ASN1_BIT_STRING
,
1
);
M_ASN1_I2D_put_IMP_opt
(
a
->
subjectUID
,
i2d_ASN1_BIT_STRING
,
2
);
M_ASN1_I2D_put_IMP_opt
(
a
->
subjectUID
,
i2d_ASN1_BIT_STRING
,
2
);
M_ASN1_I2D_put_EXP_SEQUENCE_opt
(
a
->
extensions
,
i2d_X509_EXTENSION
,
3
,
V_ASN1_SEQUENCE
,
v2
);
M_ASN1_I2D_put_EXP_SEQUENCE_opt_type
(
X509_EXTENSION
,
a
->
extensions
,
i2d_X509_EXTENSION
,
3
,
V_ASN1_SEQUENCE
,
v2
);
M_ASN1_I2D_finish
();
M_ASN1_I2D_finish
();
}
}
...
@@ -147,11 +151,13 @@ X509_CINF *d2i_X509_CINF(X509_CINF **a, unsigned char **pp, long length)
...
@@ -147,11 +151,13 @@ X509_CINF *d2i_X509_CINF(X509_CINF **a, unsigned char **pp, long length)
#endif
#endif
{
{
if
(
ret
->
extensions
!=
NULL
)
if
(
ret
->
extensions
!=
NULL
)
while
(
sk_num
(
ret
->
extensions
))
while
(
sk_X509_EXTENSION_num
(
ret
->
extensions
))
X509_EXTENSION_free
((
X509_EXTENSION
*
)
X509_EXTENSION_free
(
sk_pop
(
ret
->
extensions
));
sk_X509_EXTENSION_pop
(
ret
->
extensions
));
M_ASN1_D2I_get_EXP_set_opt
(
ret
->
extensions
,
d2i_X509_EXTENSION
,
M_ASN1_D2I_get_EXP_set_opt_type
(
X509_EXTENSION
,
ret
->
extensions
,
X509_EXTENSION_free
,
3
,
V_ASN1_SEQUENCE
);
d2i_X509_EXTENSION
,
X509_EXTENSION_free
,
3
,
V_ASN1_SEQUENCE
);
}
}
M_ASN1_D2I_Finish
(
a
,
X509_CINF_free
,
ASN1_F_D2I_X509_CINF
);
M_ASN1_D2I_Finish
(
a
,
X509_CINF_free
,
ASN1_F_D2I_X509_CINF
);
}
}
...
@@ -188,7 +194,7 @@ void X509_CINF_free(X509_CINF *a)
...
@@ -188,7 +194,7 @@ void X509_CINF_free(X509_CINF *a)
X509_PUBKEY_free
(
a
->
key
);
X509_PUBKEY_free
(
a
->
key
);
ASN1_BIT_STRING_free
(
a
->
issuerUID
);
ASN1_BIT_STRING_free
(
a
->
issuerUID
);
ASN1_BIT_STRING_free
(
a
->
subjectUID
);
ASN1_BIT_STRING_free
(
a
->
subjectUID
);
sk_pop_free
(
a
->
extensions
,
X509_EXTENSION_free
);
sk_
X509_EXTENSION_
pop_free
(
a
->
extensions
,
X509_EXTENSION_free
);
Free
(
(
char
*
)
a
);
Free
(
a
);
}
}
crypto/asn1/x_crl.c
浏览文件 @
0b3f827c
...
@@ -69,13 +69,15 @@ int i2d_X509_REVOKED(X509_REVOKED *a, unsigned char **pp)
...
@@ -69,13 +69,15 @@ int i2d_X509_REVOKED(X509_REVOKED *a, unsigned char **pp)
M_ASN1_I2D_len
(
a
->
serialNumber
,
i2d_ASN1_INTEGER
);
M_ASN1_I2D_len
(
a
->
serialNumber
,
i2d_ASN1_INTEGER
);
M_ASN1_I2D_len
(
a
->
revocationDate
,
i2d_ASN1_TIME
);
M_ASN1_I2D_len
(
a
->
revocationDate
,
i2d_ASN1_TIME
);
M_ASN1_I2D_len_SEQUENCE_opt
(
a
->
extensions
,
i2d_X509_EXTENSION
);
M_ASN1_I2D_len_SEQUENCE_opt_type
(
X509_EXTENSION
,
a
->
extensions
,
i2d_X509_EXTENSION
);
M_ASN1_I2D_seq_total
();
M_ASN1_I2D_seq_total
();
M_ASN1_I2D_put
(
a
->
serialNumber
,
i2d_ASN1_INTEGER
);
M_ASN1_I2D_put
(
a
->
serialNumber
,
i2d_ASN1_INTEGER
);
M_ASN1_I2D_put
(
a
->
revocationDate
,
i2d_ASN1_TIME
);
M_ASN1_I2D_put
(
a
->
revocationDate
,
i2d_ASN1_TIME
);
M_ASN1_I2D_put_SEQUENCE_opt
(
a
->
extensions
,
i2d_X509_EXTENSION
);
M_ASN1_I2D_put_SEQUENCE_opt_type
(
X509_EXTENSION
,
a
->
extensions
,
i2d_X509_EXTENSION
);
M_ASN1_I2D_finish
();
M_ASN1_I2D_finish
();
}
}
...
@@ -89,8 +91,8 @@ X509_REVOKED *d2i_X509_REVOKED(X509_REVOKED **a, unsigned char **pp,
...
@@ -89,8 +91,8 @@ X509_REVOKED *d2i_X509_REVOKED(X509_REVOKED **a, unsigned char **pp,
M_ASN1_D2I_start_sequence
();
M_ASN1_D2I_start_sequence
();
M_ASN1_D2I_get
(
ret
->
serialNumber
,
d2i_ASN1_INTEGER
);
M_ASN1_D2I_get
(
ret
->
serialNumber
,
d2i_ASN1_INTEGER
);
M_ASN1_D2I_get
(
ret
->
revocationDate
,
d2i_ASN1_TIME
);
M_ASN1_D2I_get
(
ret
->
revocationDate
,
d2i_ASN1_TIME
);
M_ASN1_D2I_get_seq_opt
(
ret
->
extensions
,
d2i_X509_EXTENSION
,
M_ASN1_D2I_get_seq_opt
_type
(
X509_EXTENSION
,
ret
->
extensions
,
X509_EXTENSION_free
);
d2i_X509_EXTENSION
,
X509_EXTENSION_free
);
M_ASN1_D2I_Finish
(
a
,
X509_REVOKED_free
,
ASN1_F_D2I_X509_REVOKED
);
M_ASN1_D2I_Finish
(
a
,
X509_REVOKED_free
,
ASN1_F_D2I_X509_REVOKED
);
}
}
...
@@ -113,8 +115,9 @@ int i2d_X509_CRL_INFO(X509_CRL_INFO *a, unsigned char **pp)
...
@@ -113,8 +115,9 @@ int i2d_X509_CRL_INFO(X509_CRL_INFO *a, unsigned char **pp)
if
(
a
->
nextUpdate
!=
NULL
)
if
(
a
->
nextUpdate
!=
NULL
)
{
M_ASN1_I2D_len
(
a
->
nextUpdate
,
i2d_ASN1_TIME
);
}
{
M_ASN1_I2D_len
(
a
->
nextUpdate
,
i2d_ASN1_TIME
);
}
M_ASN1_I2D_len_SEQUENCE_opt
(
a
->
revoked
,
i2d_X509_REVOKED
);
M_ASN1_I2D_len_SEQUENCE_opt
(
a
->
revoked
,
i2d_X509_REVOKED
);
M_ASN1_I2D_len_EXP_SEQUENCE_opt
(
a
->
extensions
,
i2d_X509_EXTENSION
,
0
,
M_ASN1_I2D_len_EXP_SEQUENCE_opt_type
(
X509_EXTENSION
,
a
->
extensions
,
V_ASN1_SEQUENCE
,
v1
);
i2d_X509_EXTENSION
,
0
,
V_ASN1_SEQUENCE
,
v1
);
M_ASN1_I2D_seq_total
();
M_ASN1_I2D_seq_total
();
...
@@ -128,8 +131,9 @@ int i2d_X509_CRL_INFO(X509_CRL_INFO *a, unsigned char **pp)
...
@@ -128,8 +131,9 @@ int i2d_X509_CRL_INFO(X509_CRL_INFO *a, unsigned char **pp)
if
(
a
->
nextUpdate
!=
NULL
)
if
(
a
->
nextUpdate
!=
NULL
)
{
M_ASN1_I2D_put
(
a
->
nextUpdate
,
i2d_ASN1_UTCTIME
);
}
{
M_ASN1_I2D_put
(
a
->
nextUpdate
,
i2d_ASN1_UTCTIME
);
}
M_ASN1_I2D_put_SEQUENCE_opt
(
a
->
revoked
,
i2d_X509_REVOKED
);
M_ASN1_I2D_put_SEQUENCE_opt
(
a
->
revoked
,
i2d_X509_REVOKED
);
M_ASN1_I2D_put_EXP_SEQUENCE_opt
(
a
->
extensions
,
i2d_X509_EXTENSION
,
0
,
M_ASN1_I2D_put_EXP_SEQUENCE_opt_type
(
X509_EXTENSION
,
a
->
extensions
,
V_ASN1_SEQUENCE
,
v1
);
i2d_X509_EXTENSION
,
0
,
V_ASN1_SEQUENCE
,
v1
);
M_ASN1_I2D_finish
();
M_ASN1_I2D_finish
();
}
}
...
@@ -185,13 +189,15 @@ X509_CRL_INFO *d2i_X509_CRL_INFO(X509_CRL_INFO **a, unsigned char **pp,
...
@@ -185,13 +189,15 @@ X509_CRL_INFO *d2i_X509_CRL_INFO(X509_CRL_INFO **a, unsigned char **pp,
{
{
if
(
ret
->
extensions
!=
NULL
)
if
(
ret
->
extensions
!=
NULL
)
{
{
while
(
sk_num
(
ret
->
extensions
))
while
(
sk_
X509_EXTENSION_
num
(
ret
->
extensions
))
X509_EXTENSION_free
(
(
X509_EXTENSION
*
)
X509_EXTENSION_free
(
sk_pop
(
ret
->
extensions
));
sk_
X509_EXTENSION_
pop
(
ret
->
extensions
));
}
}
M_ASN1_D2I_get_EXP_set_opt
(
ret
->
extensions
,
d2i_X509_EXTENSION
,
M_ASN1_D2I_get_EXP_set_opt_type
(
X509_EXTENSION
,
ret
->
extensions
,
X509_EXTENSION_free
,
0
,
V_ASN1_SEQUENCE
);
d2i_X509_EXTENSION
,
X509_EXTENSION_free
,
0
,
V_ASN1_SEQUENCE
);
}
}
M_ASN1_D2I_Finish
(
a
,
X509_CRL_INFO_free
,
ASN1_F_D2I_X509_CRL_INFO
);
M_ASN1_D2I_Finish
(
a
,
X509_CRL_INFO_free
,
ASN1_F_D2I_X509_CRL_INFO
);
...
@@ -253,7 +259,7 @@ X509_CRL_INFO *X509_CRL_INFO_new(void)
...
@@ -253,7 +259,7 @@ X509_CRL_INFO *X509_CRL_INFO_new(void)
M_ASN1_New
(
ret
->
lastUpdate
,
ASN1_UTCTIME_new
);
M_ASN1_New
(
ret
->
lastUpdate
,
ASN1_UTCTIME_new
);
ret
->
nextUpdate
=
NULL
;
ret
->
nextUpdate
=
NULL
;
M_ASN1_New
(
ret
->
revoked
,
sk_new_null
);
M_ASN1_New
(
ret
->
revoked
,
sk_new_null
);
M_ASN1_New
(
ret
->
extensions
,
sk_new_null
);
M_ASN1_New
(
ret
->
extensions
,
sk_
X509_EXTENSION_
new_null
);
ret
->
revoked
->
comp
=
(
int
(
*
)())
X509_REVOKED_cmp
;
ret
->
revoked
->
comp
=
(
int
(
*
)())
X509_REVOKED_cmp
;
return
(
ret
);
return
(
ret
);
M_ASN1_New_Error
(
ASN1_F_X509_CRL_INFO_NEW
);
M_ASN1_New_Error
(
ASN1_F_X509_CRL_INFO_NEW
);
...
@@ -278,8 +284,8 @@ void X509_REVOKED_free(X509_REVOKED *a)
...
@@ -278,8 +284,8 @@ void X509_REVOKED_free(X509_REVOKED *a)
if
(
a
==
NULL
)
return
;
if
(
a
==
NULL
)
return
;
ASN1_INTEGER_free
(
a
->
serialNumber
);
ASN1_INTEGER_free
(
a
->
serialNumber
);
ASN1_UTCTIME_free
(
a
->
revocationDate
);
ASN1_UTCTIME_free
(
a
->
revocationDate
);
sk_pop_free
(
a
->
extensions
,
X509_EXTENSION_free
);
sk_
X509_EXTENSION_
pop_free
(
a
->
extensions
,
X509_EXTENSION_free
);
Free
(
(
char
*
)
a
);
Free
(
a
);
}
}
void
X509_CRL_INFO_free
(
X509_CRL_INFO
*
a
)
void
X509_CRL_INFO_free
(
X509_CRL_INFO
*
a
)
...
@@ -292,8 +298,8 @@ void X509_CRL_INFO_free(X509_CRL_INFO *a)
...
@@ -292,8 +298,8 @@ void X509_CRL_INFO_free(X509_CRL_INFO *a)
if
(
a
->
nextUpdate
)
if
(
a
->
nextUpdate
)
ASN1_UTCTIME_free
(
a
->
nextUpdate
);
ASN1_UTCTIME_free
(
a
->
nextUpdate
);
sk_pop_free
(
a
->
revoked
,
X509_REVOKED_free
);
sk_pop_free
(
a
->
revoked
,
X509_REVOKED_free
);
sk_pop_free
(
a
->
extensions
,
X509_EXTENSION_free
);
sk_
X509_EXTENSION_
pop_free
(
a
->
extensions
,
X509_EXTENSION_free
);
Free
(
(
char
*
)
a
);
Free
(
a
);
}
}
void
X509_CRL_free
(
X509_CRL
*
a
)
void
X509_CRL_free
(
X509_CRL
*
a
)
...
@@ -318,7 +324,7 @@ void X509_CRL_free(X509_CRL *a)
...
@@ -318,7 +324,7 @@ void X509_CRL_free(X509_CRL *a)
X509_CRL_INFO_free
(
a
->
crl
);
X509_CRL_INFO_free
(
a
->
crl
);
X509_ALGOR_free
(
a
->
sig_alg
);
X509_ALGOR_free
(
a
->
sig_alg
);
ASN1_BIT_STRING_free
(
a
->
signature
);
ASN1_BIT_STRING_free
(
a
->
signature
);
Free
(
(
char
*
)
a
);
Free
(
a
);
}
}
static
int
X509_REVOKED_cmp
(
X509_REVOKED
**
a
,
X509_REVOKED
**
b
)
static
int
X509_REVOKED_cmp
(
X509_REVOKED
**
a
,
X509_REVOKED
**
b
)
...
...
crypto/stack/safestack.h
浏览文件 @
0b3f827c
...
@@ -67,8 +67,8 @@ typedef struct stack_st_##type \
...
@@ -67,8 +67,8 @@ typedef struct stack_st_##type \
STACK_OF(type) *sk_##type##_new(int (*cmp)(type **,type **)); \
STACK_OF(type) *sk_##type##_new(int (*cmp)(type **,type **)); \
STACK_OF(type) *sk_##type##_new_null(void); \
STACK_OF(type) *sk_##type##_new_null(void); \
void sk_##type##_free(STACK_OF(type) *sk); \
void sk_##type##_free(STACK_OF(type) *sk); \
int sk_##type##_num(STACK_OF(type) *sk); \
int sk_##type##_num(
const
STACK_OF(type) *sk); \
type *sk_##type##_value(STACK_OF(type) *sk,int n); \
type *sk_##type##_value(
const
STACK_OF(type) *sk,int n); \
type *sk_##type##_set(STACK_OF(type) *sk,int n,type *v); \
type *sk_##type##_set(STACK_OF(type) *sk,int n,type *v); \
void sk_##type##_zero(STACK_OF(type) *sk); \
void sk_##type##_zero(STACK_OF(type) *sk); \
int sk_##type##_push(STACK_OF(type) *sk,type *v); \
int sk_##type##_push(STACK_OF(type) *sk,type *v); \
...
@@ -89,9 +89,9 @@ STACK_OF(type) *sk_##type##_new_null() \
...
@@ -89,9 +89,9 @@ STACK_OF(type) *sk_##type##_new_null() \
{ return (STACK_OF(type) *)sk_new_null(); } \
{ return (STACK_OF(type) *)sk_new_null(); } \
void sk_##type##_free(STACK_OF(type) *sk) \
void sk_##type##_free(STACK_OF(type) *sk) \
{ sk_free((STACK *)sk); } \
{ sk_free((STACK *)sk); } \
int sk_##type##_num(STACK_OF(type) *sk) \
int sk_##type##_num(
const
STACK_OF(type) *sk) \
{ return sk_num((STACK *)sk); } \
{ return sk_num((
const
STACK *)sk); } \
type *sk_##type##_value(STACK_OF(type) *sk,int n) \
type *sk_##type##_value(
const
STACK_OF(type) *sk,int n) \
{ return (type *)sk_value((STACK *)sk,n); } \
{ return (type *)sk_value((STACK *)sk,n); } \
type *sk_##type##_set(STACK_OF(type) *sk,int n,type *v) \
type *sk_##type##_set(STACK_OF(type) *sk,int n,type *v) \
{ return (type *)(sk_value((STACK *)sk,n)=(char *)v); } \
{ return (type *)(sk_value((STACK *)sk,n)=(char *)v); } \
...
...
crypto/x509/x509.h
浏览文件 @
0b3f827c
...
@@ -167,6 +167,9 @@ typedef struct X509_extension_st
...
@@ -167,6 +167,9 @@ typedef struct X509_extension_st
void
(
*
ex_free
)();
/* clear argp stuff */
void
(
*
ex_free
)();
/* clear argp stuff */
}
X509_EXTENSION
;
}
X509_EXTENSION
;
DECLARE_STACK_OF
(
X509_EXTENSION
)
DECLARE_ASN1_SET_OF
(
X509_EXTENSION
)
/* a sequence of these are used */
/* a sequence of these are used */
typedef
struct
x509_attributes_st
typedef
struct
x509_attributes_st
{
{
...
@@ -211,7 +214,7 @@ typedef struct x509_cinf_st
...
@@ -211,7 +214,7 @@ typedef struct x509_cinf_st
X509_PUBKEY
*
key
;
X509_PUBKEY
*
key
;
ASN1_BIT_STRING
*
issuerUID
;
/* [ 1 ] optional in v2 */
ASN1_BIT_STRING
*
issuerUID
;
/* [ 1 ] optional in v2 */
ASN1_BIT_STRING
*
subjectUID
;
/* [ 2 ] optional in v2 */
ASN1_BIT_STRING
*
subjectUID
;
/* [ 2 ] optional in v2 */
STACK
/* X509_EXTENSION */
*
extensions
;
/* [ 3 ] optional in v3 */
STACK
_OF
(
X509_EXTENSION
)
*
extensions
;
/* [ 3 ] optional in v3 */
}
X509_CINF
;
}
X509_CINF
;
typedef
struct
x509_st
typedef
struct
x509_st
...
@@ -231,7 +234,7 @@ typedef struct X509_revoked_st
...
@@ -231,7 +234,7 @@ typedef struct X509_revoked_st
{
{
ASN1_INTEGER
*
serialNumber
;
ASN1_INTEGER
*
serialNumber
;
ASN1_UTCTIME
*
revocationDate
;
ASN1_UTCTIME
*
revocationDate
;
STACK
/* optional X509_EXTENSION
*/
*
extensions
;
STACK
_OF
(
X509_EXTENSION
)
/* optional
*/
*
extensions
;
int
sequence
;
/* load sequence */
int
sequence
;
/* load sequence */
}
X509_REVOKED
;
}
X509_REVOKED
;
...
@@ -243,7 +246,7 @@ typedef struct X509_crl_info_st
...
@@ -243,7 +246,7 @@ typedef struct X509_crl_info_st
ASN1_UTCTIME
*
lastUpdate
;
ASN1_UTCTIME
*
lastUpdate
;
ASN1_UTCTIME
*
nextUpdate
;
ASN1_UTCTIME
*
nextUpdate
;
STACK
/* X509_REVOKED */
*
revoked
;
STACK
/* X509_REVOKED */
*
revoked
;
STACK
/* [0] X509_EXTENSION
*/
*
extensions
;
STACK
_OF
(
X509_EXTENSION
)
/* [0]
*/
*
extensions
;
}
X509_CRL_INFO
;
}
X509_CRL_INFO
;
typedef
struct
X509_crl_st
typedef
struct
X509_crl_st
...
@@ -810,13 +813,17 @@ int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type,
...
@@ -810,13 +813,17 @@ int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type,
ASN1_OBJECT
*
X509_NAME_ENTRY_get_object
(
X509_NAME_ENTRY
*
ne
);
ASN1_OBJECT
*
X509_NAME_ENTRY_get_object
(
X509_NAME_ENTRY
*
ne
);
ASN1_STRING
*
X509_NAME_ENTRY_get_data
(
X509_NAME_ENTRY
*
ne
);
ASN1_STRING
*
X509_NAME_ENTRY_get_data
(
X509_NAME_ENTRY
*
ne
);
int
X509v3_get_ext_count
(
STACK
*
x
);
int
X509v3_get_ext_count
(
const
STACK_OF
(
X509_EXTENSION
)
*
x
);
int
X509v3_get_ext_by_NID
(
STACK
*
x
,
int
nid
,
int
lastpos
);
int
X509v3_get_ext_by_NID
(
const
STACK_OF
(
X509_EXTENSION
)
*
x
,
int
X509v3_get_ext_by_OBJ
(
STACK
*
x
,
ASN1_OBJECT
*
obj
,
int
lastpos
);
int
nid
,
int
lastpos
);
int
X509v3_get_ext_by_critical
(
STACK
*
x
,
int
crit
,
int
lastpos
);
int
X509v3_get_ext_by_OBJ
(
const
STACK_OF
(
X509_EXTENSION
)
*
x
,
X509_EXTENSION
*
X509v3_get_ext
(
STACK
*
x
,
int
loc
);
ASN1_OBJECT
*
obj
,
int
lastpos
);
X509_EXTENSION
*
X509v3_delete_ext
(
STACK
*
x
,
int
loc
);
int
X509v3_get_ext_by_critical
(
const
STACK_OF
(
X509_EXTENSION
)
*
x
,
STACK
*
X509v3_add_ext
(
STACK
**
x
,
X509_EXTENSION
*
ex
,
int
loc
);
int
crit
,
int
lastpos
);
X509_EXTENSION
*
X509v3_get_ext
(
const
STACK_OF
(
X509_EXTENSION
)
*
x
,
int
loc
);
X509_EXTENSION
*
X509v3_delete_ext
(
STACK_OF
(
X509_EXTENSION
)
*
x
,
int
loc
);
STACK_OF
(
X509_EXTENSION
)
*
X509v3_add_ext
(
STACK_OF
(
X509_EXTENSION
)
**
x
,
X509_EXTENSION
*
ex
,
int
loc
);
int
X509_get_ext_count
(
X509
*
x
);
int
X509_get_ext_count
(
X509
*
x
);
int
X509_get_ext_by_NID
(
X509
*
x
,
int
nid
,
int
lastpos
);
int
X509_get_ext_by_NID
(
X509
*
x
,
int
nid
,
int
lastpos
);
...
...
crypto/x509/x509_ext.c
浏览文件 @
0b3f827c
...
@@ -170,3 +170,5 @@ int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc)
...
@@ -170,3 +170,5 @@ int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc)
return
(
X509v3_add_ext
(
&
(
x
->
extensions
),
ex
,
loc
)
!=
NULL
);
return
(
X509v3_add_ext
(
&
(
x
->
extensions
),
ex
,
loc
)
!=
NULL
);
}
}
IMPLEMENT_STACK_OF
(
X509_EXTENSION
)
IMPLEMENT_ASN1_SET_OF
(
X509_EXTENSION
)
crypto/x509/x509_v3.c
浏览文件 @
0b3f827c
...
@@ -64,13 +64,14 @@
...
@@ -64,13 +64,14 @@
#include <openssl/evp.h>
#include <openssl/evp.h>
#include <openssl/x509.h>
#include <openssl/x509.h>
int
X509v3_get_ext_count
(
STACK
*
x
)
int
X509v3_get_ext_count
(
const
STACK_OF
(
X509_EXTENSION
)
*
x
)
{
{
if
(
x
==
NULL
)
return
(
0
);
if
(
x
==
NULL
)
return
(
0
);
return
(
sk_num
(
x
));
return
(
sk_
X509_EXTENSION_
num
(
x
));
}
}
int
X509v3_get_ext_by_NID
(
STACK
*
x
,
int
nid
,
int
lastpos
)
int
X509v3_get_ext_by_NID
(
const
STACK_OF
(
X509_EXTENSION
)
*
x
,
int
nid
,
int
lastpos
)
{
{
ASN1_OBJECT
*
obj
;
ASN1_OBJECT
*
obj
;
...
@@ -79,7 +80,8 @@ int X509v3_get_ext_by_NID(STACK *x, int nid, int lastpos)
...
@@ -79,7 +80,8 @@ int X509v3_get_ext_by_NID(STACK *x, int nid, int lastpos)
return
(
X509v3_get_ext_by_OBJ
(
x
,
obj
,
lastpos
));
return
(
X509v3_get_ext_by_OBJ
(
x
,
obj
,
lastpos
));
}
}
int
X509v3_get_ext_by_OBJ
(
STACK
*
sk
,
ASN1_OBJECT
*
obj
,
int
lastpos
)
int
X509v3_get_ext_by_OBJ
(
const
STACK_OF
(
X509_EXTENSION
)
*
sk
,
ASN1_OBJECT
*
obj
,
int
lastpos
)
{
{
int
n
;
int
n
;
X509_EXTENSION
*
ex
;
X509_EXTENSION
*
ex
;
...
@@ -88,17 +90,18 @@ int X509v3_get_ext_by_OBJ(STACK *sk, ASN1_OBJECT *obj, int lastpos)
...
@@ -88,17 +90,18 @@ int X509v3_get_ext_by_OBJ(STACK *sk, ASN1_OBJECT *obj, int lastpos)
lastpos
++
;
lastpos
++
;
if
(
lastpos
<
0
)
if
(
lastpos
<
0
)
lastpos
=
0
;
lastpos
=
0
;
n
=
sk_num
(
sk
);
n
=
sk_
X509_EXTENSION_
num
(
sk
);
for
(
;
lastpos
<
n
;
lastpos
++
)
for
(
;
lastpos
<
n
;
lastpos
++
)
{
{
ex
=
(
X509_EXTENSION
*
)
sk
_value
(
sk
,
lastpos
);
ex
=
sk_X509_EXTENSION
_value
(
sk
,
lastpos
);
if
(
OBJ_cmp
(
ex
->
object
,
obj
)
==
0
)
if
(
OBJ_cmp
(
ex
->
object
,
obj
)
==
0
)
return
(
lastpos
);
return
(
lastpos
);
}
}
return
(
-
1
);
return
(
-
1
);
}
}
int
X509v3_get_ext_by_critical
(
STACK
*
sk
,
int
crit
,
int
lastpos
)
int
X509v3_get_ext_by_critical
(
const
STACK_OF
(
X509_EXTENSION
)
*
sk
,
int
crit
,
int
lastpos
)
{
{
int
n
;
int
n
;
X509_EXTENSION
*
ex
;
X509_EXTENSION
*
ex
;
...
@@ -107,10 +110,10 @@ int X509v3_get_ext_by_critical(STACK *sk, int crit, int lastpos)
...
@@ -107,10 +110,10 @@ int X509v3_get_ext_by_critical(STACK *sk, int crit, int lastpos)
lastpos
++
;
lastpos
++
;
if
(
lastpos
<
0
)
if
(
lastpos
<
0
)
lastpos
=
0
;
lastpos
=
0
;
n
=
sk_num
(
sk
);
n
=
sk_
X509_EXTENSION_
num
(
sk
);
for
(
;
lastpos
<
n
;
lastpos
++
)
for
(
;
lastpos
<
n
;
lastpos
++
)
{
{
ex
=
(
X509_EXTENSION
*
)
sk
_value
(
sk
,
lastpos
);
ex
=
sk_X509_EXTENSION
_value
(
sk
,
lastpos
);
if
(
(
ex
->
critical
&&
crit
)
||
if
(
(
ex
->
critical
&&
crit
)
||
(
!
ex
->
critical
&&
!
crit
))
(
!
ex
->
critical
&&
!
crit
))
return
(
lastpos
);
return
(
lastpos
);
...
@@ -118,45 +121,46 @@ int X509v3_get_ext_by_critical(STACK *sk, int crit, int lastpos)
...
@@ -118,45 +121,46 @@ int X509v3_get_ext_by_critical(STACK *sk, int crit, int lastpos)
return
(
-
1
);
return
(
-
1
);
}
}
X509_EXTENSION
*
X509v3_get_ext
(
STACK
*
x
,
int
loc
)
X509_EXTENSION
*
X509v3_get_ext
(
const
STACK_OF
(
X509_EXTENSION
)
*
x
,
int
loc
)
{
{
if
(
(
x
==
NULL
)
||
(
sk_num
(
x
)
<=
loc
)
||
(
loc
<
0
)
)
if
(
x
==
NULL
||
sk_X509_EXTENSION_num
(
x
)
<=
loc
||
loc
<
0
)
return
(
NULL
)
;
return
NULL
;
else
else
return
((
X509_EXTENSION
*
)
sk_value
(
x
,
loc
)
);
return
sk_X509_EXTENSION_value
(
x
,
loc
);
}
}
X509_EXTENSION
*
X509v3_delete_ext
(
STACK
*
x
,
int
loc
)
X509_EXTENSION
*
X509v3_delete_ext
(
STACK
_OF
(
X509_EXTENSION
)
*
x
,
int
loc
)
{
{
X509_EXTENSION
*
ret
;
X509_EXTENSION
*
ret
;
if
(
(
x
==
NULL
)
||
(
sk_num
(
x
)
<=
loc
)
||
(
loc
<
0
)
)
if
(
x
==
NULL
||
sk_X509_EXTENSION_num
(
x
)
<=
loc
||
loc
<
0
)
return
(
NULL
);
return
(
NULL
);
ret
=
(
X509_EXTENSION
*
)
sk
_delete
(
x
,
loc
);
ret
=
sk_X509_EXTENSION
_delete
(
x
,
loc
);
return
(
ret
);
return
(
ret
);
}
}
STACK
*
X509v3_add_ext
(
STACK
**
x
,
X509_EXTENSION
*
ex
,
int
loc
)
STACK_OF
(
X509_EXTENSION
)
*
X509v3_add_ext
(
STACK_OF
(
X509_EXTENSION
)
**
x
,
X509_EXTENSION
*
ex
,
int
loc
)
{
{
X509_EXTENSION
*
new_ex
=
NULL
;
X509_EXTENSION
*
new_ex
=
NULL
;
int
n
;
int
n
;
STACK
*
sk
=
NULL
;
STACK
_OF
(
X509_EXTENSION
)
*
sk
=
NULL
;
if
((
x
!=
NULL
)
&&
(
*
x
==
NULL
))
if
((
x
!=
NULL
)
&&
(
*
x
==
NULL
))
{
{
if
((
sk
=
sk_new_null
())
==
NULL
)
if
((
sk
=
sk_
X509_EXTENSION_
new_null
())
==
NULL
)
goto
err
;
goto
err
;
}
}
else
else
sk
=
*
x
;
sk
=
*
x
;
n
=
sk_num
(
sk
);
n
=
sk_
X509_EXTENSION_
num
(
sk
);
if
(
loc
>
n
)
loc
=
n
;
if
(
loc
>
n
)
loc
=
n
;
else
if
(
loc
<
0
)
loc
=
n
;
else
if
(
loc
<
0
)
loc
=
n
;
if
((
new_ex
=
X509_EXTENSION_dup
(
ex
))
==
NULL
)
if
((
new_ex
=
X509_EXTENSION_dup
(
ex
))
==
NULL
)
goto
err2
;
goto
err2
;
if
(
!
sk_
insert
(
sk
,(
char
*
)
new_ex
,
loc
))
if
(
!
sk_
X509_EXTENSION_insert
(
sk
,
new_ex
,
loc
))
goto
err
;
goto
err
;
if
((
x
!=
NULL
)
&&
(
*
x
==
NULL
))
if
((
x
!=
NULL
)
&&
(
*
x
==
NULL
))
*
x
=
sk
;
*
x
=
sk
;
...
@@ -165,7 +169,7 @@ err:
...
@@ -165,7 +169,7 @@ err:
X509err
(
X509_F_X509V3_ADD_EXT
,
ERR_R_MALLOC_FAILURE
);
X509err
(
X509_F_X509V3_ADD_EXT
,
ERR_R_MALLOC_FAILURE
);
err2:
err2:
if
(
new_ex
!=
NULL
)
X509_EXTENSION_free
(
new_ex
);
if
(
new_ex
!=
NULL
)
X509_EXTENSION_free
(
new_ex
);
if
(
sk
!=
NULL
)
sk_free
(
sk
);
if
(
sk
!=
NULL
)
sk_
X509_EXTENSION_
free
(
sk
);
return
(
NULL
);
return
(
NULL
);
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录