1e71b7053SJung-uk Kim /* 2e71b7053SJung-uk Kim * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. 374664626SKris Kennaway * 4e71b7053SJung-uk Kim * Licensed under the OpenSSL license (the "License"). You may not use 5e71b7053SJung-uk Kim * this file except in compliance with the License. You can obtain a copy 6e71b7053SJung-uk Kim * in the file LICENSE in the source distribution or at 7e71b7053SJung-uk Kim * https://www.openssl.org/source/license.html 874664626SKris Kennaway */ 974664626SKris Kennaway 1074664626SKris Kennaway #include <stdio.h> 11e71b7053SJung-uk Kim #include "internal/cryptlib.h" 1274664626SKris Kennaway #include <openssl/asn1.h> 13e71b7053SJung-uk Kim #include <openssl/asn1t.h> 1474664626SKris Kennaway 1574664626SKris Kennaway int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len) 1674664626SKris Kennaway { 1774664626SKris Kennaway ASN1_STRING *os; 1874664626SKris Kennaway 19e71b7053SJung-uk Kim if ((os = ASN1_OCTET_STRING_new()) == NULL) 20e71b7053SJung-uk Kim return 0; 21e71b7053SJung-uk Kim if (!ASN1_OCTET_STRING_set(os, data, len)) { 22e71b7053SJung-uk Kim ASN1_OCTET_STRING_free(os); 23a93cbc2bSJung-uk Kim return 0; 24a93cbc2bSJung-uk Kim } 2574664626SKris Kennaway ASN1_TYPE_set(a, V_ASN1_OCTET_STRING, os); 26e71b7053SJung-uk Kim return 1; 2774664626SKris Kennaway } 2874664626SKris Kennaway 2974664626SKris Kennaway /* int max_len: for returned value */ 30e71b7053SJung-uk Kim int ASN1_TYPE_get_octetstring(const ASN1_TYPE *a, unsigned char *data, int max_len) 3174664626SKris Kennaway { 3274664626SKris Kennaway int ret, num; 33e71b7053SJung-uk Kim const unsigned char *p; 3474664626SKris Kennaway 356f9291ceSJung-uk Kim if ((a->type != V_ASN1_OCTET_STRING) || (a->value.octet_string == NULL)) { 3674664626SKris Kennaway ASN1err(ASN1_F_ASN1_TYPE_GET_OCTETSTRING, ASN1_R_DATA_IS_WRONG); 37e71b7053SJung-uk Kim return -1; 3874664626SKris Kennaway } 39e71b7053SJung-uk Kim p = ASN1_STRING_get0_data(a->value.octet_string); 40e71b7053SJung-uk Kim ret = ASN1_STRING_length(a->value.octet_string); 4174664626SKris Kennaway if (ret < max_len) 4274664626SKris Kennaway num = ret; 4374664626SKris Kennaway else 4474664626SKris Kennaway num = max_len; 4574664626SKris Kennaway memcpy(data, p, num); 46e71b7053SJung-uk Kim return ret; 4774664626SKris Kennaway } 4874664626SKris Kennaway 49e71b7053SJung-uk Kim typedef struct { 50e71b7053SJung-uk Kim int32_t num; 51e71b7053SJung-uk Kim ASN1_OCTET_STRING *oct; 52e71b7053SJung-uk Kim } asn1_int_oct; 53e71b7053SJung-uk Kim 54e71b7053SJung-uk Kim ASN1_SEQUENCE(asn1_int_oct) = { 55e71b7053SJung-uk Kim ASN1_EMBED(asn1_int_oct, num, INT32), 56e71b7053SJung-uk Kim ASN1_SIMPLE(asn1_int_oct, oct, ASN1_OCTET_STRING) 57e71b7053SJung-uk Kim } static_ASN1_SEQUENCE_END(asn1_int_oct) 58e71b7053SJung-uk Kim 59e71b7053SJung-uk Kim DECLARE_ASN1_ITEM(asn1_int_oct) 60e71b7053SJung-uk Kim 6174664626SKris Kennaway int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, unsigned char *data, 6274664626SKris Kennaway int len) 6374664626SKris Kennaway { 64e71b7053SJung-uk Kim asn1_int_oct atmp; 65e71b7053SJung-uk Kim ASN1_OCTET_STRING oct; 6674664626SKris Kennaway 67e71b7053SJung-uk Kim atmp.num = num; 68e71b7053SJung-uk Kim atmp.oct = &oct; 69e71b7053SJung-uk Kim oct.data = data; 70e71b7053SJung-uk Kim oct.type = V_ASN1_OCTET_STRING; 71e71b7053SJung-uk Kim oct.length = len; 72e71b7053SJung-uk Kim oct.flags = 0; 7374664626SKris Kennaway 74e71b7053SJung-uk Kim if (ASN1_TYPE_pack_sequence(ASN1_ITEM_rptr(asn1_int_oct), &atmp, &a)) 75e71b7053SJung-uk Kim return 1; 76e71b7053SJung-uk Kim return 0; 7774664626SKris Kennaway } 7874664626SKris Kennaway 796f9291ceSJung-uk Kim /* 80e71b7053SJung-uk Kim * we return the actual length... 816f9291ceSJung-uk Kim */ 8274664626SKris Kennaway /* int max_len: for returned value */ 83e71b7053SJung-uk Kim int ASN1_TYPE_get_int_octetstring(const ASN1_TYPE *a, long *num, 846f9291ceSJung-uk Kim unsigned char *data, int max_len) 8574664626SKris Kennaway { 86e71b7053SJung-uk Kim asn1_int_oct *atmp = NULL; 8774664626SKris Kennaway int ret = -1, n; 8874664626SKris Kennaway 896f9291ceSJung-uk Kim if ((a->type != V_ASN1_SEQUENCE) || (a->value.sequence == NULL)) { 9074664626SKris Kennaway goto err; 9174664626SKris Kennaway } 9274664626SKris Kennaway 93e71b7053SJung-uk Kim atmp = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(asn1_int_oct), a); 9474664626SKris Kennaway 95e71b7053SJung-uk Kim if (atmp == NULL) 966f9291ceSJung-uk Kim goto err; 9774664626SKris Kennaway 9874664626SKris Kennaway if (num != NULL) 99e71b7053SJung-uk Kim *num = atmp->num; 10074664626SKris Kennaway 101e71b7053SJung-uk Kim ret = ASN1_STRING_length(atmp->oct); 10274664626SKris Kennaway if (max_len > ret) 10374664626SKris Kennaway n = ret; 10474664626SKris Kennaway else 10574664626SKris Kennaway n = max_len; 10674664626SKris Kennaway 10774664626SKris Kennaway if (data != NULL) 108e71b7053SJung-uk Kim memcpy(data, ASN1_STRING_get0_data(atmp->oct), n); 109e71b7053SJung-uk Kim if (ret == -1) { 11074664626SKris Kennaway err: 11174664626SKris Kennaway ASN1err(ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING, ASN1_R_DATA_IS_WRONG); 11274664626SKris Kennaway } 113e71b7053SJung-uk Kim M_ASN1_free_of(atmp, asn1_int_oct); 114e71b7053SJung-uk Kim return ret; 11574664626SKris Kennaway } 116