00001 
00002 Buffer* Base64_DHspki   = NULL;
00003 Buffer* Base64_RSAspki  = NULL;
00004 
00005 Buffer* CRYPT_SharedKey = NULL;
00006 EVP_CIPHER* CRYPT_Type  = NULL;
00007 DH*     DHkey           = NULL;
00008 
00009 Buffer* User_ID         = NULL;
00010 Buffer* User_Passwd     = NULL;
00011 Buffer* User_Salt       = NULL;
00012 
00013 int  No_isNet_Chlng     = FALSE;    
00014 int  Use_isNet_Ldap     = FALSE;
00015 int  Use_isNet_Crypt    = FALSE;
00016 
00017 
00018 
00019 #ifdef ENABLE_LDAP
00020 JBXL_LDAP_Host* LdapHost = NULL;
00021 JBXL_LDAP_Dn*   LdapBind = NULL;
00022 #endif
00023 
00024 
00026 
00027 
00028 
00046 int  command_USERID(Buffer operand, Buffer comment, int sock)
00047 {
00048     char* pass  = NULL;
00049     char* salt0 = NULL;
00050     char* salt1 = NULL;
00051     char* salt2 = NULL;
00052     Buffer  buf;
00053 
00054     UNUSED(comment);
00055 
00056     pass = get_passwd((char*)operand.buf);
00057     if (pass==NULL) {
00058         tcp_send_crypt_mesg(sock, (char*)"ERR 121 passwd get error.\r\n", CRYPT_SharedKey, CRYPT_Type);
00059         DEBUG_MODE PRINT_MESG("ERR 121 passwd get error.\n");
00060         return 121;
00061     }
00062 
00063     if (No_isNet_Chlng==TRUE && Use_isNet_Crypt==FALSE) {
00064         tcp_send_crypt_mesg(sock, (char*)"ERR 122 both No Challenge Key mode and No Crypt mode are not used.\r\n", CRYPT_SharedKey, CRYPT_Type);
00065         DEBUG_MODE PRINT_MESG("ERR 122 both No Challenge Key mode and No Crypt mode are not used.\n");
00066         return 122;
00067     }
00068 
00069     if (No_isNet_Chlng==FALSE && Use_isNet_Ldap==TRUE) {
00070         tcp_send_crypt_mesg(sock, (char*)"ERR 123 both Challenge Key mode and Ldap mode are not used.\r\n", CRYPT_SharedKey, CRYPT_Type);
00071         DEBUG_MODE PRINT_MESG("ERR 123 both Challenge Key mode and Ldap mode are not used.\n");
00072         return 123;
00073     }
00074 
00075     if (User_ID!=NULL)     del_Buffer(&User_ID);
00076     if (User_Passwd!=NULL) del_Buffer(&User_Passwd);
00077     if (User_Salt!=NULL)   del_Buffer(&User_Salt);
00078     User_ID      = new_Buffer(0);
00079     User_Passwd  = new_Buffer(0);
00080     User_Salt    = new_Buffer(0);
00081     *User_ID     = dup_Buffer(operand);
00082     *User_Passwd = make_Buffer_bystr(pass);
00083 
00084     
00085     if (strlen(pass)<=2) {
00086 #ifdef ENABLE_LDAP
00087         int  cc;
00088         if (!strcmp((const char*)User_Passwd->buf, "*") && Use_isNet_Ldap) {
00089             LdapHost = new_LDAP_Host();
00090             LdapBind = new_LDAP_Dn();
00091             read_ldap_config(NULL, LdapHost, LdapBind);
00092             LDAP* ld = open_ldap_connection(LdapHost, LdapBind);
00093             
00094             if (ld!=NULL) {
00095                 cc = simple_check_ldap_passwd(ld, (char*)User_ID->buf, NULL, LdapBind);
00096                 close_ldap_connection(ld, &LdapHost, &LdapBind);
00097                 if (cc==1) {
00098                     cc = tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00099                     return 0;
00100                 }
00101                 else {
00102                     cc = tcp_send_crypt_mesg(sock, (char*)"ERR 128 USERID error with LDAP.\r\n", CRYPT_SharedKey, CRYPT_Type);
00103                     DEBUG_MODE PRINT_MESG("ERR 128 USERID error with LDAP.\n");
00104                     return 128;
00105                 }
00106             }
00107             else {
00108                 cc = tcp_send_crypt_mesg(sock, (char*)"ERR 127 USERID connection error with LDAP.\r\n", CRYPT_SharedKey, CRYPT_Type);
00109                 DEBUG_MODE PRINT_MESG("ERR 127 USERID connection error with LDAP.\n");
00110                 return 127;
00111             }
00112         }
00113 #endif
00114         tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00115         return 0;
00116     }
00117 
00118     
00119     if (pass[0]=='$') {
00120         int lsalt = 0;
00121         if      (pass[1]=='1') lsalt = LEN_DOLLAR_SALT;
00122         
00123         else if (pass[1]=='5') lsalt = LEN_DOLLAR5_SALT;
00124         else if (pass[1]=='6') lsalt = LEN_DOLLAR6_SALT;
00125 
00126         if (lsalt!=0) {
00127             *User_Salt = make_Buffer(lsalt*2 + 5);    
00128             salt0 = cut_str(pass, 0, 2);
00129             salt1 = cut_str(pass, 0, lsalt-1);
00130             salt2 = randstr(lsalt-4);
00131             copy_s2Buffer(salt1, User_Salt);
00132             cat_s2Buffer("\r\n", User_Salt);
00133             cat_s2Buffer(salt0,  User_Salt);
00134             cat_s2Buffer(salt2,  User_Salt);
00135             cat_s2Buffer("$",    User_Salt);
00136         }
00137     }
00138     
00139     else if (strlen((const char*)pass)==LEN_DESPASS) {
00140         *User_Salt = make_Buffer(LEN_DESSALT*2 + 5);
00141         salt1 = cut_str(pass, 0, LEN_DESSALT-1);
00142         salt2 = randstr(LEN_DESSALT);
00143         copy_s2Buffer(salt1,  User_Salt);
00144         cat_s2Buffer ("\r\n", User_Salt);
00145         cat_s2Buffer (salt2,  User_Salt);
00146     }
00147 
00148     freeNull(pass);
00149     freeNull(salt0);
00150     freeNull(salt1);
00151     freeNull(salt2);
00152 
00153     if (User_Salt->buf!=NULL) {
00154         tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00155         if (No_isNet_Chlng==FALSE) {
00156             buf = make_Buffer(LBUF);
00157             copy_Buffer(User_Salt,  &buf);
00158             cat_s2Buffer("\r\nEND\r\n", &buf);
00159             tcp_send_crypt_sBuffer(sock, &buf, CRYPT_SharedKey, CRYPT_Type);
00160             free_Buffer(&buf);
00161         }
00162     }
00163     else {
00164         tcp_send_crypt_mesg(sock, (char*)"ERR 129 USERID error.\r\n", CRYPT_SharedKey, CRYPT_Type);
00165         DEBUG_MODE PRINT_MESG("ERR 129 USERID error.\n");
00166         return 129;
00167     }
00168 
00169     return 0;
00170 }
00171 
00172 
00173 
00189 int  command_PASSWD(Buffer operand, Buffer comment, int sock)
00190 {
00191     char* opass = NULL;        
00192     char* npass = NULL;        
00193     char* salt  = NULL;
00194 
00195     UNUSED(comment);
00196     
00197     if (User_Passwd==NULL) {
00198         tcp_send_crypt_mesg(sock, (char*)"ERR 131 system has not a your password.\r\n", CRYPT_SharedKey, CRYPT_Type);
00199         DEBUG_MODE PRINT_MESG("ERR 131 system has not a your password.\n");
00200         return 131;
00201     }
00202 
00203 #ifdef ENABLE_LDAP
00204     int  cc;
00205     if (!strcmp((const char*)User_Passwd->buf, "*") && Use_isNet_Ldap) {
00206         LdapHost = new_LDAP_Host();
00207         LdapBind = new_LDAP_Dn();
00208         read_ldap_config(NULL, LdapHost, LdapBind);
00209         LDAP* ld = open_ldap_connection(LdapHost, LdapBind);
00210         cc = simple_check_ldap_passwd(ld, (char*)User_ID->buf, (char*)operand.buf, LdapBind);
00211         close_ldap_connection(ld, &LdapHost, &LdapBind);
00212         
00213         if (cc==0) {
00214             cc = tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00215             return 0;
00216         }
00217         else {
00218             cc = tcp_send_crypt_mesg(sock, (char*)"ERR 138 PASSWD error.\r\n", CRYPT_SharedKey, CRYPT_Type);
00219             DEBUG_MODE PRINT_MESG("ERR 138 PASSWD error.\n");
00220             return 138;
00221         }
00222     }
00223 #endif
00224             
00225     int lsalt = 0;
00226     if (User_Passwd->buf[0]=='$') {
00227         if      (User_Passwd->buf[1]=='1') lsalt = LEN_DOLLAR_SALT;
00228         
00229         else if (User_Passwd->buf[1]=='5') lsalt = LEN_DOLLAR5_SALT;
00230         else if (User_Passwd->buf[1]=='6') lsalt = LEN_DOLLAR6_SALT;
00231 
00232         opass = (char*)&(User_Passwd->buf[lsalt]);
00233     }
00234     else if (strlen((const char*)User_Passwd->buf)==LEN_DESPASS) {
00235         lsalt = 2;
00236         opass = (char*)&(User_Passwd->buf[lsalt]);
00237     }
00238 
00239     
00240     if (No_isNet_Chlng==FALSE) {    
00241         salt = get_line((char*)User_Salt->buf, 2);
00242         if (salt!=NULL && opass!=NULL) {
00243             npass = (char*)crypt((const char*)opass, (const char*)salt);
00244             npass = &(npass[lsalt]);
00245         }
00246         if (npass!=NULL) {
00247             if (!strcmp((const char*)operand.buf, (const char*)npass)) {
00248                 tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00249                 return 0;
00250             }
00251         }
00252     }
00253     else {    
00254         salt = get_line((char*)User_Salt->buf, 1);
00255         if (salt!=NULL && operand.buf!=NULL) {
00256             npass = (char*)crypt((const char*)operand.buf, (const char*)salt);
00257             npass = &(npass[lsalt]);
00258             free(salt);
00259         }
00260         if (npass!=NULL && opass!=NULL) {
00261             if (!strcmp((const char*)opass, (const char*)npass)) {
00262                 tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00263                 return 0;
00264             }
00265         }
00266     }
00267 
00268     tcp_send_crypt_mesg(sock, (char*)"ERR 139 PASSWD error.\r\n", CRYPT_SharedKey, CRYPT_Type);
00269     DEBUG_MODE PRINT_MESG("ERR 139 PASSWD error.\n");
00270     return 139;
00271 }
00272 
00273 
00274 
00290 int  command_HELLO(Buffer operand, Buffer comment, int sock)
00291 {
00292     int  cc;
00293 
00294     UNUSED(operand);
00295     UNUSED(comment);
00296     
00297     cc = tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00298     return cc;
00299 }
00300 
00301 
00302 
00318 int  command_BYE(Buffer operand, Buffer comment, int sock)
00319 {
00320     int  cc;
00321 
00322     UNUSED(operand);
00323     UNUSED(comment);
00324     
00325     cc = tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00326     
00327     return cc;
00328 }
00329 
00330 
00331 
00365 int  command_KEYEX(Buffer operand, Buffer comment, int sock)
00366 {
00367     static int keyex;
00368     Buffer buf;
00369 
00370     UNUSED(comment);
00371 
00372     if (!strcmp("DH", (const char*)operand.buf)) {
00373         if (Base64_DHspki!=NULL) {
00374             Use_isNet_Crypt = TRUE;
00375             keyex = SSL_DH;
00376             tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00377 
00378             buf = make_Buffer(LBUF);
00379             copy_Buffer(Base64_DHspki,  &buf);
00380             cat_s2Buffer("\r\nEND\r\n", &buf);
00381             tcp_send_crypt_sBuffer(sock, &buf, CRYPT_SharedKey, CRYPT_Type);
00382             free_Buffer(&buf);
00383         }
00384         else {
00385             tcp_send_crypt_mesg(sock, (char*)"ERR 161 KEYEX DH Error.\r\n", CRYPT_SharedKey, CRYPT_Type);
00386             DEBUG_MODE PRINT_MESG("ERR 161 KEYEX DH Error.\n");
00387             return 161;
00388         }
00389     }
00390 
00391     else if (!strcmp("RSA", (const char*)operand.buf)) {
00392         if (Base64_RSAspki!=NULL) {
00393             Use_isNet_Crypt = TRUE;
00394             keyex = SSL_RSA;
00395 
00396             tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00397             buf = make_Buffer(LBUF);
00398             copy_Buffer(Base64_RSAspki, &buf);
00399             cat_s2Buffer("\r\nEND\r\n", &buf);
00400             tcp_send_crypt_sBuffer(sock, &buf, CRYPT_SharedKey, CRYPT_Type);
00401             free_Buffer(&buf);
00402         }
00403         else {
00404             tcp_send_crypt_mesg(sock, (char*)"ERR 162 KEYEX RSA Error.\r\n", CRYPT_SharedKey, CRYPT_Type);
00405             DEBUG_MODE PRINT_MESG("ERR 162 KEYEX RSA Error.\n");
00406             return 162;
00407         }
00408     }
00409 
00410     else if (!strcmp("SPKI", (const char*)operand.buf)) {
00411         Buffer dkey;
00412 
00413         tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00414         buf = make_Buffer(LBUF);
00415         tcp_recv_Buffer_wait(sock, &buf, 20);
00416         dkey = get_plain_sBuffer(buf, CRYPT_SharedKey, CRYPT_Type);
00417         free_Buffer(&buf);
00418         chomp_Buffer(&dkey);
00419         buf = decode_base64_Buffer(dkey);
00420         free_Buffer(&dkey);
00421 
00422         if (CRYPT_SharedKey!=NULL) free_Buffer(CRYPT_SharedKey);
00423         CRYPT_SharedKey = new_Buffer(0);
00424 
00425         if (gen_CRYPT_SharedKey(keyex, buf, CRYPT_SharedKey, (void*)DHkey)) {
00426             tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00427         }
00428         else {
00429             tcp_send_crypt_mesg(sock, (char*)"ERR 163 cannot generate Shared KEY.\r\n", CRYPT_SharedKey, CRYPT_Type);
00430             DEBUG_MODE PRINT_MESG("ERR 163 cannot generate Shared KEY.\n");
00431             return 163;
00432         }
00433         free_Buffer(&buf);
00434     }
00435 
00436     else if (!strcmp("CHLNG", (const char*)operand.buf)) {
00437         if (!Use_isNet_Ldap) {
00438             No_isNet_Chlng = FALSE;
00439             tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00440         }
00441         else {
00442             tcp_send_crypt_mesg(sock, (char*)"ERR 164 cannot use Challenge Key mode with LDAP mode.\r\n", CRYPT_SharedKey, CRYPT_Type);
00443             DEBUG_MODE PRINT_MESG("ERR 164 cannot use Challenge Key mode with LDAP mode.\n");
00444             return 164;
00445         }
00446     }
00447 
00448     else if (!strcmp("NOCHLNG", (const char*)operand.buf)) {
00449         if (Use_isNet_Crypt==TRUE) {
00450             No_isNet_Chlng = TRUE;
00451             tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00452         }
00453         else {
00454             tcp_send_crypt_mesg(sock, (char*)"ERR 165 both No Challenge Key mode and No Crypt mode are not used.\r\n", CRYPT_SharedKey, CRYPT_Type);
00455             DEBUG_MODE PRINT_MESG("ERR 165 both No Challenge Key mode and No Crypt mode are not used.\n");
00456             return 165;
00457         }
00458     }
00459 
00460     else {
00461         tcp_send_crypt_mesg(sock, (char*)"ERR 169 Unkown KEYEX operand.\n\r", CRYPT_SharedKey, CRYPT_Type);
00462         DEBUG_MODE PRINT_MESG("ERR 169 Unkown KEYEX operand.\r");
00463         return 169;
00464     }
00465 
00466     return 0;
00467 }
00468 
00469 
00470 
00488 int  command_CRYPT(Buffer operand, Buffer comment, int sock)
00489 {
00490     UNUSED(comment);
00491 
00492     if (CRYPT_SharedKey==NULL) {
00493         tcp_send_crypt_mesg(sock, (char*)"ERR 171 No Shared Key.\r\n", NULL, NULL);
00494         DEBUG_MODE PRINT_MESG("ERR 171 No Shared Key.\n");
00495         return 171;
00496     }
00497 
00498     if (!strcmp("AES128CBC", (const char*)operand.buf)) {            
00499         tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00500         free(CRYPT_Type);
00501         CRYPT_Type = init_EVPAPI_Buffer(SSL_AES128CBC);
00502     }
00503     else if (!strcmp("3DES3CBC", (const char*)operand.buf)) {        
00504         tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00505         CRYPT_Type = init_EVPAPI_Buffer(SSL_3DES3CBC);
00506     }
00507     else if (!strcmp("RESET", (const char*)operand.buf)) {            
00508         tcp_send_crypt_mesg(sock, (char*)"OK\r\n", CRYPT_SharedKey, CRYPT_Type);
00509         
00510     }
00511     else {
00512         tcp_send_crypt_mesg(sock, (char*)"ERR 179 Unkown CRYPT operand.\r\n", CRYPT_SharedKey, CRYPT_Type);
00513         DEBUG_MODE PRINT_MESG("ERR 179 Unkown CRYPT operand.\n");
00514         return 179;
00515     }
00516 
00517     return 0;
00518 }
00519 
00520 
00521