김보안의 블로깅
  • 🏠 Home
  • 📚 Project
    • Blockchain
      • 🎦 PickMe
      • 🎦 IoTC
      • 🎦 Blackchain
      • 📃 Gemology
      • 🎦 PickMe
      • 🎦 PickMe
    • AI
      • 👋 A.I. Dream Reader
      • 🎦 A.I. Dream Reader
    • Security
      • 🎦 SNAC
    • Education
      • 🎦 Smart Lecture
  • 🤸‍♂ Hobby
    • Music
      • Violin
      • Guitar
      • Piano
      • Drum
    • Flower
      • Flower Certificate
    • Sport
      • Ski
      • Skateboard
      • Golf
      • Boxing
레이블이 certificate인 게시물을 표시합니다. 모든 게시물 표시
레이블이 certificate인 게시물을 표시합니다. 모든 게시물 표시

2018년 5월 24일 목요일

Node.js 로 인증서 만들고 사이닝 하기

 SecureKim     오후 9:26     ca, certificate, Node.js, signing     No comments   

Hello SyntaxHighlighter Node.js 로 RootCA 인증서 및 인증서를 만들고, 사이닝 해서 연결해 봅니다.

OpenSSL 에 대한 Dependecy 가 있습니다.

그리고 certs 폴더 아래에다가 만들도록 되어있으니 주의하세요.

Certificate Generator in node.js



function CERT_createKey(CN,keylen,callback){
    exec('openssl genrsa -out certs/'+CN+'.key '+keylen, function(error, stdout, stderr) {
        if(error !== null) {
            console.log("Create Cert Key : " + error);
            callback({fail:true,error:error});
        } else {
            callback({fail:false,error:"none"});
        }
    });
}

function CERT_csr(CN,callback){
    exec('openssl req -new -key certs/'+CN+'.key -nodes -subj "/C=KR/O=noweek, Inc./OU=www.securekim.com/OU=(c) 2018 noweek, Inc./CN='+CN+'" -out certs/'+CN+'.csr', function(error, stdout, stderr) {
        if(error !== null) {
            console.log("Create CSR : " + error);
            callback({fail:true,error:error});
        } else {
            callback({fail:false,error:"none"});
        }
    });         
}

function CERT_sign(CSR,CA,days,callback){
    //openssl x509 -req -days 500 -in demo.csr -CA CA-CA.crt -CAkey root.key -CAcreateserial -out my.crt
    var execstr = 'openssl x509 -req -days '+days+' -in certs/'+CSR+'.csr -signkey certs/'+CA+'.key -out certs/'+CSR+'.pem';
    if(CSR !== CA) execstr = 'openssl x509 -req -days '+days+' -in certs/'+CSR+'.csr -CA certs/'+CA+'.pem -CAkey certs/'+CA+'.key -CAcreateserial -out certs/'+CSR+'.pem'; 
    exec(execstr, function(error, stdout, stderr) {
        if(error !== null) {
            console.log("Sign CSR : " + error);
            callback({fail:true,error:error});
        } else {
            callback({fail:false,error:"none"});
        }
    });  
}

//CA 인증서를 만드는 함수 입니다.
function CERT_createCA(CN,callback){
    CERT_createKey(CN,4096,(result)=>{
        if(result.fail) return callback(false);
        CERT_csr(CN,(result)=>{
            if(result.fail) return callback(false);
            CERT_sign(CN,CN,36500,(result)=>{
                if(result.fail) return callback(false);
                else return callback(true);
            })
        });
    });
}

//인증서를 만들고, 위에서 만든 CA 인증서로 사이닝하는 함수 입니다.
function CERT_createCERT(CA,CN,callback){
    CERT_createKey(CN,2048,(result)=>{
      if(result.fail) return callback(false);
      CERT_csr(CN,(result)=>{
        if(result.fail) return callback(false);
        CERT_sign(CN,CA,14,(result)=>{
            if(result.fail) return callback(false);
            else return callback(true);
        });
      });
    });
}


Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg

2017년 9월 19일 화요일

[Kisa] 암호의 이해와 키 관리 실무 - 2일차 PKI와 관련 표준의 이해

 SecureKim     오후 5:16     표준, ASN.1, certificate, KISA, PKI, Security, Standard, Study     No comments   


질문 :

전자서명과 암호화를 동시에 하는 방법? : Sign crypto. 어디까지나 학문적인 것.
CA 인증서 업데이트 방법? : 국제 표준 CTL 규격으로 CA 를 업데이트 가능.
개인키 유출의 위험을 최소화 하는 방법? :
 - 보안토큰 등에 보관.
 - Perfect Forward Secrecy (DH)
 - 키를 폐기 가능하도록 할 것.

키 관리 등급
ISO/IEC 24759 에서는 보안 등급 별 키 관리 기능을 명시 하고 있음.
FIPS 140-2 보안 등급에서 S/W 로는 아무리 잘 만들어도 1등급 이다.
보안등급 3 이상을 받기 위해서는 개인키가 암호화 되어 있거나
지식 분산 절차를 사용해 주입 / 출력 되어야 함.

기본적으로 난수 발생, 키생성, 키 합의, 키 분배, 키 주입/출력, 키 저장, 키 제로화 제공

레벨 2 : EAL 2 이상 OS, 물리적 수준은 보안스티커 .
레벨 3 : EAL 3 이상 OS, 물리적 수준은 에폭시 발라서 뜯으면 키가 파괴됨.
레벨 4 : EAL 4 이상 OS, 물리적 수준은 EFP (Environmental Failure Protection) / EFT (Environmental Failure Testing)

HSM - Black Box
SW - White Box - 키를 못찾게 하는 것은 기술력이며, 표준이 없다. 깨진 사례가 많다.
다만, 두 구조 모두 인증을 넣는 개념이 필요하다.


PKI 와 관련 표준의 이해

ASN.1 (RFC 표준 中 매우 기본적인 것)

상대방에게 전달하기 위해서 어떤 방법을 사용 할 것인가?
Decimal / HEX / Big Endian / Little Endian / WIDE String / UTF-8 / ASCII ???

즉, ASM.1 은 추상적인 타입과 값에 대한 표기법이다.

Object ID : 전 세계 유일한 ID

EXPLICIT / IMPLICIT / ANY(VOID) / CHOICE (UNION)
IMPLICIT : 타입을 생략하므로 데이터는 그만큼 줄어듬.
EXPLICIT :  TLV 전체가 VALUE 가 된다. 항상 구조체이다.

ASN.1 : TAG(1byte), LENGTH(가변), VALUE(가변). (TLV)


ASN.1 Notation
BOX :: = SEQUENCE {
    a Integer = 3,
    b Integer = 9
}

ASN.1 DER 
(HEX) : 30 06 02 01 03 02 01 09

TAG : 30
LENGTH : 06
TAG : 02
LENGTH : 01
VALUE : 03
TAG : 02
LENGTH 01
VALUE : 09

TAG

+---------+---------+---------+---------+---------+---------+---------+
|      CLASS(2)        |Structure|          LOW TAG NUMBER(5)          |
+---------+---------+---------+---------+---------+---------+---------+

CLASS : 0 - Universal, 1 - Application, 2 - Context, 4 - Private

STRUCTURE : 0 - Primitive, 1 - Constructed

LOW TAG NUMBER
Universal Tag NumberDescription
0reserved for BER
1BOOLEAN
2INTEGER
3BIT STRING
4OCTET STRING
5NULL
6OBJECT IDENTIFIER (전세계 유일)
7ObjectDescriptor
8INSTANCE OF, EXTERNAL
9REAL
10ENUMERATED
11EMBEDDED PDV
12UTF8String
13RELATIVE-OID
16SEQUENCE, SEQUENCE OF (순서)
17SET, SET OF
18NumericString
19PrintableString
20TeletexString, T61String
21VideotexString
22IA5String
23UTCTime
24GeneralizedTime
25GraphicString
26VisibleString, ISO646String
27GeneralString
28UniversalString
29CHARACTER STRING
30BMPString



LENGTH

데이터가 11 22 33 44 ... x Byte 인 경우 어떻게 표시할까?

Short Form
04 7F 11 22 33 44 .... 127 Byte

Long Form
Value 의 길이가 128 바이트 이상 일 경우
+---------+---------+---------+---------+---------+---------+---------+
|      1     |                     LENGTH 정보 필드의 크기                    |
+---------+---------+---------+---------+---------+---------+---------+
04 81 80 11 22 33 44 .... 128 Byte

04 82 03 E8 11 22 33 44 .... 1000 Byte

100000 = 186A0
04 83 01 86 A0 11 22 33 44 ..... 100000Byte

INTEGER
2의 보수는 음수이며, 최상위 비트가 1이면 음수로 표현
1의 보수로 만든 다음 1을 더하면 된다.
FF = 1111 1111 -> (-) 0000 0000 -> (-) 0000 0001 = -1

5 : 02 01 05
255 : 02 02 00 FF ( 00을 넣는 이유는 음수가 아님을 표현하기 위해서 )

OID
1.2.840.113549 : 06 06 2A 86 48 86 F7 0D
1.2.840.113549.1 : 06 07 2A 86 48 86 F7 0D 01
1.2.840.113549.1.7 : 06 08 2A 86 48 86 F7 0D 01 07


ASN.1 실습 :

[1] EXPLICIT NULL
A1  02        05 00

[1] IMPLICIT NULL
81 00

[2] EXPLICIT SEQUENCE {}
=> A2 02 30 00

[3] IMPLICIT SEQUENCE {}
=> A2 00
1 0 1 0 0 0 1 0 = A2


BER

Integer 3 =
DER/BER : 02 01 03
      BER : 02 80 03 00 00

BER :  모호한 길이 표현 가능.
0x80 을 넣고 끝에 00 00 을 붙여준다.
30 80 02 01 03 02 01 09 00 00


이제 ASN.1의 DER 인증서를 읽어보자 !


30 으로 시작하니 EXPLICIT SEQUENCE 이고 8이니까 LONG. 2는 길이가 2바이트.
뒤쪽 05 bd 는 VALUE의 크기다. = 1469

더 읽어보기 전에 RFC 2459/3280/5280 문서를 확인해 보자.

4.1.  Basic Certificate Fields

   The X.509 v3 certificate basic syntax is as follows.  For signature
   calculation, the data that is to be signed is encoded using the ASN.1
   distinguished encoding rules (DER) [X.690].  ASN.1 DER encoding is a
   tag, length, value encoding system for each element.

   Certificate  ::=  SEQUENCE  {
        tbsCertificate       TBSCertificate,
        signatureAlgorithm   AlgorithmIdentifier,
        signatureValue       BIT STRING  }

   TBSCertificate  ::=  SEQUENCE  {
        version         [0]  EXPLICIT Version DEFAULT v1,
        serialNumber         CertificateSerialNumber,
        signature            AlgorithmIdentifier,
        issuer               Name,
        validity             Validity,
        subject              Name,
        subjectPublicKeyInfo SubjectPublicKeyInfo,
        issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
                             -- If present, version MUST be v2 or v3
        subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
                             -- If present, version MUST be v2 or v3
        extensions      [3]  EXPLICIT Extensions OPTIONAL
                             -- If present, version MUST be v3
        }

   Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }

   CertificateSerialNumber  ::=  INTEGER

   Validity ::= SEQUENCE {
        notBefore      Time,
        notAfter       Time }

   Time ::= CHOICE {
        utcTime        UTCTime,
        generalTime    GeneralizedTime }

   UniqueIdentifier  ::=  BIT STRING

   SubjectPublicKeyInfo  ::=  SEQUENCE  {
        algorithm            AlgorithmIdentifier,
        subjectPublicKey     BIT STRING  }

   Extensions  ::=  SEQUENCE SIZE (1..MAX) OF Extension

   Extension  ::=  SEQUENCE  {
        extnID      OBJECT IDENTIFIER,
        critical    BOOLEAN DEFAULT FALSE,
        extnValue   OCTET STRING
                    -- contains the DER encoding of an ASN.1 value
                    -- corresponding to the extension type identified
                    -- by extnID
        }

수동으로하면 귀찮으니 ASN.1 Editor 로 확인 하면 순서대로


 TBSCertificate  ::=  SEQUENCE  {
        version         [0]  EXPLICIT Version DEFAULT v1,
        serialNumber         CertificateSerialNumber,
        signature            AlgorithmIdentifier,

version = 2
serialNumber = 18578931 = 01 1B 7D F3
signature = 1.2.840.113549.1.1.11 = sha256WithRSAEncryption

정말인지 인증서 뷰어로 확인 해 보자.


잘 읽은 것을 알 수 있다.

보안 관련 표준을 쉽게 이해하는 노하우


  • 이 표준의 목적이 무엇인가 ?
  • 종류는 ? ( 데이터 규격 / 인터페이스 / 알고리즘 / 프로토콜 )
  • 데이터 기밀성 만족이 필요한지, 방법은 ?
  • 데이터 무결성 만족이 필요한지, 방법은 ?
  • 개체에 대한 인증이 필요한가 ? 방법은 ?
  • 프로토콜이라면 어떤 보안 기능 (재전송 공격 차단 등) 이 있는가?


RFC 는 대부분 하위 호환성을 잘 지키도록 되어 있다.

인증서 검증


기본 검증

  • X509 규격에 맞는지?
  • 신뢰된 CA로 발급 되었는지?
  • 인증서 경로상 서명 검증 결과가 유효한지?
  • 인증서가 유효 기간 內 사용되고 있는지
  • 인증서의 주체가 올바른지?

확장 검증

  • 계층 별 인증서가 올바른지? ( CA / USER )
  • 올바른 키 용도로 사용되고 있는지? ( 암호화 / 부인방지 / 전자 서명 등 )
  • 올바른 정책 (OID) 으로 사용되고 있는지? ( 은행용 / 증권용 / 보험용 등 )
  • 폐기 또는 효력 정지 되었는지? ( OCSP / CRL )

국내 공인인증 확장 검증

  • 인증서와 주민번호가 서로 일치하는지?
주민번호는 실제 주민번호를 저장하는것은 아니고 SHA2(SHA2(주민번호|RANDOM)
그러나 Random 값만 알 수 있다면 5시간이면 주민번호 찾을 수 있다.
Random 값은 개인키와 함께 암호화 되어 있는데, 보관에 유의해야 한다.


인증서 상태 검증.. 
하루에 국내에서만 공인인증서 로그인이 5600만건이 이루어지며
비용이 매우 비싸서 자체적으로 LDAP을 통해 인증서 상태 검증 프로세스를 수립하고
당행 발급 인증서가 아닌경우 RA에 쿼리, 타기관이면 금결원 OCSP에 쿼리한다.


문제는 폐기된 타기관 인증서로 계속 은행이나 사이트에 요청하면
돈이 엄청나게 청구되게 된다.
그래서 먼저 가입자 조회부터 하고 인증서 확인 하도록 해야 한다.

X509 확장

기관 키 식별자 : CA의 인증서를 찾는데 IssuerDN 만으로는 부족하므로
CA의 공개키를 해시한 값, CA 인증서 시리얼 번호를 함께 기록함.

주체 키 식별자 : SubjectDN은 얼마든지 동일할 수 있으므로 키를 통해 사용자를 식별하는데 사용. 공개키를 SHA1으로 해시 한 값을 명시.

키 사용 용도 : 공개키와 개인키에 용도를 제한.
KeyUsage ::= BIT STRING {
           digitalSignature        (0),
           nonRepudiation          (1), -- recent editions of X.509 have
                                        -- renamed this bit to contentCommitment
           keyEncipherment         (2),
           dataEncipherment        (3),
           keyAgreement            (4),
           keyCertSign             (5),
           cRLSign                 (6),
           encipherOnly            (7),
           decipherOnly            (8) }
예를 들어 C0 = 1100 0000 이므로, 전자서명과 부인방지 용도로 쓸 수 있다.

인증서 정책 : 정책에 따라 범용/은행/보험/카드사/증권사 등의 정책이 존재.

인증서 경로 검증

1. 검증대상 사용자 인증서
2. CA 인증서 저장소
3. 인증 경로의 최대 길이 ( max_path_length ) - 순환 구조인 인증서가 있을 수 있음.
4. 현재 시간 (GMT)
5. 최상위 인증기관 정보 (최상위 인증기관, 공개키 알고리즘, 공개키, 파라미터)
6. 사용자 초기 정책 집합 ( OID, 자식 인증서가 가능한 OID 리스트 등 )
7. 초기 정책 매핑 금지 여부 ( 인증서 내 명시된 인증 정책 매핑 금지 여부 )
8. 초기 명시 정책 여부 ( 사용자 초기 정책 집합과 유효 정책 트리를 비교 할지 여부 )
9. 초기 모든 정책 금지 여부 ( anyPolicy 정책을 허용할지 말지.)

DN 비교 룰
Text 가 같아도 인코딩 형식이 다르면 다르다.
PrintableString 에 한해서 대소문자 구별 안함.
PrintableString은 trim 하여 공백을 없애고 하나 이상의 공백은 공백 하나로 처리.

인증서 키 용도 검증 : 버전 3부터 새로 생겼다.

기본 제한 (Basic Constraints)

CA 인증서인 경우, 현재 인증서로부터 발급 가능한 CA 인증서 계층 수를 제한 가능.
경로 길이 : 0 인 경우, 사용자 인증서만 발급가능. None인 경우 제한 없음.
예를 들어 중간 CA의 Path Length 1인데 하위 CA기관에도 1로 발급 할 경우,
경로 검사가 실패하므로 클라이언트가 이 인증서를 믿지 않게 된다.

KISA에 표준문서가 있다.


Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg

2014년 11월 28일 금요일

[Tizen] 타이젠 웨어러블 앱 인증 받기

 SecureKim     오후 10:53     앱 인증, 인증, certificate, Tizen, wearable     No comments   




처음에 실제 타이젠 웨어러블 (기어 등) 을 컴퓨터에 연결하고 빌드하면

앱을 설치하지 못했다는 에러가 뜨는데요.


이는 인증을 받아야 하기 때문입니다.

이번 포스팅에서는 인증받는 법을 자세히 설명하도록 하겠습니다.


인증은 다음과 같이 크게 4가지로 구성됩니다.

1. 인증서 서명 요청 생성

2. 인증서 요청

3. 인증서 등록

4. 보안 프로파일에 인증서 추가


1.    인증서 서명 요청 생성
1.     상단의 Register Certificate 버튼을 누릅니다.

2.     Generate a certificate signing request 버튼을 누르고, new 를 클릭합니다.




3.     Name과 패스워드를 지정하고 Finish를 누릅니다.



4.     결과를 확인하고 CSR Path를 기억합니다.


2.     인증서 요청
1.     Request the Certificate 버튼을 누르고 로그인 한 후, 방금 Generate한 author.csr파일을 찾아서 업로드하고 Submit 버튼을 누릅니다.

2.     Certificate가 메일로 보내졌다는 메시지를 확인하고 창을 닫습니다.



3.     메일로 온 author.crt 파일을 다운받습니다.



4.     메일로 온 author.crt 파일과 처음에 기입했던 암호를 입력합니다.






3.     인증서 등록
1.     먼저 Device ID(DUID) 확인 방법입니다.
기기를 연결한 후 Connection Explorer 창에서 우클릭 해 속성창을 열어 확인합니다.



2.     Request a device profile 버튼을 누르고 각종 정보를 선택합니다.
이후 방금 확인했던 Device ID(DUID)를 기입하고 Submit을 클릭합니다.




3.     Profile이 메일로 보내졌다는 메시지를 확인하고 이 창을 닫습니다.


4.     메일로 온 device-profile.xml 파일 을 다운로드 받고 패스워드도 기입해 줍니다.


5.     결과를 확인합니다.



6.     권한을 자동으로 주기 위해 Permit to install applications 버튼을 클릭합니다.




4.    보안 프로파일에 인증서 추가
3번까지 하시면 자동으로 security profile에 추가가 됩니다. 여기서부터는 수동으로 인증서를 변경하는 방법입니다.

Window – Preferecnes 를 클릭하고 Tizen SDK – Security Profiles 를 선택하면 다음과 같이 수동으로 변경 할 수 있습니다.



Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
이전 게시물 홈

페이지

  • 홈
  • Hobby

Categories

  • AI
  • AWS
  • Blockchain
  • Hardware
  • Javascript
  • Node.js
  • Plasma
  • Security
  • Study
  • Video
  • android
  • mysql
  • review
  • windows

Popular Posts

  • 블랙보드 강의 녹화 영상 다운로드 가능한 방법 (노설치)
    별도의 설치도 필요 없고 아주 쉽습니다. 구글 크롬브라우저 에서 블랙보드 녹화 영상에  다운로드 가능한 메뉴가 나오게 하는 코드입니다.  먼저 블랙보드 강의자료에 입장하고, 재생 버튼을 클릭 하지 않은 상태로 F12 를 입력합니다. 재생을 클릭하지 마...
  • Termux 로 안드로이드에 우분투(GUI)와 VSCode설치하기
      많은 글들이 있지만 뭔가 대부분 잘 안됐다. 이번 기회에 정리한다. 0. 먼저 Termux와 Remote Desktop Manager를 설치한다. Remote Desktop Manager 대신 아래도 나쁘지 않다. 화면이 작지만 마우스 스크롤이나 ...
  • 회사 프록시와 인증서에 고통받는 그대를 위한 글 (Bash, Gradle, Python, wget, nodejs(npm), apt-get, cURL, git, yarn, androidStudio)
    대기업에 입사하면 장단점이 있는데, 단점 중에 하나가 회사에서 프록시를 사용하여 트래픽 감시를 하므로 프록시 설정을 해주어야 한다는 점 입니다. 특히, 회사에서는 https 트래픽도 감시를 하므로 인증서도 설정해 주어야 합니다. 그런데 문...

Blog Archive

  • ▼  2026 (2)
    • ▼  2월 (2)
      • 태블릿에서 양자내성암호(격자암호) 돌려보기
      • 양자컴퓨터와 보안 위협 (쇼어 알고리즘)
  • ►  2025 (3)
    • ►  9월 (1)
    • ►  8월 (1)
    • ►  7월 (1)
  • ►  2024 (2)
    • ►  11월 (2)
  • ►  2023 (2)
    • ►  10월 (1)
    • ►  1월 (1)
  • ►  2022 (10)
    • ►  12월 (1)
    • ►  11월 (3)
    • ►  9월 (1)
    • ►  8월 (1)
    • ►  6월 (2)
    • ►  3월 (2)
  • ►  2021 (9)
    • ►  12월 (3)
    • ►  11월 (1)
    • ►  6월 (1)
    • ►  5월 (2)
    • ►  4월 (2)
  • ►  2020 (12)
    • ►  10월 (1)
    • ►  9월 (2)
    • ►  7월 (1)
    • ►  6월 (1)
    • ►  5월 (5)
    • ►  4월 (1)
    • ►  2월 (1)
  • ►  2019 (14)
    • ►  10월 (2)
    • ►  7월 (1)
    • ►  3월 (4)
    • ►  2월 (2)
    • ►  1월 (5)
  • ►  2018 (14)
    • ►  12월 (2)
    • ►  11월 (4)
    • ►  10월 (1)
    • ►  8월 (2)
    • ►  5월 (4)
    • ►  1월 (1)
  • ►  2017 (12)
    • ►  10월 (2)
    • ►  9월 (9)
    • ►  5월 (1)
  • ►  2016 (8)
    • ►  10월 (2)
    • ►  8월 (1)
    • ►  6월 (1)
    • ►  1월 (4)
  • ►  2015 (6)
    • ►  12월 (3)
    • ►  10월 (1)
    • ►  6월 (1)
    • ►  5월 (1)
  • ►  2014 (10)
    • ►  11월 (1)
    • ►  9월 (1)
    • ►  7월 (1)
    • ►  6월 (1)
    • ►  5월 (3)
    • ►  4월 (1)
    • ►  3월 (2)
  • ►  2013 (28)
    • ►  12월 (3)
    • ►  11월 (6)
    • ►  10월 (6)
    • ►  9월 (6)
    • ►  8월 (1)
    • ►  7월 (3)
    • ►  6월 (3)

구독

글
Atom
글
전체 댓글
Atom
전체 댓글

로드 중입니다...

각오

직접 해보지 않은 것은 포스팅 하지 않겠습니다.

Copyright © 김보안의 블로깅 | Powered by Blogger
Design by Hardeep Asrani | Blogger Theme by NewBloggerThemes.com | Distributed By Gooyaabi Templates