SSL services: Difference between revisions
| No edit summary | No edit summary | ||
| Line 68: | Line 68: | ||
| == SetDebugOption == | == SetDebugOption == | ||
| Takes an input u32  | Takes an input u32 [[#DebugOptionType]] and a type-0x5 input buffer, no output. | ||
| The input u32 value must be 0, and the buffer addr/size must not be 0. | The input u32 value must be 0, and the buffer addr/size must not be 0. | ||
| Line 77: | Line 77: | ||
| == GetDebugOption == | == GetDebugOption == | ||
| Takes an input u32  | Takes an input u32 [[#DebugOptionType]] and a type-0x6 output buffer. | ||
| Same as [[#SetDebugOption]] except this copies state to the buffer instead. | Same as [[#SetDebugOption]] except this copies state to the buffer instead. | ||
| Line 314: | Line 314: | ||
| = SslVersion = | = SslVersion = | ||
| This is  | This is "nn::ssl::sf::SslVersion" or "nn::ssl::Context::SslVersion". | ||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Value | |||
| ! Description | |||
| |- | |||
| | 0x1 || Auto | |||
| |- | |||
| | 0x8 || TlsV10 | |||
| |- | |||
| | 0x10 || TlsV11 | |||
| |- | |||
| | 0x20 || TlsV12 | |||
| |} | |||
| = DebugOptionType = | |||
| This is "nn::ssl::sf::DebugOptionType" or "nn::ssl::DebugOption". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Value | |||
| ! Description | |||
| |- | |||
| | 0 || AllowDisableVerifyOption | |||
| |} | |||
| = FlushSessionCacheOptionType = | = FlushSessionCacheOptionType = | ||
| This is  | This is "nn::ssl::sf::FlushSessionCacheOptionType" or "nn::ssl::FlushSessionCacheOptionType". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 324: | Line 349: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| | 0 ||   | | 0 || SingleHost | ||
| |- | |- | ||
| | 1 ||   | | 1 || AllHosts | ||
| |} | |} | ||
| = BuiltInCertificateInfo = | = BuiltInCertificateInfo = | ||
| This is "nn::ssl::BuiltInManager::BuiltInCertificateInfo". | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| |- | |- | ||
| Line 342: | Line 369: | ||
| | 0x4 | | 0x4 | ||
| | 0x4 | | 0x4 | ||
| | [[# | | [[#TrustedCertStatus]] | ||
| |- | |- | ||
| | 0x8 | | 0x8 | ||
| | 0x8 | | 0x8 | ||
| |  | | CertificateSize | ||
| |- | |- | ||
| | 0x10 | | 0x10 | ||
| | 0x8 | | 0x8 | ||
| |  | | CertificateDataOffset | ||
| |} | |} | ||
| This is the struct returned by [[#GetCertificates]].  | This is the struct returned by [[#GetCertificates]]. It is internally converted from "nn::ssl::detail::BuiltinDataInfo" by copying "nn::ssl::detail::BuiltinDataInfo::BuiltinDataStatus" into [[#TrustedCertStatus]] and official software then further converts this to "nn::ssl::BuiltInManager::BuiltInCertificateInfo" by transforming "CertificateDataOffset" into an actual pointer. | ||
| = TrustedCertStatus = | |||
| This is "nn::ssl::TrustedCertStatus". | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| |- | |- | ||
| Line 363: | Line 392: | ||
| | -1 | | -1 | ||
| | Invalid | | Invalid | ||
| |- | |||
| | 0 | |||
| | Removed | |||
| |- | |- | ||
| | 1 | | 1 | ||
| |  | | EnabledTrusted | ||
| |- | |||
| | 2 | |||
| | EnabledNotTrusted | |||
| |- | |||
| | 3 | |||
| | Revoked | |||
| |} | |} | ||
| This is  | = CaCertificateId = | ||
| This is "nn::ssl::CaCertificateId". | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| |- | |- | ||
| Line 376: | Line 414: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| | 1 ||  | | -1 || All | ||
| |- | |||
| | 1 || NintendoCAG3 | |||
| |- | |||
| | 2 || NintendoClass2CAG3 | |||
| |- | |||
| | 1000 || AmazonRootCA1 | |||
| |- | |||
| | 1001 || StarfieldServicesRootCertificateAuthorityG2 | |||
| |- | |||
| | 1002 || AddTrustExternalCARoot | |||
| |- | |||
| | 1003 || COMODOCertificationAuthority | |||
| |- | |||
| | 1004 || UTNDATACorpSGC | |||
| |- | |||
| | 1005 || UTNUSERFirstHardware | |||
| |- | |||
| | 1006 || BaltimoreCyberTrustRoot | |||
| |- | |||
| | 1007 || CybertrustGlobalRoot | |||
| |- | |||
| | 1008 || VerizonGlobalRootCA | |||
| |- | |||
| | 1009 || DigiCertAssuredIDRootCA | |||
| |- | |||
| | 1010 || DigiCertAssuredIDRootG2 | |||
| |- | |||
| | 1011 || DigiCertGlobalRootCA | |||
| |- | |||
| | 1012 || DigiCertGlobalRootG2 | |||
| |- | |||
| | 1013 || DigiCertHighAssuranceEVRootCA | |||
| |- | |||
| | 1014 || EntrustnetCertificationAuthority2048 | |||
| |- | |||
| | 1015 || EntrustRootCertificationAuthority | |||
| |- | |||
| | 1016 || EntrustRootCertificationAuthorityG2 | |||
| |- | |||
| | 1017 || GeoTrustGlobalCA2 | |||
| |- | |||
| | 1018 || GeoTrustGlobalCA | |||
| |- | |||
| | 1019 || GeoTrustPrimaryCertificationAuthorityG3 | |||
| |- | |||
| | 1020 || GeoTrustPrimaryCertificationAuthority | |||
| |- | |||
| | 1021 || GlobalSignRootCA | |||
| |- | |||
| | 1022 || GlobalSignRootCAR2 | |||
| |- | |||
| | 1023 || GlobalSignRootCAR3 | |||
| |- | |||
| | 1024 || GoDaddyClass2CertificationAuthority | |||
| |- | |||
| | 1025 || GoDaddyRootCertificateAuthorityG2 | |||
| |- | |||
| | 1026 || StarfieldClass2CertificationAuthority | |||
| |- | |||
| | 1027 || StarfieldRootCertificateAuthorityG2 | |||
| |- | |||
| | 1028 || thawtePrimaryRootCAG3 | |||
| |- | |||
| | 1029 || thawtePrimaryRootCA | |||
| |- | |||
| | 1030 || VeriSignClass3PublicPrimaryCertificationAuthorityG3 | |||
| |- | |- | ||
| |  | | 1031 || VeriSignClass3PublicPrimaryCertificationAuthorityG5 | ||
| |- | |||
| | 1032 || VeriSignUniversalRootCertificationAuthority | |||
| |- | |||
| | 1033 || DSTRootCAX3 | |||
| |} | |} | ||
| = InternalPki = | = InternalPki = | ||
| This is  | This is "nn::ssl::sf::InternalPki" or "nn::ssl::Context::InternalPki". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 393: | Line 497: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| | 1 ||   | | 0 || None | ||
| |- | |||
| | 1 || DeviceClientCertDefault | |||
| |} | |} | ||
| An error is thrown by [[#RegisterInternalPki]] when the input value does not match "DeviceClientCertDefault". | |||
| = ContextOption = | = ContextOption = | ||
| This is  | This is "nn::ssl::sf::ContextOption" or "nn::ssl::Context::ContextOption". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 404: | Line 512: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| | 1 ||   | | 0 || None | ||
| |- | |||
| | 1 || CrlImportDateCheckEnable | |||
| |} | |} | ||
| = CertificateFormat = | = CertificateFormat = | ||
| This is  | This is "nn::ssl::sf::CertificateFormat" or "nn::ssl::CertificateFormat". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 415: | Line 525: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| | 1 ||   | | 1 || Pem | ||
| |- | |- | ||
| | 2 ||   | | 2 || Der | ||
| |} | |} | ||
| = VerifyOption = | = VerifyOption = | ||
| This is  | This is "nn::ssl::sf::VerifyOption". This is a bitmask. | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 430: | Line 538: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| | 0 ||   | | 0 || PeerCa | ||
| |- | |- | ||
| | 1 ||   | | 1 || HostName | ||
| |- | |- | ||
| | 2 ||   | | 2 || DateCheck | ||
| |- | |- | ||
| | 3 ||   | | 3 || EvCertPartial | ||
| |- | |- | ||
| | 4 || [6.0.0+] | | 4 || [6.0.0+] EvPolicyOid | ||
| |- | |- | ||
| | 5 || [6.0.0+] | | 5 || [6.0.0+] EvCertFingerprint | ||
| |} | |} | ||
| Originally ssl-sysmodule ([[#SetVerifyOption]]) just wrote the input field to state. With [5.0.0+] there's now validation for the input, with the value written to state masked with {allowed bitmask}. When [[#SetInterfaceVersion|InterfaceVersion]] is >=0x2, the low 2-bits of VerifyOption must be set, unless {state flag for [[#OptionType]] value 2} is set or [9.0.0+] {bool [[#SetDebugOption|DebugOption]] state flag} is set, otherwise an error is thrown. [6.0.0+]: Following that, if VerifyOption bit4 is set, then VerifyOption & 0x15 must match 0x15 otherwise an error is thrown. | |||
| = IoMode = | = IoMode = | ||
| This is  | This is "nn::ssl::sf::IoMode" or "nn::ssl::Connection::IoMode". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 451: | Line 561: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| | 1 ||   | | 1 || Blocking | ||
| |- | |- | ||
| | 2 ||   | | 2 || NonBlocking | ||
| |} | |} | ||
| = PollEvent = | = PollEvent = | ||
| This is  | This is "nn::ssl::sf::PollEvent" or "nn::ssl::Connection::PollEvent". This is a bitmask. | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 464: | Line 574: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| | 0 ||   | | 0 || Read | ||
| |- | |- | ||
| | 1 ||   | | 1 || Write | ||
| |- | |- | ||
| | 2 ||   | | 2 || Except | ||
| |} | |} | ||
| = SessionCacheMode = | = SessionCacheMode = | ||
| This is  | This is "nn::ssl::sf::SessionCacheMode" or "nn::ssl::Connection::SessionCacheMode". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 479: | Line 589: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| | 0 ||   | | 0 || None | ||
| |- | |- | ||
| | 1 ||   | | 1 || SessionId | ||
| |- | |- | ||
| | 2 ||   | | 2 || SessionTicket | ||
| |} | |} | ||
| = RenegotiationMode = | = RenegotiationMode = | ||
| This is  | This is "nn::ssl::sf::RenegotiationMode" or "nn::ssl::Connection::RenegotiationMode". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 494: | Line 604: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| | 0 ||   | | 0 || None | ||
| |- | |- | ||
| | 1 ||   | | 1 || Secure | ||
| |} | |} | ||
| = OptionType = | = OptionType = | ||
| This is  | This is "nn::ssl::sf::OptionType" or "nn::ssl::Connection::OptionType". | ||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Value | |||
| ! Description | |||
| |- | |||
| | 0 || DoNotCloseSocket | |||
| |- | |||
| | 1 || [3.0.0+] GetServerCertChain | |||
| |- | |||
| | 2 || [5.0.0+] SkipDefaultVerify | |||
| |- | |||
| | 3 || [9.0.0+] EnableAlpn | |||
| |} | |||
| This corresponds to bool flags. | This corresponds to bool flags. | ||
| "SkipDefaultVerify" is checked by [[#VerifyOption|SetVerifyOption]] and "EnableAlpn" is only available with [[#SetOption_2|SetOption]]. | |||
| = AlpnProtoState = | |||
| This is "nn::ssl::sf::AlpnProtoState" or "nn::ssl::Connection::AlpnProtoState". | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 509: | Line 638: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| | 0 ||   | | 0 || NoSupport | ||
| |- | |- | ||
| | 1 ||  | | 1 || Negotiated | ||
| |- | |- | ||
| | 2 ||  | | 2 || NoOverlap | ||
| |- | |- | ||
| | 3 ||  | | 3 || Selected | ||
| |- | |||
| | 4 || EarlyValue | |||
| |} | |} | ||
| = CipherInfo = | = CipherInfo = | ||
| Line 544: | Line 672: | ||
| These have the following structure: | These have the following structure: | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| |- | |- | ||
| Line 567: | Line 694: | ||
| | 0x0 | | 0x0 | ||
| | 0x4 | | 0x4 | ||
| |  | | Id | ||
| |- | |- | ||
| | 0x4 | | 0x4 | ||
Revision as of 18:43, 13 April 2020
ssl
This is "nn::ssl::sf::ISslService". sdknso uses SessionManager with this, where the additional session-count is user-specified (default is 0x2). An error is thrown when the input value is less than 1 or >4.
| Cmd | Name | 
|---|---|
| 0 | #CreateContext | 
| 1 | #GetContextCount | 
| 2 | #GetCertificates | 
| 3 | #GetCertificateBufSize | 
| 4 | [3.0.0+] #DebugIoctl | 
| 5 | [3.0.0+] #SetInterfaceVersion | 
| 6 | [5.0.0+] #FlushSessionCache | 
| 7 | [6.0.0+] #SetDebugOption | 
| 8 | [6.0.0+] #GetDebugOption | 
CreateContext
Takes a PID, an input u32 #SslVersion, an input u64 pid_placeholder, and returns an output #ISslContext.
GetContextCount
No input, returns an output u32.
This is not exposed by sdknso.
GetCertificates
Takes a type-0x6 output buffer and a type-0x5 input buffer containing an array of #CaCertificateId.
[3.0.0+] This now returns an output u32 for actual total output entries.
The output buffer starts with an array of #BuiltInCertificateInfo, with the DER cert data following afterwards.
GetCertificateBufSize
Takes a type-0x5 input buffer containing an array of #CaCertificateId, returns an output u32 for the size to use with #GetCertificates.
DebugIoctl
Stubbed on retail, just returns an error.
SetInterfaceVersion
Takes an input u32 version, no output.
Used by user-processes during service init.
| Value | SystemVersion | 
|---|---|
| 0x1 | [3.0.0+] | 
| 0x2 | [5.0.0+] | 
| 0x3 | [6.0.0+] | 
FlushSessionCache
Takes a type-0x5 input buffer, an input u32 #FlushSessionCacheOptionType, returns an output u32.
The input buffer contains a NUL-terminated string, which is only used when the type is value 0. For type 1, an empty buffer is passed (addr=NULL/size=0).
SetDebugOption
Takes an input u32 #DebugOptionType and a type-0x5 input buffer, no output.
The input u32 value must be 0, and the buffer addr/size must not be 0.
The u8 at buf+0 is copied to state.
The nn::ssl::SetDebugOption func in sdknso just verifies the input and that the service is initialized, without actually using the cmd.
GetDebugOption
Takes an input u32 #DebugOptionType and a type-0x6 output buffer.
Same as #SetDebugOption except this copies state to the buffer instead.
ISslContext
This is "nn::ssl::sf::ISslContext".
| Cmd | Name | 
|---|---|
| 0 | #SetOption | 
| 1 | #GetOption | 
| 2 | #CreateConnection | 
| 3 | #GetConnectionCount | 
| 4 | #ImportServerPki | 
| 5 | #ImportClientPki | 
| 6 | #RemoveServerPki | 
| 7 | #RemoveClientPki | 
| 8 | #RegisterInternalPki | 
| 9 | #AddPolicyOid | 
| 10 | [3.0.0+] #ImportCrl | 
| 11 | [3.0.0+] #RemoveCrl | 
SetOption
Takes an input #ContextOption and an input s32, no output.
With #ContextOption value 1, the s32 has to be 0 or 1 (state field is set to the s32 value).
Prior to 4.x this is stubbed.
GetOption
Takes an input #ContextOption, returns an output s32.
Prior to 4.x this is stubbed.
CreateConnection
No input, returns an #ISslConnection.
GetConnectionCount
No input, returns an output u32.
This is not exposed by sdknso.
ImportServerPki
Takes a type-0x5 input buffer and a #CertificateFormat, returns an output u64.
ImportClientPki
Takes two type-0x5 input buffers, returns an output u64.
RemoveServerPki
Takes an input u64, no output.
RemoveClientPki
Takes an input u64, no output.
RegisterInternalPki
Takes an input #InternalPki, returns an output u64.
AddPolicyOid
Takes a type-0x5 input buffer, no output.
The buffer contains a string. The string length must not match the buffer size, and the string length must be <=0xFE.
ImportCrl
Takes a type-0x5 input buffer, returns an output u64.
RemoveCrl
Takes an input u64, no output.
ISslConnection
This is "nn::ssl::sf::ISslConnection".
| Cmd | Name | 
|---|---|
| 0 | #SetSocketDescriptor | 
| 1 | #SetHostName | 
| 2 | #SetVerifyOption | 
| 3 | #SetIoMode | 
| 4 | #GetSocketDescriptor | 
| 5 | #GetHostName | 
| 6 | #GetVerifyOption | 
| 7 | #GetIoMode | 
| 8 | #DoHandshake | 
| 9 | #DoHandshakeGetServerCert | 
| 10 | #Read | 
| 11 | #Write | 
| 12 | #Pending | 
| 13 | #Peek | 
| 14 | #Poll | 
| 15 | #GetVerifyCertError | 
| 16 | #GetNeededServerCertBufferSize | 
| 17 | #SetSessionCacheMode | 
| 18 | #GetSessionCacheMode | 
| 19 | #FlushSessionCache | 
| 20 | #SetRenegotiationMode | 
| 21 | #GetRenegotiationMode | 
| 22 | SetOption | 
| 23 | GetOption | 
| 24 | #GetVerifyCertErrors | 
| 25 | [4.0.0+] #GetCipherInfo | 
| 26 | [9.0.0+] #SetNextAlpnProto | 
| 27 | [9.0.0+] #GetNextAlpnProto | 
SetSocketDescriptor
Takes an input s32, returns an output s32.
SetHostName
Takes a type-0x5 input buffer, no output.
The input buffer contains a string, the buffer size must be <=0xFF.
SetVerifyOption
Takes an input u32 #VerifyOption, no output.
SetIoMode
Takes an input #IoMode, no output.
GetSocketDescriptor
No input, returns an output s32.
GetHostName
Takes a type-0x6 output buffer, returns an output u32.
GetVerifyOption
No input, returns an output u32 #VerifyOption.
GetIoMode
No input, returns an output #IoMode.
DoHandshake
No input/output.
DoHandshakeGetServerCert
Takes a type-0x6 output buffer, returns two output u32s.
Read
Takes a type-0x6 output buffer, returns an output u32.
Write
Takes a type-0x5 input buffer, returns an output u32.
Pending
No input, returns an output s32.
Peek
Takes a type-0x6 output buffer, returns an output u32.
Poll
Takes an input #PollEvent, an u32, returns an output #PollEvent.
GetVerifyCertError
No input/output.
GetNeededServerCertBufferSize
No input, returns an output u32.
SetSessionCacheMode
Takes an input #SessionCacheMode, no output.
GetSessionCacheMode
No input, returns an output #SessionCacheMode.
FlushSessionCache
No input/output.
SetRenegotiationMode
Takes an input #RenegotiationMode, no output.
GetRenegotiationMode
No input, returns an output #RenegotiationMode.
SetOption
Takes an input u8 bool and an #OptionType, no output.
GetOption
Takes an input #OptionType, returns an output u8 bool.
GetVerifyCertErrors
Takes a type-0x6 output buffer, returns two output u32s.
GetCipherInfo
Takes an input u32 and a type-0x6 output buffer.
sdknso uses hard-coded value 0x1 for the u32. The output buffer contains #CipherInfo.
Errors are thrown if the input u32 doesn't match 0x1, or if the buffer size doesn't match the size for #CipherInfo.
SetNextAlpnProto
Takes a type-0x5 input buffer, no output.
GetNextAlpnProto
Takes a type-0x6 output buffer, returns an output #AlpnProtoState and an output u32.
SslVersion
This is "nn::ssl::sf::SslVersion" or "nn::ssl::Context::SslVersion".
| Value | Description | 
|---|---|
| 0x1 | Auto | 
| 0x8 | TlsV10 | 
| 0x10 | TlsV11 | 
| 0x20 | TlsV12 | 
DebugOptionType
This is "nn::ssl::sf::DebugOptionType" or "nn::ssl::DebugOption".
| Value | Description | 
|---|---|
| 0 | AllowDisableVerifyOption | 
FlushSessionCacheOptionType
This is "nn::ssl::sf::FlushSessionCacheOptionType" or "nn::ssl::FlushSessionCacheOptionType".
| Value | Description | 
|---|---|
| 0 | SingleHost | 
| 1 | AllHosts | 
BuiltInCertificateInfo
This is "nn::ssl::BuiltInManager::BuiltInCertificateInfo".
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x4 | #CaCertificateId | 
| 0x4 | 0x4 | #TrustedCertStatus | 
| 0x8 | 0x8 | CertificateSize | 
| 0x10 | 0x8 | CertificateDataOffset | 
This is the struct returned by #GetCertificates. It is internally converted from "nn::ssl::detail::BuiltinDataInfo" by copying "nn::ssl::detail::BuiltinDataInfo::BuiltinDataStatus" into #TrustedCertStatus and official software then further converts this to "nn::ssl::BuiltInManager::BuiltInCertificateInfo" by transforming "CertificateDataOffset" into an actual pointer.
TrustedCertStatus
This is "nn::ssl::TrustedCertStatus".
| Value | Description | 
|---|---|
| -1 | Invalid | 
| 0 | Removed | 
| 1 | EnabledTrusted | 
| 2 | EnabledNotTrusted | 
| 3 | Revoked | 
CaCertificateId
This is "nn::ssl::CaCertificateId".
| Value | Description | 
|---|---|
| -1 | All | 
| 1 | NintendoCAG3 | 
| 2 | NintendoClass2CAG3 | 
| 1000 | AmazonRootCA1 | 
| 1001 | StarfieldServicesRootCertificateAuthorityG2 | 
| 1002 | AddTrustExternalCARoot | 
| 1003 | COMODOCertificationAuthority | 
| 1004 | UTNDATACorpSGC | 
| 1005 | UTNUSERFirstHardware | 
| 1006 | BaltimoreCyberTrustRoot | 
| 1007 | CybertrustGlobalRoot | 
| 1008 | VerizonGlobalRootCA | 
| 1009 | DigiCertAssuredIDRootCA | 
| 1010 | DigiCertAssuredIDRootG2 | 
| 1011 | DigiCertGlobalRootCA | 
| 1012 | DigiCertGlobalRootG2 | 
| 1013 | DigiCertHighAssuranceEVRootCA | 
| 1014 | EntrustnetCertificationAuthority2048 | 
| 1015 | EntrustRootCertificationAuthority | 
| 1016 | EntrustRootCertificationAuthorityG2 | 
| 1017 | GeoTrustGlobalCA2 | 
| 1018 | GeoTrustGlobalCA | 
| 1019 | GeoTrustPrimaryCertificationAuthorityG3 | 
| 1020 | GeoTrustPrimaryCertificationAuthority | 
| 1021 | GlobalSignRootCA | 
| 1022 | GlobalSignRootCAR2 | 
| 1023 | GlobalSignRootCAR3 | 
| 1024 | GoDaddyClass2CertificationAuthority | 
| 1025 | GoDaddyRootCertificateAuthorityG2 | 
| 1026 | StarfieldClass2CertificationAuthority | 
| 1027 | StarfieldRootCertificateAuthorityG2 | 
| 1028 | thawtePrimaryRootCAG3 | 
| 1029 | thawtePrimaryRootCA | 
| 1030 | VeriSignClass3PublicPrimaryCertificationAuthorityG3 | 
| 1031 | VeriSignClass3PublicPrimaryCertificationAuthorityG5 | 
| 1032 | VeriSignUniversalRootCertificationAuthority | 
| 1033 | DSTRootCAX3 | 
InternalPki
This is "nn::ssl::sf::InternalPki" or "nn::ssl::Context::InternalPki".
| Value | Description | 
|---|---|
| 0 | None | 
| 1 | DeviceClientCertDefault | 
An error is thrown by #RegisterInternalPki when the input value does not match "DeviceClientCertDefault".
ContextOption
This is "nn::ssl::sf::ContextOption" or "nn::ssl::Context::ContextOption".
| Value | Description | 
|---|---|
| 0 | None | 
| 1 | CrlImportDateCheckEnable | 
CertificateFormat
This is "nn::ssl::sf::CertificateFormat" or "nn::ssl::CertificateFormat".
| Value | Description | 
|---|---|
| 1 | Pem | 
| 2 | Der | 
VerifyOption
This is "nn::ssl::sf::VerifyOption". This is a bitmask.
| Bit | Description | 
|---|---|
| 0 | PeerCa | 
| 1 | HostName | 
| 2 | DateCheck | 
| 3 | EvCertPartial | 
| 4 | [6.0.0+] EvPolicyOid | 
| 5 | [6.0.0+] EvCertFingerprint | 
Originally ssl-sysmodule (#SetVerifyOption) just wrote the input field to state. With [5.0.0+] there's now validation for the input, with the value written to state masked with {allowed bitmask}. When InterfaceVersion is >=0x2, the low 2-bits of VerifyOption must be set, unless {state flag for #OptionType value 2} is set or [9.0.0+] {bool DebugOption state flag} is set, otherwise an error is thrown. [6.0.0+]: Following that, if VerifyOption bit4 is set, then VerifyOption & 0x15 must match 0x15 otherwise an error is thrown.
IoMode
This is "nn::ssl::sf::IoMode" or "nn::ssl::Connection::IoMode".
| Value | Description | 
|---|---|
| 1 | Blocking | 
| 2 | NonBlocking | 
PollEvent
This is "nn::ssl::sf::PollEvent" or "nn::ssl::Connection::PollEvent". This is a bitmask.
| Bit | Description | 
|---|---|
| 0 | Read | 
| 1 | Write | 
| 2 | Except | 
SessionCacheMode
This is "nn::ssl::sf::SessionCacheMode" or "nn::ssl::Connection::SessionCacheMode".
| Value | Description | 
|---|---|
| 0 | None | 
| 1 | SessionId | 
| 2 | SessionTicket | 
RenegotiationMode
This is "nn::ssl::sf::RenegotiationMode" or "nn::ssl::Connection::RenegotiationMode".
| Value | Description | 
|---|---|
| 0 | None | 
| 1 | Secure | 
OptionType
This is "nn::ssl::sf::OptionType" or "nn::ssl::Connection::OptionType".
| Value | Description | 
|---|---|
| 0 | DoNotCloseSocket | 
| 1 | [3.0.0+] GetServerCertChain | 
| 2 | [5.0.0+] SkipDefaultVerify | 
| 3 | [9.0.0+] EnableAlpn | 
This corresponds to bool flags.
"SkipDefaultVerify" is checked by SetVerifyOption and "EnableAlpn" is only available with SetOption.
AlpnProtoState
This is "nn::ssl::sf::AlpnProtoState" or "nn::ssl::Connection::AlpnProtoState".
| Value | Description | 
|---|---|
| 0 | NoSupport | 
| 1 | Negotiated | 
| 2 | NoOverlap | 
| 3 | Selected | 
| 4 | EarlyValue | 
CipherInfo
This is "nn::ssl::Connection::CipherInfo". This is a 0x48-byte struct.
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x40 | Cipher string | 
| 0x40 | 0x8 | Protocol version string | 
CertStore
This is the CertStore title, which contains the following files in RomFS:
- "/ssl_CaFingerprints.bdf"
- "/ssl_Crl.bdf"
- "/ssl_TrustedCerts.bdf"
On old system-versions, this only contains "/ssl_TrustedCerts.tcf", which seems to have the same format described below.
These have the following structure:
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x4 | Magic "sslT" | 
| 0x4 | 0x4 | Total entries | 
| 0x8 | 0x10*{total entries} | Array entries | 
Array entry structure:
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x4 | Id | 
| 0x4 | 0x4 | ? | 
| 0x8 | 0x4 | Data size | 
| 0xC | 0x4 | Data offset | 
Data offset is relative to absolute offset 0x8.
The ID is the same one used by service commands to access these entries. For ssl_TrustedCerts, ID is #CaCertificateId.
Client cert+privk
SSL-sysmodule uses set:cal GetSslKey and GetSslCert. The rest of this section documents handling for the former, which can be decrypted with SPL.
key* below refers to the 3 0x10-byte input blocks passed to this code.
When actual_size is:
- 0x100+0x10: If the u32 actual_size is less than (u32)-0x11, and the last 0x10-bytes of the actual-data are all-zero, the data is copied to the output as raw plaintext. If a non-zero byte is found, it will continue with SPL usage, skipping over the SPL block for the devunit flag. In this case, key=key0 and the flag passed to SPL later is set to 0.
- 0x100+0x30: Size must match this if it's not the above, otherwise error 0xC81A is returned. The flag passed to SPL later is set to 1 in this case. Runs the devunit-flag-block: uses SPL_services#SPL#GetDevunitFlag. key = key1 when out_flag!=0, key2 otherwise.