public synchronized void sendPSO(SecureMessagingWrapper wrapper,
			byte[] certData) throws CardServiceException {
		int maxBlock = 223;
		int blockSize = 223;
		int offset = 0;
		int length = certData.length;
		if (certData.length > maxBlock) {
			int numBlock = certData.length / blockSize;
			if (numBlock * blockSize < certData.length) {
				numBlock++;
			}
			int i = 0;
			while (i < numBlock - 1) {
				CommandAPDU c = createPSOAPDU(certData, offset, blockSize,
						false);
				if (wrapper != null) {
					c = wrapper.wrap(c);
				}
				ResponseAPDU r = transmit(c);
				if (wrapper != null) {
					r = wrapper.unwrap(r, r.getBytes().length);
				}
				int sw = r.getSW();
				if ((short) sw != ISO7816.SW_NO_ERROR) {
					throw new CardServiceException("Sending PSO failed.");
				}
				length -= blockSize;
				offset += blockSize;
				i++;
			}
		}
		CommandAPDU c = createPSOAPDU(certData, offset, length, true);
		if (wrapper != null) {
			c = wrapper.wrap(c);
		}
		ResponseAPDU r = transmit(c);
		if (wrapper != null) {
			r = wrapper.unwrap(r, r.getBytes().length);
		}
		int sw = r.getSW();
		if ((short) sw != ISO7816.SW_NO_ERROR) {
			throw new CardServiceException("Sending PSO failed.");
		}
	}