OpenVPNのソースコードを読んでみる

openvpn
こんにちは、GX 推進グループの平井です。

CTF について書こうとも思ったのですが CTF についての記事はたくさんあるので、
ちょっとマニアックではありますが OpenVPN について腰を据えてじっくり読んでみようかと思います。
マトリックス、007のようなシリーズものになるかもしれません。

リポジトリやソースコード

OpenVPN の GitHub リポジトリはこちらです。
github.com

2021年10月11日時点での最新バージョンは2.5.4で、最新版のソースコードはこちらからダウンロードできます。
openvpn.net

拡張子ごとのファイル数

blog.tech-monex.com
上記の記事で紹介したコマンドを OpenVPN のリポジトリに使用すると残念ながら上手くいかなかったのと、拡張子ごとのファイル数も知りたかったので、
あらたにこのようなコマンドを使用しました。

find . -type f | awk -F/ '{print $NF}' | awk -F. '{print $NF}' | sort | uniq -c | sort -r

実行結果はこちらです。

    128 c
    111 h
     36 in
     28 rst
     27 am
     13 sh
     12 m4
     11 cmake
      8 README
      7 props
      7 key
      6 vcxproj
      5 filters
      5 crt
      5 conf
      4 up
      4 rc
      4 patch
      4 bat
      3 winbuild
      3 txt
      3 ovpn
      2 py
      2 plugins
      2 pl
      2 manifest
      2 html
      2 exports
      2 down
      2 def
      2 IPv6
      1 xinetd-server-config
      1 xinetd-client-config
      1 verify-cn
      1 valgrind-suppress
      1 usage
      1 systemd
      1 sub
      1 sln
      1 rc-sample
      1 pem
      1 p12
      1 missing
      1 mbedtls
      1 mak
      1 loopback-server
      1 loopback-client
      1 json
      1 js
      1 install-sh
      1 inc
      1 guess
      1 gitignore
      1 gitattributes
      1 down-root
      1 dovalns
      1 doval
      1 depcomp
      1 configure
      1 compile
      1 cnf
      1 bridge-stop
      1 bridge-start
      1 auth-pam
      1 ac
      1 PORTS
      1 NEWS
      1 Makefile
      1 INSTALL
      1 GPL
      1 ChangeLog
      1 COPYING
      1 CONTROL
      1 AUTHORS
      1 8
      1 5

GitHub の Languages でもわかりますが、 拡張子が c や h のファイルが多いことからメインで使用されているプログラミング言語が C だということがわかります。

特定の拡張子のファイルの行数

リポジトリの規模、より正確に言えば興味のあるファイルの行数も一応知りたいです。
C 言語だとわかったので、拡張子が c のファイルと拡張子が h のファイルのそれぞれの行数を調べてみました。

まずは c (ソースコード)

$find . -name "*.c" | xargs wc -l | sort -r
 104727 合計
   8804 ./src/openvpn/options.c
   7017 ./src/openvpn/tun.c
   4777 ./src/openvpn/init.c
   4159 ./src/openvpn/socket.c
   4153 ./src/openvpn/manage.c
   4146 ./src/openvpn/ssl.c
   4069 ./src/openvpn/multi.c
   4065 ./src/openvpn/route.c
   2409 ./src/compat/compat-lz4.c
   2299 ./src/openvpn/ssl_openssl.c
   2242 ./src/openvpnserv/interactive.c
   2124 ./src/openvpn/forward.c
   1957 ./src/openvpn/crypto.c
   1547 ./src/openvpn/ssl_mbedtls.c
   1519 ./src/openvpn/ssl_verify.c
   1512 ./src/openvpn/win32.c
   1431 ./src/openvpn/buffer.c
   1367 ./src/tapctl/tap.c
   1339 ./src/openvpn/networking_sitnl.c
   1297 ./src/openvpnmsica/openvpnmsica.c
   1264 ./src/openvpn/cryptoapi.c
   1190 ./src/openvpn/event.c
   1120 ./src/openvpn/crypto_openssl.c
   1089 ./src/openvpn/proxy.c
   1039 ./src/openvpn/ps.c
   1033 ./src/openvpn/pkcs11.c
   1031 ./src/plugins/auth-pam/auth-pam.c
   1023 ./src/openvpn/plugin.c
   1002 ./src/openvpn/error.c
    987 ./src/openvpn/crypto_mbedtls.c
    943 ./src/openvpn/push.c
    861 ./src/openvpn/mtcp.c
    839 ./src/openvpn/pool.c
    827 ./src/openvpn/misc.c
    794 ./src/openvpn/ssl_verify_openssl.c
    787 ./src/openvpn/pf.c
    778 ./src/openvpn/reliable.c
    743 ./src/openvpn/tls_crypt.c
    723 ./src/openvpn/schedule.c
    695 ./src/openvpn/packet_id.c
    657 ./src/openvpn/list.c
    652 ./tests/unit_tests/openvpn/test_tls_crypt.c
    622 ./src/openvpn/socks.c
    615 ./src/openvpn/mroute.c
    612 ./sample/sample-plugins/client-connect/sample-client-connect.c
    593 ./src/openvpn/helper.c
    576 ./src/plugins/down-root/down-root.c
    554 ./src/openvpn/ssl_verify_mbedtls.c
    541 ./sample/sample-plugins/defer/simple.c
    504 ./src/openvpn/argv.c
    486 ./src/openvpn/platform.c
    464 ./src/openvpn/sig.c
    459 ./src/openvpn/env_set.c
    445 ./src/openvpn/fragment.c
    444 ./src/tapctl/main.c
    434 ./src/openvpnserv/automatic.c
    428 ./src/openvpn/block_dns.c
    424 ./src/openvpn/occ.c
    421 ./src/openvpn/ntlm.c
    410 ./src/openvpn/auth_token.c
    407 ./src/openvpn/networking_iproute2.c
    397 ./tests/unit_tests/openvpn/test_auth_token.c
    384 ./src/openvpn/mudp.c
    366 ./src/openvpn/openvpn.c
    348 ./src/openvpnserv/validate.c
    346 ./src/openvpn/mtu.c
    342 ./src/openvpn/ssl_ncp.c
    333 ./src/openvpn/vlan.c
    329 ./src/openvpn/perf.c
    323 ./src/openvpn/comp-lz4.c
    321 ./src/openvpnserv/common.c
    319 ./src/openvpn/status.c
    310 ./src/openvpnserv/service.c
    298 ./sample/sample-plugins/keying-material-exporter-demo/keyingmaterialexporter.c
    296 ./sample/sample-plugins/log/log_v3.c
    288 ./src/openvpn/run_command.c
    286 ./src/openvpn/console_builtin.c
    279 ./tests/unit_tests/openvpn/test_buffer.c
    278 ./src/openvpn/clinat.c
    274 ./src/openvpn/lzo.c
    273 ./tests/unit_tests/openvpn/test_argv.c
    265 ./src/openvpnmsica/msiex.c
    253 ./tests/unit_tests/openvpn/test_networking.c
    242 ./src/openvpn/gremlin.c
    241 ./tests/unit_tests/openvpn/test_ncp.c
    230 ./src/openvpn/proto.c
    211 ./src/openvpn/otime.c
    210 ./sample/sample-plugins/log/log.c
    206 ./src/openvpn/mss.c
    203 ./sample/sample-plugins/simple/base64.c
    202 ./src/openvpn/base64.c
    199 ./src/plugins/auth-pam/pamdl.c
    198 ./src/openvpnmsica/dllmain.c
    194 ./src/openvpn/pkcs11_openssl.c
    190 ./src/openvpn/dhcp.c
    184 ./tests/unit_tests/openvpn/test_packet_id.c
    184 ./src/openvpn/compstub.c
    180 ./src/openvpn/mbuf.c
    176 ./src/openvpn/comp.c
    164 ./src/openvpn/httpdigest.c
    159 ./src/openvpn/pkcs11_mbedtls.c
    158 ./tests/unit_tests/openvpn/test_crypto.c
    146 ./src/compat/compat-dirname.c
    139 ./src/openvpnmsica/msica_arg.c
    134 ./src/compat/compat-gettimeofday.c
    130 ./sample/sample-plugins/simple/simple.c
    127 ./src/openvpn/mstats.c
    125 ./src/plugins/auth-pam/utils.c
    124 ./src/openvpn/console_systemd.c
    116 ./tests/unit_tests/engine-key/libtestengine.c
    109 ./src/compat/compat-daemon.c
    103 ./src/openvpn/shaper.c
     95 ./tests/unit_tests/openvpn/mock_msg.c
     94 ./src/openvpn/ping.c
     87 ./src/openvpn/fdmisc.c
     86 ./src/openvpn/console.c
     85 ./tests/unit_tests/plugins/auth-pam/test_search_and_replace.c
     84 ./src/openvpn/interval.c
     81 ./src/compat/compat-inet_pton.c
     78 ./src/compat/compat-inet_ntop.c
     70 ./src/openvpn/lladdr.c
     61 ./src/compat/compat-strsep.c
     60 ./src/openvpn/session_id.c
     58 ./tests/unit_tests/example_test/test.c
     50 ./src/compat/compat-basename.c
     36 ./tests/unit_tests/openvpn/mock_get_random.c
     36 ./src/tapctl/error.c
     25 ./tests/unit_tests/example_test/test2.c

約10万行で、option.c がもっともでかいようです。
オプションが充実しているみたいですね。

つづいて h (ヘッダーファイル)

$find . -name "*.h" | xargs wc -l | sort -r
 25272 合計
  1265 ./src/openvpn/socket.h
  1222 ./src/openvpn/buffer.h
   883 ./include/openvpn-plugin.h
   861 ./src/openvpn/options.h
   802 ./src/openvpn/openssl_compat.h
   764 ./src/compat/compat-lz4.h
   738 ./src/openvpn/tun.h
   702 ./src/openvpn/crypto_backend.h
   688 ./src/openvpn/multi.h
   650 ./src/openvpn/syshead.h
   622 ./src/openvpn/ssl.h
   616 ./src/openvpn/manage.h
   603 ./src/openvpn/ssl_common.h
   566 ./src/openvpn/ssl_backend.h
   565 ./src/openvpn/openvpn.h
   554 ./src/openvpn/crypto.h
   480 ./src/openvpn/fragment.h
   476 ./src/openvpn/reliable.h
   447 ./src/openvpn/forward.h
   409 ./src/openvpn/route.h
   403 ./src/openvpn/error.h
   342 ./src/openvpn/packet_id.h
   339 ./src/openvpn/proto.h
   333 ./src/openvpn/win32.h
   327 ./src/openvpn/mtu.h
   308 ./src/openvpn/otime.h
   305 ./src/openvpn/networking.h
   271 ./src/openvpn/ssl_verify_backend.h
   271 ./src/openvpn/mroute.h
   261 ./src/openvpn/interval.h
   247 ./src/openvpn/ssl_verify.h
   228 ./src/openvpn/tls_crypt.h
   228 ./src/openvpn/misc.h
   213 ./src/openvpn/plugin.h
   208 ./src/openvpn/comp.h
   195 ./src/openvpn/list.h
   181 ./src/tapctl/tap.h
   181 ./src/openvpn/errlevel.h
   178 ./src/openvpn/shaper.h
   175 ./config-msvc.h
   166 ./src/openvpnmsica/openvpnmsica.h
   164 ./src/openvpn/platform.h
   163 ./src/openvpn/integer.h
   161 ./src/openvpn/event.h
   156 ./src/openvpn/occ.h
   155 ./src/openvpn/crypto_mbedtls.h
   149 ./src/openvpn/init.h
   147 ./src/openvpn/pf.h
   138 ./include/openvpn-msg.h
   137 ./src/openvpn/schedule.h
   136 ./src/openvpn/ssl_mbedtls.h
   132 ./src/openvpn/auth_token.h
   130 ./src/openvpn/lzo.h
   125 ./src/openvpn/ring_buffer.h
   123 ./src/openvpn/env_set.h
   119 ./src/openvpn/sig.h
   119 ./src/openvpn/console.h
   118 ./src/openvpn/ssl_ncp.h
   118 ./src/openvpn/crypto_openssl.h
   116 ./src/compat/compat-versionhelpers.h
   115 ./src/openvpn/mbuf.h
   113 ./src/openvpn/memdbg.h
   112 ./src/openvpnmsica/msiex.h
   112 ./src/openvpnmsica/msica_arg.h
   107 ./src/openvpnserv/service.h
   106 ./src/openvpn/pool.h
   105 ./src/openvpn/status.h
    97 ./src/tapctl/error.h
    96 ./src/openvpn/common.h
    95 ./src/openvpn/proxy.h
    93 ./src/openvpn/push.h
    92 ./src/openvpn/perf.h
    88 ./src/openvpn/ping.h
    86 ./src/openvpn/dhcp.h
    82 ./src/openvpn/session_id.h
    78 ./src/compat/compat.h
    77 ./src/openvpn/ssl_verify_mbedtls.h
    77 ./src/openvpn/circ_list.h
    76 ./src/openvpn/pkcs11.h
    76 ./src/openvpn/mtcp.h
    76 ./src/openvpn/argv.h
    75 ./src/openvpn/ssl_verify_openssl.h
    74 ./src/openvpn/pkcs11_backend.h
    73 ./src/openvpn/gremlin.h
    71 ./src/openvpn/socks.h
    69 ./src/openvpn/block_dns.h
    67 ./src/openvpn/run_command.h
    67 ./src/openvpn/mudp.h
    67 ./src/openvpn/clinat.h
    66 ./src/tapctl/basic.h
    65 ./src/plugins/auth-pam/utils.h
    59 ./src/openvpn/ssl_openssl.h
    59 ./src/openvpn/ps.h
    59 ./src/openvpn/httpdigest.h
    51 ./src/openvpn/mstats.h
    49 ./src/openvpn/fdmisc.h
    47 ./src/openvpnserv/validate.h
    45 ./src/openvpn/base64.h
    44 ./src/openvpn/vlan.h
    41 ./src/openvpn/comp-lz4.h
    40 ./src/openvpn/pushlist.h
    39 ./src/openvpn/helper.h
    37 ./src/openvpn/networking_iproute2.h
    37 ./src/openvpn/basic.h
    36 ./src/openvpn/mss.h
    34 ./tests/unit_tests/openvpn/mock_msg.h
    28 ./src/openvpn/networking_sitnl.h
    12 ./src/openvpn/ntlm.h
     9 ./src/openvpn/lladdr.h
     7 ./src/plugins/auth-pam/pamdl.h
     7 ./src/openvpn/cryptoapi.h

socket.c や buffer.c は色々な変数、定数、構造体、関数などを使いそうですね。

ディレクトリ構造

tree コマンドの実行結果はこのようになりました。

.
|-- AUTHORS
|-- COPYING
|-- COPYRIGHT.GPL
|-- ChangeLog
|-- Changes.rst
|-- INSTALL
|-- Makefile.am
|-- Makefile.in
|-- NEWS
|-- PORTS
|-- README
|-- README.IPv6
|-- README.mbedtls
|-- TODO.IPv6
|-- aclocal.m4
|-- build
|   |-- Makefile.am
|   |-- Makefile.in
|   |-- ltrc.inc
|   `-- msvc
|       |-- Makefile.am
|       |-- Makefile.in
|       `-- msvc-generate
|           |-- Makefile.am
|           |-- Makefile.in
|           |-- Makefile.mak
|           |-- msvc-generate.js
|           `-- msvc-generate.vcxproj
|-- compat.m4
|-- compile
|-- config-msvc-version.h.in
|-- config-msvc.h
|-- config.guess
|-- config.h.in
|-- config.sub
|-- configure
|-- configure.ac
|-- contrib
|   |-- OCSP_check
|   |   `-- OCSP_check.sh
|   |-- README
|   |-- multilevel-init.patch
|   |-- openvpn-fwmarkroute-1.00
|   |   |-- README
|   |   |-- fwmarkroute.down
|   |   `-- fwmarkroute.up
|   |-- pull-resolv-conf
|   |   |-- client.down
|   |   `-- client.up
|   |-- vcpkg-ports
|   |   |-- openssl
|   |   |   |-- portfile.cmake
|   |   |   |-- unix
|   |   |   |   |-- CMakeLists.txt
|   |   |   |   |-- portfile.cmake
|   |   |   |   |-- remove-deps.cmake
|   |   |   |   `-- vcpkg-cmake-wrapper.cmake
|   |   |   |-- usage
|   |   |   |-- uwp
|   |   |   |   |-- EnableUWPSupport.patch
|   |   |   |   |-- make-openssl.bat
|   |   |   |   `-- portfile.cmake
|   |   |   |-- vcpkg.json
|   |   |   `-- windows
|   |   |       |-- portfile.cmake
|   |   |       `-- vcpkg-cmake-wrapper.cmake
|   |   `-- pkcs11-helper
|   |       |-- 0001-nmake-openssl-1.1.1-support.patch
|   |       |-- CONTROL
|   |       |-- pkcs11-helper-001-RFC7512.patch
|   |       `-- portfile.cmake
|   `-- vcpkg-triplets
|       |-- arm64-windows-ovpn.cmake
|       |-- x64-windows-ovpn.cmake
|       `-- x86-windows-ovpn.cmake
|-- debug
|   |-- doval
|   |-- dovalns
|   `-- valgrind-suppress
|-- depcomp
|-- distro
|   |-- Makefile.am
|   |-- Makefile.in
|   `-- systemd
|       |-- Makefile.am
|       |-- Makefile.in
|       |-- README.systemd
|       |-- openvpn-client@.service.in
|       |-- openvpn-server@.service.in
|       `-- tmpfiles-openvpn.conf
|-- doc
|   |-- Makefile.am
|   |-- Makefile.in
|   |-- README.plugins
|   |-- doxygen
|   |   |-- Makefile.am
|   |   |-- Makefile.in
|   |   `-- openvpn.doxyfile.in
|   |-- gui-notes.txt
|   |-- interactive-service-notes.rst
|   |-- man-sections
|   |   |-- advanced-options.rst
|   |   |-- client-options.rst
|   |   |-- connection-profiles.rst
|   |   |-- encryption-options.rst
|   |   |-- examples.rst
|   |   |-- generic-options.rst
|   |   |-- inline-files.rst
|   |   |-- link-options.rst
|   |   |-- log-options.rst
|   |   |-- management-options.rst
|   |   |-- network-config.rst
|   |   |-- pkcs11-options.rst
|   |   |-- plugin-options.rst
|   |   |-- protocol-options.rst
|   |   |-- proxy-options.rst
|   |   |-- renegotiation.rst
|   |   |-- script-options.rst
|   |   |-- server-options.rst
|   |   |-- signals.rst
|   |   |-- tls-options.rst
|   |   |-- unsupported-options.rst
|   |   |-- virtual-routing-and-forwarding.rst
|   |   |-- vpn-network-options.rst
|   |   `-- windows-options.rst
|   |-- management-notes.txt
|   |-- openvpn-examples.5
|   |-- openvpn-examples.5.html
|   |-- openvpn-examples.5.rst
|   |-- openvpn.8
|   |-- openvpn.8.html
|   `-- openvpn.8.rst
|-- include
|   |-- Makefile.am
|   |-- Makefile.in
|   |-- openvpn-msg.h
|   |-- openvpn-plugin.h
|   `-- openvpn-plugin.h.in
|-- install-sh
|-- ltmain.sh
|-- m4
|   |-- ax_emptyarray.m4
|   |-- ax_socklen_t.m4
|   |-- ax_varargs.m4
|   |-- libtool.m4
|   |-- ltoptions.m4
|   |-- ltsugar.m4
|   |-- ltversion.m4
|   |-- lt~obsolete.m4
|   `-- pkg.m4
|-- missing
|-- msvc-build.bat
|-- msvc-dev.bat
|-- msvc-env.bat
|-- openvpn.sln
|-- sample
|   |-- Makefile.am
|   |-- Makefile.in
|   |-- sample-config-files
|   |   |-- README
|   |   |-- client.conf
|   |   |-- firewall.sh
|   |   |-- home.up
|   |   |-- loopback-client
|   |   |-- loopback-server
|   |   |-- office.up
|   |   |-- openvpn-shutdown.sh
|   |   |-- openvpn-startup.sh
|   |   |-- server.conf
|   |   |-- tls-home.conf
|   |   |-- tls-office.conf
|   |   |-- xinetd-client-config
|   |   `-- xinetd-server-config
|   |-- sample-keys
|   |   |-- README
|   |   |-- ca.crt
|   |   |-- ca.key
|   |   |-- client-ec.crt
|   |   |-- client-ec.key
|   |   |-- client-pass.key
|   |   |-- client.crt
|   |   |-- client.key
|   |   |-- client.p12
|   |   |-- dh2048.pem
|   |   |-- gen-sample-keys.sh
|   |   |-- openssl.cnf
|   |   |-- server-ec.crt
|   |   |-- server-ec.key
|   |   |-- server.crt
|   |   |-- server.key
|   |   `-- ta.key
|   |-- sample-plugins
|   |   |-- Makefile
|   |   |-- Makefile.am
|   |   |-- Makefile.in
|   |   |-- Makefile.plugins
|   |   |-- README
|   |   |-- client-connect
|   |   |   |-- README
|   |   |   `-- sample-client-connect.c
|   |   |-- defer
|   |   |   |-- simple.c
|   |   |   |-- simple.def
|   |   |   `-- winbuild
|   |   |-- keying-material-exporter-demo
|   |   |   |-- README
|   |   |   |-- client.ovpn
|   |   |   |-- http-client.py
|   |   |   |-- http-server.py
|   |   |   |-- keyingmaterialexporter.c
|   |   |   `-- server.ovpn
|   |   |-- log
|   |   |   |-- log.c
|   |   |   |-- log_v3.c
|   |   |   `-- winbuild
|   |   `-- simple
|   |       |-- base64.c
|   |       |-- simple.c
|   |       |-- simple.def
|   |       `-- winbuild
|   |-- sample-scripts
|   |   |-- auth-pam.pl
|   |   |-- bridge-start
|   |   |-- bridge-stop
|   |   |-- ucn.pl
|   |   `-- verify-cn
|   `-- sample-windows
|       `-- sample.ovpn
|-- src
|   |-- Makefile.am
|   |-- Makefile.in
|   |-- compat
|   |   |-- Debug.props
|   |   |-- Makefile.am
|   |   |-- Makefile.in
|   |   |-- PropertySheet.props
|   |   |-- Release.props
|   |   |-- compat-basename.c
|   |   |-- compat-daemon.c
|   |   |-- compat-dirname.c
|   |   |-- compat-gettimeofday.c
|   |   |-- compat-inet_ntop.c
|   |   |-- compat-inet_pton.c
|   |   |-- compat-lz4.c
|   |   |-- compat-lz4.h
|   |   |-- compat-strsep.c
|   |   |-- compat-versionhelpers.h
|   |   |-- compat.h
|   |   |-- compat.vcxproj
|   |   `-- compat.vcxproj.filters
|   |-- openvpn
|   |   |-- Makefile.am
|   |   |-- Makefile.in
|   |   |-- argv.c
|   |   |-- argv.h
|   |   |-- auth_token.c
|   |   |-- auth_token.h
|   |   |-- base64.c
|   |   |-- base64.h
|   |   |-- basic.h
|   |   |-- block_dns.c
|   |   |-- block_dns.h
|   |   |-- buffer.c
|   |   |-- buffer.h
|   |   |-- circ_list.h
|   |   |-- clinat.c
|   |   |-- clinat.h
|   |   |-- common.h
|   |   |-- comp-lz4.c
|   |   |-- comp-lz4.h
|   |   |-- comp.c
|   |   |-- comp.h
|   |   |-- compstub.c
|   |   |-- console.c
|   |   |-- console.h
|   |   |-- console_builtin.c
|   |   |-- console_systemd.c
|   |   |-- crypto.c
|   |   |-- crypto.h
|   |   |-- crypto_backend.h
|   |   |-- crypto_mbedtls.c
|   |   |-- crypto_mbedtls.h
|   |   |-- crypto_openssl.c
|   |   |-- crypto_openssl.h
|   |   |-- cryptoapi.c
|   |   |-- cryptoapi.h
|   |   |-- dhcp.c
|   |   |-- dhcp.h
|   |   |-- env_set.c
|   |   |-- env_set.h
|   |   |-- errlevel.h
|   |   |-- error.c
|   |   |-- error.h
|   |   |-- event.c
|   |   |-- event.h
|   |   |-- fdmisc.c
|   |   |-- fdmisc.h
|   |   |-- forward.c
|   |   |-- forward.h
|   |   |-- fragment.c
|   |   |-- fragment.h
|   |   |-- gremlin.c
|   |   |-- gremlin.h
|   |   |-- helper.c
|   |   |-- helper.h
|   |   |-- httpdigest.c
|   |   |-- httpdigest.h
|   |   |-- init.c
|   |   |-- init.h
|   |   |-- integer.h
|   |   |-- interval.c
|   |   |-- interval.h
|   |   |-- list.c
|   |   |-- list.h
|   |   |-- lladdr.c
|   |   |-- lladdr.h
|   |   |-- lzo.c
|   |   |-- lzo.h
|   |   |-- manage.c
|   |   |-- manage.h
|   |   |-- mbuf.c
|   |   |-- mbuf.h
|   |   |-- memdbg.h
|   |   |-- misc.c
|   |   |-- misc.h
|   |   |-- mroute.c
|   |   |-- mroute.h
|   |   |-- mss.c
|   |   |-- mss.h
|   |   |-- mstats.c
|   |   |-- mstats.h
|   |   |-- mtcp.c
|   |   |-- mtcp.h
|   |   |-- mtu.c
|   |   |-- mtu.h
|   |   |-- mudp.c
|   |   |-- mudp.h
|   |   |-- multi.c
|   |   |-- multi.h
|   |   |-- networking.h
|   |   |-- networking_iproute2.c
|   |   |-- networking_iproute2.h
|   |   |-- networking_sitnl.c
|   |   |-- networking_sitnl.h
|   |   |-- ntlm.c
|   |   |-- ntlm.h
|   |   |-- occ.c
|   |   |-- occ.h
|   |   |-- openssl_compat.h
|   |   |-- openvpn.c
|   |   |-- openvpn.h
|   |   |-- openvpn.manifest
|   |   |-- openvpn.vcxproj
|   |   |-- openvpn.vcxproj.filters
|   |   |-- openvpn_win32_resources.rc
|   |   |-- options.c
|   |   |-- options.h
|   |   |-- otime.c
|   |   |-- otime.h
|   |   |-- packet_id.c
|   |   |-- packet_id.h
|   |   |-- perf.c
|   |   |-- perf.h
|   |   |-- pf.c
|   |   |-- pf.h
|   |   |-- ping.c
|   |   |-- ping.h
|   |   |-- pkcs11.c
|   |   |-- pkcs11.h
|   |   |-- pkcs11_backend.h
|   |   |-- pkcs11_mbedtls.c
|   |   |-- pkcs11_openssl.c
|   |   |-- platform.c
|   |   |-- platform.h
|   |   |-- plugin.c
|   |   |-- plugin.h
|   |   |-- pool.c
|   |   |-- pool.h
|   |   |-- proto.c
|   |   |-- proto.h
|   |   |-- proxy.c
|   |   |-- proxy.h
|   |   |-- ps.c
|   |   |-- ps.h
|   |   |-- push.c
|   |   |-- push.h
|   |   |-- pushlist.h
|   |   |-- reliable.c
|   |   |-- reliable.h
|   |   |-- ring_buffer.h
|   |   |-- route.c
|   |   |-- route.h
|   |   |-- run_command.c
|   |   |-- run_command.h
|   |   |-- schedule.c
|   |   |-- schedule.h
|   |   |-- session_id.c
|   |   |-- session_id.h
|   |   |-- shaper.c
|   |   |-- shaper.h
|   |   |-- sig.c
|   |   |-- sig.h
|   |   |-- socket.c
|   |   |-- socket.h
|   |   |-- socks.c
|   |   |-- socks.h
|   |   |-- ssl.c
|   |   |-- ssl.h
|   |   |-- ssl_backend.h
|   |   |-- ssl_common.h
|   |   |-- ssl_mbedtls.c
|   |   |-- ssl_mbedtls.h
|   |   |-- ssl_ncp.c
|   |   |-- ssl_ncp.h
|   |   |-- ssl_openssl.c
|   |   |-- ssl_openssl.h
|   |   |-- ssl_verify.c
|   |   |-- ssl_verify.h
|   |   |-- ssl_verify_backend.h
|   |   |-- ssl_verify_mbedtls.c
|   |   |-- ssl_verify_mbedtls.h
|   |   |-- ssl_verify_openssl.c
|   |   |-- ssl_verify_openssl.h
|   |   |-- status.c
|   |   |-- status.h
|   |   |-- syshead.h
|   |   |-- tls_crypt.c
|   |   |-- tls_crypt.h
|   |   |-- tun.c
|   |   |-- tun.h
|   |   |-- vlan.c
|   |   |-- vlan.h
|   |   |-- win32.c
|   |   `-- win32.h
|   |-- openvpnmsica
|   |   |-- Makefile.am
|   |   |-- Makefile.in
|   |   |-- dllmain.c
|   |   |-- msica_arg.c
|   |   |-- msica_arg.h
|   |   |-- msiex.c
|   |   |-- msiex.h
|   |   |-- openvpnmsica-Debug.props
|   |   |-- openvpnmsica-Release.props
|   |   |-- openvpnmsica.c
|   |   |-- openvpnmsica.h
|   |   |-- openvpnmsica.props
|   |   |-- openvpnmsica.vcxproj
|   |   |-- openvpnmsica.vcxproj.filters
|   |   `-- openvpnmsica_resources.rc
|   |-- openvpnserv
|   |   |-- Makefile.am
|   |   |-- Makefile.in
|   |   |-- automatic.c
|   |   |-- common.c
|   |   |-- interactive.c
|   |   |-- openvpnserv.vcxproj
|   |   |-- openvpnserv.vcxproj.filters
|   |   |-- openvpnserv_resources.rc
|   |   |-- service.c
|   |   |-- service.h
|   |   |-- validate.c
|   |   `-- validate.h
|   |-- plugins
|   |   |-- Makefile.am
|   |   |-- Makefile.in
|   |   |-- auth-pam
|   |   |   |-- Makefile.am
|   |   |   |-- Makefile.in
|   |   |   |-- README.auth-pam
|   |   |   |-- auth-pam.c
|   |   |   |-- auth-pam.exports
|   |   |   |-- pamdl.c
|   |   |   |-- pamdl.h
|   |   |   |-- utils.c
|   |   |   `-- utils.h
|   |   `-- down-root
|   |       |-- Makefile.am
|   |       |-- Makefile.in
|   |       |-- README.down-root
|   |       |-- down-root.c
|   |       `-- down-root.exports
|   `-- tapctl
|       |-- Makefile.am
|       |-- Makefile.in
|       |-- basic.h
|       |-- error.c
|       |-- error.h
|       |-- main.c
|       |-- tap.c
|       |-- tap.h
|       |-- tapctl.exe.manifest
|       |-- tapctl.props
|       |-- tapctl.vcxproj
|       |-- tapctl.vcxproj.filters
|       `-- tapctl_resources.rc
|-- tests
|   |-- Makefile.am
|   |-- Makefile.in
|   |-- t_client.rc-sample
|   |-- t_client.sh
|   |-- t_client.sh.in
|   |-- t_cltsrv-down.sh
|   |-- t_cltsrv.sh
|   |-- t_lpback.sh
|   |-- t_net.sh
|   |-- unit_tests
|   |   |-- Makefile.am
|   |   |-- Makefile.in
|   |   |-- engine-key
|   |   |   |-- Makefile.am
|   |   |   |-- Makefile.in
|   |   |   |-- check_engine_keys.sh
|   |   |   |-- libtestengine.c
|   |   |   `-- openssl.cnf.in
|   |   |-- example_test
|   |   |   |-- Makefile.am
|   |   |   |-- Makefile.in
|   |   |   |-- test.c
|   |   |   `-- test2.c
|   |   |-- openvpn
|   |   |   |-- Makefile.am
|   |   |   |-- Makefile.in
|   |   |   |-- mock_get_random.c
|   |   |   |-- mock_msg.c
|   |   |   |-- mock_msg.h
|   |   |   |-- test_argv.c
|   |   |   |-- test_auth_token.c
|   |   |   |-- test_buffer.c
|   |   |   |-- test_crypto.c
|   |   |   |-- test_ncp.c
|   |   |   |-- test_networking.c
|   |   |   |-- test_packet_id.c
|   |   |   `-- test_tls_crypt.c
|   |   `-- plugins
|   |       |-- Makefile.am
|   |       |-- Makefile.in
|   |       `-- auth-pam
|   |           |-- Makefile.am
|   |           |-- Makefile.in
|   |           `-- test_search_and_replace.c
|   `-- update_t_client_ips.sh
|-- version.m4
`-- version.sh.in

49 directories, 495 files

まずは src/openvpn を読めばよさそうです。

次回予告

src/openvpn のコールグラフを作成して関数呼び出しの全体像を把握し、
main 関数が含まれる openvpn.c およびそのヘッダーファイルである openvpn.h から読もうかと思います。
それではまた。