LCOV - code coverage report
Current view: top level - src/tds/unittests - sec_negotiate.c (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 24 38 63.2 %
Date: 2025-12-05 20:38:13 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
       2             :  * Copyright (C) 2025 Frediano Ziglio
       3             :  *
       4             :  * This library is free software; you can redistribute it and/or
       5             :  * modify it under the terms of the GNU Library General Public
       6             :  * License as published by the Free Software Foundation; either
       7             :  * version 2 of the License, or (at your option) any later version.
       8             :  *
       9             :  * This library is distributed in the hope that it will be useful,
      10             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      11             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12             :  * Library General Public License for more details.
      13             :  *
      14             :  * You should have received a copy of the GNU Library General Public
      15             :  * License along with this library; if not, write to the
      16             :  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      17             :  * Boston, MA 02111-1307, USA.
      18             :  */
      19             : 
      20             : /*
      21             :  * Check sec_negotiate_openssl.h code
      22             :  */
      23             : 
      24             : /* With this macro we force OpenSSL to trigger errors using deprecated functions */
      25             : #define OPENSSL_NO_DEPRECATED
      26             : 
      27             : #include "common.h"
      28             : 
      29             : #if defined(HAVE_OPENSSL)
      30             : 
      31             : #include "../sec_negotiate_openssl.h"
      32             : 
      33             : /* *INDENT-OFF* */
      34             : static const char privkey[] =
      35             : "-----BEGIN PRIVATE KEY-----\n"
      36             : "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCwdxLimeYPKNhb\n"
      37             : "V34M9iX2Kx35m437YNDkcNKhvpugZeclcmqLbijmPee5TuQYHQbv2sp0xfQhBR1C\n"
      38             : "Pe13VlpgpqwqIid8aTn6SrUusB0Q3jMnPMvFPN2H7AKgMZNt5xaKL2jK+N6urNJf\n"
      39             : "9EaOcMIORI8ypL2FjnJY4A5bbsKeCOuppfRLSIMZiM2XEdDG3nYubN8yChVrMAzL\n"
      40             : "qO6DRhNslMaJQQDyE8mCftzMyBNMfRcZ9+hu0oc2nRC4h9f2rXkQPk77+uj1dpV6\n"
      41             : "U9YuIZ0C3b3WouUOJz6u7uYOx9u7VCGGO7Vu0BYPbL7ksRLwxXqY66MFt+33i7Q8\n"
      42             : "EyFn3ZXPAgMBAAECggEAUohGdWQMRP/R/RqVEkPXqmQtH06BH9Z+rLEV2l83E1RF\n"
      43             : "wO5b5X1utIy0gadjp+F/mpPGR8pDrWPidNZY540kNPsPH5+cvyPJ4YWqar0kwvxh\n"
      44             : "iVL2bPfUFpur+LdnICpKEPQue2vdXm3m8MjjbQBQynKHVOTW3Q2r7mRQYrQRYu66\n"
      45             : "++cmruoILHJ8+ks364zku86NRqJ4zLM10s4zbx5JunEba+qSS4DR33wZppZT4vyc\n"
      46             : "30TNhFChc6Rx+ubXx3nv3+1T0AD2rcQICNukdPcLcQ5NuAgL7z1n9Af4+woCuwwU\n"
      47             : "esTgHTy2u9pObpMg7J6di6zC3ON2YSpw610F6B9g/QKBgQDhfKD5RknDc4VP/WE9\n"
      48             : "PLyile6DIyIluzQPcRl6S+rxbQ2XKOdiqukIGIJJPCq24qkEeSU+mNPJNwCPSGD/\n"
      49             : "7IYNmLPfDhxPiru4phQ+U5J3br2fqrMPRPUkv0XcWXqclWcyS0tfMOiWxogw9Yzv\n"
      50             : "X0y3yxog8F76His4mV7rMLrF4wKBgQDIWDkWcmD/AsLBVzkmYJQan4tgHI4h5eEi\n"
      51             : "PXMNF4qhtLzX5dTDDiJ89XXZkcaaaVkiFaHEyFNss9KHe2UbMfDex4WHSFxVERc+\n"
      52             : "ykVA0BxhEIi+pLD/20Q5M8Z6fR9UXJQArK9xcob4Pt2tqxwbyUzPw4fH6sIUnwK/\n"
      53             : "jAVAszXUJQKBgQDWDqEmY2KNKHKLICgaoTkWQ608UrMNDK18Z0rffYiZDoTTViJq\n"
      54             : "2YMFi3bLnVGTcpMvSu5fgWe0YgGnA/gJnHkaGTfQba3UmQhiX09iZ6XouXlMRRld\n"
      55             : "SoJKE0Z3y34Jfg+MgEwaHuz+jZQmnkTfzSGgbS/tyyLu4Ir5XSftr8HvLwKBgBJF\n"
      56             : "gYdbjR8UyGBLrSmj2z4GWPa+A/Rxe7PcuNZz1C/lROfHzTyw2FJfLI1YLy279+YU\n"
      57             : "5PkGcB1U1RmIFnOBfX9D4Riyb8FOWrleRyyfDkeH84C3knDzNWimIS7gpG/UNadO\n"
      58             : "GH4XPNn9GciR93FNTZURNxvzfBnXWq/PfFcnQPyFAoGBAMlNguY4QHABVcY8ZV+l\n"
      59             : "NI6n16VP/NN/vqUenwr38G3UUvorJ+jAC/BDLjQm7A+lBuoQtPoz9F7aNm2TpEco\n"
      60             : "THuiBaxi4xnmhucNIG+L2pzn/wHmu+twpkEgpy/KpP7zHK4BBeaCtGOab+i5cHMY\n"
      61             : "DLhQwWAzwX6FhrBbkFjYfpxJ\n"
      62             : "-----END PRIVATE KEY-----\n";
      63             : 
      64             : static const char pubkey[] =
      65             : "-----BEGIN RSA PUBLIC KEY-----\n"
      66             : "MIIBCgKCAQEAsHcS4pnmDyjYW1d+DPYl9isd+ZuN+2DQ5HDSob6boGXnJXJqi24o\n"
      67             : "5j3nuU7kGB0G79rKdMX0IQUdQj3td1ZaYKasKiInfGk5+kq1LrAdEN4zJzzLxTzd\n"
      68             : "h+wCoDGTbecWii9oyvjerqzSX/RGjnDCDkSPMqS9hY5yWOAOW27CngjrqaX0S0iD\n"
      69             : "GYjNlxHQxt52LmzfMgoVazAMy6jug0YTbJTGiUEA8hPJgn7czMgTTH0XGffobtKH\n"
      70             : "Np0QuIfX9q15ED5O+/ro9XaVelPWLiGdAt291qLlDic+ru7mDsfbu1Qhhju1btAW\n"
      71             : "D2y+5LES8MV6mOujBbft94u0PBMhZ92VzwIDAQAB\n"
      72             : "-----END RSA PUBLIC KEY-----\n";
      73             : /* *INDENT-ON* */
      74             : 
      75             : #define NONCE "hello"
      76             : #define PASSWORD "my_password"
      77             : 
      78           5 : TEST_MAIN()
      79             : {
      80           5 :         size_t em_size = 0;
      81             :         void *out;
      82             :         BIO *bufio;
      83           5 :         EVP_PKEY *key = NULL;
      84             :         EVP_PKEY_CTX *ctx;
      85             :         char buf[1024];
      86             :         size_t buflen;
      87             : 
      88           5 :         out = tds5_rsa_encrypt(pubkey, strlen(pubkey), NONCE, strlen(NONCE), PASSWORD, &em_size);
      89           5 :         if (!out) {
      90           0 :                 fprintf(stderr, "Error encrypting\n");
      91           0 :                 return 1;
      92             :         }
      93             : 
      94             :         /* Decrypt and check content is nonce followed by password */
      95           5 :         bufio = BIO_new_mem_buf((void *) privkey, -1);
      96           5 :         if (!bufio) {
      97           0 :                 fprintf(stderr, "error allocating BIO\n");
      98           0 :                 return 1;
      99             :         }
     100             : 
     101           5 :         key = PEM_read_bio_PrivateKey(bufio, &key, NULL, NULL);
     102           5 :         if (!key) {
     103           0 :                 fprintf(stderr, "error creating key\n");
     104           0 :                 return 1;
     105             :         }
     106           5 :         ctx = EVP_PKEY_CTX_new(key, NULL);
     107           5 :         if (!ctx) {
     108           0 :                 fprintf(stderr, "error creating context\n");
     109           0 :                 return 1;
     110             :         }
     111           5 :         if (EVP_PKEY_decrypt_init(ctx) <= 0
     112           5 :             || EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, EVP_PKEY_CTRL_RSA_PADDING, RSA_PKCS1_OAEP_PADDING, NULL) <= 0) {
     113           0 :                 fprintf(stderr, "error setting context\n");
     114           0 :                 return 1;
     115             :         }
     116           5 :         buflen = sizeof(buf) - 1;
     117           5 :         if (EVP_PKEY_decrypt(ctx, (void *) buf, &buflen, out, em_size) <= 0 || buflen >= sizeof(buf)) {
     118           0 :                 fprintf(stderr, "error decrypting\n");
     119           0 :                 return 1;
     120             :         }
     121           5 :         buf[buflen] = 0;
     122           5 :         if (strcmp(buf, NONCE PASSWORD) != 0) {
     123           0 :                 fprintf(stderr, "Wrong exit buffer len %u buffer %s\n", (unsigned) buflen, buf);
     124           0 :                 return 1;
     125             :         }
     126             : 
     127           5 :         EVP_PKEY_CTX_free(ctx);
     128           5 :         EVP_PKEY_free(key);
     129           5 :         BIO_free(bufio);
     130           5 :         free(out);
     131           5 :         return 0;
     132             : }
     133             : #else
     134           5 : TEST_MAIN()
     135             : {
     136           5 :         return 0;
     137             : }
     138             : #endif

Generated by: LCOV version 1.13