| 1 | /* Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. |
| 2 | |
| 3 | This program is free software; you can redistribute it and/or modify |
| 4 | it under the terms of the GNU General Public License as published by |
| 5 | the Free Software Foundation; version 2 of the License. |
| 6 | |
| 7 | This program is distributed in the hope that it will be useful, |
| 8 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 9 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 10 | GNU General Public License for more details. |
| 11 | |
| 12 | You should have received a copy of the GNU General Public License |
| 13 | along with this program; if not, write to the Free Software |
| 14 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ |
| 15 | |
| 16 | #include "mariadb.h" // HAVE_* |
| 17 | #include "sql_priv.h" |
| 18 | #include "des_key_file.h" // st_des_keyschedule, st_des_keyblock |
| 19 | #include "log.h" // sql_print_error |
| 20 | #include <m_ctype.h> |
| 21 | |
| 22 | #ifdef HAVE_OPENSSL |
| 23 | |
| 24 | struct st_des_keyschedule des_keyschedule[10]; |
| 25 | uint des_default_key; |
| 26 | |
| 27 | #define des_cs &my_charset_latin1 |
| 28 | |
| 29 | /** |
| 30 | Load DES keys from plaintext file into |
| 31 | memory on MySQL server startup and on command FLUSH DES_KEY_FILE. |
| 32 | |
| 33 | @retval |
| 34 | 0 ok |
| 35 | @retval |
| 36 | 1 Error |
| 37 | */ |
| 38 | |
| 39 | |
| 40 | bool |
| 41 | load_des_key_file(const char *file_name) |
| 42 | { |
| 43 | bool result=1; |
| 44 | File file; |
| 45 | IO_CACHE io; |
| 46 | DBUG_ENTER("load_des_key_file" ); |
| 47 | DBUG_PRINT("enter" ,("name: %s" ,file_name)); |
| 48 | |
| 49 | mysql_mutex_lock(&LOCK_des_key_file); |
| 50 | if ((file= mysql_file_open(key_file_des_key_file, file_name, |
| 51 | O_RDONLY | O_BINARY, MYF(MY_WME))) < 0 || |
| 52 | init_io_cache(&io, file, IO_SIZE*2, READ_CACHE, 0, 0, MYF(MY_WME))) |
| 53 | goto error; |
| 54 | |
| 55 | bzero((char*) des_keyschedule,sizeof(struct st_des_keyschedule) * 10); |
| 56 | des_default_key=15; // Impossible key |
| 57 | for (;;) |
| 58 | { |
| 59 | char *start, *end; |
| 60 | char buf[1024], offset; |
| 61 | st_des_keyblock keyblock; |
| 62 | size_t length; |
| 63 | |
| 64 | if (!(length=my_b_gets(&io,buf,sizeof(buf)-1))) |
| 65 | break; // End of file |
| 66 | offset=buf[0]; |
| 67 | if (offset >= '0' && offset <= '9') // If ok key |
| 68 | { |
| 69 | offset=(char) (offset - '0'); |
| 70 | // Remove newline and possible other control characters |
| 71 | for (start=buf+1 ; my_isspace(des_cs, *start) ; start++) ; |
| 72 | end=buf+length; |
| 73 | for (end=strend(buf) ; |
| 74 | end > start && !my_isgraph(des_cs, end[-1]) ; end--) ; |
| 75 | |
| 76 | if (start != end) |
| 77 | { |
| 78 | DES_cblock ivec; |
| 79 | bzero((char*) &ivec,sizeof(ivec)); |
| 80 | // We make good 24-byte (168 bit) key from given plaintext key with MD5 |
| 81 | EVP_BytesToKey(EVP_des_ede3_cbc(),EVP_md5(),NULL, |
| 82 | (uchar *) start, (int) (end-start),1, |
| 83 | (uchar *) &keyblock, |
| 84 | ivec); |
| 85 | DES_set_key_unchecked(&keyblock.key1,&(des_keyschedule[(int)offset].ks1)); |
| 86 | DES_set_key_unchecked(&keyblock.key2,&(des_keyschedule[(int)offset].ks2)); |
| 87 | DES_set_key_unchecked(&keyblock.key3,&(des_keyschedule[(int)offset].ks3)); |
| 88 | if (des_default_key == 15) |
| 89 | des_default_key= (uint) offset; // use first as def. |
| 90 | } |
| 91 | } |
| 92 | else if (offset != '#') |
| 93 | sql_print_error("load_des_file: Found wrong key_number: %c" ,offset); |
| 94 | } |
| 95 | result=0; |
| 96 | |
| 97 | error: |
| 98 | if (file >= 0) |
| 99 | { |
| 100 | mysql_file_close(file, MYF(0)); |
| 101 | end_io_cache(&io); |
| 102 | } |
| 103 | mysql_mutex_unlock(&LOCK_des_key_file); |
| 104 | DBUG_RETURN(result); |
| 105 | } |
| 106 | #endif /* HAVE_OPENSSL */ |
| 107 | |