diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ac9b1a6..31f9dad0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,7 +71,7 @@ option(ENABLE_SDF "Enable SDF module" ON) option(ENABLE_ASM_UNDERSCORE_PREFIX "Add prefix `_` to assembly symbols" ON) -option(ENABLE_TLS_DEBUG "Enable TLS and TLCP print debug message" OFF) +option(ENABLE_TLS_DEBUG "Enable TLS and TLCP print debug message" ON) option (ENABLE_SM2_ENC_PRE_COMPUTE "Enable SM2 encryption precomputing" ON) @@ -131,10 +131,8 @@ set(src src/tls_trace.c src/tlcp.c src/tls12.c - src/tls12_handshake.c src/tls13.c src/file.c - src/file.c ) set(tools @@ -220,6 +218,7 @@ set(tests x509_ext x509_req x509_crl + x509_key cms tls tls13 @@ -427,7 +426,7 @@ endif() if (ENABLE_SECP256R1) message(STATUS "ENABLE_SECP256R1 is ON") add_definitions(-DENABLE_SECP256R1) - list(APPEND src src/secp256r1.c src/secp256r1_key.c src/ecdsa.c) + list(APPEND src src/secp256r1.c src/secp256r1_key.c src/ecdsa.c src/ecdh.c) list(APPEND tests secp256r1 secp256r1_key ecdsa) endif() diff --git a/include/gmssl/lms.h b/include/gmssl/lms.h index 9ee48c69..37a19b1b 100644 --- a/include/gmssl/lms.h +++ b/include/gmssl/lms.h @@ -226,7 +226,7 @@ typedef struct { LMS_PUBLIC_KEY lms_public_key; } HSS_PUBLIC_KEY; -#define HSS_PUBLIC_KEY_SIZE (4 + LMS_PUBLIC_KEY_SIZE) +#define HSS_PUBLIC_KEY_SIZE (4 + LMS_PUBLIC_KEY_SIZE) // = 60 bytes typedef struct HSS_KEY_st HSS_KEY; diff --git a/include/gmssl/secp256r1_key.h b/include/gmssl/secp256r1_key.h index b8d2dfca..dbf853d3 100644 --- a/include/gmssl/secp256r1_key.h +++ b/include/gmssl/secp256r1_key.h @@ -49,6 +49,12 @@ int secp256r1_private_key_info_decrypt_from_der(SECP256R1_KEY *ec_key, const uint8_t **attrs, size_t *attrs_len, const char *pass, const uint8_t **in, size_t *inlen); +int secp256r1_private_key_info_encrypt_to_pem(const SECP256R1_KEY *key, const char *pass, FILE *fp); +int secp256r1_private_key_info_decrypt_from_pem(SECP256R1_KEY *key, const char *pass, FILE *fp); + +int secp256r1_do_ecdh(const SECP256R1_KEY *key, const SECP256R1_KEY *pub, uint8_t out[32]); +int secp256r1_ecdh(const SECP256R1_KEY *key, const uint8_t uncompressed_point[65], uint8_t out[32]); + #ifdef __cplusplus } diff --git a/include/gmssl/sm2.h b/include/gmssl/sm2.h index ed8a54e4..e2004cb2 100644 --- a/include/gmssl/sm2.h +++ b/include/gmssl/sm2.h @@ -249,9 +249,9 @@ enum { int sm2_do_encrypt_fixlen(const SM2_KEY *key, const uint8_t *in, size_t inlen, int point_size, SM2_CIPHERTEXT *out); int sm2_encrypt_fixlen(const SM2_KEY *key, const uint8_t *in, size_t inlen, int point_size, uint8_t *out, size_t *outlen); - -int sm2_do_ecdh(const SM2_KEY *key, const SM2_Z256_POINT *peer_public, SM2_Z256_POINT *out); -int sm2_ecdh(const SM2_KEY *key, const uint8_t *peer_public, size_t peer_public_len, uint8_t out[64]); +// ECDH in TLS, SECG SEC1, NIST SP800-56A +int sm2_do_ecdh(const SM2_KEY *key, const SM2_KEY *peer_key, uint8_t out[32]); +int sm2_ecdh(const SM2_KEY *key, const uint8_t uncompressed_point[65], uint8_t out[32]); typedef struct { diff --git a/include/gmssl/sphincs.h b/include/gmssl/sphincs.h index aa2a2df5..85c0b64b 100644 --- a/include/gmssl/sphincs.h +++ b/include/gmssl/sphincs.h @@ -314,7 +314,7 @@ typedef struct { sphincs_hash128_t root; } SPHINCS_PUBLIC_KEY; -#define SPHINCS_PUBLIC_KEY_SIZE sizeof(SPHINCS_PUBLIC_KEY) +#define SPHINCS_PUBLIC_KEY_SIZE sizeof(SPHINCS_PUBLIC_KEY) // = 32 bytes typedef struct { SPHINCS_PUBLIC_KEY public_key; @@ -356,7 +356,8 @@ typedef struct { SPHINCS_KEY key; } SPHINCS_SIGN_CTX; -int sphincs_sign_init_ex(SPHINCS_SIGN_CTX *ctx, const SPHINCS_KEY *key, int randomize); +// when optional_random is NULL, sphincs use public_key.seed, generate deterministic signature +int sphincs_sign_init_ex(SPHINCS_SIGN_CTX *ctx, const SPHINCS_KEY *key, const sphincs_hash128_t optional_random); int sphincs_sign_init(SPHINCS_SIGN_CTX *ctx, const SPHINCS_KEY *key); int sphincs_sign_prepare(SPHINCS_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); int sphincs_sign_update(SPHINCS_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); diff --git a/include/gmssl/tls.h b/include/gmssl/tls.h index fbbc7803..e63fd1f1 100644 --- a/include/gmssl/tls.h +++ b/include/gmssl/tls.h @@ -20,6 +20,7 @@ #include #include #include +#include #ifdef __cplusplus @@ -95,6 +96,8 @@ typedef enum { TLS_cipher_aes_128_ccm_sha256 = 0x1304, TLS_cipher_aes_128_ccm_8_sha256 = 0x1305, + TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256 = 0xc023, + TLS_cipher_empty_renegotiation_info_scsv = 0x00ff, } TLS_CIPHER_SUITE; @@ -269,7 +272,8 @@ typedef enum { TLS_curve_sm2p256v1 = 41, // GmSSLv2: 30 } TLS_NAMED_CURVE; -const char *tls_curve_name(int curve); +const char *tls_named_curve_name(int named_curve); +int tls_named_curve_oid(int named_curve); typedef enum { @@ -299,6 +303,7 @@ typedef enum { } TLS_SIGNATURE_SCHEME; const char *tls_signature_scheme_name(int scheme); +int tls_signature_scheme_match_cipher_suite(int sig_alg, int cipher_suite); typedef enum { @@ -605,6 +610,21 @@ typedef enum { TLS_client_verify_client_key_exchange = 7, } TLS_CLIENT_VERIFY_INDEX; + +/* +SM2验签要求首先提供Z值,Z值需要公钥 +而在客户端提供 client_certificate 之前,服务器都不知道客户端的公钥 +因此没有办法获得客户端的公钥 +直到客户端发出client_certificate之后,才能够启动验证 + +现在的实现缓冲了所有被签名的握手消息 + +由于除了ClientHello之外,其他所有的消息实际上都是服务器发出的 +因此服务器只需要缓存ClientHello即可 + +实际上只有SM2签名才需要这么复杂! +*/ + typedef struct { TLS_CLIENT_VERIFY_INDEX index; uint8_t *handshake[8]; // Record data only, no record header @@ -680,8 +700,10 @@ typedef struct { size_t cacertslen; uint8_t *certs; size_t certslen; - SM2_KEY signkey; - SM2_KEY kenckey; + + X509_KEY signkey; + X509_KEY kenckey; + int verify_depth; int quiet; @@ -704,9 +726,25 @@ void tls_ctx_cleanup(TLS_CTX *ctx); #define TLS_MAX_VERIFY_DEPTH 5 + +#define SSL_ERROR_WANT_READ -1001 // 是否考虑把这两个错误以0的方式返回去 +#define SSL_ERROR_WANT_WRITE -1002 // 同上 +#define SSL_ERROR_ZERO_RETURN -1003 +#define SSL_ERROR_SYSCALL -1004 + + +#define TLS_ERROR_RECV_AGAIN -1000 // SSL_ERROR_WANT_READ +#define TLS_ERROR_SEND_AGAIN -1001 // SSL_ERROR_WANT_WRITE +#define TLS_ERROR_TCP_CLOSED -1002 // SSL_ERROR_ZERO_RETURN +#define TLS_ERROR_SYSCALL -1003 // SSL_ERROR_SYSCALL + + + typedef struct { int protocol; int is_client; + + int cipher_suites[TLS_MAX_CIPHER_SUITES_COUNT]; size_t cipher_suites_cnt; tls_socket_t sock; @@ -716,6 +754,11 @@ typedef struct { uint8_t record[TLS_MAX_RECORD_SIZE]; + size_t record_offset; // offset of processed record + + int record_state; + + size_t recordlen; uint8_t databuf[TLS_MAX_RECORD_SIZE]; uint8_t *data; @@ -731,11 +774,10 @@ typedef struct { uint8_t ca_certs[2048]; size_t ca_certs_len; - SM2_KEY sign_key; - SM2_KEY kenc_key; + X509_KEY sign_key; + X509_KEY kenc_key; int verify_result; - uint8_t master_secret[48]; uint8_t key_block[96]; @@ -753,10 +795,38 @@ typedef struct { int quiet; + // handshake state for state machine int state; SM3_CTX sm3_ctx; SM2_SIGN_CTX sign_ctx; + TLS_CLIENT_VERIFY_CTX client_verify_ctx; + uint8_t client_random[32]; + uint8_t server_random[32]; + uint8_t server_exts[512]; // TODO + size_t server_exts_len; + + + // 在TLS中,密钥交换的密钥是不在证书中的? + uint16_t sig_alg; + + // TLS中客户端和服务器端可以使用不同的签名算法,但是最好是一致的 + // 这个算法是由cipher_suite和服务器证书决定的(其中是服务器AUTH算法) + // 但是客户端的签名算法不是由cipher_suite决定 + uint16_t server_sig_alg; + + + + uint16_t ecdh_named_curve; + + X509_KEY ecdh_key; + uint8_t peer_ecdh_point[65]; + size_t peer_ecdh_point_len; + + int client_certificate_verify; // 是否验证客户端证书 + + int verify_depth; // 这个可能没有被设置 + } TLS_CONNECT; diff --git a/include/gmssl/x509_key.h b/include/gmssl/x509_key.h index 1d7480c8..3e1958ef 100644 --- a/include/gmssl/x509_key.h +++ b/include/gmssl/x509_key.h @@ -19,11 +19,11 @@ #include #include #include -#include #include #include #include #include +#include #ifdef __cplusplus @@ -31,18 +31,6 @@ extern "C" { #endif -/* - Supported public key type OIDs - * OID_ec_public_key - * OID_rsa_encryption - * OID_lms_hashsig - * OID_hss_lms_hashsig - * OID_xmss_hashsig - * OID_xmssmt_hashsig - * OID_sphincs_hashsig - - -*/ typedef struct { int algor; int algor_param; @@ -55,67 +43,115 @@ typedef struct { SPHINCS_KEY sphincs_key; SECP256R1_KEY secp256r1_key; } u; + const char *signer_id; + size_t signer_idlen; } X509_KEY; - int x509_key_set_sm2_key(X509_KEY *x509_key, const SM2_KEY *sm2_key); -int x509_key_set_secp256r1_key(X509_KEY *x509_key, const SECP256R1_KEY *secp256r1_key); int x509_key_set_lms_key(X509_KEY *x509_key, const LMS_KEY *lms_key); int x509_key_set_hss_key(X509_KEY *x509_key, const HSS_KEY *hss_key); int x509_key_set_xmss_key(X509_KEY *x509_key, const XMSS_KEY *xmss_key); int x509_key_set_xmssmt_key(X509_KEY *x509_key, const XMSSMT_KEY *xmssmt_key); int x509_key_set_sphincs_key(X509_KEY *x509_key, const SPHINCS_KEY *sphincs_key); +int x509_key_set_secp256r1_key(X509_KEY *x509_key, const SECP256R1_KEY *secp256r1_key); +// hss_key_generate need lms_types[] as input, encode lms_types[] into (int)algor_param +int x509_algor_param_from_lms_types(int *algor_param, const int *lms_types, size_t num); +int x509_algor_param_to_lms_types(int algor_param, int lms_types[5], size_t *num); + +/* + algor: algor_param: + ------------------------------------------------------------------------- + OID_ec_public_key OID_sm2 or OID_secp256r1 + OID_lms_hashsig lms_type + OID_hss_lms_hashsig x509_algor_param_from_lms_types(lms_types[]) + OID_xmsss_hashsig xmss_type + OID_xmsssmt_hashsig xmssmt_type + OID_sphincs_hashsig OID_undef +*/ int x509_key_generate(X509_KEY *key, int algor, int algor_param); int x509_private_key_from_file(X509_KEY *key, int algor, const char *pass, FILE *fp); -int x509_public_key_digest(const X509_KEY *key, uint8_t dgst[32]); -int x509_public_key_equ(const X509_KEY *key, const X509_KEY *pub); -int x509_public_key_equ(const X509_KEY *key, const X509_KEY *pub); void x509_key_cleanup(X509_KEY *key); -/* -SubjectPublicKeyInfo ::= SEQUENCE { - algorithm AlgorithmIdentifier, - subjectPublicKey BIT STRING } +// SM2_PUBLIC_KEY_SIZE = 65 +// LMS_PUBLIC_KEY_SIZE = 56 +// HSS_PUBLIC_KEY_SIZE = 60 +// XMSS_PUBLIC_KEY_SIZE = 68 +// XMSSMT_PUBLIC_KEY_SIZE = 68 +// SPHINCS_PUBLIC_KEY_SIZE = 32 +// SECP256R1_PUBLIC_KEY_SIZE = 65 +#define X509_PUBLIC_KEY_MAX_SIZE 68 +int x509_public_key_to_bytes(const X509_KEY *key, uint8_t **out, size_t *outlen); +int x509_public_key_digest(const X509_KEY *key, uint8_t dgst[32]); +int x509_public_key_equ(const X509_KEY *key, const X509_KEY *pub); +int x509_public_key_print(FILE *fp, int fmt, int ind, const char *label, const X509_KEY *key); +int x509_private_key_print(FILE *fp, int fmt, int ind, const char *label, const X509_KEY *key); -algorithm.algorithm = OID_ec_public_key; -algorithm.parameters = OID_sm2; -subjectPublicKey = ECPoint -*/ +// X.509 SubjectPublicKeyInfo int x509_public_key_info_to_der(const X509_KEY *key, uint8_t **out, size_t *outlen); int x509_public_key_info_from_der(X509_KEY *key, const uint8_t **in, size_t *inlen); int x509_public_key_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); -int x509_private_key_print(FILE *fp, int fmt, int ind, const char *label, const X509_KEY *key); -int x509_public_key_print(FILE *fp, int fmt, int ind, const char *label, const X509_KEY *key); + +// ECPrivateKey when key->algor == OID_ec_public_key +int ec_private_key_to_der(const X509_KEY *key, int encode_params, int encode_pubkey, uint8_t **out, size_t *outlen); +int ec_private_key_from_der(X509_KEY *key, int opt_curve, const uint8_t **in, size_t *inlen); + +// 没有打印的函数! + +// PKCS #8 PrivateKeyInfo +// PrivateKeyInfo.algor.parameters has the named_curve +// so omit the optional ECPrivateKey params(named_curve) a nd omit the public_key +#define X509_ENCODE_EC_PRIVATE_KEY_PARAMS 1 +#define X509_ENCODE_EC_PRIVATE_KEY_PUBKEY 1 +int x509_private_key_info_to_der(const X509_KEY *key, uint8_t **out, size_t *outlen); +int x509_private_key_info_from_der(X509_KEY *key, const uint8_t **attrs, size_t *attrslen, + const uint8_t **in, size_t *inlen); +// 没有打印的函数 + +// PKCS #8 EncryptedPrivateKeyInfo +#define PKCS8_ENCED_PRIVATE_KEY_INFO_ITER 65536 +int x509_private_key_info_encrypt_to_der(const X509_KEY *x509_key, const char *pass, + uint8_t **out, size_t *outlen); +int x509_private_key_info_decrypt_from_der(X509_KEY *x509_key, + const uint8_t **attrs, size_t *attrs_len, + const char *pass, const uint8_t **in, size_t *inlen); + +// require stdio +int x509_private_key_info_encrypt_to_pem(const X509_KEY *key, const char *pass, FILE *fp); +int x509_private_key_info_decrypt_from_pem(X509_KEY *key, const uint8_t **attrs, size_t *attrslen, const char *pass, FILE *fp); -typedef union { - SM2_POINT sm2; - HSS_PUBLIC_KEY hss; - XMSS_PUBLIC_KEY xmss; - XMSSMT_PUBLIC_KEY xmssmt; -} X509_PUBLIC_KEY; - -#define X509_PUBLIC_KEY_MAX_SIZE sizeof(X509_PUBLIC_KEY) +// SM2_SIGNATURE_MAX_SIZE = 72 +// LMS_SIGNATURE_MAX_SIZE = 1932 +// HSS_SIGNATURE_MAX_SIZE = ? +// XMSS_SIGNATURE_MAX_SIZE = 2820 +// XMSSMT_SIGNATURE_MAX_SIZE >= 27688 ? +// SPHINCS_SIGNATURE_SIZE = ? +// ECDSA_SIGNATURE_MAX_SIZE = 72 typedef union { uint8_t sm2_sig[SM2_MAX_SIGNATURE_SIZE]; + LMS_SIGNATURE lms_sig; HSS_SIGNATURE hss_sig; XMSS_SIGNATURE xmss_sig; XMSSMT_SIGNATURE xmssmt_sig; + SPHINCS_SIGNATURE sphincs_sig; + uint8_t ecdsa_sig[SM2_MAX_SIGNATURE_SIZE]; } X509_SIGNATURE; +// FIXME: give sizeof to a number #define X509_SIGNATURE_MAX_SIZE sizeof(X509_SIGNATURE) typedef struct { union { SM2_SIGN_CTX sm2_sign_ctx; - ECDSA_SIGN_CTX ecdsa_sign_ctx; SM2_VERIFY_CTX sm2_verify_ctx; HSS_SIGN_CTX hss_sign_ctx; XMSS_SIGN_CTX xmss_sign_ctx; XMSSMT_SIGN_CTX xmssmt_sign_ctx; + SPHINCS_SIGN_CTX sphincs_sign_ctx; + ECDSA_SIGN_CTX ecdsa_sign_ctx; } u; int sign_algor; uint8_t sig[X509_SIGNATURE_MAX_SIZE]; @@ -123,19 +159,37 @@ typedef struct { } X509_SIGN_CTX; +/* + algor: + OID_sm2sign_with_sm3 + OID_ecdss_with_sha256 + OID_lms_hashsig + OID_hss_lms_hashsig + OID_xmss_hashsig + OID_xmssmt_hashsig + OID_sphincs_hashsig +*/ int x509_key_get_sign_algor(const X509_KEY *key, int *algor); int x509_key_get_signature_size(const X509_KEY *key, size_t *siglen); -int x509_sign_init(X509_SIGN_CTX *ctx, X509_KEY *key, const char *signer_id, size_t signer_idlen); +// args, argslen: +// sm2 SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH +// TLS13_SM2_ID, TLS13_SM2_ID_LENGTH +// sphincs optiona_random, 16 +int x509_sign_init(X509_SIGN_CTX *ctx, X509_KEY *key, const void *args, size_t argslen); int x509_sign_update(X509_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); int x509_sign_finish(X509_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen); -int x509_verify_init(X509_SIGN_CTX *ctx, const X509_KEY *key, - const char *signer_id, size_t signer_idlen, // 这里可能要去掉这个功能 +int x509_verify_init(X509_SIGN_CTX *ctx, const X509_KEY *key, const void *args, size_t argslen, const uint8_t *sig, size_t siglen); int x509_verify_update(X509_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); int x509_verify_finish(X509_SIGN_CTX *ctx); +void x509_sign_ctx_cleanup(X509_SIGN_CTX *ctx); +// ECDH for key->algor == OID_ec_public_key +int x509_key_do_exchange(const X509_KEY *key, const X509_KEY *peer_pub, uint8_t *out, size_t *outlen); +int x509_key_exchange(const X509_KEY *key, const uint8_t *peer_pub, size_t peer_publen, uint8_t *out, size_t *outlen); + #ifdef __cplusplus } diff --git a/src/ecdh.c b/src/ecdh.c index e9873d96..2db63807 100644 --- a/src/ecdh.c +++ b/src/ecdh.c @@ -8,5 +8,54 @@ */ +#include +#include +#include +#include +#include +#include +int secp256r1_do_ecdh(const SECP256R1_KEY *key, const SECP256R1_KEY *peer_key, uint8_t out[32]) +{ + SECP256R1_POINT point; + secp256r1_t x; + secp256r1_t y; + + if (!key || !peer_key || !out) { + error_print(); + return -1; + } + secp256r1_point_mul(&point, key->private_key, &peer_key->public_key); + secp256r1_point_get_xy(&point, x, y); + secp256r1_to_32bytes(x, out); + + gmssl_secure_clear(&point, sizeof(SECP256R1_POINT)); + gmssl_secure_clear(x, sizeof(secp256r1_t)); + gmssl_secure_clear(y, sizeof(secp256r1_t)); + return 1; +} + +int secp256r1_ecdh(const SECP256R1_KEY *key, const uint8_t uncompressed_point[65], uint8_t out[32]) +{ + SECP256R1_POINT point; + secp256r1_t x; + secp256r1_t y; + + if (!key || !uncompressed_point || !out) { + error_print(); + return -1; + } + if (secp256r1_point_from_uncompressed_octets(&point, uncompressed_point) != 1) { + error_print(); + return -1; + } + secp256r1_point_mul(&point, key->private_key, &point); + secp256r1_point_get_xy(&point, x,y); + secp256r1_to_32bytes(x, out); + + gmssl_secure_clear(&point, sizeof(SECP256R1_POINT)); + gmssl_secure_clear(x, sizeof(secp256r1_t)); + gmssl_secure_clear(y, sizeof(secp256r1_t)); + return 1; +} diff --git a/src/secp256r1_key.c b/src/secp256r1_key.c index d3b68f99..8747161e 100644 --- a/src/secp256r1_key.c +++ b/src/secp256r1_key.c @@ -499,6 +499,48 @@ end: return ret; } +int secp256r1_private_key_info_encrypt_to_pem(const SECP256R1_KEY *key, const char *pass, FILE *fp) +{ + uint8_t buf[1024]; + uint8_t *p = buf; + size_t len = 0; + + if (!fp) { + error_print(); + return -1; + } + if (secp256r1_private_key_info_encrypt_to_der(key, pass, &p, &len) != 1) { + error_print(); + return -1; + } + if (pem_write(fp, "ENCRYPTED PRIVATE KEY", buf, len) != 1) { + error_print(); + return -1; + } + return 1; +} + +int secp256r1_private_key_info_decrypt_from_pem(SECP256R1_KEY *key, const char *pass, FILE *fp) +{ + uint8_t buf[512]; + const uint8_t *cp = buf; + size_t len; + const uint8_t *attrs; + size_t attrs_len; + + if (!key || !pass || !fp) { + error_print(); + return -1; + } + if (pem_read(fp, "ENCRYPTED PRIVATE KEY", buf, &len, sizeof(buf)) != 1 + || secp256r1_private_key_info_decrypt_from_der(key, &attrs, &attrs_len, pass, &cp, &len) != 1 + || asn1_length_is_zero(len) != 1) { + error_print(); + return -1; + } + return 1; +} + diff --git a/src/sm2_exch.c b/src/sm2_exch.c index 15ed9d29..cb1979a2 100644 --- a/src/sm2_exch.c +++ b/src/sm2_exch.c @@ -1,5 +1,5 @@ /* - * Copyright 2014-2024 The GmSSL Project. All Rights Reserved. + * Copyright 2014-2026 The GmSSL Project. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the License); you may * not use this file except in compliance with the License. @@ -8,42 +8,50 @@ */ - #include #include #include #include -#include -#include -#include #include -#include +#include -int sm2_do_ecdh(const SM2_KEY *key, const SM2_Z256_POINT *peer_public, SM2_Z256_POINT *out) -{ - sm2_z256_point_mul(out, key->private_key, peer_public); - return 1; -} - -// FIXME: 输入(octets)和输出(bytes)格式不一致 -int sm2_ecdh(const SM2_KEY *key, const uint8_t *peer_public, size_t peer_public_len, uint8_t out[64]) +int sm2_do_ecdh(const SM2_KEY *key, const SM2_KEY *peer_key, uint8_t out[32]) { SM2_Z256_POINT point; + sm2_z256_t x; - if (!key || !peer_public || !peer_public_len || !out) { - error_print(); - return -1; - } - if (sm2_z256_point_from_octets(&point, peer_public, peer_public_len) != 1) { - error_print(); - return -1; - } - if (sm2_do_ecdh(key, &point, &point) != 1) { + if (!key || !peer_key || !out) { error_print(); return -1; } + sm2_z256_point_mul(&point, key->private_key, &peer_key->public_key); + sm2_z256_point_get_xy(&point, x, NULL); + sm2_z256_to_bytes(x, out); - sm2_z256_point_to_bytes(&point, out); + gmssl_secure_clear(&point, sizeof(SM2_Z256_POINT)); + gmssl_secure_clear(x, sizeof(sm2_z256_t)); + return 1; +} + +int sm2_ecdh(const SM2_KEY *key, const uint8_t uncompressed_point[65], uint8_t out[32]) +{ + SM2_Z256_POINT point; + sm2_z256_t x; + + if (!key || !uncompressed_point || !out) { + error_print(); + return -1; + } + if (sm2_z256_point_from_octets(&point, uncompressed_point, 65) != 1) { + error_print(); + return -1; + } + sm2_z256_point_mul(&point, key->private_key, &point); + sm2_z256_point_get_xy(&point, x, NULL); + sm2_z256_to_bytes(x, out); + + gmssl_secure_clear(&point, sizeof(SM2_Z256_POINT)); + gmssl_secure_clear(x, sizeof(sm2_z256_t)); return 1; } diff --git a/src/sm2_sign.c b/src/sm2_sign.c index e335a50f..b9412c63 100644 --- a/src/sm2_sign.c +++ b/src/sm2_sign.c @@ -490,7 +490,7 @@ int sm2_compute_z(uint8_t z[32], const SM2_Z256_POINT *pub, const char *id, size sm2_z256_point_to_bytes(pub, &zin[18 + 32 * 4]); sm3_init(&ctx); - if (strcmp(id, SM2_DEFAULT_ID) == 0) { + if (idlen == SM2_DEFAULT_ID_LENGTH && memcmp(id, SM2_DEFAULT_ID, idlen) == 0) { sm3_update(&ctx, zin, sizeof(zin)); } else { uint8_t idbits[2]; @@ -567,6 +567,8 @@ int sm2_sign_finish(SM2_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen) sm3_finish(&ctx->sm3_ctx, dgst); + format_bytes(stderr, 0, 4, "signed dgst", dgst, 32); + if (ctx->num_pre_comp == 0) { if (sm2_fast_sign_pre_compute(ctx->pre_comp) != 1) { error_print(); @@ -600,6 +602,9 @@ int sm2_sign_finish_fixlen(SM2_SIGN_CTX *ctx, size_t siglen, uint8_t *sig) return -1; } sm3_finish(&ctx->sm3_ctx, dgst); + format_bytes(stderr, 0, 4, "signed dgst", dgst, 32); + + if (sm2_sign_fixlen(&ctx->key, dgst, siglen, sig) != 1) { error_print(); return -1; @@ -667,6 +672,8 @@ int sm2_verify_finish(SM2_VERIFY_CTX *ctx, const uint8_t *sigbuf, size_t siglen) sm3_finish(&ctx->sm3_ctx, dgst); + format_bytes(stderr, 0, 4, "verify dgst", dgst, 32); + if (sm2_fast_verify(ctx->public_point_table, dgst, &sig) != 1) { error_print(); return -1; diff --git a/src/sm3.c b/src/sm3.c index 6db58789..02ba4d87 100644 --- a/src/sm3.c +++ b/src/sm3.c @@ -279,6 +279,10 @@ void sm3_update(SM3_CTX *ctx, const uint8_t *data, size_t data_len) { size_t blocks; + if (!data || !data_len) { + return; + } + ctx->num &= 0x3f; if (ctx->num) { size_t left = SM3_BLOCK_SIZE - ctx->num; diff --git a/src/sphincs.c b/src/sphincs.c index bdd72507..47cfbeab 100644 --- a/src/sphincs.c +++ b/src/sphincs.c @@ -1418,12 +1418,8 @@ int sphincs_signature_print(FILE *fp, int fmt, int ind, const char *label, const return 1; } - - -int sphincs_sign_init_ex(SPHINCS_SIGN_CTX *ctx, const SPHINCS_KEY *key, int randomize) +int sphincs_sign_init_ex(SPHINCS_SIGN_CTX *ctx, const SPHINCS_KEY *key, const sphincs_hash128_t opt_rand) { - sphincs_hash128_t opt_rand; - if (!ctx || !key) { error_print(); return -1; @@ -1433,18 +1429,11 @@ int sphincs_sign_init_ex(SPHINCS_SIGN_CTX *ctx, const SPHINCS_KEY *key, int rand // cache signing key ctx->key = *key; - // set opt_rand - memcpy(opt_rand, key->public_key.seed, sizeof(sphincs_hash128_t)); - if (randomize) { - if (rand_bytes(opt_rand, sizeof(opt_rand)) != 1) { - error_print(); - return -1; - } - } - // R = PRF_msg(sk_prf, optrand, M) = HMAC(sk_prf, opt_rand|M) sphincs_hmac256_init(&ctx->hmac_ctx, key->sk_prf, sizeof(sphincs_hash128_t)); - sphincs_hmac256_update(&ctx->hmac_ctx, opt_rand, sizeof(sphincs_hash128_t)); + if (opt_rand) + sphincs_hmac256_update(&ctx->hmac_ctx, opt_rand, sizeof(sphincs_hash128_t)); + else sphincs_hmac256_update(&ctx->hmac_ctx, key->public_key.seed, sizeof(sphincs_hash128_t)); // state ctx->state = 1; @@ -1454,8 +1443,13 @@ int sphincs_sign_init_ex(SPHINCS_SIGN_CTX *ctx, const SPHINCS_KEY *key, int rand int sphincs_sign_init(SPHINCS_SIGN_CTX *ctx, const SPHINCS_KEY *key) { - int randomize = 1; - if (sphincs_sign_init_ex(ctx, key, randomize) != 1) { + sphincs_hash128_t opt_rand; + + if (rand_bytes(opt_rand, sizeof(sphincs_hash128_t)) != 1) { + error_print(); + return -1; + } + if (sphincs_sign_init_ex(ctx, key, opt_rand) != 1) { error_print(); return -1; } diff --git a/src/tlcp.c b/src/tlcp.c index c50612cb..b71da301 100644 --- a/src/tlcp.c +++ b/src/tlcp.c @@ -443,7 +443,7 @@ int tlcp_do_connect(TLS_CONNECT *conn) uint8_t sigbuf[SM2_MAX_SIGNATURE_SIZE]; sm3_finish(&cert_verify_sm3_ctx, cert_verify_hash); - if (sm2_sign_init(&sign_ctx, &conn->sign_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH) != 1 + if (sm2_sign_init(&sign_ctx, &conn->sign_key.u.sm2_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH) != 1 || sm2_sign_update(&sign_ctx, cert_verify_hash, SM3_DIGEST_SIZE) != 1 || sm2_sign_finish(&sign_ctx, sigbuf, &siglen) != 1) { error_print(); @@ -728,7 +728,7 @@ int tlcp_do_accept(TLS_CONNECT *conn) } p = server_enc_cert_lenbuf; len = 0; tls_uint24_to_bytes((uint24_t)server_enc_cert_len, &p, &len); - if (sm2_sign_init(&sign_ctx, &conn->sign_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH) != 1 + if (sm2_sign_init(&sign_ctx, &conn->sign_key.u.sm2_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH) != 1 || sm2_sign_update(&sign_ctx, client_random, 32) != 1 || sm2_sign_update(&sign_ctx, server_random, 32) != 1 || sm2_sign_update(&sign_ctx, server_enc_cert_lenbuf, 3) != 1 @@ -824,7 +824,7 @@ int tlcp_do_accept(TLS_CONNECT *conn) tls_send_alert(conn, TLS_alert_unexpected_message); goto end; } - if (sm2_decrypt(&conn->kenc_key, enced_pms, enced_pms_len, + if (sm2_decrypt(&conn->kenc_key.u.sm2_key, enced_pms, enced_pms_len, pre_master_secret, &pre_master_secret_len) != 1) { error_print(); tls_send_alert(conn, TLS_alert_decrypt_error); diff --git a/src/tls.c b/src/tls.c index 0f217420..3a3e22ca 100644 --- a/src/tls.c +++ b/src/tls.c @@ -321,6 +321,8 @@ int tls_cbc_encrypt(const SM3_HMAC_CTX *inited_hmac_ctx, const SM4_KEY *enc_key, return 1; } + +// 这个函数应该把所有的输入的dgst都打印出来!这样就可以容易判断出到底是哪个输入错了 int tls_cbc_decrypt(const SM3_HMAC_CTX *inited_hmac_ctx, const SM4_KEY *dec_key, const uint8_t seq_num[8], const uint8_t enced_header[5], const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen) @@ -534,7 +536,7 @@ int tls_cert_type_from_oid(int oid) return 0; } -// 这两个函数没有对应的TLCP版本 +// 这两个函数没有对应的TLCP版本, 这个现在已经有了ex版本了 int tls_sign_server_ecdh_params(const SM2_KEY *server_sign_key, const uint8_t client_random[32], const uint8_t server_random[32], int curve, const SM2_Z256_POINT *point, uint8_t *sig, size_t *siglen) @@ -1453,6 +1455,18 @@ int tls_cipher_suite_in_list(int cipher, const int *list, size_t list_count) return 0; } +/* +尽可能的发送数据,直到发送完整的报文,或者send 返回错误 +如果send 返回EAGAIN,那么向上层返回WANT_WRITE + +正常情况下,一方总是可以发送任意数量的数据,当发送方缓冲区已经满了的时候 +send会返回EAGIN,那么如果底层没处理完,那就没有任何办法 + +如果这个函数在获得EAGAIN之后就返回给上层了,那么还需要标明到底发送出去了多少数据 + + + +*/ int tls_record_send(const uint8_t *record, size_t recordlen, tls_socket_t sock) { tls_ret_t n; @@ -1948,6 +1962,7 @@ int tls_client_verify_init(TLS_CLIENT_VERIFY_CTX *ctx) return 1; } +// FIXME: remove malloc! int tls_client_verify_update(TLS_CLIENT_VERIFY_CTX *ctx, const uint8_t *handshake, size_t handshake_len) { uint8_t *buf; @@ -1985,6 +2000,7 @@ int tls_client_verify_finish(TLS_CLIENT_VERIFY_CTX *ctx, const uint8_t *sig, siz error_print(); return -1; } + // 这里的主要困难是,SM2的签名验证需要以Z作为输入,但是在没有拿到客户端的公钥之前,无法启动验证 if (sm2_verify_init(&verify_ctx, public_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH) != 1) { error_print(); return -1; @@ -2074,6 +2090,9 @@ int tls_ctx_init(TLS_CTX *ctx, int protocol, int is_client) return -1; } ctx->is_client = is_client ? 1 : 0; + + + ctx->verify_depth = 5; return 1; } @@ -2133,6 +2152,8 @@ int tls_ctx_set_ca_certificates(TLS_CTX *ctx, const char *cacertsfile, int depth return 1; } + +// 这个函数要独立出去 int tls_ctx_set_certificate_and_key(TLS_CTX *ctx, const char *chainfile, const char *keyfile, const char *keypass) { @@ -2140,7 +2161,6 @@ int tls_ctx_set_certificate_and_key(TLS_CTX *ctx, const char *chainfile, uint8_t *certs = NULL; size_t certslen; FILE *keyfp = NULL; - SM2_KEY key; const uint8_t *cert; size_t certlen; X509_KEY public_key; @@ -2162,57 +2182,62 @@ int tls_ctx_set_certificate_and_key(TLS_CTX *ctx, const char *chainfile, error_print(); goto end; } - if (!(keyfp = fopen(keyfile, "r"))) { - error_print(); - goto end; - } - if (sm2_private_key_info_decrypt_from_pem(&key, keypass, keyfp) != 1) { - error_print(); - goto end; - } if (x509_certs_get_cert_by_index(certs, certslen, 0, &cert, &certlen) != 1 || x509_cert_get_subject_public_key(cert, certlen, &public_key) != 1) { error_print(); return -1; } - if (public_key.algor != OID_ec_public_key - || public_key.algor_param != OID_sm2) { + + if (public_key.algor == OID_ec_public_key) { + if (!(keyfp = fopen(keyfile, "r"))) { + error_print(); + return -1; + } + } else { + if (!(keyfp = fopen(keyfile, "rb+"))) { + error_print(); + return -1; + } + } + + if (x509_private_key_from_file(&ctx->signkey, public_key.algor, keypass, keyfp) != 1) { error_print(); return -1; } - if (sm2_public_key_equ(&key, &public_key.u.sm2_key) != 1) { + if (x509_public_key_equ(&ctx->signkey, &public_key) != 1) { error_print(); - return -1; + goto end; } + ctx->certs = certs; ctx->certslen = certslen; - ctx->signkey = key; certs = NULL; ret = 1; end: - gmssl_secure_clear(&key, sizeof(key)); if (certs) free(certs); if (keyfp) fclose(keyfp); return ret; } + int tls_ctx_set_tlcp_server_certificate_and_keys(TLS_CTX *ctx, const char *chainfile, const char *signkeyfile, const char *signkeypass, const char *kenckeyfile, const char *kenckeypass) { int ret = -1; + const int algor = OID_ec_public_key; + const int algor_param = OID_sm2; uint8_t *certs = NULL; size_t certslen; FILE *signkeyfp = NULL; FILE *kenckeyfp = NULL; - SM2_KEY signkey; - SM2_KEY kenckey; const uint8_t *cert; size_t certlen; X509_KEY public_key; + if (!ctx || !chainfile || !signkeyfile || !signkeypass || !kenckeyfile || !kenckeypass) { error_print(); return -1; @@ -2231,62 +2256,53 @@ int tls_ctx_set_tlcp_server_certificate_and_keys(TLS_CTX *ctx, const char *chain return -1; } + + // load sign key if (!(signkeyfp = fopen(signkeyfile, "r"))) { error_print(); goto end; } - if (sm2_private_key_info_decrypt_from_pem(&signkey, signkeypass, signkeyfp) != 1) { + if (x509_private_key_from_file(&ctx->signkey, algor, signkeypass, signkeyfp) != 1) { error_print(); goto end; } if (x509_certs_get_cert_by_index(certs, certslen, 0, &cert, &certlen) != 1 || x509_cert_get_subject_public_key(cert, certlen, &public_key) != 1) { error_print(); - return -1; + goto end; } - if (public_key.algor != OID_ec_public_key - || public_key.algor_param != OID_sm2) { - error_print(); - return -1; - } - if (sm2_public_key_equ(&signkey, &public_key.u.sm2_key) != 1) { + if (x509_public_key_equ(&ctx->signkey, &public_key) != 1) { error_print(); goto end; } + // load enc key if (!(kenckeyfp = fopen(kenckeyfile, "r"))) { error_print(); goto end; } - if (sm2_private_key_info_decrypt_from_pem(&kenckey, kenckeypass, kenckeyfp) != 1) { + if (x509_private_key_from_file(&ctx->kenckey, algor, kenckeypass, kenckeyfp) != 1) { error_print(); goto end; } if (x509_certs_get_cert_by_index(certs, certslen, 1, &cert, &certlen) != 1 || x509_cert_get_subject_public_key(cert, certlen, &public_key) != 1) { error_print(); - return -1; + goto end; } - if (public_key.algor != OID_ec_public_key - || public_key.algor_param != OID_sm2) { - error_print(); - return -1; - } - if (sm2_public_key_equ(&kenckey, &public_key.u.sm2_key) != 1) { + if (x509_public_key_equ(&ctx->kenckey, &public_key) != 1) { error_print(); goto end; } ctx->certs = certs; ctx->certslen = certslen; - ctx->signkey = signkey; - ctx->kenckey = kenckey; certs = NULL; ret = 1; end: - gmssl_secure_clear(&signkey, sizeof(signkey)); - gmssl_secure_clear(&kenckey, sizeof(kenckey)); + if (ret != 1) x509_key_cleanup(&ctx->signkey); + if (ret != 1) x509_key_cleanup(&ctx->kenckey); if (certs) free(certs); if (signkeyfp) fclose(signkeyfp); if (kenckeyfp) fclose(kenckeyfp); @@ -2330,6 +2346,8 @@ int tls_init(TLS_CONNECT *conn, const TLS_CTX *ctx) conn->quiet = ctx->quiet; + + conn->verify_depth = ctx->verify_depth; return 1; } diff --git a/src/tls12.c b/src/tls12.c index decc82b0..352c9d00 100644 --- a/src/tls12.c +++ b/src/tls12.c @@ -1,4 +1,4 @@ -/* +/* * Copyright 2014-2026 The GmSSL Project. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the License); you may @@ -8,11 +8,11 @@ */ - #include #include #include #include +#include #include #include #include @@ -23,13 +23,44 @@ #include #include +#include +#include +#include + static const int tls12_ciphers[] = { TLS_cipher_ecdhe_sm4_cbc_sm3, + TLS_cipher_ecdhe_sm4_gcm_sm3, + TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256, }; -static const size_t tls12_ciphers_count = sizeof(tls12_ciphers)/sizeof(tls12_ciphers[0]); +// 现在client_certificate_verify做的是不好的 +/* + 是否要求客户端提供证书是服务器决定的,服务器方需要提供相应的CA证书 + 对于服务器来说,CONN中保存的CA证书是用于验证客户端的 + 对于客户端来说,这些证书是用于验证服务器的 + + 服务器知道是否验证客户端证书是通过是否有CA证书判断的 + + 客户端是通过什么判断的? + 实际上客户端可以提供备选的证书,因此应该有一个标识符来标记 + + +现在通盘考虑一下ECDHE过程中双方需要准备什么 + + + Client: X509_KEY私钥,自己生成 + 从服务器那边拿到的对方的X509_KEY公钥 + + 服务器:自己的私钥,以及对方的公钥 + +每次如果发现当前的缓冲区是有数据的,record_left > 0,说明已经组装完了还没发送完 +然后我们就要调用一个函数来发送数据 + +*/ + +// 实际上这个功能本质上是把缓冲区的数据发出去 int tls12_record_print(FILE *fp, const uint8_t *record, size_t recordlen, int format, int indent) @@ -41,120 +72,1833 @@ int tls12_record_print(FILE *fp, const uint8_t *record, size_t recordlen, int f } -int tls_record_set_handshake_server_key_exchange_ecdhe(uint8_t *record, size_t *recordlen, - int curve, const SM2_Z256_POINT *point, const uint8_t *sig, size_t siglen) -{ - int type = TLS_handshake_server_key_exchange; - uint8_t *server_ecdh_params = record + 9; - uint8_t *p = server_ecdh_params + 69; - size_t len = 69; - if (!record || !recordlen || !tls_curve_name(curve) || !point - || !sig || !siglen || siglen > TLS_MAX_SIGNATURE_SIZE) { +// modify: conn->record_offset +int tls_send_record(TLS_CONNECT *conn) +{ + size_t left; + tls_ret_t n; + + left = tls_record_length(conn->record) - conn->record_offset; + while (left) { + n = tls_socket_send(conn->sock, conn->record + conn->record_offset, left, 0); + if (n < 0) { + if (errno == EAGAIN && errno == EWOULDBLOCK) { + return TLS_ERROR_SEND_AGAIN; + } else if (errno == EINTR) { + continue; + } else { + error_print(); + return -1; + } + } + conn->record_offset += n; + left -= n; + } + return 1; +} + +int tls_recv_record(TLS_CONNECT *conn) +{ + size_t left; + tls_ret_t n; + + // 说明报文已经完整的读取到了 + if (conn->recordlen) { + return 1; + } + + if (conn->record_offset < 5) { + left = 5 - conn->record_offset; + while (left) { + n = tls_socket_recv(conn->sock, conn->record + conn->record_offset, left, 0); + if (n < 0) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return TLS_ERROR_RECV_AGAIN; + } else if (errno == EINTR) { + continue; + } else { + error_print(); + // TODO: check the usage of OpenSSL SSL_ERR_SYSCALL + // if applications such as Nginx, HTTPD do not use this error, we just return -1 + return TLS_ERROR_SYSCALL; + } + } else if (n == 0) { + error_print(); + return TLS_ERROR_TCP_CLOSED; + } + conn->record_offset += n; + left -= n; + } + } + + if (conn->record_offset == 5) { + if (!tls_record_type_name(tls_record_type(conn->record))) { + error_print(); + return -1; + } + if (!tls_protocol_name(tls_record_protocol(conn->record))) { + error_print(); + return -1; + } + if (tls_record_length(conn->record) > TLS_MAX_RECORD_SIZE) { + error_print(); + return -1; + } + } + + if (conn->record_offset >= tls_record_length(conn->record)) { error_print(); return -1; } - server_ecdh_params[0] = TLS_curve_type_named_curve; - server_ecdh_params[1] = curve >> 8; - server_ecdh_params[2] = curve; - server_ecdh_params[3] = 65; - sm2_z256_point_to_uncompressed_octets(point, server_ecdh_params + 4); - tls_uint16_to_bytes(TLS_sig_sm2sig_sm3, &p, &len); + left = tls_record_length(conn->record) - conn->record_offset; + while (left) { + n = tls_socket_recv(conn->sock, conn->record + conn->record_offset, left, 0); + if (n < 0) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return TLS_ERROR_RECV_AGAIN; + } else if (errno == EINTR) { + continue; + } else { + error_print(); + return TLS_ERROR_SYSCALL; + } + } else if (n == 0) { + error_print(); + return TLS_ERROR_TCP_CLOSED; + } + conn->record_offset += n; + left -= n; + + } + + conn->recordlen = conn->record_offset; + return 1; +} + +int tls_named_curve_oid(int named_curve) +{ + switch (named_curve) { + case TLS_curve_secp256r1: return OID_secp256r1; + case TLS_curve_sm2p256v1: return OID_sm2; + } + return OID_undef; +} + +int tls_named_curve_from_oid(int oid) +{ + switch (oid) { + case OID_secp256r1: return TLS_curve_secp256r1; + case OID_sm2: return TLS_curve_sm2p256v1; + } + return 0; +} + +enum { + TLS_state_handshake_init = 0, + TLS_state_client_hello, + TLS_state_server_hello, + TLS_state_server_certificate, + TLS_state_server_key_exchange, + TLS_state_certificate_request, + TLS_state_server_hello_done, + TLS_state_client_certificate, + TLS_state_client_key_exchange, + TLS_state_certificate_verify, + TLS_state_generate_keys, + TLS_state_client_change_cipher_spec, + TLS_state_client_finished, + TLS_state_server_change_cipher_spec, + TLS_state_server_finished, + TLS_state_handshake_over, +}; + +// 这个是必选的 +const int ec_point_formats[] = { TLS_point_uncompressed }; +size_t ec_point_formats_cnt = sizeof(ec_point_formats)/sizeof(ec_point_formats[0]); + +// 服务器通常推荐返回这个值 +const int supported_groups[] = { + TLS_curve_sm2p256v1, + TLS_curve_secp256r1, +}; +size_t supported_groups_cnt = sizeof(supported_groups)/sizeof(supported_groups[0]); + +// 仍旧是不可设置的 +const int signature_algors[] = { + TLS_sig_sm2sig_sm3, + TLS_sig_ecdsa_secp256r1_sha256, +}; +size_t signature_algors_cnt = sizeof(signature_algors)/sizeof(signature_algors[0]); + + + +int tls_record_set_handshake_server_key_exchange(uint8_t *record, size_t *recordlen, + const uint8_t *server_ecdh_params, size_t server_ecdh_params_len, + uint16_t sig_alg, const uint8_t *sig, size_t siglen) +{ + const int type = TLS_handshake_server_key_exchange; + uint8_t *p = tls_handshake_data(tls_record_data(record)); + size_t len = 0; + + if (server_ecdh_params_len != 69) { + error_print(); + return -1; + } + if (siglen > TLS_MAX_SIGNATURE_SIZE) { + error_print(); + return -1; + } + tls_array_to_bytes(server_ecdh_params, server_ecdh_params_len, &p, &len); + tls_uint16_to_bytes(sig_alg, &p, &len); tls_uint16array_to_bytes(sig, siglen, &p, &len); tls_record_set_handshake(record, recordlen, type, NULL, len); return 1; } -// 这里返回的应该是一个SM2_Z256_POINT吗? -// 首先得问题就是这里面我们是否有必要去检查这个值是否是椭圆曲线上的一个点,还是把这个值传递给后面 -// 如果在这里直接检查,那么意味着这个函数不兼容其他的椭圆曲线点 -int tls_record_get_handshake_server_key_exchange_ecdhe(const uint8_t *record, - int *curve, SM2_Z256_POINT *point, const uint8_t **sig, size_t *siglen) +int tls_record_get_handshake_server_key_exchange(const uint8_t *record, + uint8_t *curve_type, uint16_t *named_curve, + const uint8_t **point_octets, size_t *point_octets_len, + const uint8_t **server_ecdh_params, size_t *server_ecdh_params_len, + uint16_t *sig_alg, const uint8_t **sig, size_t *siglen) { int type; const uint8_t *p; size_t len; - uint8_t curve_type; - uint16_t named_curve; - const uint8_t *octets; - size_t octetslen; - uint16_t sig_alg; - if (!record || !curve || !point || !sig || !siglen) { + if (tls_record_get_handshake(record, &type, &p, &len) != 1) { error_print(); return -1; } - if (tls_record_get_handshake(record, &type, &p, &len) != 1 - || type != TLS_handshake_server_key_exchange) { + if (type != TLS_handshake_server_key_exchange) { error_print(); return -1; } - if (tls_uint8_from_bytes(&curve_type, &p, &len) != 1 - || tls_uint16_from_bytes(&named_curve, &p, &len) != 1 - || tls_uint8array_from_bytes(&octets, &octetslen, &p, &len) != 1 - || tls_uint16_from_bytes(&sig_alg, &p, &len) != 1 + + *server_ecdh_params = p; + if (tls_uint8_from_bytes(curve_type, &p, &len) != 1 + || tls_uint16_from_bytes(named_curve, &p, &len) != 1 + || tls_uint8array_from_bytes(point_octets, point_octets_len, &p, &len) != 1) { + error_print(); + return -1; + } + *server_ecdh_params_len = p - *server_ecdh_params; + if (*server_ecdh_params_len != 69) { + error_print(); + return -1; + } + if (tls_uint16_from_bytes(sig_alg, &p, &len) != 1 || tls_uint16array_from_bytes(sig, siglen, &p, &len) != 1 || tls_length_is_zero(len) != 1) { error_print(); return -1; } - if (curve_type != TLS_curve_type_named_curve) { + if (*curve_type != TLS_curve_type_named_curve) { error_print(); return -1; } - if (named_curve != TLS_curve_sm2p256v1) { + if (!tls_named_curve_name(*named_curve)) { error_print(); return -1; } - *curve = named_curve; - if (octetslen != 65 - || sm2_z256_point_from_octets(point, octets, octetslen) != 1) { - error_print(); - return -1; - } - if (sig_alg != TLS_sig_sm2sig_sm3) { + if (!tls_signature_scheme_name(*sig_alg)) { error_print(); return -1; } return 1; } -int tls_record_set_handshake_client_key_exchange_ecdhe(uint8_t *record, size_t *recordlen, - const SM2_Z256_POINT *point) +int tls_record_set_handshake_client_key_exchange(uint8_t *record, size_t *recordlen, + const uint8_t *point_octets, size_t point_octets_len) { int type = TLS_handshake_client_key_exchange; - record[9] = 65; - sm2_z256_point_to_uncompressed_octets(point, record + 9 + 1); - tls_record_set_handshake(record, recordlen, type, NULL, 1 + 65); + uint8_t *p = tls_handshake_data(tls_record_data(record)); + size_t len = 0; + + if (point_octets_len != 65) { + error_print(); + return -1; + } + tls_uint8array_to_bytes(point_octets, (uint8_t)point_octets_len, &p, &len); + tls_record_set_handshake(record, recordlen, type, NULL, len); return 1; } -int tls_record_get_handshake_client_key_exchange_ecdhe(const uint8_t *record, SM2_Z256_POINT *point) +int tls_record_get_handshake_client_key_exchange(const uint8_t *record, + const uint8_t **point_octets, size_t *point_octets_len) { int type; const uint8_t *p; size_t len; - const uint8_t *octets; - size_t octetslen; if (tls_record_get_handshake(record, &type, &p, &len) != 1 || type != TLS_handshake_client_key_exchange) { error_print(); return -1; } - if (tls_uint8array_from_bytes(&octets, &octetslen, &p, &len) != 1 - || len > 0) { + if (tls_uint8array_from_bytes(point_octets, point_octets_len, &p, &len) != 1) { error_print(); return -1; } - if (octetslen != 65 - || sm2_z256_point_from_octets(point, octets, octetslen) != 1) { + if (*point_octets_len != 65) { + error_print(); + return -1; + } + if (len) { error_print(); return -1; } return 1; } +void tls_clean_record(TLS_CONNECT *conn) +{ + conn->record_offset = 0; + conn->recordlen = 0; +} + + + + + +int tls_handshake_init(TLS_CONNECT *conn) +{ + + sm3_init(&conn->sm3_ctx); + + if (conn->client_certs_len) { + //sm2_sign_init(&conn->sign_ctx, &conn->sign_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH); + } + + return 1; +} + +int tls_send_client_hello(TLS_CONNECT *conn) +{ + int ret; + uint8_t *record = conn->record; + + if (!conn->recordlen) { + uint8_t client_exts[TLS_MAX_EXTENSIONS_SIZE]; + uint8_t *p = client_exts; + size_t client_exts_len = 0; + + tls_record_set_protocol(record, TLS_protocol_tls1); + + if (tls_random_generate(conn->client_random) != 1) { + error_print(); + return -1; + } + if (tls_ec_point_formats_ext_to_bytes(ec_point_formats, ec_point_formats_cnt, &p, &client_exts_len) != 1 + || tls_supported_groups_ext_to_bytes(supported_groups, supported_groups_cnt, &p, &client_exts_len) != 1 + || tls_signature_algorithms_ext_to_bytes(signature_algors, signature_algors_cnt, &p, &client_exts_len) != 1) { + error_print(); + return -1; + } + if (tls_record_set_handshake_client_hello(conn->record, &conn->recordlen, + conn->protocol, conn->client_random, NULL, 0, + tls12_ciphers, sizeof(tls12_ciphers)/sizeof(tls12_ciphers[0]), + client_exts, client_exts_len) != 1) { + error_print(); + return -1; + } + // offset = 0, recordlen > 0 + + tls_trace("send ClientHello\n"); + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + } + + // 客户端一开始不知道是否要进行客户端验证 + // 如果用户提供了客户端证书那么就准备,如果没提供就完全不准确 + // 客户端的证书可以通过回调函数来设置 + if (conn->client_certificate_verify) { + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + + tls_clean_record(conn); + return 1; +} + +const int server_ciphers[] = { TLS_cipher_ecdhe_sm4_cbc_sm3 }; +const size_t server_ciphers_cnt = 1; +const int curve = TLS_curve_sm2p256v1; + + +// 服务器在收到ClientHello之后, +int tls_recv_client_hello(TLS_CONNECT *conn) +{ + int ret; + uint8_t *record = conn->record; + size_t recordlen; + + int client_verify = 0; + + int protocol; + const uint8_t *client_random; + const uint8_t *session_id; + size_t session_id_len; + const uint8_t *client_ciphers; + size_t client_ciphers_len; + const uint8_t *client_exts; + size_t client_exts_len; + + sm3_init(&conn->sm3_ctx); + + + // 服务器端如果设置了CA + if (conn->ca_certs_len) + client_verify = 1; + + // 这个判断应该改为一个函数 + if (client_verify) + tls_client_verify_init(&conn->client_verify_ctx); + + + tls_trace("recv ClientHello\n"); + + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != TLS_ERROR_RECV_AGAIN) { + error_print(); + } + return ret; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + + + if (tls_record_protocol(record) != conn->protocol + && tls_record_protocol(record) != TLS_protocol_tls1) { + error_print(); + tls_send_alert(conn, TLS_alert_protocol_version); + return -1; + } + + if (tls_record_get_handshake_client_hello(record, + &protocol, &client_random, &session_id, &session_id_len, + &client_ciphers, &client_ciphers_len, + &client_exts, &client_exts_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + + if (protocol != conn->protocol) { + error_print(); + tls_send_alert(conn, TLS_alert_protocol_version); + return -1; + } + memcpy(conn->client_random, client_random, 32); + + // 服务器选择的cipher_suites需要和服务器准备的证书和公钥匹配 + if (tls_cipher_suites_select(client_ciphers, client_ciphers_len, + server_ciphers, server_ciphers_cnt, + &conn->cipher_suite) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_insufficient_security); + return -1; + } + + switch (conn->cipher_suite) { + case TLS_cipher_ecdhe_sm4_cbc_sm3: + case TLS_cipher_ecdhe_sm4_gcm_sm3: + conn->sig_alg = TLS_sig_sm2sig_sm3; + conn->ecdh_named_curve = TLS_curve_sm2p256v1; + break; + case TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256: + conn->sig_alg = TLS_sig_ecdsa_secp256r1_sha256; + conn->ecdh_named_curve = TLS_curve_secp256r1; + break; + default: + error_print(); + return -1; + } + + if (client_exts) { + // 这些函数需要能够访问conn的内部变量 + tls_process_client_hello_exts(client_exts, client_exts_len, + conn->server_exts, &conn->server_exts_len, sizeof(conn->server_exts)); + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (client_verify) + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + + + fprintf(stderr, "end of recv_client_hello\n"); + tls_clean_record(conn); + return 1; +} + +int tls_send_server_hello(TLS_CONNECT *conn) +{ + int ret; + tls_trace("send ServerHello\n"); + + if (conn->recordlen == 0) { + tls_record_set_protocol(conn->record, conn->protocol); + if (tls_random_generate(conn->server_random) != 1) { + error_print(); + return -1; + } + if (tls_record_set_handshake_server_hello(conn->record, &conn->recordlen, + conn->protocol, conn->server_random, NULL, 0, + conn->cipher_suite, conn->server_exts, conn->server_exts_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->ca_certs_len) { + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + } + + tls_clean_record(conn); + return 1; +} + +int tls_recv_server_hello(TLS_CONNECT *conn) +{ + int ret; + int protocol; + int cipher_suite; + const uint8_t *server_random; + const uint8_t *session_id; + size_t session_id_len; + const uint8_t *server_exts; + size_t server_exts_len; + + // 扩展的协商结果,-1 表示服务器不支持该扩展(未给出响应) + int ec_point_format = -1; + int supported_group = -1; + int signature_algor = -1; + + // 实际上当前的record已经有完整的数据了,但是我们不知道啊 + + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != TLS_ERROR_RECV_AGAIN) { + error_print(); + } + return ret; + } + + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + if (tls_record_protocol(conn->record) != conn->protocol) { + error_print(); + tls_send_alert(conn, TLS_alert_protocol_version); + return -1; + } + + if (tls_record_get_handshake_server_hello(conn->record, + &protocol, &server_random, &session_id, &session_id_len, &cipher_suite, + &server_exts, &server_exts_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (protocol != conn->protocol) { + error_print(); + tls_send_alert(conn, TLS_alert_protocol_version); + return -1; + } + // tls12_ciphers 应该改为conn的内部变量 + if (tls_cipher_suite_in_list(cipher_suite, tls12_ciphers, sizeof(tls12_ciphers)/sizeof(tls12_ciphers[0])) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_handshake_failure); + return -1; + } + if (!server_exts) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (tls_process_server_hello_exts(server_exts, server_exts_len, &ec_point_format, &supported_group, &signature_algor) != 1 + || ec_point_format < 0 + || supported_group < 0 + || signature_algor < 0) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + + memcpy(conn->server_random, server_random, 32); + memcpy(conn->session_id, session_id, session_id_len); + conn->cipher_suite = cipher_suite; + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certs_len) { + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + } + + return 1; +} + +int tls_send_server_certificate(TLS_CONNECT *conn) +{ + int ret; + tls_trace("send ServerCertificate\n"); + + if (conn->recordlen == 0) { + if (tls_record_set_handshake_certificate(conn->record, &conn->recordlen, + conn->server_certs, conn->server_certs_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certificate_verify) { + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + } + return 1; +} + +int tls_recv_server_certificate(TLS_CONNECT *conn) +{ + int ret; + int verify_result; + const uint8_t *server_cert; + size_t server_cert_len; + X509_KEY server_sign_key; + + + tls_trace("recv ServerCertificate\n"); + + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != TLS_ERROR_RECV_AGAIN) { + error_print(); + } + return ret; + } + if (tls_record_protocol(conn->record) != conn->protocol) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + + if (tls_record_get_handshake_certificate(conn->record, + conn->server_certs, &conn->server_certs_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + + if (x509_certs_get_cert_by_index(conn->server_certs, conn->server_certs_len, 0, + &server_cert, &server_cert_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + if (x509_cert_get_subject_public_key(server_cert, server_cert_len, &server_sign_key) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + + // set conn->server_sig_alg (decided by cipher_suite and server_cert.sign_key.algor, algor_param) + if (server_sign_key.algor != OID_ec_public_key) { + error_print(); + return -1; + } + switch (conn->cipher_suite) { + case TLS_cipher_ecdhe_sm4_cbc_sm3: + case TLS_cipher_ecdhe_sm4_gcm_sm3: + case TLS_cipher_ecc_sm4_cbc_sm3: + case TLS_cipher_ecc_sm4_gcm_sm3: + if (server_sign_key.algor_param != OID_sm2) { + error_print(); + return -1; + } + conn->server_sig_alg = TLS_sig_sm2sig_sm3; + break; + + case TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256: + if (server_sign_key.algor_param != OID_secp256r1) { + error_print(); + return -1; + } + conn->server_sig_alg = TLS_sig_ecdsa_secp256r1_sha256; + break; + default: + error_print(); + return -1; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certs_len) { + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + } + + assert(conn->verify_depth > 0 && conn->verify_depth < 10); + + // verify ServerCertificate + if (x509_certs_verify(conn->server_certs, conn->server_certs_len, X509_cert_chain_server, + conn->ca_certs, conn->ca_certs_len, conn->verify_depth, &verify_result) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + + return 1; +} + +int tls_send_server_key_exchange(TLS_CONNECT *conn) +{ + int ret; + uint8_t server_ecdh_params[69]; + uint8_t *p = server_ecdh_params + 4; + size_t len = 0; + X509_SIGN_CTX sign_ctx; + const void *sign_args = NULL; + size_t sign_argslen = 0; + uint8_t sig[X509_SIGNATURE_MAX_SIZE]; + size_t siglen; + + tls_trace("send ServerKeyExchange\n"); + + + if (conn->recordlen == 0) { + // generate server ecdh_key + if (x509_key_generate(&conn->ecdh_key, + OID_ec_public_key, tls_named_curve_oid(conn->ecdh_named_curve)) != 1) { + error_print(); + return -1; + } + + // build server_ecdh_params + server_ecdh_params[0] = TLS_curve_type_named_curve; + server_ecdh_params[1] = conn->ecdh_named_curve >> 8; + server_ecdh_params[2] = conn->ecdh_named_curve; + server_ecdh_params[3] = 65; + if (x509_public_key_to_bytes(&conn->ecdh_key, &p, &len) != 1) { + error_print(); + return -1; + } + if (len != 65) { + error_print(); + return -1; + } + + // sign server_ecdh_params + if (conn->sign_key.algor == OID_ec_public_key && conn->sign_key.algor_param == OID_sm2) { + sign_args = SM2_DEFAULT_ID; + sign_argslen = SM2_DEFAULT_ID_LENGTH; + } + if (x509_sign_init(&sign_ctx, &conn->sign_key, sign_args, sign_argslen) != 1 + || x509_sign_update(&sign_ctx, conn->client_random, 32) != 1 + || x509_sign_update(&sign_ctx, conn->server_random, 32) != 1 + || x509_sign_update(&sign_ctx, server_ecdh_params, 69) != 1 + || x509_sign_finish(&sign_ctx, sig, &siglen) != 1) { + x509_sign_ctx_cleanup(&sign_ctx); + error_print(); + return -1; + } + x509_sign_ctx_cleanup(&sign_ctx); + + if (tls_record_set_handshake_server_key_exchange(conn->record, &conn->recordlen, + server_ecdh_params, sizeof(server_ecdh_params), + conn->sig_alg, sig, siglen) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + } + + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certificate_verify) { + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + } + + return 1; +} + +// match the ecdhe of cipher_suite +int tls_curve_match_cipher_suite(int named_curve, int cipher_suite) +{ + switch (named_curve) { + case TLS_curve_sm2p256v1: + switch (cipher_suite) { + case TLS_cipher_ecdhe_sm4_cbc_sm3: + case TLS_cipher_ecdhe_sm4_gcm_sm3: + break; + default: + error_print(); + return -1; + } + break; + case TLS_curve_secp256r1: + if (cipher_suite != TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256) { + error_print(); + return -1; + } + break; + default: + error_print(); + return -1; + } + return 1; +} + +int tls_signature_scheme_match_cipher_suite(int sig_alg, int cipher_suite) +{ + switch (sig_alg) { + case TLS_sig_sm2sig_sm3: + switch (cipher_suite) { + case TLS_cipher_ecdhe_sm4_cbc_sm3: + case TLS_cipher_ecdhe_sm4_gcm_sm3: + case TLS_cipher_ecc_sm4_cbc_sm3: + case TLS_cipher_ecc_sm4_gcm_sm3: + break; + default: + error_print(); + return -1; + } + break; + case TLS_sig_ecdsa_secp256r1_sha256: + switch (cipher_suite) { + case TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256: + break; + default: + error_print(); + return -1; + } + break; + default: + error_print(); + return -1; + } + return 1; +} + +int tls_recv_server_key_exchange(TLS_CONNECT *conn) +{ + int ret; + uint8_t curve_type; + uint16_t named_curve; + const uint8_t *point_octets; + size_t point_octets_len; + const uint8_t *server_ecdh_params; + size_t server_ecdh_params_len; + uint16_t sig_alg; + const uint8_t *sig; + size_t siglen; + + // verify ServerKeyExchange + X509_KEY server_sign_key; + + int server_cert_index = 0; + const uint8_t *server_cert; + size_t server_cert_len; + + uint16_t tls_sig_alg; // 这个值没有初始化 + // 这属于握手过程中决定的具体算法,因此握手完成之后就应该确定下来了 + // 这应该是由cipher_suite和服务器证书中公钥(named_curve)共同决定的 + + X509_SIGN_CTX sign_ctx; + const void *sign_args = NULL; + size_t sign_argslen = 0; + + tls_trace("recv ServerKeyExchange\n"); + + + if (tls_record_recv(conn->record, &conn->recordlen, conn->sock) != 1 + || tls_record_protocol(conn->record) != conn->protocol) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + + + if (tls_record_get_handshake_server_key_exchange(conn->record, + &curve_type, &named_curve, &point_octets, &point_octets_len, + &server_ecdh_params, &server_ecdh_params_len, + &sig_alg, &sig, &siglen) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (curve_type != TLS_curve_type_named_curve) { + error_print(); + return -1; + } + // named_curve应该在supported_groups里面 + + + conn->ecdh_named_curve = named_curve; + + if (point_octets_len != 65) { + error_print(); + return -1; + } + memcpy(conn->peer_ecdh_point, point_octets, point_octets_len); + conn->peer_ecdh_point_len = point_octets_len; + + + if (tls_curve_match_cipher_suite(named_curve, conn->cipher_suite) != 1) { + error_print(); + return -1; + } + if (point_octets_len != 65) { + error_print(); + return -1; + } + if (tls_signature_scheme_match_cipher_suite(sig_alg, conn->cipher_suite) != 1) { + error_print(); + return -1; + } + + // 解析server_key_exchange, curve_type, curve_name, point 这三个信息 + // 判断curve_type == named_curve + // 判断curve_name在supported_groups中并记录这个信息 + // 验证point确实在curve_name的group中 + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certs_len) + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + + + + // get sign_key from first cert of server_certs + if (x509_certs_get_cert_by_index(conn->server_certs, conn->server_certs_len, + server_cert_index, &server_cert, &server_cert_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + if (x509_cert_get_subject_public_key(server_cert, server_cert_len, &server_sign_key) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + + // 这个检查是否是多余的? + // 这个值是签名算法和椭圆曲线名字的结合 + // cipher_suite只能决定签名算法类型 + // 公钥证书里面的公钥实际上只包含曲线的类型(而不决定签名算法,因为一个椭圆曲线本质上支持多种不同的签名算法) + switch (sig_alg) { + case TLS_sig_sm2sig_sm3: + if (server_sign_key.algor != OID_ec_public_key + || server_sign_key.algor_param != OID_sm2) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + break; + case TLS_sig_ecdsa_secp256r1_sha256: + if (server_sign_key.algor != OID_ec_public_key + || server_sign_key.algor_param != OID_secp256r1) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + break; + default: + error_print(); + return -1; + } + + if (server_sign_key.algor == OID_ec_public_key && server_sign_key.algor_param == OID_sm2) { + sign_args = SM2_DEFAULT_ID; + sign_argslen = SM2_DEFAULT_ID_LENGTH; + } + if (x509_verify_init(&sign_ctx, &server_sign_key, sign_args, sign_argslen, sig, siglen) != 1 + || x509_verify_update(&sign_ctx, conn->client_random, 32) != 1 + || x509_verify_update(&sign_ctx, conn->server_random, 32) != 1 + || x509_verify_update(&sign_ctx, server_ecdh_params, 69) != 1 + || x509_verify_finish(&sign_ctx) != 1) { + error_print(); + return -1; + } + + // xxxx + // 这里的签名错了,肯定是sign_ctx就是不对的,因此是不可能正确的 + // 现在要做的是,必须确定server_key_exchange中都包括了哪些被签名的消息 + + return 1; +} + +int tls_send_certificate_request(TLS_CONNECT *conn) +{ + int ret; + + // 如果要进行客户端证书验证,服务器要提供验证的证书,但是所有证书的 + const uint8_t cert_types[] = { TLS_cert_type_ecdsa_sign }; + uint8_t ca_names[TLS_MAX_CA_NAMES_SIZE] = {0}; // TODO: 根据客户端验证CA证书列计算缓冲大小,或直接输出到record缓冲 + size_t ca_names_len = 0; + + + if (!conn->client_certificate_verify) { + error_print(); + return -1; + } + + if (conn->recordlen == 0) { + tls_trace("send CertificateRequest\n"); + if (tls_authorities_from_certs(ca_names, &ca_names_len, sizeof(ca_names), + conn->ca_certs, conn->ca_certs_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + if (tls_record_set_handshake_certificate_request(conn->record, &conn->recordlen, + cert_types, sizeof(cert_types), + ca_names, ca_names_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + + return 1; +} + +// 如果收到的是预期的报文,就处理,然后将recordlen = 0 +// 否则保留recordlen +int tls_recv_certificate_request(TLS_CONNECT *conn) +{ + int ret; + uint8_t *record = conn->record; + size_t recordlen; + const uint8_t *cp; + size_t len; + int handshake_type; + + const uint8_t *cert_types; + size_t cert_types_len; + const uint8_t *ca_names; + size_t ca_names_len; + + + // recv CertificateRequest or ServerHelloDone + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != TLS_ERROR_RECV_AGAIN) { + error_print(); + } + return ret; + } + if (tls_record_protocol(conn->record) != conn->protocol) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (tls_record_get_handshake(record, &handshake_type, &cp, &len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (handshake_type != TLS_handshake_certificate_request) { + conn->client_certs_len = 0; + + fprintf(stderr, "%s %d: no certificate_request\n", __FILE__, __LINE__); + fprintf(stderr, "recordlen = %zu\n", conn->recordlen); + + return 0; // 表明对方没有发送预期的报文 + } + + tls_trace("recv CertificateRequest\n"); + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + if (tls_record_get_handshake_certificate_request(conn->record, + &cert_types, &cert_types_len, &ca_names, &ca_names_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if(!conn->client_certs_len) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + if (tls_cert_types_accepted(cert_types, cert_types_len, conn->client_certs, conn->client_certs_len) != 1 + || tls_authorities_issued_certificate(ca_names, ca_names_len, conn->client_certs, conn->client_certs_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_unsupported_certificate); + return -1; + } + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + + conn->recordlen = 0; + return 1; +} + +int tls_send_server_hello_done(TLS_CONNECT *conn) +{ + int ret; + tls_trace("send ServerHelloDone\n"); + + + if (conn->recordlen == 0) { + tls_record_set_handshake_server_hello_done(conn->record, &conn->recordlen); + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + } + + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + + if (conn->client_certs_len) { + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + } + return 1; +} + + +// 这是一个非常特殊的状态,其他的所有recv状态都是要读取的 +// 但是这个状态在大多数情况下,之前已经读取完了,但是我们无法判断这个信息 +int tls_recv_server_hello_done(TLS_CONNECT *conn) +{ + int ret; + tls_trace("recv ServerHelloDone\n"); + + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != TLS_ERROR_RECV_AGAIN) { + error_print(); + } + return ret; + } + if (tls_record_protocol(conn->record) != conn->protocol) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + + if (tls_record_get_handshake_server_hello_done(conn->record) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certs_len) + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + + + return 1; +} + +int tls_send_client_certificate(TLS_CONNECT *conn) +{ + int ret; + tls_trace("send ClientCertificate\n"); + + if (conn->client_certs_len == 0) { + error_print(); + return -1; + } + + if (conn->recordlen == 0) { + if (tls_record_set_handshake_certificate(conn->record, &conn->recordlen, + conn->client_certs, conn->client_certs_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + + return 1; +} + +// 只有在需要验证客户端证书的时候这个函数才执行,是否内部要判断一下 +int tls_recv_client_certificate(TLS_CONNECT *conn) +{ + int ret; + const int verify_depth = 5; + int verify_result; + + tls_trace("recv ClientCertificate\n"); + + if (conn->ca_certs_len == 0) { + error_print(); + return -1; + } + + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != TLS_ERROR_RECV_AGAIN) { + error_print(); + } + return ret; + } + if (tls_record_protocol(conn->record) != conn->protocol) { // protocol检查应该在trace之后 + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + if (tls_record_get_handshake_certificate(conn->record, conn->client_certs, &conn->client_certs_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (x509_certs_verify(conn->client_certs, conn->client_certs_len, X509_cert_chain_client, + conn->ca_certs, conn->ca_certs_len, verify_depth, &verify_result) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + + return 1; +} + +int tls_generate_keys(TLS_CONNECT *conn) +{ + uint8_t pre_master_secret[32]; + size_t pre_master_secret_len; + uint8_t key_block[96]; + + + if (x509_key_exchange(&conn->ecdh_key, + conn->peer_ecdh_point, conn->peer_ecdh_point_len, + pre_master_secret, &pre_master_secret_len) != 1) { + error_print(); + return -1; + } + if (pre_master_secret_len != sizeof(pre_master_secret)) { + error_print(); + return -1; + } + + if (tls_prf(pre_master_secret, 32, "master secret", + conn->client_random, 32, + conn->server_random, 32, + 48, conn->master_secret) != 1) { + error_print(); + return -1; + } + + if (tls_prf(conn->master_secret, 48, "key expansion", + conn->server_random, 32, + conn->client_random, 32, + 96, conn->key_block) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + + sm3_hmac_init(&conn->client_write_mac_ctx, conn->key_block, 32); + sm3_hmac_init(&conn->server_write_mac_ctx, conn->key_block + 32, 32); + + if (conn->is_client) { + sm4_set_encrypt_key(&conn->client_write_enc_key, conn->key_block + 64); + sm4_set_decrypt_key(&conn->server_write_enc_key, conn->key_block + 80); + } else { + sm4_set_decrypt_key(&conn->client_write_enc_key, conn->key_block + 64); + sm4_set_encrypt_key(&conn->server_write_enc_key, conn->key_block + 80); + } + + tls_secrets_print(stderr, + pre_master_secret, 48, + conn->client_random, conn->server_random, + conn->master_secret, + conn->key_block, 96, + 0, 4); + + return 1; +} + +int tls_send_client_key_exchange(TLS_CONNECT *conn) +{ + int ret; + uint8_t point_octets[65]; + uint8_t *p = point_octets; + size_t len = 0; + + // 客户端的ECDHE的公钥肯定和服务器是保持一致的 + // 因此在接收到服务器的公钥之后,应该保存这个信息 + + if (conn->recordlen == 0) { + if (x509_key_generate(&conn->ecdh_key, + OID_ec_public_key, tls_named_curve_oid(conn->ecdh_named_curve)) != 1) { + error_print(); + return -1; + } + if (x509_public_key_to_bytes(&conn->ecdh_key, &p, &len) != 1) { + error_print(); + return -1; + } + if (len != sizeof(point_octets)) { + error_print(); + return -1; + } + + tls_trace("send ClientKeyExchange\n"); + if (tls_record_set_handshake_client_key_exchange(conn->record, &conn->recordlen, + point_octets, len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certs_len) + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + + return 1; +} + +int tls_recv_client_key_exchange(TLS_CONNECT *conn) +{ + int ret; + const uint8_t *point_octets; + size_t point_octets_len; + + tls_trace("recv ClientKeyExchange\n"); + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != TLS_ERROR_RECV_AGAIN) { + error_print(); + } + return ret; + } + if (tls_record_protocol(conn->record) != conn->protocol) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + + if (tls_record_get_handshake_client_key_exchange(conn->record, + &point_octets, &point_octets_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (point_octets_len != 65) { + error_print(); + return -1; + } + + memcpy(conn->peer_ecdh_point, point_octets, point_octets_len); + conn->peer_ecdh_point_len = point_octets_len; + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->ca_certs_len) + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + + return 1; +} + +int tls_send_certificate_verify(TLS_CONNECT *conn) +{ + int ret; + uint8_t sig[SM2_MAX_SIGNATURE_SIZE]; + size_t siglen; + + tls_trace("send CertificateVerify\n"); + + if (!conn->client_certificate_verify) { + error_print(); + return -1; + } + + if (conn->recordlen == 0) { + if (sm2_sign_finish(&conn->sign_ctx, sig, &siglen) != 1) { + error_print(); + return -1; + } + if (tls_record_set_handshake_certificate_verify(conn->record, &conn->recordlen, sig, siglen) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + return 1; +} + +int tls_recv_certificate_verify(TLS_CONNECT *conn) +{ + int ret; + X509_KEY client_sign_key; + + const uint8_t *sig; + size_t siglen; + + const uint8_t *client_cert; + size_t client_cert_len; + + if (!conn->client_certificate_verify) { + error_print(); + return -1; + } + + tls_trace("recv CertificateVerify\n"); + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != TLS_ERROR_RECV_AGAIN) { + error_print(); + } + return ret; + } + if (tls_record_protocol(conn->record) != conn->protocol) { + tls_send_alert(conn, TLS_alert_unexpected_message); + error_print(); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + + // get signature from certificate_verify + if (tls_record_get_handshake_certificate_verify(conn->record, &sig, &siglen) != 1) { + tls_send_alert(conn, TLS_alert_unexpected_message); + error_print(); + return -1; + } + + // get sign_key from client certificate + if (x509_certs_get_cert_by_index(conn->client_certs, conn->client_certs_len, 0, + &client_cert, &client_cert_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + if (x509_cert_get_subject_public_key(client_cert, client_cert_len, &client_sign_key) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + // 这里是否要验证证书的类型呢?我们现在还不支持其他签名算法 + if (client_sign_key.algor != OID_ec_public_key + || client_sign_key.algor_param != OID_sm2) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + + if (tls_client_verify_finish(&conn->client_verify_ctx, sig, siglen, &client_sign_key.u.sm2_key) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_decrypt_error); + return -1; + } + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + + return 1; +} + +int tls_send_change_cipher_spec(TLS_CONNECT *conn) +{ + int ret; + if (conn->recordlen == 0) { + tls_trace("send [ChangeCipherSpec]\n"); + if (tls_record_set_change_cipher_spec(conn->record, &conn->recordlen) !=1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + } + if ((ret = tls_send_record(conn)) != 1) { + if (ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + return 1; +} + +int tls_recv_change_cipher_spec(TLS_CONNECT *conn) +{ + int ret; + + tls_trace("recv [ChangeCipherSpec]\n"); + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != TLS_ERROR_RECV_AGAIN) { + error_print(); + } + return ret; + } + + if (tls_record_protocol(conn->record) != conn->protocol) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + + tls12_record_trace(stderr, conn->record, conn->recordlen, 0, 0); + if (tls_record_get_change_cipher_spec(conn->record) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + return 1; +} + +int tls_send_client_finished(TLS_CONNECT *conn) +{ + int ret; + + SM3_CTX tmp_sm3_ctx; + uint8_t sm3_hash[32]; + uint8_t finished_record[TLS_FINISHED_RECORD_BUF_SIZE]; + size_t finished_record_len; + uint8_t local_verify_data[12]; + + + tls_record_set_protocol(finished_record, conn->protocol); + + if (conn->recordlen == 0) { + tls_trace("send Finished\n"); + + // 到目前为止所有消息的哈希 + memcpy(&tmp_sm3_ctx, &conn->sm3_ctx, sizeof(SM3_CTX)); + sm3_finish(&tmp_sm3_ctx, sm3_hash); + + + if (tls_prf(conn->master_secret, 48, + "client finished", sm3_hash, 32, NULL, 0, + sizeof(local_verify_data), local_verify_data) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + + // finished_record是没有问题的 + if (tls_record_set_handshake_finished(finished_record, &finished_record_len, + local_verify_data, sizeof(local_verify_data)) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + + // 此时finished_record中的头部应该是完整的 + tls12_record_trace(stderr, finished_record, finished_record_len, 0, 0); + + sm3_update(&conn->sm3_ctx, finished_record + 5, finished_record_len - 5); + + // encrypt Client Finished + + // 此时finished_record中的头部应该是完整的 + + + // encrypt Client Finished + + // 但是conn->record并没有设置 + + // 但是conn->record并没有设置 + + // 这个会把finished的头部copy过来, 但是握手的头部并没有copy + + + + if (tls_record_encrypt(&conn->client_write_mac_ctx, &conn->client_write_enc_key, + conn->client_seq_num, finished_record, finished_record_len, + conn->record, &conn->recordlen) != 1) { + + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + + // 最后输出的负载数据是80-bytes,而实际上应该是64字节,多了16字节,这显然是不对的 + // 为什么会有这样的结果呢? + + tls_encrypted_record_trace(stderr, conn->record, conn->recordlen, (1<<24), 0); // 强制打印密文原数据 + + // 这里直接就出错了 + /* + if (tls_record_decrypt(&conn->client_write_mac_ctx, &conn->client_write_enc_key, + conn->client_seq_num, conn->record, conn->recordlen, finished_record, &finished_record_len) != 1) { + error_print(); + return -1; + } + + */ + + tls_trace("encrypted ClientFinished\n"); + tls_encrypted_record_trace(stderr, conn->record, conn->recordlen, (1<<24), 0); // 强制打印密文原数据 + tls_seq_num_incr(conn->client_seq_num); + + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + + return 1; +} + +int tls_recv_client_finished(TLS_CONNECT *conn) +{ + int ret; + + uint8_t finished_record[TLS_FINISHED_RECORD_BUF_SIZE]; + size_t finished_record_len; + const uint8_t *verify_data; + size_t verify_data_len; + + uint8_t local_verify_data[12]; + + SM3_CTX tmp_sm3_ctx; + uint8_t sm3_hash[32]; + + // recv ClientFinished + tls_trace("recv Finished\n"); + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != TLS_ERROR_RECV_AGAIN) { + error_print(); + } + return ret; + } + if (tls_record_protocol(conn->record) != conn->protocol) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (conn->recordlen > sizeof(finished_record)) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + tls_encrypted_record_trace(stderr, conn->record, conn->recordlen, (1<<24), 0); // 强制打印密文原数据 + + // decrypt ClientFinished + tls_trace("decrypt Finished\n"); + + + if (tls_record_decrypt(&conn->client_write_mac_ctx, &conn->client_write_enc_key, + conn->client_seq_num, conn->record, conn->recordlen, + finished_record, &finished_record_len) != 1) { + + + error_print(); + tls_send_alert(conn, TLS_alert_bad_record_mac); + return -1; + } + tls12_record_trace(stderr, finished_record, finished_record_len, 0, 0); + tls_seq_num_incr(conn->client_seq_num); + if (tls_record_get_handshake_finished(finished_record, &verify_data, &verify_data_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_record_mac); + return -1; + } + if (verify_data_len != sizeof(local_verify_data)) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_record_mac); + return -1; + } + + // verify ClientFinished + memcpy(&tmp_sm3_ctx, &conn->sm3_ctx, sizeof(SM3_CTX)); + sm3_update(&conn->sm3_ctx, finished_record + 5, finished_record_len - 5); + sm3_finish(&tmp_sm3_ctx, sm3_hash); + if (tls_prf(conn->master_secret, 48, "client finished", sm3_hash, 32, NULL, 0, + sizeof(local_verify_data), local_verify_data) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + if (memcmp(verify_data, local_verify_data, sizeof(local_verify_data)) != 0) { + error_puts("client_finished.verify_data verification failure"); + tls_send_alert(conn, TLS_alert_decrypt_error); + return -1; + } + + return 1; +} + +int tls_send_server_finished(TLS_CONNECT *conn) +{ + int ret; + uint8_t *record = conn->record; + size_t recordlen; + uint8_t sm3_hash[32]; + uint8_t local_verify_data[12]; + + uint8_t finished_record[TLS_FINISHED_RECORD_BUF_SIZE]; + size_t finished_record_len; + + tls_record_set_protocol(finished_record, conn->protocol); + + if (conn->recordlen == 0) { + tls_trace("send Finished\n"); + sm3_finish(&conn->sm3_ctx, sm3_hash); + if (tls_prf(conn->master_secret, 48, "server finished", sm3_hash, 32, NULL, 0, + sizeof(local_verify_data), local_verify_data) != 1 + || tls_record_set_handshake_finished(finished_record, &finished_record_len, + local_verify_data, sizeof(local_verify_data)) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + tls12_record_trace(stderr, finished_record, finished_record_len, 0, 0); + if (tls_record_encrypt(&conn->server_write_mac_ctx, &conn->server_write_enc_key, + conn->server_seq_num, finished_record, finished_record_len, record, &recordlen) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + tls_trace("encrypt Finished\n"); + tls_encrypted_record_trace(stderr, record, recordlen, (1<<24), 0); // 强制打印密文原数据 + tls_seq_num_incr(conn->server_seq_num); + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + + + return 1; +} + +int tls_recv_server_finished(TLS_CONNECT *conn) +{ + int ret; + uint8_t finished_record[TLS_FINISHED_RECORD_BUF_SIZE]; + size_t finished_record_len; + + uint8_t sm3_hash[32]; + + const uint8_t *verify_data; + size_t verify_data_len; + uint8_t local_verify_data[12]; + + + // Finished + tls_trace("recv Finished\n"); + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != TLS_ERROR_RECV_AGAIN) { + error_print(); + } + return ret; + } + if (tls_record_protocol(conn->record) != conn->protocol) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (conn->recordlen > sizeof(finished_record)) { + error_print(); // 解密可能导致 finished_record 溢出 + tls_send_alert(conn, TLS_alert_bad_record_mac); + return -1; + } + tls_encrypted_record_trace(stderr, conn->record, conn->recordlen, (1<<24), 0); // 强制打印密文原数据 + + + tls_trace("decrypt Finished\n"); + if (tls_record_decrypt(&conn->server_write_mac_ctx, &conn->server_write_enc_key, + conn->server_seq_num, conn->record, conn->recordlen, finished_record, &finished_record_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_bad_record_mac); + return -1; + } + tls12_record_trace(stderr, finished_record, finished_record_len, 0, 0); + tls_seq_num_incr(conn->server_seq_num); + if (tls_record_get_handshake_finished(finished_record, &verify_data, &verify_data_len) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (verify_data_len != sizeof(local_verify_data)) { + error_print(); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + sm3_finish(&conn->sm3_ctx, sm3_hash); + if (tls_prf(conn->master_secret, 48, "server finished", + sm3_hash, 32, NULL, 0, sizeof(local_verify_data), local_verify_data) != 1) { + error_print(); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + if (memcmp(verify_data, local_verify_data, sizeof(local_verify_data)) != 0) { + error_puts("server_finished.verify_data verification failure"); + tls_send_alert(conn, TLS_alert_decrypt_error); + return -1; + } + + if (!conn->quiet) + fprintf(stderr, "Connection established!\n"); + + return 1; +} + + + /* Client Server @@ -176,921 +1920,335 @@ int tls_record_get_handshake_client_key_exchange_ecdhe(const uint8_t *record, SM */ +int tls12_do_client_handshake(TLS_CONNECT *conn) +{ + int ret; + int next_state; + + switch (conn->state) { + case TLS_state_client_hello: + ret = tls_send_client_hello(conn); + next_state = TLS_state_server_hello; + break; + + case TLS_state_server_hello: + ret = tls_recv_server_hello(conn); + next_state = TLS_state_server_certificate; + break; + + case TLS_state_server_certificate: + ret = tls_recv_server_certificate(conn); + next_state = TLS_state_server_key_exchange; + break; + + case TLS_state_server_key_exchange: + ret = tls_recv_server_key_exchange(conn); + next_state = TLS_state_certificate_request; + break; + + // the only optional state + case TLS_state_certificate_request: + fprintf(stderr, "TLS_state_certificate_request\n"); + ret = tls_recv_certificate_request(conn); + fprintf(stderr, " ret = %d\n", ret); + + if (ret == 1) conn->client_certificate_verify = 1; + next_state = TLS_state_server_hello_done; + break; + + case TLS_state_server_hello_done: + fprintf(stderr, "TLS_state_server_hello_done\n"); + ret = tls_recv_server_hello_done(conn); + if (conn->client_certificate_verify) + next_state = TLS_state_client_certificate; + else next_state = TLS_state_client_key_exchange; + break; + + case TLS_state_client_certificate: + ret = tls_send_client_certificate(conn); + next_state = TLS_state_client_key_exchange; + break; + + case TLS_state_client_key_exchange: + ret = tls_send_client_key_exchange(conn); + next_state = TLS_state_generate_keys; + break; + + case TLS_state_generate_keys: + ret = tls_generate_keys(conn); + if (conn->client_certificate_verify) + next_state = TLS_state_certificate_verify; + else next_state = TLS_state_client_change_cipher_spec; + break; + + case TLS_state_certificate_verify: + ret = tls_send_certificate_verify(conn); + next_state = TLS_state_client_change_cipher_spec; + + case TLS_state_client_change_cipher_spec: + ret = tls_send_change_cipher_spec(conn); + next_state = TLS_state_client_finished; + break; + + case TLS_state_client_finished: + ret = tls_send_client_finished(conn); + next_state = TLS_state_server_change_cipher_spec; + break; + + case TLS_state_server_change_cipher_spec: + ret = tls_recv_change_cipher_spec(conn); + next_state = TLS_state_server_finished; + break; + + case TLS_state_server_finished: + ret = tls_recv_server_finished(conn); + next_state = TLS_state_handshake_over; + break; + + default: + error_print(); + return -1; + } + + if (ret < 0) { + if (ret == TLS_ERROR_RECV_AGAIN || ret == TLS_ERROR_SEND_AGAIN) { + return ret; + } else { + error_print(); + return ret; + } + } + + conn->state = next_state; + + // ret == 0 means this step is bypassed + if (ret == 1) { + tls_clean_record(conn); + } + + return 1; +} + +int tls12_do_server_handshake(TLS_CONNECT *conn) +{ + int ret; + int next_state; + + switch (conn->state) { + case TLS_state_client_hello: + ret = tls_recv_client_hello(conn); + next_state = TLS_state_server_hello; + break; + + case TLS_state_server_hello: + ret = tls_send_server_hello(conn); + next_state = TLS_state_server_certificate; + break; + + case TLS_state_server_certificate: + ret = tls_send_server_certificate(conn); + next_state = TLS_state_server_key_exchange; + break; + + case TLS_state_server_key_exchange: + ret = tls_send_server_key_exchange(conn); + if (conn->client_certificate_verify) + next_state = TLS_state_certificate_request; + else next_state = TLS_state_server_hello_done; + break; + + case TLS_state_certificate_request: + ret = tls_send_certificate_request(conn); + next_state = TLS_state_server_hello_done; + break; + + case TLS_state_server_hello_done: + ret = tls_send_server_hello_done(conn); + if (conn->client_certificate_verify) + next_state = TLS_state_client_certificate; + else next_state = TLS_state_client_key_exchange; + break; + + case TLS_state_client_certificate: + ret = tls_recv_client_certificate(conn); + next_state = TLS_state_client_key_exchange; + break; + + case TLS_state_client_key_exchange: + ret = tls_recv_client_key_exchange(conn); + if (conn->client_certificate_verify) + next_state = TLS_state_certificate_verify; + else next_state = TLS_state_generate_keys; + break; + + case TLS_state_certificate_verify: + ret = tls_recv_certificate_verify(conn); + next_state = TLS_state_generate_keys; + break; + + case TLS_state_generate_keys: + ret = tls_generate_keys(conn); + next_state = TLS_state_client_change_cipher_spec; + break; + + case TLS_state_client_change_cipher_spec: + ret = tls_recv_change_cipher_spec(conn); + next_state = TLS_state_client_finished; + break; + + case TLS_state_client_finished: + ret = tls_recv_client_finished(conn); + next_state = TLS_state_server_change_cipher_spec; + break; + + case TLS_state_server_change_cipher_spec: + ret = tls_send_change_cipher_spec(conn); + next_state = TLS_state_server_finished; + break; + + case TLS_state_server_finished: + ret = tls_send_server_finished(conn); + next_state = TLS_state_handshake_over; + break; + + default: + error_print(); + return -1; + } + + if (ret != 1) { + if (ret == TLS_ERROR_RECV_AGAIN || ret == TLS_ERROR_SEND_AGAIN) { + return ret; + } else { + error_print(); + return ret; + } + + } + + conn->state = next_state; + + tls_clean_record(conn); + + return 1; +} + + +// 这个函数显然是不对的,因为这个函数就是一个重入的函数,重入函数不应该自己设置状态啊 +int tls12_client_handshake(TLS_CONNECT *conn) +{ + int ret; + + while (conn->state != TLS_state_handshake_over) { + + ret = tls12_do_client_handshake(conn); + + if (ret != 1) { + if (ret != TLS_ERROR_RECV_AGAIN && ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + } + + // TODO: cleanup conn? + + return 1; +} + +int tls12_server_handshake(TLS_CONNECT *conn) +{ + int ret; + + + while (conn->state != TLS_state_handshake_over) { + + ret = tls12_do_server_handshake(conn); + + if (ret != 1) { + if (ret != TLS_ERROR_RECV_AGAIN && ret != TLS_ERROR_SEND_AGAIN) { + error_print(); + } + return ret; + } + } + + // TODO: cleanup conn? + + return 1; +} + int tls12_do_connect(TLS_CONNECT *conn) { - int ret = -1; - uint8_t *record = conn->record; - uint8_t finished_record[TLS_FINISHED_RECORD_BUF_SIZE]; - size_t recordlen, finished_record_len; + int ret; + fd_set rfds; + fd_set wfds; - uint8_t client_random[32]; - uint8_t server_random[32]; - int protocol; - int cipher_suite; - const uint8_t *random; - const uint8_t *session_id; - size_t session_id_len; + conn->state = TLS_state_client_hello; + sm3_init(&conn->sm3_ctx); - uint8_t client_exts[TLS_MAX_EXTENSIONS_SIZE]; - size_t client_exts_len = 0; - const uint8_t *server_exts; - size_t server_exts_len; + while (1) { - // 扩展的协商结果,-1 表示服务器不支持该扩展(未给出响应) - int ec_point_format = -1; - int supported_group = -1; - int signature_algor = -1; + ret = tls12_client_handshake(conn); + if (ret == 1) { + break; + } else if (ret == TLS_ERROR_SEND_AGAIN) { + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_SET(conn->sock, &rfds); + select(conn->sock + 1, &rfds, &wfds, NULL, NULL); - X509_KEY server_sign_key; - SM2_SIGN_CTX sign_ctx; - const uint8_t *sig; - size_t siglen; - uint8_t pre_master_secret[48]; - SM3_CTX sm3_ctx; - SM3_CTX tmp_sm3_ctx; - uint8_t sm3_hash[32]; - const uint8_t *verify_data; - size_t verify_data_len; - uint8_t local_verify_data[12]; - int handshake_type; + } else if (ret == TLS_ERROR_RECV_AGAIN) { + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_SET(conn->sock, &wfds); + select(conn->sock + 1, &rfds, &wfds, NULL, NULL); - const uint8_t *cp; - uint8_t *p; - size_t len; - - int depth = 5; - int alert = 0; - int verify_result; - - - // 初始化记录缓冲 - tls_record_set_protocol(record, TLS_protocol_tls1); // ClientHello的记录层协议版本是TLSv1.0 - tls_record_set_protocol(finished_record, conn->protocol); - - // 准备Finished Context(和ClientVerify) - sm3_init(&sm3_ctx); - if (conn->client_certs_len) - sm2_sign_init(&sign_ctx, &conn->sign_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH); - - - // send ClientHello - tls_random_generate(client_random); - int ec_point_formats[] = { TLS_point_uncompressed }; - size_t ec_point_formats_cnt = 1; - int supported_groups[] = { TLS_curve_sm2p256v1 }; - size_t supported_groups_cnt = 1; - int signature_algors[] = { TLS_sig_sm2sig_sm3 }; - size_t signature_algors_cnt = 1; - - - p = client_exts; - client_exts_len = 0; - - tls_ec_point_formats_ext_to_bytes(ec_point_formats, ec_point_formats_cnt, &p, &client_exts_len); - tls_supported_groups_ext_to_bytes(supported_groups, supported_groups_cnt, &p, &client_exts_len); - tls_signature_algorithms_ext_to_bytes(signature_algors, signature_algors_cnt, &p, &client_exts_len); - - if (tls_record_set_handshake_client_hello(record, &recordlen, - conn->protocol, client_random, NULL, 0, - tls12_ciphers, tls12_ciphers_count, - client_exts, client_exts_len) != 1) { - error_print(); - goto end; - } - tls_trace("send ClientHello\n"); - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - if (conn->client_certs_len) - sm2_sign_update(&sign_ctx, record + 5, recordlen - 5); - - // recv ServerHello - tls_trace("recv ServerHello\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_protocol(record) != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_protocol_version); - goto end; - } - if (tls_record_get_handshake_server_hello(record, - &protocol, &random, &session_id, &session_id_len, &cipher_suite, - &server_exts, &server_exts_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - if (protocol != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_protocol_version); - goto end; - } - // tls12_ciphers 应该改为conn的内部变量 - if (tls_cipher_suite_in_list(cipher_suite, tls12_ciphers, tls12_ciphers_count) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_handshake_failure); - goto end; - } - if (!server_exts) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - if (tls_process_server_hello_exts(server_exts, server_exts_len, &ec_point_format, &supported_group, &signature_algor) != 1 - || ec_point_format < 0 - || supported_group < 0 - || signature_algor < 0) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - memcpy(server_random, random, 32); - memcpy(conn->session_id, session_id, session_id_len); - conn->cipher_suite = cipher_suite; - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - if (conn->client_certs_len) - sm2_sign_update(&sign_ctx, record + 5, recordlen - 5); - - // recv ServerCertificate - tls_trace("recv ServerCertificate\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1 - || tls_record_protocol(record) != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - - if (tls_record_get_handshake_certificate(record, - conn->server_certs, &conn->server_certs_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - if (conn->client_certs_len) - sm2_sign_update(&sign_ctx, record + 5, recordlen - 5); - - // verify ServerCertificate - if (x509_certs_verify(conn->server_certs, conn->server_certs_len, X509_cert_chain_server, - conn->ca_certs, conn->ca_certs_len, depth, &verify_result) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_bad_certificate); - goto end; - } - - // recv ServerKeyExchange - tls_trace("recv ServerKeyExchange\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1 - || tls_record_protocol(record) != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - - int curve; - SM2_Z256_POINT server_ecdhe_public; - if (tls_record_get_handshake_server_key_exchange_ecdhe(record, &curve, &server_ecdhe_public, &sig, &siglen) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - if (curve != TLS_curve_sm2p256v1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - if (conn->client_certs_len) - sm2_sign_update(&sign_ctx, record + 5, recordlen - 5); - - // verify ServerKeyExchange - if (x509_certs_get_cert_by_index(conn->server_certs, conn->server_certs_len, 0, &cp, &len) != 1 - || x509_cert_get_subject_public_key(cp, len, &server_sign_key) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_bad_certificate); - goto end; - } - if (server_sign_key.algor != OID_ec_public_key - || server_sign_key.algor_param != OID_sm2) { - error_print(); - tls_send_alert(conn, TLS_alert_bad_certificate); - goto end; - } - if (tls_verify_server_ecdh_params(&server_sign_key.u.sm2_key, // 这应该是签名公钥 - client_random, server_random, curve, &server_ecdhe_public, sig, siglen) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - - // recv CertificateRequest or ServerHelloDone - if (tls_record_recv(record, &recordlen, conn->sock) != 1 - || tls_record_protocol(record) != conn->protocol - || tls_record_get_handshake(record, &handshake_type, &cp, &len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - if (handshake_type == TLS_handshake_certificate_request) { - const uint8_t *cert_types; - size_t cert_types_len; - const uint8_t *ca_names; - size_t ca_names_len; - - // recv CertificateRequest - tls_trace("recv CertificateRequest\n"); - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_get_handshake_certificate_request(record, - &cert_types, &cert_types_len, &ca_names, &ca_names_len) != 1) { + } else { error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; + return -1; } - if(!conn->client_certs_len) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - if (tls_cert_types_accepted(cert_types, cert_types_len, conn->client_certs, conn->client_certs_len) != 1 - || tls_authorities_issued_certificate(ca_names, ca_names_len, conn->client_certs, conn->client_certs_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unsupported_certificate); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - sm2_sign_update(&sign_ctx, record + 5, recordlen - 5); - - // recv ServerHelloDone - if (tls_record_recv(record, &recordlen, conn->sock) != 1 - || tls_record_protocol(record) != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - } else { - // 这个得处理一下 - conn->client_certs_len = 0; - gmssl_secure_clear(&conn->sign_key, sizeof(SM2_KEY)); - } - tls_trace("recv ServerHelloDone\n"); - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_get_handshake_server_hello_done(record) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - if (conn->client_certs_len) - sm2_sign_update(&sign_ctx, record + 5, recordlen - 5); - - // send ClientCertificate - if (conn->client_certs_len) { - tls_trace("send ClientCertificate\n"); - if (tls_record_set_handshake_certificate(record, &recordlen, conn->client_certs, conn->client_certs_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - sm2_sign_update(&sign_ctx, record + 5, recordlen - 5); } - // generate MASTER_SECRET - tls_trace("generate secrets\n"); - SM2_KEY client_ecdh; - sm2_key_generate(&client_ecdh); - sm2_do_ecdh(&client_ecdh, &server_ecdhe_public, &server_ecdhe_public); - - // 需要重新考虑在TLS中是用sm2_do_ecdh还是sm2_ecdh,sm2_ecdh对nistp256的兼容性更好 - uint8_t point_bytes[64]; - sm2_z256_point_to_bytes(&server_ecdhe_public, point_bytes); - - memcpy(pre_master_secret, point_bytes, 32); // 这个做法很不优雅 - // ECDHE和ECC的PMS结构是不一样的吗? - - if (tls_prf(pre_master_secret, 32, "master secret", - client_random, 32, server_random, 32, - 48, conn->master_secret) != 1 - || tls_prf(conn->master_secret, 48, "key expansion", - server_random, 32, client_random, 32, - 96, conn->key_block) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - sm3_hmac_init(&conn->client_write_mac_ctx, conn->key_block, 32); - sm3_hmac_init(&conn->server_write_mac_ctx, conn->key_block + 32, 32); - sm4_set_encrypt_key(&conn->client_write_enc_key, conn->key_block + 64); - sm4_set_decrypt_key(&conn->server_write_enc_key, conn->key_block + 80); - - tls_secrets_print(stderr, - pre_master_secret, 48, - client_random, server_random, - conn->master_secret, - conn->key_block, 96, - 0, 4); - - // send ClientKeyExchange - tls_trace("send ClientKeyExchange\n"); - if (tls_record_set_handshake_client_key_exchange_ecdhe(record, &recordlen, &client_ecdh.public_key) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - if (conn->client_certs_len) - sm2_sign_update(&sign_ctx, record + 5, recordlen - 5); - - // send CertificateVerify - if (conn->client_certs_len) { - tls_trace("send CertificateVerify\n"); - uint8_t sigbuf[SM2_MAX_SIGNATURE_SIZE]; - if (sm2_sign_finish(&sign_ctx, sigbuf, &siglen) != 1 - || tls_record_set_handshake_certificate_verify(record, &recordlen, sigbuf, siglen) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - } - - // send [ChangeCipherSpec] - tls_trace("send [ChangeCipherSpec]\n"); - if (tls_record_set_change_cipher_spec(record, &recordlen) !=1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - - // send Client Finished - tls_trace("send Finished\n"); - memcpy(&tmp_sm3_ctx, &sm3_ctx, sizeof(sm3_ctx)); - sm3_finish(&tmp_sm3_ctx, sm3_hash); - if (tls_prf(conn->master_secret, 48, "client finished", - sm3_hash, 32, NULL, 0, sizeof(local_verify_data), local_verify_data) != 1 - || tls_record_set_handshake_finished(finished_record, &finished_record_len, - local_verify_data, sizeof(local_verify_data)) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - tls12_record_trace(stderr, finished_record, finished_record_len, 0, 0); - sm3_update(&sm3_ctx, finished_record + 5, finished_record_len - 5); - - // encrypt Client Finished - tls_trace("encrypt Finished\n"); - if (tls_record_encrypt(&conn->client_write_mac_ctx, &conn->client_write_enc_key, - conn->client_seq_num, finished_record, finished_record_len, record, &recordlen) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - tls12_record_trace(stderr, record, recordlen, (1<<24), 0); // 强制打印密文原数据 - tls_seq_num_incr(conn->client_seq_num); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - - // [ChangeCipherSpec] - tls_trace("recv [ChangeCipherSpec]\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1 - || tls_record_protocol(record) != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_get_change_cipher_spec(record) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - - // Finished - tls_trace("recv Finished\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1 - || tls_record_protocol(record) != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - if (recordlen > sizeof(finished_record)) { - error_print(); // 解密可能导致 finished_record 溢出 - tls_send_alert(conn, TLS_alert_bad_record_mac); - goto end; - } - tls12_record_trace(stderr, record, recordlen, (1<<24), 0); // 强制打印密文原数据 - tls_trace("decrypt Finished\n"); - if (tls_record_decrypt(&conn->server_write_mac_ctx, &conn->server_write_enc_key, - conn->server_seq_num, record, recordlen, finished_record, &finished_record_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_bad_record_mac); - goto end; - } - tls12_record_trace(stderr, finished_record, finished_record_len, 0, 0); - tls_seq_num_incr(conn->server_seq_num); - if (tls_record_get_handshake_finished(finished_record, &verify_data, &verify_data_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - if (verify_data_len != sizeof(local_verify_data)) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - sm3_finish(&sm3_ctx, sm3_hash); - if (tls_prf(conn->master_secret, 48, "server finished", - sm3_hash, 32, NULL, 0, sizeof(local_verify_data), local_verify_data) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - if (memcmp(verify_data, local_verify_data, sizeof(local_verify_data)) != 0) { - error_print(); - tls_send_alert(conn, TLS_alert_decrypt_error); - goto end; - } - - if (!conn->quiet) - fprintf(stderr, "Connection established!\n"); - - conn->protocol = conn->protocol; - conn->cipher_suite = cipher_suite; - - ret = 1; - -end: - gmssl_secure_clear(&sign_ctx, sizeof(sign_ctx)); - gmssl_secure_clear(pre_master_secret, sizeof(pre_master_secret)); - return ret; + return 1; } int tls12_do_accept(TLS_CONNECT *conn) { - int ret = -1; + int ret; + fd_set rfds; + fd_set wfds; - int client_verify = 0; + conn->state = TLS_state_client_hello; - uint8_t *record = conn->record; - uint8_t finished_record[TLS_FINISHED_RECORD_BUF_SIZE]; // 解密可能导致前面的record被覆盖 - size_t recordlen, finished_record_len; + sm3_init(&conn->sm3_ctx); - // 这个ciphers不是应该在CTX中设置的吗 - const int server_ciphers[] = { TLS_cipher_ecdhe_sm4_cbc_sm3 }; // 未来应该支持GCM/CBC两个套件 + while (1) { - // ClientHello, ServerHello - uint8_t client_random[32]; - uint8_t server_random[32]; - int protocol; - const uint8_t *random; - const uint8_t *session_id; // TLCP服务器忽略客户端SessionID,也不主动设置SessionID - size_t session_id_len; - const uint8_t *client_ciphers; - size_t client_ciphers_len; - const uint8_t *client_exts; - size_t client_exts_len; - uint8_t server_exts[TLS_MAX_EXTENSIONS_SIZE]; - size_t server_exts_len; - int curve = TLS_curve_sm2p256v1; // 这个是否应该在conn中设置? + ret = tls12_server_handshake(conn); - // ServerKeyExchange - SM2_KEY server_ecdhe_key; - SM2_SIGN_CTX sign_ctx; - uint8_t sigbuf[SM2_MAX_SIGNATURE_SIZE]; - size_t siglen; + if (ret == 1) { + break; - // ClientCertificate, CertificateVerify - TLS_CLIENT_VERIFY_CTX client_verify_ctx; - X509_KEY client_sign_key; - const uint8_t *sig; - const int verify_depth = 5; - int verify_result; + } else if (ret == TLS_ERROR_SEND_AGAIN) { + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_SET(conn->sock, &rfds); + select(conn->sock + 1, &rfds, &wfds, NULL, NULL); - // ClientKeyExchange - SM2_Z256_POINT client_ecdhe_point; - uint8_t pre_master_secret[SM2_MAX_PLAINTEXT_SIZE]; // sm2_decrypt 保证输出不会溢出 + } else if (ret == TLS_ERROR_RECV_AGAIN) { + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_SET(conn->sock, &wfds); + select(conn->sock + 1, &rfds, &wfds, NULL, NULL); - // Finished - SM3_CTX sm3_ctx; - SM3_CTX tmp_sm3_ctx; - uint8_t sm3_hash[32]; - uint8_t local_verify_data[12]; - const uint8_t *verify_data; - size_t verify_data_len; - - const uint8_t *cp; - size_t len; - - - // 服务器端如果设置了CA - if (conn->ca_certs_len) - client_verify = 1; - - // 初始化Finished和客户端验证环境 - sm3_init(&sm3_ctx); - if (client_verify) - tls_client_verify_init(&client_verify_ctx); - - - // recv ClientHello - tls_trace("recv ClientHello\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_protocol(record) != conn->protocol - && tls_record_protocol(record) != TLS_protocol_tls1) { - error_print(); - tls_send_alert(conn, TLS_alert_protocol_version); - goto end; - } - if (tls_record_get_handshake_client_hello(record, - &protocol, &random, &session_id, &session_id_len, - &client_ciphers, &client_ciphers_len, - &client_exts, &client_exts_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - if (protocol != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_protocol_version); - goto end; - } - memcpy(client_random, random, 32); - if (tls_cipher_suites_select(client_ciphers, client_ciphers_len, - server_ciphers, sizeof(server_ciphers)/sizeof(server_ciphers[0]), - &conn->cipher_suite) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_insufficient_security); - goto end; - } - if (client_exts) { - server_exts_len = 0; - curve = TLS_curve_sm2p256v1; - - tls_process_client_hello_exts(client_exts, client_exts_len, server_exts, &server_exts_len, sizeof(server_exts)); - - - - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - if (client_verify) - tls_client_verify_update(&client_verify_ctx, record + 5, recordlen - 5); - - - // send ServerHello - tls_trace("send ServerHello\n"); - tls_random_generate(server_random); - tls_record_set_protocol(record, conn->protocol); - if (tls_record_set_handshake_server_hello(record, &recordlen, - conn->protocol, server_random, NULL, 0, - conn->cipher_suite, server_exts, server_exts_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - if (client_verify) - tls_client_verify_update(&client_verify_ctx, record + 5, recordlen - 5); - - // send ServerCertificate - tls_trace("send ServerCertificate\n"); - if (tls_record_set_handshake_certificate(record, &recordlen, - conn->server_certs, conn->server_certs_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - if (client_verify) - tls_client_verify_update(&client_verify_ctx, record + 5, recordlen - 5); - - // send ServerKeyExchange - tls_trace("send ServerKeyExchange\n"); - sm2_key_generate(&server_ecdhe_key); - if (tls_sign_server_ecdh_params(&conn->sign_key, - client_random, server_random, TLS_curve_sm2p256v1, &server_ecdhe_key.public_key, - sigbuf, &siglen) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - return -1; - } - if (tls_record_set_handshake_server_key_exchange_ecdhe(record, &recordlen, - curve, &server_ecdhe_key.public_key, sigbuf, siglen) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - if (client_verify) - tls_client_verify_update(&client_verify_ctx, record + 5, recordlen - 5); - - // send CertificateRequest - if (client_verify) { - const uint8_t cert_types[] = { TLS_cert_type_ecdsa_sign }; - uint8_t ca_names[TLS_MAX_CA_NAMES_SIZE] = {0}; // TODO: 根据客户端验证CA证书列计算缓冲大小,或直接输出到record缓冲 - size_t ca_names_len = 0; - - tls_trace("send CertificateRequest\n"); - if (tls_authorities_from_certs(ca_names, &ca_names_len, sizeof(ca_names), - conn->ca_certs, conn->ca_certs_len) != 1) { + } else { error_print(); - goto end; + return -1; } - if (tls_record_set_handshake_certificate_request(record, &recordlen, - cert_types, sizeof(cert_types), - ca_names, ca_names_len) != 1) { - error_print(); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - tls_client_verify_update(&client_verify_ctx, record + 5, recordlen - 5); } - // send ServerHelloDone - tls_trace("send ServerHelloDone\n"); - tls_record_set_handshake_server_hello_done(record, &recordlen); - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - if (client_verify) - tls_client_verify_update(&client_verify_ctx, record + 5, recordlen - 5); - - // recv ClientCertificate - if (conn->ca_certs_len) { - tls_trace("recv ClientCertificate\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1 - || tls_record_protocol(record) != conn->protocol) { // protocol检查应该在trace之后 - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_get_handshake_certificate(record, conn->client_certs, &conn->client_certs_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - if (x509_certs_verify(conn->client_certs, conn->client_certs_len, X509_cert_chain_client, - conn->ca_certs, conn->ca_certs_len, verify_depth, &verify_result) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_bad_certificate); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - tls_client_verify_update(&client_verify_ctx, record + 5, recordlen - 5); - } - - // recv ClientKeyExchange - tls_trace("recv ClientKeyExchange\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1 - || tls_record_protocol(record) != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); // 应该给tls12一个独立的trace - if (tls_record_get_handshake_client_key_exchange_ecdhe(record, &client_ecdhe_point) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - if (client_verify) - tls_client_verify_update(&client_verify_ctx, record + 5, recordlen - 5); - - // recv CertificateVerify - if (client_verify) { - tls_trace("recv CertificateVerify\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1 - || tls_record_protocol(record) != conn->protocol) { - tls_send_alert(conn, TLS_alert_unexpected_message); - error_print(); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_get_handshake_certificate_verify(record, &sig, &siglen) != 1) { - tls_send_alert(conn, TLS_alert_unexpected_message); - error_print(); - goto end; - } - if (x509_certs_get_cert_by_index(conn->client_certs, conn->client_certs_len, 0, &cp, &len) != 1 - || x509_cert_get_subject_public_key(cp, len, &client_sign_key) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_bad_certificate); - goto end; - } - if (client_sign_key.algor != OID_ec_public_key - || client_sign_key.algor_param != OID_sm2) { - error_print(); - tls_send_alert(conn, TLS_alert_bad_certificate); - goto end; - } - if (tls_client_verify_finish(&client_verify_ctx, sig, siglen, &client_sign_key.u.sm2_key) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_decrypt_error); - goto end; - } - sm3_update(&sm3_ctx, record + 5, recordlen - 5); - } - - // generate secrets - tls_trace("generate secrets\n"); - sm2_do_ecdh(&server_ecdhe_key, &client_ecdhe_point, &client_ecdhe_point); - - uint8_t point_bytes[64]; - sm2_z256_point_to_bytes(&client_ecdhe_point, point_bytes); - memcpy(pre_master_secret, point_bytes, 32); // 这里应该修改一下表示方式,比如get_xy() - - tls_prf(pre_master_secret, 32, "master secret", - client_random, 32, server_random, 32, - 48, conn->master_secret); - tls_prf(conn->master_secret, 48, "key expansion", - server_random, 32, client_random, 32, - 96, conn->key_block); - sm3_hmac_init(&conn->client_write_mac_ctx, conn->key_block, 32); - sm3_hmac_init(&conn->server_write_mac_ctx, conn->key_block + 32, 32); - sm4_set_decrypt_key(&conn->client_write_enc_key, conn->key_block + 64); - sm4_set_encrypt_key(&conn->server_write_enc_key, conn->key_block + 80); - - tls_secrets_print(stderr, pre_master_secret, 48, client_random, server_random, - conn->master_secret, conn->key_block, 96, 0, 4); - - // recv [ChangeCipherSpec] - tls_trace("recv [ChangeCipherSpec]\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1 - || tls_record_protocol(record) != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_get_change_cipher_spec(record) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - - // recv ClientFinished - tls_trace("recv Finished\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1 - || tls_record_protocol(record) != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - if (recordlen > sizeof(finished_record)) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - goto end; - } - tls12_record_trace(stderr, record, recordlen, (1<<24), 0); // 强制打印密文原数据 - - // decrypt ClientFinished - tls_trace("decrypt Finished\n"); - if (tls_record_decrypt(&conn->client_write_mac_ctx, &conn->client_write_enc_key, - conn->client_seq_num, record, recordlen, finished_record, &finished_record_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_bad_record_mac); - goto end; - } - tls12_record_trace(stderr, finished_record, finished_record_len, 0, 0); - tls_seq_num_incr(conn->client_seq_num); - if (tls_record_get_handshake_finished(finished_record, &verify_data, &verify_data_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_bad_record_mac); - goto end; - } - if (verify_data_len != sizeof(local_verify_data)) { - error_print(); - tls_send_alert(conn, TLS_alert_bad_record_mac); - goto end; - } - - // verify ClientFinished - memcpy(&tmp_sm3_ctx, &sm3_ctx, sizeof(SM3_CTX)); - sm3_update(&sm3_ctx, finished_record + 5, finished_record_len - 5); - sm3_finish(&tmp_sm3_ctx, sm3_hash); - if (tls_prf(conn->master_secret, 48, "client finished", sm3_hash, 32, NULL, 0, - sizeof(local_verify_data), local_verify_data) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - if (memcmp(verify_data, local_verify_data, sizeof(local_verify_data)) != 0) { - error_puts("client_finished.verify_data verification failure"); - tls_send_alert(conn, TLS_alert_decrypt_error); - goto end; - } - - // send [ChangeCipherSpec] - tls_trace("send [ChangeCipherSpec]\n"); - if (tls_record_set_change_cipher_spec(record, &recordlen) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - - // send ServerFinished - tls_trace("send Finished\n"); - sm3_finish(&sm3_ctx, sm3_hash); - if (tls_prf(conn->master_secret, 48, "server finished", sm3_hash, 32, NULL, 0, - sizeof(local_verify_data), local_verify_data) != 1 - || tls_record_set_handshake_finished(finished_record, &finished_record_len, - local_verify_data, sizeof(local_verify_data)) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - tls12_record_trace(stderr, finished_record, finished_record_len, 0, 0); - if (tls_record_encrypt(&conn->server_write_mac_ctx, &conn->server_write_enc_key, - conn->server_seq_num, finished_record, finished_record_len, record, &recordlen) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_internal_error); - goto end; - } - tls_trace("encrypt Finished\n"); - tls12_record_trace(stderr, record, recordlen, (1<<24), 0); // 强制打印密文原数据 - tls_seq_num_incr(conn->server_seq_num); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - goto end; - } - - conn->protocol = conn->protocol; - - if (!conn->quiet) - fprintf(stderr, "Connection Established!\n\n"); - - ret = 1; - -end: - gmssl_secure_clear(&sign_ctx, sizeof(sign_ctx)); - gmssl_secure_clear(pre_master_secret, sizeof(pre_master_secret)); - if (client_verify) tls_client_verify_cleanup(&client_verify_ctx); - return ret; + return 1; } + diff --git a/src/tls12_handshake.c b/src/tls12_handshake.c deleted file mode 100644 index 5a6a6d1f..00000000 --- a/src/tls12_handshake.c +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright 2014-2026 The GmSSL Project. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -enum { - TLS_state_client_hello, - TLS_state_server_hello, - TLS_state_server_certificate, - TLS_state_server_key_exchange, - TLS_state_server_certificate_request, - TLS_state_server_hello_done, - TLS_state_client_certificate, - TLS_state_client_key_exchange, - TLS_state_client_certificate_verify, - TLS_state_client_change_cipher_spec, - TLS_state_client_finished, - TLS_state_server_change_cipher_spec, - TLS_state_server_finished, -}; - -static const int tls12_ciphers[] = { - TLS_cipher_ecdhe_sm4_cbc_sm3, -}; - -int tls_send_client_hello(TLS_CONNECT *conn) -{ - const int ec_point_formats[] = { TLS_point_uncompressed }; - size_t ec_point_formats_cnt = sizeof(ec_point_formats)/sizeof(ec_point_formats[0]); - const int supported_groups[] = { TLS_curve_sm2p256v1 }; - size_t supported_groups_cnt = sizeof(supported_groups)/sizeof(supported_groups[0]); - const int signature_algors[] = { TLS_sig_sm2sig_sm3 }; - size_t signature_algors_cnt = sizeof(signature_algors)/sizeof(signature_algors[0]); - - uint8_t *record; - size_t recordlen; - uint8_t client_random[32]; - uint8_t client_exts[TLS_MAX_EXTENSIONS_SIZE]; - size_t client_exts_len; - uint8_t *p; - - record = conn->record; - - tls_record_set_protocol(record, TLS_protocol_tls1); - - sm3_init(&conn->sm3_ctx); - if (conn->client_certs_len) - sm2_sign_init(&conn->sign_ctx, &conn->sign_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH); - - - tls_random_generate(client_random); - - p = client_exts; - client_exts_len = 0; - tls_ec_point_formats_ext_to_bytes(ec_point_formats, ec_point_formats_cnt, &p, &client_exts_len); - tls_supported_groups_ext_to_bytes(supported_groups, supported_groups_cnt, &p, &client_exts_len); - tls_signature_algorithms_ext_to_bytes(signature_algors, signature_algors_cnt, &p, &client_exts_len); - - if (tls_record_set_handshake_client_hello(conn->record, &recordlen, - conn->protocol, client_random, NULL, 0, - tls12_ciphers, sizeof(tls12_ciphers)/sizeof(tls12_ciphers[0]), - client_exts, client_exts_len) != 1) { - error_print(); - return -1; - } - tls_trace("send ClientHello\n"); - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_send(record, recordlen, conn->sock) != 1) { - error_print(); - return -1; - } - sm3_update(&conn->sm3_ctx, record + 5, recordlen - 5); - if (conn->client_certs_len) { - sm2_sign_update(&conn->sign_ctx, record + 5, recordlen - 5); - } - - return 1; -} - -int tls_recv_server_hello(TLS_CONNECT *conn) -{ - uint8_t *record = conn->record; - size_t recordlen; - - tls_trace("recv ServerHello\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - return -1; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - if (tls_record_protocol(record) != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_protocol_version); - return -1; - } - - // 这些值要放在哪儿呢?是否放在CONNECT中 - int protocol; - int cipher_suite; - uint8_t server_random[32]; - const uint8_t *random; - const uint8_t *session_id; - size_t session_id_len; - const uint8_t *server_exts; - size_t server_exts_len; - - // 扩展的协商结果,-1 表示服务器不支持该扩展(未给出响应) - int ec_point_format = -1; - int supported_group = -1; - int signature_algor = -1; - - if (tls_record_get_handshake_server_hello(record, - &protocol, &random, &session_id, &session_id_len, &cipher_suite, - &server_exts, &server_exts_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - return -1; - } - if (protocol != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_protocol_version); - return -1; - } - // tls12_ciphers 应该改为conn的内部变量 - if (tls_cipher_suite_in_list(cipher_suite, tls12_ciphers, sizeof(tls12_ciphers)/sizeof(tls12_ciphers[0])) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_handshake_failure); - return -1; - } - if (!server_exts) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - return -1; - } - if (tls_process_server_hello_exts(server_exts, server_exts_len, &ec_point_format, &supported_group, &signature_algor) != 1 - || ec_point_format < 0 - || supported_group < 0 - || signature_algor < 0) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - return -1; - } - - memcpy(server_random, random, 32); - memcpy(conn->session_id, session_id, session_id_len); - conn->cipher_suite = cipher_suite; - sm3_update(&conn->sm3_ctx, record + 5, recordlen - 5); - if (conn->client_certs_len) { - sm2_sign_update(&conn->sign_ctx, record + 5, recordlen - 5); - } - - return 1; -} - -int tls_recv_server_certificate(TLS_CONNECT *conn) -{ - const int depth = 5; - uint8_t *record = conn->record; - size_t recordlen; - int verify_result; - - // recv ServerCertificate - tls_trace("recv ServerCertificate\n"); - if (tls_record_recv(record, &recordlen, conn->sock) != 1 - || tls_record_protocol(record) != conn->protocol) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - return -1; - } - tls12_record_trace(stderr, record, recordlen, 0, 0); - - if (tls_record_get_handshake_certificate(record, - conn->server_certs, &conn->server_certs_len) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_unexpected_message); - return -1; - } - sm3_update(&conn->sm3_ctx, record + 5, recordlen - 5); - if (conn->client_certs_len) - sm2_sign_update(&conn->sign_ctx, record + 5, recordlen - 5); - - // verify ServerCertificate - if (x509_certs_verify(conn->server_certs, conn->server_certs_len, X509_cert_chain_server, - conn->ca_certs, conn->ca_certs_len, depth, &verify_result) != 1) { - error_print(); - tls_send_alert(conn, TLS_alert_bad_certificate); - return -1; - } - - return 1; -} - -int tls_recv_server_key_exchange(TLS_CONNECT *conn) -{ - return 1; -} - -int tls_recv_server_certificate_request(TLS_CONNECT *conn) -{ - return 1; -} - -int tls_recv_server_hello_done(TLS_CONNECT *conn) -{ - return 1; -} - -int tls_send_client_certificate(TLS_CONNECT *conn) -{ - return 1; -} - -int tls_send_client_key_exchange(TLS_CONNECT *conn) -{ - return 1; -} - -int tls_send_certificate_verify(TLS_CONNECT *conn) -{ - return 1; -} - -int tls_send_client_finished(TLS_CONNECT *conn) -{ - return 1; -} - -int tls_recv_server_change_cipher_spec(TLS_CONNECT *conn) -{ - return 1; -} - -int tls_recv_server_finished(TLS_CONNECT *conn) -{ - return 1; -} - - -int tls12_client_handshake(TLS_CONNECT *conn) -{ - int ret; - - switch (conn->state) { - case TLS_state_client_hello: - ret = tls_send_client_hello(conn); - break; - case TLS_state_server_hello: - ret = tls_recv_server_hello(conn); - break; - case TLS_state_server_certificate: - ret = tls_recv_server_certificate(conn); - break; - case TLS_state_server_key_exchange: - ret = tls_recv_server_key_exchange(conn); - break; - case TLS_state_server_certificate_request: - ret = tls_recv_server_certificate_request(conn); - break; - case TLS_state_server_hello_done: - ret = tls_recv_server_hello_done(conn); - break; - case TLS_state_client_certificate: - ret = tls_send_client_certificate(conn); - break; - case TLS_state_client_key_exchange: - ret = tls_send_client_key_exchange(conn); - break; - case TLS_state_client_certificate_verify: - ret = tls_send_certificate_verify(conn); - case TLS_state_client_change_cipher_spec: - break; - case TLS_state_client_finished: - ret = tls_send_client_finished(conn); - break; - case TLS_state_server_change_cipher_spec: - ret = tls_recv_server_change_cipher_spec(conn); - break; - case TLS_state_server_finished: - ret = tls_recv_server_finished(conn); - break; - default: - error_print(); - return -1; - } - return 1; -} - - diff --git a/src/tls_ext.c b/src/tls_ext.c index 2f4020d3..784c5350 100644 --- a/src/tls_ext.c +++ b/src/tls_ext.c @@ -176,7 +176,7 @@ int tls_supported_groups_ext_to_bytes(const int *groups, size_t groups_cnt, tls_uint16_to_bytes((uint16_t)ext_datalen, out, outlen); tls_uint16_to_bytes((uint16_t)named_group_list_len, out, outlen); for (i = 0; i < groups_cnt; i++) { - if (!tls_curve_name(groups[i])) { + if (!tls_named_curve_name(groups[i])) { error_print(); return -1; } @@ -204,7 +204,7 @@ int tls_process_client_supported_groups(const uint8_t *ext_data, size_t ext_data error_print(); return -1; } - if (!tls_curve_name(group)) { + if (!tls_named_curve_name(group)) { error_print(); return -1; } @@ -599,7 +599,7 @@ int tls13_key_share_ext_print(FILE *fp, int fmt, int ind, int handshake_type, co ind += 4; while (client_shares_len) { if (tls_uint16_from_bytes(&group, &client_shares, &client_shares_len) != 1) goto err; - format_print(fp, fmt, ind, "group: %s (0x%04x)\n", tls_curve_name(group), group); + format_print(fp, fmt, ind, "group: %s (0x%04x)\n", tls_named_curve_name(group), group); if (tls_uint16array_from_bytes(&key_exchange, &key_exchange_len, &client_shares, &client_shares_len) != 1) goto err; format_bytes(fp, fmt, ind, "key_exchange", key_exchange, key_exchange_len); } @@ -608,7 +608,7 @@ int tls13_key_share_ext_print(FILE *fp, int fmt, int ind, int handshake_type, co format_print(fp, fmt, ind, "server_share\n"); ind += 4; if (tls_uint16_from_bytes(&group, &data, &datalen) != 1) goto err; - format_print(fp, fmt, ind, "group: %s (0x%04x)\n", tls_curve_name(group), group); + format_print(fp, fmt, ind, "group: %s (0x%04x)\n", tls_named_curve_name(group), group); if (tls_uint16array_from_bytes(&key_exchange, &key_exchange_len, &data, &datalen) != 1) goto err; format_bytes(fp, fmt, ind, "key_exchange", key_exchange, key_exchange_len); break; @@ -730,7 +730,7 @@ int tls13_process_client_key_share(const uint8_t *ext_data, size_t ext_datalen, error_print(); return -1; } - if (!tls_curve_name(group)) { + if (!tls_named_curve_name(group)) { error_print(); return -1; } diff --git a/src/tls_trace.c b/src/tls_trace.c index b30c2953..7d8e3ffa 100644 --- a/src/tls_trace.c +++ b/src/tls_trace.c @@ -1,5 +1,5 @@ /* - * Copyright 2014-2024 The GmSSL Project. All Rights Reserved. + * Copyright 2014-2026 The GmSSL Project. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the License); you may * not use this file except in compliance with the License. @@ -67,6 +67,7 @@ const char *tls_cipher_suite_name(int cipher) case TLS_cipher_chacha20_poly1305_sha256: return "TLS_CHACHA20_POLY1305_SHA256"; case TLS_cipher_aes_128_ccm_sha256: return "TLS_AES_128_CCM_SHA256"; case TLS_cipher_aes_128_ccm_8_sha256: return "TLS_AES_128_CCM_8_SHA256"; + case TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256: return "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256"; case TLS_cipher_empty_renegotiation_info_scsv: return "TLS_EMPTY_RENEGOTIATION_INFO_SCSV"; } return NULL; @@ -270,7 +271,7 @@ const char *tls_curve_type_name(int type) return NULL; } -const char *tls_curve_name(int curve) +const char *tls_named_curve_name(int curve) { switch (curve) { case TLS_curve_secp256k1: return "secp256k1"; @@ -396,7 +397,7 @@ int tls_extension_print(FILE *fp, int type, const uint8_t *data, size_t datalen, uint16_t curve; tls_uint16_from_bytes(&curve, &p, &len); format_print(fp, format, indent, "%s (%d)\n", - tls_curve_name(curve), curve); + tls_named_curve_name(curve), curve); } break; case TLS_extension_ec_point_formats: @@ -442,7 +443,7 @@ int tls_extension_print(FILE *fp, int type, const uint8_t *data, size_t datalen, error_print(); return -1; } - format_print(fp, format, indent, "group: %s (%d)\n", tls_curve_name(group), group); + format_print(fp, format, indent, "group: %s (%d)\n", tls_named_curve_name(group), group); format_bytes(fp, format, indent, "key_exchange", key_exch, key_exch_len); } break; @@ -682,7 +683,7 @@ int tls_server_key_exchange_ecdhe_print(FILE *fp, const uint8_t *data, size_t da return -1; } format_print(fp, format, indent + 8, "named_curve: %s (%d)\n", - tls_curve_name(curve), curve); + tls_named_curve_name(curve), curve); if (tls_uint8array_from_bytes(&octets, &octetslen, &data, &datalen) != 1) { error_print(); return -1; diff --git a/src/tmp.i b/src/tmp.i new file mode 100644 index 00000000..23cfb146 --- /dev/null +++ b/src/tmp.i @@ -0,0 +1,9103 @@ +# 1 "tls12.c" +# 1 "" 1 +# 1 "" 3 +# 466 "" 3 +# 1 "" 1 +# 1 "" 2 +# 1 "tls12.c" 2 +# 11 "tls12.c" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/time.h" 1 3 4 +# 63 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/time.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_time.h" 1 3 4 +# 66 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_time.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types.h" 1 3 4 +# 27 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types.h" 1 3 4 +# 32 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h" 1 3 4 +# 808 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_symbol_aliasing.h" 1 3 4 +# 809 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h" 2 3 4 +# 874 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_posix_availability.h" 1 3 4 +# 875 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h" 2 3 4 +# 992 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/ptrcheck.h" 1 3 4 +# 993 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h" 2 3 4 +# 33 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/_types.h" 1 3 4 +# 34 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/_types.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_types.h" 1 3 4 +# 28 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_types.h" 3 4 +typedef signed char __int8_t; + + + +typedef unsigned char __uint8_t; +typedef short __int16_t; +typedef unsigned short __uint16_t; +typedef int __int32_t; +typedef unsigned int __uint32_t; +typedef long long __int64_t; +typedef unsigned long long __uint64_t; + +typedef long __darwin_intptr_t; +typedef unsigned int __darwin_natural_t; +# 61 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_types.h" 3 4 +typedef int __darwin_ct_rune_t; + + + + + +typedef union { + char __mbstate8[128]; + long long _mbstateL; +} __mbstate_t; + +typedef __mbstate_t __darwin_mbstate_t; + + + + +typedef long int __darwin_ptrdiff_t; +# 87 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_types.h" 3 4 +typedef long unsigned int __darwin_size_t; + + + + + + + +typedef __builtin_va_list __darwin_va_list; + + + + + + + +typedef int __darwin_wchar_t; + + + + +typedef __darwin_wchar_t __darwin_rune_t; + + +typedef int __darwin_wint_t; + + + + +typedef unsigned long __darwin_clock_t; +typedef __uint32_t __darwin_socklen_t; +typedef long __darwin_ssize_t; +typedef long __darwin_time_t; +# 35 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/_types.h" 2 3 4 +# 34 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types.h" 2 3 4 +# 67 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types.h" 3 4 +typedef __int64_t __darwin_blkcnt_t; +typedef __int32_t __darwin_blksize_t; +typedef __int32_t __darwin_dev_t; +typedef unsigned int __darwin_fsblkcnt_t; +typedef unsigned int __darwin_fsfilcnt_t; +typedef __uint32_t __darwin_gid_t; +typedef __uint32_t __darwin_id_t; +typedef __uint64_t __darwin_ino64_t; + +typedef __darwin_ino64_t __darwin_ino_t; + + + +typedef __darwin_natural_t __darwin_mach_port_name_t; +typedef __darwin_mach_port_name_t __darwin_mach_port_t; +typedef __uint16_t __darwin_mode_t; +typedef __int64_t __darwin_off_t; +typedef __int32_t __darwin_pid_t; +typedef __uint32_t __darwin_sigset_t; +typedef __int32_t __darwin_suseconds_t; +typedef __uint32_t __darwin_uid_t; +typedef __uint32_t __darwin_useconds_t; +typedef unsigned char __darwin_uuid_t[16]; +typedef char __darwin_uuid_string_t[37]; + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_types.h" 1 3 4 +# 57 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_types.h" 3 4 +struct __darwin_pthread_handler_rec { + void (*__routine)(void *); + void *__arg; + struct __darwin_pthread_handler_rec *__next; +}; + +struct _opaque_pthread_attr_t { + long __sig; + char __opaque[56]; +}; + +struct _opaque_pthread_cond_t { + long __sig; + char __opaque[40]; +}; + +struct _opaque_pthread_condattr_t { + long __sig; + char __opaque[8]; +}; + +struct _opaque_pthread_mutex_t { + long __sig; + char __opaque[56]; +}; + +struct _opaque_pthread_mutexattr_t { + long __sig; + char __opaque[8]; +}; + +struct _opaque_pthread_once_t { + long __sig; + char __opaque[8]; +}; + +struct _opaque_pthread_rwlock_t { + long __sig; + char __opaque[192]; +}; + +struct _opaque_pthread_rwlockattr_t { + long __sig; + char __opaque[16]; +}; + +struct _opaque_pthread_t { + long __sig; + struct __darwin_pthread_handler_rec *__cleanup_stack; + char __opaque[8176]; +}; + +typedef struct _opaque_pthread_attr_t __darwin_pthread_attr_t; +typedef struct _opaque_pthread_cond_t __darwin_pthread_cond_t; +typedef struct _opaque_pthread_condattr_t __darwin_pthread_condattr_t; +typedef unsigned long __darwin_pthread_key_t; +typedef struct _opaque_pthread_mutex_t __darwin_pthread_mutex_t; +typedef struct _opaque_pthread_mutexattr_t __darwin_pthread_mutexattr_t; +typedef struct _opaque_pthread_once_t __darwin_pthread_once_t; +typedef struct _opaque_pthread_rwlock_t __darwin_pthread_rwlock_t; +typedef struct _opaque_pthread_rwlockattr_t __darwin_pthread_rwlockattr_t; +typedef struct _opaque_pthread_t *__darwin_pthread_t; +# 95 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types.h" 2 3 4 +# 28 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_bounds.h" 1 3 4 +# 29 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types.h" 2 3 4 +# 43 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types.h" 3 4 +typedef int __darwin_nl_item; +typedef int __darwin_wctrans_t; + +typedef __uint32_t __darwin_wctype_t; +# 67 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_time.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 196 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/AvailabilityVersions.h" 1 3 4 +# 197 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/AvailabilityInternal.h" 1 3 4 +# 33 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/AvailabilityInternal.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/AvailabilityVersions.h" 1 3 4 +# 34 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/AvailabilityInternal.h" 2 3 4 +# 198 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/AvailabilityInternalLegacy.h" 1 3 4 +# 34 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/AvailabilityInternalLegacy.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/AvailabilityInternal.h" 1 3 4 +# 35 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/AvailabilityInternalLegacy.h" 2 3 4 +# 199 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 2 3 4 +# 70 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_time.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_clock_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_clock_t.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/types.h" 1 3 4 +# 37 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/types.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 1 3 4 +# 55 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_int8_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_int8_t.h" 3 4 +typedef signed char int8_t; +# 56 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_int16_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_int16_t.h" 3 4 +typedef short int16_t; +# 57 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_int32_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_int32_t.h" 3 4 +typedef int int32_t; +# 58 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_int64_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_int64_t.h" 3 4 +typedef long long int64_t; +# 59 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 2 3 4 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_int8_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_int8_t.h" 3 4 +typedef unsigned char u_int8_t; +# 61 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_int16_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_int16_t.h" 3 4 +typedef unsigned short u_int16_t; +# 62 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_int32_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_int32_t.h" 3 4 +typedef unsigned int u_int32_t; +# 63 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_int64_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_int64_t.h" 3 4 +typedef unsigned long long u_int64_t; +# 64 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 2 3 4 + + +typedef int64_t register_t; + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_intptr_t.h" 1 3 4 +# 32 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_intptr_t.h" 3 4 +typedef __darwin_intptr_t intptr_t; +# 72 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_uintptr_t.h" 1 3 4 +# 34 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_uintptr_t.h" 3 4 +typedef unsigned long uintptr_t; +# 73 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 2 3 4 + + + + +typedef u_int64_t user_addr_t; +typedef u_int64_t user_size_t; +typedef int64_t user_ssize_t; +typedef int64_t user_long_t; +typedef u_int64_t user_ulong_t; +typedef int64_t user_time_t; +typedef int64_t user_off_t; +# 105 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/types.h" 3 4 +typedef u_int64_t syscall_arg_t; +# 38 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/types.h" 2 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_clock_t.h" 2 3 4 +typedef __darwin_clock_t clock_t; +# 71 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_time.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_null.h" 1 3 4 +# 72 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_time.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 50 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 3 4 +typedef __darwin_size_t size_t; +# 73 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_time.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_time_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_time_t.h" 3 4 +typedef __darwin_time_t time_t; +# 74 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_time.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_timespec.h" 1 3 4 +# 33 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_timespec.h" 3 4 +struct timespec +{ + __darwin_time_t tv_sec; + long tv_nsec; +}; +# 75 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_time.h" 2 3 4 + + + +struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + long tm_gmtoff; + char * tm_zone; +}; +# 101 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_time.h" 3 4 +extern char * tzname[]; + + +extern int getdate_err; + +extern long timezone __asm("_" "timezone" ); + +extern int daylight; + + +char * asctime(const struct tm *); +clock_t clock(void) __asm("_" "clock" ); +char * ctime(const time_t *); +double difftime(time_t, time_t); +struct tm *getdate(const char *); +struct tm *gmtime(const time_t *); +struct tm *localtime(const time_t *); +time_t mktime(struct tm *) __asm("_" "mktime" ); +size_t strftime(char * restrict, size_t __maxsize, const char * restrict, const struct tm * restrict) __asm("_" "strftime" ); +char * strptime(const char * restrict, const char * restrict, struct tm * restrict) __asm("_" "strptime" ); +time_t time(time_t *); + + +void tzset(void); + + + +char * asctime_r(const struct tm * restrict, char * restrict ); +char * ctime_r(const time_t *, char *); +struct tm *gmtime_r(const time_t * restrict, struct tm * restrict); +struct tm *localtime_r(const time_t * restrict, struct tm * restrict); + + +time_t posix2time(time_t); + + + +void tzsetwall(void); +time_t time2posix(time_t); +time_t timelocal(struct tm * const); +time_t timegm(struct tm * const); + + + +int nanosleep(const struct timespec *__rqtp, struct timespec *__rmtp) __asm("_" "nanosleep" ); +# 156 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_time.h" 3 4 +typedef enum { +_CLOCK_REALTIME __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))) = 0, + +_CLOCK_MONOTONIC __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))) = 6, + + +_CLOCK_MONOTONIC_RAW __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))) = 4, + +_CLOCK_MONOTONIC_RAW_APPROX __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))) = 5, + +_CLOCK_UPTIME_RAW __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))) = 8, + +_CLOCK_UPTIME_RAW_APPROX __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))) = 9, + + +_CLOCK_PROCESS_CPUTIME_ID __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))) = 12, + +_CLOCK_THREAD_CPUTIME_ID __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))) = 16 + +} clockid_t; + +__attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))) +int clock_getres(clockid_t __clock_id, struct timespec *__res); + +__attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))) +int clock_gettime(clockid_t __clock_id, struct timespec *__tp); + + +__attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))) +__uint64_t clock_gettime_nsec_np(clockid_t __clock_id); + + +__attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,unavailable))) +__attribute__((availability(tvos,unavailable))) __attribute__((availability(watchos,unavailable))) +int clock_settime(clockid_t __clock_id, const struct timespec *__tp); +# 201 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_time.h" 3 4 +__attribute__((availability(macos,introduced=10.15))) __attribute__((availability(ios,introduced=13.0))) __attribute__((availability(tvos,introduced=13.0))) __attribute__((availability(watchos,introduced=6.0))) +int timespec_get(struct timespec *ts, int base); +# 64 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/time.h" 2 3 4 +# 12 "tls12.c" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4 +# 61 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 1 3 4 +# 71 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 72 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 2 3 4 + + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_va_list.h" 1 3 4 +# 44 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_va_list.h" 3 4 +typedef __darwin_va_list va_list; +# 78 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 79 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_null.h" 1 3 4 +# 80 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 2 3 4 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/stdio.h" 1 3 4 +# 44 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/stdio.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 45 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/stdio.h" 2 3 4 + + + +int renameat(int, const char *, int, const char *) __attribute__((availability(macosx,introduced=10.10))); + + + +int renamex_np(const char *, const char *, unsigned int) __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))); +int renameatx_np(int, const char *, int, const char *, unsigned int) __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))); +# 82 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_printf.h" 1 3 4 +# 34 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_printf.h" 3 4 +int printf(const char * restrict, ...) __attribute__((__format__ (__printf__, 1, 2))); +# 83 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 2 3 4 + + + +typedef __darwin_off_t fpos_t; +# 97 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +struct __sbuf { + unsigned char * _base; + int _size; +}; + + +struct __sFILEX; +# 131 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +typedef struct __sFILE { + unsigned char * _p; + int _r; + int _w; + short _flags; + short _file; + struct __sbuf _bf; + int _lbfsize; + + + void *_cookie; + int (* _Nullable _close)(void *); + int (* _Nullable _read) (void *, char *, int __n); + fpos_t (* _Nullable _seek) (void *, fpos_t, int); + int (* _Nullable _write)(void *, const char *, int __n); + + + struct __sbuf _ub; + struct __sFILEX *_extra; + int _ur; + + + unsigned char _ubuf[3]; + unsigned char _nbuf[1]; + + + struct __sbuf _lb; + + + int _blksize; + fpos_t _offset; +} FILE; + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_seek_set.h" 1 3 4 +# 165 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 2 3 4 + + +extern FILE *__stdinp __attribute__((__swift_attr__("nonisolated(unsafe)"))); +extern FILE *__stdoutp __attribute__((__swift_attr__("nonisolated(unsafe)"))); +extern FILE *__stderrp __attribute__((__swift_attr__("nonisolated(unsafe)"))); +# 232 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +void clearerr(FILE *); +int fclose(FILE *); +int feof(FILE *); +int ferror(FILE *); +int fflush(FILE *); +int fgetc(FILE *); +int fgetpos(FILE * restrict, fpos_t *); +char * fgets(char * restrict , int __size, FILE *); + + + +FILE *fopen(const char * restrict __filename, const char * restrict __mode) __asm("_" "fopen" ); + +int fprintf(FILE * restrict, const char * restrict, ...) __attribute__((__format__ (__printf__, 2, 3))); +int fputc(int, FILE *); +int fputs(const char * restrict, FILE * restrict) __asm("_" "fputs" ); +size_t fread(void * restrict __ptr, size_t __size, size_t __nitems, FILE * restrict __stream); +FILE *freopen(const char * restrict, const char * restrict, + FILE * restrict) __asm("_" "freopen" ); +int fscanf(FILE * restrict, const char * restrict, ...) __attribute__((__format__ (__scanf__, 2, 3))); +int fseek(FILE *, long, int); +int fsetpos(FILE *, const fpos_t *); +long ftell(FILE *); +size_t fwrite(const void * restrict __ptr, size_t __size, size_t __nitems, FILE * restrict __stream) __asm("_" "fwrite" ); +int getc(FILE *); +int getchar(void); + + +__attribute__((__deprecated__("This function is provided for compatibility reasons only. Due to security concerns inherent in the design of gets(3), it is highly recommended that you use fgets(3) instead."))) + +char * gets(char *) ; + +void perror(const char *) __attribute__((__cold__)); +int putc(int, FILE *); +int putchar(int); +int puts(const char *); +int remove(const char *); +int rename (const char *__old, const char *__new); +void rewind(FILE *); +int scanf(const char * restrict, ...) __attribute__((__format__ (__scanf__, 1, 2))); +void setbuf(FILE * restrict, char * restrict ); +int setvbuf(FILE * restrict, char * restrict , int, size_t __size); + +__attribute__((__availability__(swift, unavailable, message="Use snprintf instead."))) + + +__attribute__((__deprecated__("This function is provided for compatibility reasons only. Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead."))) + +int sprintf(char * restrict , const char * restrict, ...) __attribute__((__format__ (__printf__, 2, 3))) ; + +int sscanf(const char * restrict, const char * restrict, ...) __attribute__((__format__ (__scanf__, 2, 3))); +FILE *tmpfile(void); + +__attribute__((__availability__(swift, unavailable, message="Use mkstemp(3) instead."))) + +__attribute__((__deprecated__("This function is provided for compatibility reasons only. Due to security concerns inherent in the design of tmpnam(3), it is highly recommended that you use mkstemp(3) instead."))) + +char * tmpnam(char *); + +int ungetc(int, FILE *); +int vfprintf(FILE * restrict, const char * restrict, va_list) __attribute__((__format__ (__printf__, 2, 0))); +int vprintf(const char * restrict, va_list) __attribute__((__format__ (__printf__, 1, 0))); + +__attribute__((__availability__(swift, unavailable, message="Use vsnprintf instead."))) + + +__attribute__((__deprecated__("This function is provided for compatibility reasons only. Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use vsnprintf(3) instead."))) + +int vsprintf(char * restrict , const char * restrict, va_list) __attribute__((__format__ (__printf__, 2, 0))) ; +# 315 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_ctermid.h" 1 3 4 +# 38 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_ctermid.h" 3 4 +char * ctermid(char *); +# 316 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 2 3 4 + + + + + + +FILE *fdopen(int, const char *) __asm("_" "fdopen" ); + +int fileno(FILE *); +# 335 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +int pclose(FILE *) __attribute__((__availability__(swift, unavailable, message="Use posix_spawn APIs or NSTask instead. (On iOS, process spawning is unavailable.)"))); + + + +FILE *popen(const char *, const char *) __asm("_" "popen" ) __attribute__((__availability__(swift, unavailable, message="Use posix_spawn APIs or NSTask instead. (On iOS, process spawning is unavailable.)"))); +# 354 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +int __srget(FILE *); +int __svfscanf(FILE *, const char *, va_list) __attribute__((__format__ (__scanf__, 2, 0))); +int __swbuf(int, FILE *); +# 365 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +inline __attribute__ ((__always_inline__)) int __sputc(int _c, FILE *_p) { + if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n')) + return (*_p->_p++ = _c); + else + return (__swbuf(_c, _p)); +} +# 391 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +void flockfile(FILE *); +int ftrylockfile(FILE *); +void funlockfile(FILE *); +int getc_unlocked(FILE *); +int getchar_unlocked(void); +int putc_unlocked(int, FILE *); +int putchar_unlocked(int); + + + +int getw(FILE *); +int putw(int, FILE *); + + +__attribute__((__availability__(swift, unavailable, message="Use mkstemp(3) instead."))) + +__attribute__((__deprecated__("This function is provided for compatibility reasons only. Due to security concerns inherent in the design of tempnam(3), it is highly recommended that you use mkstemp(3) instead."))) + +char * tempnam(const char *__dir, const char *__prefix) __asm("_" "tempnam" ); +# 429 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_off_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_off_t.h" 3 4 +typedef __darwin_off_t off_t; +# 430 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 2 3 4 + + +int fseeko(FILE * __stream, off_t __offset, int __whence); +off_t ftello(FILE * __stream); + + + + + +int snprintf(char * restrict __str, size_t __size, const char * restrict __format, ...) __attribute__((__format__ (__printf__, 3, 4))); +int vfscanf(FILE * restrict __stream, const char * restrict __format, va_list) __attribute__((__format__ (__scanf__, 2, 0))); +int vscanf(const char * restrict __format, va_list) __attribute__((__format__ (__scanf__, 1, 0))); +int vsnprintf(char * restrict __str, size_t __size, const char * restrict __format, va_list) __attribute__((__format__ (__printf__, 3, 0))); +int vsscanf(const char * restrict __str, const char * restrict __format, va_list) __attribute__((__format__ (__scanf__, 2, 0))); +# 454 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_ssize_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_ssize_t.h" 3 4 +typedef __darwin_ssize_t ssize_t; +# 455 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 2 3 4 + + +int dprintf(int, const char * restrict, ...) __attribute__((__format__ (__printf__, 2, 3))) __attribute__((availability(macosx,introduced=10.7))); +int vdprintf(int, const char * restrict, va_list) __attribute__((__format__ (__printf__, 2, 0))) __attribute__((availability(macosx,introduced=10.7))); +ssize_t getdelim(char * *restrict __linep, size_t * restrict __linecapp, int __delimiter, FILE * restrict __stream) __attribute__((availability(macosx,introduced=10.7))); +ssize_t getline(char * *restrict __linep, size_t * restrict __linecapp, FILE * restrict __stream) __attribute__((availability(macosx,introduced=10.7))); +FILE *fmemopen(void * restrict __buf , size_t __size, const char * restrict __mode) __attribute__((availability(macos,introduced=10.13))) __attribute__((availability(ios,introduced=11.0))) __attribute__((availability(tvos,introduced=11.0))) __attribute__((availability(watchos,introduced=4.0))); +FILE *open_memstream(char * *__bufp, size_t *__sizep) __attribute__((availability(macos,introduced=10.13))) __attribute__((availability(ios,introduced=11.0))) __attribute__((availability(tvos,introduced=11.0))) __attribute__((availability(watchos,introduced=4.0))); +# 472 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +extern const int sys_nerr; +extern const char *const sys_errlist[]; + +int asprintf(char * *restrict, const char * restrict, ...) __attribute__((__format__ (__printf__, 2, 3))); +char * ctermid_r(char *); +char * fgetln(FILE *, size_t *__len); +const char *fmtcheck(const char *, const char *) __attribute__((format_arg(2))); +int fpurge(FILE *); +void setbuffer(FILE *, char *, int __size); +int setlinebuf(FILE *); +int vasprintf(char * *restrict, const char * restrict, va_list) __attribute__((__format__ (__printf__, 2, 0))); + + + + + +FILE *funopen(const void *, + int (* _Nullable)(void *, char *, int __n), + int (* _Nullable)(void *, const char *, int __n), + fpos_t (* _Nullable)(void *, fpos_t, int), + int (* _Nullable)(void *)); +# 507 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/secure/_stdio.h" 1 3 4 +# 32 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/secure/_stdio.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/secure/_common.h" 1 3 4 +# 33 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/secure/_stdio.h" 2 3 4 + + + + + +extern int __snprintf_chk (char * restrict , size_t __maxlen, int, size_t, + const char * restrict, ...); +extern int __vsnprintf_chk (char * restrict , size_t __maxlen, int, size_t, + const char * restrict, va_list); + +extern int __sprintf_chk (char * restrict , int, size_t, + const char * restrict, ...); +extern int __vsprintf_chk (char * restrict , int, size_t, + const char * restrict, va_list); +# 508 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h" 2 3 4 +# 62 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 2 3 4 +# 13 "tls12.c" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 58 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 1 3 4 +# 64 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 65 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 2 3 4 + + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/wait.h" 1 3 4 +# 79 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/wait.h" 3 4 +typedef enum { + P_ALL, + P_PID, + P_PGID +} idtype_t; + + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_pid_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_pid_t.h" 3 4 +typedef __darwin_pid_t pid_t; +# 90 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/wait.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_id_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_id_t.h" 3 4 +typedef __darwin_id_t id_t; +# 91 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/wait.h" 2 3 4 +# 109 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/wait.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 1 3 4 +# 73 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/appleapiopts.h" 1 3 4 +# 74 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 75 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 2 3 4 + + + + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/signal.h" 1 3 4 +# 34 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/signal.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/signal.h" 1 3 4 +# 17 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/signal.h" 3 4 +typedef int sig_atomic_t; +# 35 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/signal.h" 2 3 4 +# 83 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 2 3 4 +# 146 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/_mcontext.h" 1 3 4 +# 34 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/_mcontext.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_mcontext.h" 1 3 4 +# 36 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_mcontext.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/machine/_structs.h" 1 3 4 +# 35 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/machine/_structs.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/arm/_structs.h" 1 3 4 +# 41 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/arm/_structs.h" 3 4 +struct __darwin_arm_exception_state +{ + __uint32_t __exception; + __uint32_t __fsr; + __uint32_t __far; +}; +# 59 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/arm/_structs.h" 3 4 +struct __darwin_arm_exception_state64 +{ + __uint64_t __far; + __uint32_t __esr; + __uint32_t __exception; +}; + +struct __darwin_arm_exception_state64_v2 +{ + __uint64_t __far; + __uint64_t __esr; +}; +# 89 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/arm/_structs.h" 3 4 +struct __darwin_arm_thread_state +{ + __uint32_t __r[13]; + __uint32_t __sp; + __uint32_t __lr; + __uint32_t __pc; + __uint32_t __cpsr; +}; +# 148 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/arm/_structs.h" 3 4 +struct __darwin_arm_thread_state64 +{ + __uint64_t __x[29]; + __uint64_t __fp; + __uint64_t __lr; + __uint64_t __sp; + __uint64_t __pc; + __uint32_t __cpsr; + __uint32_t __pad; +}; +# 519 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/arm/_structs.h" 3 4 +struct __darwin_arm_vfp_state +{ + __uint32_t __r[64]; + __uint32_t __fpscr; +}; +# 538 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/arm/_structs.h" 3 4 +struct __darwin_arm_neon_state64 +{ + __uint128_t __v[32]; + __uint32_t __fpsr; + __uint32_t __fpcr; +}; + +struct __darwin_arm_neon_state +{ + __uint128_t __v[16]; + __uint32_t __fpsr; + __uint32_t __fpcr; +}; +# 609 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/arm/_structs.h" 3 4 +struct __arm_pagein_state +{ + int __pagein_error; +}; + + + +struct __darwin_arm_sme_state +{ + __uint64_t __svcr; + __uint64_t __tpidr2_el0; + __uint16_t __svl_b; +}; + + +struct __darwin_arm_sve_z_state +{ + char __z[16][256]; +} __attribute__((aligned(4))); + + +struct __darwin_arm_sve_p_state +{ + char __p[16][256 / 8]; +} __attribute__((aligned(4))); + + +struct __darwin_arm_sme_za_state +{ + char __za[4096]; +} __attribute__((aligned(4))); + + +struct __darwin_arm_sme2_state +{ + char __zt0[64]; +} __attribute__((aligned(4))); +# 712 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/arm/_structs.h" 3 4 +struct __arm_legacy_debug_state +{ + __uint32_t __bvr[16]; + __uint32_t __bcr[16]; + __uint32_t __wvr[16]; + __uint32_t __wcr[16]; +}; +# 735 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/arm/_structs.h" 3 4 +struct __darwin_arm_debug_state32 +{ + __uint32_t __bvr[16]; + __uint32_t __bcr[16]; + __uint32_t __wvr[16]; + __uint32_t __wcr[16]; + __uint64_t __mdscr_el1; +}; + + +struct __darwin_arm_debug_state64 +{ + __uint64_t __bvr[16]; + __uint64_t __bcr[16]; + __uint64_t __wvr[16]; + __uint64_t __wcr[16]; + __uint64_t __mdscr_el1; +}; +# 777 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/arm/_structs.h" 3 4 +struct __darwin_arm_cpmu_state64 +{ + __uint64_t __ctrs[16]; +}; +# 36 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach/machine/_structs.h" 2 3 4 +# 37 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_mcontext.h" 2 3 4 + + + + +struct __darwin_mcontext32 +{ + struct __darwin_arm_exception_state __es; + struct __darwin_arm_thread_state __ss; + struct __darwin_arm_vfp_state __fs; +}; +# 64 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_mcontext.h" 3 4 +struct __darwin_mcontext64 +{ + struct __darwin_arm_exception_state64 __es; + struct __darwin_arm_thread_state64 __ss; + struct __darwin_arm_neon_state64 __ns; +}; +# 85 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_mcontext.h" 3 4 +typedef struct __darwin_mcontext64 *mcontext_t; +# 35 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/_mcontext.h" 2 3 4 +# 147 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 2 3 4 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_attr_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_attr_t.h" 3 4 +typedef __darwin_pthread_attr_t pthread_attr_t; +# 149 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 2 3 4 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_sigaltstack.h" 1 3 4 +# 42 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_sigaltstack.h" 3 4 +struct __darwin_sigaltstack +{ + void *ss_sp; + __darwin_size_t ss_size; + int ss_flags; +}; +typedef struct __darwin_sigaltstack stack_t; +# 151 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_ucontext.h" 1 3 4 +# 43 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_ucontext.h" 3 4 +struct __darwin_ucontext +{ + int uc_onstack; + __darwin_sigset_t uc_sigmask; + struct __darwin_sigaltstack uc_stack; + struct __darwin_ucontext *uc_link; + __darwin_size_t uc_mcsize; + struct __darwin_mcontext64 *uc_mcontext; + + + +}; + + +typedef struct __darwin_ucontext ucontext_t; +# 152 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_sigset_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_sigset_t.h" 3 4 +typedef __darwin_sigset_t sigset_t; +# 155 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 156 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_uid_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_uid_t.h" 3 4 +typedef __darwin_uid_t uid_t; +# 157 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 2 3 4 + +union sigval { + + int sival_int; + void *sival_ptr; +}; + + + + + + +struct sigevent { + int sigev_notify; + int sigev_signo; + union sigval sigev_value; + void (*sigev_notify_function)(union sigval); + pthread_attr_t *sigev_notify_attributes; +}; + + +typedef struct __siginfo { + int si_signo; + int si_errno; + int si_code; + pid_t si_pid; + uid_t si_uid; + int si_status; + void *si_addr; + union sigval si_value; + long si_band; + unsigned long __pad[7]; +} siginfo_t; +# 270 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 3 4 +union __sigaction_u { + void (*__sa_handler)(int); + void (*__sa_sigaction)(int, struct __siginfo *, + void *); +}; + + +struct __sigaction { + union __sigaction_u __sigaction_u; + void (*sa_tramp)(void *, int, int, siginfo_t *, void *); + sigset_t sa_mask; + int sa_flags; +}; + + + + +struct sigaction { + union __sigaction_u __sigaction_u; + sigset_t sa_mask; + int sa_flags; +}; +# 332 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 3 4 +typedef void (*sig_t)(int); +# 349 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 3 4 +struct sigvec { + void (*sv_handler)(int); + int sv_mask; + int sv_flags; +}; +# 368 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 3 4 +struct sigstack { + char *ss_sp; + int ss_onstack; +}; +# 391 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/signal.h" 3 4 +void(*signal(int, void (*)(int)))(int); +# 110 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/wait.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h" 1 3 4 +# 72 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stdint.h" 1 3 4 +# 56 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stdint.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdint.h" 1 3 4 +# 23 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdint.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types/_uint8_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types/_uint8_t.h" 3 4 +typedef unsigned char uint8_t; +# 24 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdint.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types/_uint16_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types/_uint16_t.h" 3 4 +typedef unsigned short uint16_t; +# 25 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdint.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types/_uint32_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types/_uint32_t.h" 3 4 +typedef unsigned int uint32_t; +# 26 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdint.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types/_uint64_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types/_uint64_t.h" 3 4 +typedef unsigned long long uint64_t; +# 27 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdint.h" 2 3 4 + + +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + + + +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; +# 58 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdint.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types/_intmax_t.h" 1 3 4 +# 32 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types/_intmax_t.h" 3 4 +typedef long int intmax_t; +# 59 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdint.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types/_uintmax_t.h" 1 3 4 +# 32 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_types/_uintmax_t.h" 3 4 +typedef long unsigned int uintmax_t; +# 60 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdint.h" 2 3 4 +# 57 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stdint.h" 2 3 4 +# 73 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 76 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h" 2 3 4 + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_timeval.h" 1 3 4 +# 34 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_timeval.h" 3 4 +struct timeval +{ + __darwin_time_t tv_sec; + __darwin_suseconds_t tv_usec; +}; +# 81 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h" 2 3 4 + + + + + + + + +typedef __uint64_t rlim_t; +# 152 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h" 3 4 +struct rusage { + struct timeval ru_utime; + struct timeval ru_stime; +# 163 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h" 3 4 + long ru_maxrss; + + long ru_ixrss; + long ru_idrss; + long ru_isrss; + long ru_minflt; + long ru_majflt; + long ru_nswap; + long ru_inblock; + long ru_oublock; + long ru_msgsnd; + long ru_msgrcv; + long ru_nsignals; + long ru_nvcsw; + long ru_nivcsw; + + +}; +# 200 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h" 3 4 +typedef void *rusage_info_t; + +struct rusage_info_v0 { + uint8_t ri_uuid[16]; + uint64_t ri_user_time; + uint64_t ri_system_time; + uint64_t ri_pkg_idle_wkups; + uint64_t ri_interrupt_wkups; + uint64_t ri_pageins; + uint64_t ri_wired_size; + uint64_t ri_resident_size; + uint64_t ri_phys_footprint; + uint64_t ri_proc_start_abstime; + uint64_t ri_proc_exit_abstime; +}; + +struct rusage_info_v1 { + uint8_t ri_uuid[16]; + uint64_t ri_user_time; + uint64_t ri_system_time; + uint64_t ri_pkg_idle_wkups; + uint64_t ri_interrupt_wkups; + uint64_t ri_pageins; + uint64_t ri_wired_size; + uint64_t ri_resident_size; + uint64_t ri_phys_footprint; + uint64_t ri_proc_start_abstime; + uint64_t ri_proc_exit_abstime; + uint64_t ri_child_user_time; + uint64_t ri_child_system_time; + uint64_t ri_child_pkg_idle_wkups; + uint64_t ri_child_interrupt_wkups; + uint64_t ri_child_pageins; + uint64_t ri_child_elapsed_abstime; +}; + +struct rusage_info_v2 { + uint8_t ri_uuid[16]; + uint64_t ri_user_time; + uint64_t ri_system_time; + uint64_t ri_pkg_idle_wkups; + uint64_t ri_interrupt_wkups; + uint64_t ri_pageins; + uint64_t ri_wired_size; + uint64_t ri_resident_size; + uint64_t ri_phys_footprint; + uint64_t ri_proc_start_abstime; + uint64_t ri_proc_exit_abstime; + uint64_t ri_child_user_time; + uint64_t ri_child_system_time; + uint64_t ri_child_pkg_idle_wkups; + uint64_t ri_child_interrupt_wkups; + uint64_t ri_child_pageins; + uint64_t ri_child_elapsed_abstime; + uint64_t ri_diskio_bytesread; + uint64_t ri_diskio_byteswritten; +}; + +struct rusage_info_v3 { + uint8_t ri_uuid[16]; + uint64_t ri_user_time; + uint64_t ri_system_time; + uint64_t ri_pkg_idle_wkups; + uint64_t ri_interrupt_wkups; + uint64_t ri_pageins; + uint64_t ri_wired_size; + uint64_t ri_resident_size; + uint64_t ri_phys_footprint; + uint64_t ri_proc_start_abstime; + uint64_t ri_proc_exit_abstime; + uint64_t ri_child_user_time; + uint64_t ri_child_system_time; + uint64_t ri_child_pkg_idle_wkups; + uint64_t ri_child_interrupt_wkups; + uint64_t ri_child_pageins; + uint64_t ri_child_elapsed_abstime; + uint64_t ri_diskio_bytesread; + uint64_t ri_diskio_byteswritten; + uint64_t ri_cpu_time_qos_default; + uint64_t ri_cpu_time_qos_maintenance; + uint64_t ri_cpu_time_qos_background; + uint64_t ri_cpu_time_qos_utility; + uint64_t ri_cpu_time_qos_legacy; + uint64_t ri_cpu_time_qos_user_initiated; + uint64_t ri_cpu_time_qos_user_interactive; + uint64_t ri_billed_system_time; + uint64_t ri_serviced_system_time; +}; + +struct rusage_info_v4 { + uint8_t ri_uuid[16]; + uint64_t ri_user_time; + uint64_t ri_system_time; + uint64_t ri_pkg_idle_wkups; + uint64_t ri_interrupt_wkups; + uint64_t ri_pageins; + uint64_t ri_wired_size; + uint64_t ri_resident_size; + uint64_t ri_phys_footprint; + uint64_t ri_proc_start_abstime; + uint64_t ri_proc_exit_abstime; + uint64_t ri_child_user_time; + uint64_t ri_child_system_time; + uint64_t ri_child_pkg_idle_wkups; + uint64_t ri_child_interrupt_wkups; + uint64_t ri_child_pageins; + uint64_t ri_child_elapsed_abstime; + uint64_t ri_diskio_bytesread; + uint64_t ri_diskio_byteswritten; + uint64_t ri_cpu_time_qos_default; + uint64_t ri_cpu_time_qos_maintenance; + uint64_t ri_cpu_time_qos_background; + uint64_t ri_cpu_time_qos_utility; + uint64_t ri_cpu_time_qos_legacy; + uint64_t ri_cpu_time_qos_user_initiated; + uint64_t ri_cpu_time_qos_user_interactive; + uint64_t ri_billed_system_time; + uint64_t ri_serviced_system_time; + uint64_t ri_logical_writes; + uint64_t ri_lifetime_max_phys_footprint; + uint64_t ri_instructions; + uint64_t ri_cycles; + uint64_t ri_billed_energy; + uint64_t ri_serviced_energy; + uint64_t ri_interval_max_phys_footprint; + uint64_t ri_runnable_time; +}; + +struct rusage_info_v5 { + uint8_t ri_uuid[16]; + uint64_t ri_user_time; + uint64_t ri_system_time; + uint64_t ri_pkg_idle_wkups; + uint64_t ri_interrupt_wkups; + uint64_t ri_pageins; + uint64_t ri_wired_size; + uint64_t ri_resident_size; + uint64_t ri_phys_footprint; + uint64_t ri_proc_start_abstime; + uint64_t ri_proc_exit_abstime; + uint64_t ri_child_user_time; + uint64_t ri_child_system_time; + uint64_t ri_child_pkg_idle_wkups; + uint64_t ri_child_interrupt_wkups; + uint64_t ri_child_pageins; + uint64_t ri_child_elapsed_abstime; + uint64_t ri_diskio_bytesread; + uint64_t ri_diskio_byteswritten; + uint64_t ri_cpu_time_qos_default; + uint64_t ri_cpu_time_qos_maintenance; + uint64_t ri_cpu_time_qos_background; + uint64_t ri_cpu_time_qos_utility; + uint64_t ri_cpu_time_qos_legacy; + uint64_t ri_cpu_time_qos_user_initiated; + uint64_t ri_cpu_time_qos_user_interactive; + uint64_t ri_billed_system_time; + uint64_t ri_serviced_system_time; + uint64_t ri_logical_writes; + uint64_t ri_lifetime_max_phys_footprint; + uint64_t ri_instructions; + uint64_t ri_cycles; + uint64_t ri_billed_energy; + uint64_t ri_serviced_energy; + uint64_t ri_interval_max_phys_footprint; + uint64_t ri_runnable_time; + uint64_t ri_flags; +}; + +struct rusage_info_v6 { + uint8_t ri_uuid[16]; + uint64_t ri_user_time; + uint64_t ri_system_time; + uint64_t ri_pkg_idle_wkups; + uint64_t ri_interrupt_wkups; + uint64_t ri_pageins; + uint64_t ri_wired_size; + uint64_t ri_resident_size; + uint64_t ri_phys_footprint; + uint64_t ri_proc_start_abstime; + uint64_t ri_proc_exit_abstime; + uint64_t ri_child_user_time; + uint64_t ri_child_system_time; + uint64_t ri_child_pkg_idle_wkups; + uint64_t ri_child_interrupt_wkups; + uint64_t ri_child_pageins; + uint64_t ri_child_elapsed_abstime; + uint64_t ri_diskio_bytesread; + uint64_t ri_diskio_byteswritten; + uint64_t ri_cpu_time_qos_default; + uint64_t ri_cpu_time_qos_maintenance; + uint64_t ri_cpu_time_qos_background; + uint64_t ri_cpu_time_qos_utility; + uint64_t ri_cpu_time_qos_legacy; + uint64_t ri_cpu_time_qos_user_initiated; + uint64_t ri_cpu_time_qos_user_interactive; + uint64_t ri_billed_system_time; + uint64_t ri_serviced_system_time; + uint64_t ri_logical_writes; + uint64_t ri_lifetime_max_phys_footprint; + uint64_t ri_instructions; + uint64_t ri_cycles; + uint64_t ri_billed_energy; + uint64_t ri_serviced_energy; + uint64_t ri_interval_max_phys_footprint; + uint64_t ri_runnable_time; + uint64_t ri_flags; + uint64_t ri_user_ptime; + uint64_t ri_system_ptime; + uint64_t ri_pinstructions; + uint64_t ri_pcycles; + uint64_t ri_energy_nj; + uint64_t ri_penergy_nj; + uint64_t ri_secure_time_in_system; + uint64_t ri_secure_ptime_in_system; + uint64_t ri_neural_footprint; + uint64_t ri_lifetime_max_neural_footprint; + uint64_t ri_interval_max_neural_footprint; + uint64_t ri_reserved[9]; +}; + +typedef struct rusage_info_v6 rusage_info_current; +# 464 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h" 3 4 +struct rlimit { + rlim_t rlim_cur; + rlim_t rlim_max; +}; +# 499 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h" 3 4 +struct proc_rlimit_control_wakeupmon { + uint32_t wm_flags; + int32_t wm_rate; +}; +# 578 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/resource.h" 3 4 +int getpriority(int, id_t); + +int getiopolicy_np(int, int) __attribute__((availability(macosx,introduced=10.5))); + +int getrlimit(int, struct rlimit *) __asm("_" "getrlimit" ); +int getrusage(int, struct rusage *); +int setpriority(int, id_t, int); + +int setiopolicy_np(int, int, int) __attribute__((availability(macosx,introduced=10.5))); + +int setrlimit(int, const struct rlimit *) __asm("_" "setrlimit" ); +# 111 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/wait.h" 2 3 4 +# 186 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/wait.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/endian.h" 1 3 4 +# 37 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/endian.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/endian.h" 1 3 4 +# 61 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/endian.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_endian.h" 1 3 4 +# 94 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_endian.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/_endian.h" 1 3 4 +# 37 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/_endian.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_endian.h" 1 3 4 +# 95 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_endian.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/__endian.h" 1 3 4 +# 96 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_endian.h" 2 3 4 +# 38 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/_endian.h" 2 3 4 +# 95 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_endian.h" 2 3 4 +# 131 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_endian.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libkern/_OSByteOrder.h" 1 3 4 +# 62 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libkern/_OSByteOrder.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libkern/arm/_OSByteOrder.h" 1 3 4 +# 48 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libkern/arm/_OSByteOrder.h" 3 4 +static inline +__uint16_t +_OSSwapInt16( + __uint16_t _data + ) +{ + + return (__uint16_t)(_data << 8 | _data >> 8); +} + +static inline +__uint32_t +_OSSwapInt32( + __uint32_t _data + ) +{ + + _data = __builtin_bswap32(_data); + + + + + + return _data; +} + +static inline +__uint64_t +_OSSwapInt64( + __uint64_t _data + ) +{ + + return __builtin_bswap64(_data); +# 95 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libkern/arm/_OSByteOrder.h" 3 4 +} +# 63 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libkern/_OSByteOrder.h" 2 3 4 +# 132 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_endian.h" 2 3 4 +# 62 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/endian.h" 2 3 4 +# 38 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/endian.h" 2 3 4 +# 187 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/wait.h" 2 3 4 + + + + + + + +union wait { + int w_status; + + + + struct { + + unsigned int w_Termsig:7, + w_Coredump:1, + w_Retcode:8, + w_Filler:16; + + + + + + + } w_T; + + + + + + struct { + + unsigned int w_Stopval:8, + w_Stopsig:8, + w_Filler:16; + + + + + + } w_S; +}; +# 246 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/wait.h" 3 4 +pid_t wait(int *) __asm("_" "wait" ); +pid_t waitpid(pid_t, int *, int) __asm("_" "waitpid" ); + +int waitid(idtype_t, id_t, siginfo_t *, int) __asm("_" "waitid" ); + + +pid_t wait3(int *, int, struct rusage *); +pid_t wait4(pid_t, int *, int, struct rusage *); +# 71 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 2 3 4 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/alloca.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/alloca.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/alloca.h" 2 3 4 + + + + +void * alloca(size_t __size); +# 73 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 2 3 4 +# 91 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 92 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_ct_rune_t.h" 1 3 4 +# 32 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_ct_rune_t.h" 3 4 +typedef __darwin_ct_rune_t ct_rune_t; +# 95 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_rune_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_rune_t.h" 3 4 +typedef __darwin_rune_t rune_t; +# 96 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_wchar_t.h" 1 3 4 +# 53 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_wchar_t.h" 3 4 +typedef __darwin_wchar_t wchar_t; +# 99 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 2 3 4 + + + +typedef struct { + int quot; + int rem; +} div_t; + +typedef struct { + long quot; + long rem; +} ldiv_t; + + +typedef struct { + long long quot; + long long rem; +} lldiv_t; + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_null.h" 1 3 4 +# 120 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 2 3 4 +# 138 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 3 4 +extern int __mb_cur_max; + + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_malloc.h" 1 3 4 +# 33 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_malloc.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 34 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_malloc.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 37 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_malloc.h" 2 3 4 + + + + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_malloc_type.h" 1 3 4 +# 27 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_malloc_type.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_ptrcheck.h" 1 3 4 +# 28 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_malloc_type.h" 2 3 4 + + +typedef unsigned long long malloc_type_id_t; + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 36 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_malloc_type.h" 2 3 4 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 38 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_malloc_type.h" 2 3 4 +# 92 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_malloc_type.h" 3 4 +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +void * malloc_type_malloc(size_t size, malloc_type_id_t type_id) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(1))); +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +void * malloc_type_calloc(size_t count, size_t size, malloc_type_id_t type_id) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(1,2))); +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +void malloc_type_free(void * ptr, malloc_type_id_t type_id); +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +void * malloc_type_realloc(void * ptr, size_t size, malloc_type_id_t type_id) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(2))); +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +void * malloc_type_valloc(size_t size, malloc_type_id_t type_id) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(1))); +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +void * malloc_type_aligned_alloc(size_t alignment, size_t size, malloc_type_id_t type_id) __attribute__((__warn_unused_result__)) __attribute__((alloc_align(1))) __attribute__((alloc_size(2))); + +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +int malloc_type_posix_memalign(void * *memptr, size_t alignment, size_t size, malloc_type_id_t type_id) ; + + + +typedef struct _malloc_zone_t malloc_zone_t; + +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +void * malloc_type_zone_malloc(malloc_zone_t *zone, size_t size, malloc_type_id_t type_id) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(2))); +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +void * malloc_type_zone_calloc(malloc_zone_t *zone, size_t count, size_t size, malloc_type_id_t type_id) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(2,3))); +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +void malloc_type_zone_free(malloc_zone_t *zone, void * ptr, malloc_type_id_t type_id); +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +void * malloc_type_zone_realloc(malloc_zone_t *zone, void * ptr, size_t size, malloc_type_id_t type_id) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(3))); +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +void * malloc_type_zone_valloc(malloc_zone_t *zone, size_t size, malloc_type_id_t type_id) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(2))); +__attribute__((availability(macos,introduced=14.0))) __attribute__((availability(ios,introduced=17.0))) __attribute__((availability(tvos,introduced=17.0))) __attribute__((availability(watchos,introduced=10.0))) __attribute__((availability(visionos,introduced=1.0))) __attribute__((availability(driverkit,introduced=23.0))) +void * malloc_type_zone_memalign(malloc_zone_t *zone, size_t alignment, size_t size, malloc_type_id_t type_id) __attribute__((__warn_unused_result__)) __attribute__((alloc_align(2))) __attribute__((alloc_size(3))); +# 45 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_malloc.h" 2 3 4 +# 54 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/malloc/_malloc.h" 3 4 +void * malloc(size_t __size) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(1))) ; +void * calloc(size_t __count, size_t __size) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(1,2))) ; +void free(void * ); +void * realloc(void * __ptr, size_t __size) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(2))) ; + +void * reallocf(void * __ptr, size_t __size) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(2))); +void * valloc(size_t __size) __attribute__((__warn_unused_result__)) __attribute__((alloc_size(1))) ; + + + + +void * aligned_alloc(size_t __alignment, size_t __size) __attribute__((__warn_unused_result__)) __attribute__((alloc_align(1))) __attribute__((alloc_size(2))) __attribute__((availability(macosx,introduced=10.15))) __attribute__((availability(ios,introduced=13.0))) __attribute__((availability(tvos,introduced=13.0))) __attribute__((availability(watchos,introduced=6.0))); + + +int posix_memalign(void * *__memptr, size_t __alignment, size_t __size) __attribute__((availability(macosx,introduced=10.6))); +# 145 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_abort.h" 1 3 4 +# 33 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_abort.h" 3 4 +void abort(void) __attribute__((__cold__)) __attribute__((__noreturn__)); +# 146 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 2 3 4 + + +int abs(int) __attribute__((__const__)); +int atexit(void (* _Nonnull)(void)); + + +int at_quick_exit(void (*)(void)); + +double atof(const char *); +int atoi(const char *); +long atol(const char *); + +long long + atoll(const char *); + +void *bsearch(const void * __key, const void * __base, size_t __nel, + size_t __width, int (* _Nonnull __compar)(const void *, const void *)); + +div_t div(int, int) __attribute__((__const__)); +void exit(int) __attribute__((__noreturn__)); + +char * getenv(const char *); +long labs(long) __attribute__((__const__)); +ldiv_t ldiv(long, long) __attribute__((__const__)); + +long long + llabs(long long); +lldiv_t lldiv(long long, long long); + + +int mblen(const char * __s, size_t __n); +size_t mbstowcs(wchar_t * restrict , const char * restrict, size_t __n); +int mbtowc(wchar_t * restrict, const char * restrict , size_t __n); + +void qsort(void * __base, size_t __nel, size_t __width, + int (* _Nonnull __compar)(const void *, const void *)); + + +void quick_exit(int) __attribute__((__noreturn__)); + +int rand(void) __attribute__((__availability__(swift, unavailable, message="Use arc4random instead."))); + +void srand(unsigned) __attribute__((__availability__(swift, unavailable, message="Use arc4random instead."))); +double strtod(const char *, char * *) __asm("_" "strtod" ); +float strtof(const char *, char * *) __asm("_" "strtof" ); +long strtol(const char *__str, char * *__endptr, int __base); +long double + strtold(const char *, char * *); + +long long + strtoll(const char *__str, char * *__endptr, int __base); + +unsigned long + strtoul(const char *__str, char * *__endptr, int __base); + +unsigned long long + strtoull(const char *__str, char * *__endptr, int __base); + + +__attribute__((__availability__(swift, unavailable, message="Use posix_spawn APIs or NSTask instead. (On iOS, process spawning is unavailable.)"))) +__attribute__((availability(macos,introduced=10.0))) __attribute__((availability(ios,unavailable))) +__attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))) +int system(const char *) __asm("_" "system" ); + + +size_t wcstombs(char * restrict , const wchar_t * restrict, size_t __n); +int wctomb(char *, wchar_t); + + +void _Exit(int) __attribute__((__noreturn__)); +long a64l(const char *); +double drand48(void); +char * ecvt(double, int, int *restrict, int *restrict); +double erand48(unsigned short[3]); +char * fcvt(double, int, int *restrict, int *restrict); +char * gcvt(double, int, char *) ; +int getsubopt(char * *, char * const *, char * *); +int grantpt(int); + +char * + initstate(unsigned, char *, size_t __size); + + + + +long jrand48(unsigned short[3]) __attribute__((__availability__(swift, unavailable, message="Use arc4random instead."))); +char *l64a(long); +void lcong48(unsigned short[7]); +long lrand48(void) __attribute__((__availability__(swift, unavailable, message="Use arc4random instead."))); + +__attribute__((__deprecated__("This function is provided for compatibility reasons only. Due to security concerns inherent in the design of mktemp(3), it is highly recommended that you use mkstemp(3) instead."))) + +char * mktemp(char *); +int mkstemp(char *); +long mrand48(void) __attribute__((__availability__(swift, unavailable, message="Use arc4random instead."))); +long nrand48(unsigned short[3]) __attribute__((__availability__(swift, unavailable, message="Use arc4random instead."))); +int posix_openpt(int); +char * ptsname(int); + + +int ptsname_r(int fildes, char * buffer, size_t buflen) __attribute__((availability(macos,introduced=10.13.4))) __attribute__((availability(ios,introduced=11.3))) __attribute__((availability(tvos,introduced=11.3))) __attribute__((availability(watchos,introduced=4.3))); + + +int putenv(char *) __asm("_" "putenv" ); +long random(void) __attribute__((__availability__(swift, unavailable, message="Use arc4random instead."))); +int rand_r(unsigned *) __attribute__((__availability__(swift, unavailable, message="Use arc4random instead."))); + +char * realpath(const char * restrict, char * restrict ) __asm("_" "realpath" "$DARWIN_EXTSN"); + + + +unsigned short * seed48(unsigned short[3]); +int setenv(const char * __name, const char * __value, int __overwrite) __asm("_" "setenv" ); + +void setkey(const char *) __asm("_" "setkey" ); + + + +char * setstate(const char *); +void srand48(long); + +void srandom(unsigned); + + + +int unlockpt(int); + +int unsetenv(const char *) __asm("_" "unsetenv" ); +# 282 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_dev_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_dev_t.h" 3 4 +typedef __darwin_dev_t dev_t; +# 283 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_mode_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_mode_t.h" 3 4 +typedef __darwin_mode_t mode_t; +# 284 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 2 3 4 + + + +uint32_t arc4random(void); +void arc4random_addrandom(unsigned char * , int __datlen) + __attribute__((availability(macosx,introduced=10.0))) __attribute__((availability(macosx,deprecated=10.12,message="use arc4random_stir"))) + __attribute__((availability(ios,introduced=2.0))) __attribute__((availability(ios,deprecated=10.0,message="use arc4random_stir"))) + __attribute__((availability(tvos,introduced=2.0))) __attribute__((availability(tvos,deprecated=10.0,message="use arc4random_stir"))) + __attribute__((availability(watchos,introduced=1.0))) __attribute__((availability(watchos,deprecated=3.0,message="use arc4random_stir"))); +void arc4random_buf(void * __buf, size_t __nbytes) __attribute__((availability(macosx,introduced=10.7))); +void arc4random_stir(void); +uint32_t + arc4random_uniform(uint32_t __upper_bound) __attribute__((availability(macosx,introduced=10.7))); + +int atexit_b(void (^ _Nonnull)(void)) __attribute__((availability(macosx,introduced=10.6))); +# 307 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 3 4 +void *bsearch_b(const void * __key, const void * __base, size_t __nel, + size_t __width, int (^ _Nonnull __compar)(const void *, const void *) __attribute__((__noescape__))) + __attribute__((availability(macosx,introduced=10.6))); + + + +char * cgetcap(char *, const char *, int); +int cgetclose(void); +int cgetent(char * *, char * *, const char *); +int cgetfirst(char * *, char * *); +int cgetmatch(const char *, const char *); +int cgetnext(char * *, char * *); +int cgetnum(char *, const char *, long *); +int cgetset(const char *); +int cgetstr(char *, const char *, char * *); +int cgetustr(char *, const char *, char * *); + +int daemon(int, int) __asm("_" "daemon" ) __attribute__((availability(macosx,introduced=10.0,deprecated=10.5,message="Use posix_spawn APIs instead."))) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +char * devname(dev_t, mode_t); +char * devname_r(dev_t, mode_t, char * buf, int len); +char * getbsize(int *, long *); +int getloadavg(double [], int __nelem); +const char + *getprogname(void); +void setprogname(const char *); +# 341 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdlib.h" 3 4 +int heapsort(void * __base, size_t __nel, size_t __width, + int (* _Nonnull __compar)(const void *, const void *)); + +int heapsort_b(void * __base, size_t __nel, size_t __width, + int (^ _Nonnull __compar)(const void *, const void *) __attribute__((__noescape__))) + __attribute__((availability(macosx,introduced=10.6))); + +int mergesort(void * __base, size_t __nel, size_t __width, + int (* _Nonnull __compar)(const void *, const void *)); + +int mergesort_b(void * __base, size_t __nel, size_t __width, + int (^ _Nonnull __compar)(const void *, const void *) __attribute__((__noescape__))) + __attribute__((availability(macosx,introduced=10.6))); + +void psort(void * __base, size_t __nel, size_t __width, + int (* _Nonnull __compar)(const void *, const void *)) + __attribute__((availability(macosx,introduced=10.6))); + +void psort_b(void * __base, size_t __nel, size_t __width, + int (^ _Nonnull __compar)(const void *, const void *) __attribute__((__noescape__))) + __attribute__((availability(macosx,introduced=10.6))); + +void psort_r(void * __base, size_t __nel, size_t __width, void *, + int (* _Nonnull __compar)(void *, const void *, const void *)) + __attribute__((availability(macosx,introduced=10.6))); + +void qsort_b(void * __base, size_t __nel, size_t __width, + int (^ _Nonnull __compar)(const void *, const void *) __attribute__((__noescape__))) + __attribute__((availability(macosx,introduced=10.6))); + +void qsort_r(void * __base, size_t __nel, size_t __width, void *, + int (* _Nonnull __compar)(void *, const void *, const void *)); +int radixsort(const unsigned char * * __base, int __nel, const unsigned char * __table, + unsigned __endbyte); +int rpmatch(const char *) + __attribute__((availability(macos,introduced=10.15))) __attribute__((availability(ios,introduced=13.0))) __attribute__((availability(tvos,introduced=13.0))) __attribute__((availability(watchos,introduced=6.0))); +int sradixsort(const unsigned char * * __base, int __nel, const unsigned char * __table, + unsigned __endbyte); +void sranddev(void); +void srandomdev(void); + +long long + strtonum(const char *__numstr, long long __minval, long long __maxval, const char * *__errstrp) + __attribute__((availability(macos,introduced=11.0))) __attribute__((availability(ios,introduced=14.0))) __attribute__((availability(tvos,introduced=14.0))) __attribute__((availability(watchos,introduced=7.0))); + +long long + strtoq(const char *__str, char * *__endptr, int __base); +unsigned long long + strtouq(const char *__str, char * *__endptr, int __base); + +extern char * suboptarg; +# 59 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 2 3 4 +# 14 "tls12.c" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 58 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 1 3 4 +# 64 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 65 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 66 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_null.h" 1 3 4 +# 67 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 2 3 4 + + + + + + +void * + memchr(const void * __s, int __c, size_t __n); +int memcmp(const void * __s1, const void * __s2, + size_t __n); +void * + memcpy(void * __dst, const void * __src, + size_t __n); +void * + memmove(void * __dst, + const void * __src, size_t __len); +void * + memset(void * __b, int __c, size_t __len); +char * + strcat(char * __s1, const char *__s2) + ; +char * strchr(const char *__s, int __c); +int strcmp(const char *__s1, const char *__s2); +int strcoll(const char *__s1, const char *__s2); +char * + strcpy(char * __dst, const char *__src) + ; +size_t strcspn(const char *__s, const char *__charset); +char * strerror(int __errnum) __asm("_" "strerror" ); +size_t strlen(const char *__s); +char * + strncat(char * __s1, + const char * __s2, size_t __n) + ; +int strncmp(const char * __s1, + const char * __s2, size_t __n); +char * + strncpy(char * __dst, + const char * __src, size_t __n) + ; +char * strpbrk(const char *__s, const char *__charset); +char * strrchr(const char *__s, int __c); +size_t strspn(const char *__s, const char *__charset); +char * strstr(const char *__big, const char *__little); +char * strtok(char * __str, const char *__sep); +size_t strxfrm(char * __s1, const char *__s2, size_t __n); +# 125 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 3 4 +char * + strtok_r(char * __str, const char *__sep, + char * *__lasts); +# 139 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 3 4 +int strerror_r(int __errnum, char * __strerrbuf, + size_t __buflen); +char * strdup(const char *__s1); +void * + memccpy(void * __dst, const void * __src, + int __c, size_t __n); +# 156 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 3 4 +char * + stpcpy(char * __dst, const char *__src) ; +char * + stpncpy(char * __dst, + const char * __src, size_t __n) + __attribute__((availability(macosx,introduced=10.7))) + ; +char * strndup(const char * __s1, size_t __n) __attribute__((availability(macosx,introduced=10.7))); +size_t strnlen(const char * __s1, size_t __n) __attribute__((availability(macosx,introduced=10.7))); +char * strsignal(int __sig); + + + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_rsize_t.h" 1 3 4 +# 50 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_rsize_t.h" 3 4 +typedef __darwin_size_t rsize_t; +# 173 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_errno_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_errno_t.h" 3 4 +typedef int errno_t; +# 174 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 2 3 4 + + +errno_t memset_s(void * __s, rsize_t __smax, int __c, rsize_t __n) __attribute__((availability(macosx,introduced=10.9))); +# 186 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 3 4 +void * + memmem(const void * __big, size_t __big_len, + const void * __little, size_t __little_len) __attribute__((availability(macosx,introduced=10.7))); +void memset_pattern4(void * __b, const void * __pattern4, size_t __len) __attribute__((availability(macosx,introduced=10.5))); +void memset_pattern8(void * __b, const void * __pattern8, size_t __len) __attribute__((availability(macosx,introduced=10.5))); +void memset_pattern16(void * __b, const void * __pattern16, size_t __len) __attribute__((availability(macosx,introduced=10.5))); + +char * + strcasestr(const char *__big, const char *__little); +__attribute__((availability(macosx,introduced=15.4))) __attribute__((availability(ios,introduced=18.4))) +__attribute__((availability(tvos,introduced=18.4))) __attribute__((availability(watchos,introduced=11.4))) +char * + strchrnul(const char *__s, int __c); +char * + strnstr(const char * __big, const char *__little, size_t __len); +size_t strlcat(char * __dst, const char *__source, size_t __size); +size_t strlcpy(char * __dst, const char *__source, size_t __size); +void strmode(int __mode, char * __bp); +char * + strsep(char * *__stringp, const char *__delim); + + +void swab(const void * restrict, void * restrict, ssize_t __len); + +__attribute__((availability(macosx,introduced=10.12.1))) __attribute__((availability(ios,introduced=10.1))) +__attribute__((availability(tvos,introduced=10.0.1))) __attribute__((availability(watchos,introduced=3.1))) +int timingsafe_bcmp(const void * __b1, const void * __b2, size_t __len); + +__attribute__((availability(macosx,introduced=11.0))) __attribute__((availability(ios,introduced=14.0))) +__attribute__((availability(tvos,introduced=14.0))) __attribute__((availability(watchos,introduced=7.0))) +int strsignal_r(int __sig, char * __strsignalbuf, size_t __buflen); + + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_strings.h" 1 3 4 +# 65 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_strings.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 66 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_strings.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 67 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_strings.h" 2 3 4 + + + + + + +int bcmp(const void *, const void *, size_t __n) ; +void bcopy(const void *, void *, size_t __n) ; +void bzero(void *, size_t __n) ; +char * index(const char *, int) ; +char * rindex(const char *, int) ; + + +int ffs(int); +int strcasecmp(const char *, const char *); +int strncasecmp(const char *, const char *, size_t); + + + + + +int ffsl(long) __attribute__((availability(macosx,introduced=10.5))); +int ffsll(long long) __attribute__((availability(macosx,introduced=10.9))); +int fls(int) __attribute__((availability(macosx,introduced=10.5))); +int flsl(long) __attribute__((availability(macosx,introduced=10.5))); +int flsll(long long) __attribute__((availability(macosx,introduced=10.9))); + + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/secure/_strings.h" 1 3 4 +# 32 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/secure/_strings.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 33 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/secure/_strings.h" 2 3 4 +# 99 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_strings.h" 2 3 4 +# 223 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 2 3 4 + + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/secure/_string.h" 1 3 4 +# 32 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/secure/_string.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 33 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/secure/_string.h" 2 3 4 +# 229 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_string.h" 2 3 4 +# 59 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 2 3 4 +# 15 "tls12.c" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/assert.h" 1 3 4 +# 55 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/assert.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_assert.h" 1 3 4 +# 63 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_assert.h" 3 4 +void __assert_rtn(const char *, const char *, int, const char *) __attribute__((__noreturn__)) __attribute__((__cold__)) __attribute__((__disable_tail_calls__)); +# 56 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/assert.h" 2 3 4 +# 81 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/assert.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_static_assert.h" 1 3 4 +# 82 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/assert.h" 2 3 4 +# 16 "tls12.c" 2 +# 1 "/usr/local/include/gmssl/rand.h" 1 +# 15 "/usr/local/include/gmssl/rand.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 16 "/usr/local/include/gmssl/rand.h" 2 + + + + + + + + +int rand_bytes(uint8_t *buf, size_t buflen); +# 17 "tls12.c" 2 +# 1 "/usr/local/include/gmssl/x509.h" 1 +# 14 "/usr/local/include/gmssl/x509.h" +# 1 "/usr/local/include/gmssl/x509_cer.h" 1 +# 15 "/usr/local/include/gmssl/x509_cer.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/time.h" 1 3 4 +# 16 "/usr/local/include/gmssl/x509_cer.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 17 "/usr/local/include/gmssl/x509_cer.h" 2 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 19 "/usr/local/include/gmssl/x509_cer.h" 2 +# 1 "/usr/local/include/gmssl/sm2.h" 1 +# 15 "/usr/local/include/gmssl/sm2.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4 +# 16 "/usr/local/include/gmssl/sm2.h" 2 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 18 "/usr/local/include/gmssl/sm2.h" 2 +# 1 "/usr/local/include/gmssl/sm3.h" 1 +# 14 "/usr/local/include/gmssl/sm3.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 15 "/usr/local/include/gmssl/sm3.h" 2 +# 27 "/usr/local/include/gmssl/sm3.h" +typedef struct { + uint32_t digest[8]; + uint64_t nblocks; + uint8_t block[64]; + size_t num; +} SM3_CTX; + +void sm3_compress_blocks(uint32_t digest[8], const uint8_t *data, size_t blocks); + +void sm3_init(SM3_CTX *ctx); +void sm3_update(SM3_CTX *ctx, const uint8_t *data, size_t datalen); +void sm3_finish(SM3_CTX *ctx, uint8_t dgst[32]); + + + + +typedef struct { + SM3_CTX sm3_ctx; + uint8_t key[64]; +} SM3_HMAC_CTX; + +void sm3_hmac_init(SM3_HMAC_CTX *ctx, const uint8_t *key, size_t keylen); +void sm3_hmac_update(SM3_HMAC_CTX *ctx, const uint8_t *data, size_t datalen); +void sm3_hmac_finish(SM3_HMAC_CTX *ctx, uint8_t mac[(32)]); + + +typedef struct { + SM3_CTX sm3_ctx; + size_t outlen; +} SM3_KDF_CTX; + +void sm3_kdf_init(SM3_KDF_CTX *ctx, size_t outlen); +void sm3_kdf_update(SM3_KDF_CTX *ctx, const uint8_t *in, size_t inlen); +void sm3_kdf_finish(SM3_KDF_CTX *ctx, uint8_t *out); + + + + + + + +int sm3_pbkdf2(const char *pass, size_t passlen, + const uint8_t *salt, size_t saltlen, size_t count, + size_t outlen, uint8_t *out); + + +typedef struct { + union { + SM3_CTX sm3_ctx; + SM3_HMAC_CTX hmac_ctx; + }; + int state; +} SM3_DIGEST_CTX; + +int sm3_digest_init(SM3_DIGEST_CTX *ctx, const uint8_t *key, size_t keylen); +int sm3_digest_update(SM3_DIGEST_CTX *ctx, const uint8_t *data, size_t datalen); +int sm3_digest_finish(SM3_DIGEST_CTX *ctx, uint8_t dgst[32]); +# 19 "/usr/local/include/gmssl/sm2.h" 2 +# 1 "/usr/local/include/gmssl/sm2_z256.h" 1 +# 14 "/usr/local/include/gmssl/sm2_z256.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4 +# 15 "/usr/local/include/gmssl/sm2_z256.h" 2 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 17 "/usr/local/include/gmssl/sm2_z256.h" 2 + + + + + + + +typedef uint64_t sm2_z256_t[4]; +typedef uint64_t sm2_z512_t[8]; + + +void sm2_z256_set_one(sm2_z256_t r); +void sm2_z256_set_zero(sm2_z256_t r); + +int sm2_z256_rand_range(sm2_z256_t r, const sm2_z256_t range); +void sm2_z256_copy(sm2_z256_t r, const sm2_z256_t a); +void sm2_z256_copy_conditional(sm2_z256_t dst, const sm2_z256_t src, uint64_t move); +void sm2_z256_from_bytes(sm2_z256_t r, const uint8_t in[32]); +void sm2_z256_to_bytes(const sm2_z256_t a, uint8_t out[32]); +int sm2_z256_cmp(const sm2_z256_t a, const sm2_z256_t b); +uint64_t sm2_z256_is_zero(const sm2_z256_t a); +uint64_t sm2_z256_equ(const sm2_z256_t a, const sm2_z256_t b); +void sm2_z256_rshift(sm2_z256_t r, const sm2_z256_t a, unsigned int nbits); +uint64_t sm2_z256_add(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b); +uint64_t sm2_z256_sub(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b); +void sm2_z256_mul(sm2_z512_t r, const sm2_z256_t a, const sm2_z256_t b); +int sm2_z256_get_booth(const sm2_z256_t a, unsigned int window_size, int i); +void sm2_z256_from_hex(sm2_z256_t r, const char *hex); +int sm2_z256_equ_hex(const sm2_z256_t a, const char *hex); +int sm2_z256_print(FILE *fp, int ind, int fmt, const char *label, const sm2_z256_t a); + +void sm2_z256_modp_add(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b); +void sm2_z256_modp_dbl(sm2_z256_t r, const sm2_z256_t a); +void sm2_z256_modp_tri(sm2_z256_t r, const sm2_z256_t a); +void sm2_z256_modp_sub(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b); +void sm2_z256_modp_neg(sm2_z256_t r, const sm2_z256_t a); +void sm2_z256_modp_haf(sm2_z256_t r, const sm2_z256_t a); + +void sm2_z256_modp_to_mont(const sm2_z256_t a, sm2_z256_t r); +void sm2_z256_modp_from_mont(sm2_z256_t r, const sm2_z256_t a); +void sm2_z256_modp_mont_mul(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b); +void sm2_z256_modp_mont_sqr(sm2_z256_t r, const sm2_z256_t a); +void sm2_z256_modp_mont_exp(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t e); +void sm2_z256_modp_mont_inv(sm2_z256_t r, const sm2_z256_t a); +int sm2_z256_modp_mont_sqrt(sm2_z256_t r, const sm2_z256_t a); + +void sm2_z256_modn_add(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b); +void sm2_z256_modn_sub(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b); +void sm2_z256_modn_neg(sm2_z256_t r, const sm2_z256_t a); +void sm2_z256_modn_mul(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b); +void sm2_z256_modn_sqr(sm2_z256_t r, const sm2_z256_t a); +void sm2_z256_modn_exp(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t e); +void sm2_z256_modn_inv(sm2_z256_t r, const sm2_z256_t a); + +void sm2_z256_modn_to_mont(const sm2_z256_t a, sm2_z256_t r); +void sm2_z256_modn_from_mont(sm2_z256_t r, const sm2_z256_t a); +void sm2_z256_modn_mont_mul(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b); +void sm2_z256_modn_mont_sqr(sm2_z256_t r, const sm2_z256_t a); +void sm2_z256_modn_mont_exp(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t e); +void sm2_z256_modn_mont_inv(sm2_z256_t r, const sm2_z256_t a); + + +typedef struct { + sm2_z256_t X; + sm2_z256_t Y; + sm2_z256_t Z; +} SM2_Z256_POINT; + +void sm2_z256_point_set_infinity(SM2_Z256_POINT *P); +int sm2_z256_point_is_at_infinity(const SM2_Z256_POINT *P); +int sm2_z256_point_to_bytes(const SM2_Z256_POINT *P, uint8_t out[64]); +int sm2_z256_point_from_bytes(SM2_Z256_POINT *P, const uint8_t in[64]); +int sm2_z256_point_from_hex(SM2_Z256_POINT *P, const char *hex); +int sm2_z256_point_equ_hex(const SM2_Z256_POINT *P, const char *hex); +int sm2_z256_point_is_on_curve(const SM2_Z256_POINT *P); +int sm2_z256_point_equ(const SM2_Z256_POINT *P, const SM2_Z256_POINT *Q); +int sm2_z256_point_get_xy(const SM2_Z256_POINT *P, uint64_t x[4], uint64_t y[4]); + +void sm2_z256_point_dbl(SM2_Z256_POINT *R, const SM2_Z256_POINT *A); +void sm2_z256_point_add(SM2_Z256_POINT *r, const SM2_Z256_POINT *a, const SM2_Z256_POINT *b); +void sm2_z256_point_neg(SM2_Z256_POINT *R, const SM2_Z256_POINT *P); +void sm2_z256_point_sub(SM2_Z256_POINT *R, const SM2_Z256_POINT *A, const SM2_Z256_POINT *B); +void sm2_z256_point_get_affine(const SM2_Z256_POINT *P, uint64_t x[4], uint64_t y[4]); +int sm2_z256_point_print(FILE *fp, int fmt, int ind, const char *label, const SM2_Z256_POINT *P); + + +typedef struct { + sm2_z256_t x; + sm2_z256_t y; +} SM2_Z256_AFFINE_POINT; + +void sm2_z256_point_copy_affine(SM2_Z256_POINT *R, const SM2_Z256_AFFINE_POINT *P); +void sm2_z256_point_add_affine(SM2_Z256_POINT *r, const SM2_Z256_POINT *a, const SM2_Z256_AFFINE_POINT *b); +void sm2_z256_point_sub_affine(SM2_Z256_POINT *R, const SM2_Z256_POINT *A, const SM2_Z256_AFFINE_POINT *B); +int sm2_z256_point_affine_print(FILE *fp, int fmt, int ind, const char *label, const SM2_Z256_AFFINE_POINT *P); + +void sm2_z256_point_mul_generator(SM2_Z256_POINT *R, const sm2_z256_t k); +void sm2_z256_point_mul_pre_compute(const SM2_Z256_POINT *P, SM2_Z256_POINT T[16]); +void sm2_z256_point_mul_ex(SM2_Z256_POINT *R, const sm2_z256_t k, const SM2_Z256_POINT P_table[16]); +void sm2_z256_point_mul(SM2_Z256_POINT *R, const sm2_z256_t k, const SM2_Z256_POINT *P); +void sm2_z256_point_mul_sum(SM2_Z256_POINT *R, const sm2_z256_t t, const SM2_Z256_POINT *P, const sm2_z256_t s); + + +const uint64_t *sm2_z256_prime(void); +const uint64_t *sm2_z256_order(void); +const uint64_t *sm2_z256_order_minus_one(void); +const uint64_t *sm2_z256_one(void); + + +enum { + SM2_point_at_infinity = 0x00, + SM2_point_compressed_y_even = 0x02, + SM2_point_compressed_y_odd = 0x03, + SM2_point_uncompressed = 0x04, + SM2_point_uncompressed_y_even = 0x06, + SM2_point_uncompressed_y_odd = 0x07, +}; + +int sm2_z256_point_from_x_bytes(SM2_Z256_POINT *P, const uint8_t x_bytes[32], int y_is_odd); +int sm2_z256_point_from_hash(SM2_Z256_POINT *R, const uint8_t *data, size_t datalen, int y_is_odd); +int sm2_z256_point_from_octets(SM2_Z256_POINT *P, const uint8_t *in, size_t inlen); + +int sm2_z256_point_to_uncompressed_octets(const SM2_Z256_POINT *P, uint8_t out[65]); +int sm2_z256_point_to_compressed_octets(const SM2_Z256_POINT *P, uint8_t out[33]); + + + + + + +int sm2_z256_point_to_der(const SM2_Z256_POINT *P, uint8_t **out, size_t *outlen); +int sm2_z256_point_from_der(SM2_Z256_POINT *P, const uint8_t **in, size_t *inlen); +int sm2_z256_point_print(FILE *fp, int fmt, int ind, const char *label, const SM2_Z256_POINT *P); +# 20 "/usr/local/include/gmssl/sm2.h" 2 + + + + + + +typedef struct { + SM2_Z256_POINT public_key; + sm2_z256_t private_key; +} SM2_KEY; + + + + +int sm2_key_generate(SM2_KEY *key); +int sm2_key_print(FILE *fp, int fmt, int ind, const char *label, const SM2_KEY *key); +int sm2_key_set_private_key(SM2_KEY *key, const sm2_z256_t private_key); +int sm2_key_set_public_key(SM2_KEY *key, const SM2_Z256_POINT *public_key); + +int sm2_public_key_equ(const SM2_KEY *sm2_key, const SM2_KEY *pub_key); +int sm2_public_key_digest(const SM2_KEY *key, uint8_t dgst[32]); +int sm2_public_key_to_der(const SM2_KEY *key, uint8_t **out, size_t *outlen); +int sm2_public_key_from_der(SM2_KEY *key, const uint8_t **in, size_t *inlen); +int sm2_public_key_print(FILE *fp, int fmt, int ind, const char *label, const SM2_KEY *pub_key); +# 64 "/usr/local/include/gmssl/sm2.h" +int sm2_private_key_to_der(const SM2_KEY *key, uint8_t **out, size_t *outlen); +int sm2_private_key_from_der(SM2_KEY *key, const uint8_t **in, size_t *inlen); +int sm2_private_key_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +int sm2_private_key_to_pem(const SM2_KEY *key, FILE *fp); +int sm2_private_key_from_pem(SM2_KEY *key, FILE *fp); + + + + + + +int sm2_public_key_algor_to_der(uint8_t **out, size_t *outlen); +int sm2_public_key_algor_from_der(const uint8_t **in, size_t *inlen); +# 85 "/usr/local/include/gmssl/sm2.h" +int sm2_public_key_info_to_der(const SM2_KEY *a, uint8_t **out, size_t *outlen); +int sm2_public_key_info_from_der(SM2_KEY *a, const uint8_t **in, size_t *inlen); +int sm2_public_key_info_to_pem(const SM2_KEY *a, FILE *fp); +int sm2_public_key_info_from_pem(SM2_KEY *a, FILE *fp); +# 99 "/usr/local/include/gmssl/sm2.h" +enum { + PKCS8_private_key_info_version = 0, +}; + + +int sm2_private_key_info_to_der(const SM2_KEY *key, uint8_t **out, size_t *outlen); +int sm2_private_key_info_from_der(SM2_KEY *key, const uint8_t **attrs, size_t *attrslen, const uint8_t **in, size_t *inlen); +int sm2_private_key_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +int sm2_private_key_info_to_pem(const SM2_KEY *key, FILE *fp); + +int sm2_private_key_info_from_pem(SM2_KEY *key, FILE *fp); + + + + + + +int sm2_private_key_info_encrypt_to_der(const SM2_KEY *key, + const char *pass, uint8_t **out, size_t *outlen); +int sm2_private_key_info_decrypt_from_der(SM2_KEY *key, const uint8_t **attrs, size_t *attrs_len, + const char *pass, const uint8_t **in, size_t *inlen); +int sm2_private_key_info_encrypt_to_pem(const SM2_KEY *key, const char *pass, FILE *fp); + +int sm2_private_key_info_decrypt_from_pem(SM2_KEY *key, const char *pass, FILE *fp); + + + +typedef struct { + uint8_t r[32]; + uint8_t s[32]; +} SM2_SIGNATURE; + +int sm2_do_sign(const SM2_KEY *key, const uint8_t dgst[32], SM2_SIGNATURE *sig); +int sm2_do_verify(const SM2_KEY *key, const uint8_t dgst[32], const SM2_SIGNATURE *sig); + +int sm2_fast_sign_compute_key(const SM2_KEY *key, sm2_z256_t fast_private); + +typedef struct { + sm2_z256_t k; + sm2_z256_t x1_modn; +} SM2_SIGN_PRE_COMP; + + + +int sm2_fast_sign_pre_compute(SM2_SIGN_PRE_COMP pre_comp[32]); +int sm2_fast_sign(const sm2_z256_t fast_private, SM2_SIGN_PRE_COMP *pre_comp, + const uint8_t dgst[32], SM2_SIGNATURE *sig); +int sm2_fast_verify(const SM2_Z256_POINT point_table[16], + const uint8_t dgst[32], const SM2_SIGNATURE *sig); + + + + +int sm2_signature_to_der(const SM2_SIGNATURE *sig, uint8_t **out, size_t *outlen); +int sm2_signature_from_der(SM2_SIGNATURE *sig, const uint8_t **in, size_t *inlen); +int sm2_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen); +int sm2_sign(const SM2_KEY *key, const uint8_t dgst[32], uint8_t *sig, size_t *siglen); +int sm2_verify(const SM2_KEY *key, const uint8_t dgst[32], const uint8_t *sig, size_t siglen); + +enum { + SM2_signature_compact_size = 70, + SM2_signature_typical_size = 71, + SM2_signature_max_size = 72, +}; +int sm2_sign_fixlen(const SM2_KEY *key, const uint8_t dgst[32], size_t siglen, uint8_t *sig); +# 173 "/usr/local/include/gmssl/sm2.h" +int sm2_compute_z(uint8_t z[32], const SM2_Z256_POINT *pub, const char *id, size_t idlen); + + + +typedef struct { + SM3_CTX sm3_ctx; + SM3_CTX saved_sm3_ctx; + SM2_KEY key; + sm2_z256_t fast_sign_private; + SM2_SIGN_PRE_COMP pre_comp[32]; + unsigned int num_pre_comp; + + + SM2_Z256_POINT public_point_table[16]; +} SM2_SIGN_CTX; + +int sm2_sign_init(SM2_SIGN_CTX *ctx, const SM2_KEY *key, const char *id, size_t idlen); +int sm2_sign_update(SM2_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int sm2_sign_finish(SM2_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen); +int sm2_sign_reset(SM2_SIGN_CTX *ctx); +int sm2_sign_finish_fixlen(SM2_SIGN_CTX *ctx, size_t siglen, uint8_t *sig); + +typedef struct { + SM3_CTX sm3_ctx; + SM3_CTX saved_sm3_ctx; + SM2_KEY key; + SM2_Z256_POINT public_point_table[16]; +} SM2_VERIFY_CTX; + +int sm2_verify_init(SM2_VERIFY_CTX *ctx, const SM2_KEY *key, const char *id, size_t idlen); +int sm2_verify_update(SM2_VERIFY_CTX *ctx, const uint8_t *data, size_t datalen); +int sm2_verify_finish(SM2_VERIFY_CTX *ctx, const uint8_t *sig, size_t siglen); +int sm2_verify_reset(SM2_VERIFY_CTX *ctx); +# 218 "/usr/local/include/gmssl/sm2.h" +typedef struct { + uint8_t x[32]; + uint8_t y[32]; +} SM2_POINT; + +typedef struct { + SM2_POINT point; + uint8_t hash[32]; + uint8_t ciphertext_size; + uint8_t ciphertext[255]; +} SM2_CIPHERTEXT; + + +int sm2_kdf(const uint8_t *in, size_t inlen, size_t outlen, uint8_t *out); + +int sm2_do_encrypt(const SM2_KEY *key, const uint8_t *in, size_t inlen, SM2_CIPHERTEXT *out); +int sm2_do_decrypt(const SM2_KEY *key, const SM2_CIPHERTEXT *in, uint8_t *out, size_t *outlen); + + + +int sm2_ciphertext_to_der(const SM2_CIPHERTEXT *c, uint8_t **out, size_t *outlen); +int sm2_ciphertext_from_der(SM2_CIPHERTEXT *c, const uint8_t **in, size_t *inlen); +int sm2_ciphertext_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *a, size_t alen); +int sm2_encrypt(const SM2_KEY *key, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm2_decrypt(const SM2_KEY *key, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); + +enum { + SM2_ciphertext_compact_point_size = 68, + SM2_ciphertext_typical_point_size = 69, + SM2_ciphertext_max_point_size = 70, +}; +int sm2_do_encrypt_fixlen(const SM2_KEY *key, const uint8_t *in, size_t inlen, int point_size, SM2_CIPHERTEXT *out); +int sm2_encrypt_fixlen(const SM2_KEY *key, const uint8_t *in, size_t inlen, int point_size, uint8_t *out, size_t *outlen); + + +int sm2_do_ecdh(const SM2_KEY *key, const SM2_KEY *peer_key, uint8_t out[32]); +int sm2_ecdh(const SM2_KEY *key, const uint8_t uncompressed_point[65], uint8_t out[32]); + + +typedef struct { + sm2_z256_t k; + SM2_POINT C1; +} SM2_ENC_PRE_COMP; + + +int sm2_encrypt_pre_compute(SM2_ENC_PRE_COMP pre_comp[8]); +int sm2_do_encrypt_ex(const SM2_KEY *key, const SM2_ENC_PRE_COMP *pre_comp, + const uint8_t *in, size_t inlen, SM2_CIPHERTEXT *out); + +typedef struct { + SM2_ENC_PRE_COMP pre_comp[8]; + size_t pre_comp_num; + uint8_t buf[255]; + size_t buf_size; +} SM2_ENC_CTX; + +int sm2_encrypt_init(SM2_ENC_CTX *ctx); +int sm2_encrypt_update(SM2_ENC_CTX *ctx, const uint8_t *in, size_t inlen); +int sm2_encrypt_finish(SM2_ENC_CTX *ctx, const SM2_KEY *public_key, uint8_t *out, size_t *outlen); +int sm2_encrypt_reset(SM2_ENC_CTX *ctx); + +typedef struct { + uint8_t buf[366]; + size_t buf_size; +} SM2_DEC_CTX; + +int sm2_decrypt_init(SM2_DEC_CTX *ctx); +int sm2_decrypt_update(SM2_DEC_CTX *ctx, const uint8_t *in, size_t inlen); +int sm2_decrypt_finish(SM2_DEC_CTX *ctx, const SM2_KEY *key, uint8_t *out, size_t *outlen); +int sm2_decrypt_reset(SM2_DEC_CTX *ctx); +# 20 "/usr/local/include/gmssl/x509_cer.h" 2 +# 1 "/usr/local/include/gmssl/oid.h" 1 +# 21 "/usr/local/include/gmssl/oid.h" +enum { + OID_undef = 0, + + + OID_sm1, + OID_ssf33, + OID_sm4, + OID_zuc, + OID_sm2, + OID_sm2sign, + OID_sm2keyagreement, + OID_sm2encrypt, + OID_sm9, + OID_sm9sign, + OID_sm9keyagreement, + OID_sm9encrypt, + OID_sm3, + OID_sm3_keyless, + OID_hmac_sm3, + OID_sm2sign_with_sm3, + OID_rsasign_with_sm3, + OID_ec_public_key, + OID_prime192v1, + OID_prime256v1, + OID_secp256k1, + OID_secp192k1, + OID_secp224k1, + OID_secp224r1, + OID_secp384r1, + OID_secp521r1, + + OID_at_name, + OID_at_surname, + OID_at_given_name, + OID_at_initials, + OID_at_generation_qualifier, + OID_at_common_name, + OID_at_locality_name, + OID_at_state_or_province_name, + OID_at_organization_name, + OID_at_organizational_unit_name, + OID_at_title, + OID_at_dn_qualifier, + OID_at_country_name, + OID_at_serial_number, + OID_at_pseudonym, + OID_domain_component, + OID_email_address, + + + OID_ce_authority_key_identifier, + OID_ce_subject_key_identifier, + OID_ce_key_usage, + OID_ce_certificate_policies, + OID_ce_policy_mappings, + OID_ce_subject_alt_name, + OID_ce_issuer_alt_name, + OID_ce_subject_directory_attributes, + OID_ce_basic_constraints, + OID_ce_name_constraints, + OID_ce_policy_constraints, + OID_ce_ext_key_usage, + OID_ce_crl_distribution_points, + OID_ce_inhibit_any_policy, + OID_ce_freshest_crl, + OID_netscape_cert_type, + OID_netscape_cert_comment, + OID_ct_precertificate_scts, + + OID_ad_ca_issuers, + OID_ad_ocsp, + + + + + OID_ce_crl_number, + OID_ce_delta_crl_indicator, + OID_ce_issuing_distribution_point, + + OID_pe_authority_info_access, + + + OID_ce_crl_reasons, + OID_ce_invalidity_date, + OID_ce_certificate_issuer, + + + OID_any_extended_key_usage, + OID_kp_server_auth, + OID_kp_client_auth, + OID_kp_code_signing, + OID_kp_email_protection, + OID_kp_time_stamping, + OID_kp_ocsp_signing, + + OID_qt_cps, + OID_qt_unotice, + + OID_md5, + OID_sha1, + OID_sha224, + OID_sha256, + OID_sha384, + OID_sha512, + OID_sha512_224, + OID_sha512_256, + + + OID_hmac_sha1, + OID_hmac_sha224, + OID_hmac_sha256, + OID_hmac_sha384, + OID_hmac_sha512, + OID_hmac_sha512_224, + OID_hmac_sha512_256, + + OID_pbkdf2, + OID_pbes2, + + + + OID_sm4_ecb, + OID_sm4_cbc, + + OID_aes, + OID_aes128_cbc, + OID_aes192_cbc, + OID_aes256_cbc, + + OID_aes128, + + OID_ecdsa_with_sha1, + OID_ecdsa_with_sha224, + OID_ecdsa_with_sha256, + OID_ecdsa_with_sha384, + OID_ecdsa_with_sha512, + + OID_rsasign_with_md5, + OID_rsasign_with_sha1, + OID_rsasign_with_sha224, + OID_rsasign_with_sha256, + OID_rsasign_with_sha384, + OID_rsasign_with_sha512, + + OID_rsa_encryption, + OID_rsaes_oaep, + + OID_any_policy, + + OID_cms_data, + OID_cms_signed_data, + OID_cms_enveloped_data, + OID_cms_signed_and_enveloped_data, + OID_cms_encrypted_data, + OID_cms_key_agreement_info, + + OID_lms_hashsig, + OID_hss_lms_hashsig, + OID_xmss_hashsig, + OID_xmssmt_hashsig, + OID_sphincs_hashsig, +}; +# 21 "/usr/local/include/gmssl/x509_cer.h" 2 +# 1 "/usr/local/include/gmssl/asn1.h" 1 +# 15 "/usr/local/include/gmssl/asn1.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/time.h" 1 3 4 +# 16 "/usr/local/include/gmssl/asn1.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 17 "/usr/local/include/gmssl/asn1.h" 2 +# 39 "/usr/local/include/gmssl/asn1.h" +enum ASN1_TAG { + ASN1_TAG_END_OF_CONTENTS = 0, + ASN1_TAG_BOOLEAN = 1, + ASN1_TAG_INTEGER = 2, + ASN1_TAG_BIT_STRING = 3, + ASN1_TAG_OCTET_STRING = 4, + ASN1_TAG_NULL = 5, + ASN1_TAG_OBJECT_IDENTIFIER = 6, + ASN1_TAG_ObjectDescriptor = 7, + ASN1_TAG_EXTERNAL = 8, + ASN1_TAG_REAL = 9, + ASN1_TAG_ENUMERATED = 10, + ASN1_TAG_EMBEDDED = 11, + ASN1_TAG_UTF8String = 12, + ASN1_TAG_RELATIVE_OID = 13, + + + + + ASN1_TAG_NumericString = 18, + ASN1_TAG_PrintableString = 19, + ASN1_TAG_TeletexString = 20, + ASN1_TAG_VideotexString = 21, + ASN1_TAG_IA5String = 22, + ASN1_TAG_UTCTime = 23, + ASN1_TAG_GeneralizedTime = 24, + ASN1_TAG_GraphicString = 25, + ASN1_TAG_VisibleString = 26, + ASN1_TAG_GeneralString = 27, + ASN1_TAG_UniversalString = 28, + ASN1_TAG_CHARACTER_STRING = 29, + ASN1_TAG_BMPString = 30, + + + ASN1_TAG_SEQUENCE = 0x30, + ASN1_TAG_SET = 0x31, + + + ASN1_TAG_EXPLICIT = 0xa0, + + + + +}; + + + + + + +const char *asn1_tag_name(int tag); +int asn1_tag_is_cstring(int tag); +int asn1_tag_to_der(int tag, uint8_t **out, size_t *outlen); +int asn1_tag_from_der(int *tag, const uint8_t **in, size_t *inlen); +int asn1_tag_from_der_readonly(int *tag, const uint8_t **in, size_t *inlen); +int asn1_length_to_der(size_t dlen, uint8_t **out, size_t *outlen); +int asn1_length_from_der(size_t *dlen, const uint8_t **in, size_t *inlen); +int asn1_length_is_zero(size_t len); +int asn1_length_le(size_t len1, size_t len2); +int asn1_data_to_der(const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_data_from_der(const uint8_t **d, size_t dlen, const uint8_t **in, size_t *inlen); + +int asn1_type_to_der(int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_type_from_der(int tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int asn1_nonempty_type_to_der(int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_nonempty_type_from_der(int tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int asn1_any_type_from_der(int *tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int asn1_any_to_der(const uint8_t *a, size_t alen, uint8_t **out, size_t *outlen); +int asn1_any_from_der(const uint8_t **a, size_t *alen, const uint8_t **in, size_t *inlen); + + + + +const char *asn1_boolean_name(int val); +int asn1_boolean_from_name(int *val, const char *name); +int asn1_boolean_to_der_ex(int tag, int val, uint8_t **out, size_t *outlen); +int asn1_boolean_from_der_ex(int tag, int *val, const uint8_t **in, size_t *inlen); + + + + + + +int asn1_integer_to_der_ex(int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_integer_from_der_ex(int tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); + + + + + + +int asn1_int_to_der_ex(int tag, int val, uint8_t **out, size_t *outlen); +int asn1_int_from_der_ex(int tag, int *val, const uint8_t **in, size_t *inlen); + + + + + + +int asn1_bit_string_to_der_ex(int tag, const uint8_t *d, size_t nbits, uint8_t **out, size_t *outlen); +int asn1_bit_string_from_der_ex(int tag, const uint8_t **d, size_t *nbits, const uint8_t **in, size_t *inlen); + + + + + + +int asn1_bit_octets_to_der_ex(int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_bit_octets_from_der_ex(int tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); + + + + + + +int asn1_bits_to_der_ex(int tag, int bits, uint8_t **out, size_t *outlen); +int asn1_bits_from_der_ex(int tag, int *bits, const uint8_t **in, size_t *inlen); + + + + + +int asn1_bits_print(FILE *fp, int fmt, int ind, const char *label, const char **names, size_t names_cnt, int bits); +# 170 "/usr/local/include/gmssl/asn1.h" +const char *asn1_null_name(void); +int asn1_null_to_der(uint8_t **out, size_t *outlen); +int asn1_null_from_der(const uint8_t **in, size_t *inlen); + + + + + +int asn1_object_identifier_to_octets(const uint32_t *nodes, size_t nodes_cnt, uint8_t *out, size_t *outlen); +int asn1_object_identifier_from_octets(uint32_t *nodes, size_t *nodes_cnt, const uint8_t *in, size_t inlen); + +int asn1_object_identifier_to_der_ex(int tag, const uint32_t *nodes, size_t nodes_cnt, uint8_t **out, size_t *outlen); +int asn1_object_identifier_from_der_ex(int tag, uint32_t *nodes, size_t *nodes_cnt, const uint8_t **in, size_t *inlen); + + + + +int asn1_object_identifier_equ(const uint32_t *a, size_t a_cnt, const uint32_t *b, size_t b_cnt); +int asn1_object_identifier_print(FILE *fp, int fmt, int ind, const char *label, const char *name, + const uint32_t *nodes, size_t nodes_cnt); + +typedef struct { + int oid; + char *name; + uint32_t *nodes; + size_t nodes_cnt; + int flags; + char *description; +} ASN1_OID_INFO; + +const ASN1_OID_INFO *asn1_oid_info_from_name(const ASN1_OID_INFO *infos, size_t count, const char *name); +const ASN1_OID_INFO *asn1_oid_info_from_oid(const ASN1_OID_INFO *infos, size_t count, int oid); + + +int asn1_oid_info_from_der_ex(const ASN1_OID_INFO **info, uint32_t *nodes, size_t *nodes_cnt, + const ASN1_OID_INFO *infos, size_t count, const uint8_t **in, size_t *inlen); +int asn1_oid_info_from_der(const ASN1_OID_INFO **info, + const ASN1_OID_INFO *infos, size_t count, const uint8_t **in, size_t *inlen); +# 216 "/usr/local/include/gmssl/asn1.h" +int asn1_string_is_utf8_string(const char *d, size_t dlen); +int asn1_utf8_string_to_der_ex(int tag, const char *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_utf8_string_from_der_ex(int tag, const char **d, size_t *dlen, const uint8_t **in, size_t *inlen); + + + + + +int asn1_string_is_printable_string(const char *d, size_t dlen); +int asn1_printable_string_case_ignore_match(const char *a, size_t alen, const char *b, size_t blen); +int asn1_printable_string_to_der_ex(int tag, const char *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_printable_string_from_der_ex(int tag, const char **d, size_t *dlen, const uint8_t **in, size_t *inlen); + + + + + +int asn1_string_is_ia5_string(const char *d, size_t dlen); +int asn1_ia5_string_to_der_ex(int tag, const char *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_ia5_string_from_der_ex(int tag, const char **d, size_t *dlen, const uint8_t **in, size_t *inlen); + + + + + +int asn1_string_print(FILE *fp, int fmt, int ind, const char *label, int tag, const uint8_t *d, size_t dlen); + + + + + +int asn1_time_to_str(int utc_time, time_t timestamp, char *str); +int asn1_time_from_str(int utc_time, time_t *timestamp, const char *str); + +int asn1_utc_time_to_der_ex(int tag, time_t tv, uint8_t **out, size_t *outlen); +int asn1_utc_time_from_der_ex(int tag, time_t *tv, const uint8_t **in, size_t *inlen); + + + + + +int asn1_generalized_time_to_der_ex(int tag, time_t tv, uint8_t **out, size_t *outlen); +int asn1_generalized_time_from_der_ex(int tag, time_t *tv, const uint8_t **in, size_t *inlen); +# 272 "/usr/local/include/gmssl/asn1.h" +int asn1_sequence_of_int_to_der(const int *nums, size_t nums_cnt, uint8_t **out, size_t *outlen); +int asn1_sequence_of_int_from_der(int *nums, size_t *nums_cnt, size_t max_nums, const uint8_t **in, size_t *inlen); +int asn1_sequence_of_int_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +# 287 "/usr/local/include/gmssl/asn1.h" +int asn1_header_to_der(int tag, size_t dlen, uint8_t **out, size_t *outlen); +# 305 "/usr/local/include/gmssl/asn1.h" +int asn1_types_get_count(const uint8_t *d, size_t dlen, int tag, size_t *cnt); +int asn1_types_get_item_by_index(const uint8_t *d, size_t dlen, int tag, + int index, const uint8_t **item_d, size_t *item_dlen); + + + + + +int asn1_check(int expr); +# 22 "/usr/local/include/gmssl/x509_cer.h" 2 +# 1 "/usr/local/include/gmssl/x509_key.h" 1 +# 15 "/usr/local/include/gmssl/x509_key.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/time.h" 1 3 4 +# 16 "/usr/local/include/gmssl/x509_key.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 17 "/usr/local/include/gmssl/x509_key.h" 2 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 19 "/usr/local/include/gmssl/x509_key.h" 2 + + + +# 1 "/usr/local/include/gmssl/ecdsa.h" 1 +# 15 "/usr/local/include/gmssl/ecdsa.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 16 "/usr/local/include/gmssl/ecdsa.h" 2 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 18 "/usr/local/include/gmssl/ecdsa.h" 2 +# 1 "/usr/local/include/gmssl/sha2.h" 1 +# 15 "/usr/local/include/gmssl/sha2.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 16 "/usr/local/include/gmssl/sha2.h" 2 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 1 3 4 +# 84 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_char.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_char.h" 3 4 +typedef unsigned char u_char; +# 85 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_short.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_short.h" 3 4 +typedef unsigned short u_short; +# 86 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_int.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_u_int.h" 3 4 +typedef unsigned int u_int; +# 87 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 + +typedef unsigned long u_long; + + +typedef unsigned short ushort; + +typedef unsigned int uint; + + + + +typedef u_int64_t u_quad_t; +typedef int64_t quad_t; +typedef quad_t * qaddr_t; + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_caddr_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_caddr_t.h" 3 4 +typedef char * caddr_t; +# 103 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 + +typedef int32_t daddr_t; + + + +typedef u_int32_t fixpt_t; + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_blkcnt_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_blkcnt_t.h" 3 4 +typedef __darwin_blkcnt_t blkcnt_t; +# 111 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_blksize_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_blksize_t.h" 3 4 +typedef __darwin_blksize_t blksize_t; +# 112 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_gid_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_gid_t.h" 3 4 +typedef __darwin_gid_t gid_t; +# 113 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_in_addr_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_in_addr_t.h" 3 4 +typedef __uint32_t in_addr_t; +# 114 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_in_port_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_in_port_t.h" 3 4 +typedef __uint16_t in_port_t; +# 115 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_ino_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_ino_t.h" 3 4 +typedef __darwin_ino_t ino_t; +# 116 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_ino64_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_ino64_t.h" 3 4 +typedef __darwin_ino64_t ino64_t; +# 119 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_key_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_key_t.h" 3 4 +typedef __int32_t key_t; +# 122 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_nlink_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_nlink_t.h" 3 4 +typedef __uint16_t nlink_t; +# 124 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 + + + + +typedef int32_t segsz_t; +typedef int32_t swblk_t; +# 169 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 170 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_useconds_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_useconds_t.h" 3 4 +typedef __darwin_useconds_t useconds_t; +# 174 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_suseconds_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_suseconds_t.h" 3 4 +typedef __darwin_suseconds_t suseconds_t; +# 175 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_rsize_t.h" 1 3 4 +# 178 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 187 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fd_def.h" 1 3 4 +# 32 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fd_def.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 33 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fd_def.h" 2 3 4 +# 50 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fd_def.h" 3 4 +typedef struct fd_set { + __int32_t fds_bits[((((1024) % ((sizeof(__int32_t) * 8))) == 0) ? ((1024) / ((sizeof(__int32_t) * 8))) : (((1024) / ((sizeof(__int32_t) * 8))) + 1))]; +} fd_set; + +int __darwin_check_fd_set_overflow(int, const void *, int) __attribute__((availability(macos,introduced=11.0))) __attribute__((availability(ios,introduced=14.0))) __attribute__((availability(tvos,introduced=14.0))) __attribute__((availability(watchos,introduced=7.0))); + + +inline __attribute__ ((__always_inline__)) int +__darwin_check_fd_set(int _a, const void *_b) +{ + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability-new" + + if ((uintptr_t)&__darwin_check_fd_set_overflow != (uintptr_t) 0) { + + + + return __darwin_check_fd_set_overflow(_a, _b, 0); + + } else { + return 1; + } + +#pragma clang diagnostic pop + +} + + +inline __attribute__ ((__always_inline__)) int +__darwin_fd_isset(int _fd, const struct fd_set *_p) +{ + if (__darwin_check_fd_set(_fd, (const void *) _p)) { + return _p->fds_bits[(unsigned long)_fd / (sizeof(__int32_t) * 8)] & ((__int32_t)(((unsigned long)1) << ((unsigned long)_fd % (sizeof(__int32_t) * 8)))); + } + + return 0; +} + +inline __attribute__ ((__always_inline__)) void +__darwin_fd_set(int _fd, struct fd_set *const _p) +{ + if (__darwin_check_fd_set(_fd, (const void *) _p)) { + (_p->fds_bits[(unsigned long)_fd / (sizeof(__int32_t) * 8)] |= ((__int32_t)(((unsigned long)1) << ((unsigned long)_fd % (sizeof(__int32_t) * 8))))); + } +} + +inline __attribute__ ((__always_inline__)) void +__darwin_fd_clr(int _fd, struct fd_set *const _p) +{ + if (__darwin_check_fd_set(_fd, (const void *) _p)) { + (_p->fds_bits[(unsigned long)_fd / (sizeof(__int32_t) * 8)] &= ~((__int32_t)(((unsigned long)1) << ((unsigned long)_fd % (sizeof(__int32_t) * 8))))); + } +} +# 188 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 + + + + +typedef __int32_t fd_mask; + + + + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fd_setsize.h" 1 3 4 +# 201 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fd_set.h" 1 3 4 +# 202 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fd_clr.h" 1 3 4 +# 203 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fd_zero.h" 1 3 4 +# 204 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fd_isset.h" 1 3 4 +# 205 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fd_copy.h" 1 3 4 +# 208 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 219 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_cond_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_cond_t.h" 3 4 +typedef __darwin_pthread_cond_t pthread_cond_t; +# 220 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_condattr_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_condattr_t.h" 3 4 +typedef __darwin_pthread_condattr_t pthread_condattr_t; +# 221 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_mutex_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_mutex_t.h" 3 4 +typedef __darwin_pthread_mutex_t pthread_mutex_t; +# 222 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_mutexattr_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_mutexattr_t.h" 3 4 +typedef __darwin_pthread_mutexattr_t pthread_mutexattr_t; +# 223 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_once_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_once_t.h" 3 4 +typedef __darwin_pthread_once_t pthread_once_t; +# 224 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_rwlock_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_rwlock_t.h" 3 4 +typedef __darwin_pthread_rwlock_t pthread_rwlock_t; +# 225 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_rwlockattr_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_rwlockattr_t.h" 3 4 +typedef __darwin_pthread_rwlockattr_t pthread_rwlockattr_t; +# 226 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_t.h" 3 4 +typedef __darwin_pthread_t pthread_t; +# 227 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_key_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_pthread/_pthread_key_t.h" 3 4 +typedef __darwin_pthread_key_t pthread_key_t; +# 231 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fsblkcnt_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fsblkcnt_t.h" 3 4 +typedef __darwin_fsblkcnt_t fsblkcnt_t; +# 236 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fsfilcnt_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_fsfilcnt_t.h" 3 4 +typedef __darwin_fsfilcnt_t fsfilcnt_t; +# 237 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/types.h" 2 3 4 +# 18 "/usr/local/include/gmssl/sha2.h" 2 +# 31 "/usr/local/include/gmssl/sha2.h" +typedef struct { + uint32_t state[8]; + uint64_t nblocks; + uint8_t block[64]; + size_t num; +} SHA224_CTX; + +void sha224_init(SHA224_CTX *ctx); +void sha224_update(SHA224_CTX *ctx, const uint8_t* data, size_t datalen); +void sha224_finish(SHA224_CTX *ctx, uint8_t dgst[28]); + + + + + + +typedef struct { + uint32_t state[8]; + uint64_t nblocks; + uint8_t block[64]; + size_t num; +} SHA256_CTX; + +void sha256_init(SHA256_CTX *ctx); +void sha256_update(SHA256_CTX *ctx, const uint8_t* data, size_t datalen); +void sha256_finish(SHA256_CTX *ctx, uint8_t dgst[32]); + + + + + + +typedef struct { + uint64_t state[8]; + uint64_t nblocks; + uint8_t block[128]; + size_t num; +} SHA384_CTX; + +void sha384_init(SHA384_CTX *ctx); +void sha384_update(SHA384_CTX *ctx, const uint8_t* data, size_t datalen); +void sha384_finish(SHA384_CTX *ctx, uint8_t dgst[48]); + + + + + + +typedef struct { + uint64_t state[8]; + uint64_t nblocks; + uint8_t block[128]; + size_t num; +} SHA512_CTX; + +void sha512_init(SHA512_CTX *ctx); +void sha512_update(SHA512_CTX *ctx, const uint8_t* data, size_t datalen); +void sha512_finish(SHA512_CTX *ctx, uint8_t dgst[64]); + + + + +typedef struct { + SHA256_CTX sha256_ctx; + uint8_t key[64]; +} SHA256_HMAC_CTX; + +void sha256_hmac_init(SHA256_HMAC_CTX *ctx, const uint8_t *key, size_t keylen); +void sha256_hmac_update(SHA256_HMAC_CTX *ctx, const uint8_t *data, size_t datalen); +void sha256_hmac_finish(SHA256_HMAC_CTX *ctx, uint8_t mac[(32)]); +# 19 "/usr/local/include/gmssl/ecdsa.h" 2 +# 1 "/usr/local/include/gmssl/secp256r1_key.h" 1 +# 14 "/usr/local/include/gmssl/secp256r1_key.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4 +# 15 "/usr/local/include/gmssl/secp256r1_key.h" 2 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 17 "/usr/local/include/gmssl/secp256r1_key.h" 2 +# 1 "/usr/local/include/gmssl/secp256r1.h" 1 +# 16 "/usr/local/include/gmssl/secp256r1.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4 +# 17 "/usr/local/include/gmssl/secp256r1.h" 2 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 19 "/usr/local/include/gmssl/secp256r1.h" 2 +# 36 "/usr/local/include/gmssl/secp256r1.h" +typedef uint32_t secp256r1_t[8]; + + + +extern const secp256r1_t SECP256R1_P; +extern const secp256r1_t SECP256R1_B; +extern const secp256r1_t SECP256R1_N; +extern const uint32_t SECP256R1_U_P[9]; +extern const uint32_t SECP256R1_U_N[9]; + +int secp256r1_is_zero(const secp256r1_t a); +int secp256r1_is_one(const secp256r1_t a); +int secp256r1_cmp(const secp256r1_t a, const secp256r1_t b); +void secp256r1_set_zero(secp256r1_t r); +void secp256r1_set_one(secp256r1_t r); +void secp256r1_copy(secp256r1_t r, const secp256r1_t a); +void secp256r1_to_32bytes(const secp256r1_t a, uint8_t out[32]); +void secp256r1_from_32bytes(secp256r1_t r, const uint8_t in[32]); +int secp256r1_print(FILE *fp, int fmt, int ind, const char *label, const secp256r1_t a); + +void secp256r1_modp_add(secp256r1_t r, const secp256r1_t a, const secp256r1_t b); +void secp256r1_modp_dbl(secp256r1_t r, const secp256r1_t a); +void secp256r1_modp_tri(secp256r1_t r, const secp256r1_t a); +void secp256r1_modp_sub(secp256r1_t r, const secp256r1_t a, const secp256r1_t b); +void secp256r1_modp_neg(secp256r1_t r, const secp256r1_t a); +void secp256r1_modp_haf(secp256r1_t r, const secp256r1_t a); +void secp256r1_modp_mul(secp256r1_t r, const secp256r1_t a, const secp256r1_t b); +void secp256r1_modp_sqr(secp256r1_t r, const secp256r1_t a); +void secp256r1_modp_exp(secp256r1_t r, const secp256r1_t a, const secp256r1_t e); +void secp256r1_modp_inv(secp256r1_t r, const secp256r1_t a); + +void secp256r1_modn(secp256r1_t r, const secp256r1_t a); +void secp256r1_modn_add(secp256r1_t r, const secp256r1_t a, const secp256r1_t b); +void secp256r1_modn_dbl(secp256r1_t r, const secp256r1_t a); +void secp256r1_modn_tri(secp256r1_t r, const secp256r1_t a); +void secp256r1_modn_sub(secp256r1_t r, const secp256r1_t a, const secp256r1_t b); +void secp256r1_modn_neg(secp256r1_t r, const secp256r1_t a); +void secp256r1_modn_mul(secp256r1_t r, const secp256r1_t a, const secp256r1_t b); +void secp256r1_modn_sqr(secp256r1_t r, const secp256r1_t a); +void secp256r1_modn_exp(secp256r1_t r, const secp256r1_t a, const secp256r1_t e); +void secp256r1_modn_inv(secp256r1_t r, const secp256r1_t a); + + +typedef struct { + secp256r1_t X; + secp256r1_t Y; + secp256r1_t Z; +} SECP256R1_POINT; + +extern const SECP256R1_POINT SECP256R1_POINT_G; + +void secp256r1_point_set_infinity(SECP256R1_POINT *R); +int secp256r1_point_is_at_infinity(const SECP256R1_POINT *P); +int secp256r1_point_is_on_curve(const SECP256R1_POINT *P); +int secp256r1_point_equ(const SECP256R1_POINT *P, const SECP256R1_POINT *Q); +int secp256r1_point_set_xy(SECP256R1_POINT *R, const secp256r1_t x, const secp256r1_t y); +int secp256r1_point_get_xy(const SECP256R1_POINT *P, secp256r1_t x, secp256r1_t y); +void secp256r1_point_copy(SECP256R1_POINT *R, const SECP256R1_POINT *P); +void secp256r1_point_dbl(SECP256R1_POINT *R, const SECP256R1_POINT *P); +void secp256r1_point_add(SECP256R1_POINT *R, const SECP256R1_POINT *P, const SECP256R1_POINT *Q); +void secp256r1_point_neg(SECP256R1_POINT *R, const SECP256R1_POINT *P); +void secp256r1_point_sub(SECP256R1_POINT *R, const SECP256R1_POINT *P, const SECP256R1_POINT *Q); +void secp256r1_point_mul(SECP256R1_POINT *R, const secp256r1_t k, const SECP256R1_POINT *P); +void secp256r1_point_mul_generator(SECP256R1_POINT *R, const secp256r1_t k); +int secp256r1_point_print(FILE *fp, int fmt, int ind, const char *label, const SECP256R1_POINT *P); +int secp256r1_point_to_uncompressed_octets(const SECP256R1_POINT *P, uint8_t octets[65]); +int secp256r1_point_from_uncompressed_octets(SECP256R1_POINT *P, const uint8_t octets[65]); +# 18 "/usr/local/include/gmssl/secp256r1_key.h" 2 + + + + + + +typedef struct { + SECP256R1_POINT public_key; + secp256r1_t private_key; +} SECP256R1_KEY; + +int secp256r1_key_generate(SECP256R1_KEY *key); +int secp256r1_key_set_private_key(SECP256R1_KEY *key, const secp256r1_t private_key); +int secp256r1_public_key_equ(const SECP256R1_KEY *key, const SECP256R1_KEY *pub); +void secp256r1_key_cleanup(SECP256R1_KEY *key); + +int secp256r1_public_key_print(FILE *fp, int fmt, int ind, const char *label, const SECP256R1_KEY *key); +int secp256r1_private_key_print(FILE *fp, int fmt, int ind, const char *label, const SECP256R1_KEY *key); + +int secp256r1_public_key_to_bytes(const SECP256R1_KEY *key, uint8_t **out, size_t *outlen); +int secp256r1_public_key_from_bytes(SECP256R1_KEY *key, const uint8_t **in, size_t *inlen); +int secp256r1_public_key_to_der(const SECP256R1_KEY *key, uint8_t **out, size_t *outlen); +int secp256r1_public_key_from_der(SECP256R1_KEY *key, const uint8_t **in, size_t *inlen); +int secp256r1_private_key_to_der(const SECP256R1_KEY *key, uint8_t **out, size_t *outlen); +int secp256r1_private_key_from_der(SECP256R1_KEY *key, const uint8_t **in, size_t *inlen); +int secp256r1_private_key_info_to_der(const SECP256R1_KEY *key, uint8_t **out, size_t *outlen); +int secp256r1_private_key_info_from_der(SECP256R1_KEY *key, const uint8_t **attrs, size_t *attrslen, + const uint8_t **in, size_t *inlen); +int secp256r1_private_key_info_encrypt_to_der(const SECP256R1_KEY *ec_key, const char *pass, + uint8_t **out, size_t *outlen); +int secp256r1_private_key_info_decrypt_from_der(SECP256R1_KEY *ec_key, + const uint8_t **attrs, size_t *attrs_len, + const char *pass, const uint8_t **in, size_t *inlen); + +int secp256r1_private_key_info_encrypt_to_pem(const SECP256R1_KEY *key, const char *pass, FILE *fp); +int secp256r1_private_key_info_decrypt_from_pem(SECP256R1_KEY *key, const char *pass, FILE *fp); + +int secp256r1_do_ecdh(const SECP256R1_KEY *key, const SECP256R1_KEY *pub, uint8_t out[32]); +int secp256r1_ecdh(const SECP256R1_KEY *key, const uint8_t uncompressed_point[65], uint8_t out[32]); +# 20 "/usr/local/include/gmssl/ecdsa.h" 2 + + + + + + + +typedef struct { + secp256r1_t r; + secp256r1_t s; +} ECDSA_SIGNATURE; + + + + + +int ecdsa_signature_to_der(const ECDSA_SIGNATURE *sig, uint8_t **out, size_t *outlen); +int ecdsa_signature_from_der(ECDSA_SIGNATURE *sig, const uint8_t **in, size_t *inlen); +int ecdsa_signature_print_ex(FILE *fp, int fmt, int ind, const char *label, const ECDSA_SIGNATURE *sig); +int ecdsa_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen); + +int ecdsa_do_sign_ex(const SECP256R1_KEY *key, const secp256r1_t k, const uint8_t dgst[32], ECDSA_SIGNATURE *sig); +int ecdsa_do_sign(const SECP256R1_KEY *key, const uint8_t dgst[32], ECDSA_SIGNATURE *sig); +int ecdsa_do_verify(const SECP256R1_KEY *key, const uint8_t dgst[32], const ECDSA_SIGNATURE *sig); +int ecdsa_sign(const SECP256R1_KEY *key, const uint8_t dgst[32], uint8_t *sig, size_t *siglen); +int ecdsa_sign_fixlen(const SECP256R1_KEY *key, const uint8_t dgst[32], size_t siglen, uint8_t *sig); +int ecdsa_verify(const SECP256R1_KEY *key, const uint8_t dgst[32], const uint8_t *sig, size_t siglen); + + +typedef struct { + SHA256_CTX sha256_ctx; + SECP256R1_KEY key; + ECDSA_SIGNATURE sig; +} ECDSA_SIGN_CTX; + +int ecdsa_sign_init(ECDSA_SIGN_CTX *ctx, const SECP256R1_KEY *key); +int ecdsa_sign_update(ECDSA_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int ecdsa_sign_finish(ECDSA_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen); +int ecdsa_sign_finish_fixlen(ECDSA_SIGN_CTX *ctx, size_t siglen, uint8_t *sig); +int ecdsa_verify_init(ECDSA_SIGN_CTX *ctx, const SECP256R1_KEY *key, const uint8_t *sig, size_t siglen); +int ecdsa_verify_update(ECDSA_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int ecdsa_verify_finish(ECDSA_SIGN_CTX *ctx); +# 23 "/usr/local/include/gmssl/x509_key.h" 2 +# 1 "/usr/local/include/gmssl/lms.h" 1 +# 14 "/usr/local/include/gmssl/lms.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4 +# 15 "/usr/local/include/gmssl/lms.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 16 "/usr/local/include/gmssl/lms.h" 2 +# 32 "/usr/local/include/gmssl/lms.h" +typedef uint8_t lms_hash256_t[32]; +# 58 "/usr/local/include/gmssl/lms.h" +enum { + + + + LMOTS_SM3_N32_W8 = 14, +}; +# 74 "/usr/local/include/gmssl/lms.h" +typedef lms_hash256_t lmots_key_t[34]; +typedef lms_hash256_t lmots_sig_t[34]; + +char *lmots_type_name(int lmots_type); +void lmots_derive_secrets(const lms_hash256_t seed, const uint8_t I[16], int q, lms_hash256_t x[34]); +void lmots_secrets_to_public_hash(const uint8_t I[16], int q, const lms_hash256_t x[34], lms_hash256_t pub); +void lmots_compute_signature(const uint8_t I[16], int q, const lms_hash256_t dgst, const lms_hash256_t x[34], lms_hash256_t y[34]); +void lmots_signature_to_public_hash(const uint8_t I[16], int q, const lms_hash256_t y[34], const lms_hash256_t dgst, lms_hash256_t pub); +# 94 "/usr/local/include/gmssl/lms.h" +enum { + LMS_SM3_M32_H5 = 5, + LMS_SM3_M32_H10 = 6, + LMS_SM3_M32_H15 = 7, + LMS_SM3_M32_H20 = 8, + LMS_SM3_M32_H25 = 9, +}; +# 127 "/usr/local/include/gmssl/lms.h" +char *lms_type_name(int lms_type); +int lms_type_from_name(const char *name); +int lms_type_to_height(int type, size_t *height); +void lms_derive_merkle_tree(const lms_hash256_t seed, const uint8_t I[16], int height, lms_hash256_t *tree); +void lms_derive_merkle_root(const lms_hash256_t seed, const uint8_t I[16], int height, lms_hash256_t root); + +typedef struct { + int lms_type; + int lmots_type; + uint8_t I[16]; + lms_hash256_t root; +} LMS_PUBLIC_KEY; + + + +typedef struct LMS_KEY_st LMS_KEY; + +typedef int (*lms_key_update_callback)(LMS_KEY *key); + +typedef struct LMS_KEY_st { + LMS_PUBLIC_KEY public_key; + lms_hash256_t seed; + uint32_t q; + + lms_hash256_t *tree; + lms_key_update_callback update_callback; + void *update_param; +} LMS_KEY; + + + +int lms_key_generate_ex(LMS_KEY *key, int lms_type, const lms_hash256_t seed, const uint8_t I[16], int cache_tree); +int lms_key_generate(LMS_KEY *key, int lms_type); +int lms_key_set_update_callback(LMS_KEY *key, lms_key_update_callback update_cb, void *param); +int lms_key_update(LMS_KEY *key); +int lms_key_remaining_signs(const LMS_KEY *key, size_t *count); +int lms_key_get_signature_size(const LMS_KEY *key, size_t *siglen); +void lms_key_cleanup(LMS_KEY *key); + +int lms_public_key_to_bytes_ex(const LMS_PUBLIC_KEY *public_key, uint8_t **out, size_t *outlen); +int lms_public_key_from_bytes_ex(LMS_PUBLIC_KEY *public_key, const uint8_t **in, size_t *inlen); +int lms_public_key_to_bytes(const LMS_KEY *key, uint8_t **out, size_t *outlen); +int lms_public_key_from_bytes(LMS_KEY *key, const uint8_t **in, size_t *inlen); +int lms_public_key_print(FILE *fp, int fmt, int ind, const char *label, const LMS_KEY *pub); +int lms_private_key_to_bytes(const LMS_KEY *key, uint8_t **out, size_t *outlen); +int lms_private_key_from_bytes(LMS_KEY *key, const uint8_t **in, size_t *inlen); +int lms_private_key_print(FILE *fp, int fmt, int ind, const char *label, const LMS_KEY *key); + + +typedef struct { + uint32_t q; + struct { + int lmots_type; + lms_hash256_t C; + lms_hash256_t y[34]; + } lmots_sig; + int lms_type; + lms_hash256_t path[25]; +} LMS_SIGNATURE; + +int lms_signature_to_merkle_root(const uint8_t I[16], size_t h, int q, + const lms_hash256_t y[34], const lms_hash256_t *path, + const lms_hash256_t dgst, lms_hash256_t root); +# 199 "/usr/local/include/gmssl/lms.h" +int lms_signature_size(int lms_type, size_t *siglen); +int lms_signature_to_bytes(const LMS_SIGNATURE *sig, uint8_t **out, size_t *outlen); +int lms_signature_from_bytes(LMS_SIGNATURE *sig, const uint8_t **in, size_t *inlen); +int lms_signature_print_ex(FILE *fp, int fmt, int ind, const char *label, const LMS_SIGNATURE *sig); +int lms_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen); + +typedef struct { + SM3_CTX lms_hash256_ctx; + LMS_PUBLIC_KEY lms_public_key; + LMS_SIGNATURE lms_sig; +} LMS_SIGN_CTX; + +int lms_sign_init(LMS_SIGN_CTX *ctx, LMS_KEY *key); +int lms_sign_update(LMS_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int lms_sign_finish_ex(LMS_SIGN_CTX *ctx, LMS_SIGNATURE *sig); +int lms_sign_finish(LMS_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen); +int lms_verify_init_ex(LMS_SIGN_CTX *ctx, const LMS_KEY *key, const LMS_SIGNATURE *sig); +int lms_verify_init(LMS_SIGN_CTX *ctx, const LMS_KEY *key, const uint8_t *sig, size_t siglen); +int lms_verify_update(LMS_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int lms_verify_finish(LMS_SIGN_CTX *ctx); +void lms_sign_ctx_cleanup(LMS_SIGN_CTX *ctx); + + + + +typedef struct { + uint32_t levels; + LMS_PUBLIC_KEY lms_public_key; +} HSS_PUBLIC_KEY; + + + +typedef struct HSS_KEY_st HSS_KEY; + +typedef int (*hss_key_update_callback)(HSS_KEY *key); + +typedef struct HSS_KEY_st { + uint32_t levels; + LMS_KEY lms_key[5]; + LMS_SIGNATURE lms_sig[4]; + hss_key_update_callback update_callback; + void *update_param; +} HSS_KEY; + + +int hss_private_key_size(const int *lms_types, size_t levels, size_t *len); + +int hss_key_generate(HSS_KEY *key, const int *lms_types, size_t levels); +int hss_key_set_update_callback(HSS_KEY *key, hss_key_update_callback update_cb, void *param); +int hss_key_update(HSS_KEY *key); +int hss_key_get_signature_size(const HSS_KEY *key, size_t *siglen); +void hss_key_cleanup(HSS_KEY *key); + +int hss_public_key_equ(const HSS_KEY *key, const HSS_KEY *pub); +int hss_public_key_to_bytes(const HSS_KEY *key, uint8_t **out, size_t *outlen); +int hss_private_key_to_bytes(const HSS_KEY *key, uint8_t **out, size_t *outlen); +int hss_public_key_from_bytes(HSS_KEY *key, const uint8_t **in, size_t *inlen); +int hss_private_key_from_bytes(HSS_KEY *key, const uint8_t **in, size_t *inlen); +int hss_public_key_print(FILE *fp, int fmt, int ind, const char *label, const HSS_KEY *key); +int hss_private_key_print(FILE *fp, int fmt, int ind, const char *label, const HSS_KEY *key); + +typedef struct { + uint32_t num_signed_public_keys; + struct { + LMS_SIGNATURE lms_sig; + LMS_PUBLIC_KEY lms_public_key; + } signed_public_keys[5 - 1]; + LMS_SIGNATURE msg_lms_sig; +} HSS_SIGNATURE; + + +int hss_signature_size(const int *lms_types, size_t levels, size_t *len); +int hss_signature_to_bytes(const HSS_SIGNATURE *sig, uint8_t **out, size_t *outlen); +int hss_signature_from_bytes(HSS_SIGNATURE *sig, const uint8_t **in, size_t *inlen); +int hss_signature_print_ex(FILE *fp, int fmt, int ind, const char *label, const HSS_SIGNATURE *sig); +int hss_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen); + +typedef struct { + LMS_SIGN_CTX lms_sign_ctx; + uint32_t levels; + LMS_SIGNATURE lms_sigs[5 - 1]; + LMS_PUBLIC_KEY lms_public_keys[5 - 1]; +} HSS_SIGN_CTX; + +int hss_sign_init(HSS_SIGN_CTX *ctx, HSS_KEY *key); +int hss_sign_update(HSS_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int hss_sign_finish_ex(HSS_SIGN_CTX *ctx, HSS_SIGNATURE *sig); +int hss_sign_finish(HSS_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen); +int hss_verify_init_ex(HSS_SIGN_CTX *ctx, const HSS_KEY *key, const HSS_SIGNATURE *sig); +int hss_verify_init(HSS_SIGN_CTX *ctx, const HSS_KEY *key, const uint8_t *sigbuf, size_t siglen); +int hss_verify_update(HSS_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int hss_verify_finish(HSS_SIGN_CTX *ctx); +void hss_sign_ctx_cleanup(HSS_SIGN_CTX *ctx); +# 24 "/usr/local/include/gmssl/x509_key.h" 2 +# 1 "/usr/local/include/gmssl/xmss.h" 1 +# 14 "/usr/local/include/gmssl/xmss.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4 +# 15 "/usr/local/include/gmssl/xmss.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 16 "/usr/local/include/gmssl/xmss.h" 2 +# 27 "/usr/local/include/gmssl/xmss.h" +typedef uint8_t xmss_hash256_t[32]; +# 48 "/usr/local/include/gmssl/xmss.h" +enum { + XMSS_ADRS_TYPE_OTS = 0, + XMSS_ADRS_TYPE_LTREE = 1, + XMSS_ADRS_TYPE_HASHTREE = 2, +}; + +enum { + XMSS_ADRS_GENERATE_KEY = 0, + XMSS_ADRS_GENERATE_BITMASK = 1, +}; + +typedef struct { + uint32_t layer_address; + uint64_t tree_address; + uint32_t type; + uint32_t ots_address; + uint32_t chain_address; + uint32_t hash_address; + uint32_t key_and_mask; +} XMSS_ADRS_OTS; + +typedef struct { + uint32_t layer_address; + uint64_t tree_address; + uint32_t type; + uint32_t ltree_address; + uint32_t tree_height; + uint32_t tree_index; + uint32_t key_and_mask; +} XMSS_ADRS_LTREE; + +typedef struct { + uint32_t layer_address; + uint64_t tree_address; + uint32_t type; + uint32_t padding; + uint32_t tree_height; + uint32_t tree_index; + uint32_t key_and_mask; +} XMSS_ADRS_HASHTREE; + +typedef uint8_t xmss_adrs_t[32]; + +void xmss_adrs_copy_layer_address(xmss_adrs_t dst, const xmss_adrs_t src); +void xmss_adrs_copy_tree_address(xmss_adrs_t dst, const xmss_adrs_t src); +void xmss_adrs_copy_type(xmss_adrs_t dst, const xmss_adrs_t src); +void xmss_adrs_copy_ots_address(xmss_adrs_t dst, const xmss_adrs_t src); +void xmss_adrs_copy_ltree_address(xmss_adrs_t dst, const xmss_adrs_t src); +void xmss_adrs_copy_padding(xmss_adrs_t dst, const xmss_adrs_t src); +void xmss_adrs_copy_chain_address(xmss_adrs_t dst, const xmss_adrs_t src); +void xmss_adrs_copy_tree_height(xmss_adrs_t dst, const xmss_adrs_t src); +void xmss_adrs_copy_hash_address(xmss_adrs_t dst, const xmss_adrs_t src); +void xmss_adrs_copy_tree_index(xmss_adrs_t dst, const xmss_adrs_t src); +void xmss_adrs_copy_key_and_mask(xmss_adrs_t dst, const xmss_adrs_t src); + +void xmss_adrs_set_layer_address(xmss_adrs_t adrs, uint32_t layer); +void xmss_adrs_set_tree_address(xmss_adrs_t adrs, uint64_t tree_addr); +void xmss_adrs_set_type(xmss_adrs_t adrs, uint32_t type); +void xmss_adrs_set_ots_address(xmss_adrs_t adrs, uint32_t address); +void xmss_adrs_set_ltree_address(xmss_adrs_t adrs, uint32_t address); +void xmss_adrs_set_padding(xmss_adrs_t adrs, uint32_t padding); +void xmss_adrs_set_chain_address(xmss_adrs_t adrs, uint32_t address); +void xmss_adrs_set_tree_height(xmss_adrs_t adrs, uint32_t height); +void xmss_adrs_set_hash_address(xmss_adrs_t adrs, uint32_t address); +void xmss_adrs_set_tree_index(xmss_adrs_t adrs, uint32_t index); +void xmss_adrs_set_key_and_mask(xmss_adrs_t adrs, uint32_t key_and_mask); + +int xmss_adrs_print(FILE *fp, int fmt, int ind, const char *label, const xmss_hash256_t adrs); + + + + + + +typedef xmss_hash256_t xmss_wots_key_t[67]; +typedef xmss_hash256_t xmss_wots_sig_t[67]; + + +void xmss_wots_derive_sk(const xmss_hash256_t secret, + const xmss_hash256_t seed, const xmss_adrs_t adrs, + xmss_wots_key_t sk); +void xmss_wots_chain(const xmss_hash256_t x, + const xmss_hash256_t seed, const xmss_adrs_t adrs, + int start, int steps, xmss_hash256_t y); +void xmss_wots_sk_to_pk(const xmss_wots_key_t sk, + const xmss_hash256_t seed, const xmss_adrs_t adrs, + xmss_wots_key_t pk); +void xmss_wots_sign(const xmss_wots_key_t sk, + const xmss_hash256_t seed, const xmss_adrs_t adrs, + const xmss_hash256_t dgst, xmss_wots_sig_t sig); +void xmss_wots_sig_to_pk(const xmss_wots_sig_t sig, + const xmss_hash256_t seed, const xmss_adrs_t adrs, + const xmss_hash256_t dgst, xmss_wots_key_t pk); +void xmss_wots_pk_to_root(const xmss_wots_key_t pk, + const xmss_hash256_t seed, const xmss_adrs_t adrs, + xmss_hash256_t wots_root); +void xmss_wots_derive_root(const xmss_hash256_t secret, + const xmss_hash256_t seed, const xmss_adrs_t adrs, + xmss_hash256_t wots_root); +int xmss_wots_verify(const xmss_hash256_t wots_root, + const xmss_hash256_t seed, const xmss_adrs_t adrs, + const xmss_hash256_t dgst, const xmss_wots_sig_t sig); + + + + +enum { + XMSS_SHA2_10_256 = 0x00000001, + XMSS_SHA2_16_256 = 0x00000002, + XMSS_SHA2_20_256 = 0x00000003, +}; + +enum { + XMSS_SM3_10_256 = 0x10000001, + XMSS_SM3_16_256 = 0x10000002, + XMSS_SM3_20_256 = 0x10000003, +}; +# 185 "/usr/local/include/gmssl/xmss.h" +char *xmss_type_name(uint32_t xmss_type); +uint32_t xmss_type_from_name(const char *name); + +int xmss_type_to_height(uint32_t xmss_type, size_t *height); + +size_t xmss_num_tree_nodes(size_t height); +void xmss_build_tree(const xmss_hash256_t secret, + const xmss_hash256_t seed, const xmss_adrs_t adrs, + size_t height, xmss_hash256_t *tree); +void xmss_build_auth_path(const xmss_hash256_t *tree, size_t height, + uint32_t index, xmss_hash256_t *auth_path); +void xmss_build_root(const xmss_hash256_t wots_root, uint32_t index, + const xmss_hash256_t seed, const xmss_adrs_t adrs, + const xmss_hash256_t *auth_path, size_t height, + xmss_hash256_t xmss_root); + + +typedef struct { + uint32_t xmss_type; + xmss_hash256_t seed; + xmss_hash256_t root; +} XMSS_PUBLIC_KEY; + + + +typedef struct XMSS_KEY_st XMSS_KEY; + +typedef int (*xmss_key_update_callback)(XMSS_KEY *key); + +typedef struct XMSS_KEY_st { + XMSS_PUBLIC_KEY public_key; + uint32_t index; + xmss_hash256_t secret; + xmss_hash256_t sk_prf; + xmss_hash256_t *tree; + xmss_key_update_callback update_callback; + void *update_param; +} XMSS_KEY; + + + + +int xmss_private_key_size(uint32_t xmss_type, size_t *keysize); + + + +int xmss_key_generate(XMSS_KEY *key, uint32_t xmss_type); +int xmss_key_remaining_signs(const XMSS_KEY *key, size_t *count); +int xmss_key_set_update_callback(XMSS_KEY *key, xmss_key_update_callback update_cb, void *param); +int xmss_key_update(XMSS_KEY *key); +void xmss_key_cleanup(XMSS_KEY *key); + +int xmss_public_key_to_bytes(const XMSS_KEY *key, uint8_t **out, size_t *outlen); +int xmss_public_key_from_bytes(XMSS_KEY *key, const uint8_t **in, size_t *inlen); +int xmss_public_key_print(FILE *fp, int fmt, int ind, const char *label, const XMSS_KEY *key); +int xmss_private_key_to_bytes(const XMSS_KEY *key, uint8_t **out, size_t *outlen); +int xmss_private_key_from_bytes(XMSS_KEY *key, const uint8_t **in, size_t *inlen); +int xmss_private_key_from_file(XMSS_KEY *key, FILE *fp); +int xmss_private_key_print(FILE *fp, int fmt, int ind, const char *label, const XMSS_KEY *key); + + +typedef struct { + uint32_t index; + xmss_hash256_t random; + xmss_wots_sig_t wots_sig; + xmss_hash256_t auth_path[20]; +} XMSS_SIGNATURE; + + + + + + +int xmss_signature_size(uint32_t xmss_type, size_t *siglen); +int xmss_key_get_signature_size(const XMSS_KEY *key, size_t *siglen); +int xmss_signature_to_bytes(const XMSS_SIGNATURE *sig, uint32_t xmss_type, uint8_t **out, size_t *outlen); +int xmss_signature_from_bytes(XMSS_SIGNATURE *sig, uint32_t xmss_type, const uint8_t **in, size_t *inlen); +int xmss_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *in, size_t inlen); +int xmss_signature_print_ex(FILE *fp, int fmt, int ind, const char *label, const XMSS_SIGNATURE *sig); + +typedef struct { + XMSS_PUBLIC_KEY xmss_public_key; + XMSS_SIGNATURE xmss_sig; + SM3_CTX hash256_ctx; +} XMSS_SIGN_CTX; + +int xmss_sign_init(XMSS_SIGN_CTX *ctx, XMSS_KEY *key); +int xmss_sign_update(XMSS_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int xmss_sign_finish(XMSS_SIGN_CTX *ctx, uint8_t *sigbuf, size_t *siglen); +int xmss_verify_init(XMSS_SIGN_CTX *ctx, const XMSS_KEY *key, const uint8_t *sigbuf, size_t siglen); +int xmss_verify_update(XMSS_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int xmss_verify_finish(XMSS_SIGN_CTX *ctx); +void xmss_sign_ctx_cleanup(XMSS_SIGN_CTX *ctx); + + +enum { + XMSSMT_SM3_20_2_256 = 0x00000001, + XMSSMT_SM3_20_4_256 = 0x00000002, + XMSSMT_SM3_40_2_256 = 0x00000003, + XMSSMT_SM3_40_4_256 = 0x00000004, + XMSSMT_SM3_40_8_256 = 0x00000005, + XMSSMT_SM3_60_3_256 = 0x00000006, + XMSSMT_SM3_60_6_256 = 0x00000007, + XMSSMT_SM3_60_12_256 = 0x00000008, +}; + + +enum { + XMSSMT_RESERVED = 0x00000000, + XMSSMT_SHA2_20_2_256 = 0x00000001, + XMSSMT_SHA2_20_4_256 = 0x00000002, + XMSSMT_SHA2_40_2_256 = 0x00000003, + XMSSMT_SHA2_40_4_256 = 0x00000004, + XMSSMT_SHA2_40_8_256 = 0x00000005, + XMSSMT_SHA2_60_3_256 = 0x00000006, + XMSSMT_SHA2_60_6_256 = 0x00000007, + XMSSMT_SHA2_60_12_256 = 0x00000008, +}; +# 341 "/usr/local/include/gmssl/xmss.h" +char *xmssmt_type_name(uint32_t xmssmt_type); +uint32_t xmssmt_type_from_name(const char *name); + + + +int xmssmt_type_to_height_and_layers(uint32_t xmssmt_type, size_t *height, size_t *layers); + +size_t xmssmt_num_trees_nodes(size_t height, size_t layers); + +typedef struct { + uint32_t xmssmt_type; + xmss_hash256_t seed; + xmss_hash256_t root; +} XMSSMT_PUBLIC_KEY; + + + +typedef struct XMSSMT_KEY_st XMSSMT_KEY; + +typedef int (*xmssmt_key_update_callback)(XMSSMT_KEY *key); + +typedef struct XMSSMT_KEY_st { + XMSSMT_PUBLIC_KEY public_key; + uint64_t index; + xmss_hash256_t secret; + xmss_hash256_t sk_prf; + xmss_hash256_t *trees; + xmss_wots_sig_t wots_sigs[12 - 1]; + xmssmt_key_update_callback update_callback; + void *update_param; +} XMSSMT_KEY; +# 383 "/usr/local/include/gmssl/xmss.h" +int xmssmt_private_key_size(uint32_t xmssmt_type, size_t *len); +int xmssmt_build_auth_path(const xmss_hash256_t *tree, size_t height, size_t layers, uint64_t index, xmss_hash256_t *auth_path); + +int xmssmt_key_generate(XMSSMT_KEY *key, uint32_t xmssmt_type); +int xmssmt_key_set_update_callback(XMSSMT_KEY *key, xmssmt_key_update_callback update_cb, void *param); +int xmssmt_key_update(XMSSMT_KEY *key); +int xmssmt_public_key_to_bytes(const XMSSMT_KEY *key, uint8_t **out, size_t *outlen); +int xmssmt_public_key_from_bytes(XMSSMT_KEY *key, const uint8_t **in, size_t *inlen); +int xmssmt_public_key_print(FILE *fp, int fmt, int ind, const char *label, const XMSSMT_KEY *key); +int xmssmt_private_key_to_bytes(const XMSSMT_KEY *key, uint8_t **out, size_t *outlen); +int xmssmt_private_key_from_bytes(XMSSMT_KEY *key, const uint8_t **in, size_t *inlen); +int xmssmt_private_key_from_file(XMSSMT_KEY *key, FILE *fp); +int xmssmt_private_key_print(FILE *fp, int fmt, int ind, const char *label, const XMSSMT_KEY *key); +void xmssmt_key_cleanup(XMSSMT_KEY *key); + + +typedef struct { + uint64_t index; + xmss_hash256_t random; + xmss_wots_sig_t wots_sigs[12]; + xmss_hash256_t auth_path[60]; +} XMSSMT_SIGNATURE; + +int xmssmt_index_to_bytes(uint64_t index, uint32_t xmssmt_type, uint8_t **out, size_t *outlen); +int xmssmt_index_from_bytes(uint64_t *index, uint32_t xmssmt_type, const uint8_t **in, size_t *inlen); + + + +int xmssmt_key_get_signature_size(const XMSSMT_KEY *key, size_t *siglen); +int xmssmt_signature_size(uint32_t xmssmt_type, size_t *siglen); +int xmssmt_signature_to_bytes(const XMSSMT_SIGNATURE *sig, uint32_t xmssmt_type, uint8_t **out, size_t *outlen); +int xmssmt_signature_from_bytes(XMSSMT_SIGNATURE *sig, uint32_t xmssmt_type, const uint8_t **in, size_t *inlen); +int xmssmt_signature_print_ex(FILE *fp, int fmt, int ind, const char *label, const XMSSMT_SIGNATURE *sig, uint32_t xmssmt_type); +int xmssmt_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen, uint32_t xmssmt_type); + + +typedef struct { + XMSSMT_PUBLIC_KEY xmssmt_public_key; + XMSSMT_SIGNATURE xmssmt_sig; + SM3_CTX hash256_ctx; +} XMSSMT_SIGN_CTX; + +int xmssmt_sign_init(XMSSMT_SIGN_CTX *ctx, XMSSMT_KEY *key); +int xmssmt_sign_update(XMSSMT_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int xmssmt_sign_finish(XMSSMT_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen); +int xmssmt_sign_finish_ex(XMSSMT_SIGN_CTX *ctx, XMSSMT_SIGNATURE *sig); +int xmssmt_verify_init_ex(XMSSMT_SIGN_CTX *ctx, const XMSSMT_KEY *key, const XMSSMT_SIGNATURE *sig); +int xmssmt_verify_init(XMSSMT_SIGN_CTX *ctx, const XMSSMT_KEY *key, const uint8_t *sig, size_t siglen); +int xmssmt_verify_update(XMSSMT_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int xmssmt_verify_finish(XMSSMT_SIGN_CTX *ctx); +void xmssmt_sign_ctx_cleanup(XMSSMT_SIGN_CTX *ctx); +# 25 "/usr/local/include/gmssl/x509_key.h" 2 +# 1 "/usr/local/include/gmssl/sphincs.h" 1 +# 14 "/usr/local/include/gmssl/sphincs.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4 +# 15 "/usr/local/include/gmssl/sphincs.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 16 "/usr/local/include/gmssl/sphincs.h" 2 +# 61 "/usr/local/include/gmssl/sphincs.h" +typedef uint8_t sphincs_hash128_t[16]; + +typedef uint8_t sphincs_hash256_t[32]; +# 90 "/usr/local/include/gmssl/sphincs.h" +enum { + SPHINCS_ADRS_TYPE_WOTS_HASH = 0, + SPHINCS_ADRS_TYPE_WOTS_PK = 1, + SPHINCS_ADRS_TYPE_TREE = 2, + SPHINCS_ADRS_TYPE_FORS_TREE = 3, + SPHINCS_ADRS_TYPE_FORS_ROOTS = 4, + SPHINCS_ADRS_TYPE_WOTS_PRF = 5, + SPHINCS_ADRS_TYPE_FORS_PRF = 6, +}; + +typedef struct { + uint32_t layer_address; + uint32_t tree_address[3]; + uint32_t type; + uint32_t keypair_address; + uint32_t chain_address; + uint32_t hash_address; +} SPHINCS_ADRS_WOTS_HASH; + +typedef struct { + uint32_t layer_address; + uint32_t tree_address[3]; + uint32_t type; + uint32_t keypair_address; + uint32_t padding2; + uint32_t padding3; +} SPHINCS_ADRS_WOTS_PK; + +typedef struct { + uint32_t layer_address; + uint32_t tree_address[3]; + uint32_t type; + uint32_t padding1; + uint32_t tree_height; + uint32_t tree_index; +} SPHINCS_ADRS_TREE; + +typedef struct { + uint32_t layer_address; + uint32_t tree_address[3]; + uint32_t type; + uint32_t keypair_address; + uint32_t tree_height; + uint32_t tree_index; +} SPHINCS_ADRS_FORS_TREE; + +typedef struct { + uint32_t layer_address; + uint32_t tree_address[3]; + uint32_t type; + uint32_t keypair_address; + uint32_t padding2; + uint32_t padding3; +} SPHINCS_ADRS_FORS_ROOTS; + +typedef struct { + uint32_t layer_address; + uint32_t tree_address[3]; + uint32_t type; + uint32_t keypair_address; + uint32_t chain_address; + uint32_t hash_address; +} SPHINCS_ADRS_WOTS_PRF; + +typedef struct { + uint32_t layer_address; + uint32_t tree_address[3]; + uint32_t type; + uint32_t keypair_address; + uint32_t tree_height; + uint32_t tree_index; +} SPHINCS_ADRS_FORS_PRF; + +typedef uint8_t sphincs_adrs_t[32]; + +void sphincs_adrs_copy_layer_address(sphincs_adrs_t dst, const sphincs_adrs_t src); +void sphincs_adrs_copy_tree_address(sphincs_adrs_t dst, const sphincs_adrs_t src); +void sphincs_adrs_copy_type(sphincs_adrs_t dst, const sphincs_adrs_t src); +void sphincs_adrs_copy_keypair_address(sphincs_adrs_t dst, const sphincs_adrs_t src); +void sphincs_adrs_copy_chain_address(sphincs_adrs_t dst, const sphincs_adrs_t src); +void sphincs_adrs_copy_hash_address(sphincs_adrs_t dst, const sphincs_adrs_t src); +void sphincs_adrs_copy_tree_height(sphincs_adrs_t dst, const sphincs_adrs_t src); +void sphincs_adrs_copy_tree_index(sphincs_adrs_t dst, const sphincs_adrs_t src); +void sphincs_adrs_init_padding1(sphincs_adrs_t adrs); +void sphincs_adrs_init_padding2(sphincs_adrs_t adrs); +void sphincs_adrs_init_padding3(sphincs_adrs_t adrs); +void sphincs_adrs_set_layer_address(sphincs_adrs_t adrs, const uint32_t address); +void sphincs_adrs_set_tree_address(sphincs_adrs_t adrs, const uint64_t address); +void sphincs_adrs_set_type(sphincs_adrs_t adrs, const uint32_t type); +void sphincs_adrs_set_keypair_address(sphincs_adrs_t adrs, const uint32_t address); +void sphincs_adrs_set_chain_address(sphincs_adrs_t adrs, const uint32_t address); +void sphincs_adrs_set_hash_address(sphincs_adrs_t adrs, const uint32_t address); +void sphincs_adrs_set_tree_height(sphincs_adrs_t adrs, uint32_t height); +void sphincs_adrs_set_tree_index(sphincs_adrs_t adrs, uint32_t index); +int sphincs_adrs_print(FILE *fp, int fmt, int ind, const char *label, const sphincs_adrs_t adrs); + +typedef struct { + uint8_t layer_address; + uint64_t tree_address; + uint8_t type; + uint32_t others[3]; +} SPHINCS_ADRSC; + + + +typedef uint8_t sphincs_adrsc_t[22]; + +void sphincs_adrs_compress(const sphincs_adrs_t adrs, sphincs_adrsc_t adrsc); + + + + +typedef sphincs_hash128_t sphincs_wots_key_t[35]; +typedef sphincs_hash128_t sphincs_wots_sig_t[35]; + +int sphincs_wots_key_print(FILE *fp, int fmt, int ind, const char *label, const sphincs_wots_key_t key); +int sphincs_wots_sig_print(FILE *fp, int fmt, int ind, const char *label, const sphincs_wots_sig_t sig); + +void sphincs_wots_derive_sk(const sphincs_hash128_t secret, + const sphincs_hash128_t seed, const sphincs_adrs_t in_adrs, + sphincs_wots_key_t sk); +void sphincs_wots_chain(const sphincs_hash128_t x, + const sphincs_hash128_t seed, const sphincs_adrs_t ots_adrs, + int start, int steps, sphincs_hash128_t y); +void sphincs_wots_sk_to_pk(const sphincs_wots_key_t sk, + const sphincs_hash128_t seed, const sphincs_adrs_t ots_adrs, + sphincs_wots_key_t pk); +void sphincs_wots_sign(const sphincs_wots_key_t sk, + const sphincs_hash128_t seed, const sphincs_adrs_t ots_adrs, + const sphincs_hash128_t dgst, sphincs_wots_sig_t sig); +void sphincs_wots_sig_to_pk(const sphincs_wots_sig_t sig, + const sphincs_hash128_t seed, const sphincs_adrs_t ots_adrs, + const sphincs_hash128_t dgst, sphincs_wots_key_t pk); +void sphincs_wots_pk_to_root(const sphincs_wots_key_t pk, + const sphincs_hash128_t seed, const sphincs_adrs_t in_adrs, + sphincs_hash128_t root); + + + + +void sphincs_xmss_tree_hash( + const sphincs_hash128_t left_child, const sphincs_hash128_t right_child, + const sphincs_hash128_t seed, const sphincs_adrs_t adrs, + sphincs_hash256_t parent); +void sphincs_xmss_build_tree(const sphincs_hash128_t secret, + const sphincs_hash128_t seed, const sphincs_adrs_t adrs, + sphincs_hash128_t tree[((1 << ((63/7) + 1)) - 1)]); +void sphincs_xmss_build_auth_path(const sphincs_hash128_t tree[((1 << ((63/7) + 1)) - 1)], + uint32_t tree_index, sphincs_hash128_t auth_path[(63/7)]); +void sphincs_xmss_build_root(const sphincs_hash128_t wots_root, uint32_t tree_index, + const sphincs_hash128_t seed, const sphincs_adrs_t adrs, + const sphincs_hash128_t auth_path[(63/7)], + sphincs_hash256_t root); + +typedef struct { + sphincs_wots_sig_t wots_sig; + sphincs_hash128_t auth_path[(63/7)]; +} SPHINCS_XMSS_SIGNATURE; + +int sphincs_xmss_signature_print_ex(FILE *fp, int fmt, int ind, const char *label, const SPHINCS_XMSS_SIGNATURE *sig); +int sphincs_xmss_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen); +int sphincs_xmss_signature_to_bytes(const SPHINCS_XMSS_SIGNATURE *sig, uint8_t **out, size_t *outlen); +int sphincs_xmss_signature_from_bytes(SPHINCS_XMSS_SIGNATURE *sig, const uint8_t **in, size_t *inlen); + +void sphincs_xmss_sign(const sphincs_hash128_t secret, + const sphincs_hash128_t seed, const sphincs_adrs_t adrs, uint32_t keypair_address, + const sphincs_hash128_t tbs_root, + SPHINCS_XMSS_SIGNATURE *sig); +void sphincs_xmss_sig_to_root(const SPHINCS_XMSS_SIGNATURE *sig, + const sphincs_hash128_t seed, const sphincs_adrs_t adrs, uint32_t keypair_address, + const sphincs_hash128_t tbs_root, + sphincs_hash128_t xmss_root); + + + +void sphincs_hypertree_derive_root(const sphincs_hash128_t secret, const sphincs_hash128_t seed, + sphincs_hash128_t root); +void sphincs_hypertree_sign(const sphincs_hash128_t secret, + const sphincs_hash128_t seed, uint64_t tree_address, uint32_t keypair_address, + const sphincs_hash128_t tbs_fors_root, + SPHINCS_XMSS_SIGNATURE sig[7]); +int sphincs_hypertree_verify(const sphincs_hash128_t top_xmss_root, + const sphincs_hash128_t seed, uint64_t tree_address, uint32_t keypair_address, + const sphincs_hash128_t tbs_fors_root, + const SPHINCS_XMSS_SIGNATURE sig[7]); + + + + +void sphincs_fors_derive_sk(const sphincs_hash128_t secret, + const sphincs_hash128_t seed, const sphincs_adrs_t in_adrs, + uint32_t fors_index, sphincs_hash128_t sk); +void sphincs_fors_build_tree(const sphincs_hash128_t secret, + const sphincs_hash128_t seed, const sphincs_adrs_t in_adrs, int tree_addr, + sphincs_hash128_t tree[((1 << (12 + 1)) - 1)]);; +void sphincs_fors_derive_root(const sphincs_hash128_t secret, + const sphincs_hash128_t seed, const sphincs_adrs_t in_adrs, + sphincs_hash128_t fors_root); + +typedef struct { + sphincs_hash128_t fors_sk[14]; + sphincs_hash128_t auth_path[14][12]; +} SPHINCS_FORS_SIGNATURE; + + + +int sphincs_fors_signature_to_bytes(const SPHINCS_FORS_SIGNATURE *sig, uint8_t **out, size_t *outlen); +int sphincs_fors_signature_from_bytes(SPHINCS_FORS_SIGNATURE *sig, const uint8_t **in, size_t *inlen); +int sphincs_fors_signature_print_ex(FILE *fp, int fmt, int ind, const char *label, const SPHINCS_FORS_SIGNATURE *sig); +int sphincs_fors_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen); + +void sphincs_fors_sign(const sphincs_hash128_t secret, + const sphincs_hash128_t seed, const sphincs_adrs_t in_adrs, + const uint8_t dgst[((12 * 14 + 7)/8)], + SPHINCS_FORS_SIGNATURE *sig); +void sphincs_fors_sig_to_root(const SPHINCS_FORS_SIGNATURE *sig, + const sphincs_hash128_t seed, const sphincs_adrs_t adrs, + const uint8_t dgst[((12 * 14 + 7)/8)], sphincs_hash128_t fors_root); + + + + +typedef struct { + sphincs_hash128_t seed; + sphincs_hash128_t root; +} SPHINCS_PUBLIC_KEY; + + + +typedef struct { + SPHINCS_PUBLIC_KEY public_key; + sphincs_hash128_t secret; + sphincs_hash128_t sk_prf; +} SPHINCS_KEY; + + + +int sphincs_key_generate(SPHINCS_KEY *key); +int sphincs_public_key_to_bytes(const SPHINCS_KEY *key, uint8_t **out, size_t *outlen); +int sphincs_public_key_from_bytes(SPHINCS_KEY *key, const uint8_t **in, size_t *inlen); +int sphincs_public_key_print(FILE *fp, int fmt, int ind, const char *label, const SPHINCS_KEY *key); +int sphincs_private_key_to_bytes(const SPHINCS_KEY *key, uint8_t **out, size_t *outlen); +int sphincs_private_key_from_bytes(SPHINCS_KEY *key, const uint8_t **in, size_t *inlen); +int sphincs_private_key_print(FILE *fp, int fmt, int ind, const char *label, const SPHINCS_KEY *key); +void sphincs_key_cleanup(SPHINCS_KEY *key); + +typedef struct { + sphincs_hash128_t random; + SPHINCS_FORS_SIGNATURE fors_sig; + SPHINCS_XMSS_SIGNATURE xmss_sigs[7]; +} SPHINCS_SIGNATURE; + + + +int sphincs_signature_to_bytes(const SPHINCS_SIGNATURE *sig, uint8_t **out, size_t *outlen); +int sphincs_signature_from_bytes(SPHINCS_SIGNATURE *sig, const uint8_t **in, size_t *inlen); +int sphincs_signature_print_ex(FILE *fp, int fmt, int ind, const char *label, const SPHINCS_SIGNATURE *sig); +int sphincs_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen); + +typedef struct { + SM3_HMAC_CTX hmac_ctx; + SM3_CTX hash_ctx; + SPHINCS_SIGNATURE sig; + int state; + size_t round1_msglen; + size_t round2_msglen; + SPHINCS_KEY key; +} SPHINCS_SIGN_CTX; + + +int sphincs_sign_init_ex(SPHINCS_SIGN_CTX *ctx, const SPHINCS_KEY *key, const sphincs_hash128_t optional_random); +int sphincs_sign_init(SPHINCS_SIGN_CTX *ctx, const SPHINCS_KEY *key); +int sphincs_sign_prepare(SPHINCS_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int sphincs_sign_update(SPHINCS_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int sphincs_sign_finish_ex(SPHINCS_SIGN_CTX *ctx, SPHINCS_SIGNATURE *sig); +int sphincs_sign_finish(SPHINCS_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen); +int sphincs_verify_init_ex(SPHINCS_SIGN_CTX *ctx, const SPHINCS_KEY *key, const SPHINCS_SIGNATURE *sig); +int sphincs_verify_init(SPHINCS_SIGN_CTX *ctx, const SPHINCS_KEY *key, const uint8_t *sig, size_t siglen); +int sphincs_verify_update(SPHINCS_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int sphincs_verify_finish(SPHINCS_SIGN_CTX *ctx); +void sphincs_sign_ctx_cleanup(SPHINCS_SIGN_CTX *ctx); +# 26 "/usr/local/include/gmssl/x509_key.h" 2 + + + + + + + + +typedef struct { + int algor; + int algor_param; + union { + SM2_KEY sm2_key; + LMS_KEY lms_key; + HSS_KEY hss_key; + XMSS_KEY xmss_key; + XMSSMT_KEY xmssmt_key; + SPHINCS_KEY sphincs_key; + SECP256R1_KEY secp256r1_key; + } u; + const char *signer_id; + size_t signer_idlen; +} X509_KEY; + +int x509_key_set_sm2_key(X509_KEY *x509_key, const SM2_KEY *sm2_key); +int x509_key_set_lms_key(X509_KEY *x509_key, const LMS_KEY *lms_key); +int x509_key_set_hss_key(X509_KEY *x509_key, const HSS_KEY *hss_key); +int x509_key_set_xmss_key(X509_KEY *x509_key, const XMSS_KEY *xmss_key); +int x509_key_set_xmssmt_key(X509_KEY *x509_key, const XMSSMT_KEY *xmssmt_key); +int x509_key_set_sphincs_key(X509_KEY *x509_key, const SPHINCS_KEY *sphincs_key); +int x509_key_set_secp256r1_key(X509_KEY *x509_key, const SECP256R1_KEY *secp256r1_key); + + +int x509_algor_param_from_lms_types(int *algor_param, const int *lms_types, size_t num); +int x509_algor_param_to_lms_types(int algor_param, int lms_types[5], size_t *num); +# 72 "/usr/local/include/gmssl/x509_key.h" +int x509_key_generate(X509_KEY *key, int algor, int algor_param); +int x509_private_key_from_file(X509_KEY *key, int algor, const char *pass, FILE *fp); +void x509_key_cleanup(X509_KEY *key); +# 85 "/usr/local/include/gmssl/x509_key.h" +int x509_public_key_to_bytes(const X509_KEY *key, uint8_t **out, size_t *outlen); +int x509_public_key_digest(const X509_KEY *key, uint8_t dgst[32]); +int x509_public_key_equ(const X509_KEY *key, const X509_KEY *pub); +int x509_public_key_print(FILE *fp, int fmt, int ind, const char *label, const X509_KEY *key); +int x509_private_key_print(FILE *fp, int fmt, int ind, const char *label, const X509_KEY *key); + + +int x509_public_key_info_to_der(const X509_KEY *key, uint8_t **out, size_t *outlen); +int x509_public_key_info_from_der(X509_KEY *key, const uint8_t **in, size_t *inlen); +int x509_public_key_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + +int ec_private_key_to_der(const X509_KEY *key, int encode_params, int encode_pubkey, uint8_t **out, size_t *outlen); +int ec_private_key_from_der(X509_KEY *key, int opt_curve, const uint8_t **in, size_t *inlen); +# 107 "/usr/local/include/gmssl/x509_key.h" +int x509_private_key_info_to_der(const X509_KEY *key, uint8_t **out, size_t *outlen); +int x509_private_key_info_from_der(X509_KEY *key, const uint8_t **attrs, size_t *attrslen, + const uint8_t **in, size_t *inlen); + + + + +int x509_private_key_info_encrypt_to_der(const X509_KEY *x509_key, const char *pass, + uint8_t **out, size_t *outlen); +int x509_private_key_info_decrypt_from_der(X509_KEY *x509_key, + const uint8_t **attrs, size_t *attrs_len, + const char *pass, const uint8_t **in, size_t *inlen); + + +int x509_private_key_info_encrypt_to_pem(const X509_KEY *key, const char *pass, FILE *fp); +int x509_private_key_info_decrypt_from_pem(X509_KEY *key, const uint8_t **attrs, size_t *attrslen, const char *pass, FILE *fp); +# 133 "/usr/local/include/gmssl/x509_key.h" +typedef union { + uint8_t sm2_sig[72]; + LMS_SIGNATURE lms_sig; + HSS_SIGNATURE hss_sig; + XMSS_SIGNATURE xmss_sig; + XMSSMT_SIGNATURE xmssmt_sig; + SPHINCS_SIGNATURE sphincs_sig; + uint8_t ecdsa_sig[72]; +} X509_SIGNATURE; + + + + +typedef struct { + union { + SM2_SIGN_CTX sm2_sign_ctx; + SM2_VERIFY_CTX sm2_verify_ctx; + HSS_SIGN_CTX hss_sign_ctx; + XMSS_SIGN_CTX xmss_sign_ctx; + XMSSMT_SIGN_CTX xmssmt_sign_ctx; + SPHINCS_SIGN_CTX sphincs_sign_ctx; + ECDSA_SIGN_CTX ecdsa_sign_ctx; + } u; + int sign_algor; + uint8_t sig[sizeof(X509_SIGNATURE)]; + size_t siglen; +} X509_SIGN_CTX; +# 172 "/usr/local/include/gmssl/x509_key.h" +int x509_key_get_sign_algor(const X509_KEY *key, int *algor); +int x509_key_get_signature_size(const X509_KEY *key, size_t *siglen); + + + + + +int x509_sign_init(X509_SIGN_CTX *ctx, X509_KEY *key, const void *args, size_t argslen); +int x509_sign_update(X509_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int x509_sign_finish(X509_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen); +int x509_verify_init(X509_SIGN_CTX *ctx, const X509_KEY *key, const void *args, size_t argslen, + const uint8_t *sig, size_t siglen); +int x509_verify_update(X509_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int x509_verify_finish(X509_SIGN_CTX *ctx); +void x509_sign_ctx_cleanup(X509_SIGN_CTX *ctx); + + + +int x509_key_do_exchange(const X509_KEY *key, const X509_KEY *peer_pub, uint8_t *out, size_t *outlen); +int x509_key_exchange(const X509_KEY *key, const uint8_t *peer_pub, size_t peer_publen, uint8_t *out, size_t *outlen); +# 23 "/usr/local/include/gmssl/x509_cer.h" 2 + + + + + + +enum X509_Version { + X509_version_v1 = 0, + X509_version_v2 = 1, + X509_version_v3 = 2, +}; + +const char *x509_version_name(int version); +int x509_explicit_version_to_der(int index, int version, uint8_t **out, size_t *outlen); +int x509_explicit_version_from_der(int index, int *version, const uint8_t **in, size_t *inlen); +# 46 "/usr/local/include/gmssl/x509_cer.h" +int x509_time_to_der(time_t a, uint8_t **out, size_t *outlen); +int x509_time_from_der(time_t *a, const uint8_t **in, size_t *inlen); +# 57 "/usr/local/include/gmssl/x509_cer.h" +int x509_validity_add_days(time_t *not_after, time_t not_before, int days); +int x509_validity_to_der(time_t not_before, time_t not_after, uint8_t **out, size_t *outlen); +int x509_validity_from_der(time_t *not_before, time_t *not_after, const uint8_t **in, size_t *inlen); +int x509_validity_check(time_t not_before, time_t not_after, time_t now, int max_secs); +int x509_validity_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +# 74 "/usr/local/include/gmssl/x509_cer.h" +int x509_directory_name_check(int tag, const uint8_t *d, size_t dlen); +int x509_directory_name_check_ex(int tag, const uint8_t *d, size_t dlen, size_t minlen, size_t maxlen); +int x509_directory_name_to_der(int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int x509_directory_name_from_der(int *tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int x509_explicit_directory_name_to_der(int index, int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int x509_explicit_directory_name_from_der(int index, int *tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int x509_directory_name_print(FILE *fp, int fmt, int ind, const char *label, int tag, const uint8_t *d, size_t dlen); +# 105 "/usr/local/include/gmssl/x509_cer.h" +const char *x509_name_type_name(int oid); +int x509_name_type_from_name(const char *name); +int x509_name_type_from_der(int *oid, const uint8_t **in, size_t *inlen); +int x509_name_type_to_der(int oid, uint8_t **out, size_t *outlen); +# 120 "/usr/local/include/gmssl/x509_cer.h" +int x509_attr_type_and_value_check(int oid, int tag, const uint8_t *val, size_t vlen); +int x509_attr_type_and_value_to_der(int oid, int tag, const uint8_t *val, size_t vlen, uint8_t **out, size_t *outlen); +int x509_attr_type_and_value_from_der(int *oid, int *tag, const uint8_t **val, size_t *vlen, const uint8_t **in, size_t *inlen); +int x509_attr_type_and_value_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + + + +int x509_rdn_to_der(int oid, int tag, const uint8_t *val, size_t vlen, const uint8_t *more, size_t mlen, uint8_t **out, size_t *outlen); +int x509_rdn_from_der(int *oid, int *tag, const uint8_t **val, size_t *vlen, const uint8_t **more, size_t *mlen, const uint8_t **in, size_t *inlen); +int x509_rdn_check(const uint8_t *d, size_t dlen); +int x509_rdn_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + + + +int x509_name_add_rdn(uint8_t *d, size_t *dlen, size_t maxlen, int oid, int tag, const uint8_t *val, size_t vlen, const uint8_t *more, size_t mlen); +int x509_name_add_country_name(uint8_t *d, size_t *dlen, size_t maxlen, const char val[2] ); +int x509_name_add_state_or_province_name(uint8_t *d, size_t *dlen, size_t maxlen, int tag, const uint8_t *val, size_t vlen); +int x509_name_add_locality_name(uint8_t *d, size_t *dlen, size_t maxlen, int tag, const uint8_t *val, size_t vlen); +int x509_name_add_organization_name(uint8_t *d, size_t *dlen, size_t maxlen, int tag, const uint8_t *val, size_t vlen); +int x509_name_add_organizational_unit_name(uint8_t *d, size_t *dlen, size_t maxlen, int tag, const uint8_t *val, size_t vlen); +int x509_name_add_common_name(uint8_t *d, size_t *dlen, size_t maxlen, int tag, const uint8_t *val, size_t vlen); +int x509_name_add_domain_component(uint8_t *d, size_t *dlen, size_t maxlen, const char *val, size_t vlen); + +int x509_name_set(uint8_t *d, size_t *dlen, size_t maxlen, + const char country[2], const char *state, const char *locality, + const char *org, const char *org_unit, const char *common_name); + + + +int x509_name_check(const uint8_t *d, size_t dlen); +int x509_name_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +int x509_name_get_value_by_type(const uint8_t *d, size_t dlen, int oid, int *tag, const uint8_t **val, size_t *vlen); +int x509_name_get_common_name(const uint8_t *d, size_t dlen, int *tag, const uint8_t **val, size_t *vlen); +int x509_name_equ(const uint8_t *a, size_t alen, const uint8_t *b, size_t blen); + +int x509_names_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +# 184 "/usr/local/include/gmssl/x509_cer.h" +const char *x509_ext_id_name(int oid); +int x509_ext_id_from_name(const char *name); +int x509_ext_id_from_der(int *oid, uint32_t *nodes, size_t *nodes_count, const uint8_t **in, size_t *inlen); +int x509_ext_id_to_der(int oid, uint8_t **out, size_t *outlen); + +int x509_ext_to_der(int oid, int critical, const uint8_t *val, size_t vlen, uint8_t **out, size_t *outlen); +int x509_ext_from_der(int *oid, uint32_t *nodes, size_t *nodes_cnt, int *critical, const uint8_t **val, size_t *vlen, const uint8_t **in, size_t *inlen); +int x509_ext_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + + + +int x509_explicit_exts_to_der(int index, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int x509_explicit_exts_from_der(int index, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); + + + +int x509_exts_get_ext_by_oid(const uint8_t *d, size_t dlen, int oid, + int *critical, const uint8_t **val, size_t *vlen); +int x509_exts_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +# 223 "/usr/local/include/gmssl/x509_cer.h" +int x509_tbs_cert_to_der( + int version, + const uint8_t *serial, size_t serial_len, + int signature_algor, + const uint8_t *issuer, size_t issuer_len, + time_t not_before, time_t not_after, + const uint8_t *subject, size_t subject_len, + const X509_KEY *subject_public_key, + const uint8_t *issuer_unique_id, size_t issuer_unique_id_len, + const uint8_t *subject_unique_id, size_t subject_unique_id_len, + const uint8_t *exts, size_t exts_len, + uint8_t **out, size_t *outlen); +int x509_tbs_cert_from_der( + int *version, + const uint8_t **serial, size_t *serial_len, + int *signature_algor, + const uint8_t **issuer, size_t *issuer_len, + time_t *not_before, time_t *not_after, + const uint8_t **subject, size_t *subject_len, + X509_KEY *subject_public_key, + const uint8_t **issuer_unique_id, size_t *issuer_unique_id_len, + const uint8_t **subject_unique_id, size_t *subject_unique_id_len, + const uint8_t **exts, size_t *exts_len, + const uint8_t **in, size_t *inlen); +int x509_tbs_cert_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + + + + + + +int x509_certificate_to_der( + const uint8_t *tbs, size_t tbslen, + int signature_algor, + const uint8_t *sig, size_t siglen, + uint8_t **out, size_t *outlen); +int x509_certificate_from_der( + const uint8_t **tbs, size_t *tbslen, + int *signature_algor, + const uint8_t **sig, size_t *siglen, + const uint8_t **in, size_t *inlen); + +int x509_signed_from_der( + const uint8_t **tbs, size_t *tbslen, + int *signature_algor, + const uint8_t **sig, size_t *siglen, + const uint8_t **in, size_t *inlen); +int x509_signed_verify(const uint8_t *a, size_t alen, const X509_KEY *pub_key, + const char *signer_id, size_t signer_id_len); +int x509_signed_verify_by_ca_cert(const uint8_t *a, size_t alen, const uint8_t *cacert, size_t cacertlen, + const char *signer_id, size_t signer_id_len); + + +int x509_cert_sign_to_der( + int version, + const uint8_t *serial, size_t serial_len, + int signature_algor, + const uint8_t *issuer, size_t issuer_len, + time_t not_before, time_t not_after, + const uint8_t *subject, size_t subject_len, + const X509_KEY *subject_public_key, + const uint8_t *issuer_unique_id, size_t issuer_unique_id_len, + const uint8_t *subject_unique_id, size_t subject_unique_id_len, + const uint8_t *exts, size_t exts_len, + X509_KEY *sign_key, const char *signer_id, size_t signer_id_len, + uint8_t **out, size_t *outlen); + +int x509_cert_to_der(const uint8_t *a, size_t alen, uint8_t **out, size_t *outlen); +int x509_cert_from_der(const uint8_t **a, size_t *alen, const uint8_t **in, size_t *inlen); +int x509_cert_to_pem(const uint8_t *a, size_t alen, FILE *fp); +int x509_cert_from_pem(uint8_t *a, size_t *alen, size_t maxlen, FILE *fp); +int x509_cert_from_pem_by_subject(uint8_t *a, size_t *alen, size_t maxlen, const uint8_t *name, size_t namelen, FILE *fp); +int x509_cert_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *a, size_t alen); + +int x509_cert_verify_by_ca_cert(const uint8_t *a, size_t alen, const uint8_t *cacert, size_t cacertlen, + const char *signer_id, size_t signer_id_len); + +int x509_cert_get_details(const uint8_t *a, size_t alen, + int *version, + const uint8_t **serial_number, size_t *serial_number_len, + int *inner_signature_algor, + const uint8_t **issuer, size_t *issuer_len, + time_t *not_before, time_t *not_after, + const uint8_t **subject, size_t *subject_len, + X509_KEY *subject_public_key, + const uint8_t **issuer_unique_id, size_t *issuer_unique_id_len, + const uint8_t **subject_unique_id, size_t *subject_unique_id_len, + const uint8_t **extensions, size_t *extensions_len, + int *signature_algor, + const uint8_t **signature, size_t *signature_len); + + +typedef enum { + X509_cert_server_auth, + X509_cert_client_auth, + X509_cert_server_key_encipher, + X509_cert_client_key_encipher, + X509_cert_ca, + X509_cert_root_ca, + X509_cert_crl_sign, +} X509_CERT_TYPE; + +int x509_cert_check(const uint8_t *cert, size_t certlen, int cert_type, int *path_len_constraint); + + + + + + +int x509_cert_get_issuer_and_serial_number(const uint8_t *a, size_t alen, + const uint8_t **issuer, size_t *issuer_len, + const uint8_t **serial_number, size_t *serial_number_len); +int x509_cert_get_issuer(const uint8_t *a, size_t alen, const uint8_t **name, size_t *namelen); +int x509_cert_get_subject(const uint8_t *a, size_t alen, const uint8_t **subj, size_t *subj_len); +int x509_cert_get_subject_public_key(const uint8_t *a, size_t alen, X509_KEY *public_key); +int x509_cert_get_exts(const uint8_t *a, size_t alen, const uint8_t **d, size_t *dlen); + +int x509_certs_to_pem(const uint8_t *d, size_t dlen, FILE *fp); +int x509_certs_from_pem(uint8_t *d, size_t *dlen, size_t maxlen, FILE *fp); +int x509_certs_get_count(const uint8_t *d, size_t dlen, size_t *cnt); +int x509_certs_get_cert_by_index(const uint8_t *d, size_t dlen, int index, const uint8_t **cert, size_t *certlen); +int x509_certs_get_cert_by_subject(const uint8_t *d, size_t dlen, const uint8_t *subject, size_t subject_len, const uint8_t **cert, size_t *certlen); +int x509_certs_get_last(const uint8_t *d, size_t dlen, const uint8_t **cert, size_t *certlen); + +int x509_certs_get_cert_by_subject_and_key_identifier(const uint8_t *d, size_t dlen, + const uint8_t *subject, size_t subject_len, + const uint8_t *key_id, size_t key_id_len, + const uint8_t **cert, size_t *certlen); +int x509_certs_get_cert_by_issuer_and_serial_number( + const uint8_t *certs, size_t certs_len, + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial, size_t serial_len, + const uint8_t **cert, size_t *cert_len); + +typedef enum { + X509_cert_chain_server, + X509_cert_chain_client, +} X509_CERT_CHAIN_TYPE; + + +int x509_certs_verify(const uint8_t *certs, size_t certslen, int certs_type, + const uint8_t *rootcerts, size_t rootcertslen, int depth, int *verify_result); +int x509_certs_verify_tlcp(const uint8_t *certs, size_t certslen, int certs_type, + const uint8_t *rootcerts, size_t rootcertslen, int depth, int *verify_result); +int x509_certs_get_subjects(const uint8_t *certs, size_t certslen, uint8_t *names, size_t *nameslen); +int x509_certs_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + +int x509_cert_new_from_file(uint8_t **out, size_t *outlen, const char *file); +int x509_certs_new_from_file(uint8_t **out, size_t *outlen, const char *file); +# 15 "/usr/local/include/gmssl/x509.h" 2 +# 18 "tls12.c" 2 +# 1 "/usr/local/include/gmssl/error.h" 1 +# 16 "/usr/local/include/gmssl/error.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4 +# 17 "/usr/local/include/gmssl/error.h" 2 +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stdarg.h" 1 3 +# 47 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stdarg.h" 3 +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stdarg_header_macro.h" 1 3 +# 48 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stdarg.h" 2 3 + + + +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stdarg___gnuc_va_list.h" 1 3 +# 12 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stdarg___gnuc_va_list.h" 3 +typedef __builtin_va_list __gnuc_va_list; +# 52 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stdarg.h" 2 3 + + + + +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stdarg_va_list.h" 1 3 +# 12 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stdarg_va_list.h" 3 +typedef __builtin_va_list va_list; +# 57 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stdarg.h" 2 3 + + + + +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stdarg_va_arg.h" 1 3 +# 62 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stdarg.h" 2 3 + + + + +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stdarg___va_copy.h" 1 3 +# 67 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stdarg.h" 2 3 + + + + +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stdarg_va_copy.h" 1 3 +# 72 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stdarg.h" 2 3 +# 18 "/usr/local/include/gmssl/error.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 19 "/usr/local/include/gmssl/error.h" 2 + +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/inttypes.h" 1 3 +# 24 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/inttypes.h" 3 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/inttypes.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/inttypes.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_inttypes.h" 1 3 4 +# 225 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_inttypes.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 226 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_inttypes.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_wchar_t.h" 1 3 4 +# 229 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_inttypes.h" 2 3 4 + + + + + + + + +__attribute__((availability(macosx,introduced=10.4))) +extern intmax_t +imaxabs(intmax_t j); + + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +__attribute__((availability(macosx,introduced=10.4))) +extern imaxdiv_t +imaxdiv(intmax_t __numer, intmax_t __denom); + + +__attribute__((availability(macosx,introduced=10.4))) +extern intmax_t +strtoimax(const char * restrict __nptr, + char * * restrict __endptr, + int __base); + +__attribute__((availability(macosx,introduced=10.4))) +extern uintmax_t +strtoumax(const char * restrict __nptr, + char * * restrict __endptr, + int __base); + + +__attribute__((availability(macosx,introduced=10.4))) +extern intmax_t +wcstoimax(const wchar_t * restrict __nptr, + wchar_t * * restrict __endptr, + int __base); + +__attribute__((availability(macosx,introduced=10.4))) +extern uintmax_t +wcstoumax(const wchar_t * restrict __nptr, + wchar_t * * restrict __endptr, + int __base); +# 32 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/inttypes.h" 2 3 4 +# 25 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/inttypes.h" 2 3 +# 21 "/usr/local/include/gmssl/error.h" 2 +# 52 "/usr/local/include/gmssl/error.h" +void print_der(const uint8_t *in, size_t inlen); +void print_bytes(const uint8_t *in, size_t inlen); +void print_nodes(const uint32_t *in, size_t inlen); + + + + +int format_print(FILE *fp, int format, int indent, const char *str, ...); +int format_bytes(FILE *fp, int format, int indent, const char *str, const uint8_t *data, size_t datalen); +int format_string(FILE *fp, int format, int indent, const char *str, const uint8_t *data, size_t datalen); +# 19 "tls12.c" 2 + + +# 1 "/usr/local/include/gmssl/sm4.h" 1 +# 15 "/usr/local/include/gmssl/sm4.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 16 "/usr/local/include/gmssl/sm4.h" 2 +# 1 "/usr/local/include/gmssl/ghash.h" 1 +# 14 "/usr/local/include/gmssl/ghash.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 15 "/usr/local/include/gmssl/ghash.h" 2 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 17 "/usr/local/include/gmssl/ghash.h" 2 +# 1 "/usr/local/include/gmssl/gf128.h" 1 +# 16 "/usr/local/include/gmssl/gf128.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4 +# 17 "/usr/local/include/gmssl/gf128.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 18 "/usr/local/include/gmssl/gf128.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 19 "/usr/local/include/gmssl/gf128.h" 2 + + + + + + + + +typedef uint64_t gf128_t[2]; + +void gf128_set_zero(gf128_t r); +void gf128_set_one(gf128_t r); +void gf128_add(gf128_t r, const gf128_t a, const gf128_t b); +void gf128_mul(gf128_t r, const gf128_t a, const gf128_t b); +void gf128_mul_by_2(gf128_t r, const gf128_t a); +void gf128_from_bytes(gf128_t r, const uint8_t p[16]); +void gf128_to_bytes(const gf128_t a, uint8_t p[16]); +int gf128_from_hex(gf128_t r, const char *s); +int gf128_equ_hex(const gf128_t a, const char *s); +int gf128_print(FILE *fp, int fmt, int ind, const char *label, const gf128_t a); +# 18 "/usr/local/include/gmssl/ghash.h" 2 +# 29 "/usr/local/include/gmssl/ghash.h" +void ghash(const uint8_t h[16], const uint8_t *aad, size_t aadlen, + const uint8_t *c, size_t clen, uint8_t out[16]); + +typedef struct { + gf128_t H; + gf128_t X; + size_t aadlen; + size_t clen; + uint8_t block[16]; + size_t num; +} GHASH_CTX; + +void ghash_init(GHASH_CTX *ctx, const uint8_t h[16], const uint8_t *aad, size_t aadlen); +void ghash_update(GHASH_CTX *ctx, const uint8_t *c, size_t clen); +void ghash_finish(GHASH_CTX *ctx, uint8_t out[16]); +# 17 "/usr/local/include/gmssl/sm4.h" 2 +# 28 "/usr/local/include/gmssl/sm4.h" +typedef struct { + uint32_t rk[(32)]; +} SM4_KEY; + +void sm4_set_encrypt_key(SM4_KEY *key, const uint8_t raw_key[(16)]); +void sm4_set_decrypt_key(SM4_KEY *key, const uint8_t raw_key[(16)]); +void sm4_encrypt(const SM4_KEY *key, const uint8_t in[(16)], uint8_t out[(16)]); + +void sm4_encrypt_blocks(const SM4_KEY *key, const uint8_t *in, size_t nblocks, uint8_t *out); +void sm4_cbc_encrypt_blocks(const SM4_KEY *key, uint8_t iv[(16)], + const uint8_t *in, size_t nblocks, uint8_t *out); +void sm4_cbc_decrypt_blocks(const SM4_KEY *key, uint8_t iv[(16)], + const uint8_t *in, size_t nblocks, uint8_t *out); +void sm4_ctr_encrypt_blocks(const SM4_KEY *key, uint8_t ctr[16], const uint8_t *in, size_t nblocks, uint8_t *out); +void sm4_ctr32_encrypt_blocks(const SM4_KEY *key, uint8_t ctr[16], const uint8_t *in, size_t nblocks, uint8_t *out); + +int sm4_cbc_padding_encrypt(const SM4_KEY *key, const uint8_t iv[(16)], + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm4_cbc_padding_decrypt(const SM4_KEY *key, const uint8_t iv[(16)], + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +void sm4_ctr_encrypt(const SM4_KEY *key, uint8_t ctr[16], const uint8_t *in, size_t inlen, uint8_t *out); +void sm4_ctr32_encrypt(const SM4_KEY *key, uint8_t ctr[16], const uint8_t *in, size_t inlen, uint8_t *out); + + +typedef struct { + SM4_KEY sm4_key; + uint8_t iv[(16)]; + uint8_t block[(16)]; + size_t block_nbytes; +} SM4_CBC_CTX; + +int sm4_cbc_encrypt_init(SM4_CBC_CTX *ctx, const uint8_t key[(16)], const uint8_t iv[(16)]); +int sm4_cbc_encrypt_update(SM4_CBC_CTX *ctx, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm4_cbc_encrypt_finish(SM4_CBC_CTX *ctx, uint8_t *out, size_t *outlen); +int sm4_cbc_decrypt_init(SM4_CBC_CTX *ctx, const uint8_t key[(16)], const uint8_t iv[(16)]); +int sm4_cbc_decrypt_update(SM4_CBC_CTX *ctx, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm4_cbc_decrypt_finish(SM4_CBC_CTX *ctx, uint8_t *out, size_t *outlen); + + +void sm4_ctr_encrypt(const SM4_KEY *key, uint8_t ctr[(16)], + const uint8_t *in, size_t inlen, uint8_t *out); +void sm4_ctr32_encrypt(const SM4_KEY *key, uint8_t ctr[(16)], + const uint8_t *in, size_t inlen, uint8_t *out); + +typedef struct { + SM4_KEY sm4_key; + uint8_t ctr[(16)]; + uint8_t block[(16)]; + size_t block_nbytes; +} SM4_CTR_CTX; + +int sm4_ctr_encrypt_init(SM4_CTR_CTX *ctx, const uint8_t key[(16)], const uint8_t ctr[(16)]); +int sm4_ctr_encrypt_update(SM4_CTR_CTX *ctx, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm4_ctr_encrypt_finish(SM4_CTR_CTX *ctx, uint8_t *out, size_t *outlen); +int sm4_ctr32_encrypt_init(SM4_CTR_CTX *ctx, const uint8_t key[(16)], const uint8_t ctr[(16)]); +int sm4_ctr32_encrypt_update(SM4_CTR_CTX *ctx, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm4_ctr32_encrypt_finish(SM4_CTR_CTX *ctx, uint8_t *out, size_t *outlen); +# 106 "/usr/local/include/gmssl/sm4.h" +int sm4_gcm_encrypt(const SM4_KEY *key, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen, const uint8_t *in, size_t inlen, + uint8_t *out, size_t taglen, uint8_t *tag); +int sm4_gcm_decrypt(const SM4_KEY *key, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen, const uint8_t *in, size_t inlen, + const uint8_t *tag, size_t taglen, uint8_t *out); + + +typedef struct { + SM4_CTR_CTX enc_ctx; + GHASH_CTX mac_ctx; + uint8_t Y[16]; + size_t taglen; + uint8_t mac[16]; + size_t maclen; + uint64_t encedlen; +} SM4_GCM_CTX; + +int sm4_gcm_encrypt_init(SM4_GCM_CTX *ctx, + const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen, size_t taglen); +int sm4_gcm_encrypt_update(SM4_GCM_CTX *ctx, + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm4_gcm_encrypt_finish(SM4_GCM_CTX *ctx, + uint8_t *out, size_t *outlen); +int sm4_gcm_decrypt_init(SM4_GCM_CTX *ctx, + const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen, size_t taglen); +int sm4_gcm_decrypt_update(SM4_GCM_CTX *ctx, + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm4_gcm_decrypt_finish(SM4_GCM_CTX *ctx, + uint8_t *out, size_t *outlen); +# 22 "tls12.c" 2 +# 1 "/usr/local/include/gmssl/pem.h" 1 +# 15 "/usr/local/include/gmssl/pem.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4 +# 16 "/usr/local/include/gmssl/pem.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 17 "/usr/local/include/gmssl/pem.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 18 "/usr/local/include/gmssl/pem.h" 2 +# 1 "/usr/local/include/gmssl/base64.h" 1 +# 16 "/usr/local/include/gmssl/base64.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 17 "/usr/local/include/gmssl/base64.h" 2 + + + + + + +typedef struct { + + int num; + + + + + + int length; + + unsigned char enc_data[80]; + + int line_num; + int expect_nl; +} BASE64_CTX; + + + + + +void base64_encode_init(BASE64_CTX *ctx); +int base64_encode_update(BASE64_CTX *ctx, const uint8_t *in, int inlen, uint8_t *out, int *outlen); +void base64_encode_finish(BASE64_CTX *ctx, uint8_t *out, int *outlen); + +void base64_decode_init(BASE64_CTX *ctx); +int base64_decode_update(BASE64_CTX *ctx, const uint8_t *in, int inlen, uint8_t *out, int *outlen); +int base64_decode_finish(BASE64_CTX *ctx, uint8_t *out, int *outlen); + + +int base64_encode_block(unsigned char *t, const unsigned char *f, int dlen); +int base64_decode_block(unsigned char *t, const unsigned char *f, int n); +# 19 "/usr/local/include/gmssl/pem.h" 2 + + + + + + + +int pem_read(FILE *fp, const char *name, uint8_t *out, size_t *outlen, size_t maxlen); +int pem_write(FILE *fp, const char *name, const uint8_t *in, size_t inlen); +# 23 "tls12.c" 2 +# 1 "/usr/local/include/gmssl/mem.h" 1 +# 15 "/usr/local/include/gmssl/mem.h" +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stddef.h" 1 3 +# 89 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stddef.h" 3 +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stddef_header_macro.h" 1 3 +# 90 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stddef.h" 2 3 + + + +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stddef_ptrdiff_t.h" 1 3 +# 18 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stddef_ptrdiff_t.h" 3 +typedef long int ptrdiff_t; +# 94 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stddef.h" 2 3 + + + + +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stddef_size_t.h" 1 3 +# 99 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stddef.h" 2 3 + + + + +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stddef_rsize_t.h" 1 3 +# 104 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stddef.h" 2 3 + + + + +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stddef_wchar_t.h" 1 3 +# 109 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stddef.h" 2 3 + + + + +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stddef_null.h" 1 3 +# 114 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stddef.h" 2 3 +# 128 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stddef.h" 3 +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stddef_max_align_t.h" 1 3 +# 16 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stddef_max_align_t.h" 3 +typedef long double max_align_t; +# 129 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stddef.h" 2 3 + + + + +# 1 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/__stddef_offsetof.h" 1 3 +# 134 "/Library/Developer/CommandLineTools/usr/lib/clang/17/include/stddef.h" 2 3 +# 16 "/usr/local/include/gmssl/mem.h" 2 + + +void memxor(void *r, const void *a, size_t len); +void gmssl_memxor(void *r, const void *a, const void *b, size_t len); + +int gmssl_secure_memcmp(const volatile void * volatile in_a, const volatile void * volatile in_b, size_t len); +void gmssl_secure_clear(void *ptr, size_t len); + +int mem_is_zero(const uint8_t *buf, size_t len); +# 24 "tls12.c" 2 +# 1 "/usr/local/include/gmssl/tls.h" 1 +# 20 "/usr/local/include/gmssl/tls.h" +# 1 "/usr/local/include/gmssl/digest.h" 1 +# 17 "/usr/local/include/gmssl/digest.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 18 "/usr/local/include/gmssl/digest.h" 2 +# 31 "/usr/local/include/gmssl/digest.h" +typedef struct DIGEST DIGEST; +typedef struct DIGEST_CTX DIGEST_CTX; + + + + + + +struct DIGEST_CTX { + union { + SM3_CTX sm3_ctx; +# 51 "/usr/local/include/gmssl/digest.h" + } u; + const DIGEST *digest; +}; + +struct DIGEST { + int oid; + size_t digest_size; + size_t block_size; + size_t ctx_size; + int (*init)(DIGEST_CTX *ctx); + int (*update)(DIGEST_CTX *ctx, const uint8_t *data, size_t datalen); + int (*finish)(DIGEST_CTX *ctx, uint8_t *dgst); +}; + +const DIGEST *DIGEST_sm3(void); +# 78 "/usr/local/include/gmssl/digest.h" +const DIGEST *digest_from_name(const char *name); +const char *digest_name(const DIGEST *digest); +int digest_init(DIGEST_CTX *ctx, const DIGEST *algor); +int digest_update(DIGEST_CTX *ctx, const uint8_t *data, size_t datalen); +int digest_finish(DIGEST_CTX *ctx, uint8_t *dgst, size_t *dgstlen); +int digest(const DIGEST *digest, const uint8_t *data, size_t datalen, uint8_t *dgst, size_t *dgstlen); +# 21 "/usr/local/include/gmssl/tls.h" 2 +# 1 "/usr/local/include/gmssl/block_cipher.h" 1 +# 14 "/usr/local/include/gmssl/block_cipher.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4 +# 15 "/usr/local/include/gmssl/block_cipher.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 16 "/usr/local/include/gmssl/block_cipher.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h" 1 3 4 +# 17 "/usr/local/include/gmssl/block_cipher.h" 2 +# 33 "/usr/local/include/gmssl/block_cipher.h" +typedef struct BLOCK_CIPHER BLOCK_CIPHER; +typedef struct BLOCK_CIPHER_KEY BLOCK_CIPHER_KEY; + +struct BLOCK_CIPHER_KEY { + union { + SM4_KEY sm4_key; + + + + } u; + const BLOCK_CIPHER *cipher; +}; + +typedef void (*block_cipher_set_encrypt_key_func)(BLOCK_CIPHER_KEY *key, const uint8_t *raw_key); +typedef void (*block_cipher_set_decrypt_key_func)(BLOCK_CIPHER_KEY *key, const uint8_t *raw_key); +typedef void (*block_cipher_encrypt_func)(const BLOCK_CIPHER_KEY *key, const uint8_t *in, uint8_t *out); +typedef void (*block_cipher_decrypt_func)(const BLOCK_CIPHER_KEY *key, const uint8_t *in, uint8_t *out); + +struct BLOCK_CIPHER { + int oid; + size_t key_size; + size_t block_size; + block_cipher_set_encrypt_key_func set_encrypt_key; + block_cipher_set_decrypt_key_func set_decrypt_key; + block_cipher_encrypt_func encrypt; + block_cipher_decrypt_func decrypt; +}; + +const BLOCK_CIPHER *BLOCK_CIPHER_sm4(void); + + + + +const BLOCK_CIPHER *block_cipher_from_name(const char *name); +const char *block_cipher_name(const BLOCK_CIPHER *cipher); +int block_cipher_set_encrypt_key(BLOCK_CIPHER_KEY *key, const BLOCK_CIPHER *cipher, const uint8_t *raw_key); +int block_cipher_set_decrypt_key(BLOCK_CIPHER_KEY *key, const BLOCK_CIPHER *cipher, const uint8_t *raw_key); +int block_cipher_encrypt(const BLOCK_CIPHER_KEY *key, const uint8_t *in, uint8_t *out); +int block_cipher_decrypt(const BLOCK_CIPHER_KEY *key, const uint8_t *in, uint8_t *out); +# 22 "/usr/local/include/gmssl/tls.h" 2 +# 1 "/usr/local/include/gmssl/socket.h" 1 +# 14 "/usr/local/include/gmssl/socket.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/string.h" 1 3 4 +# 15 "/usr/local/include/gmssl/socket.h" 2 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/errno.h" 1 3 4 +# 23 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/errno.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/errno.h" 1 3 4 +# 80 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/errno.h" 3 4 +extern int * __error(void); +# 24 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/errno.h" 2 3 4 +# 17 "/usr/local/include/gmssl/socket.h" 2 +# 43 "/usr/local/include/gmssl/socket.h" +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/fcntl.h" 1 3 4 +# 23 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/fcntl.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 1 3 4 +# 80 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 81 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 84 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 2 3 4 +# 116 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_o_sync.h" 1 3 4 +# 117 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 2 3 4 +# 149 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_o_dsync.h" 1 3 4 +# 150 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 2 3 4 +# 370 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_s_ifmt.h" 1 3 4 +# 371 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 2 3 4 +# 390 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +struct flock { + off_t l_start; + off_t l_len; + pid_t l_pid; + short l_type; + short l_whence; +}; +# 405 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +struct flocktimeout { + struct flock fl; + struct timespec timeout; +}; +# 419 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +struct radvisory { + off_t ra_offset; + int ra_count; +}; +# 432 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +typedef struct fsignatures { + off_t fs_file_start; + void *fs_blob_start; + size_t fs_blob_size; + + + + size_t fs_fsignatures_size; + char fs_cdhash[20]; + int fs_hash_type; +} fsignatures_t; + +typedef struct fsupplement { + off_t fs_file_start; + off_t fs_blob_start; + size_t fs_blob_size; + int fs_orig_fd; +} fsupplement_t; +# 463 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +typedef struct fchecklv { + off_t lv_file_start; + size_t lv_error_message_size; + void *lv_error_message; +} fchecklv_t; +# 477 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +typedef struct fgetsigsinfo { + off_t fg_file_start; + int fg_info_request; + int fg_sig_is_platform; +} fgetsigsinfo_t; +# 492 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +typedef struct fstore { + unsigned int fst_flags; + int fst_posmode; + off_t fst_offset; + off_t fst_length; + off_t fst_bytesalloc; +} fstore_t; + + +typedef struct fpunchhole { + unsigned int fp_flags; + unsigned int reserved; + off_t fp_offset; + off_t fp_length; +} fpunchhole_t; + + +typedef struct ftrimactivefile { + off_t fta_offset; + off_t fta_length; +} ftrimactivefile_t; + + +typedef struct fspecread { + unsigned int fsr_flags; + unsigned int reserved; + off_t fsr_offset; + off_t fsr_length; +} fspecread_t; + + + +typedef struct fattributiontag { + unsigned int ft_flags; + unsigned long long ft_hash; + char ft_attribution_name[255]; +} fattributiontag_t; +# 556 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +#pragma pack(4) + +struct log2phys { + unsigned int l2p_flags; + off_t l2p_contigbytes; + + + off_t l2p_devoffset; + + +}; + +#pragma pack() +# 578 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_filesec_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_filesec_t.h" 3 4 +struct _filesec; +typedef struct _filesec *filesec_t; +# 579 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/fcntl.h" 2 3 4 + +typedef enum { + FILESEC_OWNER = 1, + FILESEC_GROUP = 2, + FILESEC_UUID = 3, + FILESEC_MODE = 4, + FILESEC_ACL = 5, + FILESEC_GRPUUID = 6, + + + FILESEC_ACL_RAW = 100, + FILESEC_ACL_ALLOCSIZE = 101 +} filesec_property_t; + + + + + + +int open(const char *, int, ...) __asm("_" "open" ); + +int openat(int, const char *, int, ...) __asm("_" "openat" ) __attribute__((availability(macosx,introduced=10.10))); + +int creat(const char *, mode_t) __asm("_" "creat" ); +int fcntl(int, int, ...) __asm("_" "fcntl" ); + + +int openx_np(const char *, int, filesec_t); + + + + +int open_dprotected_np( const char *, int, int, int, ...); +int openat_dprotected_np( int, const char *, int, int, int, ...); +int openat_authenticated_np(int, const char *, int, int); +int flock(int, int); +filesec_t filesec_init(void); +filesec_t filesec_dup(filesec_t); +void filesec_free(filesec_t); +int filesec_get_property(filesec_t, filesec_property_t, void *); +int filesec_query_property(filesec_t, filesec_property_t, int *); +int filesec_set_property(filesec_t, filesec_property_t, const void *); +int filesec_unset_property(filesec_t, filesec_property_t) __attribute__((availability(macosx,introduced=10.6))); +# 24 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/fcntl.h" 2 3 4 +# 44 "/usr/local/include/gmssl/socket.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netdb.h" 1 3 4 +# 87 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netdb.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 88 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netdb.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_socklen_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_socklen_t.h" 3 4 +typedef __darwin_socklen_t socklen_t; +# 89 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netdb.h" 2 3 4 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 1 3 4 +# 70 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 71 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 2 3 4 +# 81 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 1 3 4 +# 77 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/constrained_ctypes.h" 1 3 4 +# 593 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/constrained_ctypes.h" 3 4 +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wextra-semi" + + + +#pragma clang diagnostic pop +# 613 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/constrained_ctypes.h" 3 4 +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wextra-semi" + + + +#pragma clang diagnostic pop +# 78 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/_param.h" 1 3 4 +# 34 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/_param.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arm/_param.h" 1 3 4 +# 35 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/machine/_param.h" 2 3 4 +# 79 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/net/net_kev.h" 1 3 4 +# 80 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 2 3 4 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 82 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 2 3 4 +# 94 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_sa_family_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_sa_family_t.h" 3 4 +typedef __uint8_t sa_family_t; +# 95 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 2 3 4 + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 99 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 2 3 4 + + + + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_iovec_t.h" 1 3 4 +# 30 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_iovec_t.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_iovec_t.h" 2 3 4 +struct iovec { + void * iov_base; + size_t iov_len; +}; +# 107 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 2 3 4 +# 296 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 3 4 +typedef __uint32_t sae_associd_t; + + + +typedef __uint32_t sae_connid_t; +# 310 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 3 4 +typedef struct sa_endpoints { + unsigned int sae_srcif; + const struct sockaddr *sae_srcaddr; + socklen_t sae_srcaddrlen; + const struct sockaddr *sae_dstaddr; + socklen_t sae_dstaddrlen; +} sa_endpoints_t; + + + + + +struct linger { + int l_onoff; + int l_linger; +}; +# 340 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 3 4 +struct so_np_extensions { + u_int32_t npx_flags; + u_int32_t npx_mask; +}; +# 414 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 3 4 +struct sockaddr { + __uint8_t sa_len; + sa_family_t sa_family; + char sa_data[14]; +}; + ; + + + + + + +struct __sockaddr_header { + __uint8_t sa_len; + sa_family_t sa_family; +}; +# 438 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 3 4 +struct sockproto { + __uint16_t sp_family; + __uint16_t sp_protocol; +}; +# 458 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 3 4 +struct sockaddr_storage { + __uint8_t ss_len; + sa_family_t ss_family; + char __ss_pad1[((sizeof(__int64_t)) - sizeof(__uint8_t) - sizeof(sa_family_t))]; + __int64_t __ss_align; + char __ss_pad2[(128 - sizeof(__uint8_t) - sizeof(sa_family_t) - ((sizeof(__int64_t)) - sizeof(__uint8_t) - sizeof(sa_family_t)) - (sizeof(__int64_t)))]; +}; + ; +# 560 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 3 4 +struct msghdr { + void * msg_name; + socklen_t msg_namelen; + struct iovec *msg_iov; + int msg_iovlen; + void * msg_control; + socklen_t msg_controllen; + int msg_flags; +}; +# 606 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 3 4 +struct cmsghdr { + socklen_t cmsg_len; + int cmsg_level; + int cmsg_type; + +}; +# 696 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h" 3 4 +struct sf_hdtr { + struct iovec *headers; + int hdr_cnt; + struct iovec *trailers; + int trl_cnt; +}; + + + + + + +int accept(int, struct sockaddr * restrict, socklen_t * restrict) +__asm("_" "accept" ); +int bind(int, const struct sockaddr *, socklen_t) __asm("_" "bind" ); +int connect(int, const struct sockaddr *, socklen_t) __asm("_" "connect" ); +int getpeername(int, struct sockaddr * restrict, socklen_t * restrict) +__asm("_" "getpeername" ); +int getsockname(int, struct sockaddr * restrict, socklen_t * restrict) +__asm("_" "getsockname" ); +int getsockopt(int, int, int, void * restrict, socklen_t * restrict); +int listen(int, int) __asm("_" "listen" ); +ssize_t recv(int, void *, size_t, int) __asm("_" "recv" ); +ssize_t recvfrom(int, void *, size_t, int, struct sockaddr * restrict, + socklen_t * restrict) __asm("_" "recvfrom" ); +ssize_t recvmsg(int, struct msghdr *, int) __asm("_" "recvmsg" ); +ssize_t send(int, const void *, size_t, int) __asm("_" "send" ); +ssize_t sendmsg(int, const struct msghdr *, int) __asm("_" "sendmsg" ); +ssize_t sendto(int, const void *, size_t, + int, const struct sockaddr *, socklen_t) __asm("_" "sendto" ); +int setsockopt(int, int, int, const void *, socklen_t); +int shutdown(int, int); +int sockatmark(int) __attribute__((availability(macosx,introduced=10.5))); +int socket(int, int, int); +int socketpair(int, int, int, int *) __asm("_" "socketpair" ); + + +int sendfile(int, int, off_t, off_t *, struct sf_hdtr *, int); + + + +void pfctlinput(int, struct sockaddr *); + +__attribute__((availability(macos,introduced=10.11))) __attribute__((availability(ios,introduced=9.0))) __attribute__((availability(tvos,introduced=9.0))) __attribute__((availability(watchos,introduced=2.0))) +int connectx(int, const sa_endpoints_t *, sae_associd_t, unsigned int, + const struct iovec *, unsigned int, size_t *, sae_connid_t *); + +__attribute__((availability(macos,introduced=10.11))) __attribute__((availability(ios,introduced=9.0))) __attribute__((availability(tvos,introduced=9.0))) __attribute__((availability(watchos,introduced=2.0))) +int disconnectx(int, sae_associd_t, sae_connid_t); +# 82 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 2 3 4 +# 301 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 3 4 +struct in_addr { + in_addr_t s_addr; +}; +# 374 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 3 4 +struct sockaddr_in { + __uint8_t sin_len; + sa_family_t sin_family; + in_port_t sin_port; + struct in_addr sin_addr; + char sin_zero[8]; +}; +# 396 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 3 4 +struct ip_opts { + struct in_addr ip_dst; + char ip_opts[40]; +}; +# 505 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 3 4 +struct ip_mreq { + struct in_addr imr_multiaddr; + struct in_addr imr_interface; +}; + + + + + + +struct ip_mreqn { + struct in_addr imr_multiaddr; + struct in_addr imr_address; + int imr_ifindex; +}; + +#pragma pack(4) + + + +struct ip_mreq_source { + struct in_addr imr_multiaddr; + struct in_addr imr_sourceaddr; + struct in_addr imr_interface; +}; + + + + + +struct group_req { + uint32_t gr_interface; + struct sockaddr_storage gr_group; +}; + +struct group_source_req { + uint32_t gsr_interface; + struct sockaddr_storage gsr_group; + struct sockaddr_storage gsr_source; +}; +# 553 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 3 4 +struct __msfilterreq { + uint32_t msfr_ifindex; + uint32_t msfr_fmode; + uint32_t msfr_nsrcs; + uint32_t __msfr_align; + struct sockaddr_storage msfr_group; + struct sockaddr_storage *msfr_srcs; +}; + + + +#pragma pack() +struct sockaddr; + + + + + + +int setipv4sourcefilter(int, struct in_addr, struct in_addr, uint32_t, + uint32_t, struct in_addr *) __attribute__((availability(macosx,introduced=10.7))); +int getipv4sourcefilter(int, struct in_addr, struct in_addr, uint32_t *, + uint32_t *, struct in_addr *) __attribute__((availability(macosx,introduced=10.7))); +int setsourcefilter(int, uint32_t, struct sockaddr *, socklen_t, + uint32_t, uint32_t, struct sockaddr_storage *) __attribute__((availability(macosx,introduced=10.7))); +int getsourcefilter(int, uint32_t, struct sockaddr *, socklen_t, + uint32_t *, uint32_t *, struct sockaddr_storage *) __attribute__((availability(macosx,introduced=10.7))); +# 616 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 3 4 +struct in_pktinfo { + unsigned int ipi_ifindex; + struct in_addr ipi_spec_dst; + struct in_addr ipi_addr; +}; +# 657 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet6/in6.h" 1 3 4 +# 153 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet6/in6.h" 3 4 +typedef struct in6_addr { + union { + __uint8_t __u6_addr8[16]; + __uint16_t __u6_addr16[8]; + __uint32_t __u6_addr32[4]; + } __u6_addr; +} in6_addr_t; +# 171 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet6/in6.h" 3 4 +struct sockaddr_in6 { + __uint8_t sin6_len; + sa_family_t sin6_family; + in_port_t sin6_port; + __uint32_t sin6_flowinfo; + struct in6_addr sin6_addr; + __uint32_t sin6_scope_id; +}; +# 214 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet6/in6.h" 3 4 +extern const struct in6_addr in6addr_any; +extern const struct in6_addr in6addr_loopback; + +extern const struct in6_addr in6addr_nodelocal_allnodes; +extern const struct in6_addr in6addr_linklocal_allnodes; +extern const struct in6_addr in6addr_linklocal_allrouters; +extern const struct in6_addr in6addr_linklocal_allv2routers; +# 538 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet6/in6.h" 3 4 +struct ipv6_mreq { + struct in6_addr ipv6mr_multiaddr; + unsigned int ipv6mr_interface; +}; + + + + +struct in6_pktinfo { + struct in6_addr ipi6_addr; + unsigned int ipi6_ifindex; +}; + + + + +struct ip6_mtuinfo { + struct sockaddr_in6 ip6m_addr; + uint32_t ip6m_mtu; +}; +# 635 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet6/in6.h" 3 4 +struct cmsghdr; + +extern int inet6_option_space(int); +extern int inet6_option_init(void *, struct cmsghdr **, int); +extern int inet6_option_append(struct cmsghdr *, const __uint8_t *, int, int); +extern __uint8_t *inet6_option_alloc(struct cmsghdr *, int, int, int); +extern int inet6_option_next(const struct cmsghdr *, __uint8_t **); +extern int inet6_option_find(const struct cmsghdr *, __uint8_t **, int); + +extern size_t inet6_rthdr_space(int, int); +extern struct cmsghdr *inet6_rthdr_init(void *, int); +extern int inet6_rthdr_add(struct cmsghdr *, const struct in6_addr *, + unsigned int); +extern int inet6_rthdr_lasthop(struct cmsghdr *, unsigned int); + + + +extern int inet6_rthdr_segments(const struct cmsghdr *); +extern struct in6_addr *inet6_rthdr_getaddr(struct cmsghdr *, int); +extern int inet6_rthdr_getflags(const struct cmsghdr *, int); + +extern int inet6_opt_init(void *, socklen_t); +extern int inet6_opt_append(void *, socklen_t, int, __uint8_t, socklen_t, + __uint8_t, void **); +extern int inet6_opt_finish(void *, socklen_t, int); +extern int inet6_opt_set_val(void *, int, void *, socklen_t); + +extern int inet6_opt_next(void *, socklen_t, int, __uint8_t *, socklen_t *, + void **); +extern int inet6_opt_find(void *, socklen_t, int, __uint8_t, socklen_t *, + void **); +extern int inet6_opt_get_val(void *, int, void *, socklen_t); +extern socklen_t inet6_rth_space(int, int); +extern void *inet6_rth_init(void *, socklen_t, int, int); +extern int inet6_rth_add(void *, const struct in6_addr *); +extern int inet6_rth_reverse(const void *, void *); +extern int inet6_rth_segments(const void *); +extern struct in6_addr *inet6_rth_getaddr(const void *, int); +# 658 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netinet/in.h" 2 3 4 + + + + + +int bindresvport(int, struct sockaddr_in *); +struct sockaddr; +int bindresvport_sa(int, struct sockaddr *); +# 92 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netdb.h" 2 3 4 +# 101 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netdb.h" 3 4 +extern int h_errno; +# 112 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netdb.h" 3 4 +struct hostent { + char *h_name; + char **h_aliases; + int h_addrtype; + int h_length; + char **h_addr_list; + + + +}; + + + + + +struct netent { + char *n_name; + char **n_aliases; + int n_addrtype; + uint32_t n_net; +}; + +struct servent { + char *s_name; + char **s_aliases; + int s_port; + char *s_proto; +}; + +struct protoent { + char *p_name; + char **p_aliases; + int p_proto; +}; + +struct addrinfo { + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + socklen_t ai_addrlen; + char *ai_canonname; + struct sockaddr *ai_addr; + struct addrinfo *ai_next; +}; + + +struct rpcent { + char *r_name; + char **r_aliases; + int r_number; +}; +# 264 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/netdb.h" 3 4 +void endhostent(void); +void endnetent(void); +void endprotoent(void); +void endservent(void); + +void freeaddrinfo(struct addrinfo *); +const char *gai_strerror(int); +int getaddrinfo(const char * restrict, const char * restrict, + const struct addrinfo * restrict, + struct addrinfo ** restrict); +struct hostent *gethostbyaddr(const void *, socklen_t, int); +struct hostent *gethostbyname(const char *); +struct hostent *gethostent(void); +int getnameinfo(const struct sockaddr * restrict, socklen_t, + char * restrict, socklen_t, char * restrict, + socklen_t, int); +struct netent *getnetbyaddr(uint32_t, int); +struct netent *getnetbyname(const char *); +struct netent *getnetent(void); +struct protoent *getprotobyname(const char *); +struct protoent *getprotobynumber(int); +struct protoent *getprotoent(void); +struct servent *getservbyname(const char *, const char *); +struct servent *getservbyport(int, const char *); +struct servent *getservent(void); +void sethostent(int); + +void setnetent(int); +void setprotoent(int); +void setservent(int); + + +void freehostent(struct hostent *); +struct hostent *gethostbyname2(const char *, int); +struct hostent *getipnodebyaddr(const void *, size_t, int, int *); +struct hostent *getipnodebyname(const char *, int, int, int *); +struct rpcent *getrpcbyname(const char *name); + +struct rpcent *getrpcbynumber(int number); + + + +struct rpcent *getrpcent(void); +void setrpcent(int stayopen); +void endrpcent(void); +void herror(const char *); +const char *hstrerror(int); +int innetgr(const char *, const char *, const char *, const char *); +int getnetgrent(char **, char **, char **); +void endnetgrent(void); +void setnetgrent(const char *); +# 45 "/usr/local/include/gmssl/socket.h" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arpa/inet.h" 1 3 4 +# 78 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/arpa/inet.h" 3 4 +in_addr_t inet_addr(const char *); +char * inet_ntoa(struct in_addr); +const char *inet_ntop(int, const void *, char *, socklen_t __size); +int inet_pton(int, const char *, void *); + + +int ascii2addr(int, const char *, void *); +char * addr2ascii(int, const void *, int __size, char *); +int inet_aton(const char *, struct in_addr *); +in_addr_t inet_lnaof(struct in_addr); +struct in_addr inet_makeaddr(in_addr_t, in_addr_t); +in_addr_t inet_netof(struct in_addr); +in_addr_t inet_network(const char *); +char * inet_net_ntop(int, const void *, int, char *, __darwin_size_t __size); +int inet_net_pton(int, const char *, void *, __darwin_size_t __size); +char * inet_neta(in_addr_t, char *, __darwin_size_t __size); +unsigned int inet_nsap_addr(const char *, unsigned char *, int __maxlen); +char * inet_nsap_ntoa(int __binlen, const unsigned char *, char *); +# 46 "/usr/local/include/gmssl/socket.h" 2 + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/select.h" 1 3 4 +# 114 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/select.h" 3 4 +int pselect(int, fd_set * restrict, fd_set * restrict, + fd_set * restrict, const struct timespec * restrict, + const sigset_t * restrict) + + + + +__asm("_" "pselect" ) + + + + +; + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_select.h" 1 3 4 +# 43 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_select.h" 3 4 +int select(int, fd_set * restrict, fd_set * restrict, + fd_set * restrict, struct timeval * restrict) + + + + + +__asm("_" "select" ) + + + + +; +# 132 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/select.h" 2 3 4 +# 49 "/usr/local/include/gmssl/socket.h" 2 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 1 3 4 +# 73 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/unistd.h" 1 3 4 +# 84 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/unistd.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_posix_vdisable.h" 1 3 4 +# 85 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/unistd.h" 2 3 4 +# 132 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/unistd.h" 3 4 +struct accessx_descriptor { + unsigned int ad_name_offset; + int ad_flags; + int ad_pad[2]; +}; +# 180 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/unistd.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 181 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/unistd.h" 2 3 4 + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 185 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/unistd.h" 2 3 4 + + + +int getattrlistbulk(int, void *, void *, size_t, uint64_t) __attribute__((availability(macosx,introduced=10.10))); +int getattrlistat(int, const char *, void *, void *, size_t, unsigned long) __attribute__((availability(macosx,introduced=10.10))); +int setattrlistat(int, const char *, void *, void *, size_t, uint32_t) __attribute__((availability(macosx,introduced=10.13))) __attribute__((availability(ios,introduced=11.0))) __attribute__((availability(tvos,introduced=11.0))) __attribute__((availability(watchos,introduced=4.0))); +ssize_t freadlink(int, char * restrict, size_t) __attribute__((availability(macos,introduced=13.0))) __attribute__((availability(ios,introduced=16.0))) __attribute__((availability(tvos,introduced=16.0))) __attribute__((availability(watchos,introduced=9.0))); +# 200 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/unistd.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 201 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/unistd.h" 2 3 4 + + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 206 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/unistd.h" 2 3 4 + + + +int faccessat(int, const char *, int, int) __attribute__((availability(macosx,introduced=10.10))); +int fchownat(int, const char *, uid_t, gid_t, int) __attribute__((availability(macosx,introduced=10.10))); +int linkat(int, const char *, int, const char *, int) __attribute__((availability(macosx,introduced=10.10))); +ssize_t readlinkat(int, const char *, char *, size_t) __attribute__((availability(macosx,introduced=10.10))); +int symlinkat(const char *, int, const char *) __attribute__((availability(macosx,introduced=10.10))); +int unlinkat(int, const char *, int) __attribute__((availability(macosx,introduced=10.10))); +# 74 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 2 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 75 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 2 3 4 +# 90 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_size_t.h" 1 3 4 +# 91 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 2 3 4 + + + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_null.h" 1 3 4 +# 95 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 2 3 4 +# 442 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 3 4 +void _exit(int) __attribute__((__noreturn__)); +int access(const char *, int); +unsigned int + alarm(unsigned int); +int chdir(const char *); +int chown(const char *, uid_t, gid_t); + +int close(int) __asm("_" "close" ); + +int dup(int); +int dup2(int, int); +int execl(const char * __path, const char * __arg0, ...) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +int execle(const char * __path, const char * __arg0, ...) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +int execlp(const char * __file, const char * __arg0, ...) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +int execv(const char * __path, char * const * __argv) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +int execve(const char * __file, char * const * __argv, char * const * __envp) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +int execvp(const char * __file, char * const * __argv) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +pid_t fork(void) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +long fpathconf(int, int); +char * getcwd(char *, size_t __size); +gid_t getegid(void); +uid_t geteuid(void); +gid_t getgid(void); + + + +int getgroups(int __gidsetsize, gid_t []); + +char * getlogin(void); +pid_t getpgrp(void); +pid_t getpid(void); +pid_t getppid(void); +uid_t getuid(void); +int isatty(int); +int link(const char *, const char *); +off_t lseek(int, off_t, int); +long pathconf(const char *, int); + +int pause(void) __asm("_" "pause" ); + +int pipe(int [2]); + +ssize_t read(int, void *, size_t __nbyte) __asm("_" "read" ); + +int rmdir(const char *); +int setgid(gid_t); +int setpgid(pid_t, pid_t); +pid_t setsid(void); +int setuid(uid_t); + +unsigned int + sleep(unsigned int) __asm("_" "sleep" ); + +long sysconf(int); +pid_t tcgetpgrp(int); +int tcsetpgrp(int, pid_t); +char * ttyname(int); + + +int ttyname_r(int, char *, size_t __len) __asm("_" "ttyname_r" ); + + + + +int unlink(const char *); + +ssize_t write(int __fd, const void * __buf, size_t __nbyte) __asm("_" "write" ); +# 519 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 3 4 +size_t confstr(int, char *, size_t __len) __asm("_" "confstr" ); + +int getopt(int __argc, char * const [], const char *) __asm("_" "getopt" ); + +extern char *optarg; +extern int optind, opterr, optopt; +# 552 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 3 4 +__attribute__((__deprecated__)) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))) + +void * brk(const void *); +int chroot(const char *) ; + + +char * crypt(const char *, const char *); + +void encrypt(char *, int) __asm("_" "encrypt" ); + + + +int fchdir(int); +long gethostid(void); +pid_t getpgid(pid_t); +pid_t getsid(pid_t); + + + +int getdtablesize(void) ; +int getpagesize(void) __attribute__((__const__)) ; +char * getpass(const char *) ; + + + + +char * getwd(char *) ; + + +int lchown(const char *, uid_t, gid_t) __asm("_" "lchown" ); + +int lockf(int, int, off_t) __asm("_" "lockf" ); + +int nice(int) __asm("_" "nice" ); + +ssize_t pread(int __fd, void * __buf, size_t __nbyte, off_t __offset) __asm("_" "pread" ); + +ssize_t pwrite(int __fd, const void * __buf, size_t __nbyte, off_t __offset) __asm("_" "pwrite" ); + + + + + + +__attribute__((__deprecated__)) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))) + +void * sbrk(int); + + + +pid_t setpgrp(void) __asm("_" "setpgrp" ); + + + + +int setregid(gid_t, gid_t) __asm("_" "setregid" ); + +int setreuid(uid_t, uid_t) __asm("_" "setreuid" ); + +void swab(const void * restrict , void * restrict , ssize_t __nbytes); +void sync(void); +int truncate(const char *, off_t); +useconds_t ualarm(useconds_t, useconds_t); +int usleep(useconds_t) __asm("_" "usleep" ); + + +__attribute__((__deprecated__("Use posix_spawn or fork"))) + +pid_t vfork(void) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); + + +int fsync(int) __asm("_" "fsync" ); + +int ftruncate(int, off_t); +int getlogin_r(char *, size_t __namelen); +# 639 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 3 4 +int fchown(int, uid_t, gid_t); +int gethostname(char *, size_t __namelen); +ssize_t readlink(const char * restrict, char * restrict, size_t __bufsize); +int setegid(gid_t); +int seteuid(uid_t); +int symlink(const char *, const char *); +# 657 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_uuid_t.h" 1 3 4 +# 31 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/_types/_uuid_t.h" 3 4 +typedef __darwin_uuid_t uuid_t; +# 658 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 2 3 4 + + +void _Exit(int) __attribute__((__noreturn__)); +int accessx_np(const struct accessx_descriptor *, size_t __sz, int *, uid_t); +int acct(const char *); +int add_profil(char *, size_t __bufsiz, unsigned long, unsigned int) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +void endusershell(void); +int execvP(const char * __file, const char * __searchpath, char * const * __argv) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +char * fflagstostr(unsigned long); +int getdomainname(char *, int __namelen); +int getgrouplist(const char *, int, int *, int *__ngroups); + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/gethostuuid.h" 1 3 4 +# 35 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/gethostuuid.h" 3 4 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/Availability.h" 1 3 4 +# 36 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/gethostuuid.h" 2 3 4 + + + + + +int gethostuuid(uuid_t, const struct timespec *) __attribute__((availability(macos,introduced=10.5))) __attribute__((availability(ios,unavailable))) __attribute__((availability(tvos,unavailable))) __attribute__((availability(watchos,unavailable))); +# 671 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 2 3 4 + +mode_t getmode(const void *, mode_t); +int getpeereid(int, uid_t *, gid_t *); +int getsgroups_np(int *, uuid_t); +char * getusershell(void); +int getwgroups_np(int *, uuid_t); +int initgroups(const char *, int); +int issetugid(void); +char * mkdtemp(char *); +int mknod(const char *, mode_t, dev_t); +int mkpath_np(const char *path, mode_t omode) __attribute__((availability(macosx,introduced=10.8))); +int mkpathat_np(int dfd, const char *path, mode_t omode) + __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) + __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))); +int mkstemp(char *); +int mkstemps(char *, int); +char * mktemp(char *); +int mkostemp(char * path, int oflags) + __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) + __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))); +int mkostemps(char * path, int slen, int oflags) + __attribute__((availability(macosx,introduced=10.12))) __attribute__((availability(ios,introduced=10.0))) + __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))); + +int mkstemp_dprotected_np(char * path, int dpclass, int dpflags) + __attribute__((availability(macosx,unavailable))) __attribute__((availability(ios,introduced=10.0))) + __attribute__((availability(tvos,introduced=10.0))) __attribute__((availability(watchos,introduced=3.0))); +char * mkdtempat_np(int dfd, char * path) + __attribute__((availability(macosx,introduced=10.13))) __attribute__((availability(ios,introduced=11.0))) + __attribute__((availability(tvos,introduced=11.0))) __attribute__((availability(watchos,introduced=4.0))); +int mkstempsat_np(int dfd, char * path, int slen) + __attribute__((availability(macosx,introduced=10.13))) __attribute__((availability(ios,introduced=11.0))) + __attribute__((availability(tvos,introduced=11.0))) __attribute__((availability(watchos,introduced=4.0))); +int mkostempsat_np(int dfd, char * path, int slen, int oflags) + __attribute__((availability(macosx,introduced=10.13))) __attribute__((availability(ios,introduced=11.0))) + __attribute__((availability(tvos,introduced=11.0))) __attribute__((availability(watchos,introduced=4.0))); +int nfssvc(int, void *); +int profil(char *, size_t __bufsiz, unsigned long, unsigned int); + +__attribute__((__deprecated__("Use of per-thread security contexts is error-prone and discouraged."))) +int pthread_setugid_np(uid_t, gid_t); +int pthread_getugid_np(uid_t *, gid_t *); + +int reboot(int); +int revoke(const char *); + +__attribute__((__deprecated__)) int rcmd(char * *, int, const char *, const char *, const char *, int *); +__attribute__((__deprecated__)) int rcmd_af(char * *, int, const char *, const char *, const char *, int *, + int); +__attribute__((__deprecated__)) int rresvport(int *); +__attribute__((__deprecated__)) int rresvport_af(int *, int); +__attribute__((__deprecated__)) int iruserok(unsigned long, int, const char *, const char *); +__attribute__((__deprecated__)) int iruserok_sa(const void *, int, int, const char *, const char *); +__attribute__((__deprecated__)) int ruserok(const char *, int, const char *, const char *); + +int setdomainname(const char *, int __namelen); +int setgroups(int, const gid_t *); +void sethostid(long); +int sethostname(const char *, int __namelen); + +void setkey(const char *) __asm("_" "setkey" ); + + + +int setlogin(const char *); +void *setmode(const char *) __asm("_" "setmode" ); +int setrgid(gid_t); +int setruid(uid_t); +int setsgroups_np(int, const uuid_t); +void setusershell(void); +int setwgroups_np(int, const uuid_t); +int strtofflags(char * *, unsigned long *, unsigned long *); +int swapon(const char *); +int ttyslot(void); +int undelete(const char *); +int unwhiteout(const char *); +void * valloc(size_t __size); + +__attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))) +__attribute__((availability(ios,deprecated=10.0,message="syscall(2) is unsupported; " "please switch to a supported interface. For SYS_kdebug_trace use kdebug_signpost()."))) + +__attribute__((availability(macosx,deprecated=10.12,message="syscall(2) is unsupported; " "please switch to a supported interface. For SYS_kdebug_trace use kdebug_signpost()."))) + +int syscall(int, ...); + +extern char *suboptarg; +int getsubopt(char * *, char * const *, char * *); + + + +int fgetattrlist(int,void*,void *,size_t __attrBufSize,unsigned int) __attribute__((availability(macosx,introduced=10.6))); +int fsetattrlist(int,void*,void *,size_t __attrBufSize,unsigned int) __attribute__((availability(macosx,introduced=10.6))); +int getattrlist(const char*,void*,void *,size_t __attrBufSize,unsigned int) __asm("_" "getattrlist" ); +int setattrlist(const char*,void*,void *,size_t __attrBufSize,unsigned int) __asm("_" "setattrlist" ); +int exchangedata(const char*,const char*,unsigned int) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +int getdirentriesattr(int,void*,void *,size_t __attrBufSize,unsigned int*,unsigned int*,unsigned int*,unsigned int) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +# 781 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h" 3 4 +struct fssearchblock; +struct searchstate; + +int searchfs(const char *, struct fssearchblock *, unsigned long *, unsigned int, unsigned int, struct searchstate *) __attribute__((availability(watchos,unavailable))) __attribute__((availability(tvos,unavailable))); +int fsctl(const char *,unsigned long,void *,unsigned int); +int ffsctl(int,unsigned long,void *,unsigned int) __attribute__((availability(macosx,introduced=10.6))); + + + + +int fsync_volume_np(int, int) __attribute__((availability(macosx,introduced=10.8))); +int sync_volume_np(const char *, int) __attribute__((availability(macosx,introduced=10.8))); + +extern int optreset; +# 51 "/usr/local/include/gmssl/socket.h" 2 + +typedef int tls_socket_t; +typedef ssize_t tls_ret_t; +typedef socklen_t tls_socklen_t; +# 64 "/usr/local/include/gmssl/socket.h" +int tls_socket_lib_init(void); +int tls_socket_lib_cleanup(void); +int tls_socket_create(tls_socket_t *sock, int af, int type, int protocl); +int tls_socket_connect(tls_socket_t sock, const struct sockaddr_in *addr); +int tls_socket_bind(tls_socket_t sock, const struct sockaddr_in *addr); +int tls_socket_listen(tls_socket_t sock, int backlog); +int tls_socket_accept(tls_socket_t sock, struct sockaddr_in *addr, tls_socket_t *conn_sock); +# 23 "/usr/local/include/gmssl/tls.h" 2 + + + + + + + + +typedef uint32_t uint24_t; + + + + + +void tls_uint8_to_bytes(uint8_t a, uint8_t **out, size_t *outlen); +void tls_uint16_to_bytes(uint16_t a, uint8_t **out, size_t *outlen); +void tls_uint24_to_bytes(uint24_t a, uint8_t **out, size_t *outlen); +void tls_uint32_to_bytes(uint32_t a, uint8_t **out, size_t *outlen); +void tls_array_to_bytes(const uint8_t *data, size_t len, uint8_t **out, size_t *outlen); +void tls_uint8array_to_bytes(const uint8_t *data, size_t datalen, uint8_t **out, size_t *outlen); +void tls_uint16array_to_bytes(const uint8_t *data, size_t datalen, uint8_t **out, size_t *outlen); +void tls_uint24array_to_bytes(const uint8_t *data, size_t datalen, uint8_t **out, size_t *outlen); +int tls_uint8_from_bytes(uint8_t *a, const uint8_t **in, size_t *inlen); +int tls_uint16_from_bytes(uint16_t *a, const uint8_t **in, size_t *inlen); +int tls_uint24_from_bytes(uint24_t *a, const uint8_t **in, size_t *inlen); +int tls_uint32_from_bytes(uint32_t *a, const uint8_t **in, size_t *inlen); +int tls_array_from_bytes(const uint8_t **data, size_t datalen, const uint8_t **in, size_t *inlen); +int tls_uint8array_from_bytes(const uint8_t **data, size_t *datalen, const uint8_t **in, size_t *inlen); +int tls_uint16array_from_bytes(const uint8_t **data, size_t *datalen, const uint8_t **in, size_t *inlen); +int tls_uint24array_from_bytes(const uint8_t **data, size_t *datalen, const uint8_t **in, size_t *inlen); +int tls_length_is_zero(size_t len); + + +typedef enum { + TLS_protocol_tlcp = 0x0101, + TLS_protocol_ssl2 = 0x0002, + TLS_protocol_ssl3 = 0x0300, + TLS_protocol_tls1 = 0x0301, + TLS_protocol_tls11 = 0x0302, + TLS_protocol_tls12 = 0x0303, + TLS_protocol_tls13 = 0x0304, + TLS_protocol_dtls1 = 0xfeff, + TLS_protocol_dtls12 = 0xfefd, +} TLS_PROTOCOL; + +const char *tls_protocol_name(int proto); + + +typedef enum { + TLS_cipher_null_with_null_null = 0x0000, + + + TLS_cipher_sm4_gcm_sm3 = 0x00c6, + TLS_cipher_sm4_ccm_sm3 = 0x00c7, + + + TLS_cipher_ecdhe_sm4_cbc_sm3 = 0xe011, + TLS_cipher_ecdhe_sm4_gcm_sm3 = 0xe051, + TLS_cipher_ecc_sm4_cbc_sm3 = 0xe013, + TLS_cipher_ecc_sm4_gcm_sm3 = 0xe053, + TLS_cipher_ibsdh_sm4_cbc_sm3 = 0xe015, + TLS_cipher_ibsdh_sm4_gcm_sm3 = 0xe055, + TLS_cipher_ibc_sm4_cbc_sm3 = 0xe017, + TLS_cipher_ibc_sm4_gcm_sm3 = 0xe057, + TLS_cipher_rsa_sm4_cbc_sm3 = 0xe019, + TLS_cipher_rsa_sm4_gcm_sm3 = 0xe059, + TLS_cipher_rsa_sm4_cbc_sha256 = 0xe01c, + TLS_cipher_rsa_sm4_gcm_sha256 = 0xe05a, + + + TLS_cipher_aes_128_gcm_sha256 = 0x1301, + TLS_cipher_aes_256_gcm_sha384 = 0x1302, + TLS_cipher_chacha20_poly1305_sha256 = 0x1303, + TLS_cipher_aes_128_ccm_sha256 = 0x1304, + TLS_cipher_aes_128_ccm_8_sha256 = 0x1305, + + TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256 = 0xc023, + + TLS_cipher_empty_renegotiation_info_scsv = 0x00ff, +} TLS_CIPHER_SUITE; + +const char *tls_cipher_suite_name(int cipher); +int tls_cipher_suites_select(const uint8_t *client_ciphers, size_t client_ciphers_len, + const int *server_ciphers, size_t server_ciphers_cnt, int *selected_cipher); +int tls_cipher_suite_in_list(int cipher, const int *list, size_t list_count); + + +typedef enum { + TLS_compression_null = 0, + TLS_compression_default = 1, +} TLS_COMPRESSION_METHOD; + +const char *tls_compression_method_name(int meth); + + +typedef enum { + TLS_record_invalid = 0, + TLS_record_change_cipher_spec = 20, + TLS_record_alert = 21, + TLS_record_handshake = 22, + TLS_record_application_data = 23, + TLS_record_heartbeat = 24, + TLS_record_tls12_cid = 25, +} TLS_RECORD_TYPE; + +const char *tls_record_type_name(int type); + + +typedef enum { + TLS_handshake_hello_request = 0, + TLS_handshake_client_hello = 1, + TLS_handshake_server_hello = 2, + TLS_handshake_hello_verify_request = 3, + TLS_handshake_new_session_ticket = 4, + TLS_handshake_end_of_early_data = 5, + TLS_handshake_hello_retry_request = 6, + TLS_handshake_encrypted_extensions = 8, + TLS_handshake_certificate = 11, + TLS_handshake_server_key_exchange = 12, + TLS_handshake_certificate_request = 13, + TLS_handshake_server_hello_done = 14, + TLS_handshake_certificate_verify = 15, + TLS_handshake_client_key_exchange = 16, + TLS_handshake_finished = 20, + TLS_handshake_certificate_url = 21, + TLS_handshake_certificate_status = 22, + TLS_handshake_supplemental_data = 23, + TLS_handshake_key_update = 24, + TLS_handshake_compressed_certificate = 25, + TLS_handshake_ekt_key = 26, + TLS_handshake_message_hash = 254, +} TLS_HANDSHAKE_TYPE; + +const char *tls_handshake_type_name(int type); + + +typedef enum { + TLS_cert_type_rsa_sign = 1, + TLS_cert_type_dss_sign = 2, + TLS_cert_type_rsa_fixed_dh = 3, + TLS_cert_type_dss_fixed_dh = 4, + TLS_cert_type_rsa_ephemeral_dh_RESERVED = 5, + TLS_cert_type_dss_ephemeral_dh_RESERVED = 6, + TLS_cert_type_fortezza_dms_RESERVED = 20, + TLS_cert_type_ecdsa_sign = 64, + TLS_cert_type_rsa_fixed_ecdh = 65, + TLS_cert_type_ecdsa_fixed_ecdh = 66, + TLS_cert_type_gost_sign256 = 67, + TLS_cert_type_gost_sign512 = 68, + TLS_cert_type_ibc_params = 80, +} TLS_CERTIFICATE_TYPE; + +const char *tls_cert_type_name(int type); +int tls_cert_type_from_oid(int oid); + +typedef enum { + TLS_extension_server_name = 0, + TLS_extension_max_fragment_length = 1, + TLS_extension_client_certificate_url = 2, + TLS_extension_trusted_ca_keys = 3, + TLS_extension_truncated_hmac = 4, + TLS_extension_status_request = 5, + TLS_extension_user_mapping = 6, + TLS_extension_client_authz = 7, + TLS_extension_server_authz = 8, + TLS_extension_cert_type = 9, + TLS_extension_supported_groups = 10, + TLS_extension_ec_point_formats = 11, + TLS_extension_srp = 12, + TLS_extension_signature_algorithms = 13, + TLS_extension_use_srtp = 14, + TLS_extension_heartbeat = 15, + TLS_extension_application_layer_protocol_negotiation= 16, + TLS_extension_status_request_v2 = 17, + TLS_extension_signed_certificate_timestamp = 18, + TLS_extension_client_certificate_type = 19, + TLS_extension_server_certificate_type = 20, + TLS_extension_padding = 21, + TLS_extension_encrypt_then_mac = 22, + TLS_extension_extended_master_secret = 23, + TLS_extension_token_binding = 24, + TLS_extension_cached_info = 25, + TLS_extension_tls_lts = 26, + TLS_extension_compress_certificate = 27, + TLS_extension_record_size_limit = 28, + TLS_extension_pwd_protect = 29, + TLS_extension_pwd_clear = 30, + TLS_extension_password_salt = 31, + TLS_extension_ticket_pinning = 32, + TLS_extension_tls_cert_with_extern_psk = 33, + TLS_extension_delegated_credentials = 34, + TLS_extension_session_ticket = 35, + TLS_extension_TLMSP = 36, + TLS_extension_TLMSP_proxying = 37, + TLS_extension_TLMSP_delegate = 38, + TLS_extension_supported_ekt_ciphers = 39, + TLS_extension_pre_shared_key = 41, + TLS_extension_early_data = 42, + TLS_extension_supported_versions = 43, + TLS_extension_cookie = 44, + TLS_extension_psk_key_exchange_modes = 46, + TLS_extension_certificate_authorities = 47, + TLS_extension_oid_filters = 48, + TLS_extension_post_handshake_auth = 49, + TLS_extension_signature_algorithms_cert = 50, + TLS_extension_key_share = 51, + TLS_extension_transparency_info = 52, + TLS_extension_connection_id = 53, + TLS_extension_external_id_hash = 55, + TLS_extension_external_session_id = 56, + TLS_extension_quic_transport_parameters = 57, + TLS_extension_ticket_request = 58, + TLS_extension_renegotiation_info = 65281, +} TLS_EXTENSION_TYPE; + +const char *tls_extension_name(int ext); + + +typedef enum { + TLS_point_uncompressed = 0, + TLS_point_ansix962_compressed_prime = 1, + TLS_point_ansix962_compressed_char2 = 2, +} TLS_EC_POINT_FORMAT; + +const char *tls_ec_point_format_name(int format); + + +typedef enum { + TLS_curve_type_explicit_prime = 1, + TLS_curve_type_explicit_char2 = 2, + TLS_curve_type_named_curve = 3, +} TLS_CURVE_TYPE; + +const char *tls_curve_type_name(int type); + + +typedef enum { + TLS_curve_secp256k1 = 22, + TLS_curve_secp256r1 = 23, + TLS_curve_secp384r1 = 24, + TLS_curve_secp521r1 = 25, + TLS_curve_brainpoolp256r1 = 26, + TLS_curve_brainpoolp384r1 = 27, + TLS_curve_brainpoolp512r1 = 28, + TLS_curve_x25519 = 29, + TLS_curve_x448 = 30, + TLS_curve_brainpoolp256r1tls13 = 31, + TLS_curve_brainpoolp384r1tls13 = 32, + TLS_curve_brainpoolp512r1tls13 = 33, + TLS_curve_sm2p256v1 = 41, +} TLS_NAMED_CURVE; + +const char *tls_named_curve_name(int named_curve); +int tls_named_curve_oid(int named_curve); + + +typedef enum { + TLS_sig_rsa_pkcs1_sha1 = 0x0201, + TLS_sig_ecdsa_sha1 = 0x0203, + TLS_sig_rsa_pkcs1_sha256 = 0x0401, + TLS_sig_ecdsa_secp256r1_sha256 = 0x0403, + TLS_sig_rsa_pkcs1_sha256_legacy = 0x0420, + TLS_sig_rsa_pkcs1_sha384 = 0x0501, + TLS_sig_ecdsa_secp384r1_sha384 = 0x0503, + TLS_sig_rsa_pkcs1_sha384_legacy = 0x0520, + TLS_sig_rsa_pkcs1_sha512 = 0x0601, + TLS_sig_ecdsa_secp521r1_sha512 = 0x0603, + TLS_sig_rsa_pkcs1_sha512_legacy = 0x0620, + TLS_sig_sm2sig_sm3 = 0x0708, + TLS_sig_rsa_pss_rsae_sha256 = 0x0804, + TLS_sig_rsa_pss_rsae_sha384 = 0x0805, + TLS_sig_rsa_pss_rsae_sha512 = 0x0806, + TLS_sig_ed25519 = 0x0807, + TLS_sig_ed448 = 0x0808, + TLS_sig_rsa_pss_pss_sha256 = 0x0809, + TLS_sig_rsa_pss_pss_sha384 = 0x080A, + TLS_sig_rsa_pss_pss_sha512 = 0x080B, + TLS_sig_ecdsa_brainpoolP256r1tls13_sha256 = 0x081A, + TLS_sig_ecdsa_brainpoolP384r1tls13_sha384 = 0x081B, + TLS_sig_ecdsa_brainpoolP512r1tls13_sha512 = 0x081C, +} TLS_SIGNATURE_SCHEME; + +const char *tls_signature_scheme_name(int scheme); +int tls_signature_scheme_match_cipher_suite(int sig_alg, int cipher_suite); + + +typedef enum { + TLS_change_cipher_spec = 1, +} TLS_CHANGE_CIPHER_SPEC_TYPE; + + +typedef enum { + TLS_alert_level_undefined = 0, + TLS_alert_level_warning = 1, + TLS_alert_level_fatal = 2, +} TLS_ALERT_LEVEL; + +const char *tls_alert_level_name(int level); + + +typedef enum { + TLS_alert_close_notify = 0, + TLS_alert_unexpected_message = 10, + TLS_alert_bad_record_mac = 20, + TLS_alert_decryption_failed = 21, + TLS_alert_record_overflow = 22, + TLS_alert_decompression_failure = 30, + TLS_alert_handshake_failure = 40, + TLS_alert_no_certificate = 41, + TLS_alert_bad_certificate = 42, + TLS_alert_unsupported_certificate = 43, + TLS_alert_certificate_revoked = 44, + TLS_alert_certificate_expired = 45, + TLS_alert_certificate_unknown = 46, + TLS_alert_illegal_parameter = 47, + TLS_alert_unknown_ca = 48, + TLS_alert_access_denied = 49, + TLS_alert_decode_error = 50, + TLS_alert_decrypt_error = 51, + TLS_alert_export_restriction = 60, + TLS_alert_protocol_version = 70, + TLS_alert_insufficient_security = 71, + TLS_alert_internal_error = 80, + TLS_alert_user_canceled = 90, + TLS_alert_no_renegotiation = 100, + TLS_alert_unsupported_extension = 110, + TLS_alert_unsupported_site2site = 200, + TLS_alert_no_area = 201, + TLS_alert_unsupported_areatype = 202, + TLS_alert_bad_ibcparam = 203, + TLS_alert_unsupported_ibcparam = 204, + TLS_alert_identity_need = 205, +} TLS_ALERT_DESCRIPTION; + +const char *tls_alert_description_text(int description); + + +int tls_prf(const uint8_t *secret, size_t secretlen, const char *label, + const uint8_t *seed, size_t seedlen, + const uint8_t *more, size_t morelen, + size_t outlen, uint8_t *out); +int tls13_hkdf_extract(const DIGEST *digest, const uint8_t salt[32], const uint8_t in[32], uint8_t out[32]); +int tls13_hkdf_expand_label(const DIGEST *digest, const uint8_t secret[32], + const char *label, const uint8_t *context, size_t context_len, + size_t outlen, uint8_t *out); +int tls13_derive_secret(const uint8_t secret[32], const char *label, const DIGEST_CTX *dgst_ctx, uint8_t out[32]); + +int tls_cbc_encrypt(const SM3_HMAC_CTX *hmac_ctx, const SM4_KEY *enc_key, + const uint8_t seq_num[8], const uint8_t header[5], + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int tls_cbc_decrypt(const SM3_HMAC_CTX *hmac_ctx, const SM4_KEY *dec_key, + const uint8_t seq_num[8], const uint8_t header[5], + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int tls_record_encrypt(const SM3_HMAC_CTX *hmac_ctx, const SM4_KEY *cbc_key, + const uint8_t seq_num[8], const uint8_t *in, size_t inlen, + uint8_t *out, size_t *outlen); +int tls_record_decrypt(const SM3_HMAC_CTX *hmac_ctx, const SM4_KEY *cbc_key, + const uint8_t seq_num[8], const uint8_t *in, size_t inlen, + uint8_t *out, size_t *outlen); + +int tls_seq_num_incr(uint8_t seq_num[8]); +int tls_random_generate(uint8_t random[32]); +int tls_random_print(FILE *fp, const uint8_t random[32], int format, int indent); +int tls_pre_master_secret_generate(uint8_t pre_master_secret[48], int protocol); +int tls_pre_master_secret_print(FILE *fp, const uint8_t pre_master_secret[48], int format, int indent); + +int tls_secrets_print(FILE *fp, + const uint8_t *pre_master_secret, size_t pre_master_secret_len, + const uint8_t client_random[32], const uint8_t server_random[32], + const uint8_t master_secret[48], + const uint8_t *key_block, size_t key_block_len, + int format, int indent); + + +typedef struct { + uint8_t type; + uint8_t protocol[2]; + uint8_t data_length[2]; +} TLS_RECORD_HEADER; +# 416 "/usr/local/include/gmssl/tls.h" +int tls_record_set_type(uint8_t *record, int type); +int tls_record_set_protocol(uint8_t *record, int protocol); +int tls_record_set_data_length(uint8_t *record, size_t length); +int tls_record_set_data(uint8_t *record, const uint8_t *data, size_t datalen); + + + + +int tls_record_print(FILE *fp, const uint8_t *record, size_t recordlen, int format, int indent); +int tlcp_record_print(FILE *fp, const uint8_t *record, size_t recordlen, int format, int indent); + +int tls_record_send(const uint8_t *record, size_t recordlen, tls_socket_t sock); +int tls_record_recv(uint8_t *record, size_t *recordlen, tls_socket_t sock); +int tls12_record_recv(uint8_t *record, size_t *recordlen, tls_socket_t sock); + + + +typedef struct { + uint8_t type; + uint8_t length[3]; +} TLS_HANDSHAKE_HEADER; +# 445 "/usr/local/include/gmssl/tls.h" +int tls_record_set_handshake(uint8_t *record, size_t *recordlen, + int type, const uint8_t *data, size_t datalen); +int tls_record_get_handshake(const uint8_t *record, + int *type, const uint8_t **data, size_t *datalen); +int tls_handshake_print(FILE *fp, const uint8_t *handshake, size_t handshakelen, int format, int indent); + + +int tls_hello_request_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); + + + + + +int tls_record_set_handshake_client_hello(uint8_t *record, size_t *recordlen, + int client_protocol, const uint8_t random[32], + const uint8_t *session_id, size_t session_id_len, + const int *cipher_suites, size_t cipher_suites_count, + const uint8_t *exts, size_t exts_len); +int tls_record_get_handshake_client_hello(const uint8_t *record, + int *client_protocol, const uint8_t **random, + const uint8_t **session_id, size_t *session_id_len, + const uint8_t **cipher_suites, size_t *cipher_suites_len, + const uint8_t **exts, size_t *exts_len); +int tls_client_hello_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); + +int tls_record_set_handshake_server_hello(uint8_t *record, size_t *recordlen, + int server_protocol, const uint8_t random[32], + const uint8_t *session_id, size_t session_id_len, + int cipher_suite, const uint8_t *exts, size_t exts_len); +int tls_record_get_handshake_server_hello(const uint8_t *record, + int *protocol, const uint8_t **random, const uint8_t **session_id, size_t *session_id_len, + int *cipher_suite, const uint8_t **exts, size_t *exts_len); +int tls_server_hello_print(FILE *fp, const uint8_t *server_hello, size_t len, int format, int indent); + + +int tls_ec_point_formats_ext_to_bytes(const int *formats, size_t formats_cnt, + uint8_t **out, size_t *outlen); +int tls_process_client_ec_point_formats(const uint8_t *ext_data, size_t ext_datalen, + uint8_t **out, size_t *outlen); +int tls_process_server_ec_point_formats(const uint8_t *ext_data, size_t ext_datalen); + +int tls_supported_groups_ext_to_bytes(const int *groups, size_t groups_cnt, + uint8_t **out, size_t *outlen); +int tls_process_client_supported_groups(const uint8_t *ext_data, size_t ext_datalen, + uint8_t **out, size_t *outlen); +int tls_process_server_supported_groups(const uint8_t *ext_data, size_t ext_datalen); + +int tls_signature_algorithms_ext_to_bytes_ex(int ext_type, const int *algs, size_t algs_cnt, + uint8_t **out, size_t *outlen); +int tls_signature_algorithms_ext_to_bytes(const int *algs, size_t algs_cnt, + uint8_t **out, size_t *outlen); +int tls13_signature_algorithms_cert_ext_to_bytes(const int *algs, size_t algs_cnt, + uint8_t **out, size_t *outlen); +int tls_process_client_signature_algorithms(const uint8_t *ext_data, size_t ext_datalen, + uint8_t **out, size_t *outlen); +int tls_process_server_signature_algors(const uint8_t *ext_data, size_t ext_datalen); + +int tls13_supported_versions_ext_to_bytes(int handshake_type, const int *protos, size_t protos_cnt, + uint8_t **out, size_t *outlen); +int tls13_process_client_supported_versions(const uint8_t *ext_data, size_t ext_datalen, + uint8_t **out, size_t *outlen); + +int tls13_process_server_supported_versions(const uint8_t *ext_data, size_t ext_datalen); + +int tls13_key_share_entry_to_bytes(const SM2_Z256_POINT *point, uint8_t **out, size_t *outlen); +int tls13_client_key_share_ext_to_bytes(const SM2_Z256_POINT *point, uint8_t **out, size_t *outlen); +int tls13_server_key_share_ext_to_bytes(const SM2_Z256_POINT *point, uint8_t **out, size_t *outlen); +int tls13_process_client_key_share(const uint8_t *ext_data, size_t ext_datalen, + const SM2_KEY *server_ecdhe_key, SM2_Z256_POINT *client_ecdhe_public, + uint8_t **out, size_t *outlen); +int tls13_process_server_key_share(const uint8_t *ext_data, size_t ext_datalen, SM2_Z256_POINT *point); + + +int tls13_certificate_authorities_ext_to_bytes(const uint8_t *ca_names, size_t ca_names_len, + uint8_t **out, size_t *outlen); + +int tls_ext_from_bytes(int *type, const uint8_t **data, size_t *datalen, const uint8_t **in, size_t *inlen); +int tls_process_client_exts(const uint8_t *exts, size_t extslen, uint8_t *out, size_t *outlen, size_t maxlen); +int tls_process_server_exts(const uint8_t *exts, size_t extslen, + int *ec_point_format, int *supported_group, int *signature_algor); + + + +int tls_record_set_handshake_certificate(uint8_t *record, size_t *recordlen, + const uint8_t *certs, size_t certslen); + + +int tls_record_get_handshake_certificate(const uint8_t *record, uint8_t *certs, size_t *certslen); + + +int tls_server_key_exchange_print(FILE *fp, const uint8_t *ske, size_t skelen, int format, int indent); + + +int tls_sign_server_ecdh_params(const SM2_KEY *server_sign_key, + const uint8_t client_random[32], const uint8_t server_random[32], + int curve, const SM2_Z256_POINT *point, uint8_t *sig, size_t *siglen); +int tls_verify_server_ecdh_params(const SM2_KEY *server_sign_key, + const uint8_t client_random[32], const uint8_t server_random[32], + int curve, const SM2_Z256_POINT *point, const uint8_t *sig, size_t siglen); +int tls_record_set_handshake_server_key_exchange_ecdhe(uint8_t *record, size_t *recordlen, + int curve, const SM2_Z256_POINT *point, const uint8_t *sig, size_t siglen); +int tls_record_get_handshake_server_key_exchange_ecdhe(const uint8_t *record, + int *curve, SM2_Z256_POINT *point, const uint8_t **sig, size_t *siglen); +int tls_server_key_exchange_ecdhe_print(FILE *fp, const uint8_t *data, size_t datalen, + int format, int indent); + +int tlcp_record_set_handshake_server_key_exchange_pke(uint8_t *record, size_t *recordlen, + const uint8_t *sig, size_t siglen); +int tlcp_record_get_handshake_server_key_exchange_pke(const uint8_t *record, + const uint8_t **sig, size_t *siglen); +int tlcp_server_key_exchange_pke_print(FILE *fp, const uint8_t *sig, size_t siglen, int format, int indent); + + + + + + + +int tls_authorities_from_certs(uint8_t *ca_names, size_t *ca_names_len, size_t maxlen, const uint8_t *certs, size_t certslen); +int tls_authorities_issued_certificate(const uint8_t *ca_names, size_t ca_namelen, const uint8_t *certs, size_t certslen); +int tls_cert_types_accepted(const uint8_t *types, size_t types_len, const uint8_t *client_certs, size_t client_certs_len); + +int tls_record_set_handshake_certificate_request(uint8_t *record, size_t *recordlen, + const uint8_t *cert_types, size_t cert_types_len, + const uint8_t *ca_names, size_t ca_names_len); +int tls_record_get_handshake_certificate_request(const uint8_t *record, + const uint8_t **cert_types, size_t *cert_types_len, + const uint8_t **ca_names, size_t *ca_names_len); +int tls_certificate_request_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); + + + +int tls_record_set_handshake_server_hello_done(uint8_t *record, size_t *recordlen); +int tls_record_get_handshake_server_hello_done(const uint8_t *record); +int tls_server_hello_done_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); + + +int tls_record_set_handshake_client_key_exchange_pke(uint8_t *record, size_t *recordlen, + const uint8_t *enced_pms, size_t enced_pms_len); +int tls_record_get_handshake_client_key_exchange_pke(const uint8_t *record, + const uint8_t **enced_pms, size_t *enced_pms_len); +int tls_client_key_exchange_pke_print(FILE *fp, const uint8_t *cke, size_t ckelen, int format, int indent); +int tls_client_key_exchange_print(FILE *fp, const uint8_t *cke, size_t ckelen, int format, int indent); + +int tls_record_set_handshake_client_key_exchange_ecdhe(uint8_t *record, size_t *recordlen, + const SM2_Z256_POINT *point); +int tls_record_get_handshake_client_key_exchange_ecdhe(const uint8_t *record, SM2_Z256_POINT *point); +int tls_client_key_exchange_ecdhe_print(FILE *fp, const uint8_t *data, size_t datalen, + int format, int indent); + + +int tls_record_set_handshake_certificate_verify(uint8_t *record, size_t *recordlen, + const uint8_t *sig, size_t siglen); +int tls_record_get_handshake_certificate_verify(const uint8_t *record, + const uint8_t **sig, size_t *siglen); +int tls_certificate_verify_print(FILE *fp, const uint8_t *p, size_t len, int format, int indent); + +typedef enum { + TLS_client_verify_client_hello = 0, + TLS_client_verify_server_hello = 1, + TLS_client_verify_server_certificate = 2, + TLS_client_verify_server_key_exchange = 3, + TLS_client_verify_cert_request = 4, + TLS_client_verify_server_hello_done = 5, + TLS_client_verify_client_certificate = 6, + TLS_client_verify_client_key_exchange = 7, +} TLS_CLIENT_VERIFY_INDEX; +# 628 "/usr/local/include/gmssl/tls.h" +typedef struct { + TLS_CLIENT_VERIFY_INDEX index; + uint8_t *handshake[8]; + size_t handshake_len[8]; +} TLS_CLIENT_VERIFY_CTX; + +int tls_client_verify_init(TLS_CLIENT_VERIFY_CTX *ctx); +int tls_client_verify_update(TLS_CLIENT_VERIFY_CTX *ctx, const uint8_t *handshake, size_t handshake_len); +int tls_client_verify_finish(TLS_CLIENT_VERIFY_CTX *ctx, const uint8_t *sig, size_t siglen, const SM2_KEY *public_key); +void tls_client_verify_cleanup(TLS_CLIENT_VERIFY_CTX *ctx); +# 648 "/usr/local/include/gmssl/tls.h" +int tls_record_set_handshake_finished(uint8_t *record, size_t *recordlen, + const uint8_t *verify_data, size_t verify_data_len); +int tls_record_get_handshake_finished(const uint8_t *record, + const uint8_t **verify_data, size_t *verify_data_len); +int tls_finished_print(FILE *fp, const uint8_t *a, size_t len, int format, int indent); + + + +typedef struct { + uint8_t level; + uint8_t description; +} TLS_ALERT; + + + +int tls_record_set_alert(uint8_t *record, size_t *recordlen, int alert_level, int alert_description); +int tls_record_get_alert(const uint8_t *record, int *alert_level, int *alert_description); +int tls_alert_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); + + + +typedef struct { + uint8_t type; +} TLS_CHANGE_CIPHER_SPEC; + +const char *tls_change_cipher_spec_text(int change_cipher_spec); +int tls_change_cipher_spec_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); +int tls_record_set_change_cipher_spec(uint8_t *record, size_t *recordlen); +int tls_record_get_change_cipher_spec(const uint8_t *record); + + +int tls_record_set_application_data(uint8_t *record, size_t *recordlen, + const uint8_t *data, size_t datalen); +int tls_record_get_application_data(uint8_t *record, + const uint8_t **data, size_t *datalen); +int tls_application_data_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); + + + +enum { + TLS_server_mode = 0, + TLS_client_mode = 1, +}; + + + +typedef struct { + int protocol; + int is_client; + int cipher_suites[64]; + size_t cipher_suites_cnt; + uint8_t *cacerts; + size_t cacertslen; + uint8_t *certs; + size_t certslen; + + X509_KEY signkey; + X509_KEY kenckey; + + int verify_depth; + + int quiet; +} TLS_CTX; + +int tls_ctx_init(TLS_CTX *ctx, int protocol, int is_client); +int tls_ctx_set_cipher_suites(TLS_CTX *ctx, const int *cipher_suites, size_t cipher_suites_cnt); +int tls_ctx_set_ca_certificates(TLS_CTX *ctx, const char *cacertsfile, int depth); +int tls_ctx_set_certificate_and_key(TLS_CTX *ctx, const char *chainfile, + const char *keyfile, const char *keypass); +int tls_ctx_set_tlcp_server_certificate_and_keys(TLS_CTX *ctx, const char *chainfile, + const char *signkeyfile, const char *signkeypass, + const char *kenckeyfile, const char *kenckeypass); +void tls_ctx_cleanup(TLS_CTX *ctx); +# 743 "/usr/local/include/gmssl/tls.h" +typedef struct { + int protocol; + int is_client; + + + int cipher_suites[64]; + size_t cipher_suites_cnt; + tls_socket_t sock; + + uint8_t enced_record[((1 + 2 + 2) + ((1 << 14) + 2048))]; + size_t enced_record_len; + + + uint8_t record[((1 + 2 + 2) + ((1 << 14) + 2048))]; + size_t record_offset; + + int record_state; + + size_t recordlen; + + uint8_t databuf[((1 + 2 + 2) + ((1 << 14) + 2048))]; + uint8_t *data; + size_t datalen; + + int cipher_suite; + uint8_t session_id[32]; + size_t session_id_len; + uint8_t server_certs[2048]; + size_t server_certs_len; + uint8_t client_certs[2048]; + size_t client_certs_len; + uint8_t ca_certs[2048]; + size_t ca_certs_len; + + X509_KEY sign_key; + X509_KEY kenc_key; + + int verify_result; + uint8_t master_secret[48]; + uint8_t key_block[96]; + + SM3_HMAC_CTX client_write_mac_ctx; + SM3_HMAC_CTX server_write_mac_ctx; + SM4_KEY client_write_enc_key; + SM4_KEY server_write_enc_key; + uint8_t client_seq_num[8]; + uint8_t server_seq_num[8]; + + uint8_t client_write_iv[12]; + uint8_t server_write_iv[12]; + BLOCK_CIPHER_KEY client_write_key; + BLOCK_CIPHER_KEY server_write_key; + + int quiet; + + + + int state; + SM3_CTX sm3_ctx; + SM2_SIGN_CTX sign_ctx; + TLS_CLIENT_VERIFY_CTX client_verify_ctx; + uint8_t client_random[32]; + uint8_t server_random[32]; + uint8_t server_exts[512]; + size_t server_exts_len; + + + + uint16_t sig_alg; + + + + + uint16_t server_sig_alg; + + + + uint16_t ecdh_named_curve; + + X509_KEY ecdh_key; + uint8_t peer_ecdh_point[65]; + size_t peer_ecdh_point_len; + + int client_certificate_verify; + + int verify_depth; + +} TLS_CONNECT; + + + + + +int tls_init(TLS_CONNECT *conn, const TLS_CTX *ctx); +int tls_set_socket(TLS_CONNECT *conn, tls_socket_t sock); +int tls_do_handshake(TLS_CONNECT *conn); +int tls_send(TLS_CONNECT *conn, const uint8_t *in, size_t inlen, size_t *sentlen); +int tls_recv(TLS_CONNECT *conn, uint8_t *out, size_t outlen, size_t *recvlen); +int tls_shutdown(TLS_CONNECT *conn); +void tls_cleanup(TLS_CONNECT *conn); + +int tlcp_do_connect(TLS_CONNECT *conn); +int tlcp_do_accept(TLS_CONNECT *conn); +int tls12_do_connect(TLS_CONNECT *conn); +int tls12_do_accept(TLS_CONNECT *conn); + + + + + +int tls13_do_connect(TLS_CONNECT *conn); +int tls13_do_accept(TLS_CONNECT *conn); + +int tls_send_alert(TLS_CONNECT *conn, int alert); +int tls_send_warning(TLS_CONNECT *conn, int alert); + +int tls13_send(TLS_CONNECT *conn, const uint8_t *data, size_t datalen, size_t *sentlen); +int tls13_recv(TLS_CONNECT *conn, uint8_t *out, size_t outlen, size_t *recvlen); + + +int tls13_connect(TLS_CONNECT *conn, const char *hostname, int port, FILE *server_cacerts_fp, + FILE *client_certs_fp, const SM2_KEY *client_sign_key); +int tls13_accept(TLS_CONNECT *conn, int port, + FILE *server_certs_fp, const SM2_KEY *server_sign_key, + FILE *client_cacerts_fp); + + +int tls13_supported_versions_ext_print(FILE *fp, int fmt, int ind, int handshake_type, const uint8_t *data, size_t datalen); +int tls13_key_share_ext_print(FILE *fp, int fmt, int ind, int handshake_type, const uint8_t *data, size_t datalen); + + +int tls_process_client_hello_exts(const uint8_t *exts, size_t extslen, uint8_t *out, size_t *outlen, size_t maxlen); +int tls_process_server_hello_exts(const uint8_t *exts, size_t extslen, + int *ec_point_format, int *supported_group, int *signature_algor); + + +int tls13_encrypted_extensions_print(FILE *fp, int fmt, int ind, const uint8_t *data, size_t datalen); + +int tls13_extension_print(FILE *fp, int fmt, int ind, + int handshake_type, int ext_type, const uint8_t *ext_data, size_t ext_datalen); +int tls13_extensions_print(FILE *fp, int fmt, int ind, + int handshake_type, const uint8_t *exts, size_t extslen); + +int tls13_certificate_print(FILE *fp, int fmt, int ind, const uint8_t *cert, size_t certlen); +int tls13_certificate_request_print(FILE *fp, int fmt, int ind, const uint8_t *cert, size_t certlen); +int tls13_certificate_verify_print(FILE *fp, int fmt, int ind, const uint8_t *d, size_t dlen); +int tls13_record_print(FILE *fp, int format, int indent, const uint8_t *record, size_t recordlen); + + +int tls13_gcm_encrypt(const BLOCK_CIPHER_KEY *key, const uint8_t iv[12], + const uint8_t seq_num[8], int record_type, + const uint8_t *in, size_t inlen, size_t padding_len, + uint8_t *out, size_t *outlen); +int tls13_gcm_decrypt(const BLOCK_CIPHER_KEY *key, const uint8_t iv[12], + const uint8_t seq_num[8], const uint8_t *in, size_t inlen, + int *record_type, uint8_t *out, size_t *outlen); +# 917 "/usr/local/include/gmssl/tls.h" +int tls_encrypted_record_print(FILE *fp, const uint8_t *record, size_t recordlen, int format, int indent); +# 25 "tls12.c" 2 + +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/fcntl.h" 1 3 4 +# 27 "tls12.c" 2 +# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/errno.h" 1 3 4 +# 28 "tls12.c" 2 + + + + +static const int tls12_ciphers[] = { + TLS_cipher_ecdhe_sm4_cbc_sm3, + TLS_cipher_ecdhe_sm4_gcm_sm3, + TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256, +}; +# 66 "tls12.c" +int tls12_record_print(FILE *fp, const uint8_t *record, size_t recordlen, int format, int indent) +{ + + + format |= tls12_ciphers[0] << 8; + return tls_record_print(fp, record, recordlen, format, indent); +} + + + + +int tls_send_record(TLS_CONNECT *conn) +{ + size_t left; + tls_ret_t n; + + left = ((size_t)((1 + 2 + 2) + (((uint16_t)((conn->record)[3]) << 8) | (conn->record)[4]))) - conn->record_offset; + while (left) { + n = send(conn->sock,conn->record + conn->record_offset,left,0); + if (n < 0) { + if ((*__error()) == 35 && (*__error()) == 35) { + return -1001; + } else if ((*__error()) == 4) { + continue; + } else { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 91, __FUNCTION__); } while (0); + return -1; + } + } + conn->record_offset += n; + left -= n; + } + return 1; +} + +int tls_recv_record(TLS_CONNECT *conn) +{ + size_t left; + tls_ret_t n; + + if (conn->record_offset < 5) { + left = 5 - conn->record_offset; + while (left) { + n = recv(conn->sock,conn->record + conn->record_offset,left,0); + if (n < 0) { + if ((*__error()) == 35 || (*__error()) == 35) { + return -1000; + } else if ((*__error()) == 4) { + continue; + } else { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 116, __FUNCTION__); } while (0); + + + return -1003; + } + } else if (n == 0) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 122, __FUNCTION__); } while (0); + return -1002; + } + conn->record_offset += n; + left -= n; + } + } + + if (conn->record_offset == 5) { + if (!tls_record_type_name(((conn->record)[0]))) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 132, __FUNCTION__); } while (0); + return -1; + } + if (!tls_protocol_name((((uint16_t)((conn->record)[1]) << 8) | (conn->record)[2]))) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 136, __FUNCTION__); } while (0); + return -1; + } + if (((size_t)((1 + 2 + 2) + (((uint16_t)((conn->record)[3]) << 8) | (conn->record)[4]))) > ((1 + 2 + 2) + ((1 << 14) + 2048))) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 140, __FUNCTION__); } while (0); + return -1; + } + } + + if (conn->record_offset >= ((size_t)((1 + 2 + 2) + (((uint16_t)((conn->record)[3]) << 8) | (conn->record)[4])))) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 146, __FUNCTION__); } while (0); + return -1; + } + left = ((size_t)((1 + 2 + 2) + (((uint16_t)((conn->record)[3]) << 8) | (conn->record)[4]))) - conn->record_offset; + while (left) { + n = recv(conn->sock,conn->record + conn->record_offset,left,0); + if (n < 0) { + if ((*__error()) == 35 || (*__error()) == 35) { + return -1000; + } else if ((*__error()) == 4) { + continue; + } else { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 158, __FUNCTION__); } while (0); + return -1003; + } + } else if (n == 0) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 162, __FUNCTION__); } while (0); + return -1002; + } + conn->record_offset += n; + left -= n; + + } + + conn->recordlen = conn->record_offset; + return 1; +} + +int tls_named_curve_oid(int named_curve) +{ + switch (named_curve) { + case TLS_curve_secp256r1: return OID_prime256v1; + case TLS_curve_sm2p256v1: return OID_sm2; + } + return OID_undef; +} + +int tls_named_curve_from_oid(int oid) +{ + switch (oid) { + case OID_prime256v1: return TLS_curve_secp256r1; + case OID_sm2: return TLS_curve_sm2p256v1; + } + return 0; +} + +enum { + TLS_state_handshake_init = 0, + TLS_state_client_hello, + TLS_state_server_hello, + TLS_state_server_certificate, + TLS_state_server_key_exchange, + TLS_state_certificate_request, + TLS_state_server_hello_done, + TLS_state_client_certificate, + TLS_state_client_key_exchange, + TLS_state_certificate_verify, + TLS_state_generate_keys, + TLS_state_client_change_cipher_spec, + TLS_state_client_finished, + TLS_state_server_change_cipher_spec, + TLS_state_server_finished, + TLS_state_handshake_over, +}; + + +const int ec_point_formats[] = { TLS_point_uncompressed }; +size_t ec_point_formats_cnt = sizeof(ec_point_formats)/sizeof(ec_point_formats[0]); + + +const int supported_groups[] = { + TLS_curve_sm2p256v1, + TLS_curve_secp256r1, +}; +size_t supported_groups_cnt = sizeof(supported_groups)/sizeof(supported_groups[0]); + + +const int signature_algors[] = { + TLS_sig_sm2sig_sm3, + TLS_sig_ecdsa_secp256r1_sha256, +}; +size_t signature_algors_cnt = sizeof(signature_algors)/sizeof(signature_algors[0]); + + + +int tls_record_set_handshake_server_key_exchange(uint8_t *record, size_t *recordlen, + const uint8_t *server_ecdh_params, size_t server_ecdh_params_len, + uint16_t sig_alg, const uint8_t *sig, size_t siglen) +{ + const int type = TLS_handshake_server_key_exchange; + uint8_t *p = ((((record)+(1 + 2 + 2))) + 4); + size_t len = 0; + + if (server_ecdh_params_len != 69) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 240, __FUNCTION__); } while (0); + return -1; + } + if (siglen > 72) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 244, __FUNCTION__); } while (0); + return -1; + } + tls_array_to_bytes(server_ecdh_params, server_ecdh_params_len, &p, &len); + tls_uint16_to_bytes(sig_alg, &p, &len); + tls_uint16array_to_bytes(sig, siglen, &p, &len); + tls_record_set_handshake(record, recordlen, type, ((void*)0), len); + return 1; +} + +int tls_record_get_handshake_server_key_exchange(const uint8_t *record, + uint8_t *curve_type, uint16_t *named_curve, + const uint8_t **point_octets, size_t *point_octets_len, + const uint8_t **server_ecdh_params, size_t *server_ecdh_params_len, + uint16_t *sig_alg, const uint8_t **sig, size_t *siglen) +{ + int type; + const uint8_t *p; + size_t len; + + if (tls_record_get_handshake(record, &type, &p, &len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 265, __FUNCTION__); } while (0); + return -1; + } + if (type != TLS_handshake_server_key_exchange) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 269, __FUNCTION__); } while (0); + return -1; + } + + *server_ecdh_params = p; + if (tls_uint8_from_bytes(curve_type, &p, &len) != 1 + || tls_uint16_from_bytes(named_curve, &p, &len) != 1 + || tls_uint8array_from_bytes(point_octets, point_octets_len, &p, &len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 277, __FUNCTION__); } while (0); + return -1; + } + *server_ecdh_params_len = p - *server_ecdh_params; + if (*server_ecdh_params_len != 69) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 282, __FUNCTION__); } while (0); + return -1; + } + if (tls_uint16_from_bytes(sig_alg, &p, &len) != 1 + || tls_uint16array_from_bytes(sig, siglen, &p, &len) != 1 + || tls_length_is_zero(len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 288, __FUNCTION__); } while (0); + return -1; + } + if (*curve_type != TLS_curve_type_named_curve) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 292, __FUNCTION__); } while (0); + return -1; + } + if (!tls_named_curve_name(*named_curve)) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 296, __FUNCTION__); } while (0); + return -1; + } + if (!tls_signature_scheme_name(*sig_alg)) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 300, __FUNCTION__); } while (0); + return -1; + } + return 1; +} + +int tls_record_set_handshake_client_key_exchange(uint8_t *record, size_t *recordlen, + const uint8_t *point_octets, size_t point_octets_len) +{ + int type = TLS_handshake_client_key_exchange; + uint8_t *p = ((((record)+(1 + 2 + 2))) + 4); + size_t len = 0; + + if (point_octets_len != 65) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 314, __FUNCTION__); } while (0); + return -1; + } + tls_uint8array_to_bytes(point_octets, (uint8_t)point_octets_len, &p, &len); + tls_record_set_handshake(record, recordlen, type, ((void*)0), len); + return 1; +} + +int tls_record_get_handshake_client_key_exchange(const uint8_t *record, + const uint8_t **point_octets, size_t *point_octets_len) +{ + int type; + const uint8_t *p; + size_t len; + + if (tls_record_get_handshake(record, &type, &p, &len) != 1 + || type != TLS_handshake_client_key_exchange) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 331, __FUNCTION__); } while (0); + return -1; + } + if (tls_uint8array_from_bytes(point_octets, point_octets_len, &p, &len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 335, __FUNCTION__); } while (0); + return -1; + } + if (*point_octets_len != 65) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 339, __FUNCTION__); } while (0); + return -1; + } + if (len) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 343, __FUNCTION__); } while (0); + return -1; + } + return 1; +} + +void tls_clean_record(TLS_CONNECT *conn) +{ + conn->record_offset = 0; + conn->recordlen = 0; +} + + + + + +int tls_handshake_init(TLS_CONNECT *conn) +{ + + sm3_init(&conn->sm3_ctx); + + if (conn->client_certs_len) { + + } + + return 1; +} + +int tls_send_client_hello(TLS_CONNECT *conn) +{ + int ret; + uint8_t *record = conn->record; + + if (!conn->recordlen) { + uint8_t client_exts[512]; + uint8_t *p = client_exts; + size_t client_exts_len = 0; + + tls_record_set_protocol(record, TLS_protocol_tls1); + + if (tls_random_generate(conn->client_random) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 384, __FUNCTION__); } while (0); + return -1; + } + if (tls_ec_point_formats_ext_to_bytes(ec_point_formats, ec_point_formats_cnt, &p, &client_exts_len) != 1 + || tls_supported_groups_ext_to_bytes(supported_groups, supported_groups_cnt, &p, &client_exts_len) != 1 + || tls_signature_algorithms_ext_to_bytes(signature_algors, signature_algors_cnt, &p, &client_exts_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 390, __FUNCTION__); } while (0); + return -1; + } + if (tls_record_set_handshake_client_hello(conn->record, &conn->recordlen, + conn->protocol, conn->client_random, ((void*)0), 0, + tls12_ciphers, sizeof(tls12_ciphers)/sizeof(tls12_ciphers[0]), + client_exts, client_exts_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 397, __FUNCTION__); } while (0); + return -1; + } + + + ; + ; + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + } + + + + + if (conn->client_certificate_verify) { + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 416, __FUNCTION__); } while (0); + } + return ret; + } + + tls_clean_record(conn); + return 1; +} + +const int server_ciphers[] = { TLS_cipher_ecdhe_sm4_cbc_sm3 }; +const size_t server_ciphers_cnt = 1; +const int curve = TLS_curve_sm2p256v1; + + + +int tls_recv_client_hello(TLS_CONNECT *conn) +{ + int ret; + uint8_t *record = conn->record; + size_t recordlen; + + int client_verify = 0; + + int protocol; + const uint8_t *client_random; + const uint8_t *session_id; + size_t session_id_len; + const uint8_t *client_ciphers; + size_t client_ciphers_len; + const uint8_t *client_exts; + size_t client_exts_len; + + sm3_init(&conn->sm3_ctx); + + + + if (conn->ca_certs_len) + client_verify = 1; + + + if (client_verify) + tls_client_verify_init(&conn->client_verify_ctx); + + + ; + + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != -1000) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 464, __FUNCTION__); } while (0); + } + return ret; + } + ; + + + if ((((uint16_t)((record)[1]) << 8) | (record)[2]) != conn->protocol + && (((uint16_t)((record)[1]) << 8) | (record)[2]) != TLS_protocol_tls1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 473, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_protocol_version); + return -1; + } + + if (tls_record_get_handshake_client_hello(record, + &protocol, &client_random, &session_id, &session_id_len, + &client_ciphers, &client_ciphers_len, + &client_exts, &client_exts_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 482, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + + if (protocol != conn->protocol) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 488, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_protocol_version); + return -1; + } + __builtin___memcpy_chk (conn->client_random, client_random, 32, __builtin_object_size (conn->client_random, 0)); + + + if (tls_cipher_suites_select(client_ciphers, client_ciphers_len, + server_ciphers, server_ciphers_cnt, + &conn->cipher_suite) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 498, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_insufficient_security); + return -1; + } + + switch (conn->cipher_suite) { + case TLS_cipher_ecdhe_sm4_cbc_sm3: + case TLS_cipher_ecdhe_sm4_gcm_sm3: + conn->sig_alg = TLS_sig_sm2sig_sm3; + conn->ecdh_named_curve = TLS_curve_sm2p256v1; + break; + case TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256: + conn->sig_alg = TLS_sig_ecdsa_secp256r1_sha256; + conn->ecdh_named_curve = TLS_curve_secp256r1; + break; + default: + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 514, __FUNCTION__); } while (0); + return -1; + } + + if (client_exts) { + + tls_process_client_hello_exts(client_exts, client_exts_len, + conn->server_exts, &conn->server_exts_len, sizeof(conn->server_exts)); + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (client_verify) + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + + + fprintf(__stderrp, "end of recv_client_hello\n"); + tls_clean_record(conn); + return 1; +} + +int tls_send_server_hello(TLS_CONNECT *conn) +{ + int ret; + ; + + if (conn->recordlen == 0) { + tls_record_set_protocol(conn->record, conn->protocol); + if (tls_random_generate(conn->server_random) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 542, __FUNCTION__); } while (0); + return -1; + } + if (tls_record_set_handshake_server_hello(conn->record, &conn->recordlen, + conn->protocol, conn->server_random, ((void*)0), 0, + conn->cipher_suite, conn->server_exts, conn->server_exts_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 548, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + ; + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 557, __FUNCTION__); } while (0); + } + return ret; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->ca_certs_len) { + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + } + + tls_clean_record(conn); + return 1; +} + +int tls_recv_server_hello(TLS_CONNECT *conn) +{ + int ret; + int protocol; + int cipher_suite; + const uint8_t *server_random; + const uint8_t *session_id; + size_t session_id_len; + const uint8_t *server_exts; + size_t server_exts_len; + + + int ec_point_format = -1; + int supported_group = -1; + int signature_algor = -1; + + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != -1000) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 589, __FUNCTION__); } while (0); + } + return ret; + } + + ; + if ((((uint16_t)((conn->record)[1]) << 8) | (conn->record)[2]) != conn->protocol) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 596, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_protocol_version); + return -1; + } + + if (tls_record_get_handshake_server_hello(conn->record, + &protocol, &server_random, &session_id, &session_id_len, &cipher_suite, + &server_exts, &server_exts_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 604, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (protocol != conn->protocol) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 609, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_protocol_version); + return -1; + } + + if (tls_cipher_suite_in_list(cipher_suite, tls12_ciphers, sizeof(tls12_ciphers)/sizeof(tls12_ciphers[0])) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 615, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_handshake_failure); + return -1; + } + if (!server_exts) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 620, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (tls_process_server_hello_exts(server_exts, server_exts_len, &ec_point_format, &supported_group, &signature_algor) != 1 + || ec_point_format < 0 + || supported_group < 0 + || signature_algor < 0) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 628, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + + int a = random; + + + __builtin___memcpy_chk (conn->server_random, random, 32, __builtin_object_size (conn->server_random, 0)); + __builtin___memcpy_chk (conn->session_id, session_id, session_id_len, __builtin_object_size (conn->session_id, 0)); + conn->cipher_suite = cipher_suite; + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certs_len) { + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + } + + return 1; +} + +int tls_send_server_certificate(TLS_CONNECT *conn) +{ + int ret; + ; + + if (conn->recordlen == 0) { + if (tls_record_set_handshake_certificate(conn->record, &conn->recordlen, + conn->server_certs, conn->server_certs_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 655, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + ; + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 664, __FUNCTION__); } while (0); + } + return ret; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certificate_verify) { + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + } + return 1; +} + +int tls_recv_server_certificate(TLS_CONNECT *conn) +{ + int ret; + int verify_result; + const uint8_t *server_cert; + size_t server_cert_len; + X509_KEY server_sign_key; + + + ; + + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != -1000) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 689, __FUNCTION__); } while (0); + } + return ret; + } + if ((((uint16_t)((conn->record)[1]) << 8) | (conn->record)[2]) != conn->protocol) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 694, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + ; + + if (tls_record_get_handshake_certificate(conn->record, + conn->server_certs, &conn->server_certs_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 702, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + + if (x509_certs_get_cert_by_index(conn->server_certs, conn->server_certs_len, 0, + &server_cert, &server_cert_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 709, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + if (x509_cert_get_subject_public_key(server_cert, server_cert_len, &server_sign_key) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 714, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + + + if (server_sign_key.algor != OID_ec_public_key) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 721, __FUNCTION__); } while (0); + return -1; + } + switch (conn->cipher_suite) { + case TLS_cipher_ecdhe_sm4_cbc_sm3: + case TLS_cipher_ecdhe_sm4_gcm_sm3: + case TLS_cipher_ecc_sm4_cbc_sm3: + case TLS_cipher_ecc_sm4_gcm_sm3: + if (server_sign_key.algor_param != OID_sm2) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 730, __FUNCTION__); } while (0); + return -1; + } + conn->server_sig_alg = TLS_sig_sm2sig_sm3; + break; + + case TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256: + if (server_sign_key.algor_param != OID_prime256v1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 738, __FUNCTION__); } while (0); + return -1; + } + conn->server_sig_alg = TLS_sig_ecdsa_secp256r1_sha256; + break; + default: + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 744, __FUNCTION__); } while (0); + return -1; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certs_len) { + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + } + + (__builtin_expect(!(conn->verify_depth > 0 && conn->verify_depth < 10), 0) ? __assert_rtn(__func__, "tls12.c", 753, "conn->verify_depth > 0 && conn->verify_depth < 10") : (void)0); + + + if (x509_certs_verify(conn->server_certs, conn->server_certs_len, X509_cert_chain_server, + conn->ca_certs, conn->ca_certs_len, conn->verify_depth, &verify_result) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 758, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + + return 1; +} + +int tls_send_server_key_exchange(TLS_CONNECT *conn) +{ + int ret; + uint8_t server_ecdh_params[69]; + uint8_t *p = server_ecdh_params + 4; + size_t len = 0; + X509_SIGN_CTX sign_ctx; + const void *sign_args = ((void*)0); + size_t sign_argslen = 0; + uint8_t sig[sizeof(X509_SIGNATURE)]; + size_t siglen; + + ; + + + if (conn->recordlen == 0) { + + if (x509_key_generate(&conn->ecdh_key, + OID_ec_public_key, tls_named_curve_oid(conn->ecdh_named_curve)) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 785, __FUNCTION__); } while (0); + return -1; + } + + + server_ecdh_params[0] = TLS_curve_type_named_curve; + server_ecdh_params[1] = conn->ecdh_named_curve >> 8; + server_ecdh_params[2] = conn->ecdh_named_curve; + server_ecdh_params[3] = 65; + if (x509_public_key_to_bytes(&conn->ecdh_key, &p, &len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 795, __FUNCTION__); } while (0); + return -1; + } + if (len != 65) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 799, __FUNCTION__); } while (0); + return -1; + } + + + if (conn->sign_key.algor == OID_ec_public_key && conn->sign_key.algor_param == OID_sm2) { + sign_args = "1234567812345678"; + sign_argslen = (sizeof("1234567812345678") - 1); + } + if (x509_sign_init(&sign_ctx, &conn->sign_key, sign_args, sign_argslen) != 1 + || x509_sign_update(&sign_ctx, conn->client_random, 32) != 1 + || x509_sign_update(&sign_ctx, conn->server_random, 32) != 1 + || x509_sign_update(&sign_ctx, server_ecdh_params, 69) != 1 + || x509_sign_finish(&sign_ctx, sig, &siglen) != 1) { + x509_sign_ctx_cleanup(&sign_ctx); + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 814, __FUNCTION__); } while (0); + return -1; + } + x509_sign_ctx_cleanup(&sign_ctx); + + if (tls_record_set_handshake_server_key_exchange(conn->record, &conn->recordlen, + server_ecdh_params, sizeof(server_ecdh_params), + conn->sig_alg, sig, siglen) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 822, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + ; + } + + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 832, __FUNCTION__); } while (0); + } + return ret; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certificate_verify) { + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + } + + return 1; +} + + +int tls_curve_match_cipher_suite(int named_curve, int cipher_suite) +{ + switch (named_curve) { + case TLS_curve_sm2p256v1: + switch (cipher_suite) { + case TLS_cipher_ecdhe_sm4_cbc_sm3: + case TLS_cipher_ecdhe_sm4_gcm_sm3: + break; + default: + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 855, __FUNCTION__); } while (0); + return -1; + } + break; + case TLS_curve_secp256r1: + if (cipher_suite != TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 861, __FUNCTION__); } while (0); + return -1; + } + break; + default: + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 866, __FUNCTION__); } while (0); + return -1; + } + return 1; +} + +int tls_signature_scheme_match_cipher_suite(int sig_alg, int cipher_suite) +{ + switch (sig_alg) { + case TLS_sig_sm2sig_sm3: + switch (cipher_suite) { + case TLS_cipher_ecdhe_sm4_cbc_sm3: + case TLS_cipher_ecdhe_sm4_gcm_sm3: + case TLS_cipher_ecc_sm4_cbc_sm3: + case TLS_cipher_ecc_sm4_gcm_sm3: + break; + default: + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 883, __FUNCTION__); } while (0); + return -1; + } + break; + case TLS_sig_ecdsa_secp256r1_sha256: + switch (cipher_suite) { + case TLS_cipher_ecdhe_ecdsa_with_aes_128_cbc_sha256: + break; + default: + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 892, __FUNCTION__); } while (0); + return -1; + } + break; + default: + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 897, __FUNCTION__); } while (0); + return -1; + } + return 1; +} + +int tls_recv_server_key_exchange(TLS_CONNECT *conn) +{ + int ret; + uint8_t curve_type; + uint16_t named_curve; + const uint8_t *point_octets; + size_t point_octets_len; + const uint8_t *server_ecdh_params; + size_t server_ecdh_params_len; + uint16_t sig_alg; + const uint8_t *sig; + size_t siglen; + + + X509_KEY server_sign_key; + + int server_cert_index = 0; + const uint8_t *server_cert; + size_t server_cert_len; + + uint16_t tls_sig_alg; + + + + X509_SIGN_CTX sign_ctx; + const void *sign_args = ((void*)0); + size_t sign_argslen = 0; + + ; + + + if (tls_record_recv(conn->record, &conn->recordlen, conn->sock) != 1 + || (((uint16_t)((conn->record)[1]) << 8) | (conn->record)[2]) != conn->protocol) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 936, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + ; + + + if (tls_record_get_handshake_server_key_exchange(conn->record, + &curve_type, &named_curve, &point_octets, &point_octets_len, + &server_ecdh_params, &server_ecdh_params_len, + &sig_alg, &sig, &siglen) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 947, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (curve_type != TLS_curve_type_named_curve) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 952, __FUNCTION__); } while (0); + return -1; + } + + + if (tls_curve_match_cipher_suite(named_curve, conn->cipher_suite) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 958, __FUNCTION__); } while (0); + return -1; + } + if (point_octets_len != 65) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 962, __FUNCTION__); } while (0); + return -1; + } + if (tls_signature_scheme_match_cipher_suite(sig_alg, conn->cipher_suite) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 966, __FUNCTION__); } while (0); + return -1; + } + + + + + + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certs_len) + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + + + + + if (x509_certs_get_cert_by_index(conn->server_certs, conn->server_certs_len, + server_cert_index, &server_cert, &server_cert_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 984, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + if (x509_cert_get_subject_public_key(server_cert, server_cert_len, &server_sign_key) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 989, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + + + + + + switch (sig_alg) { + case TLS_sig_sm2sig_sm3: + if (server_sign_key.algor != OID_ec_public_key + || server_sign_key.algor_param != OID_sm2) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1002, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + break; + case TLS_sig_ecdsa_secp256r1_sha256: + if (server_sign_key.algor != OID_ec_public_key + || server_sign_key.algor_param != OID_prime256v1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1010, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + break; + default: + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1016, __FUNCTION__); } while (0); + return -1; + } + + if (server_sign_key.algor == OID_ec_public_key && server_sign_key.algor_param == OID_sm2) { + sign_args = "1234567812345678"; + sign_argslen = (sizeof("1234567812345678") - 1); + } + if (x509_verify_init(&sign_ctx, &server_sign_key, sign_args, sign_argslen, sig, siglen) != 1 + || x509_verify_update(&sign_ctx, conn->client_random, 32) != 1 + || x509_verify_update(&sign_ctx, conn->server_random, 32) != 1 + || x509_verify_update(&sign_ctx, server_ecdh_params, 69) != 1 + || x509_verify_finish(&sign_ctx) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1029, __FUNCTION__); } while (0); + return -1; + } + + + + + + return 1; +} + +int tls_send_certificate_request(TLS_CONNECT *conn) +{ + int ret; + + + const uint8_t cert_types[] = { TLS_cert_type_ecdsa_sign }; + uint8_t ca_names[(((1 << 14) - 4) - 1 - 2)] = {0}; + size_t ca_names_len = 0; + + + if (!conn->client_certificate_verify) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1051, __FUNCTION__); } while (0); + return -1; + } + + if (conn->recordlen == 0) { + ; + if (tls_authorities_from_certs(ca_names, &ca_names_len, sizeof(ca_names), + conn->ca_certs, conn->ca_certs_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1059, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + if (tls_record_set_handshake_certificate_request(conn->record, &conn->recordlen, + cert_types, sizeof(cert_types), + ca_names, ca_names_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1066, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + ; + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1075, __FUNCTION__); } while (0); + } + return ret; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + + return 1; +} + + + +int tls_recv_certificate_request(TLS_CONNECT *conn) +{ + int ret; + uint8_t *record = conn->record; + size_t recordlen; + const uint8_t *cp; + size_t len; + int handshake_type; + + const uint8_t *cert_types; + size_t cert_types_len; + const uint8_t *ca_names; + size_t ca_names_len; + + + + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != -1000) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1106, __FUNCTION__); } while (0); + } + return ret; + } + if ((((uint16_t)((conn->record)[1]) << 8) | (conn->record)[2]) != conn->protocol) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1111, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (tls_record_get_handshake(record, &handshake_type, &cp, &len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1116, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (handshake_type != TLS_handshake_certificate_request) { + conn->client_certs_len = 0; + return 0; + } + + ; + ; + if (tls_record_get_handshake_certificate_request(conn->record, + &cert_types, &cert_types_len, &ca_names, &ca_names_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1129, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if(!conn->client_certs_len) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1134, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + if (tls_cert_types_accepted(cert_types, cert_types_len, conn->client_certs, conn->client_certs_len) != 1 + || tls_authorities_issued_certificate(ca_names, ca_names_len, conn->client_certs, conn->client_certs_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1140, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unsupported_certificate); + return -1; + } + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + + conn->recordlen = 0; + return 1; +} + +int tls_send_server_hello_done(TLS_CONNECT *conn) +{ + int ret; + ; + + + if (conn->recordlen == 0) { + tls_record_set_handshake_server_hello_done(conn->record, &conn->recordlen); + ; + } + + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1165, __FUNCTION__); } while (0); + } + return ret; + } + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + + if (conn->client_certs_len) { + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + } + return 1; +} + +int tls_recv_server_hello_done(TLS_CONNECT *conn) +{ + int ret; + ; + + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != -1000) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1184, __FUNCTION__); } while (0); + } + return ret; + } + if ((((uint16_t)((conn->record)[1]) << 8) | (conn->record)[2]) != conn->protocol) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1189, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + ; + + if (tls_record_get_handshake_server_hello_done(conn->record) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1196, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certs_len) + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + + + return 1; +} + +int tls_send_client_certificate(TLS_CONNECT *conn) +{ + int ret; + ; + + if (conn->client_certs_len == 0) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1214, __FUNCTION__); } while (0); + return -1; + } + + if (conn->recordlen == 0) { + if (tls_record_set_handshake_certificate(conn->record, &conn->recordlen, + conn->client_certs, conn->client_certs_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1221, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + ; + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1230, __FUNCTION__); } while (0); + } + return ret; + } + + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + + return 1; +} + + +int tls_recv_client_certificate(TLS_CONNECT *conn) +{ + int ret; + const int verify_depth = 5; + int verify_result; + + ; + + if (conn->ca_certs_len == 0) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1252, __FUNCTION__); } while (0); + return -1; + } + + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != -1000) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1258, __FUNCTION__); } while (0); + } + return ret; + } + if ((((uint16_t)((conn->record)[1]) << 8) | (conn->record)[2]) != conn->protocol) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1263, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + ; + if (tls_record_get_handshake_certificate(conn->record, conn->client_certs, &conn->client_certs_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1269, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (x509_certs_verify(conn->client_certs, conn->client_certs_len, X509_cert_chain_client, + conn->ca_certs, conn->ca_certs_len, verify_depth, &verify_result) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1275, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + + return 1; +} + +int tls_generate_keys(TLS_CONNECT *conn) +{ + uint8_t pre_master_secret[32]; + size_t pre_master_secret_len; + uint8_t key_block[96]; + + + if (x509_key_exchange(&conn->ecdh_key, + conn->peer_ecdh_point, conn->peer_ecdh_point_len, + pre_master_secret, &pre_master_secret_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1295, __FUNCTION__); } while (0); + return -1; + } + if (pre_master_secret_len != sizeof(pre_master_secret)) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1299, __FUNCTION__); } while (0); + return -1; + } + + if (tls_prf(pre_master_secret, 32, "master secret", + conn->client_random, 32, + conn->server_random, 32, + 48, conn->master_secret) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1307, __FUNCTION__); } while (0); + return -1; + } + + if (tls_prf(conn->master_secret, 48, "key expansion", + conn->server_random, 32, + conn->client_random, 32, + 96, conn->key_block) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1315, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + + sm3_hmac_init(&conn->client_write_mac_ctx, conn->key_block, 32); + sm3_hmac_init(&conn->server_write_mac_ctx, conn->key_block + 32, 32); + sm4_set_encrypt_key(&conn->client_write_enc_key, conn->key_block + 64); + sm4_set_decrypt_key(&conn->server_write_enc_key, conn->key_block + 80); + + + tls_secrets_print(__stderrp, + pre_master_secret, 48, + conn->client_random, conn->server_random, + conn->master_secret, + conn->key_block, 96, + 0, 4); + + return 1; +} + +int tls_send_client_key_exchange(TLS_CONNECT *conn) +{ + int ret; + uint8_t point_octets[65]; + uint8_t *p = point_octets; + size_t len = 0; + + + if (conn->recordlen == 0) { + if (x509_key_generate(&conn->ecdh_key, + OID_ec_public_key, tls_named_curve_oid(conn->ecdh_named_curve)) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1347, __FUNCTION__); } while (0); + return -1; + } + if (x509_public_key_to_bytes(&conn->ecdh_key, &p, &len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1351, __FUNCTION__); } while (0); + return -1; + } + if (len != sizeof(point_octets)) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1355, __FUNCTION__); } while (0); + return -1; + } + + ; + if (tls_record_set_handshake_client_key_exchange(conn->record, &conn->recordlen, + point_octets, len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1362, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + ; + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1371, __FUNCTION__); } while (0); + } + return ret; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->client_certs_len) + sm2_sign_update(&conn->sign_ctx, conn->record + 5, conn->recordlen - 5); + + return 1; +} + +int tls_recv_client_key_exchange(TLS_CONNECT *conn) +{ + int ret; + const uint8_t *point_octets; + size_t point_octets_len; + + ; + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != -1000) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1392, __FUNCTION__); } while (0); + } + return ret; + } + if ((((uint16_t)((conn->record)[1]) << 8) | (conn->record)[2]) != conn->protocol) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1397, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + ; + + if (tls_record_get_handshake_client_key_exchange(conn->record, + &point_octets, &point_octets_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1405, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (point_octets_len != 65) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1410, __FUNCTION__); } while (0); + return -1; + } + + __builtin___memcpy_chk (conn->peer_ecdh_point, point_octets, point_octets_len, __builtin_object_size (conn->peer_ecdh_point, 0)); + conn->peer_ecdh_point_len = point_octets_len; + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + if (conn->ca_certs_len) + tls_client_verify_update(&conn->client_verify_ctx, conn->record + 5, conn->recordlen - 5); + + return 1; +} + +int tls_send_certificate_verify(TLS_CONNECT *conn) +{ + int ret; + uint8_t sig[72]; + size_t siglen; + + ; + + if (!conn->client_certificate_verify) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1433, __FUNCTION__); } while (0); + return -1; + } + + if (conn->recordlen == 0) { + if (sm2_sign_finish(&conn->sign_ctx, sig, &siglen) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1439, __FUNCTION__); } while (0); + return -1; + } + if (tls_record_set_handshake_certificate_verify(conn->record, &conn->recordlen, sig, siglen) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1443, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + ; + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1452, __FUNCTION__); } while (0); + } + return ret; + } + + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + return 1; +} + +int tls_recv_certificate_verify(TLS_CONNECT *conn) +{ + int ret; + X509_KEY client_sign_key; + + const uint8_t *sig; + size_t siglen; + + const uint8_t *client_cert; + size_t client_cert_len; + + if (!conn->client_certificate_verify) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1473, __FUNCTION__); } while (0); + return -1; + } + + ; + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != -1000) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1480, __FUNCTION__); } while (0); + } + return ret; + } + if ((((uint16_t)((conn->record)[1]) << 8) | (conn->record)[2]) != conn->protocol) { + tls_send_alert(conn, TLS_alert_unexpected_message); + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1486, __FUNCTION__); } while (0); + return -1; + } + ; + + + if (tls_record_get_handshake_certificate_verify(conn->record, &sig, &siglen) != 1) { + tls_send_alert(conn, TLS_alert_unexpected_message); + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1494, __FUNCTION__); } while (0); + return -1; + } + + + if (x509_certs_get_cert_by_index(conn->client_certs, conn->client_certs_len, 0, + &client_cert, &client_cert_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1501, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + if (x509_cert_get_subject_public_key(client_cert, client_cert_len, &client_sign_key) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1506, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + + if (client_sign_key.algor != OID_ec_public_key + || client_sign_key.algor_param != OID_sm2) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1513, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_certificate); + return -1; + } + + if (tls_client_verify_finish(&conn->client_verify_ctx, sig, siglen, &client_sign_key.u.sm2_key) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1519, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_decrypt_error); + return -1; + } + sm3_update(&conn->sm3_ctx, conn->record + 5, conn->recordlen - 5); + + return 1; +} + +int tls_send_change_cipher_spec(TLS_CONNECT *conn) +{ + int ret; + if (conn->recordlen == 0) { + ; + if (tls_record_set_change_cipher_spec(conn->record, &conn->recordlen) !=1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1534, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + ; + } + if ((ret = tls_send_record(conn)) != 1) { + if (ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1542, __FUNCTION__); } while (0); + } + return ret; + } + return 1; +} + +int tls_recv_change_cipher_spec(TLS_CONNECT *conn) +{ + int ret; + uint8_t *record = conn->record; + size_t recordlen; + + ; + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != -1000) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1558, __FUNCTION__); } while (0); + } + return ret; + } + if ((((uint16_t)((record)[1]) << 8) | (record)[2]) != conn->protocol) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1563, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + ; + if (tls_record_get_change_cipher_spec(record) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1569, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + return 1; +} + +int tls_send_client_finished(TLS_CONNECT *conn) +{ + int ret; + uint8_t *record = conn->record; + size_t recordlen; + + SM3_CTX tmp_sm3_ctx; + uint8_t sm3_hash[32]; + uint8_t finished_record[(((1 + 2 + 2) + 4 + 12) + (32) + (1 + 255))]; + size_t finished_record_len; + uint8_t local_verify_data[12]; + + if (conn->recordlen == 0) { + ; + + + __builtin___memcpy_chk (&tmp_sm3_ctx, &conn->sm3_ctx, sizeof(SM3_CTX), __builtin_object_size (&tmp_sm3_ctx, 0)); + sm3_finish(&tmp_sm3_ctx, sm3_hash); + + if (tls_prf(conn->master_secret, 48, + "client finished", sm3_hash, 32, ((void*)0), 0, + sizeof(local_verify_data), local_verify_data) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1598, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + + if (tls_record_set_handshake_finished(finished_record, &finished_record_len, + local_verify_data, sizeof(local_verify_data)) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1605, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + ; + + sm3_update(&conn->sm3_ctx, finished_record + 5, finished_record_len - 5); + + + if (tls_record_encrypt(&conn->client_write_mac_ctx, &conn->client_write_enc_key, + conn->client_seq_num, finished_record, finished_record_len, record, &recordlen) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1616, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + ; + ; + tls_seq_num_incr(conn->client_seq_num); + + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1628, __FUNCTION__); } while (0); + } + return ret; + } + + return 1; +} + +int tls_recv_client_finished(TLS_CONNECT *conn) +{ + int ret; + uint8_t *record = conn->record; + size_t recordlen; + + uint8_t finished_record[(((1 + 2 + 2) + 4 + 12) + (32) + (1 + 255))]; + size_t finished_record_len; + const uint8_t *verify_data; + size_t verify_data_len; + + uint8_t local_verify_data[12]; + + SM3_CTX tmp_sm3_ctx; + uint8_t sm3_hash[32]; + + + ; + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != -1000) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1656, __FUNCTION__); } while (0); + } + return ret; + } + if ((((uint16_t)((record)[1]) << 8) | (record)[2]) != conn->protocol) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1661, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (recordlen > sizeof(finished_record)) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1666, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + ; + + + ; + if (tls_record_decrypt(&conn->client_write_mac_ctx, &conn->client_write_enc_key, + conn->client_seq_num, record, recordlen, finished_record, &finished_record_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1676, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_record_mac); + return -1; + } + ; + tls_seq_num_incr(conn->client_seq_num); + if (tls_record_get_handshake_finished(finished_record, &verify_data, &verify_data_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1683, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_record_mac); + return -1; + } + if (verify_data_len != sizeof(local_verify_data)) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1688, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_record_mac); + return -1; + } + + + __builtin___memcpy_chk (&tmp_sm3_ctx, &conn->sm3_ctx, sizeof(SM3_CTX), __builtin_object_size (&tmp_sm3_ctx, 0)); + sm3_update(&conn->sm3_ctx, finished_record + 5, finished_record_len - 5); + sm3_finish(&tmp_sm3_ctx, sm3_hash); + if (tls_prf(conn->master_secret, 48, "client finished", sm3_hash, 32, ((void*)0), 0, + sizeof(local_verify_data), local_verify_data) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1699, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + if (memcmp(verify_data, local_verify_data, sizeof(local_verify_data)) != 0) { + do { if (1) fprintf(__stderrp, "%s: %d: %s: %s\n", "tls12.c", 1704, __FUNCTION__, "client_finished.verify_data verification failure"); } while (0); + tls_send_alert(conn, TLS_alert_decrypt_error); + return -1; + } + + return 1; +} + +int tls_send_server_finished(TLS_CONNECT *conn) +{ + int ret; + uint8_t *record = conn->record; + size_t recordlen; + uint8_t sm3_hash[32]; + uint8_t local_verify_data[12]; + + uint8_t finished_record[(((1 + 2 + 2) + 4 + 12) + (32) + (1 + 255))]; + size_t finished_record_len; + + if (conn->recordlen == 0) { + ; + sm3_finish(&conn->sm3_ctx, sm3_hash); + if (tls_prf(conn->master_secret, 48, "server finished", sm3_hash, 32, ((void*)0), 0, + sizeof(local_verify_data), local_verify_data) != 1 + || tls_record_set_handshake_finished(finished_record, &finished_record_len, + local_verify_data, sizeof(local_verify_data)) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1730, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + ; + if (tls_record_encrypt(&conn->server_write_mac_ctx, &conn->server_write_enc_key, + conn->server_seq_num, finished_record, finished_record_len, record, &recordlen) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1737, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + ; + ; + tls_seq_num_incr(conn->server_seq_num); + } + + if ((ret = tls_send_record(conn)) != 1) { + if (ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1748, __FUNCTION__); } while (0); + } + return ret; + } + + + return 1; +} + +int tls_recv_server_finished(TLS_CONNECT *conn) +{ + int ret; + uint8_t *record = conn->record; + size_t recordlen; + + uint8_t finished_record[(((1 + 2 + 2) + 4 + 12) + (32) + (1 + 255))]; + size_t finished_record_len; + + uint8_t sm3_hash[32]; + + const uint8_t *verify_data; + size_t verify_data_len; + uint8_t local_verify_data[12]; + + + + ; + if ((ret = tls_recv_record(conn)) != 1) { + if (ret != -1000) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1777, __FUNCTION__); } while (0); + } + return ret; + } + if ((((uint16_t)((record)[1]) << 8) | (record)[2]) != conn->protocol) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1782, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (recordlen > sizeof(finished_record)) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1787, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_record_mac); + return -1; + } + ; + ; + if (tls_record_decrypt(&conn->server_write_mac_ctx, &conn->server_write_enc_key, + conn->server_seq_num, record, recordlen, finished_record, &finished_record_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1795, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_bad_record_mac); + return -1; + } + ; + tls_seq_num_incr(conn->server_seq_num); + if (tls_record_get_handshake_finished(finished_record, &verify_data, &verify_data_len) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1802, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + if (verify_data_len != sizeof(local_verify_data)) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1807, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_unexpected_message); + return -1; + } + sm3_finish(&conn->sm3_ctx, sm3_hash); + if (tls_prf(conn->master_secret, 48, "server finished", + sm3_hash, 32, ((void*)0), 0, sizeof(local_verify_data), local_verify_data) != 1) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1814, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_internal_error); + return -1; + } + if (memcmp(verify_data, local_verify_data, sizeof(local_verify_data)) != 0) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1819, __FUNCTION__); } while (0); + tls_send_alert(conn, TLS_alert_decrypt_error); + return -1; + } + + if (!conn->quiet) + fprintf(__stderrp, "Connection established!\n"); + + return 1; +} +# 1853 "tls12.c" +int tls12_do_client_handshake(TLS_CONNECT *conn) +{ + int ret; + int next_state; + + switch (conn->state) { + case TLS_state_client_hello: + ret = tls_send_client_hello(conn); + next_state = TLS_state_server_hello; + break; + + case TLS_state_server_hello: + ret = tls_recv_server_hello(conn); + next_state = TLS_state_server_certificate; + break; + + case TLS_state_server_certificate: + ret = tls_recv_server_certificate(conn); + next_state = TLS_state_server_key_exchange; + break; + + case TLS_state_server_key_exchange: + ret = tls_recv_server_key_exchange(conn); + next_state = TLS_state_certificate_request; + break; + + + case TLS_state_certificate_request: + ret = tls_recv_certificate_request(conn); + if (ret == 1) conn->client_certificate_verify = 1; + next_state = TLS_state_server_hello_done; + break; + + case TLS_state_server_hello_done: + ret = tls_recv_server_hello_done(conn); + if (conn->client_certificate_verify) + next_state = TLS_state_client_certificate; + else next_state = TLS_state_client_key_exchange; + break; + + case TLS_state_client_certificate: + ret = tls_send_client_certificate(conn); + next_state = TLS_state_client_key_exchange; + break; + + case TLS_state_client_key_exchange: + ret = tls_send_client_key_exchange(conn); + next_state = TLS_state_generate_keys; + break; + + case TLS_state_generate_keys: + ret = tls_generate_keys(conn); + if (conn->client_certificate_verify) + next_state = TLS_state_certificate_verify; + else next_state = TLS_state_client_change_cipher_spec; + break; + + case TLS_state_certificate_verify: + ret = tls_send_certificate_verify(conn); + next_state = TLS_state_client_change_cipher_spec; + + case TLS_state_client_change_cipher_spec: + ret = tls_send_change_cipher_spec(conn); + next_state = TLS_state_client_finished; + break; + + case TLS_state_client_finished: + ret = tls_send_client_finished(conn); + next_state = TLS_state_server_change_cipher_spec; + break; + + case TLS_state_server_change_cipher_spec: + ret = tls_recv_change_cipher_spec(conn); + next_state = TLS_state_server_finished; + break; + + case TLS_state_server_finished: + ret = tls_recv_server_finished(conn); + next_state = TLS_state_handshake_over; + break; + + default: + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1935, __FUNCTION__); } while (0); + return -1; + } + + if (ret < 1) { + if (ret == -1000 || ret == -1001) { + return ret; + } else { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 1943, __FUNCTION__); } while (0); + return ret; + } + } + + conn->state = next_state; + + + if (ret == 1) { + tls_clean_record(conn); + } + + return 1; +} + +int tls12_do_server_handshake(TLS_CONNECT *conn) +{ + int ret; + int next_state; + + switch (conn->state) { + case TLS_state_client_hello: + ret = tls_recv_client_hello(conn); + next_state = TLS_state_server_hello; + break; + + case TLS_state_server_hello: + ret = tls_send_server_hello(conn); + next_state = TLS_state_server_certificate; + break; + + case TLS_state_server_certificate: + ret = tls_send_server_certificate(conn); + next_state = TLS_state_server_key_exchange; + break; + + case TLS_state_server_key_exchange: + ret = tls_send_server_key_exchange(conn); + if (conn->client_certificate_verify) + next_state = TLS_state_certificate_request; + else next_state = TLS_state_server_hello_done; + break; + + case TLS_state_certificate_request: + ret = tls_send_certificate_request(conn); + next_state = TLS_state_server_hello_done; + break; + + case TLS_state_server_hello_done: + ret = tls_send_server_hello_done(conn); + if (conn->client_certificate_verify) + next_state = TLS_state_client_certificate; + else next_state = TLS_state_client_key_exchange; + break; + + case TLS_state_client_certificate: + ret = tls_recv_client_certificate(conn); + next_state = TLS_state_client_key_exchange; + break; + + case TLS_state_client_key_exchange: + ret = tls_recv_client_key_exchange(conn); + if (conn->client_certificate_verify) + next_state = TLS_state_certificate_verify; + else next_state = TLS_state_client_change_cipher_spec; + break; + + case TLS_state_certificate_verify: + ret = tls_recv_certificate_verify(conn); + next_state = TLS_state_generate_keys; + break; + + case TLS_state_generate_keys: + ret = tls_generate_keys(conn); + next_state = TLS_state_client_change_cipher_spec; + + case TLS_state_client_change_cipher_spec: + ret = tls_recv_change_cipher_spec(conn); + next_state = TLS_state_client_finished; + break; + + case TLS_state_client_finished: + ret = tls_recv_client_finished(conn); + next_state = TLS_state_server_change_cipher_spec; + break; + + case TLS_state_server_change_cipher_spec: + ret = tls_send_change_cipher_spec(conn); + next_state = TLS_state_server_finished; + break; + + case TLS_state_server_finished: + ret = tls_send_server_finished(conn); + next_state = TLS_state_handshake_over; + break; + + default: + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 2040, __FUNCTION__); } while (0); + return -1; + } + + if (ret < 1) { + if (ret == -1000 || ret == -1001) { + return ret; + } else { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 2048, __FUNCTION__); } while (0); + return ret; + } + + } + + conn->state = next_state; + + tls_clean_record(conn); + + return 1; +} + +int tls12_client_handshake(TLS_CONNECT *conn) +{ + int ret; + + conn->state = TLS_state_client_hello; + + while (conn->state != TLS_state_handshake_over) { + + ret = tls12_do_client_handshake(conn); + + if (ret != 1) { + if (ret != -1000 && ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 2073, __FUNCTION__); } while (0); + } + return ret; + } + } + + + + return 1; +} + +int tls12_server_handshake(TLS_CONNECT *conn) +{ + int ret; + + conn->state = TLS_state_client_hello; + + while (conn->state != TLS_state_handshake_over) { + + ret = tls12_do_server_handshake(conn); + + if (ret != 1) { + if (ret != -1000 && ret != -1001) { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 2096, __FUNCTION__); } while (0); + } + return ret; + } + } + + + + return 1; +} + + + + + +int tls12_do_connect(TLS_CONNECT *conn) +{ + int ret; + fd_set rfds; + fd_set wfds; + + while (1) { + + ret = tls12_client_handshake(conn); + if (ret == 1) { + break; + + } else if (ret == -1001) { + __builtin_bzero(&rfds, sizeof(*(&rfds))); + __builtin_bzero(&wfds, sizeof(*(&wfds))); + __darwin_fd_set((conn->sock), (&rfds)); + select(conn->sock + 1, &rfds, &wfds, ((void*)0), ((void*)0)); + + } else if (ret == -1000) { + __builtin_bzero(&rfds, sizeof(*(&rfds))); + __builtin_bzero(&wfds, sizeof(*(&wfds))); + __darwin_fd_set((conn->sock), (&wfds)); + select(conn->sock + 1, &rfds, &wfds, ((void*)0), ((void*)0)); + + } else { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 2136, __FUNCTION__); } while (0); + return -1; + } + } + + return 1; +} + +int tls12_do_accept(TLS_CONNECT *conn) +{ + int ret; + fd_set rfds; + fd_set wfds; + + while (1) { + + ret = tls12_server_handshake(conn); + + if (ret == 1) { + break; + + } else if (ret == -1001) { + __builtin_bzero(&rfds, sizeof(*(&rfds))); + __builtin_bzero(&wfds, sizeof(*(&wfds))); + __darwin_fd_set((conn->sock), (&rfds)); + select(conn->sock + 1, &rfds, &wfds, ((void*)0), ((void*)0)); + + } else if (ret == -1000) { + __builtin_bzero(&rfds, sizeof(*(&rfds))); + __builtin_bzero(&wfds, sizeof(*(&wfds))); + __darwin_fd_set((conn->sock), (&wfds)); + select(conn->sock + 1, &rfds, &wfds, ((void*)0), ((void*)0)); + + } else { + do { if (1) fprintf(__stderrp, "%s:%d:%s():\n","tls12.c", 2170, __FUNCTION__); } while (0); + return -1; + } + } + + return 1; +} diff --git a/src/x509_alg.c b/src/x509_alg.c index 69f94255..7280e0a0 100644 --- a/src/x509_alg.c +++ b/src/x509_alg.c @@ -275,9 +275,15 @@ id-alg-xmssmt-hashsig OBJECT IDENTIFIER ::= { security(5) mechanisms(5) pkix(7) algorithms(6) 35 } */ static uint32_t oid_hss_lms_hashsig[] = { oid_pkcs,9,16,3,17 }; +static uint32_t oid_lms_hashsig[] = { oid_pkcs,9,16,3,17,1 }; // TODO: not officially defined static uint32_t oid_xmss_hashsig[] = { oid_alg, 34 }; static uint32_t oid_xmssmt_hashsig[] = { oid_alg, 35 }; +// joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistAlgorithms(4) +#define oid_nist_algs 2,16,840,1,101,3,4 +static uint32_t oid_sphincs_hashsig[] = { oid_nist_algs,3,20 }; // TODO: sphincs+ 128s with sha256, not officially defined + + /* from RFC 3447 Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1 @@ -364,12 +370,14 @@ static const ASN1_OID_INFO x509_sign_algors[] = { { OID_rsasign_with_sha384, "sha384WithRSAEncryption", oid_rsasign_with_sha384, sizeof(oid_rsasign_with_sha384)/sizeof(int), 1 }, { OID_rsasign_with_sha512, "sha512WithRSAEncryption", oid_rsasign_with_sha512, sizeof(oid_rsasign_with_sha512)/sizeof(int), 1 }, #ifdef ENABLE_LMS + { OID_lms_hashsig, "lms-hashsig", oid_lms_hashsig, sizeof(oid_lms_hashsig)/sizeof(int), 1 }, { OID_hss_lms_hashsig, "hss-lms-hashsig", oid_hss_lms_hashsig, sizeof(oid_hss_lms_hashsig)/sizeof(int), 1 }, #endif #ifdef ENABLE_XMSS { OID_xmss_hashsig, "xmss-hashsig", oid_xmss_hashsig, sizeof(oid_xmss_hashsig)/sizeof(int), 1 }, { OID_xmssmt_hashsig, "xmssmt-hashsig", oid_xmssmt_hashsig, sizeof(oid_xmssmt_hashsig)/sizeof(int), 1 }, #endif + { OID_sphincs_hashsig, "sphincs-hashsig", oid_sphincs_hashsig, sizeof(oid_sphincs_hashsig)/sizeof(int), 1 }, }; static const int x509_sign_algors_count = @@ -588,12 +596,16 @@ static const ASN1_OID_INFO x509_public_key_algors[] = { { OID_ec_public_key, "ecPublicKey", oid_ec_public_key, sizeof(oid_ec_public_key)/sizeof(int), 0, "X9.62 ecPublicKey" }, { OID_rsa_encryption, "rsaEncryption", oid_rsa_encryption, sizeof(oid_rsa_encryption)/sizeof(int), 0, "RSAEncryption" }, #ifdef ENABLE_LMS + { OID_lms_hashsig, "lms-hashsig", oid_lms_hashsig, sizeof(oid_lms_hashsig)/sizeof(int), 0, "HSS/LMS HashSig" }, { OID_hss_lms_hashsig, "hss-lms-hashsig", oid_hss_lms_hashsig, sizeof(oid_hss_lms_hashsig)/sizeof(int), 0, "HSS/LMS HashSig" }, #endif #ifdef ENABLE_XMSS { OID_xmss_hashsig, "xmss-hashsig", oid_xmss_hashsig, sizeof(oid_xmss_hashsig)/sizeof(int), 1 }, { OID_xmssmt_hashsig, "xmssmt-hashsig", oid_xmssmt_hashsig, sizeof(oid_xmssmt_hashsig)/sizeof(int), 1 }, #endif +#ifdef ENABLE_SPHINCS + { OID_sphincs_hashsig, "sphincs-hashsig", oid_sphincs_hashsig, sizeof(oid_sphincs_hashsig)/sizeof(int), 1 }, +#endif }; static const int x509_public_key_algors_count = @@ -645,7 +657,16 @@ int x509_public_key_algor_to_der(int oid, int curve_or_null, uint8_t **out, size } break; #ifdef ENABLE_LMS - // TODO: rsa, hss/lms, xmss/xmss^mt OID encoding is similar, reduce code size + case OID_lms_hashsig: + if (asn1_object_identifier_to_der(oid_lms_hashsig, sizeof(oid_lms_hashsig)/sizeof(int), NULL, &len) != 1 + || asn1_null_to_der(NULL, &len) != 1 + || asn1_sequence_header_to_der(len, out, outlen) != 1 + || asn1_object_identifier_to_der(oid_lms_hashsig, sizeof(oid_lms_hashsig)/sizeof(int), out, outlen) != 1 + || asn1_null_to_der(out, outlen) != 1) { + error_print(); + return -1; + } + break; case OID_hss_lms_hashsig: if (asn1_object_identifier_to_der(oid_hss_lms_hashsig, sizeof(oid_hss_lms_hashsig)/sizeof(int), NULL, &len) != 1 || asn1_null_to_der(NULL, &len) != 1 @@ -656,6 +677,8 @@ int x509_public_key_algor_to_der(int oid, int curve_or_null, uint8_t **out, size return -1; } break; + + #endif #ifdef ENABLE_XMSS case OID_xmss_hashsig: @@ -678,6 +701,18 @@ int x509_public_key_algor_to_der(int oid, int curve_or_null, uint8_t **out, size return -1; } break; +#endif +#ifdef ENABLE_SPHINCS + case OID_sphincs_hashsig: + if (asn1_object_identifier_to_der(oid_sphincs_hashsig, sizeof(oid_sphincs_hashsig)/sizeof(int), NULL, &len) != 1 + || asn1_null_to_der(NULL, &len) != 1 + || asn1_sequence_header_to_der(len, out, outlen) != 1 + || asn1_object_identifier_to_der(oid_sphincs_hashsig, sizeof(oid_sphincs_hashsig)/sizeof(int), out, outlen) != 1 + || asn1_null_to_der(out, outlen) != 1) { + error_print(); + return -1; + } + break; #endif default: error_print(); @@ -713,18 +748,40 @@ int x509_public_key_algor_from_der(int *oid , int *curve_or_null, const uint8_t } break; case OID_rsa_encryption: + // AlgorithmIdentifier.parameters must be explicitly set be NULL object + // asn1_null_from_der return 1 when NULL object exists, return 0 if paramters is empty. + if ((ret = asn1_null_from_der(&d, &dlen)) < 0 + || asn1_length_is_zero(dlen) != 1) { + error_print(); + return -1; + } + if (ret == 0) { + // As some legacy code might omit the NULL object, we tolerate this error + error_print(); + } + // present the parameters (NULL object) as OID_undef(0). + *curve_or_null = OID_undef; + break; + #ifdef ENABLE_LMS + case OID_lms_hashsig: case OID_hss_lms_hashsig: #endif #ifdef ENABLE_XMSS case OID_xmss_hashsig: case OID_xmssmt_hashsig: #endif - if ((*curve_or_null = asn1_null_from_der(&d, &dlen)) < 0 + case OID_sphincs_hashsig: + // for hashsigs, parmaeters is set to empty + if ((ret = asn1_null_from_der(&d, &dlen)) < 0 || asn1_length_is_zero(dlen) != 1) { error_print(); return -1; } + if (ret == 1) { + error_print(); + } + *curve_or_null = OID_undef; break; default: error_print(); @@ -751,12 +808,14 @@ int x509_public_key_algor_print(FILE *fp, int fmt, int ind, const char *label, c break; case OID_rsa_encryption: #ifdef ENABLE_LMS + case OID_lms_hashsig: case OID_hss_lms_hashsig: #endif #ifdef ENABLE_XMSS case OID_xmss_hashsig: case OID_xmssmt_hashsig: #endif + case OID_sphincs_hashsig: if ((val = asn1_null_from_der(&d, &dlen)) < 0) goto err; else if (val) format_print(fp, fmt, ind, "parameters: %s\n", asn1_null_name()); break; diff --git a/src/x509_cer.c b/src/x509_cer.c index 1520ded8..11761e54 100644 --- a/src/x509_cer.c +++ b/src/x509_cer.c @@ -1160,7 +1160,14 @@ int x509_cert_sign_to_der( if (out && *out) { X509_SIGN_CTX sign_ctx; - if (x509_sign_init(&sign_ctx, sign_key, signer_id, signer_id_len) != 1 + void *sign_args = NULL; + size_t sign_argslen = 0; + + if (sign_key->algor == OID_ec_public_key && sign_key->algor_param == OID_sm2) { + sign_args = SM2_DEFAULT_ID; + sign_argslen = SM2_DEFAULT_ID_LENGTH; + } + if (x509_sign_init(&sign_ctx, sign_key, sign_args, sign_argslen) != 1 || x509_sign_update(&sign_ctx, tbs, *out - tbs) != 1 || x509_sign_finish(&sign_ctx, sig, &siglen) != 1) { gmssl_secure_clear(&sign_ctx, sizeof(sign_ctx)); @@ -1214,6 +1221,8 @@ int x509_signed_verify(const uint8_t *a, size_t alen, const uint8_t *sig; size_t siglen; int key_sig_alg; + void *sign_args = NULL; + size_t sign_argslen = 0; X509_SIGN_CTX verify_ctx; if (x509_key_get_sign_algor(key, &key_sig_alg) != 1) { @@ -1231,7 +1240,11 @@ int x509_signed_verify(const uint8_t *a, size_t alen, return -1; } - if (x509_verify_init(&verify_ctx, key, signer_id, signer_id_len, sig, siglen) != 1 + if (key->algor == OID_ec_public_key && key->algor_param == OID_sm2) { + sign_args = SM2_DEFAULT_ID; + sign_argslen = SM2_DEFAULT_ID_LENGTH; + } + if (x509_verify_init(&verify_ctx, key, sign_args, sign_argslen, sig, siglen) != 1 || x509_verify_update(&verify_ctx, tbs, tbslen) != 1 || x509_verify_finish(&verify_ctx) != 1) { error_print(); diff --git a/src/x509_crl.c b/src/x509_crl.c index 6410da97..31ffcbf3 100644 --- a/src/x509_crl.c +++ b/src/x509_crl.c @@ -1465,7 +1465,14 @@ int x509_crl_sign_to_der( } if (out && *out) { X509_SIGN_CTX sign_ctx; - if (x509_sign_init(&sign_ctx, sign_key, signer_id, signer_id_len) != 1 + void *sign_args = NULL; + size_t sign_argslen = 0; + + if (sign_key->algor == OID_ec_public_key && sign_key->algor_param == OID_sm2) { + sign_args = SM2_DEFAULT_ID; + sign_argslen = SM2_DEFAULT_ID_LENGTH; + } + if (x509_sign_init(&sign_ctx, sign_key, sign_args, sign_argslen) != 1 || x509_sign_update(&sign_ctx, tbs, *out - tbs) != 1 || x509_sign_finish(&sign_ctx, sig, &siglen) != 1) { gmssl_secure_clear(&sign_ctx, sizeof(sign_ctx)); diff --git a/src/x509_key.c b/src/x509_key.c index 5fa33c30..6ebd8e99 100644 --- a/src/x509_key.c +++ b/src/x509_key.c @@ -13,14 +13,111 @@ #include #include #include -#include #include +#include +#include +#include +#include #include #include #include #include + +int x509_key_set_sm2_key(X509_KEY *x509_key, const SM2_KEY *sm2_key) +{ + if (!x509_key || !sm2_key) { + error_print(); + return -1; + } + memset(x509_key, 0, sizeof(X509_KEY)); + x509_key->algor = OID_ec_public_key; + x509_key->algor_param = OID_sm2; + x509_key->u.sm2_key = *sm2_key; + x509_key->signer_id = SM2_DEFAULT_ID; + x509_key->signer_idlen = SM2_DEFAULT_ID_LENGTH; + return 1; +} + +int x509_key_set_lms_key(X509_KEY *x509_key, const LMS_KEY *lms_key) +{ + if (!x509_key || !lms_key) { + error_print(); + return -1; + } + memset(x509_key, 0, sizeof(X509_KEY)); + x509_key->algor = OID_lms_hashsig; + x509_key->algor_param = OID_undef; + x509_key->u.lms_key = *lms_key; + return 1; +} + +int x509_key_set_hss_key(X509_KEY *x509_key, const HSS_KEY *hss_key) +{ + if (!x509_key || !hss_key) { + error_print(); + return -1; + } + memset(x509_key, 0, sizeof(X509_KEY)); + x509_key->algor = OID_hss_lms_hashsig; + x509_key->algor_param = OID_undef; + x509_key->u.hss_key = *hss_key; + return 1; +} + +int x509_key_set_xmss_key(X509_KEY *x509_key, const XMSS_KEY *xmss_key) +{ + if (!x509_key || !xmss_key) { + error_print(); + return -1; + } + memset(x509_key, 0, sizeof(X509_KEY)); + x509_key->algor = OID_xmss_hashsig; + x509_key->algor_param = OID_undef; + x509_key->u.xmss_key = *xmss_key; + return 1; +} + +int x509_key_set_xmssmt_key(X509_KEY *x509_key, const XMSSMT_KEY *xmssmt_key) +{ + if (!x509_key || !xmssmt_key) { + error_print(); + return -1; + } + memset(x509_key, 0, sizeof(X509_KEY)); + x509_key->algor = OID_xmssmt_hashsig; + x509_key->algor_param = OID_undef; + x509_key->u.xmssmt_key = *xmssmt_key; + return 1; +} + +int x509_key_set_sphincs_key(X509_KEY *x509_key, const SPHINCS_KEY *sphincs_key) +{ + if (!x509_key || !sphincs_key) { + error_print(); + return -1; + } + memset(x509_key, 0, sizeof(X509_KEY)); + x509_key->algor = OID_sphincs_hashsig; + x509_key->algor_param = OID_undef; + x509_key->u.sphincs_key = *sphincs_key; + return 1; +} + +int x509_key_set_secp256r1_key(X509_KEY *x509_key, const SECP256R1_KEY *secp256r1_key) +{ + if (!x509_key || !secp256r1_key) { + error_print(); + return -1; + } + memset(x509_key, 0, sizeof(X509_KEY)); + x509_key->algor = OID_ec_public_key; + x509_key->algor_param = OID_secp256r1; + x509_key->u.secp256r1_key = *secp256r1_key; + return 1; +} + // currently the lms_type(s) of SHA-256 and SM3 are smaller than 4-bit // so we encode the lms_types into 4-bit array and int value // TODO: if max lms_type > 15, this function must be change! @@ -67,7 +164,6 @@ int x509_algor_param_to_lms_types(int algor_param, int lms_types[5], size_t *num return 1; } - int x509_key_generate(X509_KEY *key, int algor, int algor_param) { if (!key) { @@ -76,6 +172,9 @@ int x509_key_generate(X509_KEY *key, int algor, int algor_param) } memset(key, 0, sizeof(X509_KEY)); + key->algor = algor; + key->algor_param = OID_undef; + switch (algor) { case OID_ec_public_key: if (algor_param == OID_sm2) { @@ -83,12 +182,18 @@ int x509_key_generate(X509_KEY *key, int algor, int algor_param) error_print(); return -1; } + key->signer_id = SM2_DEFAULT_ID; + key->signer_idlen = SM2_DEFAULT_ID_LENGTH; } else if (algor_param == OID_secp256r1) { if (secp256r1_key_generate(&key->u.secp256r1_key) != 1) { error_print(); return -1; } + } else { + error_print(); + return -1; } + key->algor_param = algor_param; // only OID_ec_public_key has parameters break; case OID_lms_hashsig: if (!lms_type_name(algor_param)) { @@ -148,12 +253,35 @@ int x509_key_generate(X509_KEY *key, int algor, int algor_param) error_print(); return -1; } - key->algor = algor; - key->algor_param = algor_param; return 1; } + + + + + + + + + + + + + + + + + + + + + + + + + int x509_public_key_print(FILE *fp, int fmt, int ind, const char *label, const X509_KEY *key) { switch (key->algor) { @@ -211,68 +339,46 @@ int x509_public_key_print(FILE *fp, int fmt, int ind, const char *label, const X } -int x509_key_set_sm2_key(X509_KEY *x509_key, const SM2_KEY *sm2_key) -{ - memset(x509_key, 0, sizeof(X509_KEY)); - x509_key->algor = OID_ec_public_key; - x509_key->algor_param = OID_sm2; - x509_key->u.sm2_key = *sm2_key; - return 1; -} -int x509_key_set_secp256r1_key(X509_KEY *x509_key, const SECP256R1_KEY *secp256r1_key) -{ - memset(x509_key, 0, sizeof(X509_KEY)); - x509_key->algor = OID_ec_public_key; - x509_key->algor_param = OID_secp256r1; - x509_key->u.secp256r1_key = *secp256r1_key; - return 1; -} -int x509_key_set_lms_key(X509_KEY *x509_key, const LMS_KEY *lms_key) -{ - memset(x509_key, 0, sizeof(X509_KEY)); - x509_key->algor = OID_lms_hashsig; - x509_key->algor_param = OID_undef; - x509_key->u.lms_key = *lms_key; - return 1; -} -int x509_key_set_hss_key(X509_KEY *x509_key, const HSS_KEY *hss_key) -{ - memset(x509_key, 0, sizeof(X509_KEY)); - x509_key->algor = OID_hss_lms_hashsig; - x509_key->algor_param = OID_undef; - x509_key->u.hss_key = *hss_key; - return 1; -} -int x509_key_set_xmss_key(X509_KEY *x509_key, const XMSS_KEY *xmss_key) -{ - memset(x509_key, 0, sizeof(X509_KEY)); - x509_key->algor = OID_xmss_hashsig; - x509_key->algor_param = OID_undef; - x509_key->u.xmss_key = *xmss_key; - return 1; -} -int x509_key_set_xmssmt_key(X509_KEY *x509_key, const XMSSMT_KEY *xmssmt_key) -{ - memset(x509_key, 0, sizeof(X509_KEY)); - x509_key->algor = OID_xmssmt_hashsig; - x509_key->algor_param = OID_undef; - x509_key->u.xmssmt_key = *xmssmt_key; - return 1; -} -int x509_key_set_sphincs_key(X509_KEY *x509_key, const SPHINCS_KEY *sphincs_key) -{ - memset(x509_key, 0, sizeof(X509_KEY)); - x509_key->algor = OID_sphincs_hashsig; - x509_key->algor_param = OID_undef; - x509_key->u.sphincs_key = *sphincs_key; - return 1; -} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + int x509_key_get_sign_algor(const X509_KEY *key, int *algor) { @@ -281,6 +387,19 @@ int x509_key_get_sign_algor(const X509_KEY *key, int *algor) return -1; } + if (key->algor == OID_ec_public_key) { + if (key->algor_param == OID_sm2) { + *algor = OID_sm2sign_with_sm3; + return 1; + } else if (key->algor_param == OID_secp256r1) { + *algor = OID_ecdsa_with_sha256; + return 1; + } else { + error_print(); + return -1; + } + } + switch (key->algor) { case OID_lms_hashsig: case OID_hss_lms_hashsig: @@ -289,9 +408,6 @@ int x509_key_get_sign_algor(const X509_KEY *key, int *algor) case OID_sphincs_hashsig: *algor = key->algor; break; - case OID_ec_public_key: - *algor = OID_sm2sign_with_sm3; - break; default: fprintf(stderr, "key->algor = %d\n", key->algor); error_print(); @@ -307,51 +423,13 @@ int x509_public_key_digest(const X509_KEY *key, uint8_t dgst[32]) uint8_t *p = bits; size_t len = 0; - switch (key->algor) { - case OID_ec_public_key: - if (key->algor_param == OID_sm2) { - if (sm2_z256_point_to_uncompressed_octets(&key->u.sm2_key.public_key, bits) != 1) { - error_print(); - return -1; - } - len = 65; - } else if (key->algor_param == OID_secp256r1) { - if (secp256r1_public_key_to_bytes(&key->u.secp256r1_key, &p, &len) != 1) { - error_print(); - return -1; - } - } else { - error_print(); - return -1; - } - break; - case OID_hss_lms_hashsig: - if (hss_public_key_to_bytes(&key->u.hss_key, &p, &len) != 1) { - error_print(); - return -1; - } - break; - case OID_xmss_hashsig: - if (xmss_public_key_to_bytes(&key->u.xmss_key, &p, &len) != 1) { - error_print(); - return -1; - } - break; - case OID_xmssmt_hashsig: - if (xmssmt_public_key_to_bytes(&key->u.xmssmt_key, &p, &len) != 1) { - error_print(); - return -1; - } - break; - default: + if (x509_public_key_to_bytes(key, &p, &len) != 1) { error_print(); return -1; } - sm3_init(&ctx); sm3_update(&ctx, bits, len); sm3_finish(&ctx, dgst); - return 1; } @@ -467,12 +545,17 @@ int x509_key_get_signature_size(const X509_KEY *key, size_t *siglen) return 1; } -int x509_sign_init(X509_SIGN_CTX *ctx, X509_KEY *key, const char *signer_id, size_t signer_idlen) +// 现在还不支持SPHINCS+呢! +int x509_sign_init(X509_SIGN_CTX *ctx, X509_KEY *key, const void *args, size_t argslen) { if (!ctx || !key) { error_print(); return -1; } + if (args && !argslen) { + error_print(); + return -1; + } switch (key->algor) { case OID_hss_lms_hashsig: @@ -498,6 +581,12 @@ int x509_sign_init(X509_SIGN_CTX *ctx, X509_KEY *key, const char *signer_id, siz break; case OID_ec_public_key: if (key->algor_param == OID_sm2) { + const char *signer_id = SM2_DEFAULT_ID; + size_t signer_idlen = SM2_DEFAULT_ID_LENGTH; + if (args) { + signer_id = (char *)args; + signer_idlen = argslen; + } if (sm2_sign_init(&ctx->u.sm2_sign_ctx, &key->u.sm2_key, signer_id, signer_idlen) != 1) { error_print(); return -1; @@ -608,13 +697,17 @@ int x509_sign_finish(X509_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen) return 1; } -int x509_verify_init(X509_SIGN_CTX *ctx, const X509_KEY *key, const char *signer_id, size_t signer_idlen, +int x509_verify_init(X509_SIGN_CTX *ctx, const X509_KEY *key, const void *args, size_t argslen, const uint8_t *sig, size_t siglen) { if (!ctx || !key || !sig || !siglen) { error_print(); return -1; } + if (args && !argslen) { + error_print(); + return -1; + } switch (key->algor) { case OID_hss_lms_hashsig: @@ -640,6 +733,12 @@ int x509_verify_init(X509_SIGN_CTX *ctx, const X509_KEY *key, const char *signer break; case OID_ec_public_key: if (key->algor_param == OID_sm2) { + const char *signer_id = SM2_DEFAULT_ID; + size_t signer_idlen = SM2_DEFAULT_ID_LENGTH; + if (args) { + signer_id = (char *)args; + signer_idlen = argslen; + } if (sm2_verify_init(&ctx->u.sm2_verify_ctx, &key->u.sm2_key, signer_id, signer_idlen) != 1) { error_print(); return -1; @@ -754,6 +853,79 @@ int x509_verify_finish(X509_SIGN_CTX *ctx) return 1; } +int x509_key_do_exchange(const X509_KEY *key, const X509_KEY *pub, uint8_t *out, size_t *outlen) +{ + if (!key || !pub || !out || !outlen) { + error_print(); + return -1; + } + if (key->algor != pub->algor || key->algor_param != pub->algor_param) { + error_print(); + return -1; + } + if (key->algor != OID_ec_public_key) { + error_print(); + return -1; + } + + switch (key->algor_param) { + case OID_sm2: + if (sm2_do_ecdh(&key->u.sm2_key, &pub->u.sm2_key, out) != 1) { + error_print(); + return -1; + } + break; + case OID_secp256r1: + if (secp256r1_do_ecdh(&key->u.secp256r1_key, &pub->u.secp256r1_key, out) != 1) { + error_print(); + return -1; + } + break; + default: + error_print(); + return -1; + } + *outlen = 32; + return 1; +} + +int x509_key_exchange(const X509_KEY *key, const uint8_t *peer_pub, size_t peer_publen, uint8_t *out, size_t *outlen) +{ + if (!key || !peer_pub || !out || !outlen) { + error_print(); + return -1; + } + if (key->algor != OID_ec_public_key) { + error_print(); + return -1; + } + if (peer_publen != 65) { + error_print(); + return -1; + } + switch (key->algor_param) { + case OID_sm2: + if (sm2_ecdh(&key->u.sm2_key, peer_pub, out) != 1) { + error_print(); + return -1; + } + break; + case OID_secp256r1: + if (secp256r1_ecdh(&key->u.secp256r1_key, peer_pub, out) != 1) { + error_print(); + return -1; + } + break; + default: + error_print(); + return -1; + } + *outlen = 32; + return 1; +} + + + int x509_public_key_info_to_der(const X509_KEY *x509_key, uint8_t **out, size_t *outlen) { uint8_t keybuf[300]; @@ -766,38 +938,9 @@ int x509_public_key_info_to_der(const X509_KEY *x509_key, uint8_t **out, size_t return -1; } - switch (x509_key->algor) { - case OID_hss_lms_hashsig: - if (hss_public_key_to_bytes(&x509_key->u.hss_key, &p, &keylen) != 1) { - error_print(); - return -1; - } - break; - case OID_xmss_hashsig: - if (xmss_public_key_to_bytes(&x509_key->u.xmss_key, &p, &keylen) != 1) { - error_print(); - return -1; - } - break; - case OID_xmssmt_hashsig: - if (xmssmt_public_key_to_bytes(&x509_key->u.xmssmt_key, &p, &keylen) != 1) { - error_print(); - return -1; - } - break; - case OID_ec_public_key: - if (x509_key->algor_param == OID_sm2) { - sm2_z256_point_to_uncompressed_octets(&x509_key->u.sm2_key.public_key, p); - keylen = 65; - } else if (x509_key->algor_param == OID_secp256r1) { - if (secp256r1_public_key_to_bytes(&x509_key->u.secp256r1_key, &p, &keylen) != 1) { - error_print(); - return -1; - } - } - break; - default: + if (x509_public_key_to_bytes(x509_key, &p, &keylen) != 1) { error_print(); + return -1; } // 这几个函数需要合并到一起 @@ -873,6 +1016,12 @@ int x509_public_key_info_from_der(X509_KEY *x509_key, const uint8_t **in, size_t return -1; } break; + case OID_lms_hashsig: + if (lms_public_key_from_bytes(&x509_key->u.lms_key, &pub, &publen) != 1) { + error_print(); + return -1; + } + break; case OID_hss_lms_hashsig: if (hss_public_key_from_bytes(&x509_key->u.hss_key, &pub, &publen) != 1) { error_print(); @@ -911,7 +1060,592 @@ int x509_public_key_info_from_der(X509_KEY *x509_key, const uint8_t **in, size_t return 1; } -// FIXME: this function can not parse depends on algor_param + + + + + + + + + + + + + + + + + + + + + + +void x509_key_cleanup(X509_KEY *key) +{ + if (key) { + switch (key->algor) { + case OID_ec_public_key: + if (key->algor_param == OID_sm2) { + //sm2_key_cleanup(&key->u.sm2_key); + gmssl_secure_clear(&key->u.sm2_key, sizeof(SM2_KEY)); + } else if (key->algor_param == OID_secp256r1) { + secp256r1_key_cleanup(&key->u.secp256r1_key); + } + break; + case OID_lms_hashsig: + lms_key_cleanup(&key->u.lms_key); + break; + case OID_hss_lms_hashsig: + hss_key_cleanup(&key->u.hss_key); + break; + case OID_xmss_hashsig: + xmss_key_cleanup(&key->u.xmss_key); + break; + case OID_xmssmt_hashsig: + xmssmt_key_cleanup(&key->u.xmssmt_key); + break; + case OID_sphincs_hashsig: + sphincs_key_cleanup(&key->u.sphincs_key); + break; + default: + error_print(); + } + } +} + +int x509_public_key_to_bytes(const X509_KEY *key, uint8_t **out, size_t *outlen) +{ + if (!key || !outlen) { + error_print(); + return -1; + } + + switch (key->algor) { + case OID_ec_public_key: + switch (key->algor_param) { + case OID_sm2: + if (out && *out) { + sm2_z256_point_to_uncompressed_octets(&key->u.sm2_key.public_key, *out); + *out += 65; + } + *outlen += 65; + break; + case OID_secp256r1: + if (secp256r1_public_key_to_bytes(&key->u.secp256r1_key, out, outlen) != 1) { + error_print(); + return -1; + } + break; + default: + error_print(); + return -1; + } + break; + case OID_lms_hashsig: + if (lms_public_key_to_bytes(&key->u.lms_key, out, outlen) != 1) { + error_print(); + return -1; + } + break; + case OID_hss_lms_hashsig: + if (hss_public_key_to_bytes(&key->u.hss_key, out, outlen) != 1) { + error_print(); + return -1; + } + break; + case OID_xmss_hashsig: + if (xmss_public_key_to_bytes(&key->u.xmss_key, out, outlen) != 1) { + error_print(); + return -1; + } + break; + case OID_xmssmt_hashsig: + if (xmssmt_public_key_to_bytes(&key->u.xmssmt_key, out, outlen) != 1) { + error_print(); + return -1; + } + break; + case OID_sphincs_hashsig: + if (sphincs_public_key_to_bytes(&key->u.sphincs_key, out, outlen) != 1) { + error_print(); + return -1; + } + break; + default: + error_print(); + return -1; + } + return 1; +} + +void x509_sign_ctx_cleanup(X509_SIGN_CTX *ctx) +{ + if (ctx) { + gmssl_secure_clear(ctx, sizeof(X509_SIGN_CTX)); + memset(ctx, 0, sizeof(X509_SIGN_CTX)); + } +} + + + + + + + + + + + + + + + + + + +#define SM2_PRIVATE_KEY_DER_SIZE 121 + +int ec_private_key_to_der(const X509_KEY *key, int encode_params, int encode_pubkey, + uint8_t **out, size_t *outlen) +{ + uint8_t params[64]; + uint8_t pubkey[128]; + uint8_t *params_ptr = params; + uint8_t *pubkey_ptr = pubkey; + size_t params_len = 0; + size_t pubkey_len = 0; + uint8_t prikey[32]; + size_t len = 0; + + if (!key) { + error_print(); + return -1; + } + if (key->algor != OID_ec_public_key) { + error_print(); + return -1; + } + + if (encode_params) { + if (ec_named_curve_to_der(key->algor_param, ¶ms_ptr, ¶ms_len) != 1) { + gmssl_secure_clear(prikey, 32); + error_print(); + return -1; + } + } + switch (key->algor_param) { + case OID_sm2: + if (encode_pubkey) { + if (sm2_public_key_to_der(&key->u.sm2_key, &pubkey_ptr, &pubkey_len) != 1) { + error_print(); + return -1; + } + } + sm2_z256_to_bytes(key->u.sm2_key.private_key, prikey); + break; + case OID_secp256r1: + if (encode_pubkey) { + if (secp256r1_public_key_to_der(&key->u.secp256r1_key, &pubkey_ptr, &pubkey_len) != 1) { + error_print(); + return -1; + } + } + secp256r1_to_32bytes(key->u.secp256r1_key.private_key, prikey); + break; + default: + error_print(); + return -1; + } + + // 这里有严重的问题,explicit项目提供的数据不能为空,但是我们这的params,pubkey是可以为空的 + if (asn1_int_to_der(EC_private_key_version, NULL, &len) != 1 + || asn1_octet_string_to_der(prikey, 32, NULL, &len) != 1 + || asn1_explicit_to_der(0, params, params_len, NULL, &len) != 1 + || asn1_explicit_to_der(1, pubkey, pubkey_len, NULL, &len) != 1 + || asn1_sequence_header_to_der(len, out, outlen) != 1 + || asn1_int_to_der(EC_private_key_version, out, outlen) != 1 + || asn1_octet_string_to_der(prikey, 32, out, outlen) != 1 + || asn1_explicit_to_der(0, params, params_len, out, outlen) != 1 + || asn1_explicit_to_der(1, pubkey, pubkey_len, out, outlen) != 1) { + gmssl_secure_clear(prikey, 32); + error_print(); + return -1; + } + gmssl_secure_clear(prikey, 32); + return 1; +} + +// when params(curve) is omitted in ECPrivateKey, curve should be given explicitly +int ec_private_key_from_der(X509_KEY *key, int opt_curve, const uint8_t **in, size_t *inlen) +{ + int ret; + const uint8_t *d; + size_t dlen; + int ver; + const uint8_t *prikey; + const uint8_t *params; + const uint8_t *pubkey; + size_t prikey_len, params_len, pubkey_len; + int curve; + + if (!key || !in || !(*in) || !inlen) { + error_print(); + return -1; + } + + if ((ret = asn1_sequence_from_der(&d, &dlen, in, inlen)) != 1) { + if (ret < 0) error_print(); + return ret; + } + if (asn1_int_from_der(&ver, &d, &dlen) != 1 + || asn1_octet_string_from_der(&prikey, &prikey_len, &d, &dlen) != 1 + || asn1_explicit_from_der(0, ¶ms, ¶ms_len, &d, &dlen) != 1 + || asn1_explicit_from_der(1, &pubkey, &pubkey_len, &d, &dlen) != 1 + || asn1_check(ver == EC_private_key_version) != 1 + || asn1_length_is_zero(dlen) != 1) { + error_print(); + return -1; + } + if (!prikey || prikey_len != 32) { + error_print(); + return -1; + } + + if (params) { + if (ec_named_curve_from_der(&curve, ¶ms, ¶ms_len) != 1 + || asn1_length_is_zero(params_len) != 1) { + error_print(); + return -1; + } + if (curve != opt_curve && opt_curve != OID_undef) { + error_print(); + return -1; + } + } else { + curve = opt_curve; + } + + memset(key, 0, sizeof(X509_KEY)); + + if (curve == OID_sm2) { + + sm2_z256_t sm2_private; + SM2_KEY sm2_pub; + + sm2_z256_from_bytes(sm2_private, prikey); + if (sm2_key_set_private_key(&key->u.sm2_key, sm2_private) != 1) { + gmssl_secure_clear(sm2_private, sizeof(sm2_z256_t)); + error_print(); + return -1; + } + gmssl_secure_clear(sm2_private, sizeof(sm2_z256_t)); + + if (pubkey) { + if (sm2_public_key_from_der(&sm2_pub, &pubkey, &pubkey_len) != 1 + || asn1_length_is_zero(pubkey_len) != 1) { + error_print(); + return -1; + } + if (sm2_public_key_equ(&key->u.sm2_key, &sm2_pub) != 1) { + gmssl_secure_clear(&key->u.sm2_key, sizeof(SM2_KEY)); // sm2_key_cleanup? + error_print(); + return -1; + } + } + + } else if (curve == OID_secp256r1) { + + secp256r1_t p256_private; + SECP256R1_KEY p256_pub; + + secp256r1_from_32bytes(p256_private, prikey); + if (secp256r1_key_set_private_key(&key->u.secp256r1_key, p256_private) != 1) { + gmssl_secure_clear(p256_private, sizeof(secp256r1_t)); + error_print(); + return -1; + } + gmssl_secure_clear(p256_private, sizeof(secp256r1_t)); + + if (pubkey) { + if (secp256r1_public_key_from_der(&p256_pub, &pubkey, &pubkey_len) != 1 + || asn1_length_is_zero(pubkey_len) != 1) { + error_print(); + return -1; + } + if (secp256r1_public_key_equ(&key->u.secp256r1_key, &p256_pub) != 1) { + secp256r1_key_cleanup(&key->u.secp256r1_key); + error_print(); + return -1; + } + } + } else { + error_print(); + return -1; + } + + key->algor = OID_ec_public_key; + key->algor_param = curve; + return 1; +} + +int x509_private_key_info_to_der(const X509_KEY *key, uint8_t **out, size_t *outlen) +{ + uint8_t private_key[256]; // 缓冲大小取决于编译器支持哪些公钥类型 + uint8_t *p = private_key; + size_t private_key_len = 0; + size_t len = 0; + + if (!key || !outlen) { + error_print(); + return -1; + } + + switch (key->algor) { + case OID_ec_public_key: + if (ec_private_key_to_der(key, + X509_ENCODE_EC_PRIVATE_KEY_PARAMS, X509_ENCODE_EC_PRIVATE_KEY_PUBKEY, + &p, &private_key_len) != 1) { + error_print(); + return -1; + } + break; + default: + error_print(); + return -1; + } + + if (asn1_int_to_der(PKCS8_private_key_info_version, NULL, &len) != 1 + || x509_public_key_algor_to_der(key->algor, key->algor_param, NULL, &len) != 1 + || asn1_octet_string_to_der(private_key, private_key_len, NULL, &len) != 1 + || asn1_sequence_header_to_der(len, out, outlen) != 1 + || asn1_int_to_der(PKCS8_private_key_info_version, out, outlen) != 1 + || x509_public_key_algor_to_der(key->algor, key->algor_param, out, outlen) != 1 + || asn1_octet_string_to_der(private_key, private_key_len, out, outlen) != 1) { + gmssl_secure_clear(private_key, private_key_len); + error_print(); + return -1; + } + gmssl_secure_clear(private_key, private_key_len); + return 1; +} + +int x509_private_key_info_from_der(X509_KEY *key, const uint8_t **attrs, size_t *attrslen, + const uint8_t **in, size_t *inlen) +{ + int ret; + const uint8_t *d; + size_t dlen; + int version; + int algor; + int algor_param; + const uint8_t *private_key; + size_t private_key_len; + + if (!key || !attrs || !attrslen || !in || !(*in) || !inlen) { + error_print(); + return -1; + } + if ((ret = asn1_sequence_from_der(&d, &dlen, in, inlen)) != 1) { + if (ret < 0) error_print(); + if (ret == 0) error_print(); + + format_bytes(stderr, 0, 0, "private_key_info", *in, *inlen); + + return ret; + } + if (asn1_int_from_der(&version, &d, &dlen) != 1 + || x509_public_key_algor_from_der(&algor, &algor_param, &d, &dlen) != 1 + || asn1_octet_string_from_der(&private_key, &private_key_len, &d, &dlen) != 1 + || asn1_implicit_set_from_der(0, attrs, attrslen, &d, &dlen) < 0 + || asn1_check(version == PKCS8_private_key_info_version) != 1 + || asn1_length_is_zero(dlen) != 1) { + error_print(); + return -1; + } + switch (algor) { + case OID_ec_public_key: + if (ec_private_key_from_der(key, algor_param, &private_key, &private_key_len) != 1 + || asn1_length_is_zero(private_key_len) != 1) { + error_print(); + return -1; + } + break; + case OID_lms_hashsig: + case OID_hss_lms_hashsig: + case OID_xmss_hashsig: + case OID_xmssmt_hashsig: + case OID_sphincs_hashsig: + default: + error_print(); + return -1; + } + return 1; +} + +int x509_private_key_info_encrypt_to_der(const X509_KEY *x509_key, const char *pass, + uint8_t **out, size_t *outlen) +{ + int ret = -1; + uint8_t private_key_info[512]; // 设置更合理的大小 + uint8_t *p = private_key_info; + size_t private_key_info_len = 0; + uint8_t salt[16]; + int iter = PKCS8_ENCED_PRIVATE_KEY_INFO_ITER; + uint8_t iv[16]; + uint8_t key[16]; + SM4_KEY sm4_key; + uint8_t enced_private_key_info[sizeof(private_key_info) + 32]; + size_t enced_private_key_info_len; + + if (!x509_key || !pass || !outlen) { + error_print(); + return -1; + } + + if (rand_bytes(salt, sizeof(salt)) != 1 + || rand_bytes(iv, sizeof(iv)) != 1) { + error_print(); + return -1; + } + if (sm3_pbkdf2(pass, strlen(pass), salt, sizeof(salt), iter, sizeof(key), key) != 1) { + error_print(); + return -1; + } + + if (x509_private_key_info_to_der(x509_key, &p, &private_key_info_len) != 1) { + error_print(); + goto end; + } + sm4_set_encrypt_key(&sm4_key, key); + if (sm4_cbc_padding_encrypt(&sm4_key, iv, + private_key_info, private_key_info_len, + enced_private_key_info, &enced_private_key_info_len) != 1) { + error_print(); + goto end; + } + if (pkcs8_enced_private_key_info_to_der(salt, sizeof(salt), iter, + sizeof(key), OID_hmac_sm3, OID_sm4_cbc, iv, sizeof(iv), + enced_private_key_info, enced_private_key_info_len, + out, outlen) != 1) { + error_print(); + goto end; + } + + ret = 1; +end: + gmssl_secure_clear(private_key_info, sizeof(private_key_info)); + gmssl_secure_clear(key, sizeof(key)); + gmssl_secure_clear(&sm4_key, sizeof(sm4_key)); + return ret; +} + +int x509_private_key_info_decrypt_from_der(X509_KEY *x509_key, + const uint8_t **attrs, size_t *attrs_len, + const char *pass, const uint8_t **in, size_t *inlen) +{ + int ret = -1; + const uint8_t *salt; + size_t saltlen; + int iter; + int keylen; + int prf; + int cipher; + const uint8_t *iv; + size_t ivlen; + uint8_t key[16]; + SM4_KEY sm4_key; + const uint8_t *enced_private_key_info; + size_t enced_private_key_info_len; + uint8_t private_key_info[256]; + const uint8_t *cp = private_key_info; + size_t private_key_info_len; + + if (!x509_key || !attrs || !attrs_len || !pass || !in || !(*in) || !inlen) { + error_print(); + return -1; + } + if (pkcs8_enced_private_key_info_from_der(&salt, &saltlen, &iter, &keylen, &prf, + &cipher, &iv, &ivlen, &enced_private_key_info, &enced_private_key_info_len, in, inlen) != 1 + || asn1_check(keylen == -1 || keylen == 16) != 1 + || asn1_check(prf == - 1 || prf == OID_hmac_sm3) != 1 + || asn1_check(cipher == OID_sm4_cbc) != 1 + || asn1_check(ivlen == 16) != 1 + || asn1_length_le(enced_private_key_info_len, sizeof(private_key_info)) != 1) { + error_print(); + return -1; + } + if (sm3_pbkdf2(pass, strlen(pass), salt, saltlen, iter, sizeof(key), key) != 1) { + error_print(); + goto end; + } + sm4_set_decrypt_key(&sm4_key, key); + if (sm4_cbc_padding_decrypt(&sm4_key, iv, + enced_private_key_info, enced_private_key_info_len, + private_key_info, &private_key_info_len) != 1) { + error_print(); + goto end; + } + if (x509_private_key_info_from_der(x509_key, attrs, attrs_len, &cp, &private_key_info_len) != 1) { + error_print(); + goto end; + } + if (asn1_length_is_zero(private_key_info_len) != 1) { + error_print(); + goto end; + } + ret = 1; +end: + gmssl_secure_clear(&sm4_key, sizeof(sm4_key)); + gmssl_secure_clear(key, sizeof(key)); + gmssl_secure_clear(private_key_info, sizeof(private_key_info)); + return ret; +} + +int x509_private_key_info_encrypt_to_pem(const X509_KEY *key, const char *pass, FILE *fp) +{ + uint8_t buf[1024]; + uint8_t *p = buf; + size_t len = 0; + + if (!fp) { + error_print(); + return -1; + } + if (x509_private_key_info_encrypt_to_der(key, pass, &p, &len) != 1) { + error_print(); + return -1; + } + if (pem_write(fp, "ENCRYPTED PRIVATE KEY", buf, len) != 1) { + error_print(); + return -1; + } + return 1; +} + +int x509_private_key_info_decrypt_from_pem(X509_KEY *key, const uint8_t **attrs, size_t *attrslen, const char *pass, FILE *fp) +{ + uint8_t buf[512]; + const uint8_t *cp = buf; + size_t len; + + if (!key || !pass || !fp) { + error_print(); + return -1; + } + if (pem_read(fp, "ENCRYPTED PRIVATE KEY", buf, &len, sizeof(buf)) != 1) { + error_print(); + return -1; + } + if (x509_private_key_info_decrypt_from_der(key, attrs, attrslen, pass, &cp, &len) != 1 + || asn1_length_is_zero(len) != 1) { + error_print(); + return -1; + } + return 1; +} + int x509_private_key_from_file(X509_KEY *key, int algor, const char *pass, FILE *fp) { if (!key || !fp) { @@ -919,20 +1653,17 @@ int x509_private_key_from_file(X509_KEY *key, int algor, const char *pass, FILE return -1; } - key->algor = algor; - key->algor_param = OID_undef; - if (algor == OID_ec_public_key) { + const uint8_t *attrs; + size_t attrslen; if (!pass) { error_print(); return -1; } - // FIXME: secp256r1 - if (sm2_private_key_info_decrypt_from_pem(&key->u.sm2_key, pass, fp) != 1) { + if (x509_private_key_info_decrypt_from_pem(key, &attrs, &attrslen, pass, fp) != 1) { error_print(); return -1; } - key->algor_param = OID_sm2; } else if (algor == OID_lms_hashsig) { uint8_t buf[LMS_PRIVATE_KEY_SIZE]; const uint8_t *cp = buf; @@ -998,43 +1729,6 @@ int x509_private_key_from_file(X509_KEY *key, int algor, const char *pass, FILE error_print(); return -1; } - - return 1; } -void x509_key_cleanup(X509_KEY *key) -{ - if (key) { - switch (key->algor) { - case OID_ec_public_key: - if (key->algor_param == OID_sm2) { - //sm2_key_cleanup(&key->u.sm2_key); - gmssl_secure_clear(&key->u.sm2_key, sizeof(SM2_KEY)); - } else if (key->algor_param == OID_secp256r1) { - secp256r1_key_cleanup(&key->u.secp256r1_key); - } - break; - case OID_lms_hashsig: - lms_key_cleanup(&key->u.lms_key); - break; - case OID_hss_lms_hashsig: - hss_key_cleanup(&key->u.hss_key); - break; - case OID_xmss_hashsig: - xmss_key_cleanup(&key->u.xmss_key); - break; - case OID_xmssmt_hashsig: - xmssmt_key_cleanup(&key->u.xmssmt_key); - break; - case OID_sphincs_hashsig: - sphincs_key_cleanup(&key->u.sphincs_key); - break; - default: - error_print(); - } - } -} - - - diff --git a/src/x509_req.c b/src/x509_req.c index f47efd41..1a76135a 100644 --- a/src/x509_req.c +++ b/src/x509_req.c @@ -199,7 +199,14 @@ int x509_req_sign_to_der( } if (out && *out) { X509_SIGN_CTX sign_ctx; - if (x509_sign_init(&sign_ctx, sign_key, signer_id, signer_id_len) != 1 + void *sign_args = NULL; + size_t sign_argslen = 0; + + if (sign_key->algor == OID_ec_public_key && sign_key->algor_param == OID_sm2) { + sign_args = SM2_DEFAULT_ID; + sign_argslen = SM2_DEFAULT_ID_LENGTH; + } + if (x509_sign_init(&sign_ctx, sign_key, sign_args, sign_argslen) != 1 || x509_sign_update(&sign_ctx, tbs, *out - tbs) != 1 || x509_sign_finish(&sign_ctx, sig, &siglen) != 1) { gmssl_secure_clear(&sign_ctx, sizeof(sign_ctx)); diff --git a/tests/x509_keytest.c b/tests/x509_keytest.c new file mode 100644 index 00000000..c851be4e --- /dev/null +++ b/tests/x509_keytest.c @@ -0,0 +1,411 @@ +/* + * Copyright 2014-2026 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#include +#include +#include +#include +#include +#include +#include +#include + + + +static int test_x509_algor_param_from_lms_types(void) +{ + int lms_types1[] = { + LMS_HASH256_M32_H5, + LMS_HASH256_M32_H10, + LMS_HASH256_M32_H15, + LMS_HASH256_M32_H20, + LMS_HASH256_M32_H25, + }; + int hss_algor_param1 = 624485; + + int lms_types2[] = { + LMS_HASH256_M32_H5, + LMS_HASH256_M32_H5, + LMS_HASH256_M32_H5, + }; + int hss_algor_param2 = 1365; + + int algor_param1; + int algor_param2; + int lms_types[5]; + size_t num; + + if (x509_algor_param_from_lms_types(&algor_param1, lms_types1, sizeof(lms_types1)/sizeof(lms_types1[0])) != 1) { + error_print(); + return -1; + } + if (algor_param1 != hss_algor_param1) { + format_print(stderr, 0, 4, "hss_algor_param: %d\n", algor_param1); + error_print(); + return -1; + } + if (x509_algor_param_to_lms_types(algor_param1, lms_types, &num) != 1) { + error_print(); + return -1; + } + if (num != sizeof(lms_types1)/sizeof(lms_types1[0])) { + error_print(); + return -1; + } + if (memcmp(lms_types, lms_types1, sizeof(lms_types1)) != 0) { + error_print(); + return -1; + } + + + if (x509_algor_param_from_lms_types(&algor_param2, lms_types2, sizeof(lms_types2)/sizeof(lms_types2[0])) != 1) { + error_print(); + return -1; + } + if (algor_param2 != hss_algor_param2) { + format_print(stderr, 0, 4, "hss_algor_param: %d\n", algor_param2); + error_print(); + return -1; + } + if (x509_algor_param_to_lms_types(algor_param2, lms_types, &num) != 1) { + error_print(); + return -1; + } + if (num != sizeof(lms_types2)/sizeof(lms_types2[0])) { + error_print(); + return -1; + } + if (memcmp(lms_types, lms_types2, sizeof(lms_types2)) != 0) { + error_print(); + return -1; + } + + printf("%s() ok\n", __FUNCTION__); + return 1; +} + +X509_KEY x509_keys[7]; + + + // 这个也要挪到外面,才能判断某个x509_key的类型 + struct { + int algor; + int algor_param; + } tests[] = { + { OID_ec_public_key, OID_sm2 }, + { OID_ec_public_key, OID_secp256r1 }, + { OID_lms_hashsig, LMS_HASH256_M32_H5 }, + { OID_hss_lms_hashsig, 1365 }, + { OID_xmss_hashsig, XMSS_HASH256_10_256 }, + { OID_xmssmt_hashsig, XMSSMT_HASH256_20_4_256 }, + { OID_sphincs_hashsig, OID_undef }, + }; + + + +static int test_x509_key_generate(void) +{ + size_t i; + + for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { + if (x509_key_generate(&x509_keys[i], tests[i].algor, tests[i].algor_param) != 1) { + error_print(); + return -1; + } + + // 这个也没有实现啊! + // x509_private_key_print(stderr, 0, 4, "private_key", &x509_keys[i]); + x509_public_key_print(stderr, 0, 4, "private_key", &x509_keys[i]); + + } + + printf("%s() ok\n", __FUNCTION__); + return 1; +} + +static int test_x509_public_key_to_bytes(void) +{ + int i; + uint8_t buf[128]; + uint8_t *p; + size_t len; + + uint8_t dgst[32]; + + X509_KEY key; + + for (i = 0; i < 7; i++) { + p = buf; + len = 0; + if (x509_public_key_to_bytes(&x509_keys[i], &p, &len) != 1) { + error_print(); + return -1; + } + format_print(stderr, 0, 4, "public_key_bytes: %zu\n", len); + + if (x509_public_key_digest(&x509_keys[i], dgst) != 1) { + error_print(); + return -1; + } + format_bytes(stderr, 0, 4, "dgst", dgst, 32); + + // 居然没有public_key_from_bytes + } + + printf("%s() ok\n", __FUNCTION__); + return 1; +} + +static int test_x509_public_key_info_to_der(void) +{ + X509_KEY key; + uint8_t buf[50240]; + int i; + + for (i = 0; i < sizeof(x509_keys)/sizeof(x509_keys[0]); i++) { + const uint8_t *cp = buf; + uint8_t *p = buf; + size_t len = 0; + + fprintf(stderr, "%d: algor = %d param = %d\n", i, x509_keys[i].algor, x509_keys[i].algor_param); + + if (x509_public_key_info_to_der(&x509_keys[i], &p, &len) != 1) { + error_print(); + return -1; + } + format_print(stderr, 0, 4, "public_key_der_size: %zu\n", len); + + if (x509_public_key_info_from_der(&key, &cp, &len) != 1) { + error_print(); + return -1; + } + if (len) { + error_print(); + return -1; + } + + if (x509_public_key_equ(&key, &x509_keys[i]) != 1) { + error_print(); + return -1; + } + } + + printf("%s() ok\n", __FUNCTION__); + return 1; +} + +static int test_ec_private_key_to_der(void) +{ + X509_KEY key; + uint8_t buf[1024]; + int i; + + for (i = 0; i < 2; i++) { + const uint8_t *cp = buf; + uint8_t *p = buf; + size_t len = 0; + // 目前底层的asn1功能不支持这两个不编码,需要仔细看看是怎么回事,explicit的编码是如何实现的 + int encode_params = 1; // X509_ENCODE_EC_PRIVATE_KEY_PARAMS; + int encode_pubkey = 1; //X509_ENCODE_EC_PRIVATE_KEY_PUBKEY; + + if (ec_private_key_to_der(&x509_keys[i], encode_params, encode_pubkey, &p, &len) != 1) { + error_print(); + return -1; + } + if (ec_private_key_from_der(&key, tests[i].algor_param, &cp, &len) != 1) { + error_print(); + return -1; + } + if (x509_public_key_equ(&key, &x509_keys[i]) != 1) { + error_print(); + return -1; + } + } + + printf("%s() ok\n", __FUNCTION__); + return 1; +} + +static int test_x509_private_key_info_to_der(void) +{ + X509_KEY key; + uint8_t buf[1024]; + int i; + + for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { + if (tests[i].algor == OID_ec_public_key) { + const uint8_t *cp = buf; + uint8_t *p = buf; + size_t len = 0; + const uint8_t *attrs; + size_t attrslen; + + if (x509_private_key_info_to_der(&x509_keys[i], &p, &len) != 1) { + error_print(); + return -1; + } + if (x509_private_key_info_from_der(&key, &attrs, &attrslen, &cp, &len) != 1) { + error_print(); + return -1; + } + if (len) { + error_print(); + return -1; + } + if (x509_public_key_equ(&key, &x509_keys[i]) != 1) { + error_print(); + return -1; + } + } + } + + printf("%s() ok\n", __FUNCTION__); + return 1; + + + + + +} + +static int test_x509_private_key_info_encrypt_to_der(void) +{ + const char *pass = "P@ssw0rd"; + X509_KEY key; + uint8_t buf[1024]; + int i; + + for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { + if (tests[i].algor == OID_ec_public_key) { + const uint8_t *cp = buf; + uint8_t *p = buf; + size_t len = 0; + const uint8_t *attrs; + size_t attrslen; + + if (x509_private_key_info_encrypt_to_der(&x509_keys[i], pass, &p, &len) != 1) { + error_print(); + return -1; + } + if (x509_private_key_info_decrypt_from_der(&key, &attrs, &attrslen, pass, &cp, &len) != 1) { + error_print(); + return -1; + } + if (len) { + error_print(); + return -1; + } + if (x509_public_key_equ(&key, &x509_keys[i]) != 1) { + error_print(); + return -1; + } + } + } + + printf("%s() ok\n", __FUNCTION__); + return 1; +} + + +static int test_x509_private_key_info_encrypt_to_pem(void) +{ + const char *pass = "P@ssw0rd"; + X509_KEY key; + uint8_t buf[1024]; + FILE *fp; + int i; + + + for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { + if (tests[i].algor == OID_ec_public_key) { + const uint8_t *cp = buf; + uint8_t *p = buf; + size_t len = 0; + const uint8_t *attrs; + size_t attrslen; + + if (!(fp = fopen("test_x509_private_key_info_encrypt_to_pem.pem", "w"))) { + error_print(); + return -1; + } + if (x509_private_key_info_encrypt_to_pem(&x509_keys[i], pass, fp) != 1) { + error_print(); + return -1; + } + fclose(fp); + + if (!(fp = fopen("test_x509_private_key_info_encrypt_to_pem.pem", "r"))) { + error_print(); + return -1; + } + if (x509_private_key_info_decrypt_from_pem(&key, &attrs, &attrslen, pass, fp) != 1) { + error_print(); + return -1; + } + fclose(fp); + if (len) { + error_print(); + return -1; + } + if (x509_public_key_equ(&key, &x509_keys[i]) != 1) { + error_print(); + return -1; + } + } + } + + printf("%s() ok\n", __FUNCTION__); + return 1; +} + + + + + + + + + + + + + + +// 首先某些头文件中的函数并没有实现,很奇怪! + +// 然后是某些数据长度(公钥、签名之类)还没有计算具体的值,因此没有办法准备最大的缓冲去 + +// 应该把密钥生成放到最外面,这样只需要生成一次就可以了 + +// X509_KEY还不支持Kyber + + + + + + + +int main(void) +{ + if (test_x509_key_generate() != 1) goto err; + if (test_x509_algor_param_from_lms_types() != 1) goto err; + if (test_x509_public_key_to_bytes() != 1) goto err; + if (test_x509_public_key_info_to_der() != 1) goto err; + if (test_ec_private_key_to_der() != 1) goto err; + if (test_x509_private_key_info_to_der() != 1) goto err; + if (test_x509_private_key_info_encrypt_to_der() != 1) goto err; + if (test_x509_private_key_info_encrypt_to_pem() != 1) goto err; + + printf("%s all tests passed!\n", __FILE__); + return 0; +err: + error_print(); + return 1; +} diff --git a/tools/certgen.c b/tools/certgen.c index 9c3541d0..25f4f96e 100644 --- a/tools/certgen.c +++ b/tools/certgen.c @@ -405,7 +405,6 @@ bad: printf("usage: gmssl %s %s\n\n", prog, options); goto end; } - if (x509_private_key_from_file(&x509_key, algor, pass, keyfp) != 1) { fprintf(stderr, "%s: load private key failed\n", prog); goto end;