🚀

【C 言語】【Zig】【PHP FFI】OpenSSL のバージョン番号を表示する

2024/04/23に公開

Debian であらかじめ次のパッケージがインストールされていることを前提とする

sudo apt install libssl-dev

まずは C 言語でマクロバージョンを使ってバージョン番号を表示させてみよう

#include <stdio.h>
#include <openssl/opensslv.h>

int main(int argc, char *argv[]) {
  printf("%s\n", OPENSSL_VERSION_STR);
  printf("%s\n", OPENSSL_VERSION_TEXT);

  return 0;
}

結果は次のとおり

zig run test.c -l c -l ssl
3.0.11
OpenSSL 3.0.11 19 Sep 2023

ソースコードからコンパイルしたもののインストールしていない OpenSSL であれば、次のようにパスを指定できる

zig run test.c -l c -l ssl -L $HOME/openssl -I $HOME/openssl/include

今度は OpenSSL_version 関数で同じ結果を出力させてみよう

#include <stdio.h>
#include <openssl/crypto.h>;

int main(int argc, char *argv[]) {
  printf("%s\n", OpenSSL_version(OPENSSL_VERSION_STRING));
  printf("%s\n", OpenSSL_version(OPENSSL_VERSION));
  return 0;
}

コンパイルと実行は次のとおり

zig run test.c -l c -l crypto

今度は Zig でマクロバージョンを書いてみよう

const std = @import("std");
const print = std.debug.print;
const OpenSSL = @cImport({
    @cInclude("openssl/opensslv.h");
});

pub fn main() !void {
  print("{s}\n", .{OpenSSL.OPENSSL_VERSION_STR});
  print("{s}\n", .{OpenSSL.OPENSSL_VERSION_TEXT});
}

コンパイルと実行は次のとおり

zig run test.zig -lc -lssl

関数版も書いてみよう

const std = @import("std");
const print = std.debug.print;
const OpenSSL = @cImport({
    @cInclude("openssl/crypto.h");
});

pub fn main() !void {
  print("{s}\n", .{OpenSSL.OpenSSL_version(OpenSSL.OPENSSL_VERSION_STRING)});
  print("{s}\n", .{OpenSSL.OpenSSL_version(OpenSSL.OPENSSL_VERSION)});
}

コンパイルと実行は次のとおり

zig run test.zig -lc -lcrypto

最後に PHP FFI を示す

$ffi = FFI::cdef('
  unsigned int OPENSSL_version_major(void);
  unsigned int OPENSSL_version_minor(void);
  unsigned int OPENSSL_version_patch(void);
');

$major = $ffi->OPENSSL_version_major();
$minor = $ffi->OPENSSL_version_minor();
$patch = $ffi->OPENSSL_version_patch();;

var_dump(
  $major.'.'.$minor.'.'.$patch
);

Discussion