v1.0.0: 💯 fully functional
This commit is contained in:
parent
73aac4bff4
commit
9f7b97f192
23
README.md
23
README.md
|
@ -8,7 +8,7 @@ and [Greenlock.js](https://git.coolaj86.com/coolaj86/greenlock.js)
|
|||
RSA tools. Lightweight. Zero Dependencies. Universal compatibility.
|
||||
|
||||
* [x] PEM-to-JWK
|
||||
* [ ] JWK-to-PEM (in progress)
|
||||
* [x] JWK-to-PEM
|
||||
* [x] SSH "pub" format
|
||||
|
||||
<!-- This project is fully functional and tested (and the code is pretty clean).
|
||||
|
@ -49,7 +49,7 @@ Rasha.import({ pem: pem }).then(function (jwk) {
|
|||
## JWK-to-PEM
|
||||
|
||||
* [x] PKCS#1 (traditional)
|
||||
* [ ] PKCS#8, SPKI/PKIX
|
||||
* [x] PKCS#8, SPKI/PKIX
|
||||
* [x] 2048-bit, 4096-bit (and ostensibily all others)
|
||||
* [x] SSH (RFC4716), (RFC 4716/SSH2)
|
||||
|
||||
|
@ -67,7 +67,7 @@ Rasha.export({ jwk: jwk }).then(function (pem) {
|
|||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpAIBAAKCAQEAm2ttVBxPlWw06ZmGBWVDlfjkPAJ4DgnY0TrDwtCohHzLxGhD
|
||||
NzUJefLukC+xu0LBKylYojT5vTkxaOhxeSYo31syu4WhxbkTBLICOFcCGMob6pSQ
|
||||
38P8LdAIlb0pqDHxEJ9adWomjuFf0...e5cCBahfsiNtNR6WV1/iCSuINYs6uPdA
|
||||
38P8LdAIlb0pqDHxEJ9adWomjuFf.....5cCBahfsiNtNR6WV1/iCSuINYs6uPdA
|
||||
Jlw7hm9m8TAmFWWyfL0s7wiRvAYkQvpxetorTwHJVLabBDJ+WBOAY2enOLHIRQv+
|
||||
atAvHrLXjkUdzF96o0icyF6n7QzGfUPmeWGYg6BEClLS31Whe0eEVQ==
|
||||
-----END RSA PRIVATE KEY-----
|
||||
|
@ -77,8 +77,6 @@ atAvHrLXjkUdzF96o0icyF6n7QzGfUPmeWGYg6BEClLS31Whe0eEVQ==
|
|||
|
||||
### Advanced Options
|
||||
|
||||
<!--
|
||||
|
||||
`format: 'pkcs8'`:
|
||||
|
||||
The default output format `pkcs1` (RSA-specific format) is used for private keys.
|
||||
|
@ -95,7 +93,7 @@ Rasha.export({ jwk: jwk, format: 'pkcs8' }).then(function (pem) {
|
|||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCba21UHE+VbDTp
|
||||
mYYFZUOV+OQ8AngOCdjROsPC0KiEfMvEaEM3NQl58u6QL7G7QsErKViiNPm9OTFo
|
||||
6HF5JijfWzK7haHFuRMEsgI4VwIYy...fLorV1ovjwKBgAJR1m8dYKemfaW8P9YZ
|
||||
6HF5JijfWzK7haHFuRMEsgI4VwIY.....LorV1ovjwKBgAJR1m8dYKemfaW8P9YZ
|
||||
Uux7lwIFqF+yI201HpZXX+IJK4g1izq490AmXDuGb2bxMCYVZbJ8vSzvCJG8BiRC
|
||||
+nF62itPAclUtpsEMn5YE4BjZ6c4schFC/5q0C8esteORR3MX3qjSJzIXqftDMZ9
|
||||
Q+Z5YZiDoEQKUtLfVaF7R4RV
|
||||
|
@ -119,18 +117,15 @@ Rasha.export({ jwk: jwk, format: 'ssh' }).then(function (pub) {
|
|||
```
|
||||
|
||||
```
|
||||
ssh-rsa TODO-TODO-TODO RSA-2048@localhost
|
||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCba21UHE.....Q02P1Eamz/nT4I3 rsa@localhost
|
||||
```
|
||||
|
||||
-->
|
||||
|
||||
`public: 'true'`:
|
||||
|
||||
If a private key is used as input, a private key will be output.
|
||||
|
||||
If you'd like to output a public key instead you can pass `public: true`.
|
||||
|
||||
<!--
|
||||
or `format: 'spki'`.
|
||||
|
||||
```js
|
||||
|
@ -141,15 +136,13 @@ Rasha.export({ jwk: jwk, public: true }).then(function (pem) {
|
|||
```
|
||||
|
||||
```
|
||||
-----BEGIN RSA PUBLIC KEY-----
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBCgKCAQEAm2ttVBxPlWw06ZmGBWVDlfjkPAJ4DgnY0TrDwtCohHzLxGhDNzUJ
|
||||
efLukC+xu0LBKylYojT5vTkxaOhxe...eTmzCh2ikrwTMja7mUdBJf2bK3By5AB0
|
||||
efLukC+xu0LBKylYojT5vTkxaOhx.....TmzCh2ikrwTMja7mUdBJf2bK3By5AB0
|
||||
Qi49OykUCfNZeQlEz7UNNj9RGps/50+CNwIDAQAB
|
||||
-----END RSA PUBLIC KEY-----
|
||||
-----END PUBLIC KEY-----
|
||||
```
|
||||
|
||||
-->
|
||||
|
||||
Testing
|
||||
-------
|
||||
|
||||
|
|
|
@ -204,7 +204,7 @@ ASN1.tpl = function (asn1) {
|
|||
console.log(vars.join('\n') + '\n');
|
||||
console.log();
|
||||
console.log('function buildSchema(opts) {');
|
||||
console.log('\treturn ' + str.slice(3) + ';');
|
||||
console.log('\treturn Enc.hexToBuf(' + str.slice(3) + ');');
|
||||
console.log('}');
|
||||
};
|
||||
|
||||
|
|
39
lib/x509.js
39
lib/x509.js
|
@ -114,3 +114,42 @@ x509.packPkcs1 = function (jwk) {
|
|||
, ASN1.UInt(Enc.base64ToHex(jwk.qi))
|
||||
));
|
||||
};
|
||||
|
||||
x509.packPkcs8 = function (jwk) {
|
||||
if (!jwk.d) {
|
||||
// Public RSA
|
||||
return Enc.hexToBuf(ASN1('30'
|
||||
, ASN1('30'
|
||||
, ASN1('06', '2a864886f70d010101')
|
||||
, ASN1('05')
|
||||
)
|
||||
, ASN1.BitStr(ASN1('30'
|
||||
, ASN1.UInt(Enc.base64ToHex(jwk.n))
|
||||
, ASN1.UInt(Enc.base64ToHex(jwk.e))
|
||||
))
|
||||
));
|
||||
}
|
||||
|
||||
// Private RSA
|
||||
return Enc.hexToBuf(ASN1('30'
|
||||
, ASN1.UInt('00')
|
||||
, ASN1('30'
|
||||
, ASN1('06', '2a864886f70d010101')
|
||||
, ASN1('05')
|
||||
)
|
||||
, ASN1('04'
|
||||
, ASN1('30'
|
||||
, ASN1.UInt('00')
|
||||
, ASN1.UInt(Enc.base64ToHex(jwk.n))
|
||||
, ASN1.UInt(Enc.base64ToHex(jwk.e))
|
||||
, ASN1.UInt(Enc.base64ToHex(jwk.d))
|
||||
, ASN1.UInt(Enc.base64ToHex(jwk.p))
|
||||
, ASN1.UInt(Enc.base64ToHex(jwk.q))
|
||||
, ASN1.UInt(Enc.base64ToHex(jwk.dp))
|
||||
, ASN1.UInt(Enc.base64ToHex(jwk.dq))
|
||||
, ASN1.UInt(Enc.base64ToHex(jwk.qi))
|
||||
)
|
||||
)
|
||||
));
|
||||
};
|
||||
x509.packSpki = x509.packPkcs8;
|
||||
|
|
10
package.json
10
package.json
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "rasha",
|
||||
"version": "0.8.2",
|
||||
"version": "1.0.0",
|
||||
"description": "PEM-to-JWK and JWK-to-PEM for RSA keys in a lightweight, zero-dependency library focused on perfect universal compatibility.",
|
||||
"homepage": "https://git.coolaj86.com/coolaj86/rasha.js",
|
||||
"main": "index.js",
|
||||
|
@ -26,14 +26,14 @@
|
|||
"keywords": [
|
||||
"zero-dependency",
|
||||
"PEM-to-JWK",
|
||||
"JWK-to-PEM",
|
||||
"RSA",
|
||||
"2048",
|
||||
"4096",
|
||||
"asn1",
|
||||
"x509"
|
||||
],
|
||||
"xkeywords": [
|
||||
"JWK-to-PEM"
|
||||
"x509",
|
||||
"JWK-to-SSH",
|
||||
"PEM-to-SSH"
|
||||
],
|
||||
"author": "AJ ONeal <coolaj86@gmail.com> (https://coolaj86.com/)",
|
||||
"license": "MPL-2.0"
|
||||
|
|
16
test.sh
16
test.sh
|
@ -37,16 +37,16 @@ node bin/rasha.js ./fixtures/pub-rsa-2048.jwk.json pkcs1 > ./fixtures/pub-rsa-20
|
|||
diff ./fixtures/pub-rsa-2048.pkcs1.pem ./fixtures/pub-rsa-2048.pkcs1.1.pem
|
||||
|
||||
|
||||
#echo ""
|
||||
#echo ""
|
||||
#echo "Testing JWK-to-PEM PKCS#8"
|
||||
#echo ""
|
||||
echo ""
|
||||
echo ""
|
||||
echo "Testing JWK-to-PEM PKCS#8"
|
||||
echo ""
|
||||
#
|
||||
#node bin/rasha.js ./fixtures/privkey-rsa-2048.jwk.json pkcs8 > ./fixtures/privkey-rsa-2048.pkcs8.1.pem
|
||||
#diff ./fixtures/privkey-rsa-2048.pkcs8.pem ./fixtures/privkey-rsa-2048.pkcs8.1.pem
|
||||
node bin/rasha.js ./fixtures/privkey-rsa-2048.jwk.json pkcs8 > ./fixtures/privkey-rsa-2048.pkcs8.1.pem
|
||||
diff ./fixtures/privkey-rsa-2048.pkcs8.pem ./fixtures/privkey-rsa-2048.pkcs8.1.pem
|
||||
#
|
||||
#node bin/rasha.js ./fixtures/pub-rsa-2048.jwk.json spki > ./fixtures/pub-rsa-2048.spki.1.pem
|
||||
#diff ./fixtures/pub-rsa-2048.pski.pem ./fixtures/pub-rsa-2048.spki.1.pem
|
||||
node bin/rasha.js ./fixtures/pub-rsa-2048.jwk.json spki > ./fixtures/pub-rsa-2048.spki.1.pem
|
||||
diff ./fixtures/pub-rsa-2048.spki.pem ./fixtures/pub-rsa-2048.spki.1.pem
|
||||
|
||||
|
||||
echo ""
|
||||
|
|
Loading…
Reference in New Issue