android: Add support for signature schemes used by EAP-TLS

This commit is contained in:
Tobias Brunner
2014-11-06 16:28:40 +01:00
parent 0ef74bec98
commit 4b39a4117a
@@ -68,6 +68,9 @@ METHOD(private_key_t, sign, bool,
case KEY_RSA: case KEY_RSA:
switch (scheme) switch (scheme)
{ {
case SIGN_RSA_EMSA_PKCS1_NULL:
method = "NONEwithRSA";
break;
case SIGN_RSA_EMSA_PKCS1_MD5: case SIGN_RSA_EMSA_PKCS1_MD5:
method = "MD5withRSA"; method = "MD5withRSA";
break; break;
@@ -93,12 +96,18 @@ METHOD(private_key_t, sign, bool,
case KEY_ECDSA: case KEY_ECDSA:
switch (scheme) switch (scheme)
{ {
case SIGN_ECDSA_WITH_SHA1_DER:
method = "SHA1withECDSA";
break;
case SIGN_ECDSA_WITH_SHA256_DER:
case SIGN_ECDSA_256: case SIGN_ECDSA_256:
method = "SHA256withECDSA"; method = "SHA256withECDSA";
break; break;
case SIGN_ECDSA_WITH_SHA384_DER:
case SIGN_ECDSA_384: case SIGN_ECDSA_384:
method = "SHA384withECDSA"; method = "SHA384withECDSA";
break; break;
case SIGN_ECDSA_WITH_SHA512_DER:
case SIGN_ECDSA_521: case SIGN_ECDSA_521:
method = "SHA512withECDSA"; method = "SHA512withECDSA";
break; break;
@@ -189,30 +198,36 @@ METHOD(private_key_t, sign, bool,
default: default:
break; break;
} }
if (len)
/* we get an ASN.1 encoded sequence of integers r and s */
parse = encoded = chunk_from_byte_array(env, jsigarray);
if (asn1_unwrap(&parse, &parse) != ASN1_SEQUENCE ||
asn1_unwrap(&parse, &r) != ASN1_INTEGER ||
asn1_unwrap(&parse, &s) != ASN1_INTEGER)
{ {
chunk_free(&encoded); /* we get an ASN.1 encoded sequence of integers r and s */
goto failed; parse = encoded = chunk_from_byte_array(env, jsigarray);
} if (asn1_unwrap(&parse, &parse) != ASN1_SEQUENCE ||
r = chunk_skip_zero(r); asn1_unwrap(&parse, &r) != ASN1_INTEGER ||
s = chunk_skip_zero(s); asn1_unwrap(&parse, &s) != ASN1_INTEGER)
if (r.len > len || s.len > len) {
{ chunk_free(&encoded);
chunk_free(&encoded); goto failed;
goto failed; }
} r = chunk_skip_zero(r);
s = chunk_skip_zero(s);
if (r.len > len || s.len > len)
{
chunk_free(&encoded);
goto failed;
}
/* concatenate r and s (forced to the defined length) */ /* concatenate r and s (forced to the defined length) */
*signature = chunk_alloc(2*len); *signature = chunk_alloc(2*len);
memset(signature->ptr, 0, signature->len); memset(signature->ptr, 0, signature->len);
memcpy(signature->ptr + (len - r.len), r.ptr, r.len); memcpy(signature->ptr + (len - r.len), r.ptr, r.len);
memcpy(signature->ptr + len + (len - s.len), s.ptr, s.len); memcpy(signature->ptr + len + (len - s.len), s.ptr, s.len);
chunk_free(&encoded); chunk_free(&encoded);
}
else
{
*signature = chunk_from_byte_array(env, jsigarray);
}
} }
else else
{ {