Linux Box 에 설치된 암호화 알고리즘의 목록을 확인해 보려면 /proc/crypto 파일을 보면 된다. 

poplinux@poplinux:/proc$ cat crypto 
name         : hmac(sha1)
driver       : hmac(sha1-generic)
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : shash
blocksize    : 64
digestsize   : 20
.
.
.
nake        : md5
driver       : md5-generic
module       : kernel
priority     : 0
refcnt       : 9
selftest     : passed
type         : shash
blocksize    : 64
digestsize   : 16

 
 crypto 알고리즘을 등록할 때 사용하는 구조체인 struct crypto_alg 를 살펴보면 알고리즘 이름, 드라이버 이름을 지정하게 되어 있다.  

 하지만 md5 모듈을 보면 driver 이름은 지정하고 있지 않은 것을 확인 할 수 있다. 

crypto/md5.c

static struct shash_alg alg = {
  .digestsize = MD5_DIGEST_SIZE,
  .init          = md5_init,
  .update      = md5_update,
  .final         = md5_final,
  .export       = md5_export,
  .import       = md5_import,
  .descsize    = sizeof(struct md5_sate),
  .statesize    = sizeof(struct md5_state),
  .base         = {
     .cra_name  = "md5",
     .cra_flags   = CRYPTO_ALG_TYPE_SHASH,
     .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
     .cra_module    = THIS_MODULE,
  }
};

 

 드라이버 이름을 지정하지 않았는데도 어떻게 "md5-generic" 라는 이름이 잡혀 있을까?

 그건 아래 코드와 같이 강제로 지정해 주기 때문이다. 
 
crypto/algapi.c

static inline int crypto_set_driver_name(struct crypto_alg *alg)
{
  static const char suffix[]= "-generic";
  char *driver_name = alg->cra_driver_name;
  int len;

  if(*driver_name)
      return 0;

  len = strlcpy(driver_name, alg->cra_name, CRYPTO_MAX_ALG_NAME);
  if(len + sizeof(suffix) > CRYPTO_MAX_ALG_NAME)
     return -ENAMETOLONG;

  memcpy(driver_name + len, suffix, sizeof(suffix));
  return 0;
}
 
 
블로그 이미지

김유석0

,

[crypto] ASync Hash api

development 2011. 10. 12. 11:28
Linux Crypto 엔 hash 알고리즘 모듈이 들어가 있습니다.

1. HASH 란 무엇인가?
  HASH 란 결정형(Deterministic procedure) 단방향 알고리즘입니다. 
  풀어서 설명하면 어떤 데이터가 있는데 이 데이터의 결과값의 크기는 항상 지정된 크기로 나오게 되고 한번 Hash 과정을 거치면 원래 데이터가 무엇이었는지를 역으로 풀어 볼 수가 없다는 뜻입니다. 

 HASH 알고리즘 중에 MD5  를 예를 들면
   출력 크기 : 128bit(16Byte)
   원본 데이터 : "MKKIM_BABO"
   출력 데이터 : "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e"(여기서 '\x' 는 구분자 이므로 실제 데이터는d41d8cd98f00b204e9800998ecf8427e" 입니다.) 

  로 나오다고 가정할 때, 입력 데이터의 크기에 상관 없이 출력 데이터의 길이는 무조건 128bit(16Byte) 이고 출력 데이터를 바탕으로 원본 데이터인 "MKKIM_BABO" 를 역추적할 수가 없습니다. 

  Hash 는 암호화가 아닙니다. 암호화는 암호/복호가 가능해야 하는데 hash 는 복호가 불가능합니다. 
  그러므로 보내진 데이터가 오염없이 정상적인 데이터인지를 확인하는 용도로 사용된다고 보면 됩니다. 


 
   



 
블로그 이미지

김유석0

,
completion(완료)는 kernel 동기화 기법중 하나입니다. 

API 는 아래와 같습니다.

#include <linux/completion.h>

DECLEAR_COMPLETION(struct completion comp);
init_completion(struct completion *comp);
void wailt_for_completion(struct completion *comp);
void complete(struct completion *comp);
void complete_all(struct completion *comp);

1. wait 을 걸때

#include <linux/module.h> 
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/time.h>

struct completion comp;

static int wait(void)
{
  init_completion(&comp);
  wait_for_completion(&comp);


1. wait 을 풀때

#include <linux/module.h> 
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/time.h>

struct completion comp;

static int un_wait(void)
{
  complete(&comp);



풀 동작하는 샘플 코드는 아래와 같이 첨부 파일을 참조 바랍니다.

completion.c

Makefile

 
블로그 이미지

김유석0

,
예를 들어 sync type api 인 crypto_alloc_hash() 가 있다고 치면

이 함수의 ASync type은 crypto_alloc_ahash() 로 명명한다.

이런 법칙을 알고 있으면 소스 분석할 때 도움이 될 것으로 생각된다. 


 

'development' 카테고리의 다른 글

[crypto] ASync Hash api  (0) 2011.10.12
[kernel] 동기화 기능. completion()  (0) 2011.10.10
[linux_kernel] scatterlist example  (0) 2011.09.27
[linux kernel]Scatter list  (1) 2011.09.27
[HW] TTL 과 RS232 에 대한 정리  (0) 2011.09.26
블로그 이미지

김유석0

,
 scatterlist 관련한 코드의 예시를 살펴보기 위해 커널 소스를 뒤져 보았는데 생각외로 광범위하게 사용되고 있어서 조금 놀랐다. 

 scatterlist 에 대해 알아보기 시작한 것이 crypto 쪽 작업 때문이었는데 crypto 뿐 아니라 filesystem, video driver, frame buffer 등등 분야를 가리지 않고 광범위하게 사용되고 있음을 확인 할 수 있었다. 

 그도 그럴것이 scatterlist 라는 것이 DMA 를 위한 것이니 DMA 를 사용하는 것에서는 모두 사용이 되고 있는 것이 당연할 것이다.

 무엇보다 scatterlist 의 가장 간단한 example 를 찾기 위해 구글을 뒤졌는데 아래와 같은 소스가 보기 쉽다는 답변을 확인 하였다.

 security/seclvl.c
 linux/fs/ecryptfs/ : eCryptfs file system 
 linux/drivers/staging/rtl8187se/ieee80211 : 802.11 wireless stack 

이중에서 가장 쉬운 코드가  security/seclvl.c 라는 설명이 있었는데 아쉽게도 kernel-2.6.18 이후론 없어진 것 같다. 
그래도 참조용으로 코드를 아래 정리해 보았다.
 

static int
plaintext_to_sha1(unsigned char *hash, const char *plaintext, unsigned int len)
{
  struct crypto_tfm *tfm;
  struct scatterlist sg;
  if (len > PAGE_SIZE) {
    seclvl_printk(0, KERN_ERR, "Plaintext password too large (%d "
            "characters).  Largest possible is %lu "
            "bytes.\n", len, PAGE_SIZE);
    return -EINVAL;
  }
  tfm = crypto_alloc_tfm("sha1", CRYPTO_TFM_REQ_MAY_SLEEP);
  if (tfm == NULL) {
    seclvl_printk(0, KERN_ERR,
            "Failed to load transform for SHA1\n");
    return -EINVAL;
  }
  sg_init_one(&sg, (u8 *)plaintext, len);
  crypto_digest_init(tfm);
  crypto_digest_update(tfm, &sg, 1);
  crypto_digest_final(tfm, hash);
  crypto_free_tfm(tfm);
  return 0; 
} 



아래 코드도 참조용으로 유용한 것으로 생각된다. (출처 : http://stackoverflow.com/questions/3869028/how-to-use-cryptoapi-in-the-linux-kernel-2-6)

struct crypto_hash *tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);
if (tfm == NULL)
    fail;
char *output_buf = kmalloc(crypto_hash_digestsize(tfm), GFP_KERNEL);
if (output_buf == NULL)
    fail;
struct scatterlist sg[2];
struct hash_desc desc = {.tfm = tfm};
ret = crypto_hash_init(&desc);
if (ret != 0)
    fail;
sg_init_table(sg, ARRAY_SIZE(sg));
sg_set_buf(&sg[0], "Hello", 5);
sg_set_buf(&sg[1], " World", 6);
ret = crypto_hash_digest(&desc, sg, 11, output_buf);
if (ret != 0)
    fail;

 
  참고로 scatterlist example 은 아니지만 암호화 테스트용 샘플 코드로써 암호화 API 를 사용하는 법을 쉽게 볼 수 있는 코드도 있다. 

  crypto/tcrypt.c


 
블로그 이미지

김유석0

,
넥스지에서 주어진 업무가 Crypto 기능을 Sync 에서 ASync 로 변경하는 일이어서 관련 문서들을 살펴보고 있다. 

Documentation/crypto/api-intro.txt 를 살펴보고 있는데 아래와 같이 시작을 하고 있다.


Scatterlist Cryptographic API

InTRODUCTION
The Scatterlist Crypto API takes page vectors(scatterlists) as arguments, and works directly on pages. In some cases(e.g. ECB mode ciphers), this will allow for pages to be encrypted in-place with no copying.
 
 
Scatter/gather 는 함께 움직이는 개념이다. 

Scatter 의 사전적 의미는
  scatter [skt]   단어장에 추가
  1.…을 뿌리다, 흩뿌리다, 살포하다, [씨]를 뿌리다[on, over, with ].
  2.흩어지다, 뿔뿔이 헤어지다, 분산하다.
  
 이고,

Gather 의 사전적 의미는

  gather
 [g]   단어장에 추가
  1.모으다, 끌어[긁어]모으다(in, up, together); [물건]을 하나하나 줍다.
 

DMA 전송에 있어서 데이터가 물리 메모리 상에 일렬로 정렬되어 있는 것은 아주 중요한 요소이다.

 커널 영역에서 메모리 관리를 할 때는 어렵긴 하지만(오버헤드가 크지만) 물리 메모리에 일렬로 정렬해서 사용하는 것이 가능하지만 사용자 영역에서는 이렇게 할 수가 없다.
 
 커널 영역에서 메모리를 물리 영역에 일렬로 정리해서 쓰는것이 가능하다고 했지만 여기 저기 흩어져 있는(Scatter) 메모리를 일렬로 정렬되어 있는 것처럼 사용할 수 있다면 좀더 편한 관리가 가능할 것이다. 

 다시 정리하면 Scatter/Gather 의 개념은 여기 저기 흩어져 있는 메모리(Scatter) 를 논리적으로 모아서(Gather) 연속된 물리적 메모리처럼 사용하는 것을 의미하며 Scatterlist 는 여기 저기 흩어져 있는 메모리(Scatter) 의 모음(array) 라고 보면 된다.

 DMA 전송에 사용되는 개념이다. 

    struct scatterlist{
      struct page *page;
      unsigned int offset;
      dma_addr_t dma_address;
      unsigned int length;
    } 

위 구조체를 보면 알겠지만 하나의 흩어져 있는 메모리의 정보를 담을 수 있도록 되어 있고 위 구조체가 여러개 모이면 마치 하나의 연속된 메모리처럼 동작시킬 수 있게 된다. 

아래 파일은 Scatter list 에 대한 간략한 diagram 이다. 
 

'development' 카테고리의 다른 글

[crypto] ASync crypto 와 Sync crypto api 함수명 특징  (0) 2011.10.10
[linux_kernel] scatterlist example  (0) 2011.09.27
[HW] TTL 과 RS232 에 대한 정리  (0) 2011.09.26
[HW] TTL Level 과 CMOS Level  (0) 2011.09.26
[crypto] IPSec  (0) 2011.09.23
블로그 이미지

김유석0

,
TTL : Transistor-Transistor Logic

SoC든 CPU에 I/O는 내부적으로 보면 Transistor로 이루어져 있고

HIGH LEVEL : SoC/CPU I/O Voltage
Low LEVEL : SoC/CPU I/O Zero Voltage

결국 TTL 통신이라고 하면 SoC/CPU I/O Voltage를 가지고 "1", "0"통신을 하는 것을 말함.


RS232 통신 & LEVEL

TTL통신은 낮은 Voltage를 사용하며 (최대 20mA정도 밖에 되지 않기 때문에)

장거리 통신에는 잡음 및 간섭 에러율이 높음.( 9cm 정도가 맥스(??))

좀더 멀리 떨어진 장비간 통신을 위해(10m정도~??)

전압을 높여서 보내는 방식임.

HIGH LEVEL : +12 Volt
Low LEVEL : -12V Volt




아래 사이트에 중간에 있는 그림을 참조하면
http://cafe.naver.com/at0.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=453&

TTL레벨(5V)출력 파형과 RS-232출력 파형은 반대인걸 알 수 있음이야....이해가시나??

신호가 

TTL레벨 "1(5V)"일 때

RS-232레벨 출력은 " 0(-12V)" 임.

RS-232 를 받는 쪽에서는 

0.7V이상일 때 "1"로 인식하고

-0.7V이하일 때 "0"으로 인식하지 (에러율을 낮추기 위한 방안이지. 중간값의 작은 노이즈는 데이터로 인식 안하지)


하지만 나중에 사람들은 알게 된거야~ 에너지를 크게해서 보낸다고 멀리가는게 아니란걸~~
그래서 RS-485를 만들게 되지
여기까지는 설명 필요 없을 듯 하구만~!!


출처 : 황진상
 

'development' 카테고리의 다른 글

[linux_kernel] scatterlist example  (0) 2011.09.27
[linux kernel]Scatter list  (1) 2011.09.27
[HW] TTL Level 과 CMOS Level  (0) 2011.09.26
[crypto] IPSec  (0) 2011.09.23
GCC on-line  (0) 2011.09.22
블로그 이미지

김유석0

,
TTL Level 과 CMOS Level 에 대한 자료. 


출처 : 인터넷 어디선가

Tnote01.pdf

 

'development' 카테고리의 다른 글

[linux kernel]Scatter list  (1) 2011.09.27
[HW] TTL 과 RS232 에 대한 정리  (0) 2011.09.26
[crypto] IPSec  (0) 2011.09.23
GCC on-line  (0) 2011.09.22
GDB  (4) 2011.01.05
블로그 이미지

김유석0

,

[crypto] IPSec

development 2011. 9. 23. 11:02

IPSec.pdf

 IPSec 은 VPN(Virtual Private Network) 에서 사용되는 핵심 기반 기술입니다. 

 VPN 은 간단히 설명하면 두 개의 독립된 네트웍을 하나로 묶어 주는 기술이라고 보면 됩니다.

 아래와 같이 엮어 주게 되는데 A 망과 B 망 사이에 일종의 논리적인 터널을 하나 뚫어서 두 개의 망을 하나로 묶게 됩니다.  

 


 예시를 보시면 아시겠지만 "터널" 이 뚫리는 위치가 인터넷이기 때문에 A 망과 B 망 사이의 데이터 통신을 할 때는 암호화를 해 주어야 다른 사람들이 들어 올 수가 없습니다. 

 그런 암호화에 관련된 일을 해 주는 기술이 바로 IPSec 입니다.

 IPSec 은 Internet Protocol Security Protocol 의 약어입니다. 

 자세한 내용은 첨부파일 참조 부탁합니다. 


내용 출처 : http://tadoli.springnote.com/pages/1318078?print=1

 




  

'development' 카테고리의 다른 글

[linux kernel]Scatter list  (1) 2011.09.27
[HW] TTL 과 RS232 에 대한 정리  (0) 2011.09.26
[HW] TTL Level 과 CMOS Level  (0) 2011.09.26
GCC on-line  (0) 2011.09.22
GDB  (4) 2011.01.05
블로그 이미지

김유석0

,

GCC on-line

development 2011. 9. 22. 09:20
GCC on-line 입니다. 

http://gcc.gnu.org/onlinedocs/

 

 

'development' 카테고리의 다른 글

[linux kernel]Scatter list  (1) 2011.09.27
[HW] TTL 과 RS232 에 대한 정리  (0) 2011.09.26
[HW] TTL Level 과 CMOS Level  (0) 2011.09.26
[crypto] IPSec  (0) 2011.09.23
GDB  (4) 2011.01.05
블로그 이미지

김유석0

,