Skip to content

Commit 52d2b55

Browse files
committed
10.5.17 release
1 parent bd075c6 commit 52d2b55

22 files changed

+1812
-1575
lines changed

ChangeLog.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
11

22
ChangeLog for jsrsasign
33

4+
CIDR subnet mask support in iptohex and hextoip
5+
* Changes from 10.5.16 to 10.5.17 (2022-Apr-14)
6+
- src/asn1x509.js
7+
- add IP address support in NameConstraints class
8+
- bugfix in NameConstraints ip address
9+
- wrong ASN.1 encoder in NameConstraints class bug fix (wrong explicit tag)
10+
- src/base64x.js
11+
- add CIDR subnet mask support in iptohex and hextoip
12+
- iptohex, hextoip refactoring
13+
- test/qunit-do-{x509-ext,base64x,asn1x509-tbscert,asn1x509}.html
14+
- add some test cases and fix for above
15+
416
Add NameConstraints extension and modify getEncodedHex to tohex
517
* Changes from 10.5.15 to 10.5.16 (2022-Apr-08)
618
- src/asn1x509.js

api/files.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ <h2><a href="symbols/src/asn1x509-1.0.js.html">asn1x509-1.0.js</a></h2>
662662

663663

664664
<dt class="heading">Version:</dt>
665-
<dd>jsrsasign 10.5.16 asn1x509 2.1.13 (2022-Apr-08)</dd>
665+
<dd>jsrsasign 10.5.17 asn1x509 2.1.14 (2022-Apr-14)</dd>
666666

667667

668668

@@ -681,7 +681,7 @@ <h2><a href="symbols/src/base64x-1.1.js.html">base64x-1.1.js</a></h2>
681681

682682

683683
<dt class="heading">Version:</dt>
684-
<dd>jsrsasign 10.5.12 base64x 1.1.25 (2022-Mar-13)</dd>
684+
<dd>jsrsasign 10.5.17 base64x 1.1.26 (2022-Apr-14)</dd>
685685

686686

687687

api/symbols/global__.html

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2411,6 +2411,8 @@ <h1 class="classTitle">
24112411
IPv6 address to IPv4 or IPv6 address string.
24122412
If byte length is not 4 nor 16, this returns a
24132413
hexadecimal string without conversion.
2414+
<br/>
2415+
NOTE: From jsrsasign 10.5.17, CIDR subnet mask notation also supported.
24142416

24152417
<br />
24162418
<i>Defined in: </i> <a href="../symbols/src/base64x-1.1.js.html">base64x-1.1.js</a>.
@@ -2420,10 +2422,11 @@ <h1 class="classTitle">
24202422

24212423

24222424

2423-
<pre class="code">hextoip("c0a80101") &rarr "192.168.1.1"
2425+
<pre class="code">hextoip("c0a80101") &rarr; "192.168.1.1"
24242426
hextoip("871020010db8000000000000000000000004") &rarr "2001:db8::4"
2425-
hextoip("c0a801010203") &rarr "c0a801010203" // 6 bytes
2426-
hextoip("zzz")) &rarr raise exception because of not hexadecimal</pre>
2427+
hextoip("c0a80100ffffff00") &rarr; "192.168.1.0/24"
2428+
hextoip("c0a801010203") &rarr; "c0a801010203" // wrong 6 bytes
2429+
hextoip("zzz")) &rarr; raise exception because of not hexadecimal</pre>
24272430

24282431

24292432

@@ -2461,7 +2464,9 @@ <h1 class="classTitle">
24612464
<dl class="detailList">
24622465
<dt class="heading">See:</dt>
24632466

2464-
<dd></dd>
2467+
<dd><a href="../symbols/global__.html#hextoipv6">hextoipv6</a></dd>
2468+
2469+
<dd><a href="../symbols/global__.html#iptohex">iptohex</a></dd>
24652470

24662471
</dl>
24672472

@@ -3054,6 +3059,8 @@ <h1 class="classTitle">
30543059
convert IPv4/v6 addresss to a hexadecimal string<br/>
30553060
This function converts IPv4 or IPv6 address string to
30563061
a hexadecimal string of IPv4 or IPv6 address.
3062+
<br/>
3063+
NOTE: From jsrsasign 10.5.17, CIDR net mask notation also supported.
30573064

30583065
<br />
30593066
<i>Defined in: </i> <a href="../symbols/src/base64x-1.1.js.html">base64x-1.1.js</a>.
@@ -3063,9 +3070,11 @@ <h1 class="classTitle">
30633070

30643071

30653072

3066-
<pre class="code">iptohex("192.168.1.1") &rarr "c0a80101"
3067-
iptohex("2001:db8::4") &rarr "871020010db8000000000000000000000004"
3068-
iptohex("zzz")) &rarr raise exception</pre>
3073+
<pre class="code">iptohex("192.168.1.1") &rarr; "c0a80101"
3074+
iptohex("2001:db8::4") &rarr; "871020010db8000000000000000000000004"
3075+
iptohex("192.168.1.1/24") &rarr; "c0a80101ffffff00"
3076+
iptohex("2001:db8::/120") &rarr; "871020010db8000000000000000000000000ffffffffffffffffffffffffffffffffff00"
3077+
iptohex("zzz")) &rarr; raise exception</pre>
30693078

30703079

30713080

@@ -3100,6 +3109,15 @@ <h1 class="classTitle">
31003109

31013110

31023111

3112+
<dl class="detailList">
3113+
<dt class="heading">See:</dt>
3114+
3115+
<dd><a href="../symbols/global__.html#hextoip">hextoip</a></dd>
3116+
3117+
<dd><a href="../symbols/global__.html#ipv6tohex">ipv6tohex</a></dd>
3118+
3119+
</dl>
3120+
31033121

31043122
<hr />
31053123

api/symbols/src/asn1x509-1.0.js.html

Lines changed: 650 additions & 648 deletions
Large diffs are not rendered by default.

api/symbols/src/base64x-1.1.js.html

Lines changed: 846 additions & 777 deletions
Large diffs are not rendered by default.

bower.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "kjur-jsrsasign",
3-
"version": "10.5.16",
3+
"version": "10.5.17",
44
"main": "jsrsasign-all-min.js",
55
"description": "The 'jsrsasign' (RSA-Sign JavaScript Library) is an opensource free cryptography library supporting RSA/RSAPSS/ECDSA/DSA signing/validation, ASN.1, PKCS#1/5/8 private/public key, X.509 certificate, CRL, OCSP, CMS SignedData, TimeStamp, CAdES, JWS and JWT in pure JavaScript.",
66
"license": "MIT",

jsrsasign-all-min.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jsrsasign-jwths-min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jsrsasign-rsa-min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

min/asn1x509-1.0.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

min/base64x-1.1.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

npm/lib/jsrsasign-all-min.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

npm/lib/jsrsasign-jwths-min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

npm/lib/jsrsasign-rsa-min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

npm/lib/jsrsasign.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

npm/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "jsrsasign",
3-
"version": "10.5.16",
3+
"version": "10.5.17",
44
"description": "opensource free pure JavaScript cryptographic library supports RSA/RSAPSS/ECDSA/DSA signing/validation, ASN.1, PKCS#1/5/8 private/public key, X.509 certificate, CRL, OCSP, CMS SignedData, TimeStamp and CAdES and JSON Web Signature(JWS)/Token(JWT)/Key(JWK).",
55
"main": "lib/jsrsasign.js",
66
"scripts": {

src/asn1x509-1.0.js

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* asn1x509-2.1.13.js (c) 2013-2022 Kenji Urushima | kjur.github.io/jsrsasign/license
1+
/* asn1x509-2.1.14.js (c) 2013-2022 Kenji Urushima | kjur.github.io/jsrsasign/license
22
*/
33
/*
44
* asn1x509.js - ASN.1 DER encoder classes for X.509 certificate
@@ -16,7 +16,7 @@
1616
* @fileOverview
1717
* @name asn1x509-1.0.js
1818
* @author Kenji Urushima [email protected]
19-
* @version jsrsasign 10.5.16 asn1x509 2.1.13 (2022-Apr-08)
19+
* @version jsrsasign 10.5.17 asn1x509 2.1.14 (2022-Apr-14)
2020
* @since jsrsasign 2.1
2121
* @license <a href="https://kjur.github.io/jsrsasign/license/">MIT License</a>
2222
*/
@@ -1373,7 +1373,7 @@ KJUR.asn1.x509.NameConstraints = function(params) {
13731373
for (var i = 0; i < params.permit.length; i++) {
13741374
aPermit.push(new _GeneralSubtree(params.permit[i]));
13751375
}
1376-
aItem.push({tag: {tage: "a0", obj: {seq: aPermit}}});
1376+
aItem.push({tag: {tagi: "a0", obj: {seq: aPermit}}});
13771377
}
13781378

13791379
if (params.exclude != undefined &&
@@ -1382,7 +1382,7 @@ KJUR.asn1.x509.NameConstraints = function(params) {
13821382
for (var i = 0; i < params.exclude.length; i++) {
13831383
aExclude.push(new _GeneralSubtree(params.exclude[i]));
13841384
}
1385-
aItem.push({tag: {tage: "a1", obj: {seq: aExclude}}});
1385+
aItem.push({tag: {tagi: "a1", obj: {seq: aExclude}}});
13861386
}
13871387

13881388
this.asn1ExtnValue = _newObject({seq: aItem});
@@ -4091,19 +4091,21 @@ KJUR.asn1.x509.GeneralName = function(params) {
40914091
dObj = new _DERIA5String({str: params.uri});
40924092
} else if (params.ip !== undefined) {
40934093
hTag = "87";
4094-
var ip = params.ip;
40954094
var hIP;
4096-
var errmsg = "malformed IP address";
4097-
if (ip.match(/^[0-9.]+[.][0-9.]+$/)) { // ipv4
4098-
hIP = intarystrtohex("[" + ip.split(".").join(",") + "]");
4099-
if (hIP.length !== 8)
4100-
throw new _Error(errmsg);
4101-
} else if (ip.match(/^[0-9A-Fa-f:]+:[0-9A-Fa-f:]+$/)) { // ipv6
4102-
hIP = ipv6tohex(ip);
4103-
} else if (ip.match(/^([0-9A-Fa-f][0-9A-Fa-f]){1,}$/)) { // hex
4104-
hIP = ip;
4105-
} else {
4106-
throw new _Error(errmsg);
4095+
var ip = params.ip;
4096+
try {
4097+
if (ip.match(/^[0-9a-f]+$/)) {
4098+
var len = ip.length;
4099+
if (len == 8 || len == 16 || len == 32 || len == 64) {
4100+
hIP = ip;
4101+
} else {
4102+
throw "err";
4103+
}
4104+
} else {
4105+
hIP = iptohex(ip);
4106+
}
4107+
} catch(ex) {
4108+
throw new _Error("malformed IP address: " + params.ip + ":" + ex.message);
41074109
}
41084110
dObj = new _DEROctetString({hex: hIP});
41094111
} else {

src/base64x-1.1.js

Lines changed: 113 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* base64x-1.1.25 (c) 2012-2022 Kenji Urushima | kjur.github.io/jsrsasign/license
1+
/* base64x-1.1.26 (c) 2012-2022 Kenji Urushima | kjur.github.io/jsrsasign/license
22
*/
33
/*
44
* base64x.js - Base64url and supplementary functions for Tom Wu's base64.js library
@@ -16,7 +16,7 @@
1616
* @fileOverview
1717
* @name base64x-1.1.js
1818
* @author Kenji Urushima [email protected]
19-
* @version jsrsasign 10.5.12 base64x 1.1.25 (2022-Mar-13)
19+
* @version jsrsasign 10.5.17 base64x 1.1.26 (2022-Apr-14)
2020
* @since jsrsasign 2.1
2121
* @license <a href="https://kjur.github.io/jsrsasign/license/">MIT License</a>
2222
*/
@@ -946,77 +946,146 @@ function hextoipv6(s) {
946946
* @param {String} s hexadecimal string of IP address
947947
* @return {String} IP address string
948948
* @since jsrsasign 8.0.10 base64x 1.1.13
949+
* @see hextoipv6
950+
* @see iptohex
951+
*
949952
* @description
950953
* This function converts a hexadecimal string of IPv4 or
951954
* IPv6 address to IPv4 or IPv6 address string.
952955
* If byte length is not 4 nor 16, this returns a
953956
* hexadecimal string without conversion.
954-
* @see {@link hextoipv6}
957+
* <br/>
958+
* NOTE: From jsrsasign 10.5.17, CIDR subnet mask notation also supported.
959+
*
955960
* @example
956-
* hextoip("c0a80101") &rarr "192.168.1.1"
961+
* hextoip("c0a80101") &rarr; "192.168.1.1"
957962
* hextoip("871020010db8000000000000000000000004") &rarr "2001:db8::4"
958-
* hextoip("c0a801010203") &rarr "c0a801010203" // 6 bytes
959-
* hextoip("zzz")) &rarr raise exception because of not hexadecimal
963+
* hextoip("c0a80100ffffff00") &rarr; "192.168.1.0/24"
964+
* hextoip("c0a801010203") &rarr; "c0a801010203" // wrong 6 bytes
965+
* hextoip("zzz")) &rarr; raise exception because of not hexadecimal
960966
*/
961967
function hextoip(s) {
962-
var malformedMsg = "malformed hex value";
963-
if (! s.match(/^([0-9A-Fa-f][0-9A-Fa-f]){1,}$/))
964-
throw malformedMsg;
965-
if (s.length == 8) { // ipv4
966-
var ip;
967-
try {
968-
ip = parseInt(s.substr(0, 2), 16) + "." +
969-
parseInt(s.substr(2, 2), 16) + "." +
970-
parseInt(s.substr(4, 2), 16) + "." +
971-
parseInt(s.substr(6, 2), 16);
972-
return ip;
973-
} catch (ex) {
974-
throw malformedMsg;
975-
}
968+
var malformedErr = new Error("malformed hex value");
969+
if (! s.match(/^([0-9A-Fa-f][0-9A-Fa-f]){1,}$/))
970+
throw malformedErr;
971+
if (s.length == 8) { // ipv4
972+
var ip;
973+
try {
974+
ip = parseInt(s.substr(0, 2), 16) + "." +
975+
parseInt(s.substr(2, 2), 16) + "." +
976+
parseInt(s.substr(4, 2), 16) + "." +
977+
parseInt(s.substr(6, 2), 16);
978+
return ip;
979+
} catch (ex) {
980+
throw malformedErr;
981+
}
982+
} else if (s.length == 16) {
983+
try {
984+
return hextoip(s.substr(0, 8)) + "/" + ipprefixlen(s.substr(8));
985+
} catch (ex) {
986+
throw malformedErr;
987+
}
976988
} else if (s.length == 32) {
977-
return hextoipv6(s);
989+
return hextoipv6(s);
990+
} else if (s.length == 64) {
991+
try {
992+
return hextoipv6(s.substr(0, 32)) + "/" + ipprefixlen(s.substr(32));
993+
} catch (ex) {
994+
throw malformedErr;
995+
}
996+
return
978997
} else {
979998
return s;
980999
}
9811000
}
9821001

1002+
/*
1003+
* convert subnet mask hex to ip address prefix length<br/>
1004+
* @name ipprefixlen
1005+
* @param {string} hMask hexadecimal string of ipv4/6 subnet mask (ex. "ffffff00" for v4 class C)
1006+
* @return {nummber} ip address prefix length (ex. 24 for IPv4 class C)
1007+
*/
1008+
function ipprefixlen(hMask) {
1009+
var malformedErr = new Error("malformed mask");
1010+
var bMask;
1011+
try {
1012+
bMask = new BigInteger(hMask, 16).toString(2);
1013+
} catch(ex) {
1014+
throw malformedErr;
1015+
}
1016+
if (! bMask.match(/^1*0*$/)) throw malformedErr;
1017+
return bMask.replace(/0+$/, '').length;
1018+
}
1019+
9831020
/**
9841021
* convert IPv4/v6 addresss to a hexadecimal string<br/>
9851022
* @name iptohex
9861023
* @function
9871024
* @param {String} s IPv4/v6 address string
9881025
* @return {String} hexadecimal string of IP address
9891026
* @since jsrsasign 8.0.12 base64x 1.1.14
1027+
* @see hextoip
1028+
* @see ipv6tohex
1029+
*
9901030
* @description
9911031
* This function converts IPv4 or IPv6 address string to
9921032
* a hexadecimal string of IPv4 or IPv6 address.
1033+
* <br/>
1034+
* NOTE: From jsrsasign 10.5.17, CIDR net mask notation also supported.
1035+
*
9931036
* @example
994-
* iptohex("192.168.1.1") &rarr "c0a80101"
995-
* iptohex("2001:db8::4") &rarr "871020010db8000000000000000000000004"
996-
* iptohex("zzz")) &rarr raise exception
1037+
* iptohex("192.168.1.1") &rarr; "c0a80101"
1038+
* iptohex("2001:db8::4") &rarr; "871020010db8000000000000000000000004"
1039+
* iptohex("192.168.1.1/24") &rarr; "c0a80101ffffff00"
1040+
* iptohex("2001:db8::/120") &rarr; "871020010db8000000000000000000000000ffffffffffffffffffffffffffffffffff00"
1041+
* iptohex("zzz")) &rarr; raise exception
9971042
*/
9981043
function iptohex(s) {
999-
var malformedMsg = "malformed IP address";
1000-
s = s.toLowerCase(s);
1001-
1002-
if (s.match(/^[0-9.]+$/)) {
1003-
var a = s.split(".");
1004-
if (a.length !== 4) throw malformedMsg;
1005-
var hex = "";
1006-
try {
1007-
for (var i = 0; i < 4; i++) {
1008-
var d = parseInt(a[i]);
1009-
hex += ("0" + d.toString(16)).slice(-2);
1010-
}
1011-
return hex;
1012-
} catch(ex) {
1013-
throw malformedMsg;
1044+
var malformedErr = new Error("malformed IP address");
1045+
s = s.toLowerCase(s);
1046+
1047+
if (! s.match(/^[0-9a-f.:/]+$/) ) throw malformedErr;
1048+
1049+
if (s.match(/^[0-9.]+$/)) {
1050+
var a = s.split(".");
1051+
if (a.length !== 4) throw malformedErr;
1052+
var hex = "";
1053+
try {
1054+
for (var i = 0; i < 4; i++) {
1055+
var d = parseInt(a[i]);
1056+
hex += ("0" + d.toString(16)).slice(-2);
1057+
}
1058+
return hex;
1059+
} catch(ex) {
1060+
throw malformedErr;
1061+
}
1062+
} else if (s.match(/^[0-9.]+\/[0-9]+$/)) {
1063+
var aItem = s.split("/");
1064+
return iptohex(aItem[0]) + ipnetmask(parseInt(aItem[1]), 32);
1065+
} else if (s.match(/^[0-9a-f:]+$/) && s.indexOf(":") !== -1) {
1066+
return ipv6tohex(s);
1067+
} else if (s.match(/^[0-9a-f:]+\/[0-9]+$/) && s.indexOf(":") !== -1) {
1068+
var aItem = s.split("/");
1069+
return ipv6tohex(aItem[0]) + ipnetmask(parseInt(aItem[1]), 128);
1070+
} else {
1071+
throw malformedErr;
10141072
}
1015-
} else if (s.match(/^[0-9a-f:]+$/) && s.indexOf(":") !== -1) {
1016-
return ipv6tohex(s);
1017-
} else {
1018-
throw malformedMsg;
1019-
}
1073+
}
1074+
1075+
/*
1076+
* convert ip prefix length to net mask octets<br/>
1077+
* @param {number} prefixlen ip prefix length value (ex. 24 for IPv4 class C)
1078+
* @param {number} len ip address length (ex. 32 for IPv4 and 128 for IPv6)
1079+
* @return {string} hexadecimal string of net mask octets
1080+
* @example
1081+
* ipnetmask(24, 32) &rarr; "ffffff00"
1082+
* ipnetmask(120, 128) &rarr; "ffffffffffffffffffffffffffffff00"
1083+
*/
1084+
function ipnetmask(prefixlen, len) {
1085+
if (len == 32 && prefixlen == 0) return "00000000"; // v4
1086+
if (len == 128 && prefixlen == 0) return "00000000000000000000000000000000"; // v6
1087+
var b = Array(prefixlen + 1).join("1") + Array(len - prefixlen + 1).join("0");
1088+
return new BigInteger(b, 2).toString(16);
10201089
}
10211090

10221091
// ==== ucs2hex / utf8 ==============================

0 commit comments

Comments
 (0)