Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
T
TLMSP curl
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
CYBER - Cyber Security
TS 103 523 MSP
TLMSP
TLMSP curl
Commits
e839446c
Commit
e839446c
authored
11 years ago
by
Patrick Monnerat
Browse files
Options
Downloads
Patches
Plain Diff
ssluse.c,sslgen.c,sslgen.h: move certinfo support to generic SSL
parent
695931cf
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
lib/sslgen.c
+65
-0
65 additions, 0 deletions
lib/sslgen.c
lib/sslgen.h
+9
-0
9 additions, 0 deletions
lib/sslgen.h
lib/ssluse.c
+16
-86
16 additions, 86 deletions
lib/ssluse.c
with
90 additions
and
86 deletions
lib/sslgen.c
+
65
−
0
View file @
e839446c
...
...
@@ -31,6 +31,7 @@
Curl_ossl_ - prefix for OpenSSL ones
Curl_gtls_ - prefix for GnuTLS ones
Curl_nss_ - prefix for NSS ones
Curl_qssl_ - prefix for QsoSSL ones
Curl_polarssl_ - prefix for PolarSSL ones
Curl_cyassl_ - prefix for CyaSSL ones
Curl_schannel_ - prefix for Schannel SSPI ones
...
...
@@ -67,6 +68,7 @@
#include
"cyassl.h"
/* CyaSSL versions */
#include
"curl_schannel.h"
/* Schannel SSPI version */
#include
"curl_darwinssl.h"
/* SecureTransport (Darwin) version */
#include
"slist.h"
#include
"sendf.h"
#include
"rawstr.h"
#include
"url.h"
...
...
@@ -74,6 +76,10 @@
#include
"progress.h"
#include
"share.h"
#include
"timeval.h"
#define _MPRINTF_REPLACE
/* use our functions only */
#include
<curl/mprintf.h>
/* The last #include file should be: */
#include
"memdebug.h"
...
...
@@ -585,6 +591,65 @@ void Curl_ssl_free_certinfo(struct SessionHandle *data)
}
}
int
Curl_ssl_init_certinfo
(
struct
SessionHandle
*
data
,
int
num
)
{
struct
curl_certinfo
*
ci
=
&
data
->
info
.
certs
;
struct
curl_slist
*
*
table
;
/* Initialize the certificate information structures. Return 0 if OK, else 1.
*/
Curl_ssl_free_certinfo
(
data
);
ci
->
num_of_certs
=
num
;
table
=
calloc
((
size_t
)
num
,
sizeof
(
struct
curl_slist
*
));
if
(
!
table
)
return
1
;
ci
->
certinfo
=
table
;
return
0
;
}
CURLcode
Curl_ssl_push_certinfo_len
(
struct
SessionHandle
*
data
,
int
certnum
,
const
char
*
label
,
const
char
*
value
,
size_t
valuelen
)
{
struct
curl_certinfo
*
ci
=
&
data
->
info
.
certs
;
char
*
output
;
struct
curl_slist
*
nl
;
CURLcode
res
=
CURLE_OK
;
/* Add an information record for a particular certificate. */
output
=
curl_maprintf
(
"%s:%.*s"
,
label
,
valuelen
,
value
);
if
(
!
output
)
return
CURLE_OUT_OF_MEMORY
;
nl
=
Curl_slist_append_nodup
(
ci
->
certinfo
[
certnum
],
output
);
if
(
!
nl
)
{
free
(
output
);
curl_slist_free_all
(
ci
->
certinfo
[
certnum
]);
res
=
CURLE_OUT_OF_MEMORY
;
}
ci
->
certinfo
[
certnum
]
=
nl
;
return
res
;
}
/*
* This is a convenience function for push_certinfo_len that takes a zero
* terminated value.
*/
CURLcode
Curl_ssl_push_certinfo
(
struct
SessionHandle
*
data
,
int
certnum
,
const
char
*
label
,
const
char
*
value
)
{
size_t
valuelen
=
strlen
(
value
);
return
Curl_ssl_push_certinfo_len
(
data
,
certnum
,
label
,
value
,
valuelen
);
}
/* these functions are only provided by some SSL backends */
#ifdef have_curlssl_random
...
...
This diff is collapsed.
Click to expand it.
lib/sslgen.h
+
9
−
0
View file @
e839446c
...
...
@@ -58,7 +58,16 @@ size_t Curl_ssl_version(char *buffer, size_t size);
bool
Curl_ssl_data_pending
(
const
struct
connectdata
*
conn
,
int
connindex
);
int
Curl_ssl_check_cxn
(
struct
connectdata
*
conn
);
/* Certificate information list handling. */
void
Curl_ssl_free_certinfo
(
struct
SessionHandle
*
data
);
int
Curl_ssl_init_certinfo
(
struct
SessionHandle
*
data
,
int
num
);
CURLcode
Curl_ssl_push_certinfo_len
(
struct
SessionHandle
*
data
,
int
certnum
,
const
char
*
label
,
const
char
*
value
,
size_t
valuelen
);
CURLcode
Curl_ssl_push_certinfo
(
struct
SessionHandle
*
data
,
int
certnum
,
const
char
*
label
,
const
char
*
value
);
/* Functions to be used by SSL library adaptation functions */
...
...
This diff is collapsed.
Click to expand it.
lib/ssluse.c
+
16
−
86
View file @
e839446c
...
...
@@ -43,6 +43,7 @@
#include
"inet_pton.h"
#include
"ssluse.h"
#include
"connect.h"
#include
"slist.h"
#include
"strequal.h"
#include
"select.h"
#include
"sslgen.h"
...
...
@@ -1790,60 +1791,6 @@ static int asn1_object_dump(ASN1_OBJECT *a, char *buf, size_t len)
return
0
;
}
static
CURLcode
push_certinfo_len
(
struct
SessionHandle
*
data
,
int
certnum
,
const
char
*
label
,
const
char
*
value
,
size_t
valuelen
)
{
struct
curl_certinfo
*
ci
=
&
data
->
info
.
certs
;
char
*
output
;
struct
curl_slist
*
nl
;
CURLcode
res
=
CURLE_OK
;
size_t
labellen
=
strlen
(
label
);
size_t
outlen
=
labellen
+
1
+
valuelen
+
1
;
/* label:value\0 */
output
=
malloc
(
outlen
);
if
(
!
output
)
return
CURLE_OUT_OF_MEMORY
;
/* sprintf the label and colon */
snprintf
(
output
,
outlen
,
"%s:"
,
label
);
/* memcpy the value (it might not be zero terminated) */
memcpy
(
&
output
[
labellen
+
1
],
value
,
valuelen
);
/* zero terminate the output */
output
[
labellen
+
1
+
valuelen
]
=
0
;
/* TODO: we should rather introduce an internal API that can do the
equivalent of curl_slist_append but doesn't strdup() the given data as
like in this place the extra malloc/free is totally pointless */
nl
=
curl_slist_append
(
ci
->
certinfo
[
certnum
],
output
);
free
(
output
);
if
(
!
nl
)
{
curl_slist_free_all
(
ci
->
certinfo
[
certnum
]);
ci
->
certinfo
[
certnum
]
=
NULL
;
res
=
CURLE_OUT_OF_MEMORY
;
}
else
ci
->
certinfo
[
certnum
]
=
nl
;
return
res
;
}
/* this is a convenience function for push_certinfo_len that takes a zero
terminated value */
static
CURLcode
push_certinfo
(
struct
SessionHandle
*
data
,
int
certnum
,
const
char
*
label
,
const
char
*
value
)
{
size_t
valuelen
=
strlen
(
value
);
return
push_certinfo_len
(
data
,
certnum
,
label
,
value
,
valuelen
);
}
static
void
pubkey_show
(
struct
SessionHandle
*
data
,
int
num
,
const
char
*
type
,
...
...
@@ -1867,7 +1814,7 @@ static void pubkey_show(struct SessionHandle *data,
left
-=
3
;
}
infof
(
data
,
" %s: %s
\n
"
,
namebuf
,
buffer
);
push_certinfo
(
data
,
num
,
namebuf
,
buffer
);
Curl_ssl_
push_certinfo
(
data
,
num
,
namebuf
,
buffer
);
free
(
buffer
);
}
}
...
...
@@ -1936,7 +1883,7 @@ static int X509V3_ext(struct SessionHandle *data,
}
infof
(
data
,
" %s
\n
"
,
buf
);
push_certinfo
(
data
,
certnum
,
namebuf
,
buf
);
Curl_ssl_
push_certinfo
(
data
,
certnum
,
namebuf
,
buf
);
BIO_free
(
bio_out
);
...
...
@@ -1956,7 +1903,7 @@ static void X509_signature(struct SessionHandle *data,
ptr
+=
snprintf
(
ptr
,
sizeof
(
buf
)
-
(
ptr
-
buf
),
"%02x:"
,
sig
->
data
[
i
]);
infof
(
data
,
" Signature: %s
\n
"
,
buf
);
push_certinfo
(
data
,
numcert
,
"Signature"
,
buf
);
Curl_ssl_
push_certinfo
(
data
,
numcert
,
"Signature"
,
buf
);
}
static
void
dumpcert
(
struct
SessionHandle
*
data
,
X509
*
x
,
int
numcert
)
...
...
@@ -1972,30 +1919,13 @@ static void dumpcert(struct SessionHandle *data, X509 *x, int numcert)
infof
(
data
,
"%s
\n
"
,
biomem
->
data
);
push_certinfo_len
(
data
,
numcert
,
"Cert"
,
biomem
->
data
,
biomem
->
length
);
Curl_ssl_push_certinfo_len
(
data
,
numcert
,
"Cert"
,
biomem
->
data
,
biomem
->
length
);
BIO_free
(
bio_out
);
}
static
int
init_certinfo
(
struct
SessionHandle
*
data
,
int
num
)
{
struct
curl_certinfo
*
ci
=
&
data
->
info
.
certs
;
struct
curl_slist
**
table
;
Curl_ssl_free_certinfo
(
data
);
ci
->
num_of_certs
=
num
;
table
=
calloc
((
size_t
)
num
,
sizeof
(
struct
curl_slist
*
));
if
(
!
table
)
return
1
;
ci
->
certinfo
=
table
;
return
0
;
}
/*
* This size was previously 512 which has been reported "too small" without
* any specifics, so it was enlarged to allow more data to get shown uncut.
...
...
@@ -2024,7 +1954,7 @@ static CURLcode get_cert_chain(struct connectdata *conn,
}
numcerts
=
sk_X509_num
(
sk
);
if
(
init_certinfo
(
data
,
numcerts
))
{
if
(
Curl_ssl_
init_certinfo
(
data
,
numcerts
))
{
free
(
bufp
);
return
CURLE_OUT_OF_MEMORY
;
}
...
...
@@ -2049,16 +1979,16 @@ static CURLcode get_cert_chain(struct connectdata *conn,
(
void
)
x509_name_oneline
(
X509_get_subject_name
(
x
),
bufp
,
CERTBUFFERSIZE
);
infof
(
data
,
"%2d Subject: %s
\n
"
,
i
,
bufp
);
push_certinfo
(
data
,
i
,
"Subject"
,
bufp
);
Curl_ssl_
push_certinfo
(
data
,
i
,
"Subject"
,
bufp
);
(
void
)
x509_name_oneline
(
X509_get_issuer_name
(
x
),
bufp
,
CERTBUFFERSIZE
);
infof
(
data
,
" Issuer: %s
\n
"
,
bufp
);
push_certinfo
(
data
,
i
,
"Issuer"
,
bufp
);
Curl_ssl_
push_certinfo
(
data
,
i
,
"Issuer"
,
bufp
);
value
=
X509_get_version
(
x
);
infof
(
data
,
" Version: %lu (0x%lx)
\n
"
,
value
+
1
,
value
);
snprintf
(
bufp
,
CERTBUFFERSIZE
,
"%lx"
,
value
);
push_certinfo
(
data
,
i
,
"Version"
,
bufp
);
/* hex */
Curl_ssl_
push_certinfo
(
data
,
i
,
"Version"
,
bufp
);
/* hex */
num
=
X509_get_serialNumber
(
x
);
if
(
num
->
length
<=
4
)
{
...
...
@@ -2087,30 +2017,30 @@ static CURLcode get_cert_chain(struct connectdata *conn,
bufp
[
0
]
=
0
;
}
if
(
bufp
[
0
])
push_certinfo
(
data
,
i
,
"Serial Number"
,
bufp
);
/* hex */
Curl_ssl_
push_certinfo
(
data
,
i
,
"Serial Number"
,
bufp
);
/* hex */
cinf
=
x
->
cert_info
;
j
=
asn1_object_dump
(
cinf
->
signature
->
algorithm
,
bufp
,
CERTBUFFERSIZE
);
if
(
!
j
)
{
infof
(
data
,
" Signature Algorithm: %s
\n
"
,
bufp
);
push_certinfo
(
data
,
i
,
"Signature Algorithm"
,
bufp
);
Curl_ssl_
push_certinfo
(
data
,
i
,
"Signature Algorithm"
,
bufp
);
}
certdate
=
X509_get_notBefore
(
x
);
asn1_output
(
certdate
,
bufp
,
CERTBUFFERSIZE
);
infof
(
data
,
" Start date: %s
\n
"
,
bufp
);
push_certinfo
(
data
,
i
,
"Start date"
,
bufp
);
Curl_ssl_
push_certinfo
(
data
,
i
,
"Start date"
,
bufp
);
certdate
=
X509_get_notAfter
(
x
);
asn1_output
(
certdate
,
bufp
,
CERTBUFFERSIZE
);
infof
(
data
,
" Expire date: %s
\n
"
,
bufp
);
push_certinfo
(
data
,
i
,
"Expire date"
,
bufp
);
Curl_ssl_
push_certinfo
(
data
,
i
,
"Expire date"
,
bufp
);
j
=
asn1_object_dump
(
cinf
->
key
->
algor
->
algorithm
,
bufp
,
CERTBUFFERSIZE
);
if
(
!
j
)
{
infof
(
data
,
" Public Key Algorithm: %s
\n
"
,
bufp
);
push_certinfo
(
data
,
i
,
"Public Key Algorithm"
,
bufp
);
Curl_ssl_
push_certinfo
(
data
,
i
,
"Public Key Algorithm"
,
bufp
);
}
pubkey
=
X509_get_pubkey
(
x
);
...
...
@@ -2122,7 +2052,7 @@ static CURLcode get_cert_chain(struct connectdata *conn,
infof
(
data
,
" RSA Public Key (%d bits)
\n
"
,
BN_num_bits
(
pubkey
->
pkey
.
rsa
->
n
));
snprintf
(
bufp
,
CERTBUFFERSIZE
,
"%d"
,
BN_num_bits
(
pubkey
->
pkey
.
rsa
->
n
));
push_certinfo
(
data
,
i
,
"RSA Public Key"
,
bufp
);
Curl_ssl_
push_certinfo
(
data
,
i
,
"RSA Public Key"
,
bufp
);
print_pubkey_BN
(
rsa
,
n
,
i
);
print_pubkey_BN
(
rsa
,
e
,
i
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment