Миграция на OpenSSL 1.1.1
От: qaz77  
Дата: 15.07.20 08:56
Оценка:
Здравствуйте.

В одном проекте, использующем OpenSSL, решили обновить версию.
Раньше была версия 1.0.2d.
Взял последнюю стабильную 1.1.1g от Апр 2020.

Собрал, установил. Стал компилировать свои исходники...
У меня челюсть отвисла. Они поменяли все!

Ну ладно выкинули старые ненадежные алгоритмы, это правильно.
Но они все структуры, которые раньше были в публичных заголовках, сделали непрозрачными!
Никакими дефайнами совместимость тут не настроить!

Было:
EVP_MD_CTX mdctx;
EVP_MD_CTX_init(&mdctx);
// работаем с mdctx...
EVP_MD_CTX_cleanup(&mdctx);


Теперь надо так:
EVP_MD_CTX *mdctx;
mdctx = EVP_MD_CTX_new();
// работаем с mdctx...
EVP_MD_CTX_free(mdctx);


Просто крик души.
Ну как так можно?
Вроде серьезная библиотека...
Или в опенсорсе это норм?
Re: Миграция на OpenSSL 1.1.1
От: Zhendos  
Дата: 15.07.20 10:40
Оценка: +2
Здравствуйте, qaz77, Вы писали:

Q>Здравствуйте.


Q>Просто крик души.

Q>Ну как так можно?
Q>Вроде серьезная библиотека...
Q>Или в опенсорсе это норм?

Везде ломают обратную совместимость время от времени,
при чем здесь opensource и серьезность библиотеки?
Re[2]: Миграция на OpenSSL 1.1.1
От: qaz77  
Дата: 15.07.20 10:54
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Везде ломают обратную совместимость время от времени,


Здесь сломали не обратную, а в обе стороны совместимость. При том вполне осознанно.
Надо весь исходный код, использующий вызовы OpenSSL, перелопачивать...

Z>при чем здесь opensource и серьезность библиотеки?


Очень даже причем.
В коммерческом продукте пользователи платят деньги и перестают платить, если их обижать.
А под серьезностью я имел в виду большое распространение библиотеки и, соответственно, большое сообщество пользователей.
В данном случае на сообщество плюнули и оно утерлось.
Ладно бы была какая-то нишевая библиотека у которой 3 пользователя.
Re[3]: Миграция на OpenSSL 1.1.1
От: Zhendos  
Дата: 15.07.20 12:20
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Здравствуйте, Zhendos, Вы писали:


Z>>Везде ломают обратную совместимость время от времени,


Q>Здесь сломали не обратную, а в обе стороны совместимость. При том вполне осознанно.

Q>Надо весь исходный код, использующий вызовы OpenSSL, перелопачивать...

В обе стороны это если бы они в новой мажорной версии сломали
совместимость между скажем 1.1.1a и 1.1.1b,
а такого как я понимаю не произошло?

Z>>при чем здесь opensource и серьезность библиотеки?


Q>Очень даже причем.

Q>В коммерческом продукте пользователи платят деньги и перестают платить, если их обижать.

НУ в сказочной стране может быть. А так возьмем например google map api для сайтов,
там не просто купил и пользуйся, там грубо говоря платишь за каждый вызов функции,
догадайтесь с одного раза ломали ли они API несовместимым образом?

Q>А под серьезностью я имел в виду большое распространение библиотеки и, соответственно, большое сообщество пользователей.


Ну это странная оценка действительно, есть же LTS релизы openssl,
в рамках их не ломают совместимость, а то что разные LTS релизы будут совместимы
никто не обещал.
Re[4]: Миграция на OpenSSL 1.1.1
От: qaz77  
Дата: 15.07.20 12:30
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>В обе стороны это если бы они в новой мажорной версии сломали

Z>совместимость между скажем 1.1.1a и 1.1.1b,
Z>а такого как я понимаю не произошло?

Сломали совместимость между 1.0.* и 1.1.*
Это смена мажорной версии?

Сейчас у них альфа называется 3.0.0, но это связано со сменой лицензии, как я понял.
Но не про нее речь.

Z>Ну это странная оценка действительно, есть же LTS релизы openssl,

Z>в рамках их не ломают совместимость, а то что разные LTS релизы будут совместимы
Z>никто не обещал.

LTS для 1.0.2 кончается в этом году, 1.1.1 — до 23-го года.
Как бы тоже выжимают со старых версий.

Есть же масса других примеров С-библиотек, которые не создают такого геммороя: zlib, curl
Re[5]: Миграция на OpenSSL 1.1.1
От: Хреннос  
Дата: 15.07.20 18:47
Оценка: +1
Здравствуйте, qaz77, Вы писали:

Q>Есть же масса других примеров С-библиотек, которые не создают такого геммороя: zlib, curl

zlib уже 3 года как никто не трогает, да и до того несколько лет библиотека была в заморозке — разве что баги слегка фиксили. Т.е. секрет их безгеморройности — мертвость.
В curl не меняется основной интерфейс, но только за счет того, что он изначально убогий. А так за годы разработки внесена куча несовместимых изменений, начиная от введения новых функций и заканчивая удалением старых опций.
Re: Миграция на OpenSSL 1.1.1
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 16.07.20 19:38
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Но они все структуры, которые раньше были в публичных заголовках, сделали непрозрачными!

Q>Никакими дефайнами совместимость тут не настроить!

Ну почему — можно сначала весь свой код таким образом на указатели перевести ещё оставаясь на 1.0, а потом уже в рамках достигнутого переключиться на 1.1.
Так а чего они этим добились? Работают, в терминах ООП, через указатель на базовый класс?

Q>Вроде серьезная библиотека...


Погугли причины... наверняка они были и далеко не просто с бухты-барахты.
The God is real, unless declared integer.
Re[2]: Миграция на OpenSSL 1.1.1
От: qaz77  
Дата: 17.07.20 07:38
Оценка:
Здравствуйте, netch80, Вы писали:

N>Ну почему — можно сначала весь свой код таким образом на указатели перевести ещё оставаясь на 1.0, а потом уже в рамках достигнутого переключиться на 1.1.

N>Так а чего они этим добились? Работают, в терминах ООП, через указатель на базовый класс?

В 1.0 работали напрямую с членами структур, а в 1.1 аналогичные действия — только через функции, которых нет в 1.0.
Притом для меня не стоит задача, чтобы код компилировался и там, и там.
Но для перехода на 1.1 надо перелопатить чертову кучу кода...

Вот, например, настройка Диффи-Хеллмана была раньше через поля:
const unsigned char* dh2048_p[] = { ... };
const unsigned char* dh2048_g[] = { ... };

DH* dh = DH_new();
dh->p = BN_bin2bn(dh2048_p, sizeof(dh2048_p), 0);
dh->g = BN_bin2bn(dh2048_g, sizeof(dh2048_g), 0);

//...

DH_free(dh);


Теперь только так:
const unsigned char* dh2048_p[] = { ... };
const unsigned char* dh2048_g[] = { ... };

DH* dh = DH_new();

BIGNUM* p = BN_bin2bn(dh2048_p, sizeof(dh2048_p), 0);
BIGNUM* g = BN_bin2bn(dh2048_g, sizeof(dh2048_g), 0);
DH_set0_pqg(dh, p, 0, g);

//...

DH_free(dh);



N>Погугли причины... наверняка они были и далеко не просто с бухты-барахты.


Из любви к прекрасному.
https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes

А разгребать их тягу к прекрасному предлагается так:
 #if OPENSSL_VERSION_NUMBER < 0x10100000L
 #define OBJ_get0_data(o) ((o)->data)
 #define OBJ_length(o) ((o)->length)
 #endif
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.