Skip to content

Commit debbfa1

Browse files
committed
Error codes rebuild
1 parent 2810b8e commit debbfa1

File tree

6 files changed

+183
-288
lines changed

6 files changed

+183
-288
lines changed

e_gost_err.c

+112-171
Original file line numberDiff line numberDiff line change
@@ -1,207 +1,148 @@
1-
/* e_gost_err.c */
2-
/* ====================================================================
3-
* Copyright (c) 1999-2016 The OpenSSL Project. All rights reserved.
4-
*
5-
* Redistribution and use in source and binary forms, with or without
6-
* modification, are permitted provided that the following conditions
7-
* are met:
8-
*
9-
* 1. Redistributions of source code must retain the above copyright
10-
* notice, this list of conditions and the following disclaimer.
11-
*
12-
* 2. Redistributions in binary form must reproduce the above copyright
13-
* notice, this list of conditions and the following disclaimer in
14-
* the documentation and/or other materials provided with the
15-
* distribution.
16-
*
17-
* 3. All advertising materials mentioning features or use of this
18-
* software must display the following acknowledgment:
19-
* "This product includes software developed by the OpenSSL Project
20-
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
21-
*
22-
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23-
* endorse or promote products derived from this software without
24-
* prior written permission. For written permission, please contact
25-
26-
*
27-
* 5. Products derived from this software may not be called "OpenSSL"
28-
* nor may "OpenSSL" appear in their names without prior written
29-
* permission of the OpenSSL Project.
30-
*
31-
* 6. Redistributions of any form whatsoever must retain the following
32-
* acknowledgment:
33-
* "This product includes software developed by the OpenSSL Project
34-
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
35-
*
36-
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37-
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38-
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39-
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
40-
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41-
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42-
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43-
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44-
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45-
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46-
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47-
* OF THE POSSIBILITY OF SUCH DAMAGE.
48-
* ====================================================================
49-
*
50-
* This product includes cryptographic software written by Eric Young
51-
* ([email protected]). This product includes software written by Tim
52-
* Hudson ([email protected]).
53-
*
54-
*/
55-
561
/*
57-
* NOTE: this file was auto generated by the mkerr.pl script: any changes
58-
* made to it will be overwritten when the script next updates this file,
59-
* only reason strings will be preserved.
2+
* Generated by util/mkerr.pl DO NOT EDIT
3+
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
4+
*
5+
* Licensed under the OpenSSL license (the "License"). You may not use
6+
* this file except in compliance with the License. You can obtain a copy
7+
* in the file LICENSE in the source distribution or at
8+
* https://www.openssl.org/source/license.html
609
*/
6110

62-
#include <stdio.h>
6311
#include <openssl/err.h>
6412
#include "e_gost_err.h"
6513

66-
/* BEGIN ERROR CODES */
6714
#ifndef OPENSSL_NO_ERR
6815

69-
# define ERR_FUNC(func) ERR_PACK(0,func,0)
70-
# define ERR_REASON(reason) ERR_PACK(0,0,reason)
71-
7216
static ERR_STRING_DATA GOST_str_functs[] = {
73-
{ERR_FUNC(GOST_F_DECODE_GOST_ALGOR_PARAMS), "DECODE_GOST_ALGOR_PARAMS"},
74-
{ERR_FUNC(GOST_F_ENCODE_GOST_ALGOR_PARAMS), "ENCODE_GOST_ALGOR_PARAMS"},
75-
{ERR_FUNC(GOST_F_FILL_GOST_EC_PARAMS), "FILL_GOST_EC_PARAMS"},
76-
{ERR_FUNC(GOST_F_GET_ENCRYPTION_PARAMS), "GET_ENCRYPTION_PARAMS"},
77-
{ERR_FUNC(GOST_F_GOST89_GET_ASN1_PARAMETERS),
78-
"GOST89_GET_ASN1_PARAMETERS"},
79-
{ERR_FUNC(GOST_F_GOST89_SET_ASN1_PARAMETERS),
80-
"GOST89_SET_ASN1_PARAMETERS"},
81-
{ERR_FUNC(GOST_F_GOST_CIPHER_CTL), "GOST_CIPHER_CTL"},
82-
{ERR_FUNC(GOST_F_GOST_EC_COMPUTE_PUBLIC), "GOST_EC_COMPUTE_PUBLIC"},
83-
{ERR_FUNC(GOST_F_GOST_EC_KEYGEN), "GOST_EC_KEYGEN"},
84-
{ERR_FUNC(GOST_F_GOST_EC_SIGN), "GOST_EC_SIGN"},
85-
{ERR_FUNC(GOST_F_GOST_EC_VERIFY), "GOST_EC_VERIFY"},
86-
{ERR_FUNC(GOST_F_GOST_IMIT_CTRL), "GOST_IMIT_CTRL"},
87-
{ERR_FUNC(GOST_F_GOST_IMIT_FINAL), "GOST_IMIT_FINAL"},
88-
{ERR_FUNC(GOST_F_GOST_IMIT_UPDATE), "GOST_IMIT_UPDATE"},
89-
{ERR_FUNC(GOST_F_PARAM_COPY_GOST_EC), "PARAM_COPY_GOST_EC"},
90-
{ERR_FUNC(GOST_F_PKEY_GOST01_PARAMGEN), "PKEY_GOST01_PARAMGEN"},
91-
{ERR_FUNC(GOST_F_PKEY_GOST12_PARAMGEN), "PKEY_GOST12_PARAMGEN"},
92-
{ERR_FUNC(GOST_F_PKEY_GOST_CTRL), "PKEY_GOST_CTRL"},
93-
{ERR_FUNC(GOST_F_PKEY_GOST_ECCP_DECRYPT), "PKEY_GOST_ECCP_DECRYPT"},
94-
{ERR_FUNC(GOST_F_PKEY_GOST_ECCP_ENCRYPT), "PKEY_GOST_ECCP_ENCRYPT"},
95-
{ERR_FUNC(GOST_F_PKEY_GOST_EC_CTRL_STR_256), "PKEY_GOST_EC_CTRL_STR_256"},
96-
{ERR_FUNC(GOST_F_PKEY_GOST_EC_CTRL_STR_512), "PKEY_GOST_EC_CTRL_STR_512"},
97-
{ERR_FUNC(GOST_F_PKEY_GOST_EC_DERIVE), "PKEY_GOST_EC_DERIVE"},
98-
{ERR_FUNC(GOST_F_PKEY_GOST_MAC_CTRL), "PKEY_GOST_MAC_CTRL"},
99-
{ERR_FUNC(GOST_F_PKEY_GOST_MAC_CTRL_STR), "PKEY_GOST_MAC_CTRL_STR"},
100-
{ERR_FUNC(GOST_F_PKEY_GOST_MAC_KEYGEN), "PKEY_GOST_MAC_KEYGEN"},
101-
{ERR_FUNC(GOST_F_PKEY_GOST_MAC_SIGNCTX_INIT),
102-
"PKEY_GOST_MAC_SIGNCTX_INIT"},
103-
{ERR_FUNC(GOST_F_PRINT_GOST_EC_PUB), "PRINT_GOST_EC_PUB"},
104-
{ERR_FUNC(GOST_F_PRIV_DECODE_GOST), "PRIV_DECODE_GOST"},
105-
{ERR_FUNC(GOST_F_PUB_DECODE_GOST_EC), "PUB_DECODE_GOST_EC"},
106-
{ERR_FUNC(GOST_F_PUB_ENCODE_GOST_EC), "PUB_ENCODE_GOST_EC"},
107-
{ERR_FUNC(GOST_F_UNPACK_CP_SIGNATURE), "UNPACK_CP_SIGNATURE"},
108-
{ERR_FUNC(GOST_F_VKO_COMPUTE_KEY), "VKO_COMPUTE_KEY"},
17+
{ERR_PACK(0, GOST_F_DECODE_GOST_ALGOR_PARAMS, 0),
18+
"decode_gost_algor_params"},
19+
{ERR_PACK(0, GOST_F_ENCODE_GOST_ALGOR_PARAMS, 0),
20+
"encode_gost_algor_params"},
21+
{ERR_PACK(0, GOST_F_FILL_GOST_EC_PARAMS, 0), "fill_GOST_EC_params"},
22+
{ERR_PACK(0, GOST_F_GET_ENCRYPTION_PARAMS, 0), "get_encryption_params"},
23+
{ERR_PACK(0, GOST_F_GOST89_GET_ASN1_PARAMETERS, 0),
24+
"gost89_get_asn1_parameters"},
25+
{ERR_PACK(0, GOST_F_GOST89_SET_ASN1_PARAMETERS, 0),
26+
"gost89_set_asn1_parameters"},
27+
{ERR_PACK(0, GOST_F_GOST_CIPHER_CTL, 0), "gost_cipher_ctl"},
28+
{ERR_PACK(0, GOST_F_GOST_EC_COMPUTE_PUBLIC, 0), "gost_ec_compute_public"},
29+
{ERR_PACK(0, GOST_F_GOST_EC_KEYGEN, 0), "gost_ec_keygen"},
30+
{ERR_PACK(0, GOST_F_GOST_EC_SIGN, 0), "gost_ec_sign"},
31+
{ERR_PACK(0, GOST_F_GOST_EC_VERIFY, 0), "gost_ec_verify"},
32+
{ERR_PACK(0, GOST_F_GOST_GRASSHOPPER_CIPHER_CTL, 0),
33+
"gost_grasshopper_cipher_ctl"},
34+
{ERR_PACK(0, GOST_F_GOST_GRASSHOPPER_SET_ASN1_PARAMETERS, 0),
35+
"gost_grasshopper_set_asn1_parameters"},
36+
{ERR_PACK(0, GOST_F_GOST_IMIT_CTRL, 0), "gost_imit_ctrl"},
37+
{ERR_PACK(0, GOST_F_GOST_IMIT_FINAL, 0), "gost_imit_final"},
38+
{ERR_PACK(0, GOST_F_GOST_IMIT_UPDATE, 0), "gost_imit_update"},
39+
{ERR_PACK(0, GOST_F_MAGMA_IMIT_FINAL, 0), "magma_imit_final"},
40+
{ERR_PACK(0, GOST_F_MAGMA_IMIT_UPDATE, 0), "magma_imit_update"},
41+
{ERR_PACK(0, GOST_F_PARAM_COPY_GOST_EC, 0), "param_copy_gost_ec"},
42+
{ERR_PACK(0, GOST_F_PKEY_GOST2001_PARAMGEN, 0), "pkey_gost2001_paramgen"},
43+
{ERR_PACK(0, GOST_F_PKEY_GOST2012_PARAMGEN, 0), "pkey_gost2012_paramgen"},
44+
{ERR_PACK(0, GOST_F_PKEY_GOST_CTRL, 0), "pkey_gost_ctrl"},
45+
{ERR_PACK(0, GOST_F_PKEY_GOST_ECCP_DECRYPT, 0), "pkey_GOST_ECcp_decrypt"},
46+
{ERR_PACK(0, GOST_F_PKEY_GOST_ECCP_ENCRYPT, 0), "pkey_GOST_ECcp_encrypt"},
47+
{ERR_PACK(0, GOST_F_PKEY_GOST_EC_CTRL_STR_256, 0),
48+
"pkey_gost_ec_ctrl_str_256"},
49+
{ERR_PACK(0, GOST_F_PKEY_GOST_EC_CTRL_STR_512, 0),
50+
"pkey_gost_ec_ctrl_str_512"},
51+
{ERR_PACK(0, GOST_F_PKEY_GOST_EC_DERIVE, 0), "pkey_gost_ec_derive"},
52+
{ERR_PACK(0, GOST_F_PKEY_GOST_MAC_CTRL, 0), "pkey_gost_mac_ctrl"},
53+
{ERR_PACK(0, GOST_F_PKEY_GOST_MAC_CTRL_STR, 0), "pkey_gost_mac_ctrl_str"},
54+
{ERR_PACK(0, GOST_F_PKEY_GOST_MAC_KEYGEN_BASE, 0),
55+
"pkey_gost_mac_keygen_base"},
56+
{ERR_PACK(0, GOST_F_PKEY_GOST_MAC_SIGNCTX_INIT, 0),
57+
"pkey_gost_mac_signctx_init"},
58+
{ERR_PACK(0, GOST_F_PRINT_GOST_EC_PUB, 0), "print_gost_ec_pub"},
59+
{ERR_PACK(0, GOST_F_PRIV_DECODE_GOST, 0), "priv_decode_gost"},
60+
{ERR_PACK(0, GOST_F_PUB_DECODE_GOST_EC, 0), "pub_decode_gost_ec"},
61+
{ERR_PACK(0, GOST_F_PUB_ENCODE_GOST_EC, 0), "pub_encode_gost_ec"},
62+
{ERR_PACK(0, GOST_F_UNPACK_CP_SIGNATURE, 0), "unpack_cp_signature"},
63+
{ERR_PACK(0, GOST_F_VKO_COMPUTE_KEY, 0), "VKO_compute_key"},
10964
{0, NULL}
11065
};
11166

11267
static ERR_STRING_DATA GOST_str_reasons[] = {
113-
{ERR_REASON(GOST_R_BAD_KEY_PARAMETERS_FORMAT),
114-
"bad key parameters format"},
115-
{ERR_REASON(GOST_R_BAD_PKEY_PARAMETERS_FORMAT),
116-
"bad pkey parameters format"},
117-
{ERR_REASON(GOST_R_CANNOT_PACK_EPHEMERAL_KEY),
118-
"cannot pack ephemeral key"},
119-
{ERR_REASON(GOST_R_CTRL_CALL_FAILED), "ctrl call failed"},
120-
{ERR_REASON(GOST_R_ERROR_COMPUTING_SHARED_KEY),
121-
"error computing shared key"},
122-
{ERR_REASON(GOST_R_ERROR_PARSING_KEY_TRANSPORT_INFO),
123-
"error parsing key transport info"},
124-
{ERR_REASON(GOST_R_ERROR_POINT_MUL), "error point mul"},
125-
{ERR_REASON(GOST_R_INCOMPATIBLE_ALGORITHMS), "incompatible algorithms"},
126-
{ERR_REASON(GOST_R_INCOMPATIBLE_PEER_KEY), "incompatible peer key"},
127-
{ERR_REASON(GOST_R_INVALID_CIPHER_PARAMS), "invalid cipher params"},
128-
{ERR_REASON(GOST_R_INVALID_CIPHER_PARAM_OID), "invalid cipher param oid"},
129-
{ERR_REASON(GOST_R_INVALID_DIGEST_TYPE), "invalid digest type"},
130-
{ERR_REASON(GOST_R_INVALID_IV_LENGTH), "invalid iv length"},
131-
{ERR_REASON(GOST_R_INVALID_MAC_KEY_LENGTH), "invalid mac key length"},
132-
{ERR_REASON(GOST_R_INVALID_MAC_KEY_SIZE), "invalid mac key size"},
133-
{ERR_REASON(GOST_R_INVALID_MAC_PARAMS), "invalid mac params"},
134-
{ERR_REASON(GOST_R_INVALID_MAC_SIZE), "invalid mac size"},
135-
{ERR_REASON(GOST_R_INVALID_PARAMSET), "invalid paramset"},
136-
{ERR_REASON(GOST_R_KEY_IS_NOT_INITIALIZED), "key is not initialized"},
137-
{ERR_REASON(GOST_R_KEY_PARAMETERS_MISSING), "key parameters missing"},
138-
{ERR_REASON(GOST_R_MAC_KEY_NOT_SET), "mac key not set"},
139-
{ERR_REASON(GOST_R_NO_PARAMETERS_SET), "no parameters set"},
140-
{ERR_REASON(GOST_R_NO_PEER_KEY), "no peer key"},
141-
{ERR_REASON(GOST_R_NO_PRIVATE_PART_OF_NON_EPHEMERAL_KEYPAIR),
142-
"no private part of non ephemeral keypair"},
143-
{ERR_REASON(GOST_R_PUBLIC_KEY_UNDEFINED), "public key undefined"},
144-
{ERR_REASON(GOST_R_RNG_ERROR), "rng error"},
145-
{ERR_REASON(GOST_R_SIGNATURE_MISMATCH), "signature mismatch"},
146-
{ERR_REASON(GOST_R_SIGNATURE_PARTS_GREATER_THAN_Q),
147-
"signature parts greater than q"},
148-
{ERR_REASON(GOST_R_UKM_NOT_SET), "ukm not set"},
149-
{ERR_REASON(GOST_R_UNSUPPORTED_CIPHER_CTL_COMMAND),
150-
"unsupported cipher ctl command"},
151-
{ERR_REASON(GOST_R_UNSUPPORTED_PARAMETER_SET),
152-
"unsupported parameter set"},
68+
{ERR_PACK(0, 0, GOST_R_BAD_KEY_PARAMETERS_FORMAT),
69+
"bad key parameters format"},
70+
{ERR_PACK(0, 0, GOST_R_BAD_PKEY_PARAMETERS_FORMAT),
71+
"bad pkey parameters format"},
72+
{ERR_PACK(0, 0, GOST_R_CANNOT_PACK_EPHEMERAL_KEY),
73+
"cannot pack ephemeral key"},
74+
{ERR_PACK(0, 0, GOST_R_CTRL_CALL_FAILED), "ctrl call failed"},
75+
{ERR_PACK(0, 0, GOST_R_ERROR_COMPUTING_SHARED_KEY),
76+
"error computing shared key"},
77+
{ERR_PACK(0, 0, GOST_R_ERROR_PARSING_KEY_TRANSPORT_INFO),
78+
"error parsing key transport info"},
79+
{ERR_PACK(0, 0, GOST_R_ERROR_POINT_MUL), "error point mul"},
80+
{ERR_PACK(0, 0, GOST_R_INCOMPATIBLE_ALGORITHMS), "incompatible algorithms"},
81+
{ERR_PACK(0, 0, GOST_R_INCOMPATIBLE_PEER_KEY), "incompatible peer key"},
82+
{ERR_PACK(0, 0, GOST_R_INVALID_CIPHER_PARAMS), "invalid cipher params"},
83+
{ERR_PACK(0, 0, GOST_R_INVALID_CIPHER_PARAM_OID),
84+
"invalid cipher param oid"},
85+
{ERR_PACK(0, 0, GOST_R_INVALID_DIGEST_TYPE), "invalid digest type"},
86+
{ERR_PACK(0, 0, GOST_R_INVALID_IV_LENGTH), "invalid iv length"},
87+
{ERR_PACK(0, 0, GOST_R_INVALID_MAC_KEY_LENGTH), "invalid mac key length"},
88+
{ERR_PACK(0, 0, GOST_R_INVALID_MAC_KEY_SIZE), "invalid mac key size"},
89+
{ERR_PACK(0, 0, GOST_R_INVALID_MAC_PARAMS), "invalid mac params"},
90+
{ERR_PACK(0, 0, GOST_R_INVALID_MAC_SIZE), "invalid mac size"},
91+
{ERR_PACK(0, 0, GOST_R_INVALID_PARAMSET), "invalid paramset"},
92+
{ERR_PACK(0, 0, GOST_R_KEY_IS_NOT_INITIALIZED), "key is not initialized"},
93+
{ERR_PACK(0, 0, GOST_R_KEY_PARAMETERS_MISSING), "key parameters missing"},
94+
{ERR_PACK(0, 0, GOST_R_MAC_KEY_NOT_SET), "mac key not set"},
95+
{ERR_PACK(0, 0, GOST_R_NO_PARAMETERS_SET), "no parameters set"},
96+
{ERR_PACK(0, 0, GOST_R_NO_PEER_KEY), "no peer key"},
97+
{ERR_PACK(0, 0, GOST_R_NO_PRIVATE_PART_OF_NON_EPHEMERAL_KEYPAIR),
98+
"no private part of non ephemeral keypair"},
99+
{ERR_PACK(0, 0, GOST_R_PUBLIC_KEY_UNDEFINED), "public key undefined"},
100+
{ERR_PACK(0, 0, GOST_R_RNG_ERROR), "rng error"},
101+
{ERR_PACK(0, 0, GOST_R_SIGNATURE_MISMATCH), "signature mismatch"},
102+
{ERR_PACK(0, 0, GOST_R_SIGNATURE_PARTS_GREATER_THAN_Q),
103+
"signature parts greater than q"},
104+
{ERR_PACK(0, 0, GOST_R_UKM_NOT_SET), "ukm not set"},
105+
{ERR_PACK(0, 0, GOST_R_UNSUPPORTED_CIPHER_CTL_COMMAND),
106+
"unsupported cipher ctl command"},
107+
{ERR_PACK(0, 0, GOST_R_UNSUPPORTED_PARAMETER_SET),
108+
"unsupported parameter set"},
153109
{0, NULL}
154110
};
155111

156112
#endif
157113

158-
#ifdef GOST_LIB_NAME
159-
static ERR_STRING_DATA GOST_lib_name[] = {
160-
{0, GOST_LIB_NAME},
161-
{0, NULL}
162-
};
163-
#endif
114+
static int lib_code = 0;
115+
static int error_loaded = 0;
164116

165-
static int GOST_lib_error_code = 0;
166-
static int GOST_error_init = 1;
167-
168-
void ERR_load_GOST_strings(void)
117+
int ERR_load_GOST_strings(void)
169118
{
170-
if (GOST_lib_error_code == 0)
171-
GOST_lib_error_code = ERR_get_next_error_library();
119+
if (lib_code == 0)
120+
lib_code = ERR_get_next_error_library();
172121

173-
if (GOST_error_init) {
174-
GOST_error_init = 0;
122+
if (!error_loaded) {
175123
#ifndef OPENSSL_NO_ERR
176-
ERR_load_strings(GOST_lib_error_code, GOST_str_functs);
177-
ERR_load_strings(GOST_lib_error_code, GOST_str_reasons);
178-
#endif
179-
180-
#ifdef GOST_LIB_NAME
181-
GOST_lib_name->error = ERR_PACK(GOST_lib_error_code, 0, 0);
182-
ERR_load_strings(0, GOST_lib_name);
124+
ERR_load_strings(lib_code, GOST_str_functs);
125+
ERR_load_strings(lib_code, GOST_str_reasons);
183126
#endif
127+
error_loaded = 1;
184128
}
129+
return 1;
185130
}
186131

187132
void ERR_unload_GOST_strings(void)
188133
{
189-
if (GOST_error_init == 0) {
134+
if (error_loaded) {
190135
#ifndef OPENSSL_NO_ERR
191-
ERR_unload_strings(GOST_lib_error_code, GOST_str_functs);
192-
ERR_unload_strings(GOST_lib_error_code, GOST_str_reasons);
193-
#endif
194-
195-
#ifdef GOST_LIB_NAME
196-
ERR_unload_strings(0, GOST_lib_name);
136+
ERR_unload_strings(lib_code, GOST_str_functs);
137+
ERR_unload_strings(lib_code, GOST_str_reasons);
197138
#endif
198-
GOST_error_init = 1;
139+
error_loaded = 0;
199140
}
200141
}
201142

202143
void ERR_GOST_error(int function, int reason, char *file, int line)
203144
{
204-
if (GOST_lib_error_code == 0)
205-
GOST_lib_error_code = ERR_get_next_error_library();
206-
ERR_PUT_error(GOST_lib_error_code, function, reason, file, line);
145+
if (lib_code == 0)
146+
lib_code = ERR_get_next_error_library();
147+
ERR_PUT_error(lib_code, function, reason, file, line);
207148
}

0 commit comments

Comments
 (0)