lib/sjcl/ccm.rb in sjcl-1.0.0 vs lib/sjcl/ccm.rb in sjcl-1.0.1

- old
+ new

@@ -1,15 +1,18 @@ module SJCL::Mode module CCM + class TagAuthError < ::StandardError; end + class Error < ::StandardError; end + NAME = "ccm" def self.encrypt(prf, plaintext, iv, adata=[], tlen=64) ccml = 2 out = plaintext.dup ivl = SJCL::BitArray.bitLength(iv) / 8 ol = SJCL::BitArray.bitLength(out) / 8 - raise "ccm: IV must be at least 7 bytes" if ivl < 7 + raise Error, "ccm: IV must be at least 7 bytes" if ivl < 7 while ccml < 4 && ((ol & 0xFFFFFFFF) >> 8*ccml > 0) ccml += 1 end ccml = 15 - ivl if ccml < 15 - ivl iv = SJCL::BitArray.clamp(iv,8*(15-ccml)); @@ -26,11 +29,11 @@ ol = SJCL::BitArray.bitLength(ciphertext) out = SJCL::BitArray.clamp(ciphertext, ol - tlen) tag = SJCL::BitArray.bitSlice(ciphertext, ol - tlen) ol = (ol - tlen) / 8; - raise "ccm: iv must be at least 7 bytes" if (ivl < 7) + raise Error, "ccm: iv must be at least 7 bytes" if (ivl < 7) # compute the length of the length while ccml < 4 && ((ol & 0xFFFFFFFF) >> 8*ccml > 0) ccml += 1 end @@ -44,18 +47,18 @@ out = ctrMode(prf, out, iv, tag, tlen, ccml) # check the tag tag2 = computeTag(prf, out[:data], iv, adata, tlen, ccml) if (!SJCL::BitArray.compare(out[:tag], tag2)) - raise "ccm: tag doesn't match" + raise TagAuthError, "ccm: tag doesn't match" end return out[:data] end def self.computeTag(prf, plaintext, iv, adata, tlen, l) tlen /= 8 if (tlen % 2 != 0 || tlen < 4 || tlen > 16) - raise "ccm: invalid tag length" + raise Error, "ccm: invalid tag length" end # mac the flags mac = [SJCL::BitArray.partial(8, (adata.length > 0 ? 1<<6 : 0) | ((tlen-2) << 2) | l-1)]