• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2014-2022 The GmSSL Project. All Rights Reserved.
3  *
4  *  Licensed under the Apache License, Version 2.0 (the License); you may
5  *  not use this file except in compliance with the License.
6  *
7  *  http://www.apache.org/licenses/LICENSE-2.0
8  */
9 
10 
11 #include <stdio.h>
12 #include <string.h>
13 #include <stdlib.h>
14 #include <gmssl/oid.h>
15 #include <gmssl/x509_alg.h>
16 #include <gmssl/x509_oid.h>
17 #include <gmssl/x509_req.h>
18 #include <gmssl/x509.h>
19 #include <gmssl/rand.h>
20 #include <gmssl/error.h>
21 
22 
test_x509_request_info(void)23 static int test_x509_request_info(void)
24 {
25 	uint8_t subject[256];
26 	size_t subject_len;
27 	SM2_KEY sm2_key;
28 
29 	uint8_t buf[256];
30 	uint8_t *p = buf;
31 	const uint8_t *cp = buf;
32 	size_t len = 0;
33 	const uint8_t *d;
34 	size_t dlen;
35 
36 	int version;
37 	const uint8_t *subj;
38 	size_t subj_len;
39 	SM2_KEY pub_key;
40 	const uint8_t *attrs;
41 	size_t attrs_len;
42 
43 	if (sm2_key_generate(&sm2_key) != 1
44 		|| x509_name_set(subject, &subject_len, sizeof(subject), "CN", "Beijing", "Haidian", "PKU", "CS", "CA") != 1
45 		|| x509_request_info_to_der(X509_version_v1, subject, subject_len, &sm2_key, NULL, 0, &p, &len) != 1
46 		|| asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
47 		|| asn1_length_is_zero(len) != 1) {
48 		error_print();
49 		return -1;
50 	}
51 	x509_request_info_print(stderr, 0, 0, "CertificationRequestInfo", d, dlen);
52 
53 	p = buf;
54 	cp = buf;
55 	len = 0;
56 
57 	if (x509_request_info_to_der(X509_version_v1, subject, subject_len, &sm2_key, NULL, 0, &p, &len) != 1
58 		|| x509_request_info_from_der(&version, &subj, &subj_len, &pub_key, &attrs, &attrs_len, &cp, &len) != 1
59 		|| asn1_length_is_zero(len) != 1) {
60 		error_print();
61 		return -1;
62 	}
63 	format_print(stderr, 0, 0, "CertificationRequestInfo\n");
64 	format_print(stderr, 0, 4, "version: %d\n", version);
65 	x509_name_print(stderr, 0, 4, "subject", subj, subj_len);
66 	sm2_public_key_print(stderr, 0, 4, "publicKey", &pub_key);
67 	format_bytes(stderr, 0, 4, "attributes", attrs, attrs_len);
68 
69 	printf("%s() ok\n", __FUNCTION__);
70 	return 1;
71 }
72 
test_x509_request(void)73 static int test_x509_request(void)
74 {
75 	uint8_t subject[256];
76 	size_t subject_len;
77 	SM2_KEY sm2_key;
78 	uint8_t signature[128] = { 0x01, 0x02 };
79 
80 	uint8_t buf[512];
81 	uint8_t *p = buf;
82 	const uint8_t *cp = buf;
83 	size_t len = 0;
84 	const uint8_t *d;
85 	size_t dlen;
86 
87 	int version;
88 	const uint8_t *subj;
89 	size_t subj_len;
90 	SM2_KEY pub_key;
91 	const uint8_t *attrs;
92 	size_t attrs_len;
93 	int sig_alg;
94 	const uint8_t *sig;
95 	size_t siglen;
96 
97 	if (sm2_key_generate(&sm2_key) != 1
98 		|| x509_name_set(subject, &subject_len, sizeof(subject), "CN", "Beijing", "Haidian", "PKU", "CS", "CA") != 1
99 		|| x509_request_to_der(X509_version_v1, subject, subject_len, &sm2_key, NULL, 0,
100 			OID_sm2sign_with_sm3, signature, sizeof(signature), &p, &len) != 1
101 		|| asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
102 		|| asn1_length_is_zero(len) != 1) {
103 		error_print();
104 		return -1;
105 	}
106 	x509_request_print(stderr, 0, 0, "CertificationRequest", d, dlen);
107 
108 	p = buf;
109 	cp = buf;
110 	len = 0;
111 
112 	if (x509_request_to_der(X509_version_v1, subject, subject_len, &sm2_key, NULL, 0,
113 			OID_sm2sign_with_sm3, signature, sizeof(signature), &p, &len) != 1
114 		|| x509_request_from_der(&version, &subj, &subj_len, &pub_key, &attrs, &attrs_len,
115 			&sig_alg, &sig, &siglen, &cp, &len) != 1
116 		|| asn1_length_is_zero(len) != 1) {
117 		error_print();
118 		return -1;
119 	}
120 	format_print(stderr, 0, 0, "CertificationRequest\n");
121 	format_print(stderr, 0, 4, "version: %d\n", version);
122 	x509_name_print(stderr, 0, 4, "subject", subj, subj_len);
123 	sm2_public_key_print(stderr, 0, 4, "publicKey", &pub_key);
124 	format_bytes(stderr, 0, 4, "attributes", attrs, attrs_len);
125 	format_print(stderr, 0, 4, "signatureAlgor: %s\n", x509_signature_algor_name(sig_alg));
126 	format_bytes(stderr, 0, 4, "signature", sig, siglen);
127 
128 	printf("%s() ok\n", __FUNCTION__);
129 	return 1;
130 }
131 
test_x509_req(void)132 static int test_x509_req(void)
133 {
134 	uint8_t subject[256];
135 	size_t subject_len;
136 	SM2_KEY sm2_key;
137 
138 	uint8_t req[512];
139 	size_t reqlen = 0;
140 
141 	int version;
142 	const uint8_t *subj;
143 	size_t subj_len;
144 	SM2_KEY pub_key;
145 	const uint8_t *attrs;
146 	size_t attrs_len;
147 
148 	if (sm2_key_generate(&sm2_key) != 1
149 		|| x509_name_set(subject, &subject_len, sizeof(subject), "CN", "Beijing", "Haidian", "PKU", "CS", "CA") != 1
150 		|| x509_req_sign(req, &reqlen, sizeof(req),
151 		X509_version_v1, subject, subject_len, &sm2_key, NULL, 0,
152 		OID_sm2sign_with_sm3, &sm2_key, SM2_DEFAULT_ID, strlen(SM2_DEFAULT_ID)) != 1) {
153 		error_print();
154 		return -1;
155 	}
156 	x509_req_print(stderr, 0, 0, "CertificationRequest", req, reqlen);
157 
158 
159 
160 	FILE *fp;
161 
162 	if ((fp = fopen("req.pem", "w")) == NULL) {
163 		error_print();
164 		return -1;
165 	}
166 	if (x509_req_to_pem(req, reqlen, fp) != 1) {
167 		error_print();
168 		return -1;
169 	}
170 	fclose(fp);
171 	x509_req_to_pem(req, reqlen, stderr);
172 
173 
174 	memset(req, 0, sizeof(req));
175 
176 	if ((fp = fopen("req.pem", "r")) == NULL) {
177 		error_print();
178 		return -1;
179 	}
180 	if (x509_req_from_pem(req, &reqlen, sizeof(req), fp) != 1) {
181 		error_print();
182 		return -1;
183 	}
184 	if (x509_req_verify(req, reqlen, &sm2_key, SM2_DEFAULT_ID, strlen(SM2_DEFAULT_ID)) != 1) {
185 		error_print();
186 		return -1;
187 	}
188 	format_print(stderr, 0, 0, "x509_req_verify() success\n");
189 
190 
191 
192 
193 
194 	printf("%s() ok\n", __FUNCTION__);
195 	return 1;
196 }
197 
198 
199 
200 
201 
202 
203 
204 
205 
206 
main(void)207 int main(void)
208 {
209 	if (test_x509_request_info() != 1) goto err;
210 	if (test_x509_request() != 1) goto err;
211 	if (test_x509_req() != 1) goto err;
212 	printf("%s all tests passed!\n", __FILE__);
213 	return 0;
214 err:
215 	error_print();
216 	return 1;
217 }
218 
219