Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/ttssh2/ttxssh/hosts.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 4565 by maya, Tue Aug 2 11:50:35 2011 UTC revision 4569 by doda, Thu Aug 4 06:00:17 2011 UTC
# Line 38  See LICENSE.TXT for the license. Line 38  See LICENSE.TXT for the license.
38  #include "ssh.h"  #include "ssh.h"
39  #include "key.h"  #include "key.h"
40  #include "hosts.h"  #include "hosts.h"
41    #include "dns.h"
42    
43  #include <openssl/bn.h>  #include <openssl/bn.h>
44  #include <openssl/evp.h>  #include <openssl/evp.h>
# Line 51  See LICENSE.TXT for the license. Line 52  See LICENSE.TXT for the license.
52  #include <direct.h>  #include <direct.h>
53  #include <memory.h>  #include <memory.h>
54    
 #include <windns.h>  
   
 #define DNS_TYPE_SSHFP  44  
 typedef struct {  
         BYTE Algorithm;  
         BYTE DigestType;  
         BYTE Digest[1];  
 } DNS_SSHFP_DATA, *PDNS_SSHFP_DATA;  
 enum verifydns_result {  
         DNS_VERIFY_NONE,  
         DNS_VERIFY_NOTFOUND,  
         DNS_VERIFY_MATCH,  
         DNS_VERIFY_MISMATCH,  
         DNS_VERIFY_DIFFERENTTYPE,  
         DNS_VERIFY_AUTH_MATCH,  
         DNS_VERIFY_AUTH_MISMATCH,  
         DNS_VERIFY_AUTH_DIFFERENTTYPE  
 };  
55    
56  static HFONT DlgHostsAddFont;  static HFONT DlgHostsAddFont;
57  static HFONT DlgHostsReplaceFont;  static HFONT DlgHostsReplaceFont;
# Line 1755  void HOSTS_do_different_type_key_dialog( Line 1738  void HOSTS_do_different_type_key_dialog(
1738          }          }
1739  }  }
1740    
 int is_numeric_hostname(const char *hostname)  
 {  
         struct addrinfo hints, *ai;  
   
         if (hostname == NULL) {  
                 return -1;  
         }  
   
         memset(&hints, 0, sizeof(hints));  
         hints.ai_socktype = SOCK_DGRAM;  
         hints.ai_flags = AI_NUMERICHOST;  
   
         if (getaddrinfo(hostname, NULL, &hints, &ai) == 0) {  
                 freeaddrinfo(ai);  
                 return 1;  
         }  
   
         return 0;  
 }  
   
 int verify_hostkey_dns(char FAR *hostname, Key *key)  
 {  
         DNS_STATUS status;  
         PDNS_RECORD rec, p;  
         PDNS_SSHFP_DATA t;  
         int hostkey_alg, hostkey_dtype, hostkey_dlen;  
         BYTE *hostkey_digest;  
         int found = DNS_VERIFY_NOTFOUND;  
   
         switch (key->type) {  
         case KEY_RSA:  
                 hostkey_alg = SSHFP_KEY_RSA;  
                 hostkey_dtype = SSHFP_HASH_SHA1;  
                 break;  
         case KEY_DSA:  
                 hostkey_alg = SSHFP_KEY_DSA;  
                 hostkey_dtype = SSHFP_HASH_SHA1;  
                 break;  
         case KEY_ECDSA256:  
         case KEY_ECDSA384:  
         case KEY_ECDSA521:  
                 hostkey_alg = SSHFP_KEY_ECDSA;  
                 hostkey_dtype = SSHFP_HASH_SHA256;  
                 break;  
         default: // Un-supported algorithm  
                 hostkey_alg = SSHFP_KEY_RESERVED;  
                 hostkey_dtype = SSHFP_HASH_RESERVED;  
         }  
   
         if (hostkey_alg) {  
                 hostkey_digest = key_fingerprint_raw(key, hostkey_dtype, &hostkey_dlen);  
         }  
         else {  
                 hostkey_digest = NULL;  
         }  
   
         status = DnsQuery(hostname, DNS_TYPE_SSHFP, DNS_QUERY_STANDARD, NULL, &rec, NULL);  
   
         if (status == 0) {  
                 for (p=rec; p!=NULL; p=p->pNext) {  
                         if (p->wType == DNS_TYPE_SSHFP) {  
                                 t = (PDNS_SSHFP_DATA)&(p->Data.Null);  
                                 if (t->Algorithm == hostkey_alg && t->DigestType == hostkey_dtype) {  
                                         if (hostkey_dlen == p->wDataLength-2 && memcmp(hostkey_digest, t->Digest, hostkey_dlen) == 0) {  
                                                 found = DNS_VERIFY_MATCH;  
                                                 break;  
                                         }  
                                         else {  
                                                 found = DNS_VERIFY_MISMATCH;  
                                                 break;  
                                         }  
                                 }  
                                 else {  
                                         found = DNS_VERIFY_DIFFERENTTYPE;  
                                 }  
                         }  
                 }  
         }  
   
         free(hostkey_digest);  
         DnsRecordListFree(rec, DnsFreeRecordList);  
         return found;  
 }  
   
1741  //  //
1742  // サーバから送られてきたホスト公開鍵の妥当性をチェックする  // サーバから送られてきたホスト公開鍵の妥当性をチェックする
1743  //  //

Legend:
Removed from v.4565  
changed lines
  Added in v.4569

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26