1582 lines
42 KiB
Diff
1582 lines
42 KiB
Diff
Index: crypto/openssl/crypto/asn1/a_bitstr.c
|
|
===================================================================
|
|
--- crypto/openssl/crypto/asn1/a_bitstr.c (revision 276867)
|
|
+++ crypto/openssl/crypto/asn1/a_bitstr.c (working copy)
|
|
@@ -136,11 +136,16 @@ ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRI
|
|
|
|
p= *pp;
|
|
i= *(p++);
|
|
+ if (i > 7)
|
|
+ {
|
|
+ i=ASN1_R_INVALID_BIT_STRING_BITS_LEFT;
|
|
+ goto err;
|
|
+ }
|
|
/* We do this to preserve the settings. If we modify
|
|
* the settings, via the _set_bit function, we will recalculate
|
|
* on output */
|
|
ret->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); /* clear */
|
|
- ret->flags|=(ASN1_STRING_FLAG_BITS_LEFT|(i&0x07)); /* set */
|
|
+ ret->flags|=(ASN1_STRING_FLAG_BITS_LEFT|i); /* set */
|
|
|
|
if (len-- > 1) /* using one because of the bits left byte */
|
|
{
|
|
Index: crypto/openssl/crypto/asn1/a_type.c
|
|
===================================================================
|
|
--- crypto/openssl/crypto/asn1/a_type.c (revision 276867)
|
|
+++ crypto/openssl/crypto/asn1/a_type.c (working copy)
|
|
@@ -108,3 +108,49 @@ int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const v
|
|
|
|
IMPLEMENT_STACK_OF(ASN1_TYPE)
|
|
IMPLEMENT_ASN1_SET_OF(ASN1_TYPE)
|
|
+
|
|
+/* Returns 0 if they are equal, != 0 otherwise. */
|
|
+int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b)
|
|
+ {
|
|
+ int result = -1;
|
|
+
|
|
+ if (!a || !b || a->type != b->type) return -1;
|
|
+
|
|
+ switch (a->type)
|
|
+ {
|
|
+ case V_ASN1_OBJECT:
|
|
+ result = OBJ_cmp(a->value.object, b->value.object);
|
|
+ break;
|
|
+ case V_ASN1_NULL:
|
|
+ result = 0; /* They do not have content. */
|
|
+ break;
|
|
+ case V_ASN1_INTEGER:
|
|
+ case V_ASN1_NEG_INTEGER:
|
|
+ case V_ASN1_ENUMERATED:
|
|
+ case V_ASN1_NEG_ENUMERATED:
|
|
+ case V_ASN1_BIT_STRING:
|
|
+ case V_ASN1_OCTET_STRING:
|
|
+ case V_ASN1_SEQUENCE:
|
|
+ case V_ASN1_SET:
|
|
+ case V_ASN1_NUMERICSTRING:
|
|
+ case V_ASN1_PRINTABLESTRING:
|
|
+ case V_ASN1_T61STRING:
|
|
+ case V_ASN1_VIDEOTEXSTRING:
|
|
+ case V_ASN1_IA5STRING:
|
|
+ case V_ASN1_UTCTIME:
|
|
+ case V_ASN1_GENERALIZEDTIME:
|
|
+ case V_ASN1_GRAPHICSTRING:
|
|
+ case V_ASN1_VISIBLESTRING:
|
|
+ case V_ASN1_GENERALSTRING:
|
|
+ case V_ASN1_UNIVERSALSTRING:
|
|
+ case V_ASN1_BMPSTRING:
|
|
+ case V_ASN1_UTF8STRING:
|
|
+ case V_ASN1_OTHER:
|
|
+ default:
|
|
+ result = ASN1_STRING_cmp((ASN1_STRING *) a->value.ptr,
|
|
+ (ASN1_STRING *) b->value.ptr);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ return result;
|
|
+ }
|
|
Index: crypto/openssl/crypto/asn1/a_verify.c
|
|
===================================================================
|
|
--- crypto/openssl/crypto/asn1/a_verify.c (revision 276867)
|
|
+++ crypto/openssl/crypto/asn1/a_verify.c (working copy)
|
|
@@ -89,6 +89,12 @@ int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *a, A
|
|
ASN1err(ASN1_F_ASN1_VERIFY,ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM);
|
|
goto err;
|
|
}
|
|
+
|
|
+ if (signature->type == V_ASN1_BIT_STRING && signature->flags & 0x7)
|
|
+ {
|
|
+ ASN1err(ASN1_F_ASN1_VERIFY, ASN1_R_INVALID_BIT_STRING_BITS_LEFT);
|
|
+ goto err;
|
|
+ }
|
|
|
|
inl=i2d(data,NULL);
|
|
buf_in=OPENSSL_malloc((unsigned int)inl);
|
|
@@ -144,6 +150,12 @@ int ASN1_item_verify(const ASN1_ITEM *it, X509_ALG
|
|
return -1;
|
|
}
|
|
|
|
+ if (signature->type == V_ASN1_BIT_STRING && signature->flags & 0x7)
|
|
+ {
|
|
+ ASN1err(ASN1_F_ASN1_ITEM_VERIFY, ASN1_R_INVALID_BIT_STRING_BITS_LEFT);
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
EVP_MD_CTX_init(&ctx);
|
|
i=OBJ_obj2nid(a->algorithm);
|
|
type=EVP_get_digestbyname(OBJ_nid2sn(i));
|
|
Index: crypto/openssl/crypto/asn1/asn1.h
|
|
===================================================================
|
|
--- crypto/openssl/crypto/asn1/asn1.h (revision 276867)
|
|
+++ crypto/openssl/crypto/asn1/asn1.h (working copy)
|
|
@@ -769,6 +769,7 @@ DECLARE_ASN1_FUNCTIONS_fname(ASN1_TYPE, ASN1_ANY,
|
|
int ASN1_TYPE_get(ASN1_TYPE *a);
|
|
void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value);
|
|
int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value);
|
|
+int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b);
|
|
|
|
ASN1_OBJECT * ASN1_OBJECT_new(void );
|
|
void ASN1_OBJECT_free(ASN1_OBJECT *a);
|
|
@@ -1260,6 +1261,7 @@ void ERR_load_ASN1_strings(void);
|
|
#define ASN1_R_ILLEGAL_TIME_VALUE 184
|
|
#define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185
|
|
#define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128
|
|
+#define ASN1_R_INVALID_BIT_STRING_BITS_LEFT 220
|
|
#define ASN1_R_INVALID_BMPSTRING_LENGTH 129
|
|
#define ASN1_R_INVALID_DIGIT 130
|
|
#define ASN1_R_INVALID_MIME_TYPE 200
|
|
@@ -1308,6 +1310,7 @@ void ERR_load_ASN1_strings(void);
|
|
#define ASN1_R_TIME_NOT_ASCII_FORMAT 193
|
|
#define ASN1_R_TOO_LONG 155
|
|
#define ASN1_R_TYPE_NOT_CONSTRUCTED 156
|
|
+#define ASN1_R_TYPE_NOT_PRIMITIVE 218
|
|
#define ASN1_R_UNABLE_TO_DECODE_RSA_KEY 157
|
|
#define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY 158
|
|
#define ASN1_R_UNEXPECTED_EOC 159
|
|
Index: crypto/openssl/crypto/asn1/asn1_err.c
|
|
===================================================================
|
|
--- crypto/openssl/crypto/asn1/asn1_err.c (revision 276867)
|
|
+++ crypto/openssl/crypto/asn1/asn1_err.c (working copy)
|
|
@@ -1,6 +1,6 @@
|
|
/* crypto/asn1/asn1_err.c */
|
|
/* ====================================================================
|
|
- * Copyright (c) 1999-2008 The OpenSSL Project. All rights reserved.
|
|
+ * Copyright (c) 1999-2014 The OpenSSL Project. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
@@ -235,6 +235,7 @@ static ERR_STRING_DATA ASN1_str_reasons[]=
|
|
{ERR_REASON(ASN1_R_ILLEGAL_TIME_VALUE) ,"illegal time value"},
|
|
{ERR_REASON(ASN1_R_INTEGER_NOT_ASCII_FORMAT),"integer not ascii format"},
|
|
{ERR_REASON(ASN1_R_INTEGER_TOO_LARGE_FOR_LONG),"integer too large for long"},
|
|
+{ERR_REASON(ASN1_R_INVALID_BIT_STRING_BITS_LEFT),"invalid bit string bits left"},
|
|
{ERR_REASON(ASN1_R_INVALID_BMPSTRING_LENGTH),"invalid bmpstring length"},
|
|
{ERR_REASON(ASN1_R_INVALID_DIGIT) ,"invalid digit"},
|
|
{ERR_REASON(ASN1_R_INVALID_MIME_TYPE) ,"invalid mime type"},
|
|
@@ -283,6 +284,7 @@ static ERR_STRING_DATA ASN1_str_reasons[]=
|
|
{ERR_REASON(ASN1_R_TIME_NOT_ASCII_FORMAT),"time not ascii format"},
|
|
{ERR_REASON(ASN1_R_TOO_LONG) ,"too long"},
|
|
{ERR_REASON(ASN1_R_TYPE_NOT_CONSTRUCTED) ,"type not constructed"},
|
|
+{ERR_REASON(ASN1_R_TYPE_NOT_PRIMITIVE) ,"type not primitive"},
|
|
{ERR_REASON(ASN1_R_UNABLE_TO_DECODE_RSA_KEY),"unable to decode rsa key"},
|
|
{ERR_REASON(ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY),"unable to decode rsa private key"},
|
|
{ERR_REASON(ASN1_R_UNEXPECTED_EOC) ,"unexpected eoc"},
|
|
Index: crypto/openssl/crypto/asn1/tasn_dec.c
|
|
===================================================================
|
|
--- crypto/openssl/crypto/asn1/tasn_dec.c (revision 276867)
|
|
+++ crypto/openssl/crypto/asn1/tasn_dec.c (working copy)
|
|
@@ -866,6 +866,14 @@ static int asn1_d2i_ex_primitive(ASN1_VALUE **pval
|
|
}
|
|
else if (cst)
|
|
{
|
|
+ if (utype == V_ASN1_NULL || utype == V_ASN1_BOOLEAN
|
|
+ || utype == V_ASN1_OBJECT || utype == V_ASN1_INTEGER
|
|
+ || utype == V_ASN1_ENUMERATED)
|
|
+ {
|
|
+ ASN1err(ASN1_F_ASN1_D2I_EX_PRIMITIVE,
|
|
+ ASN1_R_TYPE_NOT_PRIMITIVE);
|
|
+ return 0;
|
|
+ }
|
|
buf.length = 0;
|
|
buf.max = 0;
|
|
buf.data = NULL;
|
|
Index: crypto/openssl/crypto/asn1/x_algor.c
|
|
===================================================================
|
|
--- crypto/openssl/crypto/asn1/x_algor.c (revision 276867)
|
|
+++ crypto/openssl/crypto/asn1/x_algor.c (working copy)
|
|
@@ -128,3 +128,13 @@ void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *ppt
|
|
}
|
|
}
|
|
|
|
+int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b)
|
|
+ {
|
|
+ int rv;
|
|
+ rv = OBJ_cmp(a->algorithm, b->algorithm);
|
|
+ if (rv)
|
|
+ return rv;
|
|
+ if (!a->parameter && !b->parameter)
|
|
+ return 0;
|
|
+ return ASN1_TYPE_cmp(a->parameter, b->parameter);
|
|
+ }
|
|
Index: crypto/openssl/crypto/bn/asm/mips3.s
|
|
===================================================================
|
|
--- crypto/openssl/crypto/bn/asm/mips3.s (revision 276867)
|
|
+++ crypto/openssl/crypto/bn/asm/mips3.s (working copy)
|
|
@@ -1584,17 +1584,17 @@ LEAF(bn_sqr_comba8)
|
|
dmultu a_2,a_0 /* mul_add_c2(a[2],b[0],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_2,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_3,t_1
|
|
sltu AT,c_3,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_3,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_3,t_1
|
|
+ daddu c_1,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_2,c_1,AT
|
|
daddu c_1,t_2
|
|
- sltu AT,c_1,t_2
|
|
- daddu c_2,AT
|
|
+ sltu t_2,c_1,t_2
|
|
+ daddu c_2,t_2
|
|
dmultu a_1,a_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
@@ -1609,63 +1609,63 @@ LEAF(bn_sqr_comba8)
|
|
dmultu a_0,a_3 /* mul_add_c2(a[0],b[3],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_3,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_1,t_1
|
|
sltu AT,c_1,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_1,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_1,t_1
|
|
+ daddu c_2,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_3,c_2,AT
|
|
daddu c_2,t_2
|
|
- sltu AT,c_2,t_2
|
|
- daddu c_3,AT
|
|
+ sltu t_2,c_2,t_2
|
|
+ daddu c_3,t_2
|
|
dmultu a_1,a_2 /* mul_add_c2(a[1],b[2],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_3,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_1,t_1
|
|
sltu AT,c_1,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_1,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_1,t_1
|
|
+ daddu c_2,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_2,AT
|
|
daddu c_2,t_2
|
|
- sltu AT,c_2,t_2
|
|
daddu c_3,AT
|
|
+ sltu t_2,c_2,t_2
|
|
+ daddu c_3,t_2
|
|
sd c_1,24(a0)
|
|
|
|
dmultu a_4,a_0 /* mul_add_c2(a[4],b[0],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_1,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_2,t_1
|
|
sltu AT,c_2,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_2,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_2,t_1
|
|
+ daddu c_3,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_1,c_3,AT
|
|
daddu c_3,t_2
|
|
- sltu AT,c_3,t_2
|
|
- daddu c_1,AT
|
|
+ sltu t_2,c_3,t_2
|
|
+ daddu c_1,t_2
|
|
dmultu a_3,a_1 /* mul_add_c2(a[3],b[1],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_1,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_2,t_1
|
|
sltu AT,c_2,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_2,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_2,t_1
|
|
+ daddu c_3,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_3,AT
|
|
daddu c_3,t_2
|
|
- sltu AT,c_3,t_2
|
|
daddu c_1,AT
|
|
+ sltu t_2,c_3,t_2
|
|
+ daddu c_1,t_2
|
|
dmultu a_2,a_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
@@ -1680,93 +1680,93 @@ LEAF(bn_sqr_comba8)
|
|
dmultu a_0,a_5 /* mul_add_c2(a[0],b[5],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_2,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_3,t_1
|
|
sltu AT,c_3,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_3,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_3,t_1
|
|
+ daddu c_1,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_2,c_1,AT
|
|
daddu c_1,t_2
|
|
- sltu AT,c_1,t_2
|
|
- daddu c_2,AT
|
|
+ sltu t_2,c_1,t_2
|
|
+ daddu c_2,t_2
|
|
dmultu a_1,a_4 /* mul_add_c2(a[1],b[4],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_2,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_3,t_1
|
|
sltu AT,c_3,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_3,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_3,t_1
|
|
+ daddu c_1,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_1,AT
|
|
daddu c_1,t_2
|
|
- sltu AT,c_1,t_2
|
|
daddu c_2,AT
|
|
+ sltu t_2,c_1,t_2
|
|
+ daddu c_2,t_2
|
|
dmultu a_2,a_3 /* mul_add_c2(a[2],b[3],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_2,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_3,t_1
|
|
sltu AT,c_3,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_3,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_3,t_1
|
|
+ daddu c_1,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_1,AT
|
|
daddu c_1,t_2
|
|
- sltu AT,c_1,t_2
|
|
daddu c_2,AT
|
|
+ sltu t_2,c_1,t_2
|
|
+ daddu c_2,t_2
|
|
sd c_3,40(a0)
|
|
|
|
dmultu a_6,a_0 /* mul_add_c2(a[6],b[0],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_3,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_1,t_1
|
|
sltu AT,c_1,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_1,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_1,t_1
|
|
+ daddu c_2,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_3,c_2,AT
|
|
daddu c_2,t_2
|
|
- sltu AT,c_2,t_2
|
|
- daddu c_3,AT
|
|
+ sltu t_2,c_2,t_2
|
|
+ daddu c_3,t_2
|
|
dmultu a_5,a_1 /* mul_add_c2(a[5],b[1],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_3,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_1,t_1
|
|
sltu AT,c_1,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_1,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_1,t_1
|
|
+ daddu c_2,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_2,AT
|
|
daddu c_2,t_2
|
|
- sltu AT,c_2,t_2
|
|
daddu c_3,AT
|
|
+ sltu t_2,c_2,t_2
|
|
+ daddu c_3,t_2
|
|
dmultu a_4,a_2 /* mul_add_c2(a[4],b[2],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_3,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_1,t_1
|
|
sltu AT,c_1,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_1,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_1,t_1
|
|
+ daddu c_2,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_2,AT
|
|
daddu c_2,t_2
|
|
- sltu AT,c_2,t_2
|
|
daddu c_3,AT
|
|
+ sltu t_2,c_2,t_2
|
|
+ daddu c_3,t_2
|
|
dmultu a_3,a_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
@@ -1781,108 +1781,108 @@ LEAF(bn_sqr_comba8)
|
|
dmultu a_0,a_7 /* mul_add_c2(a[0],b[7],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_1,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_2,t_1
|
|
sltu AT,c_2,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_2,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_2,t_1
|
|
+ daddu c_3,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_1,c_3,AT
|
|
daddu c_3,t_2
|
|
- sltu AT,c_3,t_2
|
|
- daddu c_1,AT
|
|
+ sltu t_2,c_3,t_2
|
|
+ daddu c_1,t_2
|
|
dmultu a_1,a_6 /* mul_add_c2(a[1],b[6],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_1,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_2,t_1
|
|
sltu AT,c_2,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_2,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_2,t_1
|
|
+ daddu c_3,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_3,AT
|
|
daddu c_3,t_2
|
|
- sltu AT,c_3,t_2
|
|
daddu c_1,AT
|
|
+ sltu t_2,c_3,t_2
|
|
+ daddu c_1,t_2
|
|
dmultu a_2,a_5 /* mul_add_c2(a[2],b[5],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_1,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_2,t_1
|
|
sltu AT,c_2,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_2,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_2,t_1
|
|
+ daddu c_3,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_3,AT
|
|
daddu c_3,t_2
|
|
- sltu AT,c_3,t_2
|
|
daddu c_1,AT
|
|
+ sltu t_2,c_3,t_2
|
|
+ daddu c_1,t_2
|
|
dmultu a_3,a_4 /* mul_add_c2(a[3],b[4],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_1,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_2,t_1
|
|
sltu AT,c_2,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_2,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_2,t_1
|
|
+ daddu c_3,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_3,AT
|
|
daddu c_3,t_2
|
|
- sltu AT,c_3,t_2
|
|
daddu c_1,AT
|
|
+ sltu t_2,c_3,t_2
|
|
+ daddu c_1,t_2
|
|
sd c_2,56(a0)
|
|
|
|
dmultu a_7,a_1 /* mul_add_c2(a[7],b[1],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_2,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_3,t_1
|
|
sltu AT,c_3,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_3,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_3,t_1
|
|
+ daddu c_1,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_2,c_1,AT
|
|
daddu c_1,t_2
|
|
- sltu AT,c_1,t_2
|
|
- daddu c_2,AT
|
|
+ sltu t_2,c_1,t_2
|
|
+ daddu c_2,t_2
|
|
dmultu a_6,a_2 /* mul_add_c2(a[6],b[2],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_2,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_3,t_1
|
|
sltu AT,c_3,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_3,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_3,t_1
|
|
+ daddu c_1,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_1,AT
|
|
daddu c_1,t_2
|
|
- sltu AT,c_1,t_2
|
|
daddu c_2,AT
|
|
+ sltu t_2,c_1,t_2
|
|
+ daddu c_2,t_2
|
|
dmultu a_5,a_3 /* mul_add_c2(a[5],b[3],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_2,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_3,t_1
|
|
sltu AT,c_3,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_3,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_3,t_1
|
|
+ daddu c_1,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_1,AT
|
|
daddu c_1,t_2
|
|
- sltu AT,c_1,t_2
|
|
daddu c_2,AT
|
|
+ sltu t_2,c_1,t_2
|
|
+ daddu c_2,t_2
|
|
dmultu a_4,a_4 /* mul_add_c(a[4],b[4],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
@@ -1897,78 +1897,78 @@ LEAF(bn_sqr_comba8)
|
|
dmultu a_2,a_7 /* mul_add_c2(a[2],b[7],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_3,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_1,t_1
|
|
sltu AT,c_1,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_1,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_1,t_1
|
|
+ daddu c_2,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_3,c_2,AT
|
|
daddu c_2,t_2
|
|
- sltu AT,c_2,t_2
|
|
- daddu c_3,AT
|
|
+ sltu t_2,c_2,t_2
|
|
+ daddu c_3,t_2
|
|
dmultu a_3,a_6 /* mul_add_c2(a[3],b[6],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_3,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_1,t_1
|
|
sltu AT,c_1,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_1,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_1,t_1
|
|
+ daddu c_2,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_2,AT
|
|
daddu c_2,t_2
|
|
- sltu AT,c_2,t_2
|
|
daddu c_3,AT
|
|
+ sltu t_2,c_2,t_2
|
|
+ daddu c_3,t_2
|
|
dmultu a_4,a_5 /* mul_add_c2(a[4],b[5],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_3,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_1,t_1
|
|
sltu AT,c_1,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_1,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_1,t_1
|
|
+ daddu c_2,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_2,AT
|
|
daddu c_2,t_2
|
|
- sltu AT,c_2,t_2
|
|
daddu c_3,AT
|
|
+ sltu t_2,c_2,t_2
|
|
+ daddu c_3,t_2
|
|
sd c_1,72(a0)
|
|
|
|
dmultu a_7,a_3 /* mul_add_c2(a[7],b[3],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_1,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_2,t_1
|
|
sltu AT,c_2,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_2,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_2,t_1
|
|
+ daddu c_3,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_1,c_3,AT
|
|
daddu c_3,t_2
|
|
- sltu AT,c_3,t_2
|
|
- daddu c_1,AT
|
|
+ sltu t_2,c_3,t_2
|
|
+ daddu c_1,t_2
|
|
dmultu a_6,a_4 /* mul_add_c2(a[6],b[4],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_1,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_2,t_1
|
|
sltu AT,c_2,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_2,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_2,t_1
|
|
+ daddu c_3,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_3,AT
|
|
daddu c_3,t_2
|
|
- sltu AT,c_3,t_2
|
|
daddu c_1,AT
|
|
+ sltu t_2,c_3,t_2
|
|
+ daddu c_1,t_2
|
|
dmultu a_5,a_5 /* mul_add_c(a[5],b[5],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
@@ -1983,48 +1983,48 @@ LEAF(bn_sqr_comba8)
|
|
dmultu a_4,a_7 /* mul_add_c2(a[4],b[7],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_2,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_3,t_1
|
|
sltu AT,c_3,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_3,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_3,t_1
|
|
+ daddu c_1,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_2,c_1,AT
|
|
daddu c_1,t_2
|
|
- sltu AT,c_1,t_2
|
|
- daddu c_2,AT
|
|
+ sltu t_2,c_1,t_2
|
|
+ daddu c_2,t_2
|
|
dmultu a_5,a_6 /* mul_add_c2(a[5],b[6],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_2,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_3,t_1
|
|
sltu AT,c_3,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_3,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_3,t_1
|
|
+ daddu c_1,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_1,AT
|
|
daddu c_1,t_2
|
|
- sltu AT,c_1,t_2
|
|
daddu c_2,AT
|
|
+ sltu t_2,c_1,t_2
|
|
+ daddu c_2,t_2
|
|
sd c_3,88(a0)
|
|
|
|
dmultu a_7,a_5 /* mul_add_c2(a[7],b[5],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_3,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_1,t_1
|
|
sltu AT,c_1,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_1,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_1,t_1
|
|
+ daddu c_2,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_3,c_2,AT
|
|
daddu c_2,t_2
|
|
- sltu AT,c_2,t_2
|
|
- daddu c_3,AT
|
|
+ sltu t_2,c_2,t_2
|
|
+ daddu c_3,t_2
|
|
dmultu a_6,a_6 /* mul_add_c(a[6],b[6],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
@@ -2039,17 +2039,17 @@ LEAF(bn_sqr_comba8)
|
|
dmultu a_6,a_7 /* mul_add_c2(a[6],b[7],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_1,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_2,t_1
|
|
sltu AT,c_2,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_2,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_2,t_1
|
|
+ daddu c_3,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_1,c_3,AT
|
|
daddu c_3,t_2
|
|
- sltu AT,c_3,t_2
|
|
- daddu c_1,AT
|
|
+ sltu t_2,c_3,t_2
|
|
+ daddu c_1,t_2
|
|
sd c_2,104(a0)
|
|
|
|
dmultu a_7,a_7 /* mul_add_c(a[7],b[7],c3,c1,c2); */
|
|
@@ -2070,9 +2070,9 @@ LEAF(bn_sqr_comba4)
|
|
.set reorder
|
|
ld a_0,0(a1)
|
|
ld a_1,8(a1)
|
|
+ dmultu a_0,a_0 /* mul_add_c(a[0],b[0],c1,c2,c3); */
|
|
ld a_2,16(a1)
|
|
ld a_3,24(a1)
|
|
- dmultu a_0,a_0 /* mul_add_c(a[0],b[0],c1,c2,c3); */
|
|
mflo c_1
|
|
mfhi c_2
|
|
sd c_1,0(a0)
|
|
@@ -2093,17 +2093,17 @@ LEAF(bn_sqr_comba4)
|
|
dmultu a_2,a_0 /* mul_add_c2(a[2],b[0],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_2,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_3,t_1
|
|
sltu AT,c_3,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_3,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_3,t_1
|
|
+ daddu c_1,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_2,c_1,AT
|
|
daddu c_1,t_2
|
|
- sltu AT,c_1,t_2
|
|
- daddu c_2,AT
|
|
+ sltu t_2,c_1,t_2
|
|
+ daddu c_2,t_2
|
|
dmultu a_1,a_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
@@ -2118,48 +2118,48 @@ LEAF(bn_sqr_comba4)
|
|
dmultu a_0,a_3 /* mul_add_c2(a[0],b[3],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_3,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_1,t_1
|
|
sltu AT,c_1,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_1,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_1,t_1
|
|
+ daddu c_2,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_3,c_2,AT
|
|
daddu c_2,t_2
|
|
- sltu AT,c_2,t_2
|
|
- daddu c_3,AT
|
|
+ sltu t_2,c_2,t_2
|
|
+ daddu c_3,t_2
|
|
dmultu a_1,a_2 /* mul_add_c(a2[1],b[2],c1,c2,c3); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt AT,t_2,zero
|
|
- daddu c_3,AT
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_1,t_1
|
|
sltu AT,c_1,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_1,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_1,t_1
|
|
+ daddu c_2,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu AT,c_2,AT
|
|
daddu c_2,t_2
|
|
- sltu AT,c_2,t_2
|
|
daddu c_3,AT
|
|
+ sltu t_2,c_2,t_2
|
|
+ daddu c_3,t_2
|
|
sd c_1,24(a0)
|
|
|
|
dmultu a_3,a_1 /* mul_add_c2(a[3],b[1],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_1,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_2,t_1
|
|
sltu AT,c_2,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_2,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_2,t_1
|
|
+ daddu c_3,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_1,c_3,AT
|
|
daddu c_3,t_2
|
|
- sltu AT,c_3,t_2
|
|
- daddu c_1,AT
|
|
+ sltu t_2,c_3,t_2
|
|
+ daddu c_1,t_2
|
|
dmultu a_2,a_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
@@ -2174,17 +2174,17 @@ LEAF(bn_sqr_comba4)
|
|
dmultu a_2,a_3 /* mul_add_c2(a[2],b[3],c3,c1,c2); */
|
|
mflo t_1
|
|
mfhi t_2
|
|
- slt c_2,t_2,zero
|
|
- dsll t_2,1
|
|
- slt a2,t_1,zero
|
|
- daddu t_2,a2
|
|
- dsll t_1,1
|
|
daddu c_3,t_1
|
|
sltu AT,c_3,t_1
|
|
- daddu t_2,AT
|
|
+ daddu c_3,t_1
|
|
+ daddu AT,t_2
|
|
+ sltu t_1,c_3,t_1
|
|
+ daddu c_1,AT
|
|
+ daddu t_2,t_1
|
|
+ sltu c_2,c_1,AT
|
|
daddu c_1,t_2
|
|
- sltu AT,c_1,t_2
|
|
- daddu c_2,AT
|
|
+ sltu t_2,c_1,t_2
|
|
+ daddu c_2,t_2
|
|
sd c_3,40(a0)
|
|
|
|
dmultu a_3,a_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */
|
|
Index: crypto/openssl/crypto/bn/asm/x86_64-gcc.c
|
|
===================================================================
|
|
--- crypto/openssl/crypto/bn/asm/x86_64-gcc.c (revision 276867)
|
|
+++ crypto/openssl/crypto/bn/asm/x86_64-gcc.c (working copy)
|
|
@@ -269,6 +269,10 @@ BN_ULONG bn_sub_words(BN_ULONG *r, BN_ULONG *a, BN
|
|
/* sqr_add_c(a,i,c0,c1,c2) -- c+=a[i]^2 for three word number c=(c2,c1,c0) */
|
|
/* sqr_add_c2(a,i,c0,c1,c2) -- c+=2*a[i]*a[j] for three word number c=(c2,c1,c0) */
|
|
|
|
+/*
|
|
+ * Keep in mind that carrying into high part of multiplication result
|
|
+ * can not overflow, because it cannot be all-ones.
|
|
+ */
|
|
#if 0
|
|
/* original macros are kept for reference purposes */
|
|
#define mul_add_c(a,b,c0,c1,c2) { \
|
|
@@ -283,10 +287,10 @@ BN_ULONG bn_sub_words(BN_ULONG *r, BN_ULONG *a, BN
|
|
BN_ULONG ta=(a),tb=(b),t0; \
|
|
t1 = BN_UMULT_HIGH(ta,tb); \
|
|
t0 = ta * tb; \
|
|
- t2 = t1+t1; c2 += (t2<t1)?1:0; \
|
|
- t1 = t0+t0; t2 += (t1<t0)?1:0; \
|
|
- c0 += t1; t2 += (c0<t1)?1:0; \
|
|
+ c0 += t0; t2 = t1+((c0<t0)?1:0);\
|
|
c1 += t2; c2 += (c1<t2)?1:0; \
|
|
+ c0 += t0; t1 += (c0<t0)?1:0; \
|
|
+ c1 += t1; c2 += (c1<t1)?1:0; \
|
|
}
|
|
#else
|
|
#define mul_add_c(a,b,c0,c1,c2) do { \
|
|
@@ -324,22 +328,14 @@ BN_ULONG bn_sub_words(BN_ULONG *r, BN_ULONG *a, BN
|
|
: "=a"(t1),"=d"(t2) \
|
|
: "a"(a),"m"(b) \
|
|
: "cc"); \
|
|
- asm ("addq %0,%0; adcq %2,%1" \
|
|
- : "+d"(t2),"+r"(c2) \
|
|
- : "g"(0) \
|
|
- : "cc"); \
|
|
- asm ("addq %0,%0; adcq %2,%1" \
|
|
- : "+a"(t1),"+d"(t2) \
|
|
- : "g"(0) \
|
|
- : "cc"); \
|
|
- asm ("addq %2,%0; adcq %3,%1" \
|
|
- : "+r"(c0),"+d"(t2) \
|
|
- : "a"(t1),"g"(0) \
|
|
- : "cc"); \
|
|
- asm ("addq %2,%0; adcq %3,%1" \
|
|
- : "+r"(c1),"+r"(c2) \
|
|
- : "d"(t2),"g"(0) \
|
|
- : "cc"); \
|
|
+ asm ("addq %3,%0; adcq %4,%1; adcq %5,%2" \
|
|
+ : "+r"(c0),"+r"(c1),"+r"(c2) \
|
|
+ : "r"(t1),"r"(t2),"g"(0) \
|
|
+ : "cc"); \
|
|
+ asm ("addq %3,%0; adcq %4,%1; adcq %5,%2" \
|
|
+ : "+r"(c0),"+r"(c1),"+r"(c2) \
|
|
+ : "r"(t1),"r"(t2),"g"(0) \
|
|
+ : "cc"); \
|
|
} while (0)
|
|
#endif
|
|
|
|
Index: crypto/openssl/crypto/bn/bn_asm.c
|
|
===================================================================
|
|
--- crypto/openssl/crypto/bn/bn_asm.c (revision 276867)
|
|
+++ crypto/openssl/crypto/bn/bn_asm.c (working copy)
|
|
@@ -431,6 +431,10 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG
|
|
/* sqr_add_c(a,i,c0,c1,c2) -- c+=a[i]^2 for three word number c=(c2,c1,c0) */
|
|
/* sqr_add_c2(a,i,c0,c1,c2) -- c+=2*a[i]*a[j] for three word number c=(c2,c1,c0) */
|
|
|
|
+/*
|
|
+ * Keep in mind that carrying into high part of multiplication result
|
|
+ * can not overflow, because it cannot be all-ones.
|
|
+ */
|
|
#ifdef BN_LLONG
|
|
#define mul_add_c(a,b,c0,c1,c2) \
|
|
t=(BN_ULLONG)a*b; \
|
|
@@ -471,10 +475,10 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG
|
|
#define mul_add_c2(a,b,c0,c1,c2) { \
|
|
BN_ULONG ta=(a),tb=(b),t0; \
|
|
BN_UMULT_LOHI(t0,t1,ta,tb); \
|
|
- t2 = t1+t1; c2 += (t2<t1)?1:0; \
|
|
- t1 = t0+t0; t2 += (t1<t0)?1:0; \
|
|
- c0 += t1; t2 += (c0<t1)?1:0; \
|
|
+ c0 += t0; t2 = t1+((c0<t0)?1:0);\
|
|
c1 += t2; c2 += (c1<t2)?1:0; \
|
|
+ c0 += t0; t1 += (c0<t0)?1:0; \
|
|
+ c1 += t1; c2 += (c1<t1)?1:0; \
|
|
}
|
|
|
|
#define sqr_add_c(a,i,c0,c1,c2) { \
|
|
@@ -501,10 +505,10 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG
|
|
BN_ULONG ta=(a),tb=(b),t0; \
|
|
t1 = BN_UMULT_HIGH(ta,tb); \
|
|
t0 = ta * tb; \
|
|
- t2 = t1+t1; c2 += (t2<t1)?1:0; \
|
|
- t1 = t0+t0; t2 += (t1<t0)?1:0; \
|
|
- c0 += t1; t2 += (c0<t1)?1:0; \
|
|
+ c0 += t0; t2 = t1+((c0<t0)?1:0);\
|
|
c1 += t2; c2 += (c1<t2)?1:0; \
|
|
+ c0 += t0; t1 += (c0<t0)?1:0; \
|
|
+ c1 += t1; c2 += (c1<t1)?1:0; \
|
|
}
|
|
|
|
#define sqr_add_c(a,i,c0,c1,c2) { \
|
|
Index: crypto/openssl/crypto/bn/bntest.c
|
|
===================================================================
|
|
--- crypto/openssl/crypto/bn/bntest.c (revision 276867)
|
|
+++ crypto/openssl/crypto/bn/bntest.c (working copy)
|
|
@@ -676,44 +676,98 @@ int test_mul(BIO *bp)
|
|
|
|
int test_sqr(BIO *bp, BN_CTX *ctx)
|
|
{
|
|
- BIGNUM a,c,d,e;
|
|
- int i;
|
|
+ BIGNUM *a,*c,*d,*e;
|
|
+ int i, ret = 0;
|
|
|
|
- BN_init(&a);
|
|
- BN_init(&c);
|
|
- BN_init(&d);
|
|
- BN_init(&e);
|
|
+ a = BN_new();
|
|
+ c = BN_new();
|
|
+ d = BN_new();
|
|
+ e = BN_new();
|
|
+ if (a == NULL || c == NULL || d == NULL || e == NULL)
|
|
+ {
|
|
+ goto err;
|
|
+ }
|
|
|
|
for (i=0; i<num0; i++)
|
|
{
|
|
- BN_bntest_rand(&a,40+i*10,0,0);
|
|
- a.neg=rand_neg();
|
|
- BN_sqr(&c,&a,ctx);
|
|
+ BN_bntest_rand(a,40+i*10,0,0);
|
|
+ a->neg=rand_neg();
|
|
+ BN_sqr(c,a,ctx);
|
|
if (bp != NULL)
|
|
{
|
|
if (!results)
|
|
{
|
|
- BN_print(bp,&a);
|
|
+ BN_print(bp,a);
|
|
BIO_puts(bp," * ");
|
|
- BN_print(bp,&a);
|
|
+ BN_print(bp,a);
|
|
BIO_puts(bp," - ");
|
|
}
|
|
- BN_print(bp,&c);
|
|
+ BN_print(bp,c);
|
|
BIO_puts(bp,"\n");
|
|
}
|
|
- BN_div(&d,&e,&c,&a,ctx);
|
|
- BN_sub(&d,&d,&a);
|
|
- if(!BN_is_zero(&d) || !BN_is_zero(&e))
|
|
- {
|
|
- fprintf(stderr,"Square test failed!\n");
|
|
- return 0;
|
|
- }
|
|
+ BN_div(d,e,c,a,ctx);
|
|
+ BN_sub(d,d,a);
|
|
+ if(!BN_is_zero(d) || !BN_is_zero(e))
|
|
+ {
|
|
+ fprintf(stderr,"Square test failed!\n");
|
|
+ goto err;
|
|
+ }
|
|
}
|
|
- BN_free(&a);
|
|
- BN_free(&c);
|
|
- BN_free(&d);
|
|
- BN_free(&e);
|
|
- return(1);
|
|
+
|
|
+ /* Regression test for a BN_sqr overflow bug. */
|
|
+ BN_hex2bn(&a,
|
|
+ "80000000000000008000000000000001FFFFFFFFFFFFFFFE0000000000000000");
|
|
+ BN_sqr(c, a, ctx);
|
|
+ if (bp != NULL)
|
|
+ {
|
|
+ if (!results)
|
|
+ {
|
|
+ BN_print(bp,a);
|
|
+ BIO_puts(bp," * ");
|
|
+ BN_print(bp,a);
|
|
+ BIO_puts(bp," - ");
|
|
+ }
|
|
+ BN_print(bp,c);
|
|
+ BIO_puts(bp,"\n");
|
|
+ }
|
|
+ BN_mul(d, a, a, ctx);
|
|
+ if (BN_cmp(c, d))
|
|
+ {
|
|
+ fprintf(stderr, "Square test failed: BN_sqr and BN_mul produce "
|
|
+ "different results!\n");
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
+ /* Regression test for a BN_sqr overflow bug. */
|
|
+ BN_hex2bn(&a,
|
|
+ "80000000000000000000000080000001FFFFFFFE000000000000000000000000");
|
|
+ BN_sqr(c, a, ctx);
|
|
+ if (bp != NULL)
|
|
+ {
|
|
+ if (!results)
|
|
+ {
|
|
+ BN_print(bp,a);
|
|
+ BIO_puts(bp," * ");
|
|
+ BN_print(bp,a);
|
|
+ BIO_puts(bp," - ");
|
|
+ }
|
|
+ BN_print(bp,c);
|
|
+ BIO_puts(bp,"\n");
|
|
+ }
|
|
+ BN_mul(d, a, a, ctx);
|
|
+ if (BN_cmp(c, d))
|
|
+ {
|
|
+ fprintf(stderr, "Square test failed: BN_sqr and BN_mul produce "
|
|
+ "different results!\n");
|
|
+ goto err;
|
|
+ }
|
|
+ ret = 1;
|
|
+err:
|
|
+ if (a != NULL) BN_free(a);
|
|
+ if (c != NULL) BN_free(c);
|
|
+ if (d != NULL) BN_free(d);
|
|
+ if (e != NULL) BN_free(e);
|
|
+ return ret;
|
|
}
|
|
|
|
int test_mont(BIO *bp, BN_CTX *ctx)
|
|
Index: crypto/openssl/crypto/dsa/dsa_asn1.c
|
|
===================================================================
|
|
--- crypto/openssl/crypto/dsa/dsa_asn1.c (revision 276867)
|
|
+++ crypto/openssl/crypto/dsa/dsa_asn1.c (working copy)
|
|
@@ -200,7 +200,11 @@ int DSA_verify(int type, const unsigned char *dgst
|
|
const unsigned char *sigbuf, int siglen, DSA *dsa)
|
|
{
|
|
DSA_SIG *s;
|
|
+ const unsigned char *p = sigbuf;
|
|
+ unsigned char *der = NULL;
|
|
+ int derlen = -1;
|
|
int ret=-1;
|
|
+
|
|
#ifdef OPENSSL_FIPS
|
|
if(FIPS_mode() && !(dsa->flags & DSA_FLAG_NON_FIPS_ALLOW))
|
|
{
|
|
@@ -211,10 +215,18 @@ int DSA_verify(int type, const unsigned char *dgst
|
|
|
|
s = DSA_SIG_new();
|
|
if (s == NULL) return(ret);
|
|
- if (d2i_DSA_SIG(&s,&sigbuf,siglen) == NULL) goto err;
|
|
+ if (d2i_DSA_SIG(&s,&p,siglen) == NULL) goto err;
|
|
+ /* Ensure signature uses DER and doesn't have trailing garbage */
|
|
+ derlen = i2d_DSA_SIG(s, &der);
|
|
+ if (derlen != siglen || memcmp(sigbuf, der, derlen))
|
|
+ goto err;
|
|
ret=DSA_do_verify(dgst,dgst_len,s,dsa);
|
|
err:
|
|
+ if (derlen > 0)
|
|
+ {
|
|
+ OPENSSL_cleanse(der, derlen);
|
|
+ OPENSSL_free(der);
|
|
+ }
|
|
DSA_SIG_free(s);
|
|
return(ret);
|
|
}
|
|
-
|
|
Index: crypto/openssl/crypto/ecdsa/ecs_vrf.c
|
|
===================================================================
|
|
--- crypto/openssl/crypto/ecdsa/ecs_vrf.c (revision 276867)
|
|
+++ crypto/openssl/crypto/ecdsa/ecs_vrf.c (working copy)
|
|
@@ -57,6 +57,7 @@
|
|
*/
|
|
|
|
#include "ecs_locl.h"
|
|
+#include "cryptlib.h"
|
|
#ifndef OPENSSL_NO_ENGINE
|
|
#include <openssl/engine.h>
|
|
#endif
|
|
@@ -84,13 +85,25 @@ int ECDSA_verify(int type, const unsigned char *dg
|
|
const unsigned char *sigbuf, int sig_len, EC_KEY *eckey)
|
|
{
|
|
ECDSA_SIG *s;
|
|
+ const unsigned char *p = sigbuf;
|
|
+ unsigned char *der = NULL;
|
|
+ int derlen = -1;
|
|
int ret=-1;
|
|
|
|
s = ECDSA_SIG_new();
|
|
if (s == NULL) return(ret);
|
|
- if (d2i_ECDSA_SIG(&s, &sigbuf, sig_len) == NULL) goto err;
|
|
+ if (d2i_ECDSA_SIG(&s, &p, sig_len) == NULL) goto err;
|
|
+ /* Ensure signature uses DER and doesn't have trailing garbage */
|
|
+ derlen = i2d_ECDSA_SIG(s, &der);
|
|
+ if (derlen != sig_len || memcmp(sigbuf, der, derlen))
|
|
+ goto err;
|
|
ret=ECDSA_do_verify(dgst, dgst_len, s, eckey);
|
|
err:
|
|
+ if (derlen > 0)
|
|
+ {
|
|
+ OPENSSL_cleanse(der, derlen);
|
|
+ OPENSSL_free(der);
|
|
+ }
|
|
ECDSA_SIG_free(s);
|
|
return(ret);
|
|
}
|
|
Index: crypto/openssl/crypto/x509/x509.h
|
|
===================================================================
|
|
--- crypto/openssl/crypto/x509/x509.h (revision 276867)
|
|
+++ crypto/openssl/crypto/x509/x509.h (working copy)
|
|
@@ -870,6 +870,7 @@ X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn);
|
|
int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval);
|
|
void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval,
|
|
X509_ALGOR *algor);
|
|
+int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b);
|
|
|
|
X509_NAME *X509_NAME_dup(X509_NAME *xn);
|
|
X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne);
|
|
Index: crypto/openssl/crypto/x509/x_all.c
|
|
===================================================================
|
|
--- crypto/openssl/crypto/x509/x_all.c (revision 276867)
|
|
+++ crypto/openssl/crypto/x509/x_all.c (working copy)
|
|
@@ -73,6 +73,8 @@
|
|
|
|
int X509_verify(X509 *a, EVP_PKEY *r)
|
|
{
|
|
+ if (X509_ALGOR_cmp(a->sig_alg, a->cert_info->signature))
|
|
+ return 0;
|
|
return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF),a->sig_alg,
|
|
a->signature,a->cert_info,r));
|
|
}
|
|
Index: crypto/openssl/doc/ssl/SSL_CTX_set_options.pod
|
|
===================================================================
|
|
--- crypto/openssl/doc/ssl/SSL_CTX_set_options.pod (revision 276867)
|
|
+++ crypto/openssl/doc/ssl/SSL_CTX_set_options.pod (working copy)
|
|
@@ -152,15 +152,7 @@ temporary/ephemeral DH parameters are used.
|
|
|
|
=item SSL_OP_EPHEMERAL_RSA
|
|
|
|
-Always use ephemeral (temporary) RSA key when doing RSA operations
|
|
-(see L<SSL_CTX_set_tmp_rsa_callback(3)|SSL_CTX_set_tmp_rsa_callback(3)>).
|
|
-According to the specifications this is only done, when a RSA key
|
|
-can only be used for signature operations (namely under export ciphers
|
|
-with restricted RSA keylength). By setting this option, ephemeral
|
|
-RSA keys are always used. This option breaks compatibility with the
|
|
-SSL/TLS specifications and may lead to interoperability problems with
|
|
-clients and should therefore never be used. Ciphers with EDH (ephemeral
|
|
-Diffie-Hellman) key exchange should be used instead.
|
|
+This option is no longer implemented and is treated as no op.
|
|
|
|
=item SSL_OP_CIPHER_SERVER_PREFERENCE
|
|
|
|
Index: crypto/openssl/doc/ssl/SSL_CTX_set_tmp_rsa_callback.pod
|
|
===================================================================
|
|
--- crypto/openssl/doc/ssl/SSL_CTX_set_tmp_rsa_callback.pod (revision 276867)
|
|
+++ crypto/openssl/doc/ssl/SSL_CTX_set_tmp_rsa_callback.pod (working copy)
|
|
@@ -74,22 +74,15 @@ exchange and use EDH (Ephemeral Diffie-Hellman) ke
|
|
in order to achieve forward secrecy (see
|
|
L<SSL_CTX_set_tmp_dh_callback(3)|SSL_CTX_set_tmp_dh_callback(3)>).
|
|
|
|
-On OpenSSL servers ephemeral RSA key exchange is therefore disabled by default
|
|
-and must be explicitly enabled using the SSL_OP_EPHEMERAL_RSA option of
|
|
-L<SSL_CTX_set_options(3)|SSL_CTX_set_options(3)>, violating the TLS/SSL
|
|
-standard. When ephemeral RSA key exchange is required for export ciphers,
|
|
-it will automatically be used without this option!
|
|
+An application may either directly specify the key or can supply the key via a
|
|
+callback function. The callback approach has the advantage, that the callback
|
|
+may generate the key only in case it is actually needed. As the generation of a
|
|
+RSA key is however costly, it will lead to a significant delay in the handshake
|
|
+procedure. Another advantage of the callback function is that it can supply
|
|
+keys of different size while the explicit setting of the key is only useful for
|
|
+key size of 512 bits to satisfy the export restricted ciphers and does give
|
|
+away key length if a longer key would be allowed.
|
|
|
|
-An application may either directly specify the key or can supply the key via
|
|
-a callback function. The callback approach has the advantage, that the
|
|
-callback may generate the key only in case it is actually needed. As the
|
|
-generation of a RSA key is however costly, it will lead to a significant
|
|
-delay in the handshake procedure. Another advantage of the callback function
|
|
-is that it can supply keys of different size (e.g. for SSL_OP_EPHEMERAL_RSA
|
|
-usage) while the explicit setting of the key is only useful for key size of
|
|
-512 bits to satisfy the export restricted ciphers and does give away key length
|
|
-if a longer key would be allowed.
|
|
-
|
|
The B<tmp_rsa_callback> is called with the B<keylength> needed and
|
|
the B<is_export> information. The B<is_export> flag is set, when the
|
|
ephemeral RSA key exchange is performed with an export cipher.
|
|
Index: crypto/openssl/ssl/d1_pkt.c
|
|
===================================================================
|
|
--- crypto/openssl/ssl/d1_pkt.c (revision 276867)
|
|
+++ crypto/openssl/ssl/d1_pkt.c (working copy)
|
|
@@ -595,8 +595,6 @@ again:
|
|
/* now s->packet_length == DTLS1_RT_HEADER_LENGTH */
|
|
i=rr->length;
|
|
n=ssl3_read_n(s,i,i,1);
|
|
- if (n <= 0) return(n); /* error or non-blocking io */
|
|
-
|
|
/* this packet contained a partial record, dump it */
|
|
if ( n != i)
|
|
{
|
|
@@ -626,7 +624,8 @@ again:
|
|
* would be dropped unnecessarily.
|
|
*/
|
|
if (!(s->d1->listen && rr->type == SSL3_RT_HANDSHAKE &&
|
|
- *p == SSL3_MT_CLIENT_HELLO) &&
|
|
+ s->packet_length > DTLS1_RT_HEADER_LENGTH &&
|
|
+ s->packet[DTLS1_RT_HEADER_LENGTH] == SSL3_MT_CLIENT_HELLO) &&
|
|
! dtls1_record_replay_check(s, bitmap, &(rr->seq_num)))
|
|
{
|
|
rr->length = 0;
|
|
Index: crypto/openssl/ssl/d1_srvr.c
|
|
===================================================================
|
|
--- crypto/openssl/ssl/d1_srvr.c (revision 276867)
|
|
+++ crypto/openssl/ssl/d1_srvr.c (working copy)
|
|
@@ -371,23 +371,11 @@ int dtls1_accept(SSL *s)
|
|
|
|
/* clear this, it may get reset by
|
|
* send_server_key_exchange */
|
|
- if ((s->options & SSL_OP_EPHEMERAL_RSA)
|
|
-#ifndef OPENSSL_NO_KRB5
|
|
- && !(l & SSL_KRB5)
|
|
-#endif /* OPENSSL_NO_KRB5 */
|
|
- )
|
|
- /* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key
|
|
- * even when forbidden by protocol specs
|
|
- * (handshake may fail as clients are not required to
|
|
- * be able to handle this) */
|
|
- s->s3->tmp.use_rsa_tmp=1;
|
|
- else
|
|
- s->s3->tmp.use_rsa_tmp=0;
|
|
+ s->s3->tmp.use_rsa_tmp=0;
|
|
|
|
/* only send if a DH key exchange, fortezza or
|
|
* RSA but we have a sign only certificate */
|
|
- if (s->s3->tmp.use_rsa_tmp
|
|
- || (l & (SSL_DH|SSL_kFZA))
|
|
+ if ((l & (SSL_DH|SSL_kFZA))
|
|
|| ((l & SSL_kRSA)
|
|
&& (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
|
|
|| (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)
|
|
Index: crypto/openssl/ssl/s23_srvr.c
|
|
===================================================================
|
|
--- crypto/openssl/ssl/s23_srvr.c (revision 276867)
|
|
+++ crypto/openssl/ssl/s23_srvr.c (working copy)
|
|
@@ -559,12 +559,14 @@ int ssl23_get_client_hello(SSL *s)
|
|
if ((type == 2) || (type == 3))
|
|
{
|
|
/* we have SSLv3/TLSv1 (type 2: SSL2 style, type 3: SSL3/TLS style) */
|
|
- s->method = ssl23_get_server_method(s->version);
|
|
- if (s->method == NULL)
|
|
+ SSL_METHOD *new_method;
|
|
+ new_method = ssl23_get_server_method(s->version);
|
|
+ if (new_method == NULL)
|
|
{
|
|
SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
|
|
goto err;
|
|
}
|
|
+ s->method = new_method;
|
|
|
|
if (!ssl_init_wbio_buffer(s,1)) goto err;
|
|
|
|
Index: crypto/openssl/ssl/s3_clnt.c
|
|
===================================================================
|
|
--- crypto/openssl/ssl/s3_clnt.c (revision 276867)
|
|
+++ crypto/openssl/ssl/s3_clnt.c (working copy)
|
|
@@ -1122,8 +1122,21 @@ int ssl3_get_key_exchange(SSL *s)
|
|
|
|
if (!ok) return((int)n);
|
|
|
|
+ alg=s->s3->tmp.new_cipher->algorithms;
|
|
+ EVP_MD_CTX_init(&md_ctx);
|
|
+
|
|
if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE)
|
|
{
|
|
+ /*
|
|
+ * Can't skip server key exchange if this is an ephemeral
|
|
+ * ciphersuite.
|
|
+ */
|
|
+ if (alg & (SSL_kEDH|SSL_kECDHE))
|
|
+ {
|
|
+ SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_UNEXPECTED_MESSAGE);
|
|
+ al = SSL_AD_UNEXPECTED_MESSAGE;
|
|
+ goto f_err;
|
|
+ }
|
|
s->s3->tmp.reuse_message=1;
|
|
return(1);
|
|
}
|
|
@@ -1160,12 +1173,17 @@ int ssl3_get_key_exchange(SSL *s)
|
|
}
|
|
|
|
param_len=0;
|
|
- alg=s->s3->tmp.new_cipher->algorithms;
|
|
- EVP_MD_CTX_init(&md_ctx);
|
|
|
|
#ifndef OPENSSL_NO_RSA
|
|
if (alg & SSL_kRSA)
|
|
{
|
|
+ /* Temporary RSA keys only allowed in export ciphersuites */
|
|
+ if (!SSL_C_IS_EXPORT(s->s3->tmp.new_cipher))
|
|
+ {
|
|
+ al=SSL_AD_UNEXPECTED_MESSAGE;
|
|
+ SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE);
|
|
+ goto f_err;
|
|
+ }
|
|
if ((rsa=RSA_new()) == NULL)
|
|
{
|
|
SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
|
|
Index: crypto/openssl/ssl/s3_pkt.c
|
|
===================================================================
|
|
--- crypto/openssl/ssl/s3_pkt.c (revision 276867)
|
|
+++ crypto/openssl/ssl/s3_pkt.c (working copy)
|
|
@@ -146,6 +146,8 @@ int ssl3_read_n(SSL *s, int n, int max, int extend
|
|
* at once (as long as it fits into the buffer). */
|
|
if (SSL_version(s) == DTLS1_VERSION)
|
|
{
|
|
+ if (s->s3->rbuf.left == 0 && extend)
|
|
+ return 0;
|
|
if ( s->s3->rbuf.left > 0 && n > s->s3->rbuf.left)
|
|
n = s->s3->rbuf.left;
|
|
}
|
|
Index: crypto/openssl/ssl/s3_srvr.c
|
|
===================================================================
|
|
--- crypto/openssl/ssl/s3_srvr.c (revision 276867)
|
|
+++ crypto/openssl/ssl/s3_srvr.c (working copy)
|
|
@@ -354,18 +354,7 @@ int ssl3_accept(SSL *s)
|
|
|
|
/* clear this, it may get reset by
|
|
* send_server_key_exchange */
|
|
- if ((s->options & SSL_OP_EPHEMERAL_RSA)
|
|
-#ifndef OPENSSL_NO_KRB5
|
|
- && !(l & SSL_KRB5)
|
|
-#endif /* OPENSSL_NO_KRB5 */
|
|
- )
|
|
- /* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key
|
|
- * even when forbidden by protocol specs
|
|
- * (handshake may fail as clients are not required to
|
|
- * be able to handle this) */
|
|
- s->s3->tmp.use_rsa_tmp=1;
|
|
- else
|
|
- s->s3->tmp.use_rsa_tmp=0;
|
|
+ s->s3->tmp.use_rsa_tmp=0;
|
|
|
|
|
|
/* only send if a DH key exchange, fortezza or
|
|
@@ -377,8 +366,7 @@ int ssl3_accept(SSL *s)
|
|
* server certificate contains the server's
|
|
* public key for key exchange.
|
|
*/
|
|
- if (s->s3->tmp.use_rsa_tmp
|
|
- || (l & SSL_kECDHE)
|
|
+ if ((l & SSL_kECDHE)
|
|
|| (l & (SSL_DH|SSL_kFZA))
|
|
|| ((l & SSL_kRSA)
|
|
&& (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
|
|
@@ -2400,7 +2388,7 @@ int ssl3_get_cert_verify(SSL *s)
|
|
if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_VERIFY)
|
|
{
|
|
s->s3->tmp.reuse_message=1;
|
|
- if ((peer != NULL) && (type | EVP_PKT_SIGN))
|
|
+ if (peer != NULL)
|
|
{
|
|
al=SSL_AD_UNEXPECTED_MESSAGE;
|
|
SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_MISSING_VERIFY_MESSAGE);
|
|
Index: crypto/openssl/ssl/ssl.h
|
|
===================================================================
|
|
--- crypto/openssl/ssl/ssl.h (revision 276867)
|
|
+++ crypto/openssl/ssl/ssl.h (working copy)
|
|
@@ -526,9 +526,8 @@ typedef struct ssl_session_st
|
|
#define SSL_OP_SINGLE_ECDH_USE 0x00080000L
|
|
/* If set, always create a new key when using tmp_dh parameters */
|
|
#define SSL_OP_SINGLE_DH_USE 0x00100000L
|
|
-/* Set to always use the tmp_rsa key when doing RSA operations,
|
|
- * even when this violates protocol specs */
|
|
-#define SSL_OP_EPHEMERAL_RSA 0x00200000L
|
|
+/* Does nothing: retained for compatibiity */
|
|
+#define SSL_OP_EPHEMERAL_RSA 0x0
|
|
/* Set on servers to choose the cipher according to the server's
|
|
* preferences */
|
|
#define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000L
|
|
Index: crypto/openssl/util/libeay.num
|
|
===================================================================
|
|
--- crypto/openssl/util/libeay.num (revision 276867)
|
|
+++ crypto/openssl/util/libeay.num (working copy)
|
|
@@ -1807,6 +1807,7 @@ ASN1_UTCTIME_get 2350 NOEXI
|
|
X509_REQ_digest 2362 EXIST::FUNCTION:EVP
|
|
X509_CRL_digest 2391 EXIST::FUNCTION:EVP
|
|
d2i_ASN1_SET_OF_PKCS7 2397 NOEXIST::FUNCTION:
|
|
+X509_ALGOR_cmp 2398 EXIST::FUNCTION:
|
|
EVP_CIPHER_CTX_set_key_length 2399 EXIST::FUNCTION:
|
|
EVP_CIPHER_CTX_ctrl 2400 EXIST::FUNCTION:
|
|
BN_mod_exp_mont_word 2401 EXIST::FUNCTION:
|
|
@@ -3730,3 +3731,4 @@ JPAKE_STEP2_init 4113 EXIST
|
|
pqueue_size 4114 EXIST::FUNCTION:
|
|
OPENSSL_uni2asc 4115 EXIST:NETWARE:FUNCTION:
|
|
OPENSSL_asc2uni 4116 EXIST:NETWARE:FUNCTION:
|
|
+ASN1_TYPE_cmp 4428 EXIST::FUNCTION:
|