Annotation of embedaddon/strongswan/src/libtls/tls_aead_null.c, revision 1.1.1.2
1.1 misho 1: /*
2: * Copyright (C) 2014 Martin Willi
3: * Copyright (C) 2014 revosec AG
4: *
5: * This program is free software; you can redistribute it and/or modify it
6: * under the terms of the GNU General Public License as published by the
7: * Free Software Foundation; either version 2 of the License, or (at your
8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9: *
10: * This program is distributed in the hope that it will be useful, but
11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13: * for more details.
14: */
15:
16: #include "tls_aead.h"
17:
18: typedef struct private_tls_aead_t private_tls_aead_t;
19:
20: /**
21: * Private data of an tls_aead_t object.
22: */
23: struct private_tls_aead_t {
24:
25: /**
26: * Public tls_aead_t interface.
27: */
28: tls_aead_t public;
29:
30: /**
31: * traditional signer
32: */
33: signer_t *signer;
34: };
35:
36: /**
37: * Associated header data to create signature over
38: */
39: typedef struct __attribute__((__packed__)) {
40: uint64_t seq;
41: uint8_t type;
42: uint16_t version;
43: uint16_t length;
44: } sigheader_t;
45:
46: METHOD(tls_aead_t, encrypt, bool,
47: private_tls_aead_t *this, tls_version_t version,
1.1.1.2 ! misho 48: tls_content_type_t *type, uint64_t seq, chunk_t *data)
1.1 misho 49: {
50: chunk_t assoc, mac;
51: sigheader_t hdr;
52:
1.1.1.2 ! misho 53: hdr.type = *type;
1.1 misho 54: htoun64(&hdr.seq, seq);
55: htoun16(&hdr.version, version);
56: htoun16(&hdr.length, data->len);
57:
58: assoc = chunk_from_thing(hdr);
59: if (!this->signer->get_signature(this->signer, assoc, NULL) ||
60: !this->signer->allocate_signature(this->signer, *data, &mac))
61: {
62: return FALSE;
63: }
64: *data = chunk_cat("mm", *data, mac);
65: return TRUE;
66: }
67:
68: METHOD(tls_aead_t, decrypt, bool,
69: private_tls_aead_t *this, tls_version_t version,
1.1.1.2 ! misho 70: tls_content_type_t *type, uint64_t seq, chunk_t *data)
1.1 misho 71: {
72: chunk_t assoc, mac;
73: sigheader_t hdr;
74:
75: mac.len = this->signer->get_block_size(this->signer);
76: if (data->len < mac.len)
77: {
78: return FALSE;
79: }
80: mac = chunk_skip(*data, data->len - mac.len);
81: data->len -= mac.len;
82:
1.1.1.2 ! misho 83: hdr.type = *type;
1.1 misho 84: htoun64(&hdr.seq, seq);
85: htoun16(&hdr.version, version);
86: htoun16(&hdr.length, data->len);
87:
88: assoc = chunk_from_thing(hdr);
89: if (!this->signer->get_signature(this->signer, assoc, NULL) ||
90: !this->signer->verify_signature(this->signer, *data, mac))
91: {
92: return FALSE;
93: }
94: return TRUE;
95: }
96:
97: METHOD(tls_aead_t, get_mac_key_size, size_t,
98: private_tls_aead_t *this)
99: {
100: return this->signer->get_key_size(this->signer);
101: }
102:
103: METHOD(tls_aead_t, get_encr_key_size, size_t,
104: private_tls_aead_t *this)
105: {
106: return 0;
107: }
108:
109: METHOD(tls_aead_t, get_iv_size, size_t,
110: private_tls_aead_t *this)
111: {
112: return 0;
113: }
114:
115: METHOD(tls_aead_t, set_keys, bool,
116: private_tls_aead_t *this, chunk_t mac, chunk_t encr, chunk_t iv)
117: {
118: if (iv.len || encr.len)
119: {
120: return FALSE;
121: }
122: return this->signer->set_key(this->signer, mac);
123: }
124:
125: METHOD(tls_aead_t, destroy, void,
126: private_tls_aead_t *this)
127: {
128: this->signer->destroy(this->signer);
129: free(this);
130: }
131:
132: /**
133: * See header
134: */
135: tls_aead_t *tls_aead_create_null(integrity_algorithm_t alg)
136: {
137: private_tls_aead_t *this;
138:
139: INIT(this,
140: .public = {
141: .encrypt = _encrypt,
142: .decrypt = _decrypt,
143: .get_mac_key_size = _get_mac_key_size,
144: .get_encr_key_size = _get_encr_key_size,
145: .get_iv_size = _get_iv_size,
146: .set_keys = _set_keys,
147: .destroy = _destroy,
148: },
149: .signer = lib->crypto->create_signer(lib->crypto, alg),
150: );
151:
152: if (!this->signer)
153: {
154: free(this);
155: return NULL;
156: }
157:
158: return &this->public;
159: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>