Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
c7673b02
Commit
c7673b02
authored
Mar 12, 2018
by
Luiz Felipe Silva
Browse files
Merge remote-tracking branch 'upstream/dev' into dev
parents
ba9a938e
5c8af3c4
Changes
114
Show whitespace changes
Inline
Side-by-side
app/mbedtls/library/sha1.c
View file @
c7673b02
...
...
@@ -97,7 +97,7 @@ void mbedtls_sha1_clone( mbedtls_sha1_context *dst,
/*
* SHA-1 context setup
*/
void
mbedtls_sha1_starts
(
mbedtls_sha1_context
*
ctx
)
int
mbedtls_sha1_starts
_ret
(
mbedtls_sha1_context
*
ctx
)
{
ctx
->
total
[
0
]
=
0
;
ctx
->
total
[
1
]
=
0
;
...
...
@@ -107,10 +107,13 @@ void mbedtls_sha1_starts( mbedtls_sha1_context *ctx )
ctx
->
state
[
2
]
=
0x98BADCFE
;
ctx
->
state
[
3
]
=
0x10325476
;
ctx
->
state
[
4
]
=
0xC3D2E1F0
;
return
(
0
);
}
#if !defined(MBEDTLS_SHA1_PROCESS_ALT)
void
mbedtls_sha1_process
(
mbedtls_sha1_context
*
ctx
,
const
unsigned
char
data
[
64
]
)
int
mbedtls_internal_sha1_process
(
mbedtls_sha1_context
*
ctx
,
const
unsigned
char
data
[
64
]
)
{
uint32_t
temp
,
W
[
16
],
A
,
B
,
C
,
D
,
E
;
...
...
@@ -264,19 +267,24 @@ void mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[6
ctx
->
state
[
2
]
+=
C
;
ctx
->
state
[
3
]
+=
D
;
ctx
->
state
[
4
]
+=
E
;
return
(
0
);
}
#endif
/* !MBEDTLS_SHA1_PROCESS_ALT */
/*
* SHA-1 process buffer
*/
void
mbedtls_sha1_update
(
mbedtls_sha1_context
*
ctx
,
const
unsigned
char
*
input
,
size_t
ilen
)
int
mbedtls_sha1_update_ret
(
mbedtls_sha1_context
*
ctx
,
const
unsigned
char
*
input
,
size_t
ilen
)
{
int
ret
;
size_t
fill
;
uint32_t
left
;
if
(
ilen
==
0
)
return
;
return
(
0
)
;
left
=
ctx
->
total
[
0
]
&
0x3F
;
fill
=
64
-
left
;
...
...
@@ -290,7 +298,10 @@ void mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input,
if
(
left
&&
ilen
>=
fill
)
{
memcpy
(
(
void
*
)
(
ctx
->
buffer
+
left
),
input
,
fill
);
mbedtls_sha1_process
(
ctx
,
ctx
->
buffer
);
if
(
(
ret
=
mbedtls_internal_sha1_process
(
ctx
,
ctx
->
buffer
)
)
!=
0
)
return
(
ret
);
input
+=
fill
;
ilen
-=
fill
;
left
=
0
;
...
...
@@ -298,13 +309,17 @@ void mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input,
while
(
ilen
>=
64
)
{
mbedtls_sha1_process
(
ctx
,
input
);
if
(
(
ret
=
mbedtls_internal_sha1_process
(
ctx
,
input
)
)
!=
0
)
return
(
ret
);
input
+=
64
;
ilen
-=
64
;
}
if
(
ilen
>
0
)
memcpy
(
(
void
*
)
(
ctx
->
buffer
+
left
),
input
,
ilen
);
return
(
0
);
}
static
const
unsigned
char
sha1_padding
[
64
]
=
...
...
@@ -318,8 +333,10 @@ static const unsigned char sha1_padding[64] =
/*
* SHA-1 final digest
*/
void
mbedtls_sha1_finish
(
mbedtls_sha1_context
*
ctx
,
unsigned
char
output
[
20
]
)
int
mbedtls_sha1_finish_ret
(
mbedtls_sha1_context
*
ctx
,
unsigned
char
output
[
20
]
)
{
int
ret
;
uint32_t
last
,
padn
;
uint32_t
high
,
low
;
unsigned
char
msglen
[
8
];
...
...
@@ -334,14 +351,18 @@ void mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] )
last
=
ctx
->
total
[
0
]
&
0x3F
;
padn
=
(
last
<
56
)
?
(
56
-
last
)
:
(
120
-
last
);
mbedtls_sha1_update
(
ctx
,
sha1_padding
,
padn
);
mbedtls_sha1_update
(
ctx
,
msglen
,
8
);
if
(
(
ret
=
mbedtls_sha1_update_ret
(
ctx
,
sha1_padding
,
padn
)
)
!=
0
)
return
(
ret
);
if
(
(
ret
=
mbedtls_sha1_update_ret
(
ctx
,
msglen
,
8
)
)
!=
0
)
return
(
ret
);
PUT_UINT32_BE
(
ctx
->
state
[
0
],
output
,
0
);
PUT_UINT32_BE
(
ctx
->
state
[
1
],
output
,
4
);
PUT_UINT32_BE
(
ctx
->
state
[
2
],
output
,
8
);
PUT_UINT32_BE
(
ctx
->
state
[
3
],
output
,
12
);
PUT_UINT32_BE
(
ctx
->
state
[
4
],
output
,
16
);
return
(
0
);
}
#endif
/* !MBEDTLS_SHA1_ALT */
...
...
@@ -349,15 +370,28 @@ void mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] )
/*
* output = SHA-1( input buffer )
*/
void
mbedtls_sha1
(
const
unsigned
char
*
input
,
size_t
ilen
,
unsigned
char
output
[
20
]
)
int
mbedtls_sha1_ret
(
const
unsigned
char
*
input
,
size_t
ilen
,
unsigned
char
output
[
20
]
)
{
int
ret
;
mbedtls_sha1_context
ctx
;
mbedtls_sha1_init
(
&
ctx
);
mbedtls_sha1_starts
(
&
ctx
);
mbedtls_sha1_update
(
&
ctx
,
input
,
ilen
);
mbedtls_sha1_finish
(
&
ctx
,
output
);
if
(
(
ret
=
mbedtls_sha1_starts_ret
(
&
ctx
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_sha1_update_ret
(
&
ctx
,
input
,
ilen
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_sha1_finish_ret
(
&
ctx
,
output
)
)
!=
0
)
goto
exit
;
exit:
mbedtls_sha1_free
(
&
ctx
);
return
(
ret
);
}
#if defined(MBEDTLS_SELF_TEST)
...
...
@@ -371,7 +405,7 @@ static const unsigned char sha1_test_buf[3][57] =
{
""
}
};
static
const
in
t
sha1_test_buflen
[
3
]
=
static
const
size_
t
sha1_test_buflen
[
3
]
=
{
3
,
56
,
1000
};
...
...
@@ -406,28 +440,35 @@ int mbedtls_sha1_self_test( int verbose )
if
(
verbose
!=
0
)
mbedtls_printf
(
" SHA-1 test #%d: "
,
i
+
1
);
mbedtls_sha1_starts
(
&
ctx
);
if
(
(
ret
=
mbedtls_sha1_starts_ret
(
&
ctx
)
)
!=
0
)
goto
fail
;
if
(
i
==
2
)
{
memset
(
buf
,
'a'
,
buflen
=
1000
);
for
(
j
=
0
;
j
<
1000
;
j
++
)
mbedtls_sha1_update
(
&
ctx
,
buf
,
buflen
);
{
ret
=
mbedtls_sha1_update_ret
(
&
ctx
,
buf
,
buflen
);
if
(
ret
!=
0
)
goto
fail
;
}
}
else
mbedtls_sha1_update
(
&
ctx
,
sha1_test_buf
[
i
],
{
ret
=
mbedtls_sha1_update_ret
(
&
ctx
,
sha1_test_buf
[
i
],
sha1_test_buflen
[
i
]
);
if
(
ret
!=
0
)
goto
fail
;
}
mbedtls_sha1_finish
(
&
ctx
,
sha1sum
);
if
(
(
ret
=
mbedtls_sha1_finish_ret
(
&
ctx
,
sha1sum
)
)
!=
0
)
goto
fail
;
if
(
memcmp
(
sha1sum
,
sha1_test_sum
[
i
],
20
)
!=
0
)
{
if
(
verbose
!=
0
)
mbedtls_printf
(
"failed
\n
"
);
ret
=
1
;
goto
exit
;
goto
fail
;
}
if
(
verbose
!=
0
)
...
...
@@ -437,6 +478,12 @@ int mbedtls_sha1_self_test( int verbose )
if
(
verbose
!=
0
)
mbedtls_printf
(
"
\n
"
);
goto
exit
;
fail:
if
(
verbose
!=
0
)
mbedtls_printf
(
"failed
\n
"
);
exit:
mbedtls_sha1_free
(
&
ctx
);
...
...
app/mbedtls/library/sha256.c
View file @
c7673b02
...
...
@@ -100,7 +100,7 @@ void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
/*
* SHA-256 context setup
*/
void
mbedtls_sha256_starts
(
mbedtls_sha256_context
*
ctx
,
int
is224
)
int
mbedtls_sha256_starts
_ret
(
mbedtls_sha256_context
*
ctx
,
int
is224
)
{
ctx
->
total
[
0
]
=
0
;
ctx
->
total
[
1
]
=
0
;
...
...
@@ -131,6 +131,8 @@ void mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 )
}
ctx
->
is224
=
is224
;
return
(
0
);
}
#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
...
...
@@ -179,7 +181,8 @@ static const uint32_t K[] =
d += temp1; h = temp1 + temp2; \
}
void
mbedtls_sha256_process
(
mbedtls_sha256_context
*
ctx
,
const
unsigned
char
data
[
64
]
)
int
mbedtls_internal_sha256_process
(
mbedtls_sha256_context
*
ctx
,
const
unsigned
char
data
[
64
]
)
{
uint32_t
temp1
,
temp2
,
W
[
64
];
uint32_t
A
[
8
];
...
...
@@ -232,20 +235,24 @@ void mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char da
for
(
i
=
0
;
i
<
8
;
i
++
)
ctx
->
state
[
i
]
+=
A
[
i
];
return
(
0
);
}
#endif
/* !MBEDTLS_SHA256_PROCESS_ALT */
/*
* SHA-256 process buffer
*/
void
mbedtls_sha256_update
(
mbedtls_sha256_context
*
ctx
,
const
unsigned
char
*
input
,
int
mbedtls_sha256_update_ret
(
mbedtls_sha256_context
*
ctx
,
const
unsigned
char
*
input
,
size_t
ilen
)
{
int
ret
;
size_t
fill
;
uint32_t
left
;
if
(
ilen
==
0
)
return
;
return
(
0
)
;
left
=
ctx
->
total
[
0
]
&
0x3F
;
fill
=
64
-
left
;
...
...
@@ -259,7 +266,10 @@ void mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *in
if
(
left
&&
ilen
>=
fill
)
{
memcpy
(
(
void
*
)
(
ctx
->
buffer
+
left
),
input
,
fill
);
mbedtls_sha256_process
(
ctx
,
ctx
->
buffer
);
if
(
(
ret
=
mbedtls_internal_sha256_process
(
ctx
,
ctx
->
buffer
)
)
!=
0
)
return
(
ret
);
input
+=
fill
;
ilen
-=
fill
;
left
=
0
;
...
...
@@ -267,13 +277,17 @@ void mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *in
while
(
ilen
>=
64
)
{
mbedtls_sha256_process
(
ctx
,
input
);
if
(
(
ret
=
mbedtls_internal_sha256_process
(
ctx
,
input
)
)
!=
0
)
return
(
ret
);
input
+=
64
;
ilen
-=
64
;
}
if
(
ilen
>
0
)
memcpy
(
(
void
*
)
(
ctx
->
buffer
+
left
),
input
,
ilen
);
return
(
0
);
}
static
const
unsigned
char
sha256_padding
[
64
]
=
...
...
@@ -287,8 +301,10 @@ static const unsigned char sha256_padding[64] =
/*
* SHA-256 final digest
*/
void
mbedtls_sha256_finish
(
mbedtls_sha256_context
*
ctx
,
unsigned
char
output
[
32
]
)
int
mbedtls_sha256_finish_ret
(
mbedtls_sha256_context
*
ctx
,
unsigned
char
output
[
32
]
)
{
int
ret
;
uint32_t
last
,
padn
;
uint32_t
high
,
low
;
unsigned
char
msglen
[
8
];
...
...
@@ -303,8 +319,11 @@ void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32
last
=
ctx
->
total
[
0
]
&
0x3F
;
padn
=
(
last
<
56
)
?
(
56
-
last
)
:
(
120
-
last
);
mbedtls_sha256_update
(
ctx
,
sha256_padding
,
padn
);
mbedtls_sha256_update
(
ctx
,
msglen
,
8
);
if
(
(
ret
=
mbedtls_sha256_update_ret
(
ctx
,
sha256_padding
,
padn
)
)
!=
0
)
return
(
ret
);
if
(
(
ret
=
mbedtls_sha256_update_ret
(
ctx
,
msglen
,
8
)
)
!=
0
)
return
(
ret
);
PUT_UINT32_BE
(
ctx
->
state
[
0
],
output
,
0
);
PUT_UINT32_BE
(
ctx
->
state
[
1
],
output
,
4
);
...
...
@@ -316,6 +335,8 @@ void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32
if
(
ctx
->
is224
==
0
)
PUT_UINT32_BE
(
ctx
->
state
[
7
],
output
,
28
);
return
(
0
);
}
#endif
/* !MBEDTLS_SHA256_ALT */
...
...
@@ -323,16 +344,29 @@ void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32
/*
* output = SHA-256( input buffer )
*/
void
mbedtls_sha256
(
const
unsigned
char
*
input
,
size_t
ilen
,
unsigned
char
output
[
32
],
int
is224
)
int
mbedtls_sha256_ret
(
const
unsigned
char
*
input
,
size_t
ilen
,
unsigned
char
output
[
32
],
int
is224
)
{
int
ret
;
mbedtls_sha256_context
ctx
;
mbedtls_sha256_init
(
&
ctx
);
mbedtls_sha256_starts
(
&
ctx
,
is224
);
mbedtls_sha256_update
(
&
ctx
,
input
,
ilen
);
mbedtls_sha256_finish
(
&
ctx
,
output
);
if
(
(
ret
=
mbedtls_sha256_starts_ret
(
&
ctx
,
is224
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_sha256_update_ret
(
&
ctx
,
input
,
ilen
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_sha256_finish_ret
(
&
ctx
,
output
)
)
!=
0
)
goto
exit
;
exit:
mbedtls_sha256_free
(
&
ctx
);
return
(
ret
);
}
#if defined(MBEDTLS_SELF_TEST)
...
...
@@ -346,7 +380,7 @@ static const unsigned char sha256_test_buf[3][57] =
{
""
}
};
static
const
in
t
sha256_test_buflen
[
3
]
=
static
const
size_
t
sha256_test_buflen
[
3
]
=
{
3
,
56
,
1000
};
...
...
@@ -415,28 +449,37 @@ int mbedtls_sha256_self_test( int verbose )
if
(
verbose
!=
0
)
mbedtls_printf
(
" SHA-%d test #%d: "
,
256
-
k
*
32
,
j
+
1
);
mbedtls_sha256_starts
(
&
ctx
,
k
);
if
(
(
ret
=
mbedtls_sha256_starts_ret
(
&
ctx
,
k
)
)
!=
0
)
goto
fail
;
if
(
j
==
2
)
{
memset
(
buf
,
'a'
,
buflen
=
1000
);
for
(
j
=
0
;
j
<
1000
;
j
++
)
mbedtls_sha256_update
(
&
ctx
,
buf
,
buflen
);
{
ret
=
mbedtls_sha256_update_ret
(
&
ctx
,
buf
,
buflen
);
if
(
ret
!=
0
)
goto
fail
;
}
}
else
mbedtls_sha256_update
(
&
ctx
,
sha256_test_buf
[
j
],
{
ret
=
mbedtls_sha256_update_ret
(
&
ctx
,
sha256_test_buf
[
j
],
sha256_test_buflen
[
j
]
);
if
(
ret
!=
0
)
goto
fail
;
}
if
(
(
ret
=
mbedtls_sha256_finish_ret
(
&
ctx
,
sha256sum
)
)
!=
0
)
goto
fail
;
mbedtls_sha256_finish
(
&
ctx
,
sha256sum
);
if
(
memcmp
(
sha256sum
,
sha256_test_sum
[
i
],
32
-
k
*
4
)
!=
0
)
{
if
(
verbose
!=
0
)
mbedtls_printf
(
"failed
\n
"
);
ret
=
1
;
goto
exit
;
goto
fail
;
}
if
(
verbose
!=
0
)
...
...
@@ -446,6 +489,12 @@ int mbedtls_sha256_self_test( int verbose )
if
(
verbose
!=
0
)
mbedtls_printf
(
"
\n
"
);
goto
exit
;
fail:
if
(
verbose
!=
0
)
mbedtls_printf
(
"failed
\n
"
);
exit:
mbedtls_sha256_free
(
&
ctx
);
mbedtls_free
(
buf
);
...
...
app/mbedtls/library/sha512.c
View file @
c7673b02
...
...
@@ -114,7 +114,7 @@ void mbedtls_sha512_clone( mbedtls_sha512_context *dst,
/*
* SHA-512 context setup
*/
void
mbedtls_sha512_starts
(
mbedtls_sha512_context
*
ctx
,
int
is384
)
int
mbedtls_sha512_starts
_ret
(
mbedtls_sha512_context
*
ctx
,
int
is384
)
{
ctx
->
total
[
0
]
=
0
;
ctx
->
total
[
1
]
=
0
;
...
...
@@ -145,6 +145,8 @@ void mbedtls_sha512_starts( mbedtls_sha512_context *ctx, int is384 )
}
ctx
->
is384
=
is384
;
return
(
0
);
}
#if !defined(MBEDTLS_SHA512_PROCESS_ALT)
...
...
@@ -196,7 +198,8 @@ static const uint64_t K[80] =
UL64
(
0x5FCB6FAB3AD6FAEC
),
UL64
(
0x6C44198C4A475817
)
};
void
mbedtls_sha512_process
(
mbedtls_sha512_context
*
ctx
,
const
unsigned
char
data
[
128
]
)
int
mbedtls_internal_sha512_process
(
mbedtls_sha512_context
*
ctx
,
const
unsigned
char
data
[
128
]
)
{
int
i
;
uint64_t
temp1
,
temp2
,
W
[
80
];
...
...
@@ -263,20 +266,24 @@ void mbedtls_sha512_process( mbedtls_sha512_context *ctx, const unsigned char da
ctx
->
state
[
5
]
+=
F
;
ctx
->
state
[
6
]
+=
G
;
ctx
->
state
[
7
]
+=
H
;
return
(
0
);
}
#endif
/* !MBEDTLS_SHA512_PROCESS_ALT */
/*
* SHA-512 process buffer
*/
void
mbedtls_sha512_update
(
mbedtls_sha512_context
*
ctx
,
const
unsigned
char
*
input
,
int
mbedtls_sha512_update_ret
(
mbedtls_sha512_context
*
ctx
,
const
unsigned
char
*
input
,
size_t
ilen
)
{
int
ret
;
size_t
fill
;
unsigned
int
left
;
if
(
ilen
==
0
)
return
;
return
(
0
)
;
left
=
(
unsigned
int
)
(
ctx
->
total
[
0
]
&
0x7F
);
fill
=
128
-
left
;
...
...
@@ -289,7 +296,10 @@ void mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *in
if
(
left
&&
ilen
>=
fill
)
{
memcpy
(
(
void
*
)
(
ctx
->
buffer
+
left
),
input
,
fill
);
mbedtls_sha512_process
(
ctx
,
ctx
->
buffer
);
if
(
(
ret
=
mbedtls_internal_sha512_process
(
ctx
,
ctx
->
buffer
)
)
!=
0
)
return
(
ret
);
input
+=
fill
;
ilen
-=
fill
;
left
=
0
;
...
...
@@ -297,13 +307,17 @@ void mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *in
while
(
ilen
>=
128
)
{
mbedtls_sha512_process
(
ctx
,
input
);
if
(
(
ret
=
mbedtls_internal_sha512_process
(
ctx
,
input
)
)
!=
0
)
return
(
ret
);
input
+=
128
;
ilen
-=
128
;
}
if
(
ilen
>
0
)
memcpy
(
(
void
*
)
(
ctx
->
buffer
+
left
),
input
,
ilen
);
return
(
0
);
}
static
const
unsigned
char
sha512_padding
[
128
]
=
...
...
@@ -321,8 +335,10 @@ static const unsigned char sha512_padding[128] =
/*
* SHA-512 final digest
*/
void
mbedtls_sha512_finish
(
mbedtls_sha512_context
*
ctx
,
unsigned
char
output
[
64
]
)
int
mbedtls_sha512_finish_ret
(
mbedtls_sha512_context
*
ctx
,
unsigned
char
output
[
64
]
)
{
int
ret
;
size_t
last
,
padn
;
uint64_t
high
,
low
;
unsigned
char
msglen
[
16
];
...
...
@@ -337,8 +353,11 @@ void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64
last
=
(
size_t
)(
ctx
->
total
[
0
]
&
0x7F
);
padn
=
(
last
<
112
)
?
(
112
-
last
)
:
(
240
-
last
);
mbedtls_sha512_update
(
ctx
,
sha512_padding
,
padn
);
mbedtls_sha512_update
(
ctx
,
msglen
,
16
);
if
(
(
ret
=
mbedtls_sha512_update_ret
(
ctx
,
sha512_padding
,
padn
)
)
!=
0
)
return
(
ret
);
if
(
(
ret
=
mbedtls_sha512_update_ret
(
ctx
,
msglen
,
16
)
)
!=
0
)
return
(
ret
);
PUT_UINT64_BE
(
ctx
->
state
[
0
],
output
,
0
);
PUT_UINT64_BE
(
ctx
->
state
[
1
],
output
,
8
);
...
...
@@ -352,6 +371,8 @@ void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64
PUT_UINT64_BE
(
ctx
->
state
[
6
],
output
,
48
);
PUT_UINT64_BE
(
ctx
->
state
[
7
],
output
,
56
);
}
return
(
0
);
}
#endif
/* !MBEDTLS_SHA512_ALT */
...
...
@@ -359,16 +380,29 @@ void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64
/*
* output = SHA-512( input buffer )
*/
void
mbedtls_sha512
(
const
unsigned
char
*
input
,
size_t
ilen
,
unsigned
char
output
[
64
],
int
is384
)
int
mbedtls_sha512_ret
(
const
unsigned
char
*
input
,
size_t
ilen
,
unsigned
char
output
[
64
],
int
is384
)
{
int
ret
;
mbedtls_sha512_context
ctx
;
mbedtls_sha512_init
(
&
ctx
);
mbedtls_sha512_starts
(
&
ctx
,
is384
);
mbedtls_sha512_update
(
&
ctx
,
input
,
ilen
);
mbedtls_sha512_finish
(
&
ctx
,
output
);
if
(
(
ret
=
mbedtls_sha512_starts_ret
(
&
ctx
,
is384
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_sha512_update_ret
(
&
ctx
,
input
,
ilen
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_sha512_finish_ret
(
&
ctx
,
output
)
)
!=
0
)
goto
exit
;
exit:
mbedtls_sha512_free
(
&
ctx
);
return
(
ret
);
}
#if defined(MBEDTLS_SELF_TEST)
...
...
@@ -384,7 +418,7 @@ static const unsigned char sha512_test_buf[3][113] =
{
""
}
};
static
const
in
t
sha512_test_buflen
[
3
]
=
static
const
size_
t
sha512_test_buflen
[
3
]
=
{
3
,
112
,
1000
};
...
...
@@ -471,28 +505,35 @@ int mbedtls_sha512_self_test( int verbose )
if
(
verbose
!=
0
)
mbedtls_printf
(
" SHA-%d test #%d: "
,
512
-
k
*
128
,
j
+
1
);
mbedtls_sha512_starts
(
&
ctx
,
k
);
if
(
(
ret
=
mbedtls_sha512_starts_ret
(
&
ctx
,
k
)
)
!=
0
)
goto
fail
;
if
(
j
==
2
)
{
memset
(
buf
,
'a'
,
buflen
=
1000
);
for
(
j
=
0
;
j
<
1000
;
j
++
)
mbedtls_sha512_update
(
&
ctx
,
buf
,
buflen
);
{
ret
=
mbedtls_sha512_update_ret
(
&
ctx
,
buf
,
buflen
);
if
(
ret
!=
0
)
goto
fail
;
}
}
else
mbedtls_sha512_update
(
&
ctx
,
sha512_test_buf
[
j
],
{
ret
=
mbedtls_sha512_update_ret
(
&
ctx
,
sha512_test_buf
[
j
],
sha512_test_buflen
[
j
]
);
if
(
ret
!=
0
)
goto
fail
;
}
mbedtls_sha512_finish
(
&
ctx
,
sha512sum
);
if
(
(
ret
=
mbedtls_sha512_finish_ret
(
&
ctx
,
sha512sum
)
)
!=
0
)
goto
fail
;
if
(
memcmp
(
sha512sum
,
sha512_test_sum
[
i
],
64
-
k
*
16
)
!=
0
)
{
if
(
verbose
!=
0
)
mbedtls_printf
(
"failed
\n
"
);
ret
=
1
;
goto
exit
;
goto
fail
;
}
if
(
verbose
!=
0
)
...
...
@@ -502,6 +543,12 @@ int mbedtls_sha512_self_test( int verbose )
if
(
verbose
!=
0
)
mbedtls_printf
(
"
\n
"
);
goto
exit
;
fail:
if
(
verbose
!=
0
)
mbedtls_printf
(
"failed
\n
"
);
exit:
mbedtls_sha512_free
(
&
ctx
);
mbedtls_free
(
buf
);
...
...
app/mbedtls/library/ssl_cache.c
View file @
c7673b02
...
...
@@ -321,6 +321,7 @@ void mbedtls_ssl_cache_free( mbedtls_ssl_cache_context *cache )
#if defined(MBEDTLS_THREADING_C)
mbedtls_mutex_free
(
&
cache
->
mutex
);
#endif
cache
->
chain
=
NULL
;
}
#endif
/* MBEDTLS_SSL_CACHE_C */
app/mbedtls/library/ssl_cli.c
View file @
c7673b02
...
...
@@ -80,6 +80,13 @@ static void ssl_write_hostname_ext( mbedtls_ssl_context *ssl,
}
/*
* Sect. 3, RFC 6066 (TLS Extensions Definitions)
*
* In order to provide any of the server names, clients MAY include an
* extension of type "server_name" in the (extended) client hello. The
* "extension_data" field of this extension SHALL contain
* "ServerNameList" where:
*
* struct {
* NameType name_type;
* select (name_type) {
...
...
@@ -96,6 +103,7 @@ static void ssl_write_hostname_ext( mbedtls_ssl_context *ssl,
* struct {
* ServerName server_name_list<1..2^16-1>
* } ServerNameList;
*
*/
*
p
++
=
(
unsigned
char
)(
(
MBEDTLS_TLS_EXT_SERVERNAME
>>
8
)
&
0xFF
);
*
p
++
=
(
unsigned
char
)(
(
MBEDTLS_TLS_EXT_SERVERNAME
)
&
0xFF
);
...
...
@@ -126,6 +134,9 @@ static void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl,
*
olen
=
0
;
/* We're always including an TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the
* initial ClientHello, in which case also adding the renegotiation
* info extension is NOT RECOMMENDED as per RFC 5746 Section 3.4. */
if
(
ssl
->
renego_status
!=
MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS
)
return
;
...
...
@@ -963,6 +974,8 @@ static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
ext_len
+=
olen
;
#endif
/* Note that TLS_EMPTY_RENEGOTIATION_INFO_SCSV is always added
* even if MBEDTLS_SSL_RENEGOTIATION is not defined. */
#if defined(MBEDTLS_SSL_RENEGOTIATION)
ssl_write_renegotiation_ext
(
ssl
,
p
+
2
+
ext_len
,
&
olen
);
ext_len
+=
olen
;
...
...
@@ -1440,9 +1453,6 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
#endif
int
handshake_failure
=
0
;
const
mbedtls_ssl_ciphersuite_t
*
suite_info
;
#if defined(MBEDTLS_DEBUG_C)
uint32_t
t
;
#endif
MBEDTLS_SSL_DEBUG_MSG
(
2
,
(
"=> parse server hello"
)
);
...
...
@@ -1545,13 +1555,11 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
return
(
MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION
);
}
#if defined(MBEDTLS_DEBUG_C)
t
=
(
(
uint32_t
)
buf
[
2
]
<<
24
)
|
(
(
uint32_t
)
buf
[
3
]
<<
16
)
|
(
(
uint32_t
)
buf
[
4
]
<<
8
)
|
(
(
uint32_t
)
buf
[
5
]
);
MBEDTLS_SSL_DEBUG_MSG
(
3
,
(
"server hello, current time: %lu"
,
t
)
);
#endif
MBEDTLS_SSL_DEBUG_MSG
(
3
,
(
"server hello, current time: %lu"
,
(
(
uint32_t
)
buf
[
2
]
<<
24
)
|
(
(
uint32_t
)
buf
[
3
]
<<
16
)
|
(
(
uint32_t
)
buf
[
4
]
<<
8
)
|
(
(
uint32_t
)
buf
[
5
]
)
)
);
memcpy
(
ssl
->
handshake
->
randbytes
+
32
,
buf
+
2
,
32
);
...
...
@@ -2258,7 +2266,7 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
int
ret
;
const
mbedtls_ssl_ciphersuite_t
*
ciphersuite_info
=
ssl
->
transform_negotiate
->
ciphersuite_info
;
unsigned
char
*
p
,
*
end
;
unsigned
char
*
p
=
NULL
,
*
end
=
NULL
;
MBEDTLS_SSL_DEBUG_MSG
(
2
,
(
"=> parse server key exchange"
)
);
...
...
@@ -2490,39 +2498,11 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
defined(MBEDTLS_SSL_PROTO_TLS1_1)
if
(
md_alg
==
MBEDTLS_MD_NONE
)
{
mbedtls_md5_context
mbedtls_md5
;
mbedtls_sha1_context
mbedtls_sha1
;
mbedtls_md5_init
(
&
mbedtls_md5
);
mbedtls_sha1_init
(
&
mbedtls_sha1
);
hashlen
=
36
;
/*
* digitally-signed struct {
* opaque md5_hash[16];
* opaque sha_hash[20];
* };
*
* md5_hash
* MD5(ClientHello.random + ServerHello.random
* + ServerParams);
* sha_hash
* SHA(ClientHello.random + ServerHello.random
* + ServerParams);
*/
mbedtls_md5_starts
(
&
mbedtls_md5
);
mbedtls_md5_update
(
&
mbedtls_md5
,
ssl
->
handshake
->
randbytes
,
64
);
mbedtls_md5_update
(
&
mbedtls_md5
,
params
,
params_len
);
mbedtls_md5_finish
(
&
mbedtls_md5
,
hash
);
mbedtls_sha1_starts
(
&
mbedtls_sha1
);
mbedtls_sha1_update
(
&
mbedtls_sha1
,
ssl
->
handshake
->
randbytes
,
64
);
mbedtls_sha1_update
(
&
mbedtls_sha1
,
params
,
params_len
);
mbedtls_sha1_finish
(
&
mbedtls_sha1
,
hash
+
16
);
mbedtls_md5_free
(
&
mbedtls_md5
);
mbedtls_sha1_free
(
&
mbedtls_sha1
);
ret
=
mbedtls_ssl_get_key_exchange_md_ssl_tls
(
ssl
,
hash
,
params
,
params_len
);
if
(
ret
!=
0
)
return
(
ret
);
}
else
#endif
/* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
...
...
@@ -2531,35 +2511,13 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
defined(MBEDTLS_SSL_PROTO_TLS1_2)
if
(
md_alg
!=
MBEDTLS_MD_NONE
)
{
mbedtls_md_context_t
ctx
;
mbedtls_md_init
(
&
ctx
);
/* Info from md_alg will be used instead */
hashlen
=
0
;
/*
* digitally-signed struct {
* opaque client_random[32];
* opaque server_random[32];
* ServerDHParams params;
* };
*/
if
(
(
ret
=
mbedtls_md_setup
(
&
ctx
,
mbedtls_md_info_from_type
(
md_alg
),
0
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_md_setup"
,
ret
);
mbedtls_ssl_send_alert_message
(
ssl
,
MBEDTLS_SSL_ALERT_LEVEL_FATAL
,
MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR
);
ret
=
mbedtls_ssl_get_key_exchange_md_tls1_2
(
ssl
,
hash
,
params
,
params_len
,
md_alg
);
if
(
ret
!=
0
)
return
(
ret
);
}
mbedtls_md_starts
(
&
ctx
);
mbedtls_md_update
(
&
ctx
,
ssl
->
handshake
->
randbytes
,
64
);
mbedtls_md_update
(
&
ctx
,
params
,
params_len
);
mbedtls_md_finish
(
&
ctx
,
hash
);
mbedtls_md_free
(
&
ctx
);
}
else
#endif
/* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
MBEDTLS_SSL_PROTO_TLS1_2 */
...
...
app/mbedtls/library/ssl_srv.c
View file @
c7673b02
...
...
@@ -603,25 +603,22 @@ static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
}
/*
*
Use our order of preference
*
Validate peer's list (lengths)
*/
start
=
buf
+
2
;
end
=
buf
+
len
;
for
(
ours
=
ssl
->
conf
->
alpn_list
;
*
ours
!=
NULL
;
ours
++
)
{
ours_len
=
strlen
(
*
ours
);
for
(
theirs
=
start
;
theirs
!=
end
;
theirs
+=
cur_len
)
{
/* If the list is well formed, we should get equality first */
if
(
theirs
>
end
)
cur_len
=
*
theirs
++
;
/* Current identifier must fit in list */
if
(
cur_len
>
(
size_t
)(
end
-
theirs
)
)
{
mbedtls_ssl_send_alert_message
(
ssl
,
MBEDTLS_SSL_ALERT_LEVEL_FATAL
,
MBEDTLS_SSL_ALERT_MSG_
ILLEGAL_PARAMETE
R
);
MBEDTLS_SSL_ALERT_MSG_
DECODE_ERRO
R
);
return
(
MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO
);
}
cur_len
=
*
theirs
++
;
/* Empty strings MUST NOT be included */
if
(
cur_len
==
0
)
{
...
...
@@ -629,6 +626,17 @@ static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER
);
return
(
MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO
);
}
}
/*
* Use our order of preference
*/
for
(
ours
=
ssl
->
conf
->
alpn_list
;
*
ours
!=
NULL
;
ours
++
)
{
ours_len
=
strlen
(
*
ours
);
for
(
theirs
=
start
;
theirs
!=
end
;
theirs
+=
cur_len
)
{
cur_len
=
*
theirs
++
;
if
(
cur_len
==
ours_len
&&
memcmp
(
theirs
,
*
ours
,
cur_len
)
==
0
)
...
...
@@ -2042,7 +2050,7 @@ static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
const
mbedtls_ssl_ciphersuite_t
*
suite
=
NULL
;
const
mbedtls_cipher_info_t
*
cipher
=
NULL
;
if
(
ssl
->
session_negotiate
->
encrypt_then_mac
==
MBEDTLS_SSL_E
XTENDED_MS
_DISABLED
||
if
(
ssl
->
session_negotiate
->
encrypt_then_mac
==
MBEDTLS_SSL_E
TM
_DISABLED
||
ssl
->
minor_ver
==
MBEDTLS_SSL_MINOR_VERSION_0
)
{
*
olen
=
0
;
...
...
@@ -2937,10 +2945,11 @@ static int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl )
* opaque dh_Ys<1..2^16-1>;
* } ServerDHParams;
*/
if
(
(
ret
=
mbedtls_mpi_copy
(
&
ssl
->
handshake
->
dhm_ctx
.
P
,
&
ssl
->
conf
->
dhm_P
)
)
!=
0
||
(
ret
=
mbedtls_mpi_copy
(
&
ssl
->
handshake
->
dhm_ctx
.
G
,
&
ssl
->
conf
->
dhm_G
)
)
!=
0
)
if
(
(
ret
=
mbedtls_dhm_set_group
(
&
ssl
->
handshake
->
dhm_ctx
,
&
ssl
->
conf
->
dhm_P
,
&
ssl
->
conf
->
dhm_G
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_
mpi_copy
"
,
ret
);
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_
dhm_set_group
"
,
ret
);
return
(
ret
);
}
...
...
@@ -3093,40 +3102,12 @@ curve_matching_done:
defined(MBEDTLS_SSL_PROTO_TLS1_1)
if
(
md_alg
==
MBEDTLS_MD_NONE
)
{
mbedtls_md5_context
mbedtls_md5
;
mbedtls_sha1_context
mbedtls_sha1
;
mbedtls_md5_init
(
&
mbedtls_md5
);
mbedtls_sha1_init
(
&
mbedtls_sha1
);
/*
* digitally-signed struct {
* opaque md5_hash[16];
* opaque sha_hash[20];
* };
*
* md5_hash
* MD5(ClientHello.random + ServerHello.random
* + ServerParams);
* sha_hash
* SHA(ClientHello.random + ServerHello.random
* + ServerParams);
*/
mbedtls_md5_starts
(
&
mbedtls_md5
);
mbedtls_md5_update
(
&
mbedtls_md5
,
ssl
->
handshake
->
randbytes
,
64
);
mbedtls_md5_update
(
&
mbedtls_md5
,
dig_signed
,
dig_signed_len
);
mbedtls_md5_finish
(
&
mbedtls_md5
,
hash
);
mbedtls_sha1_starts
(
&
mbedtls_sha1
);
mbedtls_sha1_update
(
&
mbedtls_sha1
,
ssl
->
handshake
->
randbytes
,
64
);
mbedtls_sha1_update
(
&
mbedtls_sha1
,
dig_signed
,
dig_signed_len
);
mbedtls_sha1_finish
(
&
mbedtls_sha1
,
hash
+
16
);
hashlen
=
36
;
mbedtls_md5_free
(
&
mbedtls_md5
);
mbedtls_sha1_free
(
&
mbedtls_sha1
);
ret
=
mbedtls_ssl_get_key_exchange_md_ssl_tls
(
ssl
,
hash
,
dig_signed
,
dig_signed_len
);
if
(
ret
!=
0
)
return
(
ret
);
}
else
#endif
/* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
...
...
@@ -3135,33 +3116,15 @@ curve_matching_done:
defined(MBEDTLS_SSL_PROTO_TLS1_2)
if
(
md_alg
!=
MBEDTLS_MD_NONE
)
{
mbedtls_md_context_t
ctx
;
const
mbedtls_md_info_t
*
md_info
=
mbedtls_md_info_from_type
(
md_alg
);
mbedtls_md_init
(
&
ctx
);
/* Info from md_alg will be used instead */
hashlen
=
0
;
/*
* digitally-signed struct {
* opaque client_random[32];
* opaque server_random[32];
* ServerDHParams params;
* };
*/
if
(
(
ret
=
mbedtls_md_setup
(
&
ctx
,
md_info
,
0
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_md_setup"
,
ret
);
ret
=
mbedtls_ssl_get_key_exchange_md_tls1_2
(
ssl
,
hash
,
dig_signed
,
dig_signed_len
,
md_alg
);
if
(
ret
!=
0
)
return
(
ret
);
}
mbedtls_md_starts
(
&
ctx
);
mbedtls_md_update
(
&
ctx
,
ssl
->
handshake
->
randbytes
,
64
);
mbedtls_md_update
(
&
ctx
,
dig_signed
,
dig_signed_len
);
mbedtls_md_finish
(
&
ctx
,
hash
);
mbedtls_md_free
(
&
ctx
);
}
else
#endif
/* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
MBEDTLS_SSL_PROTO_TLS1_2 */
...
...
@@ -3433,7 +3396,7 @@ static int ssl_parse_client_psk_identity( mbedtls_ssl_context *ssl, unsigned cha
/*
* Receive client pre-shared key identity name
*/
if
(
*
p
+
2
>
end
)
if
(
end
-
*
p
<
2
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"bad client key exchange message"
)
);
return
(
MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE
);
...
...
@@ -3442,7 +3405,7 @@ static int ssl_parse_client_psk_identity( mbedtls_ssl_context *ssl, unsigned cha
n
=
(
(
*
p
)[
0
]
<<
8
)
|
(
*
p
)[
1
];
*
p
+=
2
;
if
(
n
<
1
||
n
>
65535
||
*
p
+
n
>
end
)
if
(
n
<
1
||
n
>
65535
||
n
>
(
size_t
)
(
end
-
*
p
)
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"bad client key exchange message"
)
);
return
(
MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE
);
...
...
app/mbedtls/library/ssl_tls.c
View file @
c7673b02
...
...
@@ -221,6 +221,7 @@ static int ssl3_prf( const unsigned char *secret, size_t slen,
const
unsigned
char
*
random
,
size_t
rlen
,
unsigned
char
*
dstbuf
,
size_t
dlen
)
{
int
ret
=
0
;
size_t
i
;
mbedtls_md5_context
md5
;
mbedtls_sha1_context
sha1
;
...
...
@@ -243,25 +244,35 @@ static int ssl3_prf( const unsigned char *secret, size_t slen,
{
memset
(
padding
,
(
unsigned
char
)
(
'A'
+
i
),
1
+
i
);
mbedtls_sha1_starts
(
&
sha1
);
mbedtls_sha1_update
(
&
sha1
,
padding
,
1
+
i
);
mbedtls_sha1_update
(
&
sha1
,
secret
,
slen
);
mbedtls_sha1_update
(
&
sha1
,
random
,
rlen
);
mbedtls_sha1_finish
(
&
sha1
,
sha1sum
);
mbedtls_md5_starts
(
&
md5
);
mbedtls_md5_update
(
&
md5
,
secret
,
slen
);
mbedtls_md5_update
(
&
md5
,
sha1sum
,
20
);
mbedtls_md5_finish
(
&
md5
,
dstbuf
+
i
*
16
);
}
if
(
(
ret
=
mbedtls_sha1_starts_ret
(
&
sha1
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_sha1_update_ret
(
&
sha1
,
padding
,
1
+
i
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_sha1_update_ret
(
&
sha1
,
secret
,
slen
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_sha1_update_ret
(
&
sha1
,
random
,
rlen
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_sha1_finish_ret
(
&
sha1
,
sha1sum
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_md5_starts_ret
(
&
md5
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_md5_update_ret
(
&
md5
,
secret
,
slen
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_md5_update_ret
(
&
md5
,
sha1sum
,
20
)
)
!=
0
)
goto
exit
;
if
(
(
ret
=
mbedtls_md5_finish_ret
(
&
md5
,
dstbuf
+
i
*
16
)
)
!=
0
)
goto
exit
;
}
exit:
mbedtls_md5_free
(
&
md5
);
mbedtls_sha1_free
(
&
sha1
);
mbedtls_zeroize
(
padding
,
sizeof
(
padding
)
);
mbedtls_zeroize
(
sha1sum
,
sizeof
(
sha1sum
)
);
return
(
0
);
return
(
ret
);
}
#endif
/* MBEDTLS_SSL_PROTO_SSL3 */
...
...
@@ -978,25 +989,25 @@ void ssl_calc_verify_ssl( mbedtls_ssl_context *ssl, unsigned char hash[36] )
memset
(
pad_1
,
0x36
,
48
);
memset
(
pad_2
,
0x5C
,
48
);
mbedtls_md5_update
(
&
md5
,
ssl
->
session_negotiate
->
master
,
48
);
mbedtls_md5_update
(
&
md5
,
pad_1
,
48
);
mbedtls_md5_finish
(
&
md5
,
hash
);
mbedtls_md5_update
_ret
(
&
md5
,
ssl
->
session_negotiate
->
master
,
48
);
mbedtls_md5_update
_ret
(
&
md5
,
pad_1
,
48
);
mbedtls_md5_finish
_ret
(
&
md5
,
hash
);
mbedtls_md5_starts
(
&
md5
);
mbedtls_md5_update
(
&
md5
,
ssl
->
session_negotiate
->
master
,
48
);
mbedtls_md5_update
(
&
md5
,
pad_2
,
48
);
mbedtls_md5_update
(
&
md5
,
hash
,
16
);
mbedtls_md5_finish
(
&
md5
,
hash
);
mbedtls_md5_starts
_ret
(
&
md5
);
mbedtls_md5_update
_ret
(
&
md5
,
ssl
->
session_negotiate
->
master
,
48
);
mbedtls_md5_update
_ret
(
&
md5
,
pad_2
,
48
);
mbedtls_md5_update
_ret
(
&
md5
,
hash
,
16
);
mbedtls_md5_finish
_ret
(
&
md5
,
hash
);
mbedtls_sha1_update
(
&
sha1
,
ssl
->
session_negotiate
->
master
,
48
);
mbedtls_sha1_update
(
&
sha1
,
pad_1
,
40
);
mbedtls_sha1_finish
(
&
sha1
,
hash
+
16
);
mbedtls_sha1_update
_ret
(
&
sha1
,
ssl
->
session_negotiate
->
master
,
48
);
mbedtls_sha1_update
_ret
(
&
sha1
,
pad_1
,
40
);
mbedtls_sha1_finish
_ret
(
&
sha1
,
hash
+
16
);
mbedtls_sha1_starts
(
&
sha1
);
mbedtls_sha1_update
(
&
sha1
,
ssl
->
session_negotiate
->
master
,
48
);
mbedtls_sha1_update
(
&
sha1
,
pad_2
,
40
);
mbedtls_sha1_update
(
&
sha1
,
hash
+
16
,
20
);
mbedtls_sha1_finish
(
&
sha1
,
hash
+
16
);
mbedtls_sha1_starts
_ret
(
&
sha1
);
mbedtls_sha1_update
_ret
(
&
sha1
,
ssl
->
session_negotiate
->
master
,
48
);
mbedtls_sha1_update
_ret
(
&
sha1
,
pad_2
,
40
);
mbedtls_sha1_update
_ret
(
&
sha1
,
hash
+
16
,
20
);
mbedtls_sha1_finish
_ret
(
&
sha1
,
hash
+
16
);
MBEDTLS_SSL_DEBUG_BUF
(
3
,
"calculated verify result"
,
hash
,
36
);
MBEDTLS_SSL_DEBUG_MSG
(
2
,
(
"<= calc verify"
)
);
...
...
@@ -1022,8 +1033,8 @@ void ssl_calc_verify_tls( mbedtls_ssl_context *ssl, unsigned char hash[36] )
mbedtls_md5_clone
(
&
md5
,
&
ssl
->
handshake
->
fin_md5
);
mbedtls_sha1_clone
(
&
sha1
,
&
ssl
->
handshake
->
fin_sha1
);
mbedtls_md5_finish
(
&
md5
,
hash
);
mbedtls_sha1_finish
(
&
sha1
,
hash
+
16
);
mbedtls_md5_finish
_ret
(
&
md5
,
hash
);
mbedtls_sha1_finish
_ret
(
&
sha1
,
hash
+
16
);
MBEDTLS_SSL_DEBUG_BUF
(
3
,
"calculated verify result"
,
hash
,
36
);
MBEDTLS_SSL_DEBUG_MSG
(
2
,
(
"<= calc verify"
)
);
...
...
@@ -1046,7 +1057,7 @@ void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *ssl, unsigned char hash[32
MBEDTLS_SSL_DEBUG_MSG
(
2
,
(
"=> calc verify sha256"
)
);
mbedtls_sha256_clone
(
&
sha256
,
&
ssl
->
handshake
->
fin_sha256
);
mbedtls_sha256_finish
(
&
sha256
,
hash
);
mbedtls_sha256_finish
_ret
(
&
sha256
,
hash
);
MBEDTLS_SSL_DEBUG_BUF
(
3
,
"calculated verify result"
,
hash
,
32
);
MBEDTLS_SSL_DEBUG_MSG
(
2
,
(
"<= calc verify"
)
);
...
...
@@ -1067,7 +1078,7 @@ void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *ssl, unsigned char hash[48
MBEDTLS_SSL_DEBUG_MSG
(
2
,
(
"=> calc verify sha384"
)
);
mbedtls_sha512_clone
(
&
sha512
,
&
ssl
->
handshake
->
fin_sha512
);
mbedtls_sha512_finish
(
&
sha512
,
hash
);
mbedtls_sha512_finish
_ret
(
&
sha512
,
hash
);
MBEDTLS_SSL_DEBUG_BUF
(
3
,
"calculated verify result"
,
hash
,
48
);
MBEDTLS_SSL_DEBUG_MSG
(
2
,
(
"<= calc verify"
)
);
...
...
@@ -1203,9 +1214,12 @@ int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exch
/*
* SSLv3.0 MAC functions
*/
static
void
ssl_mac
(
mbedtls_md_context_t
*
md_ctx
,
unsigned
char
*
secret
,
unsigned
char
*
buf
,
size_t
len
,
unsigned
char
*
ctr
,
int
type
)
#define SSL_MAC_MAX_BYTES 20
/* MD-5 or SHA-1 */
static
void
ssl_mac
(
mbedtls_md_context_t
*
md_ctx
,
const
unsigned
char
*
secret
,
const
unsigned
char
*
buf
,
size_t
len
,
const
unsigned
char
*
ctr
,
int
type
,
unsigned
char
out
[
SSL_MAC_MAX_BYTES
]
)
{
unsigned
char
header
[
11
];
unsigned
char
padding
[
48
];
...
...
@@ -1230,14 +1244,14 @@ static void ssl_mac( mbedtls_md_context_t *md_ctx, unsigned char *secret,
mbedtls_md_update
(
md_ctx
,
padding
,
padlen
);
mbedtls_md_update
(
md_ctx
,
header
,
11
);
mbedtls_md_update
(
md_ctx
,
buf
,
len
);
mbedtls_md_finish
(
md_ctx
,
buf
+
len
);
mbedtls_md_finish
(
md_ctx
,
out
);
memset
(
padding
,
0x5C
,
padlen
);
mbedtls_md_starts
(
md_ctx
);
mbedtls_md_update
(
md_ctx
,
secret
,
md_size
);
mbedtls_md_update
(
md_ctx
,
padding
,
padlen
);
mbedtls_md_update
(
md_ctx
,
buf
+
len
,
md_size
);
mbedtls_md_finish
(
md_ctx
,
buf
+
len
);
mbedtls_md_update
(
md_ctx
,
out
,
md_size
);
mbedtls_md_finish
(
md_ctx
,
out
);
}
#endif
/* MBEDTLS_SSL_PROTO_SSL3 */
...
...
@@ -1268,6 +1282,14 @@ static int ssl_encrypt_buf( mbedtls_ssl_context *ssl )
MBEDTLS_SSL_DEBUG_BUF
(
4
,
"before encrypt: output payload"
,
ssl
->
out_msg
,
ssl
->
out_msglen
);
if
(
ssl
->
out_msglen
>
MBEDTLS_SSL_MAX_CONTENT_LEN
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"Record content %u too large, maximum %d"
,
(
unsigned
)
ssl
->
out_msglen
,
MBEDTLS_SSL_MAX_CONTENT_LEN
)
);
return
(
MBEDTLS_ERR_SSL_BAD_INPUT_DATA
);
}
/*
* Add MAC before if needed
*/
...
...
@@ -1282,10 +1304,15 @@ static int ssl_encrypt_buf( mbedtls_ssl_context *ssl )
#if defined(MBEDTLS_SSL_PROTO_SSL3)
if
(
ssl
->
minor_ver
==
MBEDTLS_SSL_MINOR_VERSION_0
)
{
unsigned
char
mac
[
SSL_MAC_MAX_BYTES
];
ssl_mac
(
&
ssl
->
transform_out
->
md_ctx_enc
,
ssl
->
transform_out
->
mac_enc
,
ssl
->
out_msg
,
ssl
->
out_msglen
,
ssl
->
out_ctr
,
ssl
->
out_msgtype
);
ssl
->
out_ctr
,
ssl
->
out_msgtype
,
mac
);
memcpy
(
ssl
->
out_msg
+
ssl
->
out_msglen
,
mac
,
ssl
->
transform_out
->
maclen
);
}
else
#endif
...
...
@@ -1293,14 +1320,17 @@ static int ssl_encrypt_buf( mbedtls_ssl_context *ssl )
defined(MBEDTLS_SSL_PROTO_TLS1_2)
if
(
ssl
->
minor_ver
>=
MBEDTLS_SSL_MINOR_VERSION_1
)
{
unsigned
char
mac
[
MBEDTLS_SSL_MAC_ADD
];
mbedtls_md_hmac_update
(
&
ssl
->
transform_out
->
md_ctx_enc
,
ssl
->
out_ctr
,
8
);
mbedtls_md_hmac_update
(
&
ssl
->
transform_out
->
md_ctx_enc
,
ssl
->
out_hdr
,
3
);
mbedtls_md_hmac_update
(
&
ssl
->
transform_out
->
md_ctx_enc
,
ssl
->
out_len
,
2
);
mbedtls_md_hmac_update
(
&
ssl
->
transform_out
->
md_ctx_enc
,
ssl
->
out_msg
,
ssl
->
out_msglen
);
mbedtls_md_hmac_finish
(
&
ssl
->
transform_out
->
md_ctx_enc
,
ssl
->
out_msg
+
ssl
->
out_msglen
);
mbedtls_md_hmac_finish
(
&
ssl
->
transform_out
->
md_ctx_enc
,
mac
);
mbedtls_md_hmac_reset
(
&
ssl
->
transform_out
->
md_ctx_enc
);
memcpy
(
ssl
->
out_msg
+
ssl
->
out_msglen
,
mac
,
ssl
->
transform_out
->
maclen
);
}
else
#endif
...
...
@@ -1562,8 +1592,6 @@ static int ssl_encrypt_buf( mbedtls_ssl_context *ssl )
return
(
0
);
}
#define SSL_MAX_MAC_SIZE 48
static
int
ssl_decrypt_buf
(
mbedtls_ssl_context
*
ssl
)
{
size_t
i
;
...
...
@@ -1731,7 +1759,7 @@ static int ssl_decrypt_buf( mbedtls_ssl_context *ssl )
#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
if
(
ssl
->
session_in
->
encrypt_then_mac
==
MBEDTLS_SSL_ETM_ENABLED
)
{
unsigned
char
computed_mac
[
SSL_MAX_MAC_SIZE
];
unsigned
char
mac_expect
[
MBEDTLS_SSL_MAC_ADD
];
unsigned
char
pseudo_hdr
[
13
];
MBEDTLS_SSL_DEBUG_MSG
(
3
,
(
"using encrypt then mac"
)
);
...
...
@@ -1749,15 +1777,15 @@ static int ssl_decrypt_buf( mbedtls_ssl_context *ssl )
mbedtls_md_hmac_update
(
&
ssl
->
transform_in
->
md_ctx_dec
,
pseudo_hdr
,
13
);
mbedtls_md_hmac_update
(
&
ssl
->
transform_in
->
md_ctx_dec
,
ssl
->
in_iv
,
ssl
->
in_msglen
);
mbedtls_md_hmac_finish
(
&
ssl
->
transform_in
->
md_ctx_dec
,
computed_mac
);
mbedtls_md_hmac_finish
(
&
ssl
->
transform_in
->
md_ctx_dec
,
mac_expect
);
mbedtls_md_hmac_reset
(
&
ssl
->
transform_in
->
md_ctx_dec
);
MBEDTLS_SSL_DEBUG_BUF
(
4
,
"message mac"
,
ssl
->
in_iv
+
ssl
->
in_msglen
,
ssl
->
transform_in
->
maclen
);
MBEDTLS_SSL_DEBUG_BUF
(
4
,
"
compu
ted mac"
,
computed_mac
,
MBEDTLS_SSL_DEBUG_BUF
(
4
,
"
expec
ted mac"
,
mac_expect
,
ssl
->
transform_in
->
maclen
);
if
(
mbedtls_ssl_safer_memcmp
(
ssl
->
in_iv
+
ssl
->
in_msglen
,
computed_mac
,
if
(
mbedtls_ssl_safer_memcmp
(
ssl
->
in_iv
+
ssl
->
in_msglen
,
mac_expect
,
ssl
->
transform_in
->
maclen
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"message mac does not match"
)
);
...
...
@@ -1918,22 +1946,21 @@ static int ssl_decrypt_buf( mbedtls_ssl_context *ssl )
#if defined(SSL_SOME_MODES_USE_MAC)
if
(
auth_done
==
0
)
{
unsigned
char
tmp
[
SSL_MAX
_MAC_
SIZE
];
unsigned
char
mac_expect
[
MBEDTLS_SSL
_MAC_
ADD
];
ssl
->
in_msglen
-=
ssl
->
transform_in
->
maclen
;
ssl
->
in_len
[
0
]
=
(
unsigned
char
)(
ssl
->
in_msglen
>>
8
);
ssl
->
in_len
[
1
]
=
(
unsigned
char
)(
ssl
->
in_msglen
);
memcpy
(
tmp
,
ssl
->
in_msg
+
ssl
->
in_msglen
,
ssl
->
transform_in
->
maclen
);
#if defined(MBEDTLS_SSL_PROTO_SSL3)
if
(
ssl
->
minor_ver
==
MBEDTLS_SSL_MINOR_VERSION_0
)
{
ssl_mac
(
&
ssl
->
transform_in
->
md_ctx_dec
,
ssl
->
transform_in
->
mac_dec
,
ssl
->
in_msg
,
ssl
->
in_msglen
,
ssl
->
in_ctr
,
ssl
->
in_msgtype
);
ssl
->
in_ctr
,
ssl
->
in_msgtype
,
mac_expect
);
}
else
#endif
/* MBEDTLS_SSL_PROTO_SSL3 */
...
...
@@ -1965,8 +1992,7 @@ static int ssl_decrypt_buf( mbedtls_ssl_context *ssl )
mbedtls_md_hmac_update
(
&
ssl
->
transform_in
->
md_ctx_dec
,
ssl
->
in_len
,
2
);
mbedtls_md_hmac_update
(
&
ssl
->
transform_in
->
md_ctx_dec
,
ssl
->
in_msg
,
ssl
->
in_msglen
);
mbedtls_md_hmac_finish
(
&
ssl
->
transform_in
->
md_ctx_dec
,
ssl
->
in_msg
+
ssl
->
in_msglen
);
mbedtls_md_hmac_finish
(
&
ssl
->
transform_in
->
md_ctx_dec
,
mac_expect
);
/* Call mbedtls_md_process at least once due to cache attacks */
for
(
j
=
0
;
j
<
extra_run
+
1
;
j
++
)
mbedtls_md_process
(
&
ssl
->
transform_in
->
md_ctx_dec
,
ssl
->
in_msg
);
...
...
@@ -1981,11 +2007,11 @@ static int ssl_decrypt_buf( mbedtls_ssl_context *ssl )
return
(
MBEDTLS_ERR_SSL_INTERNAL_ERROR
);
}
MBEDTLS_SSL_DEBUG_BUF
(
4
,
"
message mac"
,
tmp
,
ssl
->
transform_in
->
maclen
);
MBEDTLS_SSL_DEBUG_BUF
(
4
,
"
computed
mac"
,
ssl
->
in_msg
+
ssl
->
in_msglen
,
MBEDTLS_SSL_DEBUG_BUF
(
4
,
"
expected mac"
,
mac_expect
,
ssl
->
transform_in
->
maclen
);
MBEDTLS_SSL_DEBUG_BUF
(
4
,
"
message
mac"
,
ssl
->
in_msg
+
ssl
->
in_msglen
,
ssl
->
transform_in
->
maclen
);
if
(
mbedtls_ssl_safer_memcmp
(
tmp
,
ssl
->
in_msg
+
ssl
->
in_msglen
,
if
(
mbedtls_ssl_safer_memcmp
(
ssl
->
in_msg
+
ssl
->
in_msglen
,
mac_expect
,
ssl
->
transform_in
->
maclen
)
!=
0
)
{
#if defined(MBEDTLS_SSL_DEBUG_ALL)
...
...
@@ -2735,6 +2761,15 @@ int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl )
if
(
ssl
->
conf
->
transport
==
MBEDTLS_SSL_TRANSPORT_DATAGRAM
)
{
/* Make room for the additional DTLS fields */
if
(
MBEDTLS_SSL_MAX_CONTENT_LEN
-
ssl
->
out_msglen
<
8
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"DTLS handshake message too large: "
"size %u, maximum %u"
,
(
unsigned
)
(
ssl
->
in_hslen
-
4
),
(
unsigned
)
(
MBEDTLS_SSL_MAX_CONTENT_LEN
-
12
)
)
);
return
(
MBEDTLS_ERR_SSL_BAD_INPUT_DATA
);
}
memmove
(
ssl
->
out_msg
+
12
,
ssl
->
out_msg
+
4
,
len
-
4
);
ssl
->
out_msglen
+=
8
;
len
+=
8
;
...
...
@@ -3493,8 +3528,15 @@ static int ssl_parse_record_header( mbedtls_ssl_context *ssl )
ssl
->
in_msgtype
!=
MBEDTLS_SSL_MSG_APPLICATION_DATA
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"unknown record type"
)
);
#if defined(MBEDTLS_SSL_PROTO_DTLS)
/* Silently ignore invalid DTLS records as recommended by RFC 6347
* Section 4.1.2.7 */
if
(
ssl
->
conf
->
transport
!=
MBEDTLS_SSL_TRANSPORT_DATAGRAM
)
#endif
/* MBEDTLS_SSL_PROTO_DTLS */
mbedtls_ssl_send_alert_message
(
ssl
,
MBEDTLS_SSL_ALERT_LEVEL_FATAL
,
MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE
);
return
(
MBEDTLS_ERR_SSL_INVALID_RECORD
);
}
...
...
@@ -3515,7 +3557,7 @@ static int ssl_parse_record_header( mbedtls_ssl_context *ssl )
if
(
ssl
->
in_msglen
>
MBEDTLS_SSL_BUFFER_LEN
-
(
size_t
)(
ssl
->
in_msg
-
ssl
->
in_buf
)
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"bad message length
: in_msglen=%d"
,
ssl
->
in_msglen
)
);
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"bad message length
"
)
);
return
(
MBEDTLS_ERR_SSL_INVALID_RECORD
);
}
...
...
@@ -3525,7 +3567,7 @@ static int ssl_parse_record_header( mbedtls_ssl_context *ssl )
if
(
ssl
->
in_msglen
<
1
||
ssl
->
in_msglen
>
MBEDTLS_SSL_MAX_CONTENT_LEN
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"bad message length
: in_msglen=%d"
,
ssl
->
in_msglen
)
);
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"bad message length
"
)
);
return
(
MBEDTLS_ERR_SSL_INVALID_RECORD
);
}
}
...
...
@@ -3533,7 +3575,7 @@ static int ssl_parse_record_header( mbedtls_ssl_context *ssl )
{
if
(
ssl
->
in_msglen
<
ssl
->
transform_in
->
minlen
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"bad message length
: in_msglen=%d"
,
ssl
->
in_msglen
)
);
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"bad message length
"
)
);
return
(
MBEDTLS_ERR_SSL_INVALID_RECORD
);
}
...
...
@@ -3554,7 +3596,7 @@ static int ssl_parse_record_header( mbedtls_ssl_context *ssl )
ssl
->
in_msglen
>
ssl
->
transform_in
->
minlen
+
MBEDTLS_SSL_MAX_CONTENT_LEN
+
256
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"bad message length
: in_msglen=%d"
,
ssl
->
in_msglen
)
);
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"bad message length
"
)
);
return
(
MBEDTLS_ERR_SSL_INVALID_RECORD
);
}
#endif
...
...
@@ -3678,7 +3720,7 @@ static int ssl_prepare_record_content( mbedtls_ssl_context *ssl )
if
(
ssl
->
in_msglen
>
MBEDTLS_SSL_MAX_CONTENT_LEN
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"bad message length
: in_msglen=%d"
,
ssl
->
in_msglen
)
);
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"bad message length
"
)
);
return
(
MBEDTLS_ERR_SSL_INVALID_RECORD
);
}
}
...
...
@@ -4584,7 +4626,6 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
if
(
ret
!=
0
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"x509_verify_cert flags: %d"
,
ssl
->
session_negotiate
->
verify_result
)
);
MBEDTLS_SSL_DEBUG_RET
(
1
,
"x509_verify_cert"
,
ret
);
}
...
...
@@ -4837,15 +4878,15 @@ void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl )
{
#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
defined(MBEDTLS_SSL_PROTO_TLS1_1)
mbedtls_md5_starts
(
&
ssl
->
handshake
->
fin_md5
);
mbedtls_sha1_starts
(
&
ssl
->
handshake
->
fin_sha1
);
mbedtls_md5_starts
_ret
(
&
ssl
->
handshake
->
fin_md5
);
mbedtls_sha1_starts
_ret
(
&
ssl
->
handshake
->
fin_sha1
);
#endif
#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
#if defined(MBEDTLS_SHA256_C)
mbedtls_sha256_starts
(
&
ssl
->
handshake
->
fin_sha256
,
0
);
mbedtls_sha256_starts
_ret
(
&
ssl
->
handshake
->
fin_sha256
,
0
);
#endif
#if defined(MBEDTLS_SHA512_C)
mbedtls_sha512_starts
(
&
ssl
->
handshake
->
fin_sha512
,
1
);
mbedtls_sha512_starts
_ret
(
&
ssl
->
handshake
->
fin_sha512
,
1
);
#endif
#endif
/* MBEDTLS_SSL_PROTO_TLS1_2 */
}
...
...
@@ -4855,15 +4896,15 @@ static void ssl_update_checksum_start( mbedtls_ssl_context *ssl,
{
#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
defined(MBEDTLS_SSL_PROTO_TLS1_1)
mbedtls_md5_update
(
&
ssl
->
handshake
->
fin_md5
,
buf
,
len
);
mbedtls_sha1_update
(
&
ssl
->
handshake
->
fin_sha1
,
buf
,
len
);
mbedtls_md5_update
_ret
(
&
ssl
->
handshake
->
fin_md5
,
buf
,
len
);
mbedtls_sha1_update
_ret
(
&
ssl
->
handshake
->
fin_sha1
,
buf
,
len
);
#endif
#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
#if defined(MBEDTLS_SHA256_C)
mbedtls_sha256_update
(
&
ssl
->
handshake
->
fin_sha256
,
buf
,
len
);
mbedtls_sha256_update
_ret
(
&
ssl
->
handshake
->
fin_sha256
,
buf
,
len
);
#endif
#if defined(MBEDTLS_SHA512_C)
mbedtls_sha512_update
(
&
ssl
->
handshake
->
fin_sha512
,
buf
,
len
);
mbedtls_sha512_update
_ret
(
&
ssl
->
handshake
->
fin_sha512
,
buf
,
len
);
#endif
#endif
/* MBEDTLS_SSL_PROTO_TLS1_2 */
}
...
...
@@ -4873,8 +4914,8 @@ static void ssl_update_checksum_start( mbedtls_ssl_context *ssl,
static
void
ssl_update_checksum_md5sha1
(
mbedtls_ssl_context
*
ssl
,
const
unsigned
char
*
buf
,
size_t
len
)
{
mbedtls_md5_update
(
&
ssl
->
handshake
->
fin_md5
,
buf
,
len
);
mbedtls_sha1_update
(
&
ssl
->
handshake
->
fin_sha1
,
buf
,
len
);
mbedtls_md5_update
_ret
(
&
ssl
->
handshake
->
fin_md5
,
buf
,
len
);
mbedtls_sha1_update
_ret
(
&
ssl
->
handshake
->
fin_sha1
,
buf
,
len
);
}
#endif
...
...
@@ -4883,7 +4924,7 @@ static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *ssl,
static
void
ssl_update_checksum_sha256
(
mbedtls_ssl_context
*
ssl
,
const
unsigned
char
*
buf
,
size_t
len
)
{
mbedtls_sha256_update
(
&
ssl
->
handshake
->
fin_sha256
,
buf
,
len
);
mbedtls_sha256_update
_ret
(
&
ssl
->
handshake
->
fin_sha256
,
buf
,
len
);
}
#endif
...
...
@@ -4891,7 +4932,7 @@ static void ssl_update_checksum_sha256( mbedtls_ssl_context *ssl,
static
void
ssl_update_checksum_sha384
(
mbedtls_ssl_context
*
ssl
,
const
unsigned
char
*
buf
,
size_t
len
)
{
mbedtls_sha512_update
(
&
ssl
->
handshake
->
fin_sha512
,
buf
,
len
);
mbedtls_sha512_update
_ret
(
&
ssl
->
handshake
->
fin_sha512
,
buf
,
len
);
}
#endif
#endif
/* MBEDTLS_SSL_PROTO_TLS1_2 */
...
...
@@ -4944,29 +4985,29 @@ static void ssl_calc_finished_ssl(
memset
(
padbuf
,
0x36
,
48
);
mbedtls_md5_update
(
&
md5
,
(
const
unsigned
char
*
)
sender
,
4
);
mbedtls_md5_update
(
&
md5
,
session
->
master
,
48
);
mbedtls_md5_update
(
&
md5
,
padbuf
,
48
);
mbedtls_md5_finish
(
&
md5
,
md5sum
);
mbedtls_md5_update
_ret
(
&
md5
,
(
const
unsigned
char
*
)
sender
,
4
);
mbedtls_md5_update
_ret
(
&
md5
,
session
->
master
,
48
);
mbedtls_md5_update
_ret
(
&
md5
,
padbuf
,
48
);
mbedtls_md5_finish
_ret
(
&
md5
,
md5sum
);
mbedtls_sha1_update
(
&
sha1
,
(
const
unsigned
char
*
)
sender
,
4
);
mbedtls_sha1_update
(
&
sha1
,
session
->
master
,
48
);
mbedtls_sha1_update
(
&
sha1
,
padbuf
,
40
);
mbedtls_sha1_finish
(
&
sha1
,
sha1sum
);
mbedtls_sha1_update
_ret
(
&
sha1
,
(
const
unsigned
char
*
)
sender
,
4
);
mbedtls_sha1_update
_ret
(
&
sha1
,
session
->
master
,
48
);
mbedtls_sha1_update
_ret
(
&
sha1
,
padbuf
,
40
);
mbedtls_sha1_finish
_ret
(
&
sha1
,
sha1sum
);
memset
(
padbuf
,
0x5C
,
48
);
mbedtls_md5_starts
(
&
md5
);
mbedtls_md5_update
(
&
md5
,
session
->
master
,
48
);
mbedtls_md5_update
(
&
md5
,
padbuf
,
48
);
mbedtls_md5_update
(
&
md5
,
md5sum
,
16
);
mbedtls_md5_finish
(
&
md5
,
buf
);
mbedtls_md5_starts
_ret
(
&
md5
);
mbedtls_md5_update
_ret
(
&
md5
,
session
->
master
,
48
);
mbedtls_md5_update
_ret
(
&
md5
,
padbuf
,
48
);
mbedtls_md5_update
_ret
(
&
md5
,
md5sum
,
16
);
mbedtls_md5_finish
_ret
(
&
md5
,
buf
);
mbedtls_sha1_starts
(
&
sha1
);
mbedtls_sha1_update
(
&
sha1
,
session
->
master
,
48
);
mbedtls_sha1_update
(
&
sha1
,
padbuf
,
40
);
mbedtls_sha1_update
(
&
sha1
,
sha1sum
,
20
);
mbedtls_sha1_finish
(
&
sha1
,
buf
+
16
);
mbedtls_sha1_starts
_ret
(
&
sha1
);
mbedtls_sha1_update
_ret
(
&
sha1
,
session
->
master
,
48
);
mbedtls_sha1_update
_ret
(
&
sha1
,
padbuf
,
40
);
mbedtls_sha1_update
_ret
(
&
sha1
,
sha1sum
,
20
);
mbedtls_sha1_finish
_ret
(
&
sha1
,
buf
+
16
);
MBEDTLS_SSL_DEBUG_BUF
(
3
,
"calc finished result"
,
buf
,
36
);
...
...
@@ -5023,8 +5064,8 @@ static void ssl_calc_finished_tls(
?
"client finished"
:
"server finished"
;
mbedtls_md5_finish
(
&
md5
,
padbuf
);
mbedtls_sha1_finish
(
&
sha1
,
padbuf
+
16
);
mbedtls_md5_finish
_ret
(
&
md5
,
padbuf
);
mbedtls_sha1_finish
_ret
(
&
sha1
,
padbuf
+
16
);
ssl
->
handshake
->
tls_prf
(
session
->
master
,
48
,
sender
,
padbuf
,
36
,
buf
,
len
);
...
...
@@ -5075,7 +5116,7 @@ static void ssl_calc_finished_tls_sha256(
?
"client finished"
:
"server finished"
;
mbedtls_sha256_finish
(
&
sha256
,
padbuf
);
mbedtls_sha256_finish
_ret
(
&
sha256
,
padbuf
);
ssl
->
handshake
->
tls_prf
(
session
->
master
,
48
,
sender
,
padbuf
,
32
,
buf
,
len
);
...
...
@@ -5124,7 +5165,7 @@ static void ssl_calc_finished_tls_sha384(
?
"client finished"
:
"server finished"
;
mbedtls_sha512_finish
(
&
sha512
,
padbuf
);
mbedtls_sha512_finish
_ret
(
&
sha512
,
padbuf
);
ssl
->
handshake
->
tls_prf
(
session
->
master
,
48
,
sender
,
padbuf
,
48
,
buf
,
len
);
...
...
@@ -5438,17 +5479,17 @@ static void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake )
defined(MBEDTLS_SSL_PROTO_TLS1_1)
mbedtls_md5_init
(
&
handshake
->
fin_md5
);
mbedtls_sha1_init
(
&
handshake
->
fin_sha1
);
mbedtls_md5_starts
(
&
handshake
->
fin_md5
);
mbedtls_sha1_starts
(
&
handshake
->
fin_sha1
);
mbedtls_md5_starts
_ret
(
&
handshake
->
fin_md5
);
mbedtls_sha1_starts
_ret
(
&
handshake
->
fin_sha1
);
#endif
#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
#if defined(MBEDTLS_SHA256_C)
mbedtls_sha256_init
(
&
handshake
->
fin_sha256
);
mbedtls_sha256_starts
(
&
handshake
->
fin_sha256
,
0
);
mbedtls_sha256_starts
_ret
(
&
handshake
->
fin_sha256
,
0
);
#endif
#if defined(MBEDTLS_SHA512_C)
mbedtls_sha512_init
(
&
handshake
->
fin_sha512
);
mbedtls_sha512_starts
(
&
handshake
->
fin_sha512
,
1
);
mbedtls_sha512_starts
_ret
(
&
handshake
->
fin_sha512
,
1
);
#endif
#endif
/* MBEDTLS_SSL_PROTO_TLS1_2 */
...
...
@@ -6050,12 +6091,19 @@ int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,
return
(
MBEDTLS_ERR_SSL_BAD_INPUT_DATA
);
}
if
(
conf
->
psk
!=
NULL
||
conf
->
psk_identity
!=
NULL
)
if
(
conf
->
psk
!=
NULL
)
{
mbedtls_zeroize
(
conf
->
psk
,
conf
->
psk_len
);
mbedtls_free
(
conf
->
psk
);
mbedtls_free
(
conf
->
psk_identity
);
conf
->
psk
=
NULL
;
conf
->
psk_len
=
0
;
}
if
(
conf
->
psk_identity
!=
NULL
)
{
mbedtls_free
(
conf
->
psk_identity
);
conf
->
psk_identity
=
NULL
;
conf
->
psk_identity_len
=
0
;
}
if
(
(
conf
->
psk
=
mbedtls_calloc
(
1
,
psk_len
)
)
==
NULL
||
...
...
@@ -6087,7 +6135,11 @@ int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl,
return
(
MBEDTLS_ERR_SSL_BAD_INPUT_DATA
);
if
(
ssl
->
handshake
->
psk
!=
NULL
)
{
mbedtls_zeroize
(
ssl
->
handshake
->
psk
,
ssl
->
handshake
->
psk_len
);
mbedtls_free
(
ssl
->
handshake
->
psk
);
ssl
->
handshake
->
psk_len
=
0
;
}
if
(
(
ssl
->
handshake
->
psk
=
mbedtls_calloc
(
1
,
psk_len
)
)
==
NULL
)
return
(
MBEDTLS_ERR_SSL_ALLOC_FAILED
);
...
...
@@ -6109,6 +6161,8 @@ void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf,
#endif
/* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
int
mbedtls_ssl_conf_dh_param
(
mbedtls_ssl_config
*
conf
,
const
char
*
dhm_P
,
const
char
*
dhm_G
)
{
int
ret
;
...
...
@@ -6123,6 +6177,24 @@ int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, cons
return
(
0
);
}
#endif
/* MBEDTLS_DEPRECATED_REMOVED */
int
mbedtls_ssl_conf_dh_param_bin
(
mbedtls_ssl_config
*
conf
,
const
unsigned
char
*
dhm_P
,
size_t
P_len
,
const
unsigned
char
*
dhm_G
,
size_t
G_len
)
{
int
ret
;
if
(
(
ret
=
mbedtls_mpi_read_binary
(
&
conf
->
dhm_P
,
dhm_P
,
P_len
)
)
!=
0
||
(
ret
=
mbedtls_mpi_read_binary
(
&
conf
->
dhm_G
,
dhm_G
,
G_len
)
)
!=
0
)
{
mbedtls_mpi_free
(
&
conf
->
dhm_P
);
mbedtls_mpi_free
(
&
conf
->
dhm_G
);
return
(
ret
);
}
return
(
0
);
}
int
mbedtls_ssl_conf_dh_param_ctx
(
mbedtls_ssl_config
*
conf
,
mbedtls_dhm_context
*
dhm_ctx
)
{
...
...
@@ -6160,7 +6232,7 @@ void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf,
{
conf
->
sig_hashes
=
hashes
;
}
#endif
#endif
/* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
#if defined(MBEDTLS_ECP_C)
/*
...
...
@@ -6171,36 +6243,53 @@ void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf,
{
conf
->
curve_list
=
curve_list
;
}
#endif
#endif
/* MBEDTLS_ECP_C */
#if defined(MBEDTLS_X509_CRT_PARSE_C)
int
mbedtls_ssl_set_hostname
(
mbedtls_ssl_context
*
ssl
,
const
char
*
hostname
)
{
size_t
hostname_len
;
if
(
hostname
==
NULL
)
return
(
MBEDTLS_ERR_SSL_BAD_INPUT_DATA
);
/* Initialize to suppress unnecessary compiler warning */
size_t
hostname_len
=
0
;
/* Check if new hostname is valid before
* making any change to current one */
if
(
hostname
!=
NULL
)
{
hostname_len
=
strlen
(
hostname
);
if
(
hostname_len
+
1
==
0
)
return
(
MBEDTLS_ERR_SSL_BAD_INPUT_DATA
);
if
(
hostname_len
>
MBEDTLS_SSL_MAX_HOST_NAME_LEN
)
return
(
MBEDTLS_ERR_SSL_BAD_INPUT_DATA
);
}
ssl
->
hostname
=
mbedtls_calloc
(
1
,
hostname_len
+
1
);
/* Now it's clear that we will overwrite the old hostname,
* so we can free it safely */
if
(
ssl
->
hostname
!=
NULL
)
{
mbedtls_zeroize
(
ssl
->
hostname
,
strlen
(
ssl
->
hostname
)
);
mbedtls_free
(
ssl
->
hostname
);
}
/* Passing NULL as hostname shall clear the old one */
if
(
hostname
==
NULL
)
{
ssl
->
hostname
=
NULL
;
}
else
{
ssl
->
hostname
=
mbedtls_calloc
(
1
,
hostname_len
+
1
);
if
(
ssl
->
hostname
==
NULL
)
return
(
MBEDTLS_ERR_SSL_ALLOC_FAILED
);
memcpy
(
ssl
->
hostname
,
hostname
,
hostname_len
);
ssl
->
hostname
[
hostname_len
]
=
'\0'
;
}
return
(
0
);
}
#endif
#endif
/* MBEDTLS_X509_CRT_PARSE_C */
#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
void
mbedtls_ssl_conf_sni
(
mbedtls_ssl_config
*
conf
,
...
...
@@ -6860,7 +6949,6 @@ int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len )
}
}
#if defined(MBEDTLS_SSL_RENEGOTIATION)
if
(
ssl
->
in_msgtype
==
MBEDTLS_SSL_MSG_HANDSHAKE
)
{
MBEDTLS_SSL_DEBUG_MSG
(
1
,
(
"received handshake message"
)
);
...
...
@@ -6902,12 +6990,35 @@ int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len )
}
#endif
/* MBEDTLS_SSL_SRV_C */
#if defined(MBEDTLS_SSL_RENEGOTIATION)
/* Determine whether renegotiation attempt should be accepted */
if
(
ssl
->
conf
->
disable_renegotiation
==
MBEDTLS_SSL_RENEGOTIATION_DISABLED
||
if
(
!
(
ssl
->
conf
->
disable_renegotiation
==
MBEDTLS_SSL_RENEGOTIATION_DISABLED
||
(
ssl
->
secure_renegotiation
==
MBEDTLS_SSL_LEGACY_RENEGOTIATION
&&
ssl
->
conf
->
allow_legacy_renegotiation
==
MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION
)
)
MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION
)
)
)
{
/*
* Accept renegotiation request
*/
/* DTLS clients need to know renego is server-initiated */
#if defined(MBEDTLS_SSL_PROTO_DTLS)
if
(
ssl
->
conf
->
transport
==
MBEDTLS_SSL_TRANSPORT_DATAGRAM
&&
ssl
->
conf
->
endpoint
==
MBEDTLS_SSL_IS_CLIENT
)
{
ssl
->
renego_status
=
MBEDTLS_SSL_RENEGOTIATION_PENDING
;
}
#endif
ret
=
ssl_start_renegotiation
(
ssl
);
if
(
ret
!=
MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO
&&
ret
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"ssl_start_renegotiation"
,
ret
);
return
(
ret
);
}
}
else
#endif
/* MBEDTLS_SSL_RENEGOTIATION */
{
/*
* Refuse renegotiation
...
...
@@ -6945,31 +7056,10 @@ int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len )
return
(
MBEDTLS_ERR_SSL_INTERNAL_ERROR
);
}
}
else
{
/*
* Accept renegotiation request
*/
/* DTLS clients need to know renego is server-initiated */
#if defined(MBEDTLS_SSL_PROTO_DTLS)
if
(
ssl
->
conf
->
transport
==
MBEDTLS_SSL_TRANSPORT_DATAGRAM
&&
ssl
->
conf
->
endpoint
==
MBEDTLS_SSL_IS_CLIENT
)
{
ssl
->
renego_status
=
MBEDTLS_SSL_RENEGOTIATION_PENDING
;
}
#endif
ret
=
ssl_start_renegotiation
(
ssl
);
if
(
ret
!=
MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO
&&
ret
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"ssl_start_renegotiation"
,
ret
);
return
(
ret
);
}
}
return
(
MBEDTLS_ERR_SSL_WANT_READ
);
}
#if defined(MBEDTLS_SSL_RENEGOTIATION)
else
if
(
ssl
->
renego_status
==
MBEDTLS_SSL_RENEGOTIATION_PENDING
)
{
if
(
ssl
->
conf
->
renego_max_records
>=
0
)
...
...
@@ -7055,7 +7145,9 @@ static int ssl_write_real( mbedtls_ssl_context *ssl,
int
ret
;
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
size_t
max_len
=
mbedtls_ssl_get_max_frag_len
(
ssl
);
#else
size_t
max_len
=
MBEDTLS_SSL_MAX_CONTENT_LEN
;
#endif
/* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
if
(
len
>
max_len
)
{
#if defined(MBEDTLS_SSL_PROTO_DTLS)
...
...
@@ -7070,7 +7162,6 @@ static int ssl_write_real( mbedtls_ssl_context *ssl,
#endif
len
=
max_len
;
}
#endif
/* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
if
(
ssl
->
out_left
!=
0
)
{
...
...
@@ -7101,7 +7192,7 @@ static int ssl_write_real( mbedtls_ssl_context *ssl,
*
* With non-blocking I/O, ssl_write_real() may return WANT_WRITE,
* then the caller will call us again with the same arguments, so
* remember wether we already did the split or not.
* remember w
h
ether we already did the split or not.
*/
#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
static
int
ssl_write_split
(
mbedtls_ssl_context
*
ssl
,
...
...
@@ -7531,9 +7622,14 @@ int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf,
#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
if
(
endpoint
==
MBEDTLS_SSL_IS_SERVER
)
{
if
(
(
ret
=
mbedtls_ssl_conf_dh_param
(
conf
,
MBEDTLS_DHM_RFC5114_MODP_2048_P
,
MBEDTLS_DHM_RFC5114_MODP_2048_G
)
)
!=
0
)
const
unsigned
char
dhm_p
[]
=
MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN
;
const
unsigned
char
dhm_g
[]
=
MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN
;
if
(
(
ret
=
mbedtls_ssl_conf_dh_param_bin
(
conf
,
dhm_p
,
sizeof
(
dhm_p
),
dhm_g
,
sizeof
(
dhm_g
)
)
)
!=
0
)
{
return
(
ret
);
}
...
...
@@ -8033,4 +8129,148 @@ int mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md )
#endif
/* MBEDTLS_SSL_PROTO_TLS1_2 */
}
#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
defined(MBEDTLS_SSL_PROTO_TLS1_1)
int
mbedtls_ssl_get_key_exchange_md_ssl_tls
(
mbedtls_ssl_context
*
ssl
,
unsigned
char
*
output
,
unsigned
char
*
data
,
size_t
data_len
)
{
int
ret
=
0
;
mbedtls_md5_context
mbedtls_md5
;
mbedtls_sha1_context
mbedtls_sha1
;
mbedtls_md5_init
(
&
mbedtls_md5
);
mbedtls_sha1_init
(
&
mbedtls_sha1
);
/*
* digitally-signed struct {
* opaque md5_hash[16];
* opaque sha_hash[20];
* };
*
* md5_hash
* MD5(ClientHello.random + ServerHello.random
* + ServerParams);
* sha_hash
* SHA(ClientHello.random + ServerHello.random
* + ServerParams);
*/
if
(
(
ret
=
mbedtls_md5_starts_ret
(
&
mbedtls_md5
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_md5_starts_ret"
,
ret
);
goto
exit
;
}
if
(
(
ret
=
mbedtls_md5_update_ret
(
&
mbedtls_md5
,
ssl
->
handshake
->
randbytes
,
64
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_md5_update_ret"
,
ret
);
goto
exit
;
}
if
(
(
ret
=
mbedtls_md5_update_ret
(
&
mbedtls_md5
,
data
,
data_len
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_md5_update_ret"
,
ret
);
goto
exit
;
}
if
(
(
ret
=
mbedtls_md5_finish_ret
(
&
mbedtls_md5
,
output
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_md5_finish_ret"
,
ret
);
goto
exit
;
}
if
(
(
ret
=
mbedtls_sha1_starts_ret
(
&
mbedtls_sha1
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_sha1_starts_ret"
,
ret
);
goto
exit
;
}
if
(
(
ret
=
mbedtls_sha1_update_ret
(
&
mbedtls_sha1
,
ssl
->
handshake
->
randbytes
,
64
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_sha1_update_ret"
,
ret
);
goto
exit
;
}
if
(
(
ret
=
mbedtls_sha1_update_ret
(
&
mbedtls_sha1
,
data
,
data_len
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_sha1_update_ret"
,
ret
);
goto
exit
;
}
if
(
(
ret
=
mbedtls_sha1_finish_ret
(
&
mbedtls_sha1
,
output
+
16
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_sha1_finish_ret"
,
ret
);
goto
exit
;
}
exit:
mbedtls_md5_free
(
&
mbedtls_md5
);
mbedtls_sha1_free
(
&
mbedtls_sha1
);
if
(
ret
!=
0
)
mbedtls_ssl_send_alert_message
(
ssl
,
MBEDTLS_SSL_ALERT_LEVEL_FATAL
,
MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR
);
return
(
ret
);
}
#endif
/* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
MBEDTLS_SSL_PROTO_TLS1_1 */
#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
defined(MBEDTLS_SSL_PROTO_TLS1_2)
int
mbedtls_ssl_get_key_exchange_md_tls1_2
(
mbedtls_ssl_context
*
ssl
,
unsigned
char
*
output
,
unsigned
char
*
data
,
size_t
data_len
,
mbedtls_md_type_t
md_alg
)
{
int
ret
=
0
;
mbedtls_md_context_t
ctx
;
const
mbedtls_md_info_t
*
md_info
=
mbedtls_md_info_from_type
(
md_alg
);
mbedtls_md_init
(
&
ctx
);
/*
* digitally-signed struct {
* opaque client_random[32];
* opaque server_random[32];
* ServerDHParams params;
* };
*/
if
(
(
ret
=
mbedtls_md_setup
(
&
ctx
,
md_info
,
0
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_md_setup"
,
ret
);
goto
exit
;
}
if
(
(
ret
=
mbedtls_md_starts
(
&
ctx
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_md_starts"
,
ret
);
goto
exit
;
}
if
(
(
ret
=
mbedtls_md_update
(
&
ctx
,
ssl
->
handshake
->
randbytes
,
64
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_md_update"
,
ret
);
goto
exit
;
}
if
(
(
ret
=
mbedtls_md_update
(
&
ctx
,
data
,
data_len
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_md_update"
,
ret
);
goto
exit
;
}
if
(
(
ret
=
mbedtls_md_finish
(
&
ctx
,
output
)
)
!=
0
)
{
MBEDTLS_SSL_DEBUG_RET
(
1
,
"mbedtls_md_finish"
,
ret
);
goto
exit
;
}
exit:
mbedtls_md_free
(
&
ctx
);
if
(
ret
!=
0
)
mbedtls_ssl_send_alert_message
(
ssl
,
MBEDTLS_SSL_ALERT_LEVEL_FATAL
,
MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR
);
return
(
ret
);
}
#endif
/* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
MBEDTLS_SSL_PROTO_TLS1_2 */
#endif
/* MBEDTLS_SSL_TLS_C */
app/mbedtls/library/timing.c
View file @
c7673b02
...
...
@@ -244,21 +244,23 @@ volatile int mbedtls_timing_alarmed = 0;
unsigned
long
mbedtls_timing_get_timer
(
struct
mbedtls_timing_hr_time
*
val
,
int
reset
)
{
unsigned
long
delta
;
LARGE_INTEGER
offset
,
hfreq
;
struct
_hr_time
*
t
=
(
struct
_hr_time
*
)
val
;
QueryPerformanceCounter
(
&
offset
);
QueryPerformanceFrequency
(
&
hfreq
);
delta
=
(
unsigned
long
)(
(
1000
*
(
offset
.
QuadPart
-
t
->
start
.
QuadPart
)
)
/
hfreq
.
QuadPart
);
if
(
reset
)
{
QueryPerformanceCounter
(
&
t
->
start
);
return
(
0
);
}
else
{
unsigned
long
delta
;
LARGE_INTEGER
now
,
hfreq
;
QueryPerformanceCounter
(
&
now
);
QueryPerformanceFrequency
(
&
hfreq
);
delta
=
(
unsigned
long
)(
(
now
.
QuadPart
-
t
->
start
.
QuadPart
)
*
1000ul
/
hfreq
.
QuadPart
);
return
(
delta
);
}
}
/* It's OK to use a global because alarm() is supposed to be global anyway */
...
...
@@ -276,6 +278,14 @@ void mbedtls_set_alarm( int seconds )
{
DWORD
ThreadId
;
if
(
seconds
==
0
)
{
/* No need to create a thread for this simple case.
* Also, this shorcut is more reliable at least on MinGW32 */
mbedtls_timing_alarmed
=
1
;
return
;
}
mbedtls_timing_alarmed
=
0
;
alarmMs
=
seconds
*
1000
;
CloseHandle
(
CreateThread
(
NULL
,
0
,
TimerProc
,
NULL
,
0
,
&
ThreadId
)
);
...
...
@@ -285,23 +295,22 @@ void mbedtls_set_alarm( int seconds )
unsigned
long
mbedtls_timing_get_timer
(
struct
mbedtls_timing_hr_time
*
val
,
int
reset
)
{
unsigned
long
delta
;
struct
timeval
offset
;
struct
_hr_time
*
t
=
(
struct
_hr_time
*
)
val
;
gettimeofday
(
&
offset
,
NULL
);
if
(
reset
)
{
t
->
start
.
tv_sec
=
offset
.
tv_sec
;
t
->
start
.
tv_usec
=
offset
.
tv_usec
;
gettimeofday
(
&
t
->
start
,
NULL
);
return
(
0
);
}
delta
=
(
offset
.
tv_sec
-
t
->
start
.
tv_sec
)
*
1000
+
(
offset
.
tv_usec
-
t
->
start
.
tv_usec
)
/
1000
;
else
{
unsigned
long
delta
;
struct
timeval
now
;
gettimeofday
(
&
now
,
NULL
);
delta
=
(
now
.
tv_sec
-
t
->
start
.
tv_sec
)
*
1000ul
+
(
now
.
tv_usec
-
t
->
start
.
tv_usec
)
/
1000
;
return
(
delta
);
}
}
static
void
sighandler
(
int
signum
)
...
...
@@ -315,6 +324,12 @@ void mbedtls_set_alarm( int seconds )
mbedtls_timing_alarmed
=
0
;
signal
(
SIGALRM
,
sighandler
);
alarm
(
seconds
);
if
(
seconds
==
0
)
{
/* alarm(0) cancelled any previous pending alarm, but the
handler won't fire, so raise the flag straight away. */
mbedtls_timing_alarmed
=
1
;
}
}
#endif
/* _WIN32 && !EFIX64 && !EFI32 */
...
...
@@ -379,12 +394,20 @@ static void busy_msleep( unsigned long msec )
}
#define FAIL do \
{
\
{
\
if( verbose != 0 ) \
mbedtls_printf( "failed\n" ); \
\
{ \
mbedtls_printf( "failed at line %d\n", __LINE__ ); \
mbedtls_printf( " cycles=%lu ratio=%lu millisecs=%lu secs=%lu hardfail=%d a=%lu b=%lu\n", \
cycles, ratio, millisecs, secs, hardfail, \
(unsigned long) a, (unsigned long) b ); \
mbedtls_printf( " elapsed(hires)=%lu elapsed(ctx)=%lu status(ctx)=%d\n", \
mbedtls_timing_get_timer( &hires, 0 ), \
mbedtls_timing_get_timer( &ctx.timer, 0 ), \
mbedtls_timing_get_delay( &ctx ) ); \
} \
return( 1 ); \
} while( 0 )
} while( 0 )
/*
* Checkup routine
...
...
@@ -394,22 +417,22 @@ static void busy_msleep( unsigned long msec )
*/
int
mbedtls_timing_self_test
(
int
verbose
)
{
unsigned
long
cycles
,
ratio
;
unsigned
long
millisecs
,
secs
;
int
hardfail
;
unsigned
long
cycles
=
0
,
ratio
=
0
;
unsigned
long
millisecs
=
0
,
secs
=
0
;
int
hardfail
=
0
;
struct
mbedtls_timing_hr_time
hires
;
uint32_t
a
,
b
;
uint32_t
a
=
0
,
b
=
0
;
mbedtls_timing_delay_context
ctx
;
if
(
verbose
!=
0
)
mbedtls_printf
(
" TIMING tests note: will take some time!
\n
"
);
if
(
verbose
!=
0
)
mbedtls_printf
(
" TIMING test #1 (set_alarm / get_timer): "
);
for
(
secs
=
1
;
secs
<=
3
;
secs
++
)
{
secs
=
1
;
(
void
)
mbedtls_timing_get_timer
(
&
hires
,
1
);
mbedtls_set_alarm
(
(
int
)
secs
);
...
...
@@ -421,12 +444,7 @@ int mbedtls_timing_self_test( int verbose )
/* For some reason on Windows it looks like alarm has an extra delay
* (maybe related to creating a new thread). Allow some room here. */
if
(
millisecs
<
800
*
secs
||
millisecs
>
1200
*
secs
+
300
)
{
if
(
verbose
!=
0
)
mbedtls_printf
(
"failed
\n
"
);
return
(
1
);
}
FAIL
;
}
if
(
verbose
!=
0
)
...
...
@@ -435,29 +453,23 @@ int mbedtls_timing_self_test( int verbose )
if
(
verbose
!=
0
)
mbedtls_printf
(
" TIMING test #2 (set/get_delay ): "
);
for
(
a
=
200
;
a
<=
400
;
a
+=
200
)
{
for
(
b
=
200
;
b
<
=
4
00
;
b
+=
200
)
{
mbedtls_timing_set_delay
(
&
ctx
,
a
,
a
+
b
);
a
=
8
00
;
b
=
400
;
mbedtls_timing_set_delay
(
&
ctx
,
a
,
a
+
b
);
/* T = 0 */
busy_msleep
(
a
-
a
/
8
);
busy_msleep
(
a
-
a
/
4
);
/* T = a - a/4 */
if
(
mbedtls_timing_get_delay
(
&
ctx
)
!=
0
)
FAIL
;
busy_msleep
(
a
/
4
);
busy_msleep
(
a
/
4
+
b
/
4
);
/* T = a + b/4 */
if
(
mbedtls_timing_get_delay
(
&
ctx
)
!=
1
)
FAIL
;
busy_msleep
(
b
-
a
/
8
-
b
/
8
);
if
(
mbedtls_timing_get_delay
(
&
ctx
)
!=
1
)
FAIL
;
busy_msleep
(
b
/
4
);
busy_msleep
(
b
);
/* T = a + b + b/4 */
if
(
mbedtls_timing_get_delay
(
&
ctx
)
!=
2
)
FAIL
;
}
}
mbedtls_timing_set_delay
(
&
ctx
,
0
,
0
);
busy_msleep
(
200
);
...
...
@@ -475,7 +487,6 @@ int mbedtls_timing_self_test( int verbose )
* On a 4Ghz 32-bit machine the cycle counter wraps about once per second;
* since the whole test is about 10ms, it shouldn't happen twice in a row.
*/
hardfail
=
0
;
hard_test:
if
(
hardfail
>
1
)
...
...
app/mbedtls/library/version_features.c
View file @
c7673b02
...
...
@@ -96,12 +96,24 @@ static const char *features[] = {
#if defined(MBEDTLS_CAMELLIA_ALT)
"MBEDTLS_CAMELLIA_ALT"
,
#endif
/* MBEDTLS_CAMELLIA_ALT */
#if defined(MBEDTLS_CCM_ALT)
"MBEDTLS_CCM_ALT"
,
#endif
/* MBEDTLS_CCM_ALT */
#if defined(MBEDTLS_CMAC_ALT)
"MBEDTLS_CMAC_ALT"
,
#endif
/* MBEDTLS_CMAC_ALT */
#if defined(MBEDTLS_DES_ALT)
"MBEDTLS_DES_ALT"
,
#endif
/* MBEDTLS_DES_ALT */
#if defined(MBEDTLS_XTEA_ALT)
"MBEDTLS_XTEA_ALT"
,
#endif
/* MBEDTLS_XTEA_ALT */
#if defined(MBEDTLS_DHM_ALT)
"MBEDTLS_DHM_ALT"
,
#endif
/* MBEDTLS_DHM_ALT */
#if defined(MBEDTLS_ECJPAKE_ALT)
"MBEDTLS_ECJPAKE_ALT"
,
#endif
/* MBEDTLS_ECJPAKE_ALT */
#if defined(MBEDTLS_GCM_ALT)
"MBEDTLS_GCM_ALT"
,
#endif
/* MBEDTLS_GCM_ALT */
#if defined(MBEDTLS_MD2_ALT)
"MBEDTLS_MD2_ALT"
,
#endif
/* MBEDTLS_MD2_ALT */
...
...
@@ -114,6 +126,9 @@ static const char *features[] = {
#if defined(MBEDTLS_RIPEMD160_ALT)
"MBEDTLS_RIPEMD160_ALT"
,
#endif
/* MBEDTLS_RIPEMD160_ALT */
#if defined(MBEDTLS_RSA_ALT)
"MBEDTLS_RSA_ALT"
,
#endif
/* MBEDTLS_RSA_ALT */
#if defined(MBEDTLS_SHA1_ALT)
"MBEDTLS_SHA1_ALT"
,
#endif
/* MBEDTLS_SHA1_ALT */
...
...
@@ -123,6 +138,9 @@ static const char *features[] = {
#if defined(MBEDTLS_SHA512_ALT)
"MBEDTLS_SHA512_ALT"
,
#endif
/* MBEDTLS_SHA512_ALT */
#if defined(MBEDTLS_XTEA_ALT)
"MBEDTLS_XTEA_ALT"
,
#endif
/* MBEDTLS_XTEA_ALT */
#if defined(MBEDTLS_ECP_ALT)
"MBEDTLS_ECP_ALT"
,
#endif
/* MBEDTLS_ECP_ALT */
...
...
@@ -168,6 +186,21 @@ static const char *features[] = {
#if defined(MBEDTLS_AES_DECRYPT_ALT)
"MBEDTLS_AES_DECRYPT_ALT"
,
#endif
/* MBEDTLS_AES_DECRYPT_ALT */
#if defined(MBEDTLS_ECDH_GEN_PUBLIC_ALT)
"MBEDTLS_ECDH_GEN_PUBLIC_ALT"
,
#endif
/* MBEDTLS_ECDH_GEN_PUBLIC_ALT */
#if defined(MBEDTLS_ECDH_COMPUTE_SHARED_ALT)
"MBEDTLS_ECDH_COMPUTE_SHARED_ALT"
,
#endif
/* MBEDTLS_ECDH_COMPUTE_SHARED_ALT */
#if defined(MBEDTLS_ECDSA_VERIFY_ALT)
"MBEDTLS_ECDSA_VERIFY_ALT"
,
#endif
/* MBEDTLS_ECDSA_VERIFY_ALT */
#if defined(MBEDTLS_ECDSA_SIGN_ALT)
"MBEDTLS_ECDSA_SIGN_ALT"
,
#endif
/* MBEDTLS_ECDSA_SIGN_ALT */
#if defined(MBEDTLS_ECDSA_GENKEY_ALT)
"MBEDTLS_ECDSA_GENKEY_ALT"
,
#endif
/* MBEDTLS_ECDSA_GENKEY_ALT */
#if defined(MBEDTLS_ECP_INTERNAL_ALT)
"MBEDTLS_ECP_INTERNAL_ALT"
,
#endif
/* MBEDTLS_ECP_INTERNAL_ALT */
...
...
app/mbedtls/library/x509.c
View file @
c7673b02
...
...
@@ -496,9 +496,10 @@ static int x509_parse_int( unsigned char **p, size_t n, int *res )
return
(
0
);
}
static
int
x509_date_is_valid
(
const
mbedtls_x509_time
*
t
)
static
int
x509_date_is_valid
(
const
mbedtls_x509_time
*
t
)
{
int
ret
=
MBEDTLS_ERR_X509_INVALID_DATE
;
int
month_len
;
CHECK_RANGE
(
0
,
9999
,
t
->
year
);
CHECK_RANGE
(
0
,
23
,
t
->
hour
);
...
...
@@ -508,17 +509,22 @@ static int x509_date_is_valid(const mbedtls_x509_time *t)
switch
(
t
->
mon
)
{
case
1
:
case
3
:
case
5
:
case
7
:
case
8
:
case
10
:
case
12
:
CHECK_RANGE
(
1
,
31
,
t
->
day
)
;
month_len
=
31
;
break
;
case
4
:
case
6
:
case
9
:
case
11
:
CHECK_RANGE
(
1
,
30
,
t
->
day
)
;
month_len
=
30
;
break
;
case
2
:
CHECK_RANGE
(
1
,
28
+
(
t
->
year
%
4
==
0
),
t
->
day
);
if
(
(
!
(
t
->
year
%
4
)
&&
t
->
year
%
100
)
||
!
(
t
->
year
%
400
)
)
month_len
=
29
;
else
month_len
=
28
;
break
;
default:
return
(
ret
);
}
CHECK_RANGE
(
1
,
month_len
,
t
->
day
);
return
(
0
);
}
...
...
app/mbedtls/library/x509write_crt.c
View file @
c7673b02
...
...
@@ -51,7 +51,7 @@ static void mbedtls_zeroize( void *v, size_t n ) {
void
mbedtls_x509write_crt_init
(
mbedtls_x509write_cert
*
ctx
)
{
memset
(
ctx
,
0
,
sizeof
(
mbedtls_x509write_cert
)
);
memset
(
ctx
,
0
,
sizeof
(
mbedtls_x509write_cert
)
);
mbedtls_mpi_init
(
&
ctx
->
serial
);
ctx
->
version
=
MBEDTLS_X509_CRT_VERSION_3
;
...
...
@@ -65,7 +65,7 @@ void mbedtls_x509write_crt_free( mbedtls_x509write_cert *ctx )
mbedtls_asn1_free_named_data_list
(
&
ctx
->
issuer
);
mbedtls_asn1_free_named_data_list
(
&
ctx
->
extensions
);
mbedtls_zeroize
(
ctx
,
sizeof
(
mbedtls_x509write_cert
)
);
mbedtls_zeroize
(
ctx
,
sizeof
(
mbedtls_x509write_cert
)
);
}
void
mbedtls_x509write_crt_set_version
(
mbedtls_x509write_cert
*
ctx
,
int
version
)
...
...
@@ -177,8 +177,11 @@ int mbedtls_x509write_crt_set_subject_key_identifier( mbedtls_x509write_cert *ct
memset
(
buf
,
0
,
sizeof
(
buf
)
);
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_pk_write_pubkey
(
&
c
,
buf
,
ctx
->
subject_key
)
);
mbedtls_sha1
(
buf
+
sizeof
(
buf
)
-
len
,
len
,
buf
+
sizeof
(
buf
)
-
20
);
c
=
buf
+
sizeof
(
buf
)
-
20
;
ret
=
mbedtls_sha1_ret
(
buf
+
sizeof
(
buf
)
-
len
,
len
,
buf
+
sizeof
(
buf
)
-
20
);
if
(
ret
!=
0
)
return
(
ret
);
c
=
buf
+
sizeof
(
buf
)
-
20
;
len
=
20
;
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_asn1_write_len
(
&
c
,
buf
,
len
)
);
...
...
@@ -193,14 +196,17 @@ int mbedtls_x509write_crt_set_authority_key_identifier( mbedtls_x509write_cert *
{
int
ret
;
unsigned
char
buf
[
MBEDTLS_MPI_MAX_SIZE
*
2
+
20
];
/* tag, length + 2xMPI */
unsigned
char
*
c
=
buf
+
sizeof
(
buf
);
unsigned
char
*
c
=
buf
+
sizeof
(
buf
);
size_t
len
=
0
;
memset
(
buf
,
0
,
sizeof
(
buf
)
);
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_pk_write_pubkey
(
&
c
,
buf
,
ctx
->
issuer_key
)
);
mbedtls_sha1
(
buf
+
sizeof
(
buf
)
-
len
,
len
,
buf
+
sizeof
(
buf
)
-
20
);
c
=
buf
+
sizeof
(
buf
)
-
20
;
ret
=
mbedtls_sha1_ret
(
buf
+
sizeof
(
buf
)
-
len
,
len
,
buf
+
sizeof
(
buf
)
-
20
);
if
(
ret
!=
0
)
return
(
ret
);
c
=
buf
+
sizeof
(
buf
)
-
20
;
len
=
20
;
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_asn1_write_len
(
&
c
,
buf
,
len
)
);
...
...
@@ -212,7 +218,7 @@ int mbedtls_x509write_crt_set_authority_key_identifier( mbedtls_x509write_cert *
return
mbedtls_x509write_crt_set_extension
(
ctx
,
MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER
,
MBEDTLS_OID_SIZE
(
MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER
),
0
,
buf
+
sizeof
(
buf
)
-
len
,
len
);
0
,
buf
+
sizeof
(
buf
)
-
len
,
len
);
}
#endif
/* MBEDTLS_SHA1_C */
...
...
@@ -313,9 +319,15 @@ int mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf,
c
=
tmp_buf
+
sizeof
(
tmp_buf
);
/* Signature algorithm needed in TBS, and later for actual signature */
pk_alg
=
mbedtls_pk_get_type
(
ctx
->
issuer_key
);
if
(
pk_alg
==
MBEDTLS_PK_ECKEY
)
/* There's no direct way of extracting a signature algorithm
* (represented as an element of mbedtls_pk_type_t) from a PK instance. */
if
(
mbedtls_pk_can_do
(
ctx
->
issuer_key
,
MBEDTLS_PK_RSA
)
)
pk_alg
=
MBEDTLS_PK_RSA
;
else
if
(
mbedtls_pk_can_do
(
ctx
->
issuer_key
,
MBEDTLS_PK_ECDSA
)
)
pk_alg
=
MBEDTLS_PK_ECDSA
;
else
return
(
MBEDTLS_ERR_X509_INVALID_ALG
);
if
(
(
ret
=
mbedtls_oid_get_oid_by_sig_alg
(
pk_alg
,
ctx
->
md_alg
,
&
sig_oid
,
&
sig_oid_len
)
)
!=
0
)
...
...
@@ -326,6 +338,10 @@ int mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf,
/*
* Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
*/
/* Only for v3 */
if
(
ctx
->
version
==
MBEDTLS_X509_CRT_VERSION_3
)
{
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_x509_write_extensions
(
&
c
,
tmp_buf
,
ctx
->
extensions
)
);
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_asn1_write_len
(
&
c
,
tmp_buf
,
len
)
);
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_asn1_write_tag
(
&
c
,
tmp_buf
,
MBEDTLS_ASN1_CONSTRUCTED
|
...
...
@@ -333,6 +349,7 @@ int mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf,
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_asn1_write_len
(
&
c
,
tmp_buf
,
len
)
);
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_asn1_write_tag
(
&
c
,
tmp_buf
,
MBEDTLS_ASN1_CONTEXT_SPECIFIC
|
MBEDTLS_ASN1_CONSTRUCTED
|
3
)
);
}
/*
* SubjectPublicKeyInfo
...
...
@@ -384,12 +401,17 @@ int mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf,
/*
* Version ::= INTEGER { v1(0), v2(1), v3(2) }
*/
/* Can be omitted for v1 */
if
(
ctx
->
version
!=
MBEDTLS_X509_CRT_VERSION_1
)
{
sub_len
=
0
;
MBEDTLS_ASN1_CHK_ADD
(
sub_len
,
mbedtls_asn1_write_int
(
&
c
,
tmp_buf
,
ctx
->
version
)
);
len
+=
sub_len
;
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_asn1_write_len
(
&
c
,
tmp_buf
,
sub_len
)
);
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_asn1_write_tag
(
&
c
,
tmp_buf
,
MBEDTLS_ASN1_CONTEXT_SPECIFIC
|
MBEDTLS_ASN1_CONSTRUCTED
|
0
)
);
}
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_asn1_write_len
(
&
c
,
tmp_buf
,
len
)
);
MBEDTLS_ASN1_CHK_ADD
(
len
,
mbedtls_asn1_write_tag
(
&
c
,
tmp_buf
,
MBEDTLS_ASN1_CONSTRUCTED
|
...
...
@@ -398,7 +420,11 @@ int mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf,
/*
* Make signature
*/
mbedtls_md
(
mbedtls_md_info_from_type
(
ctx
->
md_alg
),
c
,
len
,
hash
);
if
(
(
ret
=
mbedtls_md
(
mbedtls_md_info_from_type
(
ctx
->
md_alg
),
c
,
len
,
hash
)
)
!=
0
)
{
return
(
ret
);
}
if
(
(
ret
=
mbedtls_pk_sign
(
ctx
->
issuer_key
,
ctx
->
md_alg
,
hash
,
0
,
sig
,
&
sig_len
,
f_rng
,
p_rng
)
)
!=
0
)
...
...
app/mbedtls/library/x509write_csr.c
View file @
c7673b02
...
...
@@ -50,7 +50,7 @@ static void mbedtls_zeroize( void *v, size_t n ) {
void
mbedtls_x509write_csr_init
(
mbedtls_x509write_csr
*
ctx
)
{
memset
(
ctx
,
0
,
sizeof
(
mbedtls_x509write_csr
)
);
memset
(
ctx
,
0
,
sizeof
(
mbedtls_x509write_csr
)
);
}
void
mbedtls_x509write_csr_free
(
mbedtls_x509write_csr
*
ctx
)
...
...
@@ -58,7 +58,7 @@ void mbedtls_x509write_csr_free( mbedtls_x509write_csr *ctx )
mbedtls_asn1_free_named_data_list
(
&
ctx
->
subject
);
mbedtls_asn1_free_named_data_list
(
&
ctx
->
extensions
);
mbedtls_zeroize
(
ctx
,
sizeof
(
mbedtls_x509write_csr
)
);
mbedtls_zeroize
(
ctx
,
sizeof
(
mbedtls_x509write_csr
)
);
}
void
mbedtls_x509write_csr_set_md_alg
(
mbedtls_x509write_csr
*
ctx
,
mbedtls_md_type_t
md_alg
)
...
...
@@ -194,13 +194,20 @@ int mbedtls_x509write_csr_der( mbedtls_x509write_csr *ctx, unsigned char *buf, s
*/
mbedtls_md
(
mbedtls_md_info_from_type
(
ctx
->
md_alg
),
c
,
len
,
hash
);
pk_alg
=
mbedtls_pk_get_type
(
ctx
->
key
);
if
(
pk_alg
==
MBEDTLS_PK_ECKEY
)
if
(
(
ret
=
mbedtls_pk_sign
(
ctx
->
key
,
ctx
->
md_alg
,
hash
,
0
,
sig
,
&
sig_len
,
f_rng
,
p_rng
)
)
!=
0
)
{
return
(
ret
);
}
if
(
mbedtls_pk_can_do
(
ctx
->
key
,
MBEDTLS_PK_RSA
)
)
pk_alg
=
MBEDTLS_PK_RSA
;
else
if
(
mbedtls_pk_can_do
(
ctx
->
key
,
MBEDTLS_PK_ECDSA
)
)
pk_alg
=
MBEDTLS_PK_ECDSA
;
else
return
(
MBEDTLS_ERR_X509_INVALID_ALG
);
if
(
(
ret
=
mbedtls_pk_sign
(
ctx
->
key
,
ctx
->
md_alg
,
hash
,
0
,
sig
,
&
sig_len
,
f_rng
,
p_rng
)
)
!=
0
||
(
ret
=
mbedtls_oid_get_oid_by_sig_alg
(
pk_alg
,
ctx
->
md_alg
,
if
(
(
ret
=
mbedtls_oid_get_oid_by_sig_alg
(
pk_alg
,
ctx
->
md_alg
,
&
sig_oid
,
&
sig_oid_len
)
)
!=
0
)
{
return
(
ret
);
...
...
app/modules/tls.c
View file @
c7673b02
...
...
@@ -18,6 +18,9 @@
#include "lwip/err.h"
#include "lwip/dns.h"
#include "mbedtls/debug.h"
#include "user_mbedtls.h"
#ifdef HAVE_SSL_SERVER_CRT
#include HAVE_SSL_SERVER_CRT
#else
...
...
@@ -611,6 +614,13 @@ static int tls_cert_verify(lua_State *L)
return
1
;
}
#if defined(MBEDTLS_DEBUG_C)
static
int
tls_set_debug_threshold
(
lua_State
*
L
)
{
mbedtls_debug_set_threshold
(
luaL_checkint
(
L
,
1
));
return
0
;
}
#endif
static
const
LUA_REG_TYPE
tls_socket_map
[]
=
{
{
LSTRKEY
(
"connect"
),
LFUNCVAL
(
tls_socket_connect
)
},
{
LSTRKEY
(
"close"
),
LFUNCVAL
(
tls_socket_close
)
},
...
...
@@ -634,6 +644,9 @@ const LUA_REG_TYPE tls_cert_map[] = {
static
const
LUA_REG_TYPE
tls_map
[]
=
{
{
LSTRKEY
(
"createConnection"
),
LFUNCVAL
(
tls_socket_create
)
},
#if defined(MBEDTLS_DEBUG_C)
{
LSTRKEY
(
"setDebug"
),
LFUNCVAL
(
tls_set_debug_threshold
)
},
#endif
{
LSTRKEY
(
"cert"
),
LROVAL
(
tls_cert_map
)
},
{
LSTRKEY
(
"__metatable"
),
LROVAL
(
tls_map
)
},
{
LNILKEY
,
LNILVAL
}
...
...
docs/en/modules/tls.md
View file @
c7673b02
...
...
@@ -291,3 +291,10 @@ firmware image.
The alternative approach is easier for development, and that is to supply the PEM data as a string value to
`tls.cert.verify`
. This
will store the certificate into the flash chip and turn on verification for that certificate. Subsequent boots of the nodemcu can then
use
`tls.cert.verify(true)`
and use the stored certificate.
# tls.setDebug function
mbedTLS can be compiled with debug support. If so, the tls.setDebug
function is mapped to the
`mbedtls_debug_set_threshold`
function and
can be used to enable or disable debugging spew to the console.
See mbedTLS's documentation for more details.
Prev
1
2
3
4
5
6
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment