- From: David Dahl <ddahl@mozilla.com>
- Date: Mon, 28 Jan 2013 16:49:13 -0800 (PST)
- To: Ryan Sleevi <sleevi@google.com>
- Cc: public-webcrypto <public-webcrypto@w3.org>
----- Original Message -----
> From: "Ryan Sleevi" <sleevi@google.com>
> To: "David Dahl" <ddahl@mozilla.com>
> Cc: "public-webcrypto" <public-webcrypto@w3.org>
> Sent: Monday, January 28, 2013 3:56:20 PM
> Subject: Re: An initial editor's draft: high-level API
...
> I would recommend a Promises-like implementation, similar to what was
> adopted in the low-level API. Having the factory object have multiple
> independent methods is a pretty bad code-smell.
>
> var promise = window.crypto.highlevel.protect("a", ...);
> promise.oncomplete = function(...) {}
> promise.onerror = function(...) {}
>
Ok, that is better yet. I'll have to figure out the WebIDL for that.
> Then just 'start' the event in the next turn. This is also the
> example
> used by IndexedDB (via the *Operation/*OperationSync objects).
>
> Presumably in a worker you could do
> promise.wait();
> (to start and/or) to wait for synchronous completion
>
Ah, cool.
> >
> >>
> >> In onProtectComplete and onProtectError, how do I know which was
> >> the
> >> good message and which was the bad message? Am I relying on the
> >> ordering of the calls?
> > Perhaps "onProtectComplete" should be re-named "onProtectSuccess"
>
> That wasn't the concern I had. It was more to the fact that one may
> succeed, one may fail, and I didn't see a way to disambiguate between
> them. The fact that highlevel is a constructed object makes it
> somewhat clearer, but the API as spec'd doesn't make it clear if only
> one operation-per-object in flight is permitted at a time.
>
> eg, is the following code valid:
>
> var obj = window.crypto.highlevel();
> obj.onProtectComplete = function (...) {}
> obj.onProtectError = function (...) {}
> obj.protect("a", ...);
> obj.protect("b", ...);
>
OK, I have updated the draft, I specifically added each callback's IDL before the interface IDL, but will update for a promises-like interface tomorrow.
>
> >
> >>
> >> 3) This does not seem to actually be high-level, in that it still
> >> forces the caller to make decisions about algorithms throughout
> >> the
> >> API, a point which I understood the high level was intentionally
> >> intending to entirely abstract. You do not, for example, want to
> >> encourage developers to use PKCS#1 v1.5 in new applications, but
> >> that's effectively what this API does (as PKCS#1 v1.5 is the only
> >> REQUIRED to implement in JOSE). What is the motivation for this,
> >> and
> >> is this necessary? Isn't it better to hide these security
> >> parameters
> >> entirely, and let the user agent make the most informed security
> >> decision based on the security policy of the browser?
> >
> > I have been thinking about how to allow JOSE interop and also not
> > require the user to make decisions about algorithms. Perhaps the
> > browser makes all of the algorithm decisions, with the ability to
> > optionally specify a JOSE algorithm. Also, the public keys are
> > returned as JWKs indicating (some) JOSE interop. I also want this
> > API to operate at a higher level. I hope Richard and Mike weigh in
> > here.
>
> I think if we want to talk about high-level, then the developer
> should
> not be exposed to algorithms. It should just project messages.
>
I made the key gen joseAlg optional for now, but can just assume we remove it altogether.
> Rather than treating interop between the client/server as a decision
> to be solved for every application, treat interop as an issue between
> the server & the user agent. That is, don't require the client
> application to worry about crypto at all.
gotcha.
>
> >
> >> 4) You've specified a hash interface, but this seems entirely
> >> redundant with the existing specification, which already permits
> >> JOSE
> >> algorithms.
> > I would not be opposed to removing hash()
> >
> >> 5) onProtect takes arguments in the form (aPlaintext, aJOSEAlg),
> >> but
> >> onUnprotect takes them in (aKeyID, aPlaintext).
> >> a) Shouldn't onUnprotect's argument be named aCiphertext
> > Yes.
> >
> >> b) Shouldn't the order of the arguments be symmetrical between
> >> the
> >> the API
> > Yes.
> >
> >> 6) Same for the lack of symmetry between sign()/verify()
> > Yes. Also, it may also make sense to drop sign and verify
> > altogether.
>
> Depends.
>
> NaCL ( http://nacl.cr.yp.to/index.html ) provides the following (with
> the low-level web crypto equivalents):
> 1) Public/Private key encryption (eg: RSA-OAEP)
> 2) Public/Private key signatures (eg: RSA-PSS)
> 3) Secret key authenticated encryption (eg: AES-GCM)
> 4) Secret key streaming encryption (eg: RC4)
> 5) Secret key authentication (eg: HMAC)
>
> SJCL ( http://crypto.stanford.edu/sjcl/ ) provides the following:
> 1) Password-based key derivation
> 2) Authenticated encryption (CCM & OFB2 - the latter with patent
> concerns, despite Rogaway's comments)
> 3) A convenience function that combines these two into "password",
> "data", with a 'secure' set of default params
>
> >
> >> 7) You make use of DOMString in the following methods:
> >> a) encryptAndSign (aPlainText)
> >> b) protect (aPlaintext)
> >> c) unprotect (aPlaintext - see 5)
> >> d) sign (aClearData)
> >> e) verify (aDataToVerify)
> >> How is this data supposed to be canonicalized? How is arbitrary
> >> binary
> >> data supposed to be encoded? What about decoded?
> >
> > While I would like to make the interface as simple as possible
> > (using strings), this is an issue that may require the use of
> > ArrayBufferViews after all. I am unsure how to make DOMStrings
> > viable here.
>
> http://encoding.spec.whatwg.org/ ?
>
> >
> > Thank for the feedback and pointing out errors! I will update the
> > draft accordingly. Also, __agl on twitter suggested I use "seal"
> > and "open" for "protect" and "unprotect". I think these are better
> > names.
>
> +1
>
I changed them already as well. Removed hash and simplified a bunch of other stuff.
Received on Tuesday, 29 January 2013 00:49:41 UTC