1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include <stdio.h> 11e1051a39Sopenharmony_ci#include <string.h> 12e1051a39Sopenharmony_ci 13e1051a39Sopenharmony_ci#include <openssl/bn.h> 14e1051a39Sopenharmony_ci#include "crypto/asn1_dsa.h" 15e1051a39Sopenharmony_ci#include "testutil.h" 16e1051a39Sopenharmony_ci 17e1051a39Sopenharmony_cistatic unsigned char t_dsa_sig[] = { 18e1051a39Sopenharmony_ci 0x30, 0x06, /* SEQUENCE tag + length */ 19e1051a39Sopenharmony_ci 0x02, 0x01, 0x01, /* INTEGER tag + length + content */ 20e1051a39Sopenharmony_ci 0x02, 0x01, 0x02 /* INTEGER tag + length + content */ 21e1051a39Sopenharmony_ci}; 22e1051a39Sopenharmony_ci 23e1051a39Sopenharmony_cistatic unsigned char t_dsa_sig_extra[] = { 24e1051a39Sopenharmony_ci 0x30, 0x06, /* SEQUENCE tag + length */ 25e1051a39Sopenharmony_ci 0x02, 0x01, 0x01, /* INTEGER tag + length + content */ 26e1051a39Sopenharmony_ci 0x02, 0x01, 0x02, /* INTEGER tag + length + content */ 27e1051a39Sopenharmony_ci 0x05, 0x00 /* NULL tag + length */ 28e1051a39Sopenharmony_ci}; 29e1051a39Sopenharmony_ci 30e1051a39Sopenharmony_cistatic unsigned char t_dsa_sig_msb[] = { 31e1051a39Sopenharmony_ci 0x30, 0x08, /* SEQUENCE tag + length */ 32e1051a39Sopenharmony_ci 0x02, 0x02, 0x00, 0x81, /* INTEGER tag + length + content */ 33e1051a39Sopenharmony_ci 0x02, 0x02, 0x00, 0x82 /* INTEGER tag + length + content */ 34e1051a39Sopenharmony_ci}; 35e1051a39Sopenharmony_ci 36e1051a39Sopenharmony_cistatic unsigned char t_dsa_sig_two[] = { 37e1051a39Sopenharmony_ci 0x30, 0x08, /* SEQUENCE tag + length */ 38e1051a39Sopenharmony_ci 0x02, 0x02, 0x01, 0x00, /* INTEGER tag + length + content */ 39e1051a39Sopenharmony_ci 0x02, 0x02, 0x02, 0x00 /* INTEGER tag + length + content */ 40e1051a39Sopenharmony_ci}; 41e1051a39Sopenharmony_ci 42e1051a39Sopenharmony_ci/* 43e1051a39Sopenharmony_ci * Badly coded ASN.1 INTEGER zero wrapped in a sequence along with another 44e1051a39Sopenharmony_ci * (valid) INTEGER. 45e1051a39Sopenharmony_ci */ 46e1051a39Sopenharmony_cistatic unsigned char t_invalid_int_zero[] = { 47e1051a39Sopenharmony_ci 0x30, 0x05, /* SEQUENCE tag + length */ 48e1051a39Sopenharmony_ci 0x02, 0x00, /* INTEGER tag + length */ 49e1051a39Sopenharmony_ci 0x02, 0x01, 0x2a /* INTEGER tag + length */ 50e1051a39Sopenharmony_ci}; 51e1051a39Sopenharmony_ci 52e1051a39Sopenharmony_ci/* 53e1051a39Sopenharmony_ci * Badly coded ASN.1 INTEGER (with leading zeros) wrapped in a sequence along 54e1051a39Sopenharmony_ci * with another (valid) INTEGER. 55e1051a39Sopenharmony_ci */ 56e1051a39Sopenharmony_cistatic unsigned char t_invalid_int[] = { 57e1051a39Sopenharmony_ci 0x30, 0x07, /* SEQUENCE tag + length */ 58e1051a39Sopenharmony_ci 0x02, 0x02, 0x00, 0x7f, /* INTEGER tag + length */ 59e1051a39Sopenharmony_ci 0x02, 0x01, 0x2a /* INTEGER tag + length */ 60e1051a39Sopenharmony_ci}; 61e1051a39Sopenharmony_ci 62e1051a39Sopenharmony_ci/* 63e1051a39Sopenharmony_ci * Negative ASN.1 INTEGER wrapped in a sequence along with another 64e1051a39Sopenharmony_ci * (valid) INTEGER. 65e1051a39Sopenharmony_ci */ 66e1051a39Sopenharmony_cistatic unsigned char t_neg_int[] = { 67e1051a39Sopenharmony_ci 0x30, 0x06, /* SEQUENCE tag + length */ 68e1051a39Sopenharmony_ci 0x02, 0x01, 0xaa, /* INTEGER tag + length */ 69e1051a39Sopenharmony_ci 0x02, 0x01, 0x2a /* INTEGER tag + length */ 70e1051a39Sopenharmony_ci}; 71e1051a39Sopenharmony_ci 72e1051a39Sopenharmony_cistatic unsigned char t_trunc_der[] = { 73e1051a39Sopenharmony_ci 0x30, 0x08, /* SEQUENCE tag + length */ 74e1051a39Sopenharmony_ci 0x02, 0x02, 0x00, 0x81, /* INTEGER tag + length */ 75e1051a39Sopenharmony_ci 0x02, 0x02, 0x00 /* INTEGER tag + length */ 76e1051a39Sopenharmony_ci}; 77e1051a39Sopenharmony_ci 78e1051a39Sopenharmony_cistatic unsigned char t_trunc_seq[] = { 79e1051a39Sopenharmony_ci 0x30, 0x07, /* SEQUENCE tag + length */ 80e1051a39Sopenharmony_ci 0x02, 0x02, 0x00, 0x81, /* INTEGER tag + length */ 81e1051a39Sopenharmony_ci 0x02, 0x02, 0x00, 0x82 /* INTEGER tag + length */ 82e1051a39Sopenharmony_ci}; 83e1051a39Sopenharmony_ci 84e1051a39Sopenharmony_cistatic int test_decode(void) 85e1051a39Sopenharmony_ci{ 86e1051a39Sopenharmony_ci int rv = 0; 87e1051a39Sopenharmony_ci BIGNUM *r; 88e1051a39Sopenharmony_ci BIGNUM *s; 89e1051a39Sopenharmony_ci const unsigned char *pder; 90e1051a39Sopenharmony_ci 91e1051a39Sopenharmony_ci r = BN_new(); 92e1051a39Sopenharmony_ci s = BN_new(); 93e1051a39Sopenharmony_ci 94e1051a39Sopenharmony_ci /* Positive tests */ 95e1051a39Sopenharmony_ci pder = t_dsa_sig; 96e1051a39Sopenharmony_ci if (ossl_decode_der_dsa_sig(r, s, &pder, sizeof(t_dsa_sig)) == 0 97e1051a39Sopenharmony_ci || !TEST_ptr_eq(pder, (t_dsa_sig + sizeof(t_dsa_sig))) 98e1051a39Sopenharmony_ci || !TEST_BN_eq_word(r, 1) || !TEST_BN_eq_word(s, 2)) { 99e1051a39Sopenharmony_ci TEST_info("asn1_dsa test_decode: t_dsa_sig failed"); 100e1051a39Sopenharmony_ci goto fail; 101e1051a39Sopenharmony_ci } 102e1051a39Sopenharmony_ci 103e1051a39Sopenharmony_ci BN_clear(r); 104e1051a39Sopenharmony_ci BN_clear(s); 105e1051a39Sopenharmony_ci pder = t_dsa_sig_extra; 106e1051a39Sopenharmony_ci if (ossl_decode_der_dsa_sig(r, s, &pder, sizeof(t_dsa_sig_extra)) == 0 107e1051a39Sopenharmony_ci || !TEST_ptr_eq(pder, 108e1051a39Sopenharmony_ci (t_dsa_sig_extra + sizeof(t_dsa_sig_extra) - 2)) 109e1051a39Sopenharmony_ci || !TEST_BN_eq_word(r, 1) || !TEST_BN_eq_word(s, 2)) { 110e1051a39Sopenharmony_ci TEST_info("asn1_dsa test_decode: t_dsa_sig_extra failed"); 111e1051a39Sopenharmony_ci goto fail; 112e1051a39Sopenharmony_ci } 113e1051a39Sopenharmony_ci 114e1051a39Sopenharmony_ci BN_clear(r); 115e1051a39Sopenharmony_ci BN_clear(s); 116e1051a39Sopenharmony_ci pder = t_dsa_sig_msb; 117e1051a39Sopenharmony_ci if (ossl_decode_der_dsa_sig(r, s, &pder, sizeof(t_dsa_sig_msb)) == 0 118e1051a39Sopenharmony_ci || !TEST_ptr_eq(pder, (t_dsa_sig_msb + sizeof(t_dsa_sig_msb))) 119e1051a39Sopenharmony_ci || !TEST_BN_eq_word(r, 0x81) || !TEST_BN_eq_word(s, 0x82)) { 120e1051a39Sopenharmony_ci TEST_info("asn1_dsa test_decode: t_dsa_sig_msb failed"); 121e1051a39Sopenharmony_ci goto fail; 122e1051a39Sopenharmony_ci } 123e1051a39Sopenharmony_ci 124e1051a39Sopenharmony_ci BN_clear(r); 125e1051a39Sopenharmony_ci BN_clear(s); 126e1051a39Sopenharmony_ci pder = t_dsa_sig_two; 127e1051a39Sopenharmony_ci if (ossl_decode_der_dsa_sig(r, s, &pder, sizeof(t_dsa_sig_two)) == 0 128e1051a39Sopenharmony_ci || !TEST_ptr_eq(pder, (t_dsa_sig_two + sizeof(t_dsa_sig_two))) 129e1051a39Sopenharmony_ci || !TEST_BN_eq_word(r, 0x100) || !TEST_BN_eq_word(s, 0x200)) { 130e1051a39Sopenharmony_ci TEST_info("asn1_dsa test_decode: t_dsa_sig_two failed"); 131e1051a39Sopenharmony_ci goto fail; 132e1051a39Sopenharmony_ci } 133e1051a39Sopenharmony_ci 134e1051a39Sopenharmony_ci /* Negative tests */ 135e1051a39Sopenharmony_ci pder = t_invalid_int_zero; 136e1051a39Sopenharmony_ci if (ossl_decode_der_dsa_sig(r, s, &pder, sizeof(t_invalid_int_zero)) != 0) { 137e1051a39Sopenharmony_ci TEST_info("asn1_dsa test_decode: Expected t_invalid_int_zero to fail"); 138e1051a39Sopenharmony_ci goto fail; 139e1051a39Sopenharmony_ci } 140e1051a39Sopenharmony_ci 141e1051a39Sopenharmony_ci BN_clear(r); 142e1051a39Sopenharmony_ci BN_clear(s); 143e1051a39Sopenharmony_ci pder = t_invalid_int; 144e1051a39Sopenharmony_ci if (ossl_decode_der_dsa_sig(r, s, &pder, sizeof(t_invalid_int)) != 0) { 145e1051a39Sopenharmony_ci TEST_info("asn1_dsa test_decode: Expected t_invalid_int to fail"); 146e1051a39Sopenharmony_ci goto fail; 147e1051a39Sopenharmony_ci } 148e1051a39Sopenharmony_ci 149e1051a39Sopenharmony_ci BN_clear(r); 150e1051a39Sopenharmony_ci BN_clear(s); 151e1051a39Sopenharmony_ci pder = t_neg_int; 152e1051a39Sopenharmony_ci if (ossl_decode_der_dsa_sig(r, s, &pder, sizeof(t_neg_int)) != 0) { 153e1051a39Sopenharmony_ci TEST_info("asn1_dsa test_decode: Expected t_neg_int to fail"); 154e1051a39Sopenharmony_ci goto fail; 155e1051a39Sopenharmony_ci } 156e1051a39Sopenharmony_ci 157e1051a39Sopenharmony_ci BN_clear(r); 158e1051a39Sopenharmony_ci BN_clear(s); 159e1051a39Sopenharmony_ci pder = t_trunc_der; 160e1051a39Sopenharmony_ci if (ossl_decode_der_dsa_sig(r, s, &pder, sizeof(t_trunc_der)) != 0) { 161e1051a39Sopenharmony_ci TEST_info("asn1_dsa test_decode: Expected fail t_trunc_der"); 162e1051a39Sopenharmony_ci goto fail; 163e1051a39Sopenharmony_ci } 164e1051a39Sopenharmony_ci 165e1051a39Sopenharmony_ci BN_clear(r); 166e1051a39Sopenharmony_ci BN_clear(s); 167e1051a39Sopenharmony_ci pder = t_trunc_seq; 168e1051a39Sopenharmony_ci if (ossl_decode_der_dsa_sig(r, s, &pder, sizeof(t_trunc_seq)) != 0) { 169e1051a39Sopenharmony_ci TEST_info("asn1_dsa test_decode: Expected fail t_trunc_seq"); 170e1051a39Sopenharmony_ci goto fail; 171e1051a39Sopenharmony_ci } 172e1051a39Sopenharmony_ci 173e1051a39Sopenharmony_ci rv = 1; 174e1051a39Sopenharmony_cifail: 175e1051a39Sopenharmony_ci BN_free(r); 176e1051a39Sopenharmony_ci BN_free(s); 177e1051a39Sopenharmony_ci return rv; 178e1051a39Sopenharmony_ci} 179e1051a39Sopenharmony_ci 180e1051a39Sopenharmony_ciint setup_tests(void) 181e1051a39Sopenharmony_ci{ 182e1051a39Sopenharmony_ci ADD_TEST(test_decode); 183e1051a39Sopenharmony_ci return 1; 184e1051a39Sopenharmony_ci} 185