secamsenderp.nc

来自「tinyos-2.x.rar」· NC 代码 · 共 175 行

NC
175
字号
/*
* Copyright (c) 2008 Johns Hopkins University.
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose, without fee, and without written
* agreement is hereby granted, provided that the above copyright
* notice, the (updated) modification history and the author appear in
* all copies of this source code.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED  TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE
* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR  CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE,  DATA,
* OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR  OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/

/**
 * @author JeongGil Ko
 * @author Razvan Musaloiu-E.
 * @author Jong Hyun Lim
 */

generic module SecAMSenderP(am_id_t id)
{
  provides {
    interface AMSend;
    interface CC2420SecurityMode;
  }

  uses {
    interface AMSend as SubAMSend;
    interface Packet as SecurityPacket;
    interface AMPacket;
    interface Leds;
  }
}

implementation
{
  uint32_t nonceCounter = 0;
  uint8_t secLevel = NO_SEC;
  uint8_t keyIndex = 0;
  uint8_t reserved = 0; // skip in cc2420 implementations
  uint8_t micLength = 0;
  uint8_t length;

  command error_t AMSend.send(am_addr_t addr, message_t* msg, uint8_t len)
  {
    cc2420_header_t* hdr = (cc2420_header_t*)msg->header;
    security_header_t* secHdr = (security_header_t*)&hdr->secHdr;

    if(secHdr->secLevel == CBC_MAC_4 || secHdr->secLevel == CCM_4){
      micLength = 4;
    }else if(secHdr->secLevel == CBC_MAC_8 || secHdr->secLevel == CCM_8){
      micLength = 8;
    }else if(secHdr->secLevel == CBC_MAC_16 || secHdr->secLevel == CCM_16){
      micLength = 16;
    }

    return call SubAMSend.send(addr, msg, len + (((secHdr->secLevel >= CBC_MAC_4 && secHdr->secLevel <= CBC_MAC_16) || (secHdr->secLevel >= CCM_4 && secHdr->secLevel <= CCM_16)) ? micLength : 0));
  }

  command uint8_t AMSend.maxPayloadLength()
  {
    return call SecurityPacket.maxPayloadLength();
  }

  command void* AMSend.getPayload(message_t* msg, uint8_t len)
  {
    return call SecurityPacket.getPayload(msg, len);
  }

  command error_t AMSend.cancel(message_t* msg) { return call SubAMSend.cancel(msg); }
  event void SubAMSend.sendDone(message_t *msg, error_t error) { signal AMSend.sendDone(msg, error); }




  command error_t CC2420SecurityMode.setCtr(message_t* msg, uint8_t setKey, uint8_t setSkip)
  {
    cc2420_header_t* hdr = (cc2420_header_t*)msg->header;
    security_header_t* secHdr = (security_header_t*)&hdr->secHdr;

    if (setKey > 1 || setSkip > 7){
      return FAIL;
    }
    secLevel = CTR;
    keyIndex = setKey;
    reserved = setSkip;

    nonceCounter++;

    secHdr->secLevel = secLevel;
    secHdr->keyMode = 1; // Fixed to 1 for now
    secHdr->reserved = reserved; //skip in cc2420
    secHdr->frameCounter = nonceCounter;
    secHdr->keyID[0] = keyIndex; // Always first position for now due to fixed keyMode
    hdr->fcf |= 1 << IEEE154_FCF_SECURITY_ENABLED;
    return SUCCESS;
  }



  command error_t CC2420SecurityMode.setCbcMac(message_t* msg, uint8_t setKey, uint8_t setSkip, uint8_t size)
  {
    cc2420_header_t* hdr = (cc2420_header_t*)msg->header;
    security_header_t* secHdr = (security_header_t*)&hdr->secHdr;

    if (setKey > 1 || (size != 4 && size != 8 && size != 16) || (setSkip > 7)){
      return FAIL;
    }

    if(size == 4)
      secLevel = CBC_MAC_4;
    else if (size == 8)
      secLevel = CBC_MAC_8;
    else if (size == 16)
      secLevel = CBC_MAC_16;
    else
      return FAIL;
    keyIndex = setKey;
    reserved = setSkip;

    nonceCounter++;

    secHdr->secLevel = secLevel;
    secHdr->keyMode = 1; // Fixed to 1 for now
    secHdr->reserved = reserved; //skip in cc2420
    secHdr->frameCounter = nonceCounter;
    secHdr->keyID[0] = keyIndex; // Always first position for now due to fixed keyMode
    hdr->fcf |= 1 << IEEE154_FCF_SECURITY_ENABLED;

    return SUCCESS;
  }


  command error_t CC2420SecurityMode.setCcm(message_t* msg, uint8_t setKey, uint8_t setSkip, uint8_t size)
  {
    cc2420_header_t* hdr = (cc2420_header_t*)msg->header;
    security_header_t* secHdr = (security_header_t*)&hdr->secHdr;

    if (setKey > 1 || (size != 4 && size != 8 && size != 16) || (setSkip > 7)){
      return FAIL;
    }

    if(size == 4)
      secLevel = CCM_4;
    else if (size == 8)
      secLevel = CCM_8;
    else if (size == 16)
      secLevel = CCM_16;
    else
      return FAIL;
    keyIndex = setKey;
    reserved = setSkip;

    nonceCounter++;

    secHdr->secLevel = secLevel;
    secHdr->keyMode = 1; // Fixed to 1 for now
    secHdr->reserved = reserved; //skip in cc2420
    secHdr->frameCounter = nonceCounter;
    secHdr->keyID[0] = keyIndex; // Always first position for now due to fixed keyMode
    hdr->fcf |= 1 << IEEE154_FCF_SECURITY_ENABLED;

    return SUCCESS;
  }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?