josekit 0.10.3

JOSE (Javascript Object Signing and Encryption) library for Rust.
Documentation
## RSA keypair

### Create RSA PKCS#8 PEM private key
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out rsa_2048_private.pem

### Generate RSA PKCS#8 PEM public key from RSA PKCS#8 PEM private key
openssl pkey -in rsa_2048_private.pem -pubout -outform PEM -out rsa_2048_public.pem

### Convert RSA private key from PKCS#8 PEM to PKCS#8 DER
openssl pkcs8 -nocrypt -in rsa_2048_private.pem -topk8 -outform DER -out rsa_2048_private.der

## Generate RSA PKCS#8 DER public key from RSA PKCS#8 PEM private key
openssl pkey -in rsa_2048_private.pem -pubout -outform DER -out rsa_2048_public.der

### Convert RSA private key from PKCS#8 DER to PKCS#8 PEM
openssl pkey -inform DER -in rsa_2048_private.der -out rsa_2048_private.pem

### Convert RSA private key from PKCS#8 PEM to PKCS#1 PEM
openssl pkcs8 -nocrypt -in rsa_2048_private.pem -traditional -out rsa_2048_pk1_private.pem

### Convert RSA private key from PKCS#8 PEM to PKCS#1 DER
openssl pkey -in rsa_2048_private.pem -outform DER -out rsa_2048_pk1_private.der

### Convert RSA private key from PKCS#1 PEM to PKCS#8 PEM
openssl pkcs8 -nocrypt -in rsa_2048_pk1_private.pem -topk8 -out rsa_2048_private.pem

### Generate RSA PKCS#1 PEM public key from RSA PKCS#8 PEM private key
openssl rsa -in rsa_2048_private.pem -RSAPublicKey_out -out rsa_2048_pk1_public.pem

### Generate RSA PKCS#1 DER public key from RSA PKCS#8 PEM private key
openssl rsa -in rsa_2048_private.pem -RSAPublicKey_out -outform DER -out rsa_2048_pk1_public.der

## ECDSA keypair

### Create ECDSA PKCS#8 PEM private key
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -outform PEM -out ecdsa_p256_private.pem
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-384 -outform PEM -out ecdsa_p384_private.pem
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-521 -outform PEM -out ecdsa_p521_private.pem
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp256k1 -outform PEM -out ecdsa_p521k_private.pem

### Generate ECDSA PKCS#8 PEM public key from ECDSA PKCS#8 PEM private key
openssl pkey -in ecdsa_p256_private.pem -pubout -outform PEM -out ecdsa_p256_public.pem

### Convert ECDSA private key from PKCS#8 PEM to PKCS#8 DER
openssl pkcs8 -nocrypt -in ecdsa_p256_private.pem -topk8 -outform DER -out ecdsa_p256_private.der

### Generate ECDSA PKCS#8 DER public key from ECDSA PKCS#8 PEM private key
openssl pkey -in ecdsa_p256_private.pem -pubout -outform DER -out ecdsa_p256_public.der

### Convert ECDSA private key from PKCS#8 DER to PKCS#8 PEM
openssl pkey -inform DER -in ecdsa_p256_private.der -out ecdsa_p256_private.pem

### Convert ECDSA private key from PKCS#8 PEM to PKCS#1 PEM
openssl pkcs8 -nocrypt -in ecdsa_p256_private.pem -traditional -out ecdsa_p256_pk1_private.pem

### Convert ECDSA private key from PKCS#8 PEM to PKCS#1 DER
openssl pkey -in ecdsa_p256_private.pem -outform DER -out ecdsa_p256_pk1_private.der

### Convert ECDSA private key from PKCS#1 PEM to PKCS#8 PEM
openssl pkcs8 -nocrypt -in ecdsa_p256_pk1_private.pem -topk8 -out ecdsa_p256_private.pem

## RSA-PSS keypair

### Create RSA-PSS PKCS#8 PEM private key
openssl genpkey -algorithm RSA-PSS -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_pss_keygen_md:sha256 -pkeyopt rsa_pss_keygen_mgf1_md:sha256 -pkeyopt rsa_pss_keygen_saltlen:32 -out rsapss_2048_sha256_pkcs8_private.pem
openssl genpkey -algorithm RSA-PSS -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_pss_keygen_md:sha384 -pkeyopt rsa_pss_keygen_mgf1_md:sha384 -pkeyopt rsa_pss_keygen_saltlen:48 -out rsapss_2048_sha384_pkcs8_private.pem
openssl genpkey -algorithm RSA-PSS -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_pss_keygen_md:sha512  -pkeyopt rsa_pss_keygen_mgf1_md:sha512 -pkeyopt rsa_pss_keygen_saltlen:64 -out rsapss_2048_sha512_pkcs8_private.pem

### Generate RSA-PSS PKCS#8 PEM public key from RSA PKCS#8 PEM private key
openssl pkey -in rsapss_2048_sha256_pkcs8_private.pem -pubout -outform PEM -out rsapss_2048_sha256_spki_public.pem
openssl pkey -in rsapss_2048_sha384_pkcs8_private.pem -pubout -outform PEM -out rsapss_2048_sha384_spki_public.pem
openssl pkey -in rsapss_2048_sha512_pkcs8_private.pem -pubout -outform PEM -out rsapss_2048_sha512_spki_public.pem

### Convert RSA-PSS private key from PKCS#8 PEM to PKCS#8 DER
openssl pkcs8 -nocrypt -in rsapss_2048_sha256_pkcs8_private.pem -topk8 -outform DER -out rsapss_2048_sha256_pkcs8_private.der
openssl pkcs8 -nocrypt -in rsapss_2048_sha384_pkcs8_private.pem -topk8 -outform DER -out rsapss_2048_sha384_pkcs8_private.der
openssl pkcs8 -nocrypt -in rsapss_2048_sha512_pkcs8_private.pem -topk8 -outform DER -out rsapss_2048_sha512_pkcs8_private.der

### Generate RSA-PSS PKCS#8 DER public key from RSA-PSS PKCS#8 PEM private key
openssl pkey -in rsapss_2048_sha256_pkcs8_private.pem -pubout -outform DER -out rsapss_2048_sha256_spki_public.der
openssl pkey -in rsapss_2048_sha384_pkcs8_private.pem -pubout -outform DER -out rsapss_2048_sha384_spki_public.der
openssl pkey -in rsapss_2048_sha512_pkcs8_private.pem -pubout -outform DER -out rsapss_2048_sha512_spki_public.der

### Convert RSA-PSS private key from PKCS#8 DER to PKCS#8 PEM
openssl pkey -inform DER -in rsapss_2048_sha256_private.der -out rsapss_2048_sha256_private.pem

### Convert RSA-PSS private key from PKCS#8 PEM to traditional PKCS#8 PEM
openssl pkcs8 -nocrypt -in rsapss_2048_sha256_pkcs8_private.pem -traditional -out rsapss_2048_pkcs1_private.pem

### Convert RSA-PSS private key from PKCS#8 PEM to PKCS#1 DER
Unknown

### Convert RSA-PSS private key from PKCS#1 PEM to PKCS#8 PEM
openssl pkcs8 -nocrypt -in rsapss_2048_sha256_pkcs1_private.pem -topk8 -out rsapss_2048_sha256_pkcs8_private.pem

## EdDSA keypair

### Create EdDSA PKCS#8 PEM private key
openssl genpkey -algorithm ED25519 -out ED25519_pkcs8_private.pem
openssl genpkey -algorithm ED448 -out ED448_pkcs8_private.pem

### Generate EdDSA PKCS#8 PEM public key from EdDSA PKCS#8 PEM private key
openssl pkey -in ED25519_pkcs8_private.pem -pubout -outform PEM -out ED25519_spki_public.pem
openssl pkey -in ED448_pkcs8_private.pem -pubout -outform PEM -out ED448_spki_public.pem

### Convert EdDSA private key from PKCS#8 PEM to PKCS#8 DER
openssl pkcs8 -nocrypt -in ED25519_pkcs8_private.pem -topk8 -outform DER -out ED25519_pkcs8_private.der
openssl pkcs8 -nocrypt -in ED448_pkcs8_private.pem -topk8 -outform DER -out ED448_pkcs8_private.der

### Generate EdDSA PKCS#8 DER public key from EdDSA PKCS#8 PEM private key
openssl pkey -in ED25519_pkcs8_private.pem -pubout -outform DER -out ED25519_spki_public.der
openssl pkey -in ED448_pkcs8_private.pem -pubout -outform DER -out ED448_spki_public.der

### Convert EdDSA private key from PKCS#8 PEM to PKCS#8 Traditional PEM
openssl pkcs8 -nocrypt -in ED25519_pkcs8_private.pem -traditional -out ED25519_pkcs8_private_traditional.pem
openssl pkcs8 -nocrypt -in ED448_pkcs8_private.pem -traditional -out ED448_pkcs8_private_traditional.pem

## ECx keypair

### Create ECx PKCS#8 PEM private key
openssl genpkey -algorithm X25519 -out X25519_pkcs8_private.pem
openssl genpkey -algorithm X448 -out X448_pkcs8_private.pem

### Generate ECx PKCS#8 PEM public key from ECx PKCS#8 PEM private key
openssl pkey -in X25519_pkcs8_private.pem -pubout -outform PEM -out X25519_spki_public.pem
openssl pkey -in X448_pkcs8_private.pem -pubout -outform PEM -out X448_spki_public.pem

### Convert ECx private key from PKCS#8 PEM to PKCS#8 DER
openssl pkcs8 -nocrypt -in X25519_pkcs8_private.pem -topk8 -outform DER -out X25519_pkcs8_private.der
openssl pkcs8 -nocrypt -in X448_pkcs8_private.pem -topk8 -outform DER -out X448_pkcs8_private.der

### Generate ECx PKCS#8 DER public key from ECx PKCS#8 PEM private key
openssl pkey -in X25519_pkcs8_private.pem -pubout -outform DER -out X25519_spki_public.der
openssl pkey -in X448_pkcs8_private.pem -pubout -outform DER -out X448_spki_public.der

### Convert ECx private key from PKCS#8 PEM to PKCS#8 Traditional PEM
openssl pkcs8 -nocrypt -in X25519_pkcs8_private.pem -traditional -out X25519_pkcs8_private_traditional.pem
openssl pkcs8 -nocrypt -in X448_pkcs8_private.pem -traditional -out X448_pkcs8_private_traditional.pem


PrivateKeyInfo ::= SEQUENCE {
    version             INTEGER,
    privateKeyAlgorithm AlgorithmIdentifier,
    privateKey          OCTET STRING,
    attributes          SET OF Attribute OPTIONAL
}

https://tools.ietf.org/html/rfc8017#appendix-A.1.2
RSAPrivateKey SEQUENCE {
    version           INTEGER,  -- 0
    modulus           INTEGER,  -- n
    publicExponent    INTEGER,  -- e
    privateExponent   INTEGER,  -- d
    prime1            INTEGER,  -- p
    prime2            INTEGER,  -- q
    exponent1         INTEGER,  -- d mod (p-1)
    exponent2         INTEGER,  -- d mod (q-1)
    coefficient       INTEGER,  -- (inverse of q) mod p
    otherPrimeInfos   SEQUENCE OPTIONAL {
        prime             INTEGER,  -- ri
        exponent          INTEGER,  -- di
        coefficient       INTEGER   -- ti
    }
}

SubjectPublicKeyInfo  ::=  SEQUENCE {
   algorithm            AlgorithmIdentifier,
   subjectPublicKey     BIT STRING
}

https://tools.ietf.org/html/rfc8017#appendix-A.1.1
RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}

const key_pair = await window.crypto.subtle.generateKey(
    {
        name: "RSA-OAEP",
        modulusLength: 2048, // 1024, 2048 or 4096
        publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
        hash: {name: "SHA-256"} // SHA-256, SHA-384 or SHA-512
    },
    true,
    ["encrypt", "decrypt"]
);
btoa(String.fromCharCode(...new Uint8Array(await window.crypto.subtle.exportKey("pkcs8", key_pair.privateKey))));
btoa(String.fromCharCode(...new Uint8Array(await window.crypto.subtle.exportKey("spki", result.publicKey))));