ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Convert-BER-XS/XS.xs
(Generate patch)

Comparing Convert-BER-XS/XS.xs (file contents):
Revision 1.15 by root, Sat Apr 20 15:23:26 2019 UTC vs.
Revision 1.18 by root, Sat Apr 20 16:12:53 2019 UTC

80 BER_TYPE_IPADDRESS, 80 BER_TYPE_IPADDRESS,
81 BER_TYPE_CROAK, 81 BER_TYPE_CROAK,
82}; 82};
83 83
84enum { 84enum {
85 BER_CLASS = 0, 85 BER_CLASS = 0,
86 BER_TAG = 1, 86 BER_TAG = 1,
87 BER_CONSTRUCTED = 2, 87 BER_FLAGS = 2,
88 BER_DATA = 3, 88 BER_DATA = 3,
89 BER_ARRAYSIZE 89 BER_ARRAYSIZE
90}; 90};
91 91
92#define MAX_OID_STRLEN 4096 92#define MAX_OID_STRLEN 4096
93 93
279 { 279 {
280 case 0: 280 case 0:
281 error ("indefinite ASN.1 lengths not supported"); 281 error ("indefinite ASN.1 lengths not supported");
282 return 0; 282 return 0;
283 283
284 //case 0x80: // indefinite length
285
286 //case 0xff: reserved
284 default: 287 default:
285 error ("ASN.1 length too long"); 288 error ("ASN.1 length too long");
286 return 0; 289 return 0;
287 290
288 case 8: res = (res << 8) | get_u8 (); 291 case 8: res = (res << 8) | get_u8 ();
382 static char oid[MAX_OID_STRLEN]; // static, becaueds too large for stack 385 static char oid[MAX_OID_STRLEN]; // static, becaueds too large for stack
383 char *app = oid; 386 char *app = oid;
384 387
385 if (relative) 388 if (relative)
386 app = write_uv (app, w); 389 app = write_uv (app, w);
387 else 390 else if (w < 2 * 40)
388 { 391 {
389 app = write_uv (app, (U8)w / 40); 392 app = write_uv (app, (U8)w / 40);
390 *app++ = '.'; 393 *app++ = '.';
391 app = write_uv (app, (U8)w % 40); 394 app = write_uv (app, (U8)w % 40);
395 }
396 else
397 {
398 app = write_uv (app, 2);
399 *app++ = '.';
400 app = write_uv (app, w - 2 * 40);
392 } 401 }
393 402
394 while (cur < end) 403 while (cur < end)
395 { 404 {
396 // we assume an oid component is never > 64 digits 405 // we assume an oid component is never > 64 digits
548 croak ("unconfigured/unsupported class/tag %d/%d", klass, tag); 557 croak ("unconfigured/unsupported class/tag %d/%d", klass, tag);
549 } 558 }
550 559
551 AV *av = newAV (); 560 AV *av = newAV ();
552 av_fill (av, BER_ARRAYSIZE - 1); 561 av_fill (av, BER_ARRAYSIZE - 1);
553 AvARRAY (av)[BER_CLASS ] = newSVcacheint (klass); 562 AvARRAY (av)[BER_CLASS] = newSVcacheint (klass);
554 AvARRAY (av)[BER_TAG ] = newSVcacheint (tag); 563 AvARRAY (av)[BER_TAG ] = newSVcacheint (tag);
555 AvARRAY (av)[BER_CONSTRUCTED] = newSVcacheint (constructed ? 1 : 0); 564 AvARRAY (av)[BER_FLAGS] = newSVcacheint (constructed ? 1 : 0);
556 AvARRAY (av)[BER_DATA ] = res; 565 AvARRAY (av)[BER_DATA ] = res;
557 566
558 return newRV_noinc ((SV *)av); 567 return newRV_noinc ((SV *)av);
559} 568}
560 569
561///////////////////////////////////////////////////////////////////////////// 570/////////////////////////////////////////////////////////////////////////////
881{ 890{
882 AV *av = ber_tuple (tuple); 891 AV *av = ber_tuple (tuple);
883 892
884 int klass = SvIV (AvARRAY (av)[BER_CLASS]); 893 int klass = SvIV (AvARRAY (av)[BER_CLASS]);
885 int tag = SvIV (AvARRAY (av)[BER_TAG]); 894 int tag = SvIV (AvARRAY (av)[BER_TAG]);
886 int constructed = SvIV (AvARRAY (av)[BER_CONSTRUCTED]) ? ASN_CONSTRUCTED : 0; 895 int constructed = SvIV (AvARRAY (av)[BER_FLAGS]) & 1 ? ASN_CONSTRUCTED : 0;
887 SV *data = AvARRAY (av)[BER_DATA]; 896 SV *data = AvARRAY (av)[BER_DATA];
888 897
889 int identifier = (klass << ASN_CLASS_SHIFT) | constructed; 898 int identifier = (klass << ASN_CLASS_SHIFT) | constructed;
890 899
891 if (expect_false (tag >= ASN_TAG_BER)) 900 if (expect_false (tag >= ASN_TAG_BER))
925 put_length (0); 934 put_length (0);
926 break; 935 break;
927 936
928 case BER_TYPE_BOOL: 937 case BER_TYPE_BOOL:
929 put_length (1); 938 put_length (1);
930 *cur++ = SvTRUE (data) ? 0xff : 0x00; 939 *cur++ = SvTRUE (data) ? 0xff : 0x00; // 0xff = DER/CER
931 break; 940 break;
932 941
933 case BER_TYPE_OID: 942 case BER_TYPE_OID:
934 encode_oid (data, 0); 943 encode_oid (data, 0);
935 break; 944 break;
1037 const_iv (ASN_CONTEXT) 1046 const_iv (ASN_CONTEXT)
1038 const_iv (ASN_PRIVATE) 1047 const_iv (ASN_PRIVATE)
1039 1048
1040 const_iv (BER_CLASS) 1049 const_iv (BER_CLASS)
1041 const_iv (BER_TAG) 1050 const_iv (BER_TAG)
1042 const_iv (BER_CONSTRUCTED) 1051 const_iv (BER_FLAGS)
1043 const_iv (BER_DATA) 1052 const_iv (BER_DATA)
1044 1053
1045 const_iv (BER_TYPE_BYTES) 1054 const_iv (BER_TYPE_BYTES)
1046 const_iv (BER_TYPE_UTF8) 1055 const_iv (BER_TYPE_UTF8)
1047 const_iv (BER_TYPE_UCS2) 1056 const_iv (BER_TYPE_UCS2)
1080 RETVAL = decode_ber (); 1089 RETVAL = decode_ber ();
1081} 1090}
1082 OUTPUT: RETVAL 1091 OUTPUT: RETVAL
1083 1092
1084void 1093void
1085ber_is (SV *tuple, SV *klass = &PL_sv_undef, SV *tag = &PL_sv_undef, SV *constructed = &PL_sv_undef, SV *data = &PL_sv_undef) 1094ber_is (SV *tuple, SV *klass = &PL_sv_undef, SV *tag = &PL_sv_undef, SV *flags = &PL_sv_undef, SV *data = &PL_sv_undef)
1086 PPCODE: 1095 PPCODE:
1087{ 1096{
1088 if (!SvOK (tuple)) 1097 if (!SvOK (tuple))
1089 XSRETURN_NO; 1098 XSRETURN_NO;
1090 1099
1092 croak ("ber_is: tuple must be BER tuple (array-ref)"); 1101 croak ("ber_is: tuple must be BER tuple (array-ref)");
1093 1102
1094 AV *av = (AV *)SvRV (tuple); 1103 AV *av = (AV *)SvRV (tuple);
1095 1104
1096 XPUSHs ( 1105 XPUSHs (
1097 (!SvOK (klass) || SvIV (AvARRAY (av)[BER_CLASS ]) == SvIV (klass)) 1106 (!SvOK (klass) || SvIV (AvARRAY (av)[BER_CLASS]) == SvIV (klass))
1098 && (!SvOK (tag) || SvIV (AvARRAY (av)[BER_TAG ]) == SvIV (tag)) 1107 && (!SvOK (tag) || SvIV (AvARRAY (av)[BER_TAG ]) == SvIV (tag))
1099 && (!SvOK (constructed) || !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) == !SvIV (constructed)) 1108 && (!SvOK (flags) || !SvIV (AvARRAY (av)[BER_FLAGS]) == !SvIV (flags))
1100 && (!SvOK (data) || sv_eq (AvARRAY (av)[BER_DATA ], data)) 1109 && (!SvOK (data) || sv_eq (AvARRAY (av)[BER_DATA ], data))
1101 ? &PL_sv_yes : &PL_sv_undef); 1110 ? &PL_sv_yes : &PL_sv_undef);
1102} 1111}
1103 1112
1104void 1113void
1105ber_is_seq (SV *tuple) 1114ber_is_seq (SV *tuple)
1109 XSRETURN_UNDEF; 1118 XSRETURN_UNDEF;
1110 1119
1111 AV *av = ber_tuple (tuple); 1120 AV *av = ber_tuple (tuple);
1112 1121
1113 XPUSHs ( 1122 XPUSHs (
1114 SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL 1123 SvIV (AvARRAY (av)[BER_CLASS]) == ASN_UNIVERSAL
1115 && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_SEQUENCE 1124 && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_SEQUENCE
1116 && SvIV (AvARRAY (av)[BER_CONSTRUCTED]) 1125 && SvIV (AvARRAY (av)[BER_FLAGS])
1117 ? AvARRAY (av)[BER_DATA] : &PL_sv_undef); 1126 ? AvARRAY (av)[BER_DATA] : &PL_sv_undef);
1118} 1127}
1119 1128
1120void 1129void
1121ber_is_int (SV *tuple, SV *value = &PL_sv_undef) 1130ber_is_int (SV *tuple, SV *value = &PL_sv_undef)
1127 AV *av = ber_tuple (tuple); 1136 AV *av = ber_tuple (tuple);
1128 1137
1129 UV data = SvUV (AvARRAY (av)[BER_DATA]); 1138 UV data = SvUV (AvARRAY (av)[BER_DATA]);
1130 1139
1131 XPUSHs ( 1140 XPUSHs (
1132 SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL 1141 SvIV (AvARRAY (av)[BER_CLASS]) == ASN_UNIVERSAL
1133 && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_INTEGER 1142 && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_INTEGER
1134 && !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) 1143 && !SvIV (AvARRAY (av)[BER_FLAGS])
1135 && (!SvOK (value) || data == SvUV (value)) 1144 && (!SvOK (value) || data == SvUV (value))
1136 ? sv_2mortal (data ? newSVsv (AvARRAY (av)[BER_DATA]) : newSVpv ("0 but true", 0)) 1145 ? sv_2mortal (data ? newSVsv (AvARRAY (av)[BER_DATA]) : newSVpv ("0 but true", 0))
1137 : &PL_sv_undef); 1146 : &PL_sv_undef);
1138} 1147}
1139 1148
1145 XSRETURN_NO; 1154 XSRETURN_NO;
1146 1155
1147 AV *av = ber_tuple (tuple); 1156 AV *av = ber_tuple (tuple);
1148 1157
1149 XPUSHs ( 1158 XPUSHs (
1150 SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL 1159 SvIV (AvARRAY (av)[BER_CLASS]) == ASN_UNIVERSAL
1151 && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_OBJECT_IDENTIFIER 1160 && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_OBJECT_IDENTIFIER
1152 && !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) 1161 && !SvIV (AvARRAY (av)[BER_FLAGS])
1153 && (!SvOK (oid) || sv_eq (AvARRAY (av)[BER_DATA], oid)) 1162 && (!SvOK (oid) || sv_eq (AvARRAY (av)[BER_DATA], oid))
1154 ? newSVsv (AvARRAY (av)[BER_DATA]) : &PL_sv_undef); 1163 ? newSVsv (AvARRAY (av)[BER_DATA]) : &PL_sv_undef);
1155} 1164}
1156 1165
1157############################################################################# 1166#############################################################################
1175ber_int (SV *sv) 1184ber_int (SV *sv)
1176 CODE: 1185 CODE:
1177{ 1186{
1178 AV *av = newAV (); 1187 AV *av = newAV ();
1179 av_fill (av, BER_ARRAYSIZE - 1); 1188 av_fill (av, BER_ARRAYSIZE - 1);
1180 AvARRAY (av)[BER_CLASS ] = newSVcacheint (ASN_UNIVERSAL); 1189 AvARRAY (av)[BER_CLASS] = newSVcacheint (ASN_UNIVERSAL);
1181 AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_INTEGER); 1190 AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_INTEGER);
1182 AvARRAY (av)[BER_CONSTRUCTED] = newSVcacheint (0); 1191 AvARRAY (av)[BER_FLAGS] = newSVcacheint (0);
1183 AvARRAY (av)[BER_DATA ] = newSVsv (sv); 1192 AvARRAY (av)[BER_DATA ] = newSVsv (sv);
1184 RETVAL = newRV_noinc ((SV *)av); 1193 RETVAL = newRV_noinc ((SV *)av);
1185} 1194}
1186 OUTPUT: RETVAL 1195 OUTPUT: RETVAL
1187 1196
1188# TODO: not arrayref, but elements? 1197# TODO: not arrayref, but elements?
1190ber_seq (SV *arrayref) 1199ber_seq (SV *arrayref)
1191 CODE: 1200 CODE:
1192{ 1201{
1193 AV *av = newAV (); 1202 AV *av = newAV ();
1194 av_fill (av, BER_ARRAYSIZE - 1); 1203 av_fill (av, BER_ARRAYSIZE - 1);
1195 AvARRAY (av)[BER_CLASS ] = newSVcacheint (ASN_UNIVERSAL); 1204 AvARRAY (av)[BER_CLASS] = newSVcacheint (ASN_UNIVERSAL);
1196 AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_SEQUENCE); 1205 AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_SEQUENCE);
1197 AvARRAY (av)[BER_CONSTRUCTED] = newSVcacheint (1); 1206 AvARRAY (av)[BER_FLAGS] = newSVcacheint (1);
1198 AvARRAY (av)[BER_DATA ] = newSVsv (arrayref); 1207 AvARRAY (av)[BER_DATA ] = newSVsv (arrayref);
1199 RETVAL = newRV_noinc ((SV *)av); 1208 RETVAL = newRV_noinc ((SV *)av);
1200} 1209}
1201 OUTPUT: RETVAL 1210 OUTPUT: RETVAL
1202 1211
1203MODULE = Convert::BER::XS PACKAGE = Convert::BER::XS::Profile 1212MODULE = Convert::BER::XS PACKAGE = Convert::BER::XS::Profile

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines