Coverage Report

Created: 2025-12-31 06:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/strongswan/src/libstrongswan/crypto/crypters/crypter.c
Line
Count
Source
1
/*
2
 * Copyright (C) 2005-2006 Martin Willi
3
 * Copyright (C) 2005 Jan Hutter
4
 *
5
 * Copyright (C) secunet Security Networks AG
6
 *
7
 * This program is free software; you can redistribute it and/or modify it
8
 * under the terms of the GNU General Public License as published by the
9
 * Free Software Foundation; either version 2 of the License, or (at your
10
 * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
11
 *
12
 * This program is distributed in the hope that it will be useful, but
13
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15
 * for more details.
16
 */
17
18
#include <asn1/oid.h>
19
20
#include "crypter.h"
21
22
ENUM_BEGIN(encryption_algorithm_names, ENCR_DES_IV64, ENCR_DES_IV32,
23
  "DES_IV64",
24
  "DES_CBC",
25
  "3DES_CBC",
26
  "RC5_CBC",
27
  "IDEA_CBC",
28
  "CAST_CBC",
29
  "BLOWFISH_CBC",
30
  "3IDEA",
31
  "DES_IV32");
32
ENUM_NEXT(encryption_algorithm_names, ENCR_NULL, ENCR_AES_CCM_ICV16, ENCR_DES_IV32,
33
  "NULL",
34
  "AES_CBC",
35
  "AES_CTR",
36
  "AES_CCM_8",
37
  "AES_CCM_12",
38
  "AES_CCM_16");
39
ENUM_NEXT(encryption_algorithm_names, ENCR_AES_GCM_ICV8, ENCR_NULL_AUTH_AES_GMAC, ENCR_AES_CCM_ICV16,
40
  "AES_GCM_8",
41
  "AES_GCM_12",
42
  "AES_GCM_16",
43
  "NULL_AES_GMAC");
44
ENUM_NEXT(encryption_algorithm_names, ENCR_CAMELLIA_CBC, ENCR_CHACHA20_POLY1305, ENCR_NULL_AUTH_AES_GMAC,
45
  "CAMELLIA_CBC",
46
  "CAMELLIA_CTR",
47
  "CAMELLIA_CCM_8",
48
  "CAMELLIA_CCM_12",
49
  "CAMELLIA_CCM_16",
50
  "CHACHA20_POLY1305");
51
ENUM_NEXT(encryption_algorithm_names, ENCR_UNDEFINED, ENCR_AES_CFB, ENCR_CHACHA20_POLY1305,
52
  "UNDEFINED",
53
  "DES_ECB",
54
  "SERPENT_CBC",
55
  "TWOFISH_CBC",
56
  "RC2_CBC",
57
  "AES_ECB",
58
  "AES_CFB");
59
ENUM_END(encryption_algorithm_names, ENCR_AES_CFB);
60
61
/*
62
 * Described in header.
63
 */
64
encryption_algorithm_t encryption_algorithm_from_oid(int oid, size_t *key_size)
65
0
{
66
0
  encryption_algorithm_t alg;
67
0
  size_t alg_key_size;
68
69
0
  switch (oid)
70
0
  {
71
0
    case OID_DES_CBC:
72
0
      alg = ENCR_DES;
73
0
      alg_key_size = 0;
74
0
      break;
75
0
    case OID_3DES_EDE_CBC:
76
0
      alg = ENCR_3DES;
77
0
      alg_key_size = 0;
78
0
      break;
79
0
    case OID_AES128_CBC:
80
0
      alg = ENCR_AES_CBC;
81
0
      alg_key_size = 128;
82
0
      break;
83
0
    case OID_AES192_CBC:
84
0
      alg = ENCR_AES_CBC;
85
0
      alg_key_size = 192;
86
0
      break;
87
0
    case OID_AES256_CBC:
88
0
      alg = ENCR_AES_CBC;
89
0
      alg_key_size = 256;
90
0
      break;
91
0
    case OID_CAMELLIA128_CBC:
92
0
      alg = ENCR_CAMELLIA_CBC;
93
0
      alg_key_size = 128;
94
0
      break;
95
0
    case OID_CAMELLIA192_CBC:
96
0
      alg = ENCR_CAMELLIA_CBC;
97
0
      alg_key_size = 192;
98
0
      break;
99
0
    case OID_CAMELLIA256_CBC:
100
0
      alg = ENCR_CAMELLIA_CBC;
101
0
      alg_key_size = 256;
102
0
      break;
103
0
    case OID_BLOWFISH_CBC:
104
0
      alg = ENCR_BLOWFISH;
105
0
      alg_key_size = 0;
106
0
      break;
107
0
    default:
108
0
      alg = ENCR_UNDEFINED;
109
0
      alg_key_size = 0;
110
0
  }
111
0
  if (key_size)
112
0
  {
113
0
      *key_size = alg_key_size;
114
0
  }
115
0
  return alg;
116
0
}
117
118
/*
119
 * Described in header.
120
 */
121
int encryption_algorithm_to_oid(encryption_algorithm_t alg, size_t key_size)
122
0
{
123
0
  int oid;
124
125
0
  switch(alg)
126
0
  {
127
0
    case ENCR_DES:
128
0
      oid = OID_DES_CBC;
129
0
      break;
130
0
    case ENCR_3DES:
131
0
      oid = OID_3DES_EDE_CBC;
132
0
      break;
133
0
    case ENCR_AES_CBC:
134
0
      switch (key_size)
135
0
      {
136
0
        case 128:
137
0
          oid = OID_AES128_CBC;
138
0
          break;
139
0
        case 192:
140
0
          oid = OID_AES192_CBC;
141
0
          break;
142
0
        case 256:
143
0
          oid = OID_AES256_CBC;
144
0
          break;
145
0
        default:
146
0
          oid = OID_UNKNOWN;
147
0
      }
148
0
      break;
149
0
    case ENCR_CAMELLIA_CBC:
150
0
      switch (key_size)
151
0
      {
152
0
        case 128:
153
0
          oid = OID_CAMELLIA128_CBC;
154
0
          break;
155
0
        case 192:
156
0
          oid = OID_CAMELLIA192_CBC;
157
0
          break;
158
0
        case 256:
159
0
          oid = OID_CAMELLIA256_CBC;
160
0
          break;
161
0
        default:
162
0
          oid = OID_UNKNOWN;
163
0
      }
164
0
      break;
165
0
    case ENCR_BLOWFISH:
166
0
      oid = OID_BLOWFISH_CBC;
167
0
      break;
168
0
    default:
169
0
      oid = OID_UNKNOWN;
170
0
  }
171
0
  return oid;
172
0
}
173
174
/*
175
 * Described in header.
176
 */
177
bool encryption_algorithm_is_aead(encryption_algorithm_t alg)
178
0
{
179
0
  switch (alg)
180
0
  {
181
0
    case ENCR_AES_CCM_ICV8:
182
0
    case ENCR_AES_CCM_ICV12:
183
0
    case ENCR_AES_CCM_ICV16:
184
0
    case ENCR_AES_GCM_ICV8:
185
0
    case ENCR_AES_GCM_ICV12:
186
0
    case ENCR_AES_GCM_ICV16:
187
0
    case ENCR_NULL_AUTH_AES_GMAC:
188
0
    case ENCR_CAMELLIA_CCM_ICV8:
189
0
    case ENCR_CAMELLIA_CCM_ICV12:
190
0
    case ENCR_CAMELLIA_CCM_ICV16:
191
0
    case ENCR_CHACHA20_POLY1305:
192
0
      return TRUE;
193
0
    default:
194
      return FALSE;
195
0
  }
196
0
}