keygen elementautofocuschallengedisabledformkeytypenameinterface HTMLKeygenElement : HTMLElement {
           attribute boolean autofocus;
           attribute DOMString challenge;
           attribute boolean disabled;
  readonly attribute HTMLFormElement? form;
           attribute DOMString keytype;
           attribute DOMString name;
  readonly attribute DOMString type;
  readonly attribute boolean willValidate;
  readonly attribute ValidityState validity;
  readonly attribute DOMString validationMessage;
  boolean checkValidity();
  void setCustomValidity(DOMString error);
  readonly attribute NodeList labels;
};
   The keygen element represents a key
  pair generator control. When the control's form is submitted, the
  private key is stored in the local keystore, and the public key is
  packaged and sent to the server.
The challenge attribute
  may be specified. Its value will be packaged with the submitted
  key.
The keytype
  attribute is an enumerated attribute. The following
  table lists the keywords and states for the attribute — the
  keywords in the left column map to the states listed in the cell in
  the second column on the same row as the keyword. User agents are
  not required to support these values, and must only recognize values
  whose corresponding algorithms they support.
| Keyword | State | 
|---|---|
 rsa
      | RSA | 
The invalid value default state is the unknown state. The missing value default state is the RSA state, if it is supported, or the unknown state otherwise.
This specification does not specify what key types user agents are to support — it is possible for a user agent to not support any key types at all.
The user agent may expose a user interface for each
  keygen element to allow the user to configure settings
  of the element's key pair generator, e.g. the key length.
The reset
  algorithm for keygen elements is to set these
  various configuration settings back to their defaults.
The element's value is the string returned from the following algorithm:
Use the appropriate step from the following list:
keytype
     attribute is in the RSA stateGenerate an RSA key pair using the settings given by the
      user, if appropriate, using the md5WithRSAEncryption RSA signature algorithm
      (the signature algorithm with MD5 and the RSA encryption
      algorithm) referenced in section 2.2.1 ("RSA Signature
      Algorithm") of RFC 3279, and defined in RFC 2313. [RFC3279] [RFC2313]
keytype attribute is in the unknown stateThe given key type is not supported. Return the empty string and abort this algorithm.
Let private key be the generated private key.
Let public key be the generated public key.
Let signature algorithm be the selected signature algorithm.
If the element has a challenge attribute, then let
    challenge be that attribute's value.
    Otherwise, let challenge be the empty
    string.
Let algorithm be an ASN.1 AlgorithmIdentifier structure as defined by
    RFC 5280, with the algorithm field giving the
    ASN.1 OID used to identify signature
    algorithm, using the OIDs defined in section 2.2 ("Signature
    Algorithms") of RFC 3279, and the parameters
    field set up as required by RFC 3279 for AlgorithmIdentifier structures for that
    algorithm. [X690] [RFC5280] [RFC3279]
Let spki be an ASN.1 SubjectPublicKeyInfo structure as defined by
    RFC 5280, with the algorithm field set to the
    algorithm structure from the previous step,
    and the subjectPublicKey field set to the
    BIT STRING value resulting from ASN.1 DER encoding the public key. [X690] [RFC5280]
Let publicKeyAndChallenge be an ASN.1
    PublicKeyAndChallenge structure as defined below,
    with the spki field set to the spki structure from the previous step, and the
    challenge field set to the string challenge obtained earlier. [X690]
Let signature be the BIT STRING value resulting from ASN.1 DER encoding the signature generated by applying the signature algorithm to the byte string obtained by ASN.1 DER encoding the publicKeyAndChallenge structure, using private key as the signing key. [X690]
Let signedPublicKeyAndChallenge be an ASN.1
    SignedPublicKeyAndChallenge structure as defined
    below, with the publicKeyAndChallenge field
    set to the publicKeyAndChallenge structure,
    the signatureAlgorithm field set to the algorithm structure, and the signature field set to the BIT STRING signature from the previous step. [X690]
Return the result of base64 encoding the result of ASN.1 DER encoding the signedPublicKeyAndChallenge structure. [RFC4648] [X690]
The data objects used by the above algorithm are defined as follows. These definitions use the same "ASN.1-like" syntax defined by RFC 5280. [RFC5280]
PublicKeyAndChallenge ::= SEQUENCE {
    spki SubjectPublicKeyInfo,
    challenge IA5STRING
}
SignedPublicKeyAndChallenge ::= SEQUENCE {
    publicKeyAndChallenge PublicKeyAndChallenge,
    signatureAlgorithm AlgorithmIdentifier,
    signature BIT STRING
}
  Constraint validation: The keygen
  element is barred from constraint validation.
The form attribute is used to
  explicitly associate the keygen element with its
  form owner. The name
  attribute represents the element's name. The disabled attribute is used to make
  the control non-interactive and to prevent its value from being
  submitted. The autofocus
  attribute controls focus.
typeReturns the string "keygen".
The challenge IDL
  attribute must reflect the content attribute of the
  same name.
The keytype
  IDL attribute must reflect the content attribute of the
  same name, limited to only known values.
The type IDL
  attribute must return the value "keygen".
The willValidate, validity, and validationMessage
  attributes, and the checkValidity() and setCustomValidity()
  methods, are part of the constraint validation API. The
  labels attribute provides a list
  of the element's labels. The autofocus, disabled, form, and name IDL attributes are part of the
  element's forms API.
This specification does not specify how the private
  key generated is to be used. It is expected that after receiving the
  SignedPublicKeyAndChallenge (SPKAC) structure, the
  server will generate a client certificate and offer it back to the
  user for download; this certificate, once downloaded and stored in
  the key store along with the private key, can then be used to
  authenticate to services that use TLS and certificate
  authentication.
To generate a key pair, add the private key to the user's key store, and submit the public key to the server, markup such as the following can be used:
<form action="processkey.cgi" method="post" enctype="multipart/form-data"> <p><keygen name="key"></p> <p><input type=submit value="Submit key..."></p> </form>
The server will then receive a form submission with a packaged
   RSA public key as the value of "key". This
   can then be used for various purposes, such as generating a client
   certificate, as mentioned above.