android: Add support for signature schemes used by EAP-TLS
This commit is contained in:
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user