1 1.2 pgoyette /* $NetBSD: h_gcm.c,v 1.2 2014/01/17 14:16:08 pgoyette Exp $ */ 2 1.1 pgoyette 3 1.1 pgoyette /*- 4 1.1 pgoyette * Copyright (c) 2014 The NetBSD Foundation, Inc. 5 1.1 pgoyette * All rights reserved. 6 1.1 pgoyette * 7 1.1 pgoyette * Redistribution and use in source and binary forms, with or without 8 1.1 pgoyette * modification, are permitted provided that the following conditions 9 1.1 pgoyette * are met: 10 1.1 pgoyette * 1. Redistributions of source code must retain the above copyright 11 1.1 pgoyette * notice, this list of conditions and the following disclaimer. 12 1.1 pgoyette * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 pgoyette * notice, this list of conditions and the following disclaimer in the 14 1.1 pgoyette * documentation and/or other materials provided with the distribution. 15 1.1 pgoyette * 16 1.1 pgoyette * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.1 pgoyette * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.1 pgoyette * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.1 pgoyette * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.1 pgoyette * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.1 pgoyette * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.1 pgoyette * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.1 pgoyette * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.1 pgoyette * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.1 pgoyette * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.1 pgoyette * POSSIBILITY OF SUCH DAMAGE. 27 1.1 pgoyette */ 28 1.1 pgoyette 29 1.1 pgoyette #include <err.h> 30 1.1 pgoyette #include <fcntl.h> 31 1.1 pgoyette #include <stdio.h> 32 1.1 pgoyette #include <string.h> 33 1.1 pgoyette 34 1.1 pgoyette #include <sys/ioctl.h> 35 1.1 pgoyette #include <sys/time.h> 36 1.1 pgoyette 37 1.1 pgoyette #include <crypto/cryptodev.h> 38 1.1 pgoyette 39 1.1 pgoyette unsigned char key[20] = { 0 }; 40 1.1 pgoyette char plaintx[16] = { 0 }; 41 1.1 pgoyette unsigned char iv[16] = { 0 }; 42 1.1 pgoyette const unsigned char ciphertx[16] = { 43 1.1 pgoyette 0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92, 44 1.1 pgoyette 0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78 45 1.1 pgoyette }; 46 1.1 pgoyette const unsigned char hash[16] = { 47 1.1 pgoyette 0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd, 48 1.1 pgoyette 0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf 49 1.1 pgoyette }; 50 1.1 pgoyette 51 1.1 pgoyette int 52 1.1 pgoyette main(void) 53 1.1 pgoyette { 54 1.1 pgoyette int fd, res; 55 1.1 pgoyette struct session_op cs; 56 1.1 pgoyette struct crypt_op co; 57 1.1 pgoyette unsigned char databuf[16]; 58 1.1 pgoyette unsigned char macbuf[16]; 59 1.1 pgoyette unsigned char databuf2[16]; 60 1.1 pgoyette 61 1.1 pgoyette fd = open("/dev/crypto", O_RDWR, 0); 62 1.1 pgoyette if (fd < 0) 63 1.1 pgoyette err(1, "open"); 64 1.1 pgoyette memset(&cs, 0, sizeof(cs)); 65 1.1 pgoyette cs.mac = CRYPTO_AES_128_GMAC; 66 1.1 pgoyette cs.mackeylen = sizeof(key); 67 1.1 pgoyette cs.mackey = key; 68 1.1 pgoyette cs.cipher = CRYPTO_AES_GCM_16; 69 1.1 pgoyette cs.key = key; 70 1.1 pgoyette cs.keylen = sizeof(key); 71 1.1 pgoyette res = ioctl(fd, CIOCGSESSION, &cs); 72 1.1 pgoyette if (res < 0) 73 1.1 pgoyette err(1, "CIOCGSESSION"); 74 1.1 pgoyette 75 1.1 pgoyette memset(&co, 0, sizeof(co)); 76 1.1 pgoyette memset(databuf, 0, sizeof(databuf)); 77 1.1 pgoyette memset(macbuf, 0, sizeof(macbuf)); 78 1.1 pgoyette co.ses = cs.ses; 79 1.1 pgoyette co.op = COP_ENCRYPT; 80 1.1 pgoyette co.len = sizeof(plaintx); 81 1.1 pgoyette co.src = plaintx; 82 1.1 pgoyette co.dst = databuf; 83 1.1 pgoyette co.mac = macbuf; 84 1.1 pgoyette co.iv = iv; 85 1.1 pgoyette res = ioctl(fd, CIOCCRYPT, &co); 86 1.1 pgoyette if (res < 0) 87 1.1 pgoyette err(1, "CIOCCRYPT"); 88 1.1 pgoyette #if 1 89 1.1 pgoyette if (memcmp(co.dst, ciphertx, sizeof(ciphertx))) 90 1.1 pgoyette errx(1, "verification failed"); 91 1.1 pgoyette if (memcmp(macbuf, hash, sizeof(hash))) 92 1.1 pgoyette errx(1, "hash failed"); 93 1.1 pgoyette #else 94 1.1 pgoyette { 95 1.1 pgoyette int i; 96 1.1 pgoyette for (i = 0; i < sizeof(databuf); i++) 97 1.1 pgoyette printf("%02x ", databuf[i]); 98 1.1 pgoyette printf("\n"); 99 1.1 pgoyette } 100 1.1 pgoyette { 101 1.1 pgoyette int i; 102 1.1 pgoyette for (i = 0; i < sizeof(macbuf); i++) 103 1.1 pgoyette printf("%02x ", macbuf[i]); 104 1.1 pgoyette printf("\n"); 105 1.1 pgoyette } 106 1.1 pgoyette #endif 107 1.1 pgoyette memset(databuf2, 0, sizeof(databuf2)); 108 1.1 pgoyette memset(macbuf, 0, sizeof(macbuf)); 109 1.1 pgoyette co.ses = cs.ses; 110 1.1 pgoyette co.op = COP_DECRYPT; 111 1.1 pgoyette co.len = sizeof(databuf); 112 1.1 pgoyette co.src = databuf; 113 1.1 pgoyette co.dst = databuf2; 114 1.1 pgoyette co.mac = macbuf; 115 1.1 pgoyette co.iv = iv; 116 1.1 pgoyette res = ioctl(fd, CIOCCRYPT, &co); 117 1.1 pgoyette if (res < 0) 118 1.1 pgoyette err(1, "CIOCCRYPT"); 119 1.2 pgoyette 120 1.1 pgoyette if (memcmp(co.dst, plaintx, sizeof(plaintx))) 121 1.1 pgoyette errx(1, "verification failed"); 122 1.1 pgoyette if (memcmp(macbuf, hash, sizeof(hash))) 123 1.1 pgoyette errx(1, "hash failed"); 124 1.2 pgoyette 125 1.1 pgoyette return 0; 126 1.1 pgoyette } 127