OpenSSL3のProviderを設定するAPIを提供するGemをリリースした

タイトルの通りGemをリリースしたので紹介します。

リンクは↓
https://github.com/QWYNG/openssl_Provider

モチベーション

OpenSSL3になってEngineという概念がなくなって、新たにProviderという概念が導入されました。
デフォルトのProviderだと、RC2やRC5等推奨されていない暗号アルゴリズムを使うことができません。

Providerは設定ファイルで変更することができます。RubyのOpenSSLライブラリでもconfigファイルを使ってProviderを設定することが可能です。

設定ファイル以外にも、OpenSSLはProviderを設定するAPIを提供しています。
ですが、RubyのOpenSSLライブラリのVersion 3.1.0はこのAPIをラップしていません。なので、RubyでこのAPIを使うためのGemを作りました。

使い方

require 'openssl_provider'

legacy = OpenSSL::Provider.load("legacy")

# デフォルトのProviderのままだと、RC4を使うことができない
# OpenSSL::Cipher.new("RC4")
# => OpenSSL::Cipher::CipherError: unsupported
OpenSSL::Cipher.new("RC4")

OpenSSL::PKCS12.new(File.read("古い形式で暗号化されたファイル"), "password")

# unloadもできる
OpenSSL::Provider.unload(legacy)

注意点

メモリ周りの処理がかなり怪しいです。最初は本家にPRを送ろうと思っていたのですが、かなり低クオリティなものを作りそうだったのでPRを送るのはやめました。
Providerのインスタンスのメモリ解放の部分が特に怪しいです。過去に存在したEngineは構造体を解放するAPIが公開されていたんですが、ProviderにはそれにあたるAPIが自分が調べた限り公開されていませんでした。
Rubyはオブジェクトにあたる構造体がGCされるときにフックさせる関数を設定できるのですが、なにも設定していません1。 ただ構造体がRubyオブジェクトへの参照もってたりするわけではないので、なんとかなる…ハズ。
ライブラリコンテキストを注入できる機能も使えていません

おわりに

とんでもない注意点を書いてしまったので使ってくれる人がいるかかなり怪しいですが、使ってくれると嬉しいです。バグ報告されたら嬉しくて泣くと思います。


  1. 構造体まわりのドキュメント。Cの構造体と関数周りなんもわからん ↩︎