diff options
author | Hubert Chathi <hubert@uhoreg.ca> | 2019-04-02 23:39:05 -0400 |
---|---|---|
committer | Hubert Chathi <hubert@uhoreg.ca> | 2019-04-02 23:39:05 -0400 |
commit | 3148157ea4262082d957f45b36016c44f8e1415a (patch) | |
tree | 81f07c4df2935dec84ff1e8660cfdee8d9ce380a | |
parent | d5c0eb9d20a17ec596784f53f3c9ffab0e9ad772 (diff) |
add support for an incorrect KDF that snuck into Riot 1.0
-rw-r--r-- | include/olm/sas.h | 8 | ||||
-rw-r--r-- | javascript/olm_sas.js | 16 | ||||
-rw-r--r-- | src/sas.c | 23 |
3 files changed, 47 insertions, 0 deletions
diff --git a/include/olm/sas.h b/include/olm/sas.h index 46d4176..ec90ae7 100644 --- a/include/olm/sas.h +++ b/include/olm/sas.h @@ -147,6 +147,14 @@ size_t olm_sas_calculate_mac( void * mac, size_t mac_length ); +// for compatibility with an old version of Riot +size_t olm_sas_calculate_mac_long_kdf( + OlmSAS * sas, + void * input, size_t input_length, + const void * info, size_t info_length, + void * mac, size_t mac_length +); + /** @} */ // end of SAS group #ifdef __cplusplus diff --git a/javascript/olm_sas.js b/javascript/olm_sas.js index d5044ce..a2f82ee 100644 --- a/javascript/olm_sas.js +++ b/javascript/olm_sas.js @@ -75,3 +75,19 @@ SAS.prototype['calculate_mac'] = restore_stack(function(input, info) { ); return Pointer_stringify(mac_buffer); }); + +SAS.prototype['calculate_mac_long_kdf'] = restore_stack(function(input, info) { + var input_array = array_from_string(input); + var input_buffer = stack(input_array); + var info_array = array_from_string(info); + var info_buffer = stack(info_array); + var mac_length = sas_method(Module['_olm_sas_mac_length'])(this.ptr); + var mac_buffer = stack(mac_length + NULL_BYTE_PADDING_LENGTH); + sas_method(Module['_olm_sas_calculate_mac_long_kdf'])( + this.ptr, + input_buffer, input_array.length, + info_buffer, info_array.length, + mac_buffer, mac_length + ); + return Pointer_stringify(mac_buffer); +}); @@ -139,3 +139,26 @@ size_t olm_sas_calculate_mac( _olm_encode_base64((const uint8_t *)mac, SHA256_OUTPUT_LENGTH, (uint8_t *)mac); return 0; } + +// for compatibility with an old version of Riot +size_t olm_sas_calculate_mac_long_kdf( + OlmSAS * sas, + void * input, size_t input_length, + const void * info, size_t info_length, + void * mac, size_t mac_length +) { + if (mac_length < olm_sas_mac_length(sas)) { + sas->last_error = OLM_OUTPUT_BUFFER_TOO_SMALL; + return (size_t)-1; + } + uint8_t key[256]; + _olm_crypto_hkdf_sha256( + sas->secret, sizeof(sas->secret), + NULL, 0, + (const uint8_t *) info, info_length, + key, 256 + ); + _olm_crypto_hmac_sha256(key, 256, input, input_length, mac); + _olm_encode_base64((const uint8_t *)mac, SHA256_OUTPUT_LENGTH, (uint8_t *)mac); + return 0; +} |