encrypt.c 2.55 KB
Newer Older
包珍珍 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
#include <avr/io.h>
#include <avr/sfr_defs.h>
#include <stdlib.h>
#include <string.h>
#include "config.h"

extern void crypto_aead_encrypt_asm(
      unsigned char *c,         
      const unsigned char *m,   
      unsigned char mlen,  
      const unsigned char *ad,  
      unsigned char adlen, 
      const unsigned char *npub,
      const unsigned char *k    
      );

extern int  crypto_aead_decrypt_asm(
     unsigned char *m,          
     const unsigned char *c,    
     unsigned char clen,   
     const unsigned char *ad,   
     unsigned char adlen,  
     const unsigned char *npub, 
     const unsigned char *k     
     );

extern void crypto_hash_asm(
    unsigned char *out,
    const unsigned char *in,
    unsigned char inlen
    );


int crypto_aead_encrypt(
    unsigned char *c, unsigned long long *clen,
    const unsigned char *m, unsigned long long mlen,
    const unsigned char *ad, unsigned long long adlen,
    const unsigned char *nsec,
    const unsigned char *npub,
    const unsigned char *k
    )
{
    /*
    ... 
    ... the code for the cipher implementation goes here,
    ... generating a ciphertext c[0],c[1],...,c[*clen-1]
    ... from a plaintext m[0],m[1],...,m[mlen-1]
    ... and associated data ad[0],ad[1],...,ad[adlen-1]
    ... and nonce npub[0],npub[1],..
    ... and secret key k[0],k[1],...
    ... the implementation shall not use nsec
    ...
    ... return 0;
    */

    (void)nsec;

    crypto_aead_encrypt_asm(c, m, mlen, ad, adlen, npub, k);

    *clen = mlen + TAG_INBYTES;
    return 0;
}



int crypto_aead_decrypt(
    unsigned char *m, unsigned long long *mlen,
    unsigned char *nsec,
    const unsigned char *c, unsigned long long clen,
    const unsigned char *ad, unsigned long long adlen,
    const unsigned char *npub,
    const unsigned char *k
    )
{
    /*
    ...
    ... the code for the AEAD implementation goes here,
    ... generating a plaintext m[0],m[1],...,m[*mlen-1]
    ... and secret message number nsec[0],nsec[1],...
    ... from a ciphertext c[0],c[1],...,c[clen-1]
    ... and associated data ad[0],ad[1],...,ad[adlen-1]
    ... and nonce number npub[0],npub[1],...
    ... and secret key k[0],k[1],...
    ...
    ... return 0;
    */
    unsigned long long    mlen_;
    unsigned char tag_is_match;

    (void)nsec;
    if (clen < CRYPTO_ABYTES) {
        return -1;
    }
    mlen_ = clen - CRYPTO_ABYTES;

    tag_is_match = crypto_aead_decrypt_asm(m, c, mlen_, ad, adlen, npub, k);

    if (tag_is_match != 0)
    {
        memset(m, 0, (size_t)mlen_);
        return -1;
    }

    *mlen = mlen_;
    return 0;
}