| 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; |
| 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; |
| 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); |
| 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) { |
| 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; |