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 #ifndef GMSSL_X509_REQ_H 12 #define GMSSL_X509_REQ_H 13 14 15 #include <time.h> 16 #include <string.h> 17 #include <stdint.h> 18 #include <stdlib.h> 19 #include <gmssl/sm2.h> 20 #include <gmssl/oid.h> 21 #include <gmssl/asn1.h> 22 #include <gmssl/x509.h> 23 24 #ifdef __cplusplus 25 extern "C" { 26 #endif 27 28 /* 29 X509 REQ Public API 30 31 x509_req_sign 32 x509_req_verify 33 x509_req_get_details 34 x509_req_print 35 x509_req_to_pem 36 x509_req_from_pem 37 */ 38 39 40 /* 41 from RFC 2986 42 43 CertificationRequestInfo ::= SEQUENCE { 44 version INTEGER { v1(0) }, 45 subject Name, 46 subjectPKInfo SubjectPublicKeyInfo, 47 attributes [0] IMPLICIT SET OF Attribute } 48 */ 49 int x509_request_info_to_der(int version, const uint8_t *subject, size_t subject_len, 50 const SM2_KEY *subject_public_key, const uint8_t *attrs, size_t attrs_len, 51 uint8_t **out, size_t *outlen); 52 int x509_request_info_from_der(int *version, const uint8_t **subject, size_t *subject_len, 53 SM2_KEY *subject_public_key, const uint8_t **attrs, size_t *attrs_len, 54 const uint8_t **in, size_t *inlen); 55 int x509_request_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); 56 57 /* 58 CertificationRequest ::= SEQUENCE { 59 certificationRequestInfo CertificationRequestInfo, 60 signatureAlgorithm AlgorithmIdentifier, 61 signature BIT STRING } 62 */ 63 int x509_request_to_der( 64 int version, 65 const uint8_t *subject, size_t subject_len, 66 const SM2_KEY *subject_public_key, 67 const uint8_t *attrs, size_t attrs_len, 68 int signature_algor, 69 const uint8_t *sig, size_t siglen, 70 uint8_t **out, size_t *outlen); 71 int x509_request_from_der( 72 int *version, 73 const uint8_t **subject, size_t *subject_len, 74 SM2_KEY *subject_public_key, 75 const uint8_t **attrs, size_t *attrs_len, 76 int *signature_algor, 77 const uint8_t **sig, size_t *siglen, 78 const uint8_t **in, size_t *inlen); 79 int x509_request_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); 80 81 int x509_req_sign(uint8_t *req, size_t *reqlen, size_t maxlen, 82 int version, 83 const uint8_t *subject, size_t subject_len, 84 const SM2_KEY *subject_public_key, 85 const uint8_t *attrs, size_t attrs_len, 86 int signature_algor, 87 const SM2_KEY *sign_key, const char *signer_id, size_t signer_id_len); 88 int x509_req_verify(const uint8_t *req, size_t reqlen, 89 const SM2_KEY *sign_pubkey, const char *signer_id, size_t signer_id_len); 90 int x509_req_get_details(const uint8_t *req, size_t reqlen, 91 int *verison, 92 const uint8_t **subject, size_t *subject_len, 93 SM2_KEY *subject_public_key, 94 const uint8_t **attributes, size_t *attributes_len, 95 int *signature_algor, 96 const uint8_t **signature, size_t *signature_len); 97 int x509_req_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *req, size_t reqlen); 98 int x509_req_to_pem(const uint8_t *req, size_t reqlen, FILE *fp); 99 int x509_req_from_pem(uint8_t *req, size_t *reqlen, size_t maxlen, FILE *fp); 100 101 102 #ifdef __cplusplus 103 } 104 #endif 105 #endif 106