BeyondCodeBootcamp / BeyondCodeBootcamp/passkeys
doc: COSE -> JWK Mappings
- Ngôn ngữ chính
- JavaScript
- Star
- 2
- Fork
- 1
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
**Note**:
- **Browser** WebCrypto only supports **P-256**
- https://caniuse.com/mdn-api_subtlecrypto_sign_ed25519
- **Node** `node:crypto` and WebCrypto also supports **Ed25519** and **secp256k1** (as just `SHA256`) - whatever is supported by openssl v3
- https://nodejs.org/docs/latest/api/webcrypto.html#algorithm-matrix
- https://nodejs.org/docs/latest/api/crypto.html#cryptocreatesignalgorithm-options
- `openssl list -digest-algorithms` (TL;DR: always use `SHA256`)
- `openssl ecparam -list_curves` (`secp256k1`, `prime256v1: X9.62/SECG`, a.k.a `secp256r1` a.k.a. `P-256`)
- `openssl list -public-key-algorithms` (`1.3.101.112, ED25519`, `1.2.840.10045.2.1, EC, id-ecPublicKey`)
#### Node WebCrypto Key Gen Example
```js
'use strict';
let Fs = require('node:fs/promises');
async function generateKeyPair(algo) {
let keyPair = await crypto.subtle.generateKey(algo, true, ['sign', 'verify']);
let privateKeyAb = await crypto.subtle.exportKey('pkcs8', keyPair.privateKey);
let privateKeyDER = new Uint8Array(privateKeyAb);
let privateKeyPath = `./key.${algo.name}.der`.toLowerCase();
await Fs.writeFile(privateKeyPath, privateKeyDER);
let publicKeyAb = await crypto.subtle.exportKey('spki', keyPair.publicKey);
let publicKeyDER = new Uint8Array(publicKeyAb);
let publicKeyPath = `./pub.${algo.name}.der`.toLowerCase();
await Fs.writeFile(publicKeyPath, publicKeyDER);
console.info(`Key pair generated and saved as ${privateKeyPath} and ${publicKeyPath}`);
}
async function main() {
await generateKeyPair({ name: 'Ed25519' });
await generateKeyPair({ name: 'ECDSA', namedCurve: 'P-256' });
}
main().catch(function (err) {
console.error(err.stack);
process.exit(1);
});
```
Adapted From
### OKP (EdDSA / ed25519)
| Key Type | Name | COSE Label | Type | Description | Reference |
| --- | --- | --- | --- | --- | --- |
| 1 | crv | -1 | int / tstr | EC identifier | [RFC9053] |
| 1 | x | -2 | bstr | Public Key | [RFC9053] |
| 1 | d | -4 | bstr | Private key | [RFC9053] |
### EC (ECDSA, secp256k1)
| Key Type | Name | COSE Label | Type | Description | Reference |
| --- | --- | --- | --- | --- | --- |
| 2 | crv | -1 | int / tstr | EC identifier | [RFC9053] |
| 2 | x | -2 | bstr | x-coordinate | [RFC9053] |
| 2 | y | -3 | bstr / bool | y-coordinate | [RFC9053] |
### Modern Keypairs
These are the key types that are still relevant in 2024+ and will be relevant for the next decade:
```js
let coseMap = {
"keys": {
"kty": 1,
"alg": 3
},
"okp": {
"crv": "-1",
"x": "-2",
"d": "-4"
},
"ec": {
"crv": "-1",
"x": "-2",
"y": "-3",
"d": "-4"
},
"kty": {
"1": "OKP",
"2": "EC"
},
"alg": {
"-47": "ES256K",
"-8": "EdDSA",
"-7": "ES256"
},
"crv": {
"1": "P-256",
"6": "Ed25519",
"8": "secp256k1"
}
};
```
### Legacy Keypairs
```js
let coseMap = {
"keys": {
"kty": 1,
"alg": 3
},
"okp": {
"crv": "-1",
"x": "-2",
"d": "-4"
},
"ec": {
"crv": "-1",
"x": "-2",
"y": "-3",
"d": "-4"
},
"rsa": {
"n": "-1",
"e": "-2",
"d": "-3",
"p": "-4",
"q": "-5",
"dp": "-6",
"dq": "-7",
"qi": "-8"
},
"kty": {
"1": "OKP",
"2": "EC",
"3": "RSA"
},
"alg": {
"-259": "RS512",
"-258": "RS384",
"-257": "RS256",
"-39": "PS512",
"-38": "PS384",
"-37": "PS256",
"-36": "ES512",
"-35": "ES384",
"-47": "ES256K",
"-8": "EdDSA",
"-7": "ES256"
},
"crv": {
"1": "P-256",
"2": "P-384",
"3": "P-521",
"6": "Ed25519",
"8": "secp256k1"
}
};
```
### RSA (legacy)
RSA's not bad or broken, it's just not efficient.
| Key Type | Name | COSE Label | Type | Description | Reference |
| --- | --- | --- | --- | --- | --- |
| 3 | n | -1 | bstr | RSA modulus `n` | [RFC8230] |
| 3 | e | -2 | bstr | RSA public exponent `e` | [RFC8230] |
| 3 | d | -3 | bstr | RSA private exponent `d` | [RFC8230] |
| 3 | p | -4 | bstr | Prime factor `p` of `n` | [RFC8230] |
| 3 | q | -5 | bstr | Prime factor `q` of `n` | [RFC8230] |
| 3 | dP | -6 | bstr | `dP` is `d` mod (`p - 1`) | [RFC8230] |
| 3 | dQ | -7 | bstr | `dQ` is `d` mod (`q - 1`) | [RFC8230] |
| 3 | qInv | -8 | bstr | CRT coefficient `q^(-1)` mod `p` | [RFC8230] |
| 3 | other | -9 | array | Other prime infos, an array | [RFC8230] |
| 3 | r_i | -10 | bstr | Prime factor `r_i` of `n`, where `i >= 3` | [RFC8230] |
| 3 | d_i | -11 | bstr | `d_i = d` mod (`r_i - 1`) | [RFC8230] |
| 3 | t_i | -12 | bstr | CRT coefficient `t_i = (r_1 * r_2 * ... * r_(i-1))^(-1)` mod `r_i` | [RFC8230] |
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Hướng nghiên cứu
Bắt đầu bằng cách xem xét các bảng ánh xạ COSE/JWK và các tài liệu tham khảo IANA, RFC, Node WebCrypto và caniuse được liên kết. Xác định nơi tài liệu của repository này trình bày các loại khóa passkey, sau đó ghi lại các ánh xạ hiện đại và cũ đã thống nhất cùng với thông tin hỗ trợ trên trình duyệt và Node. Công việc được xem là hoàn tất khi các ánh xạ và ghi chú về khả năng tương thích đầy đủ và nhất quán trong nội bộ.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- javascript
- Lĩnh vực
- authentication, documentation, security
- Loại issue
- Tài liệu
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Cần làm rõ
- Mức phù hợp với người mới
- 25/100