Annotation of embedaddon/axTLS/samples/lua/axssl.lua, revision 1.1.1.1

1.1       misho       1: #!/usr/local/bin/lua
                      2: 
                      3: --
                      4: -- Copyright (c) 2007, Cameron Rich
                      5: --
                      6: -- All rights reserved.
                      7: --
                      8: -- Redistribution and use in source and binary forms, with or without
                      9: -- modification, are permitted provided that the following conditions are met:
                     10: --
                     11: -- * Redistributions of source code must retain the above copyright notice,
                     12: --   this list of conditions and the following disclaimer.
                     13: -- * Redistributions in binary form must reproduce the above copyright
                     14: --   notice, this list of conditions and the following disclaimer in the
                     15: --   documentation and/or other materials provided with the distribution.
                     16: -- * Neither the name of the axTLS project nor the names of its
                     17: --   contributors may be used to endorse or promote products derived
                     18: --   from this software without specific prior written permission.
                     19: --
                     20: -- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
                     21: -- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
                     22: -- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
                     23: -- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
                     24: -- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
                     25: -- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
                     26: -- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     27: -- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
                     28: -- OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
                     29: -- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     30: -- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     31: --
                     32: 
                     33: --
                     34: -- Demonstrate the use of the axTLS library in Lua with a set of 
                     35: -- command-line parameters similar to openssl. In fact, openssl clients 
                     36: -- should be able to communicate with axTLS servers and visa-versa.
                     37: --
                     38: -- This code has various bits enabled depending on the configuration. To enable
                     39: -- the most interesting version, compile with the 'full mode' enabled.
                     40: --
                     41: -- To see what options you have, run the following:
                     42: -- > [lua] axssl s_server -?
                     43: -- > [lua] axssl s_client -?
                     44: --
                     45: -- The axtls/axtlsl shared libraries must be in the same directory or be found 
                     46: -- by the OS.
                     47: --
                     48: --
                     49: require "bit"
                     50: require("axtlsl")
                     51: local socket = require("socket")
                     52: 
                     53: -- print version?
                     54: if #arg == 1 and arg[1] == "version" then
                     55:     print("axssl.lua "..axtlsl.ssl_version())
                     56:     os.exit(1)
                     57: end
                     58: 
                     59: --
                     60: -- We've had some sort of command-line error. Print out the basic options.
                     61: --
                     62: function print_options(option)
                     63:     print("axssl: Error: '"..option.."' is an invalid command.")
                     64:     print("usage: axssl [s_server|s_client|version] [args ...]")
                     65:     os.exit(1)
                     66: end
                     67: 
                     68: --
                     69: -- We've had some sort of command-line error. Print out the server options.
                     70: --
                     71: function print_server_options(build_mode, option)
                     72:     local cert_size = axtlsl.ssl_get_config(axtlsl.SSL_MAX_CERT_CFG_OFFSET)
                     73:     local ca_cert_size = axtlsl.ssl_get_config(
                     74:             axtlsl.SSL_MAX_CA_CERT_CFG_OFFSET)
                     75: 
                     76:     print("unknown option "..option)
                     77:     print("usage: s_server [args ...]")
                     78:     print(" -accept\t- port to accept on (default is 4433)")
                     79:     print(" -quiet\t\t- No server output")
                     80: 
                     81:     if build_mode >= axtlsl.SSL_BUILD_SERVER_ONLY then
                     82:         print(" -cert arg\t- certificate file to add (in addition to "..
                     83:                 "default) to chain -")
                     84:         print("\t\t  Can repeat up to "..cert_size.." times")
                     85:         print(" -key arg\t- Private key file to use - default DER format")
                     86:         print(" -pass\t\t- private key file pass phrase source")
                     87:     end
                     88: 
                     89:     if build_mode >= axtlsl.SSL_BUILD_ENABLE_VERIFICATION then
                     90:         print(" -verify\t- turn on peer certificate verification")
                     91:         print(" -CAfile arg\t- Certificate authority - default DER format")
                     92:         print("\t\t  Can repeat up to "..ca_cert_size.." times")
                     93:     end
                     94: 
                     95:     if build_mode == axtlsl.SSL_BUILD_FULL_MODE then
                     96:         print(" -debug\t\t- Print more output")
                     97:         print(" -state\t\t- Show state messages")
                     98:         print(" -show-rsa\t- Show RSA state")
                     99:     end
                    100: 
                    101:     os.exit(1)
                    102: end
                    103: 
                    104: --
                    105: -- We've had some sort of command-line error. Print out the client options.
                    106: --
                    107: function print_client_options(build_mode, option)
                    108:     local cert_size = axtlsl.ssl_get_config(axtlsl.SSL_MAX_CERT_CFG_OFFSET)
                    109:     local ca_cert_size = axtlsl.ssl_get_config(
                    110:             axtlsl.SSL_MAX_CA_CERT_CFG_OFFSET)
                    111: 
                    112:     print("unknown option "..option)
                    113: 
                    114:     if build_mode >= axtlsl.SSL_BUILD_ENABLE_CLIENT then
                    115:         print("usage: s_client [args ...]")
                    116:         print(" -connect host:port - who to connect to (default "..
                    117:                 "is localhost:4433)")
                    118:         print(" -verify\t- turn on peer certificate verification")
                    119:         print(" -cert arg\t- certificate file to use - default DER format")
                    120:         print(" -key arg\t- Private key file to use - default DER format")
                    121:         print("\t\t  Can repeat up to "..cert_size.." times")
                    122:         print(" -CAfile arg\t- Certificate authority - default DER format")
                    123:         print("\t\t  Can repeat up to "..ca_cert_size.."times")
                    124:         print(" -quiet\t\t- No client output")
                    125:         print(" -pass\t\t- private key file pass phrase source")
                    126:         print(" -reconnect\t- Drop and re-make the connection "..
                    127:                 "with the same Session-ID")
                    128: 
                    129:         if build_mode == axtlsl.SSL_BUILD_FULL_MODE then
                    130:             print(" -debug\t\t- Print more output")
                    131:             print(" -state\t\t- Show state messages")
                    132:             print(" -show-rsa\t- Show RSA state")
                    133:         end
                    134:     else
                    135:         print("Change configuration to allow this feature")
                    136:     end
                    137: 
                    138:     os.exit(1)
                    139: end
                    140: 
                    141: -- Implement the SSL server logic. 
                    142: function do_server(build_mode)
                    143:     local i = 2
                    144:     local v
                    145:     local port = 4433
                    146:     local options = axtlsl.SSL_DISPLAY_CERTS
                    147:     local quiet = false
                    148:     local password = ""
                    149:     local private_key_file = nil
                    150:     local cert_size = axtlsl.ssl_get_config(axtlsl.SSL_MAX_CERT_CFG_OFFSET)
                    151:     local ca_cert_size = axtlsl.
                    152:                             ssl_get_config(axtlsl.SSL_MAX_CA_CERT_CFG_OFFSET)
                    153:     local cert = {}
                    154:     local ca_cert = {}
                    155: 
                    156:     while i <= #arg do
                    157:         if arg[i] ==  "-accept" then
                    158:             if i >= #arg then
                    159:                 print_server_options(build_mode, arg[i])
                    160:             end
                    161: 
                    162:             i = i + 1
                    163:             port = arg[i]
                    164:         elseif arg[i] == "-quiet" then
                    165:             quiet = true
                    166:             options = bit.band(options, bit.bnot(axtlsl.SSL_DISPLAY_CERTS))
                    167:         elseif build_mode >= axtlsl.SSL_BUILD_SERVER_ONLY then
                    168:             if arg[i] == "-cert" then
                    169:                 if i >= #arg or #cert >= cert_size then
                    170:                     print_server_options(build_mode, arg[i]) 
                    171:                 end
                    172: 
                    173:                 i = i + 1
                    174:                 table.insert(cert, arg[i])
                    175:             elseif arg[i] == "-key" then
                    176:                 if i >= #arg then
                    177:                     print_server_options(build_mode, arg[i]) 
                    178:                 end
                    179: 
                    180:                 i = i + 1
                    181:                 private_key_file = arg[i]
                    182:                 options = bit.bor(options, axtlsl.SSL_NO_DEFAULT_KEY)
                    183:             elseif arg[i] == "-pass" then
                    184:                 if i >= #arg then
                    185:                     print_server_options(build_mode, arg[i]) 
                    186:                 end
                    187: 
                    188:                 i = i + 1
                    189:                 password = arg[i]
                    190:             elseif build_mode >= axtlsl.SSL_BUILD_ENABLE_VERIFICATION then
                    191:                 if arg[i] == "-verify" then
                    192:                     options = bit.bor(options, axtlsl.SSL_CLIENT_AUTHENTICATION)
                    193:                 elseif arg[i] == "-CAfile" then
                    194:                     if i >= #arg or #ca_cert >= ca_cert_size then
                    195:                         print_server_options(build_mode, arg[i])  
                    196:                     end
                    197: 
                    198:                     i = i + 1
                    199:                     table.insert(ca_cert, arg[i])
                    200:                 elseif build_mode == axtlsl.SSL_BUILD_FULL_MODE then
                    201:                     if arg[i] == "-debug" then
                    202:                         options = bit.bor(options, axtlsl.SSL_DISPLAY_BYTES)
                    203:                     elseif arg[i] == "-state" then
                    204:                         options = bit.bor(options, axtlsl.SSL_DISPLAY_STATES)
                    205:                     elseif arg[i] == "-show-rsa" then
                    206:                         options = bit.bor(options, axtlsl.SSL_DISPLAY_RSA)
                    207:                     else
                    208:                         print_server_options(build_mode, arg[i])
                    209:                     end
                    210:                 else
                    211:                     print_server_options(build_mode, arg[i])
                    212:                 end
                    213:             else 
                    214:                 print_server_options(build_mode, arg[i])
                    215:             end
                    216:         else 
                    217:             print_server_options(build_mode, arg[i])
                    218:         end
                    219: 
                    220:         i = i + 1
                    221:     end
                    222: 
                    223:     -- Create socket for incoming connections
                    224:     local server_sock = socket.try(socket.bind("*", port))
                    225: 
                    226:     ---------------------------------------------------------------------------
                    227:     -- This is where the interesting stuff happens. Up until now we've
                    228:     -- just been setting up sockets etc. Now we do the SSL handshake.
                    229:     ---------------------------------------------------------------------------
                    230:     local ssl_ctx = axtlsl.ssl_ctx_new(options, axtlsl.SSL_DEFAULT_SVR_SESS)
                    231:     if ssl_ctx == nil then error("Error: Server context is invalid") end
                    232: 
                    233:     if private_key_file ~= nil then
                    234:         local obj_type = axtlsl.SSL_OBJ_RSA_KEY
                    235: 
                    236:         if string.find(private_key_file, ".p8") then 
                    237:             obj_type = axtlsl.SSL_OBJ_PKCS8 
                    238:         end
                    239: 
                    240:         if string.find(private_key_file, ".p12") then 
                    241:             obj_type = axtlsl.SSL_OBJ_PKCS12 
                    242:         end
                    243: 
                    244:         if axtlsl.ssl_obj_load(ssl_ctx, obj_type, private_key_file, 
                    245:                                         password) ~= axtlsl.SSL_OK then
                    246:             error("Private key '" .. private_key_file .. "' is undefined.")
                    247:         end
                    248:     end
                    249: 
                    250:     for _, v in ipairs(cert) do
                    251:         if axtlsl.ssl_obj_load(ssl_ctx, axtlsl.SSL_OBJ_X509_CERT, v, "") ~= 
                    252:                                         axtlsl.SSL_OK then
                    253:             error("Certificate '"..v .. "' is undefined.")
                    254:         end
                    255:     end
                    256: 
                    257:     for _, v in ipairs(ca_cert) do
                    258:         if axtlsl.ssl_obj_load(ssl_ctx, axtlsl.SSL_OBJ_X509_CACERT, v, "") ~= 
                    259:                                         axtlsl.SSL_OK then
                    260:             error("Certificate '"..v .."' is undefined.")
                    261:         end
                    262:     end
                    263: 
                    264:     while true do
                    265:         if not quiet then print("ACCEPT") end
                    266:         local client_sock = server_sock:accept();
                    267:         local ssl = axtlsl.ssl_server_new(ssl_ctx, client_sock:getfd())
                    268: 
                    269:         -- do the actual SSL handshake
                    270:         local connected = false
                    271:         local res
                    272:         local buf
                    273: 
                    274:         while true do
                    275:             socket.select({client_sock}, nil)
                    276:             res, buf = axtlsl.ssl_read(ssl)
                    277: 
                    278:             if res == axtlsl.SSL_OK then -- connection established and ok
                    279:                 if axtlsl.ssl_handshake_status(ssl) == axtlsl.SSL_OK then
                    280:                     if not quiet and not connected then
                    281:                         display_session_id(ssl)
                    282:                         display_cipher(ssl)
                    283:                     end
                    284:                     connected = true
                    285:                 end
                    286:             end
                    287: 
                    288:             if res > axtlsl.SSL_OK then
                    289:                 for _, v in ipairs(buf) do
                    290:                     io.write(string.format("%c", v))
                    291:                 end
                    292:             elseif res < axtlsl.SSL_OK then 
                    293:                 if not quiet then
                    294:                     axtlsl.ssl_display_error(res)
                    295:                 end
                    296:                 break
                    297:             end
                    298:         end
                    299: 
                    300:         -- client was disconnected or the handshake failed.
                    301:         print("CONNECTION CLOSED")
                    302:         axtlsl.ssl_free(ssl)
                    303:         client_sock:close()
                    304:     end
                    305: 
                    306:     axtlsl.ssl_ctx_free(ssl_ctx)
                    307: end
                    308: 
                    309: --
                    310: -- Implement the SSL client logic.
                    311: --
                    312: function do_client(build_mode)
                    313:     local i = 2
                    314:     local v
                    315:     local port = 4433
                    316:     local options = 
                    317:             bit.bor(axtlsl.SSL_SERVER_VERIFY_LATER, axtlsl.SSL_DISPLAY_CERTS)
                    318:     local private_key_file = nil
                    319:     local reconnect = 0
                    320:     local quiet = false
                    321:     local password = ""
                    322:     local session_id = {}
                    323:     local host = "127.0.0.1"
                    324:     local cert_size = axtlsl.ssl_get_config(axtlsl.SSL_MAX_CERT_CFG_OFFSET)
                    325:     local ca_cert_size = axtlsl.
                    326:                             ssl_get_config(axtlsl.SSL_MAX_CA_CERT_CFG_OFFSET)
                    327:     local cert = {}
                    328:     local ca_cert = {}
                    329: 
                    330:     while i <= #arg do
                    331:         if arg[i] == "-connect" then
                    332:             if i >= #arg then
                    333:                 print_client_options(build_mode, arg[i]) 
                    334:             end
                    335: 
                    336:             i = i + 1
                    337:             local t = string.find(arg[i], ":")
                    338:             host = string.sub(arg[i], 1, t-1)
                    339:             port = string.sub(arg[i], t+1)
                    340:         elseif arg[i] == "-cert" then
                    341:             if i >= #arg or #cert >= cert_size then
                    342:                 print_client_options(build_mode, arg[i]) 
                    343:             end
                    344: 
                    345:             i = i + 1
                    346:             table.insert(cert, arg[i])
                    347:         elseif arg[i] == "-key" then
                    348:             if i >= #arg then
                    349:                 print_client_options(build_mode, arg[i])
                    350:             end
                    351: 
                    352:             i = i + 1
                    353:             private_key_file = arg[i]
                    354:             options = bit.bor(options, axtlsl.SSL_NO_DEFAULT_KEY)
                    355:         elseif arg[i] == "-CAfile" then
                    356:             if i >= #arg or #ca_cert >= ca_cert_size then
                    357:                 print_client_options(build_mode, arg[i]) 
                    358:             end
                    359: 
                    360:             i = i + 1
                    361:             table.insert(ca_cert, arg[i])
                    362:         elseif arg[i] == "-verify" then
                    363:             options = bit.band(options, 
                    364:                                 bit.bnot(axtlsl.SSL_SERVER_VERIFY_LATER))
                    365:         elseif arg[i] == "-reconnect" then
                    366:             reconnect = 4
                    367:         elseif arg[i] == "-quiet" then
                    368:             quiet = true
                    369:             options = bit.band(options, bnot(axtlsl.SSL_DISPLAY_CERTS))
                    370:         elseif arg[i] == "-pass" then
                    371:             if i >= #arg then
                    372:                 print_server_options(build_mode, arg[i])
                    373:             end
                    374: 
                    375:             i = i + 1
                    376:             password = arg[i]
                    377:         elseif build_mode == axtlsl.SSL_BUILD_FULL_MODE then
                    378:             if arg[i] == "-debug" then
                    379:                 options = bit.bor(options, axtlsl.SSL_DISPLAY_BYTES)
                    380:             elseif arg[i] == "-state" then
                    381:                 options = bit.bor(axtlsl.SSL_DISPLAY_STATES)
                    382:             elseif arg[i] == "-show-rsa" then
                    383:                 options = bit.bor(axtlsl.SSL_DISPLAY_RSA)
                    384:             else    -- don't know what this is
                    385:                 print_client_options(build_mode, arg[i])
                    386:             end
                    387:         else    -- don't know what this is
                    388:             print_client_options(build_mode, arg[i])
                    389:         end
                    390: 
                    391:         i = i + 1
                    392:     end
                    393: 
                    394:     local client_sock = socket.try(socket.connect(host, port))
                    395:     local ssl
                    396:     local res
                    397: 
                    398:     if not quiet then print("CONNECTED") end
                    399: 
                    400:     ---------------------------------------------------------------------------
                    401:     -- This is where the interesting stuff happens. Up until now we've
                    402:     -- just been setting up sockets etc. Now we do the SSL handshake.
                    403:     ---------------------------------------------------------------------------
                    404:     local ssl_ctx = axtlsl.ssl_ctx_new(options, axtlsl.SSL_DEFAULT_CLNT_SESS)
                    405: 
                    406:     if ssl_ctx == nil then 
                    407:         error("Error: Client context is invalid")
                    408:     end
                    409: 
                    410:     if private_key_file ~= nil then
                    411:         local obj_type = axtlsl.SSL_OBJ_RSA_KEY
                    412: 
                    413:         if string.find(private_key_file, ".p8") then 
                    414:             obj_type = axtlsl.SSL_OBJ_PKCS8 
                    415:         end
                    416: 
                    417:         if string.find(private_key_file, ".p12") then 
                    418:             obj_type = axtlsl.SSL_OBJ_PKCS12 
                    419:         end
                    420: 
                    421:         if axtlsl.ssl_obj_load(ssl_ctx, obj_type, private_key_file, 
                    422:                                         password) ~= axtlsl.SSL_OK then
                    423:             error("Private key '"..private_key_file.."' is undefined.")
                    424:         end
                    425:     end
                    426: 
                    427:     for _, v in ipairs(cert) do
                    428:         if axtlsl.ssl_obj_load(ssl_ctx, axtlsl.SSL_OBJ_X509_CERT, v, "") ~= 
                    429:                                         axtlsl.SSL_OK then
                    430:             error("Certificate '"..v .. "' is undefined.")
                    431:         end
                    432:     end
                    433: 
                    434:     for _, v in ipairs(ca_cert) do
                    435:         if axtlsl.ssl_obj_load(ssl_ctx, axtlsl.SSL_OBJ_X509_CACERT, v, "") ~= 
                    436:                                         axtlsl.SSL_OK then
                    437:             error("Certificate '"..v .."' is undefined.")
                    438:         end
                    439:     end
                    440: 
                    441:     -- Try session resumption?
                    442:     if reconnect ~= 0 then
                    443:         local session_id = nil
                    444:         local sess_id_size = 0
                    445: 
                    446:         while reconnect > 0 do
                    447:             reconnect = reconnect - 1
                    448:             ssl = axtlsl.ssl_client_new(ssl_ctx, 
                    449:                     client_sock:getfd(), session_id, sess_id_size)
                    450: 
                    451:             res = axtlsl.ssl_handshake_status(ssl)
                    452:             if res ~= axtlsl.SSL_OK then
                    453:                 if not quiet then axtlsl.ssl_display_error(res) end
                    454:                 axtlsl.ssl_free(ssl)
                    455:                 os.exit(1)
                    456:             end
                    457: 
                    458:             display_session_id(ssl)
                    459:             session_id = axtlsl.ssl_get_session_id(ssl)
                    460:             sess_id_size = axtlsl.ssl_get_session_id_size(ssl)
                    461: 
                    462:             if reconnect > 0 then
                    463:                 axtlsl.ssl_free(ssl)
                    464:                 client_sock:close()
                    465:                 client_sock = socket.try(socket.connect(host, port))
                    466:             end
                    467: 
                    468:         end
                    469:     else
                    470:         ssl = axtlsl.ssl_client_new(ssl_ctx, client_sock:getfd(), nil, 0)
                    471:     end
                    472: 
                    473:     -- check the return status
                    474:     res = axtlsl.ssl_handshake_status(ssl)
                    475:     if res ~= axtlsl.SSL_OK then
                    476:         if not quiet then axtlsl.ssl_display_error(res) end
                    477:         os.exit(1)
                    478:     end
                    479: 
                    480:     if not quiet then
                    481:         local common_name = axtlsl.ssl_get_cert_dn(ssl, 
                    482:                             axtlsl.SSL_X509_CERT_COMMON_NAME)
                    483: 
                    484:         if common_name ~= nil then 
                    485:             print("Common Name:\t\t\t"..common_name)
                    486:         end
                    487: 
                    488:         display_session_id(ssl)
                    489:         display_cipher(ssl)
                    490:     end
                    491: 
                    492:     while true do
                    493:         local line = io.read()
                    494:     if line == nil then break end
                    495:         local bytes = {}
                    496: 
                    497:         for i = 1, #line do
                    498:             bytes[i] = line.byte(line, i)
                    499:         end
                    500: 
                    501:         bytes[#line+1] = 10      -- add carriage return, null
                    502:         bytes[#line+2] = 0
                    503: 
                    504:         res = axtlsl.ssl_write(ssl, bytes, #bytes)
                    505:         if res < axtlsl.SSL_OK then
                    506:             if not quiet then axtlsl.ssl_display_error(res) end
                    507:             break
                    508:         end
                    509:     end
                    510: 
                    511:     axtlsl.ssl_ctx_free(ssl_ctx)
                    512:     client_sock:close()
                    513: end
                    514: 
                    515: --
                    516: -- Display what cipher we are using 
                    517: --
                    518: function display_cipher(ssl)
                    519:     io.write("CIPHER is ")
                    520:     local cipher_id = axtlsl.ssl_get_cipher_id(ssl)
                    521: 
                    522:     if cipher_id == axtlsl.SSL_AES128_SHA then
                    523:         print("AES128-SHA")
                    524:     elseif cipher_id == axtlsl.SSL_AES256_SHA then
                    525:         print("AES256-SHA")
                    526:     elseif axtlsl.SSL_RC4_128_SHA then
                    527:         print("RC4-SHA")
                    528:     elseif axtlsl.SSL_RC4_128_MD5 then
                    529:         print("RC4-MD5")
                    530:     else 
                    531:         print("Unknown - "..cipher_id)
                    532:     end
                    533: end
                    534: 
                    535: --
                    536: -- Display what session id we have.
                    537: --
                    538: function display_session_id(ssl)
                    539:     local session_id = axtlsl.ssl_get_session_id(ssl)
                    540:     local v
                    541: 
                    542:     if #session_id > 0 then
                    543:         print("-----BEGIN SSL SESSION PARAMETERS-----")
                    544:         for _, v in ipairs(session_id) do
                    545:             io.write(string.format("%02x", v))
                    546:         end
                    547:         print("\n-----END SSL SESSION PARAMETERS-----")
                    548:     end
                    549: end
                    550: 
                    551: --
                    552: -- Main entry point. Doesn't do much except works out whether we are a client
                    553: -- or a server.
                    554: --
                    555: if #arg == 0 or (arg[1] ~= "s_server" and arg[1] ~= "s_client") then
                    556:     print_options(#arg > 0 and arg[1] or "")
                    557: end
                    558: 
                    559: local build_mode = axtlsl.ssl_get_config(axtlsl.SSL_BUILD_MODE)
                    560: _ = arg[1] == "s_server" and do_server(build_mode) or do_client(build_mode)
                    561: os.exit(0)
                    562: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>