3333#include " absl/base/macros.h"
3434#include " absl/strings/str_cat.h"
3535#include " absl/strings/str_format.h"
36+ #include " absl/strings/string_view.h"
3637#include " absl/types/optional.h"
3738#include " absl/types/span.h"
3839#include " asylo/crypto/util/bssl_util.h"
3940#include " asylo/crypto/util/byte_container_view.h"
4041#include " asylo/util/logging.h"
42+ #include " asylo/util/error_codes.h"
4143#include " asylo/util/status.h"
4244#include " asylo/util/status_macros.h"
4345#include " asylo/util/statusor.h"
@@ -63,6 +65,8 @@ absl::optional<Asn1Type> FromOpensslType(int openssl_type) {
6365 return Asn1Type::kObjectId ;
6466 case V_ASN1_SEQUENCE:
6567 return Asn1Type::kSequence ;
68+ case V_ASN1_IA5STRING:
69+ return Asn1Type::kIA5String ;
6670 default :
6771 return absl::nullopt ;
6872 }
@@ -85,6 +89,8 @@ int ToOpensslType(Asn1Type type) {
8589 return V_ASN1_OBJECT;
8690 case Asn1Type::kSequence :
8791 return V_ASN1_SEQUENCE;
92+ case Asn1Type::kIA5String :
93+ return V_ASN1_IA5STRING;
8894 }
8995
9096 return V_ASN1_UNDEF;
@@ -397,6 +403,12 @@ StatusOr<Asn1Value> Asn1Value::CreateSequence(
397403 return result;
398404}
399405
406+ StatusOr<Asn1Value> Asn1Value::CreateIA5String (absl::string_view value) {
407+ Asn1Value result;
408+ ASYLO_RETURN_IF_ERROR (result.SetIA5String (value));
409+ return result;
410+ }
411+
400412StatusOr<Asn1Value> Asn1Value::CreateSequenceFromStatusOrs (
401413 absl::Span<const StatusOr<Asn1Value>> results) {
402414 Asn1Value result;
@@ -495,6 +507,14 @@ StatusOr<std::vector<Asn1Value>> Asn1Value::GetSequence() const {
495507 return result;
496508}
497509
510+ StatusOr<std::string> Asn1Value::GetIA5String () const {
511+ ASYLO_RETURN_IF_ERROR (CheckIsType (Asn1Type::kIA5String ));
512+ const ASN1_IA5STRING *str = value_->value .ia5string ;
513+
514+ return std::string (reinterpret_cast <const char *>(ASN1_STRING_get0_data (str)),
515+ ASN1_STRING_length (str));
516+ }
517+
498518Status Asn1Value::SetBoolean (bool value) { return SetBsslBoolean (value); }
499519
500520Status Asn1Value::SetInteger (const BIGNUM &value) {
@@ -564,6 +584,21 @@ Status Asn1Value::SetSequence(absl::Span<const Asn1Value> elements) {
564584 return SetBsslSequence (*sequence);
565585}
566586
587+ Status Asn1Value::SetIA5String (absl::string_view value) {
588+ bssl::UniquePtr<ASN1_IA5STRING> ia5_string (ASN1_IA5STRING_new ());
589+ if (ia5_string == nullptr ) {
590+ return Status (error::GoogleError::INTERNAL, BsslLastErrorString ());
591+ }
592+
593+ if (ASN1_STRING_set (ia5_string.get (), value.data (), value.length ()) != 1 ) {
594+ return Status (error::GoogleError::INTERNAL, BsslLastErrorString ());
595+ }
596+
597+ ASN1_TYPE_set (value_.get (), V_ASN1_IA5STRING, ia5_string.release ());
598+
599+ return Status::OkStatus ();
600+ }
601+
567602Status Asn1Value::SetSequenceFromStatusOrs (
568603 absl::Span<const StatusOr<Asn1Value>> results) {
569604 std::vector<Asn1Value> elements (results.size ());
@@ -636,6 +671,13 @@ StatusOr<Asn1Value> Asn1Value::CreateSequenceFromBssl(
636671 return asn1;
637672}
638673
674+ StatusOr<Asn1Value> Asn1Value::CreateIA5StringFromBssl (
675+ const ASN1_IA5STRING &bssl_value) {
676+ Asn1Value asn1;
677+ ASYLO_RETURN_IF_ERROR (asn1.SetBsslIA5String (bssl_value));
678+ return asn1;
679+ }
680+
639681StatusOr<ASN1_BOOLEAN> Asn1Value::GetBsslBoolean () const {
640682 ASYLO_RETURN_IF_ERROR (CheckIsType (Asn1Type::kBoolean ));
641683 return value_->value .boolean ;
@@ -687,6 +729,12 @@ StatusOr<bssl::UniquePtr<ASN1_SEQUENCE_ANY>> Asn1Value::GetBsslSequence()
687729 return std::move (sequence);
688730}
689731
732+ StatusOr<bssl::UniquePtr<ASN1_IA5STRING>> Asn1Value::GetBsslIA5String () const {
733+ ASYLO_RETURN_IF_ERROR (CheckIsType (Asn1Type::kIA5String ));
734+ return bssl::UniquePtr<ASN1_IA5STRING>(
735+ CHECK_NOTNULL (ASN1_STRING_dup (value_->value .ia5string )));
736+ }
737+
690738Status Asn1Value::SetBsslBoolean (ASN1_BOOLEAN bssl_value) {
691739 // A non-null pointer. Used when calling ASN1_TYPE_set() with V_ASN1_BOOLEAN.
692740 void *const kNonNullPointer = reinterpret_cast <void *>(true );
@@ -749,6 +797,13 @@ Status Asn1Value::SetBsslSequence(const ASN1_SEQUENCE_ANY &bssl_value) {
749797 return Status::OkStatus ();
750798}
751799
800+ Status Asn1Value::SetBsslIA5String (const ASN1_IA5STRING &bssl_value) {
801+ if (ASN1_TYPE_set1 (value_.get (), V_ASN1_IA5STRING, &bssl_value) != 1 ) {
802+ return Status (error::GoogleError::INTERNAL, BsslLastErrorString ());
803+ }
804+ return Status::OkStatus ();
805+ }
806+
752807Asn1Value::Asn1Value (bssl::UniquePtr<ASN1_TYPE> value)
753808 : value_(std::move(value)) {}
754809
@@ -794,6 +849,7 @@ bool operator==(const Asn1Value &lhs, const Asn1Value &rhs) {
794849 case Asn1Type::kBitString :
795850 case Asn1Type::kObjectId :
796851 case Asn1Type::kOctetString :
852+ case Asn1Type::kIA5String :
797853 return ASN1_TYPE_cmp (lhs.value_ .get (), rhs.value_ .get ()) == 0 ;
798854 }
799855
0 commit comments