Example usage for org.bouncycastle.util.encoders Hex encode

List of usage examples for org.bouncycastle.util.encoders Hex encode

Introduction

In this page you can find the example usage for org.bouncycastle.util.encoders Hex encode.

Prototype

public static byte[] encode(byte[] data, int off, int length) 

Source Link

Document

encode the input data producing a Hex encoded byte array.

Usage

From source file:io.warp10.script.lora.LORAMIC.java

License:Apache License

@Override
public Object apply(WarpScriptStack stack) throws WarpScriptException {

    Object top = stack.pop();/*from  ww w  . j  a va 2s.co m*/

    if (!(top instanceof String)) {
        throw new WarpScriptException(getName() + " expects a 128 bits hex encoded key on top of the stack.");
    }

    String keystr = top.toString();

    if (keystr.length() != 32) {
        throw new WarpScriptException(getName() + " expects a 128 bits hex encoded key on top of the stack.");
    }

    top = stack.pop();

    if (!(top instanceof Long)) {
        throw new WarpScriptException(getName() + " expects a sequence counter below the key.");
    }

    int sequenceCounter = ((Number) top).intValue();

    top = stack.pop();

    if (!(top instanceof Long)) {
        throw new WarpScriptException(
                getName() + " expects a direction (0 uplink or 1 downlink) below the sequence counter.");
    }

    int dir = ((Number) top).intValue();

    if (0 != dir && 1 != dir) {
        throw new WarpScriptException(
                getName() + " expects a direction (0 uplink or 1 downlink) below the sequence counter.");
    }

    top = stack.pop();

    if (!(top instanceof Long)) {
        throw new WarpScriptException(getName() + " expects a device address below the direction.");
    }

    int addr = ((Number) top).intValue();

    String datastr = stack.pop().toString();

    if (0 != datastr.length() % 2) {
        throw new WarpScriptException(
                getName() + " expects a hex encoded data frame with an even length of hex digits.");
    }

    byte[] data = Hex.decode(datastr);

    //
    // Compute MIC block B0
    //

    byte[] MicBlockB0 = new byte[16];

    MicBlockB0[0] = 0x49;
    MicBlockB0[5] = (byte) (dir & 0x1);
    MicBlockB0[6] = (byte) (addr & 0xFF);
    MicBlockB0[7] = (byte) ((addr >> 8) & 0xFF);
    MicBlockB0[8] = (byte) ((addr >> 16) & 0xFF);
    MicBlockB0[9] = (byte) ((addr >> 24) & 0xFF);

    MicBlockB0[10] = (byte) ((sequenceCounter) & 0xFF);
    MicBlockB0[11] = (byte) ((sequenceCounter >> 8) & 0xFF);
    MicBlockB0[12] = (byte) ((sequenceCounter >> 16) & 0xFF);
    MicBlockB0[13] = (byte) ((sequenceCounter >> 24) & 0xFF);

    MicBlockB0[15] = (byte) (data.length & 0xFF);

    AESEngine aes = new AESEngine();
    CMac cmac = new CMac(aes);
    KeyParameter key = new KeyParameter(Hex.decode(keystr));
    cmac.init(key);
    cmac.update(MicBlockB0, 0, MicBlockB0.length);
    cmac.update(data, 0, data.length & 0xFF);

    byte[] mac = new byte[cmac.getMacSize()];
    cmac.doFinal(mac, 0);

    //    byte[] mic = new byte[4];
    //    mic[0] = mac[3];
    //    mic[1] = mac[2];
    //    mic[2] = mac[1];
    //    mic[3] = mac[0];

    stack.push(new String(Hex.encode(mac, 0, 4), Charsets.US_ASCII));

    return stack;
}