BeyondCodeBootcamp / BeyondCodeBootcamp/passkeys

doc: COSE -> JWK Mappings

Đang mở
#7 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
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

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.