FreeRDP
|
#include <freerdp/config.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <winpr/assert.h>
#include <winpr/wtypes.h>
#include <winpr/crt.h>
#include <winpr/file.h>
#include <winpr/print.h>
#include <winpr/crypto.h>
#include <freerdp/crypto/certificate.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/rsa.h>
#include <openssl/bn.h>
#include "certificate.h"
#include "cert_common.h"
#include "crypto.h"
#include "x509_utils.h"
#include "privatekey.h"
#include "opensslcompat.h"
Macros | |
#define | TAG FREERDP_TAG("core") |
#define | CERTIFICATE_TAG FREERDP_TAG("core.certificate") |
#define | DEBUG_CERTIFICATE(...) |
#define | TSSK_KEY_LENGTH 64 |
Functions | |
static void | certificate_free_int (rdpCertificate *certificate) |
static BOOL | cert_clone_int (rdpCertificate *dst, const rdpCertificate *src) |
static BOOL | cert_blob_copy (rdpCertBlob *dst, const rdpCertBlob *src) |
static void | cert_blob_free (rdpCertBlob *blob) |
static BOOL | cert_blob_write (const rdpCertBlob *blob, wStream *s) |
static BOOL | cert_blob_read (rdpCertBlob *blob, wStream *s) |
static BOOL | is_rsa_key (const X509 *x509) |
static BOOL | certificate_read_x509_certificate (const rdpCertBlob *cert, rdpCertInfo *info) |
static rdpX509CertChain | certificate_new_x509_certificate_chain (UINT32 count) |
static void | certificate_free_x509_certificate_chain (rdpX509CertChain *x509_cert_chain) |
static BOOL | update_x509_from_info (rdpCertificate *cert) |
static BOOL | certificate_process_server_public_key (rdpCertificate *cert, wStream *s, UINT32 length) |
static BOOL | certificate_process_server_public_signature (rdpCertificate *certificate, const BYTE *sigdata, size_t sigdatalen, wStream *s, UINT32 siglen) |
static BOOL | certificate_read_server_proprietary_certificate (rdpCertificate *certificate, wStream *s) |
static BOOL | cert_write_rsa_public_key (wStream *s, const rdpCertificate *cert) |
static BOOL | cert_write_rsa_signature (wStream *s, const void *sigData, size_t sigDataLen) |
static BOOL | cert_write_server_certificate_v1 (wStream *s, const rdpCertificate *certificate) |
static BOOL | cert_write_server_certificate_v2 (wStream *s, const rdpCertificate *certificate) |
SSIZE_T | freerdp_certificate_write_server_cert (const rdpCertificate *certificate, UINT32 dwVersion, wStream *s) |
static BOOL | certificate_read_server_x509_certificate_chain (rdpCertificate *cert, wStream *s) |
static BOOL | certificate_write_server_x509_certificate_chain (const rdpCertificate *certificate, wStream *s) |
BOOL | freerdp_certificate_read_server_cert (rdpCertificate *certificate, const BYTE *server_cert, size_t length) |
static BOOL | cert_x509_chain_copy (rdpX509CertChain *cert, const rdpX509CertChain *src) |
rdpCertificate * | freerdp_certificate_clone (const rdpCertificate *certificate) |
rdpCertificate * | freerdp_certificate_new (void) |
void | freerdp_certificate_free (rdpCertificate *cert) |
static BOOL | freerdp_rsa_from_x509 (rdpCertificate *cert) |
rdpCertificate * | freerdp_certificate_new_from_der (const BYTE *data, size_t length) |
rdpCertificate * | freerdp_certificate_new_from_x509 (const X509 *xcert, const STACK_OF(X509) *chain) |
static rdpCertificate * | freerdp_certificate_new_from (const char *file, BOOL isFile) |
rdpCertificate * | freerdp_certificate_new_from_file (const char *file) |
rdpCertificate * | freerdp_certificate_new_from_pem (const char *pem) |
const rdpCertInfo * | freerdp_certificate_get_info (const rdpCertificate *cert) |
char * | freerdp_certificate_get_fingerprint (const rdpCertificate *cert) |
char * | freerdp_certificate_get_fingerprint_by_hash (const rdpCertificate *cert, const char *hash) |
char * | freerdp_certificate_get_fingerprint_by_hash_ex (const rdpCertificate *cert, const char *hash, BOOL separator) |
static BOOL | bio_read_pem (BIO *bio, char **ppem, size_t *plength) |
char * | freerdp_certificate_get_pem (const rdpCertificate *cert, size_t *pLength) |
char * | freerdp_certificate_get_pem_ex (const rdpCertificate *cert, size_t *pLength, BOOL withCertChain) |
char * | freerdp_certificate_get_subject (const rdpCertificate *cert) |
char * | freerdp_certificate_get_issuer (const rdpCertificate *cert) |
char * | freerdp_certificate_get_upn (const rdpCertificate *cert) |
char * | freerdp_certificate_get_email (const rdpCertificate *cert) |
char * | freerdp_certificate_get_validity (const rdpCertificate *cert, BOOL startDate) |
BOOL | freerdp_certificate_check_eku (const rdpCertificate *cert, int nid) |
BOOL | freerdp_certificate_get_public_key (const rdpCertificate *cert, BYTE **PublicKey, DWORD *PublicKeyLength) |
BOOL | freerdp_certificate_verify (const rdpCertificate *cert, const char *certificate_store_path) |
char ** | freerdp_certificate_get_dns_names (const rdpCertificate *cert, size_t *pcount, size_t **pplengths) |
char * | freerdp_certificate_get_common_name (const rdpCertificate *cert, size_t *plength) |
WINPR_MD_TYPE | freerdp_certificate_get_signature_alg (const rdpCertificate *cert) |
void | freerdp_certificate_free_dns_names (size_t count, size_t *lengths, char **names) |
char * | freerdp_certificate_get_hash (const rdpCertificate *cert, const char *hash, size_t *plength) |
X509 * | freerdp_certificate_get_x509 (rdpCertificate *cert) |
returns a pointer to a X509 structure. Call X509_free when done. More... | |
BOOL | freerdp_certificate_publickey_encrypt (const rdpCertificate *cert, const BYTE *input, size_t cbInput, BYTE **poutput, size_t *pcbOutput) |
static RSA * | freerdp_certificate_get_RSA (const rdpCertificate *cert) |
BYTE * | freerdp_certificate_get_der (const rdpCertificate *cert, size_t *pLength) |
BOOL | freerdp_certificate_is_rsa (const rdpCertificate *cert) |
BOOL | freerdp_certificate_is_rdp_security_compatible (const rdpCertificate *cert) |
char * | freerdp_certificate_get_param (const rdpCertificate *cert, enum FREERDP_CERT_PARAM what, size_t *psize) |
Variables | |
static const char | rsa_magic [4] = "RSA1" |
static const char * | certificate_read_errors [] |
static const BYTE | initial_signature [] |
#define CERTIFICATE_TAG FREERDP_TAG("core.certificate") |
#define DEBUG_CERTIFICATE | ( | ... | ) |
#define TAG FREERDP_TAG("core") |
FreeRDP: A Remote Desktop Protocol Implementation Certificate Handling
Copyright 2011 Jiten Pathy Copyright 2011 Marc-Andre Moreau marca Copyright 2015 Thincast Technologies GmbH Copyright 2015 DI (FH) Martin Haimberger ndre .more au@g mail. commarti Copyright 2023 Armin Novak n.ha imber ger@ thinc ast. comanova Copyright 2023 Thincast Technologies GmbH k@th incas t.co m
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
#define TSSK_KEY_LENGTH 64 |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
Free X.509 Certificate Chain.
x509_cert_chain | X.509 certificate chain to be freed |
|
static |
Instantiate new X.509 Certificate Chain.
count | certificate chain count |
|
static |
|
static |
|
static |
|
static |
Read an X.509 Certificate Chain.
cert | certificate module |
s | stream |
|
static |
|
static |
BOOL freerdp_certificate_check_eku | ( | const rdpCertificate * | cert, |
int | nid | ||
) |
rdpCertificate* freerdp_certificate_clone | ( | const rdpCertificate * | certificate | ) |
void freerdp_certificate_free | ( | rdpCertificate * | cert | ) |
Free certificate module.
cert | certificate module to be freed |
void freerdp_certificate_free_dns_names | ( | size_t | count, |
size_t * | lengths, | ||
char ** | names | ||
) |
char* freerdp_certificate_get_common_name | ( | const rdpCertificate * | cert, |
size_t * | plength | ||
) |
BYTE* freerdp_certificate_get_der | ( | const rdpCertificate * | cert, |
size_t * | pLength | ||
) |
char** freerdp_certificate_get_dns_names | ( | const rdpCertificate * | cert, |
size_t * | pcount, | ||
size_t ** | pplengths | ||
) |
char* freerdp_certificate_get_email | ( | const rdpCertificate * | cert | ) |
char* freerdp_certificate_get_fingerprint | ( | const rdpCertificate * | cert | ) |
char* freerdp_certificate_get_fingerprint_by_hash | ( | const rdpCertificate * | cert, |
const char * | hash | ||
) |
char* freerdp_certificate_get_fingerprint_by_hash_ex | ( | const rdpCertificate * | cert, |
const char * | hash, | ||
BOOL | separator | ||
) |
char* freerdp_certificate_get_hash | ( | const rdpCertificate * | cert, |
const char * | hash, | ||
size_t * | plength | ||
) |
const rdpCertInfo* freerdp_certificate_get_info | ( | const rdpCertificate * | cert | ) |
char* freerdp_certificate_get_issuer | ( | const rdpCertificate * | cert | ) |
char* freerdp_certificate_get_param | ( | const rdpCertificate * | cert, |
enum FREERDP_CERT_PARAM | what, | ||
size_t * | psize | ||
) |
char* freerdp_certificate_get_pem | ( | const rdpCertificate * | cert, |
size_t * | pLength | ||
) |
char* freerdp_certificate_get_pem_ex | ( | const rdpCertificate * | cert, |
size_t * | pLength, | ||
BOOL | withCertChain | ||
) |
Don't manage certificates internally, leave it up entirely to the external client implementation
BOOL freerdp_certificate_get_public_key | ( | const rdpCertificate * | cert, |
BYTE ** | PublicKey, | ||
DWORD * | PublicKeyLength | ||
) |
|
static |
WINPR_MD_TYPE freerdp_certificate_get_signature_alg | ( | const rdpCertificate * | cert | ) |
char* freerdp_certificate_get_subject | ( | const rdpCertificate * | cert | ) |
char* freerdp_certificate_get_upn | ( | const rdpCertificate * | cert | ) |
char* freerdp_certificate_get_validity | ( | const rdpCertificate * | cert, |
BOOL | startDate | ||
) |
X509* freerdp_certificate_get_x509 | ( | rdpCertificate * | cert | ) |
returns a pointer to a X509 structure. Call X509_free when done.
BOOL freerdp_certificate_is_rdp_security_compatible | ( | const rdpCertificate * | cert | ) |
BOOL freerdp_certificate_is_rsa | ( | const rdpCertificate * | cert | ) |
rdpCertificate* freerdp_certificate_new | ( | void | ) |
Instantiate new certificate module.
|
static |
rdpCertificate* freerdp_certificate_new_from_der | ( | const BYTE * | data, |
size_t | length | ||
) |
rdpCertificate* freerdp_certificate_new_from_file | ( | const char * | file | ) |
rdpCertificate* freerdp_certificate_new_from_pem | ( | const char * | pem | ) |
rdpCertificate* freerdp_certificate_new_from_x509 | ( | const X509 * | xcert, |
const STACK_OF(X509) * | chain | ||
) |
BOOL freerdp_certificate_publickey_encrypt | ( | const rdpCertificate * | cert, |
const BYTE * | input, | ||
size_t | cbInput, | ||
BYTE ** | poutput, | ||
size_t * | pcbOutput | ||
) |
BOOL freerdp_certificate_read_server_cert | ( | rdpCertificate * | certificate, |
const BYTE * | server_cert, | ||
size_t | length | ||
) |
Read a Server Certificate.
certificate | certificate module |
server_cert | server certificate |
length | certificate length |
BOOL freerdp_certificate_verify | ( | const rdpCertificate * | cert, |
const char * | certificate_store_path | ||
) |
SSIZE_T freerdp_certificate_write_server_cert | ( | const rdpCertificate * | certificate, |
UINT32 | dwVersion, | ||
wStream * | s | ||
) |
|
static |
|
static |
Read X.509 Certificate
|
static |
|
static |
|
static |
|
static |
X.509 Certificate Structure
Certificate ::= SEQUENCE { tbsCertificate TBSCertificate, signatureAlgorithm AlgorithmIdentifier, signatureValue BIT_STRING }
TBSCertificate ::= SEQUENCE { version [0] EXPLICIT Version DEFAULT v1, serialNumber CertificateSerialNumber, signature AlgorithmIdentifier, issuer Name, validity Validity, subject Name, subjectPublicKeyInfo SubjectPublicKeyInfo, issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, subjectUniqueId [2] IMPLICIT UniqueIdentifier OPTIONAL, extensions [3] EXPLICIT Extensions OPTIONAL }
Version ::= INTEGER { v1(0), v2(1), v3(2) }
CertificateSerialNumber ::= INTEGER
AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT_IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL }
Name ::= CHOICE { RDNSequence }
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::= SET OF AttributeTypeAndValue
AttributeTypeAndValue ::= SEQUENCE { type AttributeType, value AttributeValue }
AttributeType ::= OBJECT_IDENTIFIER
AttributeValue ::= ANY DEFINED BY AttributeType
Validity ::= SEQUENCE { notBefore Time, notAfter Time }
Time ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime }
UniqueIdentifier ::= BIT_STRING
SubjectPublicKeyInfo ::= SEQUENCE { algorithm AlgorithmIdentifier, subjectPublicKey BIT_STRING }
RSAPublicKey ::= SEQUENCE { modulus INTEGER publicExponent INTEGER }
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
Extension ::= SEQUENCE { extnID OBJECT_IDENTIFIER critical BOOLEAN DEFAULT FALSE, extnValue OCTET_STRING }