Проблемы с использованием libsrtp на EL9
У меня возникли проблемы с включениемres_srtp
модуль в астериске. Каждая попытка приводит к этому не очень полезному сообщению об ошибке:
WARNING[47044] res_srtp.c: Failed to initialize libsrtp
ERROR[47044] loader.c: *** Failed to load module res_srtp.so
ERROR[47044] asterisk.c: Module initialization failed. ASTERISK EXITING!
Я хотел бы исправить это и заставить его работать, так что теперь мы перейдем к программированию. Я не программист на C по профессии, но я смог использовать свои ограниченные навыки работы с gdb, чтобы отследить ошибку через libsrtp.
crypto_kernel_init()
функция. Ошибка возникает при попытке включить шифр AES-GCM-128.
Я смог добраться только доPK11_Encrypt()
в библиотеке NSS , где я не смог войти в эту строку кода. Я думаю, это потому, что (опять же, очень ограниченное знание C) это макрос, а не настоящая функция?
crv = PK11_GETTAB(slot)->C_EncryptInit(session, &mech, symKey->objectID);
// returns 113
Итак, мой вопрос: как мне продолжить отладку до такой степени, что я могу отправить кому-нибудь отчет об ошибке, или (предпочтительно) у кого-нибудь есть libsrtp, работающий в этой среде? Других сообщений о подобных проблемах было очень мало , вероятно, потому, что EL9 еще не получил широкого распространения.
Мой дистрибутив (AlmaLinux) работает под управлением NSS 3.71, и я пытался обновить его до NSS 3.79 без каких-либо изменений.
Вот трассировка, откуда я смог добраться, если это чем-то поможет.
#0 PK11_Encrypt (symKey=0x555555ea1a00, mechanism=mechanism@entry=4231, param=param@entry=0x7fffffffc9a0,
out=out@entry=0x7fffffffcb50 "\331\061\062%\370\204\006\345\245Y\tů\365&\232\206\247\251S\025\064\367\332.L0=\212\061\212r\034<\f\225\225h\tS/\317\016$I\246\265%\261j\355\365\252\r\346W\272c{9", outLen=outLen@entry=0x7fffffffca3c, maxLen=<optimized out>,
data=0x7fffffffcb50 "\331\061\062%\370\204\006\345\245Y\tů\365&\232\206\247\251S\025\064\367\332.L0=\212\061\212r\034<\f\225\225h\tS/\317\016$I\246\265%\261j\355\365\252\r\346W\272c{9", dataLen=60) at ../pk11wrap/pk11obj.c:972
#1 0x00007ffff456a455 in srtp_aes_gcm_nss_do_crypto (enc_len=0x7fffffffca3c,
buf=0x7fffffffcb50 "\331\061\062%\370\204\006\345\245Y\tů\365&\232\206\247\251S\025\064\367\332.L0=\212\061\212r\034<\f\225\225h\tS/\317\016$I\246\265%\261j\355\365\252\r\346W\272c{9", encrypt=1, cv=0x5555562a19c0) at crypto/cipher/aes_gcm_nss.c:297
#2 srtp_aes_gcm_nss_encrypt (cv=0x5555562a19c0, buf=<optimized out>, enc_len=0x7fffffffca3c) at crypto/cipher/aes_gcm_nss.c:345
#3 0x00007ffff456cb24 in srtp_cipher_type_test (ct=0x7ffff457a6c0 <srtp_aes_gcm_128>, test_data=0x7ffff457a420 <srtp_aes_gcm_test_case_0>)
at crypto/cipher/cipher.c:297
#4 0x00007ffff456d545 in srtp_cipher_type_test (ct=<optimized out>, test_data=<optimized out>) at crypto/cipher/cipher.c:605
#5 0x00007ffff456d58d in srtp_cipher_type_self_test (ct=<optimized out>) at crypto/cipher/cipher.c:613
#6 0x00007ffff457005d in srtp_crypto_kernel_do_load_cipher_type (replace=0, id=6, new_ct=0x7ffff457a6c0 <srtp_aes_gcm_128>)
at crypto/kernel/crypto_kernel.c:293
#7 srtp_crypto_kernel_load_cipher_type (new_ct=new_ct@entry=0x7ffff457a6c0 <srtp_aes_gcm_128>, id=id@entry=6) at crypto/kernel/crypto_kernel.c:343
#8 0x00007ffff457036e in srtp_crypto_kernel_init () at crypto/kernel/crypto_kernel.c:139
#9 srtp_crypto_kernel_init () at crypto/kernel/crypto_kernel.c:72
#10 0x00007ffff457040d in srtp_init () at srtp/srtp.c:2729
#11 0x00007ffff458718d in res_srtp_init () at /usr/src/debug/asterisk-16.28.0-0.el9.x86_64/res/res_srtp.c:1237
#12 load_module () at /usr/src/debug/asterisk-16.28.0-0.el9.x86_64/res/res_srtp.c:1272
#13 0x000055555566c4dc in start_resource.part.0.lto_priv.0 (mod=0x555555a469d0) at /usr/src/debug/asterisk-16.28.0-0.el9.x86_64/main/loader.c:1718
#14 0x0000555555665517 in start_resource (mod=0x555555a469d0) at /usr/src/debug/asterisk-16.28.0-0.el9.x86_64/main/loader.c:1692
#15 start_resource_attempt (mod=mod@entry=0x555555a469d0, count=count@entry=0x7fffffffce94)
at /usr/src/debug/asterisk-16.28.0-0.el9.x86_64/main/loader.c:1894
#16 0x000055555566862f in start_resource_list (mod_count=0x7fffffffce94, resources=0x7fffffffceb0)
at /usr/src/debug/asterisk-16.28.0-0.el9.x86_64/main/loader.c:1991
#17 load_resource_list (mod_count=<synthetic pointer>, load_order=0x7fffffffcea0) at /usr/src/debug/asterisk-16.28.0-0.el9.x86_64/main/loader.c:2173
#18 load_modules () at /usr/src/debug/asterisk-16.28.0-0.el9.x86_64/main/loader.c:2396
#19 0x000055555559e074 in asterisk_daemon (isroot=<optimized out>, rungroup=<optimized out>, runuser=<optimized out>)
at /usr/src/debug/asterisk-16.28.0-0.el9.x86_64/main/asterisk.c:4258
#20 main (argc=<optimized out>, argv=<optimized out>) at /usr/src/debug/asterisk-16.28.0-0.el9.x86_64/main/asterisk.c:4025
1 ответ
Пройдя шаги отладки еще несколько раз, я попытался найти начальное возвращаемое значение изsrtp_kernel_init()
который былsrtp_err_status_cipher_fail
; В итоге я нашел решенную проблему с теми же симптомами для Fedora Linux:
Проблема оказалась в несовместимости с nss-3.63, поставляемым с F34. Прикрепленный патч добавляет
NSS_PKCS11_2_0_COMPAT
определяет 2 файла заголовков, чтобы включить обратную совместимость. Такое же исправление уже находится в репозитории github основной ветки разработки и предназначено для следующего выпуска libsrtp.
Мне удалось применить их патч к кодовой базе libsrtp 2.3.0, и теперь библиотека успешно загружается:
index 4d6031f..b1da343 100644
--- a/crypto/include/aes_gcm.h
+++ b/crypto/include/aes_gcm.h
@@ -66,6 +66,8 @@ typedef struct {
#ifdef NSS
+#define NSS_PKCS11_2_0_COMPAT 1
+
#include <nss.h>
#include <pk11pub.h>
index ad306dd..a57564f 100644
--- a/crypto/include/aes_icm_ext.h
+++ b/crypto/include/aes_icm_ext.h
@@ -65,6 +65,8 @@ typedef struct {
#ifdef NSS
+#define NSS_PKCS11_2_0_COMPAT 1
+
#include <nss.h>
#include <pk11pub.h>
Я не уверен, что второй кусок нужен, так как шифры ICM загружались нормально, но я все равно применил его.