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)]