SharkSSL™ Embedded SSL/TLS Stack
SharkSSL.h
1/*
2 * ____ _________ __ _
3 * / __ \___ ____ _/ /_ __(_)___ ___ ___ / / ____ ____ _(_)____
4 * / /_/ / _ \/ __ `/ / / / / / __ `__ \/ _ \/ / / __ \/ __ `/ / ___/
5 * / _, _/ __/ /_/ / / / / / / / / / / / __/ /___/ /_/ / /_/ / / /__
6 * /_/ |_|\___/\__,_/_/ /_/ /_/_/ /_/ /_/\___/_____/\____/\__, /_/\___/
7 * /____/
8 *
9 * SharkSSL Embedded SSL/TLS Stack
10 ****************************************************************************
11 * PROGRAM MODULE
12 *
13 * $Id: SharkSSL.h 6407 2026-10-12 21:41:24Z gianluca $
14 *
15 * COPYRIGHT: Real Time Logic LLC, 2010 - 2026
16 *
17 * This software is copyrighted by and is the sole property of Real
18 * Time Logic LLC. All rights, title, ownership, or other interests in
19 * the software remain the property of Real Time Logic LLC. This
20 * software may only be used in accordance with the terms and
21 * conditions stipulated in the corresponding license agreement under
22 * which the software has been supplied. Any unauthorized use,
23 * duplication, transmission, distribution, or disclosure of this
24 * software is expressly forbidden.
25 *
26 * This Copyright notice may not be removed or modified without prior
27 * written consent of Real Time Logic LLC.
28 *
29 * Real Time Logic LLC. reserves the right to modify this software
30 * without notice.
31 *
32 * http://www.realtimelogic.com
33 * http://www.sharkssl.com
34 ****************************************************************************
35 *
36 */
37#ifndef _SharkSsl_h
38#define _SharkSsl_h
39
40#include "TargConfig.h" /* platform dependencies */
41
42#if defined(SHARKDBG_ENABLE) && SHARKDBG_ENABLE
43#define SHARKDBG_PRINTF(x) printf x
44#else
45#define SHARKDBG_PRINTF(x)
46#endif
47
48#ifndef SHARKSSL_API
49#define SHARKSSL_API
50#else /* Barracuda */
51#define SHARKSSL_BA 1
52#include <ThreadLib.h>
53#include <BaServerLib.h>
54#endif
55
56#include "SharkSSL_cfg.h" /* SharkSSL configuration */
57#if SHARKSSL_PSA_CONSUMER
58#include <psa/crypto.h>
59#endif
60#include <stddef.h> /* size_t */
61
62#include "SharkSslCrypto.h" /* Crypto API */
63
64#ifndef sharkCertSerialNumber2NetworkEndian
69typedef U64 SharkCertSerialNumber;
70#ifdef B_BIG_ENDIAN
71#define sharkCertSerialNumber2NetworkEndian(n)
72#else
73#define sharkCertSerialNumber2NetworkEndian(n) \
74 do { \
75 U64 nn=0; \
76 register U8 *t=(U8*)&nn; \
77 register U8 *f=(U8*)&n; \
78 t[7]=f[0]; \
79 t[6]=f[1]; \
80 t[5]=f[2]; \
81 t[4]=f[3]; \
82 t[3]=f[4]; \
83 t[2]=f[5]; \
84 t[1]=f[6]; \
85 t[0]=f[7]; \
86 n=nn; \
87 } while(0)
88#endif
89#endif
90
91/* Forward decl. */
92struct SharkSslCertDN;
95
117#define SHARKSSL_ALERT_LEVEL_WARNING 1
118
120#define SHARKSSL_ALERT_LEVEL_FATAL 2
121
134#define SHARKSSL_ALERT_CLOSE_NOTIFY 0
136#define SHARKSSL_ALERT_UNEXPECTED_MESSAGE 10
138#define SHARKSSL_ALERT_BAD_RECORD_MAC 20
140#define SHARKSSL_ALERT_DECRYPTION_FAILED 21
142#define SHARKSSL_ALERT_RECORD_OVERFLOW 22
144#define SHARKSSL_ALERT_DECOMPRESSION_FAILURE 30
146#define SHARKSSL_ALERT_HANDSHAKE_FAILURE 40
148#define SHARKSSL_ALERT_BAD_CERTIFICATE 42
150#define SHARKSSL_ALERT_UNSUPPORTED_CERTIFICATE 43
152#define SHARKSSL_ALERT_CERTIFICATE_REVOKED 44
154#define SHARKSSL_ALERT_CERTIFICATE_EXPIRED 45
156#define SHARKSSL_ALERT_CERTIFICATE_UNKNOWN 46
158#define SHARKSSL_ALERT_ILLEGAL_PARAMETER 47
160#define SHARKSSL_ALERT_UNKNOWN_CA 48
162#define SHARKSSL_ALERT_ACCESS_DENIED 49
164#define SHARKSSL_ALERT_DECODE_ERROR 50
166#define SHARKSSL_ALERT_DECRYPT_ERROR 51
168#define SHARKSSL_ALERT_EXPORT_RESTRICTION 60
170#define SHARKSSL_ALERT_PROTOCOL_VERSION 70
172#define SHARKSSL_ALERT_INSUFFICIENT_SECURITY 71
174#define SHARKSSL_ALERT_INTERNAL_ERROR 80
176#define SHARKSSL_ALERT_USER_CANCELED 90
178#define SHARKSSL_ALERT_NO_RENEGOTIATION 100
180#define SHARKSSL_ALERT_MISSING_EXTENSION 109
182#define SHARKSSL_ALERT_UNSUPPORTED_EXTENSION 110
184#define SHARKSSL_ALERT_UNRECOGNIZED_NAME 112
186#define SHARKSSL_ALERT_GENERAL_ERROR 117
188#define SHARKSSL_ALERT_NO_APPLICATION_PROTOCOL 120 /* RFC 7301 */
189 /* end group SharkSslAlertMsg */ /* end group SharkSslAlert */
192
193
202#if SHARKSSL_TLS_1_3
204#define TLS_AES_128_GCM_SHA256 0x1301
206#define TLS_AES_256_GCM_SHA384 0x1302
208#define TLS_CHACHA20_POLY1305_SHA256 0x1303
209#endif
210#if SHARKSSL_TLS_1_2
212#define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 0x009E
214#define TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 0x009F
216#define TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xC02B
218#define TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0xC02C
220#define TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xC02F
222#define TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0xC030
224#define TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xCCA8
226#define TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 0xCCA9
228#define TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xCCAA
229#endif
230 /* end group SharkSslCiphers */
232
233
241#define SHARKSSL_PROTOCOL_UNKNOWN 0x00
243#define SHARKSSL_PROTOCOL_TLS_1_2 0x33
245#define SHARKSSL_PROTOCOL_TLS_1_3 0x34
246
247/* internal use, with SHARKSSL_PROTOCOL_TLS_1_x as parameter */
248#define SHARKSSL_PROTOCOL_MAJOR(p) (p >> 4)
249#define SHARKSSL_PROTOCOL_MINOR(p) (p & 0xF)
250 /* end group SharkSslProtocol */
252
253
254#if (SHARKSSL_ENABLE_RSA || SHARKSSL_ENABLE_ECDSA)
255#ifndef BA_API /* standalone SharkSSL */
256#define BA_API SHARKSSL_API
257#ifdef _SHARKSSL_C_
258#define SingleListCode 1
259#endif
260#endif
261#include "SingleList.h"
262#endif
263
264
265#if SHARKSSL_ENABLE_SESSION_CACHE || SHARKSSL_NOPACK
266
275 /* end group SharkSslSessionApi */
277
278#ifndef _DOXYGEN
279typedef struct SharkSslSessionCache
280{
281 SharkSslSession *cache;
282 ThreadMutexBase cacheMutex;
283 U16 cacheSize;
284} SharkSslSessionCache;
285#endif
286#endif
287
288
300typedef enum
301{
306 /* end group SharkSslInfoAndCodes */
308
309
310#if (SHARKSSL_ENABLE_RSA || SHARKSSL_ENABLE_ECDSA)
318typedef U8* SharkSslKey;
319
320
326typedef const U8 *SharkSslCert;
327
328#ifdef __cplusplus
329extern "C" {
330#endif
331
336SHARKSSL_API U16 SharkSslCert_len(SharkSslCert cert);
337
340#ifdef __DOXYGEN__
342#endif
343
344#if SHARKSSL_ENABLE_CSR_CREATION
409SHARKSSL_API int
411 SharkSslKey privKey,
412 U8 hashID,
413 struct SharkSslCertDN *certDN,
414 const char *SAN,
415 struct SharkSslBitExtReq *keyUsage,
416 struct SharkSslBitExtReq *nsCertType);
417#endif
418
419#if SHARKSSL_ENABLE_CSR_SIGNING
423#endif
424
425#if SHARKSSL_ENABLE_ASN1_KEY_CREATION
432SHARKSSL_API int
434#endif
435
436
437#ifdef __cplusplus
438}
439#endif
440
441
442#if SHARKSSL_ENABLE_CA_LIST
448typedef const U8 *SharkSslCAList;
449#endif
450 /* end group SharkSslInfoAndCodes */
452#endif
453
454#ifndef _DOXYGEN
455struct SharkSsl;
456#endif
457
458
459/* Non documented API used by SharkSslSCMgr when used indirectly by
460 Lua code in the Barracuda Application Server. The code manages
461 automatic destruction of SharkSslSCMgr.
462 */
463#ifndef _DOXYGEN
464struct SharkSslIntf;
465typedef void (*SharkSslIntf_Terminate)(struct SharkSslIntf *o,
466 struct SharkSsl *ssl);
467typedef struct SharkSslIntf
468{
469 SharkSslIntf_Terminate terminate;
470} SharkSslIntf;
471#define SharkSslIntf_constructor(o,terminateFunc) (o)->terminate=terminateFunc
472#endif
473
474
497
498
499#ifdef __cplusplus
500extern "C" {
501SHARKSSL_API void *sharkssl_mallocObject(size_t size);
502SHARKSSL_API void sharkssl_freeObject(void *object);
503}
504#endif
505
506
510typedef struct
512{
513#ifdef __cplusplus
514 void *operator new(size_t s) { return sharkssl_mallocObject(s); }
515 void operator delete(void *d) { sharkssl_freeObject(d); }
516 void *operator new(size_t, void *place) { return place; }
517 void operator delete(void*, void *) { }
518
519 SharkSsl() {};
520
522 U16 cacheSize = 0,
523 U16 inBufStartSize = 4096,
524 U16 outBufSize = 4096
525 );
526
527 ~SharkSsl();
528 SharkSslCon *createCon(void);
529 U8 setCAList(SharkSslCAList list);
530 U8 setCAListEx(SharkSslCAList list, U32 caListLen);
531 U8 addCertificate(SharkSslCert cert);
532 void terminateCon(SharkSslCon *sslCon);
533#endif
534 #if (SHARKSSL_SSL_SERVER_CODE && SHARKSSL_SSL_CLIENT_CODE) || SHARKSSL_NOPACK
535 SharkSsl_Role role;
536 #endif
537 U16 outBufSize;
538 U16 inBufStartSize;
539 U16 nCon;
540 #if (SHARKSSL_ENABLE_RSA || (SHARKSSL_ENABLE_ECDSA)) || SHARKSSL_NOPACK
541 SingleList certList;
542 #if SHARKSSL_ENABLE_CA_LIST || SHARKSSL_NOPACK
543 SharkSslCAList caList;
544 #endif
545 #endif
546 #if SHARKSSL_ENABLE_SESSION_CACHE || SHARKSSL_NOPACK
547 SharkSslSessionCache sessionCache;
548 /* Reserved for use with one SharkSslSCMgr object */
549 SharkSslIntf *intf;
550 #endif
552 /* end group SharkSslInfoAndCodes */
554
561typedef enum
562{
566
570
581
595
608
622
631
643
649
653
655 /* end group SharkSslCoreApi */
657
662#if (SHARKSSL_MAX_HANDSHAKE_LENGTH > 0xFFFFUL)
663typedef U32 SharkSslSANLen;
664#else
665typedef U16 SharkSslSANLen;
666#endif
667
668#if (SHARKSSL_ENABLE_RSA || SHARKSSL_ENABLE_ECDSA)
669
681#if SHARKSSL_ENABLE_CERT_KEYUSAGE
682#define SHARKSSL_CERT_KEYUSAGE_DIGITALSIGNATURE 0x00000001
683#define SHARKSSL_CERT_KEYUSAGE_NONREPUDIATION 0x00000002
684#define SHARKSSL_CERT_KEYUSAGE_KEYENCIPHERMENT 0x00000004
685#define SHARKSSL_CERT_KEYUSAGE_DATAENCIPHERMENT 0x00000008
686#define SHARKSSL_CERT_KEYUSAGE_KEYAGREEMENT 0x00000010
687#define SHARKSSL_CERT_KEYUSAGE_KEYCERTSIGN 0x00000020
688#define SHARKSSL_CERT_KEYUSAGE_CRLSIGN 0x00000040
689#define SHARKSSL_CERT_KEYUSAGE_ENCIPHERONLY 0x00000080
690#define SHARKSSL_CERT_KEYUSAGE_DECIPHERONLY 0x00000100
691#define SHARKSSL_CERT_KEYUSAGE_PRESENT 0x00000200
692#define SHARKSSL_CERT_KEYUSAGE_CRITICAL 0x00000400
693
694#define SHARKSSL_CERT_KEYPURPOSE_SERVERAUTH 0x00010000
695#define SHARKSSL_CERT_KEYPURPOSE_CLIENTAUTH 0x00020000
696#define SHARKSSL_CERT_KEYPURPOSE_CODESIGNING 0x00040000
697#define SHARKSSL_CERT_KEYPURPOSE_EMAILPROTECTION 0x00080000
698#define SHARKSSL_CERT_KEYPURPOSE_TIMESTAMPING 0x00100000
699#define SHARKSSL_CERT_KEYPURPOSE_OCSPSIGNING 0x00200000
700
701#define SharkSslCertInfo_KeyFlagSet(o,f) ((o)->keyUsagePurposes & f)
702
706#define SharkSslCertInfo_isKeyUsagePresent(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYUSAGE_PRESENT)
707#define SharkSslCertInfo_isKeyUsageCritical(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYUSAGE_CRITICAL)
708#define SharkSslCertInfo_KU_digitalSignature(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYUSAGE_DIGITALSIGNATURE)
709#define SharkSslCertInfo_KU_nonRepudiation(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYUSAGE_NONREPUDIATION)
710#define SharkSslCertInfo_KU_keyEncipherment(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYUSAGE_KEYENCIPHERMENT)
711#define SharkSslCertInfo_KU_dataEncipherment(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYUSAGE_DATAENCIPHERMENT)
712#define SharkSslCertInfo_KU_keyAgreement(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYUSAGE_KEYAGREEMENT)
713#define SharkSslCertInfo_KU_keyCertSign(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYUSAGE_KEYCERTSIGN)
714#define SharkSslCertInfo_KU_cRLSign(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYUSAGE_CRLSIGN)
715#define SharkSslCertInfo_KU_encipherOnly(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYUSAGE_ENCIPHERONLY)
716#define SharkSslCertInfo_KU_decipherOnly(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYUSAGE_DECIPHERONLY)
717
718#define SharkSslCertInfo_kp_serverAuth(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYPURPOSE_SERVERAUTH)
719#define SharkSslCertInfo_kp_clientAuth(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYPURPOSE_CLIENTAUTH)
720#define SharkSslCertInfo_kp_codeSigning(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYPURPOSE_CODESIGNING)
721#define SharkSslCertInfo_kp_emailProtection(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYPURPOSE_EMAILPROTECTION)
722#define SharkSslCertInfo_kp_timeStamping(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYPURPOSE_TIMESTAMPING)
723#define SharkSslCertInfo_kp_OCSPSigning(o) SharkSslCertInfo_KeyFlagSet(o, SHARKSSL_CERT_KEYPURPOSE_OCSPSIGNING)
724#endif
725
726
738typedef struct SharkSslCertDN
739{
740 const U8 *countryName;
741 const U8 *province;
742 const U8 *locality;
743 const U8 *organization;
744 const U8 *unit;
748 const U8 *commonName;
749 const U8 *emailAddress;
750
751 U8 countryNameLen;
759
762#define SharkSslCertDN_constructor(o) memset(o,0,sizeof(SharkSslCertDN))
765#define SharkSslCertDN_setCountryName(o, countryNameMA) \
766 (o)->countryName=(const U8*)countryNameMA,(o)->countryNameLen=(U8)strlen(countryNameMA)
769#define SharkSslCertDN_setProvince(o, provinceMA) \
770 (o)->province=(const U8*)provinceMA,(o)->provinceLen=(U8)strlen(provinceMA)
773#define SharkSslCertDN_setLocality(o, localityMA) \
774 (o)->locality=(const U8*)localityMA,(o)->localityLen=(U8)strlen(localityMA)
777#define SharkSslCertDN_setOrganization(o, organizationMA) \
778 (o)->organization=(const U8*)organizationMA,(o)->organizationLen=(U8)strlen(organizationMA)
781#define SharkSslCertDN_setUnit(o, unitMA) \
782 (o)->unit=(const U8*)unitMA,(o)->unitLen=(U8)strlen(unitMA)
785#define SharkSslCertDN_setCommonName(o, commonNameMA) \
786 (o)->commonName=(const U8*)commonNameMA,(o)->commonNameLen=(U8)strlen(commonNameMA)
789#define SharkSslCertDN_setEmailAddress(o, emailAddressMA) \
790 (o)->emailAddress=(const U8*)emailAddressMA,(o)->emailAddressLen=(U8)strlen(emailAddressMA)
791
792
796typedef struct SharkSslCertInfo
797{
799 U16 snLen;
800
805
810
813 U8 *sn;
814
818 U8 *timeFrom; /* declaration of U8 timeFromLen below */
819
824 U8 *timeTo; /* declaration of U8 timeToLen below */
825
831
837
850 SharkSslSANLen subjectAltNamesLen;
851
854
857
858 #if SHARKSSL_ENABLE_CERT_KEYUSAGE
881 U32 keyUsagePurposes;
882 #endif
883
889 /* end group SharkSslCertInfo */
891#endif
892
898#ifdef __cplusplus
899extern "C" {
900#endif
901
947SHARKSSL_API void SharkSsl_constructor(
948 SharkSsl *o,
949 SharkSsl_Role role,
950 U16 cacheSize,
951 U16 inBufStartSize,
952 U16 outBufSize
953 );
954
962SHARKSSL_API void SharkSsl_destructor(SharkSsl *o);
963
964
985
986
1002
1003
1004#if SHARKSSL_ENABLE_SESSION_CACHE
1005
1010SHARKSSL_API U16 SharkSsl_getCacheSize(SharkSsl *o);
1011
1012#define SharkSsl_setIntf(o, sharkSslIntf) (o)->intf=sharkSslIntf
1013#define SharkSsl_getIntf(o) (o)->intf
1014
1015#endif
1016
1017
1024#define SharkSslCon_terminate(o) SharkSsl_terminateCon(0, o)
1025
1048
1049
1084
1085
1100
1101
1102#if (SHARKSSL_TLS_1_3 && SHARKSSL_ENABLE_KEY_UPDATE)
1109#define SHARKSSL_KEY_UPDATE_NOT_REQUESTED 0
1110
1116#define SHARKSSL_KEY_UPDATE_REQUESTED 1
1117
1146SHARKSSL_API U8 SharkSslCon_keyUpdate(SharkSslCon *o, U8 requestUpdate);
1147#if SHARKSSL_ENABLE_AES_GCM
1157#endif
1158#endif
1159
1160
1170
1171
1189
1190
1201
1213
1214
1233
1264U16 SharkSslCon_copyDecData(SharkSslCon *o, U8 *buf, U16 maxLen);
1265
1266
1276SHARKSSL_API U16 SharkSslCon_getDecData(SharkSslCon *o, U8 **bufPtr);
1277
1278
1294
1295
1309
1310
1332
1333
1344
1345
1358
1359
1367
1368
1372
1373
1384
1385
1396
1397
1407#define SharkSslCon_getAlertData(o) SharkSslCon_getEncData(o)
1408
1409
1419#define SharkSslCon_getAlertDataLen(o) SharkSslCon_getEncDataLen(o)
1420 /* end group SharkSslCoreApi */
1422
1423
1424#if SHARKSSL_ENABLE_INFO_API
1425
1429
1432#if (SHARKSSL_TLS_1_3 && SHARKSSL_TLS_1_2)
1434#elif SHARKSSL_TLS_1_3
1435#define SharkSslCon_getProtocol(o) (SHARKSSL_PROTOCOL_TLS_1_3)
1436#elif SHARKSSL_TLS_1_2
1437#define SharkSslCon_getProtocol(o) (SHARKSSL_PROTOCOL_TLS_1_2)
1438#else
1439#error please enable at least one of SHARKSSL_TLS_1_3, SHARKSSL_TLS_1_2
1440#endif
1441
1442#endif
1443
1444
1445#if SHARKSSL_ENABLE_SNI
1446
1447#if SHARKSSL_SSL_CLIENT_CODE
1450SHARKSSL_API U8 SharkSslCon_setSNI(SharkSslCon *o, const char *name, U16 length);
1451#endif
1452
1453#endif
1454
1455
1456#if (SHARKSSL_ENABLE_RSA || SHARKSSL_ENABLE_ECDSA)
1457#if (SHARKSSL_SSL_CLIENT_CODE && SHARKSSL_ENABLE_CLIENT_AUTH)
1462#endif
1463
1468
1469
1470#if (SHARKSSL_ENABLE_CERTINFO_PARSE_API && (SHARKSSL_SSL_CLIENT_CODE || SHARKSSL_SSL_SERVER_CODE || SHARKSSL_ENABLE_CSR_SIGNING || SHARKSSL_SSL_TOOLS_CODE))
1480SHARKSSL_API int SharkSslCertInfo_parseCert(SharkSslCertInfo *o, const U8 *der, U32 len);
1481#endif
1482
1483
1495
1496#if SHARKSSL_PSA_CONSUMER
1502SHARKSSL_API U8 SharkSsl_addCertificatePSA(SharkSsl *o, SharkSslCert cert, psa_key_id_t psaKey);
1503#endif
1504
1505#if SHARKSSL_ENABLE_CA_LIST
1506
1535SHARKSSL_API U8 SharkSsl_setCAListEx(SharkSsl *o, SharkSslCAList caList, U32 caListLen);
1537#define SharkSsl_setCAList(o, caList) SharkSsl_setCAListEx((o), (caList), 0)
1538
1553
1554U8 SharkSslCon_isCAListEmpty(SharkSslCon *o);
1555#else
1556
1557#define SharkSslCon_trustedCA(o) 0
1558#endif /* SHARKSSL_ENABLE_CA_LIST */
1559
1560#if (SHARKSSL_SSL_SERVER_CODE && SHARKSSL_ENABLE_RSA)
1562#define SHARKSSL_SET_FAVOR_RSA 1
1564#define SHARKSSL_CLEAR_FAVOR_RSA 0
1565
1575#endif /* SHARKSSL_SSL_SERVER_CODE */
1576#endif /* SHARKSSL_ENABLE_RSA || SHARKSSL_ENABLE_ECDSA */
1577
1578U8 SharkSslCon_selectProtocol(SharkSslCon *o, U8 protocol);
1579
1584#if SHARKSSL_ENABLE_SESSION_CACHE
1585
1586#if SHARKSSL_ENABLE_INFO_API
1590#endif
1591
1595
1596#if SHARKSSL_SSL_SERVER_CODE
1600#endif
1601
1602#if SHARKSSL_SSL_CLIENT_CODE
1603
1612
1613
1630
1636#endif
1637#endif
1638 /* end group SharkSslSessionApi */
1640
1641#if (SHARKSSL_SSL_SERVER_CODE && SHARKSSL_ENABLE_CLIENT_AUTH && \
1642 (SHARKSSL_ENABLE_RSA || SHARKSSL_ENABLE_ECDSA))
1666SHARKSSL_API U8 SharkSslCon_requestClientCertEx(SharkSslCon *o, const void *caList, U32 caListLen);
1668#define SharkSslCon_requestClientCert(o, caList) SharkSslCon_requestClientCertEx((o), (caList), 0)
1669#endif
1670
1671#if (SHARKSSL_TLS_1_3 && SHARKSSL_SSL_CLIENT_CODE && SHARKSSL_ENABLE_CA_EXTENSION && \
1672 (SHARKSSL_ENABLE_RSA || SHARKSSL_ENABLE_ECDSA))
1692SHARKSSL_API U8 SharkSslCon_setCertificateAuthoritiesEx(SharkSslCon *o, const void *caList, U32 caListLen);
1694#define SharkSslCon_setCertificateAuthorities(o, caList) SharkSslCon_setCertificateAuthoritiesEx((o), (caList), 0)
1695#endif
1696
1697#if SHARKSSL_ENABLE_ALPN_EXTENSION
1698#if SHARKSSL_SSL_CLIENT_CODE
1718SHARKSSL_API U8 SharkSslCon_setALPNProtocols(SharkSslCon *o, const char *protList);
1719
1733SHARKSSL_API const char *SharkSslCon_getALPNProtocol(SharkSslCon *o);
1734#endif
1735#if SHARKSSL_SSL_SERVER_CODE
1736typedef int(*ALPNFunction)(SharkSslCon*, const char*, void*);
1737SHARKSSL_API U8 SharkSslCon_setALPNFunction(
1738 SharkSslCon *o, ALPNFunction func, void *pvoid);
1739#endif
1740#endif /* SHARKSSL_ENABLE_ALPN_EXTENSION */
1741
1742#if ((SHARKSSL_SSL_SERVER_CODE || SHARKSSL_SSL_CLIENT_CODE) && \
1743 SHARKSSL_ENABLE_SELECT_CIPHERSUITE)
1772SHARKSSL_API U8 SharkSslCon_selectCiphersuite(SharkSslCon *o, U16 cipherSuite);
1773
1777#endif
1778
1779#if (SHARKSSL_SSL_SERVER_CODE && SHARKSSL_ENABLE_SECURE_RENEGOTIATION)
1800#endif
1801 /* end group SharkSslApi */
1803
1804
1805#if SHARKSSL_ENABLE_PEM_API
1813typedef enum
1814{
1817
1820
1823
1826
1829
1832
1835
1838
1841
1844
1847
1850
1853
1856
1859
1862
1865
1868
1872
1873
1903 const char *certPEM, const char *keyPEM,
1904 const char *passphrase, SharkSslCert *sharkSslCert);
1905
1906#if SHARKSSL_ENABLE_ENCRYPTED_PKCS8_SUPPORT
1924SHARKSSL_API int sharkssl_PEM_PBKDF2(
1925 U8 *dk, const char *passphrase,
1926 const char *salt, U32 saltLen,
1927 U32 iterations, U16 dkLen, U8 hashID);
1928#endif
1929 /* end group RayCryptoApi */
1931#endif
1932
1933#if SHARKSSL_ENABLE_RSA
1934
1941#define SHARKSSL_RSA_NO_PADDING 0
1942
1943
1947#define SHARKSSL_RSA_PKCS1_PADDING 1
1948
1949
1955typedef enum
1956{
1959
1962
1965
1968
1971
1974
1977
1980
1983
1986
1989
1992
1996#endif
1997 /* end group SharkSslInfoAndCodes */
1999
2000#if SHARKSSL_ENABLE_RSA_API
2001
2012typedef U8* SharkSslRSAKey;
2013
2014#if SHARKSSL_ENABLE_PEM_API
2039 const char *PEMKey, const char *passphrase);
2040
2064SHARKSSL_API SharkSslKey
2066
2067SHARKSSL_API SharkSslKey
2068sharkssl_PEM_extractPublicKey_ext(const char *certPEM, U8 *keyType);
2069#endif /* SHARKSSL_ENABLE_PEM_API */
2070
2071#if (SHARKSSL_ENABLE_PEM_API || (SHARKSSL_ENABLE_RSA && SHARKSSL_ENABLE_RSAKEY_CREATE))
2076#define _SHARKSSLRSAKEY_FREE 1
2077#endif
2078
2079#if SHARKSSL_ENABLE_RSA
2080#if SHARKSSL_ENABLE_RSAKEY_CREATE
2101SHARKSSL_API int SharkSslRSAKey_create(SharkSslRSAKey *privKey, U16 keyLength);
2102
2116#endif
2117
2122
2146 SharkSslRSAKey pubkey, const U8 *in, int len, U8 *out, int padding);
2147
2148
2167 SharkSslRSAKey privkey, const U8 *in, int len, U8 *out, int padding);
2168
2169
2187 SharkSslRSAKey privkey, U8 *sig, U16 *siglen, const U8 *hash, U8 hashID);
2188
2189
2207 SharkSslRSAKey pubkey, U8 *sig, U16 siglen, const U8 *hash, U8 hashID);
2208
2209
2210#if SHARKSSL_ENABLE_RSA_OAEP
2235SHARKSSL_API sharkssl_RSA_RetVal sharkssl_RSA_private_decrypt_OAEP(
2236 SharkSslRSAKey privkey, U8 *in, int len, U8 hashID, U8 *out, const char *label, U16 labelLen);
2237
2238
2264SHARKSSL_API sharkssl_RSA_RetVal sharkssl_RSA_public_encrypt_OAEP(
2265 SharkSslRSAKey pubkey, const U8 *in, int len, U8 hashID, U8 *out, const char *label, U16 labelLen);
2266#endif
2267
2268
2290 SharkSslRSAKey privkey, const U8 *in, int len, U8 *out, int padding);
2291
2292
2314 SharkSslRSAKey pubkey, const U8 *in, int len, U8 *out, int padding);
2315
2316#endif
2317 /* end group RSA */
2319#endif
2320
2321
2334#if SHARKSSL_USE_ECC
2335/*
2336 * NamedCurve, use as curveID parameter
2337 * SECPxxxR1 - RFC 4492 section 5.1.1
2338 * BRAINPOOLPxxxR1 - RFC 7027 section 2
2339 * CURVE25519,448 - RFC 8446 section 4.2.7
2340 */
2341#define SHARKSSL_EC_CURVE_ID_SECP256R1 23
2342#define SHARKSSL_EC_CURVE_ID_SECP384R1 24
2343#define SHARKSSL_EC_CURVE_ID_SECP521R1 25
2344#define SHARKSSL_EC_CURVE_ID_BRAINPOOLP256R1 26
2345#define SHARKSSL_EC_CURVE_ID_BRAINPOOLP384R1 27
2346#define SHARKSSL_EC_CURVE_ID_BRAINPOOLP512R1 28
2347#define SHARKSSL_EC_CURVE_ID_CURVE25519 29
2348#define SHARKSSL_EC_CURVE_ID_CURVE448 30
2349
2350#define SHARKSSL_X25519_KEY_LEN 32
2351
2352
2353#if (SHARKSSL_ECC_USE_CURVE25519 && SHARKSSL_ENABLE_X25519_API)
2371 U8 privateKey[SHARKSSL_X25519_KEY_LEN],
2372 U8 publicKey[SHARKSSL_X25519_KEY_LEN]);
2373
2374
2388 const U8 privateKey[SHARKSSL_X25519_KEY_LEN],
2389 const U8 peerPublicKey[SHARKSSL_X25519_KEY_LEN],
2390 U8 sharedSecret[SHARKSSL_X25519_KEY_LEN]);
2391#endif
2392
2393
2400typedef U8* SharkSslECCKey;
2401
2402#if SHARKSSL_ENABLE_PEM_API
2428 const char *PEMKey, const char *passphrase);
2429#endif /* SHARKSSL_ENABLE_PEM_API */
2430
2431
2432#if (SHARKSSL_ENABLE_RSA || SHARKSSL_ENABLE_ECDSA)
2440SHARKSSL_API U16 SharkSslKey_vectSize(const SharkSslKey key);
2441#define SharkSslCert_vectSize(c) SharkSslKey_vectSize((const SharkSslCert)c)
2442#define SharkSslCert_vectSize_keyInfo(c, t, p, a, b, x, y) SharkSslKey_vectSize_keyInfo((const SharkSslKey)c, t, p, a, b, x, y)
2443#if SHARKSSL_ENABLE_RSA
2444#define SharkSslRSAKey_vectSize(k) SharkSslKey_vectSize(k)
2445#define SharkSslRSAKey_vectSize_keyInfo(k, t, p, a, b, x, y) SharkSslKey_vectSize_keyInfo((const SharkSslKey)k, t, p, a, b, x, y)
2446#endif
2447#if SHARKSSL_ENABLE_ECDSA
2448#define SharkSslECCKey_vectSize(k) SharkSslKey_vectSize(k)
2449#define SharkSslECCKey_vectSize_keyInfo(k, t, p, a, b, x, y) SharkSslKey_vectSize_keyInfo((const SharkSslKey)k, t, p, a, b, x, y)
2450#endif
2451
2452/* return values of function SharkSslKey_vectSize_keyInfo for the parameter keyType */
2453#define SHARKSSL_KEYTYPE_RSA 0x00
2454#define SHARKSSL_KEYTYPE_EC 0x02
2455
2471SHARKSSL_API U16 SharkSslKey_vectSize_keyInfo(const SharkSslKey key, U8 *keyType, U8 *isKeyPrivate, U8 **d1, U16 *d1Len, U8 **d2, U16 *d2Len);
2472#endif
2473
2474#if SHARKSSL_ENABLE_ECCKEY_CREATE
2475
2476typedef int (*sharkssl_rngfunc)(void *handle, U8 *ptr, U16 len);
2477
2478
2497#define SharkSslECCKey_create(privKey, curveID) SharkSslECCKey_createEx((privKey), (curveID), 0, 0)
2498
2499
2549SHARKSSL_API int SharkSslECCKey_createEx(SharkSslECCKey *privKey, U16 curveID, void *rngHandle, sharkssl_rngfunc rngFunc);
2550#endif
2551
2552
2553#if (SHARKSSL_ENABLE_PEM_API || SHARKSSL_ENABLE_ECCKEY_CREATE)
2559#define _SHARKSSLECCKEY_FREE 1
2560#endif
2561
2562
2563/*
2564 *-----------------------------------------------------------------------------
2565 * To free up the memory allocated by SharkSslECCKey_create and
2566 * SharkSslRSAKey_create, the following macro is provided
2567 * For instance, this function could be called after saving the key to a file
2568 *-----------------------------------------------------------------------------
2569 * key: input parameter, points to a buffer allocated by either
2570 * SharkSslECCKey_create or SharkSslRSAKey_create
2571 */
2572#if defined(_SHARKSSLRSAKEY_FREE)
2573#define SharkSslKey_free SharkSslRSAKey_free
2574#elif defined (_SHARKSSLECCKEY_FREE)
2575#define SharkSslKey_free SharkSslECCKey_free
2576#else
2577#define SharkSslKey_free
2578#endif
2579#undef _SHARKSSLRSAKEY_FREE
2580#undef _SHARKSSLECCKEY_FREE
2581
2582
2588#if SHARKSSL_ENABLE_ECDSA
2592/* ECDSA API and also internal sharkssl_ECDSA_signASN1 */
2593typedef enum
2594{
2597
2600
2603
2606
2609
2612
2615
2618
2621
2625 /* end group SharkSslInfoAndCodes */
2627
2633#if SHARKSSL_ENABLE_ECDSA_API
2634#if (!SHARKSSL_ECDSA_ONLY_VERIFY)
2643SHARKSSL_API U16 sharkssl_ECDSA_siglen(SharkSslECCKey privkey);
2644
2672 SharkSslECCKey privkey, U8 *sig, U16 *siglen, const U8 *hash, U8 hashID);
2673#endif
2674
2697 SharkSslECCKey pubkey, U8 *sig, U16 siglen, const U8 *hash, U8 hashID);
2698
2699#endif /* SHARKSSL_ENABLE_ECDSA_API */
2700#endif /* SHARKSSL_ENABLE_ECDSA */
2701 /* end group ECC */
2703#endif
2704
2705
2706#if (SHARKSSL_ENABLE_CA_LIST && SHARKSSL_ENABLE_CERTSTORE_API)
2707
2713#ifndef BA_API /* standalone SharkSSL */
2714#define BA_API SHARKSSL_API
2715typedef U8 BaBool;
2716#endif
2717#include "DoubleList.h"
2718
2738typedef struct SharkSslCertStore
2739{
2740 DoubleList certList;
2741 SharkSslCAList caList;
2742 U16 elements; /* number of elements in list */
2744
2754
2758
2760#define SharkSslCertStore_release(o) SharkSslCertStore_destructor(o)
2761
2777SHARKSSL_API U16 SharkSslCertStore_add(
2778 SharkSslCertStore *o, const char *cert, U32 certlen);
2779
2791 SharkSslCertStore *o, SharkSslCAList *outList);
2792 /* end group SharkSslCertApi */
2794#endif /* SHARKSSL_ENABLE_CA_LIST && SHARKSSL_ENABLE_CERTSTORE_API */
2795
2796#if ((SHARKSSL_ENABLE_PEM_API) || (SHARKSSL_ENABLE_CERTSTORE_API))
2797SHARKSSL_API U32 sharkssl_B64Decode(
2798 U8 *outStr, U32 outStrSize, const char *b64beg, const char *b64end);
2799#endif
2800
2801
2802
2803#ifdef __cplusplus
2804}
2805
2806inline SharkSsl::SharkSsl(
2807 SharkSsl_Role role, U16 cacheSize, U16 inBufStartSize, U16 outBufSize) {
2808 SharkSsl_constructor(this, role, cacheSize, inBufStartSize, outBufSize);
2809}
2810inline SharkSsl::~SharkSsl() {
2811 SharkSsl_destructor(this);
2812}
2813inline SharkSslCon *SharkSsl::createCon(void) {
2814 return SharkSsl_createCon(this);
2815}
2816inline void SharkSsl::terminateCon(SharkSslCon *sslCon) {
2817 SharkSsl_terminateCon(this, sslCon);
2818}
2819
2820#if (SHARKSSL_ENABLE_RSA || SHARKSSL_ENABLE_ECDSA)
2821inline U8 SharkSsl::addCertificate(SharkSslCert cert) {
2822 return SharkSsl_addCertificate(this, cert);
2823}
2824#if SHARKSSL_ENABLE_CA_LIST
2825inline U8 SharkSsl::setCAList(SharkSslCAList list) {
2826 return SharkSsl_setCAListEx(this, list, 0);
2827}
2828inline U8 SharkSsl::setCAListEx(SharkSslCAList list, U32 caListLen) {
2829 return SharkSsl_setCAListEx(this, list, caListLen);
2830}
2831#endif /* SHARKSSL_ENABLE_CA_LIST */
2832#endif /* SHARKSSL_ENABLE_RSA || SHARKSSL_ENABLE_ECDSA */
2833
2834#endif /* __cplusplus */
2835
2836
2837#endif
SHARKSSL_API SharkSslECCKey sharkssl_PEM_to_ECCKey(const char *PEMKey, const char *passphrase)
Convert an ECC private or public key in PEM format to the SharkSslECCKey format.
SHARKSSL_API sharkssl_ECDSA_RetVal sharkssl_ECDSA_verify_hash(SharkSslECCKey pubkey, U8 *sig, U16 siglen, const U8 *hash, U8 hashID)
Verify a message using the ECC public key and a hash algorithm.
SHARKSSL_API U16 sharkssl_ECDSA_siglen(SharkSslECCKey privkey)
Returns the maximum length (in bytes) of a DER-encoded ECDSA signature generated with the private key...
SHARKSSL_API sharkssl_ECDSA_RetVal sharkssl_ECDSA_sign_hash(SharkSslECCKey privkey, U8 *sig, U16 *siglen, const U8 *hash, U8 hashID)
Generate the signature using the ECC private key and a hash.
U8 * SharkSslECCKey
SharkSslECCKey is an alias for the SharkSslCert type and is a private/public key converted by sharkss...
Definition: SharkSSL.h:2400
SHARKSSL_API SharkSslRSAKey sharkssl_PEM_to_RSAKey(const char *PEMKey, const char *passphrase)
Convert an RSA private or public key in PEM format to the SharkSslRSAKey format.
SHARKSSL_API sharkssl_RSA_RetVal sharkssl_RSA_PKCS1V1_5_verify_hash(SharkSslRSAKey pubkey, U8 *sig, U16 siglen, const U8 *hash, U8 hashID)
Verify a signature hash using a public RSA key.
SHARKSSL_API SharkSslKey sharkssl_PEM_extractPublicKey(const char *certPEM)
Extract the public key form a certificate in PEM format.
SHARKSSL_API sharkssl_RSA_RetVal sharkssl_RSA_private_encrypt(SharkSslRSAKey privkey, const U8 *in, int len, U8 *out, int padding)
Sign a message digest using the private key.
SHARKSSL_API sharkssl_RSA_RetVal sharkssl_RSA_private_decrypt(SharkSslRSAKey privkey, const U8 *in, int len, U8 *out, int padding)
Decrypt ciphertext using the private key.
SHARKSSL_API sharkssl_RSA_RetVal sharkssl_RSA_public_encrypt(SharkSslRSAKey pubkey, const U8 *in, int len, U8 *out, int padding)
Encrypt data using the public key or private key.
SHARKSSL_API sharkssl_RSA_RetVal sharkssl_RSA_PKCS1V1_5_sign_hash(SharkSslRSAKey privkey, U8 *sig, U16 *siglen, const U8 *hash, U8 hashID)
Sign a hash using a private RSA key.
SHARKSSL_API void SharkSslRSAKey_free(SharkSslRSAKey key)
Release a SharkSslRSAKey allocated by functions sharkssl_PEM_to_RSAKey and sharkssl_PEM_extractPublic...
SHARKSSL_API sharkssl_RSA_RetVal sharkssl_RSA_public_decrypt(SharkSslRSAKey pubkey, const U8 *in, int len, U8 *out, int padding)
Bring back a message digest using the public key or private key.
U8 * SharkSslRSAKey
SharkSslRSAKey is an alias for the SharkSslCert type and is a private/public key converted by sharkss...
Definition: SharkSSL.h:2012
sharkssl_PEM_RetVal
Return values from function sharkssl_PEM.
Definition: SharkSSL.h:1814
SHARKSSL_API sharkssl_PEM_RetVal sharkssl_PEM(const char *certPEM, const char *keyPEM, const char *passphrase, SharkSslCert *sharkSslCert)
Create a SharkSslCert certificate by using a certificate and key in PEM format.
SHARKSSL_API int sharkssl_X25519_sharedSecret(const U8 privateKey[SHARKSSL_X25519_KEY_LEN], const U8 peerPublicKey[SHARKSSL_X25519_KEY_LEN], U8 sharedSecret[SHARKSSL_X25519_KEY_LEN])
Calculate an X25519 shared secret.
SHARKSSL_API int sharkssl_PEM_PBKDF2(U8 *dk, const char *passphrase, const char *salt, U32 saltLen, U32 iterations, U16 dkLen, U8 hashID)
sharkssl_PEM_PBKDF2 (output, passphrase, salt, salt_len, iterations, dkLen, hashID) Derives a key fro...
SHARKSSL_API int sharkssl_X25519_createKeyPair(U8 privateKey[SHARKSSL_X25519_KEY_LEN], U8 publicKey[SHARKSSL_X25519_KEY_LEN])
Create an X25519 private/public key pair.
@ SHARKSSL_PEM_CERT_UNSUPPORTED_TYPE
CERT_UNSUPPORTED_TYPE.
Definition: SharkSSL.h:1858
@ SHARKSSL_PEM_KEY_UNSUPPORTED_ENCRYPTION_TYPE
KEY_UNSUPPORTED_ENCRYPTION_TYPE.
Definition: SharkSSL.h:1849
@ SHARKSSL_PEM_OK
OK.
Definition: SharkSSL.h:1816
@ SHARKSSL_PEM_OK_PUBLIC
OK_PUBLIC.
Definition: SharkSSL.h:1819
@ SHARKSSL_PEM_KEY_PRIVATE_KEY_REQUIRED
A PRIVATE KEY IS REQUIRED.
Definition: SharkSSL.h:1867
@ SHARKSSL_PEM_KEY_UNSUPPORTED_EXPONENT_LENGTH
KEY_UNSUPPORTED_EXPONENT_LENGTH.
Definition: SharkSSL.h:1846
@ SHARKSSL_PEM_KEY_UNSUPPORTED_FORMAT
KEY_UNSUPPORTED_FORMAT.
Definition: SharkSSL.h:1840
@ SHARKSSL_PEM_KEY_UNRECOGNIZED_FORMAT
KEY_UNRECOGNIZED_FORMAT.
Definition: SharkSSL.h:1837
@ SHARKSSL_PEM_KEY_UNSUPPORTED_VERSION
KEY_UNSUPPORTED_VERSION.
Definition: SharkSSL.h:1861
@ SHARKSSL_PEM_KEY_PASSPHRASE_REQUIRED
KEY_PASSPHRASE_REQUIRED.
Definition: SharkSSL.h:1834
@ SHARKSSL_PEM_KEY_WRONG_LENGTH
KEY_WRONG_LENGTH.
Definition: SharkSSL.h:1831
@ SHARKSSL_PEM_KEY_PARSE_ERROR
KEY_PARSE_ERROR.
Definition: SharkSSL.h:1825
@ SHARKSSL_PEM_CERT_UNRECOGNIZED_FORMAT
CERT_UNRECOGNIZED_FORMAT.
Definition: SharkSSL.h:1855
@ SHARKSSL_PEM_KEY_REQUIRED
KEY_REQUIRED.
Definition: SharkSSL.h:1864
@ SHARKSSL_PEM_ALLOCATION_ERROR
ALLOCATION_ERROR.
Definition: SharkSSL.h:1822
@ SHARKSSL_PEM_KEY_WRONG_IV
KEY_WRONG_IV.
Definition: SharkSSL.h:1828
@ SHARKSSL_PEM_INTERNAL_ERROR
INTERNAL ERROR.
Definition: SharkSSL.h:1870
@ SHARKSSL_PEM_KEY_CERT_MISMATCH
KEY_CERT_MISMATCH.
Definition: SharkSSL.h:1852
@ SHARKSSL_PEM_KEY_UNSUPPORTED_MODULUS_LENGTH
KEY_UNSUPPORTED_MODULUS_LENGTH.
Definition: SharkSSL.h:1843
U8 SharkSslCon_favorRSA(SharkSslCon *o, U8 flag)
Configures TLS 1.2 cipher-suite selection to favor RSA-authenticated suites when both RSA and ECDSA c...
SHARKSSL_API U16 SharkSsl_getCacheSize(SharkSsl *o)
Returns the SharkSsl session cache size.
SharkSslCon * SharkSsl_createCon(SharkSsl *o)
Create a SharkSslCon object.
SHARKSSL_API U8 SharkSslCon_setSNI(SharkSslCon *o, const char *name, U16 length)
set Server Name Indication for TLS client connections
SHARKSSL_API U8 SharkSslCon_trustedCA(SharkSslCon *o)
Returns TRUE if the certificate is valid and is signed with a root certificate trusted by SharkSSL.
SHARKSSL_API U8 SharkSslCon_setCertificateAuthoritiesEx(SharkSslCon *o, const void *caList, U32 caListLen)
Configure the TLS 1.3 Certificate Authorities extension specified in RFC 9846, Section 4....
SHARKSSL_API void SharkSsl_destructor(SharkSsl *o)
Close the SharkSsl object.
SHARKSSL_API U8 SharkSslCon_clearCiphersuiteSelection(SharkSslCon *o)
Clears the selection, thus enabling all ciphers.
SHARKSSL_API U8 SharkSslCon_getProtocol(SharkSslCon *o)
Returns the active session's protocol version.
SHARKSSL_API U8 SharkSslCon_setALPNProtocols(SharkSslCon *o, const char *protList)
This function is used by client solutions to specify a list of application layer protocols according ...
U8 SharkSslCon_certificateRequested(SharkSslCon *o)
Returns TRUE if the server requested a certificate from the client to verify that the client's identi...
SHARKSSL_API U8 SharkSsl_addCertificate(SharkSsl *o, SharkSslCert cert)
Add a certificate to the SharkSsl object.
SHARKSSL_API U8 SharkSslCon_requestClientCertEx(SharkSslCon *o, const void *caList, U32 caListLen)
Request client-certificate authentication.
SHARKSSL_API U8 SharkSslCon_selectCiphersuite(SharkSslCon *o, U16 cipherSuite)
This function enables you to limit the number of ciphers at runtime.
void SharkSsl_terminateCon(const SharkSsl *o, SharkSslCon *con)
Terminate a SharkSslCon object created by function SharkSsl_createCon.
SHARKSSL_API SharkSslCertInfo * SharkSslCon_getCertInfo(SharkSslCon *o)
Returns the peer's certificate if the handshaking has completed.
SHARKSSL_API U8 SharkSsl_setCAListEx(SharkSsl *o, SharkSslCAList caList, U32 caListLen)
Set a Certificate Authority (CA) list so the SharkSSL object can perform certificate validation on th...
SHARKSSL_API U8 SharkSslCon_renegotiate(SharkSslCon *o)
This function enables you to renegotiate an already established SSL/TLS connection.
SHARKSSL_API U16 SharkSslCon_getCiphersuite(SharkSslCon *o)
Returns the active session's chiper suite.
SHARKSSL_API const char * SharkSslCon_getALPNProtocol(SharkSslCon *o)
This function is used by client solutions to return the application layer protocol selected by the se...
SHARKSSL_API void SharkSsl_constructor(SharkSsl *o, SharkSsl_Role role, U16 cacheSize, U16 inBufStartSize, U16 outBufSize)
A SharkSsl object is the coordinator for managing SharkSslCon objects.
SHARKSSL_API int SharkSslECCKey_createEx(SharkSslECCKey *privKey, U16 curveID, void *rngHandle, sharkssl_rngfunc rngFunc)
Creates an ECC key using the SharkSSL library.
SHARKSSL_API int SharkSslRSAKey_create(SharkSslRSAKey *privKey, U16 keyLength)
RSA key creation.
SHARKSSL_API U16 SharkSslKey_vectSize_keyInfo(const SharkSslKey key, U8 *keyType, U8 *isKeyPrivate, U8 **d1, U16 *d1Len, U8 **d2, U16 *d2Len)
Returns the private or public key's "vector size" in bytes.
SHARKSSL_API int SharkSslASN1Create_CSR(struct SharkSslASN1Create *o, SharkSslKey privKey, U8 hashID, struct SharkSslCertDN *certDN, const char *SAN, struct SharkSslBitExtReq *keyUsage, struct SharkSslBitExtReq *nsCertType)
CSR creation (all parameters are input parameters)
SHARKSSL_API void SharkSslCertStore_constructor(SharkSslCertStore *o)
Initialize a SharkSslCertStore object.
SHARKSSL_API int SharkSslASN1Create_key(struct SharkSslASN1Create *o, const SharkSslKey key)
CSR signing policy and SharkSslCert_signCSR are declared in SharkSslCSR.h.
SHARKSSL_API U16 SharkSslRSAKey_size(SharkSslRSAKey key)
Returns the private or public key's modulus size in bytes.
SHARKSSL_API void SharkSslECCKey_free(SharkSslECCKey key)
Release a SharkSslECCKey allocated by functions sharkssl_PEM_to_ECCKey or SharkSslECCKey_create.
SHARKSSL_API U16 SharkSslCertStore_add(SharkSslCertStore *o, const char *cert, U32 certlen)
Add one or more certificates to the CA store.
SHARKSSL_API U8 SharkSslCertStore_assemble(SharkSslCertStore *o, SharkSslCAList *outList)
Assemble all certificates added by calling SharkSslCertStore_add.
struct SharkSslCertStore SharkSslCertStore
SharkSslCertStore is a container object used when assembling a SharkSslCAList.
SHARKSSL_API void SharkSslCertStore_destructor(SharkSslCertStore *o)
Cleanup all memory used by the SharkSslCAList object.
SHARKSSL_API U16 SharkSslCert_len(SharkSslCert cert)
Get certificate length.
SHARKSSL_API U16 SharkSslKey_vectSize(const SharkSslKey key)
Returns the private or public key's "vector size" in bytes.
SHARKSSL_API U8 * SharkSslRSAKey_getPublic(SharkSslRSAKey privKey)
RSA public key extraction from a private key.
struct SharkSslCertInfo SharkSslCertInfo
The peer's certificate information returned by SharkSslCon_getCertInfo.
struct SharkSslCertDN SharkSslCertDN
Certificate KeyUsage and ExtendedKeyUsage flags and relative pseudofunctions.
U8 * SharkSslCon_getEncData(SharkSslCon *o)
This function is used in conjunction with state SharkSslCon_Encrypted returned by function SharkSslCo...
U16 SharkSslCon_getHandshakeDataLen(SharkSslCon *o)
This function is used in conjunction with state SharkSslCon_Handshake returned by function SharkSslCo...
U16 SharkSslCon_getEncDataLen(SharkSslCon *o)
This function is used in conjunction with state SharkSslCon_Encrypted returned by function SharkSslCo...
U16 SharkSslCon_getBufLen(SharkSslCon *o)
Returns the number of bytes currently available at the pointer returned by SharkSslCon_getBuf.
SHARKSSL_API U8 SharkSslCon_keyUpdate(SharkSslCon *o, U8 requestUpdate)
Creates a TLS 1.3 KeyUpdate message and advances the local write keys.
SharkSslCon_RetVal
The SharkSslCon_decrypt and SharkSslCon_encrypt return values.
Definition: SharkSSL.h:562
SharkSslCon_RetVal SharkSslCon_decrypt(SharkSslCon *o, U16 readLen)
Decrypt the received data copied into the SharkSslCon receive buffer (the buffer returned by SharkSsl...
U16 SharkSslCon_getEncBufSize(SharkSslCon *o)
Returns the length of the buffer returned by SharkSslCon_getEncBufPtr.
U8 SharkSslCon_encryptMore(SharkSslCon *o)
This function is used in conjunction with state SharkSslCon_Encrypted returned by function SharkSslCo...
U8 SharkSslCon_decryptMore(SharkSslCon *o)
This function is used in conjunction with state SharkSslCon_Decrypted returned by function SharkSslCo...
U8 * SharkSslCon_getBuf(SharkSslCon *o)
Returns a pointer to the SharkSslCon input/receive buffer.
SHARKSSL_API U16 SharkSslCon_getDecData(SharkSslCon *o, U8 **bufPtr)
Get a pointer to the decoded data.
U8 SharkSslCon_getAlertLevel(SharkSslCon *o)
This function is used in conjunction with state SharkSslCon_AlertSend returned by function SharkSslCo...
U16 SharkSslCon_copyDecData(SharkSslCon *o, U8 *buf, U16 maxLen)
Copy decoded data to 'buf'.
U8 * SharkSslCon_getEncBufPtr(SharkSslCon *o)
This function is used in conjunction with SharkSslCon_encrypt when using the zero copy send API.
SHARKSSL_API int SharkSslCon_proactiveKeyUpdate(SharkSslCon *o)
Apply the automatic AES-GCM KeyUpdate policy while the output buffer is free.
U16 SharkSslCon_setHandshakeDataSent(SharkSslCon *o, U16 length)
This function is used in conjunction with SharkSslCon_getHandshakeData.
U8 SharkSslCon_getAlertDescription(SharkSslCon *o)
This function is used in conjunction with state SharkSslCon_AlertSend returned by function SharkSslCo...
U8 SharkSslCon_isHandshakeComplete(SharkSslCon *o)
Returns the following values:
U8 * SharkSslCon_getHandshakeData(SharkSslCon *o)
This function is used in conjunction with state SharkSslCon_Handshake returned by function SharkSslCo...
SharkSslCon_RetVal SharkSslCon_encrypt(SharkSslCon *o, U8 *buf, U16 maxLen)
Encrypt the data provided by parameter 'buf' or encrypt data in the SharkSslCon send buffer.
SHARKSSL_API SharkSslCon_RetVal SharkSslCon_close(SharkSslCon *o)
Generates a close_notify alert and closes the local write direction.
@ SharkSslCon_Encrypted
SharkSSL has successfully decrypted a chunk of data.
Definition: SharkSSL.h:642
@ SharkSslCon_Decrypted
Returned when a block of received data has been successfully decrypted.
Definition: SharkSSL.h:580
@ SharkSslCon_AlertSend
Returned when an SSL/TLS alert message must be sent to the peer side.
Definition: SharkSSL.h:621
@ SharkSslCon_AllocationError
The memory pool is too small.
Definition: SharkSSL.h:569
@ SharkSslCon_Error
Indicates general errors, including configuration errors.
Definition: SharkSSL.h:565
@ SharkSslCon_CertificateError
Unrecognized format of a provided certificate.
Definition: SharkSSL.h:652
@ SharkSslCon_AlertRecv
SharkSSL received an SSL/TLS alert message from the peer, which means that the peer either failed to ...
Definition: SharkSSL.h:630
@ SharkSslCon_HandshakeNotComplete
An error condition returned by function SharkSslCon_encrypt if the SSL handshake is not completed.
Definition: SharkSSL.h:648
@ SharkSslCon_Handshake
Returned when an SSL/TLS handshake message has been received or is to be sent.
Definition: SharkSSL.h:594
@ SharkSslCon_NeedMoreData
Returned when SharkSSL holds an incomplete SSL/TLS record or when the connection is initially establi...
Definition: SharkSSL.h:607
U32 baGetUnixTime(void)
Platform dependent function returning seconds since Jan 1 1970.
struct SharkSsl SharkSsl
A SharkSsl object is the coordinator for managing SharkSslCon objects (See SharkSsl_constructor for d...
const U8 * SharkSslCert
The SharkSSL Certificate is in a binary format optimized for speed and size.
Definition: SharkSSL.h:326
const U8 * SharkSslCAList
The SharkSSL Certificate Authority (CA) List is in a binary format optimized for speed and size.
Definition: SharkSSL.h:448
struct SharkSslCon SharkSslCon
SharkSslCon is an opaque handle returned by function SharkSsl_createCon.
Definition: SharkSSL.h:496
SharkSsl_Role
Select one of client or server mode when creating a SharkSsl object.
Definition: SharkSSL.h:301
sharkssl_ECDSA_RetVal
Return values from functions sharkssl_ECDSA_sign_hash, sharkssl_ECDSA_verify_hash.
Definition: SharkSSL.h:2594
sharkssl_RSA_RetVal
Return values from functions sharkssl_RSA_public_encrypt, sharkssl_RSA_private_decrypt,...
Definition: SharkSSL.h:1956
U8 * SharkSslKey
The SharkSslKey type.
Definition: SharkSSL.h:318
@ SharkSsl_Unspecified
Definition: SharkSSL.h:302
@ SharkSsl_Client
Definition: SharkSSL.h:304
@ SharkSsl_Server
Definition: SharkSSL.h:303
@ SHARKSSL_ECDSA_ALLOCATION_ERROR
ALLOCATION_ERROR.
Definition: SharkSSL.h:2599
@ SHARKSSL_ECDSA_WRONG_KEY_FORMAT
WRONG_KEY_FORMAT.
Definition: SharkSSL.h:2608
@ SHARKSSL_ECDSA_WRONG_SIGNATURE
WRONG SIGNATURE.
Definition: SharkSSL.h:2623
@ SHARKSSL_ECDSA_WRONG_PARAMETERS
WRONG_PARAMETERS.
Definition: SharkSSL.h:2605
@ SHARKSSL_ECDSA_OK
OK.
Definition: SharkSSL.h:2596
@ SHARKSSL_ECDSA_VERIFICATION_FAIL
VERIFICATION_FAIL.
Definition: SharkSSL.h:2620
@ SHARKSSL_ECDSA_INTERNAL_ERROR
INTERNAL_ERROR.
Definition: SharkSSL.h:2602
@ SHARKSSL_ECDSA_KEY_NOT_PRIVATE
KEY_IS_NOT_PRIVATE.
Definition: SharkSSL.h:2611
@ SHARKSSL_ECDSA_KEY_NOT_PUBLIC
KEY_IS_NOT_PUBLIC.
Definition: SharkSSL.h:2614
@ SHARKSSL_ECDSA_SIGLEN_TOO_SMALL
SIGLEN_TOO_SMALL.
Definition: SharkSSL.h:2617
@ SHARKSSL_RSA_INPUT_DATA_LENGTH_TOO_BIG
INPUT_DATA_LENGTH_TOO_BIG.
Definition: SharkSSL.h:1976
@ SHARKSSL_RSA_WRONG_LABEL_LENGTH
WRONG_LABEL_LENGTH.
Definition: SharkSSL.h:1994
@ SHARKSSL_RSA_OK
OK.
Definition: SharkSSL.h:1958
@ SHARKSSL_RSA_INTERNAL_ERROR
INTERNAL_ERROR.
Definition: SharkSSL.h:1964
@ SHARKSSL_RSA_WRONG_PARAMETERS
WRONG_PARAMETERS.
Definition: SharkSSL.h:1967
@ SHARKSSL_RSA_WRONG_SIGNATURE
WRONG SIGNATURE.
Definition: SharkSSL.h:1991
@ SHARKSSL_RSA_ALLOCATION_ERROR
ALLOCATION_ERROR.
Definition: SharkSSL.h:1961
@ SHARKSSL_RSA_WRONG_KEY_FORMAT
WRONG_KEY_FORMAT.
Definition: SharkSSL.h:1970
@ SHARKSSL_RSA_PKCS1_PADDING_ERROR
PKCS1_PADDING_ERROR.
Definition: SharkSSL.h:1982
@ SHARKSSL_RSA_INPUT_DATA_LENGTH_AND_KEY_LENGTH_MISMATCH
INPUT_DATA_LENGTH_AND_KEY_LENGTH_MISMATCH.
Definition: SharkSSL.h:1979
@ SHARKSSL_RSA_WRONG_KEY_LENGTH
WRONG_KEY_LENGTH.
Definition: SharkSSL.h:1973
@ SHARKSSL_RSA_VERIFICATION_FAIL
VERIFICATION FAIL.
Definition: SharkSSL.h:1988
@ SHARKSSL_RSA_KEY_NOT_PRIVATE
KEY_IS_NOT_PRIVATE.
Definition: SharkSSL.h:1985
SHARKSSL_API SharkSslSession * SharkSslCon_acquireSession(SharkSslCon *o)
Request a SharkSslSession object from the client's session pool.
SHARKSSL_API U8 SharkSslCon_releaseSession(SharkSslCon *o)
experimental
struct SharkSslSession SharkSslSession
SharkSslSession is an opaque handle returned by function SharkSslCon_acquireSession.
Definition: SharkSSL.h:274
SHARKSSL_API U8 SharkSslCon_resumeSession(SharkSslCon *o, SharkSslSession *s)
Resume an existing session.
SHARKSSL_API U8 SharkSslCon_isResumed(SharkSslCon *o)
Returns 1 if the current session is a resumed one.
SHARKSSL_API U32 SharkSslSession_getLatestAccessTime(SharkSslSession *o)
Returns the last time the session was accessed.
SHARKSSL_API U8 SharkSslSession_release(SharkSslSession *o, SharkSsl *s)
Release a session created by function SharkSslCon_acquireSession.
Opaque object used when creating ASN.1 encoded data.
Definition: SharkSslASN1.h:235
https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/nss_tech_notes/nss_tech_note3 http://to...
Definition: SharkSslASN1.h:246
Certificate KeyUsage and ExtendedKeyUsage flags and relative pseudofunctions.
Definition: SharkSSL.h:739
U8 unitLen
length in bytes of the field "organization"
Definition: SharkSSL.h:755
U8 provinceLen
length in bytes of the field "country"
Definition: SharkSSL.h:752
const U8 * province
State or Province.
Definition: SharkSSL.h:741
U8 localityLen
length in bytes of the field "province"
Definition: SharkSSL.h:753
const U8 * unit
Organizational Unit (OU: department or organization unit)
Definition: SharkSSL.h:744
const U8 * organization
Organization Name (company or department)
Definition: SharkSSL.h:743
const U8 * commonName
Common Name is the Host + Domain Name (example: www.mycompany.com, where www is host and mycompany....
Definition: SharkSSL.h:748
const U8 * countryName
ISO3166 country code.
Definition: SharkSSL.h:740
U8 organizationLen
length in bytes of the field "locality"
Definition: SharkSSL.h:754
U8 commonNameLen
length in bytes of the field "unit"
Definition: SharkSSL.h:756
const U8 * locality
The city or town name.
Definition: SharkSSL.h:742
U8 emailAddressLen
length in bytes of the field "common name"
Definition: SharkSSL.h:757
The peer's certificate information returned by SharkSslCon_getCertInfo.
Definition: SharkSSL.h:797
U8 timeFromLen
Length of 'timeFrom'.
Definition: SharkSSL.h:853
U8 timeToLen
Length of 'timeTo'.
Definition: SharkSSL.h:856
U16 snLen
Length of 'sn' (serial number)
Definition: SharkSSL.h:799
U8 * timeTo
Certificate expiration date (in Time format: [YY]YYMMDDHHMMSSZ) UTCTime: 2-digit year; GeneralizedTim...
Definition: SharkSSL.h:824
U8 CAflag
The Certificate Authority flag (CA) is set to one if the certificate is a CA i.e.
Definition: SharkSSL.h:809
SharkSslCertDN issuer
The entity who has signed and issued the certificate (RFC 2459 4.1.2.4)
Definition: SharkSSL.h:830
SharkSslCertDN subject
The entity associated with the public key (RFC 2459 4.1.2.6).
Definition: SharkSSL.h:836
U8 * sn
Binary serial number.
Definition: SharkSSL.h:813
U8 * timeFrom
Certificate is valid from date (in Time format: [YY]YYMMDDHHMMSSZ) UTCTime: 2-digit year; Generalized...
Definition: SharkSSL.h:818
U8 * subjectAltNamesPtr
Subject Alternative Names subjectAltNamesPtr is a pointer to an ASN1 sequence, whose length is subjec...
Definition: SharkSSL.h:849
struct SharkSslCertInfo * parent
Pointer to parent node when the SharkSslCertInfo object is part of a certificate chain.
Definition: SharkSSL.h:887
U8 version
Certificate version is offset at 0 so add +1 for actual version number.
Definition: SharkSSL.h:804
SharkSslCertStore is a container object used when assembling a SharkSslCAList.
Definition: SharkSSL.h:2739
A SharkSsl object is the coordinator for managing SharkSslCon objects (See SharkSsl_constructor for d...
Definition: SharkSSL.h:512