The high bits of the type get used for the V_ASN1_NEG bit, so when used with ASN1_ANY/ASN1_TYPE, universal tags become ambiguous. This allows one to create a negative zero, which should be impossible. Impose an upper bound on universal tags accepted by crypto/asn1 and add a test. BUG=590615 (Cherry-picked from fb2c6f8c8565e1e2d85c24408050c96521acbcdc.) Change-Id: Ia988acf73fd11807869510a2b3825637a8d98853 Reviewed-on: https://boringssl-review.googlesource.com/7298 Reviewed-by: Adam Langley <agl@google.com>2623
parent
65be20fe2f
commit
907ae62b9d
6 changed files with 73 additions and 0 deletions
@ -0,0 +1,51 @@ |
||||
/* Copyright (c) 2016, Google Inc.
|
||||
* |
||||
* Permission to use, copy, modify, and/or distribute this software for any |
||||
* purpose with or without fee is hereby granted, provided that the above |
||||
* copyright notice and this permission notice appear in all copies. |
||||
* |
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
||||
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |
||||
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ |
||||
|
||||
#include <stdio.h> |
||||
|
||||
#include <openssl/asn1.h> |
||||
#include <openssl/crypto.h> |
||||
#include <openssl/err.h> |
||||
|
||||
#include "../test/scoped_types.h" |
||||
|
||||
|
||||
// kTag258 is an ASN.1 structure with a universal tag with number 258.
|
||||
static const uint8_t kTag258[] = { |
||||
0x1f, 0x82, 0x02, 0x01, 0x00, |
||||
}; |
||||
|
||||
static_assert(V_ASN1_NEG_INTEGER == 258, |
||||
"V_ASN1_NEG_INTEGER changed. Update kTag258 to collide with it."); |
||||
|
||||
bool TestLargeTags() { |
||||
const uint8_t *p = kTag258; |
||||
ScopedASN1_TYPE obj(d2i_ASN1_TYPE(NULL, &p, sizeof(kTag258))); |
||||
if (obj) { |
||||
fprintf(stderr, "Parsed value with illegal tag (type = %d).\n", obj->type); |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
int main() { |
||||
CRYPTO_library_init(); |
||||
|
||||
if (!TestLargeTags()) { |
||||
return 1; |
||||
} |
||||
|
||||
printf("PASS\n"); |
||||
return 0; |
||||
} |
Loading…
Reference in new issue