1 package org.metricshub.ipmi.core.coding.payload; 2 3 /*- 4 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲ 5 * IPMI Java Client 6 * ჻჻჻჻჻჻ 7 * Copyright 2023 Verax Systems, MetricsHub 8 * ჻჻჻჻჻჻ 9 * This program is free software: you can redistribute it and/or modify 10 * it under the terms of the GNU Lesser General Public License as 11 * published by the Free Software Foundation, either version 3 of the 12 * License, or (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Lesser Public License for more details. 18 * 19 * You should have received a copy of the GNU General Lesser Public 20 * License along with this program. If not, see 21 * <http://www.gnu.org/licenses/lgpl-3.0.html>. 22 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱ 23 */ 24 25 import java.security.InvalidKeyException; 26 27 import org.metricshub.ipmi.core.coding.security.ConfidentialityAlgorithm; 28 29 /** 30 * Payload for IPMI messages 31 */ 32 public abstract class IpmiPayload { 33 34 private byte[] data; 35 36 private byte[] encryptedPayload; 37 38 public void setData(byte[] data) { 39 this.data = data; 40 } 41 42 public byte[] getData() { 43 return data; 44 } 45 46 /** 47 * Returns encrypted payload encoded in byte array. 48 * 49 * Migth be null if payload was not yet encrypted. 50 * 51 * @see #encryptPayload(ConfidentialityAlgorithm) 52 */ 53 public byte[] getEncryptedPayload() { 54 return encryptedPayload; 55 } 56 57 /** 58 * Returns unencrypted payload encoded in byte array (owner is responsible 59 * for encryption). 60 * 61 * @return payload 62 */ 63 public abstract byte[] getPayloadData(); 64 65 /** 66 * Returns encoded but UNENCRYPTED payload length. 67 */ 68 public abstract int getPayloadLength(); 69 70 /** 71 * Returns IPMI command encapsulated in IPMI Payload. 72 */ 73 public abstract byte[] getIpmiCommandData(); 74 75 /** 76 * Encrypts {@link #getPayloadData()}. 77 * 78 * @param confidentialityAlgorithm 79 * {@link ConfidentialityAlgorithm} to be used to encrypt payload 80 * data. 81 * @throws InvalidKeyException 82 * - when confidentiality algorithm fails. 83 * @see IpmiPayload#getEncryptedPayload() 84 */ 85 public void encryptPayload(ConfidentialityAlgorithm confidentialityAlgorithm) 86 throws InvalidKeyException { 87 encryptedPayload = confidentialityAlgorithm.encrypt(getPayloadData()); 88 } 89 }