aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTao Bao2017-03-20 19:09:13 -0500
committerTao Bao2017-03-21 17:17:43 -0500
commit861c53c6c55db4cf6cb76d35f92804cabf1cd444 (patch)
tree440fb5ff4377db541ea46aea876ce1cd6ea29b12 /verifier.cpp
parent5b2bf90e13229c8df6a5c02233753a6bd6d1c928 (diff)
downloadplatform-bootable-recovery-861c53c6c55db4cf6cb76d35f92804cabf1cd444.tar.gz
platform-bootable-recovery-861c53c6c55db4cf6cb76d35f92804cabf1cd444.tar.xz
platform-bootable-recovery-861c53c6c55db4cf6cb76d35f92804cabf1cd444.zip
Refactor asn1_decoder functions into a class.
Test: mmma bootable/recovery Test: recovery_unit_test passes. Test: recovery_component_test passes. Change-Id: If0bf25993158eaebeedff55ba4f4dd0f6e5f937d
Diffstat (limited to 'verifier.cpp')
-rw-r--r--verifier.cpp76
1 files changed, 39 insertions, 37 deletions
diff --git a/verifier.cpp b/verifier.cpp
index fa344d74..e9d540cd 100644
--- a/verifier.cpp
+++ b/verifier.cpp
@@ -66,48 +66,50 @@ static bool read_pkcs7(const uint8_t* pkcs7_der, size_t pkcs7_der_len,
66 CHECK(sig_der != nullptr); 66 CHECK(sig_der != nullptr);
67 sig_der->clear(); 67 sig_der->clear();
68 68
69 asn1_context_t* ctx = asn1_context_new(pkcs7_der, pkcs7_der_len); 69 asn1_context ctx(pkcs7_der, pkcs7_der_len);
70 if (ctx == NULL) { 70
71 std::unique_ptr<asn1_context> pkcs7_seq(ctx.asn1_sequence_get());
72 if (pkcs7_seq == nullptr || !pkcs7_seq->asn1_sequence_next()) {
71 return false; 73 return false;
72 } 74 }
73 75
74 asn1_context_t* pkcs7_seq = asn1_sequence_get(ctx); 76 std::unique_ptr<asn1_context> signed_data_app(pkcs7_seq->asn1_constructed_get());
75 if (pkcs7_seq != NULL && asn1_sequence_next(pkcs7_seq)) { 77 if (signed_data_app == nullptr) {
76 asn1_context_t *signed_data_app = asn1_constructed_get(pkcs7_seq); 78 return false;
77 if (signed_data_app != NULL) { 79 }
78 asn1_context_t* signed_data_seq = asn1_sequence_get(signed_data_app); 80
79 if (signed_data_seq != NULL 81 std::unique_ptr<asn1_context> signed_data_seq(signed_data_app->asn1_sequence_get());
80 && asn1_sequence_next(signed_data_seq) 82 if (signed_data_seq == nullptr ||
81 && asn1_sequence_next(signed_data_seq) 83 !signed_data_seq->asn1_sequence_next() ||
82 && asn1_sequence_next(signed_data_seq) 84 !signed_data_seq->asn1_sequence_next() ||
83 && asn1_constructed_skip_all(signed_data_seq)) { 85 !signed_data_seq->asn1_sequence_next() ||
84 asn1_context_t *sig_set = asn1_set_get(signed_data_seq); 86 !signed_data_seq->asn1_constructed_skip_all()) {
85 if (sig_set != NULL) { 87 return false;
86 asn1_context_t* sig_seq = asn1_sequence_get(sig_set); 88 }
87 if (sig_seq != NULL 89
88 && asn1_sequence_next(sig_seq) 90 std::unique_ptr<asn1_context> sig_set(signed_data_seq->asn1_set_get());
89 && asn1_sequence_next(sig_seq) 91 if (sig_set == nullptr) {
90 && asn1_sequence_next(sig_seq) 92 return false;
91 && asn1_sequence_next(sig_seq)) { 93 }
92 const uint8_t* sig_der_ptr; 94
93 size_t sig_der_length; 95 std::unique_ptr<asn1_context> sig_seq(sig_set->asn1_sequence_get());
94 if (asn1_octet_string_get(sig_seq, &sig_der_ptr, &sig_der_length)) { 96 if (sig_seq == nullptr ||
95 sig_der->resize(sig_der_length); 97 !sig_seq->asn1_sequence_next() ||
96 std::copy(sig_der_ptr, sig_der_ptr + sig_der_length, sig_der->begin()); 98 !sig_seq->asn1_sequence_next() ||
97 } 99 !sig_seq->asn1_sequence_next() ||
98 asn1_context_free(sig_seq); 100 !sig_seq->asn1_sequence_next()) {
99 } 101 return false;
100 asn1_context_free(sig_set); 102 }
101 } 103
102 asn1_context_free(signed_data_seq); 104 const uint8_t* sig_der_ptr;
103 } 105 size_t sig_der_length;
104 asn1_context_free(signed_data_app); 106 if (!sig_seq->asn1_octet_string_get(&sig_der_ptr, &sig_der_length)) {
105 } 107 return false;
106 asn1_context_free(pkcs7_seq);
107 } 108 }
108 asn1_context_free(ctx);
109 109
110 return !sig_der->empty(); 110 sig_der->resize(sig_der_length);
111 std::copy(sig_der_ptr, sig_der_ptr + sig_der_length, sig_der->begin());
112 return true;
111} 113}
112 114
113/* 115/*