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
|