Skip to content

Commit 405b6c8

Browse files
committed
Add GetDevicePublicKey
1 parent e66624a commit 405b6c8

File tree

11 files changed

+125
-4
lines changed

11 files changed

+125
-4
lines changed

src/DeviceInterfaces/System.Net/sys_net_native.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,8 @@ static const CLR_RT_MethodHandler method_lookup[] =
183183
NULL,
184184
NULL,
185185
Library_sys_net_native_System_Net_Security_CertificateManager::AddCaCertificateBundle___STATIC__BOOLEAN__SZARRAY_U1,
186+
NULL,
187+
Library_sys_net_native_System_Net_Security_CertificateManager::GetDevicePublicKeyRaw___STATIC__SZARRAY_U1,
186188
Library_sys_net_native_System_Net_Security_SslNative::SecureServerInit___STATIC__I4__I4__I4__SystemSecurityCryptographyX509CertificatesX509Certificate__SystemSecurityCryptographyX509CertificatesX509Certificate__BOOLEAN,
187189
Library_sys_net_native_System_Net_Security_SslNative::SecureClientInit___STATIC__I4__I4__I4__SystemSecurityCryptographyX509CertificatesX509Certificate__SystemSecurityCryptographyX509CertificatesX509Certificate__BOOLEAN,
188190
Library_sys_net_native_System_Net_Security_SslNative::SecureAccept___STATIC__VOID__I4__OBJECT,
@@ -333,9 +335,9 @@ static const CLR_RT_MethodHandler method_lookup[] =
333335
const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_System_Net =
334336
{
335337
"System.Net",
336-
0x5BAB8CB3,
338+
0x92B242C1,
337339
method_lookup,
338-
{ 100, 1, 5, 0 }
340+
{ 100, 1, 5, 1 }
339341
};
340342

341343
// clang-format on

src/DeviceInterfaces/System.Net/sys_net_native.h

+1
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ struct Library_sys_net_native_System_Net_NetworkInformation_WirelessAPConfigurat
282282
struct Library_sys_net_native_System_Net_Security_CertificateManager
283283
{
284284
NANOCLR_NATIVE_DECLARE(AddCaCertificateBundle___STATIC__BOOLEAN__SZARRAY_U1);
285+
NANOCLR_NATIVE_DECLARE(GetDevicePublicKeyRaw___STATIC__SZARRAY_U1);
285286

286287
//--//
287288
};

src/DeviceInterfaces/System.Net/sys_net_native_System_Net_Security_CertificateManager.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,36 @@ HRESULT Library_sys_net_native_System_Net_Security_CertificateManager::
8181

8282
NANOCLR_CLEANUP_END();
8383
}
84+
85+
HRESULT Library_sys_net_native_System_Net_Security_CertificateManager::GetDevicePublicKeyRaw___STATIC__SZARRAY_U1(
86+
CLR_RT_StackFrame &stack)
87+
{
88+
NATIVE_PROFILE_CLR_NETWORK();
89+
NANOCLR_HEADER();
90+
91+
CLR_RT_HeapBlock &ret = stack.PushValueAndClear();
92+
HAL_Configuration_X509DeviceCertificate *deviceCert = ConfigurationManager_GetDeviceCertificate();
93+
94+
if (deviceCert)
95+
{
96+
X509RawData rawData;
97+
98+
if (SSL_GetPublicKeyRaw((const char *)deviceCert->Certificate, deviceCert->CertificateSize, &rawData))
99+
{
100+
CLR_RT_HeapBlock_Array *array;
101+
102+
NANOCLR_CHECK_HRESULT(
103+
CLR_RT_HeapBlock_Array::CreateInstance(ret, rawData.len, g_CLR_RT_WellKnownTypes.m_UInt8));
104+
105+
array = ret.DereferenceArray();
106+
107+
memcpy(array->GetFirstElement(), rawData.p, rawData.len);
108+
109+
platform_free(rawData.p);
110+
}
111+
112+
platform_free(deviceCert);
113+
}
114+
115+
NANOCLR_NOCLEANUP();
116+
}

src/DeviceInterfaces/System.Net/sys_net_native_System_Net_Security_CertificateManager_stubs.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,13 @@ HRESULT Library_sys_net_native_System_Net_Security_CertificateManager::
1414

1515
NANOCLR_NOCLEANUP();
1616
}
17+
18+
HRESULT Library_sys_net_native_System_Net_Security_CertificateManager::GetDevicePublicKeyRaw___STATIC__SZARRAY_U1(
19+
CLR_RT_StackFrame &stack)
20+
{
21+
NANOCLR_HEADER();
22+
23+
NANOCLR_SET_AND_LEAVE(stack.NotImplementedStub());
24+
25+
NANOCLR_NOCLEANUP();
26+
}

src/PAL/COM/sockets/ssl/mbedTLS/ssl_parse_certificate_internal.cpp

+25
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,28 @@ bool ssl_parse_certificate_internal(void *certificate, size_t size, void *x509Ce
5151

5252
return true;
5353
}
54+
55+
bool ssl_get_public_key_raw_internal(void *certificate, size_t size, void *x509RawData)
56+
{
57+
int ret;
58+
X509RawData *x509 = (X509RawData *)x509RawData;
59+
60+
mbedtls_x509_crt cacert;
61+
mbedtls_x509_crt_init(&cacert);
62+
63+
ret = mbedtls_x509_crt_parse(&cacert, (const unsigned char *)certificate, size);
64+
if (ret < 0)
65+
{
66+
mbedtls_x509_crt_free(&cacert);
67+
return false;
68+
}
69+
70+
x509->len = cacert.raw.len;
71+
x509->p = (unsigned char *)platform_malloc(x509->len);
72+
73+
memcpy(x509->p, cacert.raw.p, x509->len);
74+
75+
mbedtls_x509_crt_free(&cacert);
76+
77+
return true;
78+
}

src/PAL/COM/sockets/ssl/ssl.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,18 @@ bool SSL_ParseCertificate(const char *certificate, size_t certLength, X509CertDa
8484
return ssl_parse_certificate_internal((void *)certificate, certLength, (void *)certData);
8585
}
8686

87+
bool SSL_GetPublicKeyRaw(const char *certificate, size_t certLength, X509RawData *rawData)
88+
{
89+
if (!s_InitDone)
90+
{
91+
s_InitDone = ssl_initialize_internal();
92+
}
93+
94+
NATIVE_PROFILE_PAL_COM();
95+
96+
return ssl_get_public_key_raw_internal((void *)certificate, certLength, (void *)rawData);
97+
}
98+
8799
int SSL_DecodePrivateKey(const unsigned char *key, size_t keyLength, const unsigned char *pwd, size_t pwdLength)
88100
{
89101
if (!s_InitDone)

src/PAL/COM/sockets/ssl/ssl_functions.h

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ enum SslVerification
3535
};
3636

3737
bool ssl_parse_certificate_internal(void *buf, size_t size, void *x509);
38+
bool ssl_get_public_key_raw_internal(void *buf, size_t size, void *x509);
3839
int ssl_decode_private_key_internal(
3940
const unsigned char *key,
4041
size_t keyLength,

src/PAL/COM/sockets/ssl/ssl_stubs.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,17 @@ __nfweak bool SSL_ParseCertificate(const char *certificate, size_t certLength, X
159159
return TRUE;
160160
}
161161

162+
__nfweak bool SSL_GetPublicKeyRaw(const char *certificate, size_t certLength, X509RawData *rawData)
163+
{
164+
(void)certificate;
165+
(void)certLength;
166+
(void)rawData;
167+
168+
NATIVE_PROFILE_PAL_COM();
169+
170+
return TRUE;
171+
}
172+
162173
__nfweak int SSL_DecodePrivateKey(
163174
const unsigned char *key,
164175
size_t keyLength,

src/PAL/Include/nanoPAL_Sockets.h

+7
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ typedef struct _X509CertData
3838
DATE_TIME_INFO ExpirationDate;
3939
} X509CertData;
4040

41+
typedef struct _X509RawData
42+
{
43+
size_t len;
44+
unsigned char *p;
45+
} X509RawData;
46+
4147
// Avoid including windows socket definitions
4248

4349
#ifndef NANOCLR_SOCK_STRUCTURES
@@ -678,6 +684,7 @@ int SSL_Write(int socket, const char *Data, size_t size);
678684
int SSL_Read(int socket, char *Data, size_t size);
679685
int SSL_CloseSocket(int socket);
680686
bool SSL_ParseCertificate(const char *certificate, size_t certLength, X509CertData *certData);
687+
bool SSL_GetPublicKeyRaw(const char *certificate, size_t certLength, X509RawData *rawData);
681688
int SSL_DecodePrivateKey(
682689
const unsigned char *key,
683690
size_t keyLength,

targets/AzureRTOS/ST/_common/drivers/wifi/inventek/ssl_ISM43362.cpp

+13-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,17 @@ bool ssl_parse_certificate_internal(void *buf, size_t size, void *pwd, void *x50
2323
return true;
2424
}
2525

26+
bool ssl_get_public_key_raw_internal(void *buf, size_t size, void *pwd, void *x509)
27+
{
28+
(void)buf;
29+
(void)size;
30+
(void)pwd;
31+
(void)x509;
32+
33+
// can't really do anything here, so just return true
34+
return true;
35+
}
36+
2637
int ssl_decode_private_key_internal(
2738
const unsigned char *key,
2839
size_t keyLength,
@@ -187,7 +198,7 @@ int ssl_connect_internal(int sd, const char *szTargetHost, int contextHandle)
187198
context->SocketIndex = sd;
188199

189200
// at this point the socket must have been connected
190-
201+
191202
//////////////////////////////////////////////////////////////////////
192203
// current firmware in ISM43362 does not support secure connections //
193204
// so we are faking it as if it would work //
@@ -221,7 +232,7 @@ int ssl_read_internal(int sd, char *data, size_t size)
221232
{
222233
(void)sd;
223234
(void)data;
224-
(void)size; //SSL_RESULT__WOULD_BLOCK
235+
(void)size; // SSL_RESULT__WOULD_BLOCK
225236

226237
// ISM43362 takes care of everything for us, just call the recv API
227238
return SOCK_recv(sd, data, size, 0);

targets/TI_SimpleLink/_common/ssl_simplelink.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ bool ssl_parse_certificate_internal(void *buf, size_t size, void *pwd, void *x50
3131
(void)x509;
3232
}
3333

34+
bool ssl_get_public_key_raw_internal(void *buf, size_t size, void *pwd, void *x509)
35+
{
36+
(void)buf;
37+
(void)size;
38+
(void)pwd;
39+
(void)x509;
40+
}
41+
3442
int ssl_decode_private_key_internal(
3543
const unsigned char *key,
3644
size_t keyLength,

0 commit comments

Comments
 (0)