public inbox for iwd@lists.linux.dev
 help / color / mirror / Atom feed
From: James Prestwood <prestwoj@gmail.com>
To: Denis Kenzior <denkenz@gmail.com>, iwd@lists.linux.dev
Subject: Re: [PATCH v3 6/9] doc: PKEX support for DPP
Date: Fri, 3 Nov 2023 04:24:51 -0700	[thread overview]
Message-ID: <0cbc142f-948f-4778-b5b3-7b9bd42e4393@gmail.com> (raw)
In-Reply-To: <3eb37cc3-431a-45cf-95d9-8b2386f75d0d@gmail.com>

Hi Denis,

On 11/2/23 7:07 PM, Denis Kenzior wrote:
> Hi James,
> 
> On 10/31/23 13:47, James Prestwood wrote:
>> PKEX is part of the WFA EasyConnect specification and is
>> an additional boostrapping method (like QR codes) for
>> exchanging public keys between a configurator and enrollee.
>>
>> PKEX operates over wifi and requires a key/code be exchanged
>> prior to the protocol. The key is used to encrypt the exchange
>> of the boostrapping information, then DPP authentication is
>> started immediately aftewards.
>>
>> This can be useful for devices which don't have the ability to
>> scan a QR code, or even as a more convenient way to share
>> wireless credentials if the PSK is very secure (i.e. not a
>> human readable string).
>>
>> PKEX would be used via the three DBus APIs on a new interface
>> SharedCodeDeviceProvisioning.
>>
>> ConfigureEnrollee(a{sv}) will start a configurator with a
>> static shared code (optionally identifier) passed in as the
>> argument to this method.
>>
>> StartEnrollee(a{sv}) will start a PKEX enrollee using a static
>> shared code (optionally identifier) passed as the argument to
>> the method.
>>
>> StartConfigurator() will start a PKEX configurator (should be
>> already registered) which will query an agent for an enrollees
>> shared code. Enrollees are distinguished by the identifier.
>>
>> After the PKEX protocol is finished, DPP bootstrapping keys have
>> been exchanged and DPP Authentication will start, followed by
>> configuration.
>> ---
>>   doc/device-provisioning-api.txt | 149 ++++++++++++++++++++++++++++++++
>>   1 file changed, 149 insertions(+)
>>
>> diff --git a/doc/device-provisioning-api.txt 
>> b/doc/device-provisioning-api.txt
>> index ac204f46..3c6fc74e 100644
>> --- a/doc/device-provisioning-api.txt
>> +++ b/doc/device-provisioning-api.txt
>> @@ -71,3 +71,152 @@ Properties    boolean Started [readonly]
>>               Indicates the DPP URI. This property is only available
>>               when Started is true.
>> +
>> +
>> +Interface    net.connman.iwd.SharedCodeDeviceProvisioning [Experimental]
>> +Object path    /net/connman/iwd/{phy0,phy1,...}/{1,2,...}
>> +
>> +        ConfigureEnrollee(a{sv})
>> +
>> +            Starts a DPP configurator using a shared code (and
>> +            optionally identifier) set in the dictionary argument.
>> +            Valid dictionary keys are:
>> +
>> +            string Code
>> +                The shared code to use. The code used by both
>> +                parties (configurator and enrollee) must match.
>> +
>> +            string Identifier
>> +                An optional identifier. The identifier used by
>> +                both parties must match. Per the DPP spec the
>> +                identifier "shall be a UTF-8 string not greater
>> +                than eighty (80) octets"
>> +
>> +            As with the DeviceProvisioning interface, configurators
>> +            must be connected to the network they wish to configure
>> +            in order to start.
>> +
>> +            Once started a configurator (acting as a responder) will
>> +            listen on the currently connected channel for an
>> +            enrollee's initial exchange request which will kick off
>> +            the shared code bootstrapping protocol (PKEX). Once
>> +            completed DPP will start automatically. Only one
>> +            enrollee can be configured per call to
>> +            ConfigureEnrollee, i.e. once PKEX/DPP is has finished
> 
> "is has finished"?
> 
>> +            (including failure) the configurator will stop.
>> +
>> +            The SharedCode methods have an eventual timeout and will
>> +            stop automatically after 2 minutes.
>> +
>> +            Possible errors:    net.connman.iwd.Busy
>> +                        net.connman.iwd.NotConnected
>> +                        net.connman.InvalidArguments
>> +
>> +        StartEnrollee(a{sv})
>> +
>> +            Starts a DPP enrollee using a shared code (and
>> +            optionally identifier) set in the dictionary argument
>> +            (described above in ConfigureEnrollee).
>> +
>> +            As with the device provisioning interface, enrollees
>> +            must be disconnected in order to start.
>> +
>> +            Once started an enrollee (acting as an initiator) will
>> +            iterate channels sending out broadcast exchange requests
>> +            waiting for a response from a configurator. A response
>> +            will kick off the shared code bootstrapping protocol
>> +            (PKEX), followed by DPP if successful. Once the
>> +            protocols have completed, or failed, the enrollee will
>> +            stop. If failed, StartEnrollee will need to be called
>> +            again to retry.
>> +
>> +            Possible errors:    net.connman.iwd.Busy
>> +                        net.connman.iwd.InvalidArguments
>> +
>> +        StartConfigurator()
> 
> You are missing return parameters for all of these methods.  Also seems 
> like Stop() method isn't documented.
> 
>> +
>> +            Start a shared code configurator using an agent to
>> +            obtain the shared code. This method is meant for an
>> +            automated use case where a configurator is capable of
>> +            configuring multiple enrollees, and distinguishing
>> +            between them by their identifier.
>> +
>> +            Prior to calling, a SharedCodeAgent must be registered
>> +            using RegisterSharedCodeAgent. Only a single agent can
>> +            be registered per SharedCodeInterface.
> 
> So the one thing to watch out for is that DPP interface can come and go, 
> unlike the Manager interface.  Since StartConfigurator() has to be 
> called for each protocol attempt, providing the agent as an argument 
> might be be a nicer shortcut?  The API is marked experimental, so we can 
> always change this.  You will probably know more once you try to 
> implement the API.

I had that thought too but was just keeping things consistent. But I'm 
fine removing the register APIs and just passing the path here.

> 
> Also, it seems to me that StartConfigurator implies that the agent is 
> active. If the agent goes away, StartConfigurator() should be aborted, no?

Yes, probably not a bad idea.

> 
>> +
>> +            This method behaves nearly the same as ConfigureEnrollee
>> +            except upon receiving an enrollees first exchange
>> +            request the registered agent will be asked for the
>> +            shared code using the RequestSharedCode method.
>> +
>> +            Though the agent can provide shared codes for multiple
>> +            enrollees, this method will only configure a single
>> +            enrollee at a time. Once completed it will need to be
>> +            called again to configure additional enrollees.
>> +
>> +            Possible errors:    net.connman.iwd.Busy
>> +                        net.connman.iwd.NotConnected
>> +                        net.connman.iwd.NoAgent
>> +
>> +        void RegisterSharedCodeAgent(object path)
>> +
>> +            Register the agent object for servicing shared code
>> +            requests on the net.connman.iwd.SharedCodeAgent
>> +            interface. There may only be one agent registered at a
>> +            time per SharedCodeDeviceProvisioning interface.
>> +
>> +            Possible Errors:    [service].Error.InvalidArguments
>> +                        [service].Error.AlreadyExists
>> +
>> +        void UnregisterSharedCodeAgent()
>> +
>> +            Unregister an existing agent.
>> +
>> +            Possible Errors:    [service].Error.NotFound
>> +
>> +Properties    boolean Started [readonly]
>> +
>> +            True if shared code device provisioning is currently
>> +            active. (configurator or enrollee is started)
>> +
>> +        string Role [readonly, optional]
>> +
>> +            Indicates the DPP role. Possible values are "enrollee"
>> +            or "configurator". This property is only available when
>> +            Started is true.
>> +
>> +SharedCodeAgent hierarchy
>> +=========================
>> +
>> +Service        unique name
>> +Interface    net.connman.iwd.SharedCodeAgent [Experimental]
>> +Object path    freely definable
>> +
>> +Methods        void Release() [noreply]
>> +
>> +            This method gets called when the service daemon
>> +            unregisters the agent.
> 
> You don't actually call this method.
> 
>> +
>> +        string RequestSharedCode(object network, string identifier)
>> +
>> +            This method gets called when a shared code is requested
>> +            for a particular enrollee, distingushed by the
>> +            identifier. The shared code agent should lookup the
>> +            identifier and return the shared code, or return an
>> +            error if not found.
> 
> Looks like you don't actually call the agent with the network object?

Yeah, this was a mistake, there should just be the one string argument.

> 
>> +
>> +            Possible Errors:    [service].Error.Canceled
>> +                        [service].Error.NotFound
>> +
>> +        void Cancel(string reason) [noreply]
>> +
>> +            This method gets called to indicate that the agent
>> +            request failed before a reply was returned. The
>> +            argument will indicate why the request is being
>> +            cancelled and may be "user-canceled", "timed-out" or
>> +            "shutdown".
> 
> You don't call this method either.
>> +
>> +Examples    Requesting a shared code for an enrollee identified by "foo"
>> +
>> +            RequestSharedCode("foo") ==> "super_secret_code"
> 
> This signature incorrect as well?
> 
> Regards,
> -Denis

  reply	other threads:[~2023-11-03 11:24 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-31 18:47 [PATCH v3 0/9] DPP PKEX Changes James Prestwood
2023-10-31 18:47 ` [PATCH v3 1/9] dpp: remove scan_periodic_stop calls James Prestwood
2023-11-03  1:40   ` Denis Kenzior
2023-10-31 18:47 ` [PATCH v3 2/9] dpp: fix config request header check James Prestwood
2023-10-31 18:47 ` [PATCH v3 3/9] dpp: allow enrollee to be authentication initiator James Prestwood
2023-10-31 18:47 ` [PATCH v3 4/9] dbus: add net.connman.iwd.SharedCodeAgent DBus interface James Prestwood
2023-10-31 18:47 ` [PATCH v3 5/9] station: provide new state in __station_connect_network James Prestwood
2023-10-31 18:47 ` [PATCH v3 6/9] doc: PKEX support for DPP James Prestwood
2023-11-03  2:07   ` Denis Kenzior
2023-11-03 11:24     ` James Prestwood [this message]
2023-10-31 18:47 ` [PATCH v3 7/9] dpp: SharedCode interface, {Register,Unregister}SharedCodeAgent James Prestwood
2023-11-03  2:09   ` Denis Kenzior
2023-10-31 18:47 ` [PATCH v3 8/9] dpp: initial version of PKEX enrollee support James Prestwood
2023-11-03  2:12   ` Denis Kenzior
2023-11-03 11:27     ` James Prestwood
2023-10-31 18:47 ` [PATCH v3 9/9] dpp: initial version of PKEX configurator support James Prestwood

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0cbc142f-948f-4778-b5b3-7b9bd42e4393@gmail.com \
    --to=prestwoj@gmail.com \
    --cc=denkenz@gmail.com \
    --cc=iwd@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox