Проблемы с использованием 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 загружались нормально, но я все равно применил его.

Другие вопросы по тегам