public EncryptedKvDecoder(InputStream in, Decryptor decryptor) { super(in); this.decryptor = decryptor; if (decryptor != null) { this.iv = new byte[decryptor.getIvLength()]; } }
@Override protected Cell parseCell() throws IOException { if (this.decryptor == null) { return super.parseCell(); } int ivLength = 0; ivLength = StreamUtils.readRawVarint32(in); // TODO: An IV length of 0 could signify an unwrapped cell, when the // encoder supports that just read the remainder in directly if (ivLength != this.iv.length) { throw new IOException("Incorrect IV length: expected=" + iv.length + " have=" + ivLength); } IOUtils.readFully(in, this.iv); int codedLength = StreamUtils.readRawVarint32(in); byte[] codedBytes = new byte[codedLength]; IOUtils.readFully(in, codedBytes); decryptor.setIv(iv); decryptor.reset(); InputStream cin = decryptor.createDecryptionStream(new ByteArrayInputStream(codedBytes)); // TODO: Add support for WAL compression int keylength = StreamUtils.readRawVarint32(cin); int vlength = StreamUtils.readRawVarint32(cin); int tagsLength = StreamUtils.readRawVarint32(cin); int length = 0; if (tagsLength == 0) { length = KeyValue.KEYVALUE_INFRASTRUCTURE_SIZE + keylength + vlength; } else { length = KeyValue.KEYVALUE_WITH_TAGS_INFRASTRUCTURE_SIZE + keylength + vlength + tagsLength; } byte[] backingArray = new byte[length]; int pos = 0; pos = Bytes.putInt(backingArray, pos, keylength); pos = Bytes.putInt(backingArray, pos, vlength); // Row int elemLen = StreamUtils.readRawVarint32(cin); pos = Bytes.putShort(backingArray, pos, (short) elemLen); IOUtils.readFully(cin, backingArray, pos, elemLen); pos += elemLen; // Family elemLen = StreamUtils.readRawVarint32(cin); pos = Bytes.putByte(backingArray, pos, (byte) elemLen); IOUtils.readFully(cin, backingArray, pos, elemLen); pos += elemLen; // Qualifier elemLen = StreamUtils.readRawVarint32(cin); IOUtils.readFully(cin, backingArray, pos, elemLen); pos += elemLen; // Remainder IOUtils.readFully(cin, backingArray, pos, length - pos); return new KeyValue(backingArray, 0, length); }