Skip to content
This repository has been archived by the owner on Feb 27, 2023. It is now read-only.

Commit

Permalink
Merge pull request #46 from square/alok/unicode
Browse files Browse the repository at this point in the history
Fix utf-8 handling.
  • Loading branch information
alokmenghrajani committed Sep 16, 2016
2 parents 55de127 + bc412b9 commit 06725a8
Show file tree
Hide file tree
Showing 11 changed files with 254 additions and 82 deletions.
58 changes: 41 additions & 17 deletions dist/jose-commonjs.js
Expand Up @@ -941,7 +941,7 @@ Utils.convertRsaKey = function(rsa_key, parameters) {
/**
* Converts a string into an array of ascii codes.
*
* @param str string
* @param str ascii string
* @return Uint8Array
*/
Utils.arrayFromString = function(str) {
Expand All @@ -953,21 +953,50 @@ Utils.arrayFromString = function(str) {
};

/**
* Converts an array of ascii codes into a string.
* Converts a string into an array of utf-8 codes.
*
* @param arr ArrayBuffer
* @return string
* @param str utf-8 string
* @return Uint8Array
*/
Utils.arrayFromUtf8String = function(str) {
Jose.assert(Utils.isString(str), "arrayFromUtf8String: invalid input");
// javascript represents strings as utf-16. Jose imposes the use of
// utf-8, so we need to convert from one representation to the other.
str = unescape(encodeURIComponent(str));
return Utils.arrayFromString(str);
};

/**
* Converts an array of ascii bytes into a string.
*
* @param arr arrayish
* @return ascii string
*/
Utils.stringFromArray = function(arr) {
Jose.assert(arr instanceof ArrayBuffer, "stringFromArray: invalid input");
arr = new Uint8Array(arr);
arr = Utils.arrayish(arr);
var r = '';
for (var i = 0; i < arr.length; i++) {
r += String.fromCharCode(arr[i]);
}

return r;
};

/**
* Converts an array of ascii bytes into a string.
*
* @param arr ArrayBuffer
* @return ascii string
*/
Utils.utf8StringFromArray = function(arr) {
Jose.assert(arr instanceof ArrayBuffer, "utf8StringFromArray: invalid input");

// javascript represents strings as utf-16. Jose imposes the use of
// utf-8, so we need to convert from one representation to the other.
var r = Utils.stringFromArray(arr);
return decodeURIComponent(escape(r));
};

/**
* Strips leading zero in an array.
*
Expand Down Expand Up @@ -1056,12 +1085,7 @@ Utils.Base64Url.encode = function(str) {
* @return string
*/
Utils.Base64Url.encodeArray = function(arr) {
arr = Utils.arrayish(arr);
var r = "";
for (var i = 0; i < arr.length; i++) {
r += String.fromCharCode(arr[i]);
}
return Utils.Base64Url.encode(r);
return Utils.Base64Url.encode(Utils.stringFromArray(arr));
};

/**
Expand Down Expand Up @@ -1144,7 +1168,7 @@ JoseJWE.Encrypter.prototype.addHeader = function(k, v) {
/**
* Performs encryption.
*
* @param plain_text String
* @param plain_text utf-8 string
* @return Promise<String>
*/
JoseJWE.Encrypter.prototype.encrypt = function(plain_text) {
Expand All @@ -1170,7 +1194,7 @@ JoseJWE.Encrypter.prototype.encrypt = function(plain_text) {

// Create the AAD
var aad = Utils.arrayFromString(jwe_protected_header);
plain_text = Utils.arrayFromString(plain_text);
plain_text = Utils.arrayFromUtf8String(plain_text);

return this.cryptographer.encrypt(iv, aad, cek_promise, plain_text).then(function(r) {
r.header = jwe_protected_header;
Expand Down Expand Up @@ -1300,7 +1324,7 @@ JoseJWE.Decrypter.prototype.decrypt = function(cipher_text) {
Utils.Base64Url.decodeArray(parts[3]),
Utils.Base64Url.decodeArray(parts[4]));

return plain_text_promise.then(Utils.stringFromArray);
return plain_text_promise.then(Utils.utf8StringFromArray);
};

/*-
Expand Down Expand Up @@ -1414,7 +1438,7 @@ JoseJWS.Signer.prototype.addSignature = function(jws, aad, header) {
/**
* Computes signature.
*
* @param payload JWS Object or String to be signed
* @param payload JWS Object or utf-8 string to be signed
* @param aad Object protected header
* @param header Object unprotected header
* @return Promise<JWS>
Expand Down Expand Up @@ -1449,7 +1473,7 @@ JoseJWS.Signer.prototype.sign = function(payload, aad, header) {
}

if (Utils.isString(message)) {
toBeSigned = Utils.arrayFromString(message);
toBeSigned = Utils.arrayFromUtf8String(message);
} else {
try {
toBeSigned = Utils.arrayish(message);
Expand Down
58 changes: 41 additions & 17 deletions dist/jose-testing.js
Expand Up @@ -944,7 +944,7 @@ Utils.convertRsaKey = function(rsa_key, parameters) {
/**
* Converts a string into an array of ascii codes.
*
* @param str string
* @param str ascii string
* @return Uint8Array
*/
Utils.arrayFromString = function(str) {
Expand All @@ -956,21 +956,50 @@ Utils.arrayFromString = function(str) {
};

/**
* Converts an array of ascii codes into a string.
* Converts a string into an array of utf-8 codes.
*
* @param arr ArrayBuffer
* @return string
* @param str utf-8 string
* @return Uint8Array
*/
Utils.arrayFromUtf8String = function(str) {
Jose.assert(Utils.isString(str), "arrayFromUtf8String: invalid input");
// javascript represents strings as utf-16. Jose imposes the use of
// utf-8, so we need to convert from one representation to the other.
str = unescape(encodeURIComponent(str));
return Utils.arrayFromString(str);
};

/**
* Converts an array of ascii bytes into a string.
*
* @param arr arrayish
* @return ascii string
*/
Utils.stringFromArray = function(arr) {
Jose.assert(arr instanceof ArrayBuffer, "stringFromArray: invalid input");
arr = new Uint8Array(arr);
arr = Utils.arrayish(arr);
var r = '';
for (var i = 0; i < arr.length; i++) {
r += String.fromCharCode(arr[i]);
}

return r;
};

/**
* Converts an array of ascii bytes into a string.
*
* @param arr ArrayBuffer
* @return ascii string
*/
Utils.utf8StringFromArray = function(arr) {
Jose.assert(arr instanceof ArrayBuffer, "utf8StringFromArray: invalid input");

// javascript represents strings as utf-16. Jose imposes the use of
// utf-8, so we need to convert from one representation to the other.
var r = Utils.stringFromArray(arr);
return decodeURIComponent(escape(r));
};

/**
* Strips leading zero in an array.
*
Expand Down Expand Up @@ -1059,12 +1088,7 @@ Utils.Base64Url.encode = function(str) {
* @return string
*/
Utils.Base64Url.encodeArray = function(arr) {
arr = Utils.arrayish(arr);
var r = "";
for (var i = 0; i < arr.length; i++) {
r += String.fromCharCode(arr[i]);
}
return Utils.Base64Url.encode(r);
return Utils.Base64Url.encode(Utils.stringFromArray(arr));
};

/**
Expand Down Expand Up @@ -1147,7 +1171,7 @@ JoseJWE.Encrypter.prototype.addHeader = function(k, v) {
/**
* Performs encryption.
*
* @param plain_text String
* @param plain_text utf-8 string
* @return Promise<String>
*/
JoseJWE.Encrypter.prototype.encrypt = function(plain_text) {
Expand All @@ -1173,7 +1197,7 @@ JoseJWE.Encrypter.prototype.encrypt = function(plain_text) {

// Create the AAD
var aad = Utils.arrayFromString(jwe_protected_header);
plain_text = Utils.arrayFromString(plain_text);
plain_text = Utils.arrayFromUtf8String(plain_text);

return this.cryptographer.encrypt(iv, aad, cek_promise, plain_text).then(function(r) {
r.header = jwe_protected_header;
Expand Down Expand Up @@ -1303,7 +1327,7 @@ JoseJWE.Decrypter.prototype.decrypt = function(cipher_text) {
Utils.Base64Url.decodeArray(parts[3]),
Utils.Base64Url.decodeArray(parts[4]));

return plain_text_promise.then(Utils.stringFromArray);
return plain_text_promise.then(Utils.utf8StringFromArray);
};

/*-
Expand Down Expand Up @@ -1417,7 +1441,7 @@ JoseJWS.Signer.prototype.addSignature = function(jws, aad, header) {
/**
* Computes signature.
*
* @param payload JWS Object or String to be signed
* @param payload JWS Object or utf-8 string to be signed
* @param aad Object protected header
* @param header Object unprotected header
* @return Promise<JWS>
Expand Down Expand Up @@ -1452,7 +1476,7 @@ JoseJWS.Signer.prototype.sign = function(payload, aad, header) {
}

if (Utils.isString(message)) {
toBeSigned = Utils.arrayFromString(message);
toBeSigned = Utils.arrayFromUtf8String(message);
} else {
try {
toBeSigned = Utils.arrayish(message);
Expand Down
58 changes: 41 additions & 17 deletions dist/jose.js
Expand Up @@ -946,7 +946,7 @@ Utils.convertRsaKey = function(rsa_key, parameters) {
/**
* Converts a string into an array of ascii codes.
*
* @param str string
* @param str ascii string
* @return Uint8Array
*/
Utils.arrayFromString = function(str) {
Expand All @@ -958,21 +958,50 @@ Utils.arrayFromString = function(str) {
};

/**
* Converts an array of ascii codes into a string.
* Converts a string into an array of utf-8 codes.
*
* @param arr ArrayBuffer
* @return string
* @param str utf-8 string
* @return Uint8Array
*/
Utils.arrayFromUtf8String = function(str) {
Jose.assert(Utils.isString(str), "arrayFromUtf8String: invalid input");
// javascript represents strings as utf-16. Jose imposes the use of
// utf-8, so we need to convert from one representation to the other.
str = unescape(encodeURIComponent(str));
return Utils.arrayFromString(str);
};

/**
* Converts an array of ascii bytes into a string.
*
* @param arr arrayish
* @return ascii string
*/
Utils.stringFromArray = function(arr) {
Jose.assert(arr instanceof ArrayBuffer, "stringFromArray: invalid input");
arr = new Uint8Array(arr);
arr = Utils.arrayish(arr);
var r = '';
for (var i = 0; i < arr.length; i++) {
r += String.fromCharCode(arr[i]);
}

return r;
};

/**
* Converts an array of ascii bytes into a string.
*
* @param arr ArrayBuffer
* @return ascii string
*/
Utils.utf8StringFromArray = function(arr) {
Jose.assert(arr instanceof ArrayBuffer, "utf8StringFromArray: invalid input");

// javascript represents strings as utf-16. Jose imposes the use of
// utf-8, so we need to convert from one representation to the other.
var r = Utils.stringFromArray(arr);
return decodeURIComponent(escape(r));
};

/**
* Strips leading zero in an array.
*
Expand Down Expand Up @@ -1061,12 +1090,7 @@ Utils.Base64Url.encode = function(str) {
* @return string
*/
Utils.Base64Url.encodeArray = function(arr) {
arr = Utils.arrayish(arr);
var r = "";
for (var i = 0; i < arr.length; i++) {
r += String.fromCharCode(arr[i]);
}
return Utils.Base64Url.encode(r);
return Utils.Base64Url.encode(Utils.stringFromArray(arr));
};

/**
Expand Down Expand Up @@ -1149,7 +1173,7 @@ JoseJWE.Encrypter.prototype.addHeader = function(k, v) {
/**
* Performs encryption.
*
* @param plain_text String
* @param plain_text utf-8 string
* @return Promise<String>
*/
JoseJWE.Encrypter.prototype.encrypt = function(plain_text) {
Expand All @@ -1175,7 +1199,7 @@ JoseJWE.Encrypter.prototype.encrypt = function(plain_text) {

// Create the AAD
var aad = Utils.arrayFromString(jwe_protected_header);
plain_text = Utils.arrayFromString(plain_text);
plain_text = Utils.arrayFromUtf8String(plain_text);

return this.cryptographer.encrypt(iv, aad, cek_promise, plain_text).then(function(r) {
r.header = jwe_protected_header;
Expand Down Expand Up @@ -1305,7 +1329,7 @@ JoseJWE.Decrypter.prototype.decrypt = function(cipher_text) {
Utils.Base64Url.decodeArray(parts[3]),
Utils.Base64Url.decodeArray(parts[4]));

return plain_text_promise.then(Utils.stringFromArray);
return plain_text_promise.then(Utils.utf8StringFromArray);
};

/*-
Expand Down Expand Up @@ -1419,7 +1443,7 @@ JoseJWS.Signer.prototype.addSignature = function(jws, aad, header) {
/**
* Computes signature.
*
* @param payload JWS Object or String to be signed
* @param payload JWS Object or utf-8 string to be signed
* @param aad Object protected header
* @param header Object unprotected header
* @return Promise<JWS>
Expand Down Expand Up @@ -1454,7 +1478,7 @@ JoseJWS.Signer.prototype.sign = function(payload, aad, header) {
}

if (Utils.isString(message)) {
toBeSigned = Utils.arrayFromString(message);
toBeSigned = Utils.arrayFromUtf8String(message);
} else {
try {
toBeSigned = Utils.arrayish(message);
Expand Down
2 changes: 1 addition & 1 deletion dist/jose.min.js

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions examples/jose-jwe-example2.html
@@ -1,6 +1,6 @@
<html>
<body>
<p>plain text: <span id="plaintext">hello world</span></p>
<p>plain text: <span id="plaintext">hello world, &#x26C4;</span></p>
<p>cipher text: <pre style="word-wrap: break-word" id="ciphertext"></pre></p>
<p>error: <span id="error" style="color: red"></span></p>
<script src="../dist/jose.js"></script>
Expand Down Expand Up @@ -31,4 +31,4 @@
});
</script>
</body>
</html>
</html>

0 comments on commit 06725a8

Please sign in to comment.