Annotation of embedaddon/strongswan/src/libcharon/plugins/dnscert/dnscert.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2013 Ruslan Marchenko
! 3: *
! 4: * Permission is hereby granted, free of charge, to any person obtaining a copy
! 5: * of this software and associated documentation files (the "Software"), to deal
! 6: * in the Software without restriction, including without limitation the rights
! 7: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
! 8: * copies of the Software, and to permit persons to whom the Software is
! 9: * furnished to do so, subject to the following conditions:
! 10: *
! 11: * The above copyright notice and this permission notice shall be included in
! 12: * all copies or substantial portions of the Software.
! 13: *
! 14: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
! 15: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
! 16: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
! 17: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
! 18: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
! 19: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
! 20: * THE SOFTWARE.
! 21: */
! 22:
! 23: #include "dnscert.h"
! 24:
! 25: #include <library.h>
! 26: #include <utils/debug.h>
! 27: #include <bio/bio_reader.h>
! 28:
! 29: typedef struct private_dnscert_t private_dnscert_t;
! 30:
! 31: /**
! 32: * private data of the dnscert
! 33: */
! 34: struct private_dnscert_t {
! 35:
! 36: /**
! 37: * public functions
! 38: */
! 39: dnscert_t public;
! 40:
! 41: /**
! 42: * Certificate type
! 43: */
! 44: uint16_t cert_type;
! 45:
! 46: /**
! 47: * Key tag
! 48: */
! 49: uint16_t key_tag;
! 50:
! 51: /**
! 52: * Algorithm
! 53: */
! 54: uint8_t algorithm;
! 55:
! 56: /**
! 57: * Certificate
! 58: */
! 59: chunk_t certificate;
! 60: };
! 61:
! 62: METHOD(dnscert_t, get_cert_type, dnscert_type_t,
! 63: private_dnscert_t *this)
! 64: {
! 65: return this->cert_type;
! 66: }
! 67:
! 68: METHOD(dnscert_t, get_key_tag, uint16_t,
! 69: private_dnscert_t *this)
! 70: {
! 71: return this->key_tag;
! 72: }
! 73:
! 74: METHOD(dnscert_t, get_algorithm, dnscert_algorithm_t,
! 75: private_dnscert_t *this)
! 76: {
! 77: return this->algorithm;
! 78: }
! 79:
! 80: METHOD(dnscert_t, get_certificate, chunk_t,
! 81: private_dnscert_t *this)
! 82: {
! 83: return this->certificate;
! 84: }
! 85:
! 86: METHOD(dnscert_t, destroy, void,
! 87: private_dnscert_t *this)
! 88: {
! 89: chunk_free(&this->certificate);
! 90: free(this);
! 91: }
! 92:
! 93: dnscert_t *dnscert_create_frm_rr(rr_t *rr)
! 94: {
! 95: private_dnscert_t *this;
! 96: bio_reader_t *reader = NULL;
! 97:
! 98: INIT(this,
! 99: .public = {
! 100: .get_cert_type = _get_cert_type,
! 101: .get_key_tag = _get_key_tag,
! 102: .get_algorithm = _get_algorithm,
! 103: .get_certificate = _get_certificate,
! 104: .destroy = _destroy,
! 105: },
! 106: );
! 107:
! 108: if (rr->get_type(rr) != RR_TYPE_CERT)
! 109: {
! 110: DBG1(DBG_CFG, "unable to create a dnscert out of an RR "
! 111: "whose type is not CERT");
! 112: free(this);
! 113: return NULL;
! 114: }
! 115:
! 116: /**
! 117: * Parse the content (RDATA field) of the RR
! 118: * First - type/tag/algo fields and then cert body
! 119: */
! 120: reader = bio_reader_create(rr->get_rdata(rr));
! 121: if (!reader->read_uint16(reader, &this->cert_type) ||
! 122: !reader->read_uint16(reader, &this->key_tag) ||
! 123: !reader->read_uint8(reader, &this->algorithm) )
! 124: {
! 125: DBG1(DBG_CFG, "CERT RR has a wrong format");
! 126: reader->destroy(reader);
! 127: free(this);
! 128: return NULL;
! 129: }
! 130:
! 131: if (!reader->read_data(reader, reader->remaining(reader),
! 132: &this->certificate))
! 133: {
! 134: DBG1(DBG_CFG, "failed to read DNS certificate field");
! 135: reader->destroy(reader);
! 136: free(this);
! 137: return NULL;
! 138: }
! 139: this->certificate = chunk_clone(this->certificate);
! 140: reader->destroy(reader);
! 141: return &this->public;
! 142: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>