+class Octet {
+ private:
+ ASN1_OCTET_STRING *value_;
+
+ public:
+ Octet() :
+ value_(ASN1_OCTET_STRING_new())
+ {
+ _assert(value_ != NULL);
+ }
+
+ Octet(const std::string &value) :
+ Octet()
+ {
+ _assert(ASN1_STRING_set(value_, value.data(), value.size()));
+ }
+
+ Octet(const uint8_t *data, size_t size) :
+ Octet()
+ {
+ _assert(ASN1_STRING_set(value_, data, size));
+ }
+
+ Octet(const Octet &value) = delete;
+
+ ~Octet() {
+ if (value_ != NULL)
+ ASN1_OCTET_STRING_free(value_);
+ }
+
+ void release() {
+ value_ = NULL;
+ }
+
+ operator ASN1_OCTET_STRING *() const {
+ return value_;
+ }
+};
+
+typedef struct {
+ ASN1_OBJECT *algorithm;
+ ASN1_OCTET_STRING *value;
+} APPLE_CDHASH;
+
+DECLARE_ASN1_FUNCTIONS(APPLE_CDHASH)
+
+ASN1_NDEF_SEQUENCE(APPLE_CDHASH) = {
+ ASN1_SIMPLE(APPLE_CDHASH, algorithm, ASN1_OBJECT),
+ ASN1_SIMPLE(APPLE_CDHASH, value, ASN1_OCTET_STRING),
+} ASN1_NDEF_SEQUENCE_END(APPLE_CDHASH)
+
+IMPLEMENT_ASN1_FUNCTIONS(APPLE_CDHASH)
+
+typedef struct {
+ ASN1_OBJECT *object;
+ STACK_OF(APPLE_CDHASH) *cdhashes;
+} APPLE_CDATTR;
+
+DECLARE_ASN1_FUNCTIONS(APPLE_CDATTR)
+
+ASN1_NDEF_SEQUENCE(APPLE_CDATTR) = {
+ ASN1_SIMPLE(APPLE_CDATTR, object, ASN1_OBJECT),
+ ASN1_SET_OF(APPLE_CDATTR, cdhashes, APPLE_CDHASH),
+} ASN1_NDEF_SEQUENCE_END(APPLE_CDATTR)
+
+IMPLEMENT_ASN1_FUNCTIONS(APPLE_CDATTR)
+