<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.nina.chat/index.php?action=history&amp;feed=atom&amp;title=Protocols%2FMSNP%2FMSNP15%2FSSO</id>
	<title>Protocols/MSNP/MSNP15/SSO - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.nina.chat/index.php?action=history&amp;feed=atom&amp;title=Protocols%2FMSNP%2FMSNP15%2FSSO"/>
	<link rel="alternate" type="text/html" href="https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNP15/SSO&amp;action=history"/>
	<updated>2026-06-26T08:45:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNP15/SSO&amp;diff=4367&amp;oldid=prev</id>
		<title>Animadoria at 13:43, 15 May 2022</title>
		<link rel="alternate" type="text/html" href="https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNP15/SSO&amp;diff=4367&amp;oldid=prev"/>
		<updated>2022-05-15T13:43:27Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:43, 15 May 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Protocols/MSNP&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/&lt;/del&gt;MSNP15 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Navigation&lt;/del&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Protocols/MSNP&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;section=&lt;/ins&gt;MSNP15}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wiki-wiki_:diff:1.41:old-2607:rev-4367:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Animadoria</name></author>
	</entry>
	<entry>
		<id>https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNP15/SSO&amp;diff=2607&amp;oldid=prev</id>
		<title>AD: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNP15/SSO&amp;diff=2607&amp;oldid=prev"/>
		<updated>2020-05-29T00:23:42Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:23, 29 May 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key wiki-wiki_:diff:1.41:old-2606:rev-2607 --&gt;
&lt;/table&gt;</summary>
		<author><name>AD</name></author>
	</entry>
	<entry>
		<id>https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNP15/SSO&amp;diff=2606&amp;oldid=prev</id>
		<title>AD: Removed broken links in the 'code examples' section.</title>
		<link rel="alternate" type="text/html" href="https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNP15/SSO&amp;diff=2606&amp;oldid=prev"/>
		<updated>2010-07-25T20:00:42Z</updated>

		<summary type="html">&lt;p&gt;Removed broken links in the &amp;#039;code examples&amp;#039; section.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Protocols/MSNP/MSNP15 Navigation}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= RPS/SSO Authentication =&lt;br /&gt;
When you authenticate with MSNP15, you will notice that the USR command has changed slightly. Here is the new format:&lt;br /&gt;
&lt;br /&gt;
Abstract&lt;br /&gt;
 Client: USR &amp;lt;TrId&amp;gt; SSO I &amp;lt;email&amp;gt;\r\n&lt;br /&gt;
 Server: USR &amp;lt;TrId&amp;gt; SSO S &amp;lt;policy&amp;gt; &amp;lt;base64 encoded nonce&amp;gt;\r\n&lt;br /&gt;
 Client: USR &amp;lt;TrId&amp;gt; SSO S &amp;lt;ticket&amp;gt; &amp;lt;base64 encoded response structure&amp;gt;\r\n&lt;br /&gt;
 Server: USR &amp;lt;TrId&amp;gt; OK &amp;lt;email&amp;gt; &amp;lt;verified&amp;gt; 0\r\n&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
 Client: USR 10 SSO I buddy@live.com\r\n&lt;br /&gt;
 Server: USR 10 SSO S MBI_KEY_OLD E4Fhehbe0q2Je+SUSp7IRnJV+rN4uME75ljIpUjIZ1Si+DgmrfuiIL+AFmkMA6Wv\r\n&lt;br /&gt;
 Client: USR 11 SSO S t=... HAAAAAEAAAADZgAABIAAAA...\r\n&lt;br /&gt;
 Server: USR 11 OK buddy@live.com 1 0\r\n&lt;br /&gt;
&lt;br /&gt;
After you receive the first &amp;quot;SSO S&amp;quot; command, you should take your given policy and connect to &amp;lt;nowiki&amp;gt;https://login.live.com/RST.srf&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Remark: For the account which ends up with @msn.com, this should be &amp;lt;nowiki&amp;gt;https://msnia.login.live.com/pp550/RST.srf&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Envelope xmlns=&amp;quot;http://schemas.xmlsoap.org/soap/envelope/&amp;quot;&lt;br /&gt;
    xmlns:wsse=&amp;quot;http://schemas.xmlsoap.org/ws/2003/06/secext&amp;quot;&lt;br /&gt;
    xmlns:saml=&amp;quot;urn:oasis:names:tc:SAML:1.0:assertion&amp;quot;&lt;br /&gt;
    xmlns:wsp=&amp;quot;http://schemas.xmlsoap.org/ws/2002/12/policy&amp;quot;&lt;br /&gt;
    xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot;&lt;br /&gt;
    xmlns:wsa=&amp;quot;http://schemas.xmlsoap.org/ws/2004/03/addressing&amp;quot;&lt;br /&gt;
    xmlns:wssc=&amp;quot;http://schemas.xmlsoap.org/ws/2004/04/sc&amp;quot;&lt;br /&gt;
    xmlns:wst=&amp;quot;http://schemas.xmlsoap.org/ws/2004/04/trust&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Header&amp;gt;&lt;br /&gt;
        &amp;lt;ps:AuthInfo&lt;br /&gt;
            xmlns:ps=&amp;quot;&amp;lt;nowiki&amp;gt;http://schemas.microsoft.com/Passport/SoapServices/PPCRL&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
            Id=&amp;quot;PPAuthInfo&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ps:HostingApp&amp;gt;{7108E71A-9926-4FCB-BCC9-9A9D3F32E423}&amp;lt;/ps:HostingApp&amp;gt;&lt;br /&gt;
            &amp;lt;ps:BinaryVersion&amp;gt;4&amp;lt;/ps:BinaryVersion&amp;gt;&lt;br /&gt;
            &amp;lt;ps:UIVersion&amp;gt;1&amp;lt;/ps:UIVersion&amp;gt;&lt;br /&gt;
            &amp;lt;ps:Cookies&amp;gt;&amp;lt;/ps:Cookies&amp;gt;&lt;br /&gt;
            &amp;lt;ps:RequestParams&amp;gt;AQAAAAIAAABsYwQAAAAxMDMz&amp;lt;/ps:RequestParams&amp;gt;&lt;br /&gt;
        &amp;lt;/ps:AuthInfo&amp;gt;&lt;br /&gt;
        &amp;lt;wsse:Security&amp;gt;&lt;br /&gt;
            &amp;lt;wsse:UsernameToken Id=&amp;quot;user&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;wsse:Username&amp;gt;'''email@live.com'''&amp;lt;/wsse:Username&amp;gt;&lt;br /&gt;
                &amp;lt;wsse:Password&amp;gt;'''PasswordGoesHere'''&amp;lt;/wsse:Password&amp;gt;&lt;br /&gt;
            &amp;lt;/wsse:UsernameToken&amp;gt;&lt;br /&gt;
        &amp;lt;/wsse:Security&amp;gt;&lt;br /&gt;
    &amp;lt;/Header&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;&lt;br /&gt;
        &amp;lt;ps:RequestMultipleSecurityTokens&lt;br /&gt;
            xmlns:ps=&amp;quot;&amp;lt;nowiki&amp;gt;http://schemas.microsoft.com/Passport/SoapServices/PPCRL&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
            Id=&amp;quot;RSTS&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wst:RequestSecurityToken Id=&amp;quot;RST0&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;wst:RequestType&amp;gt;&amp;lt;nowiki&amp;gt;http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue&amp;lt;/nowiki&amp;gt;&amp;lt;/wst:RequestType&amp;gt;&lt;br /&gt;
                &amp;lt;wsp:AppliesTo&amp;gt;&lt;br /&gt;
                    &amp;lt;wsa:EndpointReference&amp;gt;&lt;br /&gt;
                        &amp;lt;wsa:Address&amp;gt;&amp;lt;nowiki&amp;gt;http://Passport.NET/tb&amp;lt;/nowiki&amp;gt;&amp;lt;/wsa:Address&amp;gt;&lt;br /&gt;
                    &amp;lt;/wsa:EndpointReference&amp;gt;&lt;br /&gt;
                &amp;lt;/wsp:AppliesTo&amp;gt;&lt;br /&gt;
            &amp;lt;/wst:RequestSecurityToken&amp;gt;&lt;br /&gt;
            &amp;lt;wst:RequestSecurityToken Id=&amp;quot;'''RSTn'''&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;wst:RequestType&amp;gt;&amp;lt;nowiki&amp;gt;http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue&amp;lt;/nowiki&amp;gt;&amp;lt;/wst:RequestType&amp;gt;&lt;br /&gt;
                &amp;lt;wsp:AppliesTo&amp;gt;&lt;br /&gt;
                    &amp;lt;wsa:EndpointReference&amp;gt;&lt;br /&gt;
                        &amp;lt;wsa:Address&amp;gt;'''domain'''&amp;lt;/wsa:Address&amp;gt;&lt;br /&gt;
                    &amp;lt;/wsa:EndpointReference&amp;gt;&lt;br /&gt;
                &amp;lt;/wsp:AppliesTo&amp;gt;&lt;br /&gt;
                &amp;lt;wsse:PolicyReference URI=&amp;quot;'''policy parameter'''&amp;quot;&amp;gt;&amp;lt;/wsse:PolicyReference&amp;gt;&lt;br /&gt;
            &amp;lt;/wst:RequestSecurityToken&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/ps:RequestMultipleSecurityTokens&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
 &amp;lt;/Envelope&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inside of ps:RequestMultipleSecurityTokens, you have a list of domains you want to authenticate to. You start from RST0 and you move to RST1 and so on. This allows you to get your MSPAuth and MSPProf cookies for multiple different domains all at the same time.&lt;br /&gt;
&lt;br /&gt;
Some examples of sites that you can authenticate with&lt;br /&gt;
 Domain: http://Passport.NET/tb&lt;br /&gt;
 Policy Ref URI: -&lt;br /&gt;
 Purpose: Unknown, but it's required for the request to succeed.&lt;br /&gt;
&lt;br /&gt;
 Domain: messengerclear.live.com&lt;br /&gt;
 Policy Ref URI: ''&amp;lt;obtain from the USR command&amp;gt;''&lt;br /&gt;
 Purpose: Authentication for messenger.&lt;br /&gt;
&lt;br /&gt;
 Domain: messenger.msn.com&lt;br /&gt;
 Policy Ref URI: ?id=507&lt;br /&gt;
 Purpose: Messenger website authentication.&lt;br /&gt;
&lt;br /&gt;
 Domain: contacts.msn.com&lt;br /&gt;
 Policy Ref URI: ?fs=1&amp;amp;id=24000&amp;amp;kv=9&amp;amp;rn=93S9SWWw&amp;amp;tw=0&amp;amp;ver=2.1.6000.1&lt;br /&gt;
 '''New''' Policy Ref URI: MBI (used in WLM 8.5.1288.816)&lt;br /&gt;
 Purpose: Authentication for the Contact server.&lt;br /&gt;
&lt;br /&gt;
 Domain: messengersecure.live.com&lt;br /&gt;
 Policy Ref URI: MBI_SSL&lt;br /&gt;
 Purpose: Unknown&lt;br /&gt;
&lt;br /&gt;
 Domain: spaces.msn.com ''or'' spaces.live.com&lt;br /&gt;
 Policy Ref URI: MBI&lt;br /&gt;
 Purpose: Authentication for the Windows Live Spaces&lt;br /&gt;
&lt;br /&gt;
 Domain: livecontacts.live.com&lt;br /&gt;
 Policy Ref URI: MBI&lt;br /&gt;
 Purpose: Live Contacts API, a simplified version of the Contacts SOAP service&lt;br /&gt;
&lt;br /&gt;
 Domain: storage.live.com&lt;br /&gt;
 Policy Ref URI: MBI&lt;br /&gt;
 Purpose: Storage REST API&lt;br /&gt;
&lt;br /&gt;
The response to this query when successful, looks like this.&lt;br /&gt;
 &amp;amp;lt;S:Envelope xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/soap/envelope/&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;amp;lt;S:Header&amp;gt;&lt;br /&gt;
        ''There is really data here, but for space it has be removed''&lt;br /&gt;
    &amp;amp;lt;/S:Header&amp;gt;&lt;br /&gt;
    &amp;amp;lt;S:Body&amp;gt;&lt;br /&gt;
        &amp;lt;wst:RequestSecurityTokenResponseCollection&lt;br /&gt;
            xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/soap/envelope/&amp;quot;&lt;br /&gt;
            xmlns:wst=&amp;quot;http://schemas.xmlsoap.org/ws/2004/04/trust&amp;quot;&lt;br /&gt;
            xmlns:wsse=&amp;quot;http://schemas.xmlsoap.org/ws/2003/06/secext&amp;quot;&lt;br /&gt;
            xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot;&lt;br /&gt;
            xmlns:saml=&amp;quot;urn:oasis:names:tc:SAML:1.0:assertion&amp;quot;&lt;br /&gt;
            xmlns:wsp=&amp;quot;http://schemas.xmlsoap.org/ws/2002/12/policy&amp;quot;&lt;br /&gt;
            xmlns:psf=&amp;quot;http://schemas.microsoft.com/Passport/SoapServices/SOAPFault&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wst:RequestSecurityTokenResponse&amp;gt;&lt;br /&gt;
                &amp;lt;wst:TokenType&amp;gt;urn:passport:legacy&amp;lt;/wst:TokenType&amp;gt;&lt;br /&gt;
                &amp;lt;wsp:AppliesTo xmlns:wsa=&amp;quot;&amp;lt;nowiki&amp;gt;http://schemas.xmlsoap.org/ws/2004/03/addressing&amp;lt;/nowiki&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;wsa:EndpointReference&amp;gt;&lt;br /&gt;
                        &amp;lt;wsa:Address&amp;gt;&amp;lt;nowiki&amp;gt;http://Passport.NET/tb&amp;lt;/nowiki&amp;gt;&amp;lt;/wsa:Address&amp;gt;&lt;br /&gt;
                    &amp;lt;/wsa:EndpointReference&amp;gt;&lt;br /&gt;
                &amp;lt;/wsp:AppliesTo&amp;gt;&lt;br /&gt;
                &amp;lt;wst:LifeTime&amp;gt;&lt;br /&gt;
                    &amp;lt;wsu:Created&amp;gt;2006-12-06T05:12:10Z&amp;lt;/wsu:Created&amp;gt;&lt;br /&gt;
                    &amp;lt;wsu:Expires&amp;gt;2006-12-07T05:12:10Z&amp;lt;/wsu:Expires&amp;gt;&lt;br /&gt;
                &amp;lt;/wst:LifeTime&amp;gt;&lt;br /&gt;
                &amp;lt;wst:RequestedSecurityToken&amp;gt;&lt;br /&gt;
                   &amp;lt;nowiki&amp;gt; &amp;lt;EncryptedData xmlns=&amp;quot;http://www.w3.org/2001/04/xmlenc#&amp;quot;&lt;br /&gt;
                    Id=&amp;quot;BinaryDAToken0&amp;quot;&lt;br /&gt;
                    Type=&amp;quot;http://www.w3.org/2001/04/xmlenc#Element&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
                        &amp;lt;EncryptionMethod Algorithm=&amp;quot;http://www.w3.org/2001/04/xmlenc#tripledes-cbc&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;/EncryptionMethod&amp;gt;&lt;br /&gt;
                        &amp;lt;ds:KeyInfo xmlns:ds=&amp;quot;http://www.w3.org/2000/09/xmldsig#&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;ds:KeyName&amp;gt;&amp;lt;nowiki&amp;gt;http://Passport.NET/STS&amp;lt;/nowiki&amp;gt;&amp;lt;/ds:KeyName&amp;gt;&lt;br /&gt;
                        &amp;lt;/ds:KeyInfo&amp;gt;&lt;br /&gt;
                        &amp;lt;CipherData&amp;gt;&lt;br /&gt;
                            &amp;lt;CipherValue&amp;gt;&lt;br /&gt;
                                ''cipher data you don't need to worry about''&lt;br /&gt;
                            &amp;lt;/CipherValue&amp;gt;&lt;br /&gt;
                        &amp;lt;/CipherData&amp;gt;&lt;br /&gt;
                    &amp;lt;/EncryptedData&amp;gt;&lt;br /&gt;
                &amp;lt;/wst:RequestedSecurityToken&amp;gt;&lt;br /&gt;
                &amp;lt;wst:RequestedTokenReference&amp;gt;&lt;br /&gt;
                    &amp;lt;wsse:KeyIdentifier ValueType=&amp;quot;urn:passport&amp;quot;&amp;gt;&amp;lt;/wsse:KeyIdentifier&amp;gt;&lt;br /&gt;
                    &amp;lt;wsse:Reference URI=&amp;quot;#BinaryDAToken0&amp;quot;&amp;gt;&amp;lt;/wsse:Reference&amp;gt;&lt;br /&gt;
                &amp;lt;/wst:RequestedTokenReference&amp;gt;&lt;br /&gt;
                &amp;lt;wst:RequestedProofToken&amp;gt;&lt;br /&gt;
                    &amp;lt;wst:BinarySecret&amp;gt;''ignore this one''&amp;lt;/wst:BinarySecret&amp;gt;&lt;br /&gt;
                &amp;lt;/wst:RequestedProofToken&amp;gt;&lt;br /&gt;
            &amp;lt;/wst:RequestSecurityTokenResponse&amp;gt;&lt;br /&gt;
            &amp;lt;wst:RequestSecurityTokenResponse&amp;gt;&lt;br /&gt;
                &amp;lt;wst:TokenType&amp;gt;urn:passport:compact&amp;lt;/wst:TokenType&amp;gt;&lt;br /&gt;
                &amp;lt;wsp:AppliesTo xmlns:wsa=&amp;quot;http://schemas.xmlsoap.org/ws/2004/03/addressing&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;wsa:EndpointReference&amp;gt;&lt;br /&gt;
                        &amp;lt;wsa:Address&amp;gt;messengerclear.live.com&amp;lt;/wsa:Address&amp;gt;&lt;br /&gt;
                    &amp;lt;/wsa:EndpointReference&amp;gt;&lt;br /&gt;
                &amp;lt;/wsp:AppliesTo&amp;gt;&lt;br /&gt;
                &amp;lt;wst:LifeTime&amp;gt;&lt;br /&gt;
                    &amp;lt;wsu:Created&amp;gt;2006-12-06T05:12:10Z&amp;lt;/wsu:Created&amp;gt;&lt;br /&gt;
                    &amp;lt;wsu:Expires&amp;gt;2006-12-06T13:12:10Z&amp;lt;/wsu:Expires&amp;gt;&lt;br /&gt;
                &amp;lt;/wst:LifeTime&amp;gt;&lt;br /&gt;
                &amp;lt;wst:RequestedSecurityToken&amp;gt;&lt;br /&gt;
                    &amp;lt;wsse:BinarySecurityToken Id=&amp;quot;Compact''n''&amp;quot;&amp;gt;&lt;br /&gt;
                        t=''&amp;lt;ticket goes here&amp;gt;''&amp;amp;amp;p=&lt;br /&gt;
                    &amp;lt;/wsse:BinarySecurityToken&amp;gt;&lt;br /&gt;
                &amp;lt;/wst:RequestedSecurityToken&amp;gt;&lt;br /&gt;
                &amp;lt;wst:RequestedTokenReference&amp;gt;&lt;br /&gt;
                    &amp;lt;wsse:KeyIdentifier ValueType=&amp;quot;urn:passport:compact&amp;quot;&amp;gt;&amp;lt;/wsse:KeyIdentifier&amp;gt;&lt;br /&gt;
                    &amp;lt;wsse:Reference URI=&amp;quot;#Compact''n''&amp;quot;&amp;gt;&amp;lt;/wsse:Reference&amp;gt;&lt;br /&gt;
                &amp;lt;/wst:RequestedTokenReference&amp;gt;&lt;br /&gt;
                &amp;lt;wst:RequestedProofToken&amp;gt;&lt;br /&gt;
                    &amp;lt;wst:BinarySecret&amp;gt;''binary secret (you need this)''&amp;lt;/wst:BinarySecret&amp;gt;&lt;br /&gt;
                &amp;lt;/wst:RequestedProofToken&amp;gt;&lt;br /&gt;
            &amp;lt;/wst:RequestSecurityTokenResponse&amp;gt;&lt;br /&gt;
            &amp;lt;wst:RequestSecurityTokenResponse&amp;gt;&lt;br /&gt;
                &amp;lt;wst:TokenType&amp;gt;urn:passport:legacy&amp;lt;/wst:TokenType&amp;gt;&lt;br /&gt;
                &amp;lt;wsp:AppliesTo xmlns:wsa=&amp;quot;http://schemas.xmlsoap.org/ws/2004/03/addressing&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;wsa:EndpointReference&amp;gt;&lt;br /&gt;
                        &amp;lt;wsa:Address&amp;gt;''site domain''&amp;lt;/wsa:Address&amp;gt;&lt;br /&gt;
                    &amp;lt;/wsa:EndpointReference&amp;gt;&lt;br /&gt;
                &amp;lt;/wsp:AppliesTo&amp;gt;&lt;br /&gt;
                &amp;lt;wst:LifeTime&amp;gt;&lt;br /&gt;
                    &amp;lt;wsu:Created&amp;gt;2006-12-06T05:12:10Z&amp;lt;/wsu:Created&amp;gt;&lt;br /&gt;
                    &amp;lt;wsu:Expires&amp;gt;2006-12-06T05:20:30Z&amp;lt;/wsu:Expires&amp;gt;&lt;br /&gt;
                &amp;lt;/wst:LifeTime&amp;gt;&lt;br /&gt;
                &amp;lt;wst:RequestedSecurityToken&amp;gt;&lt;br /&gt;
                    &amp;lt;wsse:BinarySecurityToken Id=&amp;quot;PPToken''n''&amp;quot;&amp;gt;&lt;br /&gt;
                        t=''&amp;lt;site ticket here&amp;gt;''&amp;amp;amp;p=''&amp;lt;site profile here&amp;gt;''&lt;br /&gt;
                    &amp;lt;/wsse:BinarySecurityToken&amp;gt;&lt;br /&gt;
                &amp;lt;/wst:RequestedSecurityToken&amp;gt;&lt;br /&gt;
                &amp;lt;wst:RequestedTokenReference&amp;gt;&lt;br /&gt;
                    &amp;lt;wsse:KeyIdentifier ValueType=&amp;quot;urn:passport&amp;quot;&amp;gt;&amp;lt;/wsse:KeyIdentifier&amp;gt;&lt;br /&gt;
                    &amp;lt;wsse:Reference URI=&amp;quot;#PPToken''n''&amp;quot;&amp;gt;&amp;lt;/wsse:Reference&amp;gt;&lt;br /&gt;
                &amp;lt;/wst:RequestedTokenReference&amp;gt;&lt;br /&gt;
            &amp;lt;/wst:RequestSecurityTokenResponse&amp;gt;&lt;br /&gt;
            ...&lt;br /&gt;
            ...&lt;br /&gt;
        &amp;lt;/wst:RequestSecurityTokenResponseCollection&amp;gt;&lt;br /&gt;
    &amp;amp;lt;/S:Body&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/S:Envelope&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In your response, you will need to look for the wst:RequestSecurityTokenResponseCollection section. This section contains the list of credentials for each site you requested. If your policy reference URI contained something like MBI, MBI_SSL or MBI_KEY_OLD, the your ticket/MSPAuth&amp;amp;MSPProf will be in the &amp;lt;wsse:BinarySecurityToken Id=&amp;quot;Compact''n''&amp;quot;&amp;gt; where n is the same number as the RSTn request. If the policy reference contains a string starting in a question mark (like the end of a url), your security data will be in &amp;lt;wsse:BinarySecurityToken Id=&amp;quot;PPToken''n''&amp;quot;&amp;gt;&lt;br /&gt;
Technically speaking you should check the &amp;lt;wst:TokenType&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
For logging in to messenger, you will need to grab your ticket, and the contents of the &amp;lt;wst:BinarySecret&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
= Computing the return value =&lt;br /&gt;
&lt;br /&gt;
Now that you have your ticket(nonce) and your Binary secret, we need to create a structure of information to send back to the server. The C++ style structure looks like this:&lt;br /&gt;
&lt;br /&gt;
 struct tagMSGRUSRKEY&lt;br /&gt;
 {&lt;br /&gt;
 // Header&lt;br /&gt;
        unsigned int uStructHeaderSize; // 28. Does not count data&lt;br /&gt;
        unsigned int uCryptMode; // CRYPT_MODE_CBC (1)&lt;br /&gt;
        unsigned int uCipherType; // TripleDES (0x6603)&lt;br /&gt;
        unsigned int uHashType; // SHA1 (0x8004)&lt;br /&gt;
        unsigned int uIVLen;    // 8&lt;br /&gt;
        unsigned int uHashLen;  // 20&lt;br /&gt;
        unsigned int uCipherLen; // 72&lt;br /&gt;
 // Data&lt;br /&gt;
        unsigned char aIVBytes[8];&lt;br /&gt;
        unsigned char aHashBytes[20];&lt;br /&gt;
        unsigned char aCipherBytes[72];&lt;br /&gt;
 }MSGUSRKEY;&lt;br /&gt;
&lt;br /&gt;
Note that these values are all '''Little-Endian'''.&lt;br /&gt;
Each '''header''' element of the struct should be '''4 bytes''' in size. ''unsinged int'' is 4 bytes on both x86_32 and x86_64 bit OSes.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION:''' ''unsigned long'' is 4 bytes on x86_32 and '''8 bytes''' on x86_64. So be careful if you're using ''long'' and building for x86_64 architectures.&lt;br /&gt;
&lt;br /&gt;
If you use the default values that messenger gives, the sizes of the BYTE arrays will be correct, if you do not use the default values, you'll have to adjust properly.&lt;br /&gt;
&lt;br /&gt;
We need to create some keys. Let's call them '''key1''', '''key2''' and '''key3'''.&lt;br /&gt;
&lt;br /&gt;
'''1. Base64 decode your ''binary secret''.'''&lt;br /&gt;
&lt;br /&gt;
Store the resulting data in '''key1'''.&lt;br /&gt;
&lt;br /&gt;
'''2. key2 and key3'''&lt;br /&gt;
&lt;br /&gt;
Data for both key2 and key3 are calculated by the same logic. See this pseudo-code for '''key2''':&lt;br /&gt;
 hash1 = SHA1-HMAC(key1,&amp;quot;WS-SecureConversationSESSION KEY HASH&amp;quot;)&lt;br /&gt;
 hash2 = SHA1-HMAC(key1,hash1+&amp;quot;WS-SecureConversationSESSION KEY HASH&amp;quot;)&lt;br /&gt;
 hash3 = SHA1-HMAC(key1,hash1)&lt;br /&gt;
 hash4 = SHA1-HMAC(key1,hash3+&amp;quot;WS-SecureConversationSESSION KEY HASH&amp;quot;)&lt;br /&gt;
Take all 20 bytes from hash2 and the first 4 bytes from hash4. Store that in '''key2'''.&lt;br /&gt;
Now do the same thing only this time use the string &amp;quot;''WS-SecureConversationSESSION KEY ENCRYPTION''&amp;quot; (instead of &amp;quot;WS-SecureConversationSESSION KEY HASH&amp;quot;) and store it in '''key3'''.&lt;br /&gt;
&lt;br /&gt;
'''3. hash'''&lt;br /&gt;
&lt;br /&gt;
You need to create an SHA1-HMAC hash with ''key2'' and the ''nonce''. Take a look at this pseudo-code:&lt;br /&gt;
 hash = SHA1-HMAC(key2, nonce)&lt;br /&gt;
Let's store the data in '''hash'''&lt;br /&gt;
&lt;br /&gt;
'''4. Pad the nonce'''&lt;br /&gt;
&lt;br /&gt;
The official client appends to the nonce 8 bytes with the value '''08''' (hex)&lt;br /&gt;
&lt;br /&gt;
'''5. Create 8 bytes of random data.''' These will be used in the next step.&lt;br /&gt;
&lt;br /&gt;
'''6. TripleDes CBC encryption.'''&lt;br /&gt;
&lt;br /&gt;
We need to use the '''TripleDes''' algorithm. Set the mode to '''CBC'''. As IV set the data obtained in step 5. As key use the '''key3'''. As input use the '''padded''' nonce (see step 4). Let's store the resulting data in a variable called '''encrypted_data'''.&lt;br /&gt;
&lt;br /&gt;
'''7. Filling the struct'''&lt;br /&gt;
&lt;br /&gt;
The header elements should have the value that is indicated in the comments next to them. (If you plan to use non-default values, adjust accordingly).&lt;br /&gt;
The ''aIVBytes'' element should be assigned the data obtained in step 5. The ''aHashBytes'' element should be assigned the data of '''hash''' (see step 3). The ''aCipherBytes'' element should be assigned the data of '''encrypted_data''' (see step 6).&lt;br /&gt;
&lt;br /&gt;
'''8. Base64 encode the struct'''&lt;br /&gt;
&lt;br /&gt;
Now you need to base64-encode the struct. If you're using C or C++ you have to typecast the struct variable to &amp;quot;'''char*'''&amp;quot; to be able to base64 encode it.&lt;br /&gt;
&lt;br /&gt;
These base64-endoded data are the ''return value'' that you need to send to the server.&lt;br /&gt;
&lt;br /&gt;
= Test Values =&lt;br /&gt;
 Nonce: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=&lt;br /&gt;
 Binary Secret: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=&lt;br /&gt;
 IV(hex): 00 00 00 00 00 00 00 00&lt;br /&gt;
 Result (newline added readability): HAAAAAEAAAADZgAABIAAAAgAAAAUAAAASAAAAAAAAAAAAAAA7XgT5ohvaZdoXdrWUUcMF2G8OK2JohyY&lt;br /&gt;
 cK5l5MJSitab33scxJeK/RQXcUr0L+R2ZA9CEAzn0izmUzSMp2LZdxSbHtnuxCmptgtoScHp9E26HjQVkA9YJxgK/HM=&lt;br /&gt;
&lt;br /&gt;
 Nonce: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=&lt;br /&gt;
 Binary Secret: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=&lt;br /&gt;
 IV(hex): 00 00 00 00 00 00 00 00&lt;br /&gt;
 Result (newline added readability): HAAAAAEAAAADZgAABIAAAAgAAAAUAAAASAAAAAAAAAAAAAAAywfWRZVnRRZTqPkW6HBIrOmPuYiFbzcpv&lt;br /&gt;
 YmP2QzhpH+VdKwtqUTt/gdbDqlMZvR1o7ve9ex44otMOxYtnNYIQ+lfoj+PKcsHT+T7GA1hfMsTVbGqoYYe3B5/WW0=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Code Examples =&lt;br /&gt;
VC++ (MFC) [http://memskin.fanatic.net.nz/SSOHashExample.cpp.txt MBI Hash Example]&amp;lt;BR&amp;gt;&lt;br /&gt;
C++ QT4 QCA - [http://forums.fanatic.net.nz/index.php?showtopic=18886&amp;amp;st=0#entry106562 SSO Crypto Example]&amp;lt;BR&amp;gt;&lt;br /&gt;
VB .NET: [http://www.machkar.info/mbiencrypt.txt MBI Code]&amp;lt;BR&amp;gt;&lt;br /&gt;
C++ (cross platform): [http://forums.fanatic.net.nz/index.php?showtopic=20080&amp;amp;view=findpost&amp;amp;p=109689 Simple implementation that computes the return value.] Uses openssl for the crypto functions. Also it has hardcoded IV, nonce and binary secret to the first test values of this wiki page. It a proof of concept for others to built on and understand the documentation.&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
[http://msnp-sharp.googlecode.com/svn/trunk/MSNP-Sharp15/WebServiceDefAndSchemas/MSNSecurityTokenService/ SingleSignOn WSDL &amp;amp; XSD files]&amp;lt;BR&amp;gt;&lt;br /&gt;
[http://zoronax.spaces.live.com/blog/cns!4A0B813054895814!167.entry Zoronax's Blog]&amp;lt;BR&amp;gt;&lt;br /&gt;
[http://www.openrce.org/blog/view/449 MSNP15 authentication scheme REd]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:MSN]]&lt;br /&gt;
[[Category:Protocols/MSNP]]&lt;br /&gt;
[[Category:Work_In_Progress]]&lt;/div&gt;</summary>
		<author><name>AD</name></author>
	</entry>
</feed>