[Spice-devel] [PATCH] protocol: add common channel caps for AUTH mechanism selection
Hans de Goede
hdegoede at redhat.com
Tue Feb 22 08:12:53 PST 2011
Ack.
On 02/22/2011 04:37 PM, Marc-André Lureau wrote:
> From: Marc-André Lureau<marcandre.lureau at redhat.com>
>
> Current version 2.0 of the SPICE protocol describes how the client
> reply to the server SpiceLinkReply message with a RSA_public_encrypt()
> of the password.
>
> Instead of using the current Spice AUTH mechanism, we would like to
> offer different AUTH mechanisms, in particular SASL, which is a
> framework allowing different underlying mechanisms such as
> GSSAPI/Kerberos v5 (and optionally adding a data security layer).
>
> We could bump the protocol version, but that would make this feature
> mandatory for the implementer of the protocol. By using the channel
> caps, the client and server are left to negotiate and alter the AUTH
> part of the protocol as follows:
>
> - SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION, if set, the authentication
> mechanism can be chosen during link phase. If both client and server
> have this cap, the client MUST reply to SpiceLinkReply with a
> SpiceLinkAuthMechanism message, with the value of the CAP_AUTH
> mechanism choosen (a uint32 auth_mechanism). The following
> authentication steps are described by the selected authentication
> mechanism.
>
> The differents mechanisms selectable via
> SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION are also specified as part of
> the common channel caps. They can be used only if both client and
> server offer them.
>
> Ex: no AUTH selection
> C: SpiceLinkMess
> S: SpiceLinkReply, CAP_PROTOCOL_AUTH_SELECTION not in common caps
> - The client can't choose AUTH, and fallback on Spice RSA mechanism
>
> Ex: AUTH selection
> C: SpiceLinkMess, CAP_PROTOCOL_AUTH_SELECTION in common caps
> S: SpiceLinkReply, CAP_PROTOCOL_AUTH_SELECTION in common caps
> - The client MUST reply with SpiceLinkAuthMechanism
> C: SpiceLinkAuthMechanism (with a matching CAP_AUTH)
>
> - SPICE_COMMON_CAP_AUTH_SPICE, the following steps and authentication
> mechanism are the same as with version 2.0: a RSA_public_encrypt()
> of the password is sent.
>
> This mechanism MUST be implemented in both client and server to
> comply with the SPICE protocol.
>
> - SPICE_COMMON_CAP_AUTH_SASL, the authentication exchange follows
> SASL protocol has defined in RFC 2222.
>
> This mechanism is OPTIONAL in both client and servers.
>
> Ex: AUTH selection, followed by SASL authentication
>
> AUTH Selection:
> C: SpiceLinkMess, CAP_PROTOCOL_AUTH_SELECTION + CAP_AUTH_SASL in common caps
> S: SpiceLinkReply, CAP_PROTOCOL_AUTH_SELECTION + CAP_AUTH_SASL in common caps
> - The client MUST reply with SpiceLinkAuthMechanism
> C: SpiceLinkAuthMechanism CAP_AUTH_SASL
>
> Init:
> S: u32 mechlist-length
> u8-array mechlist-string
>
> Start:
> C: u32 mechname-length
> u8-array mechname-string
> u32 clientout-length
> u8-array clientout-string
> S: u32 serverin-length
> u8-array serverin-string
> u8 continue
>
> Step: (while continue)
> C: u32 clientout-length
> u8-array clientout-string
> S: u32 serverin-length
> u8-array serverin-string
> u8 continue
>
> See also VNC SASL protocol description, which uses the same protocol:
>
> http://sourceforge.net/mailarchive/forum.php?thread_name=20100719125155.GA14166%40evileye.atkac.brq.redhat.com&forum_name=tigervnc-rfbproto
>
> Updated since v1 of this commit:
> - renamed s/SPICE_CHANNEL_CAP/SPICE_COMMON_CAP
> - added some note about mandatory vs optional mechanisms.
> ---
> spice/protocol.h | 10 ++++++++++
> 1 files changed, 10 insertions(+), 0 deletions(-)
>
> diff --git a/spice/protocol.h b/spice/protocol.h
> index d6a2041..26d964b 100644
> --- a/spice/protocol.h
> +++ b/spice/protocol.h
> @@ -51,6 +51,12 @@ typedef struct SPICE_ATTR_PACKED SpiceLinkHeader {
> uint32_t size;
> } SpiceLinkHeader;
>
> +enum {
> + SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION,
> + SPICE_COMMON_CAP_AUTH_SPICE,
> + SPICE_COMMON_CAP_AUTH_SASL,
> +};
> +
> typedef struct SPICE_ATTR_PACKED SpiceLinkMess {
> uint32_t connection_id;
> uint8_t channel_type;
> @@ -72,6 +78,10 @@ typedef struct SPICE_ATTR_PACKED SpiceLinkEncryptedTicket {
> uint8_t encrypted_data[SPICE_TICKET_KEY_PAIR_LENGTH / 8];
> } SpiceLinkEncryptedTicket;
>
> +typedef struct SPICE_ATTR_PACKED SpiceLinkAuthMechanism {
> + uint32_t auth_mechanism;
> +} SpiceLinkAuthMechanism;
> +
> typedef struct SPICE_ATTR_PACKED SpiceDataHeader {
> uint64_t serial;
> uint16_t type;
More information about the Spice-devel
mailing list