Skip to content

Commit 1f3b8b8

Browse files
committed
Add GetDevicePublicKey
1 parent a912343 commit 1f3b8b8

File tree

11 files changed

+126
-4
lines changed

11 files changed

+126
-4
lines changed

src/DeviceInterfaces/System.Net/sys_net_native.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,8 @@ static const CLR_RT_MethodHandler method_lookup[] =
195195
NULL,
196196
NULL,
197197
Library_sys_net_native_System_Net_Security_CertificateManager::AddCaCertificateBundle___STATIC__BOOLEAN__SZARRAY_U1,
198+
NULL,
199+
Library_sys_net_native_System_Net_Security_CertificateManager::GetDevicePublicKeyRaw___STATIC__SZARRAY_U1,
198200
Library_sys_net_native_System_Net_Security_SslNative::SecureServerInit___STATIC__I4__I4__I4__SystemSecurityCryptographyX509CertificatesX509Certificate__SystemSecurityCryptographyX509CertificatesX509Certificate__BOOLEAN,
199201
Library_sys_net_native_System_Net_Security_SslNative::SecureClientInit___STATIC__I4__I4__I4__SystemSecurityCryptographyX509CertificatesX509Certificate__SystemSecurityCryptographyX509CertificatesX509Certificate__BOOLEAN,
200202
Library_sys_net_native_System_Net_Security_SslNative::SecureAccept___STATIC__VOID__I4__OBJECT,
@@ -345,9 +347,9 @@ static const CLR_RT_MethodHandler method_lookup[] =
345347
const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_System_Net =
346348
{
347349
"System.Net",
348-
0xD82C1452,
350+
0x11125EA2,
349351
method_lookup,
350-
{ 100, 2, 0, 11 }
352+
{ 100, 2, 0, 12 }
351353
};
352354

353355
// clang-format on

src/DeviceInterfaces/System.Net/sys_net_native.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ struct Library_sys_net_native_System_Net_NetworkInformation_WirelessAPConfigurat
299299
struct Library_sys_net_native_System_Net_Security_CertificateManager
300300
{
301301
NANOCLR_NATIVE_DECLARE(AddCaCertificateBundle___STATIC__BOOLEAN__SZARRAY_U1);
302+
NANOCLR_NATIVE_DECLARE(GetDevicePublicKeyRaw___STATIC__SZARRAY_U1);
302303

303304
//--//
304305
};

src/DeviceInterfaces/System.Net/sys_net_native_System_Net_Security_CertificateManager.cpp

Lines changed: 33 additions & 0 deletions
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

Lines changed: 10 additions & 0 deletions
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

Lines changed: 25 additions & 0 deletions
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

Lines changed: 12 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ enum SslVerification
3636
};
3737

3838
bool ssl_parse_certificate_internal(void *buf, size_t size, void *x509);
39+
bool ssl_get_public_key_raw_internal(void *buf, size_t size, void *x509);
3940
int ssl_decode_private_key_internal(
4041
const unsigned char *key,
4142
size_t keyLength,

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

Lines changed: 11 additions & 0 deletions
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 FALSE;
171+
}
172+
162173
__nfweak int SSL_DecodePrivateKey(
163174
const unsigned char *key,
164175
size_t keyLength,

src/PAL/Include/nanoPAL_Sockets.h

Lines changed: 7 additions & 0 deletions
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
@@ -714,6 +720,7 @@ int SSL_Write(int socket, const char *Data, size_t size);
714720
int SSL_Read(int socket, char *Data, size_t size);
715721
int SSL_CloseSocket(int socket);
716722
bool SSL_ParseCertificate(const char *certificate, size_t certLength, X509CertData *certData);
723+
bool SSL_GetPublicKeyRaw(const char *certificate, size_t certLength, X509RawData *rawData);
717724
int SSL_DecodePrivateKey(
718725
const unsigned char *key,
719726
size_t keyLength,

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ 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 *certificate, size_t size, void *x509RawData)
27+
{
28+
(void)certificate;
29+
(void)size;
30+
(void)x509RawData;
31+
32+
// can't really do anything here, so just return false
33+
return false;
34+
}
35+
2636
int ssl_decode_private_key_internal(
2737
const unsigned char *key,
2838
size_t keyLength,
@@ -187,7 +197,7 @@ int ssl_connect_internal(int sd, const char *szTargetHost, int contextHandle)
187197
context->SocketIndex = sd;
188198

189199
// at this point the socket must have been connected
190-
200+
191201
//////////////////////////////////////////////////////////////////////
192202
// current firmware in ISM43362 does not support secure connections //
193203
// so we are faking it as if it would work //
@@ -221,7 +231,7 @@ int ssl_read_internal(int sd, char *data, size_t size)
221231
{
222232
(void)sd;
223233
(void)data;
224-
(void)size; //SSL_RESULT__WOULD_BLOCK
234+
(void)size; // SSL_RESULT__WOULD_BLOCK
225235

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

targets/TI_SimpleLink/_common/ssl_simplelink.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,16 @@ 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 *certificate, size_t size, void *x509RawData)
35+
{
36+
(void)certificate;
37+
(void)size;
38+
(void)x509RawData;
39+
40+
// can't really do anything here, so just return false
41+
return false;
42+
}
43+
3444
int ssl_decode_private_key_internal(
3545
const unsigned char *key,
3646
size_t keyLength,

0 commit comments

Comments
 (0)