Develop and Download Open Source Software

Browse Subversion Repository

Diff of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/key.c

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

revision 4321 by maya, Sat Feb 19 07:41:41 2011 UTC revision 4324 by maya, Sat Feb 19 11:07:05 2011 UTC
# Line 995  BOOL generate_SSH2_keysign(Key *keypair, Line 995  BOOL generate_SSH2_keysign(Key *keypair,
995                  return FALSE;                  return FALSE;
996          }          }
997    
998          if (keypair->type == KEY_RSA) { // RSA          switch (keypair->type) {
999            case KEY_RSA: // RSA
1000            {
1001                  const EVP_MD *evp_md = EVP_sha1();                  const EVP_MD *evp_md = EVP_sha1();
1002                  EVP_MD_CTX md;                  EVP_MD_CTX md;
1003                  u_char digest[EVP_MAX_MD_SIZE], *sig;                  u_char digest[EVP_MAX_MD_SIZE], *sig;
# Line 1048  BOOL generate_SSH2_keysign(Key *keypair, Line 1050  BOOL generate_SSH2_keysign(Key *keypair,
1050                  }                  }
1051                  memcpy(*sigptr, buffer_ptr(msg), len);                  memcpy(*sigptr, buffer_ptr(msg), len);
1052                  free(sig);                  free(sig);
1053                    
1054                    break;
1055          }          }
1056          else if (keypair->type == KEY_DSA) { // DSA          case KEY_DSA: // DSA
1057            {
1058                  DSA_SIG *sig;                  DSA_SIG *sig;
1059                  const EVP_MD *evp_md = EVP_sha1();                  const EVP_MD *evp_md = EVP_sha1();
1060                  EVP_MD_CTX md;                  EVP_MD_CTX md;
# Line 1095  BOOL generate_SSH2_keysign(Key *keypair, Line 1099  BOOL generate_SSH2_keysign(Key *keypair,
1099                  }                  }
1100                  memcpy(*sigptr, buffer_ptr(msg), len);                  memcpy(*sigptr, buffer_ptr(msg), len);
1101    
1102                    break;
1103          }          }
1104          else {          case KEY_ECDSA256: // ECDSA
1105            case KEY_ECDSA384:
1106            case KEY_ECDSA521:
1107            {
1108                    ECDSA_SIG *sig;
1109                    const EVP_MD *evp_md;
1110                    EVP_MD_CTX md;
1111                    u_char digest[EVP_MAX_MD_SIZE];
1112                    u_int len, dlen, nid;
1113                    buffer_t *buf2 = NULL;
1114    
1115                    switch (keypair->type) {
1116                            case KEY_ECDSA256:
1117                                    nid = NID_sha256;
1118                                    break;
1119                            case KEY_ECDSA384:
1120                                    nid = NID_sha384;
1121                                    break;
1122                            case KEY_ECDSA521:
1123                                    nid = NID_sha512;
1124                                    break;
1125                    }
1126                    if ((evp_md = EVP_get_digestbynid(nid)) == NULL) {
1127                            goto error;
1128                    }
1129                    EVP_DigestInit(&md, evp_md);
1130                    EVP_DigestUpdate(&md, data, datalen);
1131                    EVP_DigestFinal(&md, digest, &dlen);
1132    
1133                    sig = ECDSA_do_sign(digest, dlen, keypair->ecdsa);
1134                    memset(digest, 'd', sizeof(digest));
1135    
1136                    if (sig == NULL) {
1137                            goto error;
1138                    }
1139    
1140                    buf2 = buffer_init();
1141                    if (buf2 == NULL) {
1142                            // TODO: error check
1143                            goto error;
1144                    }
1145                    buffer_put_bignum2(buf2, sig->r);
1146                    buffer_put_bignum2(buf2, sig->s);
1147                    ECDSA_SIG_free(sig);
1148    
1149                    s = get_sshname_from_key(keypair);
1150                    buffer_put_string(msg, s, strlen(s));
1151                    buffer_put_string(msg, buffer_ptr(buf2), buffer_len(buf2));
1152                    buffer_free(buf2);
1153                    len = buffer_len(msg);
1154    
1155                    *siglen = len;
1156                    *sigptr = malloc(len);
1157                    if (*sigptr == NULL) {
1158                            goto error;
1159                    }
1160                    memcpy(*sigptr, buffer_ptr(msg), len);
1161    
1162                    break;
1163            }
1164            default:
1165                  buffer_free(msg);                  buffer_free(msg);
1166                  return FALSE;                  return FALSE;
1167                    break;
1168          }          }
1169    
1170          buffer_free(msg);          buffer_free(msg);
# Line 1115  BOOL get_SSH2_publickey_blob(PTInstVar p Line 1181  BOOL get_SSH2_publickey_blob(PTInstVar p
1181  {  {
1182          buffer_t *msg = NULL;          buffer_t *msg = NULL;
1183          Key *keypair;          Key *keypair;
1184          char *s;          char *s, *tmp;
1185    
1186          msg = buffer_init();          msg = buffer_init();
1187          if (msg == NULL) {          if (msg == NULL) {
# Line 1125  BOOL get_SSH2_publickey_blob(PTInstVar p Line 1191  BOOL get_SSH2_publickey_blob(PTInstVar p
1191    
1192          keypair = pvar->auth_state.cur_cred.key_pair;          keypair = pvar->auth_state.cur_cred.key_pair;
1193    
1194          if (keypair->type == KEY_RSA) { // RSA          switch (keypair->type) {
1195            case KEY_RSA: // RSA
1196                  s = get_sshname_from_key(keypair);                  s = get_sshname_from_key(keypair);
1197                  buffer_put_string(msg, s, strlen(s));                  buffer_put_string(msg, s, strlen(s));
1198                  buffer_put_bignum2(msg, keypair->rsa->e); // 公開指数                  buffer_put_bignum2(msg, keypair->rsa->e); // 公開指数
1199                  buffer_put_bignum2(msg, keypair->rsa->n); // p×q                  buffer_put_bignum2(msg, keypair->rsa->n); // p×q
1200                    break;
1201          }          case KEY_DSA: // DSA
         else if (keypair->type == KEY_RSA) { // DSA  
1202                  s = get_sshname_from_key(keypair);                  s = get_sshname_from_key(keypair);
1203                  buffer_put_string(msg, s, strlen(s));                  buffer_put_string(msg, s, strlen(s));
1204                  buffer_put_bignum2(msg, keypair->dsa->p); // 素数                  buffer_put_bignum2(msg, keypair->dsa->p); // 素数
1205                  buffer_put_bignum2(msg, keypair->dsa->q); // (p-1)の素因数                  buffer_put_bignum2(msg, keypair->dsa->q); // (p-1)の素因数
1206                  buffer_put_bignum2(msg, keypair->dsa->g); // 整数                  buffer_put_bignum2(msg, keypair->dsa->g); // 整数
1207                  buffer_put_bignum2(msg, keypair->dsa->pub_key); // 公開鍵                  buffer_put_bignum2(msg, keypair->dsa->pub_key); // 公開鍵
1208                    break;
1209          }          case KEY_ECDSA256: // ECDSA
1210          else {          case KEY_ECDSA384:
1211            case KEY_ECDSA521:
1212                    s = get_sshname_from_key(keypair);
1213                    buffer_put_string(msg, s, strlen(s));
1214                    tmp = curve_keytype_to_name(keypair->type);
1215                    buffer_put_string(msg, tmp, strlen(tmp));
1216                    buffer_put_ecpoint(msg, EC_KEY_get0_group(keypair->ecdsa),
1217                                            EC_KEY_get0_public_key(keypair->ecdsa));
1218                    break;
1219            default:
1220                  return FALSE;                  return FALSE;
   
1221          }          }
1222    
1223          *blobptr = msg;          *blobptr = msg;

Legend:
Removed from v.4321  
changed lines
  Added in v.4324

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