Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
matrix-org
Olm
Commits
c04b770c
Commit
c04b770c
authored
Jan 10, 2017
by
Richard van der Hoff
Browse files
Add some tests for inbound session import/export
parent
fc72c732
Changes
3
Show whitespace changes
Inline
Side-by-side
include/olm/inbound_group_session.h
View file @
c04b770c
...
...
@@ -190,6 +190,19 @@ uint32_t olm_inbound_group_session_first_known_index(
const
OlmInboundGroupSession
*
session
);
/**
* Check if the session has been verified as a valid session.
*
* (A session is verified either because the original session share was signed,
* or because we have subsequently successfully decrypted a message.)
*
* This is mainly intended for the unit tests, currently.
*/
int
olm_inbound_group_session_is_verified
(
const
OlmInboundGroupSession
*
session
);
/**
* Get the number of bytes returned by olm_export_inbound_group_session()
*/
...
...
src/inbound_group_session.c
View file @
c04b770c
...
...
@@ -47,7 +47,7 @@ struct OlmInboundGroupSession {
/**
* Have we ever seen any evidence that this is a valid session?
* (either because the original session share was signed, or because we
* have subsequently successfully decrypted a message
?
)
* have subsequently successfully decrypted a message)
*
* (We don't do anything with this currently, but we may want to bear it in
* mind when we consider handling key-shares for sessions we already know
...
...
@@ -470,6 +470,12 @@ uint32_t olm_inbound_group_session_first_known_index(
return
session
->
initial_ratchet
.
counter
;
}
int
olm_inbound_group_session_is_verified
(
const
OlmInboundGroupSession
*
session
)
{
return
session
->
signing_key_verified
;
}
size_t
olm_export_inbound_group_session_length
(
const
OlmInboundGroupSession
*
session
)
{
...
...
tests/test_group_session.cpp
View file @
c04b770c
...
...
@@ -127,17 +127,18 @@ int main() {
assert_equals
(
msglen
,
res
);
assert_equals
(
1U
,
olm_outbound_group_session_message_index
(
session
));
/* build the inbound session */
size
=
olm_inbound_group_session_size
();
uint8_t
inbound_session_memory
[
size
];
OlmInboundGroupSession
*
inbound_session
=
olm_inbound_group_session
(
inbound_session_memory
);
assert_equals
(
0
,
olm_inbound_group_session_is_verified
(
inbound_session
));
res
=
olm_init_inbound_group_session
(
inbound_session
,
session_key
,
session_key_len
);
assert_equals
((
size_t
)
0
,
res
);
assert_equals
(
1
,
olm_inbound_group_session_is_verified
(
inbound_session
));
/* Check the session ids */
...
...
@@ -174,6 +175,85 @@ int main() {
assert_equals
(
message_index
,
uint32_t
(
0
));
}
{
TestCase
test_case
(
"Inbound group session export/import"
);
uint8_t
session_key
[]
=
"AgAAAAAwMTIzNDU2Nzg5QUJERUYwMTIzNDU2Nzg5QUJDREVGMDEyMzQ1Njc4OUFCREVGM"
"DEyMzQ1Njc4OUFCQ0RFRjAxMjM0NTY3ODlBQkRFRjAxMjM0NTY3ODlBQkNERUYwMTIzND"
"U2Nzg5QUJERUYwMTIzNDU2Nzg5QUJDREVGMDEyMw0bdg1BDq4Px/slBow06q8n/B9WBfw"
"WYyNOB8DlUmXGGwrFmaSb9bR/eY8xgERrxmP07hFmD9uqA2p8PMHdnV5ysmgufE6oLZ5+"
"8/mWQOW3VVTnDIlnwd8oHUYRuk8TCQ"
;
const
uint8_t
message
[]
=
"AwgAEhAcbh6UpbByoyZxufQ+h2B+8XHMjhR69G8F4+qjMaFlnIXusJZX3r8LnRORG9T3D"
"XFdbVuvIWrLyRfm4i8QRbe8VPwGRFG57B1CtmxanuP8bHtnnYqlwPsD"
;
const
std
::
size_t
msglen
=
sizeof
(
message
)
-
1
;
/* init first inbound group session, and decrypt */
std
::
size_t
size
=
olm_inbound_group_session_size
();
uint8_t
session_memory1
[
size
];
OlmInboundGroupSession
*
session1
=
olm_inbound_group_session
(
session_memory1
);
assert_equals
(
0
,
olm_inbound_group_session_is_verified
(
session1
));
std
::
size_t
res
=
olm_init_inbound_group_session
(
session1
,
session_key
,
sizeof
(
session_key
)
-
1
);
assert_equals
((
size_t
)
0
,
res
);
assert_equals
(
1
,
olm_inbound_group_session_is_verified
(
session1
));
/* olm_group_decrypt_max_plaintext_length destroys the input so we have to
copy it. */
uint8_t
msgcopy
[
msglen
];
memcpy
(
msgcopy
,
message
,
msglen
);
size
=
olm_group_decrypt_max_plaintext_length
(
session1
,
msgcopy
,
msglen
);
uint8_t
plaintext_buf
[
size
];
uint32_t
message_index
;
memcpy
(
msgcopy
,
message
,
msglen
);
res
=
olm_group_decrypt
(
session1
,
msgcopy
,
msglen
,
plaintext_buf
,
size
,
&
message_index
);
assert_equals
((
std
::
size_t
)
7
,
res
);
assert_equals
((
const
uint8_t
*
)
"Message"
,
plaintext_buf
,
res
);
assert_equals
(
uint32_t
(
0
),
message_index
);
/* export the keys */
size
=
olm_export_inbound_group_session_length
(
session1
);
uint8_t
export_memory
[
size
];
res
=
olm_export_inbound_group_session
(
session1
,
export_memory
,
size
,
0
);
assert_equals
(
size
,
res
);
/* free the old session to check there is no shared data */
olm_clear_inbound_group_session
(
session1
);
/* import the keys into another inbound group session */
size
=
olm_inbound_group_session_size
();
uint8_t
session_memory2
[
size
];
OlmInboundGroupSession
*
session2
=
olm_inbound_group_session
(
session_memory2
);
res
=
olm_import_inbound_group_session
(
session2
,
export_memory
,
sizeof
(
export_memory
)
);
assert_equals
((
size_t
)
0
,
res
);
assert_equals
(
0
,
olm_inbound_group_session_is_verified
(
session2
));
/* decrypt the message with the new session */
memcpy
(
msgcopy
,
message
,
msglen
);
size
=
olm_group_decrypt_max_plaintext_length
(
session2
,
msgcopy
,
msglen
);
uint8_t
plaintext_buf2
[
size
];
memcpy
(
msgcopy
,
message
,
msglen
);
res
=
olm_group_decrypt
(
session2
,
msgcopy
,
msglen
,
plaintext_buf2
,
size
,
&
message_index
);
assert_equals
((
std
::
size_t
)
7
,
res
);
assert_equals
((
const
uint8_t
*
)
"Message"
,
plaintext_buf2
,
res
);
assert_equals
(
uint32_t
(
0
),
message_index
);
assert_equals
(
1
,
olm_inbound_group_session_is_verified
(
session2
));
}
{
TestCase
test_case
(
"Invalid signature group message"
);
...
...
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